@projectcor/maia-components 2.44.4 → 2.44.5-0

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 (427) hide show
  1. package/lib/App.js +44 -19
  2. package/lib/components/atoms/ActionableButton.spec.js +111 -0
  3. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +52 -0
  4. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +11 -0
  5. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +135 -0
  6. package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +123 -0
  7. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +65 -0
  8. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +66 -0
  9. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +5 -51
  10. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +211 -0
  11. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +78 -0
  12. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +55 -0
  13. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +41 -0
  14. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +18 -76
  15. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +253 -0
  16. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +80 -0
  17. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +31 -0
  18. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +33 -0
  19. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +3 -31
  20. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +25 -0
  21. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +4 -0
  22. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +11 -0
  23. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +2 -4
  24. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +77 -0
  25. package/lib/components/atoms/Backdrop/Backdrop.spec.js +28 -0
  26. package/lib/components/atoms/CardMenu/CardMenu.spec.js +56 -0
  27. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +67 -0
  28. package/lib/components/atoms/Checkbox/Checkbox.spec.js +27 -0
  29. package/lib/components/atoms/Chip/Chip.spec.js +82 -0
  30. package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +26 -0
  31. package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +88 -0
  32. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +29 -0
  33. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +46 -0
  34. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +227 -0
  35. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +77 -0
  36. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +15 -255
  37. package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +81 -0
  38. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +31 -0
  39. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +48 -0
  40. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +5 -34
  41. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +231 -0
  42. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +107 -0
  43. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +136 -0
  44. package/lib/components/atoms/CopyToClipboard.spec.js +74 -0
  45. package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +76 -0
  46. package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +86 -0
  47. package/lib/components/atoms/Expand/Expand.spec.js +57 -0
  48. package/lib/components/atoms/Fade/Fade.spec.js +31 -0
  49. package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +75 -0
  50. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +104 -0
  51. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +3 -1
  52. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +91 -0
  53. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +19 -7
  54. package/lib/components/atoms/HelpButton.spec.js +87 -0
  55. package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +96 -0
  56. package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +54 -0
  57. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +21 -0
  58. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +20 -0
  59. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +26 -0
  60. package/lib/components/atoms/LoadingText/LoadingText.spec.js +25 -0
  61. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +42 -0
  62. package/lib/components/atoms/MAIAError/MAIAError.spec.js +27 -0
  63. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +12 -0
  64. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +26 -0
  65. package/lib/components/atoms/MAIAInput/MAIAInput.js +4 -10
  66. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +430 -0
  67. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +50 -0
  68. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +20 -0
  69. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +8 -60
  70. package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +53 -0
  71. package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +22 -0
  72. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +64 -0
  73. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +43 -0
  74. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +114 -0
  75. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +51 -0
  76. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +48 -0
  77. package/lib/components/atoms/ModalProject/ModalProject.spec.js +66 -0
  78. package/lib/components/atoms/NextPageLoader.spec.js +37 -0
  79. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +20 -0
  80. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +17 -0
  81. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +35 -0
  82. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +3 -15
  83. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +47 -0
  84. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +86 -0
  85. package/lib/components/atoms/PrimaryButton.spec.js +42 -0
  86. package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +69 -0
  87. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +7 -2
  88. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +69 -0
  89. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +21 -16
  90. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +7 -5
  91. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +59 -0
  92. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +72 -52
  93. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +132 -0
  94. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +162 -0
  95. package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +6 -1
  96. package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +70 -0
  97. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +36 -15
  98. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +120 -0
  99. package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +4 -0
  100. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +10 -0
  101. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +31 -0
  102. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +52 -0
  103. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +90 -0
  104. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +16 -0
  105. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +107 -0
  106. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +24 -0
  107. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +85 -0
  108. package/lib/components/atoms/Switch/Switch.spec.js +41 -0
  109. package/lib/components/atoms/TextArea/CustomTextArea.spec.js +52 -0
  110. package/lib/components/atoms/TextArea/TextArea.spec.js +68 -0
  111. package/lib/components/atoms/ThirdButton.spec.js +29 -0
  112. package/lib/components/atoms/VideoModal/VideoModal.spec.js +68 -0
  113. package/lib/components/atoms/WithAppCfg.spec.js +60 -0
  114. package/lib/components/index.js +2 -1
  115. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +37 -0
  116. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +53 -0
  117. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +5 -29
  118. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +371 -0
  119. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +39 -0
  120. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +57 -0
  121. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +6 -40
  122. package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +227 -0
  123. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +86 -0
  124. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +108 -0
  125. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +18 -90
  126. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +254 -0
  127. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +17 -0
  128. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +50 -0
  129. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +5 -15
  130. package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +94 -0
  131. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +83 -0
  132. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +30 -0
  133. package/lib/components/molecules/AgentInputBlock/index.js +5 -0
  134. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +52 -0
  135. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +76 -0
  136. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +20 -0
  137. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +34 -0
  138. package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +36 -0
  139. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +66 -0
  140. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -3
  141. package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +145 -0
  142. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +204 -0
  143. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +21 -6
  144. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +246 -0
  145. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +86 -0
  146. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +104 -0
  147. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +54 -0
  148. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +77 -0
  149. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +19 -47
  150. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +410 -0
  151. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +46 -0
  152. package/lib/components/molecules/ChatAIMessages/newStyles.js +29 -26
  153. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +147 -4
  154. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +471 -0
  155. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +64 -108
  156. package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +659 -0
  157. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +5 -0
  158. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +33 -0
  159. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +3 -2
  160. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +116 -0
  161. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +15 -153
  162. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +134 -0
  163. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +2 -26
  164. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +30 -0
  165. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +95 -0
  166. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +76 -86
  167. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +241 -0
  168. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +37 -0
  169. package/lib/components/molecules/ChatAIModal/constants.spec.js +16 -0
  170. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +22 -0
  171. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +67 -0
  172. package/lib/components/molecules/ChatAIModal/layout.spec.js +72 -0
  173. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +172 -0
  174. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +128 -0
  175. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +66 -0
  176. package/lib/components/molecules/ChatFooter/ChatFooter.js +5 -3
  177. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +355 -0
  178. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +10 -0
  179. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +48 -0
  180. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +82 -0
  181. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +9 -44
  182. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +139 -0
  183. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +84 -0
  184. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +116 -0
  185. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +126 -0
  186. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +115 -0
  187. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +79 -0
  188. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +37 -0
  189. package/lib/components/molecules/Sidebar/Sidebar.js +41 -23
  190. package/lib/components/molecules/Sidebar/Sidebar.spec.js +453 -0
  191. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +198 -0
  192. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +385 -0
  193. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +56 -171
  194. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +1125 -0
  195. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +112 -0
  196. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +405 -0
  197. package/lib/components/organisms/ChatAI/ChatAI.spec.js +174 -0
  198. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +525 -0
  199. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +231 -0
  200. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
  201. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +253 -0
  202. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +139 -0
  203. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +13 -0
  204. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +267 -0
  205. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +261 -0
  206. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +194 -0
  207. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +105 -0
  208. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +73 -0
  209. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +38 -0
  210. package/lib/components/organisms/ChatAIPage/getDaypart.js +9 -0
  211. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +19 -0
  212. package/lib/components/organisms/ChatAIPage/index.js +3 -0
  213. package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +53 -0
  214. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +59 -0
  215. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +79 -0
  216. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +86 -0
  217. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +49 -0
  218. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +67 -0
  219. package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +117 -0
  220. package/lib/components/organisms/SnackBar/Snackbar.spec.js +66 -0
  221. package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +19 -0
  222. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +52 -0
  223. package/lib/constants/maiaExternalConnectorsAccess.spec.js +29 -0
  224. package/lib/constants/permissions/index.js +2 -2
  225. package/lib/constants/permissions/utils.js +4 -1
  226. package/lib/constants/permissions/utils.spec.js +128 -0
  227. package/lib/dev/DevMaiaPage.js +30 -0
  228. package/lib/dev/DevReasoningTimeline.js +68 -37
  229. package/lib/dev/Providers.js +5 -3
  230. package/lib/hooks/frequentlyUsedActionsCache.js +17 -0
  231. package/lib/hooks/frequentlyUsedActionsCache.spec.js +25 -0
  232. package/lib/hooks/useAccessClient/useAccessClient.spec.js +149 -0
  233. package/lib/hooks/useAgentModel/useAgentModel.spec.js +83 -0
  234. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +231 -0
  235. package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +183 -0
  236. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +313 -0
  237. package/lib/hooks/useAgentSuggestions.spec.js +89 -0
  238. package/lib/hooks/useCaretPosition.spec.js +58 -0
  239. package/lib/hooks/useChatManager/useChatManager.helpers.js +353 -0
  240. package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +506 -0
  241. package/lib/hooks/useChatManager/useChatManager.js +76 -351
  242. package/lib/hooks/useChatManager/useChatManager.spec.js +1261 -0
  243. package/lib/hooks/useChatMessages/useChatMessages.helpers.js +109 -0
  244. package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +176 -0
  245. package/lib/hooks/useChatMessages/useChatMessages.js +12 -82
  246. package/lib/hooks/useChatMessages/useChatMessages.spec.js +379 -0
  247. package/lib/hooks/useChats/useChats.spec.js +208 -0
  248. package/lib/hooks/useClientSearch.helpers.js +36 -0
  249. package/lib/hooks/useClientSearch.helpers.spec.js +52 -0
  250. package/lib/hooks/useClientSearch.js +4 -32
  251. package/lib/hooks/useClientSearch.spec.js +86 -0
  252. package/lib/hooks/useContextMentions.helpers.js +152 -0
  253. package/lib/hooks/useContextMentions.helpers.spec.js +143 -0
  254. package/lib/hooks/useContextMentions.js +2 -163
  255. package/lib/hooks/useContextMentions.spec.js +239 -0
  256. package/lib/hooks/useContextMentions.types.js +2 -0
  257. package/lib/hooks/useContextPinPopover.helpers.js +95 -0
  258. package/lib/hooks/useContextPinPopover.helpers.spec.js +115 -0
  259. package/lib/hooks/useContextPinPopover.js +16 -75
  260. package/lib/hooks/useContextPinPopover.spec.js +159 -0
  261. package/lib/hooks/useContinueLegacyContextInNewChat/index.js +2 -0
  262. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +93 -0
  263. package/lib/hooks/useDebounce.spec.js +42 -0
  264. package/lib/hooks/useEntitySearch.helpers.js +359 -0
  265. package/lib/hooks/useEntitySearch.helpers.spec.js +321 -0
  266. package/lib/hooks/useEntitySearch.js +38 -391
  267. package/lib/hooks/useEntitySearch.spec.js +443 -0
  268. package/lib/hooks/useEvent.spec.js +45 -0
  269. package/lib/hooks/useFrequentlyAskedQuestions.spec.js +222 -0
  270. package/lib/hooks/useFrequentlyUsedActions.js +60 -22
  271. package/lib/hooks/useFrequentlyUsedActions.spec.js +135 -0
  272. package/lib/hooks/useIsMaiaPageRoute.js +26 -0
  273. package/lib/hooks/useIsMaiaPageRoute.spec.js +26 -0
  274. package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +122 -0
  275. package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +148 -0
  276. package/lib/hooks/useKnowledge/saveKnowledge.spec.js +104 -0
  277. package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +178 -0
  278. package/lib/hooks/useMaiaChatSessionMeta/index.js +2 -0
  279. package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +24 -0
  280. package/lib/hooks/useMentionAllowedTypes.spec.js +89 -0
  281. package/lib/hooks/useMentionPopover.helpers.js +41 -0
  282. package/lib/hooks/useMentionPopover.helpers.spec.js +71 -0
  283. package/lib/hooks/useMentionPopover.js +9 -35
  284. package/lib/hooks/useMentionPopover.spec.js +215 -0
  285. package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +47 -0
  286. package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +132 -0
  287. package/lib/hooks/useMinimizedPillBottomOffset.js +15 -45
  288. package/lib/hooks/useMinimizedPillBottomOffset.spec.js +89 -0
  289. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +67 -0
  290. package/lib/hooks/useModal/useModal.spec.js +73 -0
  291. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +192 -0
  292. package/lib/hooks/useProjectSearch.helpers.js +61 -0
  293. package/lib/hooks/useProjectSearch.helpers.spec.js +70 -0
  294. package/lib/hooks/useProjectSearch.js +4 -58
  295. package/lib/hooks/useProjectSearch.spec.js +91 -0
  296. package/lib/hooks/useProjectSummary.spec.js +193 -0
  297. package/lib/hooks/useProjectSummaryConfig.helpers.js +62 -0
  298. package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +92 -0
  299. package/lib/hooks/useProjectSummaryConfig.js +14 -52
  300. package/lib/hooks/useProjectSummaryConfig.spec.js +133 -0
  301. package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +112 -0
  302. package/lib/hooks/useRecentClientsSearch.helpers.js +33 -0
  303. package/lib/hooks/useRecentClientsSearch.helpers.spec.js +33 -0
  304. package/lib/hooks/useRecentClientsSearch.js +4 -32
  305. package/lib/hooks/useRecentClientsSearch.spec.js +85 -0
  306. package/lib/hooks/useRecentContexts.spec.js +139 -0
  307. package/lib/hooks/useResize.spec.js +37 -0
  308. package/lib/hooks/useSkillsCatalog.spec.js +88 -0
  309. package/lib/hooks/useSlashCommands.spec.js +139 -0
  310. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +101 -0
  311. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +33 -0
  312. package/lib/hooks/useStreamResponse.spec.js +199 -0
  313. package/lib/hooks/useT.spec.js +20 -0
  314. package/lib/hooks/useToggle.spec.js +33 -0
  315. package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +171 -0
  316. package/lib/index.js +5 -2
  317. package/lib/lang/br/index.js +26 -1
  318. package/lib/lang/en/index.js +26 -1
  319. package/lib/lang/es/index.js +26 -1
  320. package/lib/lang/fr/index.js +26 -1
  321. package/lib/services/maia/Access/updateAccess.spec.js +137 -0
  322. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  323. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +56 -0
  324. package/lib/services/maia/Actions/getSlashCommands.spec.js +91 -0
  325. package/lib/services/maia/Agents/connectors.spec.js +359 -0
  326. package/lib/services/maia/Agents/createAgent.spec.js +55 -0
  327. package/lib/services/maia/Agents/deleteAgent.spec.js +57 -0
  328. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +108 -0
  329. package/lib/services/maia/Agents/getAgentById.spec.js +190 -0
  330. package/lib/services/maia/Agents/getAgentModels.spec.js +190 -0
  331. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +89 -0
  332. package/lib/services/maia/Agents/getAgents.helpers.js +181 -0
  333. package/lib/services/maia/Agents/getAgents.helpers.spec.js +211 -0
  334. package/lib/services/maia/Agents/getAgents.js +78 -242
  335. package/lib/services/maia/Agents/getAgents.spec.js +697 -0
  336. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +45 -0
  337. package/lib/services/maia/Agents/toggleFavorite.spec.js +59 -0
  338. package/lib/services/maia/Agents/updateAgent.spec.js +48 -0
  339. package/lib/services/maia/Chats/deleteChat.spec.js +31 -0
  340. package/lib/services/maia/Chats/getChatMessages.spec.js +150 -0
  341. package/lib/services/maia/Chats/getChatsByUserId.spec.js +149 -0
  342. package/lib/services/maia/Chats/markSessionAsRead.spec.js +30 -0
  343. package/lib/services/maia/Chats/patchChat.spec.js +41 -0
  344. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +28 -0
  345. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +58 -0
  346. package/lib/services/maia/Knowledge/delete.spec.js +45 -0
  347. package/lib/services/maia/Knowledge/download.spec.js +78 -0
  348. package/lib/services/maia/Knowledge/save.spec.js +58 -0
  349. package/lib/services/maia/Orchestrator/orchestrator.helpers.js +130 -0
  350. package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +153 -0
  351. package/lib/services/maia/Orchestrator/orchestrator.js +38 -121
  352. package/lib/services/maia/Orchestrator/orchestrator.spec.js +181 -0
  353. package/lib/services/maia/RecentClients/getRecentClients.spec.js +52 -0
  354. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +103 -0
  355. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +82 -0
  356. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +63 -0
  357. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +82 -0
  358. package/lib/services/maia/Skills/createSkill.spec.js +68 -0
  359. package/lib/services/maia/Skills/deleteSkill.spec.js +42 -0
  360. package/lib/services/maia/Skills/generateSkill.spec.js +48 -0
  361. package/lib/services/maia/Skills/getSkills.spec.js +152 -0
  362. package/lib/services/maia/Skills/updateSkill.spec.js +62 -0
  363. package/lib/services/maia/client.spec.js +56 -0
  364. package/lib/services/utils/fetchCOR.spec.js +211 -0
  365. package/lib/services/utils/getCookie.spec.js +20 -0
  366. package/lib/services/utils/mapChatMessages.spec.js +254 -0
  367. package/lib/store/chatsSidebarOptimistic.spec.js +112 -0
  368. package/lib/store/maiaLastChatPersistence.spec.js +22 -0
  369. package/lib/store/maiaPanelSessionPersistence.spec.js +62 -0
  370. package/lib/store/sessions/sessionNotificationSound.spec.js +145 -0
  371. package/lib/store/sessions/sessionNotifications.helpers.js +45 -0
  372. package/lib/store/sessions/sessionNotifications.helpers.spec.js +63 -0
  373. package/lib/store/sessions/sessionNotifications.js +35 -41
  374. package/lib/store/sessions/sessionNotifications.spec.js +106 -0
  375. package/lib/store/sessions/sessionStreamManager.js +40 -52
  376. package/lib/store/sessions/sessionStreamManager.spec.js +503 -0
  377. package/lib/store/sessions/sessions.types.spec.js +16 -0
  378. package/lib/store/sessions/useSessionsStore.spec.js +135 -0
  379. package/lib/store/useChatsStore.spec.js +619 -0
  380. package/lib/store/useFaqsStore.spec.js +57 -0
  381. package/lib/styles/cascade.js +29 -3
  382. package/lib/styles/transitions.js +3 -1
  383. package/lib/test/mockSseStream.js +121 -0
  384. package/lib/test/streamdownCodeMock.js +6 -0
  385. package/lib/test/streamdownMock.js +12 -0
  386. package/lib/types/agentModal.js +1 -1
  387. package/lib/types/global.d.js +1 -1
  388. package/lib/utils/actionCategoryMap.spec.js +18 -0
  389. package/lib/utils/agentDisplayName.spec.js +44 -0
  390. package/lib/utils/autoApproveStorage.spec.js +25 -0
  391. package/lib/utils/chatInputFiles.spec.js +39 -0
  392. package/lib/utils/contextMentionIcons.spec.js +41 -0
  393. package/lib/utils/contextMentionLabel.spec.js +13 -0
  394. package/lib/utils/contextMentionTriggers.spec.js +38 -0
  395. package/lib/utils/contextMentionTypeLabel.spec.js +14 -0
  396. package/lib/utils/corConnectorMentionTypes.spec.js +23 -0
  397. package/lib/utils/entityLinkRender.spec.js +72 -0
  398. package/lib/utils/fileDownloadHelper.spec.js +67 -0
  399. package/lib/utils/formatQuickActionMessage.spec.js +27 -0
  400. package/lib/utils/formatUnreadCount.spec.js +12 -0
  401. package/lib/utils/getUnitFileSize.spec.js +18 -0
  402. package/lib/utils/hitlAnalytics.spec.js +100 -0
  403. package/lib/utils/hoursPlannerQuickActionType.js +74 -1
  404. package/lib/utils/hoursPlannerQuickActionType.spec.js +64 -0
  405. package/lib/utils/imagePreprocessor.helpers.js +28 -0
  406. package/lib/utils/imagePreprocessor.helpers.spec.js +28 -0
  407. package/lib/utils/imagePreprocessor.js +12 -37
  408. package/lib/utils/imagePreprocessor.spec.js +112 -0
  409. package/lib/utils/maiaPageRoute.js +24 -0
  410. package/lib/utils/maiaPageRoute.spec.js +23 -0
  411. package/lib/utils/mapBackendLang.spec.js +19 -0
  412. package/lib/utils/navigateContextEntity.spec.js +50 -0
  413. package/lib/utils/normalizeAgentConnectors.spec.js +107 -0
  414. package/lib/utils/orchestratorSubagents.spec.js +32 -0
  415. package/lib/utils/reasoningMappers.spec.js +103 -0
  416. package/lib/utils/recentContextsHomeLimit.spec.js +32 -0
  417. package/lib/utils/renderContextMentions.spec.js +158 -0
  418. package/lib/utils/retryCompletion.spec.js +99 -0
  419. package/lib/utils/skillContentSize.spec.js +13 -0
  420. package/lib/utils/slashCommandMarker.spec.js +43 -0
  421. package/lib/utils/sortManagerHoursHomeFuas.spec.js +51 -0
  422. package/lib/utils/sseStreamContent.spec.js +31 -0
  423. package/lib/utils/streamActivityMessages.js +32 -19
  424. package/lib/utils/streamActivityMessages.spec.js +227 -0
  425. package/lib/utils/validateTrimmedFields.spec.js +26 -0
  426. package/package.json +1 -1
  427. package/README.md +0 -2
@@ -9,31 +9,9 @@ import { buildChipElement } from '../ContextMentionChip';
9
9
  import { ContextMentionChipGlobalStyles } from '../ContextMentionChip/ContextMentionChip.styles';
10
10
  import { buildSlashChipElement } from '../SlashCommandChip';
11
11
  import { filesFromDataTransfer } from '../../../utils/chatInputFiles';
12
+ import { isPlaceholderTruncatedInEditor, resolveTriggerInsertPrefix } from './ContextMentionEditor.helpers';
12
13
  import { SCMEEditable } from './ContextMentionEditor.styles';
13
14
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
14
- var isPlaceholderTruncatedInEditor = function isPlaceholderTruncatedInEditor(editor, placeholder) {
15
- var trimmed = placeholder.trim();
16
- if (!trimmed) {
17
- return false;
18
- }
19
- var clientWidth = editor.clientWidth;
20
- if (clientWidth <= 4) {
21
- return false;
22
- }
23
- var styles = window.getComputedStyle(editor);
24
- var ctx = document.createElement('canvas').getContext('2d');
25
- if (!ctx) {
26
- return false;
27
- }
28
- ctx.font = "".concat(styles.fontWeight, " ").concat(styles.fontSize, " ").concat(styles.fontFamily);
29
- var measured = ctx.measureText(trimmed).width;
30
- var paddingLeft = parseFloat(styles.paddingLeft) || 0;
31
- var paddingRight = parseFloat(styles.paddingRight) || 0;
32
- var borderLeft = parseFloat(styles.borderLeftWidth) || 0;
33
- var borderRight = parseFloat(styles.borderRightWidth) || 0;
34
- var available = Math.max(0, clientWidth - paddingLeft - paddingRight - borderLeft - borderRight);
35
- return measured > available + 1;
36
- };
37
15
  export var ContextMentionEditor = /*#__PURE__*/forwardRef(function (_ref, ref) {
38
16
  var _placeholder$trim2;
39
17
  var placeholder = _ref.placeholder,
@@ -218,10 +196,7 @@ export var ContextMentionEditor = /*#__PURE__*/forwardRef(function (_ref, ref) {
218
196
  startOffset = range.startOffset;
219
197
  if (startContainer.nodeType === Node.TEXT_NODE) {
220
198
  var prevChar = startOffset > 0 ? startContainer.data.charAt(startOffset - 1) : '';
221
- // Espacio solo si hay texto previo que no sea límite ni `@` (@@ deben quedar seguidos).
222
- if (prevChar && !/[\s([{@]/.test(prevChar)) {
223
- prefix = ' ';
224
- }
199
+ prefix = resolveTriggerInsertPrefix(prevChar);
225
200
  }
226
201
  var inserted = "".concat(prefix, "@");
227
202
  var textNode = document.createTextNode(inserted);
@@ -268,9 +243,7 @@ export var ContextMentionEditor = /*#__PURE__*/forwardRef(function (_ref, ref) {
268
243
  startOffset = range.startOffset;
269
244
  if (startContainer.nodeType === Node.TEXT_NODE) {
270
245
  var prevChar = startOffset > 0 ? startContainer.data.charAt(startOffset - 1) : '';
271
- if (prevChar && !/[\s([{]/.test(prevChar)) {
272
- prefix = ' ';
273
- }
246
+ prefix = resolveTriggerInsertPrefix(prevChar);
274
247
  }
275
248
  var inserted = "".concat(prefix, "/");
276
249
  var textNode = document.createTextNode(inserted);
@@ -303,9 +276,7 @@ export var ContextMentionEditor = /*#__PURE__*/forwardRef(function (_ref, ref) {
303
276
  startOffset = range.startOffset;
304
277
  if (startContainer.nodeType === Node.TEXT_NODE) {
305
278
  var prevChar = startOffset > 0 ? startContainer.data.charAt(startOffset - 1) : '';
306
- if (prevChar && !/[\s([{]/.test(prevChar)) {
307
- prefix = ' ';
308
- }
279
+ prefix = resolveTriggerInsertPrefix(prevChar);
309
280
  }
310
281
  var inserted = "".concat(prefix, "#");
311
282
  var textNode = document.createTextNode(inserted);
@@ -530,4 +501,4 @@ export var ContextMentionEditor = /*#__PURE__*/forwardRef(function (_ref, ref) {
530
501
  });
531
502
  });
532
503
  ContextMentionEditor.displayName = 'ContextMentionEditor';
533
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmb3J3YXJkUmVmIiwidXNlQ2FsbGJhY2siLCJ1c2VJbXBlcmF0aXZlSGFuZGxlIiwidXNlTGF5b3V0RWZmZWN0IiwidXNlUmVmIiwidXNlU3RhdGUiLCJUb29sdGlwIiwidXNlQ29udGV4dE1lbnRpb25zIiwiYnVpbGRDaGlwRWxlbWVudCIsIkNvbnRleHRNZW50aW9uQ2hpcEdsb2JhbFN0eWxlcyIsImJ1aWxkU2xhc2hDaGlwRWxlbWVudCIsImZpbGVzRnJvbURhdGFUcmFuc2ZlciIsIlNDTUVFZGl0YWJsZSIsImpzeCIsIl9qc3giLCJGcmFnbWVudCIsIl9GcmFnbWVudCIsImpzeHMiLCJfanN4cyIsImlzUGxhY2Vob2xkZXJUcnVuY2F0ZWRJbkVkaXRvciIsImVkaXRvciIsInBsYWNlaG9sZGVyIiwidHJpbW1lZCIsInRyaW0iLCJjbGllbnRXaWR0aCIsInN0eWxlcyIsIndpbmRvdyIsImdldENvbXB1dGVkU3R5bGUiLCJjdHgiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJnZXRDb250ZXh0IiwiZm9udCIsImNvbmNhdCIsImZvbnRXZWlnaHQiLCJmb250U2l6ZSIsImZvbnRGYW1pbHkiLCJtZWFzdXJlZCIsIm1lYXN1cmVUZXh0Iiwid2lkdGgiLCJwYWRkaW5nTGVmdCIsInBhcnNlRmxvYXQiLCJwYWRkaW5nUmlnaHQiLCJib3JkZXJMZWZ0IiwiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyUmlnaHQiLCJib3JkZXJSaWdodFdpZHRoIiwiYXZhaWxhYmxlIiwiTWF0aCIsIm1heCIsIkNvbnRleHRNZW50aW9uRWRpdG9yIiwiX3JlZiIsInJlZiIsIl9wbGFjZWhvbGRlciR0cmltMiIsImRpc2FibGVkIiwiY2xhc3NOYW1lIiwibWF4SGVpZ2h0Iiwib25JbnB1dCIsIm9uS2V5RG93biIsIm9uRm9jdXMiLCJvbkJsdXIiLCJvblBhc3RlRmlsZXMiLCJfdXNlQ29udGV4dE1lbnRpb25zIiwiZWRpdG9yUmVmIiwidXBkYXRlVHJpZ2dlciIsInJlcGxhY2VUcmlnZ2VyV2l0aENoaXAiLCJzeW5jVHJpZ2dlckF0UnVuTGVuZ3RoIiwidXBkYXRlU2xhc2hUcmlnZ2VyIiwicmVwbGFjZVRyaWdnZXJXaXRoU2xhc2hDaGlwIiwidXBkYXRlSGFzaFRyaWdnZXIiLCJyZXBsYWNlVHJpZ2dlcldpdGhTa2lsbENoaXAiLCJzZXJpYWxpemUiLCJjbGVhckVkaXRvckRvbSIsImNsZWFyIiwiZm9jdXMiLCJza2lwTmV4dElucHV0IiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwicGxhY2Vob2xkZXJUcnVuY2F0ZWQiLCJzZXRQbGFjZWhvbGRlclRydW5jYXRlZCIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwibG9naWNhbEVtcHR5Iiwic2V0TG9naWNhbEVtcHR5Iiwic3luY0VkaXRvckVtcHR5QXR0cmlidXRlIiwiaXNFbXB0eSIsImN1cnJlbnQiLCJzZXRBdHRyaWJ1dGUiLCJTdHJpbmciLCJub3JtYWxpemVFbXB0eUVkaXRvckRvbSIsIl9lZGl0b3IkdGV4dENvbnRlbnQiLCJ0ZXh0Q29udGVudCIsImlubmVySFRNTCIsInNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsInJhbmdlIiwiY3JlYXRlUmFuZ2UiLCJzZWxlY3ROb2RlQ29udGVudHMiLCJjb2xsYXBzZSIsInJlbW92ZUFsbFJhbmdlcyIsImFkZFJhbmdlIiwicmVjb21wdXRlUGxhY2Vob2xkZXJUcnVuY2F0aW9uIiwiX3BsYWNlaG9sZGVyJHRyaW0iLCJlbCIsInBoIiwiaXNFZGl0b3JMb2dpY2FsbHlFbXB0eSIsInRleHQiLCJ1bmRlZmluZWQiLCJybyIsIlJlc2l6ZU9ic2VydmVyIiwicXVldWVNaWNyb3Rhc2siLCJvYnNlcnZlIiwiZGlzY29ubmVjdCIsImVtaXRJbnB1dFN0YXRlIiwidHJpZyIsInNsYXNoVHJpZyIsImhhc2hUcmlnIiwic3RhdGUiLCJtZW50aW9ucyIsInNsYXNoQ29tbWFuZHMiLCJfb2JqZWN0U3ByZWFkIiwidHJpZ2dlciIsImFjdGl2ZSIsInF1ZXJ5IiwiYXRSdW5MZW5ndGgiLCJzbGFzaFRyaWdnZXIiLCJoYXNoVHJpZ2dlciIsInNldFBsYWluVGV4dCIsInBsYWluIiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImluc2VydE1lbnRpb25UcmlnZ2VyIiwiYW5jaG9yTm9kZSIsImNvbnRhaW5zIiwiZW5kUmFuZ2UiLCJnZXRSYW5nZUF0IiwicHJlZml4Iiwic3RhcnRDb250YWluZXIiLCJzdGFydE9mZnNldCIsIm5vZGVUeXBlIiwiTm9kZSIsIlRFWFRfTk9ERSIsInByZXZDaGFyIiwiZGF0YSIsImNoYXJBdCIsInRlc3QiLCJpbnNlcnRlZCIsInRleHROb2RlIiwiY3JlYXRlVGV4dE5vZGUiLCJpbnNlcnROb2RlIiwicHJldlNpYmxpbmciLCJwcmV2aW91c1NpYmxpbmciLCJjYXJldE5vZGUiLCJjYXJldE9mZnNldCIsImVuZHNXaXRoIiwicHJldlRleHQiLCJyZW1vdmUiLCJzZXRTdGFydCIsImluc2VydFNsYXNoVHJpZ2dlciIsImluc2VydFNraWxsVHJpZ2dlciIsImhhc1Zpc3VhbE11bHRpbGluZSIsIl9lZGl0b3IkdGV4dENvbnRlbnQkdCIsIl9lZGl0b3IkdGV4dENvbnRlbnQyIiwibGluZUhlaWdodCIsImVkaXRvckhlaWdodCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImhlaWdodCIsImlzTXVsdGlsaW5lIiwiZ2V0RWRpdG9yQ2xpZW50UmVjdCIsIl9lZGl0b3JSZWYkY3VycmVudCRnZSIsIl9lZGl0b3JSZWYkY3VycmVudCIsImluc2VydE1lbnRpb24iLCJtZW50aW9uIiwiY2hpcCIsImFwcGVuZE1lbnRpb25BdEVuZCIsImlkIiwidHlwZSIsImxhYmVsIiwidHJhaWxpbmdTcGFjZSIsImFwcGVuZENoaWxkIiwiaW5zZXJ0U2tpbGxNZW50aW9uIiwiaW5zZXJ0U2xhc2hDb21tYW5kIiwiY29tbWFuZCIsImhhbmRsZUlucHV0IiwiaGFuZGxlUGFzdGUiLCJlIiwiZmlsZXMiLCJjbGlwYm9hcmREYXRhIiwicHJldmVudERlZmF1bHQiLCJnZXREYXRhIiwicmFuZ2VDb3VudCIsImRlbGV0ZUZyb21Eb2N1bWVudCIsImNvbGxhcHNlVG9FbmQiLCJ0cmltbWVkUGxhY2Vob2xkZXIiLCJwbGFjZWhvbGRlclRvb2x0aXBUaXRsZSIsImNoaWxkcmVuIiwidGl0bGUiLCJzdHlsZSIsImRpc3BsYXkiLCJtaW5XaWR0aCIsIiRtYXhIZWlnaHQiLCJjb250ZW50RWRpdGFibGUiLCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciLCJyb2xlIiwib25QYXN0ZSIsImRpc3BsYXlOYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvYXRvbXMvQ29udGV4dE1lbnRpb25FZGl0b3IvQ29udGV4dE1lbnRpb25FZGl0b3IudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENsaXBib2FyZEV2ZW50LFxuICBmb3J3YXJkUmVmLFxuICBLZXlib2FyZEV2ZW50LFxuICB1c2VDYWxsYmFjayxcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZSxcbiAgdXNlTGF5b3V0RWZmZWN0LFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFRvb2x0aXAgfSBmcm9tICdAcHJvamVjdGNvci90b29sdGlwdjIvbGliL2NvbXBvbmVudHMvVG9vbHRpcCdcbmltcG9ydCB7IHVzZUNvbnRleHRNZW50aW9ucyB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUNvbnRleHRNZW50aW9ucydcbmltcG9ydCB7IENvbnRleHRNZW50aW9uIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQgeyBidWlsZENoaXBFbGVtZW50IH0gZnJvbSAnLi4vQ29udGV4dE1lbnRpb25DaGlwJ1xuaW1wb3J0IHsgQ29udGV4dE1lbnRpb25DaGlwR2xvYmFsU3R5bGVzIH0gZnJvbSAnLi4vQ29udGV4dE1lbnRpb25DaGlwL0NvbnRleHRNZW50aW9uQ2hpcC5zdHlsZXMnXG5pbXBvcnQgeyBidWlsZFNsYXNoQ2hpcEVsZW1lbnQsIFNsYXNoQ29tbWFuZENoaXBEYXRhIH0gZnJvbSAnLi4vU2xhc2hDb21tYW5kQ2hpcCdcbmltcG9ydCB7IGZpbGVzRnJvbURhdGFUcmFuc2ZlciB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2NoYXRJbnB1dEZpbGVzJ1xuaW1wb3J0IHsgU0NNRUVkaXRhYmxlIH0gZnJvbSAnLi9Db250ZXh0TWVudGlvbkVkaXRvci5zdHlsZXMnXG5cbmNvbnN0IGlzUGxhY2Vob2xkZXJUcnVuY2F0ZWRJbkVkaXRvciA9IChlZGl0b3I6IEhUTUxFbGVtZW50LCBwbGFjZWhvbGRlcjogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHRyaW1tZWQgPSBwbGFjZWhvbGRlci50cmltKClcbiAgaWYgKCF0cmltbWVkKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3QgeyBjbGllbnRXaWR0aCB9ID0gZWRpdG9yXG4gIGlmIChjbGllbnRXaWR0aCA8PSA0KSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBjb25zdCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlZGl0b3IpXG4gIGNvbnN0IGN0eCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoJzJkJylcbiAgaWYgKCFjdHgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjdHguZm9udCA9IGAke3N0eWxlcy5mb250V2VpZ2h0fSAke3N0eWxlcy5mb250U2l6ZX0gJHtzdHlsZXMuZm9udEZhbWlseX1gXG4gIGNvbnN0IG1lYXN1cmVkID0gY3R4Lm1lYXN1cmVUZXh0KHRyaW1tZWQpLndpZHRoXG5cbiAgY29uc3QgcGFkZGluZ0xlZnQgPSBwYXJzZUZsb2F0KHN0eWxlcy5wYWRkaW5nTGVmdCkgfHwgMFxuICBjb25zdCBwYWRkaW5nUmlnaHQgPSBwYXJzZUZsb2F0KHN0eWxlcy5wYWRkaW5nUmlnaHQpIHx8IDBcbiAgY29uc3QgYm9yZGVyTGVmdCA9IHBhcnNlRmxvYXQoc3R5bGVzLmJvcmRlckxlZnRXaWR0aCkgfHwgMFxuICBjb25zdCBib3JkZXJSaWdodCA9IHBhcnNlRmxvYXQoc3R5bGVzLmJvcmRlclJpZ2h0V2lkdGgpIHx8IDBcbiAgY29uc3QgYXZhaWxhYmxlID0gTWF0aC5tYXgoMCwgY2xpZW50V2lkdGggLSBwYWRkaW5nTGVmdCAtIHBhZGRpbmdSaWdodCAtIGJvcmRlckxlZnQgLSBib3JkZXJSaWdodClcblxuICByZXR1cm4gbWVhc3VyZWQgPiBhdmFpbGFibGUgKyAxXG59XG5cbmV4cG9ydCB0eXBlIENvbnRleHRNZW50aW9uRWRpdG9ySGFuZGxlID0ge1xuICBmb2N1czogKCkgPT4gdm9pZFxuICBjbGVhcjogKCkgPT4gdm9pZFxuICBzZXRQbGFpblRleHQ6ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWRcbiAgLyoqIEluc2VydGEgYEBgIGVuIGVsIGNhcmV0IChjb24gZXNwYWNpbyBwcmV2aW8gc2kgaGFjZSBmYWx0YSkgeSBhYnJlIGVsIHRyaWdnZXIgZGUgbWVudGlvbnMuICovXG4gIGluc2VydE1lbnRpb25UcmlnZ2VyOiAoKSA9PiB2b2lkXG4gIC8qKiBJbnNlcnRhIGAvYCBlbiBlbCBjYXJldCAoY29uIGVzcGFjaW8gcHJldmlvIHNpIGhhY2UgZmFsdGEpIHkgYWJyZSBlbCB0cmlnZ2VyIGRlIHNsYXNoIGNvbW1hbmRzLiAqL1xuICBpbnNlcnRTbGFzaFRyaWdnZXI6ICgpID0+IHZvaWRcbiAgLyoqIEluc2VydGEgYCNgIGVuIGVsIGNhcmV0IChjb24gZXNwYWNpbyBwcmV2aW8gc2kgaGFjZSBmYWx0YSkgeSBhYnJlIGVsIHRyaWdnZXIgZGUgc2tpbGxzLiAqL1xuICBpbnNlcnRTa2lsbFRyaWdnZXI6ICgpID0+IHZvaWRcbiAgaW5zZXJ0TWVudGlvbjogKG1lbnRpb246IENvbnRleHRNZW50aW9uKSA9PiB2b2lkXG4gIGFwcGVuZE1lbnRpb25BdEVuZDogKG1lbnRpb246IENvbnRleHRNZW50aW9uKSA9PiB2b2lkXG4gIGluc2VydFNsYXNoQ29tbWFuZDogKGNvbW1hbmQ6IFNsYXNoQ29tbWFuZENoaXBEYXRhKSA9PiB2b2lkXG4gIC8qKiBSZWVtcGxhemEgZWwgYCNxdWVyeWAgcGVuZGllbnRlIHBvciBlbCBjaGlwIGRlIGxhIHNraWxsIGVsZWdpZGEuICovXG4gIGluc2VydFNraWxsTWVudGlvbjogKG1lbnRpb246IENvbnRleHRNZW50aW9uKSA9PiB2b2lkXG4gIHN5bmNUcmlnZ2VyQXRSdW5MZW5ndGg6IChhdFJ1bkxlbmd0aDogbnVtYmVyKSA9PiB2b2lkXG4gIHNlcmlhbGl6ZTogKCkgPT4ge1xuICAgIHRleHQ6IHN0cmluZ1xuICAgIG1lbnRpb25zOiBDb250ZXh0TWVudGlvbltdXG4gICAgc2xhc2hDb21tYW5kczogU2xhc2hDb21tYW5kQ2hpcERhdGFbXVxuICB9XG4gIGhhc1Zpc3VhbE11bHRpbGluZTogKCkgPT4gYm9vbGVhblxuICAvKiogUmVjdCBkZWwgw6FyZWEgZWRpdGFibGUgKHZpZXdwb3J0KTsgbG8gdXNhIGVsIHBvcG92ZXIgZGUgQCBwYXJhIGFsaW5lYXIgYW5jaG8geSBmYWxsYmFjayB2ZXJ0aWNhbC4gKi9cbiAgZ2V0RWRpdG9yQ2xpZW50UmVjdDogKCkgPT4gRE9NUmVjdCB8IG51bGxcbn1cblxuZXhwb3J0IHR5cGUgQ29udGV4dE1lbnRpb25FZGl0b3JQcm9wcyA9IHtcbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmdcbiAgZGlzYWJsZWQ/OiBib29sZWFuXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICAvKiogQWx0byBtw6F4aW1vIGRlbCDDoXJlYSBlZGl0YWJsZSAocHgpLiBTZSBhanVzdGEgY3VhbmRvIGhheSBjaGlwcyBkZSBjb250ZXh0by9hZGp1bnRvcy4gKi9cbiAgbWF4SGVpZ2h0PzogbnVtYmVyXG4gIG9uSW5wdXQ/OiAoc3RhdGU6IHtcbiAgICB0ZXh0OiBzdHJpbmdcbiAgICBtZW50aW9uczogQ29udGV4dE1lbnRpb25bXVxuICAgIHNsYXNoQ29tbWFuZHM6IFNsYXNoQ29tbWFuZENoaXBEYXRhW11cbiAgICB0cmlnZ2VyOiB7IGFjdGl2ZTogYm9vbGVhbjsgcXVlcnk6IHN0cmluZzsgYXRSdW5MZW5ndGg6IG51bWJlciB9XG4gICAgc2xhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogYm9vbGVhbjsgcXVlcnk6IHN0cmluZyB9XG4gICAgaGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBib29sZWFuOyBxdWVyeTogc3RyaW5nIH1cbiAgfSkgPT4gdm9pZFxuICBvbktleURvd24/OiAoZTogS2V5Ym9hcmRFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHZvaWRcbiAgb25Gb2N1cz86ICgpID0+IHZvaWRcbiAgb25CbHVyPzogKCkgPT4gdm9pZFxuICAvKiogQ2xpcGJvYXJkIGZpbGVzIChzY3JlZW5zaG90cywgY29waWVkIGltYWdlcykuIFRleHQgaXMgc3RpbGwgaW5zZXJ0ZWQgd2hlbiBwcmVzZW50LiAqL1xuICBvblBhc3RlRmlsZXM/OiAoZmlsZXM6IEZpbGVbXSkgPT4gdm9pZFxufVxuXG5leHBvcnQgY29uc3QgQ29udGV4dE1lbnRpb25FZGl0b3IgPSBmb3J3YXJkUmVmPENvbnRleHRNZW50aW9uRWRpdG9ySGFuZGxlLCBDb250ZXh0TWVudGlvbkVkaXRvclByb3BzPihcbiAgKHsgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCBjbGFzc05hbWUsIG1heEhlaWdodCwgb25JbnB1dCwgb25LZXlEb3duLCBvbkZvY3VzLCBvbkJsdXIsIG9uUGFzdGVGaWxlcyB9LCByZWYpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBlZGl0b3JSZWYsXG4gICAgICB1cGRhdGVUcmlnZ2VyLFxuICAgICAgcmVwbGFjZVRyaWdnZXJXaXRoQ2hpcCxcbiAgICAgIHN5bmNUcmlnZ2VyQXRSdW5MZW5ndGgsXG4gICAgICB1cGRhdGVTbGFzaFRyaWdnZXIsXG4gICAgICByZXBsYWNlVHJpZ2dlcldpdGhTbGFzaENoaXAsXG4gICAgICB1cGRhdGVIYXNoVHJpZ2dlcixcbiAgICAgIHJlcGxhY2VUcmlnZ2VyV2l0aFNraWxsQ2hpcCxcbiAgICAgIHNlcmlhbGl6ZSxcbiAgICAgIGNsZWFyOiBjbGVhckVkaXRvckRvbSxcbiAgICAgIGZvY3VzLFxuICAgIH0gPSB1c2VDb250ZXh0TWVudGlvbnMoKVxuICAgIGNvbnN0IHNraXBOZXh0SW5wdXQgPSB1c2VSZWYoZmFsc2UpXG4gICAgY29uc3QgW3BsYWNlaG9sZGVyVHJ1bmNhdGVkLCBzZXRQbGFjZWhvbGRlclRydW5jYXRlZF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgICBjb25zdCBbbG9naWNhbEVtcHR5LCBzZXRMb2dpY2FsRW1wdHldID0gdXNlU3RhdGUodHJ1ZSlcblxuICAgIGNvbnN0IHN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZSA9IHVzZUNhbGxiYWNrKChpc0VtcHR5OiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoZWRpdG9yUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQuc2V0QXR0cmlidXRlKCdkYXRhLWVtcHR5JywgU3RyaW5nKGlzRW1wdHkpKVxuICAgICAgfVxuICAgIH0sIFtdKVxuXG4gICAgY29uc3Qgbm9ybWFsaXplRW1wdHlFZGl0b3JEb20gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBjb25zdCBlZGl0b3IgPSBlZGl0b3JSZWYuY3VycmVudFxuICAgICAgaWYgKCFlZGl0b3IpIHJldHVyblxuXG4gICAgICAvLyBMaW1waWFyIGN1YWxxdWllciByZXNpZHVvIChiciwgZXNwYWNpb3MpIHF1ZSBkZWplIGVsIGJyb3dzZXIgYWwgdmFjaWFyIGVsIGNvbnRlbnRlZGl0YWJsZS5cbiAgICAgIC8vIFNpbiBlc3RvLCB1biBlc3BhY2lvIHN1ZWx0byBhY3RpdmEgZGF0YS1lbXB0eT1cInRydWVcIiArIDo6YmVmb3JlIHBsYWNlaG9sZGVyIGVuIGzDrW5lYSAxXG4gICAgICAvLyB5IGRlc3BsYXphIGVsIGN1cnNvciBhIGxhIGzDrW5lYSAyLlxuICAgICAgaWYgKGVkaXRvci50ZXh0Q29udGVudD8udHJpbSgpID09PSAnJykge1xuICAgICAgICBlZGl0b3IuaW5uZXJIVE1MID0gJydcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgICBpZiAoIXNlbGVjdGlvbikgcmV0dXJuXG4gICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlZGl0b3IpXG4gICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG4gICAgfSwgW2VkaXRvclJlZl0pXG5cbiAgICBjb25zdCByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGVkaXRvclJlZi5jdXJyZW50XG4gICAgICBjb25zdCBwaCA9IHBsYWNlaG9sZGVyPy50cmltKCkgPz8gJydcbiAgICAgIGNvbnN0IGlzRWRpdG9yTG9naWNhbGx5RW1wdHkgPSBzZXJpYWxpemUoKS50ZXh0LnRyaW0oKSA9PT0gJydcblxuICAgICAgaWYgKCFlbCB8fCAhcGggfHwgIWlzRWRpdG9yTG9naWNhbGx5RW1wdHkpIHtcbiAgICAgICAgc2V0UGxhY2Vob2xkZXJUcnVuY2F0ZWQoZmFsc2UpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBzZXRQbGFjZWhvbGRlclRydW5jYXRlZChpc1BsYWNlaG9sZGVyVHJ1bmNhdGVkSW5FZGl0b3IoZWwsIHBoKSlcbiAgICB9LCBbcGxhY2Vob2xkZXIsIHNlcmlhbGl6ZV0pXG5cbiAgICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgcmVjb21wdXRlUGxhY2Vob2xkZXJUcnVuY2F0aW9uKClcbiAgICAgIGNvbnN0IGVsID0gZWRpdG9yUmVmLmN1cnJlbnRcbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuICAgICAgY29uc3Qgcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICBxdWV1ZU1pY3JvdGFzayhyZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24pXG4gICAgICB9KVxuICAgICAgcm8ub2JzZXJ2ZShlbClcbiAgICAgIHJldHVybiAoKSA9PiByby5kaXNjb25uZWN0KClcbiAgICB9LCBbcGxhY2Vob2xkZXIsIGRpc2FibGVkLCByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb25dKVxuXG4gICAgY29uc3QgZW1pdElucHV0U3RhdGUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBjb25zdCB0cmlnID0gdXBkYXRlVHJpZ2dlcigpXG4gICAgICBjb25zdCBzbGFzaFRyaWcgPSB1cGRhdGVTbGFzaFRyaWdnZXIoKVxuICAgICAgY29uc3QgaGFzaFRyaWcgPSB1cGRhdGVIYXNoVHJpZ2dlcigpXG4gICAgICBsZXQgc3RhdGUgPSBzZXJpYWxpemUoKVxuICAgICAgY29uc3QgaXNFbXB0eSA9IHN0YXRlLnRleHQudHJpbSgpID09PSAnJ1xuICAgICAgaWYgKGlzRW1wdHkpIHtcbiAgICAgICAgbm9ybWFsaXplRW1wdHlFZGl0b3JEb20oKVxuICAgICAgICBzdGF0ZSA9IHsgdGV4dDogJycsIG1lbnRpb25zOiBbXSwgc2xhc2hDb21tYW5kczogW10gfVxuICAgICAgfVxuICAgICAgc3luY0VkaXRvckVtcHR5QXR0cmlidXRlKGlzRW1wdHkpXG4gICAgICBzZXRMb2dpY2FsRW1wdHkoaXNFbXB0eSlcbiAgICAgIG9uSW5wdXQ/Lih7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICB0cmlnZ2VyOiB7IGFjdGl2ZTogdHJpZy5hY3RpdmUsIHF1ZXJ5OiB0cmlnLnF1ZXJ5LCBhdFJ1bkxlbmd0aDogdHJpZy5hdFJ1bkxlbmd0aCB9LFxuICAgICAgICBzbGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBzbGFzaFRyaWcuYWN0aXZlLCBxdWVyeTogc2xhc2hUcmlnLnF1ZXJ5IH0sXG4gICAgICAgIGhhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogaGFzaFRyaWcuYWN0aXZlLCBxdWVyeTogaGFzaFRyaWcucXVlcnkgfSxcbiAgICAgIH0pXG4gICAgICBxdWV1ZU1pY3JvdGFzayhyZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24pXG4gICAgfSwgW1xuICAgICAgdXBkYXRlVHJpZ2dlcixcbiAgICAgIHVwZGF0ZVNsYXNoVHJpZ2dlcixcbiAgICAgIHVwZGF0ZUhhc2hUcmlnZ2VyLFxuICAgICAgc2VyaWFsaXplLFxuICAgICAgbm9ybWFsaXplRW1wdHlFZGl0b3JEb20sXG4gICAgICBzeW5jRWRpdG9yRW1wdHlBdHRyaWJ1dGUsXG4gICAgICBvbklucHV0LFxuICAgICAgcmVjb21wdXRlUGxhY2Vob2xkZXJUcnVuY2F0aW9uLFxuICAgIF0pXG5cbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKFxuICAgICAgcmVmLFxuICAgICAgKCkgPT4gKHtcbiAgICAgICAgZm9jdXMsXG4gICAgICAgIGNsZWFyOiAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJFZGl0b3JEb20oKVxuICAgICAgICAgIHN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZSh0cnVlKVxuICAgICAgICAgIHNldExvZ2ljYWxFbXB0eSh0cnVlKVxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKHJlY29tcHV0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbilcbiAgICAgICAgfSxcbiAgICAgICAgc2V0UGxhaW5UZXh0OiAodGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWRpdG9yID0gZWRpdG9yUmVmLmN1cnJlbnRcbiAgICAgICAgICBpZiAoIWVkaXRvcikgcmV0dXJuXG4gICAgICAgICAgY29uc3QgcGxhaW4gPSB0ZXh0ID8/ICcnXG4gICAgICAgICAgZWRpdG9yLnRleHRDb250ZW50ID0gcGxhaW5cbiAgICAgICAgICBza2lwTmV4dElucHV0LmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBzZXJpYWxpemUoKVxuICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSBzdGF0ZS50ZXh0LnRyaW0oKSA9PT0gJydcbiAgICAgICAgICBpZiAoaXNFbXB0eSkge1xuICAgICAgICAgICAgZWRpdG9yLmlubmVySFRNTCA9ICcnXG4gICAgICAgICAgfVxuICAgICAgICAgIHN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZShpc0VtcHR5KVxuICAgICAgICAgIHNldExvZ2ljYWxFbXB0eShpc0VtcHR5KVxuICAgICAgICAgIG9uSW5wdXQ/Lih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCB9LFxuICAgICAgICAgICAgc2xhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJyB9LFxuICAgICAgICAgICAgaGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgICAgICBpZiAoc2VsZWN0aW9uICYmIGVkaXRvci5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRvcilcbiAgICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKVxuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG4gICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IGZhbHNlXG4gICAgICAgICAgICByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24oKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIGluc2VydE1lbnRpb25UcmlnZ2VyOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWRpdG9yID0gZWRpdG9yUmVmLmN1cnJlbnRcbiAgICAgICAgICBpZiAoIWVkaXRvciB8fCBkaXNhYmxlZCkgcmV0dXJuXG5cbiAgICAgICAgICBmb2N1cygpXG5cbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgICAgICBpZiAoIXNlbGVjdGlvbikgcmV0dXJuXG5cbiAgICAgICAgICBpZiAoIXNlbGVjdGlvbi5hbmNob3JOb2RlIHx8ICFlZGl0b3IuY29udGFpbnMoc2VsZWN0aW9uLmFuY2hvck5vZGUpKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgICAgICAgIGVuZFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlZGl0b3IpXG4gICAgICAgICAgICBlbmRSYW5nZS5jb2xsYXBzZShmYWxzZSlcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKGVuZFJhbmdlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMClcbiAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuXG4gICAgICAgICAgbGV0IHByZWZpeCA9ICcnXG4gICAgICAgICAgY29uc3QgeyBzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQgfSA9IHJhbmdlXG4gICAgICAgICAgaWYgKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgY29uc3QgcHJldkNoYXIgPSBzdGFydE9mZnNldCA+IDAgPyAoc3RhcnRDb250YWluZXIgYXMgVGV4dCkuZGF0YS5jaGFyQXQoc3RhcnRPZmZzZXQgLSAxKSA6ICcnXG4gICAgICAgICAgICAvLyBFc3BhY2lvIHNvbG8gc2kgaGF5IHRleHRvIHByZXZpbyBxdWUgbm8gc2VhIGzDrW1pdGUgbmkgYEBgIChAQCBkZWJlbiBxdWVkYXIgc2VndWlkb3MpLlxuICAgICAgICAgICAgaWYgKHByZXZDaGFyICYmICEvW1xccyhbe0BdLy50ZXN0KHByZXZDaGFyKSkge1xuICAgICAgICAgICAgICBwcmVmaXggPSAnICdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbnNlcnRlZCA9IGAke3ByZWZpeH1AYFxuICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoaW5zZXJ0ZWQpXG4gICAgICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZSh0ZXh0Tm9kZSlcblxuICAgICAgICAgIC8vIFNpIGVsIGBAYCBxdWVkw7MgZW4gdW4gbm9kbyBudWV2bywgdW5pciBjb24gZWwgdGV4dCBub2RlIHByZXZpbyBxdWUgdGVybWluYSBlbiBgQGBcbiAgICAgICAgICAvLyBwYXJhIHF1ZSBkZXRlY3RNZW50aW9uVHJpZ2dlciB2ZWEgZWwgcnVuIGNvbXBsZXRvIChAQCwgQEBALCDigKYpLlxuICAgICAgICAgIGNvbnN0IHByZXZTaWJsaW5nID0gdGV4dE5vZGUucHJldmlvdXNTaWJsaW5nXG4gICAgICAgICAgbGV0IGNhcmV0Tm9kZSA9IHRleHROb2RlXG4gICAgICAgICAgbGV0IGNhcmV0T2Zmc2V0ID0gaW5zZXJ0ZWQubGVuZ3RoXG4gICAgICAgICAgaWYgKHByZWZpeCA9PT0gJycgJiYgcHJldlNpYmxpbmc/Lm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSAmJiAocHJldlNpYmxpbmcgYXMgVGV4dCkuZGF0YS5lbmRzV2l0aCgnQCcpKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2VGV4dCA9IHByZXZTaWJsaW5nIGFzIFRleHRcbiAgICAgICAgICAgIGNhcmV0T2Zmc2V0ID0gcHJldlRleHQuZGF0YS5sZW5ndGggKyBpbnNlcnRlZC5sZW5ndGhcbiAgICAgICAgICAgIHByZXZUZXh0LmRhdGEgKz0gaW5zZXJ0ZWRcbiAgICAgICAgICAgIHRleHROb2RlLnJlbW92ZSgpXG4gICAgICAgICAgICBjYXJldE5vZGUgPSBwcmV2VGV4dFxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVsIGNhcmV0IGRlYmUgcXVlZGFyIERFTlRSTyBkZWwgdGV4dCBub2RlIChkZXNwdcOpcyBkZSBgQGApLlxuICAgICAgICAgIC8vIGBzZXRTdGFydEFmdGVyYCBsbyBkZWphIGVuIGVsIHBhZHJlIHkgZGV0ZWN0TWVudGlvblRyaWdnZXIgbm8gYWN0aXZhIGVsIHBvcG92ZXIuXG4gICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQoY2FyZXROb2RlLCBjYXJldE9mZnNldClcbiAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSlcblxuICAgICAgICAgIGVtaXRJbnB1dFN0YXRlKClcbiAgICAgICAgfSxcbiAgICAgICAgaW5zZXJ0U2xhc2hUcmlnZ2VyOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWRpdG9yID0gZWRpdG9yUmVmLmN1cnJlbnRcbiAgICAgICAgICBpZiAoIWVkaXRvciB8fCBkaXNhYmxlZCkgcmV0dXJuXG5cbiAgICAgICAgICBmb2N1cygpXG5cbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgICAgICBpZiAoIXNlbGVjdGlvbikgcmV0dXJuXG5cbiAgICAgICAgICBpZiAoIXNlbGVjdGlvbi5hbmNob3JOb2RlIHx8ICFlZGl0b3IuY29udGFpbnMoc2VsZWN0aW9uLmFuY2hvck5vZGUpKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgICAgICAgIGVuZFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlZGl0b3IpXG4gICAgICAgICAgICBlbmRSYW5nZS5jb2xsYXBzZShmYWxzZSlcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKGVuZFJhbmdlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMClcbiAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuXG4gICAgICAgICAgbGV0IHByZWZpeCA9ICcnXG4gICAgICAgICAgY29uc3QgeyBzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQgfSA9IHJhbmdlXG4gICAgICAgICAgaWYgKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICAgICAgY29uc3QgcHJldkNoYXIgPSBzdGFydE9mZnNldCA+IDAgPyAoc3RhcnRDb250YWluZXIgYXMgVGV4dCkuZGF0YS5jaGFyQXQoc3RhcnRPZmZzZXQgLSAxKSA6ICcnXG4gICAgICAgICAgICBpZiAocHJldkNoYXIgJiYgIS9bXFxzKFt7XS8udGVzdChwcmV2Q2hhcikpIHtcbiAgICAgICAgICAgICAgcHJlZml4ID0gJyAnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaW5zZXJ0ZWQgPSBgJHtwcmVmaXh9L2BcbiAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGluc2VydGVkKVxuICAgICAgICAgIHJhbmdlLmluc2VydE5vZGUodGV4dE5vZGUpXG5cbiAgICAgICAgICAvLyBDYXJldCBkZW50cm8gZGVsIHRleHQgbm9kZSBwYXJhIHF1ZSBkZXRlY3RTbGFzaFRyaWdnZXIgYWN0aXZlIGVsIGRyb3Bkb3duLlxuICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KHRleHROb2RlLCBpbnNlcnRlZC5sZW5ndGgpXG4gICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcbiAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpXG5cbiAgICAgICAgICBlbWl0SW5wdXRTdGF0ZSgpXG4gICAgICAgIH0sXG4gICAgICAgIGluc2VydFNraWxsVHJpZ2dlcjogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVkaXRvciA9IGVkaXRvclJlZi5jdXJyZW50XG4gICAgICAgICAgaWYgKCFlZGl0b3IgfHwgZGlzYWJsZWQpIHJldHVyblxuXG4gICAgICAgICAgZm9jdXMoKVxuXG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHJldHVyblxuXG4gICAgICAgICAgaWYgKCFzZWxlY3Rpb24uYW5jaG9yTm9kZSB8fCAhZWRpdG9yLmNvbnRhaW5zKHNlbGVjdGlvbi5hbmNob3JOb2RlKSkge1xuICAgICAgICAgICAgY29uc3QgZW5kUmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gICAgICAgICAgICBlbmRSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWRpdG9yKVxuICAgICAgICAgICAgZW5kUmFuZ2UuY29sbGFwc2UoZmFsc2UpXG4gICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShlbmRSYW5nZSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApXG4gICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcblxuICAgICAgICAgIGxldCBwcmVmaXggPSAnJ1xuICAgICAgICAgIGNvbnN0IHsgc3RhcnRDb250YWluZXIsIHN0YXJ0T2Zmc2V0IH0gPSByYW5nZVxuICAgICAgICAgIGlmIChzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZDaGFyID0gc3RhcnRPZmZzZXQgPiAwID8gKHN0YXJ0Q29udGFpbmVyIGFzIFRleHQpLmRhdGEuY2hhckF0KHN0YXJ0T2Zmc2V0IC0gMSkgOiAnJ1xuICAgICAgICAgICAgaWYgKHByZXZDaGFyICYmICEvW1xccyhbe10vLnRlc3QocHJldkNoYXIpKSB7XG4gICAgICAgICAgICAgIHByZWZpeCA9ICcgJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGluc2VydGVkID0gYCR7cHJlZml4fSNgXG4gICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShpbnNlcnRlZClcbiAgICAgICAgICByYW5nZS5pbnNlcnROb2RlKHRleHROb2RlKVxuXG4gICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQodGV4dE5vZGUsIGluc2VydGVkLmxlbmd0aClcbiAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSlcblxuICAgICAgICAgIGVtaXRJbnB1dFN0YXRlKClcbiAgICAgICAgfSxcbiAgICAgICAgc2VyaWFsaXplLFxuICAgICAgICBzeW5jVHJpZ2dlckF0UnVuTGVuZ3RoLFxuICAgICAgICBoYXNWaXN1YWxNdWx0aWxpbmU6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBlZGl0b3IgPSBlZGl0b3JSZWYuY3VycmVudFxuICAgICAgICAgIGlmICghZWRpdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0ZXh0ID0gZWRpdG9yLnRleHRDb250ZW50Py50cmltKCkgPz8gJydcbiAgICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVkaXRvcilcbiAgICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gcGFyc2VGbG9hdChzdHlsZXMubGluZUhlaWdodCkgfHwgMjJcbiAgICAgICAgICBjb25zdCBlZGl0b3JIZWlnaHQgPSBlZGl0b3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgICAgICAgY29uc3QgaXNNdWx0aWxpbmUgPSBlZGl0b3JIZWlnaHQgPiBsaW5lSGVpZ2h0ICogMS41XG5cbiAgICAgICAgICByZXR1cm4gaXNNdWx0aWxpbmVcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0RWRpdG9yQ2xpZW50UmVjdDogKCkgPT4gZWRpdG9yUmVmLmN1cnJlbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpID8/IG51bGwsXG4gICAgICAgIGluc2VydE1lbnRpb246IChtZW50aW9uOiBDb250ZXh0TWVudGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IGNoaXAgPSBidWlsZENoaXBFbGVtZW50KG1lbnRpb24pXG4gICAgICAgICAgcmVwbGFjZVRyaWdnZXJXaXRoQ2hpcChjaGlwLCBtZW50aW9uKVxuICAgICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IHRydWVcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHNlcmlhbGl6ZSgpXG4gICAgICAgICAgb25JbnB1dD8uKHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgdHJpZ2dlcjogeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwIH0sXG4gICAgICAgICAgICBzbGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnIH0sXG4gICAgICAgICAgICBoYXNoVHJpZ2dlcjogeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycgfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSBzdGF0ZS50ZXh0LnRyaW0oKSA9PT0gJydcbiAgICAgICAgICBzeW5jRWRpdG9yRW1wdHlBdHRyaWJ1dGUoaXNFbXB0eSlcbiAgICAgICAgICBzZXRMb2dpY2FsRW1wdHkoaXNFbXB0eSlcbiAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgICAvLyBTaSBlbCBuYXZlZ2Fkb3Igbm8gZGlzcGFyYSBgaW5wdXRgIHRyYXMgZWwgY2hpcCwgZWwgZmxhZyBxdWVkYWJhIGVuIHRydWUgeSBlbCBwcsOzeGltbyBAIGRlbCB1c3VhcmlvIHNlIGlnbm9yYWJhLlxuICAgICAgICAgICAgc2tpcE5leHRJbnB1dC5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgICAgIHJlY29tcHV0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbigpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgYXBwZW5kTWVudGlvbkF0RW5kOiAobWVudGlvbjogQ29udGV4dE1lbnRpb24pID0+IHtcbiAgICAgICAgICBjb25zdCBlZGl0b3IgPSBlZGl0b3JSZWYuY3VycmVudFxuICAgICAgICAgIGlmICghZWRpdG9yKSByZXR1cm5cblxuICAgICAgICAgIGNvbnN0IGNoaXAgPSBidWlsZENoaXBFbGVtZW50KG1lbnRpb24pXG4gICAgICAgICAgY2hpcC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVudGlvbicsICd0cnVlJylcbiAgICAgICAgICBjaGlwLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uLWlkJywgU3RyaW5nKG1lbnRpb24uaWQpKVxuICAgICAgICAgIGNoaXAuc2V0QXR0cmlidXRlKCdkYXRhLW1lbnRpb24tdHlwZScsIG1lbnRpb24udHlwZSlcbiAgICAgICAgICBjaGlwLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uLWxhYmVsJywgbWVudGlvbi5sYWJlbClcbiAgICAgICAgICBjaGlwLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ2ZhbHNlJylcblxuICAgICAgICAgIGNvbnN0IHRyYWlsaW5nU3BhY2UgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnXFx1MDBhMCcpXG4gICAgICAgICAgZWRpdG9yLmFwcGVuZENoaWxkKGNoaXApXG4gICAgICAgICAgZWRpdG9yLmFwcGVuZENoaWxkKHRyYWlsaW5nU3BhY2UpXG5cbiAgICAgICAgICBza2lwTmV4dElucHV0LmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBzZXJpYWxpemUoKVxuICAgICAgICAgIG9uSW5wdXQ/Lih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCB9LFxuICAgICAgICAgICAgc2xhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJyB9LFxuICAgICAgICAgICAgaGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICBzeW5jRWRpdG9yRW1wdHlBdHRyaWJ1dGUoZmFsc2UpXG4gICAgICAgICAgc2V0TG9naWNhbEVtcHR5KGZhbHNlKVxuXG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydCh0cmFpbGluZ1NwYWNlLCAxKVxuICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IGZhbHNlXG4gICAgICAgICAgICByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24oKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIGluc2VydFNraWxsTWVudGlvbjogKG1lbnRpb246IENvbnRleHRNZW50aW9uKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpcCA9IGJ1aWxkQ2hpcEVsZW1lbnQobWVudGlvbilcbiAgICAgICAgICByZXBsYWNlVHJpZ2dlcldpdGhTa2lsbENoaXAoY2hpcCwgbWVudGlvbilcbiAgICAgICAgICBza2lwTmV4dElucHV0LmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBzZXJpYWxpemUoKVxuICAgICAgICAgIG9uSW5wdXQ/Lih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCB9LFxuICAgICAgICAgICAgc2xhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJyB9LFxuICAgICAgICAgICAgaGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zdCBpc0VtcHR5ID0gc3RhdGUudGV4dC50cmltKCkgPT09ICcnXG4gICAgICAgICAgc3luY0VkaXRvckVtcHR5QXR0cmlidXRlKGlzRW1wdHkpXG4gICAgICAgICAgc2V0TG9naWNhbEVtcHR5KGlzRW1wdHkpXG4gICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgc2tpcE5leHRJbnB1dC5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgICAgIHJlY29tcHV0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbigpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgaW5zZXJ0U2xhc2hDb21tYW5kOiAoY29tbWFuZDogU2xhc2hDb21tYW5kQ2hpcERhdGEpID0+IHtcbiAgICAgICAgICBjb25zdCBjaGlwID0gYnVpbGRTbGFzaENoaXBFbGVtZW50KGNvbW1hbmQpXG4gICAgICAgICAgcmVwbGFjZVRyaWdnZXJXaXRoU2xhc2hDaGlwKGNoaXAsIGNvbW1hbmQpXG4gICAgICAgICAgc2tpcE5leHRJbnB1dC5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICAgIGNvbnN0IHN0YXRlID0gc2VyaWFsaXplKClcbiAgICAgICAgICBvbklucHV0Py4oe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICB0cmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAgfSxcbiAgICAgICAgICAgIHNsYXNoVHJpZ2dlcjogeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycgfSxcbiAgICAgICAgICAgIGhhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJyB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgY29uc3QgaXNFbXB0eSA9IHN0YXRlLnRleHQudHJpbSgpID09PSAnJ1xuICAgICAgICAgIHN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZShpc0VtcHR5KVxuICAgICAgICAgIHNldExvZ2ljYWxFbXB0eShpc0VtcHR5KVxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IGZhbHNlXG4gICAgICAgICAgICByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24oKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIFtcbiAgICAgICAgZm9jdXMsXG4gICAgICAgIGNsZWFyRWRpdG9yRG9tLFxuICAgICAgICBzZXJpYWxpemUsXG4gICAgICAgIHN5bmNUcmlnZ2VyQXRSdW5MZW5ndGgsXG4gICAgICAgIHJlcGxhY2VUcmlnZ2VyV2l0aENoaXAsXG4gICAgICAgIHJlcGxhY2VUcmlnZ2VyV2l0aFNsYXNoQ2hpcCxcbiAgICAgICAgcmVwbGFjZVRyaWdnZXJXaXRoU2tpbGxDaGlwLFxuICAgICAgICBvbklucHV0LFxuICAgICAgICByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24sXG4gICAgICAgIHN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZSxcbiAgICAgICAgZW1pdElucHV0U3RhdGUsXG4gICAgICAgIGRpc2FibGVkLFxuICAgICAgICBlZGl0b3JSZWYsXG4gICAgICBdXG4gICAgKVxuXG4gICAgY29uc3QgaGFuZGxlSW5wdXQgPSAoKSA9PiB7XG4gICAgICBpZiAoc2tpcE5leHRJbnB1dC5jdXJyZW50KSB7XG4gICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IGZhbHNlXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgZW1pdElucHV0U3RhdGUoKVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZVBhc3RlID0gKGU6IENsaXBib2FyZEV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3QgZmlsZXMgPSBmaWxlc0Zyb21EYXRhVHJhbnNmZXIoZS5jbGlwYm9hcmREYXRhKVxuICAgICAgaWYgKGZpbGVzLmxlbmd0aCAmJiBvblBhc3RlRmlsZXMpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIG9uUGFzdGVGaWxlcyhmaWxlcylcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJylcbiAgICAgIGlmIChmaWxlcy5sZW5ndGggJiYgb25QYXN0ZUZpbGVzICYmICF0ZXh0KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVyblxuICAgICAgc2VsZWN0aW9uLmRlbGV0ZUZyb21Eb2N1bWVudCgpXG4gICAgICBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5pbnNlcnROb2RlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpKVxuICAgICAgc2VsZWN0aW9uLmNvbGxhcHNlVG9FbmQoKVxuICAgICAgaGFuZGxlSW5wdXQoKVxuICAgIH1cblxuICAgIGNvbnN0IHRyaW1tZWRQbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyPy50cmltKCkgPz8gJydcbiAgICBjb25zdCBwbGFjZWhvbGRlclRvb2x0aXBUaXRsZSA9IGxvZ2ljYWxFbXB0eSAmJiBwbGFjZWhvbGRlclRydW5jYXRlZCAmJiB0cmltbWVkUGxhY2Vob2xkZXIgPyB0cmltbWVkUGxhY2Vob2xkZXIgOiAnJ1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxDb250ZXh0TWVudGlvbkNoaXBHbG9iYWxTdHlsZXMgLz5cbiAgICAgICAgPFRvb2x0aXAgdGl0bGU9e3BsYWNlaG9sZGVyVG9vbHRpcFRpdGxlfT5cbiAgICAgICAgICA8c3BhbiBzdHlsZT17eyBkaXNwbGF5OiAnYmxvY2snLCB3aWR0aDogJzEwMCUnLCBtaW5XaWR0aDogMCB9fT5cbiAgICAgICAgICAgIDxTQ01FRWRpdGFibGVcbiAgICAgICAgICAgICAgcmVmPXtlZGl0b3JSZWZ9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgICAgICAgICAgICAkbWF4SGVpZ2h0PXttYXhIZWlnaHR9XG4gICAgICAgICAgICAgIHN0eWxlPXttYXhIZWlnaHQgIT0gbnVsbCA/IHsgbWF4SGVpZ2h0IH0gOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgIGRhdGEtcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgICAgICBkYXRhLWVtcHR5PXtTdHJpbmcobG9naWNhbEVtcHR5KX1cbiAgICAgICAgICAgICAgY29udGVudEVkaXRhYmxlPXshZGlzYWJsZWR9XG4gICAgICAgICAgICAgIGRhdGEtZGlzYWJsZWQ9e1N0cmluZyghIWRpc2FibGVkKX1cbiAgICAgICAgICAgICAgc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nXG4gICAgICAgICAgICAgIHJvbGU9XCJ0ZXh0Ym94XCJcbiAgICAgICAgICAgICAgYXJpYS1tdWx0aWxpbmU9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgb25JbnB1dD17aGFuZGxlSW5wdXR9XG4gICAgICAgICAgICAgIG9uS2V5RG93bj17b25LZXlEb3dufVxuICAgICAgICAgICAgICBvblBhc3RlPXtoYW5kbGVQYXN0ZX1cbiAgICAgICAgICAgICAgb25Gb2N1cz17b25Gb2N1c31cbiAgICAgICAgICAgICAgb25CbHVyPXtvbkJsdXJ9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgPC8+XG4gICAgKVxuICB9XG4pXG5cbkNvbnRleHRNZW50aW9uRWRpdG9yLmRpc3BsYXlOYW1lID0gJ0NvbnRleHRNZW50aW9uRWRpdG9yJ1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsU0FFRUEsVUFBVSxFQUVWQyxXQUFXLEVBQ1hDLG1CQUFtQixFQUNuQkMsZUFBZSxFQUNmQyxNQUFNLEVBQ05DLFFBQVEsUUFDSCxPQUFPO0FBQ2QsU0FBU0MsT0FBTyxRQUFRLDhDQUE4QztBQUN0RSxTQUFTQyxrQkFBa0IsUUFBUSxtQ0FBbUM7QUFFdEUsU0FBU0MsZ0JBQWdCLFFBQVEsdUJBQXVCO0FBQ3hELFNBQVNDLDhCQUE4QixRQUFRLGlEQUFpRDtBQUNoRyxTQUFTQyxxQkFBcUIsUUFBOEIscUJBQXFCO0FBQ2pGLFNBQVNDLHFCQUFxQixRQUFRLCtCQUErQjtBQUNyRSxTQUFTQyxZQUFZLFFBQVEsK0JBQStCO0FBQUEsU0FBQUMsR0FBQSxJQUFBQyxJQUFBLEVBQUFDLFFBQUEsSUFBQUMsU0FBQSxFQUFBQyxJQUFBLElBQUFDLEtBQUE7QUFFNUQsSUFBTUMsOEJBQThCLEdBQUcsU0FBakNBLDhCQUE4QkEsQ0FBSUMsTUFBbUIsRUFBRUMsV0FBbUIsRUFBYztFQUM1RixJQUFNQyxPQUFPLEdBQUdELFdBQVcsQ0FBQ0UsSUFBSSxDQUFDLENBQUM7RUFDbEMsSUFBSSxDQUFDRCxPQUFPLEVBQUU7SUFDWixPQUFPLEtBQUs7RUFDZDtFQUNBLElBQVFFLFdBQVcsR0FBS0osTUFBTSxDQUF0QkksV0FBVztFQUNuQixJQUFJQSxXQUFXLElBQUksQ0FBQyxFQUFFO0lBQ3BCLE9BQU8sS0FBSztFQUNkO0VBRUEsSUFBTUMsTUFBTSxHQUFHQyxNQUFNLENBQUNDLGdCQUFnQixDQUFDUCxNQUFNLENBQUM7RUFDOUMsSUFBTVEsR0FBRyxHQUFHQyxRQUFRLENBQUNDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQ0MsVUFBVSxDQUFDLElBQUksQ0FBQztFQUM3RCxJQUFJLENBQUNILEdBQUcsRUFBRTtJQUNSLE9BQU8sS0FBSztFQUNkO0VBQ0FBLEdBQUcsQ0FBQ0ksSUFBSSxNQUFBQyxNQUFBLENBQU1SLE1BQU0sQ0FBQ1MsVUFBVSxPQUFBRCxNQUFBLENBQUlSLE1BQU0sQ0FBQ1UsUUFBUSxPQUFBRixNQUFBLENBQUlSLE1BQU0sQ0FBQ1csVUFBVSxDQUFFO0VBQ3pFLElBQU1DLFFBQVEsR0FBR1QsR0FBRyxDQUFDVSxXQUFXLENBQUNoQixPQUFPLENBQUMsQ0FBQ2lCLEtBQUs7RUFFL0MsSUFBTUMsV0FBVyxHQUFHQyxVQUFVLENBQUNoQixNQUFNLENBQUNlLFdBQVcsQ0FBQyxJQUFJLENBQUM7RUFDdkQsSUFBTUUsWUFBWSxHQUFHRCxVQUFVLENBQUNoQixNQUFNLENBQUNpQixZQUFZLENBQUMsSUFBSSxDQUFDO0VBQ3pELElBQU1DLFVBQVUsR0FBR0YsVUFBVSxDQUFDaEIsTUFBTSxDQUFDbUIsZUFBZSxDQUFDLElBQUksQ0FBQztFQUMxRCxJQUFNQyxXQUFXLEdBQUdKLFVBQVUsQ0FBQ2hCLE1BQU0sQ0FBQ3FCLGdCQUFnQixDQUFDLElBQUksQ0FBQztFQUM1RCxJQUFNQyxTQUFTLEdBQUdDLElBQUksQ0FBQ0MsR0FBRyxDQUFDLENBQUMsRUFBRXpCLFdBQVcsR0FBR2dCLFdBQVcsR0FBR0UsWUFBWSxHQUFHQyxVQUFVLEdBQUdFLFdBQVcsQ0FBQztFQUVsRyxPQUFPUixRQUFRLEdBQUdVLFNBQVMsR0FBRyxDQUFDO0FBQ2pDLENBQUM7QUFpREQsT0FBTyxJQUFNRyxvQkFBb0IsZ0JBQUdsRCxVQUFVLENBQzVDLFVBQUFtRCxJQUFBLEVBQXFHQyxHQUFHLEVBQUs7RUFBQSxJQUFBQyxrQkFBQTtFQUFBLElBQTFHaEMsV0FBVyxHQUFBOEIsSUFBQSxDQUFYOUIsV0FBVztJQUFFaUMsUUFBUSxHQUFBSCxJQUFBLENBQVJHLFFBQVE7SUFBRUMsU0FBUyxHQUFBSixJQUFBLENBQVRJLFNBQVM7SUFBRUMsU0FBUyxHQUFBTCxJQUFBLENBQVRLLFNBQVM7SUFBRUMsT0FBTyxHQUFBTixJQUFBLENBQVBNLE9BQU87SUFBRUMsU0FBUyxHQUFBUCxJQUFBLENBQVRPLFNBQVM7SUFBRUMsT0FBTyxHQUFBUixJQUFBLENBQVBRLE9BQU87SUFBRUMsTUFBTSxHQUFBVCxJQUFBLENBQU5TLE1BQU07SUFBRUMsWUFBWSxHQUFBVixJQUFBLENBQVpVLFlBQVk7RUFDL0YsSUFBQUMsbUJBQUEsR0FZSXZELGtCQUFrQixDQUFDLENBQUM7SUFYdEJ3RCxTQUFTLEdBQUFELG1CQUFBLENBQVRDLFNBQVM7SUFDVEMsYUFBYSxHQUFBRixtQkFBQSxDQUFiRSxhQUFhO0lBQ2JDLHNCQUFzQixHQUFBSCxtQkFBQSxDQUF0Qkcsc0JBQXNCO0lBQ3RCQyxzQkFBc0IsR0FBQUosbUJBQUEsQ0FBdEJJLHNCQUFzQjtJQUN0QkMsa0JBQWtCLEdBQUFMLG1CQUFBLENBQWxCSyxrQkFBa0I7SUFDbEJDLDJCQUEyQixHQUFBTixtQkFBQSxDQUEzQk0sMkJBQTJCO0lBQzNCQyxpQkFBaUIsR0FBQVAsbUJBQUEsQ0FBakJPLGlCQUFpQjtJQUNqQkMsMkJBQTJCLEdBQUFSLG1CQUFBLENBQTNCUSwyQkFBMkI7SUFDM0JDLFNBQVMsR0FBQVQsbUJBQUEsQ0FBVFMsU0FBUztJQUNGQyxjQUFjLEdBQUFWLG1CQUFBLENBQXJCVyxLQUFLO0lBQ0xDLEtBQUssR0FBQVosbUJBQUEsQ0FBTFksS0FBSztFQUVQLElBQU1DLGFBQWEsR0FBR3ZFLE1BQU0sQ0FBQyxLQUFLLENBQUM7RUFDbkMsSUFBQXdFLFNBQUEsR0FBd0R2RSxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQUF3RSxVQUFBLEdBQUFDLGNBQUEsQ0FBQUYsU0FBQTtJQUFoRUcsb0JBQW9CLEdBQUFGLFVBQUE7SUFBRUcsdUJBQXVCLEdBQUFILFVBQUE7RUFDcEQsSUFBQUksVUFBQSxHQUF3QzVFLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFBQTZFLFVBQUEsR0FBQUosY0FBQSxDQUFBRyxVQUFBO0lBQS9DRSxZQUFZLEdBQUFELFVBQUE7SUFBRUUsZUFBZSxHQUFBRixVQUFBO0VBRXBDLElBQU1HLHdCQUF3QixHQUFHcEYsV0FBVyxDQUFDLFVBQUNxRixPQUFnQixFQUFLO0lBQ2pFLElBQUl2QixTQUFTLENBQUN3QixPQUFPLEVBQUU7TUFDckJ4QixTQUFTLENBQUN3QixPQUFPLENBQUNDLFlBQVksQ0FBQyxZQUFZLEVBQUVDLE1BQU0sQ0FBQ0gsT0FBTyxDQUFDLENBQUM7SUFDL0Q7RUFDRixDQUFDLEVBQUUsRUFBRSxDQUFDO0VBRU4sSUFBTUksdUJBQXVCLEdBQUd6RixXQUFXLENBQUMsWUFBTTtJQUFBLElBQUEwRixtQkFBQTtJQUNoRCxJQUFNdkUsTUFBTSxHQUFHMkMsU0FBUyxDQUFDd0IsT0FBTztJQUNoQyxJQUFJLENBQUNuRSxNQUFNLEVBQUU7O0lBRWI7SUFDQTtJQUNBO0lBQ0EsSUFBSSxFQUFBdUUsbUJBQUEsR0FBQXZFLE1BQU0sQ0FBQ3dFLFdBQVcsY0FBQUQsbUJBQUEsdUJBQWxCQSxtQkFBQSxDQUFvQnBFLElBQUksQ0FBQyxDQUFDLE1BQUssRUFBRSxFQUFFO01BQ3JDSCxNQUFNLENBQUN5RSxTQUFTLEdBQUcsRUFBRTtJQUN2QjtJQUVBLElBQU1DLFNBQVMsR0FBR3BFLE1BQU0sQ0FBQ3FFLFlBQVksQ0FBQyxDQUFDO0lBQ3ZDLElBQUksQ0FBQ0QsU0FBUyxFQUFFO0lBQ2hCLElBQU1FLEtBQUssR0FBR25FLFFBQVEsQ0FBQ29FLFdBQVcsQ0FBQyxDQUFDO0lBQ3BDRCxLQUFLLENBQUNFLGtCQUFrQixDQUFDOUUsTUFBTSxDQUFDO0lBQ2hDNEUsS0FBSyxDQUFDRyxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQ3BCTCxTQUFTLENBQUNNLGVBQWUsQ0FBQyxDQUFDO0lBQzNCTixTQUFTLENBQUNPLFFBQVEsQ0FBQ0wsS0FBSyxDQUFDO0VBQzNCLENBQUMsRUFBRSxDQUFDakMsU0FBUyxDQUFDLENBQUM7RUFFZixJQUFNdUMsOEJBQThCLEdBQUdyRyxXQUFXLENBQUMsWUFBTTtJQUFBLElBQUFzRyxpQkFBQTtJQUN2RCxJQUFNQyxFQUFFLEdBQUd6QyxTQUFTLENBQUN3QixPQUFPO0lBQzVCLElBQU1rQixFQUFFLElBQUFGLGlCQUFBLEdBQUdsRixXQUFXLGFBQVhBLFdBQVcsdUJBQVhBLFdBQVcsQ0FBRUUsSUFBSSxDQUFDLENBQUMsY0FBQWdGLGlCQUFBLGNBQUFBLGlCQUFBLEdBQUksRUFBRTtJQUNwQyxJQUFNRyxzQkFBc0IsR0FBR25DLFNBQVMsQ0FBQyxDQUFDLENBQUNvQyxJQUFJLENBQUNwRixJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7SUFFN0QsSUFBSSxDQUFDaUYsRUFBRSxJQUFJLENBQUNDLEVBQUUsSUFBSSxDQUFDQyxzQkFBc0IsRUFBRTtNQUN6QzFCLHVCQUF1QixDQUFDLEtBQUssQ0FBQztNQUM5QjtJQUNGO0lBRUFBLHVCQUF1QixDQUFDN0QsOEJBQThCLENBQUNxRixFQUFFLEVBQUVDLEVBQUUsQ0FBQyxDQUFDO0VBQ2pFLENBQUMsRUFBRSxDQUFDcEYsV0FBVyxFQUFFa0QsU0FBUyxDQUFDLENBQUM7RUFFNUJwRSxlQUFlLENBQUMsWUFBTTtJQUNwQm1HLDhCQUE4QixDQUFDLENBQUM7SUFDaEMsSUFBTUUsRUFBRSxHQUFHekMsU0FBUyxDQUFDd0IsT0FBTztJQUM1QixJQUFJLENBQUNpQixFQUFFLEVBQUU7TUFDUCxPQUFPSSxTQUFTO0lBQ2xCO0lBQ0EsSUFBTUMsRUFBRSxHQUFHLElBQUlDLGNBQWMsQ0FBQyxZQUFNO01BQ2xDQyxjQUFjLENBQUNULDhCQUE4QixDQUFDO0lBQ2hELENBQUMsQ0FBQztJQUNGTyxFQUFFLENBQUNHLE9BQU8sQ0FBQ1IsRUFBRSxDQUFDO0lBQ2QsT0FBTztNQUFBLE9BQU1LLEVBQUUsQ0FBQ0ksVUFBVSxDQUFDLENBQUM7SUFBQTtFQUM5QixDQUFDLEVBQUUsQ0FBQzVGLFdBQVcsRUFBRWlDLFFBQVEsRUFBRWdELDhCQUE4QixDQUFDLENBQUM7RUFFM0QsSUFBTVksY0FBYyxHQUFHakgsV0FBVyxDQUFDLFlBQU07SUFDdkMsSUFBTWtILElBQUksR0FBR25ELGFBQWEsQ0FBQyxDQUFDO0lBQzVCLElBQU1vRCxTQUFTLEdBQUdqRCxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3RDLElBQU1rRCxRQUFRLEdBQUdoRCxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BDLElBQUlpRCxLQUFLLEdBQUcvQyxTQUFTLENBQUMsQ0FBQztJQUN2QixJQUFNZSxPQUFPLEdBQUdnQyxLQUFLLENBQUNYLElBQUksQ0FBQ3BGLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRTtJQUN4QyxJQUFJK0QsT0FBTyxFQUFFO01BQ1hJLHVCQUF1QixDQUFDLENBQUM7TUFDekI0QixLQUFLLEdBQUc7UUFBRVgsSUFBSSxFQUFFLEVBQUU7UUFBRVksUUFBUSxFQUFFLEVBQUU7UUFBRUMsYUFBYSxFQUFFO01BQUcsQ0FBQztJQUN2RDtJQUNBbkMsd0JBQXdCLENBQUNDLE9BQU8sQ0FBQztJQUNqQ0YsZUFBZSxDQUFDRSxPQUFPLENBQUM7SUFDeEI3QixPQUFPLGFBQVBBLE9BQU8sZUFBUEEsT0FBTyxDQUFBZ0UsYUFBQSxDQUFBQSxhQUFBLEtBQ0ZILEtBQUs7TUFDUkksT0FBTyxFQUFFO1FBQUVDLE1BQU0sRUFBRVIsSUFBSSxDQUFDUSxNQUFNO1FBQUVDLEtBQUssRUFBRVQsSUFBSSxDQUFDUyxLQUFLO1FBQUVDLFdBQVcsRUFBRVYsSUFBSSxDQUFDVTtNQUFZLENBQUM7TUFDbEZDLFlBQVksRUFBRTtRQUFFSCxNQUFNLEVBQUVQLFNBQVMsQ0FBQ08sTUFBTTtRQUFFQyxLQUFLLEVBQUVSLFNBQVMsQ0FBQ1E7TUFBTSxDQUFDO01BQ2xFRyxXQUFXLEVBQUU7UUFBRUosTUFBTSxFQUFFTixRQUFRLENBQUNNLE1BQU07UUFBRUMsS0FBSyxFQUFFUCxRQUFRLENBQUNPO01BQU07SUFBQyxFQUNoRSxDQUFDO0lBQ0ZiLGNBQWMsQ0FBQ1QsOEJBQThCLENBQUM7RUFDaEQsQ0FBQyxFQUFFLENBQ0R0QyxhQUFhLEVBQ2JHLGtCQUFrQixFQUNsQkUsaUJBQWlCLEVBQ2pCRSxTQUFTLEVBQ1RtQix1QkFBdUIsRUFDdkJMLHdCQUF3QixFQUN4QjVCLE9BQU8sRUFDUDZDLDhCQUE4QixDQUMvQixDQUFDO0VBRUZwRyxtQkFBbUIsQ0FDakJrRCxHQUFHLEVBQ0g7SUFBQSxPQUFPO01BQ0xzQixLQUFLLEVBQUxBLEtBQUs7TUFDTEQsS0FBSyxFQUFFLFNBQVBBLEtBQUtBLENBQUEsRUFBUTtRQUNYRCxjQUFjLENBQUMsQ0FBQztRQUNoQmEsd0JBQXdCLENBQUMsSUFBSSxDQUFDO1FBQzlCRCxlQUFlLENBQUMsSUFBSSxDQUFDO1FBQ3JCMkIsY0FBYyxDQUFDVCw4QkFBOEIsQ0FBQztNQUNoRCxDQUFDO01BQ0QwQixZQUFZLEVBQUUsU0FBZEEsWUFBWUEsQ0FBR3JCLElBQVksRUFBSztRQUM5QixJQUFNdkYsTUFBTSxHQUFHMkMsU0FBUyxDQUFDd0IsT0FBTztRQUNoQyxJQUFJLENBQUNuRSxNQUFNLEVBQUU7UUFDYixJQUFNNkcsS0FBSyxHQUFHdEIsSUFBSSxhQUFKQSxJQUFJLGNBQUpBLElBQUksR0FBSSxFQUFFO1FBQ3hCdkYsTUFBTSxDQUFDd0UsV0FBVyxHQUFHcUMsS0FBSztRQUMxQnRELGFBQWEsQ0FBQ1ksT0FBTyxHQUFHLElBQUk7UUFDNUIsSUFBTStCLEtBQUssR0FBRy9DLFNBQVMsQ0FBQyxDQUFDO1FBQ3pCLElBQU1lLE9BQU8sR0FBR2dDLEtBQUssQ0FBQ1gsSUFBSSxDQUFDcEYsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFO1FBQ3hDLElBQUkrRCxPQUFPLEVBQUU7VUFDWGxFLE1BQU0sQ0FBQ3lFLFNBQVMsR0FBRyxFQUFFO1FBQ3ZCO1FBQ0FSLHdCQUF3QixDQUFDQyxPQUFPLENBQUM7UUFDakNGLGVBQWUsQ0FBQ0UsT0FBTyxDQUFDO1FBQ3hCN0IsT0FBTyxhQUFQQSxPQUFPLGVBQVBBLE9BQU8sQ0FBQWdFLGFBQUEsQ0FBQUEsYUFBQSxLQUNGSCxLQUFLO1VBQ1JJLE9BQU8sRUFBRTtZQUFFQyxNQUFNLEVBQUUsS0FBSztZQUFFQyxLQUFLLEVBQUUsRUFBRTtZQUFFQyxXQUFXLEVBQUU7VUFBRSxDQUFDO1VBQ3JEQyxZQUFZLEVBQUU7WUFBRUgsTUFBTSxFQUFFLEtBQUs7WUFBRUMsS0FBSyxFQUFFO1VBQUcsQ0FBQztVQUMxQ0csV0FBVyxFQUFFO1lBQUVKLE1BQU0sRUFBRSxLQUFLO1lBQUVDLEtBQUssRUFBRTtVQUFHO1FBQUMsRUFDMUMsQ0FBQztRQUNGLElBQU05QixTQUFTLEdBQUdwRSxNQUFNLENBQUNxRSxZQUFZLENBQUMsQ0FBQztRQUN2QyxJQUFJRCxTQUFTLElBQUkxRSxNQUFNLENBQUM4RyxVQUFVLENBQUNDLE1BQU0sR0FBRyxDQUFDLEVBQUU7VUFDN0MsSUFBTW5DLEtBQUssR0FBR25FLFFBQVEsQ0FBQ29FLFdBQVcsQ0FBQyxDQUFDO1VBQ3BDRCxLQUFLLENBQUNFLGtCQUFrQixDQUFDOUUsTUFBTSxDQUFDO1VBQ2hDNEUsS0FBSyxDQUFDRyxRQUFRLENBQUMsS0FBSyxDQUFDO1VBQ3JCTCxTQUFTLENBQUNNLGVBQWUsQ0FBQyxDQUFDO1VBQzNCTixTQUFTLENBQUNPLFFBQVEsQ0FBQ0wsS0FBSyxDQUFDO1FBQzNCO1FBQ0FlLGNBQWMsQ0FBQyxZQUFNO1VBQ25CcEMsYUFBYSxDQUFDWSxPQUFPLEdBQUcsS0FBSztVQUM3QmUsOEJBQThCLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUM7TUFDSixDQUFDO01BQ0Q4QixvQkFBb0IsRUFBRSxTQUF0QkEsb0JBQW9CQSxDQUFBLEVBQVE7UUFDMUIsSUFBTWhILE1BQU0sR0FBRzJDLFNBQVMsQ0FBQ3dCLE9BQU87UUFDaEMsSUFBSSxDQUFDbkUsTUFBTSxJQUFJa0MsUUFBUSxFQUFFO1FBRXpCb0IsS0FBSyxDQUFDLENBQUM7UUFFUCxJQUFNb0IsU0FBUyxHQUFHcEUsTUFBTSxDQUFDcUUsWUFBWSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDRCxTQUFTLEVBQUU7UUFFaEIsSUFBSSxDQUFDQSxTQUFTLENBQUN1QyxVQUFVLElBQUksQ0FBQ2pILE1BQU0sQ0FBQ2tILFFBQVEsQ0FBQ3hDLFNBQVMsQ0FBQ3VDLFVBQVUsQ0FBQyxFQUFFO1VBQ25FLElBQU1FLFFBQVEsR0FBRzFHLFFBQVEsQ0FBQ29FLFdBQVcsQ0FBQyxDQUFDO1VBQ3ZDc0MsUUFBUSxDQUFDckMsa0JBQWtCLENBQUM5RSxNQUFNLENBQUM7VUFDbkNtSCxRQUFRLENBQUNwQyxRQUFRLENBQUMsS0FBSyxDQUFDO1VBQ3hCTCxTQUFTLENBQUNNLGVBQWUsQ0FBQyxDQUFDO1VBQzNCTixTQUFTLENBQUNPLFFBQVEsQ0FBQ2tDLFFBQVEsQ0FBQztRQUM5QjtRQUVBLElBQU12QyxLQUFLLEdBQUdGLFNBQVMsQ0FBQzBDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDckN4QyxLQUFLLENBQUNHLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFFcEIsSUFBSXNDLE1BQU0sR0FBRyxFQUFFO1FBQ2YsSUFBUUMsY0FBYyxHQUFrQjFDLEtBQUssQ0FBckMwQyxjQUFjO1VBQUVDLFdBQVcsR0FBSzNDLEtBQUssQ0FBckIyQyxXQUFXO1FBQ25DLElBQUlELGNBQWMsQ0FBQ0UsUUFBUSxLQUFLQyxJQUFJLENBQUNDLFNBQVMsRUFBRTtVQUM5QyxJQUFNQyxRQUFRLEdBQUdKLFdBQVcsR0FBRyxDQUFDLEdBQUlELGNBQWMsQ0FBVU0sSUFBSSxDQUFDQyxNQUFNLENBQUNOLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFO1VBQzdGO1VBQ0EsSUFBSUksUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDRyxJQUFJLENBQUNILFFBQVEsQ0FBQyxFQUFFO1lBQzFDTixNQUFNLEdBQUcsR0FBRztVQUNkO1FBQ0Y7UUFFQSxJQUFNVSxRQUFRLE1BQUFsSCxNQUFBLENBQU13RyxNQUFNLE1BQUc7UUFDN0IsSUFBTVcsUUFBUSxHQUFHdkgsUUFBUSxDQUFDd0gsY0FBYyxDQUFDRixRQUFRLENBQUM7UUFDbERuRCxLQUFLLENBQUNzRCxVQUFVLENBQUNGLFFBQVEsQ0FBQzs7UUFFMUI7UUFDQTtRQUNBLElBQU1HLFdBQVcsR0FBR0gsUUFBUSxDQUFDSSxlQUFlO1FBQzVDLElBQUlDLFNBQVMsR0FBR0wsUUFBUTtRQUN4QixJQUFJTSxXQUFXLEdBQUdQLFFBQVEsQ0FBQ2hCLE1BQU07UUFDakMsSUFBSU0sTUFBTSxLQUFLLEVBQUUsSUFBSSxDQUFBYyxXQUFXLGFBQVhBLFdBQVcsdUJBQVhBLFdBQVcsQ0FBRVgsUUFBUSxNQUFLQyxJQUFJLENBQUNDLFNBQVMsSUFBS1MsV0FBVyxDQUFVUCxJQUFJLENBQUNXLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtVQUN6RyxJQUFNQyxRQUFRLEdBQUdMLFdBQW1CO1VBQ3BDRyxXQUFXLEdBQUdFLFFBQVEsQ0FBQ1osSUFBSSxDQUFDYixNQUFNLEdBQUdnQixRQUFRLENBQUNoQixNQUFNO1VBQ3BEeUIsUUFBUSxDQUFDWixJQUFJLElBQUlHLFFBQVE7VUFDekJDLFFBQVEsQ0FBQ1MsTUFBTSxDQUFDLENBQUM7VUFDakJKLFNBQVMsR0FBR0csUUFBUTtRQUN0Qjs7UUFFQTtRQUNBO1FBQ0E1RCxLQUFLLENBQUM4RCxRQUFRLENBQUNMLFNBQVMsRUFBRUMsV0FBVyxDQUFDO1FBQ3RDMUQsS0FBSyxDQUFDRyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3BCTCxTQUFTLENBQUNNLGVBQWUsQ0FBQyxDQUFDO1FBQzNCTixTQUFTLENBQUNPLFFBQVEsQ0FBQ0wsS0FBSyxDQUFDO1FBRXpCa0IsY0FBYyxDQUFDLENBQUM7TUFDbEIsQ0FBQztNQUNENkMsa0JBQWtCLEVBQUUsU0FBcEJBLGtCQUFrQkEsQ0FBQSxFQUFRO1FBQ3hCLElBQU0zSSxNQUFNLEdBQUcyQyxTQUFTLENBQUN3QixPQUFPO1FBQ2hDLElBQUksQ0FBQ25FLE1BQU0sSUFBSWtDLFFBQVEsRUFBRTtRQUV6Qm9CLEtBQUssQ0FBQyxDQUFDO1FBRVAsSUFBTW9CLFNBQVMsR0FBR3BFLE1BQU0sQ0FBQ3FFLFlBQVksQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQ0QsU0FBUyxFQUFFO1FBRWhCLElBQUksQ0FBQ0EsU0FBUyxDQUFDdUMsVUFBVSxJQUFJLENBQUNqSCxNQUFNLENBQUNrSCxRQUFRLENBQUN4QyxTQUFTLENBQUN1QyxVQUFVLENBQUMsRUFBRTtVQUNuRSxJQUFNRSxRQUFRLEdBQUcxRyxRQUFRLENBQUNvRSxXQUFXLENBQUMsQ0FBQztVQUN2Q3NDLFFBQVEsQ0FBQ3JDLGtCQUFrQixDQUFDOUUsTUFBTSxDQUFDO1VBQ25DbUgsUUFBUSxDQUFDcEMsUUFBUSxDQUFDLEtBQUssQ0FBQztVQUN4QkwsU0FBUyxDQUFDTSxlQUFlLENBQUMsQ0FBQztVQUMzQk4sU0FBUyxDQUFDTyxRQUFRLENBQUNrQyxRQUFRLENBQUM7UUFDOUI7UUFFQSxJQUFNdkMsS0FBSyxHQUFHRixTQUFTLENBQUMwQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3JDeEMsS0FBSyxDQUFDRyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBRXBCLElBQUlzQyxNQUFNLEdBQUcsRUFBRTtRQUNmLElBQVFDLGNBQWMsR0FBa0IxQyxLQUFLLENBQXJDMEMsY0FBYztVQUFFQyxXQUFXLEdBQUszQyxLQUFLLENBQXJCMkMsV0FBVztRQUNuQyxJQUFJRCxjQUFjLENBQUNFLFFBQVEsS0FBS0MsSUFBSSxDQUFDQyxTQUFTLEVBQUU7VUFDOUMsSUFBTUMsUUFBUSxHQUFHSixXQUFXLEdBQUcsQ0FBQyxHQUFJRCxjQUFjLENBQVVNLElBQUksQ0FBQ0MsTUFBTSxDQUFDTixXQUFXLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRTtVQUM3RixJQUFJSSxRQUFRLElBQUksQ0FBQyxTQUFTLENBQUNHLElBQUksQ0FBQ0gsUUFBUSxDQUFDLEVBQUU7WUFDekNOLE1BQU0sR0FBRyxHQUFHO1VBQ2Q7UUFDRjtRQUVBLElBQU1VLFFBQVEsTUFBQWxILE1BQUEsQ0FBTXdHLE1BQU0sTUFBRztRQUM3QixJQUFNVyxRQUFRLEdBQUd2SCxRQUFRLENBQUN3SCxjQUFjLENBQUNGLFFBQVEsQ0FBQztRQUNsRG5ELEtBQUssQ0FBQ3NELFVBQVUsQ0FBQ0YsUUFBUSxDQUFDOztRQUUxQjtRQUNBcEQsS0FBSyxDQUFDOEQsUUFBUSxDQUFDVixRQUFRLEVBQUVELFFBQVEsQ0FBQ2hCLE1BQU0sQ0FBQztRQUN6Q25DLEtBQUssQ0FBQ0csUUFBUSxDQUFDLElBQUksQ0FBQztRQUNwQkwsU0FBUyxDQUFDTSxlQUFlLENBQUMsQ0FBQztRQUMzQk4sU0FBUyxDQUFDTyxRQUFRLENBQUNMLEtBQUssQ0FBQztRQUV6QmtCLGNBQWMsQ0FBQyxDQUFDO01BQ2xCLENBQUM7TUFDRDhDLGtCQUFrQixFQUFFLFNBQXBCQSxrQkFBa0JBLENBQUEsRUFBUTtRQUN4QixJQUFNNUksTUFBTSxHQUFHMkMsU0FBUyxDQUFDd0IsT0FBTztRQUNoQyxJQUFJLENBQUNuRSxNQUFNLElBQUlrQyxRQUFRLEVBQUU7UUFFekJvQixLQUFLLENBQUMsQ0FBQztRQUVQLElBQU1vQixTQUFTLEdBQUdwRSxNQUFNLENBQUNxRSxZQUFZLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUNELFNBQVMsRUFBRTtRQUVoQixJQUFJLENBQUNBLFNBQVMsQ0FBQ3VDLFVBQVUsSUFBSSxDQUFDakgsTUFBTSxDQUFDa0gsUUFBUSxDQUFDeEMsU0FBUyxDQUFDdUMsVUFBVSxDQUFDLEVBQUU7VUFDbkUsSUFBTUUsUUFBUSxHQUFHMUcsUUFBUSxDQUFDb0UsV0FBVyxDQUFDLENBQUM7VUFDdkNzQyxRQUFRLENBQUNyQyxrQkFBa0IsQ0FBQzlFLE1BQU0sQ0FBQztVQUNuQ21ILFFBQVEsQ0FBQ3BDLFFBQVEsQ0FBQyxLQUFLLENBQUM7VUFDeEJMLFNBQVMsQ0FBQ00sZUFBZSxDQUFDLENBQUM7VUFDM0JOLFNBQVMsQ0FBQ08sUUFBUSxDQUFDa0MsUUFBUSxDQUFDO1FBQzlCO1FBRUEsSUFBTXZDLEtBQUssR0FBR0YsU0FBUyxDQUFDMEMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUNyQ3hDLEtBQUssQ0FBQ0csUUFBUSxDQUFDLElBQUksQ0FBQztRQUVwQixJQUFJc0MsTUFBTSxHQUFHLEVBQUU7UUFDZixJQUFRQyxjQUFjLEdBQWtCMUMsS0FBSyxDQUFyQzBDLGNBQWM7VUFBRUMsV0FBVyxHQUFLM0MsS0FBSyxDQUFyQjJDLFdBQVc7UUFDbkMsSUFBSUQsY0FBYyxDQUFDRSxRQUFRLEtBQUtDLElBQUksQ0FBQ0MsU0FBUyxFQUFFO1VBQzlDLElBQU1DLFFBQVEsR0FBR0osV0FBVyxHQUFHLENBQUMsR0FBSUQsY0FBYyxDQUFVTSxJQUFJLENBQUNDLE1BQU0sQ0FBQ04sV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUU7VUFDN0YsSUFBSUksUUFBUSxJQUFJLENBQUMsU0FBUyxDQUFDRyxJQUFJLENBQUNILFFBQVEsQ0FBQyxFQUFFO1lBQ3pDTixNQUFNLEdBQUcsR0FBRztVQUNkO1FBQ0Y7UUFFQSxJQUFNVSxRQUFRLE1BQUFsSCxNQUFBLENBQU13RyxNQUFNLE1BQUc7UUFDN0IsSUFBTVcsUUFBUSxHQUFHdkgsUUFBUSxDQUFDd0gsY0FBYyxDQUFDRixRQUFRLENBQUM7UUFDbERuRCxLQUFLLENBQUNzRCxVQUFVLENBQUNGLFFBQVEsQ0FBQztRQUUxQnBELEtBQUssQ0FBQzhELFFBQVEsQ0FBQ1YsUUFBUSxFQUFFRCxRQUFRLENBQUNoQixNQUFNLENBQUM7UUFDekNuQyxLQUFLLENBQUNHLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDcEJMLFNBQVMsQ0FBQ00sZUFBZSxDQUFDLENBQUM7UUFDM0JOLFNBQVMsQ0FBQ08sUUFBUSxDQUFDTCxLQUFLLENBQUM7UUFFekJrQixjQUFjLENBQUMsQ0FBQztNQUNsQixDQUFDO01BQ0QzQyxTQUFTLEVBQVRBLFNBQVM7TUFDVEwsc0JBQXNCLEVBQXRCQSxzQkFBc0I7TUFDdEIrRixrQkFBa0IsRUFBRSxTQUFwQkEsa0JBQWtCQSxDQUFBLEVBQVE7UUFBQSxJQUFBQyxxQkFBQSxFQUFBQyxvQkFBQTtRQUN4QixJQUFNL0ksTUFBTSxHQUFHMkMsU0FBUyxDQUFDd0IsT0FBTztRQUNoQyxJQUFJLENBQUNuRSxNQUFNLEVBQUU7VUFDWCxPQUFPLEtBQUs7UUFDZDtRQUVBLElBQU11RixJQUFJLElBQUF1RCxxQkFBQSxJQUFBQyxvQkFBQSxHQUFHL0ksTUFBTSxDQUFDd0UsV0FBVyxjQUFBdUUsb0JBQUEsdUJBQWxCQSxvQkFBQSxDQUFvQjVJLElBQUksQ0FBQyxDQUFDLGNBQUEySSxxQkFBQSxjQUFBQSxxQkFBQSxHQUFJLEVBQUU7UUFDN0MsSUFBSSxDQUFDdkQsSUFBSSxFQUFFO1VBQ1QsT0FBTyxLQUFLO1FBQ2Q7UUFFQSxJQUFNbEYsTUFBTSxHQUFHQyxNQUFNLENBQUNDLGdCQUFnQixDQUFDUCxNQUFNLENBQUM7UUFDOUMsSUFBTWdKLFVBQVUsR0FBRzNILFVBQVUsQ0FBQ2hCLE1BQU0sQ0FBQzJJLFVBQVUsQ0FBQyxJQUFJLEVBQUU7UUFDdEQsSUFBTUMsWUFBWSxHQUFHakosTUFBTSxDQUFDa0oscUJBQXFCLENBQUMsQ0FBQyxDQUFDQyxNQUFNO1FBQzFELElBQU1DLFdBQVcsR0FBR0gsWUFBWSxHQUFHRCxVQUFVLEdBQUcsR0FBRztRQUVuRCxPQUFPSSxXQUFXO01BQ3BCLENBQUM7TUFDREMsbUJBQW1CLEVBQUUsU0FBckJBLG1CQUFtQkEsQ0FBQTtRQUFBLElBQUFDLHFCQUFBLEVBQUFDLGtCQUFBO1FBQUEsUUFBQUQscUJBQUEsSUFBQUMsa0JBQUEsR0FBUTVHLFNBQVMsQ0FBQ3dCLE9BQU8sY0FBQW9GLGtCQUFBLHVCQUFqQkEsa0JBQUEsQ0FBbUJMLHFCQUFxQixDQUFDLENBQUMsY0FBQUkscUJBQUEsY0FBQUEscUJBQUEsR0FBSSxJQUFJO01BQUE7TUFDN0VFLGFBQWEsRUFBRSxTQUFmQSxhQUFhQSxDQUFHQyxPQUF1QixFQUFLO1FBQzFDLElBQU1DLElBQUksR0FBR3RLLGdCQUFnQixDQUFDcUssT0FBTyxDQUFDO1FBQ3RDNUcsc0JBQXNCLENBQUM2RyxJQUFJLEVBQUVELE9BQU8sQ0FBQztRQUNyQ2xHLGFBQWEsQ0FBQ1ksT0FBTyxHQUFHLElBQUk7UUFDNUIsSUFBTStCLEtBQUssR0FBRy9DLFNBQVMsQ0FBQyxDQUFDO1FBQ3pCZCxPQUFPLGFBQVBBLE9BQU8sZUFBUEEsT0FBTyxDQUFBZ0UsYUFBQSxDQUFBQSxhQUFBLEtBQ0ZILEtBQUs7VUFDUkksT0FBTyxFQUFFO1lBQUVDLE1BQU0sRUFBRSxLQUFLO1lBQUVDLEtBQUssRUFBRSxFQUFFO1lBQUVDLFdBQVcsRUFBRTtVQUFFLENBQUM7VUFDckRDLFlBQVksRUFBRTtZQUFFSCxNQUFNLEVBQUUsS0FBSztZQUFFQyxLQUFLLEVBQUU7VUFBRyxDQUFDO1VBQzFDRyxXQUFXLEVBQUU7WUFBRUosTUFBTSxFQUFFLEtBQUs7WUFBRUMsS0FBSyxFQUFFO1VBQUc7UUFBQyxFQUMxQyxDQUFDO1FBQ0YsSUFBTXRDLE9BQU8sR0FBR2dDLEtBQUssQ0FBQ1gsSUFBSSxDQUFDcEYsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFO1FBQ3hDOEQsd0JBQXdCLENBQUNDLE9BQU8sQ0FBQztRQUNqQ0YsZUFBZSxDQUFDRSxPQUFPLENBQUM7UUFDeEJ5QixjQUFjLENBQUMsWUFBTTtVQUNuQjtVQUNBcEMsYUFBYSxDQUFDWSxPQUFPLEdBQUcsS0FBSztVQUM3QmUsOEJBQThCLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUM7TUFDSixDQUFDO01BQ0R5RSxrQkFBa0IsRUFBRSxTQUFwQkEsa0JBQWtCQSxDQUFHRixPQUF1QixFQUFLO1FBQy9DLElBQU16SixNQUFNLEdBQUcyQyxTQUFTLENBQUN3QixPQUFPO1FBQ2hDLElBQUksQ0FBQ25FLE1BQU0sRUFBRTtRQUViLElBQU0wSixJQUFJLEdBQUd0SyxnQkFBZ0IsQ0FBQ3FLLE9BQU8sQ0FBQztRQUN0Q0MsSUFBSSxDQUFDdEYsWUFBWSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUM7UUFDekNzRixJQUFJLENBQUN0RixZQUFZLENBQUMsaUJBQWlCLEVBQUVDLE1BQU0sQ0FBQ29GLE9BQU8sQ0FBQ0csRUFBRSxDQUFDLENBQUM7UUFDeERGLElBQUksQ0FBQ3RGLFlBQVksQ0FBQyxtQkFBbUIsRUFBRXFGLE9BQU8sQ0FBQ0ksSUFBSSxDQUFDO1FBQ3BESCxJQUFJLENBQUN0RixZQUFZLENBQUMsb0JBQW9CLEVBQUVxRixPQUFPLENBQUNLLEtBQUssQ0FBQztRQUN0REosSUFBSSxDQUFDdEYsWUFBWSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQztRQUU3QyxJQUFNMkYsYUFBYSxHQUFHdEosUUFBUSxDQUFDd0gsY0FBYyxDQUFDLE1BQVEsQ0FBQztRQUN2RGpJLE1BQU0sQ0FBQ2dLLFdBQVcsQ0FBQ04sSUFBSSxDQUFDO1FBQ3hCMUosTUFBTSxDQUFDZ0ssV0FBVyxDQUFDRCxhQUFhLENBQUM7UUFFakN4RyxhQUFhLENBQUNZLE9BQU8sR0FBRyxJQUFJO1FBQzVCLElBQU0rQixLQUFLLEdBQUcvQyxTQUFTLENBQUMsQ0FBQztRQUN6QmQsT0FBTyxhQUFQQSxPQUFPLGVBQVBBLE9BQU8sQ0FBQWdFLGFBQUEsQ0FBQUEsYUFBQSxLQUNGSCxLQUFLO1VBQ1JJLE9BQU8sRUFBRTtZQUFFQyxNQUFNLEVBQUUsS0FBSztZQUFFQyxLQUFLLEVBQUUsRUFBRTtZQUFFQyxXQUFXLEVBQUU7VUFBRSxDQUFDO1VBQ3JEQyxZQUFZLEVBQUU7WUFBRUgsTUFBTSxFQUFFLEtBQUs7WUFBRUMsS0FBSyxFQUFFO1VBQUcsQ0FBQztVQUMxQ0csV0FBVyxFQUFFO1lBQUVKLE1BQU0sRUFBRSxLQUFLO1lBQUVDLEtBQUssRUFBRTtVQUFHO1FBQUMsRUFDMUMsQ0FBQztRQUNGdkMsd0JBQXdCLENBQUMsS0FBSyxDQUFDO1FBQy9CRCxlQUFlLENBQUMsS0FBSyxDQUFDO1FBRXRCLElBQU1VLFNBQVMsR0FBR3BFLE1BQU0sQ0FBQ3FFLFlBQVksQ0FBQyxDQUFDO1FBQ3ZDLElBQUlELFNBQVMsRUFBRTtVQUNiLElBQU1FLEtBQUssR0FBR25FLFFBQVEsQ0FBQ29FLFdBQVcsQ0FBQyxDQUFDO1VBQ3BDRCxLQUFLLENBQUM4RCxRQUFRLENBQUNxQixhQUFhLEVBQUUsQ0FBQyxDQUFDO1VBQ2hDbkYsS0FBSyxDQUFDRyxRQUFRLENBQUMsSUFBSSxDQUFDO1VBQ3BCTCxTQUFTLENBQUNNLGVBQWUsQ0FBQyxDQUFDO1VBQzNCTixTQUFTLENBQUNPLFFBQVEsQ0FBQ0wsS0FBSyxDQUFDO1FBQzNCO1FBRUFlLGNBQWMsQ0FBQyxZQUFNO1VBQ25CcEMsYUFBYSxDQUFDWSxPQUFPLEdBQUcsS0FBSztVQUM3QmUsOEJBQThCLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUM7TUFDSixDQUFDO01BQ0QrRSxrQkFBa0IsRUFBRSxTQUFwQkEsa0JBQWtCQSxDQUFHUixPQUF1QixFQUFLO1FBQy9DLElBQU1DLElBQUksR0FBR3RLLGdCQUFnQixDQUFDcUssT0FBTyxDQUFDO1FBQ3RDdkcsMkJBQTJCLENBQUN3RyxJQUFJLEVBQUVELE9BQU8sQ0FBQztRQUMxQ2xHLGFBQWEsQ0FBQ1ksT0FBTyxHQUFHLElBQUk7UUFDNUIsSUFBTStCLEtBQUssR0FBRy9DLFNBQVMsQ0FBQyxDQUFDO1FBQ3pCZCxPQUFPLGFBQVBBLE9BQU8sZUFBUEEsT0FBTyxDQUFBZ0UsYUFBQSxDQUFBQSxhQUFBLEtBQ0ZILEtBQUs7VUFDUkksT0FBTyxFQUFFO1lBQUVDLE1BQU0sRUFBRSxLQUFLO1lBQUVDLEtBQUssRUFBRSxFQUFFO1lBQUVDLFdBQVcsRUFBRTtVQUFFLENBQUM7VUFDckRDLFlBQVksRUFBRTtZQUFFSCxNQUFNLEVBQUUsS0FBSztZQUFFQyxLQUFLLEVBQUU7VUFBRyxDQUFDO1VBQzFDRyxXQUFXLEVBQUU7WUFBRUosTUFBTSxFQUFFLEtBQUs7WUFBRUMsS0FBSyxFQUFFO1VBQUc7UUFBQyxFQUMxQyxDQUFDO1FBQ0YsSUFBTXRDLE9BQU8sR0FBR2dDLEtBQUssQ0FBQ1gsSUFBSSxDQUFDcEYsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFO1FBQ3hDOEQsd0JBQXdCLENBQUNDLE9BQU8sQ0FBQztRQUNqQ0YsZUFBZSxDQUFDRSxPQUFPLENBQUM7UUFDeEJ5QixjQUFjLENBQUMsWUFBTTtVQUNuQnBDLGFBQWEsQ0FBQ1ksT0FBTyxHQUFHLEtBQUs7VUFDN0JlLDhCQUE4QixDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDO01BQ0osQ0FBQztNQUNEZ0Ysa0JBQWtCLEVBQUUsU0FBcEJBLGtCQUFrQkEsQ0FBR0MsT0FBNkIsRUFBSztRQUNyRCxJQUFNVCxJQUFJLEdBQUdwSyxxQkFBcUIsQ0FBQzZLLE9BQU8sQ0FBQztRQUMzQ25ILDJCQUEyQixDQUFDMEcsSUFBSSxFQUFFUyxPQUFPLENBQUM7UUFDMUM1RyxhQUFhLENBQUNZLE9BQU8sR0FBRyxJQUFJO1FBQzVCLElBQU0rQixLQUFLLEdBQUcvQyxTQUFTLENBQUMsQ0FBQztRQUN6QmQsT0FBTyxhQUFQQSxPQUFPLGVBQVBBLE9BQU8sQ0FBQWdFLGFBQUEsQ0FBQUEsYUFBQSxLQUNGSCxLQUFLO1VBQ1JJLE9BQU8sRUFBRTtZQUFFQyxNQUFNLEVBQUUsS0FBSztZQUFFQyxLQUFLLEVBQUUsRUFBRTtZQUFFQyxXQUFXLEVBQUU7VUFBRSxDQUFDO1VBQ3JEQyxZQUFZLEVBQUU7WUFBRUgsTUFBTSxFQUFFLEtBQUs7WUFBRUMsS0FBSyxFQUFFO1VBQUcsQ0FBQztVQUMxQ0csV0FBVyxFQUFFO1lBQUVKLE1BQU0sRUFBRSxLQUFLO1lBQUVDLEtBQUssRUFBRTtVQUFHO1FBQUMsRUFDMUMsQ0FBQztRQUNGLElBQU10QyxPQUFPLEdBQUdnQyxLQUFLLENBQUNYLElBQUksQ0FBQ3BGLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRTtRQUN4QzhELHdCQUF3QixDQUFDQyxPQUFPLENBQUM7UUFDakNGLGVBQWUsQ0FBQ0UsT0FBTyxDQUFDO1FBQ3hCeUIsY0FBYyxDQUFDLFlBQU07VUFDbkJwQyxhQUFhLENBQUNZLE9BQU8sR0FBRyxLQUFLO1VBQzdCZSw4QkFBOEIsQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQztNQUNKO0lBQ0YsQ0FBQztFQUFBLENBQUMsRUFDRixDQUNFNUIsS0FBSyxFQUNMRixjQUFjLEVBQ2RELFNBQVMsRUFDVEwsc0JBQXNCLEVBQ3RCRCxzQkFBc0IsRUFDdEJHLDJCQUEyQixFQUMzQkUsMkJBQTJCLEVBQzNCYixPQUFPLEVBQ1A2Qyw4QkFBOEIsRUFDOUJqQix3QkFBd0IsRUFDeEI2QixjQUFjLEVBQ2Q1RCxRQUFRLEVBQ1JTLFNBQVMsQ0FFYixDQUFDO0VBRUQsSUFBTXlILFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFBLEVBQVM7SUFDeEIsSUFBSTdHLGFBQWEsQ0FBQ1ksT0FBTyxFQUFFO01BQ3pCWixhQUFhLENBQUNZLE9BQU8sR0FBRyxLQUFLO01BQzdCO0lBQ0Y7SUFDQTJCLGNBQWMsQ0FBQyxDQUFDO0VBQ2xCLENBQUM7RUFFRCxJQUFNdUUsV0FBVyxHQUFHLFNBQWRBLFdBQVdBLENBQUlDLENBQWlDLEVBQUs7SUFDekQsSUFBTUMsS0FBSyxHQUFHaEwscUJBQXFCLENBQUMrSyxDQUFDLENBQUNFLGFBQWEsQ0FBQztJQUNwRCxJQUFJRCxLQUFLLENBQUN4RCxNQUFNLElBQUl0RSxZQUFZLEVBQUU7TUFDaEM2SCxDQUFDLENBQUNHLGNBQWMsQ0FBQyxDQUFDO01BQ2xCaEksWUFBWSxDQUFDOEgsS0FBSyxDQUFDO0lBQ3JCO0lBRUEsSUFBTWhGLElBQUksR0FBRytFLENBQUMsQ0FBQ0UsYUFBYSxDQUFDRSxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ2xELElBQUlILEtBQUssQ0FBQ3hELE1BQU0sSUFBSXRFLFlBQVksSUFBSSxDQUFDOEMsSUFBSSxFQUFFO01BQ3pDO0lBQ0Y7SUFFQStFLENBQUMsQ0FBQ0csY0FBYyxDQUFDLENBQUM7SUFDbEIsSUFBTS9GLFNBQVMsR0FBR3BFLE1BQU0sQ0FBQ3FFLFlBQVksQ0FBQyxDQUFDO0lBQ3ZDLElBQUksQ0FBQ0QsU0FBUyxJQUFJQSxTQUFTLENBQUNpRyxVQUFVLEtBQUssQ0FBQyxFQUFFO0lBQzlDakcsU0FBUyxDQUFDa0csa0JBQWtCLENBQUMsQ0FBQztJQUM5QmxHLFNBQVMsQ0FBQzBDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQ2MsVUFBVSxDQUFDekgsUUFBUSxDQUFDd0gsY0FBYyxDQUFDMUMsSUFBSSxDQUFDLENBQUM7SUFDakViLFNBQVMsQ0FBQ21HLGFBQWEsQ0FBQyxDQUFDO0lBQ3pCVCxXQUFXLENBQUMsQ0FBQztFQUNmLENBQUM7RUFFRCxJQUFNVSxrQkFBa0IsSUFBQTdJLGtCQUFBLEdBQUdoQyxXQUFXLGFBQVhBLFdBQVcsdUJBQVhBLFdBQVcsQ0FBRUUsSUFBSSxDQUFDLENBQUMsY0FBQThCLGtCQUFBLGNBQUFBLGtCQUFBLEdBQUksRUFBRTtFQUNwRCxJQUFNOEksdUJBQXVCLEdBQUdoSCxZQUFZLElBQUlKLG9CQUFvQixJQUFJbUgsa0JBQWtCLEdBQUdBLGtCQUFrQixHQUFHLEVBQUU7RUFFcEgsb0JBQ0VoTCxLQUFBLENBQUFGLFNBQUE7SUFBQW9MLFFBQUEsZ0JBQ0V0TCxJQUFBLENBQUNMLDhCQUE4QixJQUFFLENBQUMsZUFDbENLLElBQUEsQ0FBQ1IsT0FBTztNQUFDK0wsS0FBSyxFQUFFRix1QkFBd0I7TUFBQUMsUUFBQSxlQUN0Q3RMLElBQUE7UUFBTXdMLEtBQUssRUFBRTtVQUFFQyxPQUFPLEVBQUUsT0FBTztVQUFFaEssS0FBSyxFQUFFLE1BQU07VUFBRWlLLFFBQVEsRUFBRTtRQUFFLENBQUU7UUFBQUosUUFBQSxlQUM1RHRMLElBQUEsQ0FBQ0YsWUFBWTtVQUNYd0MsR0FBRyxFQUFFVyxTQUFVO1VBQ2ZSLFNBQVMsRUFBRUEsU0FBVTtVQUNyQmtKLFVBQVUsRUFBRWpKLFNBQVU7VUFDdEI4SSxLQUFLLEVBQUU5SSxTQUFTLElBQUksSUFBSSxHQUFHO1lBQUVBLFNBQVMsRUFBVEE7VUFBVSxDQUFDLEdBQUdvRCxTQUFVO1VBQ3JELG9CQUFrQnZGLFdBQVk7VUFDOUIsY0FBWW9FLE1BQU0sQ0FBQ04sWUFBWSxDQUFFO1VBQ2pDdUgsZUFBZSxFQUFFLENBQUNwSixRQUFTO1VBQzNCLGlCQUFlbUMsTUFBTSxDQUFDLENBQUMsQ0FBQ25DLFFBQVEsQ0FBRTtVQUNsQ3FKLDhCQUE4QjtVQUM5QkMsSUFBSSxFQUFDLFNBQVM7VUFDZCxrQkFBZSxNQUFNO1VBQ3JCbkosT0FBTyxFQUFFK0gsV0FBWTtVQUNyQjlILFNBQVMsRUFBRUEsU0FBVTtVQUNyQm1KLE9BQU8sRUFBRXBCLFdBQVk7VUFDckI5SCxPQUFPLEVBQUVBLE9BQVE7VUFDakJDLE1BQU0sRUFBRUE7UUFBTyxDQUNoQjtNQUFDLENBQ0U7SUFBQyxDQUNBLENBQUM7RUFBQSxDQUNWLENBQUM7QUFFUCxDQUNGLENBQUM7QUFFRFYsb0JBQW9CLENBQUM0SixXQUFXLEdBQUcsc0JBQXNCIiwiaWdub3JlTGlzdCI6W119
504
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmb3J3YXJkUmVmIiwidXNlQ2FsbGJhY2siLCJ1c2VJbXBlcmF0aXZlSGFuZGxlIiwidXNlTGF5b3V0RWZmZWN0IiwidXNlUmVmIiwidXNlU3RhdGUiLCJUb29sdGlwIiwidXNlQ29udGV4dE1lbnRpb25zIiwiYnVpbGRDaGlwRWxlbWVudCIsIkNvbnRleHRNZW50aW9uQ2hpcEdsb2JhbFN0eWxlcyIsImJ1aWxkU2xhc2hDaGlwRWxlbWVudCIsImZpbGVzRnJvbURhdGFUcmFuc2ZlciIsImlzUGxhY2Vob2xkZXJUcnVuY2F0ZWRJbkVkaXRvciIsInJlc29sdmVUcmlnZ2VySW5zZXJ0UHJlZml4IiwiU0NNRUVkaXRhYmxlIiwianN4IiwiX2pzeCIsIkZyYWdtZW50IiwiX0ZyYWdtZW50IiwianN4cyIsIl9qc3hzIiwiQ29udGV4dE1lbnRpb25FZGl0b3IiLCJfcmVmIiwicmVmIiwiX3BsYWNlaG9sZGVyJHRyaW0yIiwicGxhY2Vob2xkZXIiLCJkaXNhYmxlZCIsImNsYXNzTmFtZSIsIm1heEhlaWdodCIsIm9uSW5wdXQiLCJvbktleURvd24iLCJvbkZvY3VzIiwib25CbHVyIiwib25QYXN0ZUZpbGVzIiwiX3VzZUNvbnRleHRNZW50aW9ucyIsImVkaXRvclJlZiIsInVwZGF0ZVRyaWdnZXIiLCJyZXBsYWNlVHJpZ2dlcldpdGhDaGlwIiwic3luY1RyaWdnZXJBdFJ1bkxlbmd0aCIsInVwZGF0ZVNsYXNoVHJpZ2dlciIsInJlcGxhY2VUcmlnZ2VyV2l0aFNsYXNoQ2hpcCIsInVwZGF0ZUhhc2hUcmlnZ2VyIiwicmVwbGFjZVRyaWdnZXJXaXRoU2tpbGxDaGlwIiwic2VyaWFsaXplIiwiY2xlYXJFZGl0b3JEb20iLCJjbGVhciIsImZvY3VzIiwic2tpcE5leHRJbnB1dCIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInBsYWNlaG9sZGVyVHJ1bmNhdGVkIiwic2V0UGxhY2Vob2xkZXJUcnVuY2F0ZWQiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImxvZ2ljYWxFbXB0eSIsInNldExvZ2ljYWxFbXB0eSIsInN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZSIsImlzRW1wdHkiLCJjdXJyZW50Iiwic2V0QXR0cmlidXRlIiwiU3RyaW5nIiwibm9ybWFsaXplRW1wdHlFZGl0b3JEb20iLCJfZWRpdG9yJHRleHRDb250ZW50IiwiZWRpdG9yIiwidGV4dENvbnRlbnQiLCJ0cmltIiwiaW5uZXJIVE1MIiwic2VsZWN0aW9uIiwid2luZG93IiwiZ2V0U2VsZWN0aW9uIiwicmFuZ2UiLCJkb2N1bWVudCIsImNyZWF0ZVJhbmdlIiwic2VsZWN0Tm9kZUNvbnRlbnRzIiwiY29sbGFwc2UiLCJyZW1vdmVBbGxSYW5nZXMiLCJhZGRSYW5nZSIsInJlY29tcHV0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbiIsIl9wbGFjZWhvbGRlciR0cmltIiwiZWwiLCJwaCIsImlzRWRpdG9yTG9naWNhbGx5RW1wdHkiLCJ0ZXh0IiwidW5kZWZpbmVkIiwicm8iLCJSZXNpemVPYnNlcnZlciIsInF1ZXVlTWljcm90YXNrIiwib2JzZXJ2ZSIsImRpc2Nvbm5lY3QiLCJlbWl0SW5wdXRTdGF0ZSIsInRyaWciLCJzbGFzaFRyaWciLCJoYXNoVHJpZyIsInN0YXRlIiwibWVudGlvbnMiLCJzbGFzaENvbW1hbmRzIiwiX29iamVjdFNwcmVhZCIsInRyaWdnZXIiLCJhY3RpdmUiLCJxdWVyeSIsImF0UnVuTGVuZ3RoIiwic2xhc2hUcmlnZ2VyIiwiaGFzaFRyaWdnZXIiLCJzZXRQbGFpblRleHQiLCJwbGFpbiIsImNoaWxkTm9kZXMiLCJsZW5ndGgiLCJpbnNlcnRNZW50aW9uVHJpZ2dlciIsImFuY2hvck5vZGUiLCJjb250YWlucyIsImVuZFJhbmdlIiwiZ2V0UmFuZ2VBdCIsInByZWZpeCIsInN0YXJ0Q29udGFpbmVyIiwic3RhcnRPZmZzZXQiLCJub2RlVHlwZSIsIk5vZGUiLCJURVhUX05PREUiLCJwcmV2Q2hhciIsImRhdGEiLCJjaGFyQXQiLCJpbnNlcnRlZCIsImNvbmNhdCIsInRleHROb2RlIiwiY3JlYXRlVGV4dE5vZGUiLCJpbnNlcnROb2RlIiwicHJldlNpYmxpbmciLCJwcmV2aW91c1NpYmxpbmciLCJjYXJldE5vZGUiLCJjYXJldE9mZnNldCIsImVuZHNXaXRoIiwicHJldlRleHQiLCJyZW1vdmUiLCJzZXRTdGFydCIsImluc2VydFNsYXNoVHJpZ2dlciIsImluc2VydFNraWxsVHJpZ2dlciIsImhhc1Zpc3VhbE11bHRpbGluZSIsIl9lZGl0b3IkdGV4dENvbnRlbnQkdCIsIl9lZGl0b3IkdGV4dENvbnRlbnQyIiwic3R5bGVzIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImxpbmVIZWlnaHQiLCJwYXJzZUZsb2F0IiwiZWRpdG9ySGVpZ2h0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiaGVpZ2h0IiwiaXNNdWx0aWxpbmUiLCJnZXRFZGl0b3JDbGllbnRSZWN0IiwiX2VkaXRvclJlZiRjdXJyZW50JGdlIiwiX2VkaXRvclJlZiRjdXJyZW50IiwiaW5zZXJ0TWVudGlvbiIsIm1lbnRpb24iLCJjaGlwIiwiYXBwZW5kTWVudGlvbkF0RW5kIiwiaWQiLCJ0eXBlIiwibGFiZWwiLCJ0cmFpbGluZ1NwYWNlIiwiYXBwZW5kQ2hpbGQiLCJpbnNlcnRTa2lsbE1lbnRpb24iLCJpbnNlcnRTbGFzaENvbW1hbmQiLCJjb21tYW5kIiwiaGFuZGxlSW5wdXQiLCJoYW5kbGVQYXN0ZSIsImUiLCJmaWxlcyIsImNsaXBib2FyZERhdGEiLCJwcmV2ZW50RGVmYXVsdCIsImdldERhdGEiLCJyYW5nZUNvdW50IiwiZGVsZXRlRnJvbURvY3VtZW50IiwiY29sbGFwc2VUb0VuZCIsInRyaW1tZWRQbGFjZWhvbGRlciIsInBsYWNlaG9sZGVyVG9vbHRpcFRpdGxlIiwiY2hpbGRyZW4iLCJ0aXRsZSIsInN0eWxlIiwiZGlzcGxheSIsIndpZHRoIiwibWluV2lkdGgiLCIkbWF4SGVpZ2h0IiwiY29udGVudEVkaXRhYmxlIiwic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiwicm9sZSIsIm9uUGFzdGUiLCJkaXNwbGF5TmFtZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2F0b21zL0NvbnRleHRNZW50aW9uRWRpdG9yL0NvbnRleHRNZW50aW9uRWRpdG9yLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDbGlwYm9hcmRFdmVudCxcbiAgZm9yd2FyZFJlZixcbiAgS2V5Ym9hcmRFdmVudCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUsXG4gIHVzZUxheW91dEVmZmVjdCxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBUb29sdGlwIH0gZnJvbSAnQHByb2plY3Rjb3IvdG9vbHRpcHYyL2xpYi9jb21wb25lbnRzL1Rvb2x0aXAnXG5pbXBvcnQgeyB1c2VDb250ZXh0TWVudGlvbnMgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VDb250ZXh0TWVudGlvbnMnXG5pbXBvcnQgeyBDb250ZXh0TWVudGlvbiB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2NvbnRleHRNZW50aW9uJ1xuaW1wb3J0IHsgYnVpbGRDaGlwRWxlbWVudCB9IGZyb20gJy4uL0NvbnRleHRNZW50aW9uQ2hpcCdcbmltcG9ydCB7IENvbnRleHRNZW50aW9uQ2hpcEdsb2JhbFN0eWxlcyB9IGZyb20gJy4uL0NvbnRleHRNZW50aW9uQ2hpcC9Db250ZXh0TWVudGlvbkNoaXAuc3R5bGVzJ1xuaW1wb3J0IHsgYnVpbGRTbGFzaENoaXBFbGVtZW50LCBTbGFzaENvbW1hbmRDaGlwRGF0YSB9IGZyb20gJy4uL1NsYXNoQ29tbWFuZENoaXAnXG5pbXBvcnQgeyBmaWxlc0Zyb21EYXRhVHJhbnNmZXIgfSBmcm9tICcuLi8uLi8uLi91dGlscy9jaGF0SW5wdXRGaWxlcydcbmltcG9ydCB7IGlzUGxhY2Vob2xkZXJUcnVuY2F0ZWRJbkVkaXRvciwgcmVzb2x2ZVRyaWdnZXJJbnNlcnRQcmVmaXggfSBmcm9tICcuL0NvbnRleHRNZW50aW9uRWRpdG9yLmhlbHBlcnMnXG5pbXBvcnQgeyBTQ01FRWRpdGFibGUgfSBmcm9tICcuL0NvbnRleHRNZW50aW9uRWRpdG9yLnN0eWxlcydcblxuZXhwb3J0IHR5cGUgQ29udGV4dE1lbnRpb25FZGl0b3JIYW5kbGUgPSB7XG4gIGZvY3VzOiAoKSA9PiB2b2lkXG4gIGNsZWFyOiAoKSA9PiB2b2lkXG4gIHNldFBsYWluVGV4dDogKHRleHQ6IHN0cmluZykgPT4gdm9pZFxuICAvKiogSW5zZXJ0YSBgQGAgZW4gZWwgY2FyZXQgKGNvbiBlc3BhY2lvIHByZXZpbyBzaSBoYWNlIGZhbHRhKSB5IGFicmUgZWwgdHJpZ2dlciBkZSBtZW50aW9ucy4gKi9cbiAgaW5zZXJ0TWVudGlvblRyaWdnZXI6ICgpID0+IHZvaWRcbiAgLyoqIEluc2VydGEgYC9gIGVuIGVsIGNhcmV0IChjb24gZXNwYWNpbyBwcmV2aW8gc2kgaGFjZSBmYWx0YSkgeSBhYnJlIGVsIHRyaWdnZXIgZGUgc2xhc2ggY29tbWFuZHMuICovXG4gIGluc2VydFNsYXNoVHJpZ2dlcjogKCkgPT4gdm9pZFxuICAvKiogSW5zZXJ0YSBgI2AgZW4gZWwgY2FyZXQgKGNvbiBlc3BhY2lvIHByZXZpbyBzaSBoYWNlIGZhbHRhKSB5IGFicmUgZWwgdHJpZ2dlciBkZSBza2lsbHMuICovXG4gIGluc2VydFNraWxsVHJpZ2dlcjogKCkgPT4gdm9pZFxuICBpbnNlcnRNZW50aW9uOiAobWVudGlvbjogQ29udGV4dE1lbnRpb24pID0+IHZvaWRcbiAgYXBwZW5kTWVudGlvbkF0RW5kOiAobWVudGlvbjogQ29udGV4dE1lbnRpb24pID0+IHZvaWRcbiAgaW5zZXJ0U2xhc2hDb21tYW5kOiAoY29tbWFuZDogU2xhc2hDb21tYW5kQ2hpcERhdGEpID0+IHZvaWRcbiAgLyoqIFJlZW1wbGF6YSBlbCBgI3F1ZXJ5YCBwZW5kaWVudGUgcG9yIGVsIGNoaXAgZGUgbGEgc2tpbGwgZWxlZ2lkYS4gKi9cbiAgaW5zZXJ0U2tpbGxNZW50aW9uOiAobWVudGlvbjogQ29udGV4dE1lbnRpb24pID0+IHZvaWRcbiAgc3luY1RyaWdnZXJBdFJ1bkxlbmd0aDogKGF0UnVuTGVuZ3RoOiBudW1iZXIpID0+IHZvaWRcbiAgc2VyaWFsaXplOiAoKSA9PiB7XG4gICAgdGV4dDogc3RyaW5nXG4gICAgbWVudGlvbnM6IENvbnRleHRNZW50aW9uW11cbiAgICBzbGFzaENvbW1hbmRzOiBTbGFzaENvbW1hbmRDaGlwRGF0YVtdXG4gIH1cbiAgaGFzVmlzdWFsTXVsdGlsaW5lOiAoKSA9PiBib29sZWFuXG4gIC8qKiBSZWN0IGRlbCDDoXJlYSBlZGl0YWJsZSAodmlld3BvcnQpOyBsbyB1c2EgZWwgcG9wb3ZlciBkZSBAIHBhcmEgYWxpbmVhciBhbmNobyB5IGZhbGxiYWNrIHZlcnRpY2FsLiAqL1xuICBnZXRFZGl0b3JDbGllbnRSZWN0OiAoKSA9PiBET01SZWN0IHwgbnVsbFxufVxuXG5leHBvcnQgdHlwZSBDb250ZXh0TWVudGlvbkVkaXRvclByb3BzID0ge1xuICBwbGFjZWhvbGRlcj86IHN0cmluZ1xuICBkaXNhYmxlZD86IGJvb2xlYW5cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIC8qKiBBbHRvIG3DoXhpbW8gZGVsIMOhcmVhIGVkaXRhYmxlIChweCkuIFNlIGFqdXN0YSBjdWFuZG8gaGF5IGNoaXBzIGRlIGNvbnRleHRvL2FkanVudG9zLiAqL1xuICBtYXhIZWlnaHQ/OiBudW1iZXJcbiAgb25JbnB1dD86IChzdGF0ZToge1xuICAgIHRleHQ6IHN0cmluZ1xuICAgIG1lbnRpb25zOiBDb250ZXh0TWVudGlvbltdXG4gICAgc2xhc2hDb21tYW5kczogU2xhc2hDb21tYW5kQ2hpcERhdGFbXVxuICAgIHRyaWdnZXI6IHsgYWN0aXZlOiBib29sZWFuOyBxdWVyeTogc3RyaW5nOyBhdFJ1bkxlbmd0aDogbnVtYmVyIH1cbiAgICBzbGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBib29sZWFuOyBxdWVyeTogc3RyaW5nIH1cbiAgICBoYXNoVHJpZ2dlcjogeyBhY3RpdmU6IGJvb2xlYW47IHF1ZXJ5OiBzdHJpbmcgfVxuICB9KSA9PiB2b2lkXG4gIG9uS2V5RG93bj86IChlOiBLZXlib2FyZEV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4gdm9pZFxuICBvbkZvY3VzPzogKCkgPT4gdm9pZFxuICBvbkJsdXI/OiAoKSA9PiB2b2lkXG4gIC8qKiBDbGlwYm9hcmQgZmlsZXMgKHNjcmVlbnNob3RzLCBjb3BpZWQgaW1hZ2VzKS4gVGV4dCBpcyBzdGlsbCBpbnNlcnRlZCB3aGVuIHByZXNlbnQuICovXG4gIG9uUGFzdGVGaWxlcz86IChmaWxlczogRmlsZVtdKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBjb25zdCBDb250ZXh0TWVudGlvbkVkaXRvciA9IGZvcndhcmRSZWY8Q29udGV4dE1lbnRpb25FZGl0b3JIYW5kbGUsIENvbnRleHRNZW50aW9uRWRpdG9yUHJvcHM+KFxuICAoeyBwbGFjZWhvbGRlciwgZGlzYWJsZWQsIGNsYXNzTmFtZSwgbWF4SGVpZ2h0LCBvbklucHV0LCBvbktleURvd24sIG9uRm9jdXMsIG9uQmx1ciwgb25QYXN0ZUZpbGVzIH0sIHJlZikgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGVkaXRvclJlZixcbiAgICAgIHVwZGF0ZVRyaWdnZXIsXG4gICAgICByZXBsYWNlVHJpZ2dlcldpdGhDaGlwLFxuICAgICAgc3luY1RyaWdnZXJBdFJ1bkxlbmd0aCxcbiAgICAgIHVwZGF0ZVNsYXNoVHJpZ2dlcixcbiAgICAgIHJlcGxhY2VUcmlnZ2VyV2l0aFNsYXNoQ2hpcCxcbiAgICAgIHVwZGF0ZUhhc2hUcmlnZ2VyLFxuICAgICAgcmVwbGFjZVRyaWdnZXJXaXRoU2tpbGxDaGlwLFxuICAgICAgc2VyaWFsaXplLFxuICAgICAgY2xlYXI6IGNsZWFyRWRpdG9yRG9tLFxuICAgICAgZm9jdXMsXG4gICAgfSA9IHVzZUNvbnRleHRNZW50aW9ucygpXG4gICAgY29uc3Qgc2tpcE5leHRJbnB1dCA9IHVzZVJlZihmYWxzZSlcbiAgICBjb25zdCBbcGxhY2Vob2xkZXJUcnVuY2F0ZWQsIHNldFBsYWNlaG9sZGVyVHJ1bmNhdGVkXSA9IHVzZVN0YXRlKGZhbHNlKVxuICAgIGNvbnN0IFtsb2dpY2FsRW1wdHksIHNldExvZ2ljYWxFbXB0eV0gPSB1c2VTdGF0ZSh0cnVlKVxuXG4gICAgY29uc3Qgc3luY0VkaXRvckVtcHR5QXR0cmlidXRlID0gdXNlQ2FsbGJhY2soKGlzRW1wdHk6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmIChlZGl0b3JSZWYuY3VycmVudCkge1xuICAgICAgICBlZGl0b3JSZWYuY3VycmVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZW1wdHknLCBTdHJpbmcoaXNFbXB0eSkpXG4gICAgICB9XG4gICAgfSwgW10pXG5cbiAgICBjb25zdCBub3JtYWxpemVFbXB0eUVkaXRvckRvbSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIGNvbnN0IGVkaXRvciA9IGVkaXRvclJlZi5jdXJyZW50XG4gICAgICBpZiAoIWVkaXRvcikgcmV0dXJuXG5cbiAgICAgIC8vIExpbXBpYXIgY3VhbHF1aWVyIHJlc2lkdW8gKGJyLCBlc3BhY2lvcykgcXVlIGRlamUgZWwgYnJvd3NlciBhbCB2YWNpYXIgZWwgY29udGVudGVkaXRhYmxlLlxuICAgICAgLy8gU2luIGVzdG8sIHVuIGVzcGFjaW8gc3VlbHRvIGFjdGl2YSBkYXRhLWVtcHR5PVwidHJ1ZVwiICsgOjpiZWZvcmUgcGxhY2Vob2xkZXIgZW4gbMOtbmVhIDFcbiAgICAgIC8vIHkgZGVzcGxhemEgZWwgY3Vyc29yIGEgbGEgbMOtbmVhIDIuXG4gICAgICBpZiAoZWRpdG9yLnRleHRDb250ZW50Py50cmltKCkgPT09ICcnKSB7XG4gICAgICAgIGVkaXRvci5pbm5lckhUTUwgPSAnJ1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm5cbiAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRvcilcbiAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSlcbiAgICB9LCBbZWRpdG9yUmVmXSlcblxuICAgIGNvbnN0IHJlY29tcHV0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gZWRpdG9yUmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IHBoID0gcGxhY2Vob2xkZXI/LnRyaW0oKSA/PyAnJ1xuICAgICAgY29uc3QgaXNFZGl0b3JMb2dpY2FsbHlFbXB0eSA9IHNlcmlhbGl6ZSgpLnRleHQudHJpbSgpID09PSAnJ1xuXG4gICAgICBpZiAoIWVsIHx8ICFwaCB8fCAhaXNFZGl0b3JMb2dpY2FsbHlFbXB0eSkge1xuICAgICAgICBzZXRQbGFjZWhvbGRlclRydW5jYXRlZChmYWxzZSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHNldFBsYWNlaG9sZGVyVHJ1bmNhdGVkKGlzUGxhY2Vob2xkZXJUcnVuY2F0ZWRJbkVkaXRvcihlbCwgcGgpKVxuICAgIH0sIFtwbGFjZWhvbGRlciwgc2VyaWFsaXplXSlcblxuICAgIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24oKVxuICAgICAgY29uc3QgZWwgPSBlZGl0b3JSZWYuY3VycmVudFxuICAgICAgaWYgKCFlbCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgICBjb25zdCBybyA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgIHF1ZXVlTWljcm90YXNrKHJlY29tcHV0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbilcbiAgICAgIH0pXG4gICAgICByby5vYnNlcnZlKGVsKVxuICAgICAgcmV0dXJuICgpID0+IHJvLmRpc2Nvbm5lY3QoKVxuICAgIH0sIFtwbGFjZWhvbGRlciwgZGlzYWJsZWQsIHJlY29tcHV0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbl0pXG5cbiAgICBjb25zdCBlbWl0SW5wdXRTdGF0ZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIGNvbnN0IHRyaWcgPSB1cGRhdGVUcmlnZ2VyKClcbiAgICAgIGNvbnN0IHNsYXNoVHJpZyA9IHVwZGF0ZVNsYXNoVHJpZ2dlcigpXG4gICAgICBjb25zdCBoYXNoVHJpZyA9IHVwZGF0ZUhhc2hUcmlnZ2VyKClcbiAgICAgIGxldCBzdGF0ZSA9IHNlcmlhbGl6ZSgpXG4gICAgICBjb25zdCBpc0VtcHR5ID0gc3RhdGUudGV4dC50cmltKCkgPT09ICcnXG4gICAgICBpZiAoaXNFbXB0eSkge1xuICAgICAgICBub3JtYWxpemVFbXB0eUVkaXRvckRvbSgpXG4gICAgICAgIHN0YXRlID0geyB0ZXh0OiAnJywgbWVudGlvbnM6IFtdLCBzbGFzaENvbW1hbmRzOiBbXSB9XG4gICAgICB9XG4gICAgICBzeW5jRWRpdG9yRW1wdHlBdHRyaWJ1dGUoaXNFbXB0eSlcbiAgICAgIHNldExvZ2ljYWxFbXB0eShpc0VtcHR5KVxuICAgICAgb25JbnB1dD8uKHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHRyaWdnZXI6IHsgYWN0aXZlOiB0cmlnLmFjdGl2ZSwgcXVlcnk6IHRyaWcucXVlcnksIGF0UnVuTGVuZ3RoOiB0cmlnLmF0UnVuTGVuZ3RoIH0sXG4gICAgICAgIHNsYXNoVHJpZ2dlcjogeyBhY3RpdmU6IHNsYXNoVHJpZy5hY3RpdmUsIHF1ZXJ5OiBzbGFzaFRyaWcucXVlcnkgfSxcbiAgICAgICAgaGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBoYXNoVHJpZy5hY3RpdmUsIHF1ZXJ5OiBoYXNoVHJpZy5xdWVyeSB9LFxuICAgICAgfSlcbiAgICAgIHF1ZXVlTWljcm90YXNrKHJlY29tcHV0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbilcbiAgICB9LCBbXG4gICAgICB1cGRhdGVUcmlnZ2VyLFxuICAgICAgdXBkYXRlU2xhc2hUcmlnZ2VyLFxuICAgICAgdXBkYXRlSGFzaFRyaWdnZXIsXG4gICAgICBzZXJpYWxpemUsXG4gICAgICBub3JtYWxpemVFbXB0eUVkaXRvckRvbSxcbiAgICAgIHN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZSxcbiAgICAgIG9uSW5wdXQsXG4gICAgICByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24sXG4gICAgXSlcblxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUoXG4gICAgICByZWYsXG4gICAgICAoKSA9PiAoe1xuICAgICAgICBmb2N1cyxcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcbiAgICAgICAgICBjbGVhckVkaXRvckRvbSgpXG4gICAgICAgICAgc3luY0VkaXRvckVtcHR5QXR0cmlidXRlKHRydWUpXG4gICAgICAgICAgc2V0TG9naWNhbEVtcHR5KHRydWUpXG4gICAgICAgICAgcXVldWVNaWNyb3Rhc2socmVjb21wdXRlUGxhY2Vob2xkZXJUcnVuY2F0aW9uKVxuICAgICAgICB9LFxuICAgICAgICBzZXRQbGFpblRleHQ6ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBjb25zdCBlZGl0b3IgPSBlZGl0b3JSZWYuY3VycmVudFxuICAgICAgICAgIGlmICghZWRpdG9yKSByZXR1cm5cbiAgICAgICAgICBjb25zdCBwbGFpbiA9IHRleHQgPz8gJydcbiAgICAgICAgICBlZGl0b3IudGV4dENvbnRlbnQgPSBwbGFpblxuICAgICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IHRydWVcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHNlcmlhbGl6ZSgpXG4gICAgICAgICAgY29uc3QgaXNFbXB0eSA9IHN0YXRlLnRleHQudHJpbSgpID09PSAnJ1xuICAgICAgICAgIGlmIChpc0VtcHR5KSB7XG4gICAgICAgICAgICBlZGl0b3IuaW5uZXJIVE1MID0gJydcbiAgICAgICAgICB9XG4gICAgICAgICAgc3luY0VkaXRvckVtcHR5QXR0cmlidXRlKGlzRW1wdHkpXG4gICAgICAgICAgc2V0TG9naWNhbEVtcHR5KGlzRW1wdHkpXG4gICAgICAgICAgb25JbnB1dD8uKHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgdHJpZ2dlcjogeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwIH0sXG4gICAgICAgICAgICBzbGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnIH0sXG4gICAgICAgICAgICBoYXNoVHJpZ2dlcjogeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycgfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgICAgIGlmIChzZWxlY3Rpb24gJiYgZWRpdG9yLmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWRpdG9yKVxuICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpXG4gICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgc2tpcE5leHRJbnB1dC5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgICAgIHJlY29tcHV0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbigpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgaW5zZXJ0TWVudGlvblRyaWdnZXI6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBlZGl0b3IgPSBlZGl0b3JSZWYuY3VycmVudFxuICAgICAgICAgIGlmICghZWRpdG9yIHx8IGRpc2FibGVkKSByZXR1cm5cblxuICAgICAgICAgIGZvY3VzKClcblxuICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm5cblxuICAgICAgICAgIGlmICghc2VsZWN0aW9uLmFuY2hvck5vZGUgfHwgIWVkaXRvci5jb250YWlucyhzZWxlY3Rpb24uYW5jaG9yTm9kZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgICAgICAgZW5kUmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRvcilcbiAgICAgICAgICAgIGVuZFJhbmdlLmNvbGxhcHNlKGZhbHNlKVxuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG4gICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UoZW5kUmFuZ2UpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKVxuICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG5cbiAgICAgICAgICBsZXQgcHJlZml4ID0gJydcbiAgICAgICAgICBjb25zdCB7IHN0YXJ0Q29udGFpbmVyLCBzdGFydE9mZnNldCB9ID0gcmFuZ2VcbiAgICAgICAgICBpZiAoc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2Q2hhciA9IHN0YXJ0T2Zmc2V0ID4gMCA/IChzdGFydENvbnRhaW5lciBhcyBUZXh0KS5kYXRhLmNoYXJBdChzdGFydE9mZnNldCAtIDEpIDogJydcbiAgICAgICAgICAgIHByZWZpeCA9IHJlc29sdmVUcmlnZ2VySW5zZXJ0UHJlZml4KHByZXZDaGFyKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGluc2VydGVkID0gYCR7cHJlZml4fUBgXG4gICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShpbnNlcnRlZClcbiAgICAgICAgICByYW5nZS5pbnNlcnROb2RlKHRleHROb2RlKVxuXG4gICAgICAgICAgLy8gU2kgZWwgYEBgIHF1ZWTDsyBlbiB1biBub2RvIG51ZXZvLCB1bmlyIGNvbiBlbCB0ZXh0IG5vZGUgcHJldmlvIHF1ZSB0ZXJtaW5hIGVuIGBAYFxuICAgICAgICAgIC8vIHBhcmEgcXVlIGRldGVjdE1lbnRpb25UcmlnZ2VyIHZlYSBlbCBydW4gY29tcGxldG8gKEBALCBAQEAsIOKApikuXG4gICAgICAgICAgY29uc3QgcHJldlNpYmxpbmcgPSB0ZXh0Tm9kZS5wcmV2aW91c1NpYmxpbmdcbiAgICAgICAgICBsZXQgY2FyZXROb2RlID0gdGV4dE5vZGVcbiAgICAgICAgICBsZXQgY2FyZXRPZmZzZXQgPSBpbnNlcnRlZC5sZW5ndGhcbiAgICAgICAgICBpZiAocHJlZml4ID09PSAnJyAmJiBwcmV2U2libGluZz8ubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFICYmIChwcmV2U2libGluZyBhcyBUZXh0KS5kYXRhLmVuZHNXaXRoKCdAJykpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZUZXh0ID0gcHJldlNpYmxpbmcgYXMgVGV4dFxuICAgICAgICAgICAgY2FyZXRPZmZzZXQgPSBwcmV2VGV4dC5kYXRhLmxlbmd0aCArIGluc2VydGVkLmxlbmd0aFxuICAgICAgICAgICAgcHJldlRleHQuZGF0YSArPSBpbnNlcnRlZFxuICAgICAgICAgICAgdGV4dE5vZGUucmVtb3ZlKClcbiAgICAgICAgICAgIGNhcmV0Tm9kZSA9IHByZXZUZXh0XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRWwgY2FyZXQgZGViZSBxdWVkYXIgREVOVFJPIGRlbCB0ZXh0IG5vZGUgKGRlc3B1w6lzIGRlIGBAYCkuXG4gICAgICAgICAgLy8gYHNldFN0YXJ0QWZ0ZXJgIGxvIGRlamEgZW4gZWwgcGFkcmUgeSBkZXRlY3RNZW50aW9uVHJpZ2dlciBubyBhY3RpdmEgZWwgcG9wb3Zlci5cbiAgICAgICAgICByYW5nZS5zZXRTdGFydChjYXJldE5vZGUsIGNhcmV0T2Zmc2V0KVxuICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG4gICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG4gICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKVxuXG4gICAgICAgICAgZW1pdElucHV0U3RhdGUoKVxuICAgICAgICB9LFxuICAgICAgICBpbnNlcnRTbGFzaFRyaWdnZXI6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBlZGl0b3IgPSBlZGl0b3JSZWYuY3VycmVudFxuICAgICAgICAgIGlmICghZWRpdG9yIHx8IGRpc2FibGVkKSByZXR1cm5cblxuICAgICAgICAgIGZvY3VzKClcblxuICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm5cblxuICAgICAgICAgIGlmICghc2VsZWN0aW9uLmFuY2hvck5vZGUgfHwgIWVkaXRvci5jb250YWlucyhzZWxlY3Rpb24uYW5jaG9yTm9kZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgICAgICAgZW5kUmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRvcilcbiAgICAgICAgICAgIGVuZFJhbmdlLmNvbGxhcHNlKGZhbHNlKVxuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG4gICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UoZW5kUmFuZ2UpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKVxuICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG5cbiAgICAgICAgICBsZXQgcHJlZml4ID0gJydcbiAgICAgICAgICBjb25zdCB7IHN0YXJ0Q29udGFpbmVyLCBzdGFydE9mZnNldCB9ID0gcmFuZ2VcbiAgICAgICAgICBpZiAoc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2Q2hhciA9IHN0YXJ0T2Zmc2V0ID4gMCA/IChzdGFydENvbnRhaW5lciBhcyBUZXh0KS5kYXRhLmNoYXJBdChzdGFydE9mZnNldCAtIDEpIDogJydcbiAgICAgICAgICAgIHByZWZpeCA9IHJlc29sdmVUcmlnZ2VySW5zZXJ0UHJlZml4KHByZXZDaGFyKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGluc2VydGVkID0gYCR7cHJlZml4fS9gXG4gICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShpbnNlcnRlZClcbiAgICAgICAgICByYW5nZS5pbnNlcnROb2RlKHRleHROb2RlKVxuXG4gICAgICAgICAgLy8gQ2FyZXQgZGVudHJvIGRlbCB0ZXh0IG5vZGUgcGFyYSBxdWUgZGV0ZWN0U2xhc2hUcmlnZ2VyIGFjdGl2ZSBlbCBkcm9wZG93bi5cbiAgICAgICAgICByYW5nZS5zZXRTdGFydCh0ZXh0Tm9kZSwgaW5zZXJ0ZWQubGVuZ3RoKVxuICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG4gICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG4gICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKVxuXG4gICAgICAgICAgZW1pdElucHV0U3RhdGUoKVxuICAgICAgICB9LFxuICAgICAgICBpbnNlcnRTa2lsbFRyaWdnZXI6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBlZGl0b3IgPSBlZGl0b3JSZWYuY3VycmVudFxuICAgICAgICAgIGlmICghZWRpdG9yIHx8IGRpc2FibGVkKSByZXR1cm5cblxuICAgICAgICAgIGZvY3VzKClcblxuICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgICAgIGlmICghc2VsZWN0aW9uKSByZXR1cm5cblxuICAgICAgICAgIGlmICghc2VsZWN0aW9uLmFuY2hvck5vZGUgfHwgIWVkaXRvci5jb250YWlucyhzZWxlY3Rpb24uYW5jaG9yTm9kZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZFJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgICAgICAgZW5kUmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRvcilcbiAgICAgICAgICAgIGVuZFJhbmdlLmNvbGxhcHNlKGZhbHNlKVxuICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpXG4gICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UoZW5kUmFuZ2UpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKVxuICAgICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG5cbiAgICAgICAgICBsZXQgcHJlZml4ID0gJydcbiAgICAgICAgICBjb25zdCB7IHN0YXJ0Q29udGFpbmVyLCBzdGFydE9mZnNldCB9ID0gcmFuZ2VcbiAgICAgICAgICBpZiAoc3RhcnRDb250YWluZXIubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2Q2hhciA9IHN0YXJ0T2Zmc2V0ID4gMCA/IChzdGFydENvbnRhaW5lciBhcyBUZXh0KS5kYXRhLmNoYXJBdChzdGFydE9mZnNldCAtIDEpIDogJydcbiAgICAgICAgICAgIHByZWZpeCA9IHJlc29sdmVUcmlnZ2VySW5zZXJ0UHJlZml4KHByZXZDaGFyKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGluc2VydGVkID0gYCR7cHJlZml4fSNgXG4gICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShpbnNlcnRlZClcbiAgICAgICAgICByYW5nZS5pbnNlcnROb2RlKHRleHROb2RlKVxuXG4gICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQodGV4dE5vZGUsIGluc2VydGVkLmxlbmd0aClcbiAgICAgICAgICByYW5nZS5jb2xsYXBzZSh0cnVlKVxuICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSlcblxuICAgICAgICAgIGVtaXRJbnB1dFN0YXRlKClcbiAgICAgICAgfSxcbiAgICAgICAgc2VyaWFsaXplLFxuICAgICAgICBzeW5jVHJpZ2dlckF0UnVuTGVuZ3RoLFxuICAgICAgICBoYXNWaXN1YWxNdWx0aWxpbmU6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBlZGl0b3IgPSBlZGl0b3JSZWYuY3VycmVudFxuICAgICAgICAgIGlmICghZWRpdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0ZXh0ID0gZWRpdG9yLnRleHRDb250ZW50Py50cmltKCkgPz8gJydcbiAgICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVkaXRvcilcbiAgICAgICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gcGFyc2VGbG9hdChzdHlsZXMubGluZUhlaWdodCkgfHwgMjJcbiAgICAgICAgICBjb25zdCBlZGl0b3JIZWlnaHQgPSBlZGl0b3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgICAgICAgY29uc3QgaXNNdWx0aWxpbmUgPSBlZGl0b3JIZWlnaHQgPiBsaW5lSGVpZ2h0ICogMS41XG5cbiAgICAgICAgICByZXR1cm4gaXNNdWx0aWxpbmVcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0RWRpdG9yQ2xpZW50UmVjdDogKCkgPT4gZWRpdG9yUmVmLmN1cnJlbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpID8/IG51bGwsXG4gICAgICAgIGluc2VydE1lbnRpb246IChtZW50aW9uOiBDb250ZXh0TWVudGlvbikgPT4ge1xuICAgICAgICAgIGNvbnN0IGNoaXAgPSBidWlsZENoaXBFbGVtZW50KG1lbnRpb24pXG4gICAgICAgICAgcmVwbGFjZVRyaWdnZXJXaXRoQ2hpcChjaGlwLCBtZW50aW9uKVxuICAgICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IHRydWVcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHNlcmlhbGl6ZSgpXG4gICAgICAgICAgb25JbnB1dD8uKHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgdHJpZ2dlcjogeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycsIGF0UnVuTGVuZ3RoOiAwIH0sXG4gICAgICAgICAgICBzbGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnIH0sXG4gICAgICAgICAgICBoYXNoVHJpZ2dlcjogeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycgfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnN0IGlzRW1wdHkgPSBzdGF0ZS50ZXh0LnRyaW0oKSA9PT0gJydcbiAgICAgICAgICBzeW5jRWRpdG9yRW1wdHlBdHRyaWJ1dGUoaXNFbXB0eSlcbiAgICAgICAgICBzZXRMb2dpY2FsRW1wdHkoaXNFbXB0eSlcbiAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgICAvLyBTaSBlbCBuYXZlZ2Fkb3Igbm8gZGlzcGFyYSBgaW5wdXRgIHRyYXMgZWwgY2hpcCwgZWwgZmxhZyBxdWVkYWJhIGVuIHRydWUgeSBlbCBwcsOzeGltbyBAIGRlbCB1c3VhcmlvIHNlIGlnbm9yYWJhLlxuICAgICAgICAgICAgc2tpcE5leHRJbnB1dC5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgICAgIHJlY29tcHV0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbigpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgYXBwZW5kTWVudGlvbkF0RW5kOiAobWVudGlvbjogQ29udGV4dE1lbnRpb24pID0+IHtcbiAgICAgICAgICBjb25zdCBlZGl0b3IgPSBlZGl0b3JSZWYuY3VycmVudFxuICAgICAgICAgIGlmICghZWRpdG9yKSByZXR1cm5cblxuICAgICAgICAgIGNvbnN0IGNoaXAgPSBidWlsZENoaXBFbGVtZW50KG1lbnRpb24pXG4gICAgICAgICAgY2hpcC5zZXRBdHRyaWJ1dGUoJ2RhdGEtbWVudGlvbicsICd0cnVlJylcbiAgICAgICAgICBjaGlwLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uLWlkJywgU3RyaW5nKG1lbnRpb24uaWQpKVxuICAgICAgICAgIGNoaXAuc2V0QXR0cmlidXRlKCdkYXRhLW1lbnRpb24tdHlwZScsIG1lbnRpb24udHlwZSlcbiAgICAgICAgICBjaGlwLnNldEF0dHJpYnV0ZSgnZGF0YS1tZW50aW9uLWxhYmVsJywgbWVudGlvbi5sYWJlbClcbiAgICAgICAgICBjaGlwLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ2ZhbHNlJylcblxuICAgICAgICAgIGNvbnN0IHRyYWlsaW5nU3BhY2UgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnXFx1MDBhMCcpXG4gICAgICAgICAgZWRpdG9yLmFwcGVuZENoaWxkKGNoaXApXG4gICAgICAgICAgZWRpdG9yLmFwcGVuZENoaWxkKHRyYWlsaW5nU3BhY2UpXG5cbiAgICAgICAgICBza2lwTmV4dElucHV0LmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBzZXJpYWxpemUoKVxuICAgICAgICAgIG9uSW5wdXQ/Lih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCB9LFxuICAgICAgICAgICAgc2xhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJyB9LFxuICAgICAgICAgICAgaGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICBzeW5jRWRpdG9yRW1wdHlBdHRyaWJ1dGUoZmFsc2UpXG4gICAgICAgICAgc2V0TG9naWNhbEVtcHR5KGZhbHNlKVxuXG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpXG4gICAgICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpXG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydCh0cmFpbGluZ1NwYWNlLCAxKVxuICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcbiAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKVxuICAgICAgICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IGZhbHNlXG4gICAgICAgICAgICByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24oKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIGluc2VydFNraWxsTWVudGlvbjogKG1lbnRpb246IENvbnRleHRNZW50aW9uKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpcCA9IGJ1aWxkQ2hpcEVsZW1lbnQobWVudGlvbilcbiAgICAgICAgICByZXBsYWNlVHJpZ2dlcldpdGhTa2lsbENoaXAoY2hpcCwgbWVudGlvbilcbiAgICAgICAgICBza2lwTmV4dElucHV0LmN1cnJlbnQgPSB0cnVlXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBzZXJpYWxpemUoKVxuICAgICAgICAgIG9uSW5wdXQ/Lih7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIHRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnLCBhdFJ1bkxlbmd0aDogMCB9LFxuICAgICAgICAgICAgc2xhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJyB9LFxuICAgICAgICAgICAgaGFzaFRyaWdnZXI6IHsgYWN0aXZlOiBmYWxzZSwgcXVlcnk6ICcnIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zdCBpc0VtcHR5ID0gc3RhdGUudGV4dC50cmltKCkgPT09ICcnXG4gICAgICAgICAgc3luY0VkaXRvckVtcHR5QXR0cmlidXRlKGlzRW1wdHkpXG4gICAgICAgICAgc2V0TG9naWNhbEVtcHR5KGlzRW1wdHkpXG4gICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgc2tpcE5leHRJbnB1dC5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgICAgIHJlY29tcHV0ZVBsYWNlaG9sZGVyVHJ1bmNhdGlvbigpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgaW5zZXJ0U2xhc2hDb21tYW5kOiAoY29tbWFuZDogU2xhc2hDb21tYW5kQ2hpcERhdGEpID0+IHtcbiAgICAgICAgICBjb25zdCBjaGlwID0gYnVpbGRTbGFzaENoaXBFbGVtZW50KGNvbW1hbmQpXG4gICAgICAgICAgcmVwbGFjZVRyaWdnZXJXaXRoU2xhc2hDaGlwKGNoaXAsIGNvbW1hbmQpXG4gICAgICAgICAgc2tpcE5leHRJbnB1dC5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICAgIGNvbnN0IHN0YXRlID0gc2VyaWFsaXplKClcbiAgICAgICAgICBvbklucHV0Py4oe1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICB0cmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJywgYXRSdW5MZW5ndGg6IDAgfSxcbiAgICAgICAgICAgIHNsYXNoVHJpZ2dlcjogeyBhY3RpdmU6IGZhbHNlLCBxdWVyeTogJycgfSxcbiAgICAgICAgICAgIGhhc2hUcmlnZ2VyOiB7IGFjdGl2ZTogZmFsc2UsIHF1ZXJ5OiAnJyB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgY29uc3QgaXNFbXB0eSA9IHN0YXRlLnRleHQudHJpbSgpID09PSAnJ1xuICAgICAgICAgIHN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZShpc0VtcHR5KVxuICAgICAgICAgIHNldExvZ2ljYWxFbXB0eShpc0VtcHR5KVxuICAgICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IGZhbHNlXG4gICAgICAgICAgICByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24oKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIFtcbiAgICAgICAgZm9jdXMsXG4gICAgICAgIGNsZWFyRWRpdG9yRG9tLFxuICAgICAgICBzZXJpYWxpemUsXG4gICAgICAgIHN5bmNUcmlnZ2VyQXRSdW5MZW5ndGgsXG4gICAgICAgIHJlcGxhY2VUcmlnZ2VyV2l0aENoaXAsXG4gICAgICAgIHJlcGxhY2VUcmlnZ2VyV2l0aFNsYXNoQ2hpcCxcbiAgICAgICAgcmVwbGFjZVRyaWdnZXJXaXRoU2tpbGxDaGlwLFxuICAgICAgICBvbklucHV0LFxuICAgICAgICByZWNvbXB1dGVQbGFjZWhvbGRlclRydW5jYXRpb24sXG4gICAgICAgIHN5bmNFZGl0b3JFbXB0eUF0dHJpYnV0ZSxcbiAgICAgICAgZW1pdElucHV0U3RhdGUsXG4gICAgICAgIGRpc2FibGVkLFxuICAgICAgICBlZGl0b3JSZWYsXG4gICAgICBdXG4gICAgKVxuXG4gICAgY29uc3QgaGFuZGxlSW5wdXQgPSAoKSA9PiB7XG4gICAgICBpZiAoc2tpcE5leHRJbnB1dC5jdXJyZW50KSB7XG4gICAgICAgIHNraXBOZXh0SW5wdXQuY3VycmVudCA9IGZhbHNlXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgZW1pdElucHV0U3RhdGUoKVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZVBhc3RlID0gKGU6IENsaXBib2FyZEV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3QgZmlsZXMgPSBmaWxlc0Zyb21EYXRhVHJhbnNmZXIoZS5jbGlwYm9hcmREYXRhKVxuICAgICAgaWYgKGZpbGVzLmxlbmd0aCAmJiBvblBhc3RlRmlsZXMpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIG9uUGFzdGVGaWxlcyhmaWxlcylcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGV4dCA9IGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJylcbiAgICAgIGlmIChmaWxlcy5sZW5ndGggJiYgb25QYXN0ZUZpbGVzICYmICF0ZXh0KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKVxuICAgICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVyblxuICAgICAgc2VsZWN0aW9uLmRlbGV0ZUZyb21Eb2N1bWVudCgpXG4gICAgICBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKS5pbnNlcnROb2RlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpKVxuICAgICAgc2VsZWN0aW9uLmNvbGxhcHNlVG9FbmQoKVxuICAgICAgaGFuZGxlSW5wdXQoKVxuICAgIH1cblxuICAgIGNvbnN0IHRyaW1tZWRQbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyPy50cmltKCkgPz8gJydcbiAgICBjb25zdCBwbGFjZWhvbGRlclRvb2x0aXBUaXRsZSA9IGxvZ2ljYWxFbXB0eSAmJiBwbGFjZWhvbGRlclRydW5jYXRlZCAmJiB0cmltbWVkUGxhY2Vob2xkZXIgPyB0cmltbWVkUGxhY2Vob2xkZXIgOiAnJ1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxDb250ZXh0TWVudGlvbkNoaXBHbG9iYWxTdHlsZXMgLz5cbiAgICAgICAgPFRvb2x0aXAgdGl0bGU9e3BsYWNlaG9sZGVyVG9vbHRpcFRpdGxlfT5cbiAgICAgICAgICA8c3BhbiBzdHlsZT17eyBkaXNwbGF5OiAnYmxvY2snLCB3aWR0aDogJzEwMCUnLCBtaW5XaWR0aDogMCB9fT5cbiAgICAgICAgICAgIDxTQ01FRWRpdGFibGVcbiAgICAgICAgICAgICAgcmVmPXtlZGl0b3JSZWZ9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lfVxuICAgICAgICAgICAgICAkbWF4SGVpZ2h0PXttYXhIZWlnaHR9XG4gICAgICAgICAgICAgIHN0eWxlPXttYXhIZWlnaHQgIT0gbnVsbCA/IHsgbWF4SGVpZ2h0IH0gOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgIGRhdGEtcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgICAgICBkYXRhLWVtcHR5PXtTdHJpbmcobG9naWNhbEVtcHR5KX1cbiAgICAgICAgICAgICAgY29udGVudEVkaXRhYmxlPXshZGlzYWJsZWR9XG4gICAgICAgICAgICAgIGRhdGEtZGlzYWJsZWQ9e1N0cmluZyghIWRpc2FibGVkKX1cbiAgICAgICAgICAgICAgc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nXG4gICAgICAgICAgICAgIHJvbGU9XCJ0ZXh0Ym94XCJcbiAgICAgICAgICAgICAgYXJpYS1tdWx0aWxpbmU9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgb25JbnB1dD17aGFuZGxlSW5wdXR9XG4gICAgICAgICAgICAgIG9uS2V5RG93bj17b25LZXlEb3dufVxuICAgICAgICAgICAgICBvblBhc3RlPXtoYW5kbGVQYXN0ZX1cbiAgICAgICAgICAgICAgb25Gb2N1cz17b25Gb2N1c31cbiAgICAgICAgICAgICAgb25CbHVyPXtvbkJsdXJ9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgPC8+XG4gICAgKVxuICB9XG4pXG5cbkNvbnRleHRNZW50aW9uRWRpdG9yLmRpc3BsYXlOYW1lID0gJ0NvbnRleHRNZW50aW9uRWRpdG9yJ1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUEsU0FFRUEsVUFBVSxFQUVWQyxXQUFXLEVBQ1hDLG1CQUFtQixFQUNuQkMsZUFBZSxFQUNmQyxNQUFNLEVBQ05DLFFBQVEsUUFDSCxPQUFPO0FBQ2QsU0FBU0MsT0FBTyxRQUFRLDhDQUE4QztBQUN0RSxTQUFTQyxrQkFBa0IsUUFBUSxtQ0FBbUM7QUFFdEUsU0FBU0MsZ0JBQWdCLFFBQVEsdUJBQXVCO0FBQ3hELFNBQVNDLDhCQUE4QixRQUFRLGlEQUFpRDtBQUNoRyxTQUFTQyxxQkFBcUIsUUFBOEIscUJBQXFCO0FBQ2pGLFNBQVNDLHFCQUFxQixRQUFRLCtCQUErQjtBQUNyRSxTQUFTQyw4QkFBOEIsRUFBRUMsMEJBQTBCLFFBQVEsZ0NBQWdDO0FBQzNHLFNBQVNDLFlBQVksUUFBUSwrQkFBK0I7QUFBQSxTQUFBQyxHQUFBLElBQUFDLElBQUEsRUFBQUMsUUFBQSxJQUFBQyxTQUFBLEVBQUFDLElBQUEsSUFBQUMsS0FBQTtBQWlENUQsT0FBTyxJQUFNQyxvQkFBb0IsZ0JBQUdyQixVQUFVLENBQzVDLFVBQUFzQixJQUFBLEVBQXFHQyxHQUFHLEVBQUs7RUFBQSxJQUFBQyxrQkFBQTtFQUFBLElBQTFHQyxXQUFXLEdBQUFILElBQUEsQ0FBWEcsV0FBVztJQUFFQyxRQUFRLEdBQUFKLElBQUEsQ0FBUkksUUFBUTtJQUFFQyxTQUFTLEdBQUFMLElBQUEsQ0FBVEssU0FBUztJQUFFQyxTQUFTLEdBQUFOLElBQUEsQ0FBVE0sU0FBUztJQUFFQyxPQUFPLEdBQUFQLElBQUEsQ0FBUE8sT0FBTztJQUFFQyxTQUFTLEdBQUFSLElBQUEsQ0FBVFEsU0FBUztJQUFFQyxPQUFPLEdBQUFULElBQUEsQ0FBUFMsT0FBTztJQUFFQyxNQUFNLEdBQUFW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
@@ -0,0 +1,231 @@
1
+ import { createRef } from 'react';
2
+ import { act, fireEvent, renderWithProviders, screen } from '../../../test/test-utils';
3
+ import { ContextMentionEditor } from './ContextMentionEditor';
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ jest.mock('../ContextMentionChip', function () {
6
+ return {
7
+ buildChipElement: function buildChipElement(mention) {
8
+ var chip = document.createElement('span');
9
+ chip.dataset.mention = 'true';
10
+ chip.dataset.mentionId = String(mention.id);
11
+ chip.dataset.mentionType = mention.type;
12
+ chip.dataset.mentionLabel = mention.label;
13
+ return chip;
14
+ }
15
+ };
16
+ });
17
+ jest.mock('../SlashCommandChip', function () {
18
+ return {
19
+ buildSlashChipElement: function buildSlashChipElement(command) {
20
+ var chip = document.createElement('span');
21
+ chip.dataset.slashCommand = 'true';
22
+ chip.dataset.slashId = command.id;
23
+ chip.dataset.slashLabel = command.label;
24
+ return chip;
25
+ }
26
+ };
27
+ });
28
+ describe('ContextMentionEditor', function () {
29
+ it('renders an editable textbox with placeholder', function () {
30
+ renderWithProviders(/*#__PURE__*/_jsx(ContextMentionEditor, {
31
+ placeholder: "Escrib\xED algo"
32
+ }));
33
+ var editor = screen.getByRole('textbox');
34
+ expect(editor).toHaveAttribute('data-placeholder', 'Escribí algo');
35
+ expect(editor).toHaveAttribute('contenteditable', 'true');
36
+ expect(editor).toHaveAttribute('data-empty', 'true');
37
+ });
38
+ it('disables editing when disabled', function () {
39
+ renderWithProviders(/*#__PURE__*/_jsx(ContextMentionEditor, {
40
+ disabled: true,
41
+ placeholder: "Off"
42
+ }));
43
+ expect(screen.getByRole('textbox')).toHaveAttribute('contenteditable', 'false');
44
+ });
45
+ it('clears content through the ref', function () {
46
+ var _ref$current2, _ref$current4;
47
+ var ref = /*#__PURE__*/createRef();
48
+ renderWithProviders(/*#__PURE__*/_jsx(ContextMentionEditor, {
49
+ ref: ref
50
+ }));
51
+ act(function () {
52
+ var _ref$current;
53
+ (_ref$current = ref.current) === null || _ref$current === void 0 || _ref$current.setPlainText('hola');
54
+ });
55
+ expect((_ref$current2 = ref.current) === null || _ref$current2 === void 0 ? void 0 : _ref$current2.serialize().text).toBe('hola');
56
+ act(function () {
57
+ var _ref$current3;
58
+ (_ref$current3 = ref.current) === null || _ref$current3 === void 0 || _ref$current3.clear();
59
+ });
60
+ expect((_ref$current4 = ref.current) === null || _ref$current4 === void 0 ? void 0 : _ref$current4.serialize().text).toBe('');
61
+ });
62
+ it('calls onPasteFiles for clipboard files', function () {
63
+ var onPasteFiles = jest.fn();
64
+ renderWithProviders(/*#__PURE__*/_jsx(ContextMentionEditor, {
65
+ onPasteFiles: onPasteFiles
66
+ }));
67
+ var file = new File(['x'], 'img.png', {
68
+ type: 'image/png'
69
+ });
70
+ fireEvent.paste(screen.getByRole('textbox'), {
71
+ clipboardData: {
72
+ getData: function getData() {
73
+ return '';
74
+ },
75
+ files: [file]
76
+ }
77
+ });
78
+ expect(onPasteFiles).toHaveBeenCalledWith([file]);
79
+ });
80
+ it('notifies onInput after typing plain text', function () {
81
+ var onInput = jest.fn();
82
+ renderWithProviders(/*#__PURE__*/_jsx(ContextMentionEditor, {
83
+ onInput: onInput
84
+ }));
85
+ var editor = screen.getByRole('textbox');
86
+ act(function () {
87
+ editor.textContent = 'hola';
88
+ fireEvent.input(editor);
89
+ });
90
+ expect(onInput).toHaveBeenCalledWith(expect.objectContaining({
91
+ text: 'hola',
92
+ trigger: expect.objectContaining({
93
+ active: false
94
+ })
95
+ }));
96
+ });
97
+ it('inserts mention triggers through the ref', function () {
98
+ var ref = /*#__PURE__*/createRef();
99
+ var onInput = jest.fn();
100
+ renderWithProviders(/*#__PURE__*/_jsx(ContextMentionEditor, {
101
+ ref: ref,
102
+ onInput: onInput
103
+ }));
104
+ act(function () {
105
+ var _ref$current5;
106
+ (_ref$current5 = ref.current) === null || _ref$current5 === void 0 || _ref$current5.insertMentionTrigger();
107
+ });
108
+ expect(onInput).toHaveBeenCalledWith(expect.objectContaining({
109
+ trigger: expect.objectContaining({
110
+ active: true,
111
+ query: ''
112
+ })
113
+ }));
114
+ });
115
+ it('inserts slash and skill triggers through the ref', function () {
116
+ var ref = /*#__PURE__*/createRef();
117
+ var onInput = jest.fn();
118
+ renderWithProviders(/*#__PURE__*/_jsx(ContextMentionEditor, {
119
+ ref: ref,
120
+ onInput: onInput
121
+ }));
122
+ act(function () {
123
+ var _ref$current6;
124
+ (_ref$current6 = ref.current) === null || _ref$current6 === void 0 || _ref$current6.insertSlashTrigger();
125
+ });
126
+ expect(onInput).toHaveBeenCalledWith(expect.objectContaining({
127
+ slashTrigger: expect.objectContaining({
128
+ active: true,
129
+ query: ''
130
+ })
131
+ }));
132
+ onInput.mockClear();
133
+ act(function () {
134
+ var _ref$current7;
135
+ (_ref$current7 = ref.current) === null || _ref$current7 === void 0 || _ref$current7.insertSkillTrigger();
136
+ });
137
+ expect(onInput).toHaveBeenCalledWith(expect.objectContaining({
138
+ hashTrigger: expect.objectContaining({
139
+ active: true,
140
+ query: ''
141
+ })
142
+ }));
143
+ });
144
+ it('replaces an active @ query with a mention chip', function () {
145
+ var _ref$current1;
146
+ var ref = /*#__PURE__*/createRef();
147
+ var onInput = jest.fn();
148
+ renderWithProviders(/*#__PURE__*/_jsx(ContextMentionEditor, {
149
+ ref: ref,
150
+ onInput: onInput
151
+ }));
152
+ act(function () {
153
+ var _ref$current8, _ref$current9;
154
+ (_ref$current8 = ref.current) === null || _ref$current8 === void 0 || _ref$current8.setPlainText('Hola @ana');
155
+ var editor = (_ref$current9 = ref.current) === null || _ref$current9 === void 0 ? void 0 : _ref$current9.serialize();
156
+ expect(editor === null || editor === void 0 ? void 0 : editor.text).toContain('@ana');
157
+ });
158
+ act(function () {
159
+ var editor = screen.getByRole('textbox');
160
+ var textNode = editor.firstChild;
161
+ var range = document.createRange();
162
+ range.setStart(textNode, textNode.data.length);
163
+ range.collapse(true);
164
+ var selection = window.getSelection();
165
+ selection === null || selection === void 0 || selection.removeAllRanges();
166
+ selection === null || selection === void 0 || selection.addRange(range);
167
+ });
168
+ act(function () {
169
+ var _ref$current0;
170
+ (_ref$current0 = ref.current) === null || _ref$current0 === void 0 || _ref$current0.insertMention({
171
+ id: 'u1',
172
+ type: 'user',
173
+ label: 'Ana'
174
+ });
175
+ });
176
+ expect((_ref$current1 = ref.current) === null || _ref$current1 === void 0 ? void 0 : _ref$current1.serialize()).toMatchObject({
177
+ text: expect.stringContaining('[[mention:user:u1|Ana]]'),
178
+ mentions: [{
179
+ id: 'u1',
180
+ type: 'user',
181
+ label: 'Ana'
182
+ }]
183
+ });
184
+ });
185
+ it('appends a mention chip at the end of the editor', function () {
186
+ var _ref$current11;
187
+ var ref = /*#__PURE__*/createRef();
188
+ renderWithProviders(/*#__PURE__*/_jsx(ContextMentionEditor, {
189
+ ref: ref
190
+ }));
191
+ act(function () {
192
+ var _ref$current10;
193
+ (_ref$current10 = ref.current) === null || _ref$current10 === void 0 || _ref$current10.appendMentionAtEnd({
194
+ id: 'p1',
195
+ type: 'project',
196
+ label: 'Alpha'
197
+ });
198
+ });
199
+ expect((_ref$current11 = ref.current) === null || _ref$current11 === void 0 ? void 0 : _ref$current11.serialize()).toMatchObject({
200
+ mentions: [{
201
+ id: 'p1',
202
+ type: 'project',
203
+ label: 'Alpha'
204
+ }]
205
+ });
206
+ });
207
+ it('forwards focus and blur callbacks', function () {
208
+ var onFocus = jest.fn();
209
+ var onBlur = jest.fn();
210
+ renderWithProviders(/*#__PURE__*/_jsx(ContextMentionEditor, {
211
+ onFocus: onFocus,
212
+ onBlur: onBlur
213
+ }));
214
+ var editor = screen.getByRole('textbox');
215
+ fireEvent.focus(editor);
216
+ fireEvent.blur(editor);
217
+ expect(onFocus).toHaveBeenCalled();
218
+ expect(onBlur).toHaveBeenCalled();
219
+ });
220
+ it('forwards keydown to the consumer', function () {
221
+ var onKeyDown = jest.fn();
222
+ renderWithProviders(/*#__PURE__*/_jsx(ContextMentionEditor, {
223
+ onKeyDown: onKeyDown
224
+ }));
225
+ fireEvent.keyDown(screen.getByRole('textbox'), {
226
+ key: 'Enter'
227
+ });
228
+ expect(onKeyDown).toHaveBeenCalled();
229
+ });
230
+ });
231
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVSZWYiLCJhY3QiLCJmaXJlRXZlbnQiLCJyZW5kZXJXaXRoUHJvdmlkZXJzIiwic2NyZWVuIiwiQ29udGV4dE1lbnRpb25FZGl0b3IiLCJqc3giLCJfanN4IiwiamVzdCIsIm1vY2siLCJidWlsZENoaXBFbGVtZW50IiwibWVudGlvbiIsImNoaXAiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJkYXRhc2V0IiwibWVudGlvbklkIiwiU3RyaW5nIiwiaWQiLCJtZW50aW9uVHlwZSIsInR5cGUiLCJtZW50aW9uTGFiZWwiLCJsYWJlbCIsImJ1aWxkU2xhc2hDaGlwRWxlbWVudCIsImNvbW1hbmQiLCJzbGFzaENvbW1hbmQiLCJzbGFzaElkIiwic2xhc2hMYWJlbCIsImRlc2NyaWJlIiwiaXQiLCJwbGFjZWhvbGRlciIsImVkaXRvciIsImdldEJ5Um9sZSIsImV4cGVjdCIsInRvSGF2ZUF0dHJpYnV0ZSIsImRpc2FibGVkIiwiX3JlZiRjdXJyZW50MiIsIl9yZWYkY3VycmVudDQiLCJyZWYiLCJfcmVmJGN1cnJlbnQiLCJjdXJyZW50Iiwic2V0UGxhaW5UZXh0Iiwic2VyaWFsaXplIiwidGV4dCIsInRvQmUiLCJfcmVmJGN1cnJlbnQzIiwiY2xlYXIiLCJvblBhc3RlRmlsZXMiLCJmbiIsImZpbGUiLCJGaWxlIiwicGFzdGUiLCJjbGlwYm9hcmREYXRhIiwiZ2V0RGF0YSIsImZpbGVzIiwidG9IYXZlQmVlbkNhbGxlZFdpdGgiLCJvbklucHV0IiwidGV4dENvbnRlbnQiLCJpbnB1dCIsIm9iamVjdENvbnRhaW5pbmciLCJ0cmlnZ2VyIiwiYWN0aXZlIiwiX3JlZiRjdXJyZW50NSIsImluc2VydE1lbnRpb25UcmlnZ2VyIiwicXVlcnkiLCJfcmVmJGN1cnJlbnQ2IiwiaW5zZXJ0U2xhc2hUcmlnZ2VyIiwic2xhc2hUcmlnZ2VyIiwibW9ja0NsZWFyIiwiX3JlZiRjdXJyZW50NyIsImluc2VydFNraWxsVHJpZ2dlciIsImhhc2hUcmlnZ2VyIiwiX3JlZiRjdXJyZW50MSIsIl9yZWYkY3VycmVudDgiLCJfcmVmJGN1cnJlbnQ5IiwidG9Db250YWluIiwidGV4dE5vZGUiLCJmaXJzdENoaWxkIiwicmFuZ2UiLCJjcmVhdGVSYW5nZSIsInNldFN0YXJ0IiwiZGF0YSIsImxlbmd0aCIsImNvbGxhcHNlIiwic2VsZWN0aW9uIiwid2luZG93IiwiZ2V0U2VsZWN0aW9uIiwicmVtb3ZlQWxsUmFuZ2VzIiwiYWRkUmFuZ2UiLCJfcmVmJGN1cnJlbnQwIiwiaW5zZXJ0TWVudGlvbiIsInRvTWF0Y2hPYmplY3QiLCJzdHJpbmdDb250YWluaW5nIiwibWVudGlvbnMiLCJfcmVmJGN1cnJlbnQxMSIsIl9yZWYkY3VycmVudDEwIiwiYXBwZW5kTWVudGlvbkF0RW5kIiwib25Gb2N1cyIsIm9uQmx1ciIsImZvY3VzIiwiYmx1ciIsInRvSGF2ZUJlZW5DYWxsZWQiLCJvbktleURvd24iLCJrZXlEb3duIiwia2V5Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvYXRvbXMvQ29udGV4dE1lbnRpb25FZGl0b3IvQ29udGV4dE1lbnRpb25FZGl0b3Iuc3BlYy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlUmVmIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBhY3QsIGZpcmVFdmVudCwgcmVuZGVyV2l0aFByb3ZpZGVycywgc2NyZWVuIH0gZnJvbSAnLi4vLi4vLi4vdGVzdC90ZXN0LXV0aWxzJ1xuaW1wb3J0IHsgQ29udGV4dE1lbnRpb25FZGl0b3IsIENvbnRleHRNZW50aW9uRWRpdG9ySGFuZGxlIH0gZnJvbSAnLi9Db250ZXh0TWVudGlvbkVkaXRvcidcblxuamVzdC5tb2NrKCcuLi9Db250ZXh0TWVudGlvbkNoaXAnLCAoKSA9PiAoe1xuICBidWlsZENoaXBFbGVtZW50OiAobWVudGlvbjogeyBpZDogc3RyaW5nIHwgbnVtYmVyOyB0eXBlOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfSkgPT4ge1xuICAgIGNvbnN0IGNoaXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcbiAgICBjaGlwLmRhdGFzZXQubWVudGlvbiA9ICd0cnVlJ1xuICAgIGNoaXAuZGF0YXNldC5tZW50aW9uSWQgPSBTdHJpbmcobWVudGlvbi5pZClcbiAgICBjaGlwLmRhdGFzZXQubWVudGlvblR5cGUgPSBtZW50aW9uLnR5cGVcbiAgICBjaGlwLmRhdGFzZXQubWVudGlvbkxhYmVsID0gbWVudGlvbi5sYWJlbFxuICAgIHJldHVybiBjaGlwXG4gIH0sXG59KSlcblxuamVzdC5tb2NrKCcuLi9TbGFzaENvbW1hbmRDaGlwJywgKCkgPT4gKHtcbiAgYnVpbGRTbGFzaENoaXBFbGVtZW50OiAoY29tbWFuZDogeyBpZDogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0pID0+IHtcbiAgICBjb25zdCBjaGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXG4gICAgY2hpcC5kYXRhc2V0LnNsYXNoQ29tbWFuZCA9ICd0cnVlJ1xuICAgIGNoaXAuZGF0YXNldC5zbGFzaElkID0gY29tbWFuZC5pZFxuICAgIGNoaXAuZGF0YXNldC5zbGFzaExhYmVsID0gY29tbWFuZC5sYWJlbFxuICAgIHJldHVybiBjaGlwXG4gIH0sXG59KSlcblxuZGVzY3JpYmUoJ0NvbnRleHRNZW50aW9uRWRpdG9yJywgKCkgPT4ge1xuICBpdCgncmVuZGVycyBhbiBlZGl0YWJsZSB0ZXh0Ym94IHdpdGggcGxhY2Vob2xkZXInLCAoKSA9PiB7XG4gICAgcmVuZGVyV2l0aFByb3ZpZGVycyg8Q29udGV4dE1lbnRpb25FZGl0b3IgcGxhY2Vob2xkZXI9XCJFc2NyaWLDrSBhbGdvXCIgLz4pXG5cbiAgICBjb25zdCBlZGl0b3IgPSBzY3JlZW4uZ2V0QnlSb2xlKCd0ZXh0Ym94JylcbiAgICBleHBlY3QoZWRpdG9yKS50b0hhdmVBdHRyaWJ1dGUoJ2RhdGEtcGxhY2Vob2xkZXInLCAnRXNjcmliw60gYWxnbycpXG4gICAgZXhwZWN0KGVkaXRvcikudG9IYXZlQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCAndHJ1ZScpXG4gICAgZXhwZWN0KGVkaXRvcikudG9IYXZlQXR0cmlidXRlKCdkYXRhLWVtcHR5JywgJ3RydWUnKVxuICB9KVxuXG4gIGl0KCdkaXNhYmxlcyBlZGl0aW5nIHdoZW4gZGlzYWJsZWQnLCAoKSA9PiB7XG4gICAgcmVuZGVyV2l0aFByb3ZpZGVycyg8Q29udGV4dE1lbnRpb25FZGl0b3IgZGlzYWJsZWQgcGxhY2Vob2xkZXI9XCJPZmZcIiAvPilcblxuICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlSb2xlKCd0ZXh0Ym94JykpLnRvSGF2ZUF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ2ZhbHNlJylcbiAgfSlcblxuICBpdCgnY2xlYXJzIGNvbnRlbnQgdGhyb3VnaCB0aGUgcmVmJywgKCkgPT4ge1xuICAgIGNvbnN0IHJlZiA9IGNyZWF0ZVJlZjxDb250ZXh0TWVudGlvbkVkaXRvckhhbmRsZT4oKVxuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoPENvbnRleHRNZW50aW9uRWRpdG9yIHJlZj17cmVmfSAvPilcblxuICAgIGFjdCgoKSA9PiB7XG4gICAgICByZWYuY3VycmVudD8uc2V0UGxhaW5UZXh0KCdob2xhJylcbiAgICB9KVxuICAgIGV4cGVjdChyZWYuY3VycmVudD8uc2VyaWFsaXplKCkudGV4dCkudG9CZSgnaG9sYScpXG5cbiAgICBhY3QoKCkgPT4ge1xuICAgICAgcmVmLmN1cnJlbnQ/LmNsZWFyKClcbiAgICB9KVxuICAgIGV4cGVjdChyZWYuY3VycmVudD8uc2VyaWFsaXplKCkudGV4dCkudG9CZSgnJylcbiAgfSlcblxuICBpdCgnY2FsbHMgb25QYXN0ZUZpbGVzIGZvciBjbGlwYm9hcmQgZmlsZXMnLCAoKSA9PiB7XG4gICAgY29uc3Qgb25QYXN0ZUZpbGVzID0gamVzdC5mbigpXG4gICAgcmVuZGVyV2l0aFByb3ZpZGVycyg8Q29udGV4dE1lbnRpb25FZGl0b3Igb25QYXN0ZUZpbGVzPXtvblBhc3RlRmlsZXN9IC8+KVxuXG4gICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFsneCddLCAnaW1nLnBuZycsIHsgdHlwZTogJ2ltYWdlL3BuZycgfSlcbiAgICBmaXJlRXZlbnQucGFzdGUoc2NyZWVuLmdldEJ5Um9sZSgndGV4dGJveCcpLCB7XG4gICAgICBjbGlwYm9hcmREYXRhOiB7XG4gICAgICAgIGdldERhdGE6ICgpID0+ICcnLFxuICAgICAgICBmaWxlczogW2ZpbGVdLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgZXhwZWN0KG9uUGFzdGVGaWxlcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoW2ZpbGVdKVxuICB9KVxuXG4gIGl0KCdub3RpZmllcyBvbklucHV0IGFmdGVyIHR5cGluZyBwbGFpbiB0ZXh0JywgKCkgPT4ge1xuICAgIGNvbnN0IG9uSW5wdXQgPSBqZXN0LmZuKClcbiAgICByZW5kZXJXaXRoUHJvdmlkZXJzKDxDb250ZXh0TWVudGlvbkVkaXRvciBvbklucHV0PXtvbklucHV0fSAvPilcblxuICAgIGNvbnN0IGVkaXRvciA9IHNjcmVlbi5nZXRCeVJvbGUoJ3RleHRib3gnKVxuICAgIGFjdCgoKSA9PiB7XG4gICAgICBlZGl0b3IudGV4dENvbnRlbnQgPSAnaG9sYSdcbiAgICAgIGZpcmVFdmVudC5pbnB1dChlZGl0b3IpXG4gICAgfSlcblxuICAgIGV4cGVjdChvbklucHV0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgdGV4dDogJ2hvbGEnLFxuICAgICAgICB0cmlnZ2VyOiBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IGFjdGl2ZTogZmFsc2UgfSksXG4gICAgICB9KVxuICAgIClcbiAgfSlcblxuICBpdCgnaW5zZXJ0cyBtZW50aW9uIHRyaWdnZXJzIHRocm91Z2ggdGhlIHJlZicsICgpID0+IHtcbiAgICBjb25zdCByZWYgPSBjcmVhdGVSZWY8Q29udGV4dE1lbnRpb25FZGl0b3JIYW5kbGU+KClcbiAgICBjb25zdCBvbklucHV0ID0gamVzdC5mbigpXG4gICAgcmVuZGVyV2l0aFByb3ZpZGVycyg8Q29udGV4dE1lbnRpb25FZGl0b3IgcmVmPXtyZWZ9IG9uSW5wdXQ9e29uSW5wdXR9IC8+KVxuXG4gICAgYWN0KCgpID0+IHtcbiAgICAgIHJlZi5jdXJyZW50Py5pbnNlcnRNZW50aW9uVHJpZ2dlcigpXG4gICAgfSlcblxuICAgIGV4cGVjdChvbklucHV0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgdHJpZ2dlcjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBhY3RpdmU6IHRydWUsIHF1ZXJ5OiAnJyB9KSxcbiAgICAgIH0pXG4gICAgKVxuICB9KVxuXG4gIGl0KCdpbnNlcnRzIHNsYXNoIGFuZCBza2lsbCB0cmlnZ2VycyB0aHJvdWdoIHRoZSByZWYnLCAoKSA9PiB7XG4gICAgY29uc3QgcmVmID0gY3JlYXRlUmVmPENvbnRleHRNZW50aW9uRWRpdG9ySGFuZGxlPigpXG4gICAgY29uc3Qgb25JbnB1dCA9IGplc3QuZm4oKVxuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoPENvbnRleHRNZW50aW9uRWRpdG9yIHJlZj17cmVmfSBvbklucHV0PXtvbklucHV0fSAvPilcblxuICAgIGFjdCgoKSA9PiB7XG4gICAgICByZWYuY3VycmVudD8uaW5zZXJ0U2xhc2hUcmlnZ2VyKClcbiAgICB9KVxuXG4gICAgZXhwZWN0KG9uSW5wdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICBzbGFzaFRyaWdnZXI6IGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgYWN0aXZlOiB0cnVlLCBxdWVyeTogJycgfSksXG4gICAgICB9KVxuICAgIClcblxuICAgIG9uSW5wdXQubW9ja0NsZWFyKClcblxuICAgIGFjdCgoKSA9PiB7XG4gICAgICByZWYuY3VycmVudD8uaW5zZXJ0U2tpbGxUcmlnZ2VyKClcbiAgICB9KVxuXG4gICAgZXhwZWN0KG9uSW5wdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICBoYXNoVHJpZ2dlcjogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBhY3RpdmU6IHRydWUsIHF1ZXJ5OiAnJyB9KSxcbiAgICAgIH0pXG4gICAgKVxuICB9KVxuXG4gIGl0KCdyZXBsYWNlcyBhbiBhY3RpdmUgQCBxdWVyeSB3aXRoIGEgbWVudGlvbiBjaGlwJywgKCkgPT4ge1xuICAgIGNvbnN0IHJlZiA9IGNyZWF0ZVJlZjxDb250ZXh0TWVudGlvbkVkaXRvckhhbmRsZT4oKVxuICAgIGNvbnN0IG9uSW5wdXQgPSBqZXN0LmZuKClcbiAgICByZW5kZXJXaXRoUHJvdmlkZXJzKDxDb250ZXh0TWVudGlvbkVkaXRvciByZWY9e3JlZn0gb25JbnB1dD17b25JbnB1dH0gLz4pXG5cbiAgICBhY3QoKCkgPT4ge1xuICAgICAgcmVmLmN1cnJlbnQ/LnNldFBsYWluVGV4dCgnSG9sYSBAYW5hJylcbiAgICAgIGNvbnN0IGVkaXRvciA9IHJlZi5jdXJyZW50Py5zZXJpYWxpemUoKVxuICAgICAgZXhwZWN0KGVkaXRvcj8udGV4dCkudG9Db250YWluKCdAYW5hJylcbiAgICB9KVxuXG4gICAgYWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGVkaXRvciA9IHNjcmVlbi5nZXRCeVJvbGUoJ3RleHRib3gnKVxuICAgICAgY29uc3QgdGV4dE5vZGUgPSBlZGl0b3IuZmlyc3RDaGlsZCBhcyBUZXh0XG4gICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKClcbiAgICAgIHJhbmdlLnNldFN0YXJ0KHRleHROb2RlLCB0ZXh0Tm9kZS5kYXRhLmxlbmd0aClcbiAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKClcbiAgICAgIHNlbGVjdGlvbj8ucmVtb3ZlQWxsUmFuZ2VzKClcbiAgICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UpXG4gICAgfSlcblxuICAgIGFjdCgoKSA9PiB7XG4gICAgICByZWYuY3VycmVudD8uaW5zZXJ0TWVudGlvbih7IGlkOiAndTEnLCB0eXBlOiAndXNlcicsIGxhYmVsOiAnQW5hJyB9KVxuICAgIH0pXG5cbiAgICBleHBlY3QocmVmLmN1cnJlbnQ/LnNlcmlhbGl6ZSgpKS50b01hdGNoT2JqZWN0KHtcbiAgICAgIHRleHQ6IGV4cGVjdC5zdHJpbmdDb250YWluaW5nKCdbW21lbnRpb246dXNlcjp1MXxBbmFdXScpLFxuICAgICAgbWVudGlvbnM6IFt7IGlkOiAndTEnLCB0eXBlOiAndXNlcicsIGxhYmVsOiAnQW5hJyB9XSxcbiAgICB9KVxuICB9KVxuXG4gIGl0KCdhcHBlbmRzIGEgbWVudGlvbiBjaGlwIGF0IHRoZSBlbmQgb2YgdGhlIGVkaXRvcicsICgpID0+IHtcbiAgICBjb25zdCByZWYgPSBjcmVhdGVSZWY8Q29udGV4dE1lbnRpb25FZGl0b3JIYW5kbGU+KClcbiAgICByZW5kZXJXaXRoUHJvdmlkZXJzKDxDb250ZXh0TWVudGlvbkVkaXRvciByZWY9e3JlZn0gLz4pXG5cbiAgICBhY3QoKCkgPT4ge1xuICAgICAgcmVmLmN1cnJlbnQ/LmFwcGVuZE1lbnRpb25BdEVuZCh7IGlkOiAncDEnLCB0eXBlOiAncHJvamVjdCcsIGxhYmVsOiAnQWxwaGEnIH0pXG4gICAgfSlcblxuICAgIGV4cGVjdChyZWYuY3VycmVudD8uc2VyaWFsaXplKCkpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgbWVudGlvbnM6IFt7IGlkOiAncDEnLCB0eXBlOiAncHJvamVjdCcsIGxhYmVsOiAnQWxwaGEnIH1dLFxuICAgIH0pXG4gIH0pXG5cbiAgaXQoJ2ZvcndhcmRzIGZvY3VzIGFuZCBibHVyIGNhbGxiYWNrcycsICgpID0+IHtcbiAgICBjb25zdCBvbkZvY3VzID0gamVzdC5mbigpXG4gICAgY29uc3Qgb25CbHVyID0gamVzdC5mbigpXG4gICAgcmVuZGVyV2l0aFByb3ZpZGVycyg8Q29udGV4dE1lbnRpb25FZGl0b3Igb25Gb2N1cz17b25Gb2N1c30gb25CbHVyPXtvbkJsdXJ9IC8+KVxuXG4gICAgY29uc3QgZWRpdG9yID0gc2NyZWVuLmdldEJ5Um9sZSgndGV4dGJveCcpXG4gICAgZmlyZUV2ZW50LmZvY3VzKGVkaXRvcilcbiAgICBmaXJlRXZlbnQuYmx1cihlZGl0b3IpXG5cbiAgICBleHBlY3Qob25Gb2N1cykudG9IYXZlQmVlbkNhbGxlZCgpXG4gICAgZXhwZWN0KG9uQmx1cikudG9IYXZlQmVlbkNhbGxlZCgpXG4gIH0pXG5cbiAgaXQoJ2ZvcndhcmRzIGtleWRvd24gdG8gdGhlIGNvbnN1bWVyJywgKCkgPT4ge1xuICAgIGNvbnN0IG9uS2V5RG93biA9IGplc3QuZm4oKVxuICAgIHJlbmRlcldpdGhQcm92aWRlcnMoPENvbnRleHRNZW50aW9uRWRpdG9yIG9uS2V5RG93bj17b25LZXlEb3dufSAvPilcblxuICAgIGZpcmVFdmVudC5rZXlEb3duKHNjcmVlbi5nZXRCeVJvbGUoJ3RleHRib3gnKSwgeyBrZXk6ICdFbnRlcicgfSlcblxuICAgIGV4cGVjdChvbktleURvd24pLnRvSGF2ZUJlZW5DYWxsZWQoKVxuICB9KVxufSlcbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsU0FBUyxRQUFRLE9BQU87QUFDakMsU0FBU0MsR0FBRyxFQUFFQyxTQUFTLEVBQUVDLG1CQUFtQixFQUFFQyxNQUFNLFFBQVEsMEJBQTBCO0FBQ3RGLFNBQVNDLG9CQUFvQixRQUFvQyx3QkFBd0I7QUFBQSxTQUFBQyxHQUFBLElBQUFDLElBQUE7QUFFekZDLElBQUksQ0FBQ0MsSUFBSSxDQUFDLHVCQUF1QixFQUFFO0VBQUEsT0FBTztJQUN4Q0MsZ0JBQWdCLEVBQUUsU0FBbEJBLGdCQUFnQkEsQ0FBR0MsT0FBNkQsRUFBSztNQUNuRixJQUFNQyxJQUFJLEdBQUdDLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLE1BQU0sQ0FBQztNQUMzQ0YsSUFBSSxDQUFDRyxPQUFP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