@projectcor/maia-components 2.49.1-0 → 2.50.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (401) hide show
  1. package/README.md +2 -0
  2. package/lib/App.js +19 -44
  3. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.js +53 -0
  4. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.styles.js +8 -0
  5. package/lib/components/atoms/ContextCompactedNotice/index.js +2 -0
  6. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +1 -3
  7. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +7 -19
  8. package/lib/components/atoms/MAIAInput/MAIAInput.js +3 -5
  9. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +2 -7
  10. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +24 -41
  11. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +10 -25
  12. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +43 -78
  13. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +11 -9
  14. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +15 -37
  15. package/lib/components/index.js +1 -2
  16. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +3 -7
  17. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +72 -91
  18. package/lib/components/molecules/ChatAIHome/styles.js +78 -85
  19. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +35 -42
  20. package/lib/components/molecules/ChatAIMessages/newStyles.js +35 -32
  21. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +1 -8
  22. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +8 -25
  23. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
  24. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +153 -15
  25. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +26 -2
  26. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +61 -65
  27. package/lib/components/molecules/ChatFooter/ChatFooter.js +4 -10
  28. package/lib/components/molecules/Sidebar/Sidebar.js +23 -41
  29. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +2 -2
  30. package/lib/constants/formatExtensions.js +8 -7
  31. package/lib/constants/permissions/index.js +2 -2
  32. package/lib/constants/permissions/utils.js +1 -4
  33. package/lib/dev/DevReasoningTimeline.js +86 -75
  34. package/lib/dev/Providers.js +3 -5
  35. package/lib/hooks/useChatManager/useChatManager.helpers.js +20 -9
  36. package/lib/hooks/useChatManager/useChatManager.js +21 -15
  37. package/lib/hooks/useFrequentlyUsedActions.js +22 -60
  38. package/lib/hooks/useReasoningTrace/reasoningStore.js +39 -8
  39. package/lib/index.js +2 -5
  40. package/lib/lang/br/index.js +7 -26
  41. package/lib/lang/en/index.js +7 -26
  42. package/lib/lang/es/index.js +7 -26
  43. package/lib/lang/fr/index.js +7 -26
  44. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  45. package/lib/services/utils/mapChatMessages.helpers.js +12 -7
  46. package/lib/store/sessions/sessionStreamManager.js +101 -94
  47. package/lib/styles/cascade.js +3 -29
  48. package/lib/styles/transitions.js +1 -3
  49. package/lib/types/Chat.js +1 -1
  50. package/lib/types/contextCompaction.js +48 -0
  51. package/lib/types/global.d.js +1 -1
  52. package/lib/types/jest-dom.d.js +2 -0
  53. package/lib/types/reasoning.js +1 -1
  54. package/lib/utils/hoursPlannerQuickActionType.js +1 -74
  55. package/lib/utils/streamActivityMessages.helpers.js +2 -3
  56. package/lib/utils/streamActivityMessages.js +20 -32
  57. package/package.json +2 -2
  58. package/lib/components/atoms/ActionableButton.spec.js +0 -111
  59. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +0 -52
  60. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +0 -11
  61. package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.spec.js +0 -63
  62. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +0 -183
  63. package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +0 -123
  64. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +0 -139
  65. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +0 -385
  66. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +0 -78
  67. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +0 -94
  68. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +0 -396
  69. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +0 -80
  70. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +0 -526
  71. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +0 -137
  72. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +0 -11
  73. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +0 -77
  74. package/lib/components/atoms/Backdrop/Backdrop.spec.js +0 -28
  75. package/lib/components/atoms/CardMenu/CardMenu.spec.js +0 -56
  76. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +0 -67
  77. package/lib/components/atoms/Checkbox/Checkbox.spec.js +0 -27
  78. package/lib/components/atoms/Chip/Chip.spec.js +0 -82
  79. package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +0 -26
  80. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.spec.js +0 -45
  81. package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +0 -133
  82. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +0 -29
  83. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +0 -46
  84. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +0 -109
  85. package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +0 -81
  86. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +0 -92
  87. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +0 -319
  88. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +0 -107
  89. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +0 -136
  90. package/lib/components/atoms/CopyToClipboard.spec.js +0 -74
  91. package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +0 -76
  92. package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +0 -86
  93. package/lib/components/atoms/Expand/Expand.spec.js +0 -57
  94. package/lib/components/atoms/Fade/Fade.spec.js +0 -31
  95. package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +0 -75
  96. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +0 -104
  97. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +0 -91
  98. package/lib/components/atoms/HelpButton.spec.js +0 -87
  99. package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +0 -96
  100. package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +0 -54
  101. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +0 -21
  102. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +0 -20
  103. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +0 -26
  104. package/lib/components/atoms/LoadingText/LoadingText.spec.js +0 -25
  105. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +0 -42
  106. package/lib/components/atoms/MAIAError/MAIAError.spec.js +0 -27
  107. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.spec.js +0 -113
  108. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +0 -381
  109. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +0 -641
  110. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +0 -92
  111. package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +0 -193
  112. package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +0 -32
  113. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +0 -64
  114. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +0 -43
  115. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +0 -114
  116. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +0 -51
  117. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +0 -48
  118. package/lib/components/atoms/ModalProject/ModalProject.spec.js +0 -66
  119. package/lib/components/atoms/NextPageLoader.spec.js +0 -37
  120. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +0 -20
  121. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +0 -35
  122. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +0 -47
  123. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +0 -146
  124. package/lib/components/atoms/PrimaryButton.spec.js +0 -42
  125. package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +0 -69
  126. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +0 -69
  127. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +0 -59
  128. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +0 -170
  129. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +0 -199
  130. package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +0 -70
  131. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +0 -120
  132. package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +0 -8
  133. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +0 -31
  134. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +0 -52
  135. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +0 -90
  136. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +0 -29
  137. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +0 -38
  138. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +0 -16
  139. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +0 -107
  140. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +0 -24
  141. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.spec.js +0 -71
  142. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +0 -120
  143. package/lib/components/atoms/Switch/Switch.spec.js +0 -41
  144. package/lib/components/atoms/TextArea/CustomTextArea.spec.js +0 -52
  145. package/lib/components/atoms/TextArea/TextArea.helpers.spec.js +0 -25
  146. package/lib/components/atoms/TextArea/TextArea.spec.js +0 -126
  147. package/lib/components/atoms/ThirdButton.spec.js +0 -29
  148. package/lib/components/atoms/VideoModal/VideoModal.spec.js +0 -68
  149. package/lib/components/atoms/WithAppCfg.spec.js +0 -82
  150. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +0 -53
  151. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +0 -742
  152. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +0 -107
  153. package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +0 -256
  154. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +0 -175
  155. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +0 -318
  156. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +0 -50
  157. package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +0 -94
  158. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +0 -83
  159. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +0 -30
  160. package/lib/components/molecules/AgentInputBlock/index.js +0 -5
  161. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +0 -52
  162. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +0 -76
  163. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +0 -20
  164. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +0 -34
  165. package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +0 -36
  166. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +0 -66
  167. package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +0 -145
  168. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +0 -204
  169. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.spec.js +0 -622
  170. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +0 -264
  171. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +0 -86
  172. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +0 -104
  173. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +0 -742
  174. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +0 -541
  175. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +0 -46
  176. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +0 -1394
  177. package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +0 -1401
  178. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +0 -33
  179. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +0 -116
  180. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +0 -134
  181. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +0 -142
  182. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +0 -241
  183. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +0 -37
  184. package/lib/components/molecules/ChatAIModal/constants.spec.js +0 -16
  185. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +0 -22
  186. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +0 -67
  187. package/lib/components/molecules/ChatAIModal/layout.spec.js +0 -72
  188. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.spec.js +0 -93
  189. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +0 -297
  190. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.spec.js +0 -62
  191. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +0 -221
  192. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +0 -66
  193. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +0 -369
  194. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +0 -10
  195. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +0 -104
  196. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +0 -139
  197. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +0 -84
  198. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +0 -116
  199. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +0 -126
  200. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +0 -115
  201. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +0 -79
  202. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +0 -37
  203. package/lib/components/molecules/Sidebar/Sidebar.helpers.spec.js +0 -119
  204. package/lib/components/molecules/Sidebar/Sidebar.spec.js +0 -464
  205. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +0 -1067
  206. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +0 -1236
  207. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +0 -112
  208. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.spec.js +0 -77
  209. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +0 -503
  210. package/lib/components/organisms/ChatAI/ChatAI.spec.js +0 -174
  211. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +0 -525
  212. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +0 -246
  213. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +0 -16
  214. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +0 -253
  215. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +0 -139
  216. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +0 -13
  217. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +0 -275
  218. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +0 -275
  219. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +0 -195
  220. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +0 -94
  221. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +0 -69
  222. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +0 -38
  223. package/lib/components/organisms/ChatAIPage/getDaypart.js +0 -9
  224. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +0 -19
  225. package/lib/components/organisms/ChatAIPage/index.js +0 -3
  226. package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +0 -53
  227. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +0 -59
  228. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +0 -79
  229. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +0 -86
  230. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +0 -49
  231. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +0 -67
  232. package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +0 -117
  233. package/lib/components/organisms/SnackBar/Snackbar.spec.js +0 -66
  234. package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +0 -19
  235. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +0 -52
  236. package/lib/constants/formatExtensions.spec.js +0 -14
  237. package/lib/constants/maiaExternalConnectorsAccess.spec.js +0 -29
  238. package/lib/constants/maiaFeatureAccess.spec.js +0 -30
  239. package/lib/constants/maiaHourAgentAccess.spec.js +0 -30
  240. package/lib/constants/maiaTaskPanelAccess.spec.js +0 -41
  241. package/lib/constants/permissions/clientRoleAccess.spec.js +0 -65
  242. package/lib/constants/permissions/utils.spec.js +0 -128
  243. package/lib/constants/plannerSyncEvents.spec.js +0 -31
  244. package/lib/constants/taskUrls.spec.js +0 -9
  245. package/lib/dev/DevMaiaPage.js +0 -30
  246. package/lib/hooks/frequentlyUsedActionsCache.js +0 -17
  247. package/lib/hooks/frequentlyUsedActionsCache.spec.js +0 -25
  248. package/lib/hooks/useAccessClient/useAccessClient.spec.js +0 -149
  249. package/lib/hooks/useAgentModel/useAgentModel.spec.js +0 -83
  250. package/lib/hooks/useAgentModel/useCreateAgent.helpers.spec.js +0 -268
  251. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +0 -314
  252. package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +0 -183
  253. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +0 -374
  254. package/lib/hooks/useAgentSuggestions.spec.js +0 -89
  255. package/lib/hooks/useCaretPosition.spec.js +0 -58
  256. package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +0 -2027
  257. package/lib/hooks/useChatManager/useChatManager.spec.js +0 -2409
  258. package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +0 -491
  259. package/lib/hooks/useChatMessages/useChatMessages.spec.js +0 -729
  260. package/lib/hooks/useChats/useChats.spec.js +0 -208
  261. package/lib/hooks/useClientSearch.helpers.spec.js +0 -52
  262. package/lib/hooks/useClientSearch.spec.js +0 -86
  263. package/lib/hooks/useContextMentions.helpers.spec.js +0 -267
  264. package/lib/hooks/useContextMentions.spec.js +0 -338
  265. package/lib/hooks/useContextPinPopover.helpers.spec.js +0 -183
  266. package/lib/hooks/useContextPinPopover.spec.js +0 -159
  267. package/lib/hooks/useContinueLegacyContextInNewChat/index.js +0 -2
  268. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +0 -93
  269. package/lib/hooks/useDebounce.spec.js +0 -42
  270. package/lib/hooks/useEntitySearch.helpers.spec.js +0 -723
  271. package/lib/hooks/useEntitySearch.spec.js +0 -718
  272. package/lib/hooks/useEvent.spec.js +0 -45
  273. package/lib/hooks/useFrequentlyAskedQuestions.spec.js +0 -222
  274. package/lib/hooks/useFrequentlyUsedActions.spec.js +0 -135
  275. package/lib/hooks/useIsMaiaPageRoute.js +0 -26
  276. package/lib/hooks/useIsMaiaPageRoute.spec.js +0 -26
  277. package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +0 -122
  278. package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +0 -148
  279. package/lib/hooks/useKnowledge/saveKnowledge.spec.js +0 -104
  280. package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +0 -178
  281. package/lib/hooks/useMaiaChatSessionMeta/index.js +0 -2
  282. package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +0 -24
  283. package/lib/hooks/useMentionAllowedTypes.spec.js +0 -89
  284. package/lib/hooks/useMentionPopover.helpers.spec.js +0 -100
  285. package/lib/hooks/useMentionPopover.spec.js +0 -392
  286. package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +0 -176
  287. package/lib/hooks/useMinimizedPillBottomOffset.spec.js +0 -89
  288. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +0 -67
  289. package/lib/hooks/useModal/useModal.spec.js +0 -73
  290. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.spec.js +0 -138
  291. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +0 -417
  292. package/lib/hooks/useProjectSearch.helpers.spec.js +0 -89
  293. package/lib/hooks/useProjectSearch.spec.js +0 -91
  294. package/lib/hooks/useProjectSummary.spec.js +0 -193
  295. package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +0 -151
  296. package/lib/hooks/useProjectSummaryConfig.spec.js +0 -133
  297. package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +0 -112
  298. package/lib/hooks/useRecentClientsSearch.helpers.spec.js +0 -33
  299. package/lib/hooks/useRecentClientsSearch.spec.js +0 -85
  300. package/lib/hooks/useRecentContexts.spec.js +0 -139
  301. package/lib/hooks/useResize.spec.js +0 -37
  302. package/lib/hooks/useSkillsCatalog.spec.js +0 -88
  303. package/lib/hooks/useSlashCommands.spec.js +0 -139
  304. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +0 -101
  305. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +0 -33
  306. package/lib/hooks/useStreamResponse.spec.js +0 -199
  307. package/lib/hooks/useT.spec.js +0 -20
  308. package/lib/hooks/useToggle.spec.js +0 -33
  309. package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +0 -171
  310. package/lib/services/appcues.spec.js +0 -37
  311. package/lib/services/maia/Access/updateAccess.spec.js +0 -137
  312. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +0 -56
  313. package/lib/services/maia/Actions/getSlashCommands.spec.js +0 -91
  314. package/lib/services/maia/Agents/connectors.spec.js +0 -496
  315. package/lib/services/maia/Agents/createAgent.spec.js +0 -55
  316. package/lib/services/maia/Agents/deleteAgent.spec.js +0 -57
  317. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +0 -108
  318. package/lib/services/maia/Agents/getAgentById.spec.js +0 -190
  319. package/lib/services/maia/Agents/getAgentModels.spec.js +0 -190
  320. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +0 -89
  321. package/lib/services/maia/Agents/getAgents.helpers.spec.js +0 -325
  322. package/lib/services/maia/Agents/getAgents.spec.js +0 -1135
  323. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +0 -45
  324. package/lib/services/maia/Agents/toggleFavorite.spec.js +0 -59
  325. package/lib/services/maia/Agents/updateAgent.spec.js +0 -48
  326. package/lib/services/maia/Chats/deleteChat.spec.js +0 -31
  327. package/lib/services/maia/Chats/getChatMessages.spec.js +0 -150
  328. package/lib/services/maia/Chats/getChatsByUserId.spec.js +0 -149
  329. package/lib/services/maia/Chats/markSessionAsRead.spec.js +0 -30
  330. package/lib/services/maia/Chats/patchChat.spec.js +0 -41
  331. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +0 -28
  332. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +0 -58
  333. package/lib/services/maia/Knowledge/delete.spec.js +0 -45
  334. package/lib/services/maia/Knowledge/download.spec.js +0 -78
  335. package/lib/services/maia/Knowledge/save.spec.js +0 -58
  336. package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +0 -225
  337. package/lib/services/maia/Orchestrator/orchestrator.spec.js +0 -181
  338. package/lib/services/maia/RecentClients/getRecentClients.spec.js +0 -52
  339. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +0 -103
  340. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +0 -82
  341. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +0 -63
  342. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +0 -82
  343. package/lib/services/maia/Skills/createSkill.spec.js +0 -68
  344. package/lib/services/maia/Skills/deleteSkill.spec.js +0 -42
  345. package/lib/services/maia/Skills/generateSkill.spec.js +0 -48
  346. package/lib/services/maia/Skills/getSkills.spec.js +0 -152
  347. package/lib/services/maia/Skills/updateSkill.spec.js +0 -62
  348. package/lib/services/maia/client.spec.js +0 -56
  349. package/lib/services/utils/fetchCOR.spec.js +0 -211
  350. package/lib/services/utils/getCookie.spec.js +0 -20
  351. package/lib/services/utils/mapChatMessages.helpers.spec.js +0 -336
  352. package/lib/services/utils/mapChatMessages.spec.js +0 -254
  353. package/lib/store/chatsSidebarOptimistic.spec.js +0 -145
  354. package/lib/store/maiaLastChatPersistence.spec.js +0 -22
  355. package/lib/store/maiaPanelSessionPersistence.spec.js +0 -62
  356. package/lib/store/sessions/sessionNotificationSound.spec.js +0 -145
  357. package/lib/store/sessions/sessionNotifications.helpers.spec.js +0 -63
  358. package/lib/store/sessions/sessionNotifications.spec.js +0 -106
  359. package/lib/store/sessions/sessionStreamManager.helpers.spec.js +0 -177
  360. package/lib/store/sessions/sessionStreamManager.spec.js +0 -939
  361. package/lib/store/sessions/sessions.types.spec.js +0 -16
  362. package/lib/store/sessions/useSessionsStore.spec.js +0 -135
  363. package/lib/store/useChatsStore.spec.js +0 -619
  364. package/lib/store/useFaqsStore.spec.js +0 -57
  365. package/lib/utils/actionCategoryMap.spec.js +0 -18
  366. package/lib/utils/agentDisplayName.spec.js +0 -48
  367. package/lib/utils/autoApproveStorage.spec.js +0 -25
  368. package/lib/utils/chatInputFiles.spec.js +0 -39
  369. package/lib/utils/contextMentionIcons.spec.js +0 -41
  370. package/lib/utils/contextMentionLabel.spec.js +0 -13
  371. package/lib/utils/contextMentionTriggers.spec.js +0 -44
  372. package/lib/utils/contextMentionTypeLabel.spec.js +0 -14
  373. package/lib/utils/corConnectorMentionTypes.spec.js +0 -23
  374. package/lib/utils/entityLinkRender.spec.js +0 -72
  375. package/lib/utils/fileDownloadHelper.spec.js +0 -67
  376. package/lib/utils/formatQuickActionMessage.spec.js +0 -27
  377. package/lib/utils/formatUnreadCount.spec.js +0 -12
  378. package/lib/utils/getUnitFileSize.spec.js +0 -18
  379. package/lib/utils/hitlAnalytics.spec.js +0 -136
  380. package/lib/utils/hoursPlannerQuickActionType.spec.js +0 -64
  381. package/lib/utils/imagePreprocessor.helpers.spec.js +0 -28
  382. package/lib/utils/imagePreprocessor.spec.js +0 -112
  383. package/lib/utils/maiaPageRoute.js +0 -24
  384. package/lib/utils/maiaPageRoute.spec.js +0 -23
  385. package/lib/utils/mapBackendLang.spec.js +0 -19
  386. package/lib/utils/navigateContextEntity.spec.js +0 -50
  387. package/lib/utils/normalizeAgentConnectors.spec.js +0 -98
  388. package/lib/utils/openTaskInCorPanel.spec.js +0 -43
  389. package/lib/utils/orchestratorSubagents.spec.js +0 -32
  390. package/lib/utils/reasoningMappers.spec.js +0 -103
  391. package/lib/utils/recentContextsHomeLimit.spec.js +0 -32
  392. package/lib/utils/renderContextMentions.helpers.spec.js +0 -87
  393. package/lib/utils/renderContextMentions.spec.js +0 -268
  394. package/lib/utils/retryCompletion.spec.js +0 -181
  395. package/lib/utils/skillContentSize.spec.js +0 -13
  396. package/lib/utils/slashCommandMarker.spec.js +0 -43
  397. package/lib/utils/sortManagerHoursHomeFuas.spec.js +0 -51
  398. package/lib/utils/sseStreamContent.spec.js +0 -31
  399. package/lib/utils/streamActivityMessages.helpers.spec.js +0 -84
  400. package/lib/utils/streamActivityMessages.spec.js +0 -336
  401. package/lib/utils/validateTrimmedFields.spec.js +0 -26
@@ -1,1394 +0,0 @@
1
- import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
- import _regeneratorRuntime from "@babel/runtime/regenerator";
4
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
5
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
6
- import { CORUserRole } from '../../../context/cor-user';
7
- import { options } from './constants';
8
- import { clampFloatingPanelPosition, dispatchSkillMentionInsert, ensureAgentsBeforeSkillUse, getMaiaHostPanelPresentation, hasAnyActiveSessionInMeta, isBannerFaqReadyToAutoSend, isLegacyContextEntity, resolveAiChatBackDestination, resolveComputedCurrentOption, resolveDefaultFloatingPanelPosition, resolveInitialCurrentOption, resolveLegacyContextSession, resolveSidebarAgentsNavActive, shouldRestoreExpandedPanel, shouldSkipFloatingDragTarget, validateAccessByFeature, resolveHostTakeoverEntityState, buildHostTakeoverPersistContext, buildMaiaPanelSessionPatch, resolveFloatingPanelDragPosition, resolveHostTakeoverAgentId, resolveMaiaModalI18nLang, resolveMinimizedRestoreTarget, resolveNextDragPosition, resolveUserHasAgentManagementPermissions, shouldBackClearPinnedContext, shouldBackStartNewChatPreservingContext, shouldMarkOrchestratorContextReset, shouldStartNewChatFromCatalog, resolveHasPinnedContext, resolveOrchestratorHomeNavFlags, shouldShowOrchestratorBackButton, shouldClearClientOnGoHomeFromChat, shouldResetAgentToFirstOnGoHome, shouldUseActiveChatSendHandler, buildLegacyContextMigrationPatch, findOrchestratorAgent, buildLegacyContextAgent, shouldMarkAgentAsLegacyContext, canOpenMaiaMarketplace, shouldSetChatViewHiddenOnMount, shouldPersistLastActiveChatId, hasBannerFaqTitle, shouldSyncPanelSessionOnPageHide, resolveCachedAgentsIfAvailable, shouldAttemptInitialAgentsFetch, findAgentForChatItem, shouldApplyClientOnHostTakeover, shouldSelectFirstAgentOnHostTakeover, shouldResetChatStateOnGoHome, shouldClearContextForCatalogOrSkillAgent, resolveOpenNewChatWithAgentContext, canContinueLegacyContextInNewChat, resolveSessionRestoreNavRoute, shouldSkipAgentsLoadOnSessionRestore, shouldFetchAgentDetailOnSessionRestore, shouldPassAgentToGetAgentsOnRestore, shouldSelectFetchedAgentAfterRestore, resolveSnapshotChipsProject, resolveChatModalSectionFlags, shouldRenderChatSidebar, resolveChatModalMainContentView, shouldShowChatModalFooter, shouldUseElevatedMaiaPanel, shouldReselectAgentAfterDelete, shouldClearDragPositionOnLayoutChange, shouldPersistDragPositionOnDragEnd, shouldStartFloatingPanelDrag, isActiveFloatingDragPointer, shouldOpenSkillsCatalog, shouldUseDragClampFallback, resolveLayoutDragPositionUpdate, resolvePersistedDragPositionOnEnd, buildUserInitialMessageFromStartChat, shouldResetSidebarErrorOnStartChat, shouldClearTaskOnGoHomeFromChat, shouldClearOrchestratorGlobalContextOnGoHome, shouldPrefetchAgentsForCatalogNewChat, isGlobalMaiaSection } from './ChatAIModal.helpers';
9
- var baseUser = {
10
- id: 1,
11
- company_id: 10,
12
- role_id: CORUserRole.PROJECT_MANAGER
13
- };
14
- var orchestratorAgent = {
15
- id: '1',
16
- name: 'MAIA',
17
- type: 'orchestrator',
18
- entity: 'global'
19
- };
20
- var agent = function agent(id) {
21
- return {
22
- id: id,
23
- name: "Agent ".concat(id),
24
- type: 'custom'
25
- };
26
- };
27
- describe('ChatAIModal.helpers', function () {
28
- var originalChatAccess = window.MAIA_CHAT_AI_FEATURE_ACCESS;
29
- var originalMultiAgents = window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
30
- var originalSkillsAccess = window.MAIA_SKILLS_ACCESS;
31
- var originalProjectSummary = window.MAIA_PROJECT_SUMMARY_FEATURE_ACCESS;
32
- afterEach(function () {
33
- window.MAIA_CHAT_AI_FEATURE_ACCESS = originalChatAccess;
34
- window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = originalMultiAgents;
35
- window.MAIA_SKILLS_ACCESS = originalSkillsAccess;
36
- window.MAIA_PROJECT_SUMMARY_FEATURE_ACCESS = originalProjectSummary;
37
- });
38
- describe('resolveAiChatBackDestination', function () {
39
- it('returns global home for orchestrator on header home', function () {
40
- expect(resolveAiChatBackDestination('header', 'orchestrator', options.home, options.home)).toBe('global_context_home');
41
- });
42
- it('maps section-specific homes', function () {
43
- expect(resolveAiChatBackDestination('task', 'orchestrator', options.chat, options.home)).toBe('task_home');
44
- expect(resolveAiChatBackDestination('planner', 'clone', options.chat, options.home)).toBe('planner_home');
45
- expect(resolveAiChatBackDestination('project', 'clone', options.chat, options.home)).toBe('project_home');
46
- expect(resolveAiChatBackDestination('client', 'clone', options.chat, options.home)).toBe('client_home');
47
- });
48
- it('falls back to global home for unsupported combinations', function () {
49
- expect(resolveAiChatBackDestination('header', 'custom', options.chat, options.chat)).toBe('global_context_home');
50
- });
51
- });
52
- describe('validateAccessByFeature', function () {
53
- it('denies access without section or chat permission', function () {
54
- window.MAIA_CHAT_AI_FEATURE_ACCESS = true;
55
- expect(validateAccessByFeature(null, baseUser)).toBe(false);
56
- expect(validateAccessByFeature('header', _objectSpread(_objectSpread({}, baseUser), {}, {
57
- role_id: CORUserRole.CLIENT
58
- }))).toBe(false);
59
- });
60
- it('allows task and planner when chat AI is enabled for the user', function () {
61
- window.MAIA_CHAT_AI_FEATURE_ACCESS = false;
62
- window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = false;
63
- window.MAIA_PROJECT_SUMMARY_FEATURE_ACCESS = true;
64
- expect(validateAccessByFeature('task', baseUser)).toBe(true);
65
- expect(validateAccessByFeature('planner', baseUser)).toBe(true);
66
- });
67
- it('requires chat flags for header and project sections', function () {
68
- window.MAIA_CHAT_AI_FEATURE_ACCESS = false;
69
- window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = false;
70
- expect(validateAccessByFeature('header', baseUser)).toBe(false);
71
- expect(validateAccessByFeature('project', baseUser)).toBe(false);
72
- window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = true;
73
- expect(validateAccessByFeature('header', baseUser)).toBe(true);
74
- window.MAIA_CHAT_AI_FEATURE_ACCESS = true;
75
- window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS = false;
76
- expect(validateAccessByFeature('project', baseUser)).toBe(true);
77
- });
78
- });
79
- describe('resolveComputedCurrentOption', function () {
80
- it('falls back to the current option when myAgents is unavailable', function () {
81
- expect(resolveComputedCurrentOption({
82
- currentOption: options.myAgents,
83
- agent: orchestratorAgent,
84
- project: null,
85
- client: null,
86
- user: baseUser,
87
- multiAgentsAccess: false
88
- })).toBe(options.myAgents);
89
- });
90
- it('keeps myAgents and mySkills when feature access allows', function () {
91
- window.MAIA_SKILLS_ACCESS = true;
92
- expect(resolveComputedCurrentOption({
93
- currentOption: options.myAgents,
94
- agent: orchestratorAgent,
95
- project: null,
96
- client: null,
97
- user: baseUser,
98
- multiAgentsAccess: true
99
- })).toBe(options.myAgents);
100
- expect(resolveComputedCurrentOption({
101
- currentOption: options.mySkills,
102
- agent: orchestratorAgent,
103
- project: null,
104
- client: null,
105
- user: baseUser,
106
- multiAgentsAccess: false
107
- })).toBe(options.mySkills);
108
- });
109
- it('redirects non-orchestrator global specialists from home to chat', function () {
110
- var globalClone = {
111
- id: '2',
112
- name: 'Sales Bot',
113
- type: 'clone',
114
- entity: 'global'
115
- };
116
- expect(resolveComputedCurrentOption({
117
- currentOption: options.home,
118
- agent: globalClone,
119
- project: null,
120
- client: null,
121
- user: baseUser,
122
- multiAgentsAccess: false
123
- })).toBe(options.chat);
124
- });
125
- it('keeps chat option when project or client context is already set', function () {
126
- var projectAgent = {
127
- id: '3',
128
- name: 'Proj',
129
- type: 'clone',
130
- entity: 'project'
131
- };
132
- var clientAgent = {
133
- id: '4',
134
- name: 'Client',
135
- type: 'clone',
136
- entity: 'client'
137
- };
138
- expect(resolveComputedCurrentOption({
139
- currentOption: options.home,
140
- agent: projectAgent,
141
- project: {
142
- id: 10,
143
- name: 'Alpha'
144
- },
145
- client: null,
146
- user: baseUser,
147
- multiAgentsAccess: false
148
- })).toBe(options.home);
149
- expect(resolveComputedCurrentOption({
150
- currentOption: options.home,
151
- agent: clientAgent,
152
- project: null,
153
- client: {
154
- id: 5,
155
- name: 'Beta'
156
- },
157
- user: baseUser,
158
- multiAgentsAccess: false
159
- })).toBe(options.home);
160
- });
161
- it('does not redirect orchestrator global clones from home', function () {
162
- var orchestratorGlobal = {
163
- id: '1',
164
- name: 'MAIA',
165
- type: 'orchestrator',
166
- entity: 'global'
167
- };
168
- expect(resolveComputedCurrentOption({
169
- currentOption: options.home,
170
- agent: orchestratorGlobal,
171
- project: null,
172
- client: null,
173
- user: baseUser,
174
- multiAgentsAccess: false
175
- })).toBe(options.home);
176
- });
177
- it('shows project and client selectors when context is missing', function () {
178
- var projectAgent = {
179
- id: '3',
180
- name: 'Proj',
181
- type: 'clone',
182
- entity: 'project'
183
- };
184
- var clientAgent = {
185
- id: '4',
186
- name: 'Client',
187
- type: 'clone',
188
- entity: 'client'
189
- };
190
- expect(resolveComputedCurrentOption({
191
- currentOption: options.home,
192
- agent: projectAgent,
193
- project: null,
194
- client: null,
195
- user: baseUser,
196
- multiAgentsAccess: false
197
- })).toBe(options.projectSelector);
198
- expect(resolveComputedCurrentOption({
199
- currentOption: options.home,
200
- agent: clientAgent,
201
- project: null,
202
- client: null,
203
- user: baseUser,
204
- multiAgentsAccess: false
205
- })).toBe(options.clientSelector);
206
- });
207
- });
208
- describe('resolveSidebarAgentsNavActive', function () {
209
- it('maps computed options and maiaker selection', function () {
210
- expect(resolveSidebarAgentsNavActive(options.mySkills, false)).toBe('mySkills');
211
- expect(resolveSidebarAgentsNavActive(options.myAgents, false)).toBe('myAgents');
212
- expect(resolveSidebarAgentsNavActive(options.home, true)).toBe('maiaker');
213
- expect(resolveSidebarAgentsNavActive(options.chat, false)).toBeNull();
214
- });
215
- });
216
- describe('resolveInitialCurrentOption', function () {
217
- it('restores saved nav and validates saved option', function () {
218
- window.MAIA_SKILLS_ACCESS = true;
219
- expect(resolveInitialCurrentOption('myAgents', null, baseUser)).toBe(options.myAgents);
220
- expect(resolveInitialCurrentOption('mySkills', null, baseUser)).toBe(options.mySkills);
221
- expect(resolveInitialCurrentOption(null, 'chat', baseUser)).toBe(options.chat);
222
- expect(resolveInitialCurrentOption(null, 'invalid', baseUser)).toBe(options.home);
223
- });
224
- it('ignores saved mySkills when the user lacks skills access', function () {
225
- window.MAIA_SKILLS_ACCESS = false;
226
- expect(resolveInitialCurrentOption('mySkills', null, baseUser)).toBe(options.home);
227
- });
228
- });
229
- describe('clampFloatingPanelPosition', function () {
230
- it('keeps the panel inside the viewport with padding', function () {
231
- expect(clampFloatingPanelPosition(0, 0, 400, 600, 1200, 800)).toEqual({
232
- x: 16,
233
- y: 16
234
- });
235
- expect(clampFloatingPanelPosition(2000, 2000, 400, 600, 1200, 800)).toEqual({
236
- x: 784,
237
- y: 184
238
- });
239
- });
240
- });
241
- describe('resolveLegacyContextSession', function () {
242
- it('returns legacy clone context only on chat view', function () {
243
- expect(resolveLegacyContextSession(options.chat, options.chat, {
244
- agentType: 'clone',
245
- agentEntity: 'project',
246
- projectName: 'Alpha'
247
- })).toEqual({
248
- entityType: 'project',
249
- contextName: 'Alpha'
250
- });
251
- expect(resolveLegacyContextSession(options.home, options.chat, {
252
- agentType: 'clone',
253
- agentEntity: 'project',
254
- projectName: 'Alpha'
255
- })).toBeNull();
256
- });
257
- it('maps task and client names and ignores invalid entities', function () {
258
- expect(resolveLegacyContextSession(options.chat, options.chat, {
259
- agentType: 'clone',
260
- agentEntity: 'task'
261
- })).toEqual({
262
- entityType: 'task',
263
- contextName: ''
264
- });
265
- expect(resolveLegacyContextSession(options.chat, options.chat, {
266
- agentType: 'clone',
267
- agentEntity: 'task',
268
- taskName: 'Bugfix'
269
- })).toEqual({
270
- entityType: 'task',
271
- contextName: 'Bugfix'
272
- });
273
- expect(resolveLegacyContextSession(options.chat, options.chat, {
274
- agentType: 'clone',
275
- agentEntity: 'client',
276
- clientName: 'Acme'
277
- })).toEqual({
278
- entityType: 'client',
279
- contextName: 'Acme'
280
- });
281
- expect(resolveLegacyContextSession(options.chat, options.chat, {
282
- agentType: 'clone',
283
- agentEntity: 'global',
284
- projectName: 'Ignored'
285
- })).toBeNull();
286
- });
287
- });
288
- describe('hasAnyActiveSessionInMeta', function () {
289
- it('detects thinking, writing and approval sessions', function () {
290
- expect(hasAnyActiveSessionInMeta({
291
- a: {
292
- status: 'thinking'
293
- },
294
- b: {
295
- status: 'complete'
296
- }
297
- })).toBe(true);
298
- expect(hasAnyActiveSessionInMeta({
299
- a: {
300
- status: 'complete'
301
- }
302
- })).toBe(false);
303
- });
304
- });
305
- describe('panel restore and floating helpers', function () {
306
- it('restores expanded panels from saved session snapshots', function () {
307
- expect(shouldRestoreExpandedPanel({
308
- isExpanded: true
309
- })).toBe(true);
310
- expect(shouldRestoreExpandedPanel({
311
- isExpanded: false
312
- })).toBe(false);
313
- expect(shouldRestoreExpandedPanel(undefined)).toBe(false);
314
- });
315
- it('anchors the default floating panel to the bottom-right corner', function () {
316
- expect(resolveDefaultFloatingPanelPosition(1200, 480)).toEqual({
317
- x: 704,
318
- y: 16
319
- });
320
- });
321
- it('skips drag on interactive targets', function () {
322
- var button = document.createElement('button');
323
- expect(shouldSkipFloatingDragTarget(button)).toBe(true);
324
- expect(shouldSkipFloatingDragTarget(document.createElement('div'))).toBe(false);
325
- });
326
- });
327
- describe('isBannerFaqReadyToAutoSend', function () {
328
- it('blocks auto send when the FAQ is empty or already sent', function () {
329
- expect(isBannerFaqReadyToAutoSend({
330
- faqTitle: ' ',
331
- alreadySent: false,
332
- loading: false,
333
- agentId: '1',
334
- section: 'header'
335
- })).toBe(false);
336
- expect(isBannerFaqReadyToAutoSend({
337
- faqTitle: 'Pregunta',
338
- alreadySent: true,
339
- loading: false,
340
- agentId: '1',
341
- section: 'header'
342
- })).toBe(false);
343
- });
344
- it('waits for project and client context before auto sending', function () {
345
- expect(isBannerFaqReadyToAutoSend({
346
- faqTitle: 'Resumí el proyecto',
347
- alreadySent: false,
348
- loading: false,
349
- agentId: '1',
350
- section: 'project',
351
- projectId: null
352
- })).toBe(false);
353
- expect(isBannerFaqReadyToAutoSend({
354
- faqTitle: 'Resumí el proyecto',
355
- alreadySent: false,
356
- loading: false,
357
- agentId: '1',
358
- section: 'project',
359
- projectId: 42
360
- })).toBe(true);
361
- });
362
- it('requires client context for client sections and allows header FAQs', function () {
363
- expect(isBannerFaqReadyToAutoSend({
364
- faqTitle: 'Pregunta',
365
- alreadySent: false,
366
- loading: false,
367
- agentId: '1',
368
- section: 'client',
369
- clientId: null
370
- })).toBe(false);
371
- expect(isBannerFaqReadyToAutoSend({
372
- faqTitle: 'Pregunta',
373
- alreadySent: false,
374
- loading: false,
375
- agentId: '1',
376
- section: 'client',
377
- clientId: 9
378
- })).toBe(true);
379
- expect(isBannerFaqReadyToAutoSend({
380
- faqTitle: 'Pregunta',
381
- alreadySent: false,
382
- loading: false,
383
- agentId: '1',
384
- section: 'header'
385
- })).toBe(true);
386
- });
387
- });
388
- describe('isLegacyContextEntity', function () {
389
- it('accepts only project, task and client entities', function () {
390
- expect(isLegacyContextEntity('project')).toBe(true);
391
- expect(isLegacyContextEntity('global')).toBe(false);
392
- });
393
- });
394
- describe('getMaiaHostPanelPresentation', function () {
395
- it('hides expanded panel on maia page route without showing the pill', function () {
396
- expect(getMaiaHostPanelPresentation(false, true)).toEqual({
397
- hidePanelContent: true,
398
- showMinimizedPill: false
399
- });
400
- });
401
- it('keeps the panel visible on other routes when expanded', function () {
402
- expect(getMaiaHostPanelPresentation(false, false)).toEqual({
403
- hidePanelContent: false,
404
- showMinimizedPill: false
405
- });
406
- });
407
- it('shows the pill only when minimized outside maia page', function () {
408
- expect(getMaiaHostPanelPresentation(true, false)).toEqual({
409
- hidePanelContent: true,
410
- showMinimizedPill: true
411
- });
412
- expect(getMaiaHostPanelPresentation(true, true)).toEqual({
413
- hidePanelContent: true,
414
- showMinimizedPill: false
415
- });
416
- });
417
- });
418
- describe('ensureAgentsBeforeSkillUse', function () {
419
- it('returns undefined when useFirstAgent is false', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
420
- var ensureAgentsLoaded;
421
- return _regeneratorRuntime.wrap(function (_context) {
422
- while (1) switch (_context.prev = _context.next) {
423
- case 0:
424
- ensureAgentsLoaded = jest.fn().mockResolvedValue([agent('a1')]);
425
- _context.next = 1;
426
- return expect(ensureAgentsBeforeSkillUse({
427
- useFirstAgent: false,
428
- agents: [],
429
- ensureAgentsLoaded: ensureAgentsLoaded
430
- })).resolves.toBeUndefined();
431
- case 1:
432
- expect(ensureAgentsLoaded).not.toHaveBeenCalled();
433
- case 2:
434
- case "end":
435
- return _context.stop();
436
- }
437
- }, _callee);
438
- })));
439
- it('uses the in-memory agents list when it is already populated', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
440
- var ensureAgentsLoaded;
441
- return _regeneratorRuntime.wrap(function (_context2) {
442
- while (1) switch (_context2.prev = _context2.next) {
443
- case 0:
444
- ensureAgentsLoaded = jest.fn().mockResolvedValue([agent('a2')]);
445
- _context2.next = 1;
446
- return expect(ensureAgentsBeforeSkillUse({
447
- useFirstAgent: true,
448
- agents: [agent('a1')],
449
- ensureAgentsLoaded: ensureAgentsLoaded
450
- })).resolves.toEqual(agent('a1'));
451
- case 1:
452
- expect(ensureAgentsLoaded).not.toHaveBeenCalled();
453
- case 2:
454
- case "end":
455
- return _context2.stop();
456
- }
457
- }, _callee2);
458
- })));
459
- it('loads agents when the list is empty', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
460
- var ensureAgentsLoaded;
461
- return _regeneratorRuntime.wrap(function (_context3) {
462
- while (1) switch (_context3.prev = _context3.next) {
463
- case 0:
464
- ensureAgentsLoaded = jest.fn().mockResolvedValue([agent('a1'), agent('a2')]);
465
- _context3.next = 1;
466
- return expect(ensureAgentsBeforeSkillUse({
467
- useFirstAgent: true,
468
- agents: [],
469
- ensureAgentsLoaded: ensureAgentsLoaded
470
- })).resolves.toEqual(agent('a1'));
471
- case 1:
472
- expect(ensureAgentsLoaded).toHaveBeenCalledTimes(1);
473
- case 2:
474
- case "end":
475
- return _context3.stop();
476
- }
477
- }, _callee3);
478
- })));
479
- it('returns undefined when agents cannot be loaded', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
480
- var ensureAgentsLoaded;
481
- return _regeneratorRuntime.wrap(function (_context4) {
482
- while (1) switch (_context4.prev = _context4.next) {
483
- case 0:
484
- ensureAgentsLoaded = jest.fn().mockResolvedValue([]);
485
- _context4.next = 1;
486
- return expect(ensureAgentsBeforeSkillUse({
487
- useFirstAgent: true,
488
- agents: [],
489
- ensureAgentsLoaded: ensureAgentsLoaded
490
- })).resolves.toBeUndefined();
491
- case 1:
492
- case "end":
493
- return _context4.stop();
494
- }
495
- }, _callee4);
496
- })));
497
- });
498
- describe('host takeover context helpers', function () {
499
- it('maps project/task sections to project and task entities', function () {
500
- var project = {
501
- id: 1,
502
- name: 'Alpha'
503
- };
504
- var task = {
505
- id: 9,
506
- name: 'Bug'
507
- };
508
- expect(resolveHostTakeoverEntityState({
509
- section: 'task',
510
- project: project,
511
- task: task
512
- })).toMatchObject({
513
- project: project,
514
- task: task,
515
- clearGlobalPinnedContext: false
516
- });
517
- expect(resolveHostTakeoverEntityState({
518
- section: 'task',
519
- project: project,
520
- task: task
521
- }).client).toBeUndefined();
522
- });
523
- it('clears client on header/planner takeover and sets client on client section', function () {
524
- var client = {
525
- id: 2,
526
- name: 'Acme'
527
- };
528
- expect(resolveHostTakeoverEntityState({
529
- section: 'header'
530
- })).toMatchObject({
531
- project: null,
532
- client: null,
533
- task: null,
534
- clearGlobalPinnedContext: true
535
- });
536
- expect(resolveHostTakeoverEntityState({
537
- section: 'client',
538
- client: client
539
- })).toMatchObject({
540
- project: null,
541
- client: client,
542
- clearGlobalPinnedContext: false
543
- });
544
- });
545
- it('builds persist host context for panel session patch', function () {
546
- var project = {
547
- id: 3,
548
- name: 'Beta'
549
- };
550
- expect(buildHostTakeoverPersistContext({
551
- section: 'project',
552
- project: project
553
- })).toEqual({
554
- section: 'project',
555
- project: project,
556
- client: null,
557
- task: null,
558
- chipsProject: null
559
- });
560
- });
561
- it('defaults missing project, client and task entities on takeover', function () {
562
- expect(resolveHostTakeoverEntityState({
563
- section: 'project'
564
- })).toMatchObject({
565
- project: null,
566
- task: null
567
- });
568
- expect(resolveHostTakeoverEntityState({
569
- section: 'client'
570
- })).toMatchObject({
571
- client: null
572
- });
573
- expect(resolveHostTakeoverEntityState({
574
- section: 'task',
575
- project: {
576
- id: 1
577
- }
578
- })).toMatchObject({
579
- task: null
580
- });
581
- expect(buildHostTakeoverPersistContext({
582
- section: 'planner'
583
- })).toMatchObject({
584
- project: null,
585
- client: null,
586
- task: null
587
- });
588
- expect(buildHostTakeoverPersistContext({
589
- section: 'client'
590
- })).toMatchObject({
591
- client: null
592
- });
593
- expect(buildHostTakeoverPersistContext({
594
- section: 'client',
595
- client: {
596
- id: 9,
597
- name: 'Client'
598
- }
599
- }).client).toEqual({
600
- id: 9,
601
- name: 'Client'
602
- });
603
- expect(buildHostTakeoverPersistContext({
604
- section: 'task',
605
- task: {
606
- id: 1,
607
- name: 'T'
608
- }
609
- }).task).toEqual({
610
- id: 1,
611
- name: 'T'
612
- });
613
- var project = {
614
- id: 4,
615
- name: 'P'
616
- };
617
- expect(buildHostTakeoverPersistContext({
618
- section: 'task',
619
- project: project,
620
- task: {
621
- id: 1,
622
- name: 'T'
623
- }
624
- })).toMatchObject({
625
- project: project,
626
- task: {
627
- id: 1,
628
- name: 'T'
629
- }
630
- });
631
- });
632
- });
633
- describe('modal navigation and session helpers', function () {
634
- it('normalizes br to pt-br for modal i18n', function () {
635
- expect(resolveMaiaModalI18nLang('br')).toBe('pt-br');
636
- expect(resolveMaiaModalI18nLang('es')).toBe('es');
637
- });
638
- it('checks agent management permissions with multi-agents flag', function () {
639
- expect(resolveUserHasAgentManagementPermissions({
640
- ai_agents: {
641
- create: true
642
- }
643
- }, true)).toBe(true);
644
- expect(resolveUserHasAgentManagementPermissions({
645
- ai_agents: {
646
- edit: true
647
- }
648
- }, true)).toBe(true);
649
- expect(resolveUserHasAgentManagementPermissions({
650
- ai_agents: {
651
- "delete": true
652
- }
653
- }, true)).toBe(true);
654
- expect(resolveUserHasAgentManagementPermissions({
655
- ai_agents: {
656
- create: true
657
- }
658
- }, false)).toBe(false);
659
- });
660
- it('decides when to start a new chat from catalog views', function () {
661
- expect(shouldStartNewChatFromCatalog(options.myAgents, false)).toBe(true);
662
- expect(shouldStartNewChatFromCatalog(options.home, true)).toBe(true);
663
- expect(shouldStartNewChatFromCatalog(options.home, false)).toBe(false);
664
- });
665
- it('handles back navigation branches', function () {
666
- expect(shouldBackStartNewChatPreservingContext(options.chat, options.chat)).toBe(true);
667
- expect(shouldBackClearPinnedContext(options.home, options.home, 'header', false)).toBe(true);
668
- expect(shouldBackClearPinnedContext(options.home, options.home, 'project', false)).toBe(false);
669
- });
670
- it('marks orchestrator context reset on pinned-to-empty transition', function () {
671
- expect(shouldMarkOrchestratorContextReset('project', 'orchestrator', true, false)).toBe(true);
672
- expect(shouldMarkOrchestratorContextReset('header', 'orchestrator', true, false)).toBe(false);
673
- });
674
- it('prefers unread chats when restoring from minimized', function () {
675
- var _resolveMinimizedRest, _resolveMinimizedRest2;
676
- var chats = [{
677
- sessionExternalId: 's1',
678
- isRead: true
679
- }, {
680
- sessionExternalId: 's2',
681
- isRead: false
682
- }];
683
- expect((_resolveMinimizedRest = resolveMinimizedRestoreTarget(chats, 's1')) === null || _resolveMinimizedRest === void 0 ? void 0 : _resolveMinimizedRest.sessionExternalId).toBe('s2');
684
- expect((_resolveMinimizedRest2 = resolveMinimizedRestoreTarget([{
685
- sessionExternalId: 's1',
686
- isRead: true
687
- }], 's1')) === null || _resolveMinimizedRest2 === void 0 ? void 0 : _resolveMinimizedRest2.sessionExternalId).toBe('s1');
688
- expect(resolveMinimizedRestoreTarget([{
689
- sessionExternalId: 's1',
690
- isRead: true
691
- }], undefined)).toBeUndefined();
692
- });
693
- it('resolves host takeover agent id', function () {
694
- expect(resolveHostTakeoverAgentId(false, [agent('a1')], 'current')).toBe('current');
695
- expect(resolveHostTakeoverAgentId(false, [agent('a1')], undefined)).toBeNull();
696
- expect(resolveHostTakeoverAgentId(true, [agent('a1')], 'current')).toBe('a1');
697
- expect(resolveHostTakeoverAgentId(true, [], 'current')).toBeNull();
698
- });
699
- it('builds panel session patch only when expanded', function () {
700
- expect(buildMaiaPanelSessionPatch({
701
- isMinimized: true,
702
- currentOption: options.home,
703
- agentsNavActive: null,
704
- activeChatId: null,
705
- agentId: null,
706
- sidebarOpen: false,
707
- layoutMode: 'floating',
708
- dragPosition: {
709
- x: 1,
710
- y: 2
711
- },
712
- hostContext: {
713
- section: 'header',
714
- project: null,
715
- client: null,
716
- task: null,
717
- chipsProject: null
718
- }
719
- })).toBeNull();
720
- expect(buildMaiaPanelSessionPatch({
721
- isMinimized: false,
722
- currentOption: options.chat,
723
- agentsNavActive: 'myAgents',
724
- activeChatId: 'chat-1',
725
- agentId: '1',
726
- sidebarOpen: true,
727
- layoutMode: 'sidebar',
728
- dragPosition: {
729
- x: 1,
730
- y: 2
731
- },
732
- hostContext: {
733
- section: 'header',
734
- project: null,
735
- client: null,
736
- task: null,
737
- chipsProject: null
738
- }
739
- })).toMatchObject({
740
- activeChatId: 'chat-1',
741
- dragPosition: null
742
- });
743
- expect(buildMaiaPanelSessionPatch({
744
- isMinimized: false,
745
- currentOption: options.chat,
746
- agentsNavActive: null,
747
- activeChatId: 'chat-1',
748
- agentId: '1',
749
- sidebarOpen: false,
750
- layoutMode: 'floating',
751
- dragPosition: {
752
- x: 3,
753
- y: 4
754
- },
755
- hostContext: {
756
- section: 'header',
757
- project: null,
758
- client: null,
759
- task: null,
760
- chipsProject: null
761
- }
762
- })).toMatchObject({
763
- dragPosition: {
764
- x: 3,
765
- y: 4
766
- }
767
- });
768
- });
769
- it('resolves floating drag position with clamp fallback', function () {
770
- var clamp = function clamp(x, y) {
771
- return {
772
- x: x,
773
- y: y
774
- };
775
- };
776
- expect(resolveFloatingPanelDragPosition({
777
- layoutMode: 'sidebar',
778
- dragPosition: {
779
- x: 5,
780
- y: 6
781
- },
782
- viewportWidth: 1200,
783
- panelWidth: 400,
784
- clamp: clamp
785
- })).toEqual({
786
- x: 5,
787
- y: 6
788
- });
789
- expect(resolveFloatingPanelDragPosition({
790
- layoutMode: 'floating',
791
- dragPosition: null,
792
- viewportWidth: 1200,
793
- panelWidth: 400,
794
- clamp: clamp
795
- })).toEqual({
796
- x: 784,
797
- y: 16
798
- });
799
- expect(resolveFloatingPanelDragPosition({
800
- layoutMode: 'floating',
801
- dragPosition: {
802
- x: 40,
803
- y: 50
804
- },
805
- viewportWidth: 1200,
806
- panelWidth: 400,
807
- clamp: clamp
808
- })).toEqual({
809
- x: 40,
810
- y: 50
811
- });
812
- });
813
- it('reuses previous drag position when unchanged', function () {
814
- var prev = {
815
- x: 10,
816
- y: 20
817
- };
818
- expect(resolveNextDragPosition(prev, {
819
- x: 10,
820
- y: 20
821
- })).toBe(prev);
822
- expect(resolveNextDragPosition(prev, {
823
- x: 11,
824
- y: 20
825
- })).toEqual({
826
- x: 11,
827
- y: 20
828
- });
829
- });
830
- });
831
- describe('navigation and legacy context helpers', function () {
832
- it('resolves pinned context and back button visibility', function () {
833
- expect(resolveHasPinnedContext({
834
- taskId: 1
835
- })).toBe(true);
836
- expect(resolveHasPinnedContext({})).toBe(false);
837
- var flags = resolveOrchestratorHomeNavFlags({
838
- computedCurrentOption: options.chat,
839
- homeOption: options.home,
840
- chatOption: options.chat,
841
- hasPinnedContext: true,
842
- section: 'header',
843
- didResetContextInSection: false
844
- });
845
- expect(flags.isChatView).toBe(true);
846
- expect(shouldShowOrchestratorBackButton(_objectSpread({
847
- agentType: 'orchestrator',
848
- hasError: false,
849
- loading: false
850
- }, flags))).toBe(true);
851
- var sectionResetFlags = resolveOrchestratorHomeNavFlags({
852
- computedCurrentOption: options.home,
853
- homeOption: options.home,
854
- chatOption: options.chat,
855
- hasPinnedContext: true,
856
- section: 'project',
857
- didResetContextInSection: true
858
- });
859
- expect(sectionResetFlags.isSectionResetHomeStep2).toBe(true);
860
- expect(shouldShowOrchestratorBackButton(_objectSpread({
861
- agentType: 'orchestrator',
862
- hasError: true,
863
- loading: false
864
- }, sectionResetFlags))).toBe(false);
865
- expect(shouldShowOrchestratorBackButton({
866
- agentType: 'orchestrator',
867
- hasError: false,
868
- loading: true,
869
- isChatView: true,
870
- isHeaderHomeStep2: false,
871
- isSectionResetHomeStep2: false
872
- })).toBe(false);
873
- expect(shouldShowOrchestratorBackButton({
874
- agentType: 'orchestrator',
875
- hasError: false,
876
- loading: false,
877
- isChatView: false,
878
- isHeaderHomeStep2: false,
879
- isSectionResetHomeStep2: true
880
- })).toBe(true);
881
- });
882
- it('builds legacy migration patches for client, project and task entities', function () {
883
- var _buildLegacyContextMi, _buildLegacyContextMi2, _buildLegacyContextMi3, _buildLegacyContextMi4, _buildLegacyContextMi5, _buildLegacyContextMi6, _buildLegacyContextMi7, _buildLegacyContextMi8, _buildLegacyContextMi9;
884
- expect(buildLegacyContextMigrationPatch(null)).toBeNull();
885
- expect(buildLegacyContextMigrationPatch({
886
- agentEntity: 'client'
887
- })).toBeNull();
888
- expect((_buildLegacyContextMi = buildLegacyContextMigrationPatch({
889
- agentEntity: 'client',
890
- clientId: 3,
891
- clientName: 'ACME'
892
- })) === null || _buildLegacyContextMi === void 0 ? void 0 : _buildLegacyContextMi.client).toEqual({
893
- id: 3,
894
- name: 'ACME'
895
- });
896
- expect((_buildLegacyContextMi2 = buildLegacyContextMigrationPatch({
897
- agentEntity: 'project',
898
- projectId: 9,
899
- projectName: 'P'
900
- })) === null || _buildLegacyContextMi2 === void 0 || (_buildLegacyContextMi2 = _buildLegacyContextMi2.chipsProject) === null || _buildLegacyContextMi2 === void 0 ? void 0 : _buildLegacyContextMi2.projectId).toBe('9');
901
- expect((_buildLegacyContextMi3 = buildLegacyContextMigrationPatch({
902
- agentEntity: 'task',
903
- taskId: 1,
904
- taskName: 'T',
905
- projectId: 2,
906
- projectName: 'P',
907
- clientId: 4,
908
- clientName: 'C'
909
- })) === null || _buildLegacyContextMi3 === void 0 ? void 0 : _buildLegacyContextMi3.task).toMatchObject({
910
- id: 1,
911
- name: 'T',
912
- projectId: 2
913
- });
914
- expect((_buildLegacyContextMi4 = buildLegacyContextMigrationPatch({
915
- agentEntity: 'project',
916
- projectId: 9,
917
- projectName: 'P',
918
- clientId: 4,
919
- clientName: 'C'
920
- })) === null || _buildLegacyContextMi4 === void 0 ? void 0 : _buildLegacyContextMi4.project).toMatchObject({
921
- clientId: 4
922
- });
923
- expect((_buildLegacyContextMi5 = buildLegacyContextMigrationPatch({
924
- agentEntity: 'task',
925
- taskId: 5,
926
- taskName: 'Only task'
927
- })) === null || _buildLegacyContextMi5 === void 0 ? void 0 : _buildLegacyContextMi5.task).toEqual({
928
- id: 5,
929
- name: 'Only task'
930
- });
931
- expect((_buildLegacyContextMi6 = buildLegacyContextMigrationPatch({
932
- agentEntity: 'client',
933
- clientId: 1
934
- })) === null || _buildLegacyContextMi6 === void 0 ? void 0 : _buildLegacyContextMi6.client).toEqual({
935
- id: 1,
936
- name: ''
937
- });
938
- expect((_buildLegacyContextMi7 = buildLegacyContextMigrationPatch({
939
- agentEntity: 'task',
940
- taskId: 8,
941
- taskName: 'T',
942
- projectId: 2,
943
- projectName: 'P'
944
- })) === null || _buildLegacyContextMi7 === void 0 || (_buildLegacyContextMi7 = _buildLegacyContextMi7.chipsProject) === null || _buildLegacyContextMi7 === void 0 ? void 0 : _buildLegacyContextMi7.projectId).toBe('2');
945
- expect((_buildLegacyContextMi8 = buildLegacyContextMigrationPatch({
946
- agentEntity: 'task',
947
- taskId: 6,
948
- taskName: 'T',
949
- clientId: 3,
950
- clientName: 'C'
951
- })) === null || _buildLegacyContextMi8 === void 0 ? void 0 : _buildLegacyContextMi8.client).toEqual({
952
- id: 3,
953
- name: 'C'
954
- });
955
- expect((_buildLegacyContextMi9 = buildLegacyContextMigrationPatch({
956
- agentEntity: 'project',
957
- projectId: 9,
958
- projectName: 'P'
959
- })) === null || _buildLegacyContextMi9 === void 0 ? void 0 : _buildLegacyContextMi9.project).not.toHaveProperty('clientId');
960
- expect(buildLegacyContextMigrationPatch({
961
- agentEntity: 'task',
962
- taskId: 10,
963
- taskName: 'Full task',
964
- projectId: 11,
965
- projectName: 'Proj',
966
- clientId: 12,
967
- clientName: 'Client'
968
- })).toMatchObject({
969
- task: {
970
- id: 10,
971
- name: 'Full task',
972
- projectId: 11,
973
- clientId: 12
974
- },
975
- client: {
976
- id: 12,
977
- name: 'Client'
978
- },
979
- chipsProject: {
980
- projectId: '11',
981
- projectName: 'Proj',
982
- clientName: 'Client'
983
- }
984
- });
985
- });
986
- it('resolves floating drag clamp and layout position updates', function () {
987
- expect(shouldUseDragClampFallback(null)).toBe(true);
988
- var clamp = function clamp(x, y) {
989
- return {
990
- x: x,
991
- y: y
992
- };
993
- };
994
- expect(resolveLayoutDragPositionUpdate('floating', {
995
- x: 4,
996
- y: 8
997
- }, clamp, {
998
- innerWidth: 1000,
999
- panelWidth: 400,
1000
- pad: 16
1001
- })).toEqual({
1002
- x: 4,
1003
- y: 8
1004
- });
1005
- expect(resolveLayoutDragPositionUpdate('floating', null, clamp, {
1006
- innerWidth: 1000,
1007
- panelWidth: 400,
1008
- pad: 16
1009
- })).toEqual({
1010
- x: 584,
1011
- y: 16
1012
- });
1013
- expect(resolveLayoutDragPositionUpdate('sidebar', null, clamp, {
1014
- innerWidth: 0,
1015
- panelWidth: 0,
1016
- pad: 0
1017
- })).toBeNull();
1018
- expect(resolvePersistedDragPositionOnEnd('floating', {})).toBe(true);
1019
- expect(resolvePersistedDragPositionOnEnd('sidebar', {})).toBe(false);
1020
- });
1021
- it('builds initial chat message payload from start chat args', function () {
1022
- expect(buildUserInitialMessageFromStartChat({
1023
- message: 'hola',
1024
- faqId: 'f1'
1025
- })).toMatchObject({
1026
- message: 'hola',
1027
- faqId: 'f1',
1028
- attachments: []
1029
- });
1030
- expect(buildUserInitialMessageFromStartChat({
1031
- attachments: [{
1032
- id: '1'
1033
- }],
1034
- agentSuggestionId: 's1',
1035
- mentions: [{
1036
- id: 'm1'
1037
- }],
1038
- fuaId: 'fua',
1039
- scId: 'sc',
1040
- contextData: {
1041
- taskId: 1
1042
- }
1043
- })).toMatchObject({
1044
- message: '',
1045
- attachments: [{
1046
- id: '1'
1047
- }],
1048
- agentSuggestionId: 's1',
1049
- mentions: [{
1050
- id: 'm1'
1051
- }],
1052
- fuaId: 'fua',
1053
- scId: 'sc',
1054
- contextData: {
1055
- taskId: 1
1056
- }
1057
- });
1058
- expect(shouldResetSidebarErrorOnStartChat(true)).toBe(true);
1059
- });
1060
- it('supports go-home and send routing guards', function () {
1061
- var _findOrchestratorAgen;
1062
- expect(shouldClearClientOnGoHomeFromChat('client')).toBe(false);
1063
- expect(shouldResetAgentToFirstOnGoHome({
1064
- has_not_access: true
1065
- }, 2)).toBe(true);
1066
- expect(shouldResetAgentToFirstOnGoHome(null, 2)).toBe(true);
1067
- expect(shouldResetAgentToFirstOnGoHome({
1068
- is_deleted: true
1069
- }, 1)).toBe(true);
1070
- expect(shouldResetAgentToFirstOnGoHome({
1071
- has_not_access: true
1072
- }, 0)).toBe(false);
1073
- expect(shouldUseActiveChatSendHandler(options.chat, options.chat, true)).toBe(true);
1074
- expect(canOpenMaiaMarketplace(false)).toBe(false);
1075
- expect((_findOrchestratorAgen = findOrchestratorAgent([agent('2'), orchestratorAgent])) === null || _findOrchestratorAgen === void 0 ? void 0 : _findOrchestratorAgen.type).toBe('orchestrator');
1076
- expect(shouldMarkAgentAsLegacyContext({}, {
1077
- id: '1'
1078
- })).toBe(true);
1079
- expect(shouldMarkAgentAsLegacyContext({}, {
1080
- id: '1',
1081
- is_legacy_context: true
1082
- })).toBe(false);
1083
- expect(buildLegacyContextAgent({
1084
- id: '1',
1085
- name: 'A',
1086
- type: 'custom'
1087
- }).is_legacy_context).toBe(true);
1088
- });
1089
- });
1090
- describe('mount, banner and agents loading helpers', function () {
1091
- it('controls chat visibility and last active chat persistence', function () {
1092
- expect(shouldSetChatViewHiddenOnMount(false)).toBe(true);
1093
- expect(shouldSetChatViewHiddenOnMount(true)).toBe(false);
1094
- expect(shouldPersistLastActiveChatId('chat-1')).toBe(true);
1095
- expect(shouldPersistLastActiveChatId(null)).toBe(false);
1096
- expect(shouldSyncPanelSessionOnPageHide(false)).toBe(true);
1097
- expect(shouldSyncPanelSessionOnPageHide(true)).toBe(false);
1098
- });
1099
- it('detects banner FAQ titles', function () {
1100
- expect(hasBannerFaqTitle(' ')).toBe(false);
1101
- expect(hasBannerFaqTitle('Pregunta')).toBe(true);
1102
- });
1103
- it('resolves cached agents and initial fetch attempts', function () {
1104
- expect(resolveCachedAgentsIfAvailable([agent('1')])).toEqual([agent('1')]);
1105
- expect(resolveCachedAgentsIfAvailable([])).toBeNull();
1106
- expect(shouldAttemptInitialAgentsFetch(0, false)).toBe(true);
1107
- expect(shouldAttemptInitialAgentsFetch(0, true)).toBe(false);
1108
- expect(shouldAttemptInitialAgentsFetch(2, false)).toBe(false);
1109
- });
1110
- it('finds agents for chat items with numeric ids', function () {
1111
- var _findAgentForChatItem;
1112
- expect((_findAgentForChatItem = findAgentForChatItem([_objectSpread(_objectSpread({}, agent('7')), {}, {
1113
- id: '7'
1114
- })], 7)) === null || _findAgentForChatItem === void 0 ? void 0 : _findAgentForChatItem.id).toBe('7');
1115
- expect(findAgentForChatItem([agent('1')], 99)).toBeUndefined();
1116
- });
1117
- });
1118
- describe('host takeover and navigation guards', function () {
1119
- it('applies client updates only when defined', function () {
1120
- expect(shouldApplyClientOnHostTakeover(undefined)).toBe(false);
1121
- expect(shouldApplyClientOnHostTakeover(null)).toBe(true);
1122
- expect(shouldApplyClientOnHostTakeover({
1123
- id: 1,
1124
- name: 'Acme'
1125
- })).toBe(true);
1126
- });
1127
- it('selects first agent on global host takeover', function () {
1128
- expect(shouldSelectFirstAgentOnHostTakeover(true, agent('1'))).toBe(true);
1129
- expect(shouldSelectFirstAgentOnHostTakeover(false, agent('1'))).toBe(false);
1130
- expect(shouldSelectFirstAgentOnHostTakeover(true, undefined)).toBe(false);
1131
- });
1132
- it('covers go-home, catalog and skill agent guards', function () {
1133
- expect(shouldResetChatStateOnGoHome(options.chat, options.chat)).toBe(true);
1134
- expect(shouldResetChatStateOnGoHome(options.home, options.chat)).toBe(false);
1135
- expect(shouldClearContextForCatalogOrSkillAgent(agent('1'))).toBe(true);
1136
- expect(shouldClearContextForCatalogOrSkillAgent(undefined)).toBe(false);
1137
- expect(shouldClearTaskOnGoHomeFromChat('task')).toBe(false);
1138
- expect(shouldClearTaskOnGoHomeFromChat('header')).toBe(true);
1139
- expect(shouldClearOrchestratorGlobalContextOnGoHome('header', 'orchestrator')).toBe(true);
1140
- expect(shouldClearOrchestratorGlobalContextOnGoHome('project', 'orchestrator')).toBe(false);
1141
- expect(shouldPrefetchAgentsForCatalogNewChat(options.myAgents, options.myAgents, options.mySkills)).toBe(true);
1142
- expect(shouldPrefetchAgentsForCatalogNewChat(options.home, options.myAgents, options.mySkills)).toBe(false);
1143
- });
1144
- it('resolves open-new-chat-with-agent context patches', function () {
1145
- expect(resolveOpenNewChatWithAgentContext({
1146
- project: {
1147
- id: 1,
1148
- name: 'P'
1149
- }
1150
- })).toMatchObject({
1151
- project: {
1152
- id: 1,
1153
- name: 'P'
1154
- },
1155
- shouldSetTask: false
1156
- });
1157
- expect(resolveOpenNewChatWithAgentContext({
1158
- task: {
1159
- id: 2,
1160
- name: 'T'
1161
- }
1162
- }).shouldSetTask).toBe(true);
1163
- });
1164
- it('validates legacy context continuation', function () {
1165
- expect(canContinueLegacyContextInNewChat({
1166
- agentEntity: 'task'
1167
- }, orchestratorAgent)).toBe(true);
1168
- expect(canContinueLegacyContextInNewChat(null, orchestratorAgent)).toBe(false);
1169
- });
1170
- });
1171
- describe('session restore routing', function () {
1172
- it('maps snapshot nav routes', function () {
1173
- expect(resolveSessionRestoreNavRoute({
1174
- agentsNavActive: 'myAgents'
1175
- })).toBe('myAgents');
1176
- expect(resolveSessionRestoreNavRoute({
1177
- agentsNavActive: 'mySkills'
1178
- })).toBe('mySkills');
1179
- expect(resolveSessionRestoreNavRoute({
1180
- agentsNavActive: 'maiaker'
1181
- })).toBe('maiaker');
1182
- expect(resolveSessionRestoreNavRoute({
1183
- currentOption: 'chat',
1184
- activeChatId: 's-1'
1185
- })).toBe('chat');
1186
- expect(resolveSessionRestoreNavRoute({
1187
- currentOption: 'home'
1188
- })).toBe('savedOption');
1189
- expect(resolveSessionRestoreNavRoute({
1190
- currentOption: 'invalid'
1191
- })).toBe('none');
1192
- });
1193
- it('controls agents load branches during restore', function () {
1194
- expect(shouldSkipAgentsLoadOnSessionRestore('mySkills')).toBe(true);
1195
- expect(shouldSkipAgentsLoadOnSessionRestore('myAgents')).toBe(false);
1196
- expect(shouldFetchAgentDetailOnSessionRestore('a1', 'maiaker')).toBe(true);
1197
- expect(shouldFetchAgentDetailOnSessionRestore('a1', 'myAgents')).toBe(false);
1198
- expect(shouldPassAgentToGetAgentsOnRestore('myAgents')).toBe(false);
1199
- expect(shouldPassAgentToGetAgentsOnRestore('maiaker')).toBe(true);
1200
- expect(shouldSelectFetchedAgentAfterRestore(agent('1'), 'maiaker')).toBe(true);
1201
- expect(shouldSelectFetchedAgentAfterRestore(agent('1'), 'myAgents')).toBe(false);
1202
- });
1203
- it('restores chips project from snapshot host context', function () {
1204
- var _resolveSnapshotChips;
1205
- expect((_resolveSnapshotChips = resolveSnapshotChipsProject({
1206
- chipsProject: {
1207
- projectId: '9',
1208
- projectName: 'P',
1209
- clientName: 'C'
1210
- }
1211
- })) === null || _resolveSnapshotChips === void 0 ? void 0 : _resolveSnapshotChips.projectId).toBe('9');
1212
- expect(resolveSnapshotChipsProject(null)).toBeNull();
1213
- });
1214
- });
1215
- describe('layout and modal visibility helpers', function () {
1216
- it('resolves section flags and sidebar visibility', function () {
1217
- expect(resolveChatModalSectionFlags(options.chat, false)).toMatchObject({
1218
- showNewChat: false,
1219
- isMyAgentsSection: false
1220
- });
1221
- expect(resolveChatModalSectionFlags(options.home, true)).toMatchObject({
1222
- isMaiakerCreatorHome: true
1223
- });
1224
- expect(shouldRenderChatSidebar(true, false)).toBe(true);
1225
- expect(shouldRenderChatSidebar(true, true)).toBe(false);
1226
- });
1227
- it('resolves main content view and footer visibility', function () {
1228
- expect(resolveChatModalMainContentView(true, true)).toBe('error');
1229
- expect(resolveChatModalMainContentView(false, true)).toBe('chat');
1230
- expect(resolveChatModalMainContentView(false, false)).toBe('projectSummary');
1231
- expect(shouldShowChatModalFooter({
1232
- computedCurrentOption: options.chat,
1233
- homeOption: options.home,
1234
- chatOption: options.chat,
1235
- agentsCount: 0,
1236
- isMaiakerCreatorHome: false,
1237
- hasError: false,
1238
- loading: false,
1239
- hasAccess: true
1240
- })).toBe(true);
1241
- expect(shouldShowChatModalFooter({
1242
- computedCurrentOption: options.home,
1243
- homeOption: options.home,
1244
- chatOption: options.chat,
1245
- agentsCount: 0,
1246
- isMaiakerCreatorHome: false,
1247
- hasError: false,
1248
- loading: false,
1249
- hasAccess: true
1250
- })).toBe(false);
1251
- expect(shouldShowChatModalFooter({
1252
- computedCurrentOption: options.home,
1253
- homeOption: options.home,
1254
- chatOption: options.chat,
1255
- agentsCount: 2,
1256
- isMaiakerCreatorHome: false,
1257
- hasError: false,
1258
- loading: false,
1259
- hasAccess: true
1260
- })).toBe(true);
1261
- });
1262
- it('covers floating drag and elevated panel branches', function () {
1263
- expect(shouldClearDragPositionOnLayoutChange('sidebar')).toBe(true);
1264
- expect(shouldClearDragPositionOnLayoutChange('floating')).toBe(false);
1265
- expect(shouldPersistDragPositionOnDragEnd('floating')).toBe(true);
1266
- expect(shouldStartFloatingPanelDrag(true, 0)).toBe(true);
1267
- expect(shouldStartFloatingPanelDrag(true, 1)).toBe(false);
1268
- expect(isActiveFloatingDragPointer(1, 1)).toBe(true);
1269
- expect(isActiveFloatingDragPointer(1, 2)).toBe(false);
1270
- expect(shouldUseElevatedMaiaPanel('task')).toBe(true);
1271
- expect(isGlobalMaiaSection('header')).toBe(true);
1272
- });
1273
- it('covers delete agent and skills catalog guards', function () {
1274
- expect(shouldReselectAgentAfterDelete('a1', 'a1')).toBe(true);
1275
- expect(shouldReselectAgentAfterDelete('a1', 'a2')).toBe(false);
1276
- expect(shouldOpenSkillsCatalog(true)).toBe(true);
1277
- expect(shouldOpenSkillsCatalog(false)).toBe(false);
1278
- });
1279
- it('hides the footer on maiaker home, errors, loading or missing access', function () {
1280
- var base = {
1281
- computedCurrentOption: options.chat,
1282
- homeOption: options.home,
1283
- chatOption: options.chat,
1284
- agentsCount: 0,
1285
- isMaiakerCreatorHome: false,
1286
- hasError: false,
1287
- loading: false,
1288
- hasAccess: true
1289
- };
1290
- expect(shouldShowChatModalFooter(_objectSpread(_objectSpread({}, base), {}, {
1291
- isMaiakerCreatorHome: true
1292
- }))).toBe(false);
1293
- expect(shouldShowChatModalFooter(_objectSpread(_objectSpread({}, base), {}, {
1294
- hasError: true
1295
- }))).toBe(false);
1296
- expect(shouldShowChatModalFooter(_objectSpread(_objectSpread({}, base), {}, {
1297
- loading: true
1298
- }))).toBe(false);
1299
- expect(shouldShowChatModalFooter(_objectSpread(_objectSpread({}, base), {}, {
1300
- hasAccess: false
1301
- }))).toBe(false);
1302
- });
1303
- it('builds start-chat payloads and drag position updates', function () {
1304
- expect(buildUserInitialMessageFromStartChat({
1305
- message: 'Hola',
1306
- attachments: [{
1307
- id: '1'
1308
- }],
1309
- faqId: 'faq-1',
1310
- agentSuggestionId: 'sug-1',
1311
- mentions: [{
1312
- id: 'm1'
1313
- }],
1314
- fuaId: 'fua-1',
1315
- scId: 'sc-1',
1316
- contextData: {
1317
- projectId: 1
1318
- }
1319
- })).toMatchObject({
1320
- message: 'Hola',
1321
- faqId: 'faq-1',
1322
- agentSuggestionId: 'sug-1',
1323
- mentions: [{
1324
- id: 'm1'
1325
- }],
1326
- fuaId: 'fua-1',
1327
- scId: 'sc-1',
1328
- contextData: {
1329
- projectId: 1
1330
- }
1331
- });
1332
- expect(resolveLayoutDragPositionUpdate('sidebar', {
1333
- x: 1,
1334
- y: 2
1335
- }, function (x, y) {
1336
- return {
1337
- x: x,
1338
- y: y
1339
- };
1340
- }, {
1341
- innerWidth: 1000,
1342
- panelWidth: 400,
1343
- pad: 16
1344
- })).toBeNull();
1345
- expect(resolveLayoutDragPositionUpdate('floating', null, function (x, y) {
1346
- return {
1347
- x: x,
1348
- y: y
1349
- };
1350
- }, {
1351
- innerWidth: 1000,
1352
- panelWidth: 400,
1353
- pad: 16
1354
- })).toEqual({
1355
- x: 584,
1356
- y: 16
1357
- });
1358
- expect(resolvePersistedDragPositionOnEnd('floating', document.createElement('div'))).toBe(true);
1359
- expect(resolvePersistedDragPositionOnEnd('sidebar', document.createElement('div'))).toBe(false);
1360
- });
1361
- });
1362
- describe('dispatchSkillMentionInsert', function () {
1363
- it('dispatches the skill mention after two animation frames', function () {
1364
- jest.useFakeTimers();
1365
- var raf = jest.spyOn(window, 'requestAnimationFrame').mockImplementation(function (callback) {
1366
- return window.setTimeout(function () {
1367
- return callback(0);
1368
- }, 0);
1369
- });
1370
- var onInsert = jest.fn();
1371
- var onRefocus = jest.fn();
1372
- document.addEventListener('maia-insert-skill-mention', onInsert);
1373
- document.addEventListener('maia-input-refocus', onRefocus);
1374
- dispatchSkillMentionInsert({
1375
- id: 'sk1',
1376
- name: 'Resumir'
1377
- });
1378
- expect(onInsert).not.toHaveBeenCalled();
1379
- jest.runAllTimers();
1380
- expect(onInsert).toHaveBeenCalledTimes(1);
1381
- expect(onRefocus).toHaveBeenCalledTimes(1);
1382
- var event = onInsert.mock.calls[0][0];
1383
- expect(event.detail.skill).toEqual({
1384
- id: 'sk1',
1385
- name: 'Resumir'
1386
- });
1387
- document.removeEventListener('maia-insert-skill-mention', onInsert);
1388
- document.removeEventListener('maia-input-refocus', onRefocus);
1389
- raf.mockRestore();
1390
- jest.useRealTimers();
1391
- });
1392
- });
1393
- });
1394
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDT1JVc2VyUm9sZSIsIm9wdGlvbnMiLCJjbGFtcEZsb2F0aW5nUGFuZWxQb3NpdGlvbiIsImRpc3BhdGNoU2tpbGxNZW50aW9uSW5zZXJ0IiwiZW5zdXJlQWdlbnRzQmVmb3JlU2tpbGxVc2UiLCJnZXRNYWlhSG9zdFBhbmVsUHJlc2VudGF0aW9uIiwiaGFzQW55QWN0aXZlU2Vzc2lvbkluTWV0YSIsImlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kIiwiaXNMZWdhY3lDb250ZXh0RW50aXR5IiwicmVzb2x2ZUFpQ2hhdEJhY2tEZXN0aW5hdGlvbiIsInJlc29sdmVDb21wdXRlZEN1cnJlbnRPcHRpb24iLCJyZXNvbHZlRGVmYXVsdEZsb2F0aW5nUGFuZWxQb3NpdGlvbiIsInJlc29sdmVJbml0aWFsQ3VycmVudE9wdGlvbiIsInJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbiIsInJlc29sdmVTaWRlYmFyQWdlbnRzTmF2QWN0aXZlIiwic2hvdWxkUmVzdG9yZUV4cGFuZGVkUGFuZWwiLCJzaG91bGRTa2lwRmxvYXRpbmdEcmFnVGFyZ2V0IiwidmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUiLCJyZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUiLCJidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0IiwiYnVpbGRNYWlhUGFuZWxTZXNzaW9uUGF0Y2giLCJyZXNvbHZlRmxvYXRpbmdQYW5lbERyYWdQb3NpdGlvbiIsInJlc29sdmVIb3N0VGFrZW92ZXJBZ2VudElkIiwicmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nIiwicmVzb2x2ZU1pbmltaXplZFJlc3RvcmVUYXJnZXQiLCJyZXNvbHZlTmV4dERyYWdQb3NpdGlvbiIsInJlc29sdmVVc2VySGFzQWdlbnRNYW5hZ2VtZW50UGVybWlzc2lvbnMiLCJzaG91bGRCYWNrQ2xlYXJQaW5uZWRDb250ZXh0Iiwic2hvdWxkQmFja1N0YXJ0TmV3Q2hhdFByZXNlcnZpbmdDb250ZXh0Iiwic2hvdWxkTWFya09yY2hlc3RyYXRvckNvbnRleHRSZXNldCIsInNob3VsZFN0YXJ0TmV3Q2hhdEZyb21DYXRhbG9nIiwicmVzb2x2ZUhhc1Bpbm5lZENvbnRleHQiLCJyZXNvbHZlT3JjaGVzdHJhdG9ySG9tZU5hdkZsYWdzIiwic2hvdWxkU2hvd09yY2hlc3RyYXRvckJhY2tCdXR0b24iLCJzaG91bGRDbGVhckNsaWVudE9uR29Ib21lRnJvbUNoYXQiLCJzaG91bGRSZXNldEFnZW50VG9GaXJzdE9uR29Ib21lIiwic2hvdWxkVXNlQWN0aXZlQ2hhdFNlbmRIYW5kbGVyIiwiYnVpbGRMZWdhY3lDb250ZXh0TWlncmF0aW9uUGF0Y2giLCJmaW5kT3JjaGVzdHJhdG9yQWdlbnQiLCJidWlsZExlZ2FjeUNvbnRleHRBZ2VudCIsInNob3VsZE1hcmtBZ2VudEFzTGVnYWN5Q29udGV4dCIsImNhbk9wZW5NYWlhTWFya2V0cGxhY2UiLCJzaG91bGRTZXRDaGF0Vmlld0hpZGRlbk9uTW91bnQiLCJzaG91bGRQZXJzaXN0TGFzdEFjdGl2ZUNoYXRJZCIsImhhc0Jhbm5lckZhcVRpdGxlIiwic2hvdWxkU3luY1BhbmVsU2Vzc2lvbk9uUGFnZUhpZGUiLCJyZXNvbHZlQ2FjaGVkQWdlbnRzSWZBdmFpbGFibGUiLCJzaG91bGRBdHRlbXB0SW5pdGlhbEFnZW50c0ZldGNoIiwiZmluZEFnZW50Rm9yQ2hhdEl0ZW0iLCJzaG91bGRBcHBseUNsaWVudE9uSG9zdFRha2VvdmVyIiwic2hvdWxkU2VsZWN0Rmlyc3RBZ2VudE9uSG9zdFRha2VvdmVyIiwic2hvdWxkUmVzZXRDaGF0U3RhdGVPbkdvSG9tZSIsInNob3VsZENsZWFyQ29udGV4dEZvckNhdGFsb2dPclNraWxsQWdlbnQiLCJyZXNvbHZlT3Blbk5ld0NoYXRXaXRoQWdlbnRDb250ZXh0IiwiY2FuQ29udGludWVMZWdhY3lDb250ZXh0SW5OZXdDaGF0IiwicmVzb2x2ZVNlc3Npb25SZXN0b3JlTmF2Um91dGUiLCJzaG91bGRTa2lwQWdlbnRzTG9hZE9uU2Vzc2lvblJlc3RvcmUiLCJzaG91bGRGZXRjaEFnZW50RGV0YWlsT25TZXNzaW9uUmVzdG9yZSIsInNob3VsZFBhc3NBZ2VudFRvR2V0QWdlbnRzT25SZXN0b3JlIiwic2hvdWxkU2VsZWN0RmV0Y2hlZEFnZW50QWZ0ZXJSZXN0b3JlIiwicmVzb2x2ZVNuYXBzaG90Q2hpcHNQcm9qZWN0IiwicmVzb2x2ZUNoYXRNb2RhbFNlY3Rpb25GbGFncyIsInNob3VsZFJlbmRlckNoYXRTaWRlYmFyIiwicmVzb2x2ZUNoYXRNb2RhbE1haW5Db250ZW50VmlldyIsInNob3VsZFNob3dDaGF0TW9kYWxGb290ZXIiLCJzaG91bGRVc2VFbGV2YXRlZE1haWFQYW5lbCIsInNob3VsZFJlc2VsZWN0QWdlbnRBZnRlckRlbGV0ZSIsInNob3VsZENsZWFyRHJhZ1Bvc2l0aW9uT25MYXlvdXRDaGFuZ2UiLCJzaG91bGRQZXJzaXN0RHJhZ1Bvc2l0aW9uT25EcmFnRW5kIiwic2hvdWxkU3RhcnRGbG9hdGluZ1BhbmVsRHJhZyIsImlzQWN0aXZlRmxvYXRpbmdEcmFnUG9pbnRlciIsInNob3VsZE9wZW5Ta2lsbHNDYXRhbG9nIiwic2hvdWxkVXNlRHJhZ0NsYW1wRmFsbGJhY2siLCJyZXNvbHZlTGF5b3V0RHJhZ1Bvc2l0aW9uVXBkYXRlIiwicmVzb2x2ZVBlcnNpc3RlZERyYWdQb3NpdGlvbk9uRW5kIiwiYnVpbGRVc2VySW5pdGlhbE1lc3NhZ2VGcm9tU3RhcnRDaGF0Iiwic2hvdWxkUmVzZXRTaWRlYmFyRXJyb3JPblN0YXJ0Q2hhdCIsInNob3VsZENsZWFyVGFza09uR29Ib21lRnJvbUNoYXQiLCJzaG91bGRDbGVhck9yY2hlc3RyYXRvckdsb2JhbENvbnRleHRPbkdvSG9tZSIsInNob3VsZFByZWZldGNoQWdlbnRzRm9yQ2F0YWxvZ05ld0NoYXQiLCJpc0dsb2JhbE1haWFTZWN0aW9uIiwiYmFzZVVzZXIiLCJpZCIsImNvbXBhbnlfaWQiLCJyb2xlX2lkIiwiUFJPSkVDVF9NQU5BR0VSIiwib3JjaGVzdHJhdG9yQWdlbnQiLCJuYW1lIiwidHlwZSIsImVudGl0eSIsImFnZW50IiwiY29uY2F0IiwiZGVzY3JpYmUiLCJvcmlnaW5hbENoYXRBY2Nlc3MiLCJ3aW5kb3ciLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MiLCJvcmlnaW5hbE11bHRpQWdlbnRzIiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyIsIm9yaWdpbmFsU2tpbGxzQWNjZXNzIiwiTUFJQV9TS0lMTFNfQUNDRVNTIiwib3JpZ2luYWxQcm9qZWN0U3VtbWFyeSIsIk1BSUFfUFJPSkVDVF9TVU1NQVJZX0ZFQVRVUkVfQUNDRVNTIiwiYWZ0ZXJFYWNoIiwiaXQiLCJleHBlY3QiLCJob21lIiwidG9CZSIsImNoYXQiLCJfb2JqZWN0U3ByZWFkIiwiQ0xJRU5UIiwiY3VycmVudE9wdGlvbiIsIm15QWdlbnRzIiwicHJvamVjdCIsImNsaWVudCIsInVzZXIiLCJtdWx0aUFnZW50c0FjY2VzcyIsIm15U2tpbGxzIiwiZ2xvYmFsQ2xvbmUiLCJwcm9qZWN0QWdlbnQiLCJjbGllbnRBZ2VudCIsIm9yY2hlc3RyYXRvckdsb2JhbCIsInByb2plY3RTZWxlY3RvciIsImNsaWVudFNlbGVjdG9yIiwidG9CZU51bGwiLCJ0b0VxdWFsIiwieCIsInkiLCJhZ2VudFR5cGUiLCJhZ2VudEVudGl0eSIsInByb2plY3ROYW1lIiwiZW50aXR5VHlwZSIsImNvbnRleHROYW1lIiwidGFza05hbWUiLCJjbGllbnROYW1lIiwiYSIsInN0YXR1cyIsImIiLCJpc0V4cGFuZGVkIiwidW5kZWZpbmVkIiwiYnV0dG9uIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiZmFxVGl0bGUiLCJhbHJlYWR5U2VudCIsImxvYWRpbmciLCJhZ2VudElkIiwic2VjdGlvbiIsInByb2plY3RJZCIsImNsaWVudElkIiwiaGlkZVBhbmVsQ29udGVudCIsInNob3dNaW5pbWl6ZWRQaWxsIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJlbnN1cmVBZ2VudHNMb2FkZWQiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImplc3QiLCJmbiIsIm1vY2tSZXNvbHZlZFZhbHVlIiwidXNlRmlyc3RBZ2VudCIsImFnZW50cyIsInJlc29sdmVzIiwidG9CZVVuZGVmaW5lZCIsIm5vdCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJzdG9wIiwiX2NhbGxlZTIiLCJfY29udGV4dDIiLCJfY2FsbGVlMyIsIl9jb250ZXh0MyIsInRvSGF2ZUJlZW5DYWxsZWRUaW1lcyIsIl9jYWxsZWU0IiwiX2NvbnRleHQ0IiwidGFzayIsInRvTWF0Y2hPYmplY3QiLCJjbGVhckdsb2JhbFBpbm5lZENvbnRleHQiLCJjaGlwc1Byb2plY3QiLCJhaV9hZ2VudHMiLCJjcmVhdGUiLCJlZGl0IiwiX3Jlc29sdmVNaW5pbWl6ZWRSZXN0IiwiX3Jlc29sdmVNaW5pbWl6ZWRSZXN0MiIsImNoYXRzIiwic2Vzc2lvbkV4dGVybmFsSWQiLCJpc1JlYWQiLCJpc01pbmltaXplZCIsImFnZW50c05hdkFjdGl2ZSIsImFjdGl2ZUNoYXRJZCIsInNpZGViYXJPcGVuIiwibGF5b3V0TW9kZSIsImRyYWdQb3NpdGlvbiIsImhvc3RDb250ZXh0IiwiY2xhbXAiLCJ2aWV3cG9ydFdpZHRoIiwicGFuZWxXaWR0aCIsInRhc2tJZCIsImZsYWdzIiwiY29tcHV0ZWRDdXJyZW50T3B0aW9uIiwiaG9tZU9wdGlvbiIsImNoYXRPcHRpb24iLCJoYXNQaW5uZWRDb250ZXh0IiwiZGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uIiwiaXNDaGF0VmlldyIsImhhc0Vycm9yIiwic2VjdGlvblJlc2V0RmxhZ3MiLCJpc1NlY3Rpb25SZXNldEhvbWVTdGVwMiIsImlzSGVhZGVySG9tZVN0ZXAyIiwiX2J1aWxkTGVnYWN5Q29udGV4dE1pIiwiX2J1aWxkTGVnYWN5Q29udGV4dE1pMiIsIl9idWlsZExlZ2FjeUNvbnRleHRNaTMiLCJfYnVpbGRMZWdhY3lDb250ZXh0TWk0IiwiX2J1aWxkTGVnYWN5Q29udGV4dE1pNSIsIl9idWlsZExlZ2FjeUNvbnRleHRNaTYiLCJfYnVpbGRMZWdhY3lDb250ZXh0TWk3IiwiX2J1aWxkTGVnYWN5Q29udGV4dE1pOCIsIl9idWlsZExlZ2FjeUNvbnRleHRNaTkiLCJ0b0hhdmVQcm9wZXJ0eSIsImlubmVyV2lkdGgiLCJwYWQiLCJtZXNzYWdlIiwiZmFxSWQiLCJhdHRhY2htZW50cyIsImFnZW50U3VnZ2VzdGlvbklkIiwibWVudGlvbnMiLCJmdWFJZCIsInNjSWQiLCJjb250ZXh0RGF0YSIsIl9maW5kT3JjaGVzdHJhdG9yQWdlbiIsImhhc19ub3RfYWNjZXNzIiwiaXNfZGVsZXRlZCIsImlzX2xlZ2FjeV9jb250ZXh0IiwiX2ZpbmRBZ2VudEZvckNoYXRJdGVtIiwic2hvdWxkU2V0VGFzayIsIl9yZXNvbHZlU25hcHNob3RDaGlwcyIsInNob3dOZXdDaGF0IiwiaXNNeUFnZW50c1NlY3Rpb24iLCJpc01haWFrZXJDcmVhdG9ySG9tZSIsImFnZW50c0NvdW50IiwiaGFzQWNjZXNzIiwiYmFzZSIsInVzZUZha2VUaW1lcnMiLCJyYWYiLCJzcHlPbiIsIm1vY2tJbXBsZW1lbnRhdGlvbiIsImNhbGxiYWNrIiwic2V0VGltZW91dCIsIm9uSW5zZXJ0Iiwib25SZWZvY3VzIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJ1bkFsbFRpbWVycyIsImV2ZW50IiwibW9jayIsImNhbGxzIiwiZGV0YWlsIiwic2tpbGwiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibW9ja1Jlc3RvcmUiLCJ1c2VSZWFsVGltZXJzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL0NoYXRBSU1vZGFsL0NoYXRBSU1vZGFsLmhlbHBlcnMuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT1JVc2VyUm9sZSB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgdHlwZSB7IEFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyBvcHRpb25zIH0gZnJvbSAnLi9jb25zdGFudHMnXG5pbXBvcnQge1xuICBjbGFtcEZsb2F0aW5nUGFuZWxQb3NpdGlvbixcbiAgZGlzcGF0Y2hTa2lsbE1lbnRpb25JbnNlcnQsXG4gIGVuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlLFxuICBnZXRNYWlhSG9zdFBhbmVsUHJlc2VudGF0aW9uLFxuICBoYXNBbnlBY3RpdmVTZXNzaW9uSW5NZXRhLFxuICBpc0Jhbm5lckZhcVJlYWR5VG9BdXRvU2VuZCxcbiAgaXNMZWdhY3lDb250ZXh0RW50aXR5LFxuICByZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uLFxuICByZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uLFxuICByZXNvbHZlRGVmYXVsdEZsb2F0aW5nUGFuZWxQb3NpdGlvbixcbiAgcmVzb2x2ZUluaXRpYWxDdXJyZW50T3B0aW9uLFxuICByZXNvbHZlTGVnYWN5Q29udGV4dFNlc3Npb24sXG4gIHJlc29sdmVTaWRlYmFyQWdlbnRzTmF2QWN0aXZlLFxuICBzaG91bGRSZXN0b3JlRXhwYW5kZWRQYW5lbCxcbiAgc2hvdWxkU2tpcEZsb2F0aW5nRHJhZ1RhcmdldCxcbiAgdmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUsXG4gIHJlc29sdmVIb3N0VGFrZW92ZXJFbnRpdHlTdGF0ZSxcbiAgYnVpbGRIb3N0VGFrZW92ZXJQZXJzaXN0Q29udGV4dCxcbiAgYnVpbGRNYWlhUGFuZWxTZXNzaW9uUGF0Y2gsXG4gIHJlc29sdmVGbG9hdGluZ1BhbmVsRHJhZ1Bvc2l0aW9uLFxuICByZXNvbHZlSG9zdFRha2VvdmVyQWdlbnRJZCxcbiAgcmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nLFxuICByZXNvbHZlTWluaW1pemVkUmVzdG9yZVRhcmdldCxcbiAgcmVzb2x2ZU5leHREcmFnUG9zaXRpb24sXG4gIHJlc29sdmVVc2VySGFzQWdlbnRNYW5hZ2VtZW50UGVybWlzc2lvbnMsXG4gIHNob3VsZEJhY2tDbGVhclBpbm5lZENvbnRleHQsXG4gIHNob3VsZEJhY2tTdGFydE5ld0NoYXRQcmVzZXJ2aW5nQ29udGV4dCxcbiAgc2hvdWxkTWFya09yY2hlc3RyYXRvckNvbnRleHRSZXNldCxcbiAgc2hvdWxkU3RhcnROZXdDaGF0RnJvbUNhdGFsb2csXG4gIHJlc29sdmVIYXNQaW5uZWRDb250ZXh0LFxuICByZXNvbHZlT3JjaGVzdHJhdG9ySG9tZU5hdkZsYWdzLFxuICBzaG91bGRTaG93T3JjaGVzdHJhdG9yQmFja0J1dHRvbixcbiAgc2hvdWxkQ2xlYXJDbGllbnRPbkdvSG9tZUZyb21DaGF0LFxuICBzaG91bGRSZXNldEFnZW50VG9GaXJzdE9uR29Ib21lLFxuICBzaG91bGRVc2VBY3RpdmVDaGF0U2VuZEhhbmRsZXIsXG4gIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoLFxuICBmaW5kT3JjaGVzdHJhdG9yQWdlbnQsXG4gIGJ1aWxkTGVnYWN5Q29udGV4dEFnZW50LFxuICBzaG91bGRNYXJrQWdlbnRBc0xlZ2FjeUNvbnRleHQsXG4gIGNhbk9wZW5NYWlhTWFya2V0cGxhY2UsXG4gIHNob3VsZFNldENoYXRWaWV3SGlkZGVuT25Nb3VudCxcbiAgc2hvdWxkUGVyc2lzdExhc3RBY3RpdmVDaGF0SWQsXG4gIGhhc0Jhbm5lckZhcVRpdGxlLFxuICBzaG91bGRTeW5jUGFuZWxTZXNzaW9uT25QYWdlSGlkZSxcbiAgcmVzb2x2ZUNhY2hlZEFnZW50c0lmQXZhaWxhYmxlLFxuICBzaG91bGRBdHRlbXB0SW5pdGlhbEFnZW50c0ZldGNoLFxuICBmaW5kQWdlbnRGb3JDaGF0SXRlbSxcbiAgc2hvdWxkQXBwbHlDbGllbnRPbkhvc3RUYWtlb3ZlcixcbiAgc2hvdWxkU2VsZWN0Rmlyc3RBZ2VudE9uSG9zdFRha2VvdmVyLFxuICBzaG91bGRSZXNldENoYXRTdGF0ZU9uR29Ib21lLFxuICBzaG91bGRDbGVhckNvbnRleHRGb3JDYXRhbG9nT3JTa2lsbEFnZW50LFxuICByZXNvbHZlT3Blbk5ld0NoYXRXaXRoQWdlbnRDb250ZXh0LFxuICBjYW5Db250aW51ZUxlZ2FjeUNvbnRleHRJbk5ld0NoYXQsXG4gIHJlc29sdmVTZXNzaW9uUmVzdG9yZU5hdlJvdXRlLFxuICBzaG91bGRTa2lwQWdlbnRzTG9hZE9uU2Vzc2lvblJlc3RvcmUsXG4gIHNob3VsZEZldGNoQWdlbnREZXRhaWxPblNlc3Npb25SZXN0b3JlLFxuICBzaG91bGRQYXNzQWdlbnRUb0dldEFnZW50c09uUmVzdG9yZSxcbiAgc2hvdWxkU2VsZWN0RmV0Y2hlZEFnZW50QWZ0ZXJSZXN0b3JlLFxuICByZXNvbHZlU25hcHNob3RDaGlwc1Byb2plY3QsXG4gIHJlc29sdmVDaGF0TW9kYWxTZWN0aW9uRmxhZ3MsXG4gIHNob3VsZFJlbmRlckNoYXRTaWRlYmFyLFxuICByZXNvbHZlQ2hhdE1vZGFsTWFpbkNvbnRlbnRWaWV3LFxuICBzaG91bGRTaG93Q2hhdE1vZGFsRm9vdGVyLFxuICBzaG91bGRVc2VFbGV2YXRlZE1haWFQYW5lbCxcbiAgc2hvdWxkUmVzZWxlY3RBZ2VudEFmdGVyRGVsZXRlLFxuICBzaG91bGRDbGVhckRyYWdQb3NpdGlvbk9uTGF5b3V0Q2hhbmdlLFxuICBzaG91bGRQZXJzaXN0RHJhZ1Bvc2l0aW9uT25EcmFnRW5kLFxuICBzaG91bGRTdGFydEZsb2F0aW5nUGFuZWxEcmFnLFxuICBpc0FjdGl2ZUZsb2F0aW5nRHJhZ1BvaW50ZXIsXG4gIHNob3VsZE9wZW5Ta2lsbHNDYXRhbG9nLFxuICBzaG91bGRVc2VEcmFnQ2xhbXBGYWxsYmFjayxcbiAgcmVzb2x2ZUxheW91dERyYWdQb3NpdGlvblVwZGF0ZSxcbiAgcmVzb2x2ZVBlcnNpc3RlZERyYWdQb3NpdGlvbk9uRW5kLFxuICBidWlsZFVzZXJJbml0aWFsTWVzc2FnZUZyb21TdGFydENoYXQsXG4gIHNob3VsZFJlc2V0U2lkZWJhckVycm9yT25TdGFydENoYXQsXG4gIHNob3VsZENsZWFyVGFza09uR29Ib21lRnJvbUNoYXQsXG4gIHNob3VsZENsZWFyT3JjaGVzdHJhdG9yR2xvYmFsQ29udGV4dE9uR29Ib21lLFxuICBzaG91bGRQcmVmZXRjaEFnZW50c0ZvckNhdGFsb2dOZXdDaGF0LFxuICBpc0dsb2JhbE1haWFTZWN0aW9uLFxufSBmcm9tICcuL0NoYXRBSU1vZGFsLmhlbHBlcnMnXG5cbmNvbnN0IGJhc2VVc2VyID0ge1xuICBpZDogMSxcbiAgY29tcGFueV9pZDogMTAsXG4gIHJvbGVfaWQ6IENPUlVzZXJSb2xlLlBST0pFQ1RfTUFOQUdFUixcbn1cblxuY29uc3Qgb3JjaGVzdHJhdG9yQWdlbnQ6IEFnZW50ID0ge1xuICBpZDogJzEnLFxuICBuYW1lOiAnTUFJQScsXG4gIHR5cGU6ICdvcmNoZXN0cmF0b3InLFxuICBlbnRpdHk6ICdnbG9iYWwnLFxufVxuXG5jb25zdCBhZ2VudCA9IChpZDogc3RyaW5nKTogQWdlbnQgPT5cbiAgKHtcbiAgICBpZCxcbiAgICBuYW1lOiBgQWdlbnQgJHtpZH1gLFxuICAgIHR5cGU6ICdjdXN0b20nLFxuICB9KSBhcyBBZ2VudFxuXG5kZXNjcmliZSgnQ2hhdEFJTW9kYWwuaGVscGVycycsICgpID0+IHtcbiAgY29uc3Qgb3JpZ2luYWxDaGF0QWNjZXNzID0gd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU1xuICBjb25zdCBvcmlnaW5hbE11bHRpQWdlbnRzID0gd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFNcbiAgY29uc3Qgb3JpZ2luYWxTa2lsbHNBY2Nlc3MgPSB3aW5kb3cuTUFJQV9TS0lMTFNfQUNDRVNTXG4gIGNvbnN0IG9yaWdpbmFsUHJvamVjdFN1bW1hcnkgPSB3aW5kb3cuTUFJQV9QUk9KRUNUX1NVTU1BUllfRkVBVFVSRV9BQ0NFU1NcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgPSBvcmlnaW5hbENoYXRBY2Nlc3NcbiAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IG9yaWdpbmFsTXVsdGlBZ2VudHNcbiAgICB3aW5kb3cuTUFJQV9TS0lMTFNfQUNDRVNTID0gb3JpZ2luYWxTa2lsbHNBY2Nlc3NcbiAgICB3aW5kb3cuTUFJQV9QUk9KRUNUX1NVTU1BUllfRkVBVFVSRV9BQ0NFU1MgPSBvcmlnaW5hbFByb2plY3RTdW1tYXJ5XG4gIH0pXG5cbiAgZGVzY3JpYmUoJ3Jlc29sdmVBaUNoYXRCYWNrRGVzdGluYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgZ2xvYmFsIGhvbWUgZm9yIG9yY2hlc3RyYXRvciBvbiBoZWFkZXIgaG9tZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uKCdoZWFkZXInLCAnb3JjaGVzdHJhdG9yJywgb3B0aW9ucy5ob21lLCBvcHRpb25zLmhvbWUpKS50b0JlKFxuICAgICAgICAnZ2xvYmFsX2NvbnRleHRfaG9tZSdcbiAgICAgIClcbiAgICB9KVxuXG4gICAgaXQoJ21hcHMgc2VjdGlvbi1zcGVjaWZpYyBob21lcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uKCd0YXNrJywgJ29yY2hlc3RyYXRvcicsIG9wdGlvbnMuY2hhdCwgb3B0aW9ucy5ob21lKSkudG9CZSgndGFza19ob21lJylcbiAgICAgIGV4cGVjdChyZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uKCdwbGFubmVyJywgJ2Nsb25lJywgb3B0aW9ucy5jaGF0LCBvcHRpb25zLmhvbWUpKS50b0JlKCdwbGFubmVyX2hvbWUnKVxuICAgICAgZXhwZWN0KHJlc29sdmVBaUNoYXRCYWNrRGVzdGluYXRpb24oJ3Byb2plY3QnLCAnY2xvbmUnLCBvcHRpb25zLmNoYXQsIG9wdGlvbnMuaG9tZSkpLnRvQmUoJ3Byb2plY3RfaG9tZScpXG4gICAgICBleHBlY3QocmVzb2x2ZUFpQ2hhdEJhY2tEZXN0aW5hdGlvbignY2xpZW50JywgJ2Nsb25lJywgb3B0aW9ucy5jaGF0LCBvcHRpb25zLmhvbWUpKS50b0JlKCdjbGllbnRfaG9tZScpXG4gICAgfSlcblxuICAgIGl0KCdmYWxscyBiYWNrIHRvIGdsb2JhbCBob21lIGZvciB1bnN1cHBvcnRlZCBjb21iaW5hdGlvbnMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUFpQ2hhdEJhY2tEZXN0aW5hdGlvbignaGVhZGVyJywgJ2N1c3RvbScsIG9wdGlvbnMuY2hhdCwgb3B0aW9ucy5jaGF0KSkudG9CZSgnZ2xvYmFsX2NvbnRleHRfaG9tZScpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgndmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUnLCAoKSA9PiB7XG4gICAgaXQoJ2RlbmllcyBhY2Nlc3Mgd2l0aG91dCBzZWN0aW9uIG9yIGNoYXQgcGVybWlzc2lvbicsICgpID0+IHtcbiAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgPSB0cnVlXG4gICAgICBleHBlY3QodmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUobnVsbCwgYmFzZVVzZXIpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKCdoZWFkZXInLCB7IC4uLmJhc2VVc2VyLCByb2xlX2lkOiBDT1JVc2VyUm9sZS5DTElFTlQgfSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdhbGxvd3MgdGFzayBhbmQgcGxhbm5lciB3aGVuIGNoYXQgQUkgaXMgZW5hYmxlZCBmb3IgdGhlIHVzZXInLCAoKSA9PiB7XG4gICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTID0gZmFsc2VcbiAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gZmFsc2VcbiAgICAgIHdpbmRvdy5NQUlBX1BST0pFQ1RfU1VNTUFSWV9GRUFUVVJFX0FDQ0VTUyA9IHRydWVcbiAgICAgIGV4cGVjdCh2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSgndGFzaycsIGJhc2VVc2VyKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKCdwbGFubmVyJywgYmFzZVVzZXIpKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdyZXF1aXJlcyBjaGF0IGZsYWdzIGZvciBoZWFkZXIgYW5kIHByb2plY3Qgc2VjdGlvbnMnLCAoKSA9PiB7XG4gICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTID0gZmFsc2VcbiAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTID0gZmFsc2VcbiAgICAgIGV4cGVjdCh2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSgnaGVhZGVyJywgYmFzZVVzZXIpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKCdwcm9qZWN0JywgYmFzZVVzZXIpKS50b0JlKGZhbHNlKVxuXG4gICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IHRydWVcbiAgICAgIGV4cGVjdCh2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSgnaGVhZGVyJywgYmFzZVVzZXIpKS50b0JlKHRydWUpXG5cbiAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgPSB0cnVlXG4gICAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UUyA9IGZhbHNlXG4gICAgICBleHBlY3QodmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUoJ3Byb2plY3QnLCBiYXNlVXNlcikpLnRvQmUodHJ1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdyZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdmYWxscyBiYWNrIHRvIHRoZSBjdXJyZW50IG9wdGlvbiB3aGVuIG15QWdlbnRzIGlzIHVuYXZhaWxhYmxlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uKHtcbiAgICAgICAgICBjdXJyZW50T3B0aW9uOiBvcHRpb25zLm15QWdlbnRzLFxuICAgICAgICAgIGFnZW50OiBvcmNoZXN0cmF0b3JBZ2VudCxcbiAgICAgICAgICBwcm9qZWN0OiBudWxsLFxuICAgICAgICAgIGNsaWVudDogbnVsbCxcbiAgICAgICAgICB1c2VyOiBiYXNlVXNlcixcbiAgICAgICAgICBtdWx0aUFnZW50c0FjY2VzczogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUob3B0aW9ucy5teUFnZW50cylcbiAgICB9KVxuXG4gICAgaXQoJ2tlZXBzIG15QWdlbnRzIGFuZCBteVNraWxscyB3aGVuIGZlYXR1cmUgYWNjZXNzIGFsbG93cycsICgpID0+IHtcbiAgICAgIHdpbmRvdy5NQUlBX1NLSUxMU19BQ0NFU1MgPSB0cnVlXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVDb21wdXRlZEN1cnJlbnRPcHRpb24oe1xuICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMubXlBZ2VudHMsXG4gICAgICAgICAgYWdlbnQ6IG9yY2hlc3RyYXRvckFnZW50LFxuICAgICAgICAgIHByb2plY3Q6IG51bGwsXG4gICAgICAgICAgY2xpZW50OiBudWxsLFxuICAgICAgICAgIHVzZXI6IGJhc2VVc2VyLFxuICAgICAgICAgIG11bHRpQWdlbnRzQWNjZXNzOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMubXlBZ2VudHMpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUNvbXB1dGVkQ3VycmVudE9wdGlvbih7XG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5teVNraWxscyxcbiAgICAgICAgICBhZ2VudDogb3JjaGVzdHJhdG9yQWdlbnQsXG4gICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMubXlTa2lsbHMpXG4gICAgfSlcblxuICAgIGl0KCdyZWRpcmVjdHMgbm9uLW9yY2hlc3RyYXRvciBnbG9iYWwgc3BlY2lhbGlzdHMgZnJvbSBob21lIHRvIGNoYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBnbG9iYWxDbG9uZTogQWdlbnQgPSB7XG4gICAgICAgIGlkOiAnMicsXG4gICAgICAgIG5hbWU6ICdTYWxlcyBCb3QnLFxuICAgICAgICB0eXBlOiAnY2xvbmUnLFxuICAgICAgICBlbnRpdHk6ICdnbG9iYWwnLFxuICAgICAgfVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVDb21wdXRlZEN1cnJlbnRPcHRpb24oe1xuICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgICBhZ2VudDogZ2xvYmFsQ2xvbmUsXG4gICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMuY2hhdClcbiAgICB9KVxuXG4gICAgaXQoJ2tlZXBzIGNoYXQgb3B0aW9uIHdoZW4gcHJvamVjdCBvciBjbGllbnQgY29udGV4dCBpcyBhbHJlYWR5IHNldCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb2plY3RBZ2VudDogQWdlbnQgPSB7IGlkOiAnMycsIG5hbWU6ICdQcm9qJywgdHlwZTogJ2Nsb25lJywgZW50aXR5OiAncHJvamVjdCcgfVxuICAgICAgY29uc3QgY2xpZW50QWdlbnQ6IEFnZW50ID0geyBpZDogJzQnLCBuYW1lOiAnQ2xpZW50JywgdHlwZTogJ2Nsb25lJywgZW50aXR5OiAnY2xpZW50JyB9XG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUNvbXB1dGVkQ3VycmVudE9wdGlvbih7XG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGFnZW50OiBwcm9qZWN0QWdlbnQsXG4gICAgICAgICAgcHJvamVjdDogeyBpZDogMTAsIG5hbWU6ICdBbHBoYScgfSBhcyBuZXZlcixcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMuaG9tZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uKHtcbiAgICAgICAgICBjdXJyZW50T3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICAgICAgYWdlbnQ6IGNsaWVudEFnZW50LFxuICAgICAgICAgIHByb2plY3Q6IG51bGwsXG4gICAgICAgICAgY2xpZW50OiB7IGlkOiA1LCBuYW1lOiAnQmV0YScgfSBhcyBuZXZlcixcbiAgICAgICAgICB1c2VyOiBiYXNlVXNlcixcbiAgICAgICAgICBtdWx0aUFnZW50c0FjY2VzczogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUob3B0aW9ucy5ob21lKVxuICAgIH0pXG5cbiAgICBpdCgnZG9lcyBub3QgcmVkaXJlY3Qgb3JjaGVzdHJhdG9yIGdsb2JhbCBjbG9uZXMgZnJvbSBob21lJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb3JjaGVzdHJhdG9yR2xvYmFsOiBBZ2VudCA9IHtcbiAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgbmFtZTogJ01BSUEnLFxuICAgICAgICB0eXBlOiAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgZW50aXR5OiAnZ2xvYmFsJyxcbiAgICAgIH1cblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQ29tcHV0ZWRDdXJyZW50T3B0aW9uKHtcbiAgICAgICAgICBjdXJyZW50T3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICAgICAgYWdlbnQ6IG9yY2hlc3RyYXRvckdsb2JhbCxcbiAgICAgICAgICBwcm9qZWN0OiBudWxsLFxuICAgICAgICAgIGNsaWVudDogbnVsbCxcbiAgICAgICAgICB1c2VyOiBiYXNlVXNlcixcbiAgICAgICAgICBtdWx0aUFnZW50c0FjY2VzczogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUob3B0aW9ucy5ob21lKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvd3MgcHJvamVjdCBhbmQgY2xpZW50IHNlbGVjdG9ycyB3aGVuIGNvbnRleHQgaXMgbWlzc2luZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb2plY3RBZ2VudDogQWdlbnQgPSB7IGlkOiAnMycsIG5hbWU6ICdQcm9qJywgdHlwZTogJ2Nsb25lJywgZW50aXR5OiAncHJvamVjdCcgfVxuICAgICAgY29uc3QgY2xpZW50QWdlbnQ6IEFnZW50ID0geyBpZDogJzQnLCBuYW1lOiAnQ2xpZW50JywgdHlwZTogJ2Nsb25lJywgZW50aXR5OiAnY2xpZW50JyB9XG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUNvbXB1dGVkQ3VycmVudE9wdGlvbih7XG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGFnZW50OiBwcm9qZWN0QWdlbnQsXG4gICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMucHJvamVjdFNlbGVjdG9yKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVDb21wdXRlZEN1cnJlbnRPcHRpb24oe1xuICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgICBhZ2VudDogY2xpZW50QWdlbnQsXG4gICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgdXNlcjogYmFzZVVzZXIsXG4gICAgICAgICAgbXVsdGlBZ2VudHNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKG9wdGlvbnMuY2xpZW50U2VsZWN0b3IpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgncmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUnLCAoKSA9PiB7XG4gICAgaXQoJ21hcHMgY29tcHV0ZWQgb3B0aW9ucyBhbmQgbWFpYWtlciBzZWxlY3Rpb24nLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUob3B0aW9ucy5teVNraWxscywgZmFsc2UpKS50b0JlKCdteVNraWxscycpXG4gICAgICBleHBlY3QocmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUob3B0aW9ucy5teUFnZW50cywgZmFsc2UpKS50b0JlKCdteUFnZW50cycpXG4gICAgICBleHBlY3QocmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUob3B0aW9ucy5ob21lLCB0cnVlKSkudG9CZSgnbWFpYWtlcicpXG4gICAgICBleHBlY3QocmVzb2x2ZVNpZGViYXJBZ2VudHNOYXZBY3RpdmUob3B0aW9ucy5jaGF0LCBmYWxzZSkpLnRvQmVOdWxsKClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdyZXNvbHZlSW5pdGlhbEN1cnJlbnRPcHRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Jlc3RvcmVzIHNhdmVkIG5hdiBhbmQgdmFsaWRhdGVzIHNhdmVkIG9wdGlvbicsICgpID0+IHtcbiAgICAgIHdpbmRvdy5NQUlBX1NLSUxMU19BQ0NFU1MgPSB0cnVlXG4gICAgICBleHBlY3QocmVzb2x2ZUluaXRpYWxDdXJyZW50T3B0aW9uKCdteUFnZW50cycsIG51bGwsIGJhc2VVc2VyKSkudG9CZShvcHRpb25zLm15QWdlbnRzKVxuICAgICAgZXhwZWN0KHJlc29sdmVJbml0aWFsQ3VycmVudE9wdGlvbignbXlTa2lsbHMnLCBudWxsLCBiYXNlVXNlcikpLnRvQmUob3B0aW9ucy5teVNraWxscylcbiAgICAgIGV4cGVjdChyZXNvbHZlSW5pdGlhbEN1cnJlbnRPcHRpb24obnVsbCwgJ2NoYXQnLCBiYXNlVXNlcikpLnRvQmUob3B0aW9ucy5jaGF0KVxuICAgICAgZXhwZWN0KHJlc29sdmVJbml0aWFsQ3VycmVudE9wdGlvbihudWxsLCAnaW52YWxpZCcsIGJhc2VVc2VyKSkudG9CZShvcHRpb25zLmhvbWUpXG4gICAgfSlcblxuICAgIGl0KCdpZ25vcmVzIHNhdmVkIG15U2tpbGxzIHdoZW4gdGhlIHVzZXIgbGFja3Mgc2tpbGxzIGFjY2VzcycsICgpID0+IHtcbiAgICAgIHdpbmRvdy5NQUlBX1NLSUxMU19BQ0NFU1MgPSBmYWxzZVxuICAgICAgZXhwZWN0KHJlc29sdmVJbml0aWFsQ3VycmVudE9wdGlvbignbXlTa2lsbHMnLCBudWxsLCBiYXNlVXNlcikpLnRvQmUob3B0aW9ucy5ob21lKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2NsYW1wRmxvYXRpbmdQYW5lbFBvc2l0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdrZWVwcyB0aGUgcGFuZWwgaW5zaWRlIHRoZSB2aWV3cG9ydCB3aXRoIHBhZGRpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2xhbXBGbG9hdGluZ1BhbmVsUG9zaXRpb24oMCwgMCwgNDAwLCA2MDAsIDEyMDAsIDgwMCkpLnRvRXF1YWwoeyB4OiAxNiwgeTogMTYgfSlcbiAgICAgIGV4cGVjdChjbGFtcEZsb2F0aW5nUGFuZWxQb3NpdGlvbigyMDAwLCAyMDAwLCA0MDAsIDYwMCwgMTIwMCwgODAwKSkudG9FcXVhbCh7IHg6IDc4NCwgeTogMTg0IH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgncmVzb2x2ZUxlZ2FjeUNvbnRleHRTZXNzaW9uJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGxlZ2FjeSBjbG9uZSBjb250ZXh0IG9ubHkgb24gY2hhdCB2aWV3JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlTGVnYWN5Q29udGV4dFNlc3Npb24ob3B0aW9ucy5jaGF0LCBvcHRpb25zLmNoYXQsIHtcbiAgICAgICAgICBhZ2VudFR5cGU6ICdjbG9uZScsXG4gICAgICAgICAgYWdlbnRFbnRpdHk6ICdwcm9qZWN0JyxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ0FscGhhJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IGVudGl0eVR5cGU6ICdwcm9qZWN0JywgY29udGV4dE5hbWU6ICdBbHBoYScgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlTGVnYWN5Q29udGV4dFNlc3Npb24ob3B0aW9ucy5ob21lLCBvcHRpb25zLmNoYXQsIHtcbiAgICAgICAgICBhZ2VudFR5cGU6ICdjbG9uZScsXG4gICAgICAgICAgYWdlbnRFbnRpdHk6ICdwcm9qZWN0JyxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ0FscGhhJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZU51bGwoKVxuICAgIH0pXG5cbiAgICBpdCgnbWFwcyB0YXNrIGFuZCBjbGllbnQgbmFtZXMgYW5kIGlnbm9yZXMgaW52YWxpZCBlbnRpdGllcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxlZ2FjeUNvbnRleHRTZXNzaW9uKG9wdGlvbnMuY2hhdCwgb3B0aW9ucy5jaGF0LCB7XG4gICAgICAgICAgYWdlbnRUeXBlOiAnY2xvbmUnLFxuICAgICAgICAgIGFnZW50RW50aXR5OiAndGFzaycsXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyBlbnRpdHlUeXBlOiAndGFzaycsIGNvbnRleHROYW1lOiAnJyB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbihvcHRpb25zLmNoYXQsIG9wdGlvbnMuY2hhdCwge1xuICAgICAgICAgIGFnZW50VHlwZTogJ2Nsb25lJyxcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Rhc2snLFxuICAgICAgICAgIHRhc2tOYW1lOiAnQnVnZml4JyxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IGVudGl0eVR5cGU6ICd0YXNrJywgY29udGV4dE5hbWU6ICdCdWdmaXgnIH0pXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxlZ2FjeUNvbnRleHRTZXNzaW9uKG9wdGlvbnMuY2hhdCwgb3B0aW9ucy5jaGF0LCB7XG4gICAgICAgICAgYWdlbnRUeXBlOiAnY2xvbmUnLFxuICAgICAgICAgIGFnZW50RW50aXR5OiAnY2xpZW50JyxcbiAgICAgICAgICBjbGllbnROYW1lOiAnQWNtZScsXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyBlbnRpdHlUeXBlOiAnY2xpZW50JywgY29udGV4dE5hbWU6ICdBY21lJyB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbihvcHRpb25zLmNoYXQsIG9wdGlvbnMuY2hhdCwge1xuICAgICAgICAgIGFnZW50VHlwZTogJ2Nsb25lJyxcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ2dsb2JhbCcsXG4gICAgICAgICAgcHJvamVjdE5hbWU6ICdJZ25vcmVkJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZU51bGwoKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2hhc0FueUFjdGl2ZVNlc3Npb25Jbk1ldGEnLCAoKSA9PiB7XG4gICAgaXQoJ2RldGVjdHMgdGhpbmtpbmcsIHdyaXRpbmcgYW5kIGFwcHJvdmFsIHNlc3Npb25zJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBoYXNBbnlBY3RpdmVTZXNzaW9uSW5NZXRhKHtcbiAgICAgICAgICBhOiB7IHN0YXR1czogJ3RoaW5raW5nJyB9LFxuICAgICAgICAgIGI6IHsgc3RhdHVzOiAnY29tcGxldGUnIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChoYXNBbnlBY3RpdmVTZXNzaW9uSW5NZXRhKHsgYTogeyBzdGF0dXM6ICdjb21wbGV0ZScgfSB9KSkudG9CZShmYWxzZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdwYW5lbCByZXN0b3JlIGFuZCBmbG9hdGluZyBoZWxwZXJzJywgKCkgPT4ge1xuICAgIGl0KCdyZXN0b3JlcyBleHBhbmRlZCBwYW5lbHMgZnJvbSBzYXZlZCBzZXNzaW9uIHNuYXBzaG90cycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRSZXN0b3JlRXhwYW5kZWRQYW5lbCh7IGlzRXhwYW5kZWQ6IHRydWUgfSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZXN0b3JlRXhwYW5kZWRQYW5lbCh7IGlzRXhwYW5kZWQ6IGZhbHNlIH0pKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlc3RvcmVFeHBhbmRlZFBhbmVsKHVuZGVmaW5lZCkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdhbmNob3JzIHRoZSBkZWZhdWx0IGZsb2F0aW5nIHBhbmVsIHRvIHRoZSBib3R0b20tcmlnaHQgY29ybmVyJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVEZWZhdWx0RmxvYXRpbmdQYW5lbFBvc2l0aW9uKDEyMDAsIDQ4MCkpLnRvRXF1YWwoeyB4OiA3MDQsIHk6IDE2IH0pXG4gICAgfSlcblxuICAgIGl0KCdza2lwcyBkcmFnIG9uIGludGVyYWN0aXZlIHRhcmdldHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKVxuICAgICAgZXhwZWN0KHNob3VsZFNraXBGbG9hdGluZ0RyYWdUYXJnZXQoYnV0dG9uKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNraXBGbG9hdGluZ0RyYWdUYXJnZXQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2lzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kJywgKCkgPT4ge1xuICAgIGl0KCdibG9ja3MgYXV0byBzZW5kIHdoZW4gdGhlIEZBUSBpcyBlbXB0eSBvciBhbHJlYWR5IHNlbnQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kKHtcbiAgICAgICAgICBmYXFUaXRsZTogJyAgICcsXG4gICAgICAgICAgYWxyZWFkeVNlbnQ6IGZhbHNlLFxuICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGFnZW50SWQ6ICcxJyxcbiAgICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBpc0Jhbm5lckZhcVJlYWR5VG9BdXRvU2VuZCh7XG4gICAgICAgICAgZmFxVGl0bGU6ICdQcmVndW50YScsXG4gICAgICAgICAgYWxyZWFkeVNlbnQ6IHRydWUsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgYWdlbnRJZDogJzEnLFxuICAgICAgICAgIHNlY3Rpb246ICdoZWFkZXInLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnd2FpdHMgZm9yIHByb2plY3QgYW5kIGNsaWVudCBjb250ZXh0IGJlZm9yZSBhdXRvIHNlbmRpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kKHtcbiAgICAgICAgICBmYXFUaXRsZTogJ1Jlc3Vtw60gZWwgcHJveWVjdG8nLFxuICAgICAgICAgIGFscmVhZHlTZW50OiBmYWxzZSxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBhZ2VudElkOiAnMScsXG4gICAgICAgICAgc2VjdGlvbjogJ3Byb2plY3QnLFxuICAgICAgICAgIHByb2plY3RJZDogbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBpc0Jhbm5lckZhcVJlYWR5VG9BdXRvU2VuZCh7XG4gICAgICAgICAgZmFxVGl0bGU6ICdSZXN1bcOtIGVsIHByb3llY3RvJyxcbiAgICAgICAgICBhbHJlYWR5U2VudDogZmFsc2UsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgYWdlbnRJZDogJzEnLFxuICAgICAgICAgIHNlY3Rpb246ICdwcm9qZWN0JyxcbiAgICAgICAgICBwcm9qZWN0SWQ6IDQyLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdyZXF1aXJlcyBjbGllbnQgY29udGV4dCBmb3IgY2xpZW50IHNlY3Rpb25zIGFuZCBhbGxvd3MgaGVhZGVyIEZBUXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kKHtcbiAgICAgICAgICBmYXFUaXRsZTogJ1ByZWd1bnRhJyxcbiAgICAgICAgICBhbHJlYWR5U2VudDogZmFsc2UsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgYWdlbnRJZDogJzEnLFxuICAgICAgICAgIHNlY3Rpb246ICdjbGllbnQnLFxuICAgICAgICAgIGNsaWVudElkOiBudWxsLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGlzQmFubmVyRmFxUmVhZHlUb0F1dG9TZW5kKHtcbiAgICAgICAgICBmYXFUaXRsZTogJ1ByZWd1bnRhJyxcbiAgICAgICAgICBhbHJlYWR5U2VudDogZmFsc2UsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgYWdlbnRJZDogJzEnLFxuICAgICAgICAgIHNlY3Rpb246ICdjbGllbnQnLFxuICAgICAgICAgIGNsaWVudElkOiA5LFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKHRydWUpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgaXNCYW5uZXJGYXFSZWFkeVRvQXV0b1NlbmQoe1xuICAgICAgICAgIGZhcVRpdGxlOiAnUHJlZ3VudGEnLFxuICAgICAgICAgIGFscmVhZHlTZW50OiBmYWxzZSxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBhZ2VudElkOiAnMScsXG4gICAgICAgICAgc2VjdGlvbjogJ2hlYWRlcicsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdpc0xlZ2FjeUNvbnRleHRFbnRpdHknLCAoKSA9PiB7XG4gICAgaXQoJ2FjY2VwdHMgb25seSBwcm9qZWN0LCB0YXNrIGFuZCBjbGllbnQgZW50aXRpZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNMZWdhY3lDb250ZXh0RW50aXR5KCdwcm9qZWN0JykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc0xlZ2FjeUNvbnRleHRFbnRpdHkoJ2dsb2JhbCcpKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2dldE1haWFIb3N0UGFuZWxQcmVzZW50YXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ2hpZGVzIGV4cGFuZGVkIHBhbmVsIG9uIG1haWEgcGFnZSByb3V0ZSB3aXRob3V0IHNob3dpbmcgdGhlIHBpbGwnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0TWFpYUhvc3RQYW5lbFByZXNlbnRhdGlvbihmYWxzZSwgdHJ1ZSkpLnRvRXF1YWwoe1xuICAgICAgICBoaWRlUGFuZWxDb250ZW50OiB0cnVlLFxuICAgICAgICBzaG93TWluaW1pemVkUGlsbDogZmFsc2UsXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgna2VlcHMgdGhlIHBhbmVsIHZpc2libGUgb24gb3RoZXIgcm91dGVzIHdoZW4gZXhwYW5kZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0TWFpYUhvc3RQYW5lbFByZXNlbnRhdGlvbihmYWxzZSwgZmFsc2UpKS50b0VxdWFsKHtcbiAgICAgICAgaGlkZVBhbmVsQ29udGVudDogZmFsc2UsXG4gICAgICAgIHNob3dNaW5pbWl6ZWRQaWxsOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdzaG93cyB0aGUgcGlsbCBvbmx5IHdoZW4gbWluaW1pemVkIG91dHNpZGUgbWFpYSBwYWdlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGdldE1haWFIb3N0UGFuZWxQcmVzZW50YXRpb24odHJ1ZSwgZmFsc2UpKS50b0VxdWFsKHtcbiAgICAgICAgaGlkZVBhbmVsQ29udGVudDogdHJ1ZSxcbiAgICAgICAgc2hvd01pbmltaXplZFBpbGw6IHRydWUsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KGdldE1haWFIb3N0UGFuZWxQcmVzZW50YXRpb24odHJ1ZSwgdHJ1ZSkpLnRvRXF1YWwoe1xuICAgICAgICBoaWRlUGFuZWxDb250ZW50OiB0cnVlLFxuICAgICAgICBzaG93TWluaW1pemVkUGlsbDogZmFsc2UsXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2Vuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHVzZUZpcnN0QWdlbnQgaXMgZmFsc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnN1cmVBZ2VudHNMb2FkZWQgPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoW2FnZW50KCdhMScpXSlcblxuICAgICAgYXdhaXQgZXhwZWN0KFxuICAgICAgICBlbnN1cmVBZ2VudHNCZWZvcmVTa2lsbFVzZSh7XG4gICAgICAgICAgdXNlRmlyc3RBZ2VudDogZmFsc2UsXG4gICAgICAgICAgYWdlbnRzOiBbXSxcbiAgICAgICAgICBlbnN1cmVBZ2VudHNMb2FkZWQsXG4gICAgICAgIH0pXG4gICAgICApLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKVxuXG4gICAgICBleHBlY3QoZW5zdXJlQWdlbnRzTG9hZGVkKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpXG4gICAgfSlcblxuICAgIGl0KCd1c2VzIHRoZSBpbi1tZW1vcnkgYWdlbnRzIGxpc3Qgd2hlbiBpdCBpcyBhbHJlYWR5IHBvcHVsYXRlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVuc3VyZUFnZW50c0xvYWRlZCA9IGplc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShbYWdlbnQoJ2EyJyldKVxuXG4gICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgIGVuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlKHtcbiAgICAgICAgICB1c2VGaXJzdEFnZW50OiB0cnVlLFxuICAgICAgICAgIGFnZW50czogW2FnZW50KCdhMScpXSxcbiAgICAgICAgICBlbnN1cmVBZ2VudHNMb2FkZWQsXG4gICAgICAgIH0pXG4gICAgICApLnJlc29sdmVzLnRvRXF1YWwoYWdlbnQoJ2ExJykpXG5cbiAgICAgIGV4cGVjdChlbnN1cmVBZ2VudHNMb2FkZWQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKClcbiAgICB9KVxuXG4gICAgaXQoJ2xvYWRzIGFnZW50cyB3aGVuIHRoZSBsaXN0IGlzIGVtcHR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZW5zdXJlQWdlbnRzTG9hZGVkID0gamVzdC5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKFthZ2VudCgnYTEnKSwgYWdlbnQoJ2EyJyldKVxuXG4gICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgIGVuc3VyZUFnZW50c0JlZm9yZVNraWxsVXNlKHtcbiAgICAgICAgICB1c2VGaXJzdEFnZW50OiB0cnVlLFxuICAgICAgICAgIGFnZW50czogW10sXG4gICAgICAgICAgZW5zdXJlQWdlbnRzTG9hZGVkLFxuICAgICAgICB9KVxuICAgICAgKS5yZXNvbHZlcy50b0VxdWFsKGFnZW50KCdhMScpKVxuXG4gICAgICBleHBlY3QoZW5zdXJlQWdlbnRzTG9hZGVkKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICB9KVxuXG4gICAgaXQoJ3JldHVybnMgdW5kZWZpbmVkIHdoZW4gYWdlbnRzIGNhbm5vdCBiZSBsb2FkZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbnN1cmVBZ2VudHNMb2FkZWQgPSBqZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoW10pXG5cbiAgICAgIGF3YWl0IGV4cGVjdChcbiAgICAgICAgZW5zdXJlQWdlbnRzQmVmb3JlU2tpbGxVc2Uoe1xuICAgICAgICAgIHVzZUZpcnN0QWdlbnQ6IHRydWUsXG4gICAgICAgICAgYWdlbnRzOiBbXSxcbiAgICAgICAgICBlbnN1cmVBZ2VudHNMb2FkZWQsXG4gICAgICAgIH0pXG4gICAgICApLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2hvc3QgdGFrZW92ZXIgY29udGV4dCBoZWxwZXJzJywgKCkgPT4ge1xuICAgIGl0KCdtYXBzIHByb2plY3QvdGFzayBzZWN0aW9ucyB0byBwcm9qZWN0IGFuZCB0YXNrIGVudGl0aWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvamVjdCA9IHsgaWQ6IDEsIG5hbWU6ICdBbHBoYScgfSBhcyBjb25zdFxuICAgICAgY29uc3QgdGFzayA9IHsgaWQ6IDksIG5hbWU6ICdCdWcnIH0gYXMgY29uc3RcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUoe1xuICAgICAgICAgIHNlY3Rpb246ICd0YXNrJyxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRhc2ssXG4gICAgICAgIH0pXG4gICAgICApLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBwcm9qZWN0LFxuICAgICAgICB0YXNrLFxuICAgICAgICBjbGVhckdsb2JhbFBpbm5lZENvbnRleHQ6IGZhbHNlLFxuICAgICAgfSlcbiAgICAgIGV4cGVjdChyZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUoeyBzZWN0aW9uOiAndGFzaycsIHByb2plY3QsIHRhc2sgfSkuY2xpZW50KS50b0JlVW5kZWZpbmVkKClcbiAgICB9KVxuXG4gICAgaXQoJ2NsZWFycyBjbGllbnQgb24gaGVhZGVyL3BsYW5uZXIgdGFrZW92ZXIgYW5kIHNldHMgY2xpZW50IG9uIGNsaWVudCBzZWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgY2xpZW50ID0geyBpZDogMiwgbmFtZTogJ0FjbWUnIH0gYXMgY29uc3RcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUoe1xuICAgICAgICAgIHNlY3Rpb246ICdoZWFkZXInLFxuICAgICAgICB9KVxuICAgICAgKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgY2xpZW50OiBudWxsLFxuICAgICAgICB0YXNrOiBudWxsLFxuICAgICAgICBjbGVhckdsb2JhbFBpbm5lZENvbnRleHQ6IHRydWUsXG4gICAgICB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVIb3N0VGFrZW92ZXJFbnRpdHlTdGF0ZSh7XG4gICAgICAgICAgc2VjdGlvbjogJ2NsaWVudCcsXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICB9KVxuICAgICAgKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgY2xpZW50LFxuICAgICAgICBjbGVhckdsb2JhbFBpbm5lZENvbnRleHQ6IGZhbHNlLFxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ2J1aWxkcyBwZXJzaXN0IGhvc3QgY29udGV4dCBmb3IgcGFuZWwgc2Vzc2lvbiBwYXRjaCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb2plY3QgPSB7IGlkOiAzLCBuYW1lOiAnQmV0YScgfSBhcyBjb25zdFxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0KHtcbiAgICAgICAgICBzZWN0aW9uOiAncHJvamVjdCcsXG4gICAgICAgICAgcHJvamVjdCxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7XG4gICAgICAgIHNlY3Rpb246ICdwcm9qZWN0JyxcbiAgICAgICAgcHJvamVjdCxcbiAgICAgICAgY2xpZW50OiBudWxsLFxuICAgICAgICB0YXNrOiBudWxsLFxuICAgICAgICBjaGlwc1Byb2plY3Q6IG51bGwsXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBpdCgnZGVmYXVsdHMgbWlzc2luZyBwcm9qZWN0LCBjbGllbnQgYW5kIHRhc2sgZW50aXRpZXMgb24gdGFrZW92ZXInLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUhvc3RUYWtlb3ZlckVudGl0eVN0YXRlKHsgc2VjdGlvbjogJ3Byb2plY3QnIH0pKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgdGFzazogbnVsbCxcbiAgICAgIH0pXG4gICAgICBleHBlY3QocmVzb2x2ZUhvc3RUYWtlb3ZlckVudGl0eVN0YXRlKHsgc2VjdGlvbjogJ2NsaWVudCcgfSkpLnRvTWF0Y2hPYmplY3QoeyBjbGllbnQ6IG51bGwgfSlcbiAgICAgIGV4cGVjdChyZXNvbHZlSG9zdFRha2VvdmVyRW50aXR5U3RhdGUoeyBzZWN0aW9uOiAndGFzaycsIHByb2plY3Q6IHsgaWQ6IDEgfSBhcyBuZXZlciB9KSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIHRhc2s6IG51bGwsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0KHtcbiAgICAgICAgICBzZWN0aW9uOiAncGxhbm5lcicsXG4gICAgICAgIH0pXG4gICAgICApLnRvTWF0Y2hPYmplY3QoeyBwcm9qZWN0OiBudWxsLCBjbGllbnQ6IG51bGwsIHRhc2s6IG51bGwgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0KHtcbiAgICAgICAgICBzZWN0aW9uOiAnY2xpZW50JyxcbiAgICAgICAgfSlcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IGNsaWVudDogbnVsbCB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkSG9zdFRha2VvdmVyUGVyc2lzdENvbnRleHQoe1xuICAgICAgICAgIHNlY3Rpb246ICdjbGllbnQnLFxuICAgICAgICAgIGNsaWVudDogeyBpZDogOSwgbmFtZTogJ0NsaWVudCcgfSBhcyBuZXZlcixcbiAgICAgICAgfSkuY2xpZW50XG4gICAgICApLnRvRXF1YWwoeyBpZDogOSwgbmFtZTogJ0NsaWVudCcgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZEhvc3RUYWtlb3ZlclBlcnNpc3RDb250ZXh0KHtcbiAgICAgICAgICBzZWN0aW9uOiAndGFzaycsXG4gICAgICAgICAgdGFzazogeyBpZDogMSwgbmFtZTogJ1QnIH0gYXMgbmV2ZXIsXG4gICAgICAgIH0pLnRhc2tcbiAgICAgICkudG9FcXVhbCh7IGlkOiAxLCBuYW1lOiAnVCcgfSlcblxuICAgICAgY29uc3QgcHJvamVjdCA9IHsgaWQ6IDQsIG5hbWU6ICdQJyB9IGFzIGNvbnN0XG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkSG9zdFRha2VvdmVyUGVyc2lzdENvbnRleHQoe1xuICAgICAgICAgIHNlY3Rpb246ICd0YXNrJyxcbiAgICAgICAgICBwcm9qZWN0LFxuICAgICAgICAgIHRhc2s6IHsgaWQ6IDEsIG5hbWU6ICdUJyB9IGFzIG5ldmVyLFxuICAgICAgICB9KVxuICAgICAgKS50b01hdGNoT2JqZWN0KHsgcHJvamVjdCwgdGFzazogeyBpZDogMSwgbmFtZTogJ1QnIH0gfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdtb2RhbCBuYXZpZ2F0aW9uIGFuZCBzZXNzaW9uIGhlbHBlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ25vcm1hbGl6ZXMgYnIgdG8gcHQtYnIgZm9yIG1vZGFsIGkxOG4nLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nKCdicicpKS50b0JlKCdwdC1icicpXG4gICAgICBleHBlY3QocmVzb2x2ZU1haWFNb2RhbEkxOG5MYW5nKCdlcycpKS50b0JlKCdlcycpXG4gICAgfSlcblxuICAgIGl0KCdjaGVja3MgYWdlbnQgbWFuYWdlbWVudCBwZXJtaXNzaW9ucyB3aXRoIG11bHRpLWFnZW50cyBmbGFnJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVVc2VySGFzQWdlbnRNYW5hZ2VtZW50UGVybWlzc2lvbnMoeyBhaV9hZ2VudHM6IHsgY3JlYXRlOiB0cnVlIH0gfSwgdHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChyZXNvbHZlVXNlckhhc0FnZW50TWFuYWdlbWVudFBlcm1pc3Npb25zKHsgYWlfYWdlbnRzOiB7IGVkaXQ6IHRydWUgfSB9LCB0cnVlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHJlc29sdmVVc2VySGFzQWdlbnRNYW5hZ2VtZW50UGVybWlzc2lvbnMoeyBhaV9hZ2VudHM6IHsgZGVsZXRlOiB0cnVlIH0gfSwgdHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChyZXNvbHZlVXNlckhhc0FnZW50TWFuYWdlbWVudFBlcm1pc3Npb25zKHsgYWlfYWdlbnRzOiB7IGNyZWF0ZTogdHJ1ZSB9IH0sIGZhbHNlKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2RlY2lkZXMgd2hlbiB0byBzdGFydCBhIG5ldyBjaGF0IGZyb20gY2F0YWxvZyB2aWV3cycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRTdGFydE5ld0NoYXRGcm9tQ2F0YWxvZyhvcHRpb25zLm15QWdlbnRzLCBmYWxzZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTdGFydE5ld0NoYXRGcm9tQ2F0YWxvZyhvcHRpb25zLmhvbWUsIHRydWUpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU3RhcnROZXdDaGF0RnJvbUNhdGFsb2cob3B0aW9ucy5ob21lLCBmYWxzZSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdoYW5kbGVzIGJhY2sgbmF2aWdhdGlvbiBicmFuY2hlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRCYWNrU3RhcnROZXdDaGF0UHJlc2VydmluZ0NvbnRleHQob3B0aW9ucy5jaGF0LCBvcHRpb25zLmNoYXQpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQmFja0NsZWFyUGlubmVkQ29udGV4dChvcHRpb25zLmhvbWUsIG9wdGlvbnMuaG9tZSwgJ2hlYWRlcicsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZEJhY2tDbGVhclBpbm5lZENvbnRleHQob3B0aW9ucy5ob21lLCBvcHRpb25zLmhvbWUsICdwcm9qZWN0JywgZmFsc2UpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnbWFya3Mgb3JjaGVzdHJhdG9yIGNvbnRleHQgcmVzZXQgb24gcGlubmVkLXRvLWVtcHR5IHRyYW5zaXRpb24nLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkTWFya09yY2hlc3RyYXRvckNvbnRleHRSZXNldCgncHJvamVjdCcsICdvcmNoZXN0cmF0b3InLCB0cnVlLCBmYWxzZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRNYXJrT3JjaGVzdHJhdG9yQ29udGV4dFJlc2V0KCdoZWFkZXInLCAnb3JjaGVzdHJhdG9yJywgdHJ1ZSwgZmFsc2UpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncHJlZmVycyB1bnJlYWQgY2hhdHMgd2hlbiByZXN0b3JpbmcgZnJvbSBtaW5pbWl6ZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjaGF0cyA9IFtcbiAgICAgICAgeyBzZXNzaW9uRXh0ZXJuYWxJZDogJ3MxJywgaXNSZWFkOiB0cnVlIH0sXG4gICAgICAgIHsgc2Vzc2lvbkV4dGVybmFsSWQ6ICdzMicsIGlzUmVhZDogZmFsc2UgfSxcbiAgICAgIF1cbiAgICAgIGV4cGVjdChyZXNvbHZlTWluaW1pemVkUmVzdG9yZVRhcmdldChjaGF0cywgJ3MxJyk/LnNlc3Npb25FeHRlcm5hbElkKS50b0JlKCdzMicpXG4gICAgICBleHBlY3QocmVzb2x2ZU1pbmltaXplZFJlc3RvcmVUYXJnZXQoW3sgc2Vzc2lvbkV4dGVybmFsSWQ6ICdzMScsIGlzUmVhZDogdHJ1ZSB9XSwgJ3MxJyk/LnNlc3Npb25FeHRlcm5hbElkKS50b0JlKFxuICAgICAgICAnczEnXG4gICAgICApXG4gICAgICBleHBlY3QocmVzb2x2ZU1pbmltaXplZFJlc3RvcmVUYXJnZXQoW3sgc2Vzc2lvbkV4dGVybmFsSWQ6ICdzMScsIGlzUmVhZDogdHJ1ZSB9XSwgdW5kZWZpbmVkKSkudG9CZVVuZGVmaW5lZCgpXG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlcyBob3N0IHRha2VvdmVyIGFnZW50IGlkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVIb3N0VGFrZW92ZXJBZ2VudElkKGZhbHNlLCBbYWdlbnQoJ2ExJyldLCAnY3VycmVudCcpKS50b0JlKCdjdXJyZW50JylcbiAgICAgIGV4cGVjdChyZXNvbHZlSG9zdFRha2VvdmVyQWdlbnRJZChmYWxzZSwgW2FnZW50KCdhMScpXSwgdW5kZWZpbmVkKSkudG9CZU51bGwoKVxuICAgICAgZXhwZWN0KHJlc29sdmVIb3N0VGFrZW92ZXJBZ2VudElkKHRydWUsIFthZ2VudCgnYTEnKV0sICdjdXJyZW50JykpLnRvQmUoJ2ExJylcbiAgICAgIGV4cGVjdChyZXNvbHZlSG9zdFRha2VvdmVyQWdlbnRJZCh0cnVlLCBbXSwgJ2N1cnJlbnQnKSkudG9CZU51bGwoKVxuICAgIH0pXG5cbiAgICBpdCgnYnVpbGRzIHBhbmVsIHNlc3Npb24gcGF0Y2ggb25seSB3aGVuIGV4cGFuZGVkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZE1haWFQYW5lbFNlc3Npb25QYXRjaCh7XG4gICAgICAgICAgaXNNaW5pbWl6ZWQ6IHRydWUsXG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGFnZW50c05hdkFjdGl2ZTogbnVsbCxcbiAgICAgICAgICBhY3RpdmVDaGF0SWQ6IG51bGwsXG4gICAgICAgICAgYWdlbnRJZDogbnVsbCxcbiAgICAgICAgICBzaWRlYmFyT3BlbjogZmFsc2UsXG4gICAgICAgICAgbGF5b3V0TW9kZTogJ2Zsb2F0aW5nJyxcbiAgICAgICAgICBkcmFnUG9zaXRpb246IHsgeDogMSwgeTogMiB9LFxuICAgICAgICAgIGhvc3RDb250ZXh0OiB7XG4gICAgICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgICAgIHByb2plY3Q6IG51bGwsXG4gICAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgICB0YXNrOiBudWxsLFxuICAgICAgICAgICAgY2hpcHNQcm9qZWN0OiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRvQmVOdWxsKClcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZE1haWFQYW5lbFNlc3Npb25QYXRjaCh7XG4gICAgICAgICAgaXNNaW5pbWl6ZWQ6IGZhbHNlLFxuICAgICAgICAgIGN1cnJlbnRPcHRpb246IG9wdGlvbnMuY2hhdCxcbiAgICAgICAgICBhZ2VudHNOYXZBY3RpdmU6ICdteUFnZW50cycsXG4gICAgICAgICAgYWN0aXZlQ2hhdElkOiAnY2hhdC0xJyxcbiAgICAgICAgICBhZ2VudElkOiAnMScsXG4gICAgICAgICAgc2lkZWJhck9wZW46IHRydWUsXG4gICAgICAgICAgbGF5b3V0TW9kZTogJ3NpZGViYXInLFxuICAgICAgICAgIGRyYWdQb3NpdGlvbjogeyB4OiAxLCB5OiAyIH0sXG4gICAgICAgICAgaG9zdENvbnRleHQ6IHtcbiAgICAgICAgICAgIHNlY3Rpb246ICdoZWFkZXInLFxuICAgICAgICAgICAgcHJvamVjdDogbnVsbCxcbiAgICAgICAgICAgIGNsaWVudDogbnVsbCxcbiAgICAgICAgICAgIHRhc2s6IG51bGwsXG4gICAgICAgICAgICBjaGlwc1Byb2plY3Q6IG51bGwsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IGFjdGl2ZUNoYXRJZDogJ2NoYXQtMScsIGRyYWdQb3NpdGlvbjogbnVsbCB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTWFpYVBhbmVsU2Vzc2lvblBhdGNoKHtcbiAgICAgICAgICBpc01pbmltaXplZDogZmFsc2UsXG4gICAgICAgICAgY3VycmVudE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICAgIGFnZW50c05hdkFjdGl2ZTogbnVsbCxcbiAgICAgICAgICBhY3RpdmVDaGF0SWQ6ICdjaGF0LTEnLFxuICAgICAgICAgIGFnZW50SWQ6ICcxJyxcbiAgICAgICAgICBzaWRlYmFyT3BlbjogZmFsc2UsXG4gICAgICAgICAgbGF5b3V0TW9kZTogJ2Zsb2F0aW5nJyxcbiAgICAgICAgICBkcmFnUG9zaXRpb246IHsgeDogMywgeTogNCB9LFxuICAgICAgICAgIGhvc3RDb250ZXh0OiB7XG4gICAgICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgICAgIHByb2plY3Q6IG51bGwsXG4gICAgICAgICAgICBjbGllbnQ6IG51bGwsXG4gICAgICAgICAgICB0YXNrOiBudWxsLFxuICAgICAgICAgICAgY2hpcHNQcm9qZWN0OiBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRvTWF0Y2hPYmplY3QoeyBkcmFnUG9zaXRpb246IHsgeDogMywgeTogNCB9IH0pXG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlcyBmbG9hdGluZyBkcmFnIHBvc2l0aW9uIHdpdGggY2xhbXAgZmFsbGJhY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBjbGFtcCA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gKHsgeCwgeSB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlRmxvYXRpbmdQYW5lbERyYWdQb3NpdGlvbih7XG4gICAgICAgICAgbGF5b3V0TW9kZTogJ3NpZGViYXInLFxuICAgICAgICAgIGRyYWdQb3NpdGlvbjogeyB4OiA1LCB5OiA2IH0sXG4gICAgICAgICAgdmlld3BvcnRXaWR0aDogMTIwMCxcbiAgICAgICAgICBwYW5lbFdpZHRoOiA0MDAsXG4gICAgICAgICAgY2xhbXAsXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyB4OiA1LCB5OiA2IH0pXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUZsb2F0aW5nUGFuZWxEcmFnUG9zaXRpb24oe1xuICAgICAgICAgIGxheW91dE1vZGU6ICdmbG9hdGluZycsXG4gICAgICAgICAgZHJhZ1Bvc2l0aW9uOiBudWxsLFxuICAgICAgICAgIHZpZXdwb3J0V2lkdGg6IDEyMDAsXG4gICAgICAgICAgcGFuZWxXaWR0aDogNDAwLFxuICAgICAgICAgIGNsYW1wLFxuICAgICAgICB9KVxuICAgICAgKS50b0VxdWFsKHsgeDogNzg0LCB5OiAxNiB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVGbG9hdGluZ1BhbmVsRHJhZ1Bvc2l0aW9uKHtcbiAgICAgICAgICBsYXlvdXRNb2RlOiAnZmxvYXRpbmcnLFxuICAgICAgICAgIGRyYWdQb3NpdGlvbjogeyB4OiA0MCwgeTogNTAgfSxcbiAgICAgICAgICB2aWV3cG9ydFdpZHRoOiAxMjAwLFxuICAgICAgICAgIHBhbmVsV2lkdGg6IDQwMCxcbiAgICAgICAgICBjbGFtcCxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IHg6IDQwLCB5OiA1MCB9KVxuICAgIH0pXG5cbiAgICBpdCgncmV1c2VzIHByZXZpb3VzIGRyYWcgcG9zaXRpb24gd2hlbiB1bmNoYW5nZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcmV2ID0geyB4OiAxMCwgeTogMjAgfVxuICAgICAgZXhwZWN0KHJlc29sdmVOZXh0RHJhZ1Bvc2l0aW9uKHByZXYsIHsgeDogMTAsIHk6IDIwIH0pKS50b0JlKHByZXYpXG4gICAgICBleHBlY3QocmVzb2x2ZU5leHREcmFnUG9zaXRpb24ocHJldiwgeyB4OiAxMSwgeTogMjAgfSkpLnRvRXF1YWwoeyB4OiAxMSwgeTogMjAgfSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCduYXZpZ2F0aW9uIGFuZCBsZWdhY3kgY29udGV4dCBoZWxwZXJzJywgKCkgPT4ge1xuICAgIGl0KCdyZXNvbHZlcyBwaW5uZWQgY29udGV4dCBhbmQgYmFjayBidXR0b24gdmlzaWJpbGl0eScsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlSGFzUGlubmVkQ29udGV4dCh7IHRhc2tJZDogMSB9KSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHJlc29sdmVIYXNQaW5uZWRDb250ZXh0KHt9KSkudG9CZShmYWxzZSlcblxuICAgICAgY29uc3QgZmxhZ3MgPSByZXNvbHZlT3JjaGVzdHJhdG9ySG9tZU5hdkZsYWdzKHtcbiAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uOiBvcHRpb25zLmNoYXQsXG4gICAgICAgIGhvbWVPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgY2hhdE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICBoYXNQaW5uZWRDb250ZXh0OiB0cnVlLFxuICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgZGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICBleHBlY3QoZmxhZ3MuaXNDaGF0VmlldykudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRTaG93T3JjaGVzdHJhdG9yQmFja0J1dHRvbih7XG4gICAgICAgICAgYWdlbnRUeXBlOiAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgICBoYXNFcnJvcjogZmFsc2UsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgLi4uZmxhZ3MsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcblxuICAgICAgY29uc3Qgc2VjdGlvblJlc2V0RmxhZ3MgPSByZXNvbHZlT3JjaGVzdHJhdG9ySG9tZU5hdkZsYWdzKHtcbiAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICAgIGhvbWVPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgY2hhdE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICBoYXNQaW5uZWRDb250ZXh0OiB0cnVlLFxuICAgICAgICBzZWN0aW9uOiAncHJvamVjdCcsXG4gICAgICAgIGRpZFJlc2V0Q29udGV4dEluU2VjdGlvbjogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICBleHBlY3Qoc2VjdGlvblJlc2V0RmxhZ3MuaXNTZWN0aW9uUmVzZXRIb21lU3RlcDIpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2hvd09yY2hlc3RyYXRvckJhY2tCdXR0b24oe1xuICAgICAgICAgIGFnZW50VHlwZTogJ29yY2hlc3RyYXRvcicsXG4gICAgICAgICAgaGFzRXJyb3I6IHRydWUsXG4gICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgLi4uc2VjdGlvblJlc2V0RmxhZ3MsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2hvd09yY2hlc3RyYXRvckJhY2tCdXR0b24oe1xuICAgICAgICAgIGFnZW50VHlwZTogJ29yY2hlc3RyYXRvcicsXG4gICAgICAgICAgaGFzRXJyb3I6IGZhbHNlLFxuICAgICAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICAgICAgaXNDaGF0VmlldzogdHJ1ZSxcbiAgICAgICAgICBpc0hlYWRlckhvbWVTdGVwMjogZmFsc2UsXG4gICAgICAgICAgaXNTZWN0aW9uUmVzZXRIb21lU3RlcDI6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNob3dPcmNoZXN0cmF0b3JCYWNrQnV0dG9uKHtcbiAgICAgICAgICBhZ2VudFR5cGU6ICdvcmNoZXN0cmF0b3InLFxuICAgICAgICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0NoYXRWaWV3OiBmYWxzZSxcbiAgICAgICAgICBpc0hlYWRlckhvbWVTdGVwMjogZmFsc2UsXG4gICAgICAgICAgaXNTZWN0aW9uUmVzZXRIb21lU3RlcDI6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ2J1aWxkcyBsZWdhY3kgbWlncmF0aW9uIHBhdGNoZXMgZm9yIGNsaWVudCwgcHJvamVjdCBhbmQgdGFzayBlbnRpdGllcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaChudWxsKSkudG9CZU51bGwoKVxuICAgICAgZXhwZWN0KGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHsgYWdlbnRFbnRpdHk6ICdjbGllbnQnIH0pKS50b0JlTnVsbCgpXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHsgYWdlbnRFbnRpdHk6ICdjbGllbnQnLCBjbGllbnRJZDogMywgY2xpZW50TmFtZTogJ0FDTUUnIH0pPy5jbGllbnRcbiAgICAgICkudG9FcXVhbCh7XG4gICAgICAgIGlkOiAzLFxuICAgICAgICBuYW1lOiAnQUNNRScsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaCh7IGFnZW50RW50aXR5OiAncHJvamVjdCcsIHByb2plY3RJZDogOSwgcHJvamVjdE5hbWU6ICdQJyB9KT8uY2hpcHNQcm9qZWN0XG4gICAgICAgICAgPy5wcm9qZWN0SWRcbiAgICAgICkudG9CZSgnOScpXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHtcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Rhc2snLFxuICAgICAgICAgIHRhc2tJZDogMSxcbiAgICAgICAgICB0YXNrTmFtZTogJ1QnLFxuICAgICAgICAgIHByb2plY3RJZDogMixcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ1AnLFxuICAgICAgICAgIGNsaWVudElkOiA0LFxuICAgICAgICAgIGNsaWVudE5hbWU6ICdDJyxcbiAgICAgICAgfSk/LnRhc2tcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IGlkOiAxLCBuYW1lOiAnVCcsIHByb2plY3RJZDogMiB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHtcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Byb2plY3QnLFxuICAgICAgICAgIHByb2plY3RJZDogOSxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ1AnLFxuICAgICAgICAgIGNsaWVudElkOiA0LFxuICAgICAgICAgIGNsaWVudE5hbWU6ICdDJyxcbiAgICAgICAgfSk/LnByb2plY3RcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IGNsaWVudElkOiA0IH0pXG5cbiAgICAgIGV4cGVjdChidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaCh7IGFnZW50RW50aXR5OiAndGFzaycsIHRhc2tJZDogNSwgdGFza05hbWU6ICdPbmx5IHRhc2snIH0pPy50YXNrKS50b0VxdWFsKFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IDUsXG4gICAgICAgICAgbmFtZTogJ09ubHkgdGFzaycsXG4gICAgICAgIH1cbiAgICAgIClcblxuICAgICAgZXhwZWN0KGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHsgYWdlbnRFbnRpdHk6ICdjbGllbnQnLCBjbGllbnRJZDogMSB9KT8uY2xpZW50KS50b0VxdWFsKHtcbiAgICAgICAgaWQ6IDEsXG4gICAgICAgIG5hbWU6ICcnLFxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaCh7XG4gICAgICAgICAgYWdlbnRFbnRpdHk6ICd0YXNrJyxcbiAgICAgICAgICB0YXNrSWQ6IDgsXG4gICAgICAgICAgdGFza05hbWU6ICdUJyxcbiAgICAgICAgICBwcm9qZWN0SWQ6IDIsXG4gICAgICAgICAgcHJvamVjdE5hbWU6ICdQJyxcbiAgICAgICAgfSk/LmNoaXBzUHJvamVjdD8ucHJvamVjdElkXG4gICAgICApLnRvQmUoJzInKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHtcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Rhc2snLFxuICAgICAgICAgIHRhc2tJZDogNixcbiAgICAgICAgICB0YXNrTmFtZTogJ1QnLFxuICAgICAgICAgIGNsaWVudElkOiAzLFxuICAgICAgICAgIGNsaWVudE5hbWU6ICdDJyxcbiAgICAgICAgfSk/LmNsaWVudFxuICAgICAgKS50b0VxdWFsKHsgaWQ6IDMsIG5hbWU6ICdDJyB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkTGVnYWN5Q29udGV4dE1pZ3JhdGlvblBhdGNoKHtcbiAgICAgICAgICBhZ2VudEVudGl0eTogJ3Byb2plY3QnLFxuICAgICAgICAgIHByb2plY3RJZDogOSxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ1AnLFxuICAgICAgICB9KT8ucHJvamVjdFxuICAgICAgKS5ub3QudG9IYXZlUHJvcGVydHkoJ2NsaWVudElkJylcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZExlZ2FjeUNvbnRleHRNaWdyYXRpb25QYXRjaCh7XG4gICAgICAgICAgYWdlbnRFbnRpdHk6ICd0YXNrJyxcbiAgICAgICAgICB0YXNrSWQ6IDEwLFxuICAgICAgICAgIHRhc2tOYW1lOiAnRnVsbCB0YXNrJyxcbiAgICAgICAgICBwcm9qZWN0SWQ6IDExLFxuICAgICAgICAgIHByb2plY3ROYW1lOiAnUHJvaicsXG4gICAgICAgICAgY2xpZW50SWQ6IDEyLFxuICAgICAgICAgIGNsaWVudE5hbWU6ICdDbGllbnQnLFxuICAgICAgICB9KVxuICAgICAgKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgdGFzazogeyBpZDogMTAsIG5hbWU6ICdGdWxsIHRhc2snLCBwcm9qZWN0SWQ6IDExLCBjbGllbnRJZDogMTIgfSxcbiAgICAgICAgY2xpZW50OiB7IGlkOiAxMiwgbmFtZTogJ0NsaWVudCcgfSxcbiAgICAgICAgY2hpcHNQcm9qZWN0OiB7IHByb2plY3RJZDogJzExJywgcHJvamVjdE5hbWU6ICdQcm9qJywgY2xpZW50TmFtZTogJ0NsaWVudCcgfSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlcyBmbG9hdGluZyBkcmFnIGNsYW1wIGFuZCBsYXlvdXQgcG9zaXRpb24gdXBkYXRlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRVc2VEcmFnQ2xhbXBGYWxsYmFjayhudWxsKSkudG9CZSh0cnVlKVxuICAgICAgY29uc3QgY2xhbXAgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+ICh7IHgsIHkgfSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxheW91dERyYWdQb3NpdGlvblVwZGF0ZSgnZmxvYXRpbmcnLCB7IHg6IDQsIHk6IDggfSwgY2xhbXAsIHtcbiAgICAgICAgICBpbm5lcldpZHRoOiAxMDAwLFxuICAgICAgICAgIHBhbmVsV2lkdGg6IDQwMCxcbiAgICAgICAgICBwYWQ6IDE2LFxuICAgICAgICB9KVxuICAgICAgKS50b0VxdWFsKHsgeDogNCwgeTogOCB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlTGF5b3V0RHJhZ1Bvc2l0aW9uVXBkYXRlKCdmbG9hdGluZycsIG51bGwsIGNsYW1wLCB7XG4gICAgICAgICAgaW5uZXJXaWR0aDogMTAwMCxcbiAgICAgICAgICBwYW5lbFdpZHRoOiA0MDAsXG4gICAgICAgICAgcGFkOiAxNixcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IHg6IDU4NCwgeTogMTYgfSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxheW91dERyYWdQb3NpdGlvblVwZGF0ZSgnc2lkZWJhcicsIG51bGwsIGNsYW1wLCB7IGlubmVyV2lkdGg6IDAsIHBhbmVsV2lkdGg6IDAsIHBhZDogMCB9KVxuICAgICAgKS50b0JlTnVsbCgpXG4gICAgICBleHBlY3QocmVzb2x2ZVBlcnNpc3RlZERyYWdQb3NpdGlvbk9uRW5kKCdmbG9hdGluZycsIHt9IGFzIEhUTUxFbGVtZW50KSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHJlc29sdmVQZXJzaXN0ZWREcmFnUG9zaXRpb25PbkVuZCgnc2lkZWJhcicsIHt9IGFzIEhUTUxFbGVtZW50KSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2J1aWxkcyBpbml0aWFsIGNoYXQgbWVzc2FnZSBwYXlsb2FkIGZyb20gc3RhcnQgY2hhdCBhcmdzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGJ1aWxkVXNlckluaXRpYWxNZXNzYWdlRnJvbVN0YXJ0Q2hhdCh7IG1lc3NhZ2U6ICdob2xhJywgZmFxSWQ6ICdmMScgfSkpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBtZXNzYWdlOiAnaG9sYScsXG4gICAgICAgIGZhcUlkOiAnZjEnLFxuICAgICAgICBhdHRhY2htZW50czogW10sXG4gICAgICB9KVxuICAgICAgZXhwZWN0KFxuICAgICAgICBidWlsZFVzZXJJbml0aWFsTWVzc2FnZUZyb21TdGFydENoYXQoe1xuICAgICAgICAgIGF0dGFjaG1lbnRzOiBbeyBpZDogJzEnIH1dLFxuICAgICAgICAgIGFnZW50U3VnZ2VzdGlvbklkOiAnczEnLFxuICAgICAgICAgIG1lbnRpb25zOiBbeyBpZDogJ20xJyB9XSxcbiAgICAgICAgICBmdWFJZDogJ2Z1YScsXG4gICAgICAgICAgc2NJZDogJ3NjJyxcbiAgICAgICAgICBjb250ZXh0RGF0YTogeyB0YXNrSWQ6IDEgfSxcbiAgICAgICAgfSlcbiAgICAgICkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgICBhdHRhY2htZW50czogW3sgaWQ6ICcxJyB9XSxcbiAgICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ6ICdzMScsXG4gICAgICAgIG1lbnRpb25zOiBbeyBpZDogJ20xJyB9XSxcbiAgICAgICAgZnVhSWQ6ICdmdWEnLFxuICAgICAgICBzY0lkOiAnc2MnLFxuICAgICAgICBjb250ZXh0RGF0YTogeyB0YXNrSWQ6IDEgfSxcbiAgICAgIH0pXG4gICAgICBleHBlY3Qoc2hvdWxkUmVzZXRTaWRlYmFyRXJyb3JPblN0YXJ0Q2hhdCh0cnVlKSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgnc3VwcG9ydHMgZ28taG9tZSBhbmQgc2VuZCByb3V0aW5nIGd1YXJkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhckNsaWVudE9uR29Ib21lRnJvbUNoYXQoJ2NsaWVudCcpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlc2V0QWdlbnRUb0ZpcnN0T25Hb0hvbWUoeyBoYXNfbm90X2FjY2VzczogdHJ1ZSB9IGFzIEFnZW50LCAyKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlc2V0QWdlbnRUb0ZpcnN0T25Hb0hvbWUobnVsbCwgMikpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZXNldEFnZW50VG9GaXJzdE9uR29Ib21lKHsgaXNfZGVsZXRlZDogdHJ1ZSB9IGFzIEFnZW50LCAxKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlc2V0QWdlbnRUb0ZpcnN0T25Hb0hvbWUoeyBoYXNfbm90X2FjY2VzczogdHJ1ZSB9IGFzIEFnZW50LCAwKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRVc2VBY3RpdmVDaGF0U2VuZEhhbmRsZXIob3B0aW9ucy5jaGF0LCBvcHRpb25zLmNoYXQsIHRydWUpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoY2FuT3Blbk1haWFNYXJrZXRwbGFjZShmYWxzZSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QoZmluZE9yY2hlc3RyYXRvckFnZW50KFthZ2VudCgnMicpLCBvcmNoZXN0cmF0b3JBZ2VudF0pPy50eXBlKS50b0JlKCdvcmNoZXN0cmF0b3InKVxuICAgICAgZXhwZWN0KHNob3VsZE1hcmtBZ2VudEFzTGVnYWN5Q29udGV4dCh7fSwgeyBpZDogJzEnIH0gYXMgQWdlbnQpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkTWFya0FnZW50QXNMZWdhY3lDb250ZXh0KHt9LCB7IGlkOiAnMScsIGlzX2xlZ2FjeV9jb250ZXh0OiB0cnVlIH0gYXMgQWdlbnQpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KGJ1aWxkTGVnYWN5Q29udGV4dEFnZW50KHsgaWQ6ICcxJywgbmFtZTogJ0EnLCB0eXBlOiAnY3VzdG9tJyB9IGFzIEFnZW50KS5pc19sZWdhY3lfY29udGV4dCkudG9CZSh0cnVlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ21vdW50LCBiYW5uZXIgYW5kIGFnZW50cyBsb2FkaW5nIGhlbHBlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ2NvbnRyb2xzIGNoYXQgdmlzaWJpbGl0eSBhbmQgbGFzdCBhY3RpdmUgY2hhdCBwZXJzaXN0ZW5jZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRTZXRDaGF0Vmlld0hpZGRlbk9uTW91bnQoZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2V0Q2hhdFZpZXdIaWRkZW5Pbk1vdW50KHRydWUpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFBlcnNpc3RMYXN0QWN0aXZlQ2hhdElkKCdjaGF0LTEnKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFBlcnNpc3RMYXN0QWN0aXZlQ2hhdElkKG51bGwpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFN5bmNQYW5lbFNlc3Npb25PblBhZ2VIaWRlKGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFN5bmNQYW5lbFNlc3Npb25PblBhZ2VIaWRlKHRydWUpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnZGV0ZWN0cyBiYW5uZXIgRkFRIHRpdGxlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChoYXNCYW5uZXJGYXFUaXRsZSgnICAnKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChoYXNCYW5uZXJGYXFUaXRsZSgnUHJlZ3VudGEnKSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZXMgY2FjaGVkIGFnZW50cyBhbmQgaW5pdGlhbCBmZXRjaCBhdHRlbXB0cycsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQ2FjaGVkQWdlbnRzSWZBdmFpbGFibGUoW2FnZW50KCcxJyldKSkudG9FcXVhbChbYWdlbnQoJzEnKV0pXG4gICAgICBleHBlY3QocmVzb2x2ZUNhY2hlZEFnZW50c0lmQXZhaWxhYmxlKFtdKSkudG9CZU51bGwoKVxuICAgICAgZXhwZWN0KHNob3VsZEF0dGVtcHRJbml0aWFsQWdlbnRzRmV0Y2goMCwgZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQXR0ZW1wdEluaXRpYWxBZ2VudHNGZXRjaCgwLCB0cnVlKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRBdHRlbXB0SW5pdGlhbEFnZW50c0ZldGNoKDIsIGZhbHNlKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2ZpbmRzIGFnZW50cyBmb3IgY2hhdCBpdGVtcyB3aXRoIG51bWVyaWMgaWRzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGZpbmRBZ2VudEZvckNoYXRJdGVtKFt7IC4uLmFnZW50KCc3JyksIGlkOiAnNycgfSBhcyBBZ2VudF0sIDcpPy5pZCkudG9CZSgnNycpXG4gICAgICBleHBlY3QoZmluZEFnZW50Rm9yQ2hhdEl0ZW0oW2FnZW50KCcxJyldLCA5OSkpLnRvQmVVbmRlZmluZWQoKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2hvc3QgdGFrZW92ZXIgYW5kIG5hdmlnYXRpb24gZ3VhcmRzJywgKCkgPT4ge1xuICAgIGl0KCdhcHBsaWVzIGNsaWVudCB1cGRhdGVzIG9ubHkgd2hlbiBkZWZpbmVkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZEFwcGx5Q2xpZW50T25Ib3N0VGFrZW92ZXIodW5kZWZpbmVkKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRBcHBseUNsaWVudE9uSG9zdFRha2VvdmVyKG51bGwpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQXBwbHlDbGllbnRPbkhvc3RUYWtlb3Zlcih7IGlkOiAxLCBuYW1lOiAnQWNtZScgfSBhcyBuZXZlcikpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ3NlbGVjdHMgZmlyc3QgYWdlbnQgb24gZ2xvYmFsIGhvc3QgdGFrZW92ZXInLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkU2VsZWN0Rmlyc3RBZ2VudE9uSG9zdFRha2VvdmVyKHRydWUsIGFnZW50KCcxJykpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2VsZWN0Rmlyc3RBZ2VudE9uSG9zdFRha2VvdmVyKGZhbHNlLCBhZ2VudCgnMScpKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRTZWxlY3RGaXJzdEFnZW50T25Ib3N0VGFrZW92ZXIodHJ1ZSwgdW5kZWZpbmVkKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2NvdmVycyBnby1ob21lLCBjYXRhbG9nIGFuZCBza2lsbCBhZ2VudCBndWFyZHMnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkUmVzZXRDaGF0U3RhdGVPbkdvSG9tZShvcHRpb25zLmNoYXQsIG9wdGlvbnMuY2hhdCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZXNldENoYXRTdGF0ZU9uR29Ib21lKG9wdGlvbnMuaG9tZSwgb3B0aW9ucy5jaGF0KSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhckNvbnRleHRGb3JDYXRhbG9nT3JTa2lsbEFnZW50KGFnZW50KCcxJykpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQ2xlYXJDb250ZXh0Rm9yQ2F0YWxvZ09yU2tpbGxBZ2VudCh1bmRlZmluZWQpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZENsZWFyVGFza09uR29Ib21lRnJvbUNoYXQoJ3Rhc2snKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhclRhc2tPbkdvSG9tZUZyb21DaGF0KCdoZWFkZXInKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZENsZWFyT3JjaGVzdHJhdG9yR2xvYmFsQ29udGV4dE9uR29Ib21lKCdoZWFkZXInLCAnb3JjaGVzdHJhdG9yJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRDbGVhck9yY2hlc3RyYXRvckdsb2JhbENvbnRleHRPbkdvSG9tZSgncHJvamVjdCcsICdvcmNoZXN0cmF0b3InKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRQcmVmZXRjaEFnZW50c0ZvckNhdGFsb2dOZXdDaGF0KG9wdGlvbnMubXlBZ2VudHMsIG9wdGlvbnMubXlBZ2VudHMsIG9wdGlvbnMubXlTa2lsbHMpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkUHJlZmV0Y2hBZ2VudHNGb3JDYXRhbG9nTmV3Q2hhdChvcHRpb25zLmhvbWUsIG9wdGlvbnMubXlBZ2VudHMsIG9wdGlvbnMubXlTa2lsbHMpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZXMgb3Blbi1uZXctY2hhdC13aXRoLWFnZW50IGNvbnRleHQgcGF0Y2hlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlT3Blbk5ld0NoYXRXaXRoQWdlbnRDb250ZXh0KHsgcHJvamVjdDogeyBpZDogMSwgbmFtZTogJ1AnIH0gYXMgbmV2ZXIgfSkpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBwcm9qZWN0OiB7IGlkOiAxLCBuYW1lOiAnUCcgfSxcbiAgICAgICAgc2hvdWxkU2V0VGFzazogZmFsc2UsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KHJlc29sdmVPcGVuTmV3Q2hhdFdpdGhBZ2VudENvbnRleHQoeyB0YXNrOiB7IGlkOiAyLCBuYW1lOiAnVCcgfSBhcyBuZXZlciB9KS5zaG91bGRTZXRUYXNrKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCd2YWxpZGF0ZXMgbGVnYWN5IGNvbnRleHQgY29udGludWF0aW9uJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNhbkNvbnRpbnVlTGVnYWN5Q29udGV4dEluTmV3Q2hhdCh7IGFnZW50RW50aXR5OiAndGFzaycgfSwgb3JjaGVzdHJhdG9yQWdlbnQpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoY2FuQ29udGludWVMZWdhY3lDb250ZXh0SW5OZXdDaGF0KG51bGwsIG9yY2hlc3RyYXRvckFnZW50KSkudG9CZShmYWxzZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdzZXNzaW9uIHJlc3RvcmUgcm91dGluZycsICgpID0+IHtcbiAgICBpdCgnbWFwcyBzbmFwc2hvdCBuYXYgcm91dGVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVTZXNzaW9uUmVzdG9yZU5hdlJvdXRlKHsgYWdlbnRzTmF2QWN0aXZlOiAnbXlBZ2VudHMnIH0pKS50b0JlKCdteUFnZW50cycpXG4gICAgICBleHBlY3QocmVzb2x2ZVNlc3Npb25SZXN0b3JlTmF2Um91dGUoeyBhZ2VudHNOYXZBY3RpdmU6ICdteVNraWxscycgfSkpLnRvQmUoJ215U2tpbGxzJylcbiAgICAgIGV4cGVjdChyZXNvbHZlU2Vzc2lvblJlc3RvcmVOYXZSb3V0ZSh7IGFnZW50c05hdkFjdGl2ZTogJ21haWFrZXInIH0pKS50b0JlKCdtYWlha2VyJylcbiAgICAgIGV4cGVjdChyZXNvbHZlU2Vzc2lvblJlc3RvcmVOYXZSb3V0ZSh7IGN1cnJlbnRPcHRpb246ICdjaGF0JywgYWN0aXZlQ2hhdElkOiAncy0xJyB9KSkudG9CZSgnY2hhdCcpXG4gICAgICBleHBlY3QocmVzb2x2ZVNlc3Npb25SZXN0b3JlTmF2Um91dGUoeyBjdXJyZW50T3B0aW9uOiAnaG9tZScgfSkpLnRvQmUoJ3NhdmVkT3B0aW9uJylcbiAgICAgIGV4cGVjdChyZXNvbHZlU2Vzc2lvblJlc3RvcmVOYXZSb3V0ZSh7IGN1cnJlbnRPcHRpb246ICdpbnZhbGlkJyB9KSkudG9CZSgnbm9uZScpXG4gICAgfSlcblxuICAgIGl0KCdjb250cm9scyBhZ2VudHMgbG9hZCBicmFuY2hlcyBkdXJpbmcgcmVzdG9yZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRTa2lwQWdlbnRzTG9hZE9uU2Vzc2lvblJlc3RvcmUoJ215U2tpbGxzJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTa2lwQWdlbnRzTG9hZE9uU2Vzc2lvblJlc3RvcmUoJ215QWdlbnRzJykpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkRmV0Y2hBZ2VudERldGFpbE9uU2Vzc2lvblJlc3RvcmUoJ2ExJywgJ21haWFrZXInKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZEZldGNoQWdlbnREZXRhaWxPblNlc3Npb25SZXN0b3JlKCdhMScsICdteUFnZW50cycpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFBhc3NBZ2VudFRvR2V0QWdlbnRzT25SZXN0b3JlKCdteUFnZW50cycpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFBhc3NBZ2VudFRvR2V0QWdlbnRzT25SZXN0b3JlKCdtYWlha2VyJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTZWxlY3RGZXRjaGVkQWdlbnRBZnRlclJlc3RvcmUoYWdlbnQoJzEnKSwgJ21haWFrZXInKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNlbGVjdEZldGNoZWRBZ2VudEFmdGVyUmVzdG9yZShhZ2VudCgnMScpLCAnbXlBZ2VudHMnKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ3Jlc3RvcmVzIGNoaXBzIHByb2plY3QgZnJvbSBzbmFwc2hvdCBob3N0IGNvbnRleHQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVTbmFwc2hvdENoaXBzUHJvamVjdCh7XG4gICAgICAgICAgY2hpcHNQcm9qZWN0OiB7IHByb2plY3RJZDogJzknLCBwcm9qZWN0TmFtZTogJ1AnLCBjbGllbnROYW1lOiAnQycgfSxcbiAgICAgICAgfSk/LnByb2plY3RJZFxuICAgICAgKS50b0JlKCc5JylcbiAgICAgIGV4cGVjdChyZXNvbHZlU25hcHNob3RDaGlwc1Byb2plY3QobnVsbCkpLnRvQmVOdWxsKClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdsYXlvdXQgYW5kIG1vZGFsIHZpc2liaWxpdHkgaGVscGVycycsICgpID0+IHtcbiAgICBpdCgncmVzb2x2ZXMgc2VjdGlvbiBmbGFncyBhbmQgc2lkZWJhciB2aXNpYmlsaXR5JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVDaGF0TW9kYWxTZWN0aW9uRmxhZ3Mob3B0aW9ucy5jaGF0LCBmYWxzZSkpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBzaG93TmV3Q2hhdDogZmFsc2UsXG4gICAgICAgIGlzTXlBZ2VudHNTZWN0aW9uOiBmYWxzZSxcbiAgICAgIH0pXG4gICAgICBleHBlY3QocmVzb2x2ZUNoYXRNb2RhbFNlY3Rpb25GbGFncyhvcHRpb25zLmhvbWUsIHRydWUpKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgaXNNYWlha2VyQ3JlYXRvckhvbWU6IHRydWUsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KHNob3VsZFJlbmRlckNoYXRTaWRlYmFyKHRydWUsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlbmRlckNoYXRTaWRlYmFyKHRydWUsIHRydWUpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZXMgbWFpbiBjb250ZW50IHZpZXcgYW5kIGZvb3RlciB2aXNpYmlsaXR5JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVDaGF0TW9kYWxNYWluQ29udGVudFZpZXcodHJ1ZSwgdHJ1ZSkpLnRvQmUoJ2Vycm9yJylcbiAgICAgIGV4cGVjdChyZXNvbHZlQ2hhdE1vZGFsTWFpbkNvbnRlbnRWaWV3KGZhbHNlLCB0cnVlKSkudG9CZSgnY2hhdCcpXG4gICAgICBleHBlY3QocmVzb2x2ZUNoYXRNb2RhbE1haW5Db250ZW50VmlldyhmYWxzZSwgZmFsc2UpKS50b0JlKCdwcm9qZWN0U3VtbWFyeScpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2hvd0NoYXRNb2RhbEZvb3Rlcih7XG4gICAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uOiBvcHRpb25zLmNoYXQsXG4gICAgICAgICAgaG9tZU9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGNoYXRPcHRpb246IG9wdGlvbnMuY2hhdCxcbiAgICAgICAgICBhZ2VudHNDb3VudDogMCxcbiAgICAgICAgICBpc01haWFrZXJDcmVhdG9ySG9tZTogZmFsc2UsXG4gICAgICAgICAgaGFzRXJyb3I6IGZhbHNlLFxuICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGhhc0FjY2VzczogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNob3dDaGF0TW9kYWxGb290ZXIoe1xuICAgICAgICAgIGNvbXB1dGVkQ3VycmVudE9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGhvbWVPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgICBjaGF0T3B0aW9uOiBvcHRpb25zLmNoYXQsXG4gICAgICAgICAgYWdlbnRzQ291bnQ6IDAsXG4gICAgICAgICAgaXNNYWlha2VyQ3JlYXRvckhvbWU6IGZhbHNlLFxuICAgICAgICAgIGhhc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBoYXNBY2Nlc3M6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2hvd0NoYXRNb2RhbEZvb3Rlcih7XG4gICAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uOiBvcHRpb25zLmhvbWUsXG4gICAgICAgICAgaG9tZU9wdGlvbjogb3B0aW9ucy5ob21lLFxuICAgICAgICAgIGNoYXRPcHRpb246IG9wdGlvbnMuY2hhdCxcbiAgICAgICAgICBhZ2VudHNDb3VudDogMixcbiAgICAgICAgICBpc01haWFrZXJDcmVhdG9ySG9tZTogZmFsc2UsXG4gICAgICAgICAgaGFzRXJyb3I6IGZhbHNlLFxuICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGhhc0FjY2VzczogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgnY292ZXJzIGZsb2F0aW5nIGRyYWcgYW5kIGVsZXZhdGVkIHBhbmVsIGJyYW5jaGVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZENsZWFyRHJhZ1Bvc2l0aW9uT25MYXlvdXRDaGFuZ2UoJ3NpZGViYXInKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZENsZWFyRHJhZ1Bvc2l0aW9uT25MYXlvdXRDaGFuZ2UoJ2Zsb2F0aW5nJykpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkUGVyc2lzdERyYWdQb3NpdGlvbk9uRHJhZ0VuZCgnZmxvYXRpbmcnKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFN0YXJ0RmxvYXRpbmdQYW5lbERyYWcodHJ1ZSwgMCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTdGFydEZsb2F0aW5nUGFuZWxEcmFnKHRydWUsIDEpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KGlzQWN0aXZlRmxvYXRpbmdEcmFnUG9pbnRlcigxLCAxKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGlzQWN0aXZlRmxvYXRpbmdEcmFnUG9pbnRlcigxLCAyKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRVc2VFbGV2YXRlZE1haWFQYW5lbCgndGFzaycpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaXNHbG9iYWxNYWlhU2VjdGlvbignaGVhZGVyJykpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ2NvdmVycyBkZWxldGUgYWdlbnQgYW5kIHNraWxscyBjYXRhbG9nIGd1YXJkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRSZXNlbGVjdEFnZW50QWZ0ZXJEZWxldGUoJ2ExJywgJ2ExJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZXNlbGVjdEFnZW50QWZ0ZXJEZWxldGUoJ2ExJywgJ2EyJykpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkT3BlblNraWxsc0NhdGFsb2codHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRPcGVuU2tpbGxzQ2F0YWxvZyhmYWxzZSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdoaWRlcyB0aGUgZm9vdGVyIG9uIG1haWFrZXIgaG9tZSwgZXJyb3JzLCBsb2FkaW5nIG9yIG1pc3NpbmcgYWNjZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IHtcbiAgICAgICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uOiBvcHRpb25zLmNoYXQsXG4gICAgICAgIGhvbWVPcHRpb246IG9wdGlvbnMuaG9tZSxcbiAgICAgICAgY2hhdE9wdGlvbjogb3B0aW9ucy5jaGF0LFxuICAgICAgICBhZ2VudHNDb3VudDogMCxcbiAgICAgICAgaXNNYWlha2VyQ3JlYXRvckhvbWU6IGZhbHNlLFxuICAgICAgICBoYXNFcnJvcjogZmFsc2UsXG4gICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICBoYXNBY2Nlc3M6IHRydWUsXG4gICAgICB9XG5cbiAgICAgIGV4cGVjdChzaG91bGRTaG93Q2hhdE1vZGFsRm9vdGVyKHsgLi4uYmFzZSwgaXNNYWlha2VyQ3JlYXRvckhvbWU6IHRydWUgfSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd0NoYXRNb2RhbEZvb3Rlcih7IC4uLmJhc2UsIGhhc0Vycm9yOiB0cnVlIH0pKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dDaGF0TW9kYWxGb290ZXIoeyAuLi5iYXNlLCBsb2FkaW5nOiB0cnVlIH0pKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dDaGF0TW9kYWxGb290ZXIoeyAuLi5iYXNlLCBoYXNBY2Nlc3M6IGZhbHNlIH0pKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnYnVpbGRzIHN0YXJ0LWNoYXQgcGF5bG9hZHMgYW5kIGRyYWcgcG9zaXRpb24gdXBkYXRlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgYnVpbGRVc2VySW5pdGlhbE1lc3NhZ2VGcm9tU3RhcnRDaGF0KHtcbiAgICAgICAgICBtZXNzYWdlOiAnSG9sYScsXG4gICAgICAgICAgYXR0YWNobWVudHM6IFt7IGlkOiAnMScgfV0sXG4gICAgICAgICAgZmFxSWQ6ICdmYXEtMScsXG4gICAgICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ6ICdzdWctMScsXG4gICAgICAgICAgbWVudGlvbnM6IFt7IGlkOiAnbTEnIH1dLFxuICAgICAgICAgIGZ1YUlkOiAnZnVhLTEnLFxuICAgICAgICAgIHNjSWQ6ICdzYy0xJyxcbiAgICAgICAgICBjb250ZXh0RGF0YTogeyBwcm9qZWN0SWQ6IDEgfSxcbiAgICAgICAgfSlcbiAgICAgICkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIG1lc3NhZ2U6ICdIb2xhJyxcbiAgICAgICAgZmFxSWQ6ICdmYXEtMScsXG4gICAgICAgIGFnZW50U3VnZ2VzdGlvbklkOiAnc3VnLTEnLFxuICAgICAgICBtZW50aW9uczogW3sgaWQ6ICdtMScgfV0sXG4gICAgICAgIGZ1YUlkOiAnZnVhLTEnLFxuICAgICAgICBzY0lkOiAnc2MtMScsXG4gICAgICAgIGNvbnRleHREYXRhOiB7IHByb2plY3RJZDogMSB9LFxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlTGF5b3V0RHJhZ1Bvc2l0aW9uVXBkYXRlKCdzaWRlYmFyJywgeyB4OiAxLCB5OiAyIH0sICh4LCB5KSA9PiAoeyB4LCB5IH0pLCB7XG4gICAgICAgICAgaW5uZXJXaWR0aDogMTAwMCxcbiAgICAgICAgICBwYW5lbFdpZHRoOiA0MDAsXG4gICAgICAgICAgcGFkOiAxNixcbiAgICAgICAgfSlcbiAgICAgICkudG9CZU51bGwoKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVMYXlvdXREcmFnUG9zaXRpb25VcGRhdGUoJ2Zsb2F0aW5nJywgbnVsbCwgKHgsIHkpID0+ICh7IHgsIHkgfSksIHtcbiAgICAgICAgICBpbm5lcldpZHRoOiAxMDAwLFxuICAgICAgICAgIHBhbmVsV2lkdGg6IDQwMCxcbiAgICAgICAgICBwYWQ6IDE2LFxuICAgICAgICB9KVxuICAgICAgKS50b0VxdWFsKHsgeDogNTg0LCB5OiAxNiB9KVxuXG4gICAgICBleHBlY3QocmVzb2x2ZVBlcnNpc3RlZERyYWdQb3NpdGlvbk9uRW5kKCdmbG9hdGluZycsIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHJlc29sdmVQZXJzaXN0ZWREcmFnUG9zaXRpb25PbkVuZCgnc2lkZWJhcicsIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKSkudG9CZShmYWxzZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdkaXNwYXRjaFNraWxsTWVudGlvbkluc2VydCcsICgpID0+IHtcbiAgICBpdCgnZGlzcGF0Y2hlcyB0aGUgc2tpbGwgbWVudGlvbiBhZnRlciB0d28gYW5pbWF0aW9uIGZyYW1lcycsICgpID0+IHtcbiAgICAgIGplc3QudXNlRmFrZVRpbWVycygpXG4gICAgICBjb25zdCByYWYgPSBqZXN0XG4gICAgICAgIC5zcHlPbih3aW5kb3csICdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnKVxuICAgICAgICAubW9ja0ltcGxlbWVudGF0aW9uKGNhbGxiYWNrID0+IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKDApLCAwKSBhcyB1bmtub3duIGFzIG51bWJlcilcblxuICAgICAgY29uc3Qgb25JbnNlcnQgPSBqZXN0LmZuKClcbiAgICAgIGNvbnN0IG9uUmVmb2N1cyA9IGplc3QuZm4oKVxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1pbnNlcnQtc2tpbGwtbWVudGlvbicsIG9uSW5zZXJ0KVxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1pbnB1dC1yZWZvY3VzJywgb25SZWZvY3VzKVxuXG4gICAgICBkaXNwYXRjaFNraWxsTWVudGlvbkluc2VydCh7IGlkOiAnc2sxJywgbmFtZTogJ1Jlc3VtaXInIH0pXG5cbiAgICAgIGV4cGVjdChvbkluc2VydCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKVxuXG4gICAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG5cbiAgICAgIGV4cGVjdChvbkluc2VydCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpXG4gICAgICBleHBlY3Qob25SZWZvY3VzKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSlcbiAgICAgIGNvbnN0IGV2ZW50ID0gb25JbnNlcnQubW9jay5jYWxsc1swXVswXSBhcyBDdXN0b21FdmVudFxuICAgICAgZXhwZWN0KGV2ZW50LmRldGFpbC5za2lsbCkudG9FcXVhbCh7IGlkOiAnc2sxJywgbmFtZTogJ1Jlc3VtaXInIH0pXG5cbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtaW5zZXJ0LXNraWxsLW1lbnRpb24nLCBvbkluc2VydClcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtaW5wdXQtcmVmb2N1cycsIG9uUmVmb2N1cylcbiAgICAgIHJhZi5tb2NrUmVzdG9yZSgpXG4gICAgICBqZXN0LnVzZVJlYWxUaW1lcnMoKVxuICAgIH0pXG4gIH0pXG59KVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLFNBQVNBLFdBQVcsUUFBUSwyQkFBMkI7QUFFdkQsU0FBU0MsT0FBTyxRQUFRLGFBQWE7QUFDckMsU0FDRUMsMEJBQTBCLEVBQzFCQywwQkFBMEIsRUFDMUJDLDBCQUEwQixFQUMxQkMsNEJBQTRCLEVBQzVCQyx5QkFBeUIsRUFDekJDLDBCQUEwQixFQUMxQkMscUJBQXFCLEVBQ3JCQyw0QkFBNEIsRUFDNUJDLDRCQUE0QixFQUM1QkMsbUNBQW1DLEVBQ25DQywyQkFBMkIsRUFDM0JDLDJCQUEyQixFQUMzQkMsNkJBQTZCLEVBQzdCQywwQkFBMEIsRUFDMUJDLDRCQUE0QixFQUM1QkMsdUJBQXVCLEVBQ3ZCQyw4QkFBOEIsRUFDOUJDLCtCQUErQixFQUMvQkMsMEJBQTBCLEVBQzFCQyxnQ0FBZ0MsRUFDaENDLDBCQUEwQixFQUMxQkMsd0JBQXdCLEVBQ3hCQyw2QkFBNkIsRUFDN0JDLHVCQUF1QixFQUN2QkMsd0NBQXdD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