@ukhomeoffice/cop-react-form-renderer 7.3.2-alpha.5 → 8.0.0-alpha

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 (761) hide show
  1. package/README.md +106 -32
  2. package/dist/components/CheckYourAnswers/Answer.d.ts +10 -0
  3. package/dist/components/CheckYourAnswers/CheckYourAnswers.d.ts +35 -0
  4. package/dist/components/CheckYourAnswers/index.d.ts +2 -0
  5. package/dist/components/CollectionPage/CollectionPage.d.ts +24 -0
  6. package/dist/components/CollectionPage/index.d.ts +1 -0
  7. package/dist/components/CollectionSummary/BannerStrip.d.ts +9 -0
  8. package/dist/components/CollectionSummary/CollectionSummary.d.ts +53 -0
  9. package/dist/components/CollectionSummary/Confirmation.d.ts +15 -0
  10. package/dist/components/CollectionSummary/RenderListView.d.ts +42 -0
  11. package/dist/components/CollectionSummary/SummaryCard.d.ts +62 -0
  12. package/dist/components/CollectionSummary/SummaryCardButtons.d.ts +21 -0
  13. package/dist/components/CollectionSummary/SummaryCardDetails.d.ts +14 -0
  14. package/dist/components/CollectionSummary/SummaryCardValidationContext.d.ts +9 -0
  15. package/dist/components/CollectionSummary/index.d.ts +2 -0
  16. package/dist/components/FormComponent/Collection.d.ts +39 -0
  17. package/dist/components/FormComponent/Container.d.ts +26 -0
  18. package/dist/components/FormComponent/FormComponent.d.ts +39 -0
  19. package/dist/components/FormComponent/helpers/addLabel.d.ts +7 -0
  20. package/dist/components/FormComponent/helpers/getComponentDisabled.d.ts +2 -0
  21. package/dist/components/FormComponent/helpers/getComponentError.d.ts +4 -0
  22. package/dist/components/FormComponent/helpers/getComponentFieldSet.d.ts +2 -0
  23. package/dist/components/FormComponent/helpers/index.d.ts +5 -0
  24. package/dist/components/FormComponent/index.d.ts +2 -0
  25. package/dist/components/FormPage/FormPage.d.ts +36 -0
  26. package/dist/components/FormPage/index.d.ts +2 -0
  27. package/dist/components/FormRenderer/FormRenderer.d.ts +39 -0
  28. package/dist/components/FormRenderer/handlers/cyaAction.d.ts +9 -0
  29. package/dist/components/FormRenderer/handlers/getPageId.d.ts +8 -0
  30. package/dist/components/FormRenderer/handlers/index.d.ts +6 -0
  31. package/dist/components/FormRenderer/handlers/navigate.d.ts +10 -0
  32. package/dist/components/FormRenderer/handlers/submissionError.d.ts +7 -0
  33. package/dist/components/FormRenderer/helpers/canActionProceed.d.ts +12 -0
  34. package/dist/components/FormRenderer/helpers/canCYASubmit.d.ts +10 -0
  35. package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.d.ts +2 -0
  36. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.d.ts +51 -0
  37. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.d.ts +179 -0
  38. package/dist/components/FormRenderer/helpers/getCYA.d.ts +20 -0
  39. package/dist/components/FormRenderer/helpers/getFormState.d.ts +25 -0
  40. package/dist/components/FormRenderer/helpers/getNextPageId.d.ts +2 -0
  41. package/dist/components/FormRenderer/helpers/getPage.d.ts +9 -0
  42. package/dist/components/FormRenderer/helpers/getRelevantPages.d.ts +2 -0
  43. package/dist/components/FormRenderer/helpers/getSubmissionStatus.d.ts +2 -0
  44. package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.d.ts +10 -0
  45. package/dist/components/FormRenderer/helpers/index.d.ts +29 -0
  46. package/dist/components/FormRenderer/index.d.ts +2 -0
  47. package/dist/components/FormRenderer/onCYAAction.d.ts +6 -0
  48. package/dist/components/FormRenderer/onPageAction.d.ts +2 -0
  49. package/dist/components/FormRenderer/onTaskAction.d.ts +2 -0
  50. package/dist/components/PageActions/ActionButton.d.ts +7 -0
  51. package/dist/components/PageActions/PageActions.d.ts +7 -0
  52. package/dist/components/PageActions/index.d.ts +2 -0
  53. package/dist/components/SummaryList/GroupAction.d.ts +12 -0
  54. package/dist/components/SummaryList/RowAction.d.ts +12 -0
  55. package/dist/components/SummaryList/SummaryList.d.ts +28 -0
  56. package/dist/components/SummaryList/SummaryList.stories.d.ts +10 -0
  57. package/dist/components/SummaryList/SummaryListHeadingRow.d.ts +7 -0
  58. package/dist/components/SummaryList/SummaryListHeadingRowWithAction.d.ts +16 -0
  59. package/dist/components/SummaryList/SummaryListRow.d.ts +19 -0
  60. package/dist/components/SummaryList/SummaryListTitleRow.d.ts +7 -0
  61. package/dist/components/SummaryList/helpers/getGroupActionAttributes.d.ts +17 -0
  62. package/dist/components/SummaryList/helpers/getRowActionAttributes.d.ts +17 -0
  63. package/dist/components/SummaryList/helpers/index.d.ts +2 -0
  64. package/dist/components/SummaryList/index.d.ts +2 -0
  65. package/dist/components/TaskList/Task.d.ts +12 -0
  66. package/dist/components/TaskList/TaskList.d.ts +40 -0
  67. package/dist/components/TaskList/TaskState.d.ts +6 -0
  68. package/dist/components/TaskList/index.d.ts +2 -0
  69. package/dist/components/index.d.ts +8 -0
  70. package/dist/context/HooksContext/HooksContext.d.ts +23 -0
  71. package/dist/context/HooksContext/index.d.ts +3 -0
  72. package/dist/context/ValidationContext/ValidationContext.d.ts +7 -0
  73. package/dist/context/ValidationContext/index.d.ts +3 -0
  74. package/dist/context/index.d.ts +3 -0
  75. package/dist/hooks/index.d.ts +6 -0
  76. package/dist/hooks/useAxios.d.ts +2 -0
  77. package/dist/hooks/useGetRequest.d.ts +12 -0
  78. package/dist/hooks/useHooks.d.ts +2 -0
  79. package/dist/hooks/useRefData.d.ts +7 -0
  80. package/dist/hooks/useValidation.d.ts +2 -0
  81. package/dist/index.cjs +5 -0
  82. package/dist/index.css +1 -0
  83. package/dist/index.d.ts +6 -0
  84. package/dist/index.js +6124 -81
  85. package/dist/models/CollectionLabels.d.ts +7 -0
  86. package/dist/models/ComponentTypes.d.ts +27 -0
  87. package/dist/models/EventTypes.d.ts +6 -0
  88. package/dist/models/FormPages.d.ts +6 -0
  89. package/dist/models/FormTypes.d.ts +10 -0
  90. package/dist/models/HubFormats.d.ts +5 -0
  91. package/dist/models/PageAction.d.ts +89 -0
  92. package/dist/models/TaskStates.d.ts +39 -0
  93. package/dist/models/index.d.ts +143 -0
  94. package/dist/setupTests.d.ts +14 -0
  95. package/dist/utils/CheckYourAnswers/getCYAAction.d.ts +20 -0
  96. package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.d.ts +22 -0
  97. package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.d.ts +22 -0
  98. package/dist/utils/CheckYourAnswers/getCYARow.d.ts +26 -0
  99. package/dist/utils/CheckYourAnswers/getCYARowForGroup.d.ts +17 -0
  100. package/dist/utils/CheckYourAnswers/getCYARowsForCollection.d.ts +2 -0
  101. package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.d.ts +23 -0
  102. package/dist/utils/CheckYourAnswers/getCYARowsForContainer.d.ts +2 -0
  103. package/dist/utils/CheckYourAnswers/getCYARowsForPage.d.ts +11 -0
  104. package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.d.ts +3 -0
  105. package/dist/utils/CheckYourAnswers/index.d.ts +5 -0
  106. package/dist/utils/CheckYourAnswers/showComponentCYA.d.ts +11 -0
  107. package/dist/utils/CollectionPage/addCollectionPageEntry.d.ts +12 -0
  108. package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.d.ts +13 -0
  109. package/dist/utils/CollectionPage/duplicateCollectionPageEntry.d.ts +13 -0
  110. package/dist/utils/CollectionPage/getCollectionPageActiveId.d.ts +14 -0
  111. package/dist/utils/CollectionPage/getCollectionPageActiveIndex.d.ts +15 -0
  112. package/dist/utils/CollectionPage/getCollectionPageData.d.ts +15 -0
  113. package/dist/utils/CollectionPage/getErrorsForCollection.d.ts +2 -0
  114. package/dist/utils/CollectionPage/getQuickEditPage.d.ts +40 -0
  115. package/dist/utils/CollectionPage/index.d.ts +13 -0
  116. package/dist/utils/CollectionPage/mergeCollectionPages.d.ts +13 -0
  117. package/dist/utils/CollectionPage/removeCollectionPageEntry.d.ts +11 -0
  118. package/dist/utils/CollectionPage/setCollectionPageData.d.ts +16 -0
  119. package/dist/utils/Component/addShowWhen.d.ts +13 -0
  120. package/dist/utils/Component/applyToComponentTree.d.ts +15 -0
  121. package/dist/utils/Component/cleanAttributes.d.ts +14 -0
  122. package/dist/utils/Component/elevateNestedComponents.d.ts +28 -0
  123. package/dist/utils/Component/getDefaultValue.d.ts +2 -0
  124. package/dist/utils/Component/getDefaultValueFromConfig.d.ts +2 -0
  125. package/dist/utils/Component/index.d.ts +12 -0
  126. package/dist/utils/Component/isEditable.d.ts +3 -0
  127. package/dist/utils/Component/optionIsSelected.d.ts +10 -0
  128. package/dist/utils/Component/setupContainerComponentsPath.d.ts +2 -0
  129. package/dist/utils/Component/showComponent.d.ts +2 -0
  130. package/dist/utils/Condition/index.d.ts +6 -0
  131. package/dist/utils/Condition/meetsAllConditions.d.ts +8 -0
  132. package/dist/utils/Condition/meetsCondition.d.ts +14 -0
  133. package/dist/utils/Condition/meetsOneCondition.d.ts +8 -0
  134. package/dist/utils/Condition/setupConditions.d.ts +2 -0
  135. package/dist/utils/Container/getEditableComponents.d.ts +7 -0
  136. package/dist/utils/Container/index.d.ts +6 -0
  137. package/dist/utils/Container/setupNesting.d.ts +2 -0
  138. package/dist/utils/Container/showContainer.d.ts +8 -0
  139. package/dist/utils/Data/applyFormula.d.ts +2 -0
  140. package/dist/utils/Data/deleteValues.d.ts +8 -0
  141. package/dist/utils/Data/getAutocompleteSource.d.ts +2 -0
  142. package/dist/utils/Data/getDataPath.d.ts +21 -0
  143. package/dist/utils/Data/getOptions.d.ts +2 -0
  144. package/dist/utils/Data/getSourceData.d.ts +17 -0
  145. package/dist/utils/Data/index.d.ts +15 -0
  146. package/dist/utils/Data/nestInRefdataOptions.d.ts +10 -0
  147. package/dist/utils/Data/refDataToOptions.d.ts +8 -0
  148. package/dist/utils/Data/setDataItem.d.ts +2 -0
  149. package/dist/utils/Data/setupFormData.d.ts +15 -0
  150. package/dist/utils/Data/setupRefDataUrlForComponent.d.ts +2 -0
  151. package/dist/utils/FormPage/applyConditionalProperties.d.ts +8 -0
  152. package/dist/utils/FormPage/getConditionalText.d.ts +23 -0
  153. package/dist/utils/FormPage/getFormPage.d.ts +9 -0
  154. package/dist/utils/FormPage/getFormPages.d.ts +9 -0
  155. package/dist/utils/FormPage/getPageActions.d.ts +13 -0
  156. package/dist/utils/FormPage/getParagraphFromText.d.ts +11 -0
  157. package/dist/utils/FormPage/index.d.ts +10 -0
  158. package/dist/utils/FormPage/showFormPage.d.ts +8 -0
  159. package/dist/utils/FormPage/showFormPageCYA.d.ts +8 -0
  160. package/dist/utils/FormPage/useComponent.d.ts +9 -0
  161. package/dist/utils/Format/formatData.d.ts +8 -0
  162. package/dist/utils/Format/formatDataForComponent.d.ts +15 -0
  163. package/dist/utils/Format/formatDataForForm.d.ts +8 -0
  164. package/dist/utils/Format/formatDataForPage.d.ts +15 -0
  165. package/dist/utils/Format/index.d.ts +7 -0
  166. package/dist/utils/Hub/getFormHub.d.ts +15 -0
  167. package/dist/utils/Hub/index.d.ts +4 -0
  168. package/dist/utils/Meta/constants.d.ts +2 -0
  169. package/dist/utils/Meta/documents/getDocuments.d.ts +2 -0
  170. package/dist/utils/Meta/documents/index.d.ts +6 -0
  171. package/dist/utils/Meta/documents/setDocumentsForField.d.ts +2 -0
  172. package/dist/utils/Meta/index.d.ts +9 -0
  173. package/dist/utils/Operate/checkValueIsTruthy.d.ts +9 -0
  174. package/dist/utils/Operate/deleteValueInFormData.d.ts +8 -0
  175. package/dist/utils/Operate/doesContainValue.d.ts +11 -0
  176. package/dist/utils/Operate/getFirstOf.d.ts +2 -0
  177. package/dist/utils/Operate/getIndexOfMatchingValueIn.d.ts +11 -0
  178. package/dist/utils/Operate/getLength.d.ts +11 -0
  179. package/dist/utils/Operate/index.d.ts +4 -0
  180. package/dist/utils/Operate/persistValueInFormData.d.ts +9 -0
  181. package/dist/utils/Operate/runPageOperations.d.ts +19 -0
  182. package/dist/utils/Operate/setValueInFormData.d.ts +2 -0
  183. package/dist/utils/Operate/shouldRun.d.ts +9 -0
  184. package/dist/utils/Validate/additional/conditionallyPermittedChange.d.ts +14 -0
  185. package/dist/utils/Validate/additional/conditionallyRequired.d.ts +11 -0
  186. package/dist/utils/Validate/additional/index.d.ts +2 -0
  187. package/dist/utils/Validate/additional/mustBeAfter.d.ts +14 -0
  188. package/dist/utils/Validate/additional/mustBeBefore.d.ts +14 -0
  189. package/dist/utils/Validate/additional/mustBeEarlierDateTime.d.ts +15 -0
  190. package/dist/utils/Validate/additional/mustBeGreaterThan.d.ts +7 -0
  191. package/dist/utils/Validate/additional/mustBeInTheFuture.d.ts +8 -0
  192. package/dist/utils/Validate/additional/mustBeInThePast.d.ts +9 -0
  193. package/dist/utils/Validate/additional/mustBeLessThan.d.ts +7 -0
  194. package/dist/utils/Validate/additional/mustBeLongerThan.d.ts +9 -0
  195. package/dist/utils/Validate/additional/mustBeNumbersOnly.d.ts +9 -0
  196. package/dist/utils/Validate/additional/mustBeOneOf.d.ts +8 -0
  197. package/dist/utils/Validate/additional/mustBeShorterThan.d.ts +9 -0
  198. package/dist/utils/Validate/additional/mustBeUniqueInCollection.d.ts +10 -0
  199. package/dist/utils/Validate/additional/mustEnterAtLeastOne.d.ts +9 -0
  200. package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.d.ts +7 -0
  201. package/dist/utils/Validate/additional/mustNotContainSql.d.ts +2 -0
  202. package/dist/utils/Validate/additional/mustSelectOnlyOne.d.ts +8 -0
  203. package/dist/utils/Validate/additional/utils.d.ts +4 -0
  204. package/dist/utils/Validate/index.d.ts +42 -0
  205. package/dist/utils/Validate/validateCollection.d.ts +9 -0
  206. package/dist/utils/Validate/validateComponent.d.ts +16 -0
  207. package/dist/utils/Validate/validateContainer.d.ts +12 -0
  208. package/dist/utils/Validate/validateDate.d.ts +29 -0
  209. package/dist/utils/Validate/validateEmail.d.ts +13 -0
  210. package/dist/utils/Validate/validateMultifile.d.ts +3 -0
  211. package/dist/utils/Validate/validateOnPageLoad.d.ts +1 -0
  212. package/dist/utils/Validate/validatePage.d.ts +8 -0
  213. package/dist/utils/Validate/validateRegex.d.ts +13 -0
  214. package/dist/utils/Validate/validateRequired.d.ts +9 -0
  215. package/dist/utils/Validate/validateTextArea.d.ts +13 -0
  216. package/dist/utils/Validate/validateTime.d.ts +20 -0
  217. package/dist/utils/canOverrideFieldRequired.d.ts +9 -0
  218. package/dist/utils/index.d.ts +140 -0
  219. package/package.json +81 -170
  220. package/LICENCE.md +0 -21
  221. package/dist/components/CheckYourAnswers/Answer.js +0 -59
  222. package/dist/components/CheckYourAnswers/Answer.test.js +0 -142
  223. package/dist/components/CheckYourAnswers/CheckYourAnswers.js +0 -252
  224. package/dist/components/CheckYourAnswers/CheckYourAnswers.scss +0 -43
  225. package/dist/components/CheckYourAnswers/CheckYourAnswers.stories.mdx +0 -409
  226. package/dist/components/CheckYourAnswers/CheckYourAnswers.test.js +0 -603
  227. package/dist/components/CheckYourAnswers/index.js +0 -10
  228. package/dist/components/CollectionPage/CollectionPage.js +0 -178
  229. package/dist/components/CollectionPage/CollectionPage.test.js +0 -507
  230. package/dist/components/CollectionPage/index.js +0 -10
  231. package/dist/components/CollectionSummary/BannerStrip.js +0 -65
  232. package/dist/components/CollectionSummary/BannerStrip.scss +0 -60
  233. package/dist/components/CollectionSummary/BannerStrip.test.js +0 -167
  234. package/dist/components/CollectionSummary/CollectionSummary.js +0 -362
  235. package/dist/components/CollectionSummary/CollectionSummary.scss +0 -26
  236. package/dist/components/CollectionSummary/CollectionSummary.test.js +0 -368
  237. package/dist/components/CollectionSummary/Confirmation.js +0 -65
  238. package/dist/components/CollectionSummary/Confirmation.scss +0 -26
  239. package/dist/components/CollectionSummary/Confirmation.test.js +0 -109
  240. package/dist/components/CollectionSummary/RenderListView.js +0 -162
  241. package/dist/components/CollectionSummary/RenderListView.scss +0 -295
  242. package/dist/components/CollectionSummary/RenderListView.test.js +0 -303
  243. package/dist/components/CollectionSummary/SummaryCard.js +0 -277
  244. package/dist/components/CollectionSummary/SummaryCard.scss +0 -114
  245. package/dist/components/CollectionSummary/SummaryCard.test.js +0 -1442
  246. package/dist/components/CollectionSummary/SummaryCardButtons.js +0 -76
  247. package/dist/components/CollectionSummary/SummaryCardButtons.test.js +0 -87
  248. package/dist/components/CollectionSummary/SummaryCardDetails.js +0 -206
  249. package/dist/components/CollectionSummary/SummaryCardDetails.scss +0 -216
  250. package/dist/components/CollectionSummary/SummaryCardDetails.test.js +0 -654
  251. package/dist/components/CollectionSummary/SummaryCardValidationContext.js +0 -79
  252. package/dist/components/CollectionSummary/SummaryCardValidationContext.test.js +0 -104
  253. package/dist/components/CollectionSummary/index.js +0 -10
  254. package/dist/components/FormComponent/Collection.js +0 -234
  255. package/dist/components/FormComponent/Collection.scss +0 -24
  256. package/dist/components/FormComponent/Collection.test.js +0 -934
  257. package/dist/components/FormComponent/Container.js +0 -130
  258. package/dist/components/FormComponent/Container.scss +0 -15
  259. package/dist/components/FormComponent/Container.test.js +0 -456
  260. package/dist/components/FormComponent/FormComponent.js +0 -238
  261. package/dist/components/FormComponent/FormComponent.stories.mdx +0 -186
  262. package/dist/components/FormComponent/FormComponent.test.js +0 -436
  263. package/dist/components/FormComponent/helpers/addLabel.js +0 -25
  264. package/dist/components/FormComponent/helpers/getComponentDisabled.js +0 -15
  265. package/dist/components/FormComponent/helpers/getComponentDisabled.test.js +0 -27
  266. package/dist/components/FormComponent/helpers/getComponentError.js +0 -23
  267. package/dist/components/FormComponent/helpers/getComponentError.test.js +0 -51
  268. package/dist/components/FormComponent/helpers/getComponentFieldSet.js +0 -11
  269. package/dist/components/FormComponent/helpers/getComponentFieldSet.test.js +0 -30
  270. package/dist/components/FormComponent/helpers/index.js +0 -35
  271. package/dist/components/FormComponent/index.js +0 -10
  272. package/dist/components/FormPage/FormPage.js +0 -212
  273. package/dist/components/FormPage/FormPage.scss +0 -7
  274. package/dist/components/FormPage/FormPage.stories.mdx +0 -157
  275. package/dist/components/FormPage/FormPage.test.js +0 -454
  276. package/dist/components/FormPage/index.js +0 -10
  277. package/dist/components/FormRenderer/FormRenderer.js +0 -426
  278. package/dist/components/FormRenderer/FormRenderer.scss +0 -5
  279. package/dist/components/FormRenderer/FormRenderer.stories.mdx +0 -178
  280. package/dist/components/FormRenderer/FormRenderer.test.js +0 -799
  281. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/cop-reassign-task-to-rcc.json +0 -446
  282. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-containerised.json +0 -120
  283. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-dependent-component-nested-block.json +0 -113
  284. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-dependent-component-nested.json +0 -106
  285. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-refdata.json +0 -106
  286. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-target-component-nested.json +0 -99
  287. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens.json +0 -106
  288. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-show-whens-page-hidden.json +0 -113
  289. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-cop-airpax.json +0 -26408
  290. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-cop-mandec.json +0 -9405
  291. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-collection-component-dependent-on-external-data.json +0 -158
  292. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-collection-component.json +0 -86
  293. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-referring-to-collection.json +0 -173
  294. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-referring-to-hidden-collection.json +0 -202
  295. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-show-when-in-component-and-page.json +0 -63
  296. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-with-nested-questions-visible-elsewhere.json +0 -118
  297. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-with-nested-questions.json +0 -112
  298. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component.json +0 -58
  299. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-containerised-component.json +0 -97
  300. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-embedded-collection-component.json +0 -83
  301. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-embedded-component.json +0 -55
  302. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-entire-collection.json +0 -114
  303. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-multilevel-containerised-component-leaf-hidden.json +0 -106
  304. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-multilevel-containerised-component.json +0 -106
  305. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-options.json +0 -99
  306. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-collection.json +0 -128
  307. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-component-used-elsewhere.json +0 -109
  308. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-same-component-reused.json +0 -62
  309. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page.json +0 -96
  310. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-nested-answers-hidden-by-option-visible-elsewhere.json +0 -113
  311. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-nested-answers-hidden-by-option.json +0 -112
  312. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-nested-component.json +0 -26003
  313. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-nested-radio-component.json +0 -201
  314. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-same-component-reused-one-shown.json +0 -75
  315. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-variance-breach.json +0 -4272
  316. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-carrier.json +0 -407
  317. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-change-what-happened-before.json +0 -300
  318. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-remove-photos-before.json +0 -384
  319. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-business-interests-before.json +0 -140
  320. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-criminality-before.json +0 -186
  321. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-unspent-convictions-before.json +0 -143
  322. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-variance-breach-with-upload-files.json +0 -1264
  323. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-containerised.json +0 -11
  324. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-dependent-component-nested-block.json +0 -10
  325. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-dependent-component-nested.json +0 -9
  326. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-refdata.json +0 -11
  327. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-target-component-nested.json +0 -9
  328. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens.json +0 -9
  329. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-show-whens-page-hidden.json +0 -9
  330. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-collection-component-dependent-on-external-data.json +0 -26
  331. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-collection-component.json +0 -15
  332. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-referring-to-collection.json +0 -25
  333. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-referring-to-hidden-collection.json +0 -26
  334. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-show-when-in-component-and-page.json +0 -6
  335. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-with-nested-questions-visible-elsewhere.json +0 -12
  336. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-with-nested-questions.json +0 -12
  337. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component.json +0 -5
  338. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-containerised-component.json +0 -11
  339. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-embedded-collection-component.json +0 -15
  340. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-embedded-component.json +0 -5
  341. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-entire-collection.json +0 -20
  342. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-multilevel-containerised-component-leaf-hidden.json +0 -14
  343. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-multilevel-containerised-component.json +0 -14
  344. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-options.json +0 -10
  345. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-collection.json +0 -18
  346. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-component-used-elsewhere.json +0 -9
  347. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-same-component-reused.json +0 -6
  348. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page.json +0 -9
  349. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-nested-answers-hidden-by-option-visible-elsewhere.json +0 -12
  350. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-nested-answers-hidden-by-option.json +0 -12
  351. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-nested-component.json +0 -63
  352. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-nested-radio-component.json +0 -45
  353. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-same-component-reused-one-shown.json +0 -8
  354. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/reassign-to-rcc.json +0 -72
  355. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-airpax-change-what-happened-after.json +0 -280
  356. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-airpax-remove-photos-after.json +0 -355
  357. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-base-file.json +0 -80
  358. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-business-interests-after.json +0 -122
  359. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-criminality-after.json +0 -86
  360. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-unspent-convictions-after.json +0 -127
  361. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-containerised-removed.json +0 -11
  362. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-dependent-component-nested-block-removed.json +0 -7
  363. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-dependent-component-nested-removed.json +0 -7
  364. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-refdata-removed.json +0 -7
  365. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-removed.json +0 -7
  366. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-target-component-nested-removed.json +0 -6
  367. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-show-whens-page-hidden-removed.json +0 -6
  368. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-collection-component-dependent-on-external-data-removed.json +0 -23
  369. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-collection-component-removed.json +0 -4
  370. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-referring-to-collection-removed.json +0 -21
  371. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-referring-to-hidden-collection-removed.json +0 -6
  372. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-removed.json +0 -4
  373. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-show-when-in-component-and-page-removed.json +0 -5
  374. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-with-nested-questions-removed.json +0 -10
  375. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-with-nested-questions-visible-elsewhere-removed.json +0 -11
  376. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-containerised-component-removed.json +0 -10
  377. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-embedded-collection-component-removed.json +0 -4
  378. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-embedded-component-removed.json +0 -4
  379. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-entire-collection-removed.json +0 -3
  380. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-multilevel-containerised-component-leaf-hidden-removed.json +0 -13
  381. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-multilevel-containerised-component-removed.json +0 -10
  382. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-options-removed.json +0 -8
  383. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-collection-removed.json +0 -15
  384. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-component-used-elsewhere-removed.json +0 -5
  385. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-removed.json +0 -4
  386. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-same-component-reused-removed.json +0 -5
  387. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-nested-answers-hidden-by-option-removed.json +0 -11
  388. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-nested-answers-hidden-by-option-visible-elsewhere-removed.json +0 -12
  389. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-nested-component.json +0 -63
  390. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-nested-radio-component-removed.json +0 -45
  391. package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-same-component-reused-one-shown-removed.json +0 -7
  392. package/dist/components/FormRenderer/handlers/cyaAction.js +0 -23
  393. package/dist/components/FormRenderer/handlers/getPageId.js +0 -15
  394. package/dist/components/FormRenderer/handlers/getPageId.test.js +0 -35
  395. package/dist/components/FormRenderer/handlers/handlers.test.js +0 -81
  396. package/dist/components/FormRenderer/handlers/index.js +0 -17
  397. package/dist/components/FormRenderer/handlers/navigate.js +0 -25
  398. package/dist/components/FormRenderer/handlers/submissionError.js +0 -18
  399. package/dist/components/FormRenderer/helpers/canActionProceed.js +0 -27
  400. package/dist/components/FormRenderer/helpers/canActionProceed.test.js +0 -84
  401. package/dist/components/FormRenderer/helpers/canCYASubmit.js +0 -17
  402. package/dist/components/FormRenderer/helpers/canCYASubmit.test.js +0 -75
  403. package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.js +0 -63
  404. package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.test.js +0 -191
  405. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.js +0 -338
  406. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.test.js +0 -434
  407. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.js +0 -399
  408. package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.test.js +0 -559
  409. package/dist/components/FormRenderer/helpers/getCYA.js +0 -42
  410. package/dist/components/FormRenderer/helpers/getCYA.test.js +0 -46
  411. package/dist/components/FormRenderer/helpers/getFormState.js +0 -25
  412. package/dist/components/FormRenderer/helpers/getFormState.test.js +0 -60
  413. package/dist/components/FormRenderer/helpers/getNextPageId.js +0 -76
  414. package/dist/components/FormRenderer/helpers/getNextPageId.test.js +0 -292
  415. package/dist/components/FormRenderer/helpers/getPage.js +0 -27
  416. package/dist/components/FormRenderer/helpers/getPage.test.js +0 -45
  417. package/dist/components/FormRenderer/helpers/getRelevantPages.js +0 -27
  418. package/dist/components/FormRenderer/helpers/getRelevantPages.test.js +0 -70
  419. package/dist/components/FormRenderer/helpers/getSubmissionStatus.js +0 -65
  420. package/dist/components/FormRenderer/helpers/getSubmissionStatus.test.js +0 -309
  421. package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.js +0 -201
  422. package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.test.js +0 -473
  423. package/dist/components/FormRenderer/helpers/index.js +0 -33
  424. package/dist/components/FormRenderer/index.js +0 -10
  425. package/dist/components/FormRenderer/onCYAAction.js +0 -150
  426. package/dist/components/FormRenderer/onCYAAction.test.js +0 -741
  427. package/dist/components/FormRenderer/onPageAction.js +0 -227
  428. package/dist/components/FormRenderer/onPageAction.test.js +0 -960
  429. package/dist/components/FormRenderer/onTaskAction.js +0 -47
  430. package/dist/components/FormRenderer/onTaskAction.test.js +0 -247
  431. package/dist/components/PageActions/ActionButton.js +0 -48
  432. package/dist/components/PageActions/ActionButton.test.js +0 -73
  433. package/dist/components/PageActions/PageActions.js +0 -37
  434. package/dist/components/PageActions/PageActions.stories.mdx +0 -74
  435. package/dist/components/PageActions/PageActions.test.js +0 -106
  436. package/dist/components/PageActions/index.js +0 -10
  437. package/dist/components/SummaryList/GroupAction.js +0 -50
  438. package/dist/components/SummaryList/GroupAction.test.js +0 -86
  439. package/dist/components/SummaryList/RowAction.js +0 -48
  440. package/dist/components/SummaryList/RowAction.test.js +0 -86
  441. package/dist/components/SummaryList/SummaryList.js +0 -128
  442. package/dist/components/SummaryList/SummaryList.scss +0 -79
  443. package/dist/components/SummaryList/SummaryList.stories.mdx +0 -84
  444. package/dist/components/SummaryList/SummaryList.test.js +0 -504
  445. package/dist/components/SummaryList/SummaryListHeadingRow.js +0 -39
  446. package/dist/components/SummaryList/SummaryListHeadingRowWithAction.js +0 -65
  447. package/dist/components/SummaryList/SummaryListHeadingRowWithAction.scss +0 -38
  448. package/dist/components/SummaryList/SummaryListRow.js +0 -58
  449. package/dist/components/SummaryList/SummaryListTitleRow.js +0 -32
  450. package/dist/components/SummaryList/helpers/getGroupActionAttributes.js +0 -29
  451. package/dist/components/SummaryList/helpers/getGroupActionAttributes.test.js +0 -72
  452. package/dist/components/SummaryList/helpers/getRowActionAttributes.js +0 -29
  453. package/dist/components/SummaryList/helpers/getRowActionAttributes.test.js +0 -72
  454. package/dist/components/SummaryList/helpers/index.js +0 -14
  455. package/dist/components/SummaryList/index.js +0 -10
  456. package/dist/components/TaskList/Task.js +0 -62
  457. package/dist/components/TaskList/Task.test.js +0 -176
  458. package/dist/components/TaskList/TaskList.js +0 -175
  459. package/dist/components/TaskList/TaskList.scss +0 -123
  460. package/dist/components/TaskList/TaskList.stories.mdx +0 -164
  461. package/dist/components/TaskList/TaskList.test.js +0 -535
  462. package/dist/components/TaskList/TaskState.js +0 -37
  463. package/dist/components/TaskList/TaskState.test.js +0 -95
  464. package/dist/components/TaskList/index.js +0 -10
  465. package/dist/components/index.js +0 -56
  466. package/dist/context/HooksContext/HooksContext.js +0 -122
  467. package/dist/context/HooksContext/HooksContext.test.js +0 -45
  468. package/dist/context/HooksContext/index.js +0 -16
  469. package/dist/context/ValidationContext/ValidationContext.js +0 -98
  470. package/dist/context/ValidationContext/ValidationContext.test.js +0 -107
  471. package/dist/context/ValidationContext/index.js +0 -16
  472. package/dist/context/index.js +0 -21
  473. package/dist/hooks/index.js +0 -55
  474. package/dist/hooks/useAxios.js +0 -36
  475. package/dist/hooks/useGetRequest.js +0 -89
  476. package/dist/hooks/useHooks.js +0 -15
  477. package/dist/hooks/useRefData.js +0 -62
  478. package/dist/hooks/useValidation.js +0 -15
  479. package/dist/json/actions.json +0 -17
  480. package/dist/json/actionsNoSave.json +0 -17
  481. package/dist/json/addressDetails.json +0 -149
  482. package/dist/json/areYouACivilServant.json +0 -7
  483. package/dist/json/firstForm.json +0 -94
  484. package/dist/json/grade.json +0 -108
  485. package/dist/json/group.data.json +0 -21
  486. package/dist/json/group.json +0 -402
  487. package/dist/json/groupOfRow.json +0 -137
  488. package/dist/json/groupOfRowData.json +0 -15
  489. package/dist/json/port.json +0 -346
  490. package/dist/json/saveAndContinue.json +0 -98
  491. package/dist/json/sublocation.json +0 -859
  492. package/dist/json/taskList.json +0 -265
  493. package/dist/json/team.json +0 -17351
  494. package/dist/json/terminal.json +0 -81
  495. package/dist/json/userProfile.data.json +0 -21
  496. package/dist/json/userProfile.json +0 -276
  497. package/dist/models/CollectionLabels.js +0 -15
  498. package/dist/models/ComponentTypes.js +0 -58
  499. package/dist/models/EventTypes.js +0 -16
  500. package/dist/models/FormPages.js +0 -16
  501. package/dist/models/FormTypes.js +0 -24
  502. package/dist/models/HubFormats.js +0 -14
  503. package/dist/models/PageAction.js +0 -65
  504. package/dist/models/TaskStates.js +0 -46
  505. package/dist/models/index.js +0 -77
  506. package/dist/setupTests.js +0 -54
  507. package/dist/utils/CheckYourAnswers/getCYAAction.js +0 -44
  508. package/dist/utils/CheckYourAnswers/getCYAAction.test.js +0 -120
  509. package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.js +0 -57
  510. package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.test.js +0 -162
  511. package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.js +0 -66
  512. package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.test.js +0 -198
  513. package/dist/utils/CheckYourAnswers/getCYARow.js +0 -58
  514. package/dist/utils/CheckYourAnswers/getCYARow.test.js +0 -373
  515. package/dist/utils/CheckYourAnswers/getCYARowForGroup.js +0 -69
  516. package/dist/utils/CheckYourAnswers/getCYARowForGroup.test.js +0 -70
  517. package/dist/utils/CheckYourAnswers/getCYARowsForCollection.js +0 -71
  518. package/dist/utils/CheckYourAnswers/getCYARowsForCollection.test.js +0 -285
  519. package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.js +0 -237
  520. package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.test.js +0 -844
  521. package/dist/utils/CheckYourAnswers/getCYARowsForContainer.js +0 -45
  522. package/dist/utils/CheckYourAnswers/getCYARowsForContainer.test.js +0 -535
  523. package/dist/utils/CheckYourAnswers/getCYARowsForPage.js +0 -72
  524. package/dist/utils/CheckYourAnswers/getCYARowsForPage.test.js +0 -343
  525. package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.js +0 -42
  526. package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.test.js +0 -56
  527. package/dist/utils/CheckYourAnswers/index.js +0 -15
  528. package/dist/utils/CheckYourAnswers/showComponentCYA.js +0 -53
  529. package/dist/utils/CheckYourAnswers/showComponentCYA.test.js +0 -149
  530. package/dist/utils/CollectionPage/addCollectionPageEntry.js +0 -23
  531. package/dist/utils/CollectionPage/addCollectionPageEntry.test.js +0 -17
  532. package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.js +0 -26
  533. package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.test.js +0 -70
  534. package/dist/utils/CollectionPage/duplicateCollectionPageEntry.js +0 -51
  535. package/dist/utils/CollectionPage/duplicateCollectionPageEntry.test.js +0 -125
  536. package/dist/utils/CollectionPage/getCollectionPageActiveId.js +0 -24
  537. package/dist/utils/CollectionPage/getCollectionPageActiveId.test.js +0 -26
  538. package/dist/utils/CollectionPage/getCollectionPageActiveIndex.js +0 -44
  539. package/dist/utils/CollectionPage/getCollectionPageActiveIndex.test.js +0 -88
  540. package/dist/utils/CollectionPage/getCollectionPageData.js +0 -53
  541. package/dist/utils/CollectionPage/getCollectionPageData.test.js +0 -103
  542. package/dist/utils/CollectionPage/getErrorsForCollection.js +0 -55
  543. package/dist/utils/CollectionPage/getErrorsForCollection.test.js +0 -154
  544. package/dist/utils/CollectionPage/getQuickEditPage.js +0 -122
  545. package/dist/utils/CollectionPage/getQuickEditPage.test.js +0 -143
  546. package/dist/utils/CollectionPage/index.js +0 -33
  547. package/dist/utils/CollectionPage/mergeCollectionPages.js +0 -128
  548. package/dist/utils/CollectionPage/mergeCollectionPages.test.js +0 -198
  549. package/dist/utils/CollectionPage/removeCollectionPageEntry.js +0 -36
  550. package/dist/utils/CollectionPage/removeCollectionPageEntry.test.js +0 -62
  551. package/dist/utils/CollectionPage/setCollectionPageData.js +0 -60
  552. package/dist/utils/CollectionPage/setCollectionPageData.test.js +0 -182
  553. package/dist/utils/Component/addShowWhen.js +0 -43
  554. package/dist/utils/Component/addShowWhen.test.js +0 -217
  555. package/dist/utils/Component/applyToComponentTree.js +0 -68
  556. package/dist/utils/Component/applyToComponentTree.test.js +0 -125
  557. package/dist/utils/Component/cleanAttributes.js +0 -42
  558. package/dist/utils/Component/cleanAttributes.test.js +0 -67
  559. package/dist/utils/Component/elevateNestedComponents.js +0 -58
  560. package/dist/utils/Component/elevateNestedComponents.test.js +0 -305
  561. package/dist/utils/Component/getComponent.js +0 -305
  562. package/dist/utils/Component/getComponentTests/getComponent.autocomplete.test.js +0 -73
  563. package/dist/utils/Component/getComponentTests/getComponent.calculation.test.js +0 -251
  564. package/dist/utils/Component/getComponentTests/getComponent.checkboxes.test.js +0 -156
  565. package/dist/utils/Component/getComponentTests/getComponent.date.test.js +0 -104
  566. package/dist/utils/Component/getComponentTests/getComponent.details.test.js +0 -56
  567. package/dist/utils/Component/getComponentTests/getComponent.email.test.js +0 -60
  568. package/dist/utils/Component/getComponentTests/getComponent.file.test.js +0 -60
  569. package/dist/utils/Component/getComponentTests/getComponent.heading.test.js +0 -31
  570. package/dist/utils/Component/getComponentTests/getComponent.html.test.js +0 -42
  571. package/dist/utils/Component/getComponentTests/getComponent.insetText.test.js +0 -29
  572. package/dist/utils/Component/getComponentTests/getComponent.list.test.js +0 -47
  573. package/dist/utils/Component/getComponentTests/getComponent.multifile.test.js +0 -66
  574. package/dist/utils/Component/getComponentTests/getComponent.nested.test.js +0 -211
  575. package/dist/utils/Component/getComponentTests/getComponent.paragraph.test.js +0 -46
  576. package/dist/utils/Component/getComponentTests/getComponent.phoneNumber.test.js +0 -60
  577. package/dist/utils/Component/getComponentTests/getComponent.radios.test.js +0 -221
  578. package/dist/utils/Component/getComponentTests/getComponent.select.test.js +0 -62
  579. package/dist/utils/Component/getComponentTests/getComponent.text.test.js +0 -60
  580. package/dist/utils/Component/getComponentTests/getComponent.textArea.test.js +0 -104
  581. package/dist/utils/Component/getComponentTests/getComponent.time.test.js +0 -80
  582. package/dist/utils/Component/getComponentTests/getComponent.unknown.test.js +0 -14
  583. package/dist/utils/Component/getComponentTests/getComponent.warningText.test.js +0 -29
  584. package/dist/utils/Component/getDefaultValue.js +0 -22
  585. package/dist/utils/Component/getDefaultValue.test.js +0 -62
  586. package/dist/utils/Component/getDefaultValueFromConfig.js +0 -106
  587. package/dist/utils/Component/getDefaultValueFromConfig.test.js +0 -141
  588. package/dist/utils/Component/index.js +0 -29
  589. package/dist/utils/Component/isEditable.js +0 -13
  590. package/dist/utils/Component/isEditable.test.js +0 -42
  591. package/dist/utils/Component/optionIsSelected.js +0 -25
  592. package/dist/utils/Component/optionIsSelected.test.js +0 -69
  593. package/dist/utils/Component/setupContainerComponentsPath.js +0 -35
  594. package/dist/utils/Component/setupContainerComponentsPath.test.js +0 -79
  595. package/dist/utils/Component/showComponent.js +0 -25
  596. package/dist/utils/Component/showComponent.test.js +0 -157
  597. package/dist/utils/Component/wrapInFormGroup.js +0 -26
  598. package/dist/utils/Condition/index.js +0 -17
  599. package/dist/utils/Condition/meetsAllConditions.js +0 -44
  600. package/dist/utils/Condition/meetsAllConditions.test.js +0 -109
  601. package/dist/utils/Condition/meetsCondition.js +0 -165
  602. package/dist/utils/Condition/meetsCondition.test.js +0 -899
  603. package/dist/utils/Condition/meetsOneCondition.js +0 -32
  604. package/dist/utils/Condition/meetsOneCondition.test.js +0 -101
  605. package/dist/utils/Condition/setupConditions.js +0 -36
  606. package/dist/utils/Condition/setupConditions.test.js +0 -34
  607. package/dist/utils/Container/getEditableComponents.js +0 -29
  608. package/dist/utils/Container/getEditableComponents.test.js +0 -134
  609. package/dist/utils/Container/index.js +0 -17
  610. package/dist/utils/Container/setupNesting.js +0 -53
  611. package/dist/utils/Container/setupNesting.test.js +0 -143
  612. package/dist/utils/Container/showContainer.js +0 -52
  613. package/dist/utils/Container/showContainer.test.js +0 -179
  614. package/dist/utils/Data/applyFormula.js +0 -90
  615. package/dist/utils/Data/applyFormula.test.js +0 -264
  616. package/dist/utils/Data/deleteValues.js +0 -19
  617. package/dist/utils/Data/deleteValues.test.js +0 -58
  618. package/dist/utils/Data/getAutocompleteSource.js +0 -87
  619. package/dist/utils/Data/getAutocompleteSource.test.js +0 -335
  620. package/dist/utils/Data/getDataPath.js +0 -66
  621. package/dist/utils/Data/getDataPath.test.js +0 -49
  622. package/dist/utils/Data/getOptions.js +0 -86
  623. package/dist/utils/Data/getOptions.test.js +0 -279
  624. package/dist/utils/Data/getSourceData.js +0 -44
  625. package/dist/utils/Data/getSourceData.test.js +0 -158
  626. package/dist/utils/Data/index.js +0 -35
  627. package/dist/utils/Data/nestInRefdataOptions.js +0 -47
  628. package/dist/utils/Data/nestInRefdataOptions.test.js +0 -237
  629. package/dist/utils/Data/refDataToOptions.js +0 -44
  630. package/dist/utils/Data/refDataToOptions.test.js +0 -197
  631. package/dist/utils/Data/setDataItem.js +0 -26
  632. package/dist/utils/Data/setDataItem.test.js +0 -136
  633. package/dist/utils/Data/setupFormData.js +0 -49
  634. package/dist/utils/Data/setupFormData.test.js +0 -215
  635. package/dist/utils/Data/setupRefDataUrlForComponent.js +0 -44
  636. package/dist/utils/Data/setupRefDataUrlForComponent.test.js +0 -150
  637. package/dist/utils/FormPage/applyConditionalProperties.js +0 -34
  638. package/dist/utils/FormPage/applyConditionalProperties.test.js +0 -61
  639. package/dist/utils/FormPage/getConditionalText.js +0 -55
  640. package/dist/utils/FormPage/getConditionalText.test.js +0 -163
  641. package/dist/utils/FormPage/getFormPage.js +0 -54
  642. package/dist/utils/FormPage/getFormPage.test.js +0 -206
  643. package/dist/utils/FormPage/getFormPages.js +0 -30
  644. package/dist/utils/FormPage/getFormPages.test.js +0 -97
  645. package/dist/utils/FormPage/getPageActions.js +0 -58
  646. package/dist/utils/FormPage/getPageActions.test.js +0 -115
  647. package/dist/utils/FormPage/getParagraphFromText.js +0 -21
  648. package/dist/utils/FormPage/getParagraphFromText.test.js +0 -28
  649. package/dist/utils/FormPage/index.js +0 -24
  650. package/dist/utils/FormPage/showFormPage.js +0 -52
  651. package/dist/utils/FormPage/showFormPage.test.js +0 -181
  652. package/dist/utils/FormPage/showFormPageCYA.js +0 -23
  653. package/dist/utils/FormPage/showFormPageCYA.test.js +0 -29
  654. package/dist/utils/FormPage/useComponent.js +0 -83
  655. package/dist/utils/FormPage/useComponent.test.js +0 -216
  656. package/dist/utils/Format/formatData.js +0 -27
  657. package/dist/utils/Format/formatData.test.js +0 -46
  658. package/dist/utils/Format/formatDataForComponent.js +0 -35
  659. package/dist/utils/Format/formatDataForComponent.test.js +0 -114
  660. package/dist/utils/Format/formatDataForForm.js +0 -27
  661. package/dist/utils/Format/formatDataForForm.test.js +0 -79
  662. package/dist/utils/Format/formatDataForPage.js +0 -31
  663. package/dist/utils/Format/formatDataForPage.test.js +0 -94
  664. package/dist/utils/Format/index.js +0 -21
  665. package/dist/utils/Hub/getFormHub.js +0 -40
  666. package/dist/utils/Hub/getFormHub.test.js +0 -105
  667. package/dist/utils/Hub/index.js +0 -15
  668. package/dist/utils/Meta/constants.js +0 -9
  669. package/dist/utils/Meta/documents/getDocuments.js +0 -15
  670. package/dist/utils/Meta/documents/getDocuments.test.js +0 -46
  671. package/dist/utils/Meta/documents/index.js +0 -19
  672. package/dist/utils/Meta/documents/setDocumentsForField.js +0 -30
  673. package/dist/utils/Meta/documents/setDocumentsForField.test.js +0 -97
  674. package/dist/utils/Meta/index.js +0 -17
  675. package/dist/utils/Operate/checkValueIsTruthy.js +0 -29
  676. package/dist/utils/Operate/checkValueIsTruthy.test.js +0 -43
  677. package/dist/utils/Operate/deleteValueInFormData.js +0 -27
  678. package/dist/utils/Operate/deleteValueInFormData.test.js +0 -61
  679. package/dist/utils/Operate/doesContainValue.js +0 -35
  680. package/dist/utils/Operate/doesContainValue.test.js +0 -76
  681. package/dist/utils/Operate/getFirstOf.js +0 -31
  682. package/dist/utils/Operate/getFirstOf.test.js +0 -87
  683. package/dist/utils/Operate/getIndexOfMatchingValueIn.js +0 -68
  684. package/dist/utils/Operate/getIndexOfMatchingValueIn.test.js +0 -158
  685. package/dist/utils/Operate/getLength.js +0 -51
  686. package/dist/utils/Operate/getLength.test.js +0 -90
  687. package/dist/utils/Operate/index.js +0 -13
  688. package/dist/utils/Operate/persistValueInFormData.js +0 -40
  689. package/dist/utils/Operate/persistValueInFormData.test.js +0 -118
  690. package/dist/utils/Operate/runPageOperations.js +0 -75
  691. package/dist/utils/Operate/runPageOperations.test.js +0 -105
  692. package/dist/utils/Operate/setValueInFormData.js +0 -22
  693. package/dist/utils/Operate/setValueInFormData.test.js +0 -45
  694. package/dist/utils/Operate/shouldRun.js +0 -57
  695. package/dist/utils/Operate/shouldRun.test.js +0 -65
  696. package/dist/utils/Validate/additional/conditionallyPermittedChange.js +0 -26
  697. package/dist/utils/Validate/additional/conditionallyPermittedChange.test.js +0 -34
  698. package/dist/utils/Validate/additional/conditionallyRequired.js +0 -24
  699. package/dist/utils/Validate/additional/conditionallyRequired.test.js +0 -74
  700. package/dist/utils/Validate/additional/index.js +0 -74
  701. package/dist/utils/Validate/additional/index.test.js +0 -130
  702. package/dist/utils/Validate/additional/mustBeAfter.js +0 -34
  703. package/dist/utils/Validate/additional/mustBeAfter.test.js +0 -109
  704. package/dist/utils/Validate/additional/mustBeBefore.js +0 -34
  705. package/dist/utils/Validate/additional/mustBeBefore.test.js +0 -77
  706. package/dist/utils/Validate/additional/mustBeEarlierDateTime.js +0 -57
  707. package/dist/utils/Validate/additional/mustBeEarlierDateTime.test.js +0 -128
  708. package/dist/utils/Validate/additional/mustBeGreaterThan.js +0 -22
  709. package/dist/utils/Validate/additional/mustBeGreaterThan.test.js +0 -57
  710. package/dist/utils/Validate/additional/mustBeInTheFuture.js +0 -33
  711. package/dist/utils/Validate/additional/mustBeInTheFuture.test.js +0 -32
  712. package/dist/utils/Validate/additional/mustBeInThePast.js +0 -36
  713. package/dist/utils/Validate/additional/mustBeInThePast.test.js +0 -32
  714. package/dist/utils/Validate/additional/mustBeLessThan.js +0 -22
  715. package/dist/utils/Validate/additional/mustBeLessThan.test.js +0 -53
  716. package/dist/utils/Validate/additional/mustBeLongerThan.js +0 -23
  717. package/dist/utils/Validate/additional/mustBeLongerThan.test.js +0 -49
  718. package/dist/utils/Validate/additional/mustBeNumbersOnly.js +0 -24
  719. package/dist/utils/Validate/additional/mustBeNumbersOnly.test.js +0 -45
  720. package/dist/utils/Validate/additional/mustBeOneOf.js +0 -22
  721. package/dist/utils/Validate/additional/mustBeOneOf.test.js +0 -37
  722. package/dist/utils/Validate/additional/mustBeShorterThan.js +0 -23
  723. package/dist/utils/Validate/additional/mustBeShorterThan.test.js +0 -49
  724. package/dist/utils/Validate/additional/mustBeUniqueInCollection.js +0 -40
  725. package/dist/utils/Validate/additional/mustBeUniqueInCollection.test.js +0 -163
  726. package/dist/utils/Validate/additional/mustEnterAtLeastOne.js +0 -26
  727. package/dist/utils/Validate/additional/mustEnterAtLeastOne.test.js +0 -37
  728. package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.js +0 -19
  729. package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.test.js +0 -37
  730. package/dist/utils/Validate/additional/mustNotContainSql.js +0 -19
  731. package/dist/utils/Validate/additional/mustNotContainSql.test.js +0 -33
  732. package/dist/utils/Validate/additional/mustSelectOnlyOne.js +0 -29
  733. package/dist/utils/Validate/additional/mustSelectOnlyOne.test.js +0 -55
  734. package/dist/utils/Validate/additional/utils.js +0 -35
  735. package/dist/utils/Validate/index.js +0 -33
  736. package/dist/utils/Validate/validateCollection.js +0 -50
  737. package/dist/utils/Validate/validateCollection.test.js +0 -134
  738. package/dist/utils/Validate/validateComponent.js +0 -126
  739. package/dist/utils/Validate/validateComponent.test.js +0 -435
  740. package/dist/utils/Validate/validateContainer.js +0 -52
  741. package/dist/utils/Validate/validateContainer.test.js +0 -115
  742. package/dist/utils/Validate/validateDate.js +0 -112
  743. package/dist/utils/Validate/validateDate.test.js +0 -133
  744. package/dist/utils/Validate/validateEmail.js +0 -45
  745. package/dist/utils/Validate/validateEmail.test.js +0 -78
  746. package/dist/utils/Validate/validateMultifile.js +0 -29
  747. package/dist/utils/Validate/validateMultifile.test.js +0 -46
  748. package/dist/utils/Validate/validateOnPageLoad.js +0 -24
  749. package/dist/utils/Validate/validateOnPageLoad.test.js +0 -89
  750. package/dist/utils/Validate/validatePage.js +0 -56
  751. package/dist/utils/Validate/validatePage.test.js +0 -795
  752. package/dist/utils/Validate/validateRegex.js +0 -41
  753. package/dist/utils/Validate/validateRegex.test.js +0 -43
  754. package/dist/utils/Validate/validateRequired.js +0 -37
  755. package/dist/utils/Validate/validateRequired.test.js +0 -64
  756. package/dist/utils/Validate/validateTextArea.js +0 -36
  757. package/dist/utils/Validate/validateTextArea.test.js +0 -71
  758. package/dist/utils/Validate/validateTime.js +0 -76
  759. package/dist/utils/Validate/validateTime.test.js +0 -116
  760. package/dist/utils/canOverrideFieldRequired.js +0 -23
  761. package/dist/utils/index.js +0 -42
@@ -1,960 +0,0 @@
1
- "use strict";
2
-
3
- var _models = require("../../models");
4
- var _utils = _interopRequireDefault(require("../../utils"));
5
- var _handlers = _interopRequireDefault(require("./handlers"));
6
- var _helpers = _interopRequireDefault(require("./helpers"));
7
- var _onPageAction = _interopRequireDefault(require("./onPageAction"));
8
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
- 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; }
10
- 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; }
11
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
12
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
13
- function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
14
- jest.mock('./handlers', () => ({
15
- navigateCalls: 0,
16
- navigate() {
17
- this.navigateCalls += 1;
18
- },
19
- submissionErrorCalls: 0,
20
- submissionErrorArgs: [],
21
- submissionError(errors, addErrors) {
22
- this.submissionErrorCalls += 1;
23
- this.submissionErrorArgs.push(errors);
24
- if (typeof addErrors === 'function') {
25
- addErrors(errors);
26
- }
27
- },
28
- reset() {
29
- this.navigateCalls = 0;
30
- this.submissionErrorCalls = 0;
31
- this.submissionErrorArgs = [];
32
- }
33
- }));
34
- jest.mock('./helpers', () => ({
35
- canActionProceedCalls: 0,
36
- canActionProceedResult: true,
37
- canActionProceed(action, page, validator) {
38
- this.canActionProceedCalls += 1;
39
- if (typeof validator === 'function') {
40
- validator();
41
- }
42
- return this.canActionProceedResult;
43
- },
44
- cleanHiddenNestedDataCalls: 0,
45
- cleanHiddenNestedData(patch) {
46
- this.cleanHiddenNestedDataCalls += 1;
47
- return patch;
48
- },
49
- clearOutUncompletedRoutesCalls: 0,
50
- clearOutUncompletedRoutes(cleanseHiddenData, formPagesAndComponents, formData) {
51
- this.clearOutUncompletedRoutesCalls += 1;
52
- return formData;
53
- },
54
- getNextPageIdCalls: 0,
55
- getNextPageId() {
56
- this.getNextPageIdCalls += 1;
57
- return 'page2';
58
- },
59
- getSubmissionStatusCalls: 0,
60
- getSubmissionStatus() {
61
- this.getSubmissionStatusCalls += 1;
62
- return 'Good to go!';
63
- },
64
- reset() {
65
- this.canActionProceedCalls = 0;
66
- this.canActionProceedResult = true;
67
- this.canCYASubmitResult = true;
68
- this.cleanHiddenNestedDataCalls = 0;
69
- this.getFormStateCalls = 0;
70
- this.getSubmissionStatusCalls = 0;
71
- }
72
- }));
73
- jest.mock('../../utils', () => {
74
- const originalModule = jest.requireActual('../../utils');
75
- return _objectSpread(_objectSpread({}, originalModule.default), {}, {
76
- Format: {
77
- formCalls: 0,
78
- form(form, data) {
79
- this.formCalls += 1;
80
- return data;
81
- }
82
- },
83
- CollectionPage: _objectSpread(_objectSpread({}, originalModule.default.CollectionPage), {}, {
84
- duplicateActiveEntryCalls: 0,
85
- duplicateActiveEntryResult: true,
86
- duplicateActiveEntry() {
87
- this.duplicateActiveEntryCalls += 1;
88
- return this.duplicateActiveEntryResult;
89
- },
90
- addEntryCalls: 0,
91
- addEntryResult: true,
92
- addEntry(collectionName, formData) {
93
- originalModule.default.CollectionPage.addEntry(collectionName, formData);
94
- this.addEntryCalls += 1;
95
- return this.addEntryResult;
96
- }
97
- }),
98
- reset() {
99
- this.Format.formCalls = 0;
100
- this.CollectionPage.duplicateActiveEntryCalls = 0;
101
- this.duplicateActiveEntryResult = true;
102
- this.CollectionPage.addEntryCalls = 0;
103
- this.addEntryResult = true;
104
- }
105
- });
106
- });
107
- describe('components.FormRenderer.onPageAction', () => {
108
- const MOCK_HOOKS = {
109
- onSubmitCalls: 0,
110
- onSubmitArgs: [],
111
- onSubmit(type, payload, onSuccess, onError, changedFieldName, changedFieldValue) {
112
- this.onSubmitCalls += 1;
113
- this.onSubmitArgs.push({
114
- type,
115
- payload,
116
- changedFieldName,
117
- changedFieldValue
118
- });
119
- if (typeof onSuccess === 'function') {
120
- onSuccess();
121
- }
122
- // onError would not normally be called alongside
123
- // onSuccess, we're just doing it here to make sure
124
- // the expected function chain is called.
125
- if (typeof onError === 'function') {
126
- onError(['an example error']);
127
- }
128
- },
129
- onFormCompleteCalls: 0,
130
- onFormComplete() {
131
- this.onFormCompleteCalls += 1;
132
- },
133
- onCancelArgs: [],
134
- onCancel(data) {
135
- this.onCancelArgs.push(data);
136
- },
137
- reset() {
138
- this.onSubmitCalls = 0;
139
- this.onSubmitArgs = [];
140
- this.onFormCompleteCalls = 0;
141
- this.onCancelArgs = [];
142
- this.onActionCalls = 0;
143
- },
144
- onActionCalls: 0,
145
- onAction(formData, patch) {
146
- this.onActionCalls += 1;
147
- return {
148
- formData,
149
- patch
150
- };
151
- }
152
- };
153
- const MOCK_VALIDATE = {
154
- pageCalls: 0,
155
- page() {
156
- MOCK_VALIDATE.pageCalls += 1;
157
- },
158
- reset() {
159
- this.pageCalls = 0;
160
- }
161
- };
162
- let setPagePointCalls = 0;
163
- let setPagePointArgs = [];
164
- const mockSetPagePoint = point => {
165
- setPagePointCalls += 1;
166
- setPagePointArgs.push(point);
167
- };
168
- let setDataCalls = 0;
169
- let setDataArgs = [];
170
- const mockSetData = data => {
171
- setDataCalls += 1;
172
- setDataArgs.push(data);
173
- };
174
- let onPageChangeCalls = 0;
175
- let onPageChangeArgs = [];
176
- const mockOnPageChange = pageId => {
177
- onPageChangeCalls += 1;
178
- onPageChangeArgs.push(pageId);
179
- };
180
- let addErrorsArgs = [];
181
- const mockAddErrors = errors => {
182
- addErrorsArgs.push(errors);
183
- };
184
- let setSubmittedArgs = [];
185
- const mockSetSubmitted = newSubmitted => {
186
- setSubmittedArgs.push(newSubmitted);
187
- };
188
- let mockSubmitting = false;
189
- const mockSetSubmitting = submitting => {
190
- mockSubmitting = submitting;
191
- };
192
- const COMPONENTS = [{
193
- id: 'alpha',
194
- fieldId: 'alpha'
195
- }, {
196
- id: 'bravo',
197
- fieldId: 'bravo'
198
- }, {
199
- id: 'charlie',
200
- fieldId: 'charlie'
201
- }, {
202
- id: 'delta',
203
- fieldId: 'delta'
204
- }];
205
- const PAGES = [{
206
- id: 'page1',
207
- components: [_objectSpread({}, COMPONENTS[0]), _objectSpread({}, COMPONENTS[1])]
208
- }, {
209
- id: 'page2',
210
- components: [_objectSpread({}, COMPONENTS[2]), _objectSpread({}, COMPONENTS[3])]
211
- }];
212
- const CURRENT_TASK = {
213
- name: 'testTask',
214
- fullPages: PAGES
215
- };
216
- const ARGS = {
217
- action: {
218
- type: _models.PageAction.TYPES.NAVIGATE
219
- },
220
- patch: null,
221
- patchLabel: {},
222
- hooks: MOCK_HOOKS,
223
- data: {},
224
- formState: {
225
- page: {
226
- formData: {}
227
- }
228
- },
229
- validate: MOCK_VALIDATE,
230
- onPageChange: mockOnPageChange,
231
- type: _models.FormTypes.FORM_WITH_TASK,
232
- cleanseHiddenData: true,
233
- pages: PAGES,
234
- components: COMPONENTS,
235
- pageId: 'alpha',
236
- setPagePoint: mockSetPagePoint,
237
- currentTask: CURRENT_TASK,
238
- setData: mockSetData,
239
- hubDetails: {},
240
- setSubmitted: mockSetSubmitted,
241
- addErrors: mockAddErrors,
242
- submitting: mockSubmitting,
243
- setSubmitting: mockSetSubmitting
244
- };
245
- beforeEach(() => {
246
- _handlers.default.reset();
247
- _helpers.default.reset();
248
- _utils.default.reset();
249
- MOCK_HOOKS.reset();
250
- MOCK_VALIDATE.reset();
251
- setPagePointCalls = 0;
252
- setPagePointArgs = [];
253
- setDataCalls = 0;
254
- setDataArgs = [];
255
- onPageChangeCalls = 0;
256
- onPageChangeArgs = [];
257
- addErrorsArgs = [];
258
- setSubmittedArgs = [];
259
- mockSetSubmitting(false);
260
- });
261
- const preActionChecks = () => {
262
- expect(_helpers.default.canActionProceedCalls).toEqual(1);
263
- expect(MOCK_VALIDATE.pageCalls).toEqual(1);
264
- expect(_helpers.default.cleanHiddenNestedDataCalls).toEqual(1);
265
- };
266
- const postActionChecks = argsUsed => {
267
- expect(_utils.default.Format.formCalls).toEqual(1);
268
- expect(_helpers.default.getSubmissionStatusCalls).toEqual(1);
269
- // setData is always called once in the error callback
270
- // for the onSubmit hook. It's called an extra time prior
271
- // to this if patch is valid.
272
- if (argsUsed.patch) {
273
- expect(setDataCalls).toEqual(2);
274
- const dataUsed = _objectSpread(_objectSpread(_objectSpread({}, argsUsed.data), argsUsed.patch), argsUsed.formState.page.formData);
275
- const submissionData = _utils.default.Format.form(null, dataUsed, null);
276
- submissionData.formStatus = _helpers.default.getSubmissionStatus();
277
- expect(setDataArgs[0]).toEqual(submissionData);
278
- } else {
279
- expect(setDataCalls).toEqual(1);
280
- }
281
- expect(MOCK_HOOKS.onSubmitCalls).toEqual(1);
282
- if (argsUsed.type === _models.FormTypes.HUB && Object.keys(argsUsed.patchLabel).length > 0) {
283
- const firstKey = Object.keys(argsUsed.patchLabel)[0];
284
- expect(MOCK_HOOKS.onSubmitArgs[0]).toMatchObject({
285
- changedFieldName: firstKey,
286
- changedFieldValue: argsUsed.patchLabel[firstKey]
287
- });
288
- }
289
- expect(MOCK_HOOKS.onActionCalls).toEqual(1);
290
-
291
- // Both the success and error paths of the onSubmit hook are tested
292
- // together to make sure the correct function chains are called for
293
- // each.
294
-
295
- // The success path is tested per-action as it can differ slightly.
296
-
297
- // Testing the error path.
298
- expect(_handlers.default.submissionErrorCalls).toEqual(1);
299
- expect(setDataArgs[setDataCalls - 1]).toEqual(argsUsed.data); // Data is reset in the case of an error.
300
- };
301
- it("should handle the ".concat(_models.PageAction.TYPES.CANCEL, " Page Action type"), () => {
302
- const ACTION = {
303
- type: _models.PageAction.TYPES.CANCEL
304
- };
305
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
306
- action: ACTION
307
- });
308
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
309
- expect(MOCK_HOOKS.onCancelArgs.length).toEqual(1);
310
- expect(MOCK_HOOKS.onCancelArgs[0]).toMatchObject({});
311
- // Shouldn't get to the point of validation if
312
- // action is a cancel action.
313
- expect(_helpers.default.canActionProceedCalls).toEqual(0);
314
- expect(MOCK_VALIDATE.pageCalls).toEqual(0);
315
- });
316
- it("should handle the ".concat(_models.PageAction.TYPES.NAVIGATE, " Page Action type"), () => {
317
- const ACTION = {
318
- type: _models.PageAction.TYPES.NAVIGATE
319
- };
320
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
321
- action: ACTION
322
- });
323
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
324
- preActionChecks();
325
- expect(_handlers.default.navigateCalls).toEqual(1);
326
- expect(MOCK_HOOKS.onSubmitCalls).toEqual(0);
327
- // Not doing the usual post-action checks here
328
- // as a navigate action should stop at calling
329
- // hooks.navigate.
330
- });
331
- it("should handle the ".concat(_models.PageAction.TYPES.SUBMIT, " Page Action type"), () => {
332
- const ACTION = {
333
- type: _models.PageAction.TYPES.SUBMIT
334
- };
335
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
336
- action: ACTION
337
- });
338
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
339
- preActionChecks();
340
- expect(setPagePointCalls).toEqual(1);
341
- expect(setPagePointArgs[0]).toEqual('submit');
342
- postActionChecks(CUSTOM_ARGS);
343
- });
344
- it("should handle the ".concat(_models.PageAction.TYPES.SAVE_AND_NAVIGATE, " Page Action type"), () => {
345
- const ACTION = {
346
- type: _models.PageAction.TYPES.SAVE_AND_NAVIGATE
347
- };
348
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
349
- action: ACTION
350
- });
351
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
352
- preActionChecks();
353
- // All the actions does in this case is set a function
354
- // to be called in the onSuccess callback for the onSubmit hook.
355
- postActionChecks(CUSTOM_ARGS);
356
- expect(_handlers.default.navigateCalls).toEqual(1);
357
- });
358
- it("should handle the ".concat(_models.PageAction.TYPES.COLLECTION_ADD, " Page Action type"), () => {
359
- const FORM_STATE = {
360
- page: {
361
- formData: {
362
- 'testCollection': []
363
- }
364
- }
365
- };
366
- const ACTION = {
367
- type: _models.PageAction.TYPES.COLLECTION_ADD,
368
- collection: 'testCollection'
369
- };
370
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
371
- action: ACTION,
372
- formState: FORM_STATE
373
- });
374
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
375
- preActionChecks();
376
- expect(FORM_STATE.page.formData["".concat(ACTION.collection, "ActiveId")]).toBeDefined();
377
- postActionChecks(CUSTOM_ARGS);
378
-
379
- // This action type also sets up a call to handlers.navigate
380
- // that's called as part of the onSubmit hook's onSuccess callback.
381
- expect(_handlers.default.navigateCalls).toEqual(1);
382
- });
383
- it("should handle the ".concat(_models.PageAction.TYPES.COLLECTION_ADD, " Page Action type where active ID is not the last entry in collection"), () => {
384
- // If the active ID is not the last entry in the collection
385
- // then a new entry is not added
386
- // and the active ID moves to the next entry ID.
387
- const FORM_STATE = {
388
- page: {
389
- formData: {
390
- 'testCollection': [{
391
- id: '1'
392
- }, {
393
- id: '2'
394
- }],
395
- testCollectionActiveId: '1'
396
- }
397
- }
398
- };
399
- const ACTION = {
400
- type: _models.PageAction.TYPES.COLLECTION_ADD,
401
- collection: 'testCollection'
402
- };
403
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
404
- action: ACTION,
405
- formState: FORM_STATE
406
- });
407
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
408
- preActionChecks();
409
- expect(FORM_STATE.page.formData["".concat(ACTION.collection, "ActiveId")]).toEqual('2');
410
- expect(FORM_STATE.page.formData[ACTION.collection].length).toEqual(2);
411
- postActionChecks(CUSTOM_ARGS);
412
-
413
- // This action type also sets up a call to handlers.navigate
414
- // that's called as part of the onSubmit hook's onSuccess callback.
415
- expect(_handlers.default.navigateCalls).toEqual(1);
416
- });
417
- it("should handle the ".concat(_models.PageAction.TYPES.COLLECTION_ADD, " Page Action type where active ID is the last entry in collection"), () => {
418
- // If the active ID is the last entry in the collection
419
- // then a new entry is added (although not picked up in this test)
420
- // and the active ID becomes null.
421
- const FORM_STATE = {
422
- page: {
423
- formData: {
424
- 'testCollection': [{
425
- id: '1'
426
- }, {
427
- id: '2'
428
- }],
429
- testCollectionActiveId: '2'
430
- }
431
- }
432
- };
433
- const ACTION = {
434
- type: _models.PageAction.TYPES.COLLECTION_ADD,
435
- collection: 'testCollection'
436
- };
437
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
438
- action: ACTION,
439
- formState: FORM_STATE
440
- });
441
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
442
- preActionChecks();
443
- expect(FORM_STATE.page.formData["".concat(ACTION.collection, "ActiveId")]).toEqual(null);
444
- expect(FORM_STATE.page.formData[ACTION.collection].length).toEqual(2);
445
- postActionChecks(CUSTOM_ARGS);
446
-
447
- // This action type also sets up a call to handlers.navigate
448
- // that's called as part of the onSubmit hook's onSuccess callback.
449
- expect(_handlers.default.navigateCalls).toEqual(1);
450
- });
451
- it("should clean previous collection entry fields at top level of formData", () => {
452
- const FORM_STATE = {
453
- page: {
454
- formData: {
455
- 'testCollection': [{
456
- 'flightNumber': '1'
457
- }],
458
- 'flightNumber': '1'
459
- }
460
- }
461
- };
462
- const ACTION = {
463
- type: _models.PageAction.TYPES.COLLECTION_ADD,
464
- collection: 'testCollection'
465
- };
466
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
467
- action: ACTION,
468
- formState: FORM_STATE
469
- });
470
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
471
- preActionChecks();
472
- expect(FORM_STATE.page.formData["".concat(ACTION.collection, "ActiveId")]).toBeDefined();
473
- expect(FORM_STATE.page.formData.flightNumber).toBeUndefined();
474
- postActionChecks(CUSTOM_ARGS);
475
-
476
- // This action type also sets up a call to handlers.navigate
477
- // that's called as part of the onSubmit hook's onSuccess callback.
478
- expect(_handlers.default.navigateCalls).toEqual(1);
479
- });
480
- describe("should handle the ".concat(_models.PageAction.TYPES.COLLECTION_DUPLICATE, " Page Action type"), () => {
481
- it("calling handlers.navigate if the duplication was successful", () => {
482
- const FORM_STATE = {
483
- page: {
484
- formData: {
485
- 'testCollection': []
486
- }
487
- }
488
- };
489
- const ACTION = {
490
- type: _models.PageAction.TYPES.COLLECTION_DUPLICATE,
491
- collection: 'testCollection'
492
- };
493
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
494
- action: ACTION,
495
- formState: FORM_STATE
496
- });
497
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
498
- preActionChecks();
499
- expect(_utils.default.CollectionPage.duplicateActiveEntryCalls).toEqual(1);
500
- postActionChecks(CUSTOM_ARGS);
501
-
502
- // This action type also sets up a call to handlers.navigate
503
- // that's called as part of the onSubmit hook's onSuccess callback.
504
- expect(_handlers.default.navigateCalls).toEqual(1);
505
- });
506
- it("calling onPageChange if the duplication was unsuccessful", () => {
507
- const FORM_STATE = {
508
- page: {
509
- formData: {
510
- 'testCollection': []
511
- }
512
- }
513
- };
514
- const ACTION = {
515
- type: _models.PageAction.TYPES.COLLECTION_DUPLICATE,
516
- collection: 'testCollection'
517
- };
518
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
519
- action: ACTION,
520
- formState: FORM_STATE
521
- });
522
- _utils.default.CollectionPage.duplicateActiveEntryResult = false;
523
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
524
- preActionChecks();
525
- expect(_utils.default.CollectionPage.duplicateActiveEntryCalls).toEqual(1);
526
- postActionChecks(CUSTOM_ARGS);
527
-
528
- // The handlers.navigate callback shouldn't be set when
529
- // duplication fails.
530
- expect(_handlers.default.navigateCalls).toEqual(0);
531
- // Instead we should be using the default onPageChange setup.
532
- expect(onPageChangeCalls).toEqual(1);
533
- });
534
- });
535
- describe("should handle the ".concat(_models.PageAction.TYPES.COLLECTION_REMOVE, " Page Action type"), () => {
536
- it("should store a reference to the removed item if action.recordRemoval is true", () => {
537
- const FORM_STATE = {
538
- page: {
539
- formData: {
540
- testCollectionActiveId: 'removeMe',
541
- testCollection: [{
542
- id: 'removeMe'
543
- }, {
544
- id: 'leaveMeAlone'
545
- }]
546
- }
547
- }
548
- };
549
- const ACTION = {
550
- type: _models.PageAction.TYPES.COLLECTION_REMOVE,
551
- collection: 'testCollection',
552
- recordRemoval: true
553
- };
554
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
555
- action: ACTION,
556
- formState: FORM_STATE
557
- });
558
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
559
- preActionChecks();
560
- expect(FORM_STATE.page.formData.testCollection).toEqual([{
561
- id: 'leaveMeAlone'
562
- }]);
563
- expect(FORM_STATE.page.formData.testCollectionLastRemoved).toEqual({
564
- id: 'removeMe'
565
- });
566
- postActionChecks(CUSTOM_ARGS);
567
-
568
- // This action type uses handlers navigate callback
569
- expect(_handlers.default.navigateCalls).toEqual(1);
570
- });
571
- it("should not store a reference to the removed item if action.recordRemoval is false", () => {
572
- const FORM_STATE = {
573
- page: {
574
- formData: {
575
- testCollectionActiveId: 'removeMe',
576
- testCollection: [{
577
- id: 'removeMe'
578
- }, {
579
- id: 'leaveMeAlone'
580
- }]
581
- }
582
- }
583
- };
584
- const ACTION = {
585
- type: _models.PageAction.TYPES.COLLECTION_REMOVE,
586
- collection: 'testCollection',
587
- recordRemoval: false
588
- };
589
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
590
- action: ACTION,
591
- formState: FORM_STATE
592
- });
593
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
594
- preActionChecks();
595
- expect(FORM_STATE.page.formData.testCollection).toEqual([{
596
- id: 'leaveMeAlone'
597
- }]);
598
- expect(FORM_STATE.page.formData.testCollectionLastRemoved).toBeUndefined();
599
- postActionChecks(CUSTOM_ARGS);
600
-
601
- // This action type uses handlers navigate callback
602
- expect(_handlers.default.navigateCalls).toEqual(1);
603
- });
604
- it("should not store a reference to the removed item if action.recordRemoval is not defined", () => {
605
- const FORM_STATE = {
606
- page: {
607
- formData: {
608
- testCollectionActiveId: 'removeMe',
609
- testCollection: [{
610
- id: 'removeMe'
611
- }, {
612
- id: 'leaveMeAlone'
613
- }]
614
- }
615
- }
616
- };
617
- const ACTION = {
618
- type: _models.PageAction.TYPES.COLLECTION_REMOVE,
619
- collection: 'testCollection'
620
- };
621
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
622
- action: ACTION,
623
- formState: FORM_STATE
624
- });
625
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
626
- preActionChecks();
627
- expect(FORM_STATE.page.formData.testCollection).toEqual([{
628
- id: 'leaveMeAlone'
629
- }]);
630
- expect(FORM_STATE.page.formData.testCollectionLastRemoved).toBeUndefined();
631
- postActionChecks(CUSTOM_ARGS);
632
-
633
- // This action type uses handlers navigate callback
634
- expect(_handlers.default.navigateCalls).toEqual(1);
635
- });
636
- it("should clean collection fields at top level of formData when entries remain", () => {
637
- // After removing the active entry, the collection data is assigned to the
638
- // top level of formData and the activeId is reset.
639
- const FORM_STATE = {
640
- page: {
641
- formData: {
642
- testCollectionActiveId: 'removeMe',
643
- testCollection: [{
644
- id: 'leaveMeAlone',
645
- flightNumber: '1'
646
- }, {
647
- id: 'removeMe',
648
- flightNumber: '2'
649
- }],
650
- flightNumber: '2',
651
- testCollectionLastRemoved: 'previousOne'
652
- }
653
- }
654
- };
655
- const ACTION = {
656
- type: _models.PageAction.TYPES.COLLECTION_REMOVE,
657
- collection: 'testCollection',
658
- recordRemoval: true
659
- };
660
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
661
- action: ACTION,
662
- formState: FORM_STATE
663
- });
664
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
665
- preActionChecks();
666
- expect(FORM_STATE.page.formData.testCollection).toEqual([{
667
- id: 'leaveMeAlone',
668
- flightNumber: '1'
669
- }]);
670
- expect(FORM_STATE.page.formData.testCollectionLastRemoved).toEqual({
671
- id: 'removeMe',
672
- flightNumber: '2'
673
- });
674
- expect(FORM_STATE.page.formData.flightNumber).toEqual('1');
675
- expect(FORM_STATE.page.formData.testCollectionActiveId).toEqual('leaveMeAlone');
676
- postActionChecks(CUSTOM_ARGS);
677
-
678
- // This action type uses handlers navigate callback
679
- expect(_handlers.default.navigateCalls).toEqual(1);
680
- });
681
- it("should clean collection fields at top level of formData after last entry removed", () => {
682
- // After removing the last active entry, the collection array and activeID are deleted,
683
- // and the collection data is removed from top level of formData.
684
- const FORM_STATE = {
685
- page: {
686
- formData: {
687
- testCollectionActiveId: 'removeMe',
688
- testCollection: [{
689
- id: 'removeMe',
690
- flightNumber: '1'
691
- }],
692
- flightNumber: '1',
693
- testCollectionLastRemoved: 'previousOne'
694
- }
695
- }
696
- };
697
- const ACTION = {
698
- type: _models.PageAction.TYPES.COLLECTION_REMOVE,
699
- collection: 'testCollection',
700
- recordRemoval: true
701
- };
702
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
703
- action: ACTION,
704
- formState: FORM_STATE
705
- });
706
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
707
- preActionChecks();
708
- expect(FORM_STATE.page.formData.testCollection).toBeUndefined();
709
- expect(FORM_STATE.page.formData.testCollectionLastRemoved).toEqual({
710
- id: 'removeMe',
711
- flightNumber: '1'
712
- });
713
- expect(FORM_STATE.page.formData.flightNumber).toBeUndefined();
714
- expect(FORM_STATE.page.formData.testCollectionActiveId).toBeUndefined();
715
- postActionChecks(CUSTOM_ARGS);
716
-
717
- // This action type uses handlers navigate callback
718
- expect(_handlers.default.navigateCalls).toEqual(1);
719
- });
720
- });
721
- describe('if validation fails', () => {
722
- const VALID_ACTIONS = Object.values(_models.PageAction.TYPES).filter(a => a !== _models.PageAction.TYPES.CANCEL);
723
- VALID_ACTIONS.forEach(actionType => {
724
- it("should not continue for the ".concat(actionType, " action type"), () => {
725
- const ACTION = {
726
- type: actionType
727
- };
728
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
729
- action: ACTION
730
- });
731
- _helpers.default.canActionProceedResult = false;
732
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
733
- expect(_helpers.default.canActionProceedCalls).toEqual(1);
734
- expect(MOCK_VALIDATE.pageCalls).toEqual(1);
735
- // Validation fails so we expect to never reach
736
- // the point of submission.
737
- expect(MOCK_HOOKS.onSubmitCalls).toEqual(0);
738
- });
739
- });
740
- });
741
- describe('adding a field to formData if specified on the action', () => {
742
- const VALID_ACTIONS = Object.values(_models.PageAction.TYPES).filter(a => a !== _models.PageAction.TYPES.CANCEL && a !== _models.PageAction.TYPES.NAVIGATE);
743
- VALID_ACTIONS.forEach(actionType => {
744
- it("should work for the ".concat(actionType, " action type"), () => {
745
- const FORM_STATE = {
746
- page: {
747
- formData: {
748
- testCollection: []
749
- }
750
- }
751
- };
752
- const ACTION = {
753
- type: actionType,
754
- collection: 'testCollection',
755
- addToFormData: [{
756
- field: 'alpha',
757
- value: '123'
758
- }, {
759
- field: 'parent.child',
760
- value: [{
761
- id: '12345'
762
- }],
763
- isCollection: true
764
- }]
765
- };
766
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
767
- formState: FORM_STATE,
768
- action: ACTION
769
- });
770
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
771
- preActionChecks();
772
- postActionChecks(CUSTOM_ARGS);
773
- expect(FORM_STATE.page.formData).toMatchObject({
774
- alpha: '123'
775
- });
776
- expect(FORM_STATE.page.formData.parent[0].child[0].id).toEqual('12345');
777
- });
778
- });
779
- it("should work for the ".concat(_models.PageAction.TYPES.SAVE_AND_NAVIGATE, " action type to reset the active ID"), () => {
780
- // In this test the action includes the resetActiveId field
781
- // requiring that the active ID is pointed to the first entry in the collection
782
- // so that user can cycle through the full collection again.
783
- const FORM_STATE = {
784
- page: {
785
- formData: {
786
- testCollection: [{
787
- id: '1'
788
- }, {
789
- id: '2'
790
- }, {
791
- id: '3'
792
- }],
793
- testCollectionActiveId: '3'
794
- }
795
- }
796
- };
797
- const ACTION = {
798
- type: _models.PageAction.TYPES.SAVE_AND_NAVIGATE,
799
- collection: 'testCollection',
800
- resetActiveId: true
801
- };
802
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
803
- formState: FORM_STATE,
804
- action: ACTION
805
- });
806
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
807
- preActionChecks();
808
- // All the actions does in this case is set a function
809
- // to be called in the onSuccess callback for the onSubmit hook.
810
- postActionChecks(CUSTOM_ARGS);
811
- expect(_handlers.default.navigateCalls).toEqual(1);
812
- expect(FORM_STATE.page.formData["".concat(ACTION.collection, "ActiveId")]).toEqual('1');
813
- });
814
- it("should work for the ".concat(_models.PageAction.TYPES.SAVE_AND_NAVIGATE, " action type to set addAnother to yes"), () => {
815
- // If the user is midway through the collection
816
- // then the addAnother field is set to yes
817
- // to allow the navigation to move to next entry.
818
- const FORM_STATE = {
819
- page: {
820
- formData: {
821
- tests: [{
822
- id: '1'
823
- }, {
824
- id: '2'
825
- }, {
826
- id: '3'
827
- }],
828
- testsActiveId: '2',
829
- addAnotherTest: 'No'
830
- }
831
- }
832
- };
833
- const ACTION = {
834
- type: _models.PageAction.TYPES.SAVE_AND_NAVIGATE,
835
- collection: 'tests'
836
- };
837
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
838
- formState: FORM_STATE,
839
- action: ACTION
840
- });
841
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
842
- preActionChecks();
843
- // All the actions does in this case is set a function
844
- // to be called in the onSuccess callback for the onSubmit hook.
845
- postActionChecks(CUSTOM_ARGS);
846
- expect(_handlers.default.navigateCalls).toEqual(1);
847
- expect(FORM_STATE.page.formData["".concat(ACTION.collection, "ActiveId")]).toEqual('2');
848
- expect(FORM_STATE.page.formData[ACTION.collection].length).toEqual(3);
849
- expect(FORM_STATE.page.formData.addAnotherTest).toEqual('Yes');
850
- });
851
- it("should work for the ".concat(_models.PageAction.TYPES.NAVIGATE, " action type"), () => {
852
- const FORM_STATE = {
853
- page: {
854
- formData: {
855
- testCollection: []
856
- }
857
- }
858
- };
859
- const ACTION = {
860
- type: _models.PageAction.TYPES.NAVIGATE,
861
- collection: 'testCollection',
862
- addToFormData: [{
863
- field: 'alpha',
864
- value: '123'
865
- }, {
866
- field: 'parent.child',
867
- value: [{
868
- id: '12345'
869
- }],
870
- isCollection: true
871
- }]
872
- };
873
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
874
- formState: FORM_STATE,
875
- action: ACTION
876
- });
877
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
878
- preActionChecks();
879
- // Not doing the usual post-action checks here
880
- // as a navigate action should stop at calling
881
- // hooks.navigate.
882
- expect(FORM_STATE.page.formData).toMatchObject({
883
- alpha: '123'
884
- });
885
- expect(FORM_STATE.page.formData.parent[0].child[0].id).toEqual('12345');
886
- });
887
- it('should work for an array of formData', () => {
888
- const FORM_STATE = {
889
- page: {
890
- formData: {
891
- testCollection: []
892
- }
893
- }
894
- };
895
- const ACTION = {
896
- type: _models.PageAction.TYPES.NAVIGATE,
897
- collection: 'testCollection',
898
- addToFormData: [{
899
- field: 'alpha',
900
- value: '123'
901
- }, {
902
- field: 'beta.gamma',
903
- value: '456'
904
- }]
905
- };
906
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
907
- formState: FORM_STATE,
908
- action: ACTION
909
- });
910
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
911
- preActionChecks();
912
- // Not doing the usual post-action checks here
913
- // as a navigate action should stop at calling
914
- // hooks.navigate.
915
- expect(FORM_STATE.page.formData).toMatchObject({
916
- alpha: '123',
917
- beta: {
918
- gamma: '456'
919
- }
920
- });
921
- });
922
- });
923
- describe('recording patchLabel fields correctly when it is defined', () => {
924
- const VALID_ACTIONS = Object.values(_models.PageAction.TYPES).filter(a => a !== _models.PageAction.TYPES.CANCEL && a !== _models.PageAction.TYPES.NAVIGATE);
925
- VALID_ACTIONS.forEach(actionType => {
926
- it("should work for the ".concat(actionType, " action type"), () => {
927
- const FORM_STATE = {
928
- page: {
929
- formData: {
930
- testCollection: []
931
- }
932
- }
933
- };
934
- const KEY = 'testField';
935
- const VALUE = 'testValue';
936
- const PATCH_LABEL = {
937
- [KEY]: VALUE
938
- };
939
- const PATCH = {
940
- [KEY]: VALUE
941
- };
942
- const ACTION = {
943
- type: actionType,
944
- collection: 'testCollection'
945
- };
946
- const CUSTOM_ARGS = _objectSpread(_objectSpread({}, ARGS), {}, {
947
- action: ACTION,
948
- formState: FORM_STATE,
949
- patch: PATCH,
950
- patchLabel: PATCH_LABEL,
951
- type: _models.FormTypes.HUB
952
- });
953
- _onPageAction.default.apply(void 0, Object.values(CUSTOM_ARGS));
954
- preActionChecks();
955
- postActionChecks(CUSTOM_ARGS); // Specific check for patchLabel done in here.
956
- });
957
- });
958
- });
959
- });
960
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9kZWxzIiwicmVxdWlyZSIsIl91dGlscyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfaGFuZGxlcnMiLCJfaGVscGVycyIsIl9vblBhZ2VBY3Rpb24iLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJvd25LZXlzIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfdG9Qcm9wZXJ0eUtleSIsInZhbHVlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJpIiwiX3RvUHJpbWl0aXZlIiwiU3ltYm9sIiwidG9QcmltaXRpdmUiLCJjYWxsIiwiVHlwZUVycm9yIiwiU3RyaW5nIiwiTnVtYmVyIiwiamVzdCIsIm1vY2siLCJuYXZpZ2F0ZUNhbGxzIiwibmF2aWdhdGUiLCJzdWJtaXNzaW9uRXJyb3JDYWxscyIsInN1Ym1pc3Npb25FcnJvckFyZ3MiLCJzdWJtaXNzaW9uRXJyb3IiLCJlcnJvcnMiLCJhZGRFcnJvcnMiLCJyZXNldCIsImNhbkFjdGlvblByb2NlZWRDYWxscyIsImNhbkFjdGlvblByb2NlZWRSZXN1bHQiLCJjYW5BY3Rpb25Qcm9jZWVkIiwiYWN0aW9uIiwicGFnZSIsInZhbGlkYXRvciIsImNsZWFuSGlkZGVuTmVzdGVkRGF0YUNhbGxzIiwiY2xlYW5IaWRkZW5OZXN0ZWREYXRhIiwicGF0Y2giLCJjbGVhck91dFVuY29tcGxldGVkUm91dGVzQ2FsbHMiLCJjbGVhck91dFVuY29tcGxldGVkUm91dGVzIiwiY2xlYW5zZUhpZGRlbkRhdGEiLCJmb3JtUGFnZXNBbmRDb21wb25lbnRzIiwiZm9ybURhdGEiLCJnZXROZXh0UGFnZUlkQ2FsbHMiLCJnZXROZXh0UGFnZUlkIiwiZ2V0U3VibWlzc2lvblN0YXR1c0NhbGxzIiwiZ2V0U3VibWlzc2lvblN0YXR1cyIsImNhbkNZQVN1Ym1pdFJlc3VsdCIsImdldEZvcm1TdGF0ZUNhbGxzIiwib3JpZ2luYWxNb2R1bGUiLCJyZXF1aXJlQWN0dWFsIiwiRm9ybWF0IiwiZm9ybUNhbGxzIiwiZm9ybSIsImRhdGEiLCJDb2xsZWN0aW9uUGFnZSIsImR1cGxpY2F0ZUFjdGl2ZUVudHJ5Q2FsbHMiLCJkdXBsaWNhdGVBY3RpdmVFbnRyeVJlc3VsdCIsImR1cGxpY2F0ZUFjdGl2ZUVudHJ5IiwiYWRkRW50cnlDYWxscyIsImFkZEVudHJ5UmVzdWx0IiwiYWRkRW50cnkiLCJjb2xsZWN0aW9uTmFtZSIsImRlc2NyaWJlIiwiTU9DS19IT09LUyIsIm9uU3VibWl0Q2FsbHMiLCJvblN1Ym1pdEFyZ3MiLCJvblN1Ym1pdCIsInR5cGUiLCJwYXlsb2FkIiwib25TdWNjZXNzIiwib25FcnJvciIsImNoYW5nZWRGaWVsZE5hbWUiLCJjaGFuZ2VkRmllbGRWYWx1ZSIsIm9uRm9ybUNvbXBsZXRlQ2FsbHMiLCJvbkZvcm1Db21wbGV0ZSIsIm9uQ2FuY2VsQXJncyIsIm9uQ2FuY2VsIiwib25BY3Rpb25DYWxscyIsIm9uQWN0aW9uIiwiTU9DS19WQUxJREFURSIsInBhZ2VDYWxscyIsInNldFBhZ2VQb2ludENhbGxzIiwic2V0UGFnZVBvaW50QXJncyIsIm1vY2tTZXRQYWdlUG9pbnQiLCJwb2ludCIsInNldERhdGFDYWxscyIsInNldERhdGFBcmdzIiwibW9ja1NldERhdGEiLCJvblBhZ2VDaGFuZ2VDYWxscyIsIm9uUGFnZUNoYW5nZUFyZ3MiLCJtb2NrT25QYWdlQ2hhbmdlIiwicGFnZUlkIiwiYWRkRXJyb3JzQXJncyIsIm1vY2tBZGRFcnJvcnMiLCJzZXRTdWJtaXR0ZWRBcmdzIiwibW9ja1NldFN1Ym1pdHRlZCIsIm5ld1N1Ym1pdHRlZCIsIm1vY2tTdWJtaXR0aW5nIiwibW9ja1NldFN1Ym1pdHRpbmciLCJzdWJtaXR0aW5nIiwiQ09NUE9ORU5UUyIsImlkIiwiZmllbGRJZCIsIlBBR0VTIiwiY29tcG9uZW50cyIsIkNVUlJFTlRfVEFTSyIsIm5hbWUiLCJmdWxsUGFnZXMiLCJBUkdTIiwiUGFnZUFjdGlvbiIsIlRZUEVTIiwiTkFWSUdBVEUiLCJwYXRjaExhYmVsIiwiaG9va3MiLCJmb3JtU3RhdGUiLCJ2YWxpZGF0ZSIsIm9uUGFnZUNoYW5nZSIsIkZvcm1UeXBlcyIsIkZPUk1fV0lUSF9UQVNLIiwicGFnZXMiLCJzZXRQYWdlUG9pbnQiLCJjdXJyZW50VGFzayIsInNldERhdGEiLCJodWJEZXRhaWxzIiwic2V0U3VibWl0dGVkIiwic2V0U3VibWl0dGluZyIsImJlZm9yZUVhY2giLCJoYW5kbGVycyIsImhlbHBlcnMiLCJVdGlscyIsInByZUFjdGlvbkNoZWNrcyIsImV4cGVjdCIsInRvRXF1YWwiLCJwb3N0QWN0aW9uQ2hlY2tzIiwiYXJnc1VzZWQiLCJkYXRhVXNlZCIsInN1Ym1pc3Npb25EYXRhIiwiZm9ybVN0YXR1cyIsIkhVQiIsImZpcnN0S2V5IiwidG9NYXRjaE9iamVjdCIsIml0IiwiY29uY2F0IiwiQ0FOQ0VMIiwiQUNUSU9OIiwiQ1VTVE9NX0FSR1MiLCJvblBhZ2VBY3Rpb24iLCJ2YWx1ZXMiLCJTVUJNSVQiLCJTQVZFX0FORF9OQVZJR0FURSIsIkNPTExFQ1RJT05fQUREIiwiRk9STV9TVEFURSIsImNvbGxlY3Rpb24iLCJ0b0JlRGVmaW5lZCIsInRlc3RDb2xsZWN0aW9uQWN0aXZlSWQiLCJmbGlnaHROdW1iZXIiLCJ0b0JlVW5kZWZpbmVkIiwiQ09MTEVDVElPTl9EVVBMSUNBVEUiLCJDT0xMRUNUSU9OX1JFTU9WRSIsInRlc3RDb2xsZWN0aW9uIiwicmVjb3JkUmVtb3ZhbCIsInRlc3RDb2xsZWN0aW9uTGFzdFJlbW92ZWQiLCJWQUxJRF9BQ1RJT05TIiwiYSIsImFjdGlvblR5cGUiLCJhZGRUb0Zvcm1EYXRhIiwiZmllbGQiLCJpc0NvbGxlY3Rpb24iLCJhbHBoYSIsInBhcmVudCIsImNoaWxkIiwicmVzZXRBY3RpdmVJZCIsInRlc3RzIiwidGVzdHNBY3RpdmVJZCIsImFkZEFub3RoZXJUZXN0IiwiYmV0YSIsImdhbW1hIiwiS0VZIiwiVkFMVUUiLCJQQVRDSF9MQUJFTCIsIlBBVENIIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvRm9ybVJlbmRlcmVyL29uUGFnZUFjdGlvbi50ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1UeXBlcywgUGFnZUFjdGlvbiB9IGZyb20gXCIuLi8uLi9tb2RlbHNcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCBoYW5kbGVycyBmcm9tIFwiLi9oYW5kbGVyc1wiO1xuaW1wb3J0IGhlbHBlcnMgZnJvbSBcIi4vaGVscGVyc1wiO1xuaW1wb3J0IG9uUGFnZUFjdGlvbiBmcm9tIFwiLi9vblBhZ2VBY3Rpb25cIlxuXG5qZXN0Lm1vY2soJy4vaGFuZGxlcnMnLCAoKSA9PiAoXG4gIHtcbiAgICBuYXZpZ2F0ZUNhbGxzOiAwLFxuICAgIG5hdmlnYXRlKCkge1xuICAgICAgdGhpcy5uYXZpZ2F0ZUNhbGxzICs9IDE7XG4gICAgfSxcbiAgICBzdWJtaXNzaW9uRXJyb3JDYWxsczogMCxcbiAgICBzdWJtaXNzaW9uRXJyb3JBcmdzOiBbXSxcbiAgICBzdWJtaXNzaW9uRXJyb3IoZXJyb3JzLCBhZGRFcnJvcnMpIHtcbiAgICAgIHRoaXMuc3VibWlzc2lvbkVycm9yQ2FsbHMgKz0gMTtcbiAgICAgIHRoaXMuc3VibWlzc2lvbkVycm9yQXJncy5wdXNoKGVycm9ycyk7XG4gICAgICBpZiAodHlwZW9mIGFkZEVycm9ycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhZGRFcnJvcnMoZXJyb3JzKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlc2V0KCkge1xuICAgICAgdGhpcy5uYXZpZ2F0ZUNhbGxzID0gMDtcbiAgICAgIHRoaXMuc3VibWlzc2lvbkVycm9yQ2FsbHMgPSAwO1xuICAgICAgdGhpcy5zdWJtaXNzaW9uRXJyb3JBcmdzID0gW107XG4gICAgfVxuICB9XG4pKTtcblxuamVzdC5tb2NrKCcuL2hlbHBlcnMnLCAoKSA9PiAoIFxuICB7XG4gICAgY2FuQWN0aW9uUHJvY2VlZENhbGxzOiAwLFxuICAgIGNhbkFjdGlvblByb2NlZWRSZXN1bHQ6IHRydWUsXG4gICAgY2FuQWN0aW9uUHJvY2VlZChhY3Rpb24sIHBhZ2UsIHZhbGlkYXRvcikge1xuICAgICAgdGhpcy5jYW5BY3Rpb25Qcm9jZWVkQ2FsbHMgKz0gMTtcbiAgICAgIGlmICh0eXBlb2YgdmFsaWRhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHZhbGlkYXRvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuY2FuQWN0aW9uUHJvY2VlZFJlc3VsdDtcbiAgICB9LFxuICAgIGNsZWFuSGlkZGVuTmVzdGVkRGF0YUNhbGxzOiAwLFxuICAgIGNsZWFuSGlkZGVuTmVzdGVkRGF0YShwYXRjaCkge1xuICAgICAgdGhpcy5jbGVhbkhpZGRlbk5lc3RlZERhdGFDYWxscyArPSAxO1xuICAgICAgcmV0dXJuIHBhdGNoO1xuICAgIH0sXG4gICAgY2xlYXJPdXRVbmNvbXBsZXRlZFJvdXRlc0NhbGxzOiAwLFxuICAgIGNsZWFyT3V0VW5jb21wbGV0ZWRSb3V0ZXMoY2xlYW5zZUhpZGRlbkRhdGEsIGZvcm1QYWdlc0FuZENvbXBvbmVudHMsIGZvcm1EYXRhKSB7XG4gICAgICB0aGlzLmNsZWFyT3V0VW5jb21wbGV0ZWRSb3V0ZXNDYWxscyArPSAxO1xuICAgICAgcmV0dXJuIGZvcm1EYXRhO1xuICAgIH0sXG4gICAgZ2V0TmV4dFBhZ2VJZENhbGxzOiAwLFxuICAgIGdldE5leHRQYWdlSWQoKSB7XG4gICAgICB0aGlzLmdldE5leHRQYWdlSWRDYWxscyArPSAxO1xuICAgICAgcmV0dXJuICdwYWdlMic7XG4gICAgfSxcbiAgICBnZXRTdWJtaXNzaW9uU3RhdHVzQ2FsbHM6IDAsXG4gICAgZ2V0U3VibWlzc2lvblN0YXR1cygpIHtcbiAgICAgIHRoaXMuZ2V0U3VibWlzc2lvblN0YXR1c0NhbGxzICs9IDE7XG4gICAgICByZXR1cm4gJ0dvb2QgdG8gZ28hJztcbiAgICB9LFxuICAgIHJlc2V0KCkge1xuICAgICAgdGhpcy5jYW5BY3Rpb25Qcm9jZWVkQ2FsbHMgPSAwO1xuICAgICAgdGhpcy5jYW5BY3Rpb25Qcm9jZWVkUmVzdWx0ID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2FuQ1lBU3VibWl0UmVzdWx0ID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2xlYW5IaWRkZW5OZXN0ZWREYXRhQ2FsbHMgPSAwO1xuICAgICAgdGhpcy5nZXRGb3JtU3RhdGVDYWxscyA9IDA7XG4gICAgICB0aGlzLmdldFN1Ym1pc3Npb25TdGF0dXNDYWxscyA9IDA7XG4gICAgfVxuICB9XG4pKTtcblxuamVzdC5tb2NrKCcuLi8uLi91dGlscycsICgpID0+IHtcbiAgY29uc3Qgb3JpZ2luYWxNb2R1bGUgPSBqZXN0LnJlcXVpcmVBY3R1YWwoJy4uLy4uL3V0aWxzJyk7XG4gIHJldHVybiB7XG4gICAgLi4ub3JpZ2luYWxNb2R1bGUuZGVmYXVsdCxcbiAgICBGb3JtYXQ6IHtcbiAgICAgIGZvcm1DYWxsczogMCxcbiAgICAgIGZvcm0oZm9ybSwgZGF0YSkge1xuICAgICAgICB0aGlzLmZvcm1DYWxscyArPSAxO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICB9LFxuICAgIENvbGxlY3Rpb25QYWdlOiB7XG4gICAgICAuLi5vcmlnaW5hbE1vZHVsZS5kZWZhdWx0LkNvbGxlY3Rpb25QYWdlLFxuICAgICAgZHVwbGljYXRlQWN0aXZlRW50cnlDYWxsczogMCxcbiAgICAgIGR1cGxpY2F0ZUFjdGl2ZUVudHJ5UmVzdWx0OiB0cnVlLFxuICAgICAgZHVwbGljYXRlQWN0aXZlRW50cnkoKSB7XG4gICAgICAgIHRoaXMuZHVwbGljYXRlQWN0aXZlRW50cnlDYWxscyArPSAxO1xuICAgICAgICByZXR1cm4gdGhpcy5kdXBsaWNhdGVBY3RpdmVFbnRyeVJlc3VsdDtcbiAgICAgIH0sXG4gICAgICBhZGRFbnRyeUNhbGxzOiAwLFxuICAgICAgYWRkRW50cnlSZXN1bHQ6IHRydWUsXG4gICAgICBhZGRFbnRyeShjb2xsZWN0aW9uTmFtZSwgZm9ybURhdGEpIHtcbiAgICAgICAgb3JpZ2luYWxNb2R1bGUuZGVmYXVsdC5Db2xsZWN0aW9uUGFnZS5hZGRFbnRyeShjb2xsZWN0aW9uTmFtZSwgZm9ybURhdGEpO1xuICAgICAgICB0aGlzLmFkZEVudHJ5Q2FsbHMgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRW50cnlSZXN1bHQ7XG4gICAgICB9XG4gICAgfSxcbiAgICByZXNldCgpIHtcbiAgICAgIHRoaXMuRm9ybWF0LmZvcm1DYWxscyA9IDA7XG4gICAgICB0aGlzLkNvbGxlY3Rpb25QYWdlLmR1cGxpY2F0ZUFjdGl2ZUVudHJ5Q2FsbHMgPSAwO1xuICAgICAgdGhpcy5kdXBsaWNhdGVBY3RpdmVFbnRyeVJlc3VsdCA9IHRydWU7XG4gICAgICB0aGlzLkNvbGxlY3Rpb25QYWdlLmFkZEVudHJ5Q2FsbHMgPSAwO1xuICAgICAgdGhpcy5hZGRFbnRyeVJlc3VsdCA9IHRydWU7XG4gICAgfVxuICB9XG59KTtcblxuZGVzY3JpYmUoJ2NvbXBvbmVudHMuRm9ybVJlbmRlcmVyLm9uUGFnZUFjdGlvbicsICgpID0+IHsgXG5cbiAgY29uc3QgTU9DS19IT09LUyA9IHtcbiAgICBvblN1Ym1pdENhbGxzOiAwLFxuICAgIG9uU3VibWl0QXJnczogW10sXG4gICAgb25TdWJtaXQodHlwZSwgcGF5bG9hZCwgb25TdWNjZXNzLCBvbkVycm9yLCBjaGFuZ2VkRmllbGROYW1lLCBjaGFuZ2VkRmllbGRWYWx1ZSkge1xuICAgICAgdGhpcy5vblN1Ym1pdENhbGxzICs9IDE7XG4gICAgICB0aGlzLm9uU3VibWl0QXJncy5wdXNoKHsgdHlwZSwgcGF5bG9hZCwgY2hhbmdlZEZpZWxkTmFtZSwgY2hhbmdlZEZpZWxkVmFsdWUgfSk7XG4gICAgICBpZiAodHlwZW9mIG9uU3VjY2VzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvblN1Y2Nlc3MoKTtcbiAgICAgIH1cbiAgICAgIC8vIG9uRXJyb3Igd291bGQgbm90IG5vcm1hbGx5IGJlIGNhbGxlZCBhbG9uZ3NpZGVcbiAgICAgIC8vIG9uU3VjY2Vzcywgd2UncmUganVzdCBkb2luZyBpdCBoZXJlIHRvIG1ha2Ugc3VyZVxuICAgICAgLy8gdGhlIGV4cGVjdGVkIGZ1bmN0aW9uIGNoYWluIGlzIGNhbGxlZC5cbiAgICAgIGlmICh0eXBlb2Ygb25FcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBvbkVycm9yKFsgJ2FuIGV4YW1wbGUgZXJyb3InIF0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25Gb3JtQ29tcGxldGVDYWxsczogMCxcbiAgICBvbkZvcm1Db21wbGV0ZSgpIHtcbiAgICAgIHRoaXMub25Gb3JtQ29tcGxldGVDYWxscyArPSAxO1xuICAgIH0sXG4gICAgb25DYW5jZWxBcmdzOiBbXSxcbiAgICBvbkNhbmNlbChkYXRhKSB7XG4gICAgICB0aGlzLm9uQ2FuY2VsQXJncy5wdXNoKGRhdGEpO1xuICAgIH0sXG4gICAgcmVzZXQoKSB7XG4gICAgICB0aGlzLm9uU3VibWl0Q2FsbHMgPSAwO1xuICAgICAgdGhpcy5vblN1Ym1pdEFyZ3MgPSBbXTtcbiAgICAgIHRoaXMub25Gb3JtQ29tcGxldGVDYWxscyA9IDA7XG4gICAgICB0aGlzLm9uQ2FuY2VsQXJncyA9IFtdO1xuICAgICAgdGhpcy5vbkFjdGlvbkNhbGxzID0gMDtcbiAgICB9LFxuICAgIG9uQWN0aW9uQ2FsbHM6IDAsXG4gICAgb25BY3Rpb24oZm9ybURhdGEsIHBhdGNoKSB7XG4gICAgICB0aGlzLm9uQWN0aW9uQ2FsbHMgKz0gMTtcbiAgICAgIHJldHVybiB7IGZvcm1EYXRhLCBwYXRjaCB9O1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBNT0NLX1ZBTElEQVRFID0ge1xuICAgIHBhZ2VDYWxsczogMCxcbiAgICBwYWdlKCkge1xuICAgICAgTU9DS19WQUxJREFURS5wYWdlQ2FsbHMgKz0gMTtcbiAgICB9LFxuICAgIHJlc2V0KCkge1xuICAgICAgdGhpcy5wYWdlQ2FsbHMgPSAwO1xuICAgIH1cbiAgfTtcblxuICBsZXQgc2V0UGFnZVBvaW50Q2FsbHMgPSAwO1xuICBsZXQgc2V0UGFnZVBvaW50QXJncyA9IFtdO1xuICBjb25zdCBtb2NrU2V0UGFnZVBvaW50ID0gKHBvaW50KSA9PiB7XG4gICAgc2V0UGFnZVBvaW50Q2FsbHMgKz0gMTtcbiAgICBzZXRQYWdlUG9pbnRBcmdzLnB1c2gocG9pbnQpO1xuICB9O1xuXG4gIGxldCBzZXREYXRhQ2FsbHMgPSAwO1xuICBsZXQgc2V0RGF0YUFyZ3MgPSBbXTtcbiAgY29uc3QgbW9ja1NldERhdGEgPSAoZGF0YSkgPT4ge1xuICAgIHNldERhdGFDYWxscyArPSAxO1xuICAgIHNldERhdGFBcmdzLnB1c2goZGF0YSk7XG4gIH07XG5cbiAgbGV0IG9uUGFnZUNoYW5nZUNhbGxzID0gMDtcbiAgbGV0IG9uUGFnZUNoYW5nZUFyZ3MgPSBbXTtcbiAgY29uc3QgbW9ja09uUGFnZUNoYW5nZSA9IChwYWdlSWQpID0+IHtcbiAgICBvblBhZ2VDaGFuZ2VDYWxscyArPSAxO1xuICAgIG9uUGFnZUNoYW5nZUFyZ3MucHVzaChwYWdlSWQpO1xuICB9O1xuXG4gIGxldCBhZGRFcnJvcnNBcmdzID0gW107XG4gIGNvbnN0IG1vY2tBZGRFcnJvcnMgPSAoZXJyb3JzKSA9PiB7XG4gICAgYWRkRXJyb3JzQXJncy5wdXNoKGVycm9ycyk7XG4gIH07XG5cbiAgbGV0IHNldFN1Ym1pdHRlZEFyZ3MgPSBbXTtcbiAgY29uc3QgbW9ja1NldFN1Ym1pdHRlZCA9IChuZXdTdWJtaXR0ZWQpID0+IHtcbiAgICBzZXRTdWJtaXR0ZWRBcmdzLnB1c2gobmV3U3VibWl0dGVkKTtcbiAgfTtcblxuICBsZXQgbW9ja1N1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgY29uc3QgbW9ja1NldFN1Ym1pdHRpbmcgPSAoc3VibWl0dGluZykgPT4ge1xuICAgIG1vY2tTdWJtaXR0aW5nID0gc3VibWl0dGluZztcbiAgfTtcbiAgXG4gIGNvbnN0IENPTVBPTkVOVFMgPSBbXG4gICAgeyBpZDogJ2FscGhhJywgZmllbGRJZDogJ2FscGhhJyB9LFxuICAgIHsgaWQ6ICdicmF2bycsIGZpZWxkSWQ6ICdicmF2bycgfSxcbiAgICB7IGlkOiAnY2hhcmxpZScsIGZpZWxkSWQ6ICdjaGFybGllJyB9LFxuICAgIHsgaWQ6ICdkZWx0YScsIGZpZWxkSWQ6ICdkZWx0YScgfVxuICBdO1xuXG4gIGNvbnN0IFBBR0VTID0gW1xuICAgIHsgXG4gICAgICBpZDogJ3BhZ2UxJyxcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgeyAuLi5DT01QT05FTlRTWzBdIH0sXG4gICAgICAgIHsgLi4uQ09NUE9ORU5UU1sxXSB9XG4gICAgICBdIFxuICAgIH0sXG4gICAgeyBcbiAgICAgIGlkOiAncGFnZTInLFxuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICB7IC4uLkNPTVBPTkVOVFNbMl0gfSxcbiAgICAgICAgeyAuLi5DT01QT05FTlRTWzNdIH1cbiAgICAgIF0gXG4gICAgfVxuICBdO1xuXG4gIGNvbnN0IENVUlJFTlRfVEFTSyA9IHtcbiAgICBuYW1lOiAndGVzdFRhc2snLFxuICAgIGZ1bGxQYWdlczogUEFHRVMsXG4gIH07XG5cbiAgY29uc3QgQVJHUyA9IHtcbiAgICBhY3Rpb246IHsgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5OQVZJR0FURSB9LFxuICAgIHBhdGNoOiBudWxsLCBcbiAgICBwYXRjaExhYmVsOiB7fSxcbiAgICBob29rczogTU9DS19IT09LUywgXG4gICAgZGF0YToge30sXG4gICAgZm9ybVN0YXRlOiB7XG4gICAgICBwYWdlOiB7XG4gICAgICAgIGZvcm1EYXRhOiB7fVxuICAgICAgfVxuICAgIH0sXG4gICAgdmFsaWRhdGU6IE1PQ0tfVkFMSURBVEUsIFxuICAgIG9uUGFnZUNoYW5nZTogbW9ja09uUGFnZUNoYW5nZSwgXG4gICAgdHlwZTogRm9ybVR5cGVzLkZPUk1fV0lUSF9UQVNLLCBcbiAgICBjbGVhbnNlSGlkZGVuRGF0YTogdHJ1ZSxcbiAgICBwYWdlczogUEFHRVMsIFxuICAgIGNvbXBvbmVudHM6IENPTVBPTkVOVFMsIFxuICAgIHBhZ2VJZDogJ2FscGhhJywgXG4gICAgc2V0UGFnZVBvaW50OiBtb2NrU2V0UGFnZVBvaW50LFxuICAgIGN1cnJlbnRUYXNrOiBDVVJSRU5UX1RBU0ssIFxuICAgIHNldERhdGE6IG1vY2tTZXREYXRhLCBcbiAgICBodWJEZXRhaWxzOiB7fSxcbiAgICBzZXRTdWJtaXR0ZWQ6IG1vY2tTZXRTdWJtaXR0ZWQsXG4gICAgYWRkRXJyb3JzOiBtb2NrQWRkRXJyb3JzLFxuICAgIHN1Ym1pdHRpbmc6IG1vY2tTdWJtaXR0aW5nLFxuICAgIHNldFN1Ym1pdHRpbmc6IG1vY2tTZXRTdWJtaXR0aW5nXG4gIH07XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgaGFuZGxlcnMucmVzZXQoKTtcbiAgICBoZWxwZXJzLnJlc2V0KCk7XG4gICAgVXRpbHMucmVzZXQoKTtcbiAgICBNT0NLX0hPT0tTLnJlc2V0KCk7XG4gICAgTU9DS19WQUxJREFURS5yZXNldCgpO1xuICAgIHNldFBhZ2VQb2ludENhbGxzID0gMDtcbiAgICBzZXRQYWdlUG9pbnRBcmdzID0gW107XG4gICAgc2V0RGF0YUNhbGxzID0gMDtcbiAgICBzZXREYXRhQXJncyA9IFtdO1xuICAgIG9uUGFnZUNoYW5nZUNhbGxzID0gMDtcbiAgICBvblBhZ2VDaGFuZ2VBcmdzID0gW107XG4gICAgYWRkRXJyb3JzQXJncyA9IFtdO1xuICAgIHNldFN1Ym1pdHRlZEFyZ3MgPSBbXTtcbiAgICBtb2NrU2V0U3VibWl0dGluZyhmYWxzZSk7XG4gIH0pO1xuXG4gIGNvbnN0IHByZUFjdGlvbkNoZWNrcyA9ICgpID0+IHtcbiAgICBleHBlY3QoaGVscGVycy5jYW5BY3Rpb25Qcm9jZWVkQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KE1PQ0tfVkFMSURBVEUucGFnZUNhbGxzKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChoZWxwZXJzLmNsZWFuSGlkZGVuTmVzdGVkRGF0YUNhbGxzKS50b0VxdWFsKDEpO1xuICB9O1xuXG4gIGNvbnN0IHBvc3RBY3Rpb25DaGVja3MgPSAoYXJnc1VzZWQpID0+IHtcbiAgICBleHBlY3QoVXRpbHMuRm9ybWF0LmZvcm1DYWxscykudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoaGVscGVycy5nZXRTdWJtaXNzaW9uU3RhdHVzQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgLy8gc2V0RGF0YSBpcyBhbHdheXMgY2FsbGVkIG9uY2UgaW4gdGhlIGVycm9yIGNhbGxiYWNrIFxuICAgIC8vIGZvciB0aGUgb25TdWJtaXQgaG9vay4gSXQncyBjYWxsZWQgYW4gZXh0cmEgdGltZSBwcmlvclxuICAgIC8vIHRvIHRoaXMgaWYgcGF0Y2ggaXMgdmFsaWQuXG4gICAgaWYgKGFyZ3NVc2VkLnBhdGNoKSB7XG4gICAgICBleHBlY3Qoc2V0RGF0YUNhbGxzKS50b0VxdWFsKDIpO1xuICAgICAgY29uc3QgZGF0YVVzZWQgPSB7IFxuICAgICAgICAuLi5hcmdzVXNlZC5kYXRhLCBcbiAgICAgICAgLi4uYXJnc1VzZWQucGF0Y2gsIFxuICAgICAgICAuLi5hcmdzVXNlZC5mb3JtU3RhdGUucGFnZS5mb3JtRGF0YVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN1Ym1pc3Npb25EYXRhID0gVXRpbHMuRm9ybWF0LmZvcm0obnVsbCwgZGF0YVVzZWQsIG51bGwpXG4gICAgICBzdWJtaXNzaW9uRGF0YS5mb3JtU3RhdHVzID0gaGVscGVycy5nZXRTdWJtaXNzaW9uU3RhdHVzKCk7XG4gICAgICBleHBlY3Qoc2V0RGF0YUFyZ3NbMF0pLnRvRXF1YWwoc3VibWlzc2lvbkRhdGEpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGV4cGVjdChzZXREYXRhQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgfVxuICAgIGV4cGVjdChNT0NLX0hPT0tTLm9uU3VibWl0Q2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgaWYgKGFyZ3NVc2VkLnR5cGUgPT09IEZvcm1UeXBlcy5IVUIgJiYgT2JqZWN0LmtleXMoYXJnc1VzZWQucGF0Y2hMYWJlbCkubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlyc3RLZXkgPSBPYmplY3Qua2V5cyhhcmdzVXNlZC5wYXRjaExhYmVsKVswXTtcbiAgICAgIGV4cGVjdChNT0NLX0hPT0tTLm9uU3VibWl0QXJnc1swXSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIGNoYW5nZWRGaWVsZE5hbWU6IGZpcnN0S2V5LFxuICAgICAgICBjaGFuZ2VkRmllbGRWYWx1ZTogYXJnc1VzZWQucGF0Y2hMYWJlbFtmaXJzdEtleV1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBleHBlY3QoTU9DS19IT09LUy5vbkFjdGlvbkNhbGxzKS50b0VxdWFsKDEpO1xuXG4gICAgLy8gQm90aCB0aGUgc3VjY2VzcyBhbmQgZXJyb3IgcGF0aHMgb2YgdGhlIG9uU3VibWl0IGhvb2sgYXJlIHRlc3RlZFxuICAgIC8vIHRvZ2V0aGVyIHRvIG1ha2Ugc3VyZSB0aGUgY29ycmVjdCBmdW5jdGlvbiBjaGFpbnMgYXJlIGNhbGxlZCBmb3JcbiAgICAvLyBlYWNoLlxuXG4gICAgLy8gVGhlIHN1Y2Nlc3MgcGF0aCBpcyB0ZXN0ZWQgcGVyLWFjdGlvbiBhcyBpdCBjYW4gZGlmZmVyIHNsaWdodGx5LlxuXG4gICAgLy8gVGVzdGluZyB0aGUgZXJyb3IgcGF0aC5cbiAgICBleHBlY3QoaGFuZGxlcnMuc3VibWlzc2lvbkVycm9yQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KHNldERhdGFBcmdzW3NldERhdGFDYWxscyAtIDFdKS50b0VxdWFsKGFyZ3NVc2VkLmRhdGEpOyAvLyBEYXRhIGlzIHJlc2V0IGluIHRoZSBjYXNlIG9mIGFuIGVycm9yLlxuICB9O1xuXG4gIGl0KGBzaG91bGQgaGFuZGxlIHRoZSAke1BhZ2VBY3Rpb24uVFlQRVMuQ0FOQ0VMfSBQYWdlIEFjdGlvbiB0eXBlYCwgKCkgPT4ge1xuICAgIGNvbnN0IEFDVElPTiA9IHsgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5DQU5DRUwgfTtcbiAgICBjb25zdCBDVVNUT01fQVJHUyA9IHsgLi4uQVJHUywgYWN0aW9uOiBBQ1RJT04gfTtcbiAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuICAgIGV4cGVjdChNT0NLX0hPT0tTLm9uQ2FuY2VsQXJncy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgZXhwZWN0KE1PQ0tfSE9PS1Mub25DYW5jZWxBcmdzWzBdKS50b01hdGNoT2JqZWN0KHt9KTtcbiAgICAvLyBTaG91bGRuJ3QgZ2V0IHRvIHRoZSBwb2ludCBvZiB2YWxpZGF0aW9uIGlmXG4gICAgLy8gYWN0aW9uIGlzIGEgY2FuY2VsIGFjdGlvbi5cbiAgICBleHBlY3QoaGVscGVycy5jYW5BY3Rpb25Qcm9jZWVkQ2FsbHMpLnRvRXF1YWwoMCk7XG4gICAgZXhwZWN0KE1PQ0tfVkFMSURBVEUucGFnZUNhbGxzKS50b0VxdWFsKDApO1xuICB9KTtcblxuICBpdChgc2hvdWxkIGhhbmRsZSB0aGUgJHtQYWdlQWN0aW9uLlRZUEVTLk5BVklHQVRFfSBQYWdlIEFjdGlvbiB0eXBlYCwgKCkgPT4ge1xuICAgIGNvbnN0IEFDVElPTiA9IHsgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5OQVZJR0FURSB9O1xuICAgIGNvbnN0IENVU1RPTV9BUkdTID0geyAuLi5BUkdTLCBhY3Rpb246IEFDVElPTiB9O1xuICAgIG9uUGFnZUFjdGlvbiguLi5PYmplY3QudmFsdWVzKENVU1RPTV9BUkdTKSk7XG5cbiAgICBwcmVBY3Rpb25DaGVja3MoKTtcbiAgICBleHBlY3QoaGFuZGxlcnMubmF2aWdhdGVDYWxscykudG9FcXVhbCgxKTtcbiAgICBleHBlY3QoTU9DS19IT09LUy5vblN1Ym1pdENhbGxzKS50b0VxdWFsKDApO1xuICAgIC8vIE5vdCBkb2luZyB0aGUgdXN1YWwgcG9zdC1hY3Rpb24gY2hlY2tzIGhlcmVcbiAgICAvLyBhcyBhIG5hdmlnYXRlIGFjdGlvbiBzaG91bGQgc3RvcCBhdCBjYWxsaW5nXG4gICAgLy8gaG9va3MubmF2aWdhdGUuXG4gIH0pO1xuXG4gIGl0KGBzaG91bGQgaGFuZGxlIHRoZSAke1BhZ2VBY3Rpb24uVFlQRVMuU1VCTUlUfSBQYWdlIEFjdGlvbiB0eXBlYCwgKCkgPT4ge1xuICAgIGNvbnN0IEFDVElPTiA9IHsgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5TVUJNSVQgfTtcbiAgICBjb25zdCBDVVNUT01fQVJHUyA9IHsgLi4uQVJHUywgYWN0aW9uOiBBQ1RJT04gfTtcbiAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuXG4gICAgcHJlQWN0aW9uQ2hlY2tzKCk7XG4gICAgZXhwZWN0KHNldFBhZ2VQb2ludENhbGxzKS50b0VxdWFsKDEpO1xuICAgIGV4cGVjdChzZXRQYWdlUG9pbnRBcmdzWzBdKS50b0VxdWFsKCdzdWJtaXQnKTtcbiAgICBwb3N0QWN0aW9uQ2hlY2tzKENVU1RPTV9BUkdTKTtcbiAgfSk7XG5cbiAgaXQoYHNob3VsZCBoYW5kbGUgdGhlICR7UGFnZUFjdGlvbi5UWVBFUy5TQVZFX0FORF9OQVZJR0FURX0gUGFnZSBBY3Rpb24gdHlwZWAsICgpID0+IHtcbiAgICBjb25zdCBBQ1RJT04gPSB7IHR5cGU6IFBhZ2VBY3Rpb24uVFlQRVMuU0FWRV9BTkRfTkFWSUdBVEUgfTtcbiAgICBjb25zdCBDVVNUT01fQVJHUyA9IHsgLi4uQVJHUywgYWN0aW9uOiBBQ1RJT04gfTtcbiAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuXG4gICAgcHJlQWN0aW9uQ2hlY2tzKCk7XG4gICAgLy8gQWxsIHRoZSBhY3Rpb25zIGRvZXMgaW4gdGhpcyBjYXNlIGlzIHNldCBhIGZ1bmN0aW9uXG4gICAgLy8gdG8gYmUgY2FsbGVkIGluIHRoZSBvblN1Y2Nlc3MgY2FsbGJhY2sgZm9yIHRoZSBvblN1Ym1pdCBob29rLlxuICAgIHBvc3RBY3Rpb25DaGVja3MoQ1VTVE9NX0FSR1MpO1xuXG4gICAgZXhwZWN0KGhhbmRsZXJzLm5hdmlnYXRlQ2FsbHMpLnRvRXF1YWwoMSk7XG4gIH0pO1xuXG4gIGl0KGBzaG91bGQgaGFuZGxlIHRoZSAke1BhZ2VBY3Rpb24uVFlQRVMuQ09MTEVDVElPTl9BRER9IFBhZ2UgQWN0aW9uIHR5cGVgLCAoKSA9PiB7XG4gICAgY29uc3QgRk9STV9TVEFURSA9IHtcbiAgICAgIHBhZ2U6e1xuICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICd0ZXN0Q29sbGVjdGlvbic6IFtdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IEFDVElPTiA9IHsgXG4gICAgICB0eXBlOiBQYWdlQWN0aW9uLlRZUEVTLkNPTExFQ1RJT05fQURELFxuICAgICAgY29sbGVjdGlvbjogJ3Rlc3RDb2xsZWN0aW9uJ1xuICAgIH07XG4gICAgY29uc3QgQ1VTVE9NX0FSR1MgPSB7IC4uLkFSR1MsIGFjdGlvbjogQUNUSU9OLCBmb3JtU3RhdGU6IEZPUk1fU1RBVEUgfTtcbiAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuXG4gICAgcHJlQWN0aW9uQ2hlY2tzKCk7XG4gICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YVtgJHtBQ1RJT04uY29sbGVjdGlvbn1BY3RpdmVJZGBdKS50b0JlRGVmaW5lZCgpO1xuICAgIHBvc3RBY3Rpb25DaGVja3MoQ1VTVE9NX0FSR1MpO1xuXG4gICAgLy8gVGhpcyBhY3Rpb24gdHlwZSBhbHNvIHNldHMgdXAgYSBjYWxsIHRvIGhhbmRsZXJzLm5hdmlnYXRlXG4gICAgLy8gdGhhdCdzIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBvblN1Ym1pdCBob29rJ3Mgb25TdWNjZXNzIGNhbGxiYWNrLlxuICAgIGV4cGVjdChoYW5kbGVycy5uYXZpZ2F0ZUNhbGxzKS50b0VxdWFsKDEpO1xuICB9KTtcblxuICBpdChgc2hvdWxkIGhhbmRsZSB0aGUgJHtQYWdlQWN0aW9uLlRZUEVTLkNPTExFQ1RJT05fQUREfSBQYWdlIEFjdGlvbiB0eXBlIHdoZXJlIGFjdGl2ZSBJRCBpcyBub3QgdGhlIGxhc3QgZW50cnkgaW4gY29sbGVjdGlvbmAsICgpID0+IHtcbiAgICAvLyBJZiB0aGUgYWN0aXZlIElEIGlzIG5vdCB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgY29sbGVjdGlvblxuICAgIC8vIHRoZW4gYSBuZXcgZW50cnkgaXMgbm90IGFkZGVkXG4gICAgLy8gYW5kIHRoZSBhY3RpdmUgSUQgbW92ZXMgdG8gdGhlIG5leHQgZW50cnkgSUQuXG4gICAgY29uc3QgRk9STV9TVEFURSA9IHtcbiAgICAgIHBhZ2U6e1xuICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICd0ZXN0Q29sbGVjdGlvbic6IFt7aWQ6ICcxJ30sIHtpZDogJzInfV0sIHRlc3RDb2xsZWN0aW9uQWN0aXZlSWQ6ICcxJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBBQ1RJT04gPSB7IFxuICAgICAgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5DT0xMRUNUSU9OX0FERCxcbiAgICAgIGNvbGxlY3Rpb246ICd0ZXN0Q29sbGVjdGlvbidcbiAgICB9O1xuICAgIGNvbnN0IENVU1RPTV9BUkdTID0geyAuLi5BUkdTLCBhY3Rpb246IEFDVElPTiwgZm9ybVN0YXRlOiBGT1JNX1NUQVRFIH07XG4gICAgb25QYWdlQWN0aW9uKC4uLk9iamVjdC52YWx1ZXMoQ1VTVE9NX0FSR1MpKTtcblxuICAgIHByZUFjdGlvbkNoZWNrcygpO1xuICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGFbYCR7QUNUSU9OLmNvbGxlY3Rpb259QWN0aXZlSWRgXSkudG9FcXVhbCgnMicpO1xuICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGFbQUNUSU9OLmNvbGxlY3Rpb25dLmxlbmd0aCkudG9FcXVhbCgyKTtcbiAgICBwb3N0QWN0aW9uQ2hlY2tzKENVU1RPTV9BUkdTKTtcblxuICAgIC8vIFRoaXMgYWN0aW9uIHR5cGUgYWxzbyBzZXRzIHVwIGEgY2FsbCB0byBoYW5kbGVycy5uYXZpZ2F0ZVxuICAgIC8vIHRoYXQncyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgb25TdWJtaXQgaG9vaydzIG9uU3VjY2VzcyBjYWxsYmFjay5cbiAgICBleHBlY3QoaGFuZGxlcnMubmF2aWdhdGVDYWxscykudG9FcXVhbCgxKTtcbiAgfSk7XG5cbiAgaXQoYHNob3VsZCBoYW5kbGUgdGhlICR7UGFnZUFjdGlvbi5UWVBFUy5DT0xMRUNUSU9OX0FERH0gUGFnZSBBY3Rpb24gdHlwZSB3aGVyZSBhY3RpdmUgSUQgaXMgdGhlIGxhc3QgZW50cnkgaW4gY29sbGVjdGlvbmAsICgpID0+IHtcbiAgICAvLyBJZiB0aGUgYWN0aXZlIElEIGlzIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBjb2xsZWN0aW9uXG4gICAgLy8gdGhlbiBhIG5ldyBlbnRyeSBpcyBhZGRlZCAoYWx0aG91Z2ggbm90IHBpY2tlZCB1cCBpbiB0aGlzIHRlc3QpXG4gICAgLy8gYW5kIHRoZSBhY3RpdmUgSUQgYmVjb21lcyBudWxsLlxuICAgIGNvbnN0IEZPUk1fU1RBVEUgPSB7XG4gICAgICBwYWdlOntcbiAgICAgICAgZm9ybURhdGE6IHtcbiAgICAgICAgICAndGVzdENvbGxlY3Rpb24nOiBbe2lkOiAnMSd9LCB7aWQ6ICcyJ31dLCB0ZXN0Q29sbGVjdGlvbkFjdGl2ZUlkOiAnMidcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgQUNUSU9OID0geyBcbiAgICAgIHR5cGU6IFBhZ2VBY3Rpb24uVFlQRVMuQ09MTEVDVElPTl9BREQsXG4gICAgICBjb2xsZWN0aW9uOiAndGVzdENvbGxlY3Rpb24nXG4gICAgfTtcbiAgICBjb25zdCBDVVNUT01fQVJHUyA9IHsgLi4uQVJHUywgYWN0aW9uOiBBQ1RJT04sIGZvcm1TdGF0ZTogRk9STV9TVEFURSB9O1xuICAgIG9uUGFnZUFjdGlvbiguLi5PYmplY3QudmFsdWVzKENVU1RPTV9BUkdTKSk7XG5cbiAgICBwcmVBY3Rpb25DaGVja3MoKTtcbiAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhW2Ake0FDVElPTi5jb2xsZWN0aW9ufUFjdGl2ZUlkYF0pLnRvRXF1YWwobnVsbCk7XG4gICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YVtBQ1RJT04uY29sbGVjdGlvbl0ubGVuZ3RoKS50b0VxdWFsKDIpO1xuICAgIHBvc3RBY3Rpb25DaGVja3MoQ1VTVE9NX0FSR1MpO1xuXG4gICAgLy8gVGhpcyBhY3Rpb24gdHlwZSBhbHNvIHNldHMgdXAgYSBjYWxsIHRvIGhhbmRsZXJzLm5hdmlnYXRlXG4gICAgLy8gdGhhdCdzIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBvblN1Ym1pdCBob29rJ3Mgb25TdWNjZXNzIGNhbGxiYWNrLlxuICAgIGV4cGVjdChoYW5kbGVycy5uYXZpZ2F0ZUNhbGxzKS50b0VxdWFsKDEpO1xuICB9KTtcblxuICBpdChgc2hvdWxkIGNsZWFuIHByZXZpb3VzIGNvbGxlY3Rpb24gZW50cnkgZmllbGRzIGF0IHRvcCBsZXZlbCBvZiBmb3JtRGF0YWAsICgpID0+IHtcbiAgICBjb25zdCBGT1JNX1NUQVRFID0ge1xuICAgICAgcGFnZToge1xuICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICd0ZXN0Q29sbGVjdGlvbic6IFt7ICdmbGlnaHROdW1iZXInOiAnMScgfV0sXG4gICAgICAgICAgJ2ZsaWdodE51bWJlcic6ICcxJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBBQ1RJT04gPSB7XG4gICAgICB0eXBlOiBQYWdlQWN0aW9uLlRZUEVTLkNPTExFQ1RJT05fQURELFxuICAgICAgY29sbGVjdGlvbjogJ3Rlc3RDb2xsZWN0aW9uJ1xuICAgIH07XG4gICAgY29uc3QgQ1VTVE9NX0FSR1MgPSB7IC4uLkFSR1MsIGFjdGlvbjogQUNUSU9OLCBmb3JtU3RhdGU6IEZPUk1fU1RBVEUgfTtcbiAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuXG4gICAgcHJlQWN0aW9uQ2hlY2tzKCk7XG4gICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YVtgJHtBQ1RJT04uY29sbGVjdGlvbn1BY3RpdmVJZGBdKS50b0JlRGVmaW5lZCgpO1xuICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGEuZmxpZ2h0TnVtYmVyKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgcG9zdEFjdGlvbkNoZWNrcyhDVVNUT01fQVJHUyk7XG5cbiAgICAvLyBUaGlzIGFjdGlvbiB0eXBlIGFsc28gc2V0cyB1cCBhIGNhbGwgdG8gaGFuZGxlcnMubmF2aWdhdGVcbiAgICAvLyB0aGF0J3MgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIG9uU3VibWl0IGhvb2sncyBvblN1Y2Nlc3MgY2FsbGJhY2suXG4gICAgZXhwZWN0KGhhbmRsZXJzLm5hdmlnYXRlQ2FsbHMpLnRvRXF1YWwoMSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKGBzaG91bGQgaGFuZGxlIHRoZSAke1BhZ2VBY3Rpb24uVFlQRVMuQ09MTEVDVElPTl9EVVBMSUNBVEV9IFBhZ2UgQWN0aW9uIHR5cGVgLCAoKSA9PiB7XG4gICAgaXQoYGNhbGxpbmcgaGFuZGxlcnMubmF2aWdhdGUgaWYgdGhlIGR1cGxpY2F0aW9uIHdhcyBzdWNjZXNzZnVsYCwgKCkgPT4ge1xuICAgICAgY29uc3QgRk9STV9TVEFURSA9IHtcbiAgICAgICAgcGFnZTp7XG4gICAgICAgICAgZm9ybURhdGE6IHtcbiAgICAgICAgICAgICd0ZXN0Q29sbGVjdGlvbic6IFtdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgQUNUSU9OID0geyBcbiAgICAgICAgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5DT0xMRUNUSU9OX0RVUExJQ0FURSxcbiAgICAgICAgY29sbGVjdGlvbjogJ3Rlc3RDb2xsZWN0aW9uJ1xuICAgICAgfTtcbiAgICAgIGNvbnN0IENVU1RPTV9BUkdTID0geyAuLi5BUkdTLCBhY3Rpb246IEFDVElPTiwgZm9ybVN0YXRlOiBGT1JNX1NUQVRFIH07XG4gICAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuICBcbiAgICAgIHByZUFjdGlvbkNoZWNrcygpO1xuICAgICAgZXhwZWN0KFV0aWxzLkNvbGxlY3Rpb25QYWdlLmR1cGxpY2F0ZUFjdGl2ZUVudHJ5Q2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgICBwb3N0QWN0aW9uQ2hlY2tzKENVU1RPTV9BUkdTKTtcbiAgXG4gICAgICAvLyBUaGlzIGFjdGlvbiB0eXBlIGFsc28gc2V0cyB1cCBhIGNhbGwgdG8gaGFuZGxlcnMubmF2aWdhdGVcbiAgICAgIC8vIHRoYXQncyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgb25TdWJtaXQgaG9vaydzIG9uU3VjY2VzcyBjYWxsYmFjay5cbiAgICAgIGV4cGVjdChoYW5kbGVycy5uYXZpZ2F0ZUNhbGxzKS50b0VxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoYGNhbGxpbmcgb25QYWdlQ2hhbmdlIGlmIHRoZSBkdXBsaWNhdGlvbiB3YXMgdW5zdWNjZXNzZnVsYCwgKCkgPT4ge1xuICAgICAgY29uc3QgRk9STV9TVEFURSA9IHtcbiAgICAgICAgcGFnZTp7XG4gICAgICAgICAgZm9ybURhdGE6IHtcbiAgICAgICAgICAgICd0ZXN0Q29sbGVjdGlvbic6IFtdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgQUNUSU9OID0geyBcbiAgICAgICAgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5DT0xMRUNUSU9OX0RVUExJQ0FURSxcbiAgICAgICAgY29sbGVjdGlvbjogJ3Rlc3RDb2xsZWN0aW9uJ1xuICAgICAgfTtcbiAgICAgIGNvbnN0IENVU1RPTV9BUkdTID0geyAuLi5BUkdTLCBhY3Rpb246IEFDVElPTiwgZm9ybVN0YXRlOiBGT1JNX1NUQVRFIH07XG4gICAgICBVdGlscy5Db2xsZWN0aW9uUGFnZS5kdXBsaWNhdGVBY3RpdmVFbnRyeVJlc3VsdCA9IGZhbHNlO1xuICAgICAgb25QYWdlQWN0aW9uKC4uLk9iamVjdC52YWx1ZXMoQ1VTVE9NX0FSR1MpKTtcbiAgXG4gICAgICBwcmVBY3Rpb25DaGVja3MoKTtcbiAgICAgIGV4cGVjdChVdGlscy5Db2xsZWN0aW9uUGFnZS5kdXBsaWNhdGVBY3RpdmVFbnRyeUNhbGxzKS50b0VxdWFsKDEpO1xuICAgICAgcG9zdEFjdGlvbkNoZWNrcyhDVVNUT01fQVJHUyk7XG4gIFxuICAgICAgLy8gVGhlIGhhbmRsZXJzLm5hdmlnYXRlIGNhbGxiYWNrIHNob3VsZG4ndCBiZSBzZXQgd2hlblxuICAgICAgLy8gZHVwbGljYXRpb24gZmFpbHMuXG4gICAgICBleHBlY3QoaGFuZGxlcnMubmF2aWdhdGVDYWxscykudG9FcXVhbCgwKTtcbiAgICAgIC8vIEluc3RlYWQgd2Ugc2hvdWxkIGJlIHVzaW5nIHRoZSBkZWZhdWx0IG9uUGFnZUNoYW5nZSBzZXR1cC5cbiAgICAgIGV4cGVjdChvblBhZ2VDaGFuZ2VDYWxscykudG9FcXVhbCgxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoYHNob3VsZCBoYW5kbGUgdGhlICR7UGFnZUFjdGlvbi5UWVBFUy5DT0xMRUNUSU9OX1JFTU9WRX0gUGFnZSBBY3Rpb24gdHlwZWAsICgpID0+IHtcbiAgICBpdChgc2hvdWxkIHN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZSByZW1vdmVkIGl0ZW0gaWYgYWN0aW9uLnJlY29yZFJlbW92YWwgaXMgdHJ1ZWAsICgpID0+IHtcbiAgICAgIGNvbnN0IEZPUk1fU1RBVEUgPSB7XG4gICAgICAgIHBhZ2U6e1xuICAgICAgICAgIGZvcm1EYXRhOiB7XG4gICAgICAgICAgICB0ZXN0Q29sbGVjdGlvbkFjdGl2ZUlkOiAncmVtb3ZlTWUnLFxuICAgICAgICAgICAgdGVzdENvbGxlY3Rpb246IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkOiAncmVtb3ZlTWUnXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogJ2xlYXZlTWVBbG9uZSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IEFDVElPTiA9IHsgXG4gICAgICAgIHR5cGU6IFBhZ2VBY3Rpb24uVFlQRVMuQ09MTEVDVElPTl9SRU1PVkUsXG4gICAgICAgIGNvbGxlY3Rpb246ICd0ZXN0Q29sbGVjdGlvbicsXG4gICAgICAgIHJlY29yZFJlbW92YWw6IHRydWVcbiAgICAgIH07XG4gICAgICBjb25zdCBDVVNUT01fQVJHUyA9IHsgLi4uQVJHUywgYWN0aW9uOiBBQ1RJT04sIGZvcm1TdGF0ZTogRk9STV9TVEFURSB9O1xuICAgICAgb25QYWdlQWN0aW9uKC4uLk9iamVjdC52YWx1ZXMoQ1VTVE9NX0FSR1MpKTtcbiAgXG4gICAgICBwcmVBY3Rpb25DaGVja3MoKTtcbiAgICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGEudGVzdENvbGxlY3Rpb24pLnRvRXF1YWwoWyB7IGlkOiAnbGVhdmVNZUFsb25lJyB9IF0pO1xuICAgICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YS50ZXN0Q29sbGVjdGlvbkxhc3RSZW1vdmVkKS50b0VxdWFsKHtpZDogJ3JlbW92ZU1lJyB9KTtcbiAgICAgIHBvc3RBY3Rpb25DaGVja3MoQ1VTVE9NX0FSR1MpO1xuICBcbiAgICAgIC8vIFRoaXMgYWN0aW9uIHR5cGUgdXNlcyBoYW5kbGVycyBuYXZpZ2F0ZSBjYWxsYmFjayBcbiAgICAgIGV4cGVjdChoYW5kbGVycy5uYXZpZ2F0ZUNhbGxzKS50b0VxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoYHNob3VsZCBub3Qgc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIHJlbW92ZWQgaXRlbSBpZiBhY3Rpb24ucmVjb3JkUmVtb3ZhbCBpcyBmYWxzZWAsICgpID0+IHtcbiAgICAgIGNvbnN0IEZPUk1fU1RBVEUgPSB7XG4gICAgICAgIHBhZ2U6e1xuICAgICAgICAgIGZvcm1EYXRhOiB7XG4gICAgICAgICAgICB0ZXN0Q29sbGVjdGlvbkFjdGl2ZUlkOiAncmVtb3ZlTWUnLFxuICAgICAgICAgICAgdGVzdENvbGxlY3Rpb246IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkOiAncmVtb3ZlTWUnXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogJ2xlYXZlTWVBbG9uZSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IEFDVElPTiA9IHsgXG4gICAgICAgIHR5cGU6IFBhZ2VBY3Rpb24uVFlQRVMuQ09MTEVDVElPTl9SRU1PVkUsXG4gICAgICAgIGNvbGxlY3Rpb246ICd0ZXN0Q29sbGVjdGlvbicsXG4gICAgICAgIHJlY29yZFJlbW92YWw6IGZhbHNlXG4gICAgICB9O1xuICAgICAgY29uc3QgQ1VTVE9NX0FSR1MgPSB7IC4uLkFSR1MsIGFjdGlvbjogQUNUSU9OLCBmb3JtU3RhdGU6IEZPUk1fU1RBVEUgfTtcbiAgICAgIG9uUGFnZUFjdGlvbiguLi5PYmplY3QudmFsdWVzKENVU1RPTV9BUkdTKSk7XG4gIFxuICAgICAgcHJlQWN0aW9uQ2hlY2tzKCk7XG4gICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhLnRlc3RDb2xsZWN0aW9uKS50b0VxdWFsKFsgeyBpZDogJ2xlYXZlTWVBbG9uZScgfV0pO1xuICAgICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YS50ZXN0Q29sbGVjdGlvbkxhc3RSZW1vdmVkKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICBwb3N0QWN0aW9uQ2hlY2tzKENVU1RPTV9BUkdTKTtcbiAgXG4gICAgICAvLyBUaGlzIGFjdGlvbiB0eXBlIHVzZXMgaGFuZGxlcnMgbmF2aWdhdGUgY2FsbGJhY2sgXG4gICAgICBleHBlY3QoaGFuZGxlcnMubmF2aWdhdGVDYWxscykudG9FcXVhbCgxKTtcbiAgICB9KTtcblxuICAgIGl0KGBzaG91bGQgbm90IHN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZSByZW1vdmVkIGl0ZW0gaWYgYWN0aW9uLnJlY29yZFJlbW92YWwgaXMgbm90IGRlZmluZWRgLCAoKSA9PiB7XG4gICAgICBjb25zdCBGT1JNX1NUQVRFID0ge1xuICAgICAgICBwYWdlOntcbiAgICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICAgdGVzdENvbGxlY3Rpb25BY3RpdmVJZDogJ3JlbW92ZU1lJyxcbiAgICAgICAgICAgIHRlc3RDb2xsZWN0aW9uOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogJ3JlbW92ZU1lJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6ICdsZWF2ZU1lQWxvbmUnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBBQ1RJT04gPSB7IFxuICAgICAgICB0eXBlOiBQYWdlQWN0aW9uLlRZUEVTLkNPTExFQ1RJT05fUkVNT1ZFLFxuICAgICAgICBjb2xsZWN0aW9uOiAndGVzdENvbGxlY3Rpb24nLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IENVU1RPTV9BUkdTID0geyAuLi5BUkdTLCBhY3Rpb246IEFDVElPTiwgZm9ybVN0YXRlOiBGT1JNX1NUQVRFIH07XG4gICAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuICBcbiAgICAgIHByZUFjdGlvbkNoZWNrcygpO1xuICAgICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YS50ZXN0Q29sbGVjdGlvbikudG9FcXVhbChbIHsgaWQ6ICdsZWF2ZU1lQWxvbmUnIH1dKTtcbiAgICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGEudGVzdENvbGxlY3Rpb25MYXN0UmVtb3ZlZCkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgcG9zdEFjdGlvbkNoZWNrcyhDVVNUT01fQVJHUyk7XG4gIFxuICAgICAgLy8gVGhpcyBhY3Rpb24gdHlwZSB1c2VzIGhhbmRsZXJzIG5hdmlnYXRlIGNhbGxiYWNrIFxuICAgICAgZXhwZWN0KGhhbmRsZXJzLm5hdmlnYXRlQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdChgc2hvdWxkIGNsZWFuIGNvbGxlY3Rpb24gZmllbGRzIGF0IHRvcCBsZXZlbCBvZiBmb3JtRGF0YSB3aGVuIGVudHJpZXMgcmVtYWluYCwgKCkgPT4ge1xuICAgICAgLy8gQWZ0ZXIgcmVtb3ZpbmcgdGhlIGFjdGl2ZSBlbnRyeSwgdGhlIGNvbGxlY3Rpb24gZGF0YSBpcyBhc3NpZ25lZCB0byB0aGVcbiAgICAgIC8vIHRvcCBsZXZlbCBvZiBmb3JtRGF0YSBhbmQgdGhlIGFjdGl2ZUlkIGlzIHJlc2V0LlxuICAgICAgY29uc3QgRk9STV9TVEFURSA9IHtcbiAgICAgICAgcGFnZTp7XG4gICAgICAgICAgZm9ybURhdGE6IHtcbiAgICAgICAgICAgIHRlc3RDb2xsZWN0aW9uQWN0aXZlSWQ6ICdyZW1vdmVNZScsXG4gICAgICAgICAgICB0ZXN0Q29sbGVjdGlvbjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6ICdsZWF2ZU1lQWxvbmUnLCBmbGlnaHROdW1iZXI6ICcxJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6ICdyZW1vdmVNZScsIGZsaWdodE51bWJlcjogJzInXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBmbGlnaHROdW1iZXI6ICcyJyxcbiAgICAgICAgICAgIHRlc3RDb2xsZWN0aW9uTGFzdFJlbW92ZWQ6ICdwcmV2aW91c09uZSdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBBQ1RJT04gPSB7IFxuICAgICAgICB0eXBlOiBQYWdlQWN0aW9uLlRZUEVTLkNPTExFQ1RJT05fUkVNT1ZFLFxuICAgICAgICBjb2xsZWN0aW9uOiAndGVzdENvbGxlY3Rpb24nLFxuICAgICAgICByZWNvcmRSZW1vdmFsOiB0cnVlXG4gICAgICB9O1xuICAgICAgY29uc3QgQ1VTVE9NX0FSR1MgPSB7IC4uLkFSR1MsIGFjdGlvbjogQUNUSU9OLCBmb3JtU3RhdGU6IEZPUk1fU1RBVEUgfTtcbiAgICAgIG9uUGFnZUFjdGlvbiguLi5PYmplY3QudmFsdWVzKENVU1RPTV9BUkdTKSk7XG4gIFxuICAgICAgcHJlQWN0aW9uQ2hlY2tzKCk7XG4gICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhLnRlc3RDb2xsZWN0aW9uKS50b0VxdWFsKFsgeyBpZDogJ2xlYXZlTWVBbG9uZScsIGZsaWdodE51bWJlcjogJzEnIH0gXSk7XG4gICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhLnRlc3RDb2xsZWN0aW9uTGFzdFJlbW92ZWQpLnRvRXF1YWwoe2lkOiAncmVtb3ZlTWUnLCBmbGlnaHROdW1iZXI6ICcyJyB9KTtcbiAgICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGEuZmxpZ2h0TnVtYmVyKS50b0VxdWFsKCcxJyk7XG4gICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhLnRlc3RDb2xsZWN0aW9uQWN0aXZlSWQpLnRvRXF1YWwoJ2xlYXZlTWVBbG9uZScpO1xuICAgICAgcG9zdEFjdGlvbkNoZWNrcyhDVVNUT01fQVJHUyk7XG4gIFxuICAgICAgLy8gVGhpcyBhY3Rpb24gdHlwZSB1c2VzIGhhbmRsZXJzIG5hdmlnYXRlIGNhbGxiYWNrIFxuICAgICAgZXhwZWN0KGhhbmRsZXJzLm5hdmlnYXRlQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG4gIFxuICAgIGl0KGBzaG91bGQgY2xlYW4gY29sbGVjdGlvbiBmaWVsZHMgYXQgdG9wIGxldmVsIG9mIGZvcm1EYXRhIGFmdGVyIGxhc3QgZW50cnkgcmVtb3ZlZGAsICgpID0+IHtcbiAgICAgIC8vIEFmdGVyIHJlbW92aW5nIHRoZSBsYXN0IGFjdGl2ZSBlbnRyeSwgdGhlIGNvbGxlY3Rpb24gYXJyYXkgYW5kIGFjdGl2ZUlEIGFyZSBkZWxldGVkLCBcbiAgICAgIC8vIGFuZCB0aGUgY29sbGVjdGlvbiBkYXRhIGlzIHJlbW92ZWQgZnJvbSB0b3AgbGV2ZWwgb2YgZm9ybURhdGEuXG4gICAgICBjb25zdCBGT1JNX1NUQVRFID0ge1xuICAgICAgICBwYWdlOntcbiAgICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICAgdGVzdENvbGxlY3Rpb25BY3RpdmVJZDogJ3JlbW92ZU1lJyxcbiAgICAgICAgICAgIHRlc3RDb2xsZWN0aW9uOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogJ3JlbW92ZU1lJywgZmxpZ2h0TnVtYmVyOiAnMSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGZsaWdodE51bWJlcjogJzEnLFxuICAgICAgICAgICAgdGVzdENvbGxlY3Rpb25MYXN0UmVtb3ZlZDogJ3ByZXZpb3VzT25lJ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IEFDVElPTiA9IHsgXG4gICAgICAgIHR5cGU6IFBhZ2VBY3Rpb24uVFlQRVMuQ09MTEVDVElPTl9SRU1PVkUsXG4gICAgICAgIGNvbGxlY3Rpb246ICd0ZXN0Q29sbGVjdGlvbicsXG4gICAgICAgIHJlY29yZFJlbW92YWw6IHRydWVcbiAgICAgIH07XG4gICAgICBjb25zdCBDVVNUT01fQVJHUyA9IHsgLi4uQVJHUywgYWN0aW9uOiBBQ1RJT04sIGZvcm1TdGF0ZTogRk9STV9TVEFURSB9O1xuICAgICAgb25QYWdlQWN0aW9uKC4uLk9iamVjdC52YWx1ZXMoQ1VTVE9NX0FSR1MpKTtcbiAgXG4gICAgICBwcmVBY3Rpb25DaGVja3MoKTtcbiAgICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGEudGVzdENvbGxlY3Rpb24pLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGEudGVzdENvbGxlY3Rpb25MYXN0UmVtb3ZlZCkudG9FcXVhbCh7aWQ6ICdyZW1vdmVNZScsIGZsaWdodE51bWJlcjogJzEnIH0pO1xuICAgICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YS5mbGlnaHROdW1iZXIpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGEudGVzdENvbGxlY3Rpb25BY3RpdmVJZCkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgcG9zdEFjdGlvbkNoZWNrcyhDVVNUT01fQVJHUyk7XG4gIFxuICAgICAgLy8gVGhpcyBhY3Rpb24gdHlwZSB1c2VzIGhhbmRsZXJzIG5hdmlnYXRlIGNhbGxiYWNrIFxuICAgICAgZXhwZWN0KGhhbmRsZXJzLm5hdmlnYXRlQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG4gIFxufSk7XG5cbiAgZGVzY3JpYmUoJ2lmIHZhbGlkYXRpb24gZmFpbHMnLCAoKSA9PiB7XG4gICAgY29uc3QgVkFMSURfQUNUSU9OUyA9IE9iamVjdC52YWx1ZXMoUGFnZUFjdGlvbi5UWVBFUykuZmlsdGVyKGEgPT4gYSAhPT0gUGFnZUFjdGlvbi5UWVBFUy5DQU5DRUwpO1xuICAgIFZBTElEX0FDVElPTlMuZm9yRWFjaCgoYWN0aW9uVHlwZSkgPT4ge1xuICAgICAgaXQoYHNob3VsZCBub3QgY29udGludWUgZm9yIHRoZSAke2FjdGlvblR5cGV9IGFjdGlvbiB0eXBlYCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBBQ1RJT04gPSB7IHR5cGU6IGFjdGlvblR5cGUgfTtcbiAgICAgICAgY29uc3QgQ1VTVE9NX0FSR1MgPSB7IC4uLkFSR1MsIGFjdGlvbjogQUNUSU9OIH07XG4gICAgICAgIGhlbHBlcnMuY2FuQWN0aW9uUHJvY2VlZFJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuICAgICAgICBleHBlY3QoaGVscGVycy5jYW5BY3Rpb25Qcm9jZWVkQ2FsbHMpLnRvRXF1YWwoMSk7XG4gICAgICAgIGV4cGVjdChNT0NLX1ZBTElEQVRFLnBhZ2VDYWxscykudG9FcXVhbCgxKTtcbiAgICAgICAgLy8gVmFsaWRhdGlvbiBmYWlscyBzbyB3ZSBleHBlY3QgdG8gbmV2ZXIgcmVhY2hcbiAgICAgICAgLy8gdGhlIHBvaW50IG9mIHN1Ym1pc3Npb24uXG4gICAgICAgIGV4cGVjdChNT0NLX0hPT0tTLm9uU3VibWl0Q2FsbHMpLnRvRXF1YWwoMCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG4gIFxuICBkZXNjcmliZSgnYWRkaW5nIGEgZmllbGQgdG8gZm9ybURhdGEgaWYgc3BlY2lmaWVkIG9uIHRoZSBhY3Rpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgVkFMSURfQUNUSU9OUyA9IE9iamVjdC52YWx1ZXMoUGFnZUFjdGlvbi5UWVBFUykuZmlsdGVyKGEgPT4gKFxuICAgICAgYSAhPT0gUGFnZUFjdGlvbi5UWVBFUy5DQU5DRUwgJiYgYSAhPT0gUGFnZUFjdGlvbi5UWVBFUy5OQVZJR0FURVxuICAgICkpO1xuICAgIFZBTElEX0FDVElPTlMuZm9yRWFjaCgoYWN0aW9uVHlwZSkgPT4ge1xuICAgICAgaXQoYHNob3VsZCB3b3JrIGZvciB0aGUgJHthY3Rpb25UeXBlfSBhY3Rpb24gdHlwZWAsICgpID0+IHtcbiAgICAgICAgY29uc3QgRk9STV9TVEFURSA9IHtcbiAgICAgICAgICBwYWdlOiB7XG4gICAgICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICAgICB0ZXN0Q29sbGVjdGlvbjogW10sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBBQ1RJT04gPSB7XG4gICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcbiAgICAgICAgICBjb2xsZWN0aW9uOiAndGVzdENvbGxlY3Rpb24nLFxuICAgICAgICAgIGFkZFRvRm9ybURhdGE6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdhbHBoYScsXG4gICAgICAgICAgICAgIHZhbHVlOiAnMTIzJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdwYXJlbnQuY2hpbGQnLFxuICAgICAgICAgICAgICB2YWx1ZTogW3tcbiAgICAgICAgICAgICAgICBpZDogJzEyMzQ1J1xuICAgICAgICAgICAgICB9XSxcbiAgICAgICAgICAgICAgaXNDb2xsZWN0aW9uOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBDVVNUT01fQVJHUyA9IHsgLi4uQVJHUywgZm9ybVN0YXRlOiBGT1JNX1NUQVRFLCBhY3Rpb246IEFDVElPTiB9O1xuICAgICAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuXG4gICAgICAgIHByZUFjdGlvbkNoZWNrcygpO1xuICAgICAgICBwb3N0QWN0aW9uQ2hlY2tzKENVU1RPTV9BUkdTKTtcbiAgICAgICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YSkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgICAgYWxwaGE6ICcxMjMnXG4gICAgICAgIH0pO1xuICAgICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhLnBhcmVudFswXS5jaGlsZFswXS5pZCkudG9FcXVhbCgnMTIzNDUnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIFxuICAgIGl0KGBzaG91bGQgd29yayBmb3IgdGhlICR7UGFnZUFjdGlvbi5UWVBFUy5TQVZFX0FORF9OQVZJR0FURX0gYWN0aW9uIHR5cGUgdG8gcmVzZXQgdGhlIGFjdGl2ZSBJRGAsICgpID0+IHtcbiAgICAgIC8vIEluIHRoaXMgdGVzdCB0aGUgYWN0aW9uIGluY2x1ZGVzIHRoZSByZXNldEFjdGl2ZUlkIGZpZWxkXG4gICAgICAvLyByZXF1aXJpbmcgdGhhdCB0aGUgYWN0aXZlIElEIGlzIHBvaW50ZWQgdG8gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBjb2xsZWN0aW9uXG4gICAgICAvLyBzbyB0aGF0IHVzZXIgY2FuIGN5Y2xlIHRocm91Z2ggdGhlIGZ1bGwgY29sbGVjdGlvbiBhZ2Fpbi5cbiAgICAgIGNvbnN0IEZPUk1fU1RBVEUgPSB7XG4gICAgICAgIHBhZ2U6IHtcbiAgICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICAgdGVzdENvbGxlY3Rpb246IFt7IGlkOiAnMScgfSwgeyBpZDogJzInIH0sIHsgaWQ6ICczJyB9XSwgdGVzdENvbGxlY3Rpb25BY3RpdmVJZDogJzMnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgQUNUSU9OID0ge1xuICAgICAgICB0eXBlOiBQYWdlQWN0aW9uLlRZUEVTLlNBVkVfQU5EX05BVklHQVRFLFxuICAgICAgICBjb2xsZWN0aW9uOiAndGVzdENvbGxlY3Rpb24nLFxuICAgICAgICByZXNldEFjdGl2ZUlkOiB0cnVlXG4gICAgICB9O1xuICAgICAgY29uc3QgQ1VTVE9NX0FSR1MgPSB7IC4uLkFSR1MsIGZvcm1TdGF0ZTogRk9STV9TVEFURSwgYWN0aW9uOiBBQ1RJT04gfTtcbiAgICAgIG9uUGFnZUFjdGlvbiguLi5PYmplY3QudmFsdWVzKENVU1RPTV9BUkdTKSk7XG5cbiAgICAgIHByZUFjdGlvbkNoZWNrcygpO1xuICAgICAgLy8gQWxsIHRoZSBhY3Rpb25zIGRvZXMgaW4gdGhpcyBjYXNlIGlzIHNldCBhIGZ1bmN0aW9uXG4gICAgICAvLyB0byBiZSBjYWxsZWQgaW4gdGhlIG9uU3VjY2VzcyBjYWxsYmFjayBmb3IgdGhlIG9uU3VibWl0IGhvb2suXG4gICAgICBwb3N0QWN0aW9uQ2hlY2tzKENVU1RPTV9BUkdTKTtcblxuICAgICAgZXhwZWN0KGhhbmRsZXJzLm5hdmlnYXRlQ2FsbHMpLnRvRXF1YWwoMSk7XG5cbiAgICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGFbYCR7QUNUSU9OLmNvbGxlY3Rpb259QWN0aXZlSWRgXSkudG9FcXVhbCgnMScpO1xuXG4gICAgfSk7XG5cbiAgICBpdChgc2hvdWxkIHdvcmsgZm9yIHRoZSAke1BhZ2VBY3Rpb24uVFlQRVMuU0FWRV9BTkRfTkFWSUdBVEV9IGFjdGlvbiB0eXBlIHRvIHNldCBhZGRBbm90aGVyIHRvIHllc2AsICgpID0+IHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIGlzIG1pZHdheSB0aHJvdWdoIHRoZSBjb2xsZWN0aW9uXG4gICAgICAvLyB0aGVuIHRoZSBhZGRBbm90aGVyIGZpZWxkIGlzIHNldCB0byB5ZXMgXG4gICAgICAvLyB0byBhbGxvdyB0aGUgbmF2aWdhdGlvbiB0byBtb3ZlIHRvIG5leHQgZW50cnkuXG4gICAgICBjb25zdCBGT1JNX1NUQVRFID0ge1xuICAgICAgICBwYWdlOiB7XG4gICAgICAgICAgZm9ybURhdGE6IHtcbiAgICAgICAgICAgIHRlc3RzOiBbeyBpZDogJzEnIH0sIHsgaWQ6ICcyJyB9LCB7IGlkOiAnMycgfV0sIHRlc3RzQWN0aXZlSWQ6ICcyJywgYWRkQW5vdGhlclRlc3Q6ICdObydcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBBQ1RJT04gPSB7XG4gICAgICAgIHR5cGU6IFBhZ2VBY3Rpb24uVFlQRVMuU0FWRV9BTkRfTkFWSUdBVEUsXG4gICAgICAgIGNvbGxlY3Rpb246ICd0ZXN0cydcbiAgICAgIH07XG4gICAgICBjb25zdCBDVVNUT01fQVJHUyA9IHsgLi4uQVJHUywgZm9ybVN0YXRlOiBGT1JNX1NUQVRFLCBhY3Rpb246IEFDVElPTiB9O1xuICAgICAgb25QYWdlQWN0aW9uKC4uLk9iamVjdC52YWx1ZXMoQ1VTVE9NX0FSR1MpKTtcblxuICAgICAgcHJlQWN0aW9uQ2hlY2tzKCk7XG4gICAgICAvLyBBbGwgdGhlIGFjdGlvbnMgZG9lcyBpbiB0aGlzIGNhc2UgaXMgc2V0IGEgZnVuY3Rpb25cbiAgICAgIC8vIHRvIGJlIGNhbGxlZCBpbiB0aGUgb25TdWNjZXNzIGNhbGxiYWNrIGZvciB0aGUgb25TdWJtaXQgaG9vay5cbiAgICAgIHBvc3RBY3Rpb25DaGVja3MoQ1VTVE9NX0FSR1MpO1xuXG4gICAgICBleHBlY3QoaGFuZGxlcnMubmF2aWdhdGVDYWxscykudG9FcXVhbCgxKTtcblxuICAgICAgZXhwZWN0KEZPUk1fU1RBVEUucGFnZS5mb3JtRGF0YVtgJHtBQ1RJT04uY29sbGVjdGlvbn1BY3RpdmVJZGBdKS50b0VxdWFsKCcyJyk7XG4gICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhW0FDVElPTi5jb2xsZWN0aW9uXS5sZW5ndGgpLnRvRXF1YWwoMyk7XG4gICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhLmFkZEFub3RoZXJUZXN0KS50b0VxdWFsKCdZZXMnKTtcblxuICAgIH0pO1xuXG4gICAgaXQoYHNob3VsZCB3b3JrIGZvciB0aGUgJHtQYWdlQWN0aW9uLlRZUEVTLk5BVklHQVRFfSBhY3Rpb24gdHlwZWAsICgpID0+IHtcbiAgICAgIGNvbnN0IEZPUk1fU1RBVEUgPSB7XG4gICAgICAgIHBhZ2U6IHtcbiAgICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICAgdGVzdENvbGxlY3Rpb246IFtdLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IEFDVElPTiA9IHtcbiAgICAgICAgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5OQVZJR0FURSxcbiAgICAgICAgY29sbGVjdGlvbjogJ3Rlc3RDb2xsZWN0aW9uJyxcbiAgICAgICAgYWRkVG9Gb3JtRGF0YTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAnYWxwaGEnLFxuICAgICAgICAgICAgdmFsdWU6ICcxMjMnXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmaWVsZDogJ3BhcmVudC5jaGlsZCcsXG4gICAgICAgICAgICB2YWx1ZTogW3tcbiAgICAgICAgICAgICAgaWQ6ICcxMjM0NSdcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgaXNDb2xsZWN0aW9uOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9O1xuICAgICAgY29uc3QgQ1VTVE9NX0FSR1MgPSB7IC4uLkFSR1MsIGZvcm1TdGF0ZTogRk9STV9TVEFURSwgYWN0aW9uOiBBQ1RJT04gfTtcbiAgICAgIG9uUGFnZUFjdGlvbiguLi5PYmplY3QudmFsdWVzKENVU1RPTV9BUkdTKSk7XG5cbiAgICAgIHByZUFjdGlvbkNoZWNrcygpO1xuICAgICAgLy8gTm90IGRvaW5nIHRoZSB1c3VhbCBwb3N0LWFjdGlvbiBjaGVja3MgaGVyZVxuICAgICAgLy8gYXMgYSBuYXZpZ2F0ZSBhY3Rpb24gc2hvdWxkIHN0b3AgYXQgY2FsbGluZ1xuICAgICAgLy8gaG9va3MubmF2aWdhdGUuXG4gICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgYWxwaGE6ICcxMjMnXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChGT1JNX1NUQVRFLnBhZ2UuZm9ybURhdGEucGFyZW50WzBdLmNoaWxkWzBdLmlkKS50b0VxdWFsKCcxMjM0NScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB3b3JrIGZvciBhbiBhcnJheSBvZiBmb3JtRGF0YScsICgpID0+IHtcbiAgICAgIGNvbnN0IEZPUk1fU1RBVEUgPSB7XG4gICAgICAgIHBhZ2U6IHtcbiAgICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICAgdGVzdENvbGxlY3Rpb246IFtdLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IEFDVElPTiA9IHtcbiAgICAgICAgdHlwZTogUGFnZUFjdGlvbi5UWVBFUy5OQVZJR0FURSxcbiAgICAgICAgY29sbGVjdGlvbjogJ3Rlc3RDb2xsZWN0aW9uJyxcbiAgICAgICAgYWRkVG9Gb3JtRGF0YTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAnYWxwaGEnLFxuICAgICAgICAgICAgdmFsdWU6ICcxMjMnXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmaWVsZDogJ2JldGEuZ2FtbWEnLFxuICAgICAgICAgICAgdmFsdWU6ICc0NTYnXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9O1xuICAgICAgY29uc3QgQ1VTVE9NX0FSR1MgPSB7IC4uLkFSR1MsIGZvcm1TdGF0ZTogRk9STV9TVEFURSwgYWN0aW9uOiBBQ1RJT04gfTtcbiAgICAgIG9uUGFnZUFjdGlvbiguLi5PYmplY3QudmFsdWVzKENVU1RPTV9BUkdTKSk7XG5cbiAgICAgIHByZUFjdGlvbkNoZWNrcygpO1xuICAgICAgLy8gTm90IGRvaW5nIHRoZSB1c3VhbCBwb3N0LWFjdGlvbiBjaGVja3MgaGVyZVxuICAgICAgLy8gYXMgYSBuYXZpZ2F0ZSBhY3Rpb24gc2hvdWxkIHN0b3AgYXQgY2FsbGluZ1xuICAgICAgLy8gaG9va3MubmF2aWdhdGUuXG4gICAgICBleHBlY3QoRk9STV9TVEFURS5wYWdlLmZvcm1EYXRhKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgYWxwaGE6ICcxMjMnLFxuICAgICAgICBiZXRhOiB7IGdhbW1hOiAnNDU2JyB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlY29yZGluZyBwYXRjaExhYmVsIGZpZWxkcyBjb3JyZWN0bHkgd2hlbiBpdCBpcyBkZWZpbmVkJywgKCkgPT4ge1xuICAgIGNvbnN0IFZBTElEX0FDVElPTlMgPSBPYmplY3QudmFsdWVzKFBhZ2VBY3Rpb24uVFlQRVMpLmZpbHRlcihhID0+IChcbiAgICAgIGEgIT09IFBhZ2VBY3Rpb24uVFlQRVMuQ0FOQ0VMICYmIGEgIT09IFBhZ2VBY3Rpb24uVFlQRVMuTkFWSUdBVEVcbiAgICApKTtcbiAgICBWQUxJRF9BQ1RJT05TLmZvckVhY2goKGFjdGlvblR5cGUpID0+IHtcbiAgICAgIGl0KGBzaG91bGQgd29yayBmb3IgdGhlICR7YWN0aW9uVHlwZX0gYWN0aW9uIHR5cGVgLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IEZPUk1fU1RBVEUgPSB7XG4gICAgICAgICAgcGFnZTp7XG4gICAgICAgICAgICBmb3JtRGF0YToge1xuICAgICAgICAgICAgICB0ZXN0Q29sbGVjdGlvbjogW11cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IEtFWSA9ICd0ZXN0RmllbGQnO1xuICAgICAgICBjb25zdCBWQUxVRSA9ICd0ZXN0VmFsdWUnO1xuICAgICAgICBjb25zdCBQQVRDSF9MQUJFTCA9IHtcbiAgICAgICAgICBbS0VZXTogVkFMVUVcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgUEFUQ0ggPSB7XG4gICAgICAgICAgW0tFWV06IFZBTFVFXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IEFDVElPTiA9IHsgXG4gICAgICAgICAgdHlwZTogYWN0aW9uVHlwZSxcbiAgICAgICAgICBjb2xsZWN0aW9uOiAndGVzdENvbGxlY3Rpb24nXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IENVU1RPTV9BUkdTID0geyBcbiAgICAgICAgICAuLi5BUkdTLCBcbiAgICAgICAgICBhY3Rpb246IEFDVElPTixcbiAgICAgICAgICBmb3JtU3RhdGU6IEZPUk1fU1RBVEUsIFxuICAgICAgICAgIHBhdGNoOiBQQVRDSCxcbiAgICAgICAgICBwYXRjaExhYmVsOiBQQVRDSF9MQUJFTCwgXG4gICAgICAgICAgdHlwZTogRm9ybVR5cGVzLkhVQiB9O1xuICAgICAgICBvblBhZ2VBY3Rpb24oLi4uT2JqZWN0LnZhbHVlcyhDVVNUT01fQVJHUykpO1xuXG4gICAgICAgIHByZUFjdGlvbkNoZWNrcygpO1xuICAgICAgICBwb3N0QWN0aW9uQ2hlY2tzKENVU1RPTV9BUkdTKTsgLy8gU3BlY2lmaWMgY2hlY2sgZm9yIHBhdGNoTGFiZWwgZG9uZSBpbiBoZXJlLlxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pXG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxTQUFBLEdBQUFELHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSSxRQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSyxhQUFBLEdBQUFILHNCQUFBLENBQUFGLE9BQUE7QUFBeUMsU0FBQUUsdUJBQUFJLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFBQSxTQUFBRyxRQUFBSCxDQUFBLEVBQUFJLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQVAsQ0FBQSxPQUFBTSxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBUixDQUFBLEdBQUFJLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFYLENBQUEsRUFBQUksQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FB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