@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,899 +0,0 @@
1
- "use strict";
2
-
3
- var _meetsCondition = _interopRequireDefault(require("./meetsCondition"));
4
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
5
- // Local imports
6
-
7
- describe('utils.Condition.meetsCondition', () => {
8
- const getCondition = (operator, val) => {
9
- if (['in', 'nin'].includes(operator)) {
10
- return {
11
- op: operator,
12
- values: val
13
- };
14
- }
15
- return {
16
- op: operator,
17
- value: val
18
- };
19
- };
20
- const TEST_VALUES = ['a', 'b', 3, 4, null, undefined, true, false, 0];
21
- describe('equality operators', () => {
22
- ['eq', '='].forEach(op => {
23
- describe("operator ".concat(op), () => {
24
- // Should match...
25
- it('should match two nulls', () => {
26
- const VALUE = null;
27
- const CONDITION = getCondition(op, null);
28
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
29
- });
30
- it('should match two undefineds', () => {
31
- const VALUE = undefined;
32
- const CONDITION = getCondition(op, undefined);
33
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
34
- });
35
- it('should match two identical strings', () => {
36
- const VALUE = 'value';
37
- const CONDITION = getCondition(op, 'value');
38
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
39
- });
40
- it('should match two empty strings', () => {
41
- const VALUE = '';
42
- const CONDITION = getCondition(op, '');
43
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
44
- });
45
- it('should match two identical numbers', () => {
46
- const VALUE = 3;
47
- const CONDITION = getCondition(op, 3);
48
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
49
- });
50
- it('should match two zeroes', () => {
51
- const VALUE = 0;
52
- const CONDITION = getCondition(op, 0);
53
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
54
- });
55
- it('should match two boolean trues', () => {
56
- const VALUE = true;
57
- const CONDITION = getCondition(op, true);
58
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
59
- });
60
- it('should match two boolean falses', () => {
61
- const VALUE = false;
62
- const CONDITION = getCondition(op, false);
63
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
64
- });
65
- it('should match environmentContext value with data object', () => {
66
- const VALUE = 'Bob';
67
- const DATA = {
68
- environmentContext: {
69
- currentUser: 'Bob'
70
- }
71
- };
72
- const CONDITION = getCondition(op, 'field::environmentContext.currentUser');
73
- expect((0, _meetsCondition.default)(CONDITION, VALUE, DATA)).toBeTruthy();
74
- });
75
-
76
- // Should reject...
77
- it('should reject a null and undefined', () => {
78
- const VALUE = null;
79
- const CONDITION = getCondition(op, undefined);
80
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
81
- });
82
- it('should reject a null and empty string', () => {
83
- const VALUE = null;
84
- const CONDITION = getCondition(op, '');
85
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
86
- });
87
- it('should reject an undefined and empty string', () => {
88
- const VALUE = undefined;
89
- const CONDITION = getCondition(op, '');
90
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
91
- });
92
- it('should reject a string of just whitespace and empty string', () => {
93
- const VALUE = ' ';
94
- const CONDITION = getCondition(op, '');
95
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
96
- });
97
- it("should reject the string number '3' and the number 3", () => {
98
- const VALUE = '3';
99
- const CONDITION = getCondition(op, 3);
100
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
101
- });
102
- it('should reject a boolean true and the number 1', () => {
103
- const VALUE = true;
104
- const CONDITION = getCondition(op, 1);
105
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
106
- });
107
- it('should reject a boolean false and a zero', () => {
108
- const VALUE = false;
109
- const CONDITION = getCondition(op, 0);
110
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
111
- });
112
- });
113
- });
114
- });
115
- describe('inequality operators', () => {
116
- ['ne', 'neq', '!=', '<>'].forEach(op => {
117
- describe("operator ".concat(op), () => {
118
- // Should reject...
119
- it('should reject two nulls', () => {
120
- const VALUE = null;
121
- const CONDITION = getCondition(op, null);
122
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
123
- });
124
- it('should reject two undefineds', () => {
125
- const VALUE = undefined;
126
- const CONDITION = getCondition(op, undefined);
127
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
128
- });
129
- it('should reject two identical strings', () => {
130
- const VALUE = 'value';
131
- const CONDITION = getCondition(op, 'value');
132
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
133
- });
134
- it('should reject two empty strings', () => {
135
- const VALUE = '';
136
- const CONDITION = getCondition(op, '');
137
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
138
- });
139
- it('should reject two identical numbers', () => {
140
- const VALUE = 3;
141
- const CONDITION = getCondition(op, 3);
142
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
143
- });
144
- it('should reject two zeroes', () => {
145
- const VALUE = 0;
146
- const CONDITION = getCondition(op, 0);
147
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
148
- });
149
- it('should reject two boolean trues', () => {
150
- const VALUE = true;
151
- const CONDITION = getCondition(op, true);
152
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
153
- });
154
- it('should reject two boolean falses', () => {
155
- const VALUE = false;
156
- const CONDITION = getCondition(op, false);
157
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
158
- });
159
- it('should reject environmentContext value with data object', () => {
160
- const VALUE = 'Bob';
161
- const DATA = {
162
- environmentContext: {
163
- currentUser: 'Bob'
164
- }
165
- };
166
- const CONDITION = getCondition(op, 'field::environmentContext.currentUser');
167
- expect((0, _meetsCondition.default)(CONDITION, VALUE, DATA)).toBeFalsy();
168
- });
169
-
170
- // Should match...
171
- it('should match a null and undefined', () => {
172
- const VALUE = null;
173
- const CONDITION = getCondition(op, undefined);
174
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
175
- });
176
- it('should match a null and empty string', () => {
177
- const VALUE = null;
178
- const CONDITION = getCondition(op, '');
179
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
180
- });
181
- it('should match an undefined and empty string', () => {
182
- const VALUE = undefined;
183
- const CONDITION = getCondition(op, '');
184
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
185
- });
186
- it('should match a string of just whitespace and empty string', () => {
187
- const VALUE = ' ';
188
- const CONDITION = getCondition(op, '');
189
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
190
- });
191
- it("should match the string number '3' and the number 3", () => {
192
- const VALUE = '3';
193
- const CONDITION = getCondition(op, 3);
194
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
195
- });
196
- it('should match a boolean true and the number 1', () => {
197
- const VALUE = true;
198
- const CONDITION = getCondition(op, 1);
199
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
200
- });
201
- it('should match a boolean false and a zero', () => {
202
- const VALUE = false;
203
- const CONDITION = getCondition(op, 0);
204
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
205
- });
206
- });
207
- });
208
- });
209
- describe('operator in', () => {
210
- const op = 'in';
211
-
212
- // Should match...
213
- it('should match a string that is in the values array', () => {
214
- const VALUE = 'alpha';
215
- const CONDITION = getCondition(op, ['alpha', 'bravo', 'charlie']);
216
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
217
- });
218
- it('should match a number that is in the values array', () => {
219
- const VALUE = 4;
220
- const CONDITION = getCondition(op, ['alpha', 'bravo', 'charlie', 4]);
221
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
222
- });
223
-
224
- // Should reject...
225
- it('should reject a string that is missing from the values array', () => {
226
- const VALUE = 'delta';
227
- const CONDITION = getCondition(op, ['alpha', 'bravo', 'charlie']);
228
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
229
- });
230
- it('should reject a number that is missing from the values array', () => {
231
- const VALUE = 4;
232
- const CONDITION = getCondition(op, ['alpha', 'bravo', 'charlie']);
233
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
234
- });
235
- it('should reject everything when the values array is empty', () => {
236
- const CONDITION = getCondition(op, []);
237
- ['a', 'b', 'c', 'd', 'e', 6, 7, 8, 9, 'ten'].forEach(value => {
238
- expect((0, _meetsCondition.default)(CONDITION, value)).toBeFalsy();
239
- });
240
- });
241
- it('should reject everything when the values array is null', () => {
242
- const CONDITION = getCondition(op, null);
243
- ['a', 'b', 'c', 'd', 'e', 6, 7, 8, 9, 'ten'].forEach(value => {
244
- expect((0, _meetsCondition.default)(CONDITION, value)).toBeFalsy();
245
- });
246
- });
247
- });
248
- describe('operator nin', () => {
249
- const op = 'nin';
250
-
251
- // Should reject...
252
- it('should reject a string that is in the values array', () => {
253
- const VALUE = 'alpha';
254
- const CONDITION = getCondition(op, ['alpha', 'bravo', 'charlie']);
255
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
256
- });
257
- it('should reject a number that is in the values array', () => {
258
- const VALUE = 4;
259
- const CONDITION = getCondition(op, ['alpha', 'bravo', 'charlie', 4]);
260
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
261
- });
262
-
263
- // Should match...
264
- it('should match a string that is missing from the values array', () => {
265
- const VALUE = 'delta';
266
- const CONDITION = getCondition(op, ['alpha', 'bravo', 'charlie']);
267
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
268
- });
269
- it('should match a number that is missing from the values array', () => {
270
- const VALUE = 4;
271
- const CONDITION = getCondition(op, ['alpha', 'bravo', 'charlie']);
272
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
273
- });
274
- it('should match anything when the values array is empty', () => {
275
- const CONDITION = getCondition(op, []);
276
- TEST_VALUES.forEach(value => {
277
- expect((0, _meetsCondition.default)(CONDITION, value)).toBeTruthy();
278
- });
279
- });
280
- it('should match anything when the values array is null', () => {
281
- const CONDITION = getCondition(op, null);
282
- TEST_VALUES.forEach(value => {
283
- expect((0, _meetsCondition.default)(CONDITION, value)).toBeTruthy();
284
- });
285
- });
286
- });
287
- describe('operator contains', () => {
288
- const op = 'contains';
289
-
290
- // Should match...
291
- it('should match a string that is in the field array', () => {
292
- const FIELD = ['alpha', 'bravo', 'charlie'];
293
- const VALUE = 'alpha';
294
- const CONDITION = getCondition(op, VALUE);
295
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeTruthy();
296
- });
297
- it('should match a sub-string that is in the field array', () => {
298
- const FIELD = ['alpha', 'bravo', 'charlie'];
299
- const VALUE = 'alp';
300
- const CONDITION = getCondition(op, VALUE);
301
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeTruthy();
302
- });
303
- it('should match a number that is in the field array', () => {
304
- const FIELD = [1, 2, 3];
305
- const VALUE = 1;
306
- const CONDITION = getCondition(op, VALUE);
307
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeTruthy();
308
- });
309
- it('should match a sub-string that is in the field string', () => {
310
- const FIELD = 'alphabravocharlie';
311
- const VALUE = 'alpha';
312
- const CONDITION = getCondition(op, VALUE);
313
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeTruthy();
314
- });
315
- it('should match a string that is in the field array regardless of case', () => {
316
- const FIELD = ['Alpha', 'bravo', 'charlie'];
317
- const VALUE = 'alpha';
318
- const CONDITION = getCondition(op, VALUE);
319
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeTruthy();
320
- });
321
-
322
- // Should reject...
323
- it('should reject a string that is missing from the field array', () => {
324
- const FIELD = ['alpha', 'bravo', 'charlie'];
325
- const VALUE = 'delta';
326
- const CONDITION = getCondition(op, VALUE);
327
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeFalsy();
328
- });
329
- it('should reject a number that is missing from the field array', () => {
330
- const FIELD = [1, 2, 3];
331
- const VALUE = 4;
332
- const CONDITION = getCondition(op, VALUE);
333
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeFalsy();
334
- });
335
- it('should reject a substring that is missing from the field string', () => {
336
- const FIELD = 'alphabravocharlie';
337
- const VALUE = 'delta';
338
- const CONDITION = getCondition(op, VALUE);
339
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeFalsy();
340
- });
341
- it('should reject any value when the field is an empty Array', () => {
342
- const FIELD = [];
343
- const VALUE = 'alpha';
344
- const CONDITION = getCondition(op, VALUE);
345
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeFalsy();
346
- });
347
- it('should reject any value when the field is an empty string', () => {
348
- const FIELD = '';
349
- const VALUE = 'alpha';
350
- const CONDITION = getCondition(op, VALUE);
351
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeFalsy();
352
- });
353
- it('should reject any field when the value is null', () => {
354
- const FIELD = ['alpha', 'bravo', 'charlie'];
355
- const VALUE = null;
356
- const CONDITION = getCondition(op, VALUE);
357
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeFalsy();
358
- });
359
- it('should reject any field when the value is undefined', () => {
360
- const FIELD = ['alpha', 'bravo', 'charlie'];
361
- const VALUE = undefined;
362
- const CONDITION = getCondition(op, VALUE);
363
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeFalsy();
364
- });
365
- it('should reject any value when the field is null', () => {
366
- const FIELD = null;
367
- const VALUE = 'alpha';
368
- const CONDITION = getCondition(op, VALUE);
369
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeFalsy();
370
- });
371
- it('should reject any value when the field is undefined', () => {
372
- const FIELD = undefined;
373
- const VALUE = 'alpha';
374
- const CONDITION = getCondition(op, VALUE);
375
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeFalsy();
376
- });
377
- });
378
- describe('operator !contains', () => {
379
- const op = '!contains';
380
-
381
- // Should match...
382
- it('should match a string that is not in the field array', () => {
383
- const FIELD = ['alpha', 'bravo', 'charlie'];
384
- const VALUE = 'delta';
385
- const CONDITION = getCondition(op, VALUE);
386
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeTruthy();
387
- });
388
- it('should match any value if the field array is empty', () => {
389
- const FIELD = [];
390
- const VALUE = 'alpha';
391
- const CONDITION = getCondition(op, VALUE);
392
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeTruthy();
393
- });
394
- it('should match any field when the value is null', () => {
395
- const FIELD = ['alpha', 'bravo', 'charlie'];
396
- const VALUE = null;
397
- const CONDITION = getCondition(op, VALUE);
398
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeTruthy();
399
- });
400
- it('should match any field when the value is undefined', () => {
401
- const FIELD = ['alpha', 'bravo', 'charlie'];
402
- const VALUE = undefined;
403
- const CONDITION = getCondition(op, VALUE);
404
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeTruthy();
405
- });
406
- it('should match any value when the field is an empty string', () => {
407
- const FIELD = '';
408
- const VALUE = 'alpha';
409
- const CONDITION = getCondition(op, VALUE);
410
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeTruthy();
411
- });
412
- it('should match a number that is missing from the field array', () => {
413
- const FIELD = [1, 2, 3];
414
- const VALUE = 4;
415
- const CONDITION = getCondition(op, VALUE);
416
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeTruthy();
417
- });
418
- it('should match a substring that is missing from the field string', () => {
419
- const FIELD = 'alphabravocharlie';
420
- const VALUE = 'delta';
421
- const CONDITION = getCondition(op, VALUE);
422
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeTruthy();
423
- });
424
- it('should match any value when the field is null', () => {
425
- const FIELD = null;
426
- const VALUE = 'alpha';
427
- const CONDITION = getCondition(op, VALUE);
428
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeTruthy();
429
- });
430
- it('should match any value when the field is undefined', () => {
431
- const FIELD = undefined;
432
- const VALUE = 'alpha';
433
- const CONDITION = getCondition(op, VALUE);
434
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeTruthy();
435
- });
436
-
437
- // Should reject...
438
- it('should reject a string that is in the field array', () => {
439
- const FIELD = ['alpha', 'bravo', 'charlie'];
440
- const VALUE = 'alpha';
441
- const CONDITION = getCondition(op, VALUE);
442
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeFalsy();
443
- });
444
- it('should reject a sub-string that is in the field array', () => {
445
- const FIELD = ['alpha', 'bravo', 'charlie'];
446
- const VALUE = 'alp';
447
- const CONDITION = getCondition(op, VALUE);
448
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeFalsy();
449
- });
450
- it('should reject a number that is in the field array', () => {
451
- const FIELD = [1, 2, 3];
452
- const VALUE = 1;
453
- const CONDITION = getCondition(op, VALUE);
454
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeFalsy();
455
- });
456
- it('should reject a sub-string that is in the field string', () => {
457
- const FIELD = 'alphabravocharlie';
458
- const VALUE = 'alpha';
459
- const CONDITION = getCondition(op, VALUE);
460
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeFalsy();
461
- });
462
- it('should reject a string that is in the field array regardless of case', () => {
463
- const FIELD = ['Alpha', 'bravo', 'charlie'];
464
- const VALUE = 'alpha';
465
- const CONDITION = getCondition(op, VALUE);
466
- expect((0, _meetsCondition.default)(CONDITION, FIELD)).toBeFalsy();
467
- });
468
- });
469
- describe('numerical operators', () => {
470
- it('less than should reject when value is null', () => {
471
- const CONDITION = {
472
- op: '<',
473
- value: '100'
474
- };
475
- expect((0, _meetsCondition.default)(CONDITION, null)).toBeFalsy();
476
- });
477
- it('less than should reject when condition.value is null', () => {
478
- const CONDITION = {
479
- op: '<',
480
- value: null
481
- };
482
- expect((0, _meetsCondition.default)(CONDITION, '100')).toBeFalsy();
483
- });
484
- it('less than should reject when condition.value and value are null', () => {
485
- const CONDITION = {
486
- op: '<',
487
- value: null
488
- };
489
- expect((0, _meetsCondition.default)(CONDITION, null)).toBeFalsy();
490
- });
491
- it('less than should reject when value is greater than condition.value', () => {
492
- const CONDITION = {
493
- op: '<',
494
- value: '100'
495
- };
496
- expect((0, _meetsCondition.default)(CONDITION, '101')).toBeFalsy();
497
- });
498
- it('less than should accept when value is less than condition.value', () => {
499
- const CONDITION = {
500
- op: '<',
501
- value: '100'
502
- };
503
- expect((0, _meetsCondition.default)(CONDITION, '99')).toBeTruthy();
504
- });
505
- it('less than should handle values with commas in', () => {
506
- const CONDITION = {
507
- op: '<',
508
- value: '10,000'
509
- };
510
- expect((0, _meetsCondition.default)(CONDITION, '9,999')).toBeTruthy();
511
- });
512
- it('greater than should reject when value is null', () => {
513
- const CONDITION = {
514
- op: '>',
515
- value: '100'
516
- };
517
- expect((0, _meetsCondition.default)(CONDITION, null)).toBeFalsy();
518
- });
519
- it('greater than should reject when condition.value is null', () => {
520
- const CONDITION = {
521
- op: '>',
522
- value: null
523
- };
524
- expect((0, _meetsCondition.default)(CONDITION, '100')).toBeFalsy();
525
- });
526
- it('greater than should reject when condition.value and value are null', () => {
527
- const CONDITION = {
528
- op: '>',
529
- value: null
530
- };
531
- expect((0, _meetsCondition.default)(CONDITION, null)).toBeFalsy();
532
- });
533
- it('greater than should reject when value is less than condition.value', () => {
534
- const CONDITION = {
535
- op: '>',
536
- value: '100'
537
- };
538
- expect((0, _meetsCondition.default)(CONDITION, '99')).toBeFalsy();
539
- });
540
- it('greater than should accept when value is greater than condition.value', () => {
541
- const CONDITION = {
542
- op: '>',
543
- value: '100'
544
- };
545
- expect((0, _meetsCondition.default)(CONDITION, '101')).toBeTruthy();
546
- });
547
- it('greater than should handle values with commas in', () => {
548
- const CONDITION = {
549
- op: '>',
550
- value: '10,000'
551
- };
552
- expect((0, _meetsCondition.default)(CONDITION, '10,000,000')).toBeTruthy();
553
- });
554
- it('greater than should handle value is 0', () => {
555
- const CONDITION = {
556
- op: '>',
557
- value: 0
558
- };
559
- expect((0, _meetsCondition.default)(CONDITION, 1)).toBeTruthy();
560
- });
561
- it('greater than should handle compear is 0', () => {
562
- const CONDITION = {
563
- op: '<',
564
- value: 1
565
- };
566
- expect((0, _meetsCondition.default)(CONDITION, 0)).toBeTruthy();
567
- });
568
- it('greater than should handle array is 0', () => {
569
- const CONDITION = {
570
- op: '>',
571
- value: 1
572
- };
573
- expect((0, _meetsCondition.default)(CONDITION, ["A", "B", "C"])).toBeTruthy();
574
- });
575
- });
576
- describe('operator includes', () => {
577
- it('should accept a string that exists within the value', () => {
578
- const VALUE = ['red', 'green', 'blue'];
579
- const CONDITION = {
580
- op: 'includes',
581
- value: 'blue'
582
- };
583
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
584
- });
585
- it('should accept a number that exists within the value', () => {
586
- const VALUE = [4, 5, 6];
587
- const CONDITION = {
588
- op: 'includes',
589
- value: 6
590
- };
591
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
592
- });
593
- it('should reject a string that doesnt exist within the value', () => {
594
- const VALUE = ['red', 'green', 'blue'];
595
- const CONDITION = {
596
- op: 'includes',
597
- value: 'purple'
598
- };
599
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
600
- });
601
- it('should reject a number that doesnt exist within the value', () => {
602
- const VALUE = [4, 5, 6];
603
- const CONDITION = {
604
- op: 'includes',
605
- value: 7
606
- };
607
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
608
- });
609
- it('should reject a value that is not an array', () => {
610
- const VALUE = 'badValue';
611
- const CONDITION = {
612
- op: 'includes',
613
- value: 7
614
- };
615
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
616
- });
617
- it('should reject an empty array', () => {
618
- const VALUE = [];
619
- const CONDITION = {
620
- op: 'includes',
621
- value: 7
622
- };
623
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
624
- });
625
- });
626
- describe('operator !includes', () => {
627
- it('should reject a string that exists within the value', () => {
628
- const VALUE = ['red', 'green', 'blue'];
629
- const CONDITION = {
630
- op: '!includes',
631
- value: 'blue'
632
- };
633
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
634
- });
635
- it('should reject a number that exists within the value', () => {
636
- const VALUE = [4, 5, 6];
637
- const CONDITION = {
638
- op: '!includes',
639
- value: 6
640
- };
641
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
642
- });
643
- it('should accept a string that doesnt exist within the value', () => {
644
- const VALUE = ['red', 'green', 'blue'];
645
- const CONDITION = {
646
- op: '!includes',
647
- value: 'purple'
648
- };
649
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
650
- });
651
- it('should accept a number that doesnt exist within the value', () => {
652
- const VALUE = [4, 5, 6];
653
- const CONDITION = {
654
- op: '!includes',
655
- value: 7
656
- };
657
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
658
- });
659
- it('should accept a value that is not an array', () => {
660
- const VALUE = 'badValue';
661
- const CONDITION = {
662
- op: '!includes',
663
- value: 7
664
- };
665
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
666
- });
667
- it('should accept an empty array', () => {
668
- const VALUE = [];
669
- const CONDITION = {
670
- op: '!includes',
671
- value: 7
672
- };
673
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
674
- });
675
- });
676
- describe('operator includesObjectProp', () => {
677
- it('should accept a property that exists within one of the objects in the value', () => {
678
- const VALUE = [{
679
- id: 1
680
- }, {
681
- id: 2
682
- }, {
683
- id: 3
684
- }];
685
- const CONDITION = {
686
- op: 'includesObjectProp',
687
- key: 'id',
688
- value: 2
689
- };
690
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
691
- });
692
- it('should reject a property that doesnt exist within one of the objects in the value', () => {
693
- const VALUE = [{
694
- id: 1
695
- }, {
696
- id: 2
697
- }, {
698
- id: 3
699
- }];
700
- const CONDITION = {
701
- op: 'includesObjectProp',
702
- key: 'id',
703
- value: 4
704
- };
705
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
706
- });
707
- it('should reject a value that is not an array', () => {
708
- const VALUE = 'badValue';
709
- const CONDITION = {
710
- op: 'includesObjectProp',
711
- key: 'id',
712
- value: 7
713
- };
714
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
715
- });
716
- it('should reject an empty array', () => {
717
- const VALUE = [];
718
- const CONDITION = {
719
- op: 'includesObjectProp',
720
- key: 'id',
721
- value: 7
722
- };
723
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
724
- });
725
- });
726
- describe('operator !includesObjectProp', () => {
727
- it('should reject a property that exists within one of the objects in the value', () => {
728
- const VALUE = [{
729
- id: 1
730
- }, {
731
- id: 2
732
- }, {
733
- id: 3
734
- }];
735
- const CONDITION = {
736
- op: '!includesObjectProp',
737
- key: 'id',
738
- value: 2
739
- };
740
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
741
- });
742
- it('should accept a property that doesnt exist within one of the objects in the value', () => {
743
- const VALUE = [{
744
- id: 1
745
- }, {
746
- id: 2
747
- }, {
748
- id: 3
749
- }];
750
- const CONDITION = {
751
- op: '!includesObjectProp',
752
- key: 'id',
753
- value: 4
754
- };
755
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
756
- });
757
- it('should accept a value that is not an array', () => {
758
- const VALUE = 'badValue';
759
- const CONDITION = {
760
- op: '!includesObjectProp',
761
- key: 'id',
762
- value: 7
763
- };
764
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
765
- });
766
- it('should accept an empty array', () => {
767
- const VALUE = [];
768
- const CONDITION = {
769
- op: '!includesObjectProp',
770
- key: 'id',
771
- value: 7
772
- };
773
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
774
- });
775
- });
776
- describe('operator includesAllOf', () => {
777
- it('should reject when value is not an array', () => {
778
- const VALUE = 'Not an array';
779
- const CONDITION = {
780
- op: 'includesAllOf',
781
- values: ['a', 'c']
782
- };
783
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
784
- });
785
- it('should reject when value is an empty array', () => {
786
- const VALUE = [];
787
- const CONDITION = {
788
- op: 'includesAllOf',
789
- values: ['a', 'c']
790
- };
791
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
792
- });
793
- it('should accept when the list of values is an empty array', () => {
794
- const VALUE = ['a', 'b', 'c'];
795
- const CONDITION = {
796
- op: 'includesAllOf',
797
- values: []
798
- };
799
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
800
- });
801
- it('should accept a list of values that are all in field', () => {
802
- const VALUE = ['a', 'b', 'c'];
803
- const CONDITION = {
804
- op: 'includesAllOf',
805
- values: ['a', 'c']
806
- };
807
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
808
- });
809
- it('should reject a list of values if any are missing from field', () => {
810
- const VALUE = ['a', 'b', 'c'];
811
- const CONDITION = {
812
- op: 'includesAllOf',
813
- values: ['a', 'd']
814
- };
815
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
816
- });
817
- });
818
- describe('operator !includesAllOf', () => {
819
- it('should accept when value is not an array', () => {
820
- const VALUE = 'Not an array';
821
- const CONDITION = {
822
- op: '!includesAllOf',
823
- values: ['a', 'c']
824
- };
825
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
826
- });
827
- it('should accept when value is an empty array', () => {
828
- const VALUE = [];
829
- const CONDITION = {
830
- op: '!includesAllOf',
831
- values: ['a', 'c']
832
- };
833
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
834
- });
835
- it('should reject when the list of values is an empty array', () => {
836
- const VALUE = ['a', 'b', 'c'];
837
- const CONDITION = {
838
- op: '!includesAllOf',
839
- values: []
840
- };
841
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
842
- });
843
- it('should reject a list of values that are all in value', () => {
844
- const VALUE = ['a', 'b', 'c'];
845
- const CONDITION = {
846
- op: '!includesAllOf',
847
- values: ['a', 'c']
848
- };
849
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeFalsy();
850
- });
851
- it('should accept a list of values if any are missing from value', () => {
852
- const VALUE = ['a', 'b', 'c'];
853
- const CONDITION = {
854
- op: '!includesAllOf',
855
- values: ['a', 'd']
856
- };
857
- expect((0, _meetsCondition.default)(CONDITION, VALUE)).toBeTruthy();
858
- });
859
- });
860
- describe('unknown operator', () => {
861
- const op = 'definitely_not_a_real_operator';
862
- it('should reject anything regardless of the value', () => {
863
- const CONDITION = getCondition(op, 'a');
864
- TEST_VALUES.forEach(value => {
865
- expect((0, _meetsCondition.default)(CONDITION, value)).toBeFalsy();
866
- });
867
- });
868
- it('should accept anything even with a null value', () => {
869
- const CONDITION = getCondition(op, null);
870
- TEST_VALUES.forEach(value => {
871
- expect((0, _meetsCondition.default)(CONDITION, value)).toBeFalsy();
872
- });
873
- });
874
- it('should accept anything even with a undefined value', () => {
875
- const CONDITION = getCondition(op, null);
876
- TEST_VALUES.forEach(value => {
877
- expect((0, _meetsCondition.default)(CONDITION, value)).toBeFalsy();
878
- });
879
- });
880
- });
881
- describe('invalid condition', () => {
882
- it('should accept anything when the condition is null', () => {
883
- TEST_VALUES.forEach(value => {
884
- expect((0, _meetsCondition.default)(null, value)).toBeTruthy();
885
- });
886
- });
887
- it('should accept anything when the condition is undefined', () => {
888
- TEST_VALUES.forEach(value => {
889
- expect((0, _meetsCondition.default)(undefined, value)).toBeTruthy();
890
- });
891
- });
892
- it('should accept anything when the condition is not an object', () => {
893
- TEST_VALUES.forEach(value => {
894
- expect((0, _meetsCondition.default)('condition', value)).toBeTruthy();
895
- });
896
- });
897
- });
898
- });
899
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWVldHNDb25kaXRpb24iLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImRlc2NyaWJlIiwiZ2V0Q29uZGl0aW9uIiwib3BlcmF0b3IiLCJ2YWwiLCJpbmNsdWRlcyIsIm9wIiwidmFsdWVzIiwidmFsdWUiLCJURVNUX1ZBTFVFUyIsInVuZGVmaW5lZCIsImZvckVhY2giLCJjb25jYXQiLCJpdCIsIlZBTFVFIiwiQ09ORElUSU9OIiwiZXhwZWN0IiwibWVldHNDb25kaXRpb24iLCJ0b0JlVHJ1dGh5IiwiREFUQSIsImVudmlyb25tZW50Q29udGV4dCIsImN1cnJlbnRVc2VyIiwidG9CZUZhbHN5IiwiRklFTEQiLCJpZCIsImtleSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9Db25kaXRpb24vbWVldHNDb25kaXRpb24udGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBMb2NhbCBpbXBvcnRzXG5pbXBvcnQgbWVldHNDb25kaXRpb24gZnJvbSAnLi9tZWV0c0NvbmRpdGlvbic7XG5cbmRlc2NyaWJlKCd1dGlscy5Db25kaXRpb24ubWVldHNDb25kaXRpb24nLCAoKSA9PiB7XG4gIGNvbnN0IGdldENvbmRpdGlvbiA9IChvcGVyYXRvciwgdmFsKSA9PiB7XG4gICAgaWYgKFsnaW4nLCAnbmluJ10uaW5jbHVkZXMob3BlcmF0b3IpKSB7XG4gICAgICByZXR1cm4geyBvcDogb3BlcmF0b3IsIHZhbHVlczogdmFsIH07XG4gICAgfVxuICAgIHJldHVybiB7IG9wOiBvcGVyYXRvciwgdmFsdWU6IHZhbCB9O1xuICB9O1xuICBjb25zdCBURVNUX1ZBTFVFUyA9IFsnYScsICdiJywgMywgNCwgbnVsbCwgdW5kZWZpbmVkLCB0cnVlLCBmYWxzZSwgMF07XG5cbiAgZGVzY3JpYmUoJ2VxdWFsaXR5IG9wZXJhdG9ycycsICgpID0+IHtcbiAgICBbJ2VxJywgJz0nXS5mb3JFYWNoKG9wID0+IHtcbiAgICAgIGRlc2NyaWJlKGBvcGVyYXRvciAke29wfWAsICgpID0+IHtcbiAgICAgICAgLy8gU2hvdWxkIG1hdGNoLi4uXG4gICAgICAgIGl0KCdzaG91bGQgbWF0Y2ggdHdvIG51bGxzJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFZBTFVFID0gbnVsbDtcbiAgICAgICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIG51bGwpO1xuICAgICAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZVRydXRoeSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBtYXRjaCB0d28gdW5kZWZpbmVkcycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBWQUxVRSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlVHJ1dGh5KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIG1hdGNoIHR3byBpZGVudGljYWwgc3RyaW5ncycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBWQUxVRSA9ICd2YWx1ZSc7XG4gICAgICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCAndmFsdWUnKTtcbiAgICAgICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgbWF0Y2ggdHdvIGVtcHR5IHN0cmluZ3MnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgVkFMVUUgPSAnJztcbiAgICAgICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsICcnKTtcbiAgICAgICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgbWF0Y2ggdHdvIGlkZW50aWNhbCBudW1iZXJzJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFZBTFVFID0gMztcbiAgICAgICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIDMpO1xuICAgICAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZVRydXRoeSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBtYXRjaCB0d28gemVyb2VzJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFZBTFVFID0gMDtcbiAgICAgICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIDApO1xuICAgICAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZVRydXRoeSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBtYXRjaCB0d28gYm9vbGVhbiB0cnVlcycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBWQUxVRSA9IHRydWU7XG4gICAgICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCB0cnVlKTtcbiAgICAgICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgbWF0Y2ggdHdvIGJvb2xlYW4gZmFsc2VzJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFZBTFVFID0gZmFsc2U7XG4gICAgICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCBmYWxzZSk7XG4gICAgICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlVHJ1dGh5KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIG1hdGNoIGVudmlyb25tZW50Q29udGV4dCB2YWx1ZSB3aXRoIGRhdGEgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFZBTFVFID0gJ0JvYic7XG4gICAgICAgICAgY29uc3QgREFUQSA9IHtcbiAgICAgICAgICAgIGVudmlyb25tZW50Q29udGV4dDp7XG4gICAgICAgICAgICAgIGN1cnJlbnRVc2VyOiAnQm9iJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsICdmaWVsZDo6ZW52aXJvbm1lbnRDb250ZXh0LmN1cnJlbnRVc2VyJyk7XG4gICAgICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUsIERBVEEpKS50b0JlVHJ1dGh5KCk7XG4gICAgICAgIH0pO1xuICBcbiAgICAgICAgLy8gU2hvdWxkIHJlamVjdC4uLlxuICAgICAgICBpdCgnc2hvdWxkIHJlamVjdCBhIG51bGwgYW5kIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBWQUxVRSA9IG51bGw7XG4gICAgICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCB1bmRlZmluZWQpO1xuICAgICAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZUZhbHN5KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIHJlamVjdCBhIG51bGwgYW5kIGVtcHR5IHN0cmluZycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBWQUxVRSA9IG51bGw7XG4gICAgICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCAnJyk7XG4gICAgICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlRmFsc3koKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgcmVqZWN0IGFuIHVuZGVmaW5lZCBhbmQgZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFZBTFVFID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IENPTkRJVElPTiA9IGdldENvbmRpdGlvbihvcCwgJycpO1xuICAgICAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZUZhbHN5KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIHJlamVjdCBhIHN0cmluZyBvZiBqdXN0IHdoaXRlc3BhY2UgYW5kIGVtcHR5IHN0cmluZycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBWQUxVRSA9ICcgJztcbiAgICAgICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsICcnKTtcbiAgICAgICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVGYWxzeSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoYHNob3VsZCByZWplY3QgdGhlIHN0cmluZyBudW1iZXIgJzMnIGFuZCB0aGUgbnVtYmVyIDNgLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgVkFMVUUgPSAnMyc7XG4gICAgICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCAzKTtcbiAgICAgICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVGYWxzeSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCByZWplY3QgYSBib29sZWFuIHRydWUgYW5kIHRoZSBudW1iZXIgMScsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBWQUxVRSA9IHRydWU7XG4gICAgICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCAxKTtcbiAgICAgICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVGYWxzeSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCByZWplY3QgYSBib29sZWFuIGZhbHNlIGFuZCBhIHplcm8nLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgVkFMVUUgPSBmYWxzZTtcbiAgICAgICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIDApO1xuICAgICAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZUZhbHN5KCk7XG4gICAgICAgIH0pO1xuICBcbiAgICAgIH0pO1xuXG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbmVxdWFsaXR5IG9wZXJhdG9ycycsICgpID0+IHtcblxuICAgIFsnbmUnLCAnbmVxJywgJyE9JywgJzw+J10uZm9yRWFjaChvcCA9PiB7XG5cbiAgICAgIGRlc2NyaWJlKGBvcGVyYXRvciAke29wfWAsICgpID0+IHtcbiAgICAgICAgXG4gICAgICAgIC8vIFNob3VsZCByZWplY3QuLi5cbiAgICAgICAgaXQoJ3Nob3VsZCByZWplY3QgdHdvIG51bGxzJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFZBTFVFID0gbnVsbDtcbiAgICAgICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIG51bGwpO1xuICAgICAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZUZhbHN5KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIHJlamVjdCB0d28gdW5kZWZpbmVkcycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBWQUxVRSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlRmFsc3koKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgcmVqZWN0IHR3byBpZGVudGljYWwgc3RyaW5ncycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBWQUxVRSA9ICd2YWx1ZSc7XG4gICAgICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCAndmFsdWUnKTtcbiAgICAgICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVGYWxzeSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCByZWplY3QgdHdvIGVtcHR5IHN0cmluZ3MnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgVkFMVUUgPSAnJztcbiAgICAgICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsICcnKTtcbiAgICAgICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVGYWxzeSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCByZWplY3QgdHdvIGlkZW50aWNhbCBudW1iZXJzJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFZBTFVFID0gMztcbiAgICAgICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIDMpO1xuICAgICAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZUZhbHN5KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIHJlamVjdCB0d28gemVyb2VzJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFZBTFVFID0gMDtcbiAgICAgICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIDApO1xuICAgICAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZUZhbHN5KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIHJlamVjdCB0d28gYm9vbGVhbiB0cnVlcycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBWQUxVRSA9IHRydWU7XG4gICAgICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCB0cnVlKTtcbiAgICAgICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVGYWxzeSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCByZWplY3QgdHdvIGJvb2xlYW4gZmFsc2VzJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFZBTFVFID0gZmFsc2U7XG4gICAgICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCBmYWxzZSk7XG4gICAgICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlRmFsc3koKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgcmVqZWN0IGVudmlyb25tZW50Q29udGV4dCB2YWx1ZSB3aXRoIGRhdGEgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFZBTFVFID0gJ0JvYic7XG4gICAgICAgICAgY29uc3QgREFUQSA9IHtcbiAgICAgICAgICAgIGVudmlyb25tZW50Q29udGV4dDp7XG4gICAgICAgICAgICAgIGN1cnJlbnRVc2VyOiAnQm9iJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsICdmaWVsZDo6ZW52aXJvbm1lbnRDb250ZXh0LmN1cnJlbnRVc2VyJyk7XG4gICAgICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUsIERBVEEpKS50b0JlRmFsc3koKTtcbiAgICAgICAgfSk7XG4gIFxuICAgICAgICAvLyBTaG91bGQgbWF0Y2guLi5cbiAgICAgICAgaXQoJ3Nob3VsZCBtYXRjaCBhIG51bGwgYW5kIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBWQUxVRSA9IG51bGw7XG4gICAgICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCB1bmRlZmluZWQpO1xuICAgICAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZVRydXRoeSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBtYXRjaCBhIG51bGwgYW5kIGVtcHR5IHN0cmluZycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBWQUxVRSA9IG51bGw7XG4gICAgICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCAnJyk7XG4gICAgICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlVHJ1dGh5KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBpdCgnc2hvdWxkIG1hdGNoIGFuIHVuZGVmaW5lZCBhbmQgZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFZBTFVFID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IENPTkRJVElPTiA9IGdldENvbmRpdGlvbihvcCwgJycpO1xuICAgICAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZVRydXRoeSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXQoJ3Nob3VsZCBtYXRjaCBhIHN0cmluZyBvZiBqdXN0IHdoaXRlc3BhY2UgYW5kIGVtcHR5IHN0cmluZycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBWQUxVRSA9ICcgJztcbiAgICAgICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsICcnKTtcbiAgICAgICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KGBzaG91bGQgbWF0Y2ggdGhlIHN0cmluZyBudW1iZXIgJzMnIGFuZCB0aGUgbnVtYmVyIDNgLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgVkFMVUUgPSAnMyc7XG4gICAgICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCAzKTtcbiAgICAgICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgbWF0Y2ggYSBib29sZWFuIHRydWUgYW5kIHRoZSBudW1iZXIgMScsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBWQUxVRSA9IHRydWU7XG4gICAgICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCAxKTtcbiAgICAgICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGl0KCdzaG91bGQgbWF0Y2ggYSBib29sZWFuIGZhbHNlIGFuZCBhIHplcm8nLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgVkFMVUUgPSBmYWxzZTtcbiAgICAgICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIDApO1xuICAgICAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZVRydXRoeSgpO1xuICAgICAgICB9KTtcbiAgXG4gICAgICB9KTtcbiAgICB9KTtcblxuICB9KTtcblxuICBkZXNjcmliZSgnb3BlcmF0b3IgaW4nLCAoKSA9PiB7XG4gICAgY29uc3Qgb3AgPSAnaW4nO1xuICAgIFxuICAgIC8vIFNob3VsZCBtYXRjaC4uLlxuICAgIGl0KCdzaG91bGQgbWF0Y2ggYSBzdHJpbmcgdGhhdCBpcyBpbiB0aGUgdmFsdWVzIGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgVkFMVUUgPSAnYWxwaGEnO1xuICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCBbJ2FscGhhJywgJ2JyYXZvJywgJ2NoYXJsaWUnXSk7XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG1hdGNoIGEgbnVtYmVyIHRoYXQgaXMgaW4gdGhlIHZhbHVlcyBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IFZBTFVFID0gNDtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IGdldENvbmRpdGlvbihvcCwgWydhbHBoYScsICdicmF2bycsICdjaGFybGllJywgNF0pO1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICAvLyBTaG91bGQgcmVqZWN0Li4uXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSBzdHJpbmcgdGhhdCBpcyBtaXNzaW5nIGZyb20gdGhlIHZhbHVlcyBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IFZBTFVFID0gJ2RlbHRhJztcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IGdldENvbmRpdGlvbihvcCwgWydhbHBoYScsICdicmF2bycsICdjaGFybGllJ10pO1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIG51bWJlciB0aGF0IGlzIG1pc3NpbmcgZnJvbSB0aGUgdmFsdWVzIGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgVkFMVUUgPSA0O1xuICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCBbJ2FscGhhJywgJ2JyYXZvJywgJ2NoYXJsaWUnXSk7XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IGV2ZXJ5dGhpbmcgd2hlbiB0aGUgdmFsdWVzIGFycmF5IGlzIGVtcHR5JywgKCkgPT4ge1xuICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCBbXSk7XG4gICAgICBbJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsIDYsIDcsIDgsIDksICd0ZW4nXS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgdmFsdWUpKS50b0JlRmFsc3koKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IGV2ZXJ5dGhpbmcgd2hlbiB0aGUgdmFsdWVzIGFycmF5IGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIG51bGwpO1xuICAgICAgWydhJywgJ2InLCAnYycsICdkJywgJ2UnLCA2LCA3LCA4LCA5LCAndGVuJ10uZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIHZhbHVlKSkudG9CZUZhbHN5KCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICB9KTtcblxuICBkZXNjcmliZSgnb3BlcmF0b3IgbmluJywgKCkgPT4ge1xuICAgIGNvbnN0IG9wID0gJ25pbic7XG4gICAgXG4gICAgLy8gU2hvdWxkIHJlamVjdC4uLlxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgc3RyaW5nIHRoYXQgaXMgaW4gdGhlIHZhbHVlcyBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IFZBTFVFID0gJ2FscGhhJztcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IGdldENvbmRpdGlvbihvcCwgWydhbHBoYScsICdicmF2bycsICdjaGFybGllJ10pO1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIG51bWJlciB0aGF0IGlzIGluIHRoZSB2YWx1ZXMgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBWQUxVRSA9IDQ7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIFsnYWxwaGEnLCAnYnJhdm8nLCAnY2hhcmxpZScsIDRdKTtcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG5cbiAgICAvLyBTaG91bGQgbWF0Y2guLi5cbiAgICBpdCgnc2hvdWxkIG1hdGNoIGEgc3RyaW5nIHRoYXQgaXMgbWlzc2luZyBmcm9tIHRoZSB2YWx1ZXMgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBWQUxVRSA9ICdkZWx0YSc7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIFsnYWxwaGEnLCAnYnJhdm8nLCAnY2hhcmxpZSddKTtcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgbWF0Y2ggYSBudW1iZXIgdGhhdCBpcyBtaXNzaW5nIGZyb20gdGhlIHZhbHVlcyBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IFZBTFVFID0gNDtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IGdldENvbmRpdGlvbihvcCwgWydhbHBoYScsICdicmF2bycsICdjaGFybGllJ10pO1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBhbnl0aGluZyB3aGVuIHRoZSB2YWx1ZXMgYXJyYXkgaXMgZW1wdHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIFtdKTtcbiAgICAgIFRFU1RfVkFMVUVTLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCB2YWx1ZSkpLnRvQmVUcnV0aHkoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgbWF0Y2ggYW55dGhpbmcgd2hlbiB0aGUgdmFsdWVzIGFycmF5IGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIG51bGwpO1xuICAgICAgVEVTVF9WQUxVRVMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIHZhbHVlKSkudG9CZVRydXRoeSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ29wZXJhdG9yIGNvbnRhaW5zJywgKCkgPT4ge1xuICAgIGNvbnN0IG9wID0gJ2NvbnRhaW5zJztcbiAgICBcbiAgICAvLyBTaG91bGQgbWF0Y2guLi5cbiAgICBpdCgnc2hvdWxkIG1hdGNoIGEgc3RyaW5nIHRoYXQgaXMgaW4gdGhlIGZpZWxkIGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgRklFTEQgPSBbJ2FscGhhJywnYnJhdm8nLCdjaGFybGllJ107XG4gICAgICBjb25zdCBWQUxVRSA9ICdhbHBoYSc7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIFZBTFVFKVxuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgRklFTEQpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBhIHN1Yi1zdHJpbmcgdGhhdCBpcyBpbiB0aGUgZmllbGQgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBGSUVMRCA9IFsnYWxwaGEnLCdicmF2bycsJ2NoYXJsaWUnXTtcbiAgICAgIGNvbnN0IFZBTFVFID0gJ2FscCc7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIFZBTFVFKVxuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgRklFTEQpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBhIG51bWJlciB0aGF0IGlzIGluIHRoZSBmaWVsZCBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IEZJRUxEID0gWzEsMiwzXTtcbiAgICAgIGNvbnN0IFZBTFVFID0gMTtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IGdldENvbmRpdGlvbihvcCwgVkFMVUUpXG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBGSUVMRCkpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG1hdGNoIGEgc3ViLXN0cmluZyB0aGF0IGlzIGluIHRoZSBmaWVsZCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBGSUVMRCA9ICdhbHBoYWJyYXZvY2hhcmxpZSc7XG4gICAgICBjb25zdCBWQUxVRSA9ICdhbHBoYSc7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIFZBTFVFKVxuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgRklFTEQpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBhIHN0cmluZyB0aGF0IGlzIGluIHRoZSBmaWVsZCBhcnJheSByZWdhcmRsZXNzIG9mIGNhc2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBGSUVMRCA9IFsnQWxwaGEnLCdicmF2bycsJ2NoYXJsaWUnXTtcbiAgICAgIGNvbnN0IFZBTFVFID0gJ2FscGhhJztcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IGdldENvbmRpdGlvbihvcCwgVkFMVUUpXG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBGSUVMRCkpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIC8vIFNob3VsZCByZWplY3QuLi5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIHN0cmluZyB0aGF0IGlzIG1pc3NpbmcgZnJvbSB0aGUgZmllbGQgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBGSUVMRCA9IFsnYWxwaGEnLCdicmF2bycsJ2NoYXJsaWUnXTtcbiAgICAgIGNvbnN0IFZBTFVFID0gJ2RlbHRhJztcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IGdldENvbmRpdGlvbihvcCwgVkFMVUUpXG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBGSUVMRCkpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgbnVtYmVyIHRoYXQgaXMgbWlzc2luZyBmcm9tIHRoZSBmaWVsZCBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IEZJRUxEID0gWzEsMiwzXTtcbiAgICAgIGNvbnN0IFZBTFVFID0gNDtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IGdldENvbmRpdGlvbihvcCwgVkFMVUUpXG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBGSUVMRCkpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgc3Vic3RyaW5nIHRoYXQgaXMgbWlzc2luZyBmcm9tIHRoZSBmaWVsZCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBGSUVMRCA9ICdhbHBoYWJyYXZvY2hhcmxpZSc7XG4gICAgICBjb25zdCBWQUxVRSA9ICdkZWx0YSc7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIFZBTFVFKVxuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgRklFTEQpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhbnkgdmFsdWUgd2hlbiB0aGUgZmllbGQgaXMgYW4gZW1wdHkgQXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBGSUVMRCA9IFtdO1xuICAgICAgY29uc3QgVkFMVUUgPSAnYWxwaGEnO1xuICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCBWQUxVRSlcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIEZJRUxEKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYW55IHZhbHVlIHdoZW4gdGhlIGZpZWxkIGlzIGFuIGVtcHR5IHN0cmluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IEZJRUxEID0gJyc7XG4gICAgICBjb25zdCBWQUxVRSA9ICdhbHBoYSc7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIFZBTFVFKVxuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgRklFTEQpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhbnkgZmllbGQgd2hlbiB0aGUgdmFsdWUgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IEZJRUxEID0gWydhbHBoYScsJ2JyYXZvJywnY2hhcmxpZSddO1xuICAgICAgY29uc3QgVkFMVUUgPSBudWxsO1xuICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCBWQUxVRSlcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIEZJRUxEKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYW55IGZpZWxkIHdoZW4gdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IEZJRUxEID0gWydhbHBoYScsJ2JyYXZvJywnY2hhcmxpZSddO1xuICAgICAgY29uc3QgVkFMVUUgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIFZBTFVFKVxuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgRklFTEQpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhbnkgdmFsdWUgd2hlbiB0aGUgZmllbGQgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IEZJRUxEID0gbnVsbDtcbiAgICAgIGNvbnN0IFZBTFVFID0gJ2FscGhhJztcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IGdldENvbmRpdGlvbihvcCwgVkFMVUUpXG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBGSUVMRCkpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFueSB2YWx1ZSB3aGVuIHRoZSBmaWVsZCBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBGSUVMRCA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IFZBTFVFID0gJ2FscGhhJztcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IGdldENvbmRpdGlvbihvcCwgVkFMVUUpXG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBGSUVMRCkpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvcGVyYXRvciAhY29udGFpbnMnLCAoKSA9PiB7XG4gICAgY29uc3Qgb3AgPSAnIWNvbnRhaW5zJztcbiAgICBcbiAgICAvLyBTaG91bGQgbWF0Y2guLi5cbiAgICBpdCgnc2hvdWxkIG1hdGNoIGEgc3RyaW5nIHRoYXQgaXMgbm90IGluIHRoZSBmaWVsZCBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IEZJRUxEID0gWydhbHBoYScsJ2JyYXZvJywnY2hhcmxpZSddO1xuICAgICAgY29uc3QgVkFMVUUgPSAnZGVsdGEnO1xuICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCBWQUxVRSlcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIEZJRUxEKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgbWF0Y2ggYW55IHZhbHVlIGlmIHRoZSBmaWVsZCBhcnJheSBpcyBlbXB0eScsICgpID0+IHtcbiAgICAgIGNvbnN0IEZJRUxEID0gW107XG4gICAgICBjb25zdCBWQUxVRSA9ICdhbHBoYSc7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIFZBTFVFKVxuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgRklFTEQpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBhbnkgZmllbGQgd2hlbiB0aGUgdmFsdWUgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IEZJRUxEID0gWydhbHBoYScsJ2JyYXZvJywnY2hhcmxpZSddO1xuICAgICAgY29uc3QgVkFMVUUgPSBudWxsO1xuICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCBWQUxVRSlcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIEZJRUxEKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgbWF0Y2ggYW55IGZpZWxkIHdoZW4gdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IEZJRUxEID0gWydhbHBoYScsJ2JyYXZvJywnY2hhcmxpZSddO1xuICAgICAgY29uc3QgVkFMVUUgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIFZBTFVFKVxuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgRklFTEQpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBhbnkgdmFsdWUgd2hlbiB0aGUgZmllbGQgaXMgYW4gZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgRklFTEQgPSAnJztcbiAgICAgIGNvbnN0IFZBTFVFID0gJ2FscGhhJztcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IGdldENvbmRpdGlvbihvcCwgVkFMVUUpXG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBGSUVMRCkpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG1hdGNoIGEgbnVtYmVyIHRoYXQgaXMgbWlzc2luZyBmcm9tIHRoZSBmaWVsZCBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IEZJRUxEID0gWzEsMiwzXTtcbiAgICAgIGNvbnN0IFZBTFVFID0gNDtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IGdldENvbmRpdGlvbihvcCwgVkFMVUUpXG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBGSUVMRCkpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG1hdGNoIGEgc3Vic3RyaW5nIHRoYXQgaXMgbWlzc2luZyBmcm9tIHRoZSBmaWVsZCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBGSUVMRCA9ICdhbHBoYWJyYXZvY2hhcmxpZSc7XG4gICAgICBjb25zdCBWQUxVRSA9ICdkZWx0YSc7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIFZBTFVFKVxuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgRklFTEQpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBtYXRjaCBhbnkgdmFsdWUgd2hlbiB0aGUgZmllbGQgaXMgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IEZJRUxEID0gbnVsbDtcbiAgICAgIGNvbnN0IFZBTFVFID0gJ2FscGhhJztcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IGdldENvbmRpdGlvbihvcCwgVkFMVUUpXG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBGSUVMRCkpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIG1hdGNoIGFueSB2YWx1ZSB3aGVuIHRoZSBmaWVsZCBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBGSUVMRCA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IFZBTFVFID0gJ2FscGhhJztcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IGdldENvbmRpdGlvbihvcCwgVkFMVUUpXG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBGSUVMRCkpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIC8vIFNob3VsZCByZWplY3QuLi5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIHN0cmluZyB0aGF0IGlzIGluIHRoZSBmaWVsZCBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IEZJRUxEID0gWydhbHBoYScsJ2JyYXZvJywnY2hhcmxpZSddO1xuICAgICAgY29uc3QgVkFMVUUgPSAnYWxwaGEnO1xuICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCBWQUxVRSlcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIEZJRUxEKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSBzdWItc3RyaW5nIHRoYXQgaXMgaW4gdGhlIGZpZWxkIGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgRklFTEQgPSBbJ2FscGhhJywnYnJhdm8nLCdjaGFybGllJ107XG4gICAgICBjb25zdCBWQUxVRSA9ICdhbHAnO1xuICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCBWQUxVRSlcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIEZJRUxEKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSBudW1iZXIgdGhhdCBpcyBpbiB0aGUgZmllbGQgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBGSUVMRCA9IFsxLDIsM107XG4gICAgICBjb25zdCBWQUxVRSA9IDE7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIFZBTFVFKVxuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgRklFTEQpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIHN1Yi1zdHJpbmcgdGhhdCBpcyBpbiB0aGUgZmllbGQgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3QgRklFTEQgPSAnYWxwaGFicmF2b2NoYXJsaWUnO1xuICAgICAgY29uc3QgVkFMVUUgPSAnYWxwaGEnO1xuICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCBWQUxVRSlcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIEZJRUxEKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSBzdHJpbmcgdGhhdCBpcyBpbiB0aGUgZmllbGQgYXJyYXkgcmVnYXJkbGVzcyBvZiBjYXNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgRklFTEQgPSBbJ0FscGhhJywnYnJhdm8nLCdjaGFybGllJ107XG4gICAgICBjb25zdCBWQUxVRSA9ICdhbHBoYSc7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSBnZXRDb25kaXRpb24ob3AsIFZBTFVFKVxuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgRklFTEQpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcblxuICB9KTtcblxuICBkZXNjcmliZSgnbnVtZXJpY2FsIG9wZXJhdG9ycycsICgpID0+IHtcblxuICAgIGl0KCdsZXNzIHRoYW4gc2hvdWxkIHJlamVjdCB3aGVuIHZhbHVlIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnPCcsIHZhbHVlOiAnMTAwJyB9O1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgbnVsbCkpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2xlc3MgdGhhbiBzaG91bGQgcmVqZWN0IHdoZW4gY29uZGl0aW9uLnZhbHVlIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnPCcsIHZhbHVlOiBudWxsIH07XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCAnMTAwJykpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2xlc3MgdGhhbiBzaG91bGQgcmVqZWN0IHdoZW4gY29uZGl0aW9uLnZhbHVlIGFuZCB2YWx1ZSBhcmUgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICc8JywgdmFsdWU6IG51bGwgfTtcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIG51bGwpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcblxuICAgIGl0KCdsZXNzIHRoYW4gc2hvdWxkIHJlamVjdCB3aGVuIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBjb25kaXRpb24udmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnPCcsIHZhbHVlOiAnMTAwJyB9O1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgJzEwMScpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcblxuICAgIGl0KCdsZXNzIHRoYW4gc2hvdWxkIGFjY2VwdCB3aGVuIHZhbHVlIGlzIGxlc3MgdGhhbiBjb25kaXRpb24udmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnPCcsIHZhbHVlOiAnMTAwJyB9O1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgJzk5JykpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdsZXNzIHRoYW4gc2hvdWxkIGhhbmRsZSB2YWx1ZXMgd2l0aCBjb21tYXMgaW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnPCcsIHZhbHVlOiAnMTAsMDAwJyB9O1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgJzksOTk5JykpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdncmVhdGVyIHRoYW4gc2hvdWxkIHJlamVjdCB3aGVuIHZhbHVlIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnPicsIHZhbHVlOiAnMTAwJyB9O1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgbnVsbCkpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2dyZWF0ZXIgdGhhbiBzaG91bGQgcmVqZWN0IHdoZW4gY29uZGl0aW9uLnZhbHVlIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnPicsIHZhbHVlOiBudWxsIH07XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCAnMTAwJykpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2dyZWF0ZXIgdGhhbiBzaG91bGQgcmVqZWN0IHdoZW4gY29uZGl0aW9uLnZhbHVlIGFuZCB2YWx1ZSBhcmUgbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICc+JywgdmFsdWU6IG51bGwgfTtcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIG51bGwpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcblxuICAgIGl0KCdncmVhdGVyIHRoYW4gc2hvdWxkIHJlamVjdCB3aGVuIHZhbHVlIGlzIGxlc3MgdGhhbiBjb25kaXRpb24udmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnPicsIHZhbHVlOiAnMTAwJyB9O1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgJzk5JykpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2dyZWF0ZXIgdGhhbiBzaG91bGQgYWNjZXB0IHdoZW4gdmFsdWUgaXMgZ3JlYXRlciB0aGFuIGNvbmRpdGlvbi52YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICc+JywgdmFsdWU6ICcxMDAnIH07XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCAnMTAxJykpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdncmVhdGVyIHRoYW4gc2hvdWxkIGhhbmRsZSB2YWx1ZXMgd2l0aCBjb21tYXMgaW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnPicsIHZhbHVlOiAnMTAsMDAwJyB9O1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgJzEwLDAwMCwwMDAnKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2dyZWF0ZXIgdGhhbiBzaG91bGQgaGFuZGxlIHZhbHVlIGlzIDAnLCAoKSA9PiB7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnPicsIHZhbHVlOiAwIH07XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCAxKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2dyZWF0ZXIgdGhhbiBzaG91bGQgaGFuZGxlIGNvbXBlYXIgaXMgMCcsICgpID0+IHtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICc8JywgdmFsdWU6IDEgfTtcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIDApKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZ3JlYXRlciB0aGFuIHNob3VsZCBoYW5kbGUgYXJyYXkgaXMgMCcsICgpID0+IHtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICc+JywgdmFsdWU6IDEgfTtcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFtcIkFcIiwgXCJCXCIsIFwiQ1wiXSkpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICB9KTtcblxuICBkZXNjcmliZSgnb3BlcmF0b3IgaW5jbHVkZXMnLCAoKSA9PiB7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhIHN0cmluZyB0aGF0IGV4aXN0cyB3aXRoaW4gdGhlIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgVkFMVUUgPSBbJ3JlZCcsICdncmVlbicsICdibHVlJ107XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnaW5jbHVkZXMnLCB2YWx1ZTogJ2JsdWUnIH07XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IGEgbnVtYmVyIHRoYXQgZXhpc3RzIHdpdGhpbiB0aGUgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBWQUxVRSA9IFs0LCA1LCA2XTtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICdpbmNsdWRlcycsIHZhbHVlOiA2IH07XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgc3RyaW5nIHRoYXQgZG9lc250IGV4aXN0IHdpdGhpbiB0aGUgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBWQUxVRSA9IFsncmVkJywgJ2dyZWVuJywgJ2JsdWUnXTtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICdpbmNsdWRlcycsIHZhbHVlOiAncHVycGxlJyB9O1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlRmFsc3koKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgbnVtYmVyIHRoYXQgZG9lc250IGV4aXN0IHdpdGhpbiB0aGUgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBWQUxVRSA9IFs0LCA1LCA2XTtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICdpbmNsdWRlcycsIHZhbHVlOiA3IH07XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSB2YWx1ZSB0aGF0IGlzIG5vdCBhbiBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IFZBTFVFID0gJ2JhZFZhbHVlJztcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICdpbmNsdWRlcycsIHZhbHVlOiA3IH07XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYW4gZW1wdHkgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBWQUxVRSA9IFtdO1xuICAgICAgY29uc3QgQ09ORElUSU9OID0geyBvcDogJ2luY2x1ZGVzJywgdmFsdWU6IDcgfTtcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ29wZXJhdG9yICFpbmNsdWRlcycsICgpID0+IHtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgc3RyaW5nIHRoYXQgZXhpc3RzIHdpdGhpbiB0aGUgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBWQUxVRSA9IFsncmVkJywgJ2dyZWVuJywgJ2JsdWUnXTtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICchaW5jbHVkZXMnLCB2YWx1ZTogJ2JsdWUnIH07XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSBudW1iZXIgdGhhdCBleGlzdHMgd2l0aGluIHRoZSB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IFZBTFVFID0gWzQsIDUsIDZdO1xuICAgICAgY29uc3QgQ09ORElUSU9OID0geyBvcDogJyFpbmNsdWRlcycsIHZhbHVlOiA2IH07XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgYSBzdHJpbmcgdGhhdCBkb2VzbnQgZXhpc3Qgd2l0aGluIHRoZSB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IFZBTFVFID0gWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddO1xuICAgICAgY29uc3QgQ09ORElUSU9OID0geyBvcDogJyFpbmNsdWRlcycsIHZhbHVlOiAncHVycGxlJyB9O1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhIG51bWJlciB0aGF0IGRvZXNudCBleGlzdCB3aXRoaW4gdGhlIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgVkFMVUUgPSBbNCwgNSwgNl07XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnIWluY2x1ZGVzJywgdmFsdWU6IDcgfTtcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgYSB2YWx1ZSB0aGF0IGlzIG5vdCBhbiBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IFZBTFVFID0gJ2JhZFZhbHVlJztcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICchaW5jbHVkZXMnLCB2YWx1ZTogNyB9O1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhbiBlbXB0eSBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IFZBTFVFID0gW107XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnIWluY2x1ZGVzJywgdmFsdWU6IDcgfTtcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvcGVyYXRvciBpbmNsdWRlc09iamVjdFByb3AnLCAoKSA9PiB7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhIHByb3BlcnR5IHRoYXQgZXhpc3RzIHdpdGhpbiBvbmUgb2YgdGhlIG9iamVjdHMgaW4gdGhlIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgVkFMVUUgPSBbe2lkOiAxfSwge2lkOiAyfSwge2lkOiAzfV07XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnaW5jbHVkZXNPYmplY3RQcm9wJywga2V5OiAnaWQnLCB2YWx1ZTogMiB9O1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGEgcHJvcGVydHkgdGhhdCBkb2VzbnQgZXhpc3Qgd2l0aGluIG9uZSBvZiB0aGUgb2JqZWN0cyBpbiB0aGUgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBWQUxVRSA9IFt7aWQ6IDF9LCB7aWQ6IDJ9LCB7aWQ6IDN9XTtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICdpbmNsdWRlc09iamVjdFByb3AnLCBrZXk6ICdpZCcsIHZhbHVlOiA0IH07XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYSB2YWx1ZSB0aGF0IGlzIG5vdCBhbiBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IFZBTFVFID0gJ2JhZFZhbHVlJztcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICdpbmNsdWRlc09iamVjdFByb3AnLCBrZXk6ICdpZCcsIHZhbHVlOiA3IH07XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYW4gZW1wdHkgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBWQUxVRSA9IFtdO1xuICAgICAgY29uc3QgQ09ORElUSU9OID0geyBvcDogJ2luY2x1ZGVzT2JqZWN0UHJvcCcsIGtleTogJ2lkJywgdmFsdWU6IDcgfTtcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ29wZXJhdG9yICFpbmNsdWRlc09iamVjdFByb3AnLCAoKSA9PiB7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIHByb3BlcnR5IHRoYXQgZXhpc3RzIHdpdGhpbiBvbmUgb2YgdGhlIG9iamVjdHMgaW4gdGhlIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgVkFMVUUgPSBbe2lkOiAxfSwge2lkOiAyfSwge2lkOiAzfV07XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnIWluY2x1ZGVzT2JqZWN0UHJvcCcsIGtleTogJ2lkJywgdmFsdWU6IDIgfTtcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG5cblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IGEgcHJvcGVydHkgdGhhdCBkb2VzbnQgZXhpc3Qgd2l0aGluIG9uZSBvZiB0aGUgb2JqZWN0cyBpbiB0aGUgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBWQUxVRSA9IFt7aWQ6IDF9LCB7aWQ6IDJ9LCB7aWQ6IDN9XTtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICchaW5jbHVkZXNPYmplY3RQcm9wJywga2V5OiAnaWQnLCB2YWx1ZTogNCB9O1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhIHZhbHVlIHRoYXQgaXMgbm90IGFuIGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgVkFMVUUgPSAnYmFkVmFsdWUnO1xuICAgICAgY29uc3QgQ09ORElUSU9OID0geyBvcDogJyFpbmNsdWRlc09iamVjdFByb3AnLCBrZXk6ICdpZCcsIHZhbHVlOiA3IH07XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IGFuIGVtcHR5IGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgVkFMVUUgPSBbXTtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICchaW5jbHVkZXNPYmplY3RQcm9wJywga2V5OiAnaWQnLCB2YWx1ZTogNyB9O1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ29wZXJhdG9yIGluY2x1ZGVzQWxsT2YnLCAoKSA9PiB7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCB3aGVuIHZhbHVlIGlzIG5vdCBhbiBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IFZBTFVFID0gJ05vdCBhbiBhcnJheSc7XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnaW5jbHVkZXNBbGxPZicsIHZhbHVlczogWyAnYScsICdjJyBdIH07XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgd2hlbiB2YWx1ZSBpcyBhbiBlbXB0eSBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IFZBTFVFID0gW107XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnaW5jbHVkZXNBbGxPZicsIHZhbHVlczogWyAnYScsICdjJyBdIH07XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgd2hlbiB0aGUgbGlzdCBvZiB2YWx1ZXMgaXMgYW4gZW1wdHkgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBWQUxVRSA9IFsnYScsICdiJywgJ2MnXTtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICdpbmNsdWRlc0FsbE9mJywgdmFsdWVzOiBbXSB9O1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhIGxpc3Qgb2YgdmFsdWVzIHRoYXQgYXJlIGFsbCBpbiBmaWVsZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IFZBTFVFID0gWydhJywgJ2InLCAnYyddO1xuICAgICAgY29uc3QgQ09ORElUSU9OID0geyBvcDogJ2luY2x1ZGVzQWxsT2YnLCB2YWx1ZXM6IFsgJ2EnLCAnYycgXSB9O1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIGxpc3Qgb2YgdmFsdWVzIGlmIGFueSBhcmUgbWlzc2luZyBmcm9tIGZpZWxkJywgKCkgPT4ge1xuICAgICAgY29uc3QgVkFMVUUgPSBbJ2EnLCAnYicsICdjJ107XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnaW5jbHVkZXNBbGxPZicsIHZhbHVlczogWyAnYScsICdkJyBdIH07XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVGYWxzeSgpO1xuICAgIH0pO1xuXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvcGVyYXRvciAhaW5jbHVkZXNBbGxPZicsICgpID0+IHtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHdoZW4gdmFsdWUgaXMgbm90IGFuIGFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3QgVkFMVUUgPSAnTm90IGFuIGFycmF5JztcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICchaW5jbHVkZXNBbGxPZicsIHZhbHVlczogWyAnYScsICdjJyBdIH07XG4gICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCBWQUxVRSkpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IHdoZW4gdmFsdWUgaXMgYW4gZW1wdHkgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBWQUxVRSA9IFtdO1xuICAgICAgY29uc3QgQ09ORElUSU9OID0geyBvcDogJyFpbmNsdWRlc0FsbE9mJywgdmFsdWVzOiBbICdhJywgJ2MnIF0gfTtcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgd2hlbiB0aGUgbGlzdCBvZiB2YWx1ZXMgaXMgYW4gZW1wdHkgYXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBWQUxVRSA9IFsnYScsICdiJywgJ2MnXTtcbiAgICAgIGNvbnN0IENPTkRJVElPTiA9IHsgb3A6ICchaW5jbHVkZXNBbGxPZicsIHZhbHVlczogW10gfTtcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhIGxpc3Qgb2YgdmFsdWVzIHRoYXQgYXJlIGFsbCBpbiB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IFZBTFVFID0gWydhJywgJ2InLCAnYyddO1xuICAgICAgY29uc3QgQ09ORElUSU9OID0geyBvcDogJyFpbmNsdWRlc0FsbE9mJywgdmFsdWVzOiBbICdhJywgJ2MnIF0gfTtcbiAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIFZBTFVFKSkudG9CZUZhbHN5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhIGxpc3Qgb2YgdmFsdWVzIGlmIGFueSBhcmUgbWlzc2luZyBmcm9tIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgVkFMVUUgPSBbJ2EnLCAnYicsICdjJ107XG4gICAgICBjb25zdCBDT05ESVRJT04gPSB7IG9wOiAnIWluY2x1ZGVzQWxsT2YnLCB2YWx1ZXM6IFsgJ2EnLCAnZCcgXSB9O1xuICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKENPTkRJVElPTiwgVkFMVUUpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Vua25vd24gb3BlcmF0b3InLCAoKSA9PiB7XG4gICAgY29uc3Qgb3AgPSAnZGVmaW5pdGVseV9ub3RfYV9yZWFsX29wZXJhdG9yJztcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGFueXRoaW5nIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCAnYScpO1xuICAgICAgVEVTVF9WQUxVRVMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihDT05ESVRJT04sIHZhbHVlKSkudG9CZUZhbHN5KCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhbnl0aGluZyBldmVuIHdpdGggYSBudWxsIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCBudWxsKTtcbiAgICAgIFRFU1RfVkFMVUVTLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCB2YWx1ZSkpLnRvQmVGYWxzeSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgYW55dGhpbmcgZXZlbiB3aXRoIGEgdW5kZWZpbmVkIHZhbHVlJywgKCkgPT4ge1xuICAgICAgY29uc3QgQ09ORElUSU9OID0gZ2V0Q29uZGl0aW9uKG9wLCBudWxsKTtcbiAgICAgIFRFU1RfVkFMVUVTLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICBleHBlY3QobWVldHNDb25kaXRpb24oQ09ORElUSU9OLCB2YWx1ZSkpLnRvQmVGYWxzeSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbnZhbGlkIGNvbmRpdGlvbicsICgpID0+IHtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IGFueXRoaW5nIHdoZW4gdGhlIGNvbmRpdGlvbiBpcyBudWxsJywgKCkgPT4ge1xuICAgICAgVEVTVF9WQUxVRVMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgIGV4cGVjdChtZWV0c0NvbmRpdGlvbihudWxsLCB2YWx1ZSkpLnRvQmVUcnV0aHkoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgYWNjZXB0IGFueXRoaW5nIHdoZW4gdGhlIGNvbmRpdGlvbiBpcyB1bmRlZmluZWQnLCAoKSA9PiB7XG4gICAgICBURVNUX1ZBTFVFUy5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgZXhwZWN0KG1lZXRzQ29uZGl0aW9uKHVuZGVmaW5lZCwgdmFsdWUpKS50b0JlVHJ1dGh5KCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhbnl0aGluZyB3aGVuIHRoZSBjb25kaXRpb24gaXMgbm90IGFuIG9iamVjdCcsICgpID0+IHtcbiAgICAgIFRFU1RfVkFMVUVTLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICBleHBlY3QobWVldHNDb25kaXRpb24oJ2NvbmRpdGlvbicsIHZhbHVlKSkudG9CZVRydXRoeSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgfSk7XG5cbn0pO1xuIl0sIm1hcHBpbmdzIjoiOztBQUNBLElBQUFBLGVBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUE4QyxTQUFBRCx1QkFBQUUsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUQ5Qzs7QUFHQUcsUUFBUSxDQUFDLGdDQUFnQyxFQUFFLE1BQU07RUFDL0MsTUFBTUMsWUFBWSxHQUFHQSxDQUFDQyxRQUFRLEVBQUVDLEdBQUcsS0FBSztJQUN0QyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDQyxRQUFRLENBQUNGLFFBQVEsQ0FBQyxFQUFFO01BQ3BDLE9BQU87UUFBRUcsRUFBRSxFQUFFSCxRQUFRO1FBQUVJLE1BQU0sRUFBRUg7TUFBSSxDQUFDO0lBQ3RDO0lBQ0EsT0FBTztNQUFFRSxFQUFFLEVBQUVILFFBQVE7TUFBRUssS0FBSyxFQUFFSjtJQUFJLENBQUM7RUFDckMsQ0FBQztFQUNELE1BQU1LLFdBQVcsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUVDLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FB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QUFHYixZQUFZLENBQUNJLEVBQUUsRUFBRSxJQUFJLENBQUM7TUFDeENHLFdBQVcsQ0FBQ0UsT0FBTyxDQUFDSCxLQUFLLElBQUk7UUFDM0JRLE1BQU0sQ0FBQyxJQUFBQyx1QkFBYyxFQUFDRixTQUFTLEVBQUVQLEtBQUssQ0FBQyxDQUFDLENBQUNjLFNBQVMsQ0FBQyxDQUFDO01BQ3RELENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUNGVCxFQUFFLENBQUMsb0RBQW9ELEVBQUUsTUFBTTtNQUM3RCxNQUFNRSxTQUFTLEdBQUdiLFlBQVksQ0FBQ0ksRUFBRSxFQUFFLElBQUksQ0FBQztNQUN4Q0csV0FBVyxDQUFDRSxPQUFPLENBQUNILEtBQUssSUFBSTtRQUMzQlEsTUFBTSxDQUFDLElBQUFDLHVCQUFjLEVBQUNGLFNBQVMsRUFBRVAsS0FBSyxDQUFDLENBQUMsQ0FBQ2MsU0FBUyxDQUFDLENBQUM7TUFDdEQsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0VBRUZyQixRQUFRLENBQUMsbUJBQW1CLEVBQUUsTUFBTTtJQUVsQ1ksRUFBRSxDQUFDLG1EQUFtRCxFQUFFLE1BQU07TUFDNURKLFdBQVcsQ0FBQ0UsT0FBTyxDQUFDSCxLQUFLLElBQUk7UUFDM0JRLE1BQU0sQ0FBQyxJQUFBQyx1QkFBYyxFQUFDLElBQUksRUFBRVQsS0FBSyxDQUFDLENBQUMsQ0FBQ1UsVUFBVSxDQUFDLENBQUM7TUFDbEQsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBQ0ZMLEVBQUUsQ0FBQyx3REFBd0QsRUFBRSxNQUFNO01BQ2pFSixXQUFXLENBQUNFLE9BQU8sQ0FBQ0gsS0FBSyxJQUFJO1FBQzNCUSxNQUFNLENBQUMsSUFBQUMsdUJBQWMsRUFBQ1AsU0FBUyxFQUFFRixLQUFLLENBQUMsQ0FBQyxDQUFDVSxVQUFVLENBQUMsQ0FBQztNQUN2RCxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFDRkwsRUFBRSxDQUFDLDREQUE0RCxFQUFFLE1BQU07TUFDckVKLFdBQVcsQ0FBQ0UsT0FBTyxDQUFDSCxLQUFLLElBQUk7UUFDM0JRLE1BQU0sQ0FBQyxJQUFBQyx1QkFBYyxFQUFDLFdBQVcsRUFBRVQsS0FBSyxDQUFDLENBQUMsQ0FBQ1UsVUFBVSxDQUFDLENBQUM7TUFDekQsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0VBRUosQ0FBQyxDQUFDO0FBRUosQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119