@bnsights/bbsf-admin-portal 1.1.2 → 1.1.3

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 (684) hide show
  1. package/README.md +4 -0
  2. package/{esm2020 → esm2022}/bnsights-bbsf-admin-portal.mjs +4 -4
  3. package/{esm2020 → esm2022}/lib/Pages/ActiveDirectories/active-directories.component.mjs +14 -14
  4. package/esm2022/lib/Pages/ActiveDirectories/active-directory/active-directory.component.mjs +421 -0
  5. package/esm2022/lib/Pages/ActiveDirectories/active-directory-add/active-directory-add.component.mjs +528 -0
  6. package/{esm2020 → esm2022}/lib/Pages/ActiveDirectories/active-directory-routing.module.mjs +29 -29
  7. package/esm2022/lib/Pages/ActiveDirectories/active-directory.module.mjs +108 -0
  8. package/esm2022/lib/Pages/_layout/components/aside/aside-menu/aside-menu.component.mjs +23 -0
  9. package/{esm2020 → esm2022}/lib/Pages/_layout/components/aside/aside.component.mjs +65 -65
  10. package/{esm2020 → esm2022}/lib/Pages/_layout/components/content/content.component.mjs +31 -31
  11. package/{esm2020 → esm2022}/lib/Pages/_layout/components/footer/footer.component.mjs +32 -32
  12. package/{esm2020 → esm2022}/lib/Pages/_layout/components/header/header.component.mjs +57 -57
  13. package/{esm2020 → esm2022}/lib/Pages/_layout/components/header/page-title/page-title.component.mjs +36 -36
  14. package/{esm2020 → esm2022}/lib/Pages/_layout/components/scripts-init/scripts-init.component.mjs +58 -58
  15. package/{esm2020 → esm2022}/lib/Pages/_layout/components/subheader/subheader.component.mjs +36 -36
  16. package/{esm2020 → esm2022}/lib/Pages/_layout/components/subheader/subheader.module.mjs +26 -26
  17. package/{esm2020 → esm2022}/lib/Pages/_layout/components/toolbar/toolbar.component.mjs +41 -41
  18. package/{esm2020 → esm2022}/lib/Pages/_layout/components/toolbar/toolbar.module.mjs +25 -25
  19. package/{esm2020 → esm2022}/lib/Pages/_layout/components/topbar/topbar.component.mjs +71 -71
  20. package/{esm2020 → esm2022}/lib/Pages/anonymouslayout/activation/activation.component.mjs +92 -92
  21. package/{esm2020 → esm2022}/lib/Pages/anonymouslayout/anonymouslayout-routing.module.mjs +37 -37
  22. package/{esm2020 → esm2022}/lib/Pages/anonymouslayout/anonymouslayout.component.mjs +54 -54
  23. package/esm2022/lib/Pages/anonymouslayout/anonymouslayout.module.mjs +100 -0
  24. package/{esm2020 → esm2022}/lib/Pages/anonymouslayout/error/error.component.mjs +48 -48
  25. package/{esm2020 → esm2022}/lib/Pages/anonymouslayout/forgot-password/forgot-password.component.mjs +59 -59
  26. package/{esm2020 → esm2022}/lib/Pages/anonymouslayout/login/login.component.mjs +94 -94
  27. package/{esm2020 → esm2022}/lib/Pages/anonymouslayout/rest-password/rest-password.component.mjs +90 -90
  28. package/{esm2020 → esm2022}/lib/Pages/anonymouslayout/upload-license/upload-license.component.mjs +71 -71
  29. package/{esm2020 → esm2022}/lib/Pages/authentication/auth-callback/auth-callback.component.mjs +43 -43
  30. package/{esm2020 → esm2022}/lib/Pages/authentication/authentication.component.mjs +15 -15
  31. package/{esm2020 → esm2022}/lib/Pages/authentication/authentication.module.mjs +41 -41
  32. package/{esm2020 → esm2022}/lib/Pages/authentication/authentication.routing.mjs +31 -31
  33. package/esm2022/lib/Pages/configurations/auth-configuration/auth-configuration-edit/auth-configuration-edit.component.mjs +330 -0
  34. package/esm2022/lib/Pages/configurations/auth-configuration/auth-configuration.component.mjs +157 -0
  35. package/esm2022/lib/Pages/configurations/configuration/configuration.component.mjs +801 -0
  36. package/{esm2020 → esm2022}/lib/Pages/configurations/configurations.component.mjs +15 -15
  37. package/esm2022/lib/Pages/configurations/configurations.module.mjs +104 -0
  38. package/{esm2020 → esm2022}/lib/Pages/configurations/configurations.routing.mjs +41 -41
  39. package/{esm2020 → esm2022}/lib/Pages/configurations/index.mjs +6 -6
  40. package/{esm2020 → esm2022}/lib/Pages/core/auth.module.mjs +30 -30
  41. package/esm2022/lib/Pages/core/authentication/admin.guard.mjs +17 -0
  42. package/{esm2020 → esm2022}/lib/Pages/core/authentication/auth.guard.mjs +46 -46
  43. package/esm2022/lib/Pages/core/authentication/auth.service.mjs +147 -0
  44. package/esm2022/lib/Pages/departments/department/department.component.mjs +220 -0
  45. package/esm2022/lib/Pages/departments/department-info/department-info.component.mjs +185 -0
  46. package/{esm2020 → esm2022}/lib/Pages/departments/departments-routing.module.mjs +27 -27
  47. package/{esm2020 → esm2022}/lib/Pages/departments/departments.component.mjs +15 -15
  48. package/esm2022/lib/Pages/departments/departments.module.mjs +94 -0
  49. package/esm2022/lib/Pages/documents/add-document/add-document.component.mjs +136 -0
  50. package/esm2022/lib/Pages/documents/document-master-layouts/document-master-layouts.component.mjs +148 -0
  51. package/{esm2020 → esm2022}/lib/Pages/documents/document-template-info/document-template-info.component.mjs +332 -332
  52. package/esm2022/lib/Pages/documents/document-templates/document-templates.component.mjs +437 -0
  53. package/{esm2020 → esm2022}/lib/Pages/documents/documents.component.mjs +15 -15
  54. package/esm2022/lib/Pages/documents/documents.module.mjs +114 -0
  55. package/esm2022/lib/Pages/documents/documents.routing.mjs +37 -0
  56. package/esm2022/lib/Pages/documents/edit-document/edit-document.component.mjs +169 -0
  57. package/{esm2020 → esm2022}/lib/Pages/documents/edit-document-template/edit-document-template.component.mjs +123 -123
  58. package/{esm2020 → esm2022}/lib/Pages/empty-data/empty-data.component.mjs +31 -31
  59. package/{esm2020 → esm2022}/lib/Pages/empty-data/empty-data.module.mjs +28 -28
  60. package/esm2022/lib/Pages/helpCenter/help-center/help-center.component.mjs +294 -0
  61. package/esm2022/lib/Pages/helpCenter/help-center-preview/help-center-preview.component.mjs +43 -0
  62. package/{esm2020 → esm2022}/lib/Pages/helpCenter/help-center-routing.module.mjs +31 -31
  63. package/esm2022/lib/Pages/helpCenter/help-center-secondlevel/help-center-secondlevel.component.mjs +242 -0
  64. package/esm2022/lib/Pages/helpCenter/help-center-thirdlevel/help-center-thirdlevel.component.mjs +243 -0
  65. package/esm2022/lib/Pages/helpCenter/help-center.module.mjs +99 -0
  66. package/{esm2020 → esm2022}/lib/Pages/helpCenter/help-centers.component.mjs +15 -15
  67. package/{esm2020 → esm2022}/lib/Pages/home/filter-pipe.mjs +23 -23
  68. package/esm2022/lib/Pages/home/home.component.mjs +158 -0
  69. package/esm2022/lib/Pages/home/home.module.mjs +48 -0
  70. package/esm2022/lib/Pages/impersonation-rules/impersonation-rules/impersonation-rules.component.mjs +443 -0
  71. package/esm2022/lib/Pages/impersonation-rules/impersonation-rules.module.mjs +95 -0
  72. package/esm2022/lib/Pages/jobs/jobs/jobs.component.mjs +223 -0
  73. package/esm2022/lib/Pages/jobs/jobs.module.mjs +87 -0
  74. package/{esm2020 → esm2022}/lib/Pages/license/license/license.component.mjs +163 -163
  75. package/esm2022/lib/Pages/license/license.module.mjs +71 -0
  76. package/{esm2020 → esm2022}/lib/Pages/localizations/localizations-replace-text/localizations-replace-text.component.mjs +215 -215
  77. package/esm2022/lib/Pages/localizations/localizations.component.mjs +516 -0
  78. package/esm2022/lib/Pages/localizations/localizations.module.mjs +79 -0
  79. package/{esm2020 → esm2022}/lib/Pages/logs/log/log.component.mjs +93 -93
  80. package/{esm2020 → esm2022}/lib/Pages/logs/logs-routing.module.mjs +27 -27
  81. package/{esm2020 → esm2022}/lib/Pages/logs/logs.component.mjs +15 -15
  82. package/esm2022/lib/Pages/logs/logs.module.mjs +87 -0
  83. package/esm2022/lib/Pages/lookups/lookup/lookup.component.mjs +367 -0
  84. package/esm2022/lib/Pages/lookups/lookup-group/lookup-group.component.mjs +187 -0
  85. package/esm2022/lib/Pages/lookups/lookup-item/lookup-item.component.mjs +297 -0
  86. package/{esm2020 → esm2022}/lib/Pages/lookups/lookups-routing.module.mjs +29 -29
  87. package/{esm2020 → esm2022}/lib/Pages/lookups/lookups.component.mjs +15 -15
  88. package/esm2022/lib/Pages/lookups/lookups.module.mjs +100 -0
  89. package/esm2022/lib/Pages/notifications/add-notification/add-notification.component.mjs +104 -0
  90. package/{esm2020 → esm2022}/lib/Pages/notifications/edit-email/edit-email.component.mjs +158 -158
  91. package/esm2022/lib/Pages/notifications/edit-notification/edit-notification.component.mjs +133 -0
  92. package/{esm2020 → esm2022}/lib/Pages/notifications/edit-sms/edit-sms.component.mjs +115 -115
  93. package/esm2022/lib/Pages/notifications/master-layouts/master-layouts.component.mjs +148 -0
  94. package/esm2022/lib/Pages/notifications/notifications-routing.module.mjs +39 -0
  95. package/{esm2020 → esm2022}/lib/Pages/notifications/notifications.component.mjs +15 -15
  96. package/esm2022/lib/Pages/notifications/notifications.module.mjs +101 -0
  97. package/{esm2020 → esm2022}/lib/Pages/notifications/template-info/template-info.component.mjs +391 -391
  98. package/esm2022/lib/Pages/notifications/templates/templates.component.mjs +495 -0
  99. package/esm2022/lib/Pages/providers/provider/provider.component.mjs +615 -0
  100. package/{esm2020 → esm2022}/lib/Pages/providers/providers-routing.module.mjs +27 -27
  101. package/{esm2020 → esm2022}/lib/Pages/providers/providers.component.mjs +15 -15
  102. package/esm2022/lib/Pages/providers/providers.module.mjs +91 -0
  103. package/esm2022/lib/Pages/publicHolidays/public-holiday/public-holiday.component.mjs +334 -0
  104. package/{esm2020 → esm2022}/lib/Pages/publicHolidays/public-holidays-routing.module.mjs +25 -25
  105. package/{esm2020 → esm2022}/lib/Pages/publicHolidays/public-holidays.component.mjs +15 -15
  106. package/esm2022/lib/Pages/publicHolidays/public-holidays.module.mjs +94 -0
  107. package/esm2022/lib/Pages/roles/permission-set-info/permission-set-info.component.mjs +187 -0
  108. package/esm2022/lib/Pages/roles/permissions/permissions.component.mjs +226 -0
  109. package/esm2022/lib/Pages/roles/permissionsets/permissionsets.component.mjs +277 -0
  110. package/{esm2020 → esm2022}/lib/Pages/roles/roles-routing.module.mjs +29 -29
  111. package/{esm2020 → esm2022}/lib/Pages/roles/roles.component.mjs +15 -15
  112. package/esm2022/lib/Pages/roles/roles.module.mjs +105 -0
  113. package/esm2022/lib/Pages/sectors/sector/sector.component.mjs +193 -0
  114. package/esm2022/lib/Pages/sectors/sector-info/sector-info.component.mjs +180 -0
  115. package/esm2022/lib/Pages/sectors/sectors-department-info/sectors-department-info.component.mjs +187 -0
  116. package/{esm2020 → esm2022}/lib/Pages/sectors/sectors-routing.module.mjs +29 -29
  117. package/{esm2020 → esm2022}/lib/Pages/sectors/sectors.component.mjs +15 -15
  118. package/esm2022/lib/Pages/sectors/sectors.module.mjs +96 -0
  119. package/{esm2020 → esm2022}/lib/Pages/shared/Enums/ADType.mjs +5 -5
  120. package/{esm2020 → esm2022}/lib/Pages/shared/Enums/Enums.mjs +54 -54
  121. package/{esm2020 → esm2022}/lib/Pages/shared/Enums/ProviderType.mjs +6 -6
  122. package/{esm2020 → esm2022}/lib/Pages/shared/Enums/WFActivityType.mjs +11 -11
  123. package/{esm2020 → esm2022}/lib/Pages/shared/Enums/configuration/ConditionRHSType.mjs +5 -5
  124. package/{esm2020 → esm2022}/lib/Pages/shared/Enums/configuration/authentecation-configuration.mjs +18 -18
  125. package/{esm2020 → esm2022}/lib/Pages/shared/Pipes/survey-date.pipe.mjs +22 -22
  126. package/{esm2020 → esm2022}/lib/Pages/shared/Services/AccountService.service.mjs +55 -55
  127. package/{esm2020 → esm2022}/lib/Pages/shared/Services/ActiveDirectoryService.service.mjs +51 -51
  128. package/{esm2020 → esm2022}/lib/Pages/shared/Services/AnonymousLayoutService.service.mjs +29 -29
  129. package/{esm2020 → esm2022}/lib/Pages/shared/Services/ConfigurationsService.service.mjs +61 -61
  130. package/{esm2020 → esm2022}/lib/Pages/shared/Services/DepartmentService.service.mjs +46 -46
  131. package/{esm2020 → esm2022}/lib/Pages/shared/Services/DocumentHeaderAndFooterTemplate.service.mjs +36 -36
  132. package/{esm2020 → esm2022}/lib/Pages/shared/Services/DocumentTemplateService.service.mjs +81 -81
  133. package/{esm2020 → esm2022}/lib/Pages/shared/Services/EmailHeaderAndFooterTemplateService.Service.mjs +37 -37
  134. package/{esm2020 → esm2022}/lib/Pages/shared/Services/ErrorService.service.mjs +15 -15
  135. package/{esm2020 → esm2022}/lib/Pages/shared/Services/GlobalErrorHandler.service.mjs +36 -36
  136. package/{esm2020 → esm2022}/lib/Pages/shared/Services/HelpCenterService.service.mjs +47 -47
  137. package/{esm2020 → esm2022}/lib/Pages/shared/Services/HttpErrorInterceptor.service.mjs +47 -47
  138. package/{esm2020 → esm2022}/lib/Pages/shared/Services/ImpersonationRuleService.service.mjs +36 -36
  139. package/{esm2020 → esm2022}/lib/Pages/shared/Services/JobsService.service.mjs +21 -21
  140. package/{esm2020 → esm2022}/lib/Pages/shared/Services/LicenseService.service.mjs +24 -24
  141. package/{esm2020 → esm2022}/lib/Pages/shared/Services/LogsService.mjs +24 -24
  142. package/{esm2020 → esm2022}/lib/Pages/shared/Services/LookupGroupsService.service.mjs +33 -33
  143. package/{esm2020 → esm2022}/lib/Pages/shared/Services/LookupService.service.mjs +67 -67
  144. package/{esm2020 → esm2022}/lib/Pages/shared/Services/PermissionSetService.service.mjs +50 -50
  145. package/{esm2020 → esm2022}/lib/Pages/shared/Services/PermissionsService.service.mjs +36 -36
  146. package/{esm2020 → esm2022}/lib/Pages/shared/Services/PublicHolidayService.service.mjs +39 -39
  147. package/{esm2020 → esm2022}/lib/Pages/shared/Services/SectorService.service.mjs +46 -46
  148. package/{esm2020 → esm2022}/lib/Pages/shared/Services/TemplateService.service.mjs +90 -90
  149. package/{esm2020 → esm2022}/lib/Pages/shared/Services/WorkFlowVersionService.service.mjs +24 -24
  150. package/{esm2020 → esm2022}/lib/Pages/shared/Services/WorkflowActivityService.service.mjs +54 -54
  151. package/{esm2020 → esm2022}/lib/Pages/shared/Services/WorkflowInstanceService.service.mjs +24 -24
  152. package/{esm2020 → esm2022}/lib/Pages/shared/Services/WorkflowLogVariablesService.service.mjs +24 -24
  153. package/{esm2020 → esm2022}/lib/Pages/shared/Services/WorkflowService.service.mjs +38 -38
  154. package/{esm2020 → esm2022}/lib/Pages/shared/Services/WorkflowVariablesService.service.mjs +36 -36
  155. package/{esm2020 → esm2022}/lib/Pages/shared/Services/data.service.mjs +27 -27
  156. package/esm2022/lib/Pages/shared/Services/injectionModuleService.service.mjs +163 -0
  157. package/{esm2020 → esm2022}/lib/Pages/shared/Services/localizationsService.service .mjs +77 -77
  158. package/{esm2020 → esm2022}/lib/Pages/shared/Services/provider.service.mjs +62 -62
  159. package/{esm2020 → esm2022}/lib/Pages/shared/Services/survey-question.service.mjs +57 -57
  160. package/{esm2020 → esm2022}/lib/Pages/shared/Services/survey.service.mjs +140 -140
  161. package/{esm2020 → esm2022}/lib/Pages/shared/Services/userService.service.mjs +80 -80
  162. package/{esm2020 → esm2022}/lib/Pages/shared/base.service.mjs +19 -19
  163. package/{esm2020 → esm2022}/lib/Pages/shared/components/AdDirective.mjs +16 -16
  164. package/{esm2020 → esm2022}/lib/Pages/shared/components/external-url/external-url.component.mjs +168 -168
  165. package/{esm2020 → esm2022}/lib/Pages/shared/components/no-results/no-results.component.mjs +19 -19
  166. package/esm2022/lib/Pages/shared/components/survey/add-survey/add-survey.component.mjs +192 -0
  167. package/{esm2020 → esm2022}/lib/Pages/shared/components/survey/delete-survey/delete-survey.component.mjs +48 -48
  168. package/{esm2020 → esm2022}/lib/Pages/shared/components/survey/duplicate-survey/duplicate-survey.component.mjs +50 -50
  169. package/{esm2020 → esm2022}/lib/Pages/shared/components/survey/edit-survey/edit-survey.component.mjs +217 -217
  170. package/{esm2020 → esm2022}/lib/Pages/shared/components/survey/submissions/delete-submission/delete-submission.component.mjs +47 -47
  171. package/{esm2020 → esm2022}/lib/Pages/shared/components/survey/submissions/eliminate-submission/eliminate-submission.component.mjs +49 -49
  172. package/{esm2020 → esm2022}/lib/Pages/shared/components/survey/submissions/uneliminate-submission/uneliminate-submission.component.mjs +50 -50
  173. package/{esm2020 → esm2022}/lib/Pages/shared/components/survey/survey-info/add-question/add-question.component.mjs +624 -624
  174. package/{esm2020 → esm2022}/lib/Pages/shared/components/survey/survey-info/delete-question/delete-question.component.mjs +47 -47
  175. package/{esm2020 → esm2022}/lib/Pages/shared/components/survey/survey-info/edit-question/edit-question.component.mjs +683 -683
  176. package/{esm2020 → esm2022}/lib/Pages/shared/components/survey/survey-info/preview/preview.component.mjs +138 -138
  177. package/{esm2020 → esm2022}/lib/Pages/shared/components/survey/survey-info/publish-survey/publish-survey.component.mjs +102 -102
  178. package/{esm2020 → esm2022}/lib/Pages/shared/components/survey/survey-info/result-question/result.component.mjs +56 -56
  179. package/{esm2020 → esm2022}/lib/Pages/shared/components/survey/survey-info/survey-info.component.mjs +532 -532
  180. package/{esm2020 → esm2022}/lib/Pages/shared/components/survey/survey-info/take-survey/take-survey.component.mjs +113 -113
  181. package/{esm2020 → esm2022}/lib/Pages/shared/components/survey/survey-info/unpublish-survey/unpublish-survey.component.mjs +114 -114
  182. package/{esm2020 → esm2022}/lib/Pages/shared/components/survey/survey.component.mjs +292 -292
  183. package/esm2022/lib/Pages/shared/components/survey-form/survey-form.component.mjs +696 -0
  184. package/esm2022/lib/Pages/shared/components/survey-form-item/survey-form-item.component.mjs +84 -0
  185. package/{esm2020 → esm2022}/lib/Pages/shared/components/survey-layout/survey-layout.component.mjs +15 -15
  186. package/{esm2020 → esm2022}/lib/Pages/shared/config/environment.mjs +11 -11
  187. package/esm2022/lib/Pages/shared/constants.mjs +130 -0
  188. package/{esm2020 → esm2022}/lib/Pages/shared/filter/filter.component.mjs +14 -14
  189. package/{esm2020 → esm2022}/lib/Pages/shared/models/ADModels/ADMappingModel.mjs +3 -3
  190. package/{esm2020 → esm2022}/lib/Pages/shared/models/ADModels/ActiveDirectoryAddEditModel.mjs +6 -6
  191. package/{esm2020 → esm2022}/lib/Pages/shared/models/AccountModels/forgotPasswordModel.mjs +5 -5
  192. package/{esm2020 → esm2022}/lib/Pages/shared/models/ConfigurationModels/ConfigurationModel.mjs +50 -50
  193. package/{esm2020 → esm2022}/lib/Pages/shared/models/DepartmentModels/DepartmentModel.mjs +2 -2
  194. package/{esm2020 → esm2022}/lib/Pages/shared/models/DepartmentModels/DepartmentUsersIDRequestModel.mjs +5 -5
  195. package/{esm2020 → esm2022}/lib/Pages/shared/models/DocumentsModels/DocumentExportDTO.mjs +7 -7
  196. package/{esm2020 → esm2022}/lib/Pages/shared/models/DocumentsModels/DocumentHeaderAndFooterTemplate.mjs +9 -9
  197. package/{esm2020 → esm2022}/lib/Pages/shared/models/DocumentsModels/DocumentTemplateDTO.mjs +9 -9
  198. package/{esm2020 → esm2022}/lib/Pages/shared/models/DocumentsModels/DocumentTemplateInfoDTO.mjs +7 -7
  199. package/{esm2020 → esm2022}/lib/Pages/shared/models/HelpCenterModels/HelpCenterItemModel.mjs +11 -11
  200. package/{esm2020 → esm2022}/lib/Pages/shared/models/ImpersonationRuleModels/ImpersonationRuleModel.mjs +7 -7
  201. package/{esm2020 → esm2022}/lib/Pages/shared/models/ImpersonationRuleModels/ParticipantModel.mjs +8 -8
  202. package/{esm2020 → esm2022}/lib/Pages/shared/models/InjectedModuleModel/InjectedModule.mjs +6 -6
  203. package/{esm2020 → esm2022}/lib/Pages/shared/models/JobModels/JobCountsModel.mjs +2 -2
  204. package/{esm2020 → esm2022}/lib/Pages/shared/models/LicenseModel/LicenseModel.mjs +5 -5
  205. package/{esm2020 → esm2022}/lib/Pages/shared/models/LocalizationModels/EditResourceModel.mjs +7 -7
  206. package/{esm2020 → esm2022}/lib/Pages/shared/models/LocalizationModels/LocalizationReplaceTextModel.mjs +5 -5
  207. package/{esm2020 → esm2022}/lib/Pages/shared/models/LocalizationModels/UploadJsonVM.mjs +2 -2
  208. package/{esm2020 → esm2022}/lib/Pages/shared/models/Lookups/LookupGroupModel.mjs +6 -6
  209. package/{esm2020 → esm2022}/lib/Pages/shared/models/Lookups/LookupItem.mjs +7 -7
  210. package/{esm2020 → esm2022}/lib/Pages/shared/models/Lookups/LookupModel.mjs +8 -8
  211. package/{esm2020 → esm2022}/lib/Pages/shared/models/NotificationsModels/EmailHeaderAndFooterTemplate.mjs +10 -10
  212. package/{esm2020 → esm2022}/lib/Pages/shared/models/NotificationsModels/EmailTemplateInfoDTO.mjs +11 -11
  213. package/{esm2020 → esm2022}/lib/Pages/shared/models/NotificationsModels/EmailTemplateTesterModel.mjs +2 -2
  214. package/{esm2020 → esm2022}/lib/Pages/shared/models/NotificationsModels/SMSTemplateInfoDTO.mjs +6 -6
  215. package/{esm2020 → esm2022}/lib/Pages/shared/models/NotificationsModels/SMSTemplateTesterModel.mjs +2 -2
  216. package/{esm2020 → esm2022}/lib/Pages/shared/models/NotificationsModels/SendEmailTemplateModel.mjs +2 -2
  217. package/{esm2020 → esm2022}/lib/Pages/shared/models/NotificationsModels/TemplateDTO.mjs +9 -9
  218. package/{esm2020 → esm2022}/lib/Pages/shared/models/NotificationsModels/TemplateEditViewModel.mjs +8 -8
  219. package/{esm2020 → esm2022}/lib/Pages/shared/models/PermissionsModels/PermissionModel.mjs +7 -7
  220. package/{esm2020 → esm2022}/lib/Pages/shared/models/PermissionsModels/PermissionSetModel.mjs +7 -7
  221. package/{esm2020 → esm2022}/lib/Pages/shared/models/PermissionsModels/PermissionSetUsersIDRequestModel.mjs +5 -5
  222. package/{esm2020 → esm2022}/lib/Pages/shared/models/ProviderModels/DefaultProviderModel.mjs +5 -5
  223. package/{esm2020 → esm2022}/lib/Pages/shared/models/ProviderModels/EmailProviderTesterModel.mjs +2 -2
  224. package/{esm2020 → esm2022}/lib/Pages/shared/models/ProviderModels/ProviderAttributeModel.mjs +2 -2
  225. package/{esm2020 → esm2022}/lib/Pages/shared/models/ProviderModels/ProviderModel.mjs +5 -5
  226. package/{esm2020 → esm2022}/lib/Pages/shared/models/ProviderModels/SMSProviderTesterModel.mjs +2 -2
  227. package/{esm2020 → esm2022}/lib/Pages/shared/models/PublicHolidayModels/PublicHolidayModel.mjs +7 -7
  228. package/{esm2020 → esm2022}/lib/Pages/shared/models/SectorModels/SectorDepartmentModel.mjs +5 -5
  229. package/{esm2020 → esm2022}/lib/Pages/shared/models/SectorModels/SectorModel.mjs +6 -6
  230. package/{esm2020 → esm2022}/lib/Pages/shared/models/SurveyModels/DeleteSurveyDTO.mjs +2 -2
  231. package/{esm2020 → esm2022}/lib/Pages/shared/models/SurveyModels/add-survey-submissio.mjs +13 -13
  232. package/{esm2020 → esm2022}/lib/Pages/shared/models/SurveyModels/add-survey.mjs +10 -10
  233. package/{esm2020 → esm2022}/lib/Pages/shared/models/SurveyModels/model.mjs +2 -2
  234. package/{esm2020 → esm2022}/lib/Pages/shared/models/SurveyModels/survey-field-options.mjs +6 -6
  235. package/{esm2020 → esm2022}/lib/Pages/shared/models/SurveyModels/survey-filed-value.mjs +7 -7
  236. package/{esm2020 → esm2022}/lib/Pages/shared/models/SurveyModels/survey-form-options.mjs +7 -7
  237. package/{esm2020 → esm2022}/lib/Pages/shared/models/SurveyModels/survey-publish.mjs +4 -4
  238. package/{esm2020 → esm2022}/lib/Pages/shared/models/SurveyModels/survey-question-option.mjs +17 -17
  239. package/{esm2020 → esm2022}/lib/Pages/shared/models/SurveyModels/survey-question.mjs +10 -10
  240. package/esm2022/lib/Pages/shared/models/SurveyModels/survey-utils.mjs +8 -0
  241. package/{esm2020 → esm2022}/lib/Pages/shared/models/UserModels/ActivationModel.mjs +2 -2
  242. package/{esm2020 → esm2022}/lib/Pages/shared/models/UserModels/AddUserModel.mjs +36 -36
  243. package/{esm2020 → esm2022}/lib/Pages/shared/models/UserModels/DropdownsResponseModel.mjs +11 -11
  244. package/{esm2020 → esm2022}/lib/Pages/shared/models/UserModels/EditUserModel.mjs +8 -8
  245. package/{esm2020 → esm2022}/lib/Pages/shared/models/UserModels/IdentityModel.mjs +2 -2
  246. package/{esm2020 → esm2022}/lib/Pages/shared/models/UserModels/UserSearchParamDTO.mjs +2 -2
  247. package/{esm2020 → esm2022}/lib/Pages/shared/models/UserModels/UsersIDRequestModel.mjs +5 -5
  248. package/{esm2020 → esm2022}/lib/Pages/shared/models/WorkflowModels/VariableLookupModel.mjs +2 -2
  249. package/{esm2020 → esm2022}/lib/Pages/shared/models/WorkflowModels/WFActivityModel.mjs +16 -16
  250. package/{esm2020 → esm2022}/lib/Pages/shared/models/WorkflowModels/WFActivityOutcomeModel.mjs +2 -2
  251. package/{esm2020 → esm2022}/lib/Pages/shared/models/WorkflowModels/WFActivityVariablesModel.mjs +7 -7
  252. package/{esm2020 → esm2022}/lib/Pages/shared/models/WorkflowModels/WFCreationModel.mjs +7 -7
  253. package/{esm2020 → esm2022}/lib/Pages/shared/models/WorkflowModels/WFVariableModel.mjs +8 -8
  254. package/{esm2020 → esm2022}/lib/Pages/shared/models/user.registration.mjs +7 -7
  255. package/esm2022/lib/Pages/shared/modules/public-survey.module.mjs +68 -0
  256. package/{esm2020 → esm2022}/lib/Pages/shared/modules/survey-routing.module.mjs +39 -39
  257. package/esm2022/lib/Pages/shared/modules/survey.module.mjs +129 -0
  258. package/esm2022/lib/Pages/shared/shared.module.mjs +31 -0
  259. package/{esm2020 → esm2022}/lib/Pages/shared/stylesbundle.service.mjs +44 -44
  260. package/{esm2020 → esm2022}/lib/Pages/start/index/index.component.mjs +25 -25
  261. package/{esm2020 → esm2022}/lib/Pages/start/start-routing.module.mjs +22 -22
  262. package/{esm2020 → esm2022}/lib/Pages/start/start.module.mjs +31 -31
  263. package/esm2022/lib/Pages/users/users.component.mjs +806 -0
  264. package/esm2022/lib/Pages/users/users.module.mjs +86 -0
  265. package/{esm2020 → esm2022}/lib/Pages/workflows/activity/workflow-activity-add/workflow-activity-add.component.mjs +535 -535
  266. package/{esm2020 → esm2022}/lib/Pages/workflows/activity/workflow-activity-edit/workflow-activity-edit.component.mjs +840 -840
  267. package/{esm2020 → esm2022}/lib/Pages/workflows/instance-info/instance-info.component.mjs +302 -302
  268. package/esm2022/lib/Pages/workflows/tabs/tabs.component.mjs +793 -0
  269. package/{esm2020 → esm2022}/lib/Pages/workflows/version-info/version-info.component.mjs +137 -137
  270. package/esm2022/lib/Pages/workflows/workflow/workflow.component.mjs +209 -0
  271. package/{esm2020 → esm2022}/lib/Pages/workflows/workflows-routing.module.mjs +35 -35
  272. package/{esm2020 → esm2022}/lib/Pages/workflows/workflows.component.mjs +15 -15
  273. package/esm2022/lib/Pages/workflows/workflows.module.mjs +103 -0
  274. package/{esm2020 → esm2022}/lib/_metronic/configs/default-layout.config.mjs +95 -95
  275. package/{esm2020 → esm2022}/lib/_metronic/core/_utils/DomHelpers.mjs +270 -270
  276. package/{esm2020 → esm2022}/lib/_metronic/core/_utils/ElementAnimateUtil.mjs +166 -166
  277. package/esm2022/lib/_metronic/core/_utils/EventHandlerUtil.mjs +90 -0
  278. package/esm2022/lib/_metronic/core/_utils/_DOMEventHandlerUtil.mjs +49 -0
  279. package/esm2022/lib/_metronic/core/_utils/_DataUtil.mjs +48 -0
  280. package/{esm2020 → esm2022}/lib/_metronic/core/_utils/_ElementStyleUtil.mjs +16 -16
  281. package/{esm2020 → esm2022}/lib/_metronic/core/_utils/_TypesHelpers.mjs +48 -48
  282. package/{esm2020 → esm2022}/lib/_metronic/core/_utils/models/OffsetModel.mjs +1 -1
  283. package/{esm2020 → esm2022}/lib/_metronic/core/_utils/models/ViewPortModel.mjs +1 -1
  284. package/{esm2020 → esm2022}/lib/_metronic/core/components/MenuComponent.mjs +827 -827
  285. package/{esm2020 → esm2022}/lib/_metronic/core/components/_CookieComponent.mjs +52 -52
  286. package/esm2022/lib/_metronic/core/components/_DrawerComponent.mjs +288 -0
  287. package/{esm2020 → esm2022}/lib/_metronic/core/components/_ScrollComponent.mjs +252 -252
  288. package/esm2022/lib/_metronic/core/components/_ScrollTopComponent.mjs +113 -0
  289. package/esm2022/lib/_metronic/core/components/_ToggleComponent.mjs +157 -0
  290. package/{esm2020 → esm2022}/lib/_metronic/core/services/layout-init.service.mjs +155 -155
  291. package/{esm2020 → esm2022}/lib/_metronic/core/services/layout.service.mjs +150 -150
  292. package/esm2022/lib/_metronic/core/services/page-info.service.mjs +119 -0
  293. package/esm2022/lib/masterlayout-routing.module.mjs +41 -0
  294. package/{esm2020 → esm2022}/lib/masterlayout.component.mjs +118 -118
  295. package/esm2022/lib/masterlayout.module.mjs +188 -0
  296. package/{esm2020 → esm2022}/public-api.mjs +48 -48
  297. package/{fesm2020 → fesm2022}/bnsights-bbsf-admin-portal.mjs +26884 -26881
  298. package/fesm2022/bnsights-bbsf-admin-portal.mjs.map +1 -0
  299. package/index.d.ts +5 -5
  300. package/lib/Pages/ActiveDirectories/active-directories.component.d.ts +8 -8
  301. package/lib/Pages/ActiveDirectories/active-directory/active-directory.component.d.ts +85 -87
  302. package/lib/Pages/ActiveDirectories/active-directory-add/active-directory-add.component.d.ts +97 -99
  303. package/lib/Pages/ActiveDirectories/active-directory-routing.module.d.ts +7 -7
  304. package/lib/Pages/ActiveDirectories/active-directory.module.d.ts +26 -26
  305. package/lib/Pages/_layout/components/aside/aside-menu/aside-menu.component.d.ts +13 -13
  306. package/lib/Pages/_layout/components/aside/aside.component.d.ts +24 -24
  307. package/lib/Pages/_layout/components/content/content.component.d.ts +13 -13
  308. package/lib/Pages/_layout/components/footer/footer.component.d.ts +14 -14
  309. package/lib/Pages/_layout/components/header/header.component.d.ts +24 -24
  310. package/lib/Pages/_layout/components/header/page-title/page-title.component.d.ts +22 -22
  311. package/lib/Pages/_layout/components/scripts-init/scripts-init.component.d.ts +18 -18
  312. package/lib/Pages/_layout/components/subheader/subheader.component.d.ts +17 -17
  313. package/lib/Pages/_layout/components/subheader/subheader.module.d.ts +9 -9
  314. package/lib/Pages/_layout/components/toolbar/toolbar.component.d.ts +18 -18
  315. package/lib/Pages/_layout/components/toolbar/toolbar.module.d.ts +10 -10
  316. package/lib/Pages/_layout/components/topbar/topbar.component.d.ts +44 -44
  317. package/lib/Pages/anonymouslayout/activation/activation.component.d.ts +32 -32
  318. package/lib/Pages/anonymouslayout/anonymouslayout-routing.module.d.ts +7 -7
  319. package/lib/Pages/anonymouslayout/anonymouslayout.component.d.ts +24 -24
  320. package/lib/Pages/anonymouslayout/anonymouslayout.module.d.ts +21 -21
  321. package/lib/Pages/anonymouslayout/error/error.component.d.ts +25 -25
  322. package/lib/Pages/anonymouslayout/forgot-password/forgot-password.component.d.ts +24 -24
  323. package/lib/Pages/anonymouslayout/login/login.component.d.ts +36 -36
  324. package/lib/Pages/anonymouslayout/rest-password/rest-password.component.d.ts +32 -32
  325. package/lib/Pages/anonymouslayout/upload-license/upload-license.component.d.ts +25 -25
  326. package/lib/Pages/authentication/auth-callback/auth-callback.component.d.ts +21 -21
  327. package/lib/Pages/authentication/authentication.component.d.ts +8 -8
  328. package/lib/Pages/authentication/authentication.module.d.ts +12 -12
  329. package/lib/Pages/authentication/authentication.routing.d.ts +7 -7
  330. package/lib/Pages/configurations/auth-configuration/auth-configuration-edit/auth-configuration-edit.component.d.ts +75 -75
  331. package/lib/Pages/configurations/auth-configuration/auth-configuration.component.d.ts +57 -58
  332. package/lib/Pages/configurations/configuration/configuration.component.d.ts +127 -129
  333. package/lib/Pages/configurations/configurations.component.d.ts +8 -8
  334. package/lib/Pages/configurations/configurations.module.d.ts +24 -24
  335. package/lib/Pages/configurations/configurations.routing.d.ts +7 -7
  336. package/lib/Pages/configurations/index.d.ts +6 -6
  337. package/lib/Pages/core/auth.module.d.ts +8 -8
  338. package/lib/Pages/core/authentication/admin.guard.d.ts +9 -9
  339. package/lib/Pages/core/authentication/auth.guard.d.ts +14 -14
  340. package/lib/Pages/core/authentication/auth.service.d.ts +35 -35
  341. package/lib/Pages/departments/department/department.component.d.ts +66 -68
  342. package/lib/Pages/departments/department-info/department-info.component.d.ts +58 -60
  343. package/lib/Pages/departments/departments-routing.module.d.ts +7 -7
  344. package/lib/Pages/departments/departments.component.d.ts +8 -8
  345. package/lib/Pages/departments/departments.module.d.ts +21 -21
  346. package/lib/Pages/documents/{add/add.component.d.ts → add-document/add-document.component.d.ts} +40 -40
  347. package/lib/Pages/documents/document-master-layouts/document-master-layouts.component.d.ts +51 -53
  348. package/lib/Pages/documents/document-template-info/document-template-info.component.d.ts +67 -67
  349. package/lib/Pages/documents/document-templates/document-templates.component.d.ts +87 -89
  350. package/lib/Pages/documents/documents.component.d.ts +8 -8
  351. package/lib/Pages/documents/documents.module.d.ts +27 -27
  352. package/lib/Pages/documents/documents.routing.d.ts +7 -7
  353. package/lib/Pages/documents/{edit/edit.component.d.ts → edit-document/edit-document.component.d.ts} +42 -42
  354. package/lib/Pages/documents/edit-document-template/edit-document-template.component.d.ts +39 -39
  355. package/lib/Pages/empty-data/empty-data.component.d.ts +14 -14
  356. package/lib/Pages/empty-data/empty-data.module.d.ts +8 -8
  357. package/lib/Pages/helpCenter/help-center/help-center.component.d.ts +69 -71
  358. package/lib/Pages/helpCenter/help-center-preview/help-center-preview.component.d.ts +23 -23
  359. package/lib/Pages/helpCenter/help-center-routing.module.d.ts +7 -7
  360. package/lib/Pages/helpCenter/help-center-secondlevel/help-center-secondlevel.component.d.ts +65 -67
  361. package/lib/Pages/helpCenter/help-center-thirdlevel/help-center-thirdlevel.component.d.ts +64 -66
  362. package/lib/Pages/helpCenter/help-center.module.d.ts +25 -25
  363. package/lib/Pages/helpCenter/help-centers.component.d.ts +8 -8
  364. package/lib/Pages/home/filter-pipe.d.ts +7 -7
  365. package/lib/Pages/home/home.component.d.ts +19 -19
  366. package/lib/Pages/home/home.module.d.ts +14 -14
  367. package/lib/Pages/impersonation-rules/impersonation-rules/impersonation-rules.component.d.ts +86 -88
  368. package/lib/Pages/impersonation-rules/impersonation-rules.module.d.ts +19 -19
  369. package/lib/Pages/jobs/jobs/jobs.component.d.ts +76 -77
  370. package/lib/Pages/jobs/jobs.module.d.ts +17 -17
  371. package/lib/Pages/license/license/license.component.d.ts +59 -59
  372. package/lib/Pages/license/license.module.d.ts +15 -15
  373. package/lib/Pages/localizations/localizations-replace-text/localizations-replace-text.component.d.ts +53 -53
  374. package/lib/Pages/localizations/localizations.component.d.ts +108 -110
  375. package/lib/Pages/localizations/localizations.module.d.ts +18 -18
  376. package/lib/Pages/logs/log/log.component.d.ts +34 -34
  377. package/lib/Pages/logs/logs-routing.module.d.ts +7 -7
  378. package/lib/Pages/logs/logs.component.d.ts +8 -8
  379. package/lib/Pages/logs/logs.module.d.ts +20 -20
  380. package/lib/Pages/lookups/lookup/lookup.component.d.ts +83 -85
  381. package/lib/Pages/lookups/lookup-group/lookup-group.component.d.ts +58 -60
  382. package/lib/Pages/lookups/lookup-item/lookup-item.component.d.ts +84 -86
  383. package/lib/Pages/lookups/lookups-routing.module.d.ts +7 -7
  384. package/lib/Pages/lookups/lookups.component.d.ts +8 -8
  385. package/lib/Pages/lookups/lookups.module.d.ts +24 -24
  386. package/lib/Pages/notifications/{add/add.component.d.ts → add-notification/add-notification.component.d.ts} +33 -33
  387. package/lib/Pages/notifications/edit-email/edit-email.component.d.ts +43 -43
  388. package/lib/Pages/notifications/{edit/edit.component.d.ts → edit-notification/edit-notification.component.d.ts} +35 -35
  389. package/lib/Pages/notifications/edit-sms/edit-sms.component.d.ts +37 -37
  390. package/lib/Pages/notifications/master-layouts/master-layouts.component.d.ts +51 -53
  391. package/lib/Pages/notifications/notifications-routing.module.d.ts +7 -7
  392. package/lib/Pages/notifications/notifications.component.d.ts +8 -8
  393. package/lib/Pages/notifications/notifications.module.d.ts +28 -28
  394. package/lib/Pages/notifications/template-info/template-info.component.d.ts +86 -86
  395. package/lib/Pages/notifications/templates/templates.component.d.ts +100 -102
  396. package/lib/Pages/providers/provider/provider.component.d.ts +118 -120
  397. package/lib/Pages/providers/providers-routing.module.d.ts +7 -7
  398. package/lib/Pages/providers/providers.component.d.ts +8 -8
  399. package/lib/Pages/providers/providers.module.d.ts +21 -21
  400. package/lib/Pages/publicHolidays/public-holiday/public-holiday.component.d.ts +73 -75
  401. package/lib/Pages/publicHolidays/public-holidays-routing.module.d.ts +7 -7
  402. package/lib/Pages/publicHolidays/public-holidays.component.d.ts +8 -8
  403. package/lib/Pages/publicHolidays/public-holidays.module.d.ts +21 -21
  404. package/lib/Pages/roles/permission-set-info/permission-set-info.component.d.ts +56 -58
  405. package/lib/Pages/roles/permissions/permissions.component.d.ts +63 -65
  406. package/lib/Pages/roles/permissionsets/permissionsets.component.d.ts +67 -69
  407. package/lib/Pages/roles/roles-routing.module.d.ts +7 -7
  408. package/lib/Pages/roles/roles.component.d.ts +8 -8
  409. package/lib/Pages/roles/roles.module.d.ts +24 -24
  410. package/lib/Pages/sectors/sector/sector.component.d.ts +62 -64
  411. package/lib/Pages/sectors/sector-info/sector-info.component.d.ts +60 -62
  412. package/lib/Pages/sectors/{department-info/department-info.component.d.ts → sectors-department-info/sectors-department-info.component.d.ts} +61 -63
  413. package/lib/Pages/sectors/sectors-routing.module.d.ts +7 -7
  414. package/lib/Pages/sectors/sectors.component.d.ts +8 -8
  415. package/lib/Pages/sectors/sectors.module.d.ts +23 -23
  416. package/lib/Pages/shared/Enums/ADType.d.ts +4 -4
  417. package/lib/Pages/shared/Enums/Enums.d.ts +47 -47
  418. package/lib/Pages/shared/Enums/ProviderType.d.ts +5 -5
  419. package/lib/Pages/shared/Enums/WFActivityType.d.ts +10 -10
  420. package/lib/Pages/shared/Enums/configuration/ConditionRHSType.d.ts +4 -4
  421. package/lib/Pages/shared/Enums/configuration/authentecation-configuration.d.ts +15 -15
  422. package/lib/Pages/shared/Pipes/survey-date.pipe.d.ts +12 -12
  423. package/lib/Pages/shared/Services/AccountService.service.d.ts +21 -21
  424. package/lib/Pages/shared/Services/ActiveDirectoryService.service.d.ts +18 -18
  425. package/lib/Pages/shared/Services/AnonymousLayoutService.service.d.ts +17 -17
  426. package/lib/Pages/shared/Services/ConfigurationsService.service.d.ts +20 -20
  427. package/lib/Pages/shared/Services/DepartmentService.service.d.ts +18 -18
  428. package/lib/Pages/shared/Services/DocumentHeaderAndFooterTemplate.service.d.ts +15 -15
  429. package/lib/Pages/shared/Services/DocumentTemplateService.service.d.ts +26 -26
  430. package/lib/Pages/shared/Services/EmailHeaderAndFooterTemplateService.Service.d.ts +15 -15
  431. package/lib/Pages/shared/Services/ErrorService.service.d.ts +8 -8
  432. package/lib/Pages/shared/Services/GlobalErrorHandler.service.d.ts +10 -10
  433. package/lib/Pages/shared/Services/HelpCenterService.service.d.ts +18 -18
  434. package/lib/Pages/shared/Services/HttpErrorInterceptor.service.d.ts +12 -12
  435. package/lib/Pages/shared/Services/ImpersonationRuleService.service.d.ts +15 -15
  436. package/lib/Pages/shared/Services/JobsService.service.d.ts +10 -10
  437. package/lib/Pages/shared/Services/LicenseService.service.d.ts +12 -12
  438. package/lib/Pages/shared/Services/LogsService.d.ts +10 -10
  439. package/lib/Pages/shared/Services/LookupGroupsService.service.d.ts +14 -14
  440. package/lib/Pages/shared/Services/LookupService.service.d.ts +25 -25
  441. package/lib/Pages/shared/Services/PermissionSetService.service.d.ts +19 -19
  442. package/lib/Pages/shared/Services/PermissionsService.service.d.ts +15 -15
  443. package/lib/Pages/shared/Services/PublicHolidayService.service.d.ts +16 -16
  444. package/lib/Pages/shared/Services/SectorService.service.d.ts +18 -18
  445. package/lib/Pages/shared/Services/TemplateService.service.d.ts +34 -34
  446. package/lib/Pages/shared/Services/WorkFlowVersionService.service.d.ts +10 -10
  447. package/lib/Pages/shared/Services/WorkflowActivityService.service.d.ts +19 -19
  448. package/lib/Pages/shared/Services/WorkflowInstanceService.service.d.ts +10 -10
  449. package/lib/Pages/shared/Services/WorkflowLogVariablesService.service.d.ts +10 -10
  450. package/lib/Pages/shared/Services/WorkflowService.service.d.ts +15 -15
  451. package/lib/Pages/shared/Services/WorkflowVariablesService.service.d.ts +15 -15
  452. package/lib/Pages/shared/Services/data.service.d.ts +9 -9
  453. package/lib/Pages/shared/Services/injectionModuleService.service.d.ts +50 -50
  454. package/lib/Pages/shared/Services/localizationsService.service .d.ts +28 -28
  455. package/lib/Pages/shared/Services/provider.service.d.ts +25 -25
  456. package/lib/Pages/shared/Services/survey-question.service.d.ts +19 -19
  457. package/lib/Pages/shared/Services/survey.service.d.ts +38 -38
  458. package/lib/Pages/shared/Services/userService.service.d.ts +29 -29
  459. package/lib/Pages/shared/base.service.d.ts +4 -4
  460. package/lib/Pages/shared/components/AdDirective.d.ts +8 -8
  461. package/lib/Pages/shared/components/external-url/external-url.component.d.ts +61 -61
  462. package/lib/Pages/shared/components/no-results/no-results.component.d.ts +10 -10
  463. package/lib/Pages/shared/components/survey/add-survey/add-survey.component.d.ts +40 -40
  464. package/lib/Pages/shared/components/survey/delete-survey/delete-survey.component.d.ts +19 -19
  465. package/lib/Pages/shared/components/survey/duplicate-survey/duplicate-survey.component.d.ts +19 -19
  466. package/lib/Pages/shared/components/survey/edit-survey/edit-survey.component.d.ts +43 -43
  467. package/lib/Pages/shared/components/survey/submissions/delete-submission/delete-submission.component.d.ts +19 -19
  468. package/lib/Pages/shared/components/survey/submissions/eliminate-submission/eliminate-submission.component.d.ts +19 -19
  469. package/lib/Pages/shared/components/survey/submissions/uneliminate-submission/uneliminate-submission.component.d.ts +19 -19
  470. package/lib/Pages/shared/components/survey/survey-info/add-question/add-question.component.d.ts +83 -83
  471. package/lib/Pages/shared/components/survey/survey-info/delete-question/delete-question.component.d.ts +19 -19
  472. package/lib/Pages/shared/components/survey/survey-info/edit-question/edit-question.component.d.ts +84 -84
  473. package/lib/Pages/shared/components/survey/survey-info/preview/preview.component.d.ts +40 -40
  474. package/lib/Pages/shared/components/survey/survey-info/publish-survey/publish-survey.component.d.ts +31 -31
  475. package/lib/Pages/shared/components/survey/survey-info/result-question/result.component.d.ts +27 -27
  476. package/lib/Pages/shared/components/survey/survey-info/survey-info.component.d.ts +119 -119
  477. package/lib/Pages/shared/components/survey/survey-info/take-survey/take-survey.component.d.ts +39 -39
  478. package/lib/Pages/shared/components/survey/survey-info/unpublish-survey/unpublish-survey.component.d.ts +32 -32
  479. package/lib/Pages/shared/components/survey/survey.component.d.ts +65 -65
  480. package/lib/Pages/shared/components/survey-form/survey-form.component.d.ts +41 -41
  481. package/lib/Pages/shared/components/survey-form-item/survey-form-item.component.d.ts +23 -23
  482. package/lib/Pages/shared/components/survey-layout/survey-layout.component.d.ts +8 -8
  483. package/lib/Pages/shared/config/environment.d.ts +1 -1
  484. package/lib/Pages/shared/constants.d.ts +129 -129
  485. package/lib/Pages/shared/filter/filter.component.d.ts +8 -8
  486. package/lib/Pages/shared/models/ADModels/ADMappingModel.d.ts +6 -6
  487. package/lib/Pages/shared/models/ADModels/ActiveDirectoryAddEditModel.d.ts +28 -28
  488. package/lib/Pages/shared/models/AccountModels/forgotPasswordModel.d.ts +3 -3
  489. package/lib/Pages/shared/models/ConfigurationModels/ConfigurationModel.d.ts +64 -64
  490. package/lib/Pages/shared/models/DepartmentModels/DepartmentModel.d.ts +9 -9
  491. package/lib/Pages/shared/models/DepartmentModels/DepartmentUsersIDRequestModel.d.ts +4 -4
  492. package/lib/Pages/shared/models/DocumentsModels/DocumentExportDTO.d.ts +8 -8
  493. package/lib/Pages/shared/models/DocumentsModels/DocumentHeaderAndFooterTemplate.d.ts +16 -16
  494. package/lib/Pages/shared/models/DocumentsModels/DocumentTemplateDTO.d.ts +13 -13
  495. package/lib/Pages/shared/models/DocumentsModels/DocumentTemplateInfoDTO.d.ts +7 -7
  496. package/lib/Pages/shared/models/HelpCenterModels/HelpCenterItemModel.d.ts +17 -17
  497. package/lib/Pages/shared/models/ImpersonationRuleModels/ImpersonationRuleModel.d.ts +9 -9
  498. package/lib/Pages/shared/models/ImpersonationRuleModels/ParticipantModel.d.ts +15 -15
  499. package/lib/Pages/shared/models/InjectedModuleModel/InjectedModule.d.ts +5 -5
  500. package/lib/Pages/shared/models/JobModels/JobCountsModel.d.ts +8 -8
  501. package/lib/Pages/shared/models/LicenseModel/LicenseModel.d.ts +5 -5
  502. package/lib/Pages/shared/models/LocalizationModels/EditResourceModel.d.ts +7 -7
  503. package/lib/Pages/shared/models/LocalizationModels/LocalizationReplaceTextModel.d.ts +9 -9
  504. package/lib/Pages/shared/models/LocalizationModels/UploadJsonVM.d.ts +5 -5
  505. package/lib/Pages/shared/models/Lookups/LookupGroupModel.d.ts +5 -5
  506. package/lib/Pages/shared/models/Lookups/LookupItem.d.ts +13 -13
  507. package/lib/Pages/shared/models/Lookups/LookupModel.d.ts +13 -13
  508. package/lib/Pages/shared/models/NotificationsModels/EmailHeaderAndFooterTemplate.d.ts +9 -9
  509. package/lib/Pages/shared/models/NotificationsModels/EmailTemplateInfoDTO.d.ts +15 -15
  510. package/lib/Pages/shared/models/NotificationsModels/EmailTemplateTesterModel.d.ts +9 -9
  511. package/lib/Pages/shared/models/NotificationsModels/SMSTemplateInfoDTO.d.ts +9 -9
  512. package/lib/Pages/shared/models/NotificationsModels/SMSTemplateTesterModel.d.ts +9 -9
  513. package/lib/Pages/shared/models/NotificationsModels/SendEmailTemplateModel.d.ts +8 -8
  514. package/lib/Pages/shared/models/NotificationsModels/TemplateDTO.d.ts +22 -22
  515. package/lib/Pages/shared/models/NotificationsModels/TemplateEditViewModel.d.ts +11 -11
  516. package/lib/Pages/shared/models/PermissionsModels/PermissionModel.d.ts +8 -8
  517. package/lib/Pages/shared/models/PermissionsModels/PermissionSetModel.d.ts +10 -10
  518. package/lib/Pages/shared/models/PermissionsModels/PermissionSetUsersIDRequestModel.d.ts +4 -4
  519. package/lib/Pages/shared/models/ProviderModels/DefaultProviderModel.d.ts +6 -6
  520. package/lib/Pages/shared/models/ProviderModels/EmailProviderTesterModel.d.ts +7 -7
  521. package/lib/Pages/shared/models/ProviderModels/ProviderAttributeModel.d.ts +7 -7
  522. package/lib/Pages/shared/models/ProviderModels/ProviderModel.d.ts +13 -13
  523. package/lib/Pages/shared/models/ProviderModels/SMSProviderTesterModel.d.ts +6 -6
  524. package/lib/Pages/shared/models/PublicHolidayModels/PublicHolidayModel.d.ts +15 -15
  525. package/lib/Pages/shared/models/SectorModels/SectorDepartmentModel.d.ts +4 -4
  526. package/lib/Pages/shared/models/SectorModels/SectorModel.d.ts +6 -6
  527. package/lib/Pages/shared/models/SurveyModels/DeleteSurveyDTO.d.ts +3 -3
  528. package/lib/Pages/shared/models/SurveyModels/add-survey-submissio.d.ts +21 -21
  529. package/lib/Pages/shared/models/SurveyModels/add-survey.d.ts +18 -18
  530. package/lib/Pages/shared/models/SurveyModels/model.d.ts +3 -3
  531. package/lib/Pages/shared/models/SurveyModels/survey-field-options.d.ts +24 -24
  532. package/lib/Pages/shared/models/SurveyModels/survey-filed-value.d.ts +22 -22
  533. package/lib/Pages/shared/models/SurveyModels/survey-form-options.d.ts +8 -8
  534. package/lib/Pages/shared/models/SurveyModels/survey-publish.d.ts +15 -15
  535. package/lib/Pages/shared/models/SurveyModels/survey-question-option.d.ts +9 -9
  536. package/lib/Pages/shared/models/SurveyModels/survey-question.d.ts +21 -21
  537. package/lib/Pages/shared/models/SurveyModels/survey-utils.d.ts +5 -5
  538. package/lib/Pages/shared/models/UserModels/ActivationModel.d.ts +10 -10
  539. package/lib/Pages/shared/models/UserModels/AddUserModel.d.ts +33 -33
  540. package/lib/Pages/shared/models/UserModels/DropdownsResponseModel.d.ts +9 -9
  541. package/lib/Pages/shared/models/UserModels/EditUserModel.d.ts +25 -25
  542. package/lib/Pages/shared/models/UserModels/IdentityModel.d.ts +9 -9
  543. package/lib/Pages/shared/models/UserModels/UserSearchParamDTO.d.ts +8 -8
  544. package/lib/Pages/shared/models/UserModels/UsersIDRequestModel.d.ts +3 -3
  545. package/lib/Pages/shared/models/WorkflowModels/VariableLookupModel.d.ts +9 -9
  546. package/lib/Pages/shared/models/WorkflowModels/WFActivityModel.d.ts +40 -40
  547. package/lib/Pages/shared/models/WorkflowModels/WFActivityOutcomeModel.d.ts +13 -13
  548. package/lib/Pages/shared/models/WorkflowModels/WFActivityVariablesModel.d.ts +13 -13
  549. package/lib/Pages/shared/models/WorkflowModels/WFCreationModel.d.ts +10 -10
  550. package/lib/Pages/shared/models/WorkflowModels/WFVariableModel.d.ts +23 -23
  551. package/lib/Pages/shared/models/user.registration.d.ts +6 -6
  552. package/lib/Pages/shared/modules/public-survey.module.d.ts +15 -15
  553. package/lib/Pages/shared/modules/survey-routing.module.d.ts +7 -7
  554. package/lib/Pages/shared/modules/survey.module.d.ts +35 -35
  555. package/lib/Pages/shared/shared.module.d.ts +8 -8
  556. package/lib/Pages/shared/stylesbundle.service.d.ts +9 -9
  557. package/lib/Pages/start/index/index.component.d.ts +15 -15
  558. package/lib/Pages/start/start-routing.module.d.ts +7 -7
  559. package/lib/Pages/start/start.module.d.ts +11 -11
  560. package/lib/Pages/users/users.component.d.ts +138 -139
  561. package/lib/Pages/users/users.module.d.ts +18 -18
  562. package/lib/Pages/workflows/activity/workflow-activity-add/workflow-activity-add.component.d.ts +77 -77
  563. package/lib/Pages/workflows/activity/workflow-activity-edit/workflow-activity-edit.component.d.ts +82 -82
  564. package/lib/Pages/workflows/instance-info/instance-info.component.d.ts +81 -81
  565. package/lib/Pages/workflows/tabs/tabs.component.d.ts +126 -128
  566. package/lib/Pages/workflows/version-info/version-info.component.d.ts +41 -41
  567. package/lib/Pages/workflows/workflow/workflow.component.d.ts +54 -55
  568. package/lib/Pages/workflows/workflows-routing.module.d.ts +7 -7
  569. package/lib/Pages/workflows/workflows.component.d.ts +8 -8
  570. package/lib/Pages/workflows/workflows.module.d.ts +27 -27
  571. package/lib/_metronic/configs/default-layout.config.d.ts +139 -139
  572. package/lib/_metronic/core/_utils/DomHelpers.d.ts +26 -26
  573. package/lib/_metronic/core/_utils/ElementAnimateUtil.d.ts +13 -13
  574. package/lib/_metronic/core/_utils/EventHandlerUtil.d.ts +20 -20
  575. package/lib/_metronic/core/_utils/_DOMEventHandlerUtil.d.ts +6 -6
  576. package/lib/_metronic/core/_utils/_DataUtil.d.ts +8 -8
  577. package/lib/_metronic/core/_utils/_ElementStyleUtil.d.ts +5 -5
  578. package/lib/_metronic/core/_utils/_TypesHelpers.d.ts +10 -10
  579. package/lib/_metronic/core/_utils/models/OffsetModel.d.ts +4 -4
  580. package/lib/_metronic/core/_utils/models/ViewPortModel.d.ts +4 -4
  581. package/lib/_metronic/core/components/MenuComponent.d.ts +88 -88
  582. package/lib/_metronic/core/components/_CookieComponent.d.ts +25 -25
  583. package/lib/_metronic/core/components/_DrawerComponent.d.ts +49 -49
  584. package/lib/_metronic/core/components/_ScrollComponent.d.ts +31 -31
  585. package/lib/_metronic/core/components/_ScrollTopComponent.d.ts +24 -24
  586. package/lib/_metronic/core/components/_ToggleComponent.d.ts +36 -36
  587. package/lib/_metronic/core/services/layout-init.service.d.ts +18 -18
  588. package/lib/_metronic/core/services/layout.service.d.ts +38 -38
  589. package/lib/_metronic/core/services/page-info.service.d.ts +32 -32
  590. package/lib/masterlayout-routing.module.d.ts +11 -13
  591. package/lib/masterlayout.component.d.ts +63 -63
  592. package/lib/masterlayout.module.d.ts +34 -34
  593. package/package.json +25 -30
  594. package/public-api.d.ts +41 -41
  595. package/src/lib/assets/images/menu/Tools.svg +10 -4
  596. package/src/lib/assets/images/menu/authentication.svg +9 -0
  597. package/src/lib/assets/sass/style-rtl.scss +3 -3
  598. package/src/lib/assets/sass/style.scss +3 -3
  599. package/bnsights-bbsf-admin-portal-1.1.2.tgz +0 -0
  600. package/esm2020/lib/Pages/ActiveDirectories/active-directory/active-directory.component.mjs +0 -421
  601. package/esm2020/lib/Pages/ActiveDirectories/active-directory-add/active-directory-add.component.mjs +0 -528
  602. package/esm2020/lib/Pages/ActiveDirectories/active-directory.module.mjs +0 -108
  603. package/esm2020/lib/Pages/_layout/components/aside/aside-menu/aside-menu.component.mjs +0 -23
  604. package/esm2020/lib/Pages/anonymouslayout/anonymouslayout.module.mjs +0 -100
  605. package/esm2020/lib/Pages/configurations/auth-configuration/auth-configuration-edit/auth-configuration-edit.component.mjs +0 -330
  606. package/esm2020/lib/Pages/configurations/auth-configuration/auth-configuration.component.mjs +0 -157
  607. package/esm2020/lib/Pages/configurations/configuration/configuration.component.mjs +0 -801
  608. package/esm2020/lib/Pages/configurations/configurations.module.mjs +0 -104
  609. package/esm2020/lib/Pages/core/authentication/admin.guard.mjs +0 -17
  610. package/esm2020/lib/Pages/core/authentication/auth.service.mjs +0 -147
  611. package/esm2020/lib/Pages/departments/department/department.component.mjs +0 -220
  612. package/esm2020/lib/Pages/departments/department-info/department-info.component.mjs +0 -185
  613. package/esm2020/lib/Pages/departments/departments.module.mjs +0 -94
  614. package/esm2020/lib/Pages/documents/add/add.component.mjs +0 -136
  615. package/esm2020/lib/Pages/documents/document-master-layouts/document-master-layouts.component.mjs +0 -148
  616. package/esm2020/lib/Pages/documents/document-templates/document-templates.component.mjs +0 -437
  617. package/esm2020/lib/Pages/documents/documents.module.mjs +0 -114
  618. package/esm2020/lib/Pages/documents/documents.routing.mjs +0 -37
  619. package/esm2020/lib/Pages/documents/edit/edit.component.mjs +0 -169
  620. package/esm2020/lib/Pages/helpCenter/help-center/help-center.component.mjs +0 -294
  621. package/esm2020/lib/Pages/helpCenter/help-center-preview/help-center-preview.component.mjs +0 -43
  622. package/esm2020/lib/Pages/helpCenter/help-center-secondlevel/help-center-secondlevel.component.mjs +0 -242
  623. package/esm2020/lib/Pages/helpCenter/help-center-thirdlevel/help-center-thirdlevel.component.mjs +0 -243
  624. package/esm2020/lib/Pages/helpCenter/help-center.module.mjs +0 -98
  625. package/esm2020/lib/Pages/home/home.component.mjs +0 -153
  626. package/esm2020/lib/Pages/home/home.module.mjs +0 -48
  627. package/esm2020/lib/Pages/impersonation-rules/impersonation-rules/impersonation-rules.component.mjs +0 -443
  628. package/esm2020/lib/Pages/impersonation-rules/impersonation-rules.module.mjs +0 -95
  629. package/esm2020/lib/Pages/jobs/jobs/jobs.component.mjs +0 -223
  630. package/esm2020/lib/Pages/jobs/jobs.module.mjs +0 -87
  631. package/esm2020/lib/Pages/license/license.module.mjs +0 -71
  632. package/esm2020/lib/Pages/localizations/localizations.component.mjs +0 -516
  633. package/esm2020/lib/Pages/localizations/localizations.module.mjs +0 -79
  634. package/esm2020/lib/Pages/logs/logs.module.mjs +0 -87
  635. package/esm2020/lib/Pages/lookups/lookup/lookup.component.mjs +0 -367
  636. package/esm2020/lib/Pages/lookups/lookup-group/lookup-group.component.mjs +0 -187
  637. package/esm2020/lib/Pages/lookups/lookup-item/lookup-item.component.mjs +0 -297
  638. package/esm2020/lib/Pages/lookups/lookups.module.mjs +0 -100
  639. package/esm2020/lib/Pages/notifications/add/add.component.mjs +0 -104
  640. package/esm2020/lib/Pages/notifications/edit/edit.component.mjs +0 -133
  641. package/esm2020/lib/Pages/notifications/master-layouts/master-layouts.component.mjs +0 -148
  642. package/esm2020/lib/Pages/notifications/notifications-routing.module.mjs +0 -39
  643. package/esm2020/lib/Pages/notifications/notifications.module.mjs +0 -101
  644. package/esm2020/lib/Pages/notifications/templates/templates.component.mjs +0 -495
  645. package/esm2020/lib/Pages/providers/provider/provider.component.mjs +0 -615
  646. package/esm2020/lib/Pages/providers/providers.module.mjs +0 -91
  647. package/esm2020/lib/Pages/publicHolidays/public-holiday/public-holiday.component.mjs +0 -334
  648. package/esm2020/lib/Pages/publicHolidays/public-holidays.module.mjs +0 -94
  649. package/esm2020/lib/Pages/roles/permission-set-info/permission-set-info.component.mjs +0 -187
  650. package/esm2020/lib/Pages/roles/permissions/permissions.component.mjs +0 -226
  651. package/esm2020/lib/Pages/roles/permissionsets/permissionsets.component.mjs +0 -277
  652. package/esm2020/lib/Pages/roles/roles.module.mjs +0 -105
  653. package/esm2020/lib/Pages/sectors/department-info/department-info.component.mjs +0 -187
  654. package/esm2020/lib/Pages/sectors/sector/sector.component.mjs +0 -193
  655. package/esm2020/lib/Pages/sectors/sector-info/sector-info.component.mjs +0 -180
  656. package/esm2020/lib/Pages/sectors/sectors.module.mjs +0 -96
  657. package/esm2020/lib/Pages/shared/Enums/WFVariableDataType.mjs +0 -14
  658. package/esm2020/lib/Pages/shared/Services/injectionModuleService.service.mjs +0 -163
  659. package/esm2020/lib/Pages/shared/components/survey/add-survey/add-survey.component.mjs +0 -192
  660. package/esm2020/lib/Pages/shared/components/survey-form/survey-form.component.mjs +0 -696
  661. package/esm2020/lib/Pages/shared/components/survey-form-item/survey-form-item.component.mjs +0 -84
  662. package/esm2020/lib/Pages/shared/constants.mjs +0 -130
  663. package/esm2020/lib/Pages/shared/models/SurveyModels/survey-utils.mjs +0 -8
  664. package/esm2020/lib/Pages/shared/modules/public-survey.module.mjs +0 -68
  665. package/esm2020/lib/Pages/shared/modules/survey.module.mjs +0 -126
  666. package/esm2020/lib/Pages/shared/shared.module.mjs +0 -31
  667. package/esm2020/lib/Pages/users/users.component.mjs +0 -806
  668. package/esm2020/lib/Pages/users/users.module.mjs +0 -86
  669. package/esm2020/lib/Pages/workflows/tabs/tabs.component.mjs +0 -793
  670. package/esm2020/lib/Pages/workflows/workflow/workflow.component.mjs +0 -209
  671. package/esm2020/lib/Pages/workflows/workflows.module.mjs +0 -103
  672. package/esm2020/lib/_metronic/core/_utils/EventHandlerUtil.mjs +0 -90
  673. package/esm2020/lib/_metronic/core/_utils/_DOMEventHandlerUtil.mjs +0 -49
  674. package/esm2020/lib/_metronic/core/_utils/_DataUtil.mjs +0 -48
  675. package/esm2020/lib/_metronic/core/components/_DrawerComponent.mjs +0 -290
  676. package/esm2020/lib/_metronic/core/components/_ScrollTopComponent.mjs +0 -113
  677. package/esm2020/lib/_metronic/core/components/_ToggleComponent.mjs +0 -157
  678. package/esm2020/lib/_metronic/core/services/page-info.service.mjs +0 -119
  679. package/esm2020/lib/masterlayout-routing.module.mjs +0 -45
  680. package/esm2020/lib/masterlayout.module.mjs +0 -188
  681. package/fesm2015/bnsights-bbsf-admin-portal.mjs +0 -27293
  682. package/fesm2015/bnsights-bbsf-admin-portal.mjs.map +0 -1
  683. package/fesm2020/bnsights-bbsf-admin-portal.mjs.map +0 -1
  684. package/lib/Pages/shared/Enums/WFVariableDataType.d.ts +0 -12
@@ -1,827 +1,827 @@
1
- import { createPopper } from '@popperjs/core';
2
- import { getAttributeValueByBreakpoint, getElementChild, getElementParents, getHighestZindex, insertAfterElement, throttle } from "../_utils/DomHelpers";
3
- import { EventHandlerUtil } from "../_utils/EventHandlerUtil";
4
- import { DataUtil } from "../_utils/_DataUtil";
5
- import { DOMEventHandlerUtil } from "../_utils/_DOMEventHandlerUtil";
6
- import { ElementStyleUtil } from "../_utils/_ElementStyleUtil";
7
- import { getUniqueIdWithPrefix } from "../_utils/_TypesHelpers";
8
- import { ElementAnimateUtil } from '../_utils/ElementAnimateUtil';
9
- const defaultMenuOptions = {
10
- dropdown: {
11
- hoverTimeout: 200,
12
- zindex: 105,
13
- },
14
- accordion: {
15
- slideSpeed: 250,
16
- expand: false,
17
- },
18
- };
19
- class MenuComponent {
20
- constructor(_element, options) {
21
- this.triggerElement = null;
22
- // Set external trigger element
23
- this._setTriggerElement = () => {
24
- const target = document.querySelector(`[data-kt-menu-target="#${this.element.getAttribute('id')}"`);
25
- if (target) {
26
- this.triggerElement = target;
27
- }
28
- else if (this.element.closest('[data-kt-menu-trigger]')) {
29
- this.triggerElement = this.element.closest('[data-kt-menu-trigger]');
30
- }
31
- else if (this.element.parentNode &&
32
- getElementChild(this.element.parentNode, '[data-kt-menu-trigger]')) {
33
- const child = getElementChild(this.element.parentNode, '[data-kt-menu-trigger]');
34
- if (child) {
35
- this.triggerElement = child;
36
- }
37
- }
38
- if (this.triggerElement) {
39
- DataUtil.set(this.triggerElement, 'menu', this);
40
- }
41
- };
42
- // Test if menu has external trigger element
43
- this._isTriggerElement = (item) => {
44
- return this.triggerElement === item;
45
- };
46
- // Get item option(through html attributes)
47
- this._getItemOption = (item, name) => {
48
- let value = null;
49
- if (item && item.hasAttribute('data-kt-menu-' + name)) {
50
- const attr = item.getAttribute('data-kt-menu-' + name) || '';
51
- value = getAttributeValueByBreakpoint(attr);
52
- if (value !== null && String(value) === 'true') {
53
- value = true;
54
- }
55
- else if (value !== null && String(value) === 'false') {
56
- value = false;
57
- }
58
- }
59
- return value;
60
- };
61
- // Get item element
62
- this._getItemElement = (_element) => {
63
- // Element is the external trigger element
64
- if (this._isTriggerElement(_element)) {
65
- return _element;
66
- }
67
- // Element has item toggler attribute
68
- if (_element.hasAttribute('data-kt-menu-trigger')) {
69
- return _element;
70
- }
71
- // Element has item DOM reference in it's data storage
72
- const itemElement = DataUtil.get(_element, 'item');
73
- if (itemElement) {
74
- return itemElement;
75
- }
76
- // Item is parent of element
77
- const item = _element.closest('.menu-item[data-kt-menu-trigger]');
78
- if (item) {
79
- return item;
80
- }
81
- // Element's parent has item DOM reference in it's data storage
82
- const sub = _element.closest('.menu-sub');
83
- if (sub) {
84
- const subItem = DataUtil.get(sub, 'item');
85
- if (subItem) {
86
- return subItem;
87
- }
88
- }
89
- };
90
- // Get item parent element
91
- this._getItemParentElement = (item) => {
92
- const sub = item.closest('.menu-sub');
93
- if (!sub) {
94
- return null;
95
- }
96
- const subItem = DataUtil.get(sub, 'item');
97
- if (subItem) {
98
- return subItem;
99
- }
100
- const parentItem = sub.closest('.menu-item[data-kt-menu-trigger]');
101
- if (sub && parentItem) {
102
- return parentItem;
103
- }
104
- return null;
105
- };
106
- // Get item parent elements
107
- this._getItemParentElements = (item) => {
108
- const parents = [];
109
- let parent;
110
- let i = 0;
111
- let buffer = item;
112
- do {
113
- parent = this._getItemParentElement(buffer);
114
- if (parent) {
115
- parents.push(parent);
116
- buffer = parent;
117
- }
118
- i++;
119
- } while (parent !== null && i < 20);
120
- if (this.triggerElement) {
121
- parents.unshift(this.triggerElement);
122
- }
123
- return parents;
124
- };
125
- // Prepare popper config for dropdown(see: https://popper.js.org/docs/v2/)
126
- this._getDropdownPopperConfig = (item) => {
127
- // Placement
128
- const placementOption = this._getItemOption(item, 'placement');
129
- let placement = 'right';
130
- if (placementOption) {
131
- placement = placementOption;
132
- }
133
- // Flip
134
- const flipValue = this._getItemOption(item, 'flip');
135
- const flip = flipValue ? flipValue.toString().split(',') : [];
136
- // Offset
137
- const offsetValue = this._getItemOption(item, 'offset');
138
- const offset = offsetValue ? offsetValue.toString().split(',') : [];
139
- // Strategy
140
- const strategy = this._getItemOption(item, 'overflow') === true ? 'absolute' : 'fixed';
141
- var altAxis = this._getItemOption(item, 'flip') !== false;
142
- return {
143
- placement: placement,
144
- strategy: strategy,
145
- modifiers: [{
146
- name: 'offset',
147
- options: {
148
- offset: offset
149
- }
150
- }, {
151
- name: 'preventOverflow',
152
- options: {
153
- altAxis: altAxis
154
- }
155
- }, {
156
- name: 'flip',
157
- options: {
158
- flipVariations: false
159
- }
160
- }]
161
- };
162
- };
163
- // Get item child element
164
- this._getItemChildElement = (item) => {
165
- let selector = item;
166
- const subItem = DataUtil.get(item, 'sub');
167
- if (subItem) {
168
- selector = subItem;
169
- }
170
- if (selector) {
171
- //element = selector.querySelector('.show.menu-item[data-kt-menu-trigger]');
172
- const element = selector.querySelector('.menu-item[data-kt-menu-trigger]');
173
- if (element) {
174
- return element;
175
- }
176
- }
177
- return null;
178
- };
179
- // Get item child elements
180
- this._getItemChildElements = (item) => {
181
- const children = [];
182
- let child;
183
- let i = 0;
184
- let buffer = item;
185
- do {
186
- child = this._getItemChildElement(buffer);
187
- if (child) {
188
- children.push(child);
189
- buffer = child;
190
- }
191
- i++;
192
- } while (child !== null && i < 20);
193
- return children;
194
- };
195
- // Get item sub element
196
- this._getItemSubElement = (item) => {
197
- if (!item) {
198
- return null;
199
- }
200
- if (this._isTriggerElement(item)) {
201
- return this.element;
202
- }
203
- if (item.classList.contains('menu-sub')) {
204
- return item;
205
- }
206
- else if (DataUtil.has(item, 'sub')) {
207
- return DataUtil.get(item, 'sub');
208
- }
209
- else {
210
- return getElementChild(item, '.menu-sub');
211
- }
212
- };
213
- this._getCss = (el, styleProp) => {
214
- const defaultView = (el.ownerDocument || document).defaultView;
215
- if (!defaultView) {
216
- return '';
217
- }
218
- // sanitize property name to css notation
219
- // (hyphen separated words eg. font-Size)
220
- styleProp = styleProp.replace(/([A-Z])/g, '-$1').toLowerCase();
221
- return defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);
222
- };
223
- // Get item sub type
224
- this._getItemSubType = (element) => {
225
- const sub = this._getItemSubElement(element);
226
- if (sub && parseInt(this._getCss(sub, 'z-index')) > 0) {
227
- return 'dropdown';
228
- }
229
- else {
230
- return 'accordion';
231
- }
232
- };
233
- // Test if item's sub is shown
234
- this._isItemSubShown = (item) => {
235
- let sub = this._getItemSubElement(item);
236
- if (sub) {
237
- if (this._getItemSubType(item) === 'dropdown') {
238
- return sub.classList.contains('show') && sub.hasAttribute('data-popper-placement');
239
- }
240
- else {
241
- return item.classList.contains('show');
242
- }
243
- }
244
- return false;
245
- };
246
- // Test if item dropdown is permanent
247
- this._isItemDropdownPermanent = (item) => {
248
- return this._getItemOption(item, 'permanent') === true;
249
- };
250
- // Test if item's parent is shown
251
- this._isItemParentShown = (item) => {
252
- return getElementParents(item, '.menu-item.show').length > 0;
253
- };
254
- // Test of it is item sub element
255
- this._isItemSubElement = (item) => {
256
- return item.classList.contains('menu-sub');
257
- };
258
- // Test if item has sub
259
- this._hasItemSub = (item) => {
260
- return item.classList.contains('menu-item') && item.hasAttribute('data-kt-menu-trigger');
261
- };
262
- // Get link element
263
- this._getItemLinkElement = (item) => {
264
- return getElementChild(item, '.menu-link');
265
- };
266
- // Get toggle element
267
- this._getItemToggleElement = (item) => {
268
- if (this.triggerElement) {
269
- return this.triggerElement;
270
- }
271
- return this._getItemLinkElement(item);
272
- };
273
- // Show item dropdown
274
- this._showDropdown = (item) => {
275
- if (EventHandlerUtil.trigger(this.element, 'kt.menu.dropdown.show') === false) {
276
- return;
277
- }
278
- // Hide all currently shown dropdowns except current one
279
- MenuComponent.hideDropdowns(item);
280
- // const toggle = this._isTriggerElement(item) ? item : this._getItemLinkElement(item);
281
- const sub = this._getItemSubElement(item);
282
- const width = this._getItemOption(item, 'width');
283
- const height = this._getItemOption(item, 'height');
284
- let zindex = this.options.dropdown.zindex;
285
- const parentZindex = getHighestZindex(item); // update
286
- // Apply a new z-index if dropdown's toggle element or it's parent has greater z-index // update
287
- if (parentZindex !== null && parentZindex >= zindex) {
288
- zindex = parentZindex + 1;
289
- }
290
- if (zindex) {
291
- ElementStyleUtil.set(sub, 'z-index', zindex);
292
- }
293
- if (width) {
294
- ElementStyleUtil.set(sub, 'width', width);
295
- }
296
- if (height) {
297
- ElementStyleUtil.set(sub, 'height', height);
298
- }
299
- this.initDropdownPopper(item, sub);
300
- item.classList.add('show');
301
- item.classList.add('menu-dropdown');
302
- sub.classList.add('show');
303
- // Append the sub the the root of the menu
304
- if (this._getItemOption(item, 'overflow') === true) {
305
- document.body.appendChild(sub);
306
- DataUtil.set(item, 'sub', sub);
307
- DataUtil.set(sub, 'item', item);
308
- DataUtil.set(sub, 'menu', this);
309
- }
310
- else {
311
- DataUtil.set(sub, 'item', item);
312
- }
313
- EventHandlerUtil.trigger(this.element, 'kt.menu.dropdown.shown');
314
- };
315
- // Init dropdown popper(new)
316
- this.initDropdownPopper = (item, sub) => {
317
- // Setup popper instance
318
- let reference;
319
- const attach = this._getItemOption(item, 'attach');
320
- if (attach) {
321
- if (attach === 'parent') {
322
- reference = item.parentNode;
323
- }
324
- else {
325
- reference = document.querySelector(attach);
326
- }
327
- }
328
- else {
329
- reference = item;
330
- }
331
- if (reference) {
332
- const popper = createPopper(reference, sub, this._getDropdownPopperConfig(item));
333
- DataUtil.set(item, 'popper', popper);
334
- }
335
- };
336
- // Hide item dropdown
337
- this._hideDropdown = (item) => {
338
- if (EventHandlerUtil.trigger(this.element, 'kt.menu.dropdown.hide') === false) {
339
- return;
340
- }
341
- const sub = this._getItemSubElement(item);
342
- ElementStyleUtil.set(sub, 'z-index', '');
343
- ElementStyleUtil.set(sub, 'width', '');
344
- ElementStyleUtil.set(sub, 'height', '');
345
- item.classList.remove('show');
346
- item.classList.remove('menu-dropdown');
347
- sub.classList.remove('show');
348
- // Append the sub back to it's parent
349
- if (this._getItemOption(item, 'overflow') === true) {
350
- if (item.classList.contains('menu-item')) {
351
- item.appendChild(sub);
352
- }
353
- else {
354
- insertAfterElement(this.element, item);
355
- }
356
- DataUtil.remove(item, 'sub');
357
- DataUtil.remove(sub, 'item');
358
- DataUtil.remove(sub, 'menu');
359
- }
360
- if (DataUtil.has(item, 'popper') === true) {
361
- DataUtil.get(item, 'popper').destroy();
362
- DataUtil.remove(item, 'popper');
363
- }
364
- // Destroy popper(new)
365
- this.destroyDropdownPopper(item);
366
- EventHandlerUtil.trigger(this.element, 'kt.menu.dropdown.hidden');
367
- };
368
- // Destroy dropdown popper(new)
369
- this.destroyDropdownPopper = (item) => {
370
- if (DataUtil.has(item, 'popper') === true) {
371
- DataUtil.get(item, 'popper').destroy();
372
- DataUtil.remove(item, 'popper');
373
- }
374
- EventHandlerUtil.trigger(this.element, 'kt.menu.dropdown.hidden');
375
- };
376
- this._showAccordion = (item) => {
377
- if (EventHandlerUtil.trigger(this.element, 'kt.menu.accordion.show') === false) {
378
- return;
379
- }
380
- if (this.options.accordion.expand === false) {
381
- this._hideAccordions(item);
382
- }
383
- if (DataUtil.has(item, 'popper') === true) {
384
- this._hideDropdown(item);
385
- }
386
- item.classList.add('hover'); // updateWW
387
- item.classList.add('showing');
388
- const subElement = this._getItemSubElement(item);
389
- if (subElement) {
390
- const sub = subElement;
391
- ElementAnimateUtil.slideDown(sub, this.options.accordion.slideSpeed, () => {
392
- item.classList.remove('showing');
393
- item.classList.add('show');
394
- sub.classList.add('show');
395
- EventHandlerUtil.trigger(this.element, 'kt.menu.accordion.shown');
396
- });
397
- }
398
- };
399
- this._hideAccordion = (item) => {
400
- if (EventHandlerUtil.trigger(this.element, 'kt.menu.accordion.hide') === false) {
401
- return;
402
- }
403
- const sub = this._getItemSubElement(item);
404
- item.classList.add('hiding');
405
- if (sub) {
406
- ElementAnimateUtil.slideUp(sub, this.options.accordion.slideSpeed, () => {
407
- item.classList.remove('hiding');
408
- item.classList.remove('show');
409
- sub.classList.remove('show');
410
- item.classList.remove('hover'); // update
411
- EventHandlerUtil.trigger(this.element, 'kt.menu.accordion.hidden');
412
- });
413
- }
414
- };
415
- // Hide all shown accordions of item
416
- this._hideAccordions = (item) => {
417
- const itemsToHide = this.element.querySelectorAll('.show[data-kt-menu-trigger]');
418
- if (itemsToHide && itemsToHide.length > 0) {
419
- for (var i = 0, len = itemsToHide.length; i < len; i++) {
420
- const itemToHide = itemsToHide[i];
421
- if (this._getItemSubType(itemToHide) === 'accordion' &&
422
- itemToHide !== item &&
423
- item.contains(itemToHide) === false &&
424
- itemToHide.contains(item) === false) {
425
- this._hideAccordion(itemToHide);
426
- }
427
- }
428
- }
429
- };
430
- // Event Handlers
431
- // Reset item state classes if item sub type changed
432
- this._reset = (item) => {
433
- if (this._hasItemSub(item) === false) {
434
- return;
435
- }
436
- const sub = this._getItemSubElement(item);
437
- // Reset sub state if sub type is changed during the window resize
438
- if (DataUtil.has(item, 'type') && DataUtil.get(item, 'type') !== this._getItemSubType(item)) {
439
- // updated
440
- item.classList.remove('hover');
441
- item.classList.remove('show');
442
- item.classList.remove('show');
443
- if (sub && sub.removeClass) {
444
- sub.removeClass(sub, 'show');
445
- }
446
- } // updated
447
- };
448
- // TODO: not done
449
- this._destroy = () => { };
450
- // Update all item state classes if item sub type changed
451
- this._update = () => {
452
- const items = this.element.querySelectorAll('.menu-item[data-kt-menu-trigger]');
453
- items.forEach((el) => this._reset(el));
454
- };
455
- // Hide item sub
456
- this._hide = (item) => {
457
- if (!item) {
458
- return;
459
- }
460
- if (this._isItemSubShown(item) === false) {
461
- return;
462
- }
463
- if (this._getItemSubType(item) === 'dropdown') {
464
- this._hideDropdown(item);
465
- }
466
- else if (this._getItemSubType(item) === 'accordion') {
467
- this._hideAccordion(item);
468
- }
469
- };
470
- // Show item sub
471
- this._show = (item) => {
472
- if (!item) {
473
- return;
474
- }
475
- if (this._isItemSubShown(item) === true) {
476
- return;
477
- }
478
- if (this._getItemSubType(item) === 'dropdown') {
479
- this._showDropdown(item); // // show current dropdown
480
- }
481
- else if (this._getItemSubType(item) === 'accordion') {
482
- this._showAccordion(item);
483
- }
484
- // Remember last submenu type
485
- DataUtil.set(item, 'type', this._getItemSubType(item)); // updated
486
- };
487
- // Toggle item sub
488
- this._toggle = (item) => {
489
- if (!item) {
490
- return;
491
- }
492
- if (this._isItemSubShown(item) === true) {
493
- this._hide(item);
494
- }
495
- else {
496
- this._show(item);
497
- }
498
- };
499
- // Mouseout handle
500
- this._mouseout = (element, e) => {
501
- const item = this._getItemElement(element);
502
- if (!item) {
503
- return;
504
- }
505
- if (this._getItemOption(item, 'trigger') !== 'hover') {
506
- return;
507
- }
508
- const timeout = setTimeout(() => {
509
- if (DataUtil.get(item, 'hover') === '1') {
510
- this._hide(item);
511
- }
512
- }, this.options.dropdown.hoverTimeout);
513
- DataUtil.set(item, 'hover', '1');
514
- DataUtil.set(item, 'timeout', timeout);
515
- };
516
- // Mouseover handle
517
- this._mouseover = (element, e) => {
518
- const item = this._getItemElement(element);
519
- if (!item) {
520
- return;
521
- }
522
- if (this._getItemOption(item, 'trigger') !== 'hover') {
523
- return;
524
- }
525
- if (DataUtil.get(item, 'hover') === '1') {
526
- clearTimeout(DataUtil.get(item, 'timeout'));
527
- DataUtil.remove(item, 'hover');
528
- DataUtil.remove(item, 'timeout');
529
- }
530
- this._show(item);
531
- };
532
- // Dismiss handler
533
- this._dismiss = (element, e) => {
534
- const item = this._getItemElement(element);
535
- const items = this._getItemChildElements(item);
536
- //if ( item !== null && _getItemOption(item, 'trigger') === 'click' && _getItemSubType(item) === 'dropdown' ) {
537
- const itemSubType = this._getItemSubType(item);
538
- if (item !== null && itemSubType === 'dropdown') {
539
- this._hide(item); // hide items dropdown
540
- // Hide all child elements as well
541
- if (items.length > 0) {
542
- for (let i = 0, len = items.length; i < len; i++) {
543
- //if ( _getItemOption(item, 'trigger') === 'click' && _getItemSubType(item) === 'dropdown' ) {
544
- if (items[i] !== null && this._getItemSubType(items[i]) === 'dropdown') {
545
- this._hide(items[i]);
546
- }
547
- }
548
- }
549
- }
550
- };
551
- // Link handler
552
- this._link = (element, e) => {
553
- if (EventHandlerUtil.trigger(this.element, 'kt.menu.link.click') === false) {
554
- return;
555
- }
556
- // Dismiss all shown dropdowns
557
- MenuComponent.hideDropdowns(undefined);
558
- EventHandlerUtil.trigger(this.element, 'kt.menu.link.clicked');
559
- };
560
- this._click = (element, e) => {
561
- e.preventDefault();
562
- const item = this._getItemElement(element);
563
- if (this._getItemOption(item, 'trigger') !== 'click') {
564
- return;
565
- }
566
- if (this._getItemOption(item, 'toggle') === false) {
567
- this._show(item);
568
- }
569
- else {
570
- this._toggle(item);
571
- }
572
- };
573
- ///////////////////////
574
- // ** Public API ** //
575
- ///////////////////////
576
- this.click = (element, e) => {
577
- return this._click(element, e);
578
- };
579
- this.link = (element, e) => {
580
- return this._link(element, e);
581
- };
582
- this.dismiss = (element, e) => {
583
- return this._dismiss(element, e);
584
- };
585
- this.mouseover = (element, e) => {
586
- return this._mouseover(element, e);
587
- };
588
- this.mouseout = (element, e) => {
589
- return this._mouseout(element, e);
590
- };
591
- // General Methods
592
- this.getItemTriggerType = (item) => {
593
- return this._getItemOption(item, 'trigger');
594
- };
595
- this.getItemSubType = (element) => {
596
- return this._getItemSubType(element);
597
- };
598
- this.show = (item) => {
599
- return this._show(item);
600
- };
601
- this.hide = (item) => {
602
- return this._hide(item);
603
- };
604
- this.reset = (item) => {
605
- return this._reset(item);
606
- };
607
- this.update = () => {
608
- return this._update();
609
- };
610
- this.getElement = () => {
611
- return this.element;
612
- };
613
- this.getItemLinkElement = (item) => {
614
- return this._getItemLinkElement(item);
615
- };
616
- this.getItemToggleElement = (item) => {
617
- return this._getItemToggleElement(item);
618
- };
619
- this.getItemSubElement = (item) => {
620
- return this._getItemSubElement(item);
621
- };
622
- this.getItemParentElements = (item) => {
623
- return this._getItemParentElements(item);
624
- };
625
- this.isItemSubShown = (item) => {
626
- return this._isItemSubShown(item);
627
- };
628
- this.isItemParentShown = (item) => {
629
- return this._isItemParentShown(item);
630
- };
631
- this.getTriggerElement = () => {
632
- return this.triggerElement;
633
- };
634
- this.isItemDropdownPermanent = (item) => {
635
- return this._isItemDropdownPermanent(item);
636
- };
637
- // Accordion Mode Methods
638
- this.hideAccordions = (item) => {
639
- return this._hideAccordions(item);
640
- };
641
- // Event API
642
- this.on = (name, handler) => {
643
- return EventHandlerUtil.on(this.element, name, handler);
644
- };
645
- this.one = (name, handler) => {
646
- return EventHandlerUtil.one(this.element, name, handler);
647
- };
648
- this.off = (name) => {
649
- return EventHandlerUtil.off(this.element, name);
650
- };
651
- this.element = _element;
652
- this.options = Object.assign(defaultMenuOptions, options);
653
- this.instanceUid = getUniqueIdWithPrefix('menu');
654
- // this.element.setAttribute('data-kt-menu', 'true')
655
- this._setTriggerElement();
656
- this._update();
657
- DataUtil.set(this.element, 'menu', this);
658
- return this;
659
- }
660
- }
661
- // public static methods
662
- // Get KTMenu instance by element
663
- MenuComponent.getInstance = (element) => {
664
- // Element has menu DOM reference in it's DATA storage
665
- const elementMenu = DataUtil.get(element, 'menu');
666
- if (elementMenu) {
667
- return elementMenu;
668
- }
669
- // Element has .menu parent
670
- const menu = element.closest('.menu');
671
- if (menu) {
672
- const menuData = DataUtil.get(menu, 'menu');
673
- if (menuData) {
674
- return menuData;
675
- }
676
- }
677
- // Element has a parent with DOM reference to .menu in it's DATA storage
678
- if (element.classList.contains('menu-link')) {
679
- const sub = element.closest('.menu-sub');
680
- if (sub) {
681
- const subMenu = DataUtil.get(sub, 'menu');
682
- if (subMenu) {
683
- return subMenu;
684
- }
685
- }
686
- }
687
- return null;
688
- };
689
- // Hide all dropdowns and skip one if provided
690
- MenuComponent.hideDropdowns = (skip) => {
691
- const items = document.querySelectorAll('.show.menu-dropdown[data-kt-menu-trigger]');
692
- if (items && items.length > 0) {
693
- for (let i = 0, len = items.length; i < len; i++) {
694
- const item = items[i];
695
- const menu = MenuComponent.getInstance(item);
696
- if (menu && menu.getItemSubType(item) === 'dropdown') {
697
- if (skip) {
698
- if (menu.getItemSubElement(item).contains(skip) === false &&
699
- item.contains(skip) === false &&
700
- item !== skip) {
701
- menu.hide(item);
702
- }
703
- }
704
- else {
705
- menu.hide(item);
706
- }
707
- }
708
- }
709
- }
710
- };
711
- MenuComponent.updateDropdowns = () => {
712
- const items = document.querySelectorAll('.show.menu-dropdown[data-kt-menu-trigger]');
713
- if (items && items.length > 0) {
714
- for (var i = 0, len = items.length; i < len; i++) {
715
- var item = items[i];
716
- if (DataUtil.has(item, 'popper')) {
717
- DataUtil.get(item, 'popper').forceUpdate();
718
- }
719
- }
720
- }
721
- };
722
- // Global handlers
723
- MenuComponent.createInstances = (selector) => {
724
- // Initialize menus
725
- document.querySelectorAll(selector).forEach((el) => {
726
- const menuItem = el;
727
- let menuInstance = MenuComponent.getInstance(menuItem);
728
- if (!menuInstance) {
729
- menuInstance = new MenuComponent(el, defaultMenuOptions);
730
- }
731
- });
732
- };
733
- MenuComponent.initGlobalHandlers = () => {
734
- // Dropdown handler
735
- document.addEventListener('click', (e) => {
736
- const menuItems = document.querySelectorAll('.show.menu-dropdown[data-kt-menu-trigger]');
737
- if (menuItems && menuItems.length > 0) {
738
- for (let i = 0; i < menuItems.length; i++) {
739
- const item = menuItems[i];
740
- const menuObj = MenuComponent.getInstance(item);
741
- if (menuObj && menuObj.getItemSubType(item) === 'dropdown') {
742
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
743
- const menu = menuObj.getElement();
744
- const sub = menuObj.getItemSubElement(item);
745
- if (item === e.target || item.contains(e.target)) {
746
- continue;
747
- }
748
- if (sub && (sub === e.target || sub.contains(e.target))) {
749
- continue;
750
- }
751
- menuObj.hide(item);
752
- }
753
- }
754
- }
755
- });
756
- // Sub toggle handler
757
- DOMEventHandlerUtil.on(document.body, '.menu-item[data-kt-menu-trigger] > .menu-link, [data-kt-menu-trigger]:not(.menu-item):not([data-kt-menu-trigger="auto"])', 'click', function (e) {
758
- const menu = MenuComponent.getInstance(this);
759
- if (menu) {
760
- return menu.click(this, e);
761
- }
762
- });
763
- // // Link handler
764
- DOMEventHandlerUtil.on(document.body, '.menu-item:not([data-kt-menu-trigger]) > .menu-link', 'click', function (e) {
765
- e.stopPropagation();
766
- const menu = MenuComponent.getInstance(this);
767
- if (menu && menu.link) {
768
- return menu.link(this, e);
769
- }
770
- });
771
- // Dismiss handler
772
- DOMEventHandlerUtil.on(document.body, '[data-kt-menu-dismiss="true"]', 'click', function (e) {
773
- const menu = MenuComponent.getInstance(this);
774
- if (menu) {
775
- return menu.dismiss(this, e);
776
- }
777
- });
778
- // Mouseover handler
779
- DOMEventHandlerUtil.on(document.body, '[data-kt-menu-trigger], .menu-sub', 'mouseover', function (e) {
780
- const menu = MenuComponent.getInstance(this);
781
- if (menu && menu.getItemSubType(this) === 'dropdown') {
782
- return menu.mouseover(this, e);
783
- }
784
- });
785
- // Mouseout handler
786
- DOMEventHandlerUtil.on(document.body, '[data-kt-menu-trigger], .menu-sub', 'mouseout', function (e) {
787
- const menu = MenuComponent.getInstance(this);
788
- if (menu && menu.getItemSubType(this) === 'dropdown') {
789
- return menu.mouseout(this, e);
790
- }
791
- });
792
- // Resize handler
793
- window.addEventListener('resize', () => {
794
- let timer;
795
- throttle(timer, () => {
796
- // Locate and update Drawer instances on window resize
797
- const elements = document.querySelectorAll('[data-kt-menu="true"]');
798
- elements.forEach((el) => {
799
- const menu = MenuComponent.getInstance(el);
800
- if (menu) {
801
- menu.update();
802
- }
803
- });
804
- }, 200);
805
- });
806
- };
807
- MenuComponent.bootstrap = () => {
808
- MenuComponent.initGlobalHandlers();
809
- MenuComponent.createInstances('[data-kt-menu="true"]');
810
- };
811
- MenuComponent.reinitialization = () => {
812
- MenuComponent.createInstances('[data-kt-menu="true"]');
813
- };
814
- MenuComponent.createInsance = (selector, options = defaultMenuOptions) => {
815
- const element = document.body.querySelector(selector);
816
- if (!element) {
817
- return;
818
- }
819
- const item = element;
820
- let menu = MenuComponent.getInstance(item);
821
- if (!menu) {
822
- menu = new MenuComponent(item, options);
823
- }
824
- return menu;
825
- };
826
- export { MenuComponent, defaultMenuOptions };
827
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVudUNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtYWRtaW4tcG9ydGFsL3NyYy9saWIvX21ldHJvbmljL2NvcmUvY29tcG9uZW50cy9NZW51Q29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQWtCLE1BQU0sZ0JBQWdCLENBQUE7QUFFN0QsT0FBTyxFQUFFLDZCQUE2QixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUN4SixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUE7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDOUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFhakUsTUFBTSxrQkFBa0IsR0FBZ0I7SUFDdEMsUUFBUSxFQUFFO1FBQ1IsWUFBWSxFQUFFLEdBQUc7UUFDakIsTUFBTSxFQUFFLEdBQUc7S0FDWjtJQUNELFNBQVMsRUFBRTtRQUNULFVBQVUsRUFBRSxHQUFHO1FBQ2YsTUFBTSxFQUFFLEtBQUs7S0FDZDtDQUNGLENBQUE7QUFvQkQsTUFBTSxhQUFhO0lBTWpCLFlBQVksUUFBcUIsRUFBRSxPQUFvQjtRQUZ2RCxtQkFBYyxHQUF1QixJQUFJLENBQUE7UUFhekMsK0JBQStCO1FBQ3ZCLHVCQUFrQixHQUFHLEdBQUcsRUFBRTtZQUNoQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUNuQywwQkFBMEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDN0QsQ0FBQTtZQUVELElBQUksTUFBTSxFQUFFO2dCQUNWLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBcUIsQ0FBQTthQUM1QztpQkFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLEVBQUU7Z0JBQ3pELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQWdCLENBQUE7YUFDcEY7aUJBQU0sSUFDTCxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVU7Z0JBQ3ZCLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQXlCLEVBQUUsd0JBQXdCLENBQUMsRUFDakY7Z0JBQ0EsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQXlCLEVBQ3RDLHdCQUF3QixDQUN6QixDQUFBO2dCQUNELElBQUksS0FBSyxFQUFFO29CQUNULElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFBO2lCQUM1QjthQUNGO1lBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUN2QixRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO2FBQ2hEO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsNENBQTRDO1FBQ3BDLHNCQUFpQixHQUFHLENBQUMsSUFBaUIsRUFBRSxFQUFFO1lBQ2hELE9BQU8sSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLENBQUE7UUFDckMsQ0FBQyxDQUFBO1FBRUQsMkNBQTJDO1FBQ25DLG1CQUFjLEdBQUcsQ0FBQyxJQUFpQixFQUFFLElBQVksRUFBRSxFQUFFO1lBQzNELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQTtZQUNoQixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsRUFBRTtnQkFDckQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO2dCQUM1RCxLQUFLLEdBQUcsNkJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQzNDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssTUFBTSxFQUFFO29CQUM5QyxLQUFLLEdBQUcsSUFBSSxDQUFBO2lCQUNiO3FCQUFNLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssT0FBTyxFQUFFO29CQUN0RCxLQUFLLEdBQUcsS0FBSyxDQUFBO2lCQUNkO2FBQ0Y7WUFDRCxPQUFPLEtBQUssQ0FBQTtRQUNkLENBQUMsQ0FBQTtRQUVELG1CQUFtQjtRQUNYLG9CQUFlLEdBQUcsQ0FBQyxRQUFxQixFQUFFLEVBQUU7WUFDbEQsMENBQTBDO1lBQzFDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUNwQyxPQUFPLFFBQVEsQ0FBQTthQUNoQjtZQUVELHFDQUFxQztZQUNyQyxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsRUFBRTtnQkFDakQsT0FBTyxRQUFRLENBQUE7YUFDaEI7WUFFRCxzREFBc0Q7WUFDdEQsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDbEQsSUFBSSxXQUFXLEVBQUU7Z0JBQ2YsT0FBTyxXQUFXLENBQUE7YUFDbkI7WUFFRCw0QkFBNEI7WUFDNUIsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFBO1lBQ2pFLElBQUksSUFBSSxFQUFFO2dCQUNSLE9BQU8sSUFBSSxDQUFBO2FBQ1o7WUFFRCwrREFBK0Q7WUFDL0QsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUN6QyxJQUFJLEdBQUcsRUFBRTtnQkFDUCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUE7Z0JBQ3hELElBQUksT0FBTyxFQUFFO29CQUNYLE9BQU8sT0FBTyxDQUFBO2lCQUNmO2FBQ0Y7UUFDSCxDQUFDLENBQUE7UUFFRCwwQkFBMEI7UUFDbEIsMEJBQXFCLEdBQUcsQ0FBQyxJQUFpQixFQUFFLEVBQUU7WUFDcEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUNyQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNSLE9BQU8sSUFBSSxDQUFBO2FBQ1o7WUFFRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDeEQsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsT0FBTyxPQUFPLENBQUE7YUFDZjtZQUVELE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtZQUNsRSxJQUFJLEdBQUcsSUFBSSxVQUFVLEVBQUU7Z0JBQ3JCLE9BQU8sVUFBVSxDQUFBO2FBQ2xCO1lBRUQsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDLENBQUE7UUFFRCwyQkFBMkI7UUFDbkIsMkJBQXNCLEdBQUcsQ0FBQyxJQUFpQixFQUFFLEVBQUU7WUFDckQsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFBO1lBQ2xCLElBQUksTUFBTSxDQUFBO1lBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ1QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFBO1lBRWpCLEdBQUc7Z0JBQ0QsTUFBTSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDM0MsSUFBSSxNQUFNLEVBQUU7b0JBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtvQkFDcEIsTUFBTSxHQUFHLE1BQU0sQ0FBQTtpQkFDaEI7Z0JBRUQsQ0FBQyxFQUFFLENBQUE7YUFDSixRQUFRLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBQztZQUVuQyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO2FBQ3JDO1lBRUQsT0FBTyxPQUFPLENBQUE7UUFDaEIsQ0FBQyxDQUFBO1FBRUQsMEVBQTBFO1FBQ2xFLDZCQUF3QixHQUFHLENBQUMsSUFBaUIsRUFBRSxFQUFFO1lBQ3ZELFlBQVk7WUFDWixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUM5RCxJQUFJLFNBQVMsR0FBb0IsT0FBTyxDQUFBO1lBQ3hDLElBQUksZUFBZSxFQUFFO2dCQUNuQixTQUFTLEdBQUcsZUFBa0MsQ0FBQTthQUMvQztZQUVELE9BQU87WUFDUCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtZQUNuRCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUU3RCxTQUFTO1lBQ1QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUE7WUFDdkQsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7WUFFbkUsV0FBVztZQUNYLE1BQU0sUUFBUSxHQUNaLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUE7WUFFdkUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssS0FBSyxDQUFDO1lBRTFELE9BQU87Z0JBQ0wsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixTQUFTLEVBQUUsQ0FBQzt3QkFDVixJQUFJLEVBQUUsUUFBUTt3QkFDZCxPQUFPLEVBQUU7NEJBQ1AsTUFBTSxFQUFFLE1BQU07eUJBQ2Y7cUJBQ0YsRUFBRTt3QkFDRCxJQUFJLEVBQUUsaUJBQWlCO3dCQUN2QixPQUFPLEVBQUU7NEJBQ1AsT0FBTyxFQUFFLE9BQU87eUJBQ2pCO3FCQUNGLEVBQUU7d0JBQ0QsSUFBSSxFQUFFLE1BQU07d0JBQ1osT0FBTyxFQUFFOzRCQUNQLGNBQWMsRUFBRSxLQUFLO3lCQUN0QjtxQkFDRixDQUFDO2FBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQTtRQUVELHlCQUF5QjtRQUNqQix5QkFBb0IsR0FBRyxDQUFDLElBQWlCLEVBQUUsRUFBRTtZQUNuRCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUE7WUFFbkIsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDekMsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsUUFBUSxHQUFHLE9BQU8sQ0FBQTthQUNuQjtZQUVELElBQUksUUFBUSxFQUFFO2dCQUNaLDRFQUE0RTtnQkFDNUUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFBO2dCQUMxRSxJQUFJLE9BQU8sRUFBRTtvQkFDWCxPQUFPLE9BQU8sQ0FBQTtpQkFDZjthQUNGO1lBQ0QsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDLENBQUE7UUFFRCwwQkFBMEI7UUFDbEIsMEJBQXFCLEdBQUcsQ0FBQyxJQUFpQixFQUFFLEVBQUU7WUFDcEQsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFBO1lBQ25CLElBQUksS0FBSyxDQUFBO1lBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ1QsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFBO1lBQ2pCLEdBQUc7Z0JBQ0QsS0FBSyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDekMsSUFBSSxLQUFLLEVBQUU7b0JBQ1QsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtvQkFDcEIsTUFBTSxHQUFHLEtBQW9CLENBQUE7aUJBQzlCO2dCQUVELENBQUMsRUFBRSxDQUFBO2FBQ0osUUFBUSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUM7WUFFbEMsT0FBTyxRQUFRLENBQUE7UUFDakIsQ0FBQyxDQUFBO1FBRUQsdUJBQXVCO1FBQ2YsdUJBQWtCLEdBQUcsQ0FBQyxJQUFpQixFQUFFLEVBQUU7WUFDakQsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDVCxPQUFPLElBQUksQ0FBQTthQUNaO1lBRUQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQTthQUNwQjtZQUVELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQ3ZDLE9BQU8sSUFBSSxDQUFBO2FBQ1o7aUJBQU0sSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDcEMsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQTthQUNqQztpQkFBTTtnQkFDTCxPQUFPLGVBQWUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUE7YUFDMUM7UUFDSCxDQUFDLENBQUE7UUFFTyxZQUFPLEdBQUcsQ0FBQyxFQUFlLEVBQUUsU0FBaUIsRUFBRSxFQUFFO1lBQ3ZELE1BQU0sV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDLGFBQWEsSUFBSSxRQUFRLENBQUMsQ0FBQyxXQUFXLENBQUE7WUFDOUQsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDaEIsT0FBTyxFQUFFLENBQUE7YUFDVjtZQUVELHlDQUF5QztZQUN6Qyx5Q0FBeUM7WUFDekMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO1lBRTlELE9BQU8sV0FBVyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUMzRSxDQUFDLENBQUE7UUFFRCxvQkFBb0I7UUFDWixvQkFBZSxHQUFHLENBQUMsT0FBb0IsRUFBRSxFQUFFO1lBQ2pELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUM1QyxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3JELE9BQU8sVUFBVSxDQUFBO2FBQ2xCO2lCQUFNO2dCQUNMLE9BQU8sV0FBVyxDQUFBO2FBQ25CO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsOEJBQThCO1FBQ3RCLG9CQUFlLEdBQUcsQ0FBQyxJQUFpQixFQUFFLEVBQUU7WUFDOUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3ZDLElBQUksR0FBRyxFQUFFO2dCQUNQLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUU7b0JBQzdDLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO2lCQUNuRjtxQkFBTTtvQkFDTCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO2lCQUN2QzthQUNGO1lBRUQsT0FBTyxLQUFLLENBQUE7UUFDZCxDQUFDLENBQUE7UUFFRCxxQ0FBcUM7UUFDN0IsNkJBQXdCLEdBQUcsQ0FBQyxJQUFpQixFQUFFLEVBQUU7WUFDdkQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsS0FBSyxJQUFJLENBQUE7UUFDeEQsQ0FBQyxDQUFBO1FBRUQsaUNBQWlDO1FBQ3pCLHVCQUFrQixHQUFHLENBQUMsSUFBaUIsRUFBRSxFQUFFO1lBQ2pELE9BQU8saUJBQWlCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtRQUM5RCxDQUFDLENBQUE7UUFFRCxpQ0FBaUM7UUFDekIsc0JBQWlCLEdBQUcsQ0FBQyxJQUFpQixFQUFFLEVBQUU7WUFDaEQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUM1QyxDQUFDLENBQUE7UUFFRCx1QkFBdUI7UUFDZixnQkFBVyxHQUFHLENBQUMsSUFBaUIsRUFBRSxFQUFFO1lBQzFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO1FBQzFGLENBQUMsQ0FBQTtRQUVELG1CQUFtQjtRQUNYLHdCQUFtQixHQUFHLENBQUMsSUFBaUIsRUFBRSxFQUFFO1lBQ2xELE9BQU8sZUFBZSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQTtRQUM1QyxDQUFDLENBQUE7UUFFRCxxQkFBcUI7UUFDYiwwQkFBcUIsR0FBRyxDQUFDLElBQWlCLEVBQUUsRUFBRTtZQUNwRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQTthQUMzQjtZQUVELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3ZDLENBQUMsQ0FBQTtRQUVELHFCQUFxQjtRQUNiLGtCQUFhLEdBQUcsQ0FBQyxJQUFpQixFQUFFLEVBQUU7WUFDNUMsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSx1QkFBdUIsQ0FBQyxLQUFLLEtBQUssRUFBRTtnQkFDN0UsT0FBTTthQUNQO1lBRUQsd0RBQXdEO1lBQ3hELGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7WUFFakMsdUZBQXVGO1lBQ3ZGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUN6QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUVsRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUE7WUFDekMsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQyxTQUFTO1lBQ3JELGdHQUFnRztZQUNoRyxJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksWUFBWSxJQUFJLE1BQU0sRUFBRTtnQkFDbkQsTUFBTSxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUE7YUFDMUI7WUFFRCxJQUFJLE1BQU0sRUFBRTtnQkFDVixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQTthQUM3QztZQUVELElBQUksS0FBSyxFQUFFO2dCQUNULGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFBO2FBQzFDO1lBRUQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUE7YUFDNUM7WUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFBO1lBRWxDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFBO1lBQ25DLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBRXpCLDBDQUEwQztZQUMxQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDbEQsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQzlCLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQTtnQkFDOUIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO2dCQUMvQixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7YUFDaEM7aUJBQU07Z0JBQ0wsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO2FBQ2hDO1lBRUQsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsd0JBQXdCLENBQUMsQ0FBQTtRQUNsRSxDQUFDLENBQUE7UUFFRCw0QkFBNEI7UUFDcEIsdUJBQWtCLEdBQUcsQ0FBQyxJQUFpQixFQUFFLEdBQWdCLEVBQUUsRUFBRTtZQUNuRSx3QkFBd0I7WUFDeEIsSUFBSSxTQUFTLENBQUE7WUFDYixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxRQUFRLENBQVcsQ0FBQTtZQUU1RCxJQUFJLE1BQU0sRUFBRTtnQkFDVixJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUU7b0JBQ3ZCLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFBO2lCQUM1QjtxQkFBTTtvQkFDTCxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtpQkFDM0M7YUFDRjtpQkFBTTtnQkFDTCxTQUFTLEdBQUcsSUFBSSxDQUFBO2FBQ2pCO1lBRUQsSUFBSSxTQUFTLEVBQUU7Z0JBQ2IsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUN6QixTQUFxQyxFQUNyQyxHQUFHLEVBQ0gsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUNwQyxDQUFBO2dCQUNELFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQTthQUNyQztRQUNILENBQUMsQ0FBQTtRQUVELHFCQUFxQjtRQUNiLGtCQUFhLEdBQUcsQ0FBQyxJQUFpQixFQUFFLEVBQUU7WUFDNUMsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSx1QkFBdUIsQ0FBQyxLQUFLLEtBQUssRUFBRTtnQkFDN0UsT0FBTTthQUNQO1lBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3pDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1lBQ3hDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1lBQ3RDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1lBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1lBQ3RDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBRTVCLHFDQUFxQztZQUNyQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDbEQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtvQkFDeEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtpQkFDdEI7cUJBQU07b0JBQ0wsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtpQkFDdkM7Z0JBRUQsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUE7Z0JBQzVCLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFBO2dCQUM1QixRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQTthQUM3QjtZQUVELElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUN6QyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtnQkFDdEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUE7YUFDaEM7WUFFRCxzQkFBc0I7WUFDdEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ2hDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLHlCQUF5QixDQUFDLENBQUE7UUFDbkUsQ0FBQyxDQUFBO1FBRUQsK0JBQStCO1FBQ3ZCLDBCQUFxQixHQUFHLENBQUMsSUFBaUIsRUFBRSxFQUFFO1lBQ3BELElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUN6QyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtnQkFDdEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUE7YUFDaEM7WUFFRCxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSx5QkFBeUIsQ0FBQyxDQUFBO1FBQ25FLENBQUMsQ0FBQTtRQUVPLG1CQUFjLEdBQUcsQ0FBQyxJQUFpQixFQUFFLEVBQUU7WUFDN0MsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSx3QkFBd0IsQ0FBQyxLQUFLLEtBQUssRUFBRTtnQkFDOUUsT0FBTTthQUNQO1lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUFFO2dCQUMzQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFBO2FBQzNCO1lBRUQsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7YUFDekI7WUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQSxDQUFDLFdBQVc7WUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7WUFFN0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ2hELElBQUksVUFBVSxFQUFFO2dCQUNkLE1BQU0sR0FBRyxHQUFHLFVBQXlCLENBQUE7Z0JBQ3JDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRTtvQkFDeEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7b0JBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO29CQUMxQixHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtvQkFDekIsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUseUJBQXlCLENBQUMsQ0FBQTtnQkFDbkUsQ0FBQyxDQUFDLENBQUE7YUFDSDtRQUNILENBQUMsQ0FBQTtRQUVPLG1CQUFjLEdBQUcsQ0FBQyxJQUFpQixFQUFFLEVBQUU7WUFDN0MsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSx3QkFBd0IsQ0FBQyxLQUFLLEtBQUssRUFBRTtnQkFDOUUsT0FBTTthQUNQO1lBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBRTVCLElBQUksR0FBRyxFQUFFO2dCQUNQLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRTtvQkFDdEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7b0JBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO29CQUM3QixHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtvQkFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUEsQ0FBQyxTQUFTO29CQUN4QyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSwwQkFBMEIsQ0FBQyxDQUFBO2dCQUNwRSxDQUFDLENBQUMsQ0FBQTthQUNIO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsb0NBQW9DO1FBQzVCLG9CQUFlLEdBQUcsQ0FBQyxJQUFpQixFQUFFLEVBQUU7WUFDOUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO1lBQ2hGLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN0RCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFnQixDQUFBO29CQUVoRCxJQUNFLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEtBQUssV0FBVzt3QkFDaEQsVUFBVSxLQUFLLElBQUk7d0JBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssS0FBSzt3QkFDbkMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQ25DO3dCQUNBLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUE7cUJBQ2hDO2lCQUNGO2FBQ0Y7UUFDSCxDQUFDLENBQUE7UUFFRCxpQkFBaUI7UUFDakIsb0RBQW9EO1FBQzVDLFdBQU0sR0FBRyxDQUFDLElBQWlCLEVBQUUsRUFBRTtZQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFO2dCQUNwQyxPQUFNO2FBQ1A7WUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUE7WUFFekMsa0VBQWtFO1lBQ2xFLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDM0YsVUFBVTtnQkFDVixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUM3QixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFO29CQUMxQixHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQTtpQkFDN0I7YUFDRixDQUFDLFVBQVU7UUFDZCxDQUFDLENBQUE7UUFFRCxpQkFBaUI7UUFDVCxhQUFRLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFBO1FBRTNCLHlEQUF5RDtRQUNqRCxZQUFPLEdBQUcsR0FBRyxFQUFFO1lBQ3JCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtZQUMvRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQWlCLENBQUMsQ0FBQyxDQUFBO1FBQ3ZELENBQUMsQ0FBQTtRQUVELGdCQUFnQjtRQUNSLFVBQUssR0FBRyxDQUFDLElBQWlCLEVBQUUsRUFBRTtZQUNwQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNULE9BQU07YUFDUDtZQUVELElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUU7Z0JBQ3hDLE9BQU07YUFDUDtZQUVELElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUU7Z0JBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7YUFDekI7aUJBQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLFdBQVcsRUFBRTtnQkFDckQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQTthQUMxQjtRQUNILENBQUMsQ0FBQTtRQUVELGdCQUFnQjtRQUNSLFVBQUssR0FBRyxDQUFDLElBQWlCLEVBQUUsRUFBRTtZQUNwQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNULE9BQU07YUFDUDtZQUVELElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3ZDLE9BQU07YUFDUDtZQUVELElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUU7Z0JBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUEsQ0FBQywyQkFBMkI7YUFDckQ7aUJBQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLFdBQVcsRUFBRTtnQkFDckQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQTthQUMxQjtZQUVELDZCQUE2QjtZQUU3QixRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBLENBQUMsVUFBVTtRQUNuRSxDQUFDLENBQUE7UUFFRCxrQkFBa0I7UUFDVixZQUFPLEdBQUcsQ0FBQyxJQUFpQixFQUFFLEVBQUU7WUFDdEMsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDVCxPQUFNO2FBQ1A7WUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO2FBQ2pCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7YUFDakI7UUFDSCxDQUFDLENBQUE7UUFFRCxrQkFBa0I7UUFDVixjQUFTLEdBQUcsQ0FBQyxPQUFvQixFQUFFLENBQWEsRUFBRSxFQUFFO1lBQzFELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDMUMsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDVCxPQUFNO2FBQ1A7WUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxLQUFLLE9BQU8sRUFBRTtnQkFDcEQsT0FBTTthQUNQO1lBRUQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDOUIsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxHQUFHLEVBQUU7b0JBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7aUJBQ2pCO1lBQ0gsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFBO1lBRXRDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUNoQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDeEMsQ0FBQyxDQUFBO1FBRUQsbUJBQW1CO1FBQ1gsZUFBVSxHQUFHLENBQUMsT0FBb0IsRUFBRSxDQUFhLEVBQUUsRUFBRTtZQUMzRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQzFDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1QsT0FBTTthQUNQO1lBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsS0FBSyxPQUFPLEVBQUU7Z0JBQ3BELE9BQU07YUFDUDtZQUVELElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEtBQUssR0FBRyxFQUFFO2dCQUN2QyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQTtnQkFDM0MsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7Z0JBQzlCLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO2FBQ2pDO1lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNsQixDQUFDLENBQUE7UUFFRCxrQkFBa0I7UUFDVixhQUFRLEdBQUcsQ0FBQyxPQUFvQixFQUFFLENBQVEsRUFBRSxFQUFFO1lBQ3BELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFBO1lBQzlDLGdIQUFnSDtZQUNoSCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQzlDLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxXQUFXLEtBQUssVUFBVSxFQUFFO2dCQUMvQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBLENBQUMsc0JBQXNCO2dCQUV2QyxrQ0FBa0M7Z0JBQ2xDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQ2hELCtGQUErRjt3QkFDL0YsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBZ0IsQ0FBQyxLQUFLLFVBQVUsRUFBRTs0QkFDckYsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFnQixDQUFDLENBQUE7eUJBQ3BDO3FCQUNGO2lCQUNGO2FBQ0Y7UUFDSCxDQUFDLENBQUE7UUFFRCxlQUFlO1FBQ1AsVUFBSyxHQUFHLENBQUMsT0FBb0IsRUFBRSxDQUFRLEVBQUUsRUFBRTtZQUNqRCxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLG9CQUFvQixDQUFDLEtBQUssS0FBSyxFQUFFO2dCQUMxRSxPQUFNO2FBQ1A7WUFFRCw4QkFBOEI7WUFDOUIsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUN0QyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxDQUFBO1FBQ2hFLENBQUMsQ0FBQTtRQUVPLFdBQU0sR0FBRyxDQUFDLE9BQW9CLEVBQUUsQ0FBUSxFQUFFLEVBQUU7WUFDbEQsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFBO1lBQ2xCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDMUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsS0FBSyxPQUFPLEVBQUU7Z0JBQ3BELE9BQU07YUFDUDtZQUVELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUssS0FBSyxFQUFFO2dCQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO2FBQ2pCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7YUFDbkI7UUFDSCxDQUFDLENBQUE7UUFFRCx1QkFBdUI7UUFDdkIsdUJBQXVCO1FBQ3ZCLHVCQUF1QjtRQUNoQixVQUFLLEdBQUcsQ0FBQyxPQUFvQixFQUFFLENBQVEsRUFBRSxFQUFFO1lBQ2hELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDaEMsQ0FBQyxDQUFBO1FBRU0sU0FBSSxHQUFHLENBQUMsT0FBb0IsRUFBRSxDQUFRLEVBQUUsRUFBRTtZQUMvQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQy9CLENBQUMsQ0FBQTtRQUVNLFlBQU8sR0FBRyxDQUFDLE9BQW9CLEVBQUUsQ0FBUSxFQUFFLEVBQUU7WUFDbEQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUNsQyxDQUFDLENBQUE7UUFFTSxjQUFTLEdBQUcsQ0FBQyxPQUFvQixFQUFFLENBQVEsRUFBRSxFQUFFO1lBQ3BELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBZSxDQUFDLENBQUE7UUFDbEQsQ0FBQyxDQUFBO1FBRU0sYUFBUSxHQUFHLENBQUMsT0FBb0IsRUFBRSxDQUFRLEVBQUUsRUFBRTtZQUNuRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQWUsQ0FBQyxDQUFBO1FBQ2pELENBQUMsQ0FBQTtRQUVELGtCQUFrQjtRQUNYLHVCQUFrQixHQUFHLENBQUMsSUFBaUIsRUFBRSxFQUFFO1lBQ2hELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDN0MsQ0FBQyxDQUFBO1FBRU0sbUJBQWMsR0FBRyxDQUFDLE9BQW9CLEVBQUUsRUFBRTtZQUMvQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDdEMsQ0FBQyxDQUFBO1FBRU0sU0FBSSxHQUFHLENBQUMsSUFBaUIsRUFBRSxFQUFFO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN6QixDQUFDLENBQUE7UUFFTSxTQUFJLEdBQUcsQ0FBQyxJQUFpQixFQUFFLEVBQUU7WUFDbEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3pCLENBQUMsQ0FBQTtRQUVNLFVBQUssR0FBRyxDQUFDLElBQWlCLEVBQUUsRUFBRTtZQUNuQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDMUIsQ0FBQyxDQUFBO1FBRU0sV0FBTSxHQUFHLEdBQUcsRUFBRTtZQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUN2QixDQUFDLENBQUE7UUFFTSxlQUFVLEdBQUcsR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQTtRQUNyQixDQUFDLENBQUE7UUFFTSx1QkFBa0IsR0FBRyxDQUFDLElBQWlCLEVBQUUsRUFBRTtZQUNoRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN2QyxDQUFDLENBQUE7UUFFTSx5QkFBb0IsR0FBRyxDQUFDLElBQWlCLEVBQUUsRUFBRTtZQUNsRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN6QyxDQUFDLENBQUE7UUFFTSxzQkFBaUIsR0FBRyxDQUFDLElBQWlCLEVBQUUsRUFBRTtZQUMvQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN0QyxDQUFDLENBQUE7UUFFTSwwQkFBcUIsR0FBRyxDQUFDLElBQWlCLEVBQUUsRUFBRTtZQUNuRCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMxQyxDQUFDLENBQUE7UUFFTSxtQkFBYyxHQUFHLENBQUMsSUFBaUIsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuQyxDQUFDLENBQUE7UUFFTSxzQkFBaUIsR0FBRyxDQUFDLElBQWlCLEVBQUUsRUFBRTtZQUMvQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN0QyxDQUFDLENBQUE7UUFFTSxzQkFBaUIsR0FBRyxHQUFHLEVBQUU7WUFDOUIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFBO1FBQzVCLENBQUMsQ0FBQTtRQUVNLDRCQUF1QixHQUFHLENBQUMsSUFBaUIsRUFBRSxFQUFFO1lBQ3JELE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzVDLENBQUMsQ0FBQTtRQUVELHlCQUF5QjtRQUNsQixtQkFBYyxHQUFHLENBQUMsSUFBaUIsRUFBRSxFQUFFO1lBQzVDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNuQyxDQUFDLENBQUE7UUFFRCxZQUFZO1FBQ0wsT0FBRSxHQUFHLENBQUMsSUFBWSxFQUFFLE9BQVksRUFBRSxFQUFFO1lBQ3pDLE9BQU8sZ0JBQWdCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ3pELENBQUMsQ0FBQTtRQUVNLFFBQUcsR0FBRyxDQUFDLElBQVksRUFBRSxPQUFZLEVBQUUsRUFBRTtZQUMxQyxPQUFPLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMxRCxDQUFDLENBQUE7UUFFTSxRQUFHLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtZQUM1QixPQUFPLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ2pELENBQUMsQ0FBQTtRQWh3QkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUE7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ3pELElBQUksQ0FBQyxXQUFXLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDaEQsb0RBQW9EO1FBQ3BELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNkLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDeEMsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDOztBQTB2QkQsd0JBQXdCO0FBQ3hCLGlDQUFpQztBQUNuQix5QkFBVyxHQUFHLENBQUMsT0FBb0IsRUFBRSxFQUFFO0lBQ25ELHNEQUFzRDtJQUN0RCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUNqRCxJQUFJLFdBQVcsRUFBRTtRQUNmLE9BQU8sV0FBVyxDQUFBO0tBQ25CO0lBRUQsMkJBQTJCO0lBQzNCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDckMsSUFBSSxJQUFJLEVBQUU7UUFDUixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQW1CLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDMUQsSUFBSSxRQUFRLEVBQUU7WUFDWixPQUFPLFFBQVEsQ0FBQTtTQUNoQjtLQUNGO0lBRUQsd0VBQXdFO0lBQ3hFLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUU7UUFDM0MsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUN4QyxJQUFJLEdBQUcsRUFBRTtZQUNQLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQTtZQUN4RCxJQUFJLE9BQU8sRUFBRTtnQkFDWCxPQUFPLE9BQU8sQ0FBQTthQUNmO1NBQ0Y7S0FDRjtJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyxDQUFBO0FBRUQsOENBQThDO0FBQ2hDLDJCQUFhLEdBQUcsQ0FBQyxJQUE2QixFQUFFLEVBQUU7SUFDOUQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLDJDQUEyQyxDQUFDLENBQUE7SUFFcEYsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNoRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDckIsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFtQixDQUFDLENBQUE7WUFFM0QsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUU7Z0JBQ3BELElBQUksSUFBSSxFQUFFO29CQUNSLElBQ0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLO3dCQUNyRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUs7d0JBQzdCLElBQUksS0FBSyxJQUFJLEVBQ2I7d0JBQ0EsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtxQkFDaEI7aUJBQ0Y7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtpQkFDaEI7YUFDRjtTQUNGO0tBQ0Y7QUFDSCxDQUFDLENBQUE7QUFFYSw2QkFBZSxHQUFHLEdBQUcsRUFBRTtJQUNuQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtJQUNwRixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUM3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2hELElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUVuQixJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBbUIsRUFBRSxRQUFRLENBQUMsRUFBRTtnQkFDL0MsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFtQixFQUFFLFFBQVEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO2FBQzFEO1NBQ0Y7S0FDRjtBQUNILENBQUMsQ0FBQTtBQUVELGtCQUFrQjtBQUNKLDZCQUFlLEdBQUcsQ0FBQyxRQUFnQixFQUFFLEVBQUU7SUFDbkQsbUJBQW1CO0lBQ25CLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtRQUNqRCxNQUFNLFFBQVEsR0FBRyxFQUFpQixDQUFBO1FBQ2xDLElBQUksWUFBWSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdEQsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixZQUFZLEdBQUcsSUFBSSxhQUFhLENBQUMsRUFBaUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO1NBQ3hFO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUE7QUFFYSxnQ0FBa0IsR0FBRyxHQUFHLEVBQUU7SUFDdEMsbUJBQW1CO0lBQ25CLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtRQUN2QyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtRQUN4RixJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDekMsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBZ0IsQ0FBQTtnQkFDeEMsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQWtCLENBQUE7Z0JBQ2hFLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssVUFBVSxFQUFFO29CQUMxRCw2REFBNkQ7b0JBQzdELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQTtvQkFDakMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBZ0IsQ0FBQTtvQkFDMUQsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFxQixDQUFDLEVBQUU7d0JBQy9ELFNBQVE7cUJBQ1Q7b0JBRUQsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFxQixDQUFDLENBQUMsRUFBRTt3QkFDdEUsU0FBUTtxQkFDVDtvQkFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO2lCQUNuQjthQUNGO1NBQ0Y7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLHFCQUFxQjtJQUNyQixtQkFBbUIsQ0FBQyxFQUFFLENBQ3BCLFFBQVEsQ0FBQyxJQUFJLEVBQ2IsMEhBQTBILEVBQzFILE9BQU8sRUFDUCxVQUE2QixDQUFRO1FBQ25DLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFrQixDQUFBO1FBQzdELElBQUksSUFBSSxFQUFFO1lBQ1IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQTtTQUMzQjtJQUNILENBQUMsQ0FDRixDQUFBO0lBRUQsa0JBQWtCO0lBQ2xCLG1CQUFtQixDQUFDLEVBQUUsQ0FDcEIsUUFBUSxDQUFDLElBQUksRUFDYixxREFBcUQsRUFDckQsT0FBTyxFQUNQLFVBQTZCLENBQVE7UUFDbkMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFBO1FBQ25CLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDNUMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFBO1NBQzFCO0lBQ0gsQ0FBQyxDQUNGLENBQUE7SUFFRCxrQkFBa0I7SUFDbEIsbUJBQW1CLENBQUMsRUFBRSxDQUNwQixRQUFRLENBQUMsSUFBSSxFQUNiLCtCQUErQixFQUMvQixPQUFPLEVBQ1AsVUFBNkIsQ0FBUTtRQUNuQyxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBa0IsQ0FBQTtRQUM3RCxJQUFJLElBQUksRUFBRTtZQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUE7U0FDN0I7SUFDSCxDQUFDLENBQ0YsQ0FBQTtJQUVELG9CQUFvQjtJQUNwQixtQkFBbUIsQ0FBQyxFQUFFLENBQ3BCLFFBQVEsQ0FBQyxJQUFJLEVBQ2IsbUNBQW1DLEVBQ25DLFdBQVcsRUFDWCxVQUE2QixDQUFRO1FBQ25DLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFrQixDQUFBO1FBQzdELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssVUFBVSxFQUFFO1lBQ3BELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUE7U0FDL0I7SUFDSCxDQUFDLENBQ0YsQ0FBQTtJQUVELG1CQUFtQjtJQUNuQixtQkFBbUIsQ0FBQyxFQUFFLENBQ3BCLFFBQVEsQ0FBQyxJQUFJLEVBQ2IsbUNBQW1DLEVBQ25DLFVBQVUsRUFDVixVQUE2QixDQUFRO1FBQ25DLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFrQixDQUFBO1FBQzdELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssVUFBVSxFQUFFO1lBQ3BELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUE7U0FDOUI7SUFDSCxDQUFDLENBQ0YsQ0FBQTtJQUVELGlCQUFpQjtJQUNqQixNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUNyQyxJQUFJLEtBQUssQ0FBQTtRQUNULFFBQVEsQ0FDTixLQUFLLEVBQ0wsR0FBRyxFQUFFO1lBQ0gsc0RBQXNEO1lBQ3RELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO1lBQ25FLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtnQkFDdEIsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxFQUFpQixDQUFDLENBQUE7Z0JBQ3pELElBQUksSUFBSSxFQUFFO29CQUNSLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQTtpQkFDZDtZQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxFQUNELEdBQUcsQ0FDSixDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUE7QUFFYSx1QkFBUyxHQUFHLEdBQUcsRUFBRTtJQUM3QixhQUFhLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtJQUNsQyxhQUFhLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLENBQUE7QUFDeEQsQ0FBQyxDQUFBO0FBRWEsOEJBQWdCLEdBQUcsR0FBRyxFQUFFO0lBQ3BDLGFBQWEsQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtBQUN4RCxDQUFDLENBQUE7QUFFYSwyQkFBYSxHQUFHLENBQzVCLFFBQWdCLEVBQ2hCLFVBQXVCLGtCQUFrQixFQUNkLEVBQUU7SUFDN0IsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDckQsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUNaLE9BQU07S0FDUDtJQUNELE1BQU0sSUFBSSxHQUFHLE9BQXNCLENBQUE7SUFDbkMsSUFBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUMxQyxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ1QsSUFBSSxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtLQUN4QztJQUNELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyxDQUFBO0FBR0gsT0FBTyxFQUFDLGFBQWEsRUFBRSxrQkFBa0IsRUFBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlUG9wcGVyLCBWaXJ0dWFsRWxlbWVudCB9IGZyb20gJ0Bwb3BwZXJqcy9jb3JlJ1xyXG5cclxuaW1wb3J0IHsgZ2V0QXR0cmlidXRlVmFsdWVCeUJyZWFrcG9pbnQsIGdldEVsZW1lbnRDaGlsZCwgZ2V0RWxlbWVudFBhcmVudHMsIGdldEhpZ2hlc3RaaW5kZXgsIGluc2VydEFmdGVyRWxlbWVudCwgdGhyb3R0bGUgfSBmcm9tIFwiLi4vX3V0aWxzL0RvbUhlbHBlcnNcIlxyXG5pbXBvcnQgeyBFdmVudEhhbmRsZXJVdGlsIH0gZnJvbSBcIi4uL191dGlscy9FdmVudEhhbmRsZXJVdGlsXCJcclxuaW1wb3J0IHsgRGF0YVV0aWwgfSBmcm9tIFwiLi4vX3V0aWxzL19EYXRhVXRpbFwiXHJcbmltcG9ydCB7IERPTUV2ZW50SGFuZGxlclV0aWwgfSBmcm9tIFwiLi4vX3V0aWxzL19ET01FdmVudEhhbmRsZXJVdGlsXCJcclxuaW1wb3J0IHsgRWxlbWVudFN0eWxlVXRpbCB9IGZyb20gXCIuLi9fdXRpbHMvX0VsZW1lbnRTdHlsZVV0aWxcIlxyXG5pbXBvcnQgeyBnZXRVbmlxdWVJZFdpdGhQcmVmaXggfSBmcm9tIFwiLi4vX3V0aWxzL19UeXBlc0hlbHBlcnNcIlxyXG5pbXBvcnQgeyBFbGVtZW50QW5pbWF0ZVV0aWwgfSBmcm9tICcuLi9fdXRpbHMvRWxlbWVudEFuaW1hdGVVdGlsJ1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNZW51T3B0aW9ucyB7XHJcbiAgZHJvcGRvd246IHtcclxuICAgIGhvdmVyVGltZW91dDogbnVtYmVyXHJcbiAgICB6aW5kZXg6IG51bWJlclxyXG4gIH1cclxuICBhY2NvcmRpb246IHtcclxuICAgIHNsaWRlU3BlZWQ6IG51bWJlclxyXG4gICAgZXhwYW5kOiBib29sZWFuXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBkZWZhdWx0TWVudU9wdGlvbnM6IE1lbnVPcHRpb25zID0ge1xyXG4gIGRyb3Bkb3duOiB7XHJcbiAgICBob3ZlclRpbWVvdXQ6IDIwMCxcclxuICAgIHppbmRleDogMTA1LFxyXG4gIH0sXHJcbiAgYWNjb3JkaW9uOiB7XHJcbiAgICBzbGlkZVNwZWVkOiAyNTAsXHJcbiAgICBleHBhbmQ6IGZhbHNlLFxyXG4gIH0sXHJcbn1cclxuXHJcbnR5cGUgUG9wcGVyUGxhY2VtZW50ID1cclxuICB8ICdyaWdodCdcclxuICB8ICdhdXRvJ1xyXG4gIHwgJ2F1dG8tc3RhcnQnXHJcbiAgfCAnYXV0by1lbmQnXHJcbiAgfCAndG9wJ1xyXG4gIHwgJ2JvdHRvbSdcclxuICB8ICdsZWZ0J1xyXG4gIHwgJ3RvcC1zdGFydCdcclxuICB8ICd0b3AtZW5kJ1xyXG4gIHwgJ2JvdHRvbS1zdGFydCdcclxuICB8ICdib3R0b20tZW5kJ1xyXG4gIHwgJ3JpZ2h0LXN0YXJ0J1xyXG4gIHwgJ3JpZ2h0LWVuZCdcclxuICB8ICdsZWZ0LXN0YXJ0J1xyXG4gIHwgJ2xlZnQtZW5kJ1xyXG4gIHwgdW5kZWZpbmVkXHJcblxyXG5jbGFzcyBNZW51Q29tcG9uZW50IHtcclxuICBlbGVtZW50OiBIVE1MRWxlbWVudFxyXG4gIG9wdGlvbnM6IE1lbnVPcHRpb25zXHJcbiAgaW5zdGFuY2VVaWQ6IHN0cmluZ1xyXG4gIHRyaWdnZXJFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsXHJcblxyXG4gIGNvbnN0cnVjdG9yKF9lbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9uczogTWVudU9wdGlvbnMpIHtcclxuICAgIHRoaXMuZWxlbWVudCA9IF9lbGVtZW50XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKGRlZmF1bHRNZW51T3B0aW9ucywgb3B0aW9ucylcclxuICAgIHRoaXMuaW5zdGFuY2VVaWQgPSBnZXRVbmlxdWVJZFdpdGhQcmVmaXgoJ21lbnUnKVxyXG4gICAgLy8gdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1rdC1tZW51JywgJ3RydWUnKVxyXG4gICAgdGhpcy5fc2V0VHJpZ2dlckVsZW1lbnQoKVxyXG4gICAgdGhpcy5fdXBkYXRlKClcclxuICAgIERhdGFVdGlsLnNldCh0aGlzLmVsZW1lbnQsICdtZW51JywgdGhpcylcclxuICAgIHJldHVybiB0aGlzXHJcbiAgfVxyXG5cclxuICAvLyBTZXQgZXh0ZXJuYWwgdHJpZ2dlciBlbGVtZW50XHJcbiAgcHJpdmF0ZSBfc2V0VHJpZ2dlckVsZW1lbnQgPSAoKSA9PiB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICBgW2RhdGEta3QtbWVudS10YXJnZXQ9XCIjJHt0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZCcpfVwiYFxyXG4gICAgKVxyXG5cclxuICAgIGlmICh0YXJnZXQpIHtcclxuICAgICAgdGhpcy50cmlnZ2VyRWxlbWVudCA9IHRhcmdldCBhcyBIVE1MRWxlbWVudFxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuY2xvc2VzdCgnW2RhdGEta3QtbWVudS10cmlnZ2VyXScpKSB7XHJcbiAgICAgIHRoaXMudHJpZ2dlckVsZW1lbnQgPSB0aGlzLmVsZW1lbnQuY2xvc2VzdCgnW2RhdGEta3QtbWVudS10cmlnZ2VyXScpIGFzIEhUTUxFbGVtZW50XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZSAmJlxyXG4gICAgICBnZXRFbGVtZW50Q2hpbGQodGhpcy5lbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQsICdbZGF0YS1rdC1tZW51LXRyaWdnZXJdJylcclxuICAgICkge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IGdldEVsZW1lbnRDaGlsZChcclxuICAgICAgICB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCxcclxuICAgICAgICAnW2RhdGEta3QtbWVudS10cmlnZ2VyXSdcclxuICAgICAgKVxyXG4gICAgICBpZiAoY2hpbGQpIHtcclxuICAgICAgICB0aGlzLnRyaWdnZXJFbGVtZW50ID0gY2hpbGRcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnRyaWdnZXJFbGVtZW50KSB7XHJcbiAgICAgIERhdGFVdGlsLnNldCh0aGlzLnRyaWdnZXJFbGVtZW50LCAnbWVudScsIHRoaXMpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBUZXN0IGlmIG1lbnUgaGFzIGV4dGVybmFsIHRyaWdnZXIgZWxlbWVudFxyXG4gIHByaXZhdGUgX2lzVHJpZ2dlckVsZW1lbnQgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIHJldHVybiB0aGlzLnRyaWdnZXJFbGVtZW50ID09PSBpdGVtXHJcbiAgfVxyXG5cclxuICAvLyBHZXQgaXRlbSBvcHRpb24odGhyb3VnaCBodG1sIGF0dHJpYnV0ZXMpXHJcbiAgcHJpdmF0ZSBfZ2V0SXRlbU9wdGlvbiA9IChpdGVtOiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICBsZXQgdmFsdWUgPSBudWxsXHJcbiAgICBpZiAoaXRlbSAmJiBpdGVtLmhhc0F0dHJpYnV0ZSgnZGF0YS1rdC1tZW51LScgKyBuYW1lKSkge1xyXG4gICAgICBjb25zdCBhdHRyID0gaXRlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEta3QtbWVudS0nICsgbmFtZSkgfHwgJydcclxuICAgICAgdmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZUJ5QnJlYWtwb2ludChhdHRyKVxyXG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgU3RyaW5nKHZhbHVlKSA9PT0gJ3RydWUnKSB7XHJcbiAgICAgICAgdmFsdWUgPSB0cnVlXHJcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IG51bGwgJiYgU3RyaW5nKHZhbHVlKSA9PT0gJ2ZhbHNlJykge1xyXG4gICAgICAgIHZhbHVlID0gZmFsc2VcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlXHJcbiAgfVxyXG5cclxuICAvLyBHZXQgaXRlbSBlbGVtZW50XHJcbiAgcHJpdmF0ZSBfZ2V0SXRlbUVsZW1lbnQgPSAoX2VsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICAvLyBFbGVtZW50IGlzIHRoZSBleHRlcm5hbCB0cmlnZ2VyIGVsZW1lbnRcclxuICAgIGlmICh0aGlzLl9pc1RyaWdnZXJFbGVtZW50KF9lbGVtZW50KSkge1xyXG4gICAgICByZXR1cm4gX2VsZW1lbnRcclxuICAgIH1cclxuXHJcbiAgICAvLyBFbGVtZW50IGhhcyBpdGVtIHRvZ2dsZXIgYXR0cmlidXRlXHJcbiAgICBpZiAoX2VsZW1lbnQuaGFzQXR0cmlidXRlKCdkYXRhLWt0LW1lbnUtdHJpZ2dlcicpKSB7XHJcbiAgICAgIHJldHVybiBfZWxlbWVudFxyXG4gICAgfVxyXG5cclxuICAgIC8vIEVsZW1lbnQgaGFzIGl0ZW0gRE9NIHJlZmVyZW5jZSBpbiBpdCdzIGRhdGEgc3RvcmFnZVxyXG4gICAgY29uc3QgaXRlbUVsZW1lbnQgPSBEYXRhVXRpbC5nZXQoX2VsZW1lbnQsICdpdGVtJylcclxuICAgIGlmIChpdGVtRWxlbWVudCkge1xyXG4gICAgICByZXR1cm4gaXRlbUVsZW1lbnRcclxuICAgIH1cclxuXHJcbiAgICAvLyBJdGVtIGlzIHBhcmVudCBvZiBlbGVtZW50XHJcbiAgICBjb25zdCBpdGVtID0gX2VsZW1lbnQuY2xvc2VzdCgnLm1lbnUtaXRlbVtkYXRhLWt0LW1lbnUtdHJpZ2dlcl0nKVxyXG4gICAgaWYgKGl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGl0ZW1cclxuICAgIH1cclxuXHJcbiAgICAvLyBFbGVtZW50J3MgcGFyZW50IGhhcyBpdGVtIERPTSByZWZlcmVuY2UgaW4gaXQncyBkYXRhIHN0b3JhZ2VcclxuICAgIGNvbnN0IHN1YiA9IF9lbGVtZW50LmNsb3Nlc3QoJy5tZW51LXN1YicpXHJcbiAgICBpZiAoc3ViKSB7XHJcbiAgICAgIGNvbnN0IHN1Ykl0ZW0gPSBEYXRhVXRpbC5nZXQoc3ViIGFzIEhUTUxFbGVtZW50LCAnaXRlbScpXHJcbiAgICAgIGlmIChzdWJJdGVtKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1Ykl0ZW1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gR2V0IGl0ZW0gcGFyZW50IGVsZW1lbnRcclxuICBwcml2YXRlIF9nZXRJdGVtUGFyZW50RWxlbWVudCA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgY29uc3Qgc3ViID0gaXRlbS5jbG9zZXN0KCcubWVudS1zdWInKVxyXG4gICAgaWYgKCFzdWIpIHtcclxuICAgICAgcmV0dXJuIG51bGxcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdWJJdGVtID0gRGF0YVV0aWwuZ2V0KHN1YiBhcyBIVE1MRWxlbWVudCwgJ2l0ZW0nKVxyXG4gICAgaWYgKHN1Ykl0ZW0pIHtcclxuICAgICAgcmV0dXJuIHN1Ykl0ZW1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwYXJlbnRJdGVtID0gc3ViLmNsb3Nlc3QoJy5tZW51LWl0ZW1bZGF0YS1rdC1tZW51LXRyaWdnZXJdJylcclxuICAgIGlmIChzdWIgJiYgcGFyZW50SXRlbSkge1xyXG4gICAgICByZXR1cm4gcGFyZW50SXRlbVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG5cclxuICAvLyBHZXQgaXRlbSBwYXJlbnQgZWxlbWVudHNcclxuICBwcml2YXRlIF9nZXRJdGVtUGFyZW50RWxlbWVudHMgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIGNvbnN0IHBhcmVudHMgPSBbXVxyXG4gICAgbGV0IHBhcmVudFxyXG4gICAgbGV0IGkgPSAwXHJcbiAgICBsZXQgYnVmZmVyID0gaXRlbVxyXG5cclxuICAgIGRvIHtcclxuICAgICAgcGFyZW50ID0gdGhpcy5fZ2V0SXRlbVBhcmVudEVsZW1lbnQoYnVmZmVyKVxyXG4gICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgcGFyZW50cy5wdXNoKHBhcmVudClcclxuICAgICAgICBidWZmZXIgPSBwYXJlbnRcclxuICAgICAgfVxyXG5cclxuICAgICAgaSsrXHJcbiAgICB9IHdoaWxlIChwYXJlbnQgIT09IG51bGwgJiYgaSA8IDIwKVxyXG5cclxuICAgIGlmICh0aGlzLnRyaWdnZXJFbGVtZW50KSB7XHJcbiAgICAgIHBhcmVudHMudW5zaGlmdCh0aGlzLnRyaWdnZXJFbGVtZW50KVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwYXJlbnRzXHJcbiAgfVxyXG5cclxuICAvLyBQcmVwYXJlIHBvcHBlciBjb25maWcgZm9yIGRyb3Bkb3duKHNlZTogaHR0cHM6Ly9wb3BwZXIuanMub3JnL2RvY3MvdjIvKVxyXG4gIHByaXZhdGUgX2dldERyb3Bkb3duUG9wcGVyQ29uZmlnID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICAvLyBQbGFjZW1lbnRcclxuICAgIGNvbnN0IHBsYWNlbWVudE9wdGlvbiA9IHRoaXMuX2dldEl0ZW1PcHRpb24oaXRlbSwgJ3BsYWNlbWVudCcpXHJcbiAgICBsZXQgcGxhY2VtZW50OiBQb3BwZXJQbGFjZW1lbnQgPSAncmlnaHQnXHJcbiAgICBpZiAocGxhY2VtZW50T3B0aW9uKSB7XHJcbiAgICAgIHBsYWNlbWVudCA9IHBsYWNlbWVudE9wdGlvbiBhcyBQb3BwZXJQbGFjZW1lbnRcclxuICAgIH1cclxuXHJcbiAgICAvLyBGbGlwXHJcbiAgICBjb25zdCBmbGlwVmFsdWUgPSB0aGlzLl9nZXRJdGVtT3B0aW9uKGl0ZW0sICdmbGlwJylcclxuICAgIGNvbnN0IGZsaXAgPSBmbGlwVmFsdWUgPyBmbGlwVmFsdWUudG9TdHJpbmcoKS5zcGxpdCgnLCcpIDogW11cclxuXHJcbiAgICAvLyBPZmZzZXRcclxuICAgIGNvbnN0IG9mZnNldFZhbHVlID0gdGhpcy5fZ2V0SXRlbU9wdGlvbihpdGVtLCAnb2Zmc2V0JylcclxuICAgIGNvbnN0IG9mZnNldCA9IG9mZnNldFZhbHVlID8gb2Zmc2V0VmFsdWUudG9TdHJpbmcoKS5zcGxpdCgnLCcpIDogW11cclxuXHJcbiAgICAvLyBTdHJhdGVneVxyXG4gICAgY29uc3Qgc3RyYXRlZ3k6ICdhYnNvbHV0ZScgfCAnZml4ZWQnIHwgdW5kZWZpbmVkID1cclxuICAgICAgdGhpcy5fZ2V0SXRlbU9wdGlvbihpdGVtLCAnb3ZlcmZsb3cnKSA9PT0gdHJ1ZSA/ICdhYnNvbHV0ZScgOiAnZml4ZWQnXHJcblxyXG4gICAgdmFyIGFsdEF4aXMgPSB0aGlzLl9nZXRJdGVtT3B0aW9uKGl0ZW0sICdmbGlwJykgIT09IGZhbHNlO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxyXG4gICAgICBzdHJhdGVneTogc3RyYXRlZ3ksXHJcbiAgICAgIG1vZGlmaWVyczogW3tcclxuICAgICAgICBuYW1lOiAnb2Zmc2V0JyxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICBvZmZzZXQ6IG9mZnNldFxyXG4gICAgICAgIH1cclxuICAgICAgfSwge1xyXG4gICAgICAgIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgIGFsdEF4aXM6IGFsdEF4aXNcclxuICAgICAgICB9XHJcbiAgICAgIH0sIHtcclxuICAgICAgICBuYW1lOiAnZmxpcCcsXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgZmxpcFZhcmlhdGlvbnM6IGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICB9XVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIEdldCBpdGVtIGNoaWxkIGVsZW1lbnRcclxuICBwcml2YXRlIF9nZXRJdGVtQ2hpbGRFbGVtZW50ID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICBsZXQgc2VsZWN0b3IgPSBpdGVtXHJcblxyXG4gICAgY29uc3Qgc3ViSXRlbSA9IERhdGFVdGlsLmdldChpdGVtLCAnc3ViJylcclxuICAgIGlmIChzdWJJdGVtKSB7XHJcbiAgICAgIHNlbGVjdG9yID0gc3ViSXRlbVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZWxlY3Rvcikge1xyXG4gICAgICAvL2VsZW1lbnQgPSBzZWxlY3Rvci5xdWVyeVNlbGVjdG9yKCcuc2hvdy5tZW51LWl0ZW1bZGF0YS1rdC1tZW51LXRyaWdnZXJdJyk7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBzZWxlY3Rvci5xdWVyeVNlbGVjdG9yKCcubWVudS1pdGVtW2RhdGEta3QtbWVudS10cmlnZ2VyXScpXHJcbiAgICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGxcclxuICB9XHJcblxyXG4gIC8vIEdldCBpdGVtIGNoaWxkIGVsZW1lbnRzXHJcbiAgcHJpdmF0ZSBfZ2V0SXRlbUNoaWxkRWxlbWVudHMgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIGNvbnN0IGNoaWxkcmVuID0gW11cclxuICAgIGxldCBjaGlsZFxyXG4gICAgbGV0IGkgPSAwXHJcbiAgICBsZXQgYnVmZmVyID0gaXRlbVxyXG4gICAgZG8ge1xyXG4gICAgICBjaGlsZCA9IHRoaXMuX2dldEl0ZW1DaGlsZEVsZW1lbnQoYnVmZmVyKVxyXG4gICAgICBpZiAoY2hpbGQpIHtcclxuICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkKVxyXG4gICAgICAgIGJ1ZmZlciA9IGNoaWxkIGFzIEhUTUxFbGVtZW50XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGkrK1xyXG4gICAgfSB3aGlsZSAoY2hpbGQgIT09IG51bGwgJiYgaSA8IDIwKVxyXG5cclxuICAgIHJldHVybiBjaGlsZHJlblxyXG4gIH1cclxuXHJcbiAgLy8gR2V0IGl0ZW0gc3ViIGVsZW1lbnRcclxuICBwcml2YXRlIF9nZXRJdGVtU3ViRWxlbWVudCA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2lzVHJpZ2dlckVsZW1lbnQoaXRlbSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmNsYXNzTGlzdC5jb250YWlucygnbWVudS1zdWInKSkge1xyXG4gICAgICByZXR1cm4gaXRlbVxyXG4gICAgfSBlbHNlIGlmIChEYXRhVXRpbC5oYXMoaXRlbSwgJ3N1YicpKSB7XHJcbiAgICAgIHJldHVybiBEYXRhVXRpbC5nZXQoaXRlbSwgJ3N1YicpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZ2V0RWxlbWVudENoaWxkKGl0ZW0sICcubWVudS1zdWInKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0Q3NzID0gKGVsOiBIVE1MRWxlbWVudCwgc3R5bGVQcm9wOiBzdHJpbmcpID0+IHtcclxuICAgIGNvbnN0IGRlZmF1bHRWaWV3ID0gKGVsLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpLmRlZmF1bHRWaWV3XHJcbiAgICBpZiAoIWRlZmF1bHRWaWV3KSB7XHJcbiAgICAgIHJldHVybiAnJ1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHNhbml0aXplIHByb3BlcnR5IG5hbWUgdG8gY3NzIG5vdGF0aW9uXHJcbiAgICAvLyAoaHlwaGVuIHNlcGFyYXRlZCB3b3JkcyBlZy4gZm9udC1TaXplKVxyXG4gICAgc3R5bGVQcm9wID0gc3R5bGVQcm9wLnJlcGxhY2UoLyhbQS1aXSkvZywgJy0kMScpLnRvTG93ZXJDYXNlKClcclxuXHJcbiAgICByZXR1cm4gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZVByb3ApXHJcbiAgfVxyXG5cclxuICAvLyBHZXQgaXRlbSBzdWIgdHlwZVxyXG4gIHByaXZhdGUgX2dldEl0ZW1TdWJUeXBlID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICBjb25zdCBzdWIgPSB0aGlzLl9nZXRJdGVtU3ViRWxlbWVudChlbGVtZW50KVxyXG4gICAgaWYgKHN1YiAmJiBwYXJzZUludCh0aGlzLl9nZXRDc3Moc3ViLCAnei1pbmRleCcpKSA+IDApIHtcclxuICAgICAgcmV0dXJuICdkcm9wZG93bidcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnYWNjb3JkaW9uJ1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gVGVzdCBpZiBpdGVtJ3Mgc3ViIGlzIHNob3duXHJcbiAgcHJpdmF0ZSBfaXNJdGVtU3ViU2hvd24gPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIGxldCBzdWIgPSB0aGlzLl9nZXRJdGVtU3ViRWxlbWVudChpdGVtKVxyXG4gICAgaWYgKHN1Yikge1xyXG4gICAgICBpZiAodGhpcy5fZ2V0SXRlbVN1YlR5cGUoaXRlbSkgPT09ICdkcm9wZG93bicpIHtcclxuICAgICAgICByZXR1cm4gc3ViLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpICYmIHN1Yi5oYXNBdHRyaWJ1dGUoJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCcpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JylcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgLy8gVGVzdCBpZiBpdGVtIGRyb3Bkb3duIGlzIHBlcm1hbmVudFxyXG4gIHByaXZhdGUgX2lzSXRlbURyb3Bkb3duUGVybWFuZW50ID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZ2V0SXRlbU9wdGlvbihpdGVtLCAncGVybWFuZW50JykgPT09IHRydWVcclxuICB9XHJcblxyXG4gIC8vIFRlc3QgaWYgaXRlbSdzIHBhcmVudCBpcyBzaG93blxyXG4gIHByaXZhdGUgX2lzSXRlbVBhcmVudFNob3duID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICByZXR1cm4gZ2V0RWxlbWVudFBhcmVudHMoaXRlbSwgJy5tZW51LWl0ZW0uc2hvdycpLmxlbmd0aCA+IDBcclxuICB9XHJcblxyXG4gIC8vIFRlc3Qgb2YgaXQgaXMgaXRlbSBzdWIgZWxlbWVudFxyXG4gIHByaXZhdGUgX2lzSXRlbVN1YkVsZW1lbnQgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIHJldHVybiBpdGVtLmNsYXNzTGlzdC5jb250YWlucygnbWVudS1zdWInKVxyXG4gIH1cclxuXHJcbiAgLy8gVGVzdCBpZiBpdGVtIGhhcyBzdWJcclxuICBwcml2YXRlIF9oYXNJdGVtU3ViID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICByZXR1cm4gaXRlbS5jbGFzc0xpc3QuY29udGFpbnMoJ21lbnUtaXRlbScpICYmIGl0ZW0uaGFzQXR0cmlidXRlKCdkYXRhLWt0LW1lbnUtdHJpZ2dlcicpXHJcbiAgfVxyXG5cclxuICAvLyBHZXQgbGluayBlbGVtZW50XHJcbiAgcHJpdmF0ZSBfZ2V0SXRlbUxpbmtFbGVtZW50ID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICByZXR1cm4gZ2V0RWxlbWVudENoaWxkKGl0ZW0sICcubWVudS1saW5rJylcclxuICB9XHJcblxyXG4gIC8vIEdldCB0b2dnbGUgZWxlbWVudFxyXG4gIHByaXZhdGUgX2dldEl0ZW1Ub2dnbGVFbGVtZW50ID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICBpZiAodGhpcy50cmlnZ2VyRWxlbWVudCkge1xyXG4gICAgICByZXR1cm4gdGhpcy50cmlnZ2VyRWxlbWVudFxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9nZXRJdGVtTGlua0VsZW1lbnQoaXRlbSlcclxuICB9XHJcblxyXG4gIC8vIFNob3cgaXRlbSBkcm9wZG93blxyXG4gIHByaXZhdGUgX3Nob3dEcm9wZG93biA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgaWYgKEV2ZW50SGFuZGxlclV0aWwudHJpZ2dlcih0aGlzLmVsZW1lbnQsICdrdC5tZW51LmRyb3Bkb3duLnNob3cnKSA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGlkZSBhbGwgY3VycmVudGx5IHNob3duIGRyb3Bkb3ducyBleGNlcHQgY3VycmVudCBvbmVcclxuICAgIE1lbnVDb21wb25lbnQuaGlkZURyb3Bkb3ducyhpdGVtKVxyXG5cclxuICAgIC8vIGNvbnN0IHRvZ2dsZSA9IHRoaXMuX2lzVHJpZ2dlckVsZW1lbnQoaXRlbSkgPyBpdGVtIDogdGhpcy5fZ2V0SXRlbUxpbmtFbGVtZW50KGl0ZW0pO1xyXG4gICAgY29uc3Qgc3ViID0gdGhpcy5fZ2V0SXRlbVN1YkVsZW1lbnQoaXRlbSlcclxuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5fZ2V0SXRlbU9wdGlvbihpdGVtLCAnd2lkdGgnKVxyXG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5fZ2V0SXRlbU9wdGlvbihpdGVtLCAnaGVpZ2h0JylcclxuXHJcbiAgICBsZXQgemluZGV4ID0gdGhpcy5vcHRpb25zLmRyb3Bkb3duLnppbmRleFxyXG4gICAgY29uc3QgcGFyZW50WmluZGV4ID0gZ2V0SGlnaGVzdFppbmRleChpdGVtKSAvLyB1cGRhdGVcclxuICAgIC8vIEFwcGx5IGEgbmV3IHotaW5kZXggaWYgZHJvcGRvd24ncyB0b2dnbGUgZWxlbWVudCBvciBpdCdzIHBhcmVudCBoYXMgZ3JlYXRlciB6LWluZGV4IC8vIHVwZGF0ZVxyXG4gICAgaWYgKHBhcmVudFppbmRleCAhPT0gbnVsbCAmJiBwYXJlbnRaaW5kZXggPj0gemluZGV4KSB7XHJcbiAgICAgIHppbmRleCA9IHBhcmVudFppbmRleCArIDFcclxuICAgIH1cclxuXHJcbiAgICBpZiAoemluZGV4KSB7XHJcbiAgICAgIEVsZW1lbnRTdHlsZVV0aWwuc2V0KHN1YiwgJ3otaW5kZXgnLCB6aW5kZXgpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpZHRoKSB7XHJcbiAgICAgIEVsZW1lbnRTdHlsZVV0aWwuc2V0KHN1YiwgJ3dpZHRoJywgd2lkdGgpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhlaWdodCkge1xyXG4gICAgICBFbGVtZW50U3R5bGVVdGlsLnNldChzdWIsICdoZWlnaHQnLCBoZWlnaHQpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbml0RHJvcGRvd25Qb3BwZXIoaXRlbSwgc3ViKVxyXG5cclxuICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgnc2hvdycpXHJcbiAgICBpdGVtLmNsYXNzTGlzdC5hZGQoJ21lbnUtZHJvcGRvd24nKVxyXG4gICAgc3ViLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKVxyXG5cclxuICAgIC8vIEFwcGVuZCB0aGUgc3ViIHRoZSB0aGUgcm9vdCBvZiB0aGUgbWVudVxyXG4gICAgaWYgKHRoaXMuX2dldEl0ZW1PcHRpb24oaXRlbSwgJ292ZXJmbG93JykgPT09IHRydWUpIHtcclxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzdWIpXHJcbiAgICAgIERhdGFVdGlsLnNldChpdGVtLCAnc3ViJywgc3ViKVxyXG4gICAgICBEYXRhVXRpbC5zZXQoc3ViLCAnaXRlbScsIGl0ZW0pXHJcbiAgICAgIERhdGFVdGlsLnNldChzdWIsICdtZW51JywgdGhpcylcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIERhdGFVdGlsLnNldChzdWIsICdpdGVtJywgaXRlbSlcclxuICAgIH1cclxuXHJcbiAgICBFdmVudEhhbmRsZXJVdGlsLnRyaWdnZXIodGhpcy5lbGVtZW50LCAna3QubWVudS5kcm9wZG93bi5zaG93bicpXHJcbiAgfVxyXG5cclxuICAvLyBJbml0IGRyb3Bkb3duIHBvcHBlcihuZXcpXHJcbiAgcHJpdmF0ZSBpbml0RHJvcGRvd25Qb3BwZXIgPSAoaXRlbTogSFRNTEVsZW1lbnQsIHN1YjogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIC8vIFNldHVwIHBvcHBlciBpbnN0YW5jZVxyXG4gICAgbGV0IHJlZmVyZW5jZVxyXG4gICAgY29uc3QgYXR0YWNoID0gdGhpcy5fZ2V0SXRlbU9wdGlvbihpdGVtLCAnYXR0YWNoJykgYXMgc3RyaW5nXHJcblxyXG4gICAgaWYgKGF0dGFjaCkge1xyXG4gICAgICBpZiAoYXR0YWNoID09PSAncGFyZW50Jykge1xyXG4gICAgICAgIHJlZmVyZW5jZSA9IGl0ZW0ucGFyZW50Tm9kZVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlZmVyZW5jZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYXR0YWNoKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZWZlcmVuY2UgPSBpdGVtXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlZmVyZW5jZSkge1xyXG4gICAgICBjb25zdCBwb3BwZXIgPSBjcmVhdGVQb3BwZXIoXHJcbiAgICAgICAgcmVmZXJlbmNlIGFzIEVsZW1lbnQgfCBWaXJ0dWFsRWxlbWVudCxcclxuICAgICAgICBzdWIsXHJcbiAgICAgICAgdGhpcy5fZ2V0RHJvcGRvd25Qb3BwZXJDb25maWcoaXRlbSlcclxuICAgICAgKVxyXG4gICAgICBEYXRhVXRpbC5zZXQoaXRlbSwgJ3BvcHBlcicsIHBvcHBlcilcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEhpZGUgaXRlbSBkcm9wZG93blxyXG4gIHByaXZhdGUgX2hpZGVEcm9wZG93biA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgaWYgKEV2ZW50SGFuZGxlclV0aWwudHJpZ2dlcih0aGlzLmVsZW1lbnQsICdrdC5tZW51LmRyb3Bkb3duLmhpZGUnKSA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3ViID0gdGhpcy5fZ2V0SXRlbVN1YkVsZW1lbnQoaXRlbSlcclxuICAgIEVsZW1lbnRTdHlsZVV0aWwuc2V0KHN1YiwgJ3otaW5kZXgnLCAnJylcclxuICAgIEVsZW1lbnRTdHlsZVV0aWwuc2V0KHN1YiwgJ3dpZHRoJywgJycpXHJcbiAgICBFbGVtZW50U3R5bGVVdGlsLnNldChzdWIsICdoZWlnaHQnLCAnJylcclxuICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpXHJcbiAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ21lbnUtZHJvcGRvd24nKVxyXG4gICAgc3ViLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKVxyXG5cclxuICAgIC8vIEFwcGVuZCB0aGUgc3ViIGJhY2sgdG8gaXQncyBwYXJlbnRcclxuICAgIGlmICh0aGlzLl9nZXRJdGVtT3B0aW9uKGl0ZW0sICdvdmVyZmxvdycpID09PSB0cnVlKSB7XHJcbiAgICAgIGlmIChpdGVtLmNsYXNzTGlzdC5jb250YWlucygnbWVudS1pdGVtJykpIHtcclxuICAgICAgICBpdGVtLmFwcGVuZENoaWxkKHN1YilcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpbnNlcnRBZnRlckVsZW1lbnQodGhpcy5lbGVtZW50LCBpdGVtKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBEYXRhVXRpbC5yZW1vdmUoaXRlbSwgJ3N1YicpXHJcbiAgICAgIERhdGFVdGlsLnJlbW92ZShzdWIsICdpdGVtJylcclxuICAgICAgRGF0YVV0aWwucmVtb3ZlKHN1YiwgJ21lbnUnKVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChEYXRhVXRpbC5oYXMoaXRlbSwgJ3BvcHBlcicpID09PSB0cnVlKSB7XHJcbiAgICAgIERhdGFVdGlsLmdldChpdGVtLCAncG9wcGVyJykuZGVzdHJveSgpXHJcbiAgICAgIERhdGFVdGlsLnJlbW92ZShpdGVtLCAncG9wcGVyJylcclxuICAgIH1cclxuXHJcbiAgICAvLyBEZXN0cm95IHBvcHBlcihuZXcpXHJcbiAgICB0aGlzLmRlc3Ryb3lEcm9wZG93blBvcHBlcihpdGVtKVxyXG4gICAgRXZlbnRIYW5kbGVyVXRpbC50cmlnZ2VyKHRoaXMuZWxlbWVudCwgJ2t0Lm1lbnUuZHJvcGRvd24uaGlkZGVuJylcclxuICB9XHJcblxyXG4gIC8vIERlc3Ryb3kgZHJvcGRvd24gcG9wcGVyKG5ldylcclxuICBwcml2YXRlIGRlc3Ryb3lEcm9wZG93blBvcHBlciA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgaWYgKERhdGFVdGlsLmhhcyhpdGVtLCAncG9wcGVyJykgPT09IHRydWUpIHtcclxuICAgICAgRGF0YVV0aWwuZ2V0KGl0ZW0sICdwb3BwZXInKS5kZXN0cm95KClcclxuICAgICAgRGF0YVV0aWwucmVtb3ZlKGl0ZW0sICdwb3BwZXInKVxyXG4gICAgfVxyXG5cclxuICAgIEV2ZW50SGFuZGxlclV0aWwudHJpZ2dlcih0aGlzLmVsZW1lbnQsICdrdC5tZW51LmRyb3Bkb3duLmhpZGRlbicpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zaG93QWNjb3JkaW9uID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICBpZiAoRXZlbnRIYW5kbGVyVXRpbC50cmlnZ2VyKHRoaXMuZWxlbWVudCwgJ2t0Lm1lbnUuYWNjb3JkaW9uLnNob3cnKSA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hY2NvcmRpb24uZXhwYW5kID09PSBmYWxzZSkge1xyXG4gICAgICB0aGlzLl9oaWRlQWNjb3JkaW9ucyhpdGVtKVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChEYXRhVXRpbC5oYXMoaXRlbSwgJ3BvcHBlcicpID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuX2hpZGVEcm9wZG93bihpdGVtKVxyXG4gICAgfVxyXG5cclxuICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgnaG92ZXInKSAvLyB1cGRhdGVXV1xyXG4gICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdzaG93aW5nJylcclxuXHJcbiAgICBjb25zdCBzdWJFbGVtZW50ID0gdGhpcy5fZ2V0SXRlbVN1YkVsZW1lbnQoaXRlbSlcclxuICAgIGlmIChzdWJFbGVtZW50KSB7XHJcbiAgICAgIGNvbnN0IHN1YiA9IHN1YkVsZW1lbnQgYXMgSFRNTEVsZW1lbnRcclxuICAgICAgRWxlbWVudEFuaW1hdGVVdGlsLnNsaWRlRG93bihzdWIsIHRoaXMub3B0aW9ucy5hY2NvcmRpb24uc2xpZGVTcGVlZCwgKCkgPT4ge1xyXG4gICAgICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnc2hvd2luZycpXHJcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdzaG93JylcclxuICAgICAgICBzdWIuY2xhc3NMaXN0LmFkZCgnc2hvdycpXHJcbiAgICAgICAgRXZlbnRIYW5kbGVyVXRpbC50cmlnZ2VyKHRoaXMuZWxlbWVudCwgJ2t0Lm1lbnUuYWNjb3JkaW9uLnNob3duJylcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hpZGVBY2NvcmRpb24gPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIGlmIChFdmVudEhhbmRsZXJVdGlsLnRyaWdnZXIodGhpcy5lbGVtZW50LCAna3QubWVudS5hY2NvcmRpb24uaGlkZScpID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdWIgPSB0aGlzLl9nZXRJdGVtU3ViRWxlbWVudChpdGVtKVxyXG4gICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdoaWRpbmcnKVxyXG5cclxuICAgIGlmIChzdWIpIHtcclxuICAgICAgRWxlbWVudEFuaW1hdGVVdGlsLnNsaWRlVXAoc3ViLCB0aGlzLm9wdGlvbnMuYWNjb3JkaW9uLnNsaWRlU3BlZWQsICgpID0+IHtcclxuICAgICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGluZycpXHJcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JylcclxuICAgICAgICBzdWIuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpXHJcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdob3ZlcicpIC8vIHVwZGF0ZVxyXG4gICAgICAgIEV2ZW50SGFuZGxlclV0aWwudHJpZ2dlcih0aGlzLmVsZW1lbnQsICdrdC5tZW51LmFjY29yZGlvbi5oaWRkZW4nKVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gSGlkZSBhbGwgc2hvd24gYWNjb3JkaW9ucyBvZiBpdGVtXHJcbiAgcHJpdmF0ZSBfaGlkZUFjY29yZGlvbnMgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIGNvbnN0IGl0ZW1zVG9IaWRlID0gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zaG93W2RhdGEta3QtbWVudS10cmlnZ2VyXScpXHJcbiAgICBpZiAoaXRlbXNUb0hpZGUgJiYgaXRlbXNUb0hpZGUubGVuZ3RoID4gMCkge1xyXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaXRlbXNUb0hpZGUubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICBjb25zdCBpdGVtVG9IaWRlID0gaXRlbXNUb0hpZGVbaV0gYXMgSFRNTEVsZW1lbnRcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGhpcy5fZ2V0SXRlbVN1YlR5cGUoaXRlbVRvSGlkZSkgPT09ICdhY2NvcmRpb24nICYmXHJcbiAgICAgICAgICBpdGVtVG9IaWRlICE9PSBpdGVtICYmXHJcbiAgICAgICAgICBpdGVtLmNvbnRhaW5zKGl0ZW1Ub0hpZGUpID09PSBmYWxzZSAmJlxyXG4gICAgICAgICAgaXRlbVRvSGlkZS5jb250YWlucyhpdGVtKSA9PT0gZmFsc2VcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuX2hpZGVBY2NvcmRpb24oaXRlbVRvSGlkZSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEV2ZW50IEhhbmRsZXJzXHJcbiAgLy8gUmVzZXQgaXRlbSBzdGF0ZSBjbGFzc2VzIGlmIGl0ZW0gc3ViIHR5cGUgY2hhbmdlZFxyXG4gIHByaXZhdGUgX3Jlc2V0ID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICBpZiAodGhpcy5faGFzSXRlbVN1YihpdGVtKSA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3ViID0gdGhpcy5fZ2V0SXRlbVN1YkVsZW1lbnQoaXRlbSlcclxuXHJcbiAgICAvLyBSZXNldCBzdWIgc3RhdGUgaWYgc3ViIHR5cGUgaXMgY2hhbmdlZCBkdXJpbmcgdGhlIHdpbmRvdyByZXNpemVcclxuICAgIGlmIChEYXRhVXRpbC5oYXMoaXRlbSwgJ3R5cGUnKSAmJiBEYXRhVXRpbC5nZXQoaXRlbSwgJ3R5cGUnKSAhPT0gdGhpcy5fZ2V0SXRlbVN1YlR5cGUoaXRlbSkpIHtcclxuICAgICAgLy8gdXBkYXRlZFxyXG4gICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ2hvdmVyJylcclxuICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JylcclxuICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JylcclxuICAgICAgaWYgKHN1YiAmJiBzdWIucmVtb3ZlQ2xhc3MpIHtcclxuICAgICAgICBzdWIucmVtb3ZlQ2xhc3Moc3ViLCAnc2hvdycpXHJcbiAgICAgIH1cclxuICAgIH0gLy8gdXBkYXRlZFxyXG4gIH1cclxuXHJcbiAgLy8gVE9ETzogbm90IGRvbmVcclxuICBwcml2YXRlIF9kZXN0cm95ID0gKCkgPT4ge31cclxuXHJcbiAgLy8gVXBkYXRlIGFsbCBpdGVtIHN0YXRlIGNsYXNzZXMgaWYgaXRlbSBzdWIgdHlwZSBjaGFuZ2VkXHJcbiAgcHJpdmF0ZSBfdXBkYXRlID0gKCkgPT4ge1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1lbnUtaXRlbVtkYXRhLWt0LW1lbnUtdHJpZ2dlcl0nKVxyXG4gICAgaXRlbXMuZm9yRWFjaCgoZWwpID0+IHRoaXMuX3Jlc2V0KGVsIGFzIEhUTUxFbGVtZW50KSlcclxuICB9XHJcblxyXG4gIC8vIEhpZGUgaXRlbSBzdWJcclxuICBwcml2YXRlIF9oaWRlID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2lzSXRlbVN1YlNob3duKGl0ZW0pID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fZ2V0SXRlbVN1YlR5cGUoaXRlbSkgPT09ICdkcm9wZG93bicpIHtcclxuICAgICAgdGhpcy5faGlkZURyb3Bkb3duKGl0ZW0pXHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2dldEl0ZW1TdWJUeXBlKGl0ZW0pID09PSAnYWNjb3JkaW9uJykge1xyXG4gICAgICB0aGlzLl9oaWRlQWNjb3JkaW9uKGl0ZW0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBTaG93IGl0ZW0gc3ViXHJcbiAgcHJpdmF0ZSBfc2hvdyA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9pc0l0ZW1TdWJTaG93bihpdGVtKSA9PT0gdHJ1ZSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fZ2V0SXRlbVN1YlR5cGUoaXRlbSkgPT09ICdkcm9wZG93bicpIHtcclxuICAgICAgdGhpcy5fc2hvd0Ryb3Bkb3duKGl0ZW0pIC8vIC8vIHNob3cgY3VycmVudCBkcm9wZG93blxyXG4gICAgfSBlbHNlIGlmICh0aGlzLl9nZXRJdGVtU3ViVHlwZShpdGVtKSA9PT0gJ2FjY29yZGlvbicpIHtcclxuICAgICAgdGhpcy5fc2hvd0FjY29yZGlvbihpdGVtKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlbWVtYmVyIGxhc3Qgc3VibWVudSB0eXBlXHJcblxyXG4gICAgRGF0YVV0aWwuc2V0KGl0ZW0sICd0eXBlJywgdGhpcy5fZ2V0SXRlbVN1YlR5cGUoaXRlbSkpIC8vIHVwZGF0ZWRcclxuICB9XHJcblxyXG4gIC8vIFRvZ2dsZSBpdGVtIHN1YlxyXG4gIHByaXZhdGUgX3RvZ2dsZSA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9pc0l0ZW1TdWJTaG93bihpdGVtKSA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLl9oaWRlKGl0ZW0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zaG93KGl0ZW0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBNb3VzZW91dCBoYW5kbGVcclxuICBwcml2YXRlIF9tb3VzZW91dCA9IChlbGVtZW50OiBIVE1MRWxlbWVudCwgZTogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuX2dldEl0ZW1FbGVtZW50KGVsZW1lbnQpXHJcbiAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2dldEl0ZW1PcHRpb24oaXRlbSwgJ3RyaWdnZXInKSAhPT0gJ2hvdmVyJykge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmIChEYXRhVXRpbC5nZXQoaXRlbSwgJ2hvdmVyJykgPT09ICcxJykge1xyXG4gICAgICAgIHRoaXMuX2hpZGUoaXRlbSlcclxuICAgICAgfVxyXG4gICAgfSwgdGhpcy5vcHRpb25zLmRyb3Bkb3duLmhvdmVyVGltZW91dClcclxuXHJcbiAgICBEYXRhVXRpbC5zZXQoaXRlbSwgJ2hvdmVyJywgJzEnKVxyXG4gICAgRGF0YVV0aWwuc2V0KGl0ZW0sICd0aW1lb3V0JywgdGltZW91dClcclxuICB9XHJcblxyXG4gIC8vIE1vdXNlb3ZlciBoYW5kbGVcclxuICBwcml2YXRlIF9tb3VzZW92ZXIgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQsIGU6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9nZXRJdGVtRWxlbWVudChlbGVtZW50KVxyXG4gICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9nZXRJdGVtT3B0aW9uKGl0ZW0sICd0cmlnZ2VyJykgIT09ICdob3ZlcicpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKERhdGFVdGlsLmdldChpdGVtLCAnaG92ZXInKSA9PT0gJzEnKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dChEYXRhVXRpbC5nZXQoaXRlbSwgJ3RpbWVvdXQnKSlcclxuICAgICAgRGF0YVV0aWwucmVtb3ZlKGl0ZW0sICdob3ZlcicpXHJcbiAgICAgIERhdGFVdGlsLnJlbW92ZShpdGVtLCAndGltZW91dCcpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fc2hvdyhpdGVtKVxyXG4gIH1cclxuXHJcbiAgLy8gRGlzbWlzcyBoYW5kbGVyXHJcbiAgcHJpdmF0ZSBfZGlzbWlzcyA9IChlbGVtZW50OiBIVE1MRWxlbWVudCwgZTogRXZlbnQpID0+IHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9nZXRJdGVtRWxlbWVudChlbGVtZW50KVxyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLl9nZXRJdGVtQ2hpbGRFbGVtZW50cyhpdGVtKVxyXG4gICAgLy9pZiAoIGl0ZW0gIT09IG51bGwgJiYgX2dldEl0ZW1PcHRpb24oaXRlbSwgJ3RyaWdnZXInKSA9PT0gJ2NsaWNrJyAmJiAgX2dldEl0ZW1TdWJUeXBlKGl0ZW0pID09PSAnZHJvcGRvd24nICkge1xyXG4gICAgY29uc3QgaXRlbVN1YlR5cGUgPSB0aGlzLl9nZXRJdGVtU3ViVHlwZShpdGVtKVxyXG4gICAgaWYgKGl0ZW0gIT09IG51bGwgJiYgaXRlbVN1YlR5cGUgPT09ICdkcm9wZG93bicpIHtcclxuICAgICAgdGhpcy5faGlkZShpdGVtKSAvLyBoaWRlIGl0ZW1zIGRyb3Bkb3duXHJcblxyXG4gICAgICAvLyBIaWRlIGFsbCBjaGlsZCBlbGVtZW50cyBhcyB3ZWxsXHJcbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAvL2lmICggX2dldEl0ZW1PcHRpb24oaXRlbSwgJ3RyaWdnZXInKSA9PT0gJ2NsaWNrJyAmJiAgX2dldEl0ZW1TdWJUeXBlKGl0ZW0pID09PSAnZHJvcGRvd24nICkge1xyXG4gICAgICAgICAgaWYgKGl0ZW1zW2ldICE9PSBudWxsICYmIHRoaXMuX2dldEl0ZW1TdWJUeXBlKGl0ZW1zW2ldIGFzIEhUTUxFbGVtZW50KSA9PT0gJ2Ryb3Bkb3duJykge1xyXG4gICAgICAgICAgICB0aGlzLl9oaWRlKGl0ZW1zW2ldIGFzIEhUTUxFbGVtZW50KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gTGluayBoYW5kbGVyXHJcbiAgcHJpdmF0ZSBfbGluayA9IChlbGVtZW50OiBIVE1MRWxlbWVudCwgZTogRXZlbnQpID0+IHtcclxuICAgIGlmIChFdmVudEhhbmRsZXJVdGlsLnRyaWdnZXIodGhpcy5lbGVtZW50LCAna3QubWVudS5saW5rLmNsaWNrJykgPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIC8vIERpc21pc3MgYWxsIHNob3duIGRyb3Bkb3duc1xyXG4gICAgTWVudUNvbXBvbmVudC5oaWRlRHJvcGRvd25zKHVuZGVmaW5lZClcclxuICAgIEV2ZW50SGFuZGxlclV0aWwudHJpZ2dlcih0aGlzLmVsZW1lbnQsICdrdC5tZW51LmxpbmsuY2xpY2tlZCcpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jbGljayA9IChlbGVtZW50OiBIVE1MRWxlbWVudCwgZTogRXZlbnQpID0+IHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuX2dldEl0ZW1FbGVtZW50KGVsZW1lbnQpXHJcbiAgICBpZiAodGhpcy5fZ2V0SXRlbU9wdGlvbihpdGVtLCAndHJpZ2dlcicpICE9PSAnY2xpY2snKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9nZXRJdGVtT3B0aW9uKGl0ZW0sICd0b2dnbGUnKSA9PT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5fc2hvdyhpdGVtKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fdG9nZ2xlKGl0ZW0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gIC8vICoqIFB1YmxpYyBBUEkgICoqIC8vXHJcbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICBwdWJsaWMgY2xpY2sgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQsIGU6IEV2ZW50KSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2xpY2soZWxlbWVudCwgZSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsaW5rID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBlOiBFdmVudCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xpbmsoZWxlbWVudCwgZSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNtaXNzID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBlOiBFdmVudCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc21pc3MoZWxlbWVudCwgZSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3VzZW92ZXIgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQsIGU6IEV2ZW50KSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbW91c2VvdmVyKGVsZW1lbnQsIGUgYXMgTW91c2VFdmVudClcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3VzZW91dCA9IChlbGVtZW50OiBIVE1MRWxlbWVudCwgZTogRXZlbnQpID0+IHtcclxuICAgIHJldHVybiB0aGlzLl9tb3VzZW91dChlbGVtZW50LCBlIGFzIE1vdXNlRXZlbnQpXHJcbiAgfVxyXG5cclxuICAvLyBHZW5lcmFsIE1ldGhvZHNcclxuICBwdWJsaWMgZ2V0SXRlbVRyaWdnZXJUeXBlID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZ2V0SXRlbU9wdGlvbihpdGVtLCAndHJpZ2dlcicpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SXRlbVN1YlR5cGUgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIHJldHVybiB0aGlzLl9nZXRJdGVtU3ViVHlwZShlbGVtZW50KVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3cgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIHJldHVybiB0aGlzLl9zaG93KGl0ZW0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGlkZSA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hpZGUoaXRlbSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldCA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Jlc2V0KGl0ZW0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSgpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RWxlbWVudCA9ICgpID0+IHtcclxuICAgIHJldHVybiB0aGlzLmVsZW1lbnRcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRJdGVtTGlua0VsZW1lbnQgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIHJldHVybiB0aGlzLl9nZXRJdGVtTGlua0VsZW1lbnQoaXRlbSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRJdGVtVG9nZ2xlRWxlbWVudCA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2dldEl0ZW1Ub2dnbGVFbGVtZW50KGl0ZW0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SXRlbVN1YkVsZW1lbnQgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIHJldHVybiB0aGlzLl9nZXRJdGVtU3ViRWxlbWVudChpdGVtKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEl0ZW1QYXJlbnRFbGVtZW50cyA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2dldEl0ZW1QYXJlbnRFbGVtZW50cyhpdGVtKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzSXRlbVN1YlNob3duID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNJdGVtU3ViU2hvd24oaXRlbSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0l0ZW1QYXJlbnRTaG93biA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzSXRlbVBhcmVudFNob3duKGl0ZW0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VHJpZ2dlckVsZW1lbnQgPSAoKSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy50cmlnZ2VyRWxlbWVudFxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzSXRlbURyb3Bkb3duUGVybWFuZW50ID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNJdGVtRHJvcGRvd25QZXJtYW5lbnQoaXRlbSlcclxuICB9XHJcblxyXG4gIC8vIEFjY29yZGlvbiBNb2RlIE1ldGhvZHNcclxuICBwdWJsaWMgaGlkZUFjY29yZGlvbnMgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIHJldHVybiB0aGlzLl9oaWRlQWNjb3JkaW9ucyhpdGVtKVxyXG4gIH1cclxuXHJcbiAgLy8gRXZlbnQgQVBJXHJcbiAgcHVibGljIG9uID0gKG5hbWU6IHN0cmluZywgaGFuZGxlcjogYW55KSA9PiB7XHJcbiAgICByZXR1cm4gRXZlbnRIYW5kbGVyVXRpbC5vbih0aGlzLmVsZW1lbnQsIG5hbWUsIGhhbmRsZXIpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25lID0gKG5hbWU6IHN0cmluZywgaGFuZGxlcjogYW55KSA9PiB7XHJcbiAgICByZXR1cm4gRXZlbnRIYW5kbGVyVXRpbC5vbmUodGhpcy5lbGVtZW50LCBuYW1lLCBoYW5kbGVyKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9mZiA9IChuYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiBFdmVudEhhbmRsZXJVdGlsLm9mZih0aGlzLmVsZW1lbnQsIG5hbWUpXHJcbiAgfVxyXG5cclxuICAvLyBwdWJsaWMgc3RhdGljIG1ldGhvZHNcclxuICAvLyBHZXQgS1RNZW51IGluc3RhbmNlIGJ5IGVsZW1lbnRcclxuICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICAvLyBFbGVtZW50IGhhcyBtZW51IERPTSByZWZlcmVuY2UgaW4gaXQncyBEQVRBIHN0b3JhZ2VcclxuICAgIGNvbnN0IGVsZW1lbnRNZW51ID0gRGF0YVV0aWwuZ2V0KGVsZW1lbnQsICdtZW51JylcclxuICAgIGlmIChlbGVtZW50TWVudSkge1xyXG4gICAgICByZXR1cm4gZWxlbWVudE1lbnVcclxuICAgIH1cclxuXHJcbiAgICAvLyBFbGVtZW50IGhhcyAubWVudSBwYXJlbnRcclxuICAgIGNvbnN0IG1lbnUgPSBlbGVtZW50LmNsb3Nlc3QoJy5tZW51JylcclxuICAgIGlmIChtZW51KSB7XHJcbiAgICAgIGNvbnN0IG1lbnVEYXRhID0gRGF0YVV0aWwuZ2V0KG1lbnUgYXMgSFRNTEVsZW1lbnQsICdtZW51JylcclxuICAgICAgaWYgKG1lbnVEYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIG1lbnVEYXRhXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBFbGVtZW50IGhhcyBhIHBhcmVudCB3aXRoIERPTSByZWZlcmVuY2UgdG8gLm1lbnUgaW4gaXQncyBEQVRBIHN0b3JhZ2VcclxuICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbWVudS1saW5rJykpIHtcclxuICAgICAgY29uc3Qgc3ViID0gZWxlbWVudC5jbG9zZXN0KCcubWVudS1zdWInKVxyXG4gICAgICBpZiAoc3ViKSB7XHJcbiAgICAgICAgY29uc3Qgc3ViTWVudSA9IERhdGFVdGlsLmdldChzdWIgYXMgSFRNTEVsZW1lbnQsICdtZW51JylcclxuICAgICAgICBpZiAoc3ViTWVudSkge1xyXG4gICAgICAgICAgcmV0dXJuIHN1Yk1lbnVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxuXHJcbiAgLy8gSGlkZSBhbGwgZHJvcGRvd25zIGFuZCBza2lwIG9uZSBpZiBwcm92aWRlZFxyXG4gIHB1YmxpYyBzdGF0aWMgaGlkZURyb3Bkb3ducyA9IChza2lwOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCkgPT4ge1xyXG4gICAgY29uc3QgaXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2hvdy5tZW51LWRyb3Bkb3duW2RhdGEta3QtbWVudS10cmlnZ2VyXScpXHJcblxyXG4gICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldXHJcbiAgICAgICAgY29uc3QgbWVudSA9IE1lbnVDb21wb25lbnQuZ2V0SW5zdGFuY2UoaXRlbSBhcyBIVE1MRWxlbWVudClcclxuXHJcbiAgICAgICAgaWYgKG1lbnUgJiYgbWVudS5nZXRJdGVtU3ViVHlwZShpdGVtKSA9PT0gJ2Ryb3Bkb3duJykge1xyXG4gICAgICAgICAgaWYgKHNraXApIHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIG1lbnUuZ2V0SXRlbVN1YkVsZW1lbnQoaXRlbSkuY29udGFpbnMoc2tpcCkgPT09IGZhbHNlICYmXHJcbiAgICAgICAgICAgICAgaXRlbS5jb250YWlucyhza2lwKSA9PT0gZmFsc2UgJiZcclxuICAgICAgICAgICAgICBpdGVtICE9PSBza2lwXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIG1lbnUuaGlkZShpdGVtKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtZW51LmhpZGUoaXRlbSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlRHJvcGRvd25zID0gKCkgPT4ge1xyXG4gICAgY29uc3QgaXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2hvdy5tZW51LWRyb3Bkb3duW2RhdGEta3QtbWVudS10cmlnZ2VyXScpXHJcbiAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zW2ldXHJcblxyXG4gICAgICAgIGlmIChEYXRhVXRpbC5oYXMoaXRlbSBhcyBIVE1MRWxlbWVudCwgJ3BvcHBlcicpKSB7XHJcbiAgICAgICAgICBEYXRhVXRpbC5nZXQoaXRlbSBhcyBIVE1MRWxlbWVudCwgJ3BvcHBlcicpLmZvcmNlVXBkYXRlKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEdsb2JhbCBoYW5kbGVyc1xyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlSW5zdGFuY2VzID0gKHNlbGVjdG9yOiBzdHJpbmcpID0+IHtcclxuICAgIC8vIEluaXRpYWxpemUgbWVudXNcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpLmZvckVhY2goKGVsKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lbnVJdGVtID0gZWwgYXMgSFRNTEVsZW1lbnRcclxuICAgICAgbGV0IG1lbnVJbnN0YW5jZSA9IE1lbnVDb21wb25lbnQuZ2V0SW5zdGFuY2UobWVudUl0ZW0pXHJcbiAgICAgIGlmICghbWVudUluc3RhbmNlKSB7XHJcbiAgICAgICAgbWVudUluc3RhbmNlID0gbmV3IE1lbnVDb21wb25lbnQoZWwgYXMgSFRNTEVsZW1lbnQsIGRlZmF1bHRNZW51T3B0aW9ucylcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgaW5pdEdsb2JhbEhhbmRsZXJzID0gKCkgPT4ge1xyXG4gICAgLy8gRHJvcGRvd24gaGFuZGxlclxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICBjb25zdCBtZW51SXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2hvdy5tZW51LWRyb3Bkb3duW2RhdGEta3QtbWVudS10cmlnZ2VyXScpXHJcbiAgICAgIGlmIChtZW51SXRlbXMgJiYgbWVudUl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lbnVJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgaXRlbSA9IG1lbnVJdGVtc1tpXSBhcyBIVE1MRWxlbWVudFxyXG4gICAgICAgICAgY29uc3QgbWVudU9iaiA9IE1lbnVDb21wb25lbnQuZ2V0SW5zdGFuY2UoaXRlbSkgYXMgTWVudUNvbXBvbmVudFxyXG4gICAgICAgICAgaWYgKG1lbnVPYmogJiYgbWVudU9iai5nZXRJdGVtU3ViVHlwZShpdGVtKSA9PT0gJ2Ryb3Bkb3duJykge1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICAgICAgICAgIGNvbnN0IG1lbnUgPSBtZW51T2JqLmdldEVsZW1lbnQoKVxyXG4gICAgICAgICAgICBjb25zdCBzdWIgPSBtZW51T2JqLmdldEl0ZW1TdWJFbGVtZW50KGl0ZW0pIGFzIEhUTUxFbGVtZW50XHJcbiAgICAgICAgICAgIGlmIChpdGVtID09PSBlLnRhcmdldCB8fCBpdGVtLmNvbnRhaW5zKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzdWIgJiYgKHN1YiA9PT0gZS50YXJnZXQgfHwgc3ViLmNvbnRhaW5zKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSkpIHtcclxuICAgICAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG1lbnVPYmouaGlkZShpdGVtKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICAvLyBTdWIgdG9nZ2xlIGhhbmRsZXJcclxuICAgIERPTUV2ZW50SGFuZGxlclV0aWwub24oXHJcbiAgICAgIGRvY3VtZW50LmJvZHksXHJcbiAgICAgICcubWVudS1pdGVtW2RhdGEta3QtbWVudS10cmlnZ2VyXSA+IC5tZW51LWxpbmssIFtkYXRhLWt0LW1lbnUtdHJpZ2dlcl06bm90KC5tZW51LWl0ZW0pOm5vdChbZGF0YS1rdC1tZW51LXRyaWdnZXI9XCJhdXRvXCJdKScsXHJcbiAgICAgICdjbGljaycsXHJcbiAgICAgIGZ1bmN0aW9uICh0aGlzOiBIVE1MRWxlbWVudCwgZTogRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBtZW51ID0gTWVudUNvbXBvbmVudC5nZXRJbnN0YW5jZSh0aGlzKSBhcyBNZW51Q29tcG9uZW50XHJcbiAgICAgICAgaWYgKG1lbnUpIHtcclxuICAgICAgICAgIHJldHVybiBtZW51LmNsaWNrKHRoaXMsIGUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApXHJcblxyXG4gICAgLy8gLy8gTGluayBoYW5kbGVyXHJcbiAgICBET01FdmVudEhhbmRsZXJVdGlsLm9uKFxyXG4gICAgICBkb2N1bWVudC5ib2R5LFxyXG4gICAgICAnLm1lbnUtaXRlbTpub3QoW2RhdGEta3QtbWVudS10cmlnZ2VyXSkgPiAubWVudS1saW5rJyxcclxuICAgICAgJ2NsaWNrJyxcclxuICAgICAgZnVuY3Rpb24gKHRoaXM6IEhUTUxFbGVtZW50LCBlOiBFdmVudCkge1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcclxuICAgICAgICBjb25zdCBtZW51ID0gTWVudUNvbXBvbmVudC5nZXRJbnN0YW5jZSh0aGlzKVxyXG4gICAgICAgIGlmIChtZW51ICYmIG1lbnUubGluaykge1xyXG4gICAgICAgICAgcmV0dXJuIG1lbnUubGluayh0aGlzLCBlKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKVxyXG5cclxuICAgIC8vIERpc21pc3MgaGFuZGxlclxyXG4gICAgRE9NRXZlbnRIYW5kbGVyVXRpbC5vbihcclxuICAgICAgZG9jdW1lbnQuYm9keSxcclxuICAgICAgJ1tkYXRhLWt0LW1lbnUtZGlzbWlzcz1cInRydWVcIl0nLFxyXG4gICAgICAnY2xpY2snLFxyXG4gICAgICBmdW5jdGlvbiAodGhpczogSFRNTEVsZW1lbnQsIGU6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgbWVudSA9IE1lbnVDb21wb25lbnQuZ2V0SW5zdGFuY2UodGhpcykgYXMgTWVudUNvbXBvbmVudFxyXG4gICAgICAgIGlmIChtZW51KSB7XHJcbiAgICAgICAgICByZXR1cm4gbWVudS5kaXNtaXNzKHRoaXMsIGUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApXHJcblxyXG4gICAgLy8gTW91c2VvdmVyIGhhbmRsZXJcclxuICAgIERPTUV2ZW50SGFuZGxlclV0aWwub24oXHJcbiAgICAgIGRvY3VtZW50LmJvZHksXHJcbiAgICAgICdbZGF0YS1rdC1tZW51LXRyaWdnZXJdLCAubWVudS1zdWInLFxyXG4gICAgICAnbW91c2VvdmVyJyxcclxuICAgICAgZnVuY3Rpb24gKHRoaXM6IEhUTUxFbGVtZW50LCBlOiBFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IG1lbnUgPSBNZW51Q29tcG9uZW50LmdldEluc3RhbmNlKHRoaXMpIGFzIE1lbnVDb21wb25lbnRcclxuICAgICAgICBpZiAobWVudSAmJiBtZW51LmdldEl0ZW1TdWJUeXBlKHRoaXMpID09PSAnZHJvcGRvd24nKSB7XHJcbiAgICAgICAgICByZXR1cm4gbWVudS5tb3VzZW92ZXIodGhpcywgZSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIClcclxuXHJcbiAgICAvLyBNb3VzZW91dCBoYW5kbGVyXHJcbiAgICBET01FdmVudEhhbmRsZXJVdGlsLm9uKFxyXG4gICAgICBkb2N1bWVudC5ib2R5LFxyXG4gICAgICAnW2RhdGEta3QtbWVudS10cmlnZ2VyXSwgLm1lbnUtc3ViJyxcclxuICAgICAgJ21vdXNlb3V0JyxcclxuICAgICAgZnVuY3Rpb24gKHRoaXM6IEhUTUxFbGVtZW50LCBlOiBFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IG1lbnUgPSBNZW51Q29tcG9uZW50LmdldEluc3RhbmNlKHRoaXMpIGFzIE1lbnVDb21wb25lbnRcclxuICAgICAgICBpZiAobWVudSAmJiBtZW51LmdldEl0ZW1TdWJUeXBlKHRoaXMpID09PSAnZHJvcGRvd24nKSB7XHJcbiAgICAgICAgICByZXR1cm4gbWVudS5tb3VzZW91dCh0aGlzLCBlKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKVxyXG5cclxuICAgIC8vIFJlc2l6ZSBoYW5kbGVyXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4ge1xyXG4gICAgICBsZXQgdGltZXJcclxuICAgICAgdGhyb3R0bGUoXHJcbiAgICAgICAgdGltZXIsXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgLy8gTG9jYXRlIGFuZCB1cGRhdGUgRHJhd2VyIGluc3RhbmNlcyBvbiB3aW5kb3cgcmVzaXplXHJcbiAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWt0LW1lbnU9XCJ0cnVlXCJdJylcclxuICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lbnUgPSBNZW51Q29tcG9uZW50LmdldEluc3RhbmNlKGVsIGFzIEhUTUxFbGVtZW50KVxyXG4gICAgICAgICAgICBpZiAobWVudSkge1xyXG4gICAgICAgICAgICAgIG1lbnUudXBkYXRlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9LFxyXG4gICAgICAgIDIwMFxyXG4gICAgICApXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBib290c3RyYXAgPSAoKSA9PiB7XHJcbiAgICBNZW51Q29tcG9uZW50LmluaXRHbG9iYWxIYW5kbGVycygpXHJcbiAgICBNZW51Q29tcG9uZW50LmNyZWF0ZUluc3RhbmNlcygnW2RhdGEta3QtbWVudT1cInRydWVcIl0nKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWluaXRpYWxpemF0aW9uID0gKCkgPT4ge1xyXG4gICAgTWVudUNvbXBvbmVudC5jcmVhdGVJbnN0YW5jZXMoJ1tkYXRhLWt0LW1lbnU9XCJ0cnVlXCJdJylcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlSW5zYW5jZSA9IChcclxuICAgIHNlbGVjdG9yOiBzdHJpbmcsXHJcbiAgICBvcHRpb25zOiBNZW51T3B0aW9ucyA9IGRlZmF1bHRNZW51T3B0aW9uc1xyXG4gICk6IE1lbnVDb21wb25lbnQgfCB1bmRlZmluZWQgPT4ge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcihzZWxlY3RvcilcclxuICAgIGlmICghZWxlbWVudCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50IGFzIEhUTUxFbGVtZW50XHJcbiAgICBsZXQgbWVudSA9IE1lbnVDb21wb25lbnQuZ2V0SW5zdGFuY2UoaXRlbSlcclxuICAgIGlmICghbWVudSkge1xyXG4gICAgICBtZW51ID0gbmV3IE1lbnVDb21wb25lbnQoaXRlbSwgb3B0aW9ucylcclxuICAgIH1cclxuICAgIHJldHVybiBtZW51XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQge01lbnVDb21wb25lbnQsIGRlZmF1bHRNZW51T3B0aW9uc31cclxuXHJcbiJdfQ==
1
+ import { createPopper } from '@popperjs/core';
2
+ import { getAttributeValueByBreakpoint, getElementChild, getElementParents, getHighestZindex, insertAfterElement, throttle } from "../_utils/DomHelpers";
3
+ import { EventHandlerUtil } from "../_utils/EventHandlerUtil";
4
+ import { DataUtil } from "../_utils/_DataUtil";
5
+ import { DOMEventHandlerUtil } from "../_utils/_DOMEventHandlerUtil";
6
+ import { ElementStyleUtil } from "../_utils/_ElementStyleUtil";
7
+ import { getUniqueIdWithPrefix } from "../_utils/_TypesHelpers";
8
+ import { ElementAnimateUtil } from '../_utils/ElementAnimateUtil';
9
+ const defaultMenuOptions = {
10
+ dropdown: {
11
+ hoverTimeout: 200,
12
+ zindex: 105,
13
+ },
14
+ accordion: {
15
+ slideSpeed: 250,
16
+ expand: false,
17
+ },
18
+ };
19
+ class MenuComponent {
20
+ constructor(_element, options) {
21
+ this.triggerElement = null;
22
+ // Set external trigger element
23
+ this._setTriggerElement = () => {
24
+ const target = document.querySelector(`[data-kt-menu-target="#${this.element.getAttribute('id')}"`);
25
+ if (target) {
26
+ this.triggerElement = target;
27
+ }
28
+ else if (this.element.closest('[data-kt-menu-trigger]')) {
29
+ this.triggerElement = this.element.closest('[data-kt-menu-trigger]');
30
+ }
31
+ else if (this.element.parentNode &&
32
+ getElementChild(this.element.parentNode, '[data-kt-menu-trigger]')) {
33
+ const child = getElementChild(this.element.parentNode, '[data-kt-menu-trigger]');
34
+ if (child) {
35
+ this.triggerElement = child;
36
+ }
37
+ }
38
+ if (this.triggerElement) {
39
+ DataUtil.set(this.triggerElement, 'menu', this);
40
+ }
41
+ };
42
+ // Test if menu has external trigger element
43
+ this._isTriggerElement = (item) => {
44
+ return this.triggerElement === item;
45
+ };
46
+ // Get item option(through html attributes)
47
+ this._getItemOption = (item, name) => {
48
+ let value = null;
49
+ if (item && item.hasAttribute('data-kt-menu-' + name)) {
50
+ const attr = item.getAttribute('data-kt-menu-' + name) || '';
51
+ value = getAttributeValueByBreakpoint(attr);
52
+ if (value !== null && String(value) === 'true') {
53
+ value = true;
54
+ }
55
+ else if (value !== null && String(value) === 'false') {
56
+ value = false;
57
+ }
58
+ }
59
+ return value;
60
+ };
61
+ // Get item element
62
+ this._getItemElement = (_element) => {
63
+ // Element is the external trigger element
64
+ if (this._isTriggerElement(_element)) {
65
+ return _element;
66
+ }
67
+ // Element has item toggler attribute
68
+ if (_element.hasAttribute('data-kt-menu-trigger')) {
69
+ return _element;
70
+ }
71
+ // Element has item DOM reference in it's data storage
72
+ const itemElement = DataUtil.get(_element, 'item');
73
+ if (itemElement) {
74
+ return itemElement;
75
+ }
76
+ // Item is parent of element
77
+ const item = _element.closest('.menu-item[data-kt-menu-trigger]');
78
+ if (item) {
79
+ return item;
80
+ }
81
+ // Element's parent has item DOM reference in it's data storage
82
+ const sub = _element.closest('.menu-sub');
83
+ if (sub) {
84
+ const subItem = DataUtil.get(sub, 'item');
85
+ if (subItem) {
86
+ return subItem;
87
+ }
88
+ }
89
+ };
90
+ // Get item parent element
91
+ this._getItemParentElement = (item) => {
92
+ const sub = item.closest('.menu-sub');
93
+ if (!sub) {
94
+ return null;
95
+ }
96
+ const subItem = DataUtil.get(sub, 'item');
97
+ if (subItem) {
98
+ return subItem;
99
+ }
100
+ const parentItem = sub.closest('.menu-item[data-kt-menu-trigger]');
101
+ if (sub && parentItem) {
102
+ return parentItem;
103
+ }
104
+ return null;
105
+ };
106
+ // Get item parent elements
107
+ this._getItemParentElements = (item) => {
108
+ const parents = [];
109
+ let parent;
110
+ let i = 0;
111
+ let buffer = item;
112
+ do {
113
+ parent = this._getItemParentElement(buffer);
114
+ if (parent) {
115
+ parents.push(parent);
116
+ buffer = parent;
117
+ }
118
+ i++;
119
+ } while (parent !== null && i < 20);
120
+ if (this.triggerElement) {
121
+ parents.unshift(this.triggerElement);
122
+ }
123
+ return parents;
124
+ };
125
+ // Prepare popper config for dropdown(see: https://popper.js.org/docs/v2/)
126
+ this._getDropdownPopperConfig = (item) => {
127
+ // Placement
128
+ const placementOption = this._getItemOption(item, 'placement');
129
+ let placement = 'right';
130
+ if (placementOption) {
131
+ placement = placementOption;
132
+ }
133
+ // Flip
134
+ const flipValue = this._getItemOption(item, 'flip');
135
+ const flip = flipValue ? flipValue.toString().split(',') : [];
136
+ // Offset
137
+ const offsetValue = this._getItemOption(item, 'offset');
138
+ const offset = offsetValue ? offsetValue.toString().split(',') : [];
139
+ // Strategy
140
+ const strategy = this._getItemOption(item, 'overflow') === true ? 'absolute' : 'fixed';
141
+ var altAxis = this._getItemOption(item, 'flip') !== false;
142
+ return {
143
+ placement: placement,
144
+ strategy: strategy,
145
+ modifiers: [{
146
+ name: 'offset',
147
+ options: {
148
+ offset: offset
149
+ }
150
+ }, {
151
+ name: 'preventOverflow',
152
+ options: {
153
+ altAxis: altAxis
154
+ }
155
+ }, {
156
+ name: 'flip',
157
+ options: {
158
+ flipVariations: false
159
+ }
160
+ }]
161
+ };
162
+ };
163
+ // Get item child element
164
+ this._getItemChildElement = (item) => {
165
+ let selector = item;
166
+ const subItem = DataUtil.get(item, 'sub');
167
+ if (subItem) {
168
+ selector = subItem;
169
+ }
170
+ if (selector) {
171
+ //element = selector.querySelector('.show.menu-item[data-kt-menu-trigger]');
172
+ const element = selector.querySelector('.menu-item[data-kt-menu-trigger]');
173
+ if (element) {
174
+ return element;
175
+ }
176
+ }
177
+ return null;
178
+ };
179
+ // Get item child elements
180
+ this._getItemChildElements = (item) => {
181
+ const children = [];
182
+ let child;
183
+ let i = 0;
184
+ let buffer = item;
185
+ do {
186
+ child = this._getItemChildElement(buffer);
187
+ if (child) {
188
+ children.push(child);
189
+ buffer = child;
190
+ }
191
+ i++;
192
+ } while (child !== null && i < 20);
193
+ return children;
194
+ };
195
+ // Get item sub element
196
+ this._getItemSubElement = (item) => {
197
+ if (!item) {
198
+ return null;
199
+ }
200
+ if (this._isTriggerElement(item)) {
201
+ return this.element;
202
+ }
203
+ if (item.classList.contains('menu-sub')) {
204
+ return item;
205
+ }
206
+ else if (DataUtil.has(item, 'sub')) {
207
+ return DataUtil.get(item, 'sub');
208
+ }
209
+ else {
210
+ return getElementChild(item, '.menu-sub');
211
+ }
212
+ };
213
+ this._getCss = (el, styleProp) => {
214
+ const defaultView = (el.ownerDocument || document).defaultView;
215
+ if (!defaultView) {
216
+ return '';
217
+ }
218
+ // sanitize property name to css notation
219
+ // (hyphen separated words eg. font-Size)
220
+ styleProp = styleProp.replace(/([A-Z])/g, '-$1').toLowerCase();
221
+ return defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);
222
+ };
223
+ // Get item sub type
224
+ this._getItemSubType = (element) => {
225
+ const sub = this._getItemSubElement(element);
226
+ if (sub && parseInt(this._getCss(sub, 'z-index')) > 0) {
227
+ return 'dropdown';
228
+ }
229
+ else {
230
+ return 'accordion';
231
+ }
232
+ };
233
+ // Test if item's sub is shown
234
+ this._isItemSubShown = (item) => {
235
+ let sub = this._getItemSubElement(item);
236
+ if (sub) {
237
+ if (this._getItemSubType(item) === 'dropdown') {
238
+ return sub.classList.contains('show') && sub.hasAttribute('data-popper-placement');
239
+ }
240
+ else {
241
+ return item.classList.contains('show');
242
+ }
243
+ }
244
+ return false;
245
+ };
246
+ // Test if item dropdown is permanent
247
+ this._isItemDropdownPermanent = (item) => {
248
+ return this._getItemOption(item, 'permanent') === true;
249
+ };
250
+ // Test if item's parent is shown
251
+ this._isItemParentShown = (item) => {
252
+ return getElementParents(item, '.menu-item.show').length > 0;
253
+ };
254
+ // Test of it is item sub element
255
+ this._isItemSubElement = (item) => {
256
+ return item.classList.contains('menu-sub');
257
+ };
258
+ // Test if item has sub
259
+ this._hasItemSub = (item) => {
260
+ return item.classList.contains('menu-item') && item.hasAttribute('data-kt-menu-trigger');
261
+ };
262
+ // Get link element
263
+ this._getItemLinkElement = (item) => {
264
+ return getElementChild(item, '.menu-link');
265
+ };
266
+ // Get toggle element
267
+ this._getItemToggleElement = (item) => {
268
+ if (this.triggerElement) {
269
+ return this.triggerElement;
270
+ }
271
+ return this._getItemLinkElement(item);
272
+ };
273
+ // Show item dropdown
274
+ this._showDropdown = (item) => {
275
+ if (EventHandlerUtil.trigger(this.element, 'kt.menu.dropdown.show') === false) {
276
+ return;
277
+ }
278
+ // Hide all currently shown dropdowns except current one
279
+ MenuComponent.hideDropdowns(item);
280
+ // const toggle = this._isTriggerElement(item) ? item : this._getItemLinkElement(item);
281
+ const sub = this._getItemSubElement(item);
282
+ const width = this._getItemOption(item, 'width');
283
+ const height = this._getItemOption(item, 'height');
284
+ let zindex = this.options.dropdown.zindex;
285
+ const parentZindex = getHighestZindex(item); // update
286
+ // Apply a new z-index if dropdown's toggle element or it's parent has greater z-index // update
287
+ if (parentZindex !== null && parentZindex >= zindex) {
288
+ zindex = parentZindex + 1;
289
+ }
290
+ if (zindex) {
291
+ ElementStyleUtil.set(sub, 'z-index', zindex);
292
+ }
293
+ if (width) {
294
+ ElementStyleUtil.set(sub, 'width', width);
295
+ }
296
+ if (height) {
297
+ ElementStyleUtil.set(sub, 'height', height);
298
+ }
299
+ this.initDropdownPopper(item, sub);
300
+ item.classList.add('show');
301
+ item.classList.add('menu-dropdown');
302
+ sub.classList.add('show');
303
+ // Append the sub the the root of the menu
304
+ if (this._getItemOption(item, 'overflow') === true) {
305
+ document.body.appendChild(sub);
306
+ DataUtil.set(item, 'sub', sub);
307
+ DataUtil.set(sub, 'item', item);
308
+ DataUtil.set(sub, 'menu', this);
309
+ }
310
+ else {
311
+ DataUtil.set(sub, 'item', item);
312
+ }
313
+ EventHandlerUtil.trigger(this.element, 'kt.menu.dropdown.shown');
314
+ };
315
+ // Init dropdown popper(new)
316
+ this.initDropdownPopper = (item, sub) => {
317
+ // Setup popper instance
318
+ let reference;
319
+ const attach = this._getItemOption(item, 'attach');
320
+ if (attach) {
321
+ if (attach === 'parent') {
322
+ reference = item.parentNode;
323
+ }
324
+ else {
325
+ reference = document.querySelector(attach);
326
+ }
327
+ }
328
+ else {
329
+ reference = item;
330
+ }
331
+ if (reference) {
332
+ const popper = createPopper(reference, sub, this._getDropdownPopperConfig(item));
333
+ DataUtil.set(item, 'popper', popper);
334
+ }
335
+ };
336
+ // Hide item dropdown
337
+ this._hideDropdown = (item) => {
338
+ if (EventHandlerUtil.trigger(this.element, 'kt.menu.dropdown.hide') === false) {
339
+ return;
340
+ }
341
+ const sub = this._getItemSubElement(item);
342
+ ElementStyleUtil.set(sub, 'z-index', '');
343
+ ElementStyleUtil.set(sub, 'width', '');
344
+ ElementStyleUtil.set(sub, 'height', '');
345
+ item.classList.remove('show');
346
+ item.classList.remove('menu-dropdown');
347
+ sub.classList.remove('show');
348
+ // Append the sub back to it's parent
349
+ if (this._getItemOption(item, 'overflow') === true) {
350
+ if (item.classList.contains('menu-item')) {
351
+ item.appendChild(sub);
352
+ }
353
+ else {
354
+ insertAfterElement(this.element, item);
355
+ }
356
+ DataUtil.remove(item, 'sub');
357
+ DataUtil.remove(sub, 'item');
358
+ DataUtil.remove(sub, 'menu');
359
+ }
360
+ if (DataUtil.has(item, 'popper') === true) {
361
+ DataUtil.get(item, 'popper').destroy();
362
+ DataUtil.remove(item, 'popper');
363
+ }
364
+ // Destroy popper(new)
365
+ this.destroyDropdownPopper(item);
366
+ EventHandlerUtil.trigger(this.element, 'kt.menu.dropdown.hidden');
367
+ };
368
+ // Destroy dropdown popper(new)
369
+ this.destroyDropdownPopper = (item) => {
370
+ if (DataUtil.has(item, 'popper') === true) {
371
+ DataUtil.get(item, 'popper').destroy();
372
+ DataUtil.remove(item, 'popper');
373
+ }
374
+ EventHandlerUtil.trigger(this.element, 'kt.menu.dropdown.hidden');
375
+ };
376
+ this._showAccordion = (item) => {
377
+ if (EventHandlerUtil.trigger(this.element, 'kt.menu.accordion.show') === false) {
378
+ return;
379
+ }
380
+ if (this.options.accordion.expand === false) {
381
+ this._hideAccordions(item);
382
+ }
383
+ if (DataUtil.has(item, 'popper') === true) {
384
+ this._hideDropdown(item);
385
+ }
386
+ item.classList.add('hover'); // updateWW
387
+ item.classList.add('showing');
388
+ const subElement = this._getItemSubElement(item);
389
+ if (subElement) {
390
+ const sub = subElement;
391
+ ElementAnimateUtil.slideDown(sub, this.options.accordion.slideSpeed, () => {
392
+ item.classList.remove('showing');
393
+ item.classList.add('show');
394
+ sub.classList.add('show');
395
+ EventHandlerUtil.trigger(this.element, 'kt.menu.accordion.shown');
396
+ });
397
+ }
398
+ };
399
+ this._hideAccordion = (item) => {
400
+ if (EventHandlerUtil.trigger(this.element, 'kt.menu.accordion.hide') === false) {
401
+ return;
402
+ }
403
+ const sub = this._getItemSubElement(item);
404
+ item.classList.add('hiding');
405
+ if (sub) {
406
+ ElementAnimateUtil.slideUp(sub, this.options.accordion.slideSpeed, () => {
407
+ item.classList.remove('hiding');
408
+ item.classList.remove('show');
409
+ sub.classList.remove('show');
410
+ item.classList.remove('hover'); // update
411
+ EventHandlerUtil.trigger(this.element, 'kt.menu.accordion.hidden');
412
+ });
413
+ }
414
+ };
415
+ // Hide all shown accordions of item
416
+ this._hideAccordions = (item) => {
417
+ const itemsToHide = this.element.querySelectorAll('.show[data-kt-menu-trigger]');
418
+ if (itemsToHide && itemsToHide.length > 0) {
419
+ for (var i = 0, len = itemsToHide.length; i < len; i++) {
420
+ const itemToHide = itemsToHide[i];
421
+ if (this._getItemSubType(itemToHide) === 'accordion' &&
422
+ itemToHide !== item &&
423
+ item.contains(itemToHide) === false &&
424
+ itemToHide.contains(item) === false) {
425
+ this._hideAccordion(itemToHide);
426
+ }
427
+ }
428
+ }
429
+ };
430
+ // Event Handlers
431
+ // Reset item state classes if item sub type changed
432
+ this._reset = (item) => {
433
+ if (this._hasItemSub(item) === false) {
434
+ return;
435
+ }
436
+ const sub = this._getItemSubElement(item);
437
+ // Reset sub state if sub type is changed during the window resize
438
+ if (DataUtil.has(item, 'type') && DataUtil.get(item, 'type') !== this._getItemSubType(item)) {
439
+ // updated
440
+ item.classList.remove('hover');
441
+ item.classList.remove('show');
442
+ item.classList.remove('show');
443
+ if (sub && sub.removeClass) {
444
+ sub.removeClass(sub, 'show');
445
+ }
446
+ } // updated
447
+ };
448
+ // TODO: not done
449
+ this._destroy = () => { };
450
+ // Update all item state classes if item sub type changed
451
+ this._update = () => {
452
+ const items = this.element.querySelectorAll('.menu-item[data-kt-menu-trigger]');
453
+ items.forEach((el) => this._reset(el));
454
+ };
455
+ // Hide item sub
456
+ this._hide = (item) => {
457
+ if (!item) {
458
+ return;
459
+ }
460
+ if (this._isItemSubShown(item) === false) {
461
+ return;
462
+ }
463
+ if (this._getItemSubType(item) === 'dropdown') {
464
+ this._hideDropdown(item);
465
+ }
466
+ else if (this._getItemSubType(item) === 'accordion') {
467
+ this._hideAccordion(item);
468
+ }
469
+ };
470
+ // Show item sub
471
+ this._show = (item) => {
472
+ if (!item) {
473
+ return;
474
+ }
475
+ if (this._isItemSubShown(item) === true) {
476
+ return;
477
+ }
478
+ if (this._getItemSubType(item) === 'dropdown') {
479
+ this._showDropdown(item); // // show current dropdown
480
+ }
481
+ else if (this._getItemSubType(item) === 'accordion') {
482
+ this._showAccordion(item);
483
+ }
484
+ // Remember last submenu type
485
+ DataUtil.set(item, 'type', this._getItemSubType(item)); // updated
486
+ };
487
+ // Toggle item sub
488
+ this._toggle = (item) => {
489
+ if (!item) {
490
+ return;
491
+ }
492
+ if (this._isItemSubShown(item) === true) {
493
+ this._hide(item);
494
+ }
495
+ else {
496
+ this._show(item);
497
+ }
498
+ };
499
+ // Mouseout handle
500
+ this._mouseout = (element, e) => {
501
+ const item = this._getItemElement(element);
502
+ if (!item) {
503
+ return;
504
+ }
505
+ if (this._getItemOption(item, 'trigger') !== 'hover') {
506
+ return;
507
+ }
508
+ const timeout = setTimeout(() => {
509
+ if (DataUtil.get(item, 'hover') === '1') {
510
+ this._hide(item);
511
+ }
512
+ }, this.options.dropdown.hoverTimeout);
513
+ DataUtil.set(item, 'hover', '1');
514
+ DataUtil.set(item, 'timeout', timeout);
515
+ };
516
+ // Mouseover handle
517
+ this._mouseover = (element, e) => {
518
+ const item = this._getItemElement(element);
519
+ if (!item) {
520
+ return;
521
+ }
522
+ if (this._getItemOption(item, 'trigger') !== 'hover') {
523
+ return;
524
+ }
525
+ if (DataUtil.get(item, 'hover') === '1') {
526
+ clearTimeout(DataUtil.get(item, 'timeout'));
527
+ DataUtil.remove(item, 'hover');
528
+ DataUtil.remove(item, 'timeout');
529
+ }
530
+ this._show(item);
531
+ };
532
+ // Dismiss handler
533
+ this._dismiss = (element, e) => {
534
+ const item = this._getItemElement(element);
535
+ const items = this._getItemChildElements(item);
536
+ //if ( item !== null && _getItemOption(item, 'trigger') === 'click' && _getItemSubType(item) === 'dropdown' ) {
537
+ const itemSubType = this._getItemSubType(item);
538
+ if (item !== null && itemSubType === 'dropdown') {
539
+ this._hide(item); // hide items dropdown
540
+ // Hide all child elements as well
541
+ if (items.length > 0) {
542
+ for (let i = 0, len = items.length; i < len; i++) {
543
+ //if ( _getItemOption(item, 'trigger') === 'click' && _getItemSubType(item) === 'dropdown' ) {
544
+ if (items[i] !== null && this._getItemSubType(items[i]) === 'dropdown') {
545
+ this._hide(items[i]);
546
+ }
547
+ }
548
+ }
549
+ }
550
+ };
551
+ // Link handler
552
+ this._link = (element, e) => {
553
+ if (EventHandlerUtil.trigger(this.element, 'kt.menu.link.click') === false) {
554
+ return;
555
+ }
556
+ // Dismiss all shown dropdowns
557
+ MenuComponent.hideDropdowns(undefined);
558
+ EventHandlerUtil.trigger(this.element, 'kt.menu.link.clicked');
559
+ };
560
+ this._click = (element, e) => {
561
+ e.preventDefault();
562
+ const item = this._getItemElement(element);
563
+ if (this._getItemOption(item, 'trigger') !== 'click') {
564
+ return;
565
+ }
566
+ if (this._getItemOption(item, 'toggle') === false) {
567
+ this._show(item);
568
+ }
569
+ else {
570
+ this._toggle(item);
571
+ }
572
+ };
573
+ ///////////////////////
574
+ // ** Public API ** //
575
+ ///////////////////////
576
+ this.click = (element, e) => {
577
+ return this._click(element, e);
578
+ };
579
+ this.link = (element, e) => {
580
+ return this._link(element, e);
581
+ };
582
+ this.dismiss = (element, e) => {
583
+ return this._dismiss(element, e);
584
+ };
585
+ this.mouseover = (element, e) => {
586
+ return this._mouseover(element, e);
587
+ };
588
+ this.mouseout = (element, e) => {
589
+ return this._mouseout(element, e);
590
+ };
591
+ // General Methods
592
+ this.getItemTriggerType = (item) => {
593
+ return this._getItemOption(item, 'trigger');
594
+ };
595
+ this.getItemSubType = (element) => {
596
+ return this._getItemSubType(element);
597
+ };
598
+ this.show = (item) => {
599
+ return this._show(item);
600
+ };
601
+ this.hide = (item) => {
602
+ return this._hide(item);
603
+ };
604
+ this.reset = (item) => {
605
+ return this._reset(item);
606
+ };
607
+ this.update = () => {
608
+ return this._update();
609
+ };
610
+ this.getElement = () => {
611
+ return this.element;
612
+ };
613
+ this.getItemLinkElement = (item) => {
614
+ return this._getItemLinkElement(item);
615
+ };
616
+ this.getItemToggleElement = (item) => {
617
+ return this._getItemToggleElement(item);
618
+ };
619
+ this.getItemSubElement = (item) => {
620
+ return this._getItemSubElement(item);
621
+ };
622
+ this.getItemParentElements = (item) => {
623
+ return this._getItemParentElements(item);
624
+ };
625
+ this.isItemSubShown = (item) => {
626
+ return this._isItemSubShown(item);
627
+ };
628
+ this.isItemParentShown = (item) => {
629
+ return this._isItemParentShown(item);
630
+ };
631
+ this.getTriggerElement = () => {
632
+ return this.triggerElement;
633
+ };
634
+ this.isItemDropdownPermanent = (item) => {
635
+ return this._isItemDropdownPermanent(item);
636
+ };
637
+ // Accordion Mode Methods
638
+ this.hideAccordions = (item) => {
639
+ return this._hideAccordions(item);
640
+ };
641
+ // Event API
642
+ this.on = (name, handler) => {
643
+ return EventHandlerUtil.on(this.element, name, handler);
644
+ };
645
+ this.one = (name, handler) => {
646
+ return EventHandlerUtil.one(this.element, name, handler);
647
+ };
648
+ this.off = (name) => {
649
+ return EventHandlerUtil.off(this.element, name);
650
+ };
651
+ this.element = _element;
652
+ this.options = Object.assign(defaultMenuOptions, options);
653
+ this.instanceUid = getUniqueIdWithPrefix('menu');
654
+ // this.element.setAttribute('data-kt-menu', 'true')
655
+ this._setTriggerElement();
656
+ this._update();
657
+ DataUtil.set(this.element, 'menu', this);
658
+ return this;
659
+ }
660
+ // public static methods
661
+ // Get KTMenu instance by element
662
+ static { this.getInstance = (element) => {
663
+ // Element has menu DOM reference in it's DATA storage
664
+ const elementMenu = DataUtil.get(element, 'menu');
665
+ if (elementMenu) {
666
+ return elementMenu;
667
+ }
668
+ // Element has .menu parent
669
+ const menu = element.closest('.menu');
670
+ if (menu) {
671
+ const menuData = DataUtil.get(menu, 'menu');
672
+ if (menuData) {
673
+ return menuData;
674
+ }
675
+ }
676
+ // Element has a parent with DOM reference to .menu in it's DATA storage
677
+ if (element.classList.contains('menu-link')) {
678
+ const sub = element.closest('.menu-sub');
679
+ if (sub) {
680
+ const subMenu = DataUtil.get(sub, 'menu');
681
+ if (subMenu) {
682
+ return subMenu;
683
+ }
684
+ }
685
+ }
686
+ return null;
687
+ }; }
688
+ // Hide all dropdowns and skip one if provided
689
+ static { this.hideDropdowns = (skip) => {
690
+ const items = document.querySelectorAll('.show.menu-dropdown[data-kt-menu-trigger]');
691
+ if (items && items.length > 0) {
692
+ for (let i = 0, len = items.length; i < len; i++) {
693
+ const item = items[i];
694
+ const menu = MenuComponent.getInstance(item);
695
+ if (menu && menu.getItemSubType(item) === 'dropdown') {
696
+ if (skip) {
697
+ if (menu.getItemSubElement(item).contains(skip) === false &&
698
+ item.contains(skip) === false &&
699
+ item !== skip) {
700
+ menu.hide(item);
701
+ }
702
+ }
703
+ else {
704
+ menu.hide(item);
705
+ }
706
+ }
707
+ }
708
+ }
709
+ }; }
710
+ static { this.updateDropdowns = () => {
711
+ const items = document.querySelectorAll('.show.menu-dropdown[data-kt-menu-trigger]');
712
+ if (items && items.length > 0) {
713
+ for (var i = 0, len = items.length; i < len; i++) {
714
+ var item = items[i];
715
+ if (DataUtil.has(item, 'popper')) {
716
+ DataUtil.get(item, 'popper').forceUpdate();
717
+ }
718
+ }
719
+ }
720
+ }; }
721
+ // Global handlers
722
+ static { this.createInstances = (selector) => {
723
+ // Initialize menus
724
+ document.querySelectorAll(selector).forEach((el) => {
725
+ const menuItem = el;
726
+ let menuInstance = MenuComponent.getInstance(menuItem);
727
+ if (!menuInstance) {
728
+ menuInstance = new MenuComponent(el, defaultMenuOptions);
729
+ }
730
+ });
731
+ }; }
732
+ static { this.initGlobalHandlers = () => {
733
+ // Dropdown handler
734
+ document.addEventListener('click', (e) => {
735
+ const menuItems = document.querySelectorAll('.show.menu-dropdown[data-kt-menu-trigger]');
736
+ if (menuItems && menuItems.length > 0) {
737
+ for (let i = 0; i < menuItems.length; i++) {
738
+ const item = menuItems[i];
739
+ const menuObj = MenuComponent.getInstance(item);
740
+ if (menuObj && menuObj.getItemSubType(item) === 'dropdown') {
741
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
742
+ const menu = menuObj.getElement();
743
+ const sub = menuObj.getItemSubElement(item);
744
+ if (item === e.target || item.contains(e.target)) {
745
+ continue;
746
+ }
747
+ if (sub && (sub === e.target || sub.contains(e.target))) {
748
+ continue;
749
+ }
750
+ menuObj.hide(item);
751
+ }
752
+ }
753
+ }
754
+ });
755
+ // Sub toggle handler
756
+ DOMEventHandlerUtil.on(document.body, '.menu-item[data-kt-menu-trigger] > .menu-link, [data-kt-menu-trigger]:not(.menu-item):not([data-kt-menu-trigger="auto"])', 'click', function (e) {
757
+ const menu = MenuComponent.getInstance(this);
758
+ if (menu) {
759
+ return menu.click(this, e);
760
+ }
761
+ });
762
+ // // Link handler
763
+ DOMEventHandlerUtil.on(document.body, '.menu-item:not([data-kt-menu-trigger]) > .menu-link', 'click', function (e) {
764
+ e.stopPropagation();
765
+ const menu = MenuComponent.getInstance(this);
766
+ if (menu && menu.link) {
767
+ return menu.link(this, e);
768
+ }
769
+ });
770
+ // Dismiss handler
771
+ DOMEventHandlerUtil.on(document.body, '[data-kt-menu-dismiss="true"]', 'click', function (e) {
772
+ const menu = MenuComponent.getInstance(this);
773
+ if (menu) {
774
+ return menu.dismiss(this, e);
775
+ }
776
+ });
777
+ // Mouseover handler
778
+ DOMEventHandlerUtil.on(document.body, '[data-kt-menu-trigger], .menu-sub', 'mouseover', function (e) {
779
+ const menu = MenuComponent.getInstance(this);
780
+ if (menu && menu.getItemSubType(this) === 'dropdown') {
781
+ return menu.mouseover(this, e);
782
+ }
783
+ });
784
+ // Mouseout handler
785
+ DOMEventHandlerUtil.on(document.body, '[data-kt-menu-trigger], .menu-sub', 'mouseout', function (e) {
786
+ const menu = MenuComponent.getInstance(this);
787
+ if (menu && menu.getItemSubType(this) === 'dropdown') {
788
+ return menu.mouseout(this, e);
789
+ }
790
+ });
791
+ // Resize handler
792
+ window.addEventListener('resize', () => {
793
+ let timer;
794
+ throttle(timer, () => {
795
+ // Locate and update Drawer instances on window resize
796
+ const elements = document.querySelectorAll('[data-kt-menu="true"]');
797
+ elements.forEach((el) => {
798
+ const menu = MenuComponent.getInstance(el);
799
+ if (menu) {
800
+ menu.update();
801
+ }
802
+ });
803
+ }, 200);
804
+ });
805
+ }; }
806
+ static { this.bootstrap = () => {
807
+ MenuComponent.initGlobalHandlers();
808
+ MenuComponent.createInstances('[data-kt-menu="true"]');
809
+ }; }
810
+ static { this.reinitialization = () => {
811
+ MenuComponent.createInstances('[data-kt-menu="true"]');
812
+ }; }
813
+ static { this.createInsance = (selector, options = defaultMenuOptions) => {
814
+ const element = document.body.querySelector(selector);
815
+ if (!element) {
816
+ return;
817
+ }
818
+ const item = element;
819
+ let menu = MenuComponent.getInstance(item);
820
+ if (!menu) {
821
+ menu = new MenuComponent(item, options);
822
+ }
823
+ return menu;
824
+ }; }
825
+ }
826
+ export { MenuComponent, defaultMenuOptions };
827
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVudUNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtYWRtaW4tcG9ydGFsL3NyYy9saWIvX21ldHJvbmljL2NvcmUvY29tcG9uZW50cy9NZW51Q29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQWtCLE1BQU0sZ0JBQWdCLENBQUE7QUFFN0QsT0FBTyxFQUFFLDZCQUE2QixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUN4SixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUE7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUE7QUFDOUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFhakUsTUFBTSxrQkFBa0IsR0FBZ0I7SUFDdEMsUUFBUSxFQUFFO1FBQ1IsWUFBWSxFQUFFLEdBQUc7UUFDakIsTUFBTSxFQUFFLEdBQUc7S0FDWjtJQUNELFNBQVMsRUFBRTtRQUNULFVBQVUsRUFBRSxHQUFHO1FBQ2YsTUFBTSxFQUFFLEtBQUs7S0FDZDtDQUNGLENBQUE7QUFvQkQsTUFBTSxhQUFhO0lBTWpCLFlBQVksUUFBcUIsRUFBRSxPQUFvQjtRQUZ2RCxtQkFBYyxHQUF1QixJQUFJLENBQUE7UUFhekMsK0JBQStCO1FBQ3ZCLHVCQUFrQixHQUFHLEdBQUcsRUFBRTtZQUNoQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENB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O1FBQ25DLElBQUksSUFBSSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDMUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNULElBQUksR0FBRyxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7U0FDeEM7UUFDRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUMsQUFkMEIsQ0FjMUI7O0FBR0gsT0FBTyxFQUFDLGFBQWEsRUFBRSxrQkFBa0IsRUFBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlUG9wcGVyLCBWaXJ0dWFsRWxlbWVudCB9IGZyb20gJ0Bwb3BwZXJqcy9jb3JlJ1xyXG5cclxuaW1wb3J0IHsgZ2V0QXR0cmlidXRlVmFsdWVCeUJyZWFrcG9pbnQsIGdldEVsZW1lbnRDaGlsZCwgZ2V0RWxlbWVudFBhcmVudHMsIGdldEhpZ2hlc3RaaW5kZXgsIGluc2VydEFmdGVyRWxlbWVudCwgdGhyb3R0bGUgfSBmcm9tIFwiLi4vX3V0aWxzL0RvbUhlbHBlcnNcIlxyXG5pbXBvcnQgeyBFdmVudEhhbmRsZXJVdGlsIH0gZnJvbSBcIi4uL191dGlscy9FdmVudEhhbmRsZXJVdGlsXCJcclxuaW1wb3J0IHsgRGF0YVV0aWwgfSBmcm9tIFwiLi4vX3V0aWxzL19EYXRhVXRpbFwiXHJcbmltcG9ydCB7IERPTUV2ZW50SGFuZGxlclV0aWwgfSBmcm9tIFwiLi4vX3V0aWxzL19ET01FdmVudEhhbmRsZXJVdGlsXCJcclxuaW1wb3J0IHsgRWxlbWVudFN0eWxlVXRpbCB9IGZyb20gXCIuLi9fdXRpbHMvX0VsZW1lbnRTdHlsZVV0aWxcIlxyXG5pbXBvcnQgeyBnZXRVbmlxdWVJZFdpdGhQcmVmaXggfSBmcm9tIFwiLi4vX3V0aWxzL19UeXBlc0hlbHBlcnNcIlxyXG5pbXBvcnQgeyBFbGVtZW50QW5pbWF0ZVV0aWwgfSBmcm9tICcuLi9fdXRpbHMvRWxlbWVudEFuaW1hdGVVdGlsJ1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNZW51T3B0aW9ucyB7XHJcbiAgZHJvcGRvd246IHtcclxuICAgIGhvdmVyVGltZW91dDogbnVtYmVyXHJcbiAgICB6aW5kZXg6IG51bWJlclxyXG4gIH1cclxuICBhY2NvcmRpb246IHtcclxuICAgIHNsaWRlU3BlZWQ6IG51bWJlclxyXG4gICAgZXhwYW5kOiBib29sZWFuXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBkZWZhdWx0TWVudU9wdGlvbnM6IE1lbnVPcHRpb25zID0ge1xyXG4gIGRyb3Bkb3duOiB7XHJcbiAgICBob3ZlclRpbWVvdXQ6IDIwMCxcclxuICAgIHppbmRleDogMTA1LFxyXG4gIH0sXHJcbiAgYWNjb3JkaW9uOiB7XHJcbiAgICBzbGlkZVNwZWVkOiAyNTAsXHJcbiAgICBleHBhbmQ6IGZhbHNlLFxyXG4gIH0sXHJcbn1cclxuXHJcbnR5cGUgUG9wcGVyUGxhY2VtZW50ID1cclxuICB8ICdyaWdodCdcclxuICB8ICdhdXRvJ1xyXG4gIHwgJ2F1dG8tc3RhcnQnXHJcbiAgfCAnYXV0by1lbmQnXHJcbiAgfCAndG9wJ1xyXG4gIHwgJ2JvdHRvbSdcclxuICB8ICdsZWZ0J1xyXG4gIHwgJ3RvcC1zdGFydCdcclxuICB8ICd0b3AtZW5kJ1xyXG4gIHwgJ2JvdHRvbS1zdGFydCdcclxuICB8ICdib3R0b20tZW5kJ1xyXG4gIHwgJ3JpZ2h0LXN0YXJ0J1xyXG4gIHwgJ3JpZ2h0LWVuZCdcclxuICB8ICdsZWZ0LXN0YXJ0J1xyXG4gIHwgJ2xlZnQtZW5kJ1xyXG4gIHwgdW5kZWZpbmVkXHJcblxyXG5jbGFzcyBNZW51Q29tcG9uZW50IHtcclxuICBlbGVtZW50OiBIVE1MRWxlbWVudFxyXG4gIG9wdGlvbnM6IE1lbnVPcHRpb25zXHJcbiAgaW5zdGFuY2VVaWQ6IHN0cmluZ1xyXG4gIHRyaWdnZXJFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsXHJcblxyXG4gIGNvbnN0cnVjdG9yKF9lbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9uczogTWVudU9wdGlvbnMpIHtcclxuICAgIHRoaXMuZWxlbWVudCA9IF9lbGVtZW50XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKGRlZmF1bHRNZW51T3B0aW9ucywgb3B0aW9ucylcclxuICAgIHRoaXMuaW5zdGFuY2VVaWQgPSBnZXRVbmlxdWVJZFdpdGhQcmVmaXgoJ21lbnUnKVxyXG4gICAgLy8gdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1rdC1tZW51JywgJ3RydWUnKVxyXG4gICAgdGhpcy5fc2V0VHJpZ2dlckVsZW1lbnQoKVxyXG4gICAgdGhpcy5fdXBkYXRlKClcclxuICAgIERhdGFVdGlsLnNldCh0aGlzLmVsZW1lbnQsICdtZW51JywgdGhpcylcclxuICAgIHJldHVybiB0aGlzXHJcbiAgfVxyXG5cclxuICAvLyBTZXQgZXh0ZXJuYWwgdHJpZ2dlciBlbGVtZW50XHJcbiAgcHJpdmF0ZSBfc2V0VHJpZ2dlckVsZW1lbnQgPSAoKSA9PiB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICBgW2RhdGEta3QtbWVudS10YXJnZXQ9XCIjJHt0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCdpZCcpfVwiYFxyXG4gICAgKVxyXG5cclxuICAgIGlmICh0YXJnZXQpIHtcclxuICAgICAgdGhpcy50cmlnZ2VyRWxlbWVudCA9IHRhcmdldCBhcyBIVE1MRWxlbWVudFxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmVsZW1lbnQuY2xvc2VzdCgnW2RhdGEta3QtbWVudS10cmlnZ2VyXScpKSB7XHJcbiAgICAgIHRoaXMudHJpZ2dlckVsZW1lbnQgPSB0aGlzLmVsZW1lbnQuY2xvc2VzdCgnW2RhdGEta3QtbWVudS10cmlnZ2VyXScpIGFzIEhUTUxFbGVtZW50XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZSAmJlxyXG4gICAgICBnZXRFbGVtZW50Q2hpbGQodGhpcy5lbGVtZW50LnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQsICdbZGF0YS1rdC1tZW51LXRyaWdnZXJdJylcclxuICAgICkge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IGdldEVsZW1lbnRDaGlsZChcclxuICAgICAgICB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCxcclxuICAgICAgICAnW2RhdGEta3QtbWVudS10cmlnZ2VyXSdcclxuICAgICAgKVxyXG4gICAgICBpZiAoY2hpbGQpIHtcclxuICAgICAgICB0aGlzLnRyaWdnZXJFbGVtZW50ID0gY2hpbGRcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnRyaWdnZXJFbGVtZW50KSB7XHJcbiAgICAgIERhdGFVdGlsLnNldCh0aGlzLnRyaWdnZXJFbGVtZW50LCAnbWVudScsIHRoaXMpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBUZXN0IGlmIG1lbnUgaGFzIGV4dGVybmFsIHRyaWdnZXIgZWxlbWVudFxyXG4gIHByaXZhdGUgX2lzVHJpZ2dlckVsZW1lbnQgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIHJldHVybiB0aGlzLnRyaWdnZXJFbGVtZW50ID09PSBpdGVtXHJcbiAgfVxyXG5cclxuICAvLyBHZXQgaXRlbSBvcHRpb24odGhyb3VnaCBodG1sIGF0dHJpYnV0ZXMpXHJcbiAgcHJpdmF0ZSBfZ2V0SXRlbU9wdGlvbiA9IChpdGVtOiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICBsZXQgdmFsdWUgPSBudWxsXHJcbiAgICBpZiAoaXRlbSAmJiBpdGVtLmhhc0F0dHJpYnV0ZSgnZGF0YS1rdC1tZW51LScgKyBuYW1lKSkge1xyXG4gICAgICBjb25zdCBhdHRyID0gaXRlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEta3QtbWVudS0nICsgbmFtZSkgfHwgJydcclxuICAgICAgdmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZUJ5QnJlYWtwb2ludChhdHRyKVxyXG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgU3RyaW5nKHZhbHVlKSA9PT0gJ3RydWUnKSB7XHJcbiAgICAgICAgdmFsdWUgPSB0cnVlXHJcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IG51bGwgJiYgU3RyaW5nKHZhbHVlKSA9PT0gJ2ZhbHNlJykge1xyXG4gICAgICAgIHZhbHVlID0gZmFsc2VcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlXHJcbiAgfVxyXG5cclxuICAvLyBHZXQgaXRlbSBlbGVtZW50XHJcbiAgcHJpdmF0ZSBfZ2V0SXRlbUVsZW1lbnQgPSAoX2VsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICAvLyBFbGVtZW50IGlzIHRoZSBleHRlcm5hbCB0cmlnZ2VyIGVsZW1lbnRcclxuICAgIGlmICh0aGlzLl9pc1RyaWdnZXJFbGVtZW50KF9lbGVtZW50KSkge1xyXG4gICAgICByZXR1cm4gX2VsZW1lbnRcclxuICAgIH1cclxuXHJcbiAgICAvLyBFbGVtZW50IGhhcyBpdGVtIHRvZ2dsZXIgYXR0cmlidXRlXHJcbiAgICBpZiAoX2VsZW1lbnQuaGFzQXR0cmlidXRlKCdkYXRhLWt0LW1lbnUtdHJpZ2dlcicpKSB7XHJcbiAgICAgIHJldHVybiBfZWxlbWVudFxyXG4gICAgfVxyXG5cclxuICAgIC8vIEVsZW1lbnQgaGFzIGl0ZW0gRE9NIHJlZmVyZW5jZSBpbiBpdCdzIGRhdGEgc3RvcmFnZVxyXG4gICAgY29uc3QgaXRlbUVsZW1lbnQgPSBEYXRhVXRpbC5nZXQoX2VsZW1lbnQsICdpdGVtJylcclxuICAgIGlmIChpdGVtRWxlbWVudCkge1xyXG4gICAgICByZXR1cm4gaXRlbUVsZW1lbnRcclxuICAgIH1cclxuXHJcbiAgICAvLyBJdGVtIGlzIHBhcmVudCBvZiBlbGVtZW50XHJcbiAgICBjb25zdCBpdGVtID0gX2VsZW1lbnQuY2xvc2VzdCgnLm1lbnUtaXRlbVtkYXRhLWt0LW1lbnUtdHJpZ2dlcl0nKVxyXG4gICAgaWYgKGl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGl0ZW1cclxuICAgIH1cclxuXHJcbiAgICAvLyBFbGVtZW50J3MgcGFyZW50IGhhcyBpdGVtIERPTSByZWZlcmVuY2UgaW4gaXQncyBkYXRhIHN0b3JhZ2VcclxuICAgIGNvbnN0IHN1YiA9IF9lbGVtZW50LmNsb3Nlc3QoJy5tZW51LXN1YicpXHJcbiAgICBpZiAoc3ViKSB7XHJcbiAgICAgIGNvbnN0IHN1Ykl0ZW0gPSBEYXRhVXRpbC5nZXQoc3ViIGFzIEhUTUxFbGVtZW50LCAnaXRlbScpXHJcbiAgICAgIGlmIChzdWJJdGVtKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1Ykl0ZW1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gR2V0IGl0ZW0gcGFyZW50IGVsZW1lbnRcclxuICBwcml2YXRlIF9nZXRJdGVtUGFyZW50RWxlbWVudCA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgY29uc3Qgc3ViID0gaXRlbS5jbG9zZXN0KCcubWVudS1zdWInKVxyXG4gICAgaWYgKCFzdWIpIHtcclxuICAgICAgcmV0dXJuIG51bGxcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdWJJdGVtID0gRGF0YVV0aWwuZ2V0KHN1YiBhcyBIVE1MRWxlbWVudCwgJ2l0ZW0nKVxyXG4gICAgaWYgKHN1Ykl0ZW0pIHtcclxuICAgICAgcmV0dXJuIHN1Ykl0ZW1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwYXJlbnRJdGVtID0gc3ViLmNsb3Nlc3QoJy5tZW51LWl0ZW1bZGF0YS1rdC1tZW51LXRyaWdnZXJdJylcclxuICAgIGlmIChzdWIgJiYgcGFyZW50SXRlbSkge1xyXG4gICAgICByZXR1cm4gcGFyZW50SXRlbVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG5cclxuICAvLyBHZXQgaXRlbSBwYXJlbnQgZWxlbWVudHNcclxuICBwcml2YXRlIF9nZXRJdGVtUGFyZW50RWxlbWVudHMgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIGNvbnN0IHBhcmVudHMgPSBbXVxyXG4gICAgbGV0IHBhcmVudFxyXG4gICAgbGV0IGkgPSAwXHJcbiAgICBsZXQgYnVmZmVyID0gaXRlbVxyXG5cclxuICAgIGRvIHtcclxuICAgICAgcGFyZW50ID0gdGhpcy5fZ2V0SXRlbVBhcmVudEVsZW1lbnQoYnVmZmVyKVxyXG4gICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgcGFyZW50cy5wdXNoKHBhcmVudClcclxuICAgICAgICBidWZmZXIgPSBwYXJlbnRcclxuICAgICAgfVxyXG5cclxuICAgICAgaSsrXHJcbiAgICB9IHdoaWxlIChwYXJlbnQgIT09IG51bGwgJiYgaSA8IDIwKVxyXG5cclxuICAgIGlmICh0aGlzLnRyaWdnZXJFbGVtZW50KSB7XHJcbiAgICAgIHBhcmVudHMudW5zaGlmdCh0aGlzLnRyaWdnZXJFbGVtZW50KVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBwYXJlbnRzXHJcbiAgfVxyXG5cclxuICAvLyBQcmVwYXJlIHBvcHBlciBjb25maWcgZm9yIGRyb3Bkb3duKHNlZTogaHR0cHM6Ly9wb3BwZXIuanMub3JnL2RvY3MvdjIvKVxyXG4gIHByaXZhdGUgX2dldERyb3Bkb3duUG9wcGVyQ29uZmlnID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICAvLyBQbGFjZW1lbnRcclxuICAgIGNvbnN0IHBsYWNlbWVudE9wdGlvbiA9IHRoaXMuX2dldEl0ZW1PcHRpb24oaXRlbSwgJ3BsYWNlbWVudCcpXHJcbiAgICBsZXQgcGxhY2VtZW50OiBQb3BwZXJQbGFjZW1lbnQgPSAncmlnaHQnXHJcbiAgICBpZiAocGxhY2VtZW50T3B0aW9uKSB7XHJcbiAgICAgIHBsYWNlbWVudCA9IHBsYWNlbWVudE9wdGlvbiBhcyBQb3BwZXJQbGFjZW1lbnRcclxuICAgIH1cclxuXHJcbiAgICAvLyBGbGlwXHJcbiAgICBjb25zdCBmbGlwVmFsdWUgPSB0aGlzLl9nZXRJdGVtT3B0aW9uKGl0ZW0sICdmbGlwJylcclxuICAgIGNvbnN0IGZsaXAgPSBmbGlwVmFsdWUgPyBmbGlwVmFsdWUudG9TdHJpbmcoKS5zcGxpdCgnLCcpIDogW11cclxuXHJcbiAgICAvLyBPZmZzZXRcclxuICAgIGNvbnN0IG9mZnNldFZhbHVlID0gdGhpcy5fZ2V0SXRlbU9wdGlvbihpdGVtLCAnb2Zmc2V0JylcclxuICAgIGNvbnN0IG9mZnNldCA9IG9mZnNldFZhbHVlID8gb2Zmc2V0VmFsdWUudG9TdHJpbmcoKS5zcGxpdCgnLCcpIDogW11cclxuXHJcbiAgICAvLyBTdHJhdGVneVxyXG4gICAgY29uc3Qgc3RyYXRlZ3k6ICdhYnNvbHV0ZScgfCAnZml4ZWQnIHwgdW5kZWZpbmVkID1cclxuICAgICAgdGhpcy5fZ2V0SXRlbU9wdGlvbihpdGVtLCAnb3ZlcmZsb3cnKSA9PT0gdHJ1ZSA/ICdhYnNvbHV0ZScgOiAnZml4ZWQnXHJcblxyXG4gICAgdmFyIGFsdEF4aXMgPSB0aGlzLl9nZXRJdGVtT3B0aW9uKGl0ZW0sICdmbGlwJykgIT09IGZhbHNlO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxyXG4gICAgICBzdHJhdGVneTogc3RyYXRlZ3ksXHJcbiAgICAgIG1vZGlmaWVyczogW3tcclxuICAgICAgICBuYW1lOiAnb2Zmc2V0JyxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICBvZmZzZXQ6IG9mZnNldFxyXG4gICAgICAgIH1cclxuICAgICAgfSwge1xyXG4gICAgICAgIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxyXG4gICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgIGFsdEF4aXM6IGFsdEF4aXNcclxuICAgICAgICB9XHJcbiAgICAgIH0sIHtcclxuICAgICAgICBuYW1lOiAnZmxpcCcsXHJcbiAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgZmxpcFZhcmlhdGlvbnM6IGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICB9XVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vIEdldCBpdGVtIGNoaWxkIGVsZW1lbnRcclxuICBwcml2YXRlIF9nZXRJdGVtQ2hpbGRFbGVtZW50ID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICBsZXQgc2VsZWN0b3IgPSBpdGVtXHJcblxyXG4gICAgY29uc3Qgc3ViSXRlbSA9IERhdGFVdGlsLmdldChpdGVtLCAnc3ViJylcclxuICAgIGlmIChzdWJJdGVtKSB7XHJcbiAgICAgIHNlbGVjdG9yID0gc3ViSXRlbVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZWxlY3Rvcikge1xyXG4gICAgICAvL2VsZW1lbnQgPSBzZWxlY3Rvci5xdWVyeVNlbGVjdG9yKCcuc2hvdy5tZW51LWl0ZW1bZGF0YS1rdC1tZW51LXRyaWdnZXJdJyk7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBzZWxlY3Rvci5xdWVyeVNlbGVjdG9yKCcubWVudS1pdGVtW2RhdGEta3QtbWVudS10cmlnZ2VyXScpXHJcbiAgICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGxcclxuICB9XHJcblxyXG4gIC8vIEdldCBpdGVtIGNoaWxkIGVsZW1lbnRzXHJcbiAgcHJpdmF0ZSBfZ2V0SXRlbUNoaWxkRWxlbWVudHMgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIGNvbnN0IGNoaWxkcmVuID0gW11cclxuICAgIGxldCBjaGlsZFxyXG4gICAgbGV0IGkgPSAwXHJcbiAgICBsZXQgYnVmZmVyID0gaXRlbVxyXG4gICAgZG8ge1xyXG4gICAgICBjaGlsZCA9IHRoaXMuX2dldEl0ZW1DaGlsZEVsZW1lbnQoYnVmZmVyKVxyXG4gICAgICBpZiAoY2hpbGQpIHtcclxuICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkKVxyXG4gICAgICAgIGJ1ZmZlciA9IGNoaWxkIGFzIEhUTUxFbGVtZW50XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGkrK1xyXG4gICAgfSB3aGlsZSAoY2hpbGQgIT09IG51bGwgJiYgaSA8IDIwKVxyXG5cclxuICAgIHJldHVybiBjaGlsZHJlblxyXG4gIH1cclxuXHJcbiAgLy8gR2V0IGl0ZW0gc3ViIGVsZW1lbnRcclxuICBwcml2YXRlIF9nZXRJdGVtU3ViRWxlbWVudCA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgIHJldHVybiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2lzVHJpZ2dlckVsZW1lbnQoaXRlbSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmNsYXNzTGlzdC5jb250YWlucygnbWVudS1zdWInKSkge1xyXG4gICAgICByZXR1cm4gaXRlbVxyXG4gICAgfSBlbHNlIGlmIChEYXRhVXRpbC5oYXMoaXRlbSwgJ3N1YicpKSB7XHJcbiAgICAgIHJldHVybiBEYXRhVXRpbC5nZXQoaXRlbSwgJ3N1YicpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZ2V0RWxlbWVudENoaWxkKGl0ZW0sICcubWVudS1zdWInKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0Q3NzID0gKGVsOiBIVE1MRWxlbWVudCwgc3R5bGVQcm9wOiBzdHJpbmcpID0+IHtcclxuICAgIGNvbnN0IGRlZmF1bHRWaWV3ID0gKGVsLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpLmRlZmF1bHRWaWV3XHJcbiAgICBpZiAoIWRlZmF1bHRWaWV3KSB7XHJcbiAgICAgIHJldHVybiAnJ1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHNhbml0aXplIHByb3BlcnR5IG5hbWUgdG8gY3NzIG5vdGF0aW9uXHJcbiAgICAvLyAoaHlwaGVuIHNlcGFyYXRlZCB3b3JkcyBlZy4gZm9udC1TaXplKVxyXG4gICAgc3R5bGVQcm9wID0gc3R5bGVQcm9wLnJlcGxhY2UoLyhbQS1aXSkvZywgJy0kMScpLnRvTG93ZXJDYXNlKClcclxuXHJcbiAgICByZXR1cm4gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZVByb3ApXHJcbiAgfVxyXG5cclxuICAvLyBHZXQgaXRlbSBzdWIgdHlwZVxyXG4gIHByaXZhdGUgX2dldEl0ZW1TdWJUeXBlID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICBjb25zdCBzdWIgPSB0aGlzLl9nZXRJdGVtU3ViRWxlbWVudChlbGVtZW50KVxyXG4gICAgaWYgKHN1YiAmJiBwYXJzZUludCh0aGlzLl9nZXRDc3Moc3ViLCAnei1pbmRleCcpKSA+IDApIHtcclxuICAgICAgcmV0dXJuICdkcm9wZG93bidcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnYWNjb3JkaW9uJ1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gVGVzdCBpZiBpdGVtJ3Mgc3ViIGlzIHNob3duXHJcbiAgcHJpdmF0ZSBfaXNJdGVtU3ViU2hvd24gPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIGxldCBzdWIgPSB0aGlzLl9nZXRJdGVtU3ViRWxlbWVudChpdGVtKVxyXG4gICAgaWYgKHN1Yikge1xyXG4gICAgICBpZiAodGhpcy5fZ2V0SXRlbVN1YlR5cGUoaXRlbSkgPT09ICdkcm9wZG93bicpIHtcclxuICAgICAgICByZXR1cm4gc3ViLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpICYmIHN1Yi5oYXNBdHRyaWJ1dGUoJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCcpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0uY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JylcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgLy8gVGVzdCBpZiBpdGVtIGRyb3Bkb3duIGlzIHBlcm1hbmVudFxyXG4gIHByaXZhdGUgX2lzSXRlbURyb3Bkb3duUGVybWFuZW50ID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZ2V0SXRlbU9wdGlvbihpdGVtLCAncGVybWFuZW50JykgPT09IHRydWVcclxuICB9XHJcblxyXG4gIC8vIFRlc3QgaWYgaXRlbSdzIHBhcmVudCBpcyBzaG93blxyXG4gIHByaXZhdGUgX2lzSXRlbVBhcmVudFNob3duID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICByZXR1cm4gZ2V0RWxlbWVudFBhcmVudHMoaXRlbSwgJy5tZW51LWl0ZW0uc2hvdycpLmxlbmd0aCA+IDBcclxuICB9XHJcblxyXG4gIC8vIFRlc3Qgb2YgaXQgaXMgaXRlbSBzdWIgZWxlbWVudFxyXG4gIHByaXZhdGUgX2lzSXRlbVN1YkVsZW1lbnQgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIHJldHVybiBpdGVtLmNsYXNzTGlzdC5jb250YWlucygnbWVudS1zdWInKVxyXG4gIH1cclxuXHJcbiAgLy8gVGVzdCBpZiBpdGVtIGhhcyBzdWJcclxuICBwcml2YXRlIF9oYXNJdGVtU3ViID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICByZXR1cm4gaXRlbS5jbGFzc0xpc3QuY29udGFpbnMoJ21lbnUtaXRlbScpICYmIGl0ZW0uaGFzQXR0cmlidXRlKCdkYXRhLWt0LW1lbnUtdHJpZ2dlcicpXHJcbiAgfVxyXG5cclxuICAvLyBHZXQgbGluayBlbGVtZW50XHJcbiAgcHJpdmF0ZSBfZ2V0SXRlbUxpbmtFbGVtZW50ID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICByZXR1cm4gZ2V0RWxlbWVudENoaWxkKGl0ZW0sICcubWVudS1saW5rJylcclxuICB9XHJcblxyXG4gIC8vIEdldCB0b2dnbGUgZWxlbWVudFxyXG4gIHByaXZhdGUgX2dldEl0ZW1Ub2dnbGVFbGVtZW50ID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICBpZiAodGhpcy50cmlnZ2VyRWxlbWVudCkge1xyXG4gICAgICByZXR1cm4gdGhpcy50cmlnZ2VyRWxlbWVudFxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLl9nZXRJdGVtTGlua0VsZW1lbnQoaXRlbSlcclxuICB9XHJcblxyXG4gIC8vIFNob3cgaXRlbSBkcm9wZG93blxyXG4gIHByaXZhdGUgX3Nob3dEcm9wZG93biA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgaWYgKEV2ZW50SGFuZGxlclV0aWwudHJpZ2dlcih0aGlzLmVsZW1lbnQsICdrdC5tZW51LmRyb3Bkb3duLnNob3cnKSA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGlkZSBhbGwgY3VycmVudGx5IHNob3duIGRyb3Bkb3ducyBleGNlcHQgY3VycmVudCBvbmVcclxuICAgIE1lbnVDb21wb25lbnQuaGlkZURyb3Bkb3ducyhpdGVtKVxyXG5cclxuICAgIC8vIGNvbnN0IHRvZ2dsZSA9IHRoaXMuX2lzVHJpZ2dlckVsZW1lbnQoaXRlbSkgPyBpdGVtIDogdGhpcy5fZ2V0SXRlbUxpbmtFbGVtZW50KGl0ZW0pO1xyXG4gICAgY29uc3Qgc3ViID0gdGhpcy5fZ2V0SXRlbVN1YkVsZW1lbnQoaXRlbSlcclxuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5fZ2V0SXRlbU9wdGlvbihpdGVtLCAnd2lkdGgnKVxyXG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5fZ2V0SXRlbU9wdGlvbihpdGVtLCAnaGVpZ2h0JylcclxuXHJcbiAgICBsZXQgemluZGV4ID0gdGhpcy5vcHRpb25zLmRyb3Bkb3duLnppbmRleFxyXG4gICAgY29uc3QgcGFyZW50WmluZGV4ID0gZ2V0SGlnaGVzdFppbmRleChpdGVtKSAvLyB1cGRhdGVcclxuICAgIC8vIEFwcGx5IGEgbmV3IHotaW5kZXggaWYgZHJvcGRvd24ncyB0b2dnbGUgZWxlbWVudCBvciBpdCdzIHBhcmVudCBoYXMgZ3JlYXRlciB6LWluZGV4IC8vIHVwZGF0ZVxyXG4gICAgaWYgKHBhcmVudFppbmRleCAhPT0gbnVsbCAmJiBwYXJlbnRaaW5kZXggPj0gemluZGV4KSB7XHJcbiAgICAgIHppbmRleCA9IHBhcmVudFppbmRleCArIDFcclxuICAgIH1cclxuXHJcbiAgICBpZiAoemluZGV4KSB7XHJcbiAgICAgIEVsZW1lbnRTdHlsZVV0aWwuc2V0KHN1YiwgJ3otaW5kZXgnLCB6aW5kZXgpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpZHRoKSB7XHJcbiAgICAgIEVsZW1lbnRTdHlsZVV0aWwuc2V0KHN1YiwgJ3dpZHRoJywgd2lkdGgpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhlaWdodCkge1xyXG4gICAgICBFbGVtZW50U3R5bGVVdGlsLnNldChzdWIsICdoZWlnaHQnLCBoZWlnaHQpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbml0RHJvcGRvd25Qb3BwZXIoaXRlbSwgc3ViKVxyXG5cclxuICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgnc2hvdycpXHJcbiAgICBpdGVtLmNsYXNzTGlzdC5hZGQoJ21lbnUtZHJvcGRvd24nKVxyXG4gICAgc3ViLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKVxyXG5cclxuICAgIC8vIEFwcGVuZCB0aGUgc3ViIHRoZSB0aGUgcm9vdCBvZiB0aGUgbWVudVxyXG4gICAgaWYgKHRoaXMuX2dldEl0ZW1PcHRpb24oaXRlbSwgJ292ZXJmbG93JykgPT09IHRydWUpIHtcclxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzdWIpXHJcbiAgICAgIERhdGFVdGlsLnNldChpdGVtLCAnc3ViJywgc3ViKVxyXG4gICAgICBEYXRhVXRpbC5zZXQoc3ViLCAnaXRlbScsIGl0ZW0pXHJcbiAgICAgIERhdGFVdGlsLnNldChzdWIsICdtZW51JywgdGhpcylcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIERhdGFVdGlsLnNldChzdWIsICdpdGVtJywgaXRlbSlcclxuICAgIH1cclxuXHJcbiAgICBFdmVudEhhbmRsZXJVdGlsLnRyaWdnZXIodGhpcy5lbGVtZW50LCAna3QubWVudS5kcm9wZG93bi5zaG93bicpXHJcbiAgfVxyXG5cclxuICAvLyBJbml0IGRyb3Bkb3duIHBvcHBlcihuZXcpXHJcbiAgcHJpdmF0ZSBpbml0RHJvcGRvd25Qb3BwZXIgPSAoaXRlbTogSFRNTEVsZW1lbnQsIHN1YjogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIC8vIFNldHVwIHBvcHBlciBpbnN0YW5jZVxyXG4gICAgbGV0IHJlZmVyZW5jZVxyXG4gICAgY29uc3QgYXR0YWNoID0gdGhpcy5fZ2V0SXRlbU9wdGlvbihpdGVtLCAnYXR0YWNoJykgYXMgc3RyaW5nXHJcblxyXG4gICAgaWYgKGF0dGFjaCkge1xyXG4gICAgICBpZiAoYXR0YWNoID09PSAncGFyZW50Jykge1xyXG4gICAgICAgIHJlZmVyZW5jZSA9IGl0ZW0ucGFyZW50Tm9kZVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlZmVyZW5jZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYXR0YWNoKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZWZlcmVuY2UgPSBpdGVtXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlZmVyZW5jZSkge1xyXG4gICAgICBjb25zdCBwb3BwZXIgPSBjcmVhdGVQb3BwZXIoXHJcbiAgICAgICAgcmVmZXJlbmNlIGFzIEVsZW1lbnQgfCBWaXJ0dWFsRWxlbWVudCxcclxuICAgICAgICBzdWIsXHJcbiAgICAgICAgdGhpcy5fZ2V0RHJvcGRvd25Qb3BwZXJDb25maWcoaXRlbSlcclxuICAgICAgKVxyXG4gICAgICBEYXRhVXRpbC5zZXQoaXRlbSwgJ3BvcHBlcicsIHBvcHBlcilcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEhpZGUgaXRlbSBkcm9wZG93blxyXG4gIHByaXZhdGUgX2hpZGVEcm9wZG93biA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgaWYgKEV2ZW50SGFuZGxlclV0aWwudHJpZ2dlcih0aGlzLmVsZW1lbnQsICdrdC5tZW51LmRyb3Bkb3duLmhpZGUnKSA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3ViID0gdGhpcy5fZ2V0SXRlbVN1YkVsZW1lbnQoaXRlbSlcclxuICAgIEVsZW1lbnRTdHlsZVV0aWwuc2V0KHN1YiwgJ3otaW5kZXgnLCAnJylcclxuICAgIEVsZW1lbnRTdHlsZVV0aWwuc2V0KHN1YiwgJ3dpZHRoJywgJycpXHJcbiAgICBFbGVtZW50U3R5bGVVdGlsLnNldChzdWIsICdoZWlnaHQnLCAnJylcclxuICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpXHJcbiAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ21lbnUtZHJvcGRvd24nKVxyXG4gICAgc3ViLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKVxyXG5cclxuICAgIC8vIEFwcGVuZCB0aGUgc3ViIGJhY2sgdG8gaXQncyBwYXJlbnRcclxuICAgIGlmICh0aGlzLl9nZXRJdGVtT3B0aW9uKGl0ZW0sICdvdmVyZmxvdycpID09PSB0cnVlKSB7XHJcbiAgICAgIGlmIChpdGVtLmNsYXNzTGlzdC5jb250YWlucygnbWVudS1pdGVtJykpIHtcclxuICAgICAgICBpdGVtLmFwcGVuZENoaWxkKHN1YilcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpbnNlcnRBZnRlckVsZW1lbnQodGhpcy5lbGVtZW50LCBpdGVtKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBEYXRhVXRpbC5yZW1vdmUoaXRlbSwgJ3N1YicpXHJcbiAgICAgIERhdGFVdGlsLnJlbW92ZShzdWIsICdpdGVtJylcclxuICAgICAgRGF0YVV0aWwucmVtb3ZlKHN1YiwgJ21lbnUnKVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChEYXRhVXRpbC5oYXMoaXRlbSwgJ3BvcHBlcicpID09PSB0cnVlKSB7XHJcbiAgICAgIERhdGFVdGlsLmdldChpdGVtLCAncG9wcGVyJykuZGVzdHJveSgpXHJcbiAgICAgIERhdGFVdGlsLnJlbW92ZShpdGVtLCAncG9wcGVyJylcclxuICAgIH1cclxuXHJcbiAgICAvLyBEZXN0cm95IHBvcHBlcihuZXcpXHJcbiAgICB0aGlzLmRlc3Ryb3lEcm9wZG93blBvcHBlcihpdGVtKVxyXG4gICAgRXZlbnRIYW5kbGVyVXRpbC50cmlnZ2VyKHRoaXMuZWxlbWVudCwgJ2t0Lm1lbnUuZHJvcGRvd24uaGlkZGVuJylcclxuICB9XHJcblxyXG4gIC8vIERlc3Ryb3kgZHJvcGRvd24gcG9wcGVyKG5ldylcclxuICBwcml2YXRlIGRlc3Ryb3lEcm9wZG93blBvcHBlciA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgaWYgKERhdGFVdGlsLmhhcyhpdGVtLCAncG9wcGVyJykgPT09IHRydWUpIHtcclxuICAgICAgRGF0YVV0aWwuZ2V0KGl0ZW0sICdwb3BwZXInKS5kZXN0cm95KClcclxuICAgICAgRGF0YVV0aWwucmVtb3ZlKGl0ZW0sICdwb3BwZXInKVxyXG4gICAgfVxyXG5cclxuICAgIEV2ZW50SGFuZGxlclV0aWwudHJpZ2dlcih0aGlzLmVsZW1lbnQsICdrdC5tZW51LmRyb3Bkb3duLmhpZGRlbicpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zaG93QWNjb3JkaW9uID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICBpZiAoRXZlbnRIYW5kbGVyVXRpbC50cmlnZ2VyKHRoaXMuZWxlbWVudCwgJ2t0Lm1lbnUuYWNjb3JkaW9uLnNob3cnKSA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5hY2NvcmRpb24uZXhwYW5kID09PSBmYWxzZSkge1xyXG4gICAgICB0aGlzLl9oaWRlQWNjb3JkaW9ucyhpdGVtKVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChEYXRhVXRpbC5oYXMoaXRlbSwgJ3BvcHBlcicpID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuX2hpZGVEcm9wZG93bihpdGVtKVxyXG4gICAgfVxyXG5cclxuICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgnaG92ZXInKSAvLyB1cGRhdGVXV1xyXG4gICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdzaG93aW5nJylcclxuXHJcbiAgICBjb25zdCBzdWJFbGVtZW50ID0gdGhpcy5fZ2V0SXRlbVN1YkVsZW1lbnQoaXRlbSlcclxuICAgIGlmIChzdWJFbGVtZW50KSB7XHJcbiAgICAgIGNvbnN0IHN1YiA9IHN1YkVsZW1lbnQgYXMgSFRNTEVsZW1lbnRcclxuICAgICAgRWxlbWVudEFuaW1hdGVVdGlsLnNsaWRlRG93bihzdWIsIHRoaXMub3B0aW9ucy5hY2NvcmRpb24uc2xpZGVTcGVlZCwgKCkgPT4ge1xyXG4gICAgICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnc2hvd2luZycpXHJcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdzaG93JylcclxuICAgICAgICBzdWIuY2xhc3NMaXN0LmFkZCgnc2hvdycpXHJcbiAgICAgICAgRXZlbnRIYW5kbGVyVXRpbC50cmlnZ2VyKHRoaXMuZWxlbWVudCwgJ2t0Lm1lbnUuYWNjb3JkaW9uLnNob3duJylcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hpZGVBY2NvcmRpb24gPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIGlmIChFdmVudEhhbmRsZXJVdGlsLnRyaWdnZXIodGhpcy5lbGVtZW50LCAna3QubWVudS5hY2NvcmRpb24uaGlkZScpID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzdWIgPSB0aGlzLl9nZXRJdGVtU3ViRWxlbWVudChpdGVtKVxyXG4gICAgaXRlbS5jbGFzc0xpc3QuYWRkKCdoaWRpbmcnKVxyXG5cclxuICAgIGlmIChzdWIpIHtcclxuICAgICAgRWxlbWVudEFuaW1hdGVVdGlsLnNsaWRlVXAoc3ViLCB0aGlzLm9wdGlvbnMuYWNjb3JkaW9uLnNsaWRlU3BlZWQsICgpID0+IHtcclxuICAgICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGluZycpXHJcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JylcclxuICAgICAgICBzdWIuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpXHJcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdob3ZlcicpIC8vIHVwZGF0ZVxyXG4gICAgICAgIEV2ZW50SGFuZGxlclV0aWwudHJpZ2dlcih0aGlzLmVsZW1lbnQsICdrdC5tZW51LmFjY29yZGlvbi5oaWRkZW4nKVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gSGlkZSBhbGwgc2hvd24gYWNjb3JkaW9ucyBvZiBpdGVtXHJcbiAgcHJpdmF0ZSBfaGlkZUFjY29yZGlvbnMgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIGNvbnN0IGl0ZW1zVG9IaWRlID0gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zaG93W2RhdGEta3QtbWVudS10cmlnZ2VyXScpXHJcbiAgICBpZiAoaXRlbXNUb0hpZGUgJiYgaXRlbXNUb0hpZGUubGVuZ3RoID4gMCkge1xyXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaXRlbXNUb0hpZGUubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICBjb25zdCBpdGVtVG9IaWRlID0gaXRlbXNUb0hpZGVbaV0gYXMgSFRNTEVsZW1lbnRcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGhpcy5fZ2V0SXRlbVN1YlR5cGUoaXRlbVRvSGlkZSkgPT09ICdhY2NvcmRpb24nICYmXHJcbiAgICAgICAgICBpdGVtVG9IaWRlICE9PSBpdGVtICYmXHJcbiAgICAgICAgICBpdGVtLmNvbnRhaW5zKGl0ZW1Ub0hpZGUpID09PSBmYWxzZSAmJlxyXG4gICAgICAgICAgaXRlbVRvSGlkZS5jb250YWlucyhpdGVtKSA9PT0gZmFsc2VcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuX2hpZGVBY2NvcmRpb24oaXRlbVRvSGlkZSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEV2ZW50IEhhbmRsZXJzXHJcbiAgLy8gUmVzZXQgaXRlbSBzdGF0ZSBjbGFzc2VzIGlmIGl0ZW0gc3ViIHR5cGUgY2hhbmdlZFxyXG4gIHByaXZhdGUgX3Jlc2V0ID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICBpZiAodGhpcy5faGFzSXRlbVN1YihpdGVtKSA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3ViID0gdGhpcy5fZ2V0SXRlbVN1YkVsZW1lbnQoaXRlbSlcclxuXHJcbiAgICAvLyBSZXNldCBzdWIgc3RhdGUgaWYgc3ViIHR5cGUgaXMgY2hhbmdlZCBkdXJpbmcgdGhlIHdpbmRvdyByZXNpemVcclxuICAgIGlmIChEYXRhVXRpbC5oYXMoaXRlbSwgJ3R5cGUnKSAmJiBEYXRhVXRpbC5nZXQoaXRlbSwgJ3R5cGUnKSAhPT0gdGhpcy5fZ2V0SXRlbVN1YlR5cGUoaXRlbSkpIHtcclxuICAgICAgLy8gdXBkYXRlZFxyXG4gICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ2hvdmVyJylcclxuICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JylcclxuICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JylcclxuICAgICAgaWYgKHN1YiAmJiBzdWIucmVtb3ZlQ2xhc3MpIHtcclxuICAgICAgICBzdWIucmVtb3ZlQ2xhc3Moc3ViLCAnc2hvdycpXHJcbiAgICAgIH1cclxuICAgIH0gLy8gdXBkYXRlZFxyXG4gIH1cclxuXHJcbiAgLy8gVE9ETzogbm90IGRvbmVcclxuICBwcml2YXRlIF9kZXN0cm95ID0gKCkgPT4ge31cclxuXHJcbiAgLy8gVXBkYXRlIGFsbCBpdGVtIHN0YXRlIGNsYXNzZXMgaWYgaXRlbSBzdWIgdHlwZSBjaGFuZ2VkXHJcbiAgcHJpdmF0ZSBfdXBkYXRlID0gKCkgPT4ge1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1lbnUtaXRlbVtkYXRhLWt0LW1lbnUtdHJpZ2dlcl0nKVxyXG4gICAgaXRlbXMuZm9yRWFjaCgoZWwpID0+IHRoaXMuX3Jlc2V0KGVsIGFzIEhUTUxFbGVtZW50KSlcclxuICB9XHJcblxyXG4gIC8vIEhpZGUgaXRlbSBzdWJcclxuICBwcml2YXRlIF9oaWRlID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2lzSXRlbVN1YlNob3duKGl0ZW0pID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fZ2V0SXRlbVN1YlR5cGUoaXRlbSkgPT09ICdkcm9wZG93bicpIHtcclxuICAgICAgdGhpcy5faGlkZURyb3Bkb3duKGl0ZW0pXHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2dldEl0ZW1TdWJUeXBlKGl0ZW0pID09PSAnYWNjb3JkaW9uJykge1xyXG4gICAgICB0aGlzLl9oaWRlQWNjb3JkaW9uKGl0ZW0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBTaG93IGl0ZW0gc3ViXHJcbiAgcHJpdmF0ZSBfc2hvdyA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9pc0l0ZW1TdWJTaG93bihpdGVtKSA9PT0gdHJ1ZSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fZ2V0SXRlbVN1YlR5cGUoaXRlbSkgPT09ICdkcm9wZG93bicpIHtcclxuICAgICAgdGhpcy5fc2hvd0Ryb3Bkb3duKGl0ZW0pIC8vIC8vIHNob3cgY3VycmVudCBkcm9wZG93blxyXG4gICAgfSBlbHNlIGlmICh0aGlzLl9nZXRJdGVtU3ViVHlwZShpdGVtKSA9PT0gJ2FjY29yZGlvbicpIHtcclxuICAgICAgdGhpcy5fc2hvd0FjY29yZGlvbihpdGVtKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlbWVtYmVyIGxhc3Qgc3VibWVudSB0eXBlXHJcblxyXG4gICAgRGF0YVV0aWwuc2V0KGl0ZW0sICd0eXBlJywgdGhpcy5fZ2V0SXRlbVN1YlR5cGUoaXRlbSkpIC8vIHVwZGF0ZWRcclxuICB9XHJcblxyXG4gIC8vIFRvZ2dsZSBpdGVtIHN1YlxyXG4gIHByaXZhdGUgX3RvZ2dsZSA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9pc0l0ZW1TdWJTaG93bihpdGVtKSA9PT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLl9oaWRlKGl0ZW0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zaG93KGl0ZW0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBNb3VzZW91dCBoYW5kbGVcclxuICBwcml2YXRlIF9tb3VzZW91dCA9IChlbGVtZW50OiBIVE1MRWxlbWVudCwgZTogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuX2dldEl0ZW1FbGVtZW50KGVsZW1lbnQpXHJcbiAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2dldEl0ZW1PcHRpb24oaXRlbSwgJ3RyaWdnZXInKSAhPT0gJ2hvdmVyJykge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmIChEYXRhVXRpbC5nZXQoaXRlbSwgJ2hvdmVyJykgPT09ICcxJykge1xyXG4gICAgICAgIHRoaXMuX2hpZGUoaXRlbSlcclxuICAgICAgfVxyXG4gICAgfSwgdGhpcy5vcHRpb25zLmRyb3Bkb3duLmhvdmVyVGltZW91dClcclxuXHJcbiAgICBEYXRhVXRpbC5zZXQoaXRlbSwgJ2hvdmVyJywgJzEnKVxyXG4gICAgRGF0YVV0aWwuc2V0KGl0ZW0sICd0aW1lb3V0JywgdGltZW91dClcclxuICB9XHJcblxyXG4gIC8vIE1vdXNlb3ZlciBoYW5kbGVcclxuICBwcml2YXRlIF9tb3VzZW92ZXIgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQsIGU6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9nZXRJdGVtRWxlbWVudChlbGVtZW50KVxyXG4gICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9nZXRJdGVtT3B0aW9uKGl0ZW0sICd0cmlnZ2VyJykgIT09ICdob3ZlcicpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKERhdGFVdGlsLmdldChpdGVtLCAnaG92ZXInKSA9PT0gJzEnKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dChEYXRhVXRpbC5nZXQoaXRlbSwgJ3RpbWVvdXQnKSlcclxuICAgICAgRGF0YVV0aWwucmVtb3ZlKGl0ZW0sICdob3ZlcicpXHJcbiAgICAgIERhdGFVdGlsLnJlbW92ZShpdGVtLCAndGltZW91dCcpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fc2hvdyhpdGVtKVxyXG4gIH1cclxuXHJcbiAgLy8gRGlzbWlzcyBoYW5kbGVyXHJcbiAgcHJpdmF0ZSBfZGlzbWlzcyA9IChlbGVtZW50OiBIVE1MRWxlbWVudCwgZTogRXZlbnQpID0+IHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9nZXRJdGVtRWxlbWVudChlbGVtZW50KVxyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLl9nZXRJdGVtQ2hpbGRFbGVtZW50cyhpdGVtKVxyXG4gICAgLy9pZiAoIGl0ZW0gIT09IG51bGwgJiYgX2dldEl0ZW1PcHRpb24oaXRlbSwgJ3RyaWdnZXInKSA9PT0gJ2NsaWNrJyAmJiAgX2dldEl0ZW1TdWJUeXBlKGl0ZW0pID09PSAnZHJvcGRvd24nICkge1xyXG4gICAgY29uc3QgaXRlbVN1YlR5cGUgPSB0aGlzLl9nZXRJdGVtU3ViVHlwZShpdGVtKVxyXG4gICAgaWYgKGl0ZW0gIT09IG51bGwgJiYgaXRlbVN1YlR5cGUgPT09ICdkcm9wZG93bicpIHtcclxuICAgICAgdGhpcy5faGlkZShpdGVtKSAvLyBoaWRlIGl0ZW1zIGRyb3Bkb3duXHJcblxyXG4gICAgICAvLyBIaWRlIGFsbCBjaGlsZCBlbGVtZW50cyBhcyB3ZWxsXHJcbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAvL2lmICggX2dldEl0ZW1PcHRpb24oaXRlbSwgJ3RyaWdnZXInKSA9PT0gJ2NsaWNrJyAmJiAgX2dldEl0ZW1TdWJUeXBlKGl0ZW0pID09PSAnZHJvcGRvd24nICkge1xyXG4gICAgICAgICAgaWYgKGl0ZW1zW2ldICE9PSBudWxsICYmIHRoaXMuX2dldEl0ZW1TdWJUeXBlKGl0ZW1zW2ldIGFzIEhUTUxFbGVtZW50KSA9PT0gJ2Ryb3Bkb3duJykge1xyXG4gICAgICAgICAgICB0aGlzLl9oaWRlKGl0ZW1zW2ldIGFzIEhUTUxFbGVtZW50KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gTGluayBoYW5kbGVyXHJcbiAgcHJpdmF0ZSBfbGluayA9IChlbGVtZW50OiBIVE1MRWxlbWVudCwgZTogRXZlbnQpID0+IHtcclxuICAgIGlmIChFdmVudEhhbmRsZXJVdGlsLnRyaWdnZXIodGhpcy5lbGVtZW50LCAna3QubWVudS5saW5rLmNsaWNrJykgPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIC8vIERpc21pc3MgYWxsIHNob3duIGRyb3Bkb3duc1xyXG4gICAgTWVudUNvbXBvbmVudC5oaWRlRHJvcGRvd25zKHVuZGVmaW5lZClcclxuICAgIEV2ZW50SGFuZGxlclV0aWwudHJpZ2dlcih0aGlzLmVsZW1lbnQsICdrdC5tZW51LmxpbmsuY2xpY2tlZCcpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jbGljayA9IChlbGVtZW50OiBIVE1MRWxlbWVudCwgZTogRXZlbnQpID0+IHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMuX2dldEl0ZW1FbGVtZW50KGVsZW1lbnQpXHJcbiAgICBpZiAodGhpcy5fZ2V0SXRlbU9wdGlvbihpdGVtLCAndHJpZ2dlcicpICE9PSAnY2xpY2snKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9nZXRJdGVtT3B0aW9uKGl0ZW0sICd0b2dnbGUnKSA9PT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5fc2hvdyhpdGVtKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fdG9nZ2xlKGl0ZW0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gIC8vICoqIFB1YmxpYyBBUEkgICoqIC8vXHJcbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICBwdWJsaWMgY2xpY2sgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQsIGU6IEV2ZW50KSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2xpY2soZWxlbWVudCwgZSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsaW5rID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBlOiBFdmVudCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xpbmsoZWxlbWVudCwgZSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNtaXNzID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBlOiBFdmVudCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc21pc3MoZWxlbWVudCwgZSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3VzZW92ZXIgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQsIGU6IEV2ZW50KSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbW91c2VvdmVyKGVsZW1lbnQsIGUgYXMgTW91c2VFdmVudClcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3VzZW91dCA9IChlbGVtZW50OiBIVE1MRWxlbWVudCwgZTogRXZlbnQpID0+IHtcclxuICAgIHJldHVybiB0aGlzLl9tb3VzZW91dChlbGVtZW50LCBlIGFzIE1vdXNlRXZlbnQpXHJcbiAgfVxyXG5cclxuICAvLyBHZW5lcmFsIE1ldGhvZHNcclxuICBwdWJsaWMgZ2V0SXRlbVRyaWdnZXJUeXBlID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZ2V0SXRlbU9wdGlvbihpdGVtLCAndHJpZ2dlcicpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SXRlbVN1YlR5cGUgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIHJldHVybiB0aGlzLl9nZXRJdGVtU3ViVHlwZShlbGVtZW50KVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3cgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIHJldHVybiB0aGlzLl9zaG93KGl0ZW0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGlkZSA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2hpZGUoaXRlbSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldCA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Jlc2V0KGl0ZW0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlID0gKCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZSgpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RWxlbWVudCA9ICgpID0+IHtcclxuICAgIHJldHVybiB0aGlzLmVsZW1lbnRcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRJdGVtTGlua0VsZW1lbnQgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIHJldHVybiB0aGlzLl9nZXRJdGVtTGlua0VsZW1lbnQoaXRlbSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRJdGVtVG9nZ2xlRWxlbWVudCA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2dldEl0ZW1Ub2dnbGVFbGVtZW50KGl0ZW0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SXRlbVN1YkVsZW1lbnQgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIHJldHVybiB0aGlzLl9nZXRJdGVtU3ViRWxlbWVudChpdGVtKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEl0ZW1QYXJlbnRFbGVtZW50cyA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2dldEl0ZW1QYXJlbnRFbGVtZW50cyhpdGVtKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzSXRlbVN1YlNob3duID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNJdGVtU3ViU2hvd24oaXRlbSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0l0ZW1QYXJlbnRTaG93biA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzSXRlbVBhcmVudFNob3duKGl0ZW0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VHJpZ2dlckVsZW1lbnQgPSAoKSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy50cmlnZ2VyRWxlbWVudFxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzSXRlbURyb3Bkb3duUGVybWFuZW50ID0gKGl0ZW06IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNJdGVtRHJvcGRvd25QZXJtYW5lbnQoaXRlbSlcclxuICB9XHJcblxyXG4gIC8vIEFjY29yZGlvbiBNb2RlIE1ldGhvZHNcclxuICBwdWJsaWMgaGlkZUFjY29yZGlvbnMgPSAoaXRlbTogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgIHJldHVybiB0aGlzLl9oaWRlQWNjb3JkaW9ucyhpdGVtKVxyXG4gIH1cclxuXHJcbiAgLy8gRXZlbnQgQVBJXHJcbiAgcHVibGljIG9uID0gKG5hbWU6IHN0cmluZywgaGFuZGxlcjogYW55KSA9PiB7XHJcbiAgICByZXR1cm4gRXZlbnRIYW5kbGVyVXRpbC5vbih0aGlzLmVsZW1lbnQsIG5hbWUsIGhhbmRsZXIpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25lID0gKG5hbWU6IHN0cmluZywgaGFuZGxlcjogYW55KSA9PiB7XHJcbiAgICByZXR1cm4gRXZlbnRIYW5kbGVyVXRpbC5vbmUodGhpcy5lbGVtZW50LCBuYW1lLCBoYW5kbGVyKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9mZiA9IChuYW1lOiBzdHJpbmcpID0+IHtcclxuICAgIHJldHVybiBFdmVudEhhbmRsZXJVdGlsLm9mZih0aGlzLmVsZW1lbnQsIG5hbWUpXHJcbiAgfVxyXG5cclxuICAvLyBwdWJsaWMgc3RhdGljIG1ldGhvZHNcclxuICAvLyBHZXQgS1RNZW51IGluc3RhbmNlIGJ5IGVsZW1lbnRcclxuICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICAvLyBFbGVtZW50IGhhcyBtZW51IERPTSByZWZlcmVuY2UgaW4gaXQncyBEQVRBIHN0b3JhZ2VcclxuICAgIGNvbnN0IGVsZW1lbnRNZW51ID0gRGF0YVV0aWwuZ2V0KGVsZW1lbnQsICdtZW51JylcclxuICAgIGlmIChlbGVtZW50TWVudSkge1xyXG4gICAgICByZXR1cm4gZWxlbWVudE1lbnVcclxuICAgIH1cclxuXHJcbiAgICAvLyBFbGVtZW50IGhhcyAubWVudSBwYXJlbnRcclxuICAgIGNvbnN0IG1lbnUgPSBlbGVtZW50LmNsb3Nlc3QoJy5tZW51JylcclxuICAgIGlmIChtZW51KSB7XHJcbiAgICAgIGNvbnN0IG1lbnVEYXRhID0gRGF0YVV0aWwuZ2V0KG1lbnUgYXMgSFRNTEVsZW1lbnQsICdtZW51JylcclxuICAgICAgaWYgKG1lbnVEYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIG1lbnVEYXRhXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBFbGVtZW50IGhhcyBhIHBhcmVudCB3aXRoIERPTSByZWZlcmVuY2UgdG8gLm1lbnUgaW4gaXQncyBEQVRBIHN0b3JhZ2VcclxuICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbWVudS1saW5rJykpIHtcclxuICAgICAgY29uc3Qgc3ViID0gZWxlbWVudC5jbG9zZXN0KCcubWVudS1zdWInKVxyXG4gICAgICBpZiAoc3ViKSB7XHJcbiAgICAgICAgY29uc3Qgc3ViTWVudSA9IERhdGFVdGlsLmdldChzdWIgYXMgSFRNTEVsZW1lbnQsICdtZW51JylcclxuICAgICAgICBpZiAoc3ViTWVudSkge1xyXG4gICAgICAgICAgcmV0dXJuIHN1Yk1lbnVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxuXHJcbiAgLy8gSGlkZSBhbGwgZHJvcGRvd25zIGFuZCBza2lwIG9uZSBpZiBwcm92aWRlZFxyXG4gIHB1YmxpYyBzdGF0aWMgaGlkZURyb3Bkb3ducyA9IChza2lwOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCkgPT4ge1xyXG4gICAgY29uc3QgaXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2hvdy5tZW51LWRyb3Bkb3duW2RhdGEta3QtbWVudS10cmlnZ2VyXScpXHJcblxyXG4gICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldXHJcbiAgICAgICAgY29uc3QgbWVudSA9IE1lbnVDb21wb25lbnQuZ2V0SW5zdGFuY2UoaXRlbSBhcyBIVE1MRWxlbWVudClcclxuXHJcbiAgICAgICAgaWYgKG1lbnUgJiYgbWVudS5nZXRJdGVtU3ViVHlwZShpdGVtKSA9PT0gJ2Ryb3Bkb3duJykge1xyXG4gICAgICAgICAgaWYgKHNraXApIHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgIG1lbnUuZ2V0SXRlbVN1YkVsZW1lbnQoaXRlbSkuY29udGFpbnMoc2tpcCkgPT09IGZhbHNlICYmXHJcbiAgICAgICAgICAgICAgaXRlbS5jb250YWlucyhza2lwKSA9PT0gZmFsc2UgJiZcclxuICAgICAgICAgICAgICBpdGVtICE9PSBza2lwXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIG1lbnUuaGlkZShpdGVtKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtZW51LmhpZGUoaXRlbSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlRHJvcGRvd25zID0gKCkgPT4ge1xyXG4gICAgY29uc3QgaXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2hvdy5tZW51LWRyb3Bkb3duW2RhdGEta3QtbWVudS10cmlnZ2VyXScpXHJcbiAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICB2YXIgaXRlbSA9IGl0ZW1zW2ldXHJcblxyXG4gICAgICAgIGlmIChEYXRhVXRpbC5oYXMoaXRlbSBhcyBIVE1MRWxlbWVudCwgJ3BvcHBlcicpKSB7XHJcbiAgICAgICAgICBEYXRhVXRpbC5nZXQoaXRlbSBhcyBIVE1MRWxlbWVudCwgJ3BvcHBlcicpLmZvcmNlVXBkYXRlKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEdsb2JhbCBoYW5kbGVyc1xyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlSW5zdGFuY2VzID0gKHNlbGVjdG9yOiBzdHJpbmcpID0+IHtcclxuICAgIC8vIEluaXRpYWxpemUgbWVudXNcclxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpLmZvckVhY2goKGVsKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lbnVJdGVtID0gZWwgYXMgSFRNTEVsZW1lbnRcclxuICAgICAgbGV0IG1lbnVJbnN0YW5jZSA9IE1lbnVDb21wb25lbnQuZ2V0SW5zdGFuY2UobWVudUl0ZW0pXHJcbiAgICAgIGlmICghbWVudUluc3RhbmNlKSB7XHJcbiAgICAgICAgbWVudUluc3RhbmNlID0gbmV3IE1lbnVDb21wb25lbnQoZWwgYXMgSFRNTEVsZW1lbnQsIGRlZmF1bHRNZW51T3B0aW9ucylcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgaW5pdEdsb2JhbEhhbmRsZXJzID0gKCkgPT4ge1xyXG4gICAgLy8gRHJvcGRvd24gaGFuZGxlclxyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICBjb25zdCBtZW51SXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2hvdy5tZW51LWRyb3Bkb3duW2RhdGEta3QtbWVudS10cmlnZ2VyXScpXHJcbiAgICAgIGlmIChtZW51SXRlbXMgJiYgbWVudUl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lbnVJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgY29uc3QgaXRlbSA9IG1lbnVJdGVtc1tpXSBhcyBIVE1MRWxlbWVudFxyXG4gICAgICAgICAgY29uc3QgbWVudU9iaiA9IE1lbnVDb21wb25lbnQuZ2V0SW5zdGFuY2UoaXRlbSkgYXMgTWVudUNvbXBvbmVudFxyXG4gICAgICAgICAgaWYgKG1lbnVPYmogJiYgbWVudU9iai5nZXRJdGVtU3ViVHlwZShpdGVtKSA9PT0gJ2Ryb3Bkb3duJykge1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICAgICAgICAgIGNvbnN0IG1lbnUgPSBtZW51T2JqLmdldEVsZW1lbnQoKVxyXG4gICAgICAgICAgICBjb25zdCBzdWIgPSBtZW51T2JqLmdldEl0ZW1TdWJFbGVtZW50KGl0ZW0pIGFzIEhUTUxFbGVtZW50XHJcbiAgICAgICAgICAgIGlmIChpdGVtID09PSBlLnRhcmdldCB8fCBpdGVtLmNvbnRhaW5zKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzdWIgJiYgKHN1YiA9PT0gZS50YXJnZXQgfHwgc3ViLmNvbnRhaW5zKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSkpIHtcclxuICAgICAgICAgICAgICBjb250aW51ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG1lbnVPYmouaGlkZShpdGVtKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICAvLyBTdWIgdG9nZ2xlIGhhbmRsZXJcclxuICAgIERPTUV2ZW50SGFuZGxlclV0aWwub24oXHJcbiAgICAgIGRvY3VtZW50LmJvZHksXHJcbiAgICAgICcubWVudS1pdGVtW2RhdGEta3QtbWVudS10cmlnZ2VyXSA+IC5tZW51LWxpbmssIFtkYXRhLWt0LW1lbnUtdHJpZ2dlcl06bm90KC5tZW51LWl0ZW0pOm5vdChbZGF0YS1rdC1tZW51LXRyaWdnZXI9XCJhdXRvXCJdKScsXHJcbiAgICAgICdjbGljaycsXHJcbiAgICAgIGZ1bmN0aW9uICh0aGlzOiBIVE1MRWxlbWVudCwgZTogRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBtZW51ID0gTWVudUNvbXBvbmVudC5nZXRJbnN0YW5jZSh0aGlzKSBhcyBNZW51Q29tcG9uZW50XHJcbiAgICAgICAgaWYgKG1lbnUpIHtcclxuICAgICAgICAgIHJldHVybiBtZW51LmNsaWNrKHRoaXMsIGUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApXHJcblxyXG4gICAgLy8gLy8gTGluayBoYW5kbGVyXHJcbiAgICBET01FdmVudEhhbmRsZXJVdGlsLm9uKFxyXG4gICAgICBkb2N1bWVudC5ib2R5LFxyXG4gICAgICAnLm1lbnUtaXRlbTpub3QoW2RhdGEta3QtbWVudS10cmlnZ2VyXSkgPiAubWVudS1saW5rJyxcclxuICAgICAgJ2NsaWNrJyxcclxuICAgICAgZnVuY3Rpb24gKHRoaXM6IEhUTUxFbGVtZW50LCBlOiBFdmVudCkge1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcclxuICAgICAgICBjb25zdCBtZW51ID0gTWVudUNvbXBvbmVudC5nZXRJbnN0YW5jZSh0aGlzKVxyXG4gICAgICAgIGlmIChtZW51ICYmIG1lbnUubGluaykge1xyXG4gICAgICAgICAgcmV0dXJuIG1lbnUubGluayh0aGlzLCBlKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKVxyXG5cclxuICAgIC8vIERpc21pc3MgaGFuZGxlclxyXG4gICAgRE9NRXZlbnRIYW5kbGVyVXRpbC5vbihcclxuICAgICAgZG9jdW1lbnQuYm9keSxcclxuICAgICAgJ1tkYXRhLWt0LW1lbnUtZGlzbWlzcz1cInRydWVcIl0nLFxyXG4gICAgICAnY2xpY2snLFxyXG4gICAgICBmdW5jdGlvbiAodGhpczogSFRNTEVsZW1lbnQsIGU6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgbWVudSA9IE1lbnVDb21wb25lbnQuZ2V0SW5zdGFuY2UodGhpcykgYXMgTWVudUNvbXBvbmVudFxyXG4gICAgICAgIGlmIChtZW51KSB7XHJcbiAgICAgICAgICByZXR1cm4gbWVudS5kaXNtaXNzKHRoaXMsIGUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApXHJcblxyXG4gICAgLy8gTW91c2VvdmVyIGhhbmRsZXJcclxuICAgIERPTUV2ZW50SGFuZGxlclV0aWwub24oXHJcbiAgICAgIGRvY3VtZW50LmJvZHksXHJcbiAgICAgICdbZGF0YS1rdC1tZW51LXRyaWdnZXJdLCAubWVudS1zdWInLFxyXG4gICAgICAnbW91c2VvdmVyJyxcclxuICAgICAgZnVuY3Rpb24gKHRoaXM6IEhUTUxFbGVtZW50LCBlOiBFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IG1lbnUgPSBNZW51Q29tcG9uZW50LmdldEluc3RhbmNlKHRoaXMpIGFzIE1lbnVDb21wb25lbnRcclxuICAgICAgICBpZiAobWVudSAmJiBtZW51LmdldEl0ZW1TdWJUeXBlKHRoaXMpID09PSAnZHJvcGRvd24nKSB7XHJcbiAgICAgICAgICByZXR1cm4gbWVudS5tb3VzZW92ZXIodGhpcywgZSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIClcclxuXHJcbiAgICAvLyBNb3VzZW91dCBoYW5kbGVyXHJcbiAgICBET01FdmVudEhhbmRsZXJVdGlsLm9uKFxyXG4gICAgICBkb2N1bWVudC5ib2R5LFxyXG4gICAgICAnW2RhdGEta3QtbWVudS10cmlnZ2VyXSwgLm1lbnUtc3ViJyxcclxuICAgICAgJ21vdXNlb3V0JyxcclxuICAgICAgZnVuY3Rpb24gKHRoaXM6IEhUTUxFbGVtZW50LCBlOiBFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IG1lbnUgPSBNZW51Q29tcG9uZW50LmdldEluc3RhbmNlKHRoaXMpIGFzIE1lbnVDb21wb25lbnRcclxuICAgICAgICBpZiAobWVudSAmJiBtZW51LmdldEl0ZW1TdWJUeXBlKHRoaXMpID09PSAnZHJvcGRvd24nKSB7XHJcbiAgICAgICAgICByZXR1cm4gbWVudS5tb3VzZW91dCh0aGlzLCBlKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKVxyXG5cclxuICAgIC8vIFJlc2l6ZSBoYW5kbGVyXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4ge1xyXG4gICAgICBsZXQgdGltZXJcclxuICAgICAgdGhyb3R0bGUoXHJcbiAgICAgICAgdGltZXIsXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgLy8gTG9jYXRlIGFuZCB1cGRhdGUgRHJhd2VyIGluc3RhbmNlcyBvbiB3aW5kb3cgcmVzaXplXHJcbiAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWt0LW1lbnU9XCJ0cnVlXCJdJylcclxuICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lbnUgPSBNZW51Q29tcG9uZW50LmdldEluc3RhbmNlKGVsIGFzIEhUTUxFbGVtZW50KVxyXG4gICAgICAgICAgICBpZiAobWVudSkge1xyXG4gICAgICAgICAgICAgIG1lbnUudXBkYXRlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9LFxyXG4gICAgICAgIDIwMFxyXG4gICAgICApXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBib290c3RyYXAgPSAoKSA9PiB7XHJcbiAgICBNZW51Q29tcG9uZW50LmluaXRHbG9iYWxIYW5kbGVycygpXHJcbiAgICBNZW51Q29tcG9uZW50LmNyZWF0ZUluc3RhbmNlcygnW2RhdGEta3QtbWVudT1cInRydWVcIl0nKVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWluaXRpYWxpemF0aW9uID0gKCkgPT4ge1xyXG4gICAgTWVudUNvbXBvbmVudC5jcmVhdGVJbnN0YW5jZXMoJ1tkYXRhLWt0LW1lbnU9XCJ0cnVlXCJdJylcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlSW5zYW5jZSA9IChcclxuICAgIHNlbGVjdG9yOiBzdHJpbmcsXHJcbiAgICBvcHRpb25zOiBNZW51T3B0aW9ucyA9IGRlZmF1bHRNZW51T3B0aW9uc1xyXG4gICk6IE1lbnVDb21wb25lbnQgfCB1bmRlZmluZWQgPT4ge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcihzZWxlY3RvcilcclxuICAgIGlmICghZWxlbWVudCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50IGFzIEhUTUxFbGVtZW50XHJcbiAgICBsZXQgbWVudSA9IE1lbnVDb21wb25lbnQuZ2V0SW5zdGFuY2UoaXRlbSlcclxuICAgIGlmICghbWVudSkge1xyXG4gICAgICBtZW51ID0gbmV3IE1lbnVDb21wb25lbnQoaXRlbSwgb3B0aW9ucylcclxuICAgIH1cclxuICAgIHJldHVybiBtZW51XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQge01lbnVDb21wb25lbnQsIGRlZmF1bHRNZW51T3B0aW9uc31cclxuXHJcbiJdfQ==