@ukhomeoffice/cop-react-form-renderer 7.3.2 → 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.
- package/README.md +106 -32
- package/dist/components/CheckYourAnswers/Answer.d.ts +10 -0
- package/dist/components/CheckYourAnswers/CheckYourAnswers.d.ts +35 -0
- package/dist/components/CheckYourAnswers/index.d.ts +2 -0
- package/dist/components/CollectionPage/CollectionPage.d.ts +24 -0
- package/dist/components/CollectionPage/index.d.ts +1 -0
- package/dist/components/CollectionSummary/BannerStrip.d.ts +9 -0
- package/dist/components/CollectionSummary/CollectionSummary.d.ts +53 -0
- package/dist/components/CollectionSummary/Confirmation.d.ts +15 -0
- package/dist/components/CollectionSummary/RenderListView.d.ts +42 -0
- package/dist/components/CollectionSummary/SummaryCard.d.ts +62 -0
- package/dist/components/CollectionSummary/SummaryCardButtons.d.ts +21 -0
- package/dist/components/CollectionSummary/SummaryCardDetails.d.ts +14 -0
- package/dist/components/CollectionSummary/SummaryCardValidationContext.d.ts +9 -0
- package/dist/components/CollectionSummary/index.d.ts +2 -0
- package/dist/components/FormComponent/Collection.d.ts +39 -0
- package/dist/components/FormComponent/Container.d.ts +26 -0
- package/dist/components/FormComponent/FormComponent.d.ts +39 -0
- package/dist/components/FormComponent/helpers/addLabel.d.ts +7 -0
- package/dist/components/FormComponent/helpers/getComponentDisabled.d.ts +2 -0
- package/dist/components/FormComponent/helpers/getComponentError.d.ts +4 -0
- package/dist/components/FormComponent/helpers/getComponentFieldSet.d.ts +2 -0
- package/dist/components/FormComponent/helpers/index.d.ts +5 -0
- package/dist/components/FormComponent/index.d.ts +2 -0
- package/dist/components/FormPage/FormPage.d.ts +36 -0
- package/dist/components/FormPage/index.d.ts +2 -0
- package/dist/components/FormRenderer/FormRenderer.d.ts +39 -0
- package/dist/components/FormRenderer/handlers/cyaAction.d.ts +9 -0
- package/dist/components/FormRenderer/handlers/getPageId.d.ts +8 -0
- package/dist/components/FormRenderer/handlers/index.d.ts +6 -0
- package/dist/components/FormRenderer/handlers/navigate.d.ts +10 -0
- package/dist/components/FormRenderer/handlers/submissionError.d.ts +7 -0
- package/dist/components/FormRenderer/helpers/canActionProceed.d.ts +12 -0
- package/dist/components/FormRenderer/helpers/canCYASubmit.d.ts +10 -0
- package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.d.ts +2 -0
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.d.ts +51 -0
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.d.ts +179 -0
- package/dist/components/FormRenderer/helpers/getCYA.d.ts +20 -0
- package/dist/components/FormRenderer/helpers/getFormState.d.ts +25 -0
- package/dist/components/FormRenderer/helpers/getNextPageId.d.ts +2 -0
- package/dist/components/FormRenderer/helpers/getPage.d.ts +9 -0
- package/dist/components/FormRenderer/helpers/getRelevantPages.d.ts +2 -0
- package/dist/components/FormRenderer/helpers/getSubmissionStatus.d.ts +2 -0
- package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.d.ts +10 -0
- package/dist/components/FormRenderer/helpers/index.d.ts +29 -0
- package/dist/components/FormRenderer/index.d.ts +2 -0
- package/dist/components/FormRenderer/onCYAAction.d.ts +6 -0
- package/dist/components/FormRenderer/onPageAction.d.ts +2 -0
- package/dist/components/FormRenderer/onTaskAction.d.ts +2 -0
- package/dist/components/PageActions/ActionButton.d.ts +7 -0
- package/dist/components/PageActions/PageActions.d.ts +7 -0
- package/dist/components/PageActions/index.d.ts +2 -0
- package/dist/components/SummaryList/GroupAction.d.ts +12 -0
- package/dist/components/SummaryList/RowAction.d.ts +12 -0
- package/dist/components/SummaryList/SummaryList.d.ts +28 -0
- package/dist/components/SummaryList/SummaryList.stories.d.ts +10 -0
- package/dist/components/SummaryList/SummaryListHeadingRow.d.ts +7 -0
- package/dist/components/SummaryList/SummaryListHeadingRowWithAction.d.ts +16 -0
- package/dist/components/SummaryList/SummaryListRow.d.ts +19 -0
- package/dist/components/SummaryList/SummaryListTitleRow.d.ts +7 -0
- package/dist/components/SummaryList/helpers/getGroupActionAttributes.d.ts +17 -0
- package/dist/components/SummaryList/helpers/getRowActionAttributes.d.ts +17 -0
- package/dist/components/SummaryList/helpers/index.d.ts +2 -0
- package/dist/components/SummaryList/index.d.ts +2 -0
- package/dist/components/TaskList/Task.d.ts +12 -0
- package/dist/components/TaskList/TaskList.d.ts +40 -0
- package/dist/components/TaskList/TaskState.d.ts +6 -0
- package/dist/components/TaskList/index.d.ts +2 -0
- package/dist/components/index.d.ts +8 -0
- package/dist/context/HooksContext/HooksContext.d.ts +23 -0
- package/dist/context/HooksContext/index.d.ts +3 -0
- package/dist/context/ValidationContext/ValidationContext.d.ts +7 -0
- package/dist/context/ValidationContext/index.d.ts +3 -0
- package/dist/context/index.d.ts +3 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/useAxios.d.ts +2 -0
- package/dist/hooks/useGetRequest.d.ts +12 -0
- package/dist/hooks/useHooks.d.ts +2 -0
- package/dist/hooks/useRefData.d.ts +7 -0
- package/dist/hooks/useValidation.d.ts +2 -0
- package/dist/index.cjs +5 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6124 -81
- package/dist/models/CollectionLabels.d.ts +7 -0
- package/dist/models/ComponentTypes.d.ts +27 -0
- package/dist/models/EventTypes.d.ts +6 -0
- package/dist/models/FormPages.d.ts +6 -0
- package/dist/models/FormTypes.d.ts +10 -0
- package/dist/models/HubFormats.d.ts +5 -0
- package/dist/models/PageAction.d.ts +89 -0
- package/dist/models/TaskStates.d.ts +39 -0
- package/dist/models/index.d.ts +143 -0
- package/dist/setupTests.d.ts +14 -0
- package/dist/utils/CheckYourAnswers/getCYAAction.d.ts +20 -0
- package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.d.ts +22 -0
- package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.d.ts +22 -0
- package/dist/utils/CheckYourAnswers/getCYARow.d.ts +26 -0
- package/dist/utils/CheckYourAnswers/getCYARowForGroup.d.ts +17 -0
- package/dist/utils/CheckYourAnswers/getCYARowsForCollection.d.ts +2 -0
- package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.d.ts +23 -0
- package/dist/utils/CheckYourAnswers/getCYARowsForContainer.d.ts +2 -0
- package/dist/utils/CheckYourAnswers/getCYARowsForPage.d.ts +11 -0
- package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.d.ts +3 -0
- package/dist/utils/CheckYourAnswers/index.d.ts +5 -0
- package/dist/utils/CheckYourAnswers/showComponentCYA.d.ts +11 -0
- package/dist/utils/CollectionPage/addCollectionPageEntry.d.ts +12 -0
- package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.d.ts +13 -0
- package/dist/utils/CollectionPage/duplicateCollectionPageEntry.d.ts +13 -0
- package/dist/utils/CollectionPage/getCollectionPageActiveId.d.ts +14 -0
- package/dist/utils/CollectionPage/getCollectionPageActiveIndex.d.ts +15 -0
- package/dist/utils/CollectionPage/getCollectionPageData.d.ts +15 -0
- package/dist/utils/CollectionPage/getErrorsForCollection.d.ts +2 -0
- package/dist/utils/CollectionPage/getQuickEditPage.d.ts +40 -0
- package/dist/utils/CollectionPage/index.d.ts +13 -0
- package/dist/utils/CollectionPage/mergeCollectionPages.d.ts +13 -0
- package/dist/utils/CollectionPage/removeCollectionPageEntry.d.ts +11 -0
- package/dist/utils/CollectionPage/setCollectionPageData.d.ts +16 -0
- package/dist/utils/Component/addShowWhen.d.ts +13 -0
- package/dist/utils/Component/applyToComponentTree.d.ts +15 -0
- package/dist/utils/Component/cleanAttributes.d.ts +14 -0
- package/dist/utils/Component/elevateNestedComponents.d.ts +28 -0
- package/dist/utils/Component/getDefaultValue.d.ts +2 -0
- package/dist/utils/Component/getDefaultValueFromConfig.d.ts +2 -0
- package/dist/utils/Component/index.d.ts +12 -0
- package/dist/utils/Component/isEditable.d.ts +3 -0
- package/dist/utils/Component/optionIsSelected.d.ts +10 -0
- package/dist/utils/Component/setupContainerComponentsPath.d.ts +2 -0
- package/dist/utils/Component/showComponent.d.ts +2 -0
- package/dist/utils/Condition/index.d.ts +6 -0
- package/dist/utils/Condition/meetsAllConditions.d.ts +8 -0
- package/dist/utils/Condition/meetsCondition.d.ts +14 -0
- package/dist/utils/Condition/meetsOneCondition.d.ts +8 -0
- package/dist/utils/Condition/setupConditions.d.ts +2 -0
- package/dist/utils/Container/getEditableComponents.d.ts +7 -0
- package/dist/utils/Container/index.d.ts +6 -0
- package/dist/utils/Container/setupNesting.d.ts +2 -0
- package/dist/utils/Container/showContainer.d.ts +8 -0
- package/dist/utils/Data/applyFormula.d.ts +2 -0
- package/dist/utils/Data/deleteValues.d.ts +8 -0
- package/dist/utils/Data/getAutocompleteSource.d.ts +2 -0
- package/dist/utils/Data/getDataPath.d.ts +21 -0
- package/dist/utils/Data/getOptions.d.ts +2 -0
- package/dist/utils/Data/getSourceData.d.ts +17 -0
- package/dist/utils/Data/index.d.ts +15 -0
- package/dist/utils/Data/nestInRefdataOptions.d.ts +10 -0
- package/dist/utils/Data/refDataToOptions.d.ts +8 -0
- package/dist/utils/Data/setDataItem.d.ts +2 -0
- package/dist/utils/Data/setupFormData.d.ts +15 -0
- package/dist/utils/Data/setupRefDataUrlForComponent.d.ts +2 -0
- package/dist/utils/FormPage/applyConditionalProperties.d.ts +8 -0
- package/dist/utils/FormPage/getConditionalText.d.ts +23 -0
- package/dist/utils/FormPage/getFormPage.d.ts +9 -0
- package/dist/utils/FormPage/getFormPages.d.ts +9 -0
- package/dist/utils/FormPage/getPageActions.d.ts +13 -0
- package/dist/utils/FormPage/getParagraphFromText.d.ts +11 -0
- package/dist/utils/FormPage/index.d.ts +10 -0
- package/dist/utils/FormPage/showFormPage.d.ts +8 -0
- package/dist/utils/FormPage/showFormPageCYA.d.ts +8 -0
- package/dist/utils/FormPage/useComponent.d.ts +9 -0
- package/dist/utils/Format/formatData.d.ts +8 -0
- package/dist/utils/Format/formatDataForComponent.d.ts +15 -0
- package/dist/utils/Format/formatDataForForm.d.ts +8 -0
- package/dist/utils/Format/formatDataForPage.d.ts +15 -0
- package/dist/utils/Format/index.d.ts +7 -0
- package/dist/utils/Hub/getFormHub.d.ts +15 -0
- package/dist/utils/Hub/index.d.ts +4 -0
- package/dist/utils/Meta/constants.d.ts +2 -0
- package/dist/utils/Meta/documents/getDocuments.d.ts +2 -0
- package/dist/utils/Meta/documents/index.d.ts +6 -0
- package/dist/utils/Meta/documents/setDocumentsForField.d.ts +2 -0
- package/dist/utils/Meta/index.d.ts +9 -0
- package/dist/utils/Operate/checkValueIsTruthy.d.ts +9 -0
- package/dist/utils/Operate/deleteValueInFormData.d.ts +8 -0
- package/dist/utils/Operate/doesContainValue.d.ts +11 -0
- package/dist/utils/Operate/getFirstOf.d.ts +2 -0
- package/dist/utils/Operate/getIndexOfMatchingValueIn.d.ts +11 -0
- package/dist/utils/Operate/getLength.d.ts +11 -0
- package/dist/utils/Operate/index.d.ts +4 -0
- package/dist/utils/Operate/persistValueInFormData.d.ts +9 -0
- package/dist/utils/Operate/runPageOperations.d.ts +19 -0
- package/dist/utils/Operate/setValueInFormData.d.ts +2 -0
- package/dist/utils/Operate/shouldRun.d.ts +9 -0
- package/dist/utils/Validate/additional/conditionallyPermittedChange.d.ts +14 -0
- package/dist/utils/Validate/additional/conditionallyRequired.d.ts +11 -0
- package/dist/utils/Validate/additional/index.d.ts +2 -0
- package/dist/utils/Validate/additional/mustBeAfter.d.ts +14 -0
- package/dist/utils/Validate/additional/mustBeBefore.d.ts +14 -0
- package/dist/utils/Validate/additional/mustBeEarlierDateTime.d.ts +15 -0
- package/dist/utils/Validate/additional/mustBeGreaterThan.d.ts +7 -0
- package/dist/utils/Validate/additional/mustBeInTheFuture.d.ts +8 -0
- package/dist/utils/Validate/additional/mustBeInThePast.d.ts +9 -0
- package/dist/utils/Validate/additional/mustBeLessThan.d.ts +7 -0
- package/dist/utils/Validate/additional/mustBeLongerThan.d.ts +9 -0
- package/dist/utils/Validate/additional/mustBeNumbersOnly.d.ts +9 -0
- package/dist/utils/Validate/additional/mustBeOneOf.d.ts +8 -0
- package/dist/utils/Validate/additional/mustBeShorterThan.d.ts +9 -0
- package/dist/utils/Validate/additional/mustBeUniqueInCollection.d.ts +10 -0
- package/dist/utils/Validate/additional/mustEnterAtLeastOne.d.ts +9 -0
- package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.d.ts +7 -0
- package/dist/utils/Validate/additional/mustNotContainSql.d.ts +2 -0
- package/dist/utils/Validate/additional/mustSelectOnlyOne.d.ts +8 -0
- package/dist/utils/Validate/additional/utils.d.ts +4 -0
- package/dist/utils/Validate/index.d.ts +42 -0
- package/dist/utils/Validate/validateCollection.d.ts +9 -0
- package/dist/utils/Validate/validateComponent.d.ts +16 -0
- package/dist/utils/Validate/validateContainer.d.ts +12 -0
- package/dist/utils/Validate/validateDate.d.ts +29 -0
- package/dist/utils/Validate/validateEmail.d.ts +13 -0
- package/dist/utils/Validate/validateMultifile.d.ts +3 -0
- package/dist/utils/Validate/validateOnPageLoad.d.ts +1 -0
- package/dist/utils/Validate/validatePage.d.ts +8 -0
- package/dist/utils/Validate/validateRegex.d.ts +13 -0
- package/dist/utils/Validate/validateRequired.d.ts +9 -0
- package/dist/utils/Validate/validateTextArea.d.ts +13 -0
- package/dist/utils/Validate/validateTime.d.ts +20 -0
- package/dist/utils/canOverrideFieldRequired.d.ts +9 -0
- package/dist/utils/index.d.ts +140 -0
- package/package.json +80 -167
- package/LICENCE.md +0 -21
- package/dist/components/CheckYourAnswers/Answer.js +0 -59
- package/dist/components/CheckYourAnswers/Answer.test.js +0 -142
- package/dist/components/CheckYourAnswers/CheckYourAnswers.js +0 -252
- package/dist/components/CheckYourAnswers/CheckYourAnswers.scss +0 -43
- package/dist/components/CheckYourAnswers/CheckYourAnswers.stories.mdx +0 -409
- package/dist/components/CheckYourAnswers/CheckYourAnswers.test.js +0 -603
- package/dist/components/CheckYourAnswers/index.js +0 -10
- package/dist/components/CollectionPage/CollectionPage.js +0 -178
- package/dist/components/CollectionPage/CollectionPage.test.js +0 -507
- package/dist/components/CollectionPage/index.js +0 -10
- package/dist/components/CollectionSummary/BannerStrip.js +0 -65
- package/dist/components/CollectionSummary/BannerStrip.scss +0 -60
- package/dist/components/CollectionSummary/BannerStrip.test.js +0 -167
- package/dist/components/CollectionSummary/CollectionSummary.js +0 -362
- package/dist/components/CollectionSummary/CollectionSummary.scss +0 -26
- package/dist/components/CollectionSummary/CollectionSummary.test.js +0 -368
- package/dist/components/CollectionSummary/Confirmation.js +0 -65
- package/dist/components/CollectionSummary/Confirmation.scss +0 -26
- package/dist/components/CollectionSummary/Confirmation.test.js +0 -109
- package/dist/components/CollectionSummary/RenderListView.js +0 -162
- package/dist/components/CollectionSummary/RenderListView.scss +0 -295
- package/dist/components/CollectionSummary/RenderListView.test.js +0 -303
- package/dist/components/CollectionSummary/SummaryCard.js +0 -277
- package/dist/components/CollectionSummary/SummaryCard.scss +0 -114
- package/dist/components/CollectionSummary/SummaryCard.test.js +0 -1442
- package/dist/components/CollectionSummary/SummaryCardButtons.js +0 -76
- package/dist/components/CollectionSummary/SummaryCardButtons.test.js +0 -87
- package/dist/components/CollectionSummary/SummaryCardDetails.js +0 -206
- package/dist/components/CollectionSummary/SummaryCardDetails.scss +0 -216
- package/dist/components/CollectionSummary/SummaryCardDetails.test.js +0 -654
- package/dist/components/CollectionSummary/SummaryCardValidationContext.js +0 -79
- package/dist/components/CollectionSummary/SummaryCardValidationContext.test.js +0 -104
- package/dist/components/CollectionSummary/index.js +0 -10
- package/dist/components/FormComponent/Collection.js +0 -234
- package/dist/components/FormComponent/Collection.scss +0 -24
- package/dist/components/FormComponent/Collection.test.js +0 -934
- package/dist/components/FormComponent/Container.js +0 -130
- package/dist/components/FormComponent/Container.scss +0 -15
- package/dist/components/FormComponent/Container.test.js +0 -456
- package/dist/components/FormComponent/FormComponent.js +0 -238
- package/dist/components/FormComponent/FormComponent.stories.mdx +0 -186
- package/dist/components/FormComponent/FormComponent.test.js +0 -436
- package/dist/components/FormComponent/helpers/addLabel.js +0 -25
- package/dist/components/FormComponent/helpers/getComponentDisabled.js +0 -15
- package/dist/components/FormComponent/helpers/getComponentDisabled.test.js +0 -27
- package/dist/components/FormComponent/helpers/getComponentError.js +0 -23
- package/dist/components/FormComponent/helpers/getComponentError.test.js +0 -51
- package/dist/components/FormComponent/helpers/getComponentFieldSet.js +0 -11
- package/dist/components/FormComponent/helpers/getComponentFieldSet.test.js +0 -30
- package/dist/components/FormComponent/helpers/index.js +0 -35
- package/dist/components/FormComponent/index.js +0 -10
- package/dist/components/FormPage/FormPage.js +0 -212
- package/dist/components/FormPage/FormPage.scss +0 -7
- package/dist/components/FormPage/FormPage.stories.mdx +0 -157
- package/dist/components/FormPage/FormPage.test.js +0 -454
- package/dist/components/FormPage/index.js +0 -10
- package/dist/components/FormRenderer/FormRenderer.js +0 -426
- package/dist/components/FormRenderer/FormRenderer.scss +0 -5
- package/dist/components/FormRenderer/FormRenderer.stories.mdx +0 -178
- package/dist/components/FormRenderer/FormRenderer.test.js +0 -799
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/cop-reassign-task-to-rcc.json +0 -446
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-containerised.json +0 -120
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-dependent-component-nested-block.json +0 -113
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-dependent-component-nested.json +0 -106
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-refdata.json +0 -106
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens-target-component-nested.json +0 -99
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-component-show-whens.json +0 -106
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-chained-show-whens-page-hidden.json +0 -113
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-cop-airpax.json +0 -26408
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-cop-mandec.json +0 -9405
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-collection-component-dependent-on-external-data.json +0 -158
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-collection-component.json +0 -86
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-referring-to-collection.json +0 -173
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-referring-to-hidden-collection.json +0 -202
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-show-when-in-component-and-page.json +0 -63
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-with-nested-questions-visible-elsewhere.json +0 -118
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component-with-nested-questions.json +0 -112
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-component.json +0 -58
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-containerised-component.json +0 -97
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-embedded-collection-component.json +0 -83
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-embedded-component.json +0 -55
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-entire-collection.json +0 -114
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-multilevel-containerised-component-leaf-hidden.json +0 -106
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-multilevel-containerised-component.json +0 -106
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-options.json +0 -99
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-collection.json +0 -128
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-component-used-elsewhere.json +0 -109
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page-same-component-reused.json +0 -62
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-hidden-page.json +0 -96
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-nested-answers-hidden-by-option-visible-elsewhere.json +0 -113
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-nested-answers-hidden-by-option.json +0 -112
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-nested-component.json +0 -26003
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-nested-radio-component.json +0 -201
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-page-same-component-reused-one-shown.json +0 -75
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/forms/form-variance-breach.json +0 -4272
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-carrier.json +0 -407
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-change-what-happened-before.json +0 -300
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-airpax-remove-photos-before.json +0 -384
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-business-interests-before.json +0 -140
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-criminality-before.json +0 -186
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-mandec-remove-unspent-convictions-before.json +0 -143
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/cop-variance-breach-with-upload-files.json +0 -1264
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-containerised.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-dependent-component-nested-block.json +0 -10
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-dependent-component-nested.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-refdata.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens-target-component-nested.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-component-show-whens.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-chained-show-whens-page-hidden.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-collection-component-dependent-on-external-data.json +0 -26
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-collection-component.json +0 -15
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-referring-to-collection.json +0 -25
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-referring-to-hidden-collection.json +0 -26
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-show-when-in-component-and-page.json +0 -6
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-with-nested-questions-visible-elsewhere.json +0 -12
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component-with-nested-questions.json +0 -12
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-component.json +0 -5
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-containerised-component.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-embedded-collection-component.json +0 -15
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-embedded-component.json +0 -5
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-entire-collection.json +0 -20
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-multilevel-containerised-component-leaf-hidden.json +0 -14
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-multilevel-containerised-component.json +0 -14
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-options.json +0 -10
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-collection.json +0 -18
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-component-used-elsewhere.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page-same-component-reused.json +0 -6
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-hidden-page.json +0 -9
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-nested-answers-hidden-by-option-visible-elsewhere.json +0 -12
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-nested-answers-hidden-by-option.json +0 -12
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-nested-component.json +0 -63
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-nested-radio-component.json +0 -45
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/data-page-same-component-reused-one-shown.json +0 -8
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/input/reassign-to-rcc.json +0 -72
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-airpax-change-what-happened-after.json +0 -280
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-airpax-remove-photos-after.json +0 -355
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-base-file.json +0 -80
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-business-interests-after.json +0 -122
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-criminality-after.json +0 -86
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/cop-mandec-remove-unspent-convictions-after.json +0 -127
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-containerised-removed.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-dependent-component-nested-block-removed.json +0 -7
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-dependent-component-nested-removed.json +0 -7
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-refdata-removed.json +0 -7
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-removed.json +0 -7
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-component-show-whens-target-component-nested-removed.json +0 -6
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-chained-show-whens-page-hidden-removed.json +0 -6
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-collection-component-dependent-on-external-data-removed.json +0 -23
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-collection-component-removed.json +0 -4
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-referring-to-collection-removed.json +0 -21
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-referring-to-hidden-collection-removed.json +0 -6
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-removed.json +0 -4
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-show-when-in-component-and-page-removed.json +0 -5
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-with-nested-questions-removed.json +0 -10
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-component-with-nested-questions-visible-elsewhere-removed.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-containerised-component-removed.json +0 -10
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-embedded-collection-component-removed.json +0 -4
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-embedded-component-removed.json +0 -4
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-entire-collection-removed.json +0 -3
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-multilevel-containerised-component-leaf-hidden-removed.json +0 -13
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-multilevel-containerised-component-removed.json +0 -10
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-options-removed.json +0 -8
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-collection-removed.json +0 -15
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-component-used-elsewhere-removed.json +0 -5
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-removed.json +0 -4
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-hidden-page-same-component-reused-removed.json +0 -5
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-nested-answers-hidden-by-option-removed.json +0 -11
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-nested-answers-hidden-by-option-visible-elsewhere-removed.json +0 -12
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-nested-component.json +0 -63
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-nested-radio-component-removed.json +0 -45
- package/dist/components/FormRenderer/clear-uncompleted-routes/test-data/output/data-page-same-component-reused-one-shown-removed.json +0 -7
- package/dist/components/FormRenderer/handlers/cyaAction.js +0 -23
- package/dist/components/FormRenderer/handlers/getPageId.js +0 -15
- package/dist/components/FormRenderer/handlers/getPageId.test.js +0 -35
- package/dist/components/FormRenderer/handlers/handlers.test.js +0 -81
- package/dist/components/FormRenderer/handlers/index.js +0 -17
- package/dist/components/FormRenderer/handlers/navigate.js +0 -25
- package/dist/components/FormRenderer/handlers/submissionError.js +0 -18
- package/dist/components/FormRenderer/helpers/canActionProceed.js +0 -27
- package/dist/components/FormRenderer/helpers/canActionProceed.test.js +0 -84
- package/dist/components/FormRenderer/helpers/canCYASubmit.js +0 -17
- package/dist/components/FormRenderer/helpers/canCYASubmit.test.js +0 -75
- package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.js +0 -63
- package/dist/components/FormRenderer/helpers/cleanHiddenNestedData.test.js +0 -191
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.js +0 -338
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutes.test.js +0 -434
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.js +0 -399
- package/dist/components/FormRenderer/helpers/clearOutUncompletedRoutesUtils.test.js +0 -559
- package/dist/components/FormRenderer/helpers/getCYA.js +0 -42
- package/dist/components/FormRenderer/helpers/getCYA.test.js +0 -46
- package/dist/components/FormRenderer/helpers/getFormState.js +0 -25
- package/dist/components/FormRenderer/helpers/getFormState.test.js +0 -60
- package/dist/components/FormRenderer/helpers/getNextPageId.js +0 -76
- package/dist/components/FormRenderer/helpers/getNextPageId.test.js +0 -292
- package/dist/components/FormRenderer/helpers/getPage.js +0 -27
- package/dist/components/FormRenderer/helpers/getPage.test.js +0 -45
- package/dist/components/FormRenderer/helpers/getRelevantPages.js +0 -27
- package/dist/components/FormRenderer/helpers/getRelevantPages.test.js +0 -70
- package/dist/components/FormRenderer/helpers/getSubmissionStatus.js +0 -65
- package/dist/components/FormRenderer/helpers/getSubmissionStatus.test.js +0 -309
- package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.js +0 -201
- package/dist/components/FormRenderer/helpers/getUpdatedSectionStates.test.js +0 -473
- package/dist/components/FormRenderer/helpers/index.js +0 -33
- package/dist/components/FormRenderer/index.js +0 -10
- package/dist/components/FormRenderer/onCYAAction.js +0 -150
- package/dist/components/FormRenderer/onCYAAction.test.js +0 -741
- package/dist/components/FormRenderer/onPageAction.js +0 -227
- package/dist/components/FormRenderer/onPageAction.test.js +0 -960
- package/dist/components/FormRenderer/onTaskAction.js +0 -47
- package/dist/components/FormRenderer/onTaskAction.test.js +0 -247
- package/dist/components/PageActions/ActionButton.js +0 -48
- package/dist/components/PageActions/ActionButton.test.js +0 -73
- package/dist/components/PageActions/PageActions.js +0 -37
- package/dist/components/PageActions/PageActions.stories.mdx +0 -74
- package/dist/components/PageActions/PageActions.test.js +0 -106
- package/dist/components/PageActions/index.js +0 -10
- package/dist/components/SummaryList/GroupAction.js +0 -50
- package/dist/components/SummaryList/GroupAction.test.js +0 -86
- package/dist/components/SummaryList/RowAction.js +0 -48
- package/dist/components/SummaryList/RowAction.test.js +0 -86
- package/dist/components/SummaryList/SummaryList.js +0 -128
- package/dist/components/SummaryList/SummaryList.scss +0 -79
- package/dist/components/SummaryList/SummaryList.stories.mdx +0 -84
- package/dist/components/SummaryList/SummaryList.test.js +0 -504
- package/dist/components/SummaryList/SummaryListHeadingRow.js +0 -39
- package/dist/components/SummaryList/SummaryListHeadingRowWithAction.js +0 -65
- package/dist/components/SummaryList/SummaryListHeadingRowWithAction.scss +0 -38
- package/dist/components/SummaryList/SummaryListRow.js +0 -58
- package/dist/components/SummaryList/SummaryListTitleRow.js +0 -32
- package/dist/components/SummaryList/helpers/getGroupActionAttributes.js +0 -29
- package/dist/components/SummaryList/helpers/getGroupActionAttributes.test.js +0 -72
- package/dist/components/SummaryList/helpers/getRowActionAttributes.js +0 -29
- package/dist/components/SummaryList/helpers/getRowActionAttributes.test.js +0 -72
- package/dist/components/SummaryList/helpers/index.js +0 -14
- package/dist/components/SummaryList/index.js +0 -10
- package/dist/components/TaskList/Task.js +0 -62
- package/dist/components/TaskList/Task.test.js +0 -176
- package/dist/components/TaskList/TaskList.js +0 -175
- package/dist/components/TaskList/TaskList.scss +0 -123
- package/dist/components/TaskList/TaskList.stories.mdx +0 -164
- package/dist/components/TaskList/TaskList.test.js +0 -535
- package/dist/components/TaskList/TaskState.js +0 -37
- package/dist/components/TaskList/TaskState.test.js +0 -95
- package/dist/components/TaskList/index.js +0 -10
- package/dist/components/index.js +0 -56
- package/dist/context/HooksContext/HooksContext.js +0 -122
- package/dist/context/HooksContext/HooksContext.test.js +0 -45
- package/dist/context/HooksContext/index.js +0 -16
- package/dist/context/ValidationContext/ValidationContext.js +0 -98
- package/dist/context/ValidationContext/ValidationContext.test.js +0 -107
- package/dist/context/ValidationContext/index.js +0 -16
- package/dist/context/index.js +0 -21
- package/dist/hooks/index.js +0 -55
- package/dist/hooks/useAxios.js +0 -36
- package/dist/hooks/useGetRequest.js +0 -89
- package/dist/hooks/useHooks.js +0 -15
- package/dist/hooks/useRefData.js +0 -62
- package/dist/hooks/useValidation.js +0 -15
- package/dist/json/actions.json +0 -17
- package/dist/json/actionsNoSave.json +0 -17
- package/dist/json/addressDetails.json +0 -149
- package/dist/json/areYouACivilServant.json +0 -7
- package/dist/json/firstForm.json +0 -94
- package/dist/json/grade.json +0 -108
- package/dist/json/group.data.json +0 -21
- package/dist/json/group.json +0 -402
- package/dist/json/groupOfRow.json +0 -137
- package/dist/json/groupOfRowData.json +0 -15
- package/dist/json/port.json +0 -346
- package/dist/json/saveAndContinue.json +0 -98
- package/dist/json/sublocation.json +0 -859
- package/dist/json/taskList.json +0 -265
- package/dist/json/team.json +0 -17351
- package/dist/json/terminal.json +0 -81
- package/dist/json/userProfile.data.json +0 -21
- package/dist/json/userProfile.json +0 -276
- package/dist/models/CollectionLabels.js +0 -15
- package/dist/models/ComponentTypes.js +0 -58
- package/dist/models/EventTypes.js +0 -16
- package/dist/models/FormPages.js +0 -16
- package/dist/models/FormTypes.js +0 -24
- package/dist/models/HubFormats.js +0 -14
- package/dist/models/PageAction.js +0 -65
- package/dist/models/TaskStates.js +0 -46
- package/dist/models/index.js +0 -77
- package/dist/setupTests.js +0 -54
- package/dist/utils/CheckYourAnswers/getCYAAction.js +0 -44
- package/dist/utils/CheckYourAnswers/getCYAAction.test.js +0 -120
- package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.js +0 -57
- package/dist/utils/CheckYourAnswers/getCYACollectionChangeAction.test.js +0 -162
- package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.js +0 -66
- package/dist/utils/CheckYourAnswers/getCYACollectionDeleteAction.test.js +0 -198
- package/dist/utils/CheckYourAnswers/getCYARow.js +0 -58
- package/dist/utils/CheckYourAnswers/getCYARow.test.js +0 -373
- package/dist/utils/CheckYourAnswers/getCYARowForGroup.js +0 -69
- package/dist/utils/CheckYourAnswers/getCYARowForGroup.test.js +0 -70
- package/dist/utils/CheckYourAnswers/getCYARowsForCollection.js +0 -71
- package/dist/utils/CheckYourAnswers/getCYARowsForCollection.test.js +0 -285
- package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.js +0 -237
- package/dist/utils/CheckYourAnswers/getCYARowsForCollectionPage.test.js +0 -844
- package/dist/utils/CheckYourAnswers/getCYARowsForContainer.js +0 -45
- package/dist/utils/CheckYourAnswers/getCYARowsForContainer.test.js +0 -535
- package/dist/utils/CheckYourAnswers/getCYARowsForPage.js +0 -72
- package/dist/utils/CheckYourAnswers/getCYARowsForPage.test.js +0 -343
- package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.js +0 -42
- package/dist/utils/CheckYourAnswers/getSummaryListRowForDetails.test.js +0 -56
- package/dist/utils/CheckYourAnswers/index.js +0 -15
- package/dist/utils/CheckYourAnswers/showComponentCYA.js +0 -53
- package/dist/utils/CheckYourAnswers/showComponentCYA.test.js +0 -149
- package/dist/utils/CollectionPage/addCollectionPageEntry.js +0 -23
- package/dist/utils/CollectionPage/addCollectionPageEntry.test.js +0 -17
- package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.js +0 -26
- package/dist/utils/CollectionPage/duplicateCollectionPageActiveEntry.test.js +0 -70
- package/dist/utils/CollectionPage/duplicateCollectionPageEntry.js +0 -51
- package/dist/utils/CollectionPage/duplicateCollectionPageEntry.test.js +0 -125
- package/dist/utils/CollectionPage/getCollectionPageActiveId.js +0 -24
- package/dist/utils/CollectionPage/getCollectionPageActiveId.test.js +0 -26
- package/dist/utils/CollectionPage/getCollectionPageActiveIndex.js +0 -44
- package/dist/utils/CollectionPage/getCollectionPageActiveIndex.test.js +0 -88
- package/dist/utils/CollectionPage/getCollectionPageData.js +0 -53
- package/dist/utils/CollectionPage/getCollectionPageData.test.js +0 -103
- package/dist/utils/CollectionPage/getErrorsForCollection.js +0 -55
- package/dist/utils/CollectionPage/getErrorsForCollection.test.js +0 -154
- package/dist/utils/CollectionPage/getQuickEditPage.js +0 -122
- package/dist/utils/CollectionPage/getQuickEditPage.test.js +0 -143
- package/dist/utils/CollectionPage/index.js +0 -33
- package/dist/utils/CollectionPage/mergeCollectionPages.js +0 -128
- package/dist/utils/CollectionPage/mergeCollectionPages.test.js +0 -198
- package/dist/utils/CollectionPage/removeCollectionPageEntry.js +0 -36
- package/dist/utils/CollectionPage/removeCollectionPageEntry.test.js +0 -62
- package/dist/utils/CollectionPage/setCollectionPageData.js +0 -60
- package/dist/utils/CollectionPage/setCollectionPageData.test.js +0 -182
- package/dist/utils/Component/addShowWhen.js +0 -43
- package/dist/utils/Component/addShowWhen.test.js +0 -217
- package/dist/utils/Component/applyToComponentTree.js +0 -68
- package/dist/utils/Component/applyToComponentTree.test.js +0 -125
- package/dist/utils/Component/cleanAttributes.js +0 -42
- package/dist/utils/Component/cleanAttributes.test.js +0 -67
- package/dist/utils/Component/elevateNestedComponents.js +0 -58
- package/dist/utils/Component/elevateNestedComponents.test.js +0 -305
- package/dist/utils/Component/getComponent.js +0 -305
- package/dist/utils/Component/getComponentTests/getComponent.autocomplete.test.js +0 -73
- package/dist/utils/Component/getComponentTests/getComponent.calculation.test.js +0 -251
- package/dist/utils/Component/getComponentTests/getComponent.checkboxes.test.js +0 -156
- package/dist/utils/Component/getComponentTests/getComponent.date.test.js +0 -104
- package/dist/utils/Component/getComponentTests/getComponent.details.test.js +0 -56
- package/dist/utils/Component/getComponentTests/getComponent.email.test.js +0 -60
- package/dist/utils/Component/getComponentTests/getComponent.file.test.js +0 -60
- package/dist/utils/Component/getComponentTests/getComponent.heading.test.js +0 -31
- package/dist/utils/Component/getComponentTests/getComponent.html.test.js +0 -42
- package/dist/utils/Component/getComponentTests/getComponent.insetText.test.js +0 -29
- package/dist/utils/Component/getComponentTests/getComponent.list.test.js +0 -47
- package/dist/utils/Component/getComponentTests/getComponent.multifile.test.js +0 -66
- package/dist/utils/Component/getComponentTests/getComponent.nested.test.js +0 -211
- package/dist/utils/Component/getComponentTests/getComponent.paragraph.test.js +0 -46
- package/dist/utils/Component/getComponentTests/getComponent.phoneNumber.test.js +0 -60
- package/dist/utils/Component/getComponentTests/getComponent.radios.test.js +0 -221
- package/dist/utils/Component/getComponentTests/getComponent.select.test.js +0 -62
- package/dist/utils/Component/getComponentTests/getComponent.text.test.js +0 -60
- package/dist/utils/Component/getComponentTests/getComponent.textArea.test.js +0 -104
- package/dist/utils/Component/getComponentTests/getComponent.time.test.js +0 -80
- package/dist/utils/Component/getComponentTests/getComponent.unknown.test.js +0 -14
- package/dist/utils/Component/getComponentTests/getComponent.warningText.test.js +0 -29
- package/dist/utils/Component/getDefaultValue.js +0 -22
- package/dist/utils/Component/getDefaultValue.test.js +0 -62
- package/dist/utils/Component/getDefaultValueFromConfig.js +0 -106
- package/dist/utils/Component/getDefaultValueFromConfig.test.js +0 -141
- package/dist/utils/Component/index.js +0 -29
- package/dist/utils/Component/isEditable.js +0 -13
- package/dist/utils/Component/isEditable.test.js +0 -42
- package/dist/utils/Component/optionIsSelected.js +0 -25
- package/dist/utils/Component/optionIsSelected.test.js +0 -69
- package/dist/utils/Component/setupContainerComponentsPath.js +0 -35
- package/dist/utils/Component/setupContainerComponentsPath.test.js +0 -79
- package/dist/utils/Component/showComponent.js +0 -25
- package/dist/utils/Component/showComponent.test.js +0 -157
- package/dist/utils/Component/wrapInFormGroup.js +0 -26
- package/dist/utils/Condition/index.js +0 -17
- package/dist/utils/Condition/meetsAllConditions.js +0 -44
- package/dist/utils/Condition/meetsAllConditions.test.js +0 -109
- package/dist/utils/Condition/meetsCondition.js +0 -165
- package/dist/utils/Condition/meetsCondition.test.js +0 -899
- package/dist/utils/Condition/meetsOneCondition.js +0 -32
- package/dist/utils/Condition/meetsOneCondition.test.js +0 -101
- package/dist/utils/Condition/setupConditions.js +0 -36
- package/dist/utils/Condition/setupConditions.test.js +0 -34
- package/dist/utils/Container/getEditableComponents.js +0 -29
- package/dist/utils/Container/getEditableComponents.test.js +0 -134
- package/dist/utils/Container/index.js +0 -17
- package/dist/utils/Container/setupNesting.js +0 -53
- package/dist/utils/Container/setupNesting.test.js +0 -143
- package/dist/utils/Container/showContainer.js +0 -52
- package/dist/utils/Container/showContainer.test.js +0 -179
- package/dist/utils/Data/applyFormula.js +0 -90
- package/dist/utils/Data/applyFormula.test.js +0 -264
- package/dist/utils/Data/deleteValues.js +0 -19
- package/dist/utils/Data/deleteValues.test.js +0 -58
- package/dist/utils/Data/getAutocompleteSource.js +0 -87
- package/dist/utils/Data/getAutocompleteSource.test.js +0 -335
- package/dist/utils/Data/getDataPath.js +0 -66
- package/dist/utils/Data/getDataPath.test.js +0 -49
- package/dist/utils/Data/getOptions.js +0 -86
- package/dist/utils/Data/getOptions.test.js +0 -279
- package/dist/utils/Data/getSourceData.js +0 -44
- package/dist/utils/Data/getSourceData.test.js +0 -158
- package/dist/utils/Data/index.js +0 -35
- package/dist/utils/Data/nestInRefdataOptions.js +0 -47
- package/dist/utils/Data/nestInRefdataOptions.test.js +0 -237
- package/dist/utils/Data/refDataToOptions.js +0 -44
- package/dist/utils/Data/refDataToOptions.test.js +0 -197
- package/dist/utils/Data/setDataItem.js +0 -26
- package/dist/utils/Data/setDataItem.test.js +0 -136
- package/dist/utils/Data/setupFormData.js +0 -49
- package/dist/utils/Data/setupFormData.test.js +0 -215
- package/dist/utils/Data/setupRefDataUrlForComponent.js +0 -44
- package/dist/utils/Data/setupRefDataUrlForComponent.test.js +0 -150
- package/dist/utils/FormPage/applyConditionalProperties.js +0 -34
- package/dist/utils/FormPage/applyConditionalProperties.test.js +0 -61
- package/dist/utils/FormPage/getConditionalText.js +0 -55
- package/dist/utils/FormPage/getConditionalText.test.js +0 -163
- package/dist/utils/FormPage/getFormPage.js +0 -54
- package/dist/utils/FormPage/getFormPage.test.js +0 -206
- package/dist/utils/FormPage/getFormPages.js +0 -30
- package/dist/utils/FormPage/getFormPages.test.js +0 -97
- package/dist/utils/FormPage/getPageActions.js +0 -58
- package/dist/utils/FormPage/getPageActions.test.js +0 -115
- package/dist/utils/FormPage/getParagraphFromText.js +0 -21
- package/dist/utils/FormPage/getParagraphFromText.test.js +0 -28
- package/dist/utils/FormPage/index.js +0 -24
- package/dist/utils/FormPage/showFormPage.js +0 -52
- package/dist/utils/FormPage/showFormPage.test.js +0 -181
- package/dist/utils/FormPage/showFormPageCYA.js +0 -23
- package/dist/utils/FormPage/showFormPageCYA.test.js +0 -29
- package/dist/utils/FormPage/useComponent.js +0 -83
- package/dist/utils/FormPage/useComponent.test.js +0 -216
- package/dist/utils/Format/formatData.js +0 -27
- package/dist/utils/Format/formatData.test.js +0 -46
- package/dist/utils/Format/formatDataForComponent.js +0 -35
- package/dist/utils/Format/formatDataForComponent.test.js +0 -114
- package/dist/utils/Format/formatDataForForm.js +0 -27
- package/dist/utils/Format/formatDataForForm.test.js +0 -79
- package/dist/utils/Format/formatDataForPage.js +0 -31
- package/dist/utils/Format/formatDataForPage.test.js +0 -94
- package/dist/utils/Format/index.js +0 -21
- package/dist/utils/Hub/getFormHub.js +0 -40
- package/dist/utils/Hub/getFormHub.test.js +0 -105
- package/dist/utils/Hub/index.js +0 -15
- package/dist/utils/Meta/constants.js +0 -9
- package/dist/utils/Meta/documents/getDocuments.js +0 -15
- package/dist/utils/Meta/documents/getDocuments.test.js +0 -46
- package/dist/utils/Meta/documents/index.js +0 -19
- package/dist/utils/Meta/documents/setDocumentsForField.js +0 -30
- package/dist/utils/Meta/documents/setDocumentsForField.test.js +0 -97
- package/dist/utils/Meta/index.js +0 -17
- package/dist/utils/Operate/checkValueIsTruthy.js +0 -29
- package/dist/utils/Operate/checkValueIsTruthy.test.js +0 -43
- package/dist/utils/Operate/deleteValueInFormData.js +0 -27
- package/dist/utils/Operate/deleteValueInFormData.test.js +0 -61
- package/dist/utils/Operate/doesContainValue.js +0 -35
- package/dist/utils/Operate/doesContainValue.test.js +0 -76
- package/dist/utils/Operate/getFirstOf.js +0 -31
- package/dist/utils/Operate/getFirstOf.test.js +0 -87
- package/dist/utils/Operate/getIndexOfMatchingValueIn.js +0 -68
- package/dist/utils/Operate/getIndexOfMatchingValueIn.test.js +0 -158
- package/dist/utils/Operate/getLength.js +0 -51
- package/dist/utils/Operate/getLength.test.js +0 -90
- package/dist/utils/Operate/index.js +0 -13
- package/dist/utils/Operate/persistValueInFormData.js +0 -40
- package/dist/utils/Operate/persistValueInFormData.test.js +0 -118
- package/dist/utils/Operate/runPageOperations.js +0 -75
- package/dist/utils/Operate/runPageOperations.test.js +0 -105
- package/dist/utils/Operate/setValueInFormData.js +0 -22
- package/dist/utils/Operate/setValueInFormData.test.js +0 -45
- package/dist/utils/Operate/shouldRun.js +0 -57
- package/dist/utils/Operate/shouldRun.test.js +0 -65
- package/dist/utils/Validate/additional/conditionallyPermittedChange.js +0 -26
- package/dist/utils/Validate/additional/conditionallyPermittedChange.test.js +0 -34
- package/dist/utils/Validate/additional/conditionallyRequired.js +0 -24
- package/dist/utils/Validate/additional/conditionallyRequired.test.js +0 -74
- package/dist/utils/Validate/additional/index.js +0 -74
- package/dist/utils/Validate/additional/index.test.js +0 -130
- package/dist/utils/Validate/additional/mustBeAfter.js +0 -34
- package/dist/utils/Validate/additional/mustBeAfter.test.js +0 -109
- package/dist/utils/Validate/additional/mustBeBefore.js +0 -34
- package/dist/utils/Validate/additional/mustBeBefore.test.js +0 -77
- package/dist/utils/Validate/additional/mustBeEarlierDateTime.js +0 -57
- package/dist/utils/Validate/additional/mustBeEarlierDateTime.test.js +0 -128
- package/dist/utils/Validate/additional/mustBeGreaterThan.js +0 -22
- package/dist/utils/Validate/additional/mustBeGreaterThan.test.js +0 -57
- package/dist/utils/Validate/additional/mustBeInTheFuture.js +0 -33
- package/dist/utils/Validate/additional/mustBeInTheFuture.test.js +0 -32
- package/dist/utils/Validate/additional/mustBeInThePast.js +0 -36
- package/dist/utils/Validate/additional/mustBeInThePast.test.js +0 -32
- package/dist/utils/Validate/additional/mustBeLessThan.js +0 -22
- package/dist/utils/Validate/additional/mustBeLessThan.test.js +0 -53
- package/dist/utils/Validate/additional/mustBeLongerThan.js +0 -23
- package/dist/utils/Validate/additional/mustBeLongerThan.test.js +0 -49
- package/dist/utils/Validate/additional/mustBeNumbersOnly.js +0 -24
- package/dist/utils/Validate/additional/mustBeNumbersOnly.test.js +0 -45
- package/dist/utils/Validate/additional/mustBeOneOf.js +0 -22
- package/dist/utils/Validate/additional/mustBeOneOf.test.js +0 -37
- package/dist/utils/Validate/additional/mustBeShorterThan.js +0 -23
- package/dist/utils/Validate/additional/mustBeShorterThan.test.js +0 -49
- package/dist/utils/Validate/additional/mustBeUniqueInCollection.js +0 -40
- package/dist/utils/Validate/additional/mustBeUniqueInCollection.test.js +0 -163
- package/dist/utils/Validate/additional/mustEnterAtLeastOne.js +0 -26
- package/dist/utils/Validate/additional/mustEnterAtLeastOne.test.js +0 -37
- package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.js +0 -19
- package/dist/utils/Validate/additional/mustHaveLessThanDecimalPlaces.test.js +0 -37
- package/dist/utils/Validate/additional/mustNotContainSql.js +0 -19
- package/dist/utils/Validate/additional/mustNotContainSql.test.js +0 -33
- package/dist/utils/Validate/additional/mustSelectOnlyOne.js +0 -29
- package/dist/utils/Validate/additional/mustSelectOnlyOne.test.js +0 -55
- package/dist/utils/Validate/additional/utils.js +0 -35
- package/dist/utils/Validate/index.js +0 -33
- package/dist/utils/Validate/validateCollection.js +0 -50
- package/dist/utils/Validate/validateCollection.test.js +0 -134
- package/dist/utils/Validate/validateComponent.js +0 -126
- package/dist/utils/Validate/validateComponent.test.js +0 -435
- package/dist/utils/Validate/validateContainer.js +0 -52
- package/dist/utils/Validate/validateContainer.test.js +0 -115
- package/dist/utils/Validate/validateDate.js +0 -112
- package/dist/utils/Validate/validateDate.test.js +0 -133
- package/dist/utils/Validate/validateEmail.js +0 -45
- package/dist/utils/Validate/validateEmail.test.js +0 -78
- package/dist/utils/Validate/validateMultifile.js +0 -29
- package/dist/utils/Validate/validateMultifile.test.js +0 -46
- package/dist/utils/Validate/validateOnPageLoad.js +0 -24
- package/dist/utils/Validate/validateOnPageLoad.test.js +0 -89
- package/dist/utils/Validate/validatePage.js +0 -56
- package/dist/utils/Validate/validatePage.test.js +0 -795
- package/dist/utils/Validate/validateRegex.js +0 -41
- package/dist/utils/Validate/validateRegex.test.js +0 -43
- package/dist/utils/Validate/validateRequired.js +0 -37
- package/dist/utils/Validate/validateRequired.test.js +0 -64
- package/dist/utils/Validate/validateTextArea.js +0 -36
- package/dist/utils/Validate/validateTextArea.test.js +0 -71
- package/dist/utils/Validate/validateTime.js +0 -76
- package/dist/utils/Validate/validateTime.test.js +0 -116
- package/dist/utils/canOverrideFieldRequired.js +0 -23
- package/dist/utils/index.js +0 -42
|
@@ -1,799 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _react = require("@testing-library/react");
|
|
4
|
-
var _axios = _interopRequireDefault(require("axios"));
|
|
5
|
-
var _axiosMockAdapter = _interopRequireDefault(require("axios-mock-adapter"));
|
|
6
|
-
var _react2 = _interopRequireDefault(require("react"));
|
|
7
|
-
var _reactDom = require("react-dom");
|
|
8
|
-
var _testUtils = require("react-dom/test-utils");
|
|
9
|
-
var _models = require("../../models");
|
|
10
|
-
var _CheckYourAnswers = require("../CheckYourAnswers/CheckYourAnswers");
|
|
11
|
-
var _TaskList = require("../TaskList/TaskList");
|
|
12
|
-
var _FormRenderer = _interopRequireWildcard(require("./FormRenderer"));
|
|
13
|
-
var _areYouACivilServant = _interopRequireDefault(require("../../json/areYouACivilServant.json"));
|
|
14
|
-
var _grade = _interopRequireDefault(require("../../json/grade.json"));
|
|
15
|
-
var _team = _interopRequireDefault(require("../../json/team.json"));
|
|
16
|
-
var _userProfileData = _interopRequireDefault(require("../../json/userProfile.data.json"));
|
|
17
|
-
var _userProfile = _interopRequireDefault(require("../../json/userProfile.json"));
|
|
18
|
-
var _taskList = _interopRequireDefault(require("../../json/taskList.json"));
|
|
19
|
-
var _firstForm = _interopRequireDefault(require("../../json/firstForm.json"));
|
|
20
|
-
var _jsxRuntime = require("react/jsx-runtime");
|
|
21
|
-
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
22
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
23
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
24
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
25
|
-
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
26
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
27
|
-
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } // Global imports
|
|
28
|
-
// Local imports
|
|
29
|
-
// JSON
|
|
30
|
-
const setDate = (element, date) => {
|
|
31
|
-
const items = element.children;
|
|
32
|
-
_react.fireEvent.change(items[0].childNodes[0].childNodes[1], {
|
|
33
|
-
target: {
|
|
34
|
-
name: 'date-day',
|
|
35
|
-
value: date[0]
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
_react.fireEvent.change(items[1].childNodes[0].childNodes[1], {
|
|
39
|
-
target: {
|
|
40
|
-
name: 'date-month',
|
|
41
|
-
value: date[1]
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
_react.fireEvent.change(items[2].childNodes[0].childNodes[1], {
|
|
45
|
-
target: {
|
|
46
|
-
name: 'date-year',
|
|
47
|
-
value: date[2]
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
};
|
|
51
|
-
const sleep = ms => new Promise(resolve => {
|
|
52
|
-
setTimeout(resolve, ms);
|
|
53
|
-
});
|
|
54
|
-
describe('components', () => {
|
|
55
|
-
describe('FormRenderer', () => {
|
|
56
|
-
const mockAxios = new _axiosMockAdapter.default(_axios.default);
|
|
57
|
-
let container = null;
|
|
58
|
-
const refDataUrl = suffix => "".concat(_userProfileData.default.urls.refData, "/").concat(suffix);
|
|
59
|
-
beforeEach(() => {
|
|
60
|
-
container = document.createElement('div');
|
|
61
|
-
document.body.appendChild(container);
|
|
62
|
-
mockAxios.reset();
|
|
63
|
-
mockAxios.onGet(refDataUrl('areYouACivilServant')).reply(200, _areYouACivilServant.default);
|
|
64
|
-
mockAxios.onGet(refDataUrl('grade')).reply(200, _grade.default);
|
|
65
|
-
mockAxios.onGet(refDataUrl('team')).reply(200, _team.default);
|
|
66
|
-
});
|
|
67
|
-
afterEach(() => {
|
|
68
|
-
(0, _reactDom.unmountComponentAtNode)(container);
|
|
69
|
-
container.remove();
|
|
70
|
-
container = null;
|
|
71
|
-
});
|
|
72
|
-
const checkForm = formContainer => {
|
|
73
|
-
const formWrapper = formContainer;
|
|
74
|
-
const form = formWrapper.childNodes[0];
|
|
75
|
-
expect(form.tagName).toEqual('DIV');
|
|
76
|
-
expect(form.classList).toContain(_FormRenderer.DEFAULT_CLASS);
|
|
77
|
-
return form;
|
|
78
|
-
};
|
|
79
|
-
const getChangeLink = summaryList => {
|
|
80
|
-
const [,, actions] = summaryList.childNodes[0].childNodes[0].childNodes;
|
|
81
|
-
return actions.childNodes[0];
|
|
82
|
-
};
|
|
83
|
-
const getContinueButton = page => page.childNodes[page.childNodes.length - 1].childNodes[0].childNodes[0];
|
|
84
|
-
const getCancelButton = page => page.childNodes[page.childNodes.length - 1].childNodes[1].childNodes[0];
|
|
85
|
-
it('should start on the hub page correctly and display the title', async () => {
|
|
86
|
-
await (0, _testUtils.act)(async () => {
|
|
87
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
|
|
88
|
-
data: _userProfileData.default
|
|
89
|
-
})), container);
|
|
90
|
-
});
|
|
91
|
-
const form = checkForm(container);
|
|
92
|
-
expect(form.childNodes.length).toEqual(2); // Title + Hub page (= CYA)
|
|
93
|
-
const title = form.childNodes[0];
|
|
94
|
-
expect(title.tagName).toEqual('H1');
|
|
95
|
-
expect(title.textContent).toEqual(_userProfile.default.title);
|
|
96
|
-
const hub = form.childNodes[1];
|
|
97
|
-
expect(hub.tagName).toEqual('DIV');
|
|
98
|
-
expect(hub.classList).toContain(_CheckYourAnswers.DEFAULT_CLASS);
|
|
99
|
-
});
|
|
100
|
-
it('should fire the onFormLoad method passed in the hooks', async () => {
|
|
101
|
-
let onFormLoadCalled = false;
|
|
102
|
-
const ON_FORM_LOAD = () => {
|
|
103
|
-
onFormLoadCalled = true;
|
|
104
|
-
};
|
|
105
|
-
const HOOKS = {
|
|
106
|
-
onFormLoad: ON_FORM_LOAD
|
|
107
|
-
};
|
|
108
|
-
await (0, _testUtils.act)(async () => {
|
|
109
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
|
|
110
|
-
data: _userProfileData.default,
|
|
111
|
-
hooks: HOOKS
|
|
112
|
-
})), container);
|
|
113
|
-
});
|
|
114
|
-
expect(onFormLoadCalled).toBeTruthy();
|
|
115
|
-
});
|
|
116
|
-
it('should navigate to the first editable page', async () => {
|
|
117
|
-
const ON_PAGE_CHANGE_CALLS = [];
|
|
118
|
-
const ON_PAGE_CHANGE = pageId => {
|
|
119
|
-
ON_PAGE_CHANGE_CALLS.push(pageId);
|
|
120
|
-
};
|
|
121
|
-
const HOOKS = {
|
|
122
|
-
onPageChange: ON_PAGE_CHANGE
|
|
123
|
-
};
|
|
124
|
-
await (0, _testUtils.act)(async () => {
|
|
125
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
|
|
126
|
-
data: _userProfileData.default,
|
|
127
|
-
hooks: HOOKS
|
|
128
|
-
})), container);
|
|
129
|
-
});
|
|
130
|
-
const form = checkForm(container);
|
|
131
|
-
const hub = form.childNodes[1]; // Hub = CYA
|
|
132
|
-
const [,, civilServantList] = hub.childNodes;
|
|
133
|
-
const link = getChangeLink(civilServantList);
|
|
134
|
-
expect(ON_PAGE_CHANGE_CALLS.length).toEqual(0);
|
|
135
|
-
_react.fireEvent.click(link, {});
|
|
136
|
-
expect(ON_PAGE_CHANGE_CALLS.length).toEqual(1);
|
|
137
|
-
expect(ON_PAGE_CHANGE_CALLS[0]).toEqual(_userProfile.default.pages[1].id);
|
|
138
|
-
|
|
139
|
-
// The form layout should have changed to the current page.
|
|
140
|
-
expect(form.childNodes.length).toEqual(1); // Just the page.
|
|
141
|
-
const page = form.childNodes[0];
|
|
142
|
-
const pageHeading = page.childNodes[0];
|
|
143
|
-
expect(pageHeading.tagName).toEqual('H1');
|
|
144
|
-
expect(pageHeading.textContent).toEqual(_userProfile.default.pages[1].title);
|
|
145
|
-
});
|
|
146
|
-
it('should handle a page submission', async () => {
|
|
147
|
-
const ON_SUBMIT_CALLS = [];
|
|
148
|
-
const ON_SUBMIT = (type, payload, onSuccess, onError, fieldName, fieldValue) => {
|
|
149
|
-
ON_SUBMIT_CALLS.push({
|
|
150
|
-
type,
|
|
151
|
-
payload,
|
|
152
|
-
onSuccess,
|
|
153
|
-
onError,
|
|
154
|
-
fieldName,
|
|
155
|
-
fieldValue
|
|
156
|
-
});
|
|
157
|
-
onSuccess();
|
|
158
|
-
};
|
|
159
|
-
const HOOKS = {
|
|
160
|
-
onSubmit: ON_SUBMIT
|
|
161
|
-
};
|
|
162
|
-
await (0, _testUtils.act)(async () => {
|
|
163
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
|
|
164
|
-
data: _userProfileData.default,
|
|
165
|
-
hooks: HOOKS,
|
|
166
|
-
type: _models.FormTypes.HUB
|
|
167
|
-
})), container);
|
|
168
|
-
});
|
|
169
|
-
const form = checkForm(container);
|
|
170
|
-
|
|
171
|
-
// Navigate to the "Are you a civil servant?" page.
|
|
172
|
-
const hub = form.childNodes[1]; // Hub = CYA
|
|
173
|
-
const [,, civilServantList] = hub.childNodes;
|
|
174
|
-
const link = getChangeLink(civilServantList);
|
|
175
|
-
_react.fireEvent.click(link, {});
|
|
176
|
-
|
|
177
|
-
// Should already be answered "Yes", but select "No, I'm a contractor" option to generate patch
|
|
178
|
-
// and then click "Continue".
|
|
179
|
-
_react.fireEvent.click(_react.screen.getByText("No, I'm a contractor"));
|
|
180
|
-
const page = form.childNodes[0];
|
|
181
|
-
const continueButton = getContinueButton(page);
|
|
182
|
-
expect(ON_SUBMIT_CALLS.length).toEqual(0);
|
|
183
|
-
_react.fireEvent.click(continueButton, {});
|
|
184
|
-
expect(ON_SUBMIT_CALLS.length).toEqual(1);
|
|
185
|
-
expect(ON_SUBMIT_CALLS[0].type).toEqual(_models.PageAction.TYPES.SUBMIT);
|
|
186
|
-
expect(ON_SUBMIT_CALLS[0].payload.areYouACivilServant).toEqual('no-contractor');
|
|
187
|
-
expect(ON_SUBMIT_CALLS[0].fieldName).toEqual('Are you a civil servant?');
|
|
188
|
-
expect(ON_SUBMIT_CALLS[0].fieldValue).toEqual("No, I'm a contractor");
|
|
189
|
-
|
|
190
|
-
// And we should be back on the hub.
|
|
191
|
-
expect(form.childNodes.length).toEqual(2); // Title + Hub page (= CYA)
|
|
192
|
-
const title = form.childNodes[0];
|
|
193
|
-
expect(title.tagName).toEqual('H1');
|
|
194
|
-
expect(title.textContent).toEqual(_userProfile.default.title);
|
|
195
|
-
});
|
|
196
|
-
it('should handle a page submission error', async () => {
|
|
197
|
-
const ON_SUBMIT_CALLS = [];
|
|
198
|
-
const ON_SUBMIT = (type, payload, onSuccess, onError) => {
|
|
199
|
-
ON_SUBMIT_CALLS.push({
|
|
200
|
-
type,
|
|
201
|
-
payload,
|
|
202
|
-
onSuccess,
|
|
203
|
-
onError
|
|
204
|
-
});
|
|
205
|
-
onError([{
|
|
206
|
-
id: 'unknown',
|
|
207
|
-
error: 'Something went wrong'
|
|
208
|
-
}]);
|
|
209
|
-
};
|
|
210
|
-
const HOOKS = {
|
|
211
|
-
onSubmit: ON_SUBMIT,
|
|
212
|
-
onAction: (formData, patch) => ({
|
|
213
|
-
formData,
|
|
214
|
-
patch
|
|
215
|
-
})
|
|
216
|
-
};
|
|
217
|
-
await (0, _testUtils.act)(async () => {
|
|
218
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
|
|
219
|
-
data: _userProfileData.default,
|
|
220
|
-
hooks: HOOKS
|
|
221
|
-
})), container);
|
|
222
|
-
});
|
|
223
|
-
const form = checkForm(container);
|
|
224
|
-
|
|
225
|
-
// Navigate to the "Are you a civil servant?" page.
|
|
226
|
-
const hub = form.childNodes[1]; // Hub = CYA
|
|
227
|
-
const [,, civilServantList] = hub.childNodes;
|
|
228
|
-
const link = getChangeLink(civilServantList);
|
|
229
|
-
_react.fireEvent.click(link, {});
|
|
230
|
-
|
|
231
|
-
// Should already be answered "Yes", so simply click "Continue".
|
|
232
|
-
const page = form.childNodes[0];
|
|
233
|
-
const continueButton = getContinueButton(page);
|
|
234
|
-
expect(ON_SUBMIT_CALLS.length).toEqual(0);
|
|
235
|
-
_react.fireEvent.click(continueButton, {});
|
|
236
|
-
expect(ON_SUBMIT_CALLS.length).toEqual(1);
|
|
237
|
-
expect(ON_SUBMIT_CALLS[0].type).toEqual(_models.PageAction.TYPES.SUBMIT);
|
|
238
|
-
expect(ON_SUBMIT_CALLS[0].payload.areYouACivilServant).toEqual('yes');
|
|
239
|
-
|
|
240
|
-
// And we should be kept on the same page.
|
|
241
|
-
expect(form.childNodes.length).toEqual(1); // Just the page.
|
|
242
|
-
const pageHeading = form.childNodes[0].childNodes[1];
|
|
243
|
-
expect(pageHeading.tagName).toEqual('H1');
|
|
244
|
-
expect(pageHeading.textContent).toEqual(_userProfile.default.pages[1].title);
|
|
245
|
-
});
|
|
246
|
-
it('should handle a page submission once regardless of how many times page action is clicked', async () => {
|
|
247
|
-
const ON_PAGE_CHANGE_CALLS = [];
|
|
248
|
-
const ON_PAGE_CHANGE = pageId => {
|
|
249
|
-
ON_PAGE_CHANGE_CALLS.push(pageId);
|
|
250
|
-
};
|
|
251
|
-
const ON_SUBMIT_CALLS = [];
|
|
252
|
-
const ON_SUBMIT = async (type, payload, onSuccess, onError, fieldName, fieldValue) => {
|
|
253
|
-
ON_SUBMIT_CALLS.push({
|
|
254
|
-
type,
|
|
255
|
-
payload,
|
|
256
|
-
onSuccess,
|
|
257
|
-
onError,
|
|
258
|
-
fieldName,
|
|
259
|
-
fieldValue
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
// mock a delay when submitting to the backend
|
|
263
|
-
await sleep(2000);
|
|
264
|
-
onSuccess();
|
|
265
|
-
};
|
|
266
|
-
const HOOKS = {
|
|
267
|
-
onSubmit: ON_SUBMIT,
|
|
268
|
-
onPageChange: ON_PAGE_CHANGE
|
|
269
|
-
};
|
|
270
|
-
(0, _testUtils.act)(() => {
|
|
271
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _firstForm.default), {}, {
|
|
272
|
-
hooks: HOOKS,
|
|
273
|
-
type: _models.FormTypes.CYA
|
|
274
|
-
})), container);
|
|
275
|
-
});
|
|
276
|
-
const [,,,,, continueButtonGroup] = container.childNodes[0].childNodes[0].childNodes;
|
|
277
|
-
|
|
278
|
-
// go to first question page
|
|
279
|
-
const continueFormButton = continueButtonGroup.childNodes[0];
|
|
280
|
-
_react.fireEvent.click(continueFormButton);
|
|
281
|
-
const innerDiv = container.childNodes[0].childNodes[0];
|
|
282
|
-
|
|
283
|
-
// enter a value in the input field
|
|
284
|
-
const firstNameInput = innerDiv.childNodes[1].childNodes[2];
|
|
285
|
-
const EVENT = {
|
|
286
|
-
target: {
|
|
287
|
-
name: firstNameInput.id,
|
|
288
|
-
value: 'abc'
|
|
289
|
-
}
|
|
290
|
-
};
|
|
291
|
-
_react.fireEvent.change(firstNameInput, EVENT);
|
|
292
|
-
const submitButton = innerDiv.childNodes[2].childNodes[0];
|
|
293
|
-
|
|
294
|
-
// click on save and continue
|
|
295
|
-
_react.fireEvent.click(submitButton);
|
|
296
|
-
|
|
297
|
-
// click on save and continue again
|
|
298
|
-
_react.fireEvent.click(submitButton);
|
|
299
|
-
|
|
300
|
-
// click on save and continue a third time
|
|
301
|
-
_react.fireEvent.click(submitButton);
|
|
302
|
-
|
|
303
|
-
// only expect one submit call to be made
|
|
304
|
-
expect(ON_SUBMIT_CALLS.length).toEqual(1);
|
|
305
|
-
expect(ON_PAGE_CHANGE_CALLS.length).toEqual(1);
|
|
306
|
-
expect(ON_SUBMIT_CALLS[0].type).toEqual(_models.PageAction.TYPES.SAVE_AND_CONTINUE);
|
|
307
|
-
});
|
|
308
|
-
it('should handle a page submission repeatedly if ignoreSubmittingFlag is true', async () => {
|
|
309
|
-
const ON_PAGE_CHANGE_CALLS = [];
|
|
310
|
-
const ON_PAGE_CHANGE = pageId => {
|
|
311
|
-
ON_PAGE_CHANGE_CALLS.push(pageId);
|
|
312
|
-
};
|
|
313
|
-
const ON_SUBMIT_CALLS = [];
|
|
314
|
-
const ON_SUBMIT = async (type, payload, onSuccess, onError, fieldName, fieldValue) => {
|
|
315
|
-
ON_SUBMIT_CALLS.push({
|
|
316
|
-
type,
|
|
317
|
-
payload,
|
|
318
|
-
onSuccess,
|
|
319
|
-
onError,
|
|
320
|
-
fieldName,
|
|
321
|
-
fieldValue
|
|
322
|
-
});
|
|
323
|
-
|
|
324
|
-
// mock a delay when submitting to the backend
|
|
325
|
-
await sleep(2000);
|
|
326
|
-
onSuccess();
|
|
327
|
-
};
|
|
328
|
-
const HOOKS = {
|
|
329
|
-
onSubmit: ON_SUBMIT,
|
|
330
|
-
onPageChange: ON_PAGE_CHANGE
|
|
331
|
-
};
|
|
332
|
-
const formDefinition = _objectSpread({}, _userProfile.default);
|
|
333
|
-
formDefinition.pages[1].actions = [{
|
|
334
|
-
type: 'saveAndContinue',
|
|
335
|
-
page: 'test',
|
|
336
|
-
ignoreSubmittingFlag: true
|
|
337
|
-
}, {
|
|
338
|
-
type: 'cancel'
|
|
339
|
-
}];
|
|
340
|
-
(0, _testUtils.act)(() => {
|
|
341
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, formDefinition), {}, {
|
|
342
|
-
data: _userProfileData.default,
|
|
343
|
-
hooks: HOOKS
|
|
344
|
-
})), container);
|
|
345
|
-
});
|
|
346
|
-
const form = checkForm(container);
|
|
347
|
-
|
|
348
|
-
// Navigate to the "Are you a civil servant?" page.
|
|
349
|
-
const hub = form.childNodes[1]; // Hub = CYA
|
|
350
|
-
const [,, civilServantList] = hub.childNodes;
|
|
351
|
-
const link = getChangeLink(civilServantList);
|
|
352
|
-
_react.fireEvent.click(link, {});
|
|
353
|
-
|
|
354
|
-
// Should already be answered "Yes", so simply click "Continue".
|
|
355
|
-
const page = form.childNodes[0];
|
|
356
|
-
const continueButton = getContinueButton(page);
|
|
357
|
-
expect(ON_SUBMIT_CALLS.length).toEqual(0);
|
|
358
|
-
_react.fireEvent.click(continueButton, {});
|
|
359
|
-
expect(ON_SUBMIT_CALLS.length).toEqual(1);
|
|
360
|
-
expect(ON_SUBMIT_CALLS[0].type).toEqual(_models.PageAction.TYPES.SAVE_AND_CONTINUE);
|
|
361
|
-
|
|
362
|
-
// click on save and continue
|
|
363
|
-
_react.fireEvent.click(continueButton);
|
|
364
|
-
|
|
365
|
-
// click on save and continue again
|
|
366
|
-
_react.fireEvent.click(continueButton);
|
|
367
|
-
|
|
368
|
-
// click on save and continue a third time
|
|
369
|
-
_react.fireEvent.click(continueButton);
|
|
370
|
-
|
|
371
|
-
// expect all submit calls to be made
|
|
372
|
-
expect(ON_SUBMIT_CALLS.length).toEqual(4);
|
|
373
|
-
});
|
|
374
|
-
it('should handle page navigation', async () => {
|
|
375
|
-
const ON_PAGE_CHANGE_CALLS = [];
|
|
376
|
-
const ON_PAGE_CHANGE = pageId => {
|
|
377
|
-
ON_PAGE_CHANGE_CALLS.push(pageId);
|
|
378
|
-
};
|
|
379
|
-
const HOOKS = {
|
|
380
|
-
onPageChange: ON_PAGE_CHANGE
|
|
381
|
-
};
|
|
382
|
-
await (0, _testUtils.act)(async () => {
|
|
383
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
|
|
384
|
-
data: _userProfileData.default,
|
|
385
|
-
hooks: HOOKS
|
|
386
|
-
})), container);
|
|
387
|
-
});
|
|
388
|
-
const form = checkForm(container);
|
|
389
|
-
|
|
390
|
-
// Navigate to the "Add or change a line manager" page.
|
|
391
|
-
const hub = form.childNodes[1]; // Hub = CYA
|
|
392
|
-
const [,,,,, lineManagerList] = hub.childNodes;
|
|
393
|
-
const link = getChangeLink(lineManagerList);
|
|
394
|
-
expect(ON_PAGE_CHANGE_CALLS.length).toEqual(0);
|
|
395
|
-
_react.fireEvent.click(link, {});
|
|
396
|
-
expect(ON_PAGE_CHANGE_CALLS[0]).toEqual(_userProfile.default.pages[4].id);
|
|
397
|
-
|
|
398
|
-
// Should be on the page explaining what changing the line manager means.
|
|
399
|
-
const page = form.childNodes[0];
|
|
400
|
-
const pageHeading = page.childNodes[0];
|
|
401
|
-
expect(pageHeading.tagName).toEqual('H1');
|
|
402
|
-
expect(pageHeading.textContent).toEqual(_userProfile.default.pages[4].title);
|
|
403
|
-
|
|
404
|
-
// Now click on the "Continue" button on here.
|
|
405
|
-
const continueButton = getContinueButton(page);
|
|
406
|
-
expect(ON_PAGE_CHANGE_CALLS.length).toEqual(1);
|
|
407
|
-
_react.fireEvent.click(continueButton, {});
|
|
408
|
-
expect(ON_PAGE_CHANGE_CALLS.length).toEqual(2);
|
|
409
|
-
expect(ON_PAGE_CHANGE_CALLS[1]).toEqual(_userProfile.default.pages[5].id);
|
|
410
|
-
const newPageHeading = form.childNodes[0].childNodes[0];
|
|
411
|
-
expect(newPageHeading.tagName).toEqual('H1');
|
|
412
|
-
expect(newPageHeading.textContent).toEqual(_userProfile.default.pages[5].title);
|
|
413
|
-
});
|
|
414
|
-
it('should show no title when hide_title is set to true', async () => {
|
|
415
|
-
await (0, _testUtils.act)(async () => {
|
|
416
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
|
|
417
|
-
data: _userProfileData.default,
|
|
418
|
-
hide_title: true
|
|
419
|
-
})), container);
|
|
420
|
-
});
|
|
421
|
-
const form = checkForm(container);
|
|
422
|
-
expect(form.childNodes.length).toEqual(1); // Hub page (= CYA)
|
|
423
|
-
const hub = form.childNodes[0];
|
|
424
|
-
expect(hub.tagName).toEqual('DIV');
|
|
425
|
-
expect(hub.classList).toContain(_CheckYourAnswers.DEFAULT_CLASS);
|
|
426
|
-
});
|
|
427
|
-
it('should render a task list', async () => {
|
|
428
|
-
await (0, _testUtils.act)(async () => {
|
|
429
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread({}, _taskList.default)), container);
|
|
430
|
-
});
|
|
431
|
-
const taskList = container.childNodes[0].childNodes[1];
|
|
432
|
-
expect(taskList.classList).toContain(_TaskList.DEFAULT_CLASS);
|
|
433
|
-
});
|
|
434
|
-
it('should render a cya page', async () => {
|
|
435
|
-
await (0, _testUtils.act)(async () => {
|
|
436
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread({}, _firstForm.default)), container);
|
|
437
|
-
});
|
|
438
|
-
const cya = container.childNodes[0];
|
|
439
|
-
expect(cya.classList).toContain('hods-form');
|
|
440
|
-
});
|
|
441
|
-
it('should load task list with notes', async () => {
|
|
442
|
-
const ON_SUBMIT_CALLS = [];
|
|
443
|
-
const ON_SUBMIT = (type, payload, onSuccess) => {
|
|
444
|
-
ON_SUBMIT_CALLS.push(payload);
|
|
445
|
-
onSuccess();
|
|
446
|
-
};
|
|
447
|
-
const HOOKS = {
|
|
448
|
-
onSubmit: ON_SUBMIT
|
|
449
|
-
};
|
|
450
|
-
const TASK_LIST_WITH_NOTES = JSON.parse(JSON.stringify(_taskList.default));
|
|
451
|
-
TASK_LIST_WITH_NOTES.hub.notes = {
|
|
452
|
-
title: "test title",
|
|
453
|
-
text: "test text",
|
|
454
|
-
show_when: [{
|
|
455
|
-
"op": "=",
|
|
456
|
-
"field": "areYouACivilServant",
|
|
457
|
-
"value": "yes"
|
|
458
|
-
}]
|
|
459
|
-
};
|
|
460
|
-
await (0, _testUtils.act)(async () => {
|
|
461
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, TASK_LIST_WITH_NOTES), {}, {
|
|
462
|
-
data: _userProfileData.default,
|
|
463
|
-
hooks: HOOKS
|
|
464
|
-
})), container);
|
|
465
|
-
});
|
|
466
|
-
const taskList = container.childNodes[0].childNodes[1];
|
|
467
|
-
expect(taskList.childNodes[5].textContent).toEqual("test text");
|
|
468
|
-
expect(taskList.childNodes[5].classList).toContain('govuk-textarea');
|
|
469
|
-
});
|
|
470
|
-
it('should not load task list with notes', async () => {
|
|
471
|
-
const ON_SUBMIT_CALLS = [];
|
|
472
|
-
const ON_SUBMIT = (type, payload, onSuccess) => {
|
|
473
|
-
ON_SUBMIT_CALLS.push(payload);
|
|
474
|
-
onSuccess();
|
|
475
|
-
};
|
|
476
|
-
const HOOKS = {
|
|
477
|
-
onSubmit: ON_SUBMIT
|
|
478
|
-
};
|
|
479
|
-
const TASK_LIST_WITH_NOTES = JSON.parse(JSON.stringify(_taskList.default));
|
|
480
|
-
TASK_LIST_WITH_NOTES.hub.notes = {
|
|
481
|
-
title: "test title",
|
|
482
|
-
text: "test text",
|
|
483
|
-
show_when: [{
|
|
484
|
-
"op": "!=",
|
|
485
|
-
"field": "changeSummary",
|
|
486
|
-
"value": undefined
|
|
487
|
-
}]
|
|
488
|
-
};
|
|
489
|
-
await (0, _testUtils.act)(async () => {
|
|
490
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, TASK_LIST_WITH_NOTES), {}, {
|
|
491
|
-
data: _userProfileData.default,
|
|
492
|
-
hooks: HOOKS
|
|
493
|
-
})), container);
|
|
494
|
-
});
|
|
495
|
-
const taskList = container.childNodes[0].childNodes[1];
|
|
496
|
-
taskList.childNodes.forEach(child => {
|
|
497
|
-
// eslint-disable-next-line no-console
|
|
498
|
-
console.log("taskList, child = ".concat(JSON.stringify(child.textContent)));
|
|
499
|
-
});
|
|
500
|
-
expect(taskList.childNodes[5].textContent).not.toEqual("test text");
|
|
501
|
-
expect(taskList.childNodes[5].classList).not.toContain('govuk-textarea');
|
|
502
|
-
});
|
|
503
|
-
it('should handle navigating between task list pages', async () => {
|
|
504
|
-
const ON_SUBMIT_CALLS = [];
|
|
505
|
-
const ON_SUBMIT = (type, payload, onSuccess) => {
|
|
506
|
-
ON_SUBMIT_CALLS.push(payload);
|
|
507
|
-
onSuccess();
|
|
508
|
-
};
|
|
509
|
-
const HOOKS = {
|
|
510
|
-
onSubmit: ON_SUBMIT
|
|
511
|
-
};
|
|
512
|
-
await (0, _testUtils.act)(async () => {
|
|
513
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _taskList.default), {}, {
|
|
514
|
-
hooks: HOOKS
|
|
515
|
-
})), container);
|
|
516
|
-
});
|
|
517
|
-
const taskList = container.childNodes[0].childNodes[1];
|
|
518
|
-
|
|
519
|
-
// Check statuses are correct
|
|
520
|
-
let firstTaskStatus = taskList.childNodes[3].childNodes[0].childNodes[1];
|
|
521
|
-
expect(firstTaskStatus.textContent).toEqual(_models.TaskStates.DETAILS[_models.TaskStates.TYPES.NOT_STARTED].label);
|
|
522
|
-
let secondTaskStatus = taskList.childNodes[3].childNodes[1].childNodes[1];
|
|
523
|
-
expect(secondTaskStatus.textContent).toEqual(_models.TaskStates.DETAILS[_models.TaskStates.TYPES.CANNOT_START_YET].label);
|
|
524
|
-
|
|
525
|
-
// Launch first task
|
|
526
|
-
const firstTask = taskList.childNodes[3].childNodes[0].childNodes[0].childNodes[0];
|
|
527
|
-
expect(firstTask.textContent).toEqual('Date, location and mode details');
|
|
528
|
-
_react.fireEvent.click(firstTask, {});
|
|
529
|
-
|
|
530
|
-
// Fill first page and navigate
|
|
531
|
-
let newPage = container.childNodes[0].childNodes[0];
|
|
532
|
-
expect(newPage.childNodes[0].textContent).toEqual('Event Date');
|
|
533
|
-
const fieldset = newPage.childNodes[1].childNodes[0];
|
|
534
|
-
// child nodes of fieldset are legend and date
|
|
535
|
-
setDate(fieldset.children[1], ['7', '7', '2022']);
|
|
536
|
-
let continueButton = newPage.childNodes[2].childNodes[0];
|
|
537
|
-
_react.fireEvent.click(continueButton, {});
|
|
538
|
-
|
|
539
|
-
// Fill second page and navigate
|
|
540
|
-
newPage = container.childNodes[0].childNodes[0];
|
|
541
|
-
expect(newPage.childNodes[0].textContent).toEqual('Event Mode');
|
|
542
|
-
const seaButton = newPage.childNodes[1].childNodes[0].childNodes[2].childNodes[0];
|
|
543
|
-
expect(seaButton.textContent).toEqual('Sea');
|
|
544
|
-
_react.fireEvent.click(seaButton.childNodes[0], {});
|
|
545
|
-
continueButton = newPage.childNodes[2].childNodes[0];
|
|
546
|
-
_react.fireEvent.click(continueButton, {});
|
|
547
|
-
|
|
548
|
-
// Click change to mode on CYA page
|
|
549
|
-
const cyaPageChange = container.childNodes[0].childNodes[0];
|
|
550
|
-
expect(cyaPageChange.childNodes[0].textContent).toEqual('Check your answers');
|
|
551
|
-
const modeChangeLink = cyaPageChange.childNodes[4].childNodes[0].childNodes[0].childNodes[2].childNodes[0];
|
|
552
|
-
expect(modeChangeLink.textContent).toEqual('Change Event Mode');
|
|
553
|
-
_react.fireEvent.click(modeChangeLink, {});
|
|
554
|
-
const changePage = container.childNodes[0].childNodes[0];
|
|
555
|
-
expect(changePage.childNodes[0].textContent).toEqual('Event Mode');
|
|
556
|
-
// Click on radio for 'Air'
|
|
557
|
-
const airButton = changePage.childNodes[1].childNodes[0].childNodes[2].childNodes[1];
|
|
558
|
-
expect(airButton.textContent).toEqual('Air');
|
|
559
|
-
_react.fireEvent.click(airButton.childNodes[0]);
|
|
560
|
-
// Continue again to CYA page
|
|
561
|
-
expect(changePage.childNodes[2].childNodes[0].textContent).toEqual('Save and continue');
|
|
562
|
-
continueButton = changePage.childNodes[2].childNodes[0];
|
|
563
|
-
_react.fireEvent.click(continueButton, {});
|
|
564
|
-
|
|
565
|
-
// Continue on from CYA page
|
|
566
|
-
const cyaPage = container.childNodes[0].childNodes[0];
|
|
567
|
-
expect(cyaPage.childNodes[0].textContent).toEqual('Check your answers');
|
|
568
|
-
expect(cyaPage.childNodes[5].childNodes[0].textContent).toEqual('Save and continue');
|
|
569
|
-
expect(cyaPage.childNodes[5].childNodes[1].textContent).toEqual('Save and return later');
|
|
570
|
-
_react.fireEvent.click(cyaPage.childNodes[5].childNodes[0], {});
|
|
571
|
-
|
|
572
|
-
// Should be back at task list
|
|
573
|
-
expect(container.childNodes[0].childNodes[0].textContent).toEqual('Task List Form');
|
|
574
|
-
|
|
575
|
-
// Check statuses are correct
|
|
576
|
-
firstTaskStatus = container.childNodes[0].childNodes[1].childNodes[3].childNodes[0].childNodes[1];
|
|
577
|
-
expect(firstTaskStatus.textContent).toEqual(_models.TaskStates.DETAILS[_models.TaskStates.TYPES.COMPLETE].label);
|
|
578
|
-
secondTaskStatus = container.childNodes[0].childNodes[1].childNodes[3].childNodes[1].childNodes[1];
|
|
579
|
-
expect(secondTaskStatus.textContent).toEqual(_models.TaskStates.DETAILS[_models.TaskStates.TYPES.NOT_STARTED].label);
|
|
580
|
-
|
|
581
|
-
// Check final data submitted to backend is as expected
|
|
582
|
-
const finalSubmit = ON_SUBMIT_CALLS[ON_SUBMIT_CALLS.length - 1];
|
|
583
|
-
expect(finalSubmit.date).toEqual('7-7-2022');
|
|
584
|
-
expect(finalSubmit.mode).toEqual('air');
|
|
585
|
-
expect(finalSubmit.formStatus.tasks['Date, location and mode details'].complete).toEqual(true);
|
|
586
|
-
});
|
|
587
|
-
it('should go straight to CYA page if a complete task is selected', async () => {
|
|
588
|
-
const ON_SUBMIT = (type, payload, onSuccess) => {
|
|
589
|
-
onSuccess();
|
|
590
|
-
};
|
|
591
|
-
const HOOKS = {
|
|
592
|
-
onSubmit: ON_SUBMIT
|
|
593
|
-
};
|
|
594
|
-
await (0, _testUtils.act)(async () => {
|
|
595
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _taskList.default), {}, {
|
|
596
|
-
hooks: HOOKS
|
|
597
|
-
})), container);
|
|
598
|
-
});
|
|
599
|
-
const taskList = container.childNodes[0].childNodes[1];
|
|
600
|
-
|
|
601
|
-
// Launch first task
|
|
602
|
-
_react.fireEvent.click(taskList.childNodes[3].childNodes[0].childNodes[0].childNodes[0], {});
|
|
603
|
-
|
|
604
|
-
// Fill first page and navigate
|
|
605
|
-
let newPage = container.childNodes[0].childNodes[0];
|
|
606
|
-
const fieldset = newPage.childNodes[1].childNodes[0];
|
|
607
|
-
setDate(fieldset.children[1], ['7', '7', '2022']);
|
|
608
|
-
// child nodes of fieldset are legend and date
|
|
609
|
-
|
|
610
|
-
_react.fireEvent.click(newPage.childNodes[2].childNodes[0], {});
|
|
611
|
-
|
|
612
|
-
// Fill second page and navigate
|
|
613
|
-
newPage = container.childNodes[0].childNodes[0];
|
|
614
|
-
_react.fireEvent.click(newPage.childNodes[1].childNodes[0].childNodes[2].childNodes[0].childNodes[0], {});
|
|
615
|
-
_react.fireEvent.click(newPage.childNodes[2].childNodes[0], {});
|
|
616
|
-
|
|
617
|
-
// Continue on from CYA page
|
|
618
|
-
_react.fireEvent.click(container.childNodes[0].childNodes[0].childNodes[5].childNodes[0], {});
|
|
619
|
-
|
|
620
|
-
// Launch same task again
|
|
621
|
-
_react.fireEvent.click(container.childNodes[0].childNodes[1].childNodes[3].childNodes[0].childNodes[0].childNodes[0], {});
|
|
622
|
-
|
|
623
|
-
// Should be at CYA page
|
|
624
|
-
expect(container.childNodes[0].childNodes[0].childNodes[0].textContent).toEqual('Check your answers');
|
|
625
|
-
});
|
|
626
|
-
it('should go to incomplete page when selecting in-progress task', async () => {
|
|
627
|
-
const ON_SUBMIT = (type, payload, onSuccess) => {
|
|
628
|
-
onSuccess();
|
|
629
|
-
};
|
|
630
|
-
const HOOKS = {
|
|
631
|
-
onSubmit: ON_SUBMIT
|
|
632
|
-
};
|
|
633
|
-
const DATA = {
|
|
634
|
-
"date": "7-7-2022",
|
|
635
|
-
"formStatus": {
|
|
636
|
-
"tasks": {
|
|
637
|
-
"Date, location and mode details": {
|
|
638
|
-
"complete": false,
|
|
639
|
-
"currentPage": "eventMode"
|
|
640
|
-
}
|
|
641
|
-
},
|
|
642
|
-
"taskPage": "eventMode"
|
|
643
|
-
}
|
|
644
|
-
};
|
|
645
|
-
await (0, _testUtils.act)(async () => {
|
|
646
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _taskList.default), {}, {
|
|
647
|
-
hooks: HOOKS,
|
|
648
|
-
data: DATA
|
|
649
|
-
})), container);
|
|
650
|
-
});
|
|
651
|
-
const taskList = container.childNodes[0].childNodes[1];
|
|
652
|
-
|
|
653
|
-
// Launch first task
|
|
654
|
-
_react.fireEvent.click(taskList.childNodes[3].childNodes[0].childNodes[0].childNodes[0], {});
|
|
655
|
-
|
|
656
|
-
// Should be at Event Mode page
|
|
657
|
-
expect(container.childNodes[0].childNodes[0].childNodes[0].textContent).toEqual('Event Mode');
|
|
658
|
-
});
|
|
659
|
-
it('should go to the first page of a complete task if noTaskCYAs specified', async () => {
|
|
660
|
-
const ON_SUBMIT = (type, payload, onSuccess) => {
|
|
661
|
-
onSuccess();
|
|
662
|
-
};
|
|
663
|
-
const HOOKS = {
|
|
664
|
-
onSubmit: ON_SUBMIT
|
|
665
|
-
};
|
|
666
|
-
const TASK_LIST_WITH_NO_TASK_CYAS = JSON.parse(JSON.stringify(_taskList.default));
|
|
667
|
-
TASK_LIST_WITH_NO_TASK_CYAS.hub.noTaskCYAs = true;
|
|
668
|
-
TASK_LIST_WITH_NO_TASK_CYAS.pages[1].actions[0] = {
|
|
669
|
-
type: 'save',
|
|
670
|
-
complete: true
|
|
671
|
-
};
|
|
672
|
-
await (0, _testUtils.act)(async () => {
|
|
673
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, TASK_LIST_WITH_NO_TASK_CYAS), {}, {
|
|
674
|
-
hooks: HOOKS
|
|
675
|
-
})), container);
|
|
676
|
-
});
|
|
677
|
-
const taskList = container.childNodes[0].childNodes[1];
|
|
678
|
-
|
|
679
|
-
// Launch first task
|
|
680
|
-
_react.fireEvent.click(taskList.childNodes[3].childNodes[0].childNodes[0].childNodes[0], {});
|
|
681
|
-
|
|
682
|
-
// Fill first page and navigate
|
|
683
|
-
let newPage = container.childNodes[0].childNodes[0];
|
|
684
|
-
const fieldset = newPage.childNodes[1].childNodes[0];
|
|
685
|
-
setDate(fieldset.children[1], ['7', '7', '2022']);
|
|
686
|
-
_react.fireEvent.click(newPage.childNodes[2].childNodes[0], {});
|
|
687
|
-
|
|
688
|
-
// Fill second page
|
|
689
|
-
newPage = container.childNodes[0].childNodes[0];
|
|
690
|
-
// expect(newPage.childNodes[1].childNodes[0].childNodes[2].childNodes[0].childNodes[0]).toEqual('');
|
|
691
|
-
_react.fireEvent.click(newPage.childNodes[1].childNodes[0].childNodes[2].childNodes[0].childNodes[0], {});
|
|
692
|
-
_react.fireEvent.click(newPage.childNodes[2].childNodes[0], {});
|
|
693
|
-
|
|
694
|
-
// Launch same task again
|
|
695
|
-
_react.fireEvent.click(container.childNodes[0].childNodes[1].childNodes[3].childNodes[0].childNodes[0].childNodes[0], {});
|
|
696
|
-
|
|
697
|
-
// Should be on the first page
|
|
698
|
-
expect(container.childNodes[0].childNodes[0].childNodes[0].textContent).toEqual('Event Date');
|
|
699
|
-
});
|
|
700
|
-
it('should handle cancellation from a page', async () => {
|
|
701
|
-
const ON_CANCEL_CALLS = [];
|
|
702
|
-
const ON_CANCEL = () => {
|
|
703
|
-
ON_CANCEL_CALLS.push(undefined);
|
|
704
|
-
};
|
|
705
|
-
const HOOKS = {
|
|
706
|
-
onCancel: ON_CANCEL
|
|
707
|
-
};
|
|
708
|
-
await (0, _testUtils.act)(async () => {
|
|
709
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
|
|
710
|
-
data: _userProfileData.default,
|
|
711
|
-
hooks: HOOKS
|
|
712
|
-
})), container);
|
|
713
|
-
});
|
|
714
|
-
const form = checkForm(container);
|
|
715
|
-
|
|
716
|
-
// Navigate to the "Are you a civil servant?" page.
|
|
717
|
-
const hub = form.childNodes[1]; // Hub = CYA
|
|
718
|
-
const [,, civilServantList] = hub.childNodes;
|
|
719
|
-
const link = getChangeLink(civilServantList);
|
|
720
|
-
_react.fireEvent.click(link, {});
|
|
721
|
-
|
|
722
|
-
// Should already be answered "Yes", so simply click "Continue".
|
|
723
|
-
const page = form.childNodes[0];
|
|
724
|
-
const cancel = getCancelButton(page);
|
|
725
|
-
expect(ON_CANCEL_CALLS.length).toEqual(0);
|
|
726
|
-
_react.fireEvent.click(cancel, {});
|
|
727
|
-
expect(ON_CANCEL_CALLS.length).toEqual(1);
|
|
728
|
-
});
|
|
729
|
-
it('should navigate to a specific page at the beginning of a task if it is set as the firstPage of a task', async () => {
|
|
730
|
-
const ON_SUBMIT_CALLS = [];
|
|
731
|
-
const ON_SUBMIT = (type, payload, onSuccess) => {
|
|
732
|
-
ON_SUBMIT_CALLS.push(payload);
|
|
733
|
-
onSuccess();
|
|
734
|
-
};
|
|
735
|
-
const HOOKS = {
|
|
736
|
-
onSubmit: ON_SUBMIT
|
|
737
|
-
};
|
|
738
|
-
const TASK_LIST_NON_SEQUENTIAL = JSON.parse(JSON.stringify(_taskList.default));
|
|
739
|
-
TASK_LIST_NON_SEQUENTIAL.hub.nonSequential = true;
|
|
740
|
-
await (0, _testUtils.act)(async () => {
|
|
741
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, TASK_LIST_NON_SEQUENTIAL), {}, {
|
|
742
|
-
hooks: HOOKS
|
|
743
|
-
})), container);
|
|
744
|
-
});
|
|
745
|
-
const taskList = container.childNodes[0].childNodes[1];
|
|
746
|
-
|
|
747
|
-
// Launch first task of second section
|
|
748
|
-
const firstTask = taskList.childNodes[5].childNodes[0].childNodes[0].childNodes[0];
|
|
749
|
-
expect(firstTask.textContent).toEqual('People details');
|
|
750
|
-
_react.fireEvent.click(firstTask, {});
|
|
751
|
-
|
|
752
|
-
// Should be at Surname page
|
|
753
|
-
const newPage = container.childNodes[0].childNodes[0];
|
|
754
|
-
expect(newPage.childNodes[0].textContent).toEqual('Surname');
|
|
755
|
-
});
|
|
756
|
-
it('should handle page navigation correctly when hideBlankRows is true', async () => {
|
|
757
|
-
const ON_PAGE_CHANGE_CALLS = [];
|
|
758
|
-
const ON_PAGE_CHANGE = pageId => {
|
|
759
|
-
ON_PAGE_CHANGE_CALLS.push(pageId);
|
|
760
|
-
};
|
|
761
|
-
const HOOKS = {
|
|
762
|
-
onPageChange: ON_PAGE_CHANGE
|
|
763
|
-
};
|
|
764
|
-
await (0, _testUtils.act)(async () => {
|
|
765
|
-
(0, _reactDom.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormRenderer.default, _objectSpread(_objectSpread({}, _userProfile.default), {}, {
|
|
766
|
-
data: _userProfileData.default,
|
|
767
|
-
hooks: HOOKS,
|
|
768
|
-
hideBlankRows: true
|
|
769
|
-
})), container);
|
|
770
|
-
});
|
|
771
|
-
const form = checkForm(container);
|
|
772
|
-
|
|
773
|
-
// Navigate to the "Add or change a line manager" page.
|
|
774
|
-
const hub = form.childNodes[1]; // Hub = CYA
|
|
775
|
-
const [,,, lineManagerList] = hub.childNodes;
|
|
776
|
-
const link = getChangeLink(lineManagerList);
|
|
777
|
-
expect(ON_PAGE_CHANGE_CALLS.length).toEqual(0);
|
|
778
|
-
_react.fireEvent.click(link, {});
|
|
779
|
-
expect(ON_PAGE_CHANGE_CALLS[0]).toEqual(_userProfile.default.pages[4].id);
|
|
780
|
-
|
|
781
|
-
// Should be on the page explaining what changing the line manager means.
|
|
782
|
-
const page = form.childNodes[0];
|
|
783
|
-
const pageHeading = page.childNodes[0];
|
|
784
|
-
expect(pageHeading.tagName).toEqual('H1');
|
|
785
|
-
expect(pageHeading.textContent).toEqual(_userProfile.default.pages[4].title);
|
|
786
|
-
|
|
787
|
-
// Now click on the "Continue" button on here.
|
|
788
|
-
const continueButton = getContinueButton(page);
|
|
789
|
-
expect(ON_PAGE_CHANGE_CALLS.length).toEqual(1);
|
|
790
|
-
_react.fireEvent.click(continueButton, {});
|
|
791
|
-
expect(ON_PAGE_CHANGE_CALLS.length).toEqual(2);
|
|
792
|
-
expect(ON_PAGE_CHANGE_CALLS[1]).toEqual(_userProfile.default.pages[5].id);
|
|
793
|
-
const newPageHeading = form.childNodes[0].childNodes[0];
|
|
794
|
-
expect(newPageHeading.tagName).toEqual('H1');
|
|
795
|
-
expect(newPageHeading.textContent).toEqual(_userProfile.default.pages[5].title);
|
|
796
|
-
});
|
|
797
|
-
});
|
|
798
|
-
});
|
|
799
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX2F4aW9zIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9heGlvc01vY2tBZGFwdGVyIiwiX3JlYWN0MiIsIl9yZWFjdERvbSIsIl90ZXN0VXRpbHMiLCJfbW9kZWxzIiwiX0NoZWNrWW91ckFuc3dlcnMiLCJfVGFza0xpc3QiLCJfRm9ybVJlbmRlcmVyIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfYXJlWW91QUNpdmlsU2VydmFudCIsIl9ncmFkZSIsIl90ZWFtIiwiX3VzZXJQcm9maWxlRGF0YSIsIl91c2VyUHJvZmlsZSIsIl90YXNrTGlzdCIsIl9maXJzdEZvcm0iLCJfanN4UnVudGltZSIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfdG9Qcm9wZXJ0eUtleSIsInZhbHVlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJfdG9QcmltaXRpdmUiLCJTeW1ib2wiLCJ0b1ByaW1pdGl2ZSIsIlR5cGVFcnJvciIsIlN0cmluZyIsIk51bWJlciIsInNldERhdGUiLCJlbGVtZW50IiwiZGF0ZSIsIml0ZW1zIiwiY2hpbGRyZW4iLCJmaXJlRXZlbnQiLCJjaGFuZ2UiLCJjaGlsZE5vZGVzIiwidGFyZ2V0IiwibmFtZSIsInNsZWVwIiwibXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJkZXNjcmliZSIsIm1vY2tBeGlvcyIsIk1vY2tBZGFwdGVyIiwiYXhpb3MiLCJjb250YWluZXIiLCJyZWZEYXRhVXJsIiwic3VmZml4IiwiY29uY2F0IiwiVVNFUl9QUk9GSUxFX0RBVEEiLCJ1cmxzIiwicmVmRGF0YSIsImJlZm9yZUVhY2giLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJyZXNldCIsIm9uR2V0IiwicmVwbHkiLCJDSVZJTF9TRVJWQU5UIiwiR1JBREUiLCJURUFNUyIsImFmdGVyRWFjaCIsInVubW91bnRDb21wb25lbnRBdE5vZGUiLCJyZW1vdmUiLCJjaGVja0Zvcm0iLCJmb3JtQ29udGFpbmVyIiwiZm9ybVdyYXBwZXIiLCJmb3JtIiwiZXhwZWN0IiwidGFnTmFtZSIsInRvRXF1YWwiLCJjbGFzc0xpc3QiLCJ0b0NvbnRhaW4iLCJERUZBVUxUX0NMQVNTIiwiZ2V0Q2hhbmdlTGluayIsInN1bW1hcnlMaXN0IiwiYWN0aW9ucyIsImdldENvbnRpbnVlQnV0dG9uIiwicGFnZSIsImdldENhbmNlbEJ1dHRvbiIsIml0IiwiYWN0IiwicmVuZGVyIiwianN4IiwiVVNFUl9QUk9GSUxFIiwiZGF0YSIsInRpdGxlIiwidGV4dENvbnRlbnQiLCJodWIiLCJDWUFfREVGQVVMVF9DTEFTUyIsIm9uRm9ybUxvYWRDYWxsZWQiLCJPTl9GT1JNX0xPQUQiLCJIT09LUyIsIm9uRm9ybUxvYWQiLCJob29rcyIsInRvQmVUcnV0aHkiLCJPTl9QQUdFX0NIQU5HRV9DQUxMUyIsIk9OX1BBR0VfQ0hBTkdFIiwicGFnZUlkIiwib25QYWdlQ2hhbmdlIiwiY2l2aWxTZXJ2YW50TGlzdCIsImxpbmsiLCJjbGljayIsInBhZ2VzIiwiaWQiLCJwYWdlSGVhZGluZyIsIk9OX1NVQk1JVF9DQUxMUyIsIk9OX1NVQk1JVCIsInR5cGUiLCJwYXlsb2FkIiwib25TdWNjZXNzIiwib25FcnJvciIsImZpZWxkTmFtZSIsImZpZWxkVmFsdWUiLCJvblN1Ym1pdCIsIkZvcm1UeXBlcyIsIkhVQiIsInNjcmVlbiIsImdldEJ5VGV4dCIsImNvbnRpbnVlQnV0dG9uIiwiUGFnZUFjdGlvbiIsIlRZUEVTIiwiU1VCTUlUIiwiYXJlWW91QUNpdmlsU2VydmFudCIsImVycm9yIiwib25BY3Rpb24iLCJmb3JtRGF0YSIsInBhdGNoIiwiQ1lBIiwiY29udGludWVCdXR0b25Hcm91cCIsImNvbnRpbnVlRm9ybUJ1dHRvbiIsImlubmVyRGl2IiwiZmlyc3ROYW1lSW5wdXQiLCJFVkVOVCIsInN1Ym1pdEJ1dHRvbiIsIlNBVkVfQU5EX0NPTlRJTlVFIiwiZm9ybURlZmluaXRpb24iLCJpZ25vcmVTdWJtaXR0aW5nRmxhZyIsImxpbmVNYW5hZ2VyTGlzdCIsIm5ld1BhZ2VIZWFkaW5nIiwiaGlkZV90aXRsZSIsIlRBU0tfTElTVCIsInRhc2tMaXN0IiwiVEFTS19MSVNUX0RFRkFVTFRfQ0xBU1MiLCJjeWEiLCJUQVNLX0xJU1RfV0lUSF9OT1RFUyIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsIm5vdGVzIiwidGV4dCIsInNob3dfd2hlbiIsInVuZGVmaW5lZCIsImNoaWxkIiwiY29uc29sZSIsImxvZyIsIm5vdCIsImZpcnN0VGFza1N0YXR1cyIsIlRhc2tTdGF0ZXMiLCJERVRBSUxTIiwiTk9UX1NUQVJURUQiLCJsYWJlbCIsInNlY29uZFRhc2tTdGF0dXMiLCJDQU5OT1RfU1RBUlRfWUVUIiwiZmlyc3RUYXNrIiwibmV3UGFnZSIsImZpZWxkc2V0Iiwic2VhQnV0dG9uIiwiY3lhUGFnZUNoYW5nZSIsIm1vZGVDaGFuZ2VMaW5rIiwiY2hhbmdlUGFnZSIsImFpckJ1dHRvbiIsImN5YVBhZ2UiLCJDT01QTEVURSIsImZpbmFsU3VibWl0IiwibW9kZSIsImZvcm1TdGF0dXMiLCJ0YXNrcyIsImNvbXBsZXRlIiwiREFUQSIsIlRBU0tfTElTVF9XSVRIX05PX1RBU0tfQ1lBUyIsIm5vVGFza0NZQXMiLCJPTl9DQU5DRUxfQ0FMTFMiLCJPTl9DQU5DRUwiLCJvbkNhbmNlbCIsImNhbmNlbCIsIlRBU0tfTElTVF9OT05fU0VRVUVOVElBTCIsIm5vblNlcXVlbnRpYWwiLCJoaWRlQmxhbmtSb3dzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvRm9ybVJlbmRlcmVyL0Zvcm1SZW5kZXJlci50ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEdsb2JhbCBpbXBvcnRzXG5pbXBvcnQgeyBmaXJlRXZlbnQsIHNjcmVlbiB9IGZyb20gJ0B0ZXN0aW5nLWxpYnJhcnkvcmVhY3QnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCBNb2NrQWRhcHRlciBmcm9tICdheGlvcy1tb2NrLWFkYXB0ZXInO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHJlbmRlciwgdW5tb3VudENvbXBvbmVudEF0Tm9kZSB9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgeyBhY3QgfSBmcm9tICdyZWFjdC1kb20vdGVzdC11dGlscyc7XG5cbi8vIExvY2FsIGltcG9ydHNcbmltcG9ydCB7IFBhZ2VBY3Rpb24sIFRhc2tTdGF0ZXMsIEZvcm1UeXBlcyB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBERUZBVUxUX0NMQVNTIGFzIENZQV9ERUZBVUxUX0NMQVNTIH0gZnJvbSAnLi4vQ2hlY2tZb3VyQW5zd2Vycy9DaGVja1lvdXJBbnN3ZXJzJztcbmltcG9ydCB7IERFRkFVTFRfQ0xBU1MgYXMgVEFTS19MSVNUX0RFRkFVTFRfQ0xBU1MgfSBmcm9tICcuLi9UYXNrTGlzdC9UYXNrTGlzdCc7XG5pbXBvcnQgRm9ybVJlbmRlcmVyLCB7IERFRkFVTFRfQ0xBU1MgfSBmcm9tICcuL0Zvcm1SZW5kZXJlcic7XG5cbi8vIEpTT05cbmltcG9ydCBDSVZJTF9TRVJWQU5UIGZyb20gJy4uLy4uL2pzb24vYXJlWW91QUNpdmlsU2VydmFudC5qc29uJztcbmltcG9ydCBHUkFERSBmcm9tICcuLi8uLi9qc29uL2dyYWRlLmpzb24nO1xuaW1wb3J0IFRFQU1TIGZyb20gJy4uLy4uL2pzb24vdGVhbS5qc29uJztcbmltcG9ydCBVU0VSX1BST0ZJTEVfREFUQSBmcm9tICcuLi8uLi9qc29uL3VzZXJQcm9maWxlLmRhdGEuanNvbic7XG5pbXBvcnQgVVNFUl9QUk9GSUxFIGZyb20gJy4uLy4uL2pzb24vdXNlclByb2ZpbGUuanNvbic7XG5pbXBvcnQgVEFTS19MSVNUIGZyb20gJy4uLy4uL2pzb24vdGFza0xpc3QuanNvbic7XG5pbXBvcnQgQ1lBIGZyb20gJy4uLy4uL2pzb24vZmlyc3RGb3JtLmpzb24nO1xuXG5jb25zdCBzZXREYXRlID0gKCBlbGVtZW50LCBkYXRlKSA9PiB7XG4gIGNvbnN0IGl0ZW1zID0gZWxlbWVudC5jaGlsZHJlbjtcbiAgZmlyZUV2ZW50LmNoYW5nZShpdGVtc1swXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV0sIHtcbiAgICB0YXJnZXQ6IHsgbmFtZTogJ2RhdGUtZGF5JywgdmFsdWU6IGRhdGVbMF0gfSxcbiAgfSk7XG4gIGZpcmVFdmVudC5jaGFuZ2UoaXRlbXNbMV0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdLCB7XG4gICAgdGFyZ2V0OiB7IG5hbWU6ICdkYXRlLW1vbnRoJywgdmFsdWU6IGRhdGVbMV0gfSxcbiAgfSk7XG4gIGZpcmVFdmVudC5jaGFuZ2UoaXRlbXNbMl0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdLCB7XG4gICAgdGFyZ2V0OiB7IG5hbWU6ICdkYXRlLXllYXInLCB2YWx1ZTogZGF0ZVsyXSB9LFxuICB9KTtcbn1cblxuY29uc3Qgc2xlZXAgPSAobXMpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xufSk7XG5cbmRlc2NyaWJlKCdjb21wb25lbnRzJywgKCkgPT4ge1xuXG4gIGRlc2NyaWJlKCdGb3JtUmVuZGVyZXInLCAoKSA9PiB7XG5cbiAgICBjb25zdCBtb2NrQXhpb3MgPSBuZXcgTW9ja0FkYXB0ZXIoYXhpb3MpO1xuICAgIGxldCBjb250YWluZXIgPSBudWxsO1xuXG4gICAgY29uc3QgcmVmRGF0YVVybCA9IChzdWZmaXgpID0+IFxuICAgICAgYCR7VVNFUl9QUk9GSUxFX0RBVEEudXJscy5yZWZEYXRhfS8ke3N1ZmZpeH1gO1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgICAgIG1vY2tBeGlvcy5yZXNldCgpO1xuXG4gICAgICBtb2NrQXhpb3Mub25HZXQocmVmRGF0YVVybCgnYXJlWW91QUNpdmlsU2VydmFudCcpKS5yZXBseSgyMDAsIENJVklMX1NFUlZBTlQpO1xuICAgICAgbW9ja0F4aW9zLm9uR2V0KHJlZkRhdGFVcmwoJ2dyYWRlJykpLnJlcGx5KDIwMCwgR1JBREUpO1xuICAgICAgbW9ja0F4aW9zLm9uR2V0KHJlZkRhdGFVcmwoJ3RlYW0nKSkucmVwbHkoMjAwLCBURUFNUyk7XG4gICAgfSk7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgdW5tb3VudENvbXBvbmVudEF0Tm9kZShjb250YWluZXIpO1xuICAgICAgY29udGFpbmVyLnJlbW92ZSgpO1xuICAgICAgY29udGFpbmVyID0gbnVsbDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNoZWNrRm9ybSA9IChmb3JtQ29udGFpbmVyKSA9PiB7XG4gICAgICBjb25zdCBmb3JtV3JhcHBlciA9IGZvcm1Db250YWluZXI7XG4gICAgICBjb25zdCBmb3JtID0gZm9ybVdyYXBwZXIuY2hpbGROb2Rlc1swXTtcbiAgICAgIGV4cGVjdChmb3JtLnRhZ05hbWUpLnRvRXF1YWwoJ0RJVicpO1xuICAgICAgZXhwZWN0KGZvcm0uY2xhc3NMaXN0KS50b0NvbnRhaW4oREVGQVVMVF9DTEFTUyk7XG4gICAgICByZXR1cm4gZm9ybTtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0Q2hhbmdlTGluayA9IChzdW1tYXJ5TGlzdCkgPT4ge1xuICAgICAgY29uc3QgWywgLCBhY3Rpb25zXSA9IHN1bW1hcnlMaXN0LmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzO1xuICAgICAgcmV0dXJuIGFjdGlvbnMuY2hpbGROb2Rlc1swXTtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0Q29udGludWVCdXR0b24gPSAocGFnZSkgPT4gXG4gICAgICBwYWdlLmNoaWxkTm9kZXNbcGFnZS5jaGlsZE5vZGVzLmxlbmd0aCAtIDFdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXTtcblxuICAgIGNvbnN0IGdldENhbmNlbEJ1dHRvbiA9IChwYWdlKSA9PiBcbiAgICAgIHBhZ2UuY2hpbGROb2Rlc1twYWdlLmNoaWxkTm9kZXMubGVuZ3RoIC0gMV0uY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzBdO1xuXG4gICAgaXQoJ3Nob3VsZCBzdGFydCBvbiB0aGUgaHViIHBhZ2UgY29ycmVjdGx5IGFuZCBkaXNwbGF5IHRoZSB0aXRsZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbmRlcig8Rm9ybVJlbmRlcmVyIHsuLi5VU0VSX1BST0ZJTEV9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSAvPiwgY29udGFpbmVyKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9ybSA9IGNoZWNrRm9ybShjb250YWluZXIpO1xuICAgICAgZXhwZWN0KGZvcm0uY2hpbGROb2Rlcy5sZW5ndGgpLnRvRXF1YWwoMik7IC8vIFRpdGxlICsgSHViIHBhZ2UgKD0gQ1lBKVxuICAgICAgY29uc3QgdGl0bGUgPSBmb3JtLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QodGl0bGUudGFnTmFtZSkudG9FcXVhbCgnSDEnKTtcbiAgICAgIGV4cGVjdCh0aXRsZS50ZXh0Q29udGVudCkudG9FcXVhbChVU0VSX1BST0ZJTEUudGl0bGUpO1xuICAgICAgY29uc3QgaHViID0gZm9ybS5jaGlsZE5vZGVzWzFdO1xuICAgICAgZXhwZWN0KGh1Yi50YWdOYW1lKS50b0VxdWFsKCdESVYnKTtcbiAgICAgIGV4cGVjdChodWIuY2xhc3NMaXN0KS50b0NvbnRhaW4oQ1lBX0RFRkFVTFRfQ0xBU1MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmaXJlIHRoZSBvbkZvcm1Mb2FkIG1ldGhvZCBwYXNzZWQgaW4gdGhlIGhvb2tzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IG9uRm9ybUxvYWRDYWxsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IE9OX0ZPUk1fTE9BRCA9ICgpID0+IHtcbiAgICAgICAgb25Gb3JtTG9hZENhbGxlZCA9IHRydWU7XG4gICAgICB9O1xuICAgICAgY29uc3QgSE9PS1MgPSB7XG4gICAgICAgIG9uRm9ybUxvYWQ6IE9OX0ZPUk1fTE9BRFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbmRlcig8Rm9ybVJlbmRlcmVyIHsuLi5VU0VSX1BST0ZJTEV9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSBob29rcz17SE9PS1N9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG4gICAgICBleHBlY3Qob25Gb3JtTG9hZENhbGxlZCkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBuYXZpZ2F0ZSB0byB0aGUgZmlyc3QgZWRpdGFibGUgcGFnZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IE9OX1BBR0VfQ0hBTkdFX0NBTExTID0gW107XG4gICAgICBjb25zdCBPTl9QQUdFX0NIQU5HRSA9IChwYWdlSWQpID0+IHtcbiAgICAgICAgT05fUEFHRV9DSEFOR0VfQ0FMTFMucHVzaChwYWdlSWQpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IEhPT0tTID0ge1xuICAgICAgICBvblBhZ2VDaGFuZ2U6IE9OX1BBR0VfQ0hBTkdFXG4gICAgICB9O1xuICAgICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHtcbiAgICAgICAgcmVuZGVyKDxGb3JtUmVuZGVyZXIgey4uLlVTRVJfUFJPRklMRX0gZGF0YT17VVNFUl9QUk9GSUxFX0RBVEF9IGhvb2tzPXtIT09LU30gLz4sIGNvbnRhaW5lcik7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGZvcm0gPSBjaGVja0Zvcm0oY29udGFpbmVyKTtcbiAgICAgIGNvbnN0IGh1YiA9IGZvcm0uY2hpbGROb2Rlc1sxXTsgLy8gSHViID0gQ1lBXG4gICAgICBjb25zdCBbLCAsIGNpdmlsU2VydmFudExpc3RdID0gaHViLmNoaWxkTm9kZXM7XG4gICAgICBjb25zdCBsaW5rID0gZ2V0Q2hhbmdlTGluayhjaXZpbFNlcnZhbnRMaXN0KTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMCk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2sobGluaywge30pO1xuICAgICAgZXhwZWN0KE9OX1BBR0VfQ0hBTkdFX0NBTExTLmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMU1swXSkudG9FcXVhbChVU0VSX1BST0ZJTEUucGFnZXNbMV0uaWQpO1xuXG4gICAgICAvLyBUaGUgZm9ybSBsYXlvdXQgc2hvdWxkIGhhdmUgY2hhbmdlZCB0byB0aGUgY3VycmVudCBwYWdlLlxuICAgICAgZXhwZWN0KGZvcm0uY2hpbGROb2Rlcy5sZW5ndGgpLnRvRXF1YWwoMSk7IC8vIEp1c3QgdGhlIHBhZ2UuXG4gICAgICBjb25zdCBwYWdlID0gZm9ybS5jaGlsZE5vZGVzWzBdO1xuICAgICAgY29uc3QgcGFnZUhlYWRpbmcgPSBwYWdlLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QocGFnZUhlYWRpbmcudGFnTmFtZSkudG9FcXVhbCgnSDEnKTtcbiAgICAgIGV4cGVjdChwYWdlSGVhZGluZy50ZXh0Q29udGVudCkudG9FcXVhbChVU0VSX1BST0ZJTEUucGFnZXNbMV0udGl0bGUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgYSBwYWdlIHN1Ym1pc3Npb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9TVUJNSVRfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVCA9ICh0eXBlLCBwYXlsb2FkLCBvblN1Y2Nlc3MsIG9uRXJyb3IsIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSkgPT4ge1xuICAgICAgICBPTl9TVUJNSVRfQ0FMTFMucHVzaCh7IHR5cGUsIHBheWxvYWQsIG9uU3VjY2Vzcywgb25FcnJvciwgZmllbGROYW1lLCBmaWVsZFZhbHVlIH0pO1xuICAgICAgICBvblN1Y2Nlc3MoKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25TdWJtaXQ6IE9OX1NVQk1JVFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbmRlcig8Rm9ybVJlbmRlcmVyIHsuLi5VU0VSX1BST0ZJTEV9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSBob29rcz17SE9PS1N9IHR5cGU9e0Zvcm1UeXBlcy5IVUJ9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JtID0gY2hlY2tGb3JtKGNvbnRhaW5lcik7XG5cbiAgICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBcIkFyZSB5b3UgYSBjaXZpbCBzZXJ2YW50P1wiIHBhZ2UuXG4gICAgICBjb25zdCBodWIgPSBmb3JtLmNoaWxkTm9kZXNbMV07IC8vIEh1YiA9IENZQVxuICAgICAgY29uc3QgWywgLCBjaXZpbFNlcnZhbnRMaXN0XSA9IGh1Yi5jaGlsZE5vZGVzO1xuICAgICAgY29uc3QgbGluayA9IGdldENoYW5nZUxpbmsoY2l2aWxTZXJ2YW50TGlzdCk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2sobGluaywge30pO1xuXG4gICAgICAvLyBTaG91bGQgYWxyZWFkeSBiZSBhbnN3ZXJlZCBcIlllc1wiLCBidXQgc2VsZWN0IFwiTm8sIEknbSBhIGNvbnRyYWN0b3JcIiBvcHRpb24gdG8gZ2VuZXJhdGUgcGF0Y2hcbiAgICAgIC8vIGFuZCB0aGVuIGNsaWNrIFwiQ29udGludWVcIi5cbiAgICAgIGZpcmVFdmVudC5jbGljayhzY3JlZW4uZ2V0QnlUZXh0KFwiTm8sIEknbSBhIGNvbnRyYWN0b3JcIikpO1xuICAgICAgY29uc3QgcGFnZSA9IGZvcm0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlQnV0dG9uID0gZ2V0Q29udGludWVCdXR0b24ocGFnZSk7XG4gICAgICBleHBlY3QoT05fU1VCTUlUX0NBTExTLmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhjb250aW51ZUJ1dHRvbiwge30pO1xuICAgICAgZXhwZWN0KE9OX1NVQk1JVF9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICBleHBlY3QoT05fU1VCTUlUX0NBTExTWzBdLnR5cGUpLnRvRXF1YWwoUGFnZUFjdGlvbi5UWVBFUy5TVUJNSVQpO1xuICAgICAgZXhwZWN0KE9OX1NVQk1JVF9DQUxMU1swXS5wYXlsb2FkLmFyZVlvdUFDaXZpbFNlcnZhbnQpLnRvRXF1YWwoJ25vLWNvbnRyYWN0b3InKTtcbiAgICAgIGV4cGVjdChPTl9TVUJNSVRfQ0FMTFNbMF0uZmllbGROYW1lKS50b0VxdWFsKCdBcmUgeW91IGEgY2l2aWwgc2VydmFudD8nKTtcbiAgICAgIGV4cGVjdChPTl9TVUJNSVRfQ0FMTFNbMF0uZmllbGRWYWx1ZSkudG9FcXVhbChcIk5vLCBJJ20gYSBjb250cmFjdG9yXCIpO1xuXG4gICAgICAvLyBBbmQgd2Ugc2hvdWxkIGJlIGJhY2sgb24gdGhlIGh1Yi5cbiAgICAgIGV4cGVjdChmb3JtLmNoaWxkTm9kZXMubGVuZ3RoKS50b0VxdWFsKDIpOyAvLyBUaXRsZSArIEh1YiBwYWdlICg9IENZQSlcbiAgICAgIGNvbnN0IHRpdGxlID0gZm9ybS5jaGlsZE5vZGVzWzBdO1xuICAgICAgZXhwZWN0KHRpdGxlLnRhZ05hbWUpLnRvRXF1YWwoJ0gxJyk7XG4gICAgICBleHBlY3QodGl0bGUudGV4dENvbnRlbnQpLnRvRXF1YWwoVVNFUl9QUk9GSUxFLnRpdGxlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGEgcGFnZSBzdWJtaXNzaW9uIGVycm9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgT05fU1VCTUlUX0NBTExTID0gW107XG4gICAgICBjb25zdCBPTl9TVUJNSVQgPSAodHlwZSwgcGF5bG9hZCwgb25TdWNjZXNzLCBvbkVycm9yKSA9PiB7XG4gICAgICAgIE9OX1NVQk1JVF9DQUxMUy5wdXNoKHsgdHlwZSwgcGF5bG9hZCwgb25TdWNjZXNzLCBvbkVycm9yIH0pO1xuICAgICAgICBvbkVycm9yKFt7IGlkOiAndW5rbm93bicsIGVycm9yOiAnU29tZXRoaW5nIHdlbnQgd3JvbmcnIH1dKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25TdWJtaXQ6IE9OX1NVQk1JVCxcbiAgICAgICAgb25BY3Rpb246IChmb3JtRGF0YSwgcGF0Y2gpID0+ICh7IGZvcm1EYXRhLCBwYXRjaCB9KVxuICAgICAgfTtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbmRlcig8Rm9ybVJlbmRlcmVyIHsuLi5VU0VSX1BST0ZJTEV9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSBob29rcz17SE9PS1N9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JtID0gY2hlY2tGb3JtKGNvbnRhaW5lcik7XG5cbiAgICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBcIkFyZSB5b3UgYSBjaXZpbCBzZXJ2YW50P1wiIHBhZ2UuXG4gICAgICBjb25zdCBodWIgPSBmb3JtLmNoaWxkTm9kZXNbMV07IC8vIEh1YiA9IENZQVxuICAgICAgY29uc3QgWywgLCBjaXZpbFNlcnZhbnRMaXN0XSA9IGh1Yi5jaGlsZE5vZGVzO1xuICAgICAgY29uc3QgbGluayA9IGdldENoYW5nZUxpbmsoY2l2aWxTZXJ2YW50TGlzdCk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2sobGluaywge30pO1xuXG4gICAgICAvLyBTaG91bGQgYWxyZWFkeSBiZSBhbnN3ZXJlZCBcIlllc1wiLCBzbyBzaW1wbHkgY2xpY2sgXCJDb250aW51ZVwiLlxuICAgICAgY29uc3QgcGFnZSA9IGZvcm0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlQnV0dG9uID0gZ2V0Q29udGludWVCdXR0b24ocGFnZSk7XG4gICAgICBleHBlY3QoT05fU1VCTUlUX0NBTExTLmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhjb250aW51ZUJ1dHRvbiwge30pO1xuICAgICAgZXhwZWN0KE9OX1NVQk1JVF9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICBleHBlY3QoT05fU1VCTUlUX0NBTExTWzBdLnR5cGUpLnRvRXF1YWwoUGFnZUFjdGlvbi5UWVBFUy5TVUJNSVQpO1xuICAgICAgZXhwZWN0KE9OX1NVQk1JVF9DQUxMU1swXS5wYXlsb2FkLmFyZVlvdUFDaXZpbFNlcnZhbnQpLnRvRXF1YWwoJ3llcycpO1xuXG4gICAgICAvLyBBbmQgd2Ugc2hvdWxkIGJlIGtlcHQgb24gdGhlIHNhbWUgcGFnZS5cbiAgICAgIGV4cGVjdChmb3JtLmNoaWxkTm9kZXMubGVuZ3RoKS50b0VxdWFsKDEpOyAvLyBKdXN0IHRoZSBwYWdlLlxuICAgICAgY29uc3QgcGFnZUhlYWRpbmcgPSBmb3JtLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcbiAgICAgIGV4cGVjdChwYWdlSGVhZGluZy50YWdOYW1lKS50b0VxdWFsKCdIMScpO1xuICAgICAgZXhwZWN0KHBhZ2VIZWFkaW5nLnRleHRDb250ZW50KS50b0VxdWFsKFVTRVJfUFJPRklMRS5wYWdlc1sxXS50aXRsZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBhIHBhZ2Ugc3VibWlzc2lvbiBvbmNlIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgdGltZXMgcGFnZSBhY3Rpb24gaXMgY2xpY2tlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IE9OX1BBR0VfQ0hBTkdFX0NBTExTID0gW107XG4gICAgICBjb25zdCBPTl9QQUdFX0NIQU5HRSA9IChwYWdlSWQpID0+IHtcbiAgICAgICAgT05fUEFHRV9DSEFOR0VfQ0FMTFMucHVzaChwYWdlSWQpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVF9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fU1VCTUlUID0gYXN5bmMgKHR5cGUsIHBheWxvYWQsIG9uU3VjY2Vzcywgb25FcnJvciwgZmllbGROYW1lLCBmaWVsZFZhbHVlKSA9PiB7XG4gICAgICAgIE9OX1NVQk1JVF9DQUxMUy5wdXNoKHsgdHlwZSwgcGF5bG9hZCwgb25TdWNjZXNzLCBvbkVycm9yLCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUgfSk7XG5cbiAgICAgICAgLy8gbW9jayBhIGRlbGF5IHdoZW4gc3VibWl0dGluZyB0byB0aGUgYmFja2VuZFxuICAgICAgICBhd2FpdCBzbGVlcCgyMDAwKTtcbiAgICAgICAgb25TdWNjZXNzKCk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25TdWJtaXQ6IE9OX1NVQk1JVCxcbiAgICAgICAgb25QYWdlQ2hhbmdlOiBPTl9QQUdFX0NIQU5HRVxuICAgICAgfTtcbiAgICAgICBhY3QoICgpID0+IHtcbiAgICAgICAgcmVuZGVyKDxGb3JtUmVuZGVyZXIgey4uLkNZQX0gaG9va3M9e0hPT0tTfSB0eXBlPXtGb3JtVHlwZXMuQ1lBfSAvPiwgY29udGFpbmVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBbLCAsICwgLCAsIGNvbnRpbnVlQnV0dG9uR3JvdXBdID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzO1xuXG4gICAgICAvLyBnbyB0byBmaXJzdCBxdWVzdGlvbiBwYWdlXG4gICAgICBjb25zdCBjb250aW51ZUZvcm1CdXR0b24gPSBjb250aW51ZUJ1dHRvbkdyb3VwLmNoaWxkTm9kZXNbMF07XG4gICAgICBmaXJlRXZlbnQuY2xpY2soY29udGludWVGb3JtQnV0dG9uKTtcblxuICAgICAgY29uc3QgaW5uZXJEaXYgPSBjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdO1xuXG4gICAgICAvLyBlbnRlciBhIHZhbHVlIGluIHRoZSBpbnB1dCBmaWVsZFxuICAgICAgY29uc3QgZmlyc3ROYW1lSW5wdXQgPSBpbm5lckRpdi5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMl07XG4gICAgICBjb25zdCBFVkVOVCA9IHsgdGFyZ2V0OiB7IG5hbWU6IGZpcnN0TmFtZUlucHV0LmlkLCB2YWx1ZTogJ2FiYycgfSB9O1xuICAgICAgZmlyZUV2ZW50LmNoYW5nZShmaXJzdE5hbWVJbnB1dCwgRVZFTlQpO1xuXG4gICAgICBjb25zdCBzdWJtaXRCdXR0b24gPSBpbm5lckRpdi5jaGlsZE5vZGVzWzJdLmNoaWxkTm9kZXNbMF07XG5cbiAgICAgIC8vIGNsaWNrIG9uIHNhdmUgYW5kIGNvbnRpbnVlXG4gICAgICBmaXJlRXZlbnQuY2xpY2soc3VibWl0QnV0dG9uKTtcblxuICAgICAgLy8gY2xpY2sgb24gc2F2ZSBhbmQgY29udGludWUgYWdhaW5cbiAgICAgIGZpcmVFdmVudC5jbGljayhzdWJtaXRCdXR0b24pOyAgICAgIFxuXG4gICAgICAvLyBjbGljayBvbiBzYXZlIGFuZCBjb250aW51ZSBhIHRoaXJkIHRpbWVcbiAgICAgIGZpcmVFdmVudC5jbGljayhzdWJtaXRCdXR0b24pOyAgXG5cbiAgICAgIC8vIG9ubHkgZXhwZWN0IG9uZSBzdWJtaXQgY2FsbCB0byBiZSBtYWRlXG4gICAgICBleHBlY3QoT05fU1VCTUlUX0NBTExTLmxlbmd0aCkudG9FcXVhbCgxKTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICBleHBlY3QoT05fU1VCTUlUX0NBTExTWzBdLnR5cGUpLnRvRXF1YWwoUGFnZUFjdGlvbi5UWVBFUy5TQVZFX0FORF9DT05USU5VRSk7XG5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGEgcGFnZSBzdWJtaXNzaW9uIHJlcGVhdGVkbHkgaWYgaWdub3JlU3VibWl0dGluZ0ZsYWcgaXMgdHJ1ZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IE9OX1BBR0VfQ0hBTkdFX0NBTExTID0gW107XG4gICAgICBjb25zdCBPTl9QQUdFX0NIQU5HRSA9IChwYWdlSWQpID0+IHtcbiAgICAgICAgT05fUEFHRV9DSEFOR0VfQ0FMTFMucHVzaChwYWdlSWQpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVF9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fU1VCTUlUID0gYXN5bmMgKHR5cGUsIHBheWxvYWQsIG9uU3VjY2Vzcywgb25FcnJvciwgZmllbGROYW1lLCBmaWVsZFZhbHVlKSA9PiB7XG4gICAgICAgIE9OX1NVQk1JVF9DQUxMUy5wdXNoKHsgdHlwZSwgcGF5bG9hZCwgb25TdWNjZXNzLCBvbkVycm9yLCBmaWVsZE5hbWUsIGZpZWxkVmFsdWUgfSk7XG5cbiAgICAgICAgLy8gbW9jayBhIGRlbGF5IHdoZW4gc3VibWl0dGluZyB0byB0aGUgYmFja2VuZFxuICAgICAgICBhd2FpdCBzbGVlcCgyMDAwKTtcbiAgICAgICAgb25TdWNjZXNzKCk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25TdWJtaXQ6IE9OX1NVQk1JVCxcbiAgICAgICAgb25QYWdlQ2hhbmdlOiBPTl9QQUdFX0NIQU5HRVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGZvcm1EZWZpbml0aW9uID0geyAuLi5VU0VSX1BST0ZJTEUgfTtcbiAgICAgIGZvcm1EZWZpbml0aW9uLnBhZ2VzWzFdLmFjdGlvbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnc2F2ZUFuZENvbnRpbnVlJyxcbiAgICAgICAgICBwYWdlOiAndGVzdCcsXG4gICAgICAgICAgaWdub3JlU3VibWl0dGluZ0ZsYWc6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnY2FuY2VsJyxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgICBhY3QoICgpID0+IHtcbiAgICAgICAgcmVuZGVyKDxGb3JtUmVuZGVyZXIgey4uLmZvcm1EZWZpbml0aW9ufSBkYXRhPXtVU0VSX1BST0ZJTEVfREFUQX0gaG9va3M9e0hPT0tTfSAvPiwgY29udGFpbmVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBmb3JtID0gY2hlY2tGb3JtKGNvbnRhaW5lcik7XG5cbiAgICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBcIkFyZSB5b3UgYSBjaXZpbCBzZXJ2YW50P1wiIHBhZ2UuXG4gICAgICBjb25zdCBodWIgPSBmb3JtLmNoaWxkTm9kZXNbMV07IC8vIEh1YiA9IENZQVxuICAgICAgY29uc3QgWywgLCBjaXZpbFNlcnZhbnRMaXN0XSA9IGh1Yi5jaGlsZE5vZGVzO1xuICAgICAgY29uc3QgbGluayA9IGdldENoYW5nZUxpbmsoY2l2aWxTZXJ2YW50TGlzdCk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2sobGluaywge30pO1xuXG4gICAgICAvLyBTaG91bGQgYWxyZWFkeSBiZSBhbnN3ZXJlZCBcIlllc1wiLCBzbyBzaW1wbHkgY2xpY2sgXCJDb250aW51ZVwiLlxuICAgICAgY29uc3QgcGFnZSA9IGZvcm0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGNvbnN0IGNvbnRpbnVlQnV0dG9uID0gZ2V0Q29udGludWVCdXR0b24ocGFnZSk7XG4gICAgICBleHBlY3QoT05fU1VCTUlUX0NBTExTLmxlbmd0aCkudG9FcXVhbCgwKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhjb250aW51ZUJ1dHRvbiwge30pO1xuICAgICAgZXhwZWN0KE9OX1NVQk1JVF9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICBleHBlY3QoT05fU1VCTUlUX0NBTExTWzBdLnR5cGUpLnRvRXF1YWwoUGFnZUFjdGlvbi5UWVBFUy5TQVZFX0FORF9DT05USU5VRSk7XG5cbiAgICAgIC8vIGNsaWNrIG9uIHNhdmUgYW5kIGNvbnRpbnVlXG4gICAgICBmaXJlRXZlbnQuY2xpY2soY29udGludWVCdXR0b24pO1xuXG4gICAgICAvLyBjbGljayBvbiBzYXZlIGFuZCBjb250aW51ZSBhZ2FpblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKGNvbnRpbnVlQnV0dG9uKTsgICAgICBcblxuICAgICAgLy8gY2xpY2sgb24gc2F2ZSBhbmQgY29udGludWUgYSB0aGlyZCB0aW1lXG4gICAgICBmaXJlRXZlbnQuY2xpY2soY29udGludWVCdXR0b24pOyAgXG5cbiAgICAgIC8vIGV4cGVjdCBhbGwgc3VibWl0IGNhbGxzIHRvIGJlIG1hZGVcbiAgICAgIGV4cGVjdChPTl9TVUJNSVRfQ0FMTFMubGVuZ3RoKS50b0VxdWFsKDQpO1xuXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBwYWdlIG5hdmlnYXRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9QQUdFX0NIQU5HRV9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fUEFHRV9DSEFOR0UgPSAocGFnZUlkKSA9PiB7XG4gICAgICAgIE9OX1BBR0VfQ0hBTkdFX0NBTExTLnB1c2gocGFnZUlkKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25QYWdlQ2hhbmdlOiBPTl9QQUdFX0NIQU5HRVxuICAgICAgfTtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbmRlcig8Rm9ybVJlbmRlcmVyIHsuLi5VU0VSX1BST0ZJTEV9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSBob29rcz17SE9PS1N9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JtID0gY2hlY2tGb3JtKGNvbnRhaW5lcik7XG5cbiAgICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBcIkFkZCBvciBjaGFuZ2UgYSBsaW5lIG1hbmFnZXJcIiBwYWdlLlxuICAgICAgY29uc3QgaHViID0gZm9ybS5jaGlsZE5vZGVzWzFdOyAvLyBIdWIgPSBDWUFcbiAgICAgIGNvbnN0IFssICwgLCAsICwgbGluZU1hbmFnZXJMaXN0XSA9IGh1Yi5jaGlsZE5vZGVzO1xuICAgICAgY29uc3QgbGluayA9IGdldENoYW5nZUxpbmsobGluZU1hbmFnZXJMaXN0KTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMCk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2sobGluaywge30pO1xuICAgICAgZXhwZWN0KE9OX1BBR0VfQ0hBTkdFX0NBTExTWzBdKS50b0VxdWFsKFVTRVJfUFJPRklMRS5wYWdlc1s0XS5pZCk7XG5cbiAgICAgIC8vIFNob3VsZCBiZSBvbiB0aGUgcGFnZSBleHBsYWluaW5nIHdoYXQgY2hhbmdpbmcgdGhlIGxpbmUgbWFuYWdlciBtZWFucy5cbiAgICAgIGNvbnN0IHBhZ2UgPSBmb3JtLmNoaWxkTm9kZXNbMF07XG4gICAgICBjb25zdCBwYWdlSGVhZGluZyA9IHBhZ2UuY2hpbGROb2Rlc1swXTtcbiAgICAgIGV4cGVjdChwYWdlSGVhZGluZy50YWdOYW1lKS50b0VxdWFsKCdIMScpO1xuICAgICAgZXhwZWN0KHBhZ2VIZWFkaW5nLnRleHRDb250ZW50KS50b0VxdWFsKFVTRVJfUFJPRklMRS5wYWdlc1s0XS50aXRsZSk7XG5cbiAgICAgIC8vIE5vdyBjbGljayBvbiB0aGUgXCJDb250aW51ZVwiIGJ1dHRvbiBvbiBoZXJlLlxuICAgICAgY29uc3QgY29udGludWVCdXR0b24gPSBnZXRDb250aW51ZUJ1dHRvbihwYWdlKTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soY29udGludWVCdXR0b24sIHt9KTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMik7XG4gICAgICBleHBlY3QoT05fUEFHRV9DSEFOR0VfQ0FMTFNbMV0pLnRvRXF1YWwoVVNFUl9QUk9GSUxFLnBhZ2VzWzVdLmlkKTtcbiAgICAgIGNvbnN0IG5ld1BhZ2VIZWFkaW5nID0gZm9ybS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QobmV3UGFnZUhlYWRpbmcudGFnTmFtZSkudG9FcXVhbCgnSDEnKTtcbiAgICAgIGV4cGVjdChuZXdQYWdlSGVhZGluZy50ZXh0Q29udGVudCkudG9FcXVhbChVU0VSX1BST0ZJTEUucGFnZXNbNV0udGl0bGUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaG93IG5vIHRpdGxlIHdoZW4gaGlkZV90aXRsZSBpcyBzZXQgdG8gdHJ1ZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbmRlcig8Rm9ybVJlbmRlcmVyIHsuLi5VU0VSX1BST0ZJTEV9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSBoaWRlX3RpdGxlIC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JtID0gY2hlY2tGb3JtKGNvbnRhaW5lcik7XG4gICAgICBleHBlY3QoZm9ybS5jaGlsZE5vZGVzLmxlbmd0aCkudG9FcXVhbCgxKTsgLy8gSHViIHBhZ2UgKD0gQ1lBKVxuICAgICAgY29uc3QgaHViID0gZm9ybS5jaGlsZE5vZGVzWzBdO1xuICAgICAgZXhwZWN0KGh1Yi50YWdOYW1lKS50b0VxdWFsKCdESVYnKTtcbiAgICAgIGV4cGVjdChodWIuY2xhc3NMaXN0KS50b0NvbnRhaW4oQ1lBX0RFRkFVTFRfQ0xBU1MpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgYSB0YXNrIGxpc3QnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICByZW5kZXIoPEZvcm1SZW5kZXJlciB7Li4uVEFTS19MSVNUfSAvPiwgY29udGFpbmVyKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdGFza0xpc3QgPSBjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdO1xuICAgICAgZXhwZWN0KHRhc2tMaXN0LmNsYXNzTGlzdCkudG9Db250YWluKFRBU0tfTElTVF9ERUZBVUxUX0NMQVNTKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIGEgY3lhIHBhZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICByZW5kZXIoPEZvcm1SZW5kZXJlciB7Li4uQ1lBfSAvPiwgY29udGFpbmVyKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY3lhID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QoY3lhLmNsYXNzTGlzdCkudG9Db250YWluKCdob2RzLWZvcm0nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbG9hZCB0YXNrIGxpc3Qgd2l0aCBub3RlcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVF9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fU1VCTUlUID0gKHR5cGUsIHBheWxvYWQsIG9uU3VjY2VzcykgPT4ge1xuICAgICAgICBPTl9TVUJNSVRfQ0FMTFMucHVzaChwYXlsb2FkKTtcbiAgICAgICAgb25TdWNjZXNzKCk7XG4gICAgICB9O1xuICAgICAgY29uc3QgSE9PS1MgPSB7XG4gICAgICAgIG9uU3VibWl0OiBPTl9TVUJNSVQsXG4gICAgICB9O1xuICAgICAgY29uc3QgVEFTS19MSVNUX1dJVEhfTk9URVMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KFRBU0tfTElTVCkpO1xuICAgICAgVEFTS19MSVNUX1dJVEhfTk9URVMuaHViLm5vdGVzID0ge1xuICAgICAgICB0aXRsZTogXCJ0ZXN0IHRpdGxlXCIsIHRleHQ6IFwidGVzdCB0ZXh0XCIsIHNob3dfd2hlbjogW3tcbiAgICAgICAgICBcIm9wXCI6IFwiPVwiLFxuICAgICAgICAgIFwiZmllbGRcIjogXCJhcmVZb3VBQ2l2aWxTZXJ2YW50XCIsXG4gICAgICAgICAgXCJ2YWx1ZVwiOiBcInllc1wiXG4gICAgICAgIH1dXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICByZW5kZXIoPEZvcm1SZW5kZXJlciB7Li4uVEFTS19MSVNUX1dJVEhfTk9URVN9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSBob29rcz17SE9PS1N9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRhc2tMaXN0ID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcblxuICAgICAgZXhwZWN0KHRhc2tMaXN0LmNoaWxkTm9kZXNbNV0udGV4dENvbnRlbnQpLnRvRXF1YWwoXCJ0ZXN0IHRleHRcIik7XG4gICAgICBleHBlY3QodGFza0xpc3QuY2hpbGROb2Rlc1s1XS5jbGFzc0xpc3QpLnRvQ29udGFpbignZ292dWstdGV4dGFyZWEnKVxuXG4gICAgfSk7XG5cblxuICAgIGl0KCdzaG91bGQgbm90IGxvYWQgdGFzayBsaXN0IHdpdGggbm90ZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9TVUJNSVRfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVCA9ICh0eXBlLCBwYXlsb2FkLCBvblN1Y2Nlc3MpID0+IHtcbiAgICAgICAgT05fU1VCTUlUX0NBTExTLnB1c2gocGF5bG9hZCk7XG4gICAgICAgIG9uU3VjY2VzcygpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IEhPT0tTID0ge1xuICAgICAgICBvblN1Ym1pdDogT05fU1VCTUlULFxuICAgICAgfTtcbiAgICAgIGNvbnN0IFRBU0tfTElTVF9XSVRIX05PVEVTID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShUQVNLX0xJU1QpKTtcbiAgICAgIFRBU0tfTElTVF9XSVRIX05PVEVTLmh1Yi5ub3RlcyA9IHtcbiAgICAgICAgdGl0bGU6IFwidGVzdCB0aXRsZVwiLCB0ZXh0OiBcInRlc3QgdGV4dFwiLCBzaG93X3doZW46IFt7XG4gICAgICAgICAgXCJvcFwiOiBcIiE9XCIsXG4gICAgICAgICAgXCJmaWVsZFwiOiBcImNoYW5nZVN1bW1hcnlcIixcbiAgICAgICAgICBcInZhbHVlXCI6IHVuZGVmaW5lZFxuICAgICAgICB9XVxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHtcbiAgICAgICAgcmVuZGVyKDxGb3JtUmVuZGVyZXIgey4uLlRBU0tfTElTVF9XSVRIX05PVEVTfSBkYXRhPXtVU0VSX1BST0ZJTEVfREFUQX0gaG9va3M9e0hPT0tTfSAvPiwgY29udGFpbmVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0YXNrTGlzdCA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV07XG5cbiAgICAgIHRhc2tMaXN0LmNoaWxkTm9kZXMuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5sb2coYHRhc2tMaXN0LCBjaGlsZCA9ICR7SlNPTi5zdHJpbmdpZnkoY2hpbGQudGV4dENvbnRlbnQpfWApO1xuICAgICAgfSlcblxuICAgICAgZXhwZWN0KHRhc2tMaXN0LmNoaWxkTm9kZXNbNV0udGV4dENvbnRlbnQpLm5vdC50b0VxdWFsKFwidGVzdCB0ZXh0XCIpO1xuICAgICAgZXhwZWN0KHRhc2tMaXN0LmNoaWxkTm9kZXNbNV0uY2xhc3NMaXN0KS5ub3QudG9Db250YWluKCdnb3Z1ay10ZXh0YXJlYScpXG5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIG5hdmlnYXRpbmcgYmV0d2VlbiB0YXNrIGxpc3QgcGFnZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9TVUJNSVRfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVCA9ICh0eXBlLCBwYXlsb2FkLCBvblN1Y2Nlc3MpID0+IHtcbiAgICAgICAgT05fU1VCTUlUX0NBTExTLnB1c2gocGF5bG9hZCk7XG4gICAgICAgIG9uU3VjY2VzcygpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IEhPT0tTID0ge1xuICAgICAgICBvblN1Ym1pdDogT05fU1VCTUlULFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHtcbiAgICAgICAgcmVuZGVyKDxGb3JtUmVuZGVyZXIgey4uLlRBU0tfTElTVH0gaG9va3M9e0hPT0tTfSAvPiwgY29udGFpbmVyKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0YXNrTGlzdCA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV07XG5cbiAgICAgIC8vIENoZWNrIHN0YXR1c2VzIGFyZSBjb3JyZWN0XG4gICAgICBsZXQgZmlyc3RUYXNrU3RhdHVzID0gdGFza0xpc3QuY2hpbGROb2Rlc1szXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV07XG4gICAgICBleHBlY3QoZmlyc3RUYXNrU3RhdHVzLnRleHRDb250ZW50KS50b0VxdWFsKFRhc2tTdGF0ZXMuREVUQUlMU1tUYXNrU3RhdGVzLlRZUEVTLk5PVF9TVEFSVEVEXS5sYWJlbCk7XG4gICAgICBsZXQgc2Vjb25kVGFza1N0YXR1cyA9IHRhc2tMaXN0LmNoaWxkTm9kZXNbM10uY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzFdO1xuICAgICAgZXhwZWN0KHNlY29uZFRhc2tTdGF0dXMudGV4dENvbnRlbnQpLnRvRXF1YWwoVGFza1N0YXRlcy5ERVRBSUxTW1Rhc2tTdGF0ZXMuVFlQRVMuQ0FOTk9UX1NUQVJUX1lFVF0ubGFiZWwpO1xuXG4gICAgICAvLyBMYXVuY2ggZmlyc3QgdGFza1xuICAgICAgY29uc3QgZmlyc3RUYXNrID0gdGFza0xpc3QuY2hpbGROb2Rlc1szXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGV4cGVjdChmaXJzdFRhc2sudGV4dENvbnRlbnQpLnRvRXF1YWwoJ0RhdGUsIGxvY2F0aW9uIGFuZCBtb2RlIGRldGFpbHMnKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhmaXJzdFRhc2ssIHt9KTtcblxuICAgICAgLy8gRmlsbCBmaXJzdCBwYWdlIGFuZCBuYXZpZ2F0ZVxuICAgICAgbGV0IG5ld1BhZ2UgPSBjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdO1xuICAgICAgZXhwZWN0KG5ld1BhZ2UuY2hpbGROb2Rlc1swXS50ZXh0Q29udGVudCkudG9FcXVhbCgnRXZlbnQgRGF0ZScpO1xuICAgICAgY29uc3QgZmllbGRzZXQgPSBuZXdQYWdlLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXTtcbiAgICAgIC8vIGNoaWxkIG5vZGVzIG9mIGZpZWxkc2V0IGFyZSBsZWdlbmQgYW5kIGRhdGVcbiAgICAgIHNldERhdGUoIGZpZWxkc2V0LmNoaWxkcmVuWzFdLCBbICc3JywgJzcnLCAnMjAyMiddKVxuXG4gICAgICBsZXQgY29udGludWVCdXR0b24gPSBuZXdQYWdlLmNoaWxkTm9kZXNbMl0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhjb250aW51ZUJ1dHRvbiwge30pO1xuXG4gICAgICAvLyBGaWxsIHNlY29uZCBwYWdlIGFuZCBuYXZpZ2F0ZVxuICAgICAgbmV3UGFnZSA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QobmV3UGFnZS5jaGlsZE5vZGVzWzBdLnRleHRDb250ZW50KS50b0VxdWFsKCdFdmVudCBNb2RlJyk7XG4gICAgICBjb25zdCBzZWFCdXR0b24gPSBuZXdQYWdlLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzJdLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3Qoc2VhQnV0dG9uLnRleHRDb250ZW50KS50b0VxdWFsKCdTZWEnKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhzZWFCdXR0b24uY2hpbGROb2Rlc1swXSwge30pO1xuICAgICAgY29udGludWVCdXR0b24gPSBuZXdQYWdlLmNoaWxkTm9kZXNbMl0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhjb250aW51ZUJ1dHRvbiwge30pO1xuXG4gICAgICAvLyBDbGljayBjaGFuZ2UgdG8gbW9kZSBvbiBDWUEgcGFnZVxuICAgICAgY29uc3QgY3lhUGFnZUNoYW5nZSA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QoY3lhUGFnZUNoYW5nZS5jaGlsZE5vZGVzWzBdLnRleHRDb250ZW50KS50b0VxdWFsKCdDaGVjayB5b3VyIGFuc3dlcnMnKTtcbiAgICAgIGNvbnN0IG1vZGVDaGFuZ2VMaW5rID0gY3lhUGFnZUNoYW5nZS5jaGlsZE5vZGVzWzRdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzJdLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QobW9kZUNoYW5nZUxpbmsudGV4dENvbnRlbnQpLnRvRXF1YWwoJ0NoYW5nZSBFdmVudCBNb2RlJyk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2sobW9kZUNoYW5nZUxpbmssIHt9KTtcblxuICAgICAgY29uc3QgY2hhbmdlUGFnZSA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QoY2hhbmdlUGFnZS5jaGlsZE5vZGVzWzBdLnRleHRDb250ZW50KS50b0VxdWFsKCdFdmVudCBNb2RlJyk7XG4gICAgICAvLyBDbGljayBvbiByYWRpbyBmb3IgJ0FpcidcbiAgICAgIGNvbnN0IGFpckJ1dHRvbiA9IGNoYW5nZVBhZ2UuY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMl0uY2hpbGROb2Rlc1sxXTtcbiAgICAgIGV4cGVjdChhaXJCdXR0b24udGV4dENvbnRlbnQpLnRvRXF1YWwoJ0FpcicpO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGFpckJ1dHRvbi5jaGlsZE5vZGVzWzBdKTtcbiAgICAgIC8vIENvbnRpbnVlIGFnYWluIHRvIENZQSBwYWdlXG4gICAgICBleHBlY3QoY2hhbmdlUGFnZS5jaGlsZE5vZGVzWzJdLmNoaWxkTm9kZXNbMF0udGV4dENvbnRlbnQpLnRvRXF1YWwoJ1NhdmUgYW5kIGNvbnRpbnVlJyk7XG4gICAgICBjb250aW51ZUJ1dHRvbiA9IGNoYW5nZVBhZ2UuY2hpbGROb2Rlc1syXS5jaGlsZE5vZGVzWzBdO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGNvbnRpbnVlQnV0dG9uLCB7fSk7XG5cbiAgICAgIC8vIENvbnRpbnVlIG9uIGZyb20gQ1lBIHBhZ2VcbiAgICAgIGNvbnN0IGN5YVBhZ2UgPSBjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdO1xuICAgICAgZXhwZWN0KGN5YVBhZ2UuY2hpbGROb2Rlc1swXS50ZXh0Q29udGVudCkudG9FcXVhbCgnQ2hlY2sgeW91ciBhbnN3ZXJzJyk7XG4gICAgICBleHBlY3QoY3lhUGFnZS5jaGlsZE5vZGVzWzVdLmNoaWxkTm9kZXNbMF0udGV4dENvbnRlbnQpLnRvRXF1YWwoJ1NhdmUgYW5kIGNvbnRpbnVlJyk7XG4gICAgICBleHBlY3QoY3lhUGFnZS5jaGlsZE5vZGVzWzVdLmNoaWxkTm9kZXNbMV0udGV4dENvbnRlbnQpLnRvRXF1YWwoJ1NhdmUgYW5kIHJldHVybiBsYXRlcicpO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGN5YVBhZ2UuY2hpbGROb2Rlc1s1XS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIFNob3VsZCBiZSBiYWNrIGF0IHRhc2sgbGlzdFxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0udGV4dENvbnRlbnQpLnRvRXF1YWwoJ1Rhc2sgTGlzdCBGb3JtJyk7XG5cbiAgICAgIC8vIENoZWNrIHN0YXR1c2VzIGFyZSBjb3JyZWN0XG4gICAgICBmaXJzdFRhc2tTdGF0dXMgPSBjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbM10uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdO1xuICAgICAgZXhwZWN0KGZpcnN0VGFza1N0YXR1cy50ZXh0Q29udGVudCkudG9FcXVhbChUYXNrU3RhdGVzLkRFVEFJTFNbVGFza1N0YXRlcy5UWVBFUy5DT01QTEVURV0ubGFiZWwpO1xuICAgICAgc2Vjb25kVGFza1N0YXR1cyA9IGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1szXS5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMV07XG4gICAgICBleHBlY3Qoc2Vjb25kVGFza1N0YXR1cy50ZXh0Q29udGVudCkudG9FcXVhbChUYXNrU3RhdGVzLkRFVEFJTFNbVGFza1N0YXRlcy5UWVBFUy5OT1RfU1RBUlRFRF0ubGFiZWwpO1xuXG4gICAgICAvLyBDaGVjayBmaW5hbCBkYXRhIHN1Ym1pdHRlZCB0byBiYWNrZW5kIGlzIGFzIGV4cGVjdGVkXG4gICAgICBjb25zdCBmaW5hbFN1Ym1pdCA9IE9OX1NVQk1JVF9DQUxMU1tPTl9TVUJNSVRfQ0FMTFMubGVuZ3RoIC0gMV07XG4gICAgICBleHBlY3QoZmluYWxTdWJtaXQuZGF0ZSkudG9FcXVhbCgnNy03LTIwMjInKTtcbiAgICAgIGV4cGVjdChmaW5hbFN1Ym1pdC5tb2RlKS50b0VxdWFsKCdhaXInKTtcbiAgICAgIGV4cGVjdChmaW5hbFN1Ym1pdC5mb3JtU3RhdHVzLnRhc2tzWydEYXRlLCBsb2NhdGlvbiBhbmQgbW9kZSBkZXRhaWxzJ10uY29tcGxldGUpLnRvRXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdvIHN0cmFpZ2h0IHRvIENZQSBwYWdlIGlmIGEgY29tcGxldGUgdGFzayBpcyBzZWxlY3RlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVCA9ICh0eXBlLCBwYXlsb2FkLCBvblN1Y2Nlc3MpID0+IHtcbiAgICAgICAgb25TdWNjZXNzKCk7XG4gICAgICB9O1xuICAgICAgY29uc3QgSE9PS1MgPSB7XG4gICAgICAgIG9uU3VibWl0OiBPTl9TVUJNSVQsXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICByZW5kZXIoPEZvcm1SZW5kZXJlciB7Li4uVEFTS19MSVNUfSBob29rcz17SE9PS1N9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRhc2tMaXN0ID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcblxuICAgICAgLy8gTGF1bmNoIGZpcnN0IHRhc2tcbiAgICAgIGZpcmVFdmVudC5jbGljayh0YXNrTGlzdC5jaGlsZE5vZGVzWzNdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIEZpbGwgZmlyc3QgcGFnZSBhbmQgbmF2aWdhdGVcbiAgICAgIGxldCBuZXdQYWdlID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGNvbnN0IGZpZWxkc2V0ID0gbmV3UGFnZS5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMF07XG4gICAgICBzZXREYXRlKCBmaWVsZHNldC5jaGlsZHJlblsxXSwgWyAnNycsICc3JywgJzIwMjInXSlcbiAgICAgIC8vIGNoaWxkIG5vZGVzIG9mIGZpZWxkc2V0IGFyZSBsZWdlbmQgYW5kIGRhdGVcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKG5ld1BhZ2UuY2hpbGROb2Rlc1syXS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIEZpbGwgc2Vjb25kIHBhZ2UgYW5kIG5hdmlnYXRlXG4gICAgICBuZXdQYWdlID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhuZXdQYWdlLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzJdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXSwge30pO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKG5ld1BhZ2UuY2hpbGROb2Rlc1syXS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIENvbnRpbnVlIG9uIGZyb20gQ1lBIHBhZ2VcbiAgICAgIGZpcmVFdmVudC5jbGljayhjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbNV0uY2hpbGROb2Rlc1swXSwge30pO1xuXG4gICAgICAvLyBMYXVuY2ggc2FtZSB0YXNrIGFnYWluXG4gICAgICBmaXJlRXZlbnQuY2xpY2soY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzNdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIFNob3VsZCBiZSBhdCBDWUEgcGFnZVxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS50ZXh0Q29udGVudCkudG9FcXVhbCgnQ2hlY2sgeW91ciBhbnN3ZXJzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdvIHRvIGluY29tcGxldGUgcGFnZSB3aGVuIHNlbGVjdGluZyBpbi1wcm9ncmVzcyB0YXNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgT05fU1VCTUlUID0gKHR5cGUsIHBheWxvYWQsIG9uU3VjY2VzcykgPT4ge1xuICAgICAgICBvblN1Y2Nlc3MoKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25TdWJtaXQ6IE9OX1NVQk1JVCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IERBVEEgPSB7XCJkYXRlXCI6XCI3LTctMjAyMlwiLFwiZm9ybVN0YXR1c1wiOntcInRhc2tzXCI6e1wiRGF0ZSwgbG9jYXRpb24gYW5kIG1vZGUgZGV0YWlsc1wiOntcImNvbXBsZXRlXCI6ZmFsc2UsXCJjdXJyZW50UGFnZVwiOlwiZXZlbnRNb2RlXCJ9fSxcInRhc2tQYWdlXCI6XCJldmVudE1vZGVcIn19O1xuXG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICByZW5kZXIoPEZvcm1SZW5kZXJlciB7Li4uVEFTS19MSVNUfSBob29rcz17SE9PS1N9IGRhdGE9e0RBVEF9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRhc2tMaXN0ID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcblxuICAgICAgLy8gTGF1bmNoIGZpcnN0IHRhc2tcbiAgICAgIGZpcmVFdmVudC5jbGljayh0YXNrTGlzdC5jaGlsZE5vZGVzWzNdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIFNob3VsZCBiZSBhdCBFdmVudCBNb2RlIHBhZ2VcbiAgICAgIGV4cGVjdChjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0udGV4dENvbnRlbnQpLnRvRXF1YWwoJ0V2ZW50IE1vZGUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ28gdG8gdGhlIGZpcnN0IHBhZ2Ugb2YgYSBjb21wbGV0ZSB0YXNrIGlmIG5vVGFza0NZQXMgc3BlY2lmaWVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgT05fU1VCTUlUID0gKHR5cGUsIHBheWxvYWQsIG9uU3VjY2VzcykgPT4ge1xuICAgICAgICBvblN1Y2Nlc3MoKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25TdWJtaXQ6IE9OX1NVQk1JVCxcbiAgICAgIH07XG4gICAgICBjb25zdCBUQVNLX0xJU1RfV0lUSF9OT19UQVNLX0NZQVMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KFRBU0tfTElTVCkpO1xuICAgICAgVEFTS19MSVNUX1dJVEhfTk9fVEFTS19DWUFTLmh1Yi5ub1Rhc2tDWUFzID0gdHJ1ZTtcbiAgICAgIFRBU0tfTElTVF9XSVRIX05PX1RBU0tfQ1lBUy5wYWdlc1sxXS5hY3Rpb25zWzBdID0geyB0eXBlOiAnc2F2ZScsIGNvbXBsZXRlOiB0cnVlIH07XG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICByZW5kZXIoPEZvcm1SZW5kZXJlciB7Li4uVEFTS19MSVNUX1dJVEhfTk9fVEFTS19DWUFTfSBob29rcz17SE9PS1N9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRhc2tMaXN0ID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcblxuICAgICAgLy8gTGF1bmNoIGZpcnN0IHRhc2tcbiAgICAgIGZpcmVFdmVudC5jbGljayh0YXNrTGlzdC5jaGlsZE5vZGVzWzNdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIEZpbGwgZmlyc3QgcGFnZSBhbmQgbmF2aWdhdGVcbiAgICAgIGxldCBuZXdQYWdlID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGNvbnN0IGZpZWxkc2V0ID0gbmV3UGFnZS5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMF07XG4gICAgICBzZXREYXRlKCBmaWVsZHNldC5jaGlsZHJlblsxXSwgWyAnNycsICc3JywgJzIwMjInXSlcblxuICAgICAgZmlyZUV2ZW50LmNsaWNrKG5ld1BhZ2UuY2hpbGROb2Rlc1syXS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIEZpbGwgc2Vjb25kIHBhZ2VcbiAgICAgIG5ld1BhZ2UgPSBjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdO1xuICAgICAgLy8gZXhwZWN0KG5ld1BhZ2UuY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMl0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdKS50b0VxdWFsKCcnKTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhuZXdQYWdlLmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzJdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXSwge30pO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKG5ld1BhZ2UuY2hpbGROb2Rlc1syXS5jaGlsZE5vZGVzWzBdLCB7fSk7XG5cbiAgICAgIC8vIExhdW5jaCBzYW1lIHRhc2sgYWdhaW5cbiAgICAgIGZpcmVFdmVudC5jbGljayhjb250YWluZXIuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbM10uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0sIHt9KTtcblxuICAgICAgLy8gU2hvdWxkIGJlIG9uIHRoZSBmaXJzdCBwYWdlXG4gICAgICBleHBlY3QoY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLnRleHRDb250ZW50KS50b0VxdWFsKCdFdmVudCBEYXRlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBjYW5jZWxsYXRpb24gZnJvbSBhIHBhZ2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9DQU5DRUxfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IE9OX0NBTkNFTCA9ICgpID0+IHtcbiAgICAgICAgT05fQ0FOQ0VMX0NBTExTLnB1c2godW5kZWZpbmVkKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25DYW5jZWw6IE9OX0NBTkNFTFxuICAgICAgfTtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbmRlcig8Rm9ybVJlbmRlcmVyIHsuLi5VU0VSX1BST0ZJTEV9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSBob29rcz17SE9PS1N9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBmb3JtID0gY2hlY2tGb3JtKGNvbnRhaW5lcik7XG5cbiAgICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBcIkFyZSB5b3UgYSBjaXZpbCBzZXJ2YW50P1wiIHBhZ2UuXG4gICAgICBjb25zdCBodWIgPSBmb3JtLmNoaWxkTm9kZXNbMV07IC8vIEh1YiA9IENZQVxuICAgICAgY29uc3QgWywgLCBjaXZpbFNlcnZhbnRMaXN0XSA9IGh1Yi5jaGlsZE5vZGVzO1xuICAgICAgY29uc3QgbGluayA9IGdldENoYW5nZUxpbmsoY2l2aWxTZXJ2YW50TGlzdCk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2sobGluaywge30pO1xuXG4gICAgICAvLyBTaG91bGQgYWxyZWFkeSBiZSBhbnN3ZXJlZCBcIlllc1wiLCBzbyBzaW1wbHkgY2xpY2sgXCJDb250aW51ZVwiLlxuICAgICAgY29uc3QgcGFnZSA9IGZvcm0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGNvbnN0IGNhbmNlbCA9IGdldENhbmNlbEJ1dHRvbihwYWdlKTtcbiAgICAgIGV4cGVjdChPTl9DQU5DRUxfQ0FMTFMubGVuZ3RoKS50b0VxdWFsKDApO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGNhbmNlbCwge30pO1xuICAgICAgZXhwZWN0KE9OX0NBTkNFTF9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5hdmlnYXRlIHRvIGEgc3BlY2lmaWMgcGFnZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgdGFzayBpZiBpdCBpcyBzZXQgYXMgdGhlIGZpcnN0UGFnZSBvZiBhIHRhc2snLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9TVUJNSVRfQ0FMTFMgPSBbXTtcbiAgICAgIGNvbnN0IE9OX1NVQk1JVCA9ICh0eXBlLCBwYXlsb2FkLCBvblN1Y2Nlc3MpID0+IHtcbiAgICAgICAgT05fU1VCTUlUX0NBTExTLnB1c2gocGF5bG9hZCk7XG4gICAgICAgIG9uU3VjY2VzcygpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IEhPT0tTID0ge1xuICAgICAgICBvblN1Ym1pdDogT05fU1VCTUlULFxuICAgICAgfTtcblxuICAgICAgY29uc3QgVEFTS19MSVNUX05PTl9TRVFVRU5USUFMID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShUQVNLX0xJU1QpKTtcbiAgICAgIFRBU0tfTElTVF9OT05fU0VRVUVOVElBTC5odWIubm9uU2VxdWVudGlhbCA9IHRydWU7XG4gICAgICBhd2FpdCBhY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICByZW5kZXIoPEZvcm1SZW5kZXJlciB7Li4uVEFTS19MSVNUX05PTl9TRVFVRU5USUFMfSBob29rcz17SE9PS1N9IC8+LCBjb250YWluZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRhc2tMaXN0ID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXTtcblxuICAgICAgLy8gTGF1bmNoIGZpcnN0IHRhc2sgb2Ygc2Vjb25kIHNlY3Rpb25cbiAgICAgIGNvbnN0IGZpcnN0VGFzayA9IHRhc2tMaXN0LmNoaWxkTm9kZXNbNV0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QoZmlyc3RUYXNrLnRleHRDb250ZW50KS50b0VxdWFsKCdQZW9wbGUgZGV0YWlscycpO1xuICAgICAgZmlyZUV2ZW50LmNsaWNrKGZpcnN0VGFzaywge30pO1xuXG4gICAgICAvLyBTaG91bGQgYmUgYXQgU3VybmFtZSBwYWdlXG4gICAgICBjb25zdCBuZXdQYWdlID0gY29udGFpbmVyLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXTtcbiAgICAgIGV4cGVjdChuZXdQYWdlLmNoaWxkTm9kZXNbMF0udGV4dENvbnRlbnQpLnRvRXF1YWwoJ1N1cm5hbWUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIHBhZ2UgbmF2aWdhdGlvbiBjb3JyZWN0bHkgd2hlbiBoaWRlQmxhbmtSb3dzIGlzIHRydWUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBPTl9QQUdFX0NIQU5HRV9DQUxMUyA9IFtdO1xuICAgICAgY29uc3QgT05fUEFHRV9DSEFOR0UgPSAocGFnZUlkKSA9PiB7XG4gICAgICAgIE9OX1BBR0VfQ0hBTkdFX0NBTExTLnB1c2gocGFnZUlkKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBIT09LUyA9IHtcbiAgICAgICAgb25QYWdlQ2hhbmdlOiBPTl9QQUdFX0NIQU5HRVxuICAgICAgfTtcbiAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgIHJlbmRlcig8Rm9ybVJlbmRlcmVyIHsuLi5VU0VSX1BST0ZJTEV9IGRhdGE9e1VTRVJfUFJPRklMRV9EQVRBfSBob29rcz17SE9PS1N9IGhpZGVCbGFua1Jvd3MvPiwgY29udGFpbmVyKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9ybSA9IGNoZWNrRm9ybShjb250YWluZXIpO1xuXG4gICAgICAvLyBOYXZpZ2F0ZSB0byB0aGUgXCJBZGQgb3IgY2hhbmdlIGEgbGluZSBtYW5hZ2VyXCIgcGFnZS5cbiAgICAgIGNvbnN0IGh1YiA9IGZvcm0uY2hpbGROb2Rlc1sxXTsgLy8gSHViID0gQ1lBXG4gICAgICBjb25zdCBbLCAsICwgbGluZU1hbmFnZXJMaXN0XSA9IGh1Yi5jaGlsZE5vZGVzO1xuICAgICAgY29uc3QgbGluayA9IGdldENoYW5nZUxpbmsobGluZU1hbmFnZXJMaXN0KTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMCk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2sobGluaywge30pO1xuICAgICAgZXhwZWN0KE9OX1BBR0VfQ0hBTkdFX0NBTExTWzBdKS50b0VxdWFsKFVTRVJfUFJPRklMRS5wYWdlc1s0XS5pZCk7XG5cbiAgICAgIC8vIFNob3VsZCBiZSBvbiB0aGUgcGFnZSBleHBsYWluaW5nIHdoYXQgY2hhbmdpbmcgdGhlIGxpbmUgbWFuYWdlciBtZWFucy5cbiAgICAgIGNvbnN0IHBhZ2UgPSBmb3JtLmNoaWxkTm9kZXNbMF07XG4gICAgICBjb25zdCBwYWdlSGVhZGluZyA9IHBhZ2UuY2hpbGROb2Rlc1swXTtcbiAgICAgIGV4cGVjdChwYWdlSGVhZGluZy50YWdOYW1lKS50b0VxdWFsKCdIMScpO1xuICAgICAgZXhwZWN0KHBhZ2VIZWFkaW5nLnRleHRDb250ZW50KS50b0VxdWFsKFVTRVJfUFJPRklMRS5wYWdlc1s0XS50aXRsZSk7XG5cbiAgICAgIC8vIE5vdyBjbGljayBvbiB0aGUgXCJDb250aW51ZVwiIGJ1dHRvbiBvbiBoZXJlLlxuICAgICAgY29uc3QgY29udGludWVCdXR0b24gPSBnZXRDb250aW51ZUJ1dHRvbihwYWdlKTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAgICBmaXJlRXZlbnQuY2xpY2soY29udGludWVCdXR0b24sIHt9KTtcbiAgICAgIGV4cGVjdChPTl9QQUdFX0NIQU5HRV9DQUxMUy5sZW5ndGgpLnRvRXF1YWwoMik7XG4gICAgICBleHBlY3QoT05fUEFHRV9DSEFOR0VfQ0FMTFNbMV0pLnRvRXF1YWwoVVNFUl9QUk9GSUxFLnBhZ2VzWzVdLmlkKTtcbiAgICAgIGNvbnN0IG5ld1BhZ2VIZWFkaW5nID0gZm9ybS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF07XG4gICAgICBleHBlY3QobmV3UGFnZUhlYWRpbmcudGFnTmFtZSkudG9FcXVhbCgnSDEnKTtcbiAgICAgIGV4cGVjdChuZXdQYWdlSGVhZGluZy50ZXh0Q29udGVudCkudG9FcXVhbChVU0VSX1BST0ZJ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
|