@payloadcms/ui 3.0.0-alpha.14 → 3.0.0-alpha.16
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/dist/@types/assets.d.js +0 -1
- package/dist/config.js +2 -12
- package/dist/elements/ArrayAction/index.js +25 -81
- package/dist/elements/ArrayAction/types.js +2 -5
- package/dist/elements/Autosave/index.js +37 -92
- package/dist/elements/Autosave/types.js +2 -5
- package/dist/elements/Banner/index.js +10 -34
- package/dist/elements/Banner/types.js +2 -5
- package/dist/elements/Button/index.js +30 -89
- package/dist/elements/Button/types.js +2 -5
- package/dist/elements/Card/index.js +9 -24
- package/dist/elements/Card/types.js +2 -5
- package/dist/elements/CodeEditor/CodeEditor.js +10 -25
- package/dist/elements/CodeEditor/index.js +8 -59
- package/dist/elements/CodeEditor/types.js +2 -5
- package/dist/elements/Collapsible/index.js +26 -82
- package/dist/elements/Collapsible/provider.js +7 -66
- package/dist/elements/Collapsible/types.js +2 -5
- package/dist/elements/ColumnSelector/index.js +20 -76
- package/dist/elements/ColumnSelector/types.js +2 -5
- package/dist/elements/CopyToClipboard/index.js +14 -65
- package/dist/elements/CopyToClipboard/types.js +2 -5
- package/dist/elements/DatePicker/DatePicker.js +19 -75
- package/dist/elements/DatePicker/index.js +8 -59
- package/dist/elements/DatePicker/types.js +2 -5
- package/dist/elements/DeleteDocument/index.js +36 -86
- package/dist/elements/DeleteDocument/types.js +2 -5
- package/dist/elements/DeleteMany/index.js +38 -102
- package/dist/elements/DeleteMany/types.js +2 -5
- package/dist/elements/DocumentControls/index.js +46 -102
- package/dist/elements/DocumentDrawer/DrawerContent.js +62 -114
- package/dist/elements/DocumentDrawer/index.js +33 -98
- package/dist/elements/DocumentDrawer/types.js +2 -5
- package/dist/elements/DocumentFields/index.js +16 -31
- package/dist/elements/DocumentHeader/Tabs/ShouldRenderTabs.js +4 -14
- package/dist/elements/DocumentHeader/Tabs/Tab/TabLink.js +9 -24
- package/dist/elements/DocumentHeader/Tabs/Tab/index.js +9 -68
- package/dist/elements/DocumentHeader/Tabs/getCustomViews.js +5 -15
- package/dist/elements/DocumentHeader/Tabs/getViewConfig.js +2 -12
- package/dist/elements/DocumentHeader/Tabs/index.js +18 -33
- package/dist/elements/DocumentHeader/Tabs/tabs/VersionsPill/index.js +8 -23
- package/dist/elements/DocumentHeader/Tabs/tabs/index.js +5 -23
- package/dist/elements/DocumentHeader/index.js +10 -66
- package/dist/elements/DraggableSortable/DraggableSortableItem/index.js +7 -66
- package/dist/elements/DraggableSortable/DraggableSortableItem/types.js +2 -5
- package/dist/elements/DraggableSortable/index.js +15 -66
- package/dist/elements/DraggableSortable/types.js +2 -5
- package/dist/elements/DraggableSortable/useDraggableSortable/index.js +4 -14
- package/dist/elements/DraggableSortable/useDraggableSortable/types.js +2 -5
- package/dist/elements/Drawer/index.js +32 -94
- package/dist/elements/Drawer/types.js +2 -5
- package/dist/elements/Drawer/useDrawerSlug.js +8 -18
- package/dist/elements/Dropzone/index.js +20 -35
- package/dist/elements/DuplicateDocument/index.js +33 -83
- package/dist/elements/DuplicateDocument/types.js +2 -5
- package/dist/elements/EditMany/index.js +72 -128
- package/dist/elements/EditMany/types.js +2 -5
- package/dist/elements/EditUpload/index.js +66 -122
- package/dist/elements/ErrorPill/index.js +7 -22
- package/dist/elements/ErrorPill/types.js +2 -5
- package/dist/elements/FieldSelect/index.js +23 -79
- package/dist/elements/FileDetails/FileMeta/index.js +19 -75
- package/dist/elements/FileDetails/FileMeta/types.js +2 -5
- package/dist/elements/FileDetails/index.js +15 -30
- package/dist/elements/FileDetails/types.js +2 -5
- package/dist/elements/GenerateConfirmation/index.js +22 -37
- package/dist/elements/GenerateConfirmation/types.js +2 -5
- package/dist/elements/GetFilterOptions/index.js +18 -33
- package/dist/elements/Gutter/index.js +5 -56
- package/dist/elements/Hamburger/index.js +18 -33
- package/dist/elements/Header/index.js +39 -95
- package/dist/elements/HydrateClientUser/index.js +6 -16
- package/dist/elements/IDLabel/index.js +5 -20
- package/dist/elements/ListControls/getTextFieldsToBeSearched.js +6 -16
- package/dist/elements/ListControls/index.js +52 -104
- package/dist/elements/ListControls/types.js +2 -5
- package/dist/elements/ListDrawer/DrawerContent.js +72 -128
- package/dist/elements/ListDrawer/index.js +32 -100
- package/dist/elements/ListDrawer/types.js +2 -5
- package/dist/elements/ListSelection/index.js +11 -62
- package/dist/elements/Loading/index.js +25 -51
- package/dist/elements/LoadingOverlay/index.js +17 -79
- package/dist/elements/LoadingOverlay/reducer.js +3 -21
- package/dist/elements/LoadingOverlay/types.js +2 -5
- package/dist/elements/Localizer/LocalizerLabel/index.js +15 -30
- package/dist/elements/Localizer/index.js +24 -80
- package/dist/elements/Logout/index.js +13 -28
- package/dist/elements/Nav/NavHamburger/index.js +8 -23
- package/dist/elements/Nav/NavToggler/index.js +13 -28
- package/dist/elements/Nav/NavWrapper/index.js +8 -23
- package/dist/elements/Nav/context.js +20 -82
- package/dist/elements/Nav/index.js +36 -51
- package/dist/elements/NavGroup/index.js +21 -77
- package/dist/elements/Pagination/ClickableArrow/index.js +7 -22
- package/dist/elements/Pagination/ClickableArrow/types.js +2 -5
- package/dist/elements/Pagination/Page/index.js +4 -19
- package/dist/elements/Pagination/Page/types.js +2 -5
- package/dist/elements/Pagination/Separator/index.js +4 -19
- package/dist/elements/Pagination/index.js +20 -35
- package/dist/elements/Pagination/types.js +2 -5
- package/dist/elements/PerPage/index.js +28 -83
- package/dist/elements/Pill/index.js +16 -40
- package/dist/elements/Pill/types.js +2 -5
- package/dist/elements/Popup/PopupButtonList/index.js +10 -75
- package/dist/elements/Popup/PopupTrigger/index.js +6 -21
- package/dist/elements/Popup/PopupTrigger/types.js +2 -5
- package/dist/elements/Popup/index.js +29 -80
- package/dist/elements/Popup/types.js +2 -5
- package/dist/elements/PreviewButton/index.js +22 -73
- package/dist/elements/PreviewSizes/index.js +24 -80
- package/dist/elements/Publish/index.js +23 -79
- package/dist/elements/PublishMany/index.js +37 -93
- package/dist/elements/PublishMany/types.js +2 -5
- package/dist/elements/ReactSelect/ClearIndicator/index.js +7 -22
- package/dist/elements/ReactSelect/Control/index.js +5 -20
- package/dist/elements/ReactSelect/MultiValue/index.js +8 -23
- package/dist/elements/ReactSelect/MultiValueLabel/index.js +7 -22
- package/dist/elements/ReactSelect/MultiValueRemove/index.js +12 -27
- package/dist/elements/ReactSelect/SingleValue/index.js +5 -20
- package/dist/elements/ReactSelect/ValueContainer/index.js +7 -22
- package/dist/elements/ReactSelect/index.js +45 -60
- package/dist/elements/ReactSelect/types.js +2 -5
- package/dist/elements/RenderCustomComponent/index.js +5 -20
- package/dist/elements/RenderCustomComponent/types.js +2 -5
- package/dist/elements/RenderTitle/index.js +9 -24
- package/dist/elements/RenderTitle/types.js +2 -5
- package/dist/elements/Save/index.js +16 -72
- package/dist/elements/SaveDraft/index.js +24 -80
- package/dist/elements/SearchFilter/index.js +31 -86
- package/dist/elements/SearchFilter/types.js +2 -5
- package/dist/elements/SelectAll/index.js +13 -28
- package/dist/elements/SelectRow/index.js +10 -25
- package/dist/elements/ShimmerEffect/index.js +12 -71
- package/dist/elements/SortColumn/index.js +27 -90
- package/dist/elements/SortColumn/types.js +2 -5
- package/dist/elements/SortComplex/index.js +35 -90
- package/dist/elements/SortComplex/types.js +2 -5
- package/dist/elements/Status/index.js +38 -88
- package/dist/elements/StayLoggedIn/index.js +20 -34
- package/dist/elements/StayLoggedIn/types.js +2 -5
- package/dist/elements/StepNav/SetStepNav.js +6 -16
- package/dist/elements/StepNav/index.js +27 -93
- package/dist/elements/StepNav/types.js +2 -5
- package/dist/elements/Table/TableCellProvider/index.js +7 -30
- package/dist/elements/Table/index.js +15 -38
- package/dist/elements/Table/types.js +2 -5
- package/dist/elements/TableColumns/buildColumns.js +7 -22
- package/dist/elements/TableColumns/columnReducer.js +2 -12
- package/dist/elements/TableColumns/index.js +24 -86
- package/dist/elements/Thumbnail/index.js +12 -68
- package/dist/elements/Thumbnail/types.js +2 -5
- package/dist/elements/ThumbnailCard/index.js +13 -28
- package/dist/elements/ThumbnailCard/types.js +2 -5
- package/dist/elements/Tooltip/index.js +14 -65
- package/dist/elements/Tooltip/types.js +2 -5
- package/dist/elements/Translation/index.js +7 -58
- package/dist/elements/UnpublishMany/index.js +37 -93
- package/dist/elements/UnpublishMany/types.js +2 -5
- package/dist/elements/Upload/index.js +57 -127
- package/dist/elements/Upload/types.js +2 -5
- package/dist/elements/ViewDescription/index.js +12 -27
- package/dist/elements/ViewDescription/types.js +4 -19
- package/dist/elements/WhereBuilder/Condition/Date/index.js +6 -21
- package/dist/elements/WhereBuilder/Condition/Date/types.js +2 -5
- package/dist/elements/WhereBuilder/Condition/Number/index.js +7 -22
- package/dist/elements/WhereBuilder/Condition/Number/types.js +2 -5
- package/dist/elements/WhereBuilder/Condition/Relationship/index.js +28 -84
- package/dist/elements/WhereBuilder/Condition/Relationship/optionsReducer.js +5 -15
- package/dist/elements/WhereBuilder/Condition/Relationship/types.js +2 -5
- package/dist/elements/WhereBuilder/Condition/Select/index.js +15 -30
- package/dist/elements/WhereBuilder/Condition/Select/types.js +2 -5
- package/dist/elements/WhereBuilder/Condition/Text/index.js +7 -22
- package/dist/elements/WhereBuilder/Condition/Text/types.js +2 -5
- package/dist/elements/WhereBuilder/Condition/index.js +37 -93
- package/dist/elements/WhereBuilder/Condition/types.js +2 -5
- package/dist/elements/WhereBuilder/field-types.js +2 -12
- package/dist/elements/WhereBuilder/index.js +43 -98
- package/dist/elements/WhereBuilder/reducer.js +2 -12
- package/dist/elements/WhereBuilder/transformWhereQuery.js +6 -12
- package/dist/elements/WhereBuilder/types.js +2 -5
- package/dist/elements/WhereBuilder/validateWhereQuery.js +4 -14
- package/dist/exports/assets.js +3 -26
- package/dist/exports/elements.js +48 -249
- package/dist/exports/forms.js +38 -173
- package/dist/exports/graphics.js +3 -26
- package/dist/exports/hooks.js +10 -54
- package/dist/exports/icons.js +18 -81
- package/dist/exports/index.js +10 -27
- package/dist/exports/providers.js +24 -118
- package/dist/exports/templates.js +3 -21
- package/dist/exports/types.js +2 -5
- package/dist/exports/utilities.js +11 -61
- package/dist/forms/Error/index.js +11 -26
- package/dist/forms/FieldDescription/index.js +9 -24
- package/dist/forms/FieldDescription/types.js +2 -5
- package/dist/forms/FieldPathProvider/index.js +7 -30
- package/dist/forms/FieldPathProvider/types.js +2 -5
- package/dist/forms/Form/buildFieldSchemaMap.js +14 -14
- package/dist/forms/Form/buildInitialState.js +2 -12
- package/dist/forms/Form/context.js +17 -67
- package/dist/forms/Form/createNestedFieldPath.js +5 -15
- package/dist/forms/Form/errorMessages.js +2 -12
- package/dist/forms/Form/fieldReducer.js +25 -38
- package/dist/forms/Form/getDataByPath.js +4 -14
- package/dist/forms/Form/getSiblingData.js +6 -21
- package/dist/forms/Form/index.js +84 -140
- package/dist/forms/Form/initContextState.js +2 -12
- package/dist/forms/Form/mergeServerFormState.js +4 -14
- package/dist/forms/Form/reduceFieldsToValues.js +4 -14
- package/dist/forms/Form/rows.js +3 -21
- package/dist/forms/Form/types.js +2 -5
- package/dist/forms/Label/index.js +9 -24
- package/dist/forms/NullifyField/index.js +15 -71
- package/dist/forms/RenderFields/RenderField.js +6 -21
- package/dist/forms/RenderFields/index.js +13 -28
- package/dist/forms/RenderFields/types.js +2 -5
- package/dist/forms/RowLabel/index.js +13 -28
- package/dist/forms/RowLabel/types.js +4 -19
- package/dist/forms/Submit/index.js +11 -62
- package/dist/forms/WatchChildErrors/buildPathSegments.js +2 -12
- package/dist/forms/WatchChildErrors/getFieldStateFromPaths.js +2 -12
- package/dist/forms/WatchChildErrors/getNestedFieldState.js +5 -14
- package/dist/forms/WatchChildErrors/index.js +11 -26
- package/dist/forms/fields/Array/ArrayRow.js +24 -39
- package/dist/forms/fields/Array/index.js +59 -115
- package/dist/forms/fields/Array/types.js +2 -5
- package/dist/forms/fields/Blocks/BlockRow.js +27 -42
- package/dist/forms/fields/Blocks/BlocksDrawer/BlockSearch/index.js +10 -25
- package/dist/forms/fields/Blocks/BlocksDrawer/index.js +29 -85
- package/dist/forms/fields/Blocks/BlocksDrawer/types.js +2 -5
- package/dist/forms/fields/Blocks/RowActions.js +12 -27
- package/dist/forms/fields/Blocks/SectionTitle/index.js +10 -25
- package/dist/forms/fields/Blocks/SectionTitle/types.js +2 -5
- package/dist/forms/fields/Blocks/index.js +64 -120
- package/dist/forms/fields/Blocks/types.js +2 -5
- package/dist/forms/fields/Checkbox/Input.js +11 -34
- package/dist/forms/fields/Checkbox/index.js +19 -75
- package/dist/forms/fields/Checkbox/types.js +2 -5
- package/dist/forms/fields/Code/index.js +15 -71
- package/dist/forms/fields/Code/types.js +2 -5
- package/dist/forms/fields/Collapsible/index.js +31 -87
- package/dist/forms/fields/Collapsible/types.js +2 -5
- package/dist/forms/fields/ConfirmPassword/index.js +19 -75
- package/dist/forms/fields/ConfirmPassword/types.js +2 -5
- package/dist/forms/fields/DateTime/index.js +18 -74
- package/dist/forms/fields/DateTime/types.js +2 -5
- package/dist/forms/fields/Email/index.js +19 -83
- package/dist/forms/fields/Email/types.js +2 -5
- package/dist/forms/fields/Group/index.js +32 -88
- package/dist/forms/fields/Group/provider.js +7 -69
- package/dist/forms/fields/Group/types.js +2 -5
- package/dist/forms/fields/HiddenInput/index.js +8 -64
- package/dist/forms/fields/HiddenInput/types.js +2 -5
- package/dist/forms/fields/JSON/index.js +20 -76
- package/dist/forms/fields/JSON/types.js +2 -5
- package/dist/forms/fields/Number/index.js +26 -82
- package/dist/forms/fields/Number/types.js +2 -5
- package/dist/forms/fields/Password/index.js +15 -79
- package/dist/forms/fields/Password/types.js +2 -5
- package/dist/forms/fields/Point/index.js +24 -80
- package/dist/forms/fields/Point/types.js +2 -5
- package/dist/forms/fields/RadioGroup/Radio/index.js +13 -28
- package/dist/forms/fields/RadioGroup/index.js +23 -79
- package/dist/forms/fields/RadioGroup/types.js +2 -5
- package/dist/forms/fields/Relationship/AddNew/index.js +43 -99
- package/dist/forms/fields/Relationship/AddNew/types.js +2 -5
- package/dist/forms/fields/Relationship/AddNew/useRelatedCollections.js +6 -16
- package/dist/forms/fields/Relationship/createRelationMap.js +2 -12
- package/dist/forms/fields/Relationship/findOptionsByValue.js +2 -12
- package/dist/forms/fields/Relationship/index.js +64 -120
- package/dist/forms/fields/Relationship/optionsReducer.js +7 -17
- package/dist/forms/fields/Relationship/select-components/MultiValueLabel/index.js +21 -72
- package/dist/forms/fields/Relationship/select-components/SingleValue/index.js +22 -73
- package/dist/forms/fields/Relationship/types.js +2 -5
- package/dist/forms/fields/RichText/index.js +2 -12
- package/dist/forms/fields/RichText/types.js +2 -5
- package/dist/forms/fields/Row/index.js +11 -26
- package/dist/forms/fields/Row/provider.js +7 -69
- package/dist/forms/fields/Row/types.js +2 -5
- package/dist/forms/fields/Select/index.js +24 -88
- package/dist/forms/fields/Select/types.js +2 -5
- package/dist/forms/fields/Tabs/Tab/index.js +13 -64
- package/dist/forms/fields/Tabs/index.js +35 -91
- package/dist/forms/fields/Tabs/provider.js +7 -69
- package/dist/forms/fields/Tabs/types.js +2 -5
- package/dist/forms/fields/Text/Input.js +14 -29
- package/dist/forms/fields/Text/index.js +23 -79
- package/dist/forms/fields/Text/types.js +2 -5
- package/dist/forms/fields/Textarea/Input.js +15 -30
- package/dist/forms/fields/Textarea/index.js +20 -76
- package/dist/forms/fields/Textarea/types.js +2 -5
- package/dist/forms/fields/UI/index.js +2 -12
- package/dist/forms/fields/Upload/Input.js +35 -91
- package/dist/forms/fields/Upload/index.js +14 -70
- package/dist/forms/fields/Upload/types.js +2 -5
- package/dist/forms/fields/getFilterOptionsQuery.js +2 -12
- package/dist/forms/fields/index.js +50 -65
- package/dist/forms/fields/shared.js +7 -21
- package/dist/forms/useField/index.js +25 -40
- package/dist/forms/useField/types.js +2 -5
- package/dist/forms/utilities/buildStateFromSchema/addFieldStatePromise.js +21 -33
- package/dist/forms/utilities/buildStateFromSchema/buildStateFromSchema.spec.js +5 -14
- package/dist/forms/utilities/buildStateFromSchema/index.js +4 -14
- package/dist/forms/utilities/buildStateFromSchema/iterateFields.js +8 -16
- package/dist/forms/withCondition/WatchCondition.js +7 -57
- package/dist/forms/withCondition/index.js +8 -23
- package/dist/graphics/Account/Default/index.js +7 -22
- package/dist/graphics/Account/Gravatar/index.js +10 -25
- package/dist/graphics/Account/index.js +15 -30
- package/dist/graphics/DefaultBlockImage/index.js +11 -62
- package/dist/graphics/ExternalLink/index.js +5 -20
- package/dist/graphics/File/index.js +7 -22
- package/dist/graphics/Icon/index.js +13 -28
- package/dist/graphics/Logo/index.js +15 -30
- package/dist/graphics/Search/index.js +6 -21
- package/dist/hooks/useAdminThumbnail.js +5 -15
- package/dist/hooks/useDebounce.js +6 -16
- package/dist/hooks/useDebouncedCallback.js +10 -15
- package/dist/hooks/useDebouncedEffect.js +6 -16
- package/dist/hooks/useDelay.js +7 -58
- package/dist/hooks/useDelayedRender.js +11 -62
- package/dist/hooks/useHotkey.js +10 -20
- package/dist/hooks/useIntersect.js +7 -17
- package/dist/hooks/usePayloadAPI.js +17 -32
- package/dist/hooks/useResize.js +5 -15
- package/dist/hooks/useThrottledEffect.js +5 -15
- package/dist/hooks/useThumbnail.js +8 -18
- package/dist/hooks/useUseAsTitle.js +6 -16
- package/dist/icons/Calendar/index.js +8 -23
- package/dist/icons/Check/index.js +6 -21
- package/dist/icons/Chevron/index.js +5 -20
- package/dist/icons/CloseMenu/index.js +6 -21
- package/dist/icons/CodeBlock/index.js +5 -20
- package/dist/icons/Copy/index.js +6 -21
- package/dist/icons/DragHandle/index.js +10 -25
- package/dist/icons/Edit/index.js +7 -22
- package/dist/icons/Line/index.js +5 -20
- package/dist/icons/Link/index.js +6 -21
- package/dist/icons/LogOut/index.js +7 -22
- package/dist/icons/Menu/index.js +7 -22
- package/dist/icons/MinimizeMaximize/index.js +12 -63
- package/dist/icons/More/index.js +7 -22
- package/dist/icons/Plus/index.js +6 -21
- package/dist/icons/Search/index.js +6 -21
- package/dist/icons/Swap/index.js +8 -23
- package/dist/icons/X/index.js +6 -21
- package/dist/index.js +2 -19
- package/dist/providers/ActionsProvider/SetViewActions/index.js +6 -16
- package/dist/providers/ActionsProvider/index.js +11 -70
- package/dist/providers/Auth/HydrateClientUser/index.js +6 -16
- package/dist/providers/Auth/index.js +52 -116
- package/dist/providers/Auth/types.js +2 -5
- package/dist/providers/ClientFunction/index.js +14 -40
- package/dist/providers/ComponentMapProvider/index.js +9 -68
- package/dist/providers/Config/index.js +6 -65
- package/dist/providers/CustomProvider/index.js +9 -24
- package/dist/providers/DocumentEvents/index.js +7 -66
- package/dist/providers/DocumentEvents/types.js +2 -5
- package/dist/providers/DocumentInfo/SetDocumentInfo/index.js +9 -19
- package/dist/providers/DocumentInfo/index.js +42 -100
- package/dist/providers/DocumentInfo/types.js +2 -5
- package/dist/providers/EditDepth/index.js +5 -67
- package/dist/providers/FormQueryParams/index.js +7 -69
- package/dist/providers/ListInfo/index.js +9 -68
- package/dist/providers/ListInfo/types.js +2 -5
- package/dist/providers/Locale/index.js +28 -87
- package/dist/providers/OperationProvider/index.js +5 -67
- package/dist/providers/Params/index.js +9 -67
- package/dist/providers/Portal/index.js +4 -19
- package/dist/providers/Preferences/index.js +25 -89
- package/dist/providers/Root/index.js +31 -82
- package/dist/providers/SearchParams/index.js +14 -77
- package/dist/providers/SearchParams/types.js +2 -5
- package/dist/providers/SelectionProvider/index.js +23 -90
- package/dist/providers/Theme/index.js +11 -73
- package/dist/providers/Theme/types.js +2 -5
- package/dist/providers/Theme/utilities.js +3 -21
- package/dist/providers/Translation/index.js +8 -67
- package/dist/templates/Default/NavHamburger/index.js +7 -22
- package/dist/templates/Default/Wrapper/index.js +7 -22
- package/dist/templates/Default/index.js +17 -68
- package/dist/templates/Default/types.js +2 -5
- package/dist/templates/Minimal/index.js +6 -21
- package/dist/templates/Minimal/types.js +2 -5
- package/dist/utilities/api.js +4 -19
- package/dist/utilities/arraysHaveSameStrings.js +2 -12
- package/dist/utilities/buildComponentMap/index.js +16 -31
- package/dist/utilities/buildComponentMap/mapActions.js +5 -20
- package/dist/utilities/buildComponentMap/mapFields.js +34 -90
- package/dist/utilities/buildComponentMap/types.js +2 -5
- package/dist/utilities/buildFieldSchemaMap/index.js +5 -15
- package/dist/utilities/buildFieldSchemaMap/traverseFields.js +9 -19
- package/dist/utilities/buildFieldSchemaMap/types.js +2 -5
- package/dist/utilities/canUseDOM.js +2 -12
- package/dist/utilities/findLocaleFromCode.js +4 -12
- package/dist/utilities/formatDate/getSupportedDateLocale.js +2 -12
- package/dist/utilities/formatDate/index.js +10 -69
- package/dist/utilities/formatDocTitle.js +6 -16
- package/dist/utilities/formatFields.js +3 -13
- package/dist/utilities/getFormState.js +2 -12
- package/dist/utilities/getOffsetTop.js +2 -12
- package/dist/utilities/getRequestLanguage.js +2 -12
- package/dist/utilities/getSupportedMonacoLocale.js +2 -12
- package/dist/utilities/groupNavItems.js +7 -25
- package/dist/utilities/scrollToID.js +2 -12
- package/dist/utilities/setsAreEqual.js +2 -12
- package/dist/utilities/withMergedProps/index.js +23 -21
- package/dist/views/Global/RenderCustomView.js +0 -1
- package/package.json +4 -4
package/dist/forms/Form/index.js
CHANGED
|
@@ -1,110 +1,54 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const _api = require("../../utilities/api");
|
|
27
|
-
const _getFormState = require("../../utilities/getFormState");
|
|
28
|
-
const _context = require("./context");
|
|
29
|
-
const _errorMessages = /*#__PURE__*/ _interop_require_default(require("./errorMessages"));
|
|
30
|
-
const _fieldReducer = require("./fieldReducer");
|
|
31
|
-
const _getDataByPath = /*#__PURE__*/ _interop_require_default(require("./getDataByPath"));
|
|
32
|
-
const _getSiblingData = /*#__PURE__*/ _interop_require_default(require("./getSiblingData"));
|
|
33
|
-
const _initContextState = /*#__PURE__*/ _interop_require_default(require("./initContextState"));
|
|
34
|
-
const _mergeServerFormState = require("./mergeServerFormState");
|
|
35
|
-
const _reduceFieldsToValues = /*#__PURE__*/ _interop_require_default(require("./reduceFieldsToValues"));
|
|
36
|
-
function _interop_require_default(obj) {
|
|
37
|
-
return obj && obj.__esModule ? obj : {
|
|
38
|
-
default: obj
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
function _getRequireWildcardCache(nodeInterop) {
|
|
42
|
-
if (typeof WeakMap !== "function") return null;
|
|
43
|
-
var cacheBabelInterop = new WeakMap();
|
|
44
|
-
var cacheNodeInterop = new WeakMap();
|
|
45
|
-
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
46
|
-
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
47
|
-
})(nodeInterop);
|
|
48
|
-
}
|
|
49
|
-
function _interop_require_wildcard(obj, nodeInterop) {
|
|
50
|
-
if (!nodeInterop && obj && obj.__esModule) {
|
|
51
|
-
return obj;
|
|
52
|
-
}
|
|
53
|
-
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
54
|
-
return {
|
|
55
|
-
default: obj
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
var cache = _getRequireWildcardCache(nodeInterop);
|
|
59
|
-
if (cache && cache.has(obj)) {
|
|
60
|
-
return cache.get(obj);
|
|
61
|
-
}
|
|
62
|
-
var newObj = {
|
|
63
|
-
__proto__: null
|
|
64
|
-
};
|
|
65
|
-
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
66
|
-
for(var key in obj){
|
|
67
|
-
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
68
|
-
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
69
|
-
if (desc && (desc.get || desc.set)) {
|
|
70
|
-
Object.defineProperty(newObj, key, desc);
|
|
71
|
-
} else {
|
|
72
|
-
newObj[key] = obj[key];
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
newObj.default = obj;
|
|
77
|
-
if (cache) {
|
|
78
|
-
cache.set(obj, newObj);
|
|
79
|
-
}
|
|
80
|
-
return newObj;
|
|
81
|
-
}
|
|
2
|
+
/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */ import isDeepEqual from 'deep-equal';
|
|
3
|
+
import { useRouter } from 'next/navigation';
|
|
4
|
+
import { serialize } from 'object-to-formdata';
|
|
5
|
+
import { wait } from 'payload/utilities';
|
|
6
|
+
import React, { useCallback, useEffect, useReducer, useRef, useState } from 'react';
|
|
7
|
+
import { toast } from 'react-toastify';
|
|
8
|
+
import { useDebouncedEffect } from '../../hooks/useDebouncedEffect';
|
|
9
|
+
import useThrottledEffect from '../../hooks/useThrottledEffect';
|
|
10
|
+
import { useAuth } from '../../providers/Auth';
|
|
11
|
+
import { useConfig } from '../../providers/Config';
|
|
12
|
+
import { useDocumentInfo } from '../../providers/DocumentInfo';
|
|
13
|
+
import { useLocale } from '../../providers/Locale';
|
|
14
|
+
import { useOperation } from '../../providers/OperationProvider';
|
|
15
|
+
import { useTranslation } from '../../providers/Translation';
|
|
16
|
+
import { requests } from '../../utilities/api';
|
|
17
|
+
import { getFormState } from '../../utilities/getFormState';
|
|
18
|
+
import { FormContext, FormFieldsContext, FormWatchContext, ModifiedContext, ProcessingContext, SubmittedContext } from './context';
|
|
19
|
+
import errorMessages from './errorMessages';
|
|
20
|
+
import { fieldReducer } from './fieldReducer';
|
|
21
|
+
import getDataByPathFunc from './getDataByPath';
|
|
22
|
+
import getSiblingDataFunc from './getSiblingData';
|
|
23
|
+
import initContextState from './initContextState';
|
|
24
|
+
import { mergeServerFormState } from './mergeServerFormState';
|
|
25
|
+
import reduceFieldsToValues from './reduceFieldsToValues';
|
|
82
26
|
const baseClass = 'form';
|
|
83
27
|
const Form = (props)=>{
|
|
84
|
-
const { id, getDocPreferences } =
|
|
28
|
+
const { id, getDocPreferences } = useDocumentInfo();
|
|
85
29
|
const { action, children, className, disableSuccessStatus, disabled, // fields: fieldsFromProps = collection?.fields || global?.fields,
|
|
86
30
|
beforeSubmit, handleResponse, initialState, onChange, onSubmit, onSuccess, redirect, submitted: submittedFromProps, uuid, waitForAutocomplete } = props;
|
|
87
31
|
const method = 'method' in props ? props.method : undefined;
|
|
88
|
-
const router =
|
|
89
|
-
const { code: locale } =
|
|
90
|
-
const { i18n, t } =
|
|
91
|
-
const { refreshCookie, user } =
|
|
92
|
-
const operation =
|
|
93
|
-
const config =
|
|
32
|
+
const router = useRouter();
|
|
33
|
+
const { code: locale } = useLocale();
|
|
34
|
+
const { i18n, t } = useTranslation();
|
|
35
|
+
const { refreshCookie, user } = useAuth();
|
|
36
|
+
const operation = useOperation();
|
|
37
|
+
const config = useConfig();
|
|
94
38
|
const { routes: { api: apiRoute }, serverURL } = config;
|
|
95
|
-
const [modified, setModified] =
|
|
96
|
-
const [processing, setProcessing] =
|
|
97
|
-
const [submitted, setSubmitted] =
|
|
98
|
-
const formRef =
|
|
99
|
-
const contextRef =
|
|
100
|
-
const { collectionSlug, globalSlug } =
|
|
101
|
-
const fieldsReducer =
|
|
39
|
+
const [modified, setModified] = useState(false);
|
|
40
|
+
const [processing, setProcessing] = useState(false);
|
|
41
|
+
const [submitted, setSubmitted] = useState(false);
|
|
42
|
+
const formRef = useRef(null);
|
|
43
|
+
const contextRef = useRef({});
|
|
44
|
+
const { collectionSlug, globalSlug } = useDocumentInfo();
|
|
45
|
+
const fieldsReducer = useReducer(fieldReducer, {}, ()=>initialState);
|
|
102
46
|
/**
|
|
103
47
|
* `fields` is the current, up-to-date state/data of all fields in the form. It can be modified by using dispatchFields,
|
|
104
48
|
* which calls the fieldReducer, which then updates the state.
|
|
105
49
|
*/ const [fields, dispatchFields] = fieldsReducer;
|
|
106
50
|
contextRef.current.fields = fields;
|
|
107
|
-
const validateForm =
|
|
51
|
+
const validateForm = useCallback(async ()=>{
|
|
108
52
|
const validatedFieldState = {};
|
|
109
53
|
let isValid = true;
|
|
110
54
|
const dataFromContext = contextRef.current.getData();
|
|
@@ -140,7 +84,7 @@ const Form = (props)=>{
|
|
|
140
84
|
validatedFieldState[path] = validatedField;
|
|
141
85
|
});
|
|
142
86
|
await Promise.all(validationPromises);
|
|
143
|
-
if (!(
|
|
87
|
+
if (!isDeepEqual(contextRef.current.fields, validatedFieldState)) {
|
|
144
88
|
dispatchFields({
|
|
145
89
|
type: 'REPLACE_STATE',
|
|
146
90
|
state: validatedFieldState
|
|
@@ -155,7 +99,7 @@ const Form = (props)=>{
|
|
|
155
99
|
dispatchFields,
|
|
156
100
|
config
|
|
157
101
|
]);
|
|
158
|
-
const submit =
|
|
102
|
+
const submit = useCallback(async (options = {}, e)=>{
|
|
159
103
|
const { action: actionToUse = action, method: methodToUse = method, overrides = {}, skipValidation } = options;
|
|
160
104
|
if (disabled) {
|
|
161
105
|
if (e) {
|
|
@@ -169,7 +113,7 @@ const Form = (props)=>{
|
|
|
169
113
|
}
|
|
170
114
|
setProcessing(true);
|
|
171
115
|
setSubmitted(true);
|
|
172
|
-
if (waitForAutocomplete) await
|
|
116
|
+
if (waitForAutocomplete) await wait(100);
|
|
173
117
|
// Execute server side validations
|
|
174
118
|
if (Array.isArray(beforeSubmit)) {
|
|
175
119
|
let revalidatedFormState;
|
|
@@ -192,14 +136,14 @@ const Form = (props)=>{
|
|
|
192
136
|
const isValid = skipValidation ? true : await contextRef.current.validateForm();
|
|
193
137
|
// If not valid, prevent submission
|
|
194
138
|
if (!isValid) {
|
|
195
|
-
|
|
139
|
+
toast.error(t('error:correctInvalidFields'));
|
|
196
140
|
setProcessing(false);
|
|
197
141
|
return;
|
|
198
142
|
}
|
|
199
143
|
// If submit handler comes through via props, run that
|
|
200
144
|
if (onSubmit) {
|
|
201
145
|
const data = {
|
|
202
|
-
...(
|
|
146
|
+
...reduceFieldsToValues(fields, true),
|
|
203
147
|
...overrides
|
|
204
148
|
};
|
|
205
149
|
onSubmit(fields, data);
|
|
@@ -208,7 +152,7 @@ const Form = (props)=>{
|
|
|
208
152
|
try {
|
|
209
153
|
let res;
|
|
210
154
|
if (typeof actionToUse === 'string') {
|
|
211
|
-
res = await
|
|
155
|
+
res = await requests[methodToUse.toLowerCase()](actionToUse, {
|
|
212
156
|
body: formData,
|
|
213
157
|
headers: {
|
|
214
158
|
'Accept-Language': i18n.language
|
|
@@ -247,7 +191,7 @@ const Form = (props)=>{
|
|
|
247
191
|
// }
|
|
248
192
|
router.push(redirect);
|
|
249
193
|
} else if (!disableSuccessStatus) {
|
|
250
|
-
|
|
194
|
+
toast.success(json.message || t('general:submissionSuccessful'), {
|
|
251
195
|
autoClose: 3000
|
|
252
196
|
});
|
|
253
197
|
}
|
|
@@ -257,7 +201,7 @@ const Form = (props)=>{
|
|
|
257
201
|
} // triggers rerender of all components that subscribe to form
|
|
258
202
|
;
|
|
259
203
|
if (json.message) {
|
|
260
|
-
|
|
204
|
+
toast.error(json.message);
|
|
261
205
|
return;
|
|
262
206
|
}
|
|
263
207
|
if (Array.isArray(json.errors)) {
|
|
@@ -300,16 +244,16 @@ const Form = (props)=>{
|
|
|
300
244
|
});
|
|
301
245
|
});
|
|
302
246
|
nonFieldErrors.forEach((err)=>{
|
|
303
|
-
|
|
247
|
+
toast.error(err.message || t('error:unknown'));
|
|
304
248
|
});
|
|
305
249
|
return;
|
|
306
250
|
}
|
|
307
|
-
const message =
|
|
308
|
-
|
|
251
|
+
const message = errorMessages?.[res.status] || res?.statusText || t('error:unknown');
|
|
252
|
+
toast.error(message);
|
|
309
253
|
}
|
|
310
254
|
} catch (err) {
|
|
311
255
|
setProcessing(false);
|
|
312
|
-
|
|
256
|
+
toast.error(err);
|
|
313
257
|
}
|
|
314
258
|
}, [
|
|
315
259
|
action,
|
|
@@ -328,13 +272,13 @@ const Form = (props)=>{
|
|
|
328
272
|
waitForAutocomplete,
|
|
329
273
|
beforeSubmit
|
|
330
274
|
]);
|
|
331
|
-
const getFields =
|
|
332
|
-
const getField =
|
|
333
|
-
const getData =
|
|
334
|
-
const getSiblingData =
|
|
335
|
-
const getDataByPath =
|
|
336
|
-
const createFormData =
|
|
337
|
-
const data = (
|
|
275
|
+
const getFields = useCallback(()=>contextRef.current.fields, []);
|
|
276
|
+
const getField = useCallback((path)=>contextRef.current.fields[path], []);
|
|
277
|
+
const getData = useCallback(()=>reduceFieldsToValues(contextRef.current.fields, true), []);
|
|
278
|
+
const getSiblingData = useCallback((path)=>getSiblingDataFunc(contextRef.current.fields, path), []);
|
|
279
|
+
const getDataByPath = useCallback((path)=>getDataByPathFunc(contextRef.current.fields, path), []);
|
|
280
|
+
const createFormData = useCallback((overrides = {})=>{
|
|
281
|
+
const data = reduceFieldsToValues(contextRef.current.fields, true);
|
|
338
282
|
const file = data?.file;
|
|
339
283
|
if (file) {
|
|
340
284
|
delete data.file;
|
|
@@ -348,13 +292,13 @@ const Form = (props)=>{
|
|
|
348
292
|
file
|
|
349
293
|
};
|
|
350
294
|
// nullAsUndefineds is important to allow uploads and relationship fields to clear themselves
|
|
351
|
-
const formData =
|
|
295
|
+
const formData = serialize(dataToSerialize, {
|
|
352
296
|
indices: true,
|
|
353
297
|
nullsAsUndefineds: false
|
|
354
298
|
});
|
|
355
299
|
return formData;
|
|
356
300
|
}, []);
|
|
357
|
-
const reset =
|
|
301
|
+
const reset = useCallback(async (fieldSchema, data)=>{
|
|
358
302
|
const preferences = await getDocPreferences();
|
|
359
303
|
// const state = await buildStateFromSchema({
|
|
360
304
|
// id,
|
|
@@ -370,16 +314,16 @@ const Form = (props)=>{
|
|
|
370
314
|
// user,
|
|
371
315
|
// })
|
|
372
316
|
contextRef.current = {
|
|
373
|
-
...
|
|
317
|
+
...initContextState
|
|
374
318
|
};
|
|
375
319
|
setModified(false);
|
|
376
320
|
// dispatchFields({ state, type: 'REPLACE_STATE' })
|
|
377
321
|
}, [
|
|
378
322
|
getDocPreferences
|
|
379
323
|
]);
|
|
380
|
-
const replaceState =
|
|
324
|
+
const replaceState = useCallback((state)=>{
|
|
381
325
|
contextRef.current = {
|
|
382
|
-
...
|
|
326
|
+
...initContextState
|
|
383
327
|
};
|
|
384
328
|
setModified(false);
|
|
385
329
|
dispatchFields({
|
|
@@ -389,8 +333,8 @@ const Form = (props)=>{
|
|
|
389
333
|
}, [
|
|
390
334
|
dispatchFields
|
|
391
335
|
]);
|
|
392
|
-
const getFieldStateByPath =
|
|
393
|
-
const fieldSchema = await
|
|
336
|
+
const getFieldStateByPath = useCallback(async ({ data, path })=>{
|
|
337
|
+
const fieldSchema = await getFormState({
|
|
394
338
|
apiRoute,
|
|
395
339
|
body: {
|
|
396
340
|
collectionSlug,
|
|
@@ -410,7 +354,7 @@ const Form = (props)=>{
|
|
|
410
354
|
globalSlug,
|
|
411
355
|
serverURL
|
|
412
356
|
]);
|
|
413
|
-
const addFieldRow =
|
|
357
|
+
const addFieldRow = useCallback(async ({ data, path, rowIndex })=>{
|
|
414
358
|
const subFieldState = await getFieldStateByPath({
|
|
415
359
|
data,
|
|
416
360
|
path
|
|
@@ -426,7 +370,7 @@ const Form = (props)=>{
|
|
|
426
370
|
getFieldStateByPath,
|
|
427
371
|
dispatchFields
|
|
428
372
|
]);
|
|
429
|
-
const removeFieldRow =
|
|
373
|
+
const removeFieldRow = useCallback(({ path, rowIndex })=>{
|
|
430
374
|
dispatchFields({
|
|
431
375
|
type: 'REMOVE_ROW',
|
|
432
376
|
path,
|
|
@@ -435,7 +379,7 @@ const Form = (props)=>{
|
|
|
435
379
|
}, [
|
|
436
380
|
dispatchFields
|
|
437
381
|
]);
|
|
438
|
-
const replaceFieldRow =
|
|
382
|
+
const replaceFieldRow = useCallback(async ({ data, path, rowIndex })=>{
|
|
439
383
|
const subFieldState = await getFieldStateByPath({
|
|
440
384
|
data,
|
|
441
385
|
path
|
|
@@ -471,15 +415,15 @@ const Form = (props)=>{
|
|
|
471
415
|
contextRef.current.removeFieldRow = removeFieldRow;
|
|
472
416
|
contextRef.current.replaceFieldRow = replaceFieldRow;
|
|
473
417
|
contextRef.current.uuid = uuid;
|
|
474
|
-
|
|
418
|
+
useEffect(()=>{
|
|
475
419
|
if (typeof submittedFromProps === 'boolean') setSubmitted(submittedFromProps);
|
|
476
420
|
}, [
|
|
477
421
|
submittedFromProps
|
|
478
422
|
]);
|
|
479
|
-
|
|
423
|
+
useEffect(()=>{
|
|
480
424
|
if (initialState) {
|
|
481
425
|
contextRef.current = {
|
|
482
|
-
...
|
|
426
|
+
...initContextState
|
|
483
427
|
};
|
|
484
428
|
dispatchFields({
|
|
485
429
|
type: 'REPLACE_STATE',
|
|
@@ -490,12 +434,12 @@ const Form = (props)=>{
|
|
|
490
434
|
initialState,
|
|
491
435
|
dispatchFields
|
|
492
436
|
]);
|
|
493
|
-
(
|
|
437
|
+
useThrottledEffect(()=>{
|
|
494
438
|
refreshCookie();
|
|
495
439
|
}, 15000, [
|
|
496
440
|
fields
|
|
497
441
|
]);
|
|
498
|
-
|
|
442
|
+
useEffect(()=>{
|
|
499
443
|
contextRef.current = {
|
|
500
444
|
...contextRef.current
|
|
501
445
|
} // triggers rerender of all components that subscribe to form
|
|
@@ -508,7 +452,7 @@ const Form = (props)=>{
|
|
|
508
452
|
className,
|
|
509
453
|
baseClass
|
|
510
454
|
].filter(Boolean).join(' ');
|
|
511
|
-
|
|
455
|
+
useDebouncedEffect(()=>{
|
|
512
456
|
const executeOnChange = async ()=>{
|
|
513
457
|
if (Array.isArray(onChange)) {
|
|
514
458
|
let revalidatedFormState;
|
|
@@ -519,7 +463,7 @@ const Form = (props)=>{
|
|
|
519
463
|
});
|
|
520
464
|
revalidatedFormState = result;
|
|
521
465
|
}, Promise.resolve());
|
|
522
|
-
const { changed, newState } =
|
|
466
|
+
const { changed, newState } = mergeServerFormState(fields, revalidatedFormState);
|
|
523
467
|
if (changed) {
|
|
524
468
|
dispatchFields({
|
|
525
469
|
type: 'REPLACE_STATE',
|
|
@@ -536,30 +480,30 @@ const Form = (props)=>{
|
|
|
536
480
|
dispatchFields,
|
|
537
481
|
onChange
|
|
538
482
|
]);
|
|
539
|
-
return /*#__PURE__*/
|
|
483
|
+
return /*#__PURE__*/ React.createElement("form", {
|
|
540
484
|
action: action,
|
|
541
485
|
className: classes,
|
|
542
486
|
method: method,
|
|
543
487
|
noValidate: true,
|
|
544
488
|
onSubmit: (e)=>contextRef.current.submit({}, e),
|
|
545
489
|
ref: formRef
|
|
546
|
-
}, /*#__PURE__*/
|
|
490
|
+
}, /*#__PURE__*/ React.createElement(FormContext.Provider, {
|
|
547
491
|
value: contextRef.current
|
|
548
|
-
}, /*#__PURE__*/
|
|
492
|
+
}, /*#__PURE__*/ React.createElement(FormWatchContext.Provider, {
|
|
549
493
|
value: {
|
|
550
494
|
fields,
|
|
551
495
|
...contextRef.current
|
|
552
496
|
}
|
|
553
|
-
}, /*#__PURE__*/
|
|
497
|
+
}, /*#__PURE__*/ React.createElement(SubmittedContext.Provider, {
|
|
554
498
|
value: submitted
|
|
555
|
-
}, /*#__PURE__*/
|
|
499
|
+
}, /*#__PURE__*/ React.createElement(ProcessingContext.Provider, {
|
|
556
500
|
value: processing
|
|
557
|
-
}, /*#__PURE__*/
|
|
501
|
+
}, /*#__PURE__*/ React.createElement(ModifiedContext.Provider, {
|
|
558
502
|
value: modified
|
|
559
|
-
}, /*#__PURE__*/
|
|
503
|
+
}, /*#__PURE__*/ React.createElement(FormFieldsContext.Provider, {
|
|
560
504
|
value: fieldsReducer
|
|
561
505
|
}, children)))))));
|
|
562
506
|
};
|
|
563
|
-
|
|
507
|
+
export default Form;
|
|
564
508
|
|
|
565
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mb3Jtcy9Gb3JtL2luZGV4LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCdcbmltcG9ydCB0eXBlIHsgRmllbGQsIEZvcm1TdGF0ZSB9IGZyb20gJ3BheWxvYWQvdHlwZXMnXG5cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L25vLW5vbmludGVyYWN0aXZlLWVsZW1lbnQtaW50ZXJhY3Rpb25zICovXG5pbXBvcnQgaXNEZWVwRXF1YWwgZnJvbSAnZGVlcC1lcXVhbCdcbmltcG9ydCB7IHVzZVJvdXRlciB9IGZyb20gJ25leHQvbmF2aWdhdGlvbidcbmltcG9ydCB7IHNlcmlhbGl6ZSB9IGZyb20gJ29iamVjdC10by1mb3JtZGF0YSdcbmltcG9ydCB7IHdhaXQgfSBmcm9tICdwYXlsb2FkL3V0aWxpdGllcydcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VSZWR1Y2VyLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB0b2FzdCB9IGZyb20gJ3JlYWN0LXRvYXN0aWZ5J1xuXG5pbXBvcnQgdHlwZSB7IENvbnRleHQgYXMgRm9ybUNvbnRleHRUeXBlLCBHZXREYXRhQnlQYXRoLCBQcm9wcywgU3VibWl0T3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnXG5cbmltcG9ydCB7IHVzZURlYm91bmNlZEVmZmVjdCB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZURlYm91bmNlZEVmZmVjdCdcbmltcG9ydCB1c2VUaHJvdHRsZWRFZmZlY3QgZnJvbSAnLi4vLi4vaG9va3MvdXNlVGhyb3R0bGVkRWZmZWN0J1xuaW1wb3J0IHsgdXNlQXV0aCB9IGZyb20gJy4uLy4uL3Byb3ZpZGVycy9BdXRoJ1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzL0NvbmZpZydcbmltcG9ydCB7IHVzZURvY3VtZW50SW5mbyB9IGZyb20gJy4uLy4uL3Byb3ZpZGVycy9Eb2N1bWVudEluZm8nXG5pbXBvcnQgeyB1c2VMb2NhbGUgfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvTG9jYWxlJ1xuaW1wb3J0IHsgdXNlT3BlcmF0aW9uIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzL09wZXJhdGlvblByb3ZpZGVyJ1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvVHJhbnNsYXRpb24nXG5pbXBvcnQgeyByZXF1ZXN0cyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9hcGknXG5pbXBvcnQgeyBnZXRGb3JtU3RhdGUgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvZ2V0Rm9ybVN0YXRlJ1xuaW1wb3J0IHtcbiAgRm9ybUNvbnRleHQsXG4gIEZvcm1GaWVsZHNDb250ZXh0LFxuICBGb3JtV2F0Y2hDb250ZXh0LFxuICBNb2RpZmllZENvbnRleHQsXG4gIFByb2Nlc3NpbmdDb250ZXh0LFxuICBTdWJtaXR0ZWRDb250ZXh0LFxufSBmcm9tICcuL2NvbnRleHQnXG5pbXBvcnQgZXJyb3JNZXNzYWdlcyBmcm9tICcuL2Vycm9yTWVzc2FnZXMnXG5pbXBvcnQgeyBmaWVsZFJlZHVjZXIgfSBmcm9tICcuL2ZpZWxkUmVkdWNlcidcbmltcG9ydCBnZXREYXRhQnlQYXRoRnVuYyBmcm9tICcuL2dldERhdGFCeVBhdGgnXG5pbXBvcnQgZ2V0U2libGluZ0RhdGFGdW5jIGZyb20gJy4vZ2V0U2libGluZ0RhdGEnXG5pbXBvcnQgaW5pdENvbnRleHRTdGF0ZSBmcm9tICcuL2luaXRDb250ZXh0U3RhdGUnXG5pbXBvcnQgeyBtZXJnZVNlcnZlckZvcm1TdGF0ZSB9IGZyb20gJy4vbWVyZ2VTZXJ2ZXJGb3JtU3RhdGUnXG5pbXBvcnQgcmVkdWNlRmllbGRzVG9WYWx1ZXMgZnJvbSAnLi9yZWR1Y2VGaWVsZHNUb1ZhbHVlcydcblxuY29uc3QgYmFzZUNsYXNzID0gJ2Zvcm0nXG5cbmNvbnN0IEZvcm06IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IGlkLCBnZXREb2NQcmVmZXJlbmNlcyB9ID0gdXNlRG9jdW1lbnRJbmZvKClcblxuICBjb25zdCB7XG4gICAgYWN0aW9uLFxuICAgIGNoaWxkcmVuLFxuICAgIGNsYXNzTmFtZSxcbiAgICBkaXNhYmxlU3VjY2Vzc1N0YXR1cyxcbiAgICBkaXNhYmxlZCxcbiAgICAvLyBmaWVsZHM6IGZpZWxkc0Zyb21Qcm9wcyA9IGNvbGxlY3Rpb24/LmZpZWxkcyB8fCBnbG9iYWw/LmZpZWxkcyxcbiAgICBiZWZvcmVTdWJtaXQsXG4gICAgaGFuZGxlUmVzcG9uc2UsXG4gICAgaW5pdGlhbFN0YXRlLCAvLyBmdWxseSBmb3JtZWQgaW5pdGlhbCBmaWVsZCBzdGF0ZVxuICAgIG9uQ2hhbmdlLFxuICAgIG9uU3VibWl0LFxuICAgIG9uU3VjY2VzcyxcbiAgICByZWRpcmVjdCxcbiAgICBzdWJtaXR0ZWQ6IHN1Ym1pdHRlZEZyb21Qcm9wcyxcbiAgICB1dWlkLFxuICAgIHdhaXRGb3JBdXRvY29tcGxldGUsXG4gIH0gPSBwcm9wc1xuXG4gIGNvbnN0IG1ldGhvZCA9ICdtZXRob2QnIGluIHByb3BzID8gcHJvcHMubWV0aG9kIDogdW5kZWZpbmVkXG5cbiAgY29uc3Qgcm91dGVyID0gdXNlUm91dGVyKClcblxuICBjb25zdCB7IGNvZGU6IGxvY2FsZSB9ID0gdXNlTG9jYWxlKClcbiAgY29uc3QgeyBpMThuLCB0IH0gPSB1c2VUcmFuc2xhdGlvbigpXG4gIGNvbnN0IHsgcmVmcmVzaENvb2tpZSwgdXNlciB9ID0gdXNlQXV0aCgpXG4gIGNvbnN0IG9wZXJhdGlvbiA9IHVzZU9wZXJhdGlvbigpXG5cbiAgY29uc3QgY29uZmlnID0gdXNlQ29uZmlnKClcbiAgY29uc3Qge1xuICAgIHJvdXRlczogeyBhcGk6IGFwaVJvdXRlIH0sXG4gICAgc2VydmVyVVJMLFxuICB9ID0gY29uZmlnXG5cbiAgY29uc3QgW21vZGlmaWVkLCBzZXRNb2RpZmllZF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3Byb2Nlc3NpbmcsIHNldFByb2Nlc3NpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzdWJtaXR0ZWQsIHNldFN1Ym1pdHRlZF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgZm9ybVJlZiA9IHVzZVJlZjxIVE1MRm9ybUVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IGNvbnRleHRSZWYgPSB1c2VSZWYoe30gYXMgRm9ybUNvbnRleHRUeXBlKVxuICBjb25zdCB7IGNvbGxlY3Rpb25TbHVnLCBnbG9iYWxTbHVnIH0gPSB1c2VEb2N1bWVudEluZm8oKVxuXG4gIGNvbnN0IGZpZWxkc1JlZHVjZXIgPSB1c2VSZWR1Y2VyKGZpZWxkUmVkdWNlciwge30sICgpID0+IGluaXRpYWxTdGF0ZSlcbiAgLyoqXG4gICAqIGBmaWVsZHNgIGlzIHRoZSBjdXJyZW50LCB1cC10by1kYXRlIHN0YXRlL2RhdGEgb2YgYWxsIGZpZWxkcyBpbiB0aGUgZm9ybS4gSXQgY2FuIGJlIG1vZGlmaWVkIGJ5IHVzaW5nIGRpc3BhdGNoRmllbGRzLFxuICAgKiB3aGljaCBjYWxscyB0aGUgZmllbGRSZWR1Y2VyLCB3aGljaCB0aGVuIHVwZGF0ZXMgdGhlIHN0YXRlLlxuICAgKi9cbiAgY29uc3QgW2ZpZWxkcywgZGlzcGF0Y2hGaWVsZHNdID0gZmllbGRzUmVkdWNlclxuXG4gIGNvbnRleHRSZWYuY3VycmVudC5maWVsZHMgPSBmaWVsZHNcblxuICBjb25zdCB2YWxpZGF0ZUZvcm0gPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRhdGVkRmllbGRTdGF0ZSA9IHt9XG4gICAgbGV0IGlzVmFsaWQgPSB0cnVlXG5cbiAgICBjb25zdCBkYXRhRnJvbUNvbnRleHQgPSBjb250ZXh0UmVmLmN1cnJlbnQuZ2V0RGF0YSgpXG4gICAgY29uc3QgZGF0YSA9IGRhdGFGcm9tQ29udGV4dFxuXG4gICAgY29uc3QgdmFsaWRhdGlvblByb21pc2VzID0gT2JqZWN0LmVudHJpZXMoY29udGV4dFJlZi5jdXJyZW50LmZpZWxkcykubWFwKFxuICAgICAgYXN5bmMgKFtwYXRoLCBmaWVsZF0pID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkRmllbGQgPSB7XG4gICAgICAgICAgLi4uZmllbGQsXG4gICAgICAgICAgdmFsaWQ6IHRydWUsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGQucGFzc2VzQ29uZGl0aW9uICE9PSBmYWxzZSkge1xuICAgICAgICAgIGxldCB2YWxpZGF0aW9uUmVzdWx0OiBib29sZWFuIHwgc3RyaW5nID0gdHJ1ZVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZC52YWxpZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbGV0IHZhbHVlVG9WYWxpZGF0ZSA9IGZpZWxkLnZhbHVlXG5cbiAgICAgICAgICAgIGlmIChmaWVsZD8ucm93cyAmJiBBcnJheS5pc0FycmF5KGZpZWxkLnJvd3MpKSB7XG4gICAgICAgICAgICAgIHZhbHVlVG9WYWxpZGF0ZSA9IGNvbnRleHRSZWYuY3VycmVudC5nZXREYXRhQnlQYXRoKHBhdGgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCBmaWVsZC52YWxpZGF0ZSh2YWx1ZVRvVmFsaWRhdGUsIHtcbiAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICAgICAgICBzaWJsaW5nRGF0YTogY29udGV4dFJlZi5jdXJyZW50LmdldFNpYmxpbmdEYXRhKHBhdGgpLFxuICAgICAgICAgICAgICB0LFxuICAgICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbGlkYXRpb25SZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZWRGaWVsZC5lcnJvck1lc3NhZ2UgPSB2YWxpZGF0aW9uUmVzdWx0XG4gICAgICAgICAgICB2YWxpZGF0ZWRGaWVsZC52YWxpZCA9IGZhbHNlXG4gICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YWxpZGF0ZWRGaWVsZFN0YXRlW3BhdGhdID0gdmFsaWRhdGVkRmllbGRcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodmFsaWRhdGlvblByb21pc2VzKVxuXG4gICAgaWYgKCFpc0RlZXBFcXVhbChjb250ZXh0UmVmLmN1cnJlbnQuZmllbGRzLCB2YWxpZGF0ZWRGaWVsZFN0YXRlKSkge1xuICAgICAgZGlzcGF0Y2hGaWVsZHMoeyB0eXBlOiAnUkVQTEFDRV9TVEFURScsIHN0YXRlOiB2YWxpZGF0ZWRGaWVsZFN0YXRlIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGlzVmFsaWRcbiAgfSwgW2lkLCB1c2VyLCBvcGVyYXRpb24sIHQsIGRpc3BhdGNoRmllbGRzLCBjb25maWddKVxuXG4gIGNvbnN0IHN1Ym1pdCA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChvcHRpb25zOiBTdWJtaXRPcHRpb25zID0ge30sIGUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWN0aW9uOiBhY3Rpb25Ub1VzZSA9IGFjdGlvbixcbiAgICAgICAgbWV0aG9kOiBtZXRob2RUb1VzZSA9IG1ldGhvZCxcbiAgICAgICAgb3ZlcnJpZGVzID0ge30sXG4gICAgICAgIHNraXBWYWxpZGF0aW9uLFxuICAgICAgfSA9IG9wdGlvbnNcblxuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICB9XG5cbiAgICAgIHNldFByb2Nlc3NpbmcodHJ1ZSlcbiAgICAgIHNldFN1Ym1pdHRlZCh0cnVlKVxuXG4gICAgICBpZiAod2FpdEZvckF1dG9jb21wbGV0ZSkgYXdhaXQgd2FpdCgxMDApXG5cbiAgICAgIC8vIEV4ZWN1dGUgc2VydmVyIHNpZGUgdmFsaWRhdGlvbnNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGJlZm9yZVN1Ym1pdCkpIHtcbiAgICAgICAgbGV0IHJldmFsaWRhdGVkRm9ybVN0YXRlOiBGb3JtU3RhdGVcblxuICAgICAgICBhd2FpdCBiZWZvcmVTdWJtaXQucmVkdWNlKGFzeW5jIChwcmlvck9uQ2hhbmdlLCBiZWZvcmVTdWJtaXRGbikgPT4ge1xuICAgICAgICAgIGF3YWl0IHByaW9yT25DaGFuZ2VcblxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJlZm9yZVN1Ym1pdEZuKHtcbiAgICAgICAgICAgIGZvcm1TdGF0ZTogZmllbGRzLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXZhbGlkYXRlZEZvcm1TdGF0ZSA9IHJlc3VsdFxuICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgICBjb25zdCBpc1ZhbGlkID0gT2JqZWN0LmVudHJpZXMocmV2YWxpZGF0ZWRGb3JtU3RhdGUpLmV2ZXJ5KChbLCBmaWVsZF0pID0+IGZpZWxkLnZhbGlkKVxuXG4gICAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAgIHNldFByb2Nlc3NpbmcoZmFsc2UpXG4gICAgICAgICAgcmV0dXJuIGRpc3BhdGNoRmllbGRzKHsgdHlwZTogJ1JFUExBQ0VfU1RBVEUnLCBzdGF0ZTogcmV2YWxpZGF0ZWRGb3JtU3RhdGUgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpc1ZhbGlkID0gc2tpcFZhbGlkYXRpb24gPyB0cnVlIDogYXdhaXQgY29udGV4dFJlZi5jdXJyZW50LnZhbGlkYXRlRm9ybSgpXG5cbiAgICAgIC8vIElmIG5vdCB2YWxpZCwgcHJldmVudCBzdWJtaXNzaW9uXG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgdG9hc3QuZXJyb3IodCgnZXJyb3I6Y29ycmVjdEludmFsaWRGaWVsZHMnKSlcbiAgICAgICAgc2V0UHJvY2Vzc2luZyhmYWxzZSlcblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gSWYgc3VibWl0IGhhbmRsZXIgY29tZXMgdGhyb3VnaCB2aWEgcHJvcHMsIHJ1biB0aGF0XG4gICAgICBpZiAob25TdWJtaXQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAuLi5yZWR1Y2VGaWVsZHNUb1ZhbHVlcyhmaWVsZHMsIHRydWUpLFxuICAgICAgICAgIC4uLm92ZXJyaWRlcyxcbiAgICAgICAgfVxuXG4gICAgICAgIG9uU3VibWl0KGZpZWxkcywgZGF0YSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybURhdGEgPSBjb250ZXh0UmVmLmN1cnJlbnQuY3JlYXRlRm9ybURhdGEob3ZlcnJpZGVzKVxuXG4gICAgICB0cnkge1xuICAgICAgICBsZXQgcmVzXG5cbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb25Ub1VzZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXMgPSBhd2FpdCByZXF1ZXN0c1ttZXRob2RUb1VzZS50b0xvd2VyQ2FzZSgpXShhY3Rpb25Ub1VzZSwge1xuICAgICAgICAgICAgYm9keTogZm9ybURhdGEsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiBpMThuLmxhbmd1YWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhY3Rpb25Ub1VzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJlcyA9IGF3YWl0IGFjdGlvblRvVXNlKGZvcm1EYXRhKVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0TW9kaWZpZWQoZmFsc2UpXG5cbiAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVSZXNwb25zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGhhbmRsZVJlc3BvbnNlKHJlcylcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHNldFByb2Nlc3NpbmcoZmFsc2UpXG5cbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpXG4gICAgICAgIGNvbnN0IGlzSlNPTiA9IGNvbnRlbnRUeXBlICYmIGNvbnRlbnRUeXBlLmluZGV4T2YoJ2FwcGxpY2F0aW9uL2pzb24nKSAhPT0gLTFcblxuICAgICAgICBsZXQganNvbjogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgaWYgKGlzSlNPTikganNvbiA9IGF3YWl0IHJlcy5qc29uKClcblxuICAgICAgICBpZiAocmVzLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICAgIHNldFN1Ym1pdHRlZChmYWxzZSlcblxuICAgICAgICAgIGlmICh0eXBlb2Ygb25TdWNjZXNzID09PSAnZnVuY3Rpb24nKSBvblN1Y2Nlc3MoanNvbilcblxuICAgICAgICAgIGlmIChyZWRpcmVjdCkge1xuICAgICAgICAgICAgLy8gY29uc3QgZGVzdGluYXRpb24gPSB7XG4gICAgICAgICAgICAvLyAgIHBhdGhuYW1lOiByZWRpcmVjdCxcbiAgICAgICAgICAgIC8vICAgc3RhdGU6IHt9LFxuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAvLyBpZiAodHlwZW9mIGpzb24gPT09ICdvYmplY3QnICYmIGpzb24ubWVzc2FnZSAmJiAhZGlzYWJsZVN1Y2Nlc3NTdGF0dXMpIHtcbiAgICAgICAgICAgIC8vICAgZGVzdGluYXRpb24uc3RhdGUgPSB7XG4gICAgICAgICAgICAvLyAgICAgc3RhdHVzOiBbXG4gICAgICAgICAgICAvLyAgICAgICB7XG4gICAgICAgICAgICAvLyAgICAgICAgIG1lc3NhZ2U6IGpzb24ubWVzc2FnZSxcbiAgICAgICAgICAgIC8vICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgLy8gICAgICAgfSxcbiAgICAgICAgICAgIC8vICAgICBdLFxuICAgICAgICAgICAgLy8gICB9XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIHJvdXRlci5wdXNoKHJlZGlyZWN0KVxuICAgICAgICAgIH0gZWxzZSBpZiAoIWRpc2FibGVTdWNjZXNzU3RhdHVzKSB7XG4gICAgICAgICAgICB0b2FzdC5zdWNjZXNzKGpzb24ubWVzc2FnZSB8fCB0KCdnZW5lcmFsOnN1Ym1pc3Npb25TdWNjZXNzZnVsJyksIHsgYXV0b0Nsb3NlOiAzMDAwIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRleHRSZWYuY3VycmVudCA9IHsgLi4uY29udGV4dFJlZi5jdXJyZW50IH0gLy8gdHJpZ2dlcnMgcmVyZW5kZXIgb2YgYWxsIGNvbXBvbmVudHMgdGhhdCBzdWJzY3JpYmUgdG8gZm9ybVxuICAgICAgICAgIGlmIChqc29uLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRvYXN0LmVycm9yKGpzb24ubWVzc2FnZSlcblxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbi5lcnJvcnMpKSB7XG4gICAgICAgICAgICBjb25zdCBbZmllbGRFcnJvcnMsIG5vbkZpZWxkRXJyb3JzXSA9IGpzb24uZXJyb3JzLnJlZHVjZShcbiAgICAgICAgICAgICAgKFtmaWVsZEVycnMsIG5vbkZpZWxkRXJyc10sIGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0ZpZWxkRXJycyA9IFtdXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Tm9uRmllbGRFcnJzID0gW11cblxuICAgICAgICAgICAgICAgIGlmIChlcnI/Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgIG5ld05vbkZpZWxkRXJycy5wdXNoKGVycilcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlcnI/LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICBlcnIuZGF0YS5mb3JFYWNoKChkYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFFcnJvcj8uZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBuZXdGaWVsZEVycnMucHVzaChkYXRhRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgbmV3Tm9uRmllbGRFcnJzLnB1c2goZGF0YUVycm9yKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICBbLi4uZmllbGRFcnJzLCAuLi5uZXdGaWVsZEVycnNdLFxuICAgICAgICAgICAgICAgICAgWy4uLm5vbkZpZWxkRXJycywgLi4ubmV3Tm9uRmllbGRFcnJzXSxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFtbXSwgW11dLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBmaWVsZEVycm9ycy5mb3JFYWNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgZGlzcGF0Y2hGaWVsZHMoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdVUERBVEUnLFxuICAgICAgICAgICAgICAgIC4uLihjb250ZXh0UmVmLmN1cnJlbnQ/LmZpZWxkcz8uW2Vyci5maWVsZF0gfHwge30pLFxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgcGF0aDogZXJyLmZpZWxkLFxuICAgICAgICAgICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIG5vbkZpZWxkRXJyb3JzLmZvckVhY2goKGVycikgPT4ge1xuICAgICAgICAgICAgICB0b2FzdC5lcnJvcihlcnIubWVzc2FnZSB8fCB0KCdlcnJvcjp1bmtub3duJykpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3JNZXNzYWdlcz8uW3Jlcy5zdGF0dXNdIHx8IHJlcz8uc3RhdHVzVGV4dCB8fCB0KCdlcnJvcjp1bmtub3duJylcblxuICAgICAgICAgIHRvYXN0LmVycm9yKG1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzZXRQcm9jZXNzaW5nKGZhbHNlKVxuXG4gICAgICAgIHRvYXN0LmVycm9yKGVycilcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGFjdGlvbixcbiAgICAgIGRpc2FibGVTdWNjZXNzU3RhdHVzLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICBkaXNwYXRjaEZpZWxkcyxcbiAgICAgIGZpZWxkcyxcbiAgICAgIGhhbmRsZVJlc3BvbnNlLFxuICAgICAgbWV0aG9kLFxuICAgICAgb25TdWJtaXQsXG4gICAgICBvblN1Y2Nlc3MsXG4gICAgICByZWRpcmVjdCxcbiAgICAgIHJvdXRlcixcbiAgICAgIHQsXG4gICAgICBpMThuLFxuICAgICAgd2FpdEZvckF1dG9jb21wbGV0ZSxcbiAgICAgIGJlZm9yZVN1Ym1pdCxcbiAgICBdLFxuICApXG5cbiAgY29uc3QgZ2V0RmllbGRzID0gdXNlQ2FsbGJhY2soKCkgPT4gY29udGV4dFJlZi5jdXJyZW50LmZpZWxkcywgW10pXG5cbiAgY29uc3QgZ2V0RmllbGQgPSB1c2VDYWxsYmFjaygocGF0aDogc3RyaW5nKSA9PiBjb250ZXh0UmVmLmN1cnJlbnQuZmllbGRzW3BhdGhdLCBbXSlcblxuICBjb25zdCBnZXREYXRhID0gdXNlQ2FsbGJhY2soKCkgPT4gcmVkdWNlRmllbGRzVG9WYWx1ZXMoY29udGV4dFJlZi5jdXJyZW50LmZpZWxkcywgdHJ1ZSksIFtdKVxuXG4gIGNvbnN0IGdldFNpYmxpbmdEYXRhID0gdXNlQ2FsbGJhY2soXG4gICAgKHBhdGg6IHN0cmluZykgPT4gZ2V0U2libGluZ0RhdGFGdW5jKGNvbnRleHRSZWYuY3VycmVudC5maWVsZHMsIHBhdGgpLFxuICAgIFtdLFxuICApXG4gIGNvbnN0IGdldERhdGFCeVBhdGggPSB1c2VDYWxsYmFjazxHZXREYXRhQnlQYXRoPihcbiAgICAocGF0aDogc3RyaW5nKSA9PiBnZXREYXRhQnlQYXRoRnVuYyhjb250ZXh0UmVmLmN1cnJlbnQuZmllbGRzLCBwYXRoKSxcbiAgICBbXSxcbiAgKVxuXG4gIGNvbnN0IGNyZWF0ZUZvcm1EYXRhID0gdXNlQ2FsbGJhY2soKG92ZXJyaWRlczogYW55ID0ge30pID0+IHtcbiAgICBjb25zdCBkYXRhID0gcmVkdWNlRmllbGRzVG9WYWx1ZXMoY29udGV4dFJlZi5jdXJyZW50LmZpZWxkcywgdHJ1ZSlcblxuICAgIGNvbnN0IGZpbGUgPSBkYXRhPy5maWxlXG5cbiAgICBpZiAoZmlsZSkge1xuICAgICAgZGVsZXRlIGRhdGEuZmlsZVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGFXaXRoT3ZlcnJpZGVzID0ge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIC4uLm92ZXJyaWRlcyxcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhVG9TZXJpYWxpemUgPSB7XG4gICAgICBfcGF5bG9hZDogSlNPTi5zdHJpbmdpZnkoZGF0YVdpdGhPdmVycmlkZXMpLFxuICAgICAgZmlsZSxcbiAgICB9XG5cbiAgICAvLyBudWxsQXNVbmRlZmluZWRzIGlzIGltcG9ydGFudCB0byBhbGxvdyB1cGxvYWRzIGFuZCByZWxhdGlvbnNoaXAgZmllbGRzIHRvIGNsZWFyIHRoZW1zZWx2ZXNcbiAgICBjb25zdCBmb3JtRGF0YSA9IHNlcmlhbGl6ZShkYXRhVG9TZXJpYWxpemUsIHsgaW5kaWNlczogdHJ1ZSwgbnVsbHNBc1VuZGVmaW5lZHM6IGZhbHNlIH0pXG5cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfSwgW10pXG5cbiAgY29uc3QgcmVzZXQgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoZmllbGRTY2hlbWE6IEZpZWxkW10sIGRhdGE6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IHByZWZlcmVuY2VzID0gYXdhaXQgZ2V0RG9jUHJlZmVyZW5jZXMoKVxuICAgICAgLy8gY29uc3Qgc3RhdGUgPSBhd2FpdCBidWlsZFN0YXRlRnJvbVNjaGVtYSh7XG4gICAgICAvLyAgIGlkLFxuICAgICAgLy8gICAvLyBUT0RPOiBmaXggdGhpc1xuICAgICAgLy8gICAvLyBAdHMtaWdub3JlLW5leHQtbGluZVxuICAgICAgLy8gICBjb25maWcsXG4gICAgICAvLyAgIGRhdGEsXG4gICAgICAvLyAgIGZpZWxkU2NoZW1hLFxuICAgICAgLy8gICBsb2NhbGUsXG4gICAgICAvLyAgIG9wZXJhdGlvbixcbiAgICAgIC8vICAgcHJlZmVyZW5jZXMsXG4gICAgICAvLyAgIHQsXG4gICAgICAvLyAgIHVzZXIsXG4gICAgICAvLyB9KVxuICAgICAgY29udGV4dFJlZi5jdXJyZW50ID0geyAuLi5pbml0Q29udGV4dFN0YXRlIH0gYXMgRm9ybUNvbnRleHRUeXBlXG4gICAgICBzZXRNb2RpZmllZChmYWxzZSlcbiAgICAgIC8vIGRpc3BhdGNoRmllbGRzKHsgc3RhdGUsIHR5cGU6ICdSRVBMQUNFX1NUQVRFJyB9KVxuICAgIH0sXG4gICAgW2dldERvY1ByZWZlcmVuY2VzXSxcbiAgKVxuXG4gIGNvbnN0IHJlcGxhY2VTdGF0ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChzdGF0ZTogRm9ybVN0YXRlKSA9PiB7XG4gICAgICBjb250ZXh0UmVmLmN1cnJlbnQgPSB7IC4uLmluaXRDb250ZXh0U3RhdGUgfSBhcyBGb3JtQ29udGV4dFR5cGVcbiAgICAgIHNldE1vZGlmaWVkKGZhbHNlKVxuICAgICAgZGlzcGF0Y2hGaWVsZHMoeyB0eXBlOiAnUkVQTEFDRV9TVEFURScsIHN0YXRlIH0pXG4gICAgfSxcbiAgICBbZGlzcGF0Y2hGaWVsZHNdLFxuICApXG5cbiAgY29uc3QgZ2V0RmllbGRTdGF0ZUJ5UGF0aCA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jICh7IGRhdGEsIHBhdGggfSkgPT4ge1xuICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSBhd2FpdCBnZXRGb3JtU3RhdGUoe1xuICAgICAgICBhcGlSb3V0ZSxcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgZ2xvYmFsU2x1ZyxcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgIFR1cm5zOiAnYXJyYXlGaWVsZC4wLmdyb3VwMTIzZmllbGQuYXJyYXlGaWVsZC4wLnRleHRGaWVsZCdcbiAgICAgICAgICAgIEludG86ICdhcnJheUZpZWxkLmdyb3VwMTIzZmllbGQuYXJyYXlGaWVsZC50ZXh0RmllbGQnXG4gICAgICAgICAgKi9cbiAgICAgICAgICBzY2hlbWFQYXRoOiBgJHtjb2xsZWN0aW9uU2x1ZyB8fCBnbG9iYWxTbHVnfS4ke3BhdGh9YC5yZXBsYWNlKC9cXC5cXGQrXFwuL2csICcuJyksXG4gICAgICAgIH0sXG4gICAgICAgIHNlcnZlclVSTCxcbiAgICAgIH0pXG4gICAgICByZXR1cm4gZmllbGRTY2hlbWFcbiAgICB9LFxuICAgIFthcGlSb3V0ZSwgY29sbGVjdGlvblNsdWcsIGdsb2JhbFNsdWcsIHNlcnZlclVSTF0sXG4gIClcblxuICBjb25zdCBhZGRGaWVsZFJvdzogRm9ybUNvbnRleHRUeXBlWydhZGRGaWVsZFJvdyddID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHsgZGF0YSwgcGF0aCwgcm93SW5kZXggfSkgPT4ge1xuICAgICAgY29uc3Qgc3ViRmllbGRTdGF0ZSA9IGF3YWl0IGdldEZpZWxkU3RhdGVCeVBhdGgoeyBkYXRhLCBwYXRoIH0pXG5cbiAgICAgIGRpc3BhdGNoRmllbGRzKHtcbiAgICAgICAgdHlwZTogJ0FERF9ST1cnLFxuICAgICAgICBibG9ja1R5cGU6IGRhdGE/LmJsb2NrVHlwZSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgcm93SW5kZXgsXG4gICAgICAgIHN1YkZpZWxkU3RhdGUsXG4gICAgICB9KVxuICAgIH0sXG4gICAgW2dldEZpZWxkU3RhdGVCeVBhdGgsIGRpc3BhdGNoRmllbGRzXSxcbiAgKVxuXG4gIGNvbnN0IHJlbW92ZUZpZWxkUm93OiBGb3JtQ29udGV4dFR5cGVbJ3JlbW92ZUZpZWxkUm93J10gPSB1c2VDYWxsYmFjayhcbiAgICAoeyBwYXRoLCByb3dJbmRleCB9KSA9PiB7XG4gICAgICBkaXNwYXRjaEZpZWxkcyh7IHR5cGU6ICdSRU1PVkVfUk9XJywgcGF0aCwgcm93SW5kZXggfSlcbiAgICB9LFxuICAgIFtkaXNwYXRjaEZpZWxkc10sXG4gIClcblxuICBjb25zdCByZXBsYWNlRmllbGRSb3c6IEZvcm1Db250ZXh0VHlwZVsncmVwbGFjZUZpZWxkUm93J10gPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoeyBkYXRhLCBwYXRoLCByb3dJbmRleCB9KSA9PiB7XG4gICAgICBjb25zdCBzdWJGaWVsZFN0YXRlID0gYXdhaXQgZ2V0RmllbGRTdGF0ZUJ5UGF0aCh7IGRhdGEsIHBhdGggfSlcblxuICAgICAgZGlzcGF0Y2hGaWVsZHMoe1xuICAgICAgICB0eXBlOiAnUkVQTEFDRV9ST1cnLFxuICAgICAgICBibG9ja1R5cGU6IGRhdGE/LmJsb2NrVHlwZSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgcm93SW5kZXgsXG4gICAgICAgIHN1YkZpZWxkU3RhdGUsXG4gICAgICB9KVxuICAgIH0sXG4gICAgW2dldEZpZWxkU3RhdGVCeVBhdGgsIGRpc3BhdGNoRmllbGRzXSxcbiAgKVxuXG4gIGNvbnRleHRSZWYuY3VycmVudC5zdWJtaXQgPSBzdWJtaXRcbiAgY29udGV4dFJlZi5jdXJyZW50LmdldEZpZWxkcyA9IGdldEZpZWxkc1xuICBjb250ZXh0UmVmLmN1cnJlbnQuZ2V0RmllbGQgPSBnZXRGaWVsZFxuICBjb250ZXh0UmVmLmN1cnJlbnQuZ2V0RGF0YSA9IGdldERhdGFcbiAgY29udGV4dFJlZi5jdXJyZW50LmdldFNpYmxpbmdEYXRhID0gZ2V0U2libGluZ0RhdGFcbiAgY29udGV4dFJlZi5jdXJyZW50LmdldERhdGFCeVBhdGggPSBnZXREYXRhQnlQYXRoXG4gIGNvbnRleHRSZWYuY3VycmVudC52YWxpZGF0ZUZvcm0gPSB2YWxpZGF0ZUZvcm1cbiAgY29udGV4dFJlZi5jdXJyZW50LmNyZWF0ZUZvcm1EYXRhID0gY3JlYXRlRm9ybURhdGFcbiAgY29udGV4dFJlZi5jdXJyZW50LnNldE1vZGlmaWVkID0gc2V0TW9kaWZpZWRcbiAgY29udGV4dFJlZi5jdXJyZW50LnNldFByb2Nlc3NpbmcgPSBzZXRQcm9jZXNzaW5nXG4gIGNvbnRleHRSZWYuY3VycmVudC5zZXRTdWJtaXR0ZWQgPSBzZXRTdWJtaXR0ZWRcbiAgY29udGV4dFJlZi5jdXJyZW50LmRpc2FibGVkID0gZGlzYWJsZWRcbiAgY29udGV4dFJlZi5jdXJyZW50LmZvcm1SZWYgPSBmb3JtUmVmXG4gIGNvbnRleHRSZWYuY3VycmVudC5yZXNldCA9IHJlc2V0XG4gIGNvbnRleHRSZWYuY3VycmVudC5yZXBsYWNlU3RhdGUgPSByZXBsYWNlU3RhdGVcbiAgY29udGV4dFJlZi5jdXJyZW50LmRpc3BhdGNoRmllbGRzID0gZGlzcGF0Y2hGaWVsZHNcbiAgY29udGV4dFJlZi5jdXJyZW50LmFkZEZpZWxkUm93ID0gYWRkRmllbGRSb3dcbiAgY29udGV4dFJlZi5jdXJyZW50LnJlbW92ZUZpZWxkUm93ID0gcmVtb3ZlRmllbGRSb3dcbiAgY29udGV4dFJlZi5jdXJyZW50LnJlcGxhY2VGaWVsZFJvdyA9IHJlcGxhY2VGaWVsZFJvd1xuICBjb250ZXh0UmVmLmN1cnJlbnQudXVpZCA9IHV1aWRcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygc3VibWl0dGVkRnJvbVByb3BzID09PSAnYm9vbGVhbicpIHNldFN1Ym1pdHRlZChzdWJtaXR0ZWRGcm9tUHJvcHMpXG4gIH0sIFtzdWJtaXR0ZWRGcm9tUHJvcHNdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY29udGV4dFJlZi5jdXJyZW50ID0geyAuLi5pbml0Q29udGV4dFN0YXRlIH0gYXMgRm9ybUNvbnRleHRUeXBlXG4gICAgICBkaXNwYXRjaEZpZWxkcyh7IHR5cGU6ICdSRVBMQUNFX1NUQVRFJywgc3RhdGU6IGluaXRpYWxTdGF0ZSB9KVxuICAgIH1cbiAgfSwgW2luaXRpYWxTdGF0ZSwgZGlzcGF0Y2hGaWVsZHNdKVxuXG4gIHVzZVRocm90dGxlZEVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICByZWZyZXNoQ29va2llKClcbiAgICB9LFxuICAgIDE1MDAwLFxuICAgIFtmaWVsZHNdLFxuICApXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb250ZXh0UmVmLmN1cnJlbnQgPSB7IC4uLmNvbnRleHRSZWYuY3VycmVudCB9IC8vIHRyaWdnZXJzIHJlcmVuZGVyIG9mIGFsbCBjb21wb25lbnRzIHRoYXQgc3Vic2NyaWJlIHRvIGZvcm1cbiAgICBzZXRNb2RpZmllZChmYWxzZSlcbiAgfSwgW2xvY2FsZV0pXG5cbiAgY29uc3QgY2xhc3NlcyA9IFtjbGFzc05hbWUsIGJhc2VDbGFzc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKVxuXG4gIHVzZURlYm91bmNlZEVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBleGVjdXRlT25DaGFuZ2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9uQ2hhbmdlKSkge1xuICAgICAgICAgIGxldCByZXZhbGlkYXRlZEZvcm1TdGF0ZTogRm9ybVN0YXRlXG5cbiAgICAgICAgICBhd2FpdCBvbkNoYW5nZS5yZWR1Y2UoYXN5bmMgKHByaW9yT25DaGFuZ2UsIG9uQ2hhbmdlRm4pID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHByaW9yT25DaGFuZ2VcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb25DaGFuZ2VGbih7XG4gICAgICAgICAgICAgIGZvcm1TdGF0ZTogZmllbGRzLFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgcmV2YWxpZGF0ZWRGb3JtU3RhdGUgPSByZXN1bHRcbiAgICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgICAgIGNvbnN0IHsgY2hhbmdlZCwgbmV3U3RhdGUgfSA9IG1lcmdlU2VydmVyRm9ybVN0YXRlKGZpZWxkcywgcmV2YWxpZGF0ZWRGb3JtU3RhdGUpXG5cbiAgICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgZGlzcGF0Y2hGaWVsZHMoeyB0eXBlOiAnUkVQTEFDRV9TVEFURScsIG9wdGltaXplOiBmYWxzZSwgc3RhdGU6IG5ld1N0YXRlIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGV4ZWN1dGVPbkNoYW5nZSgpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgfSxcbiAgICAxNTAsXG4gICAgW2ZpZWxkcywgZGlzcGF0Y2hGaWVsZHMsIG9uQ2hhbmdlXSxcbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPGZvcm1cbiAgICAgIGFjdGlvbj17YWN0aW9ufVxuICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzfVxuICAgICAgbWV0aG9kPXttZXRob2R9XG4gICAgICBub1ZhbGlkYXRlXG4gICAgICBvblN1Ym1pdD17KGUpID0+IGNvbnRleHRSZWYuY3VycmVudC5zdWJtaXQoe30sIGUpfVxuICAgICAgcmVmPXtmb3JtUmVmfVxuICAgID5cbiAgICAgIDxGb3JtQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y29udGV4dFJlZi5jdXJyZW50fT5cbiAgICAgICAgPEZvcm1XYXRjaENvbnRleHQuUHJvdmlkZXJcbiAgICAgICAgICB2YWx1ZT17e1xuICAgICAgICAgICAgZmllbGRzLFxuICAgICAgICAgICAgLi4uY29udGV4dFJlZi5jdXJyZW50LFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8U3VibWl0dGVkQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17c3VibWl0dGVkfT5cbiAgICAgICAgICAgIDxQcm9jZXNzaW5nQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17cHJvY2Vzc2luZ30+XG4gICAgICAgICAgICAgIDxNb2RpZmllZENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e21vZGlmaWVkfT5cbiAgICAgICAgICAgICAgICA8Rm9ybUZpZWxkc0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2ZpZWxkc1JlZHVjZXJ9PlxuICAgICAgICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgICAgICAgIDwvRm9ybUZpZWxkc0NvbnRleHQuUHJvdmlkZXI+XG4gICAgICAgICAgICAgIDwvTW9kaWZpZWRDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgICAgICAgPC9Qcm9jZXNzaW5nQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgICAgICA8L1N1Ym1pdHRlZENvbnRleHQuUHJvdmlkZXI+XG4gICAgICAgIDwvRm9ybVdhdGNoQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgIDwvRm9ybUNvbnRleHQuUHJvdmlkZXI+XG4gICAgPC9mb3JtPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IEZvcm1cbiJdLCJuYW1lcyI6WyJiYXNlQ2xhc3MiLCJGb3JtIiwicHJvcHMiLCJpZCIsImdldERvY1ByZWZlcmVuY2VzIiwidXNlRG9jdW1lbnRJbmZvIiwiYWN0aW9uIiwiY2hpbGRyZW4iLCJjbGFzc05hbWUiLCJkaXNhYmxlU3VjY2Vzc1N0YXR1cyIsImRpc2FibGVkIiwiYmVmb3JlU3VibWl0IiwiaGFuZGxlUmVzcG9uc2UiLCJpbml0aWFsU3RhdGUiLCJvbkNoYW5nZSIsIm9uU3VibWl0Iiwib25TdWNjZXNzIiwicmVkaXJlY3QiLCJzdWJtaXR0ZWQiLCJzdWJtaXR0ZWRGcm9tUHJvcHMiLCJ1dWlkIiwid2FpdEZvckF1dG9jb21wbGV0ZSIsIm1ldGhvZCIsInVuZGVmaW5lZCIsInJvdXRlciIsInVzZVJvdXRlciIsImNvZGUiLCJsb2NhbGUiLCJ1c2VMb2NhbGUiLCJpMThuIiwidCIsInVzZVRyYW5zbGF0aW9uIiwicmVmcmVzaENvb2tpZSIsInVzZXIiLCJ1c2VBdXRoIiwib3BlcmF0aW9uIiwidXNlT3BlcmF0aW9uIiwiY29uZmlnIiwidXNlQ29uZmlnIiwicm91dGVzIiwiYXBpIiwiYXBpUm91dGUiLCJzZXJ2ZXJVUkwiLCJtb2RpZmllZCIsInNldE1vZGlmaWVkIiwidXNlU3RhdGUiLCJwcm9jZXNzaW5nIiwic2V0UHJvY2Vzc2luZyIsInNldFN1Ym1pdHRlZCIsImZvcm1SZWYiLCJ1c2VSZWYiLCJjb250ZXh0UmVmIiwiY29sbGVjdGlvblNsdWciLCJnbG9iYWxTbHVnIiwiZmllbGRzUmVkdWNlciIsInVzZVJlZHVjZXIiLCJmaWVsZFJlZHVjZXIiLCJmaWVsZHMiLCJkaXNwYXRjaEZpZWxkcyIsImN1cnJlbnQiLCJ2YWxpZGF0ZUZvcm0iLCJ1c2VDYWxsYmFjayIsInZhbGlkYXRlZEZpZWxkU3RhdGUiLCJpc1ZhbGlkIiwiZGF0YUZyb21Db250ZXh0IiwiZ2V0RGF0YSIsImRhdGEiLCJ2YWxpZGF0aW9uUHJvbWlzZXMiLCJPYmplY3QiLCJlbnRyaWVzIiwibWFwIiwicGF0aCIsImZpZWxkIiwidmFsaWRhdGVkRmllbGQiLCJ2YWxpZCIsInBhc3Nlc0NvbmRpdGlvbiIsInZhbGlkYXRpb25SZXN1bHQiLCJ2YWxpZGF0ZSIsInZhbHVlVG9WYWxpZGF0ZSIsInZhbHVlIiwicm93cyIsIkFycmF5IiwiaXNBcnJheSIsImdldERhdGFCeVBhdGgiLCJzaWJsaW5nRGF0YSIsImdldFNpYmxpbmdEYXRhIiwiZXJyb3JNZXNzYWdlIiwiUHJvbWlzZSIsImFsbCIsImlzRGVlcEVxdWFsIiwidHlwZSIsInN0YXRlIiwic3VibWl0Iiwib3B0aW9ucyIsImUiLCJhY3Rpb25Ub1VzZSIsIm1ldGhvZFRvVXNlIiwib3ZlcnJpZGVzIiwic2tpcFZhbGlkYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsIndhaXQiLCJyZXZhbGlkYXRlZEZvcm1TdGF0ZSIsInJlZHVjZSIsInByaW9yT25DaGFuZ2UiLCJiZWZvcmVTdWJtaXRGbiIsInJlc3VsdCIsImZvcm1TdGF0ZSIsInJlc29sdmUiLCJldmVyeSIsInRvYXN0IiwiZXJyb3IiLCJyZWR1Y2VGaWVsZHNUb1ZhbHVlcyIsImZvcm1EYXRhIiwiY3JlYXRlRm9ybURhdGEiLCJyZXMiLCJyZXF1ZXN0cyIsInRvTG93ZXJDYXNlIiwiYm9keSIsImhlYWRlcnMiLCJsYW5ndWFnZSIsImNvbnRlbnRUeXBlIiwiZ2V0IiwiaXNKU09OIiwiaW5kZXhPZiIsImpzb24iLCJzdGF0dXMiLCJwdXNoIiwic3VjY2VzcyIsIm1lc3NhZ2UiLCJhdXRvQ2xvc2UiLCJlcnJvcnMiLCJmaWVsZEVycm9ycyIsIm5vbkZpZWxkRXJyb3JzIiwiZmllbGRFcnJzIiwibm9uRmllbGRFcnJzIiwiZXJyIiwibmV3RmllbGRFcnJzIiwibmV3Tm9uRmllbGRFcnJzIiwiZm9yRWFjaCIsImRhdGFFcnJvciIsImVycm9yTWVzc2FnZXMiLCJzdGF0dXNUZXh0IiwiZ2V0RmllbGRzIiwiZ2V0RmllbGQiLCJnZXRTaWJsaW5nRGF0YUZ1bmMiLCJnZXREYXRhQnlQYXRoRnVuYyIsImZpbGUiLCJkYXRhV2l0aE92ZXJyaWRlcyIsImRhdGFUb1NlcmlhbGl6ZSIsIl9wYXlsb2FkIiwiSlNPTiIsInN0cmluZ2lmeSIsInNlcmlhbGl6ZSIsImluZGljZXMiLCJudWxsc0FzVW5kZWZpbmVkcyIsInJlc2V0IiwiZmllbGRTY2hlbWEiLCJwcmVmZXJlbmNlcyIsImluaXRDb250ZXh0U3RhdGUiLCJyZXBsYWNlU3RhdGUiLCJnZXRGaWVsZFN0YXRlQnlQYXRoIiwiZ2V0Rm9ybVN0YXRlIiwic2NoZW1hUGF0aCIsInJlcGxhY2UiLCJhZGRGaWVsZFJvdyIsInJvd0luZGV4Iiwic3ViRmllbGRTdGF0ZSIsImJsb2NrVHlwZSIsInJlbW92ZUZpZWxkUm93IiwicmVwbGFjZUZpZWxkUm93IiwidXNlRWZmZWN0IiwidXNlVGhyb3R0bGVkRWZmZWN0IiwiY2xhc3NlcyIsImZpbHRlciIsIkJvb2xlYW4iLCJqb2luIiwidXNlRGVib3VuY2VkRWZmZWN0IiwiZXhlY3V0ZU9uQ2hhbmdlIiwib25DaGFuZ2VGbiIsImNoYW5nZWQiLCJuZXdTdGF0ZSIsIm1lcmdlU2VydmVyRm9ybVN0YXRlIiwib3B0aW1pemUiLCJmb3JtIiwibm9WYWxpZGF0ZSIsInJlZiIsIkZvcm1Db250ZXh0IiwiUHJvdmlkZXIiLCJGb3JtV2F0Y2hDb250ZXh0IiwiU3VibWl0dGVkQ29udGV4dCIsIlByb2Nlc3NpbmdDb250ZXh0IiwiTW9kaWZpZWRDb250ZXh0IiwiRm9ybUZpZWxkc0NvbnRleHQiXSwibWFwcGluZ3MiOiJBQUFBOzs7OzsrQkFtbEJBOzs7ZUFBQTs7O2tFQS9rQndCOzRCQUNFO2tDQUNBOzJCQUNMOytEQUN1RDsrQkFDdEQ7b0NBSWE7MkVBQ0o7c0JBQ1A7d0JBQ0U7OEJBQ007d0JBQ047bUNBQ0c7NkJBQ0U7cUJBQ047OEJBQ0k7eUJBUXRCO3NFQUNtQjs4QkFDRztzRUFDQzt1RUFDQzt5RUFDRjtzQ0FDUTs2RUFDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFakMsTUFBTUEsWUFBWTtBQUVsQixNQUFNQyxPQUF3QixDQUFDQztJQUM3QixNQUFNLEVBQUVDLEVBQUUsRUFBRUMsaUJBQWlCLEVBQUUsR0FBR0MsSUFBQUEsNkJBQWU7SUFFakQsTUFBTSxFQUNKQyxNQUFNLEVBQ05DLFFBQVEsRUFDUkMsU0FBUyxFQUNUQyxvQkFBb0IsRUFDcEJDLFFBQVEsRUFDUixrRUFBa0U7SUFDbEVDLFlBQVksRUFDWkMsY0FBYyxFQUNkQyxZQUFZ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
|
|
509
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mb3Jtcy9Gb3JtL2luZGV4LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCdcbmltcG9ydCB0eXBlIHsgRmllbGQsIEZvcm1TdGF0ZSB9IGZyb20gJ3BheWxvYWQvdHlwZXMnXG5cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L25vLW5vbmludGVyYWN0aXZlLWVsZW1lbnQtaW50ZXJhY3Rpb25zICovXG5pbXBvcnQgaXNEZWVwRXF1YWwgZnJvbSAnZGVlcC1lcXVhbCdcbmltcG9ydCB7IHVzZVJvdXRlciB9IGZyb20gJ25leHQvbmF2aWdhdGlvbidcbmltcG9ydCB7IHNlcmlhbGl6ZSB9IGZyb20gJ29iamVjdC10by1mb3JtZGF0YSdcbmltcG9ydCB7IHdhaXQgfSBmcm9tICdwYXlsb2FkL3V0aWxpdGllcydcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VSZWR1Y2VyLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB0b2FzdCB9IGZyb20gJ3JlYWN0LXRvYXN0aWZ5J1xuXG5pbXBvcnQgdHlwZSB7IENvbnRleHQgYXMgRm9ybUNvbnRleHRUeXBlLCBHZXREYXRhQnlQYXRoLCBQcm9wcywgU3VibWl0T3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnXG5cbmltcG9ydCB7IHVzZURlYm91bmNlZEVmZmVjdCB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZURlYm91bmNlZEVmZmVjdCdcbmltcG9ydCB1c2VUaHJvdHRsZWRFZmZlY3QgZnJvbSAnLi4vLi4vaG9va3MvdXNlVGhyb3R0bGVkRWZmZWN0J1xuaW1wb3J0IHsgdXNlQXV0aCB9IGZyb20gJy4uLy4uL3Byb3ZpZGVycy9BdXRoJ1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzL0NvbmZpZydcbmltcG9ydCB7IHVzZURvY3VtZW50SW5mbyB9IGZyb20gJy4uLy4uL3Byb3ZpZGVycy9Eb2N1bWVudEluZm8nXG5pbXBvcnQgeyB1c2VMb2NhbGUgfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvTG9jYWxlJ1xuaW1wb3J0IHsgdXNlT3BlcmF0aW9uIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzL09wZXJhdGlvblByb3ZpZGVyJ1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvVHJhbnNsYXRpb24nXG5pbXBvcnQgeyByZXF1ZXN0cyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9hcGknXG5pbXBvcnQgeyBnZXRGb3JtU3RhdGUgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvZ2V0Rm9ybVN0YXRlJ1xuaW1wb3J0IHtcbiAgRm9ybUNvbnRleHQsXG4gIEZvcm1GaWVsZHNDb250ZXh0LFxuICBGb3JtV2F0Y2hDb250ZXh0LFxuICBNb2RpZmllZENvbnRleHQsXG4gIFByb2Nlc3NpbmdDb250ZXh0LFxuICBTdWJtaXR0ZWRDb250ZXh0LFxufSBmcm9tICcuL2NvbnRleHQnXG5pbXBvcnQgZXJyb3JNZXNzYWdlcyBmcm9tICcuL2Vycm9yTWVzc2FnZXMnXG5pbXBvcnQgeyBmaWVsZFJlZHVjZXIgfSBmcm9tICcuL2ZpZWxkUmVkdWNlcidcbmltcG9ydCBnZXREYXRhQnlQYXRoRnVuYyBmcm9tICcuL2dldERhdGFCeVBhdGgnXG5pbXBvcnQgZ2V0U2libGluZ0RhdGFGdW5jIGZyb20gJy4vZ2V0U2libGluZ0RhdGEnXG5pbXBvcnQgaW5pdENvbnRleHRTdGF0ZSBmcm9tICcuL2luaXRDb250ZXh0U3RhdGUnXG5pbXBvcnQgeyBtZXJnZVNlcnZlckZvcm1TdGF0ZSB9IGZyb20gJy4vbWVyZ2VTZXJ2ZXJGb3JtU3RhdGUnXG5pbXBvcnQgcmVkdWNlRmllbGRzVG9WYWx1ZXMgZnJvbSAnLi9yZWR1Y2VGaWVsZHNUb1ZhbHVlcydcblxuY29uc3QgYmFzZUNsYXNzID0gJ2Zvcm0nXG5cbmNvbnN0IEZvcm06IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IGlkLCBnZXREb2NQcmVmZXJlbmNlcyB9ID0gdXNlRG9jdW1lbnRJbmZvKClcblxuICBjb25zdCB7XG4gICAgYWN0aW9uLFxuICAgIGNoaWxkcmVuLFxuICAgIGNsYXNzTmFtZSxcbiAgICBkaXNhYmxlU3VjY2Vzc1N0YXR1cyxcbiAgICBkaXNhYmxlZCxcbiAgICAvLyBmaWVsZHM6IGZpZWxkc0Zyb21Qcm9wcyA9IGNvbGxlY3Rpb24/LmZpZWxkcyB8fCBnbG9iYWw/LmZpZWxkcyxcbiAgICBiZWZvcmVTdWJtaXQsXG4gICAgaGFuZGxlUmVzcG9uc2UsXG4gICAgaW5pdGlhbFN0YXRlLCAvLyBmdWxseSBmb3JtZWQgaW5pdGlhbCBmaWVsZCBzdGF0ZVxuICAgIG9uQ2hhbmdlLFxuICAgIG9uU3VibWl0LFxuICAgIG9uU3VjY2VzcyxcbiAgICByZWRpcmVjdCxcbiAgICBzdWJtaXR0ZWQ6IHN1Ym1pdHRlZEZyb21Qcm9wcyxcbiAgICB1dWlkLFxuICAgIHdhaXRGb3JBdXRvY29tcGxldGUsXG4gIH0gPSBwcm9wc1xuXG4gIGNvbnN0IG1ldGhvZCA9ICdtZXRob2QnIGluIHByb3BzID8gcHJvcHMubWV0aG9kIDogdW5kZWZpbmVkXG5cbiAgY29uc3Qgcm91dGVyID0gdXNlUm91dGVyKClcblxuICBjb25zdCB7IGNvZGU6IGxvY2FsZSB9ID0gdXNlTG9jYWxlKClcbiAgY29uc3QgeyBpMThuLCB0IH0gPSB1c2VUcmFuc2xhdGlvbigpXG4gIGNvbnN0IHsgcmVmcmVzaENvb2tpZSwgdXNlciB9ID0gdXNlQXV0aCgpXG4gIGNvbnN0IG9wZXJhdGlvbiA9IHVzZU9wZXJhdGlvbigpXG5cbiAgY29uc3QgY29uZmlnID0gdXNlQ29uZmlnKClcbiAgY29uc3Qge1xuICAgIHJvdXRlczogeyBhcGk6IGFwaVJvdXRlIH0sXG4gICAgc2VydmVyVVJMLFxuICB9ID0gY29uZmlnXG5cbiAgY29uc3QgW21vZGlmaWVkLCBzZXRNb2RpZmllZF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3Byb2Nlc3NpbmcsIHNldFByb2Nlc3NpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzdWJtaXR0ZWQsIHNldFN1Ym1pdHRlZF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgZm9ybVJlZiA9IHVzZVJlZjxIVE1MRm9ybUVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IGNvbnRleHRSZWYgPSB1c2VSZWYoe30gYXMgRm9ybUNvbnRleHRUeXBlKVxuICBjb25zdCB7IGNvbGxlY3Rpb25TbHVnLCBnbG9iYWxTbHVnIH0gPSB1c2VEb2N1bWVudEluZm8oKVxuXG4gIGNvbnN0IGZpZWxkc1JlZHVjZXIgPSB1c2VSZWR1Y2VyKGZpZWxkUmVkdWNlciwge30sICgpID0+IGluaXRpYWxTdGF0ZSlcbiAgLyoqXG4gICAqIGBmaWVsZHNgIGlzIHRoZSBjdXJyZW50LCB1cC10by1kYXRlIHN0YXRlL2RhdGEgb2YgYWxsIGZpZWxkcyBpbiB0aGUgZm9ybS4gSXQgY2FuIGJlIG1vZGlmaWVkIGJ5IHVzaW5nIGRpc3BhdGNoRmllbGRzLFxuICAgKiB3aGljaCBjYWxscyB0aGUgZmllbGRSZWR1Y2VyLCB3aGljaCB0aGVuIHVwZGF0ZXMgdGhlIHN0YXRlLlxuICAgKi9cbiAgY29uc3QgW2ZpZWxkcywgZGlzcGF0Y2hGaWVsZHNdID0gZmllbGRzUmVkdWNlclxuXG4gIGNvbnRleHRSZWYuY3VycmVudC5maWVsZHMgPSBmaWVsZHNcblxuICBjb25zdCB2YWxpZGF0ZUZvcm0gPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdmFsaWRhdGVkRmllbGRTdGF0ZSA9IHt9XG4gICAgbGV0IGlzVmFsaWQgPSB0cnVlXG5cbiAgICBjb25zdCBkYXRhRnJvbUNvbnRleHQgPSBjb250ZXh0UmVmLmN1cnJlbnQuZ2V0RGF0YSgpXG4gICAgY29uc3QgZGF0YSA9IGRhdGFGcm9tQ29udGV4dFxuXG4gICAgY29uc3QgdmFsaWRhdGlvblByb21pc2VzID0gT2JqZWN0LmVudHJpZXMoY29udGV4dFJlZi5jdXJyZW50LmZpZWxkcykubWFwKFxuICAgICAgYXN5bmMgKFtwYXRoLCBmaWVsZF0pID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkRmllbGQgPSB7XG4gICAgICAgICAgLi4uZmllbGQsXG4gICAgICAgICAgdmFsaWQ6IHRydWUsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGQucGFzc2VzQ29uZGl0aW9uICE9PSBmYWxzZSkge1xuICAgICAgICAgIGxldCB2YWxpZGF0aW9uUmVzdWx0OiBib29sZWFuIHwgc3RyaW5nID0gdHJ1ZVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZC52YWxpZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbGV0IHZhbHVlVG9WYWxpZGF0ZSA9IGZpZWxkLnZhbHVlXG5cbiAgICAgICAgICAgIGlmIChmaWVsZD8ucm93cyAmJiBBcnJheS5pc0FycmF5KGZpZWxkLnJvd3MpKSB7XG4gICAgICAgICAgICAgIHZhbHVlVG9WYWxpZGF0ZSA9IGNvbnRleHRSZWYuY3VycmVudC5nZXREYXRhQnlQYXRoKHBhdGgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCBmaWVsZC52YWxpZGF0ZSh2YWx1ZVRvVmFsaWRhdGUsIHtcbiAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICAgICAgICBzaWJsaW5nRGF0YTogY29udGV4dFJlZi5jdXJyZW50LmdldFNpYmxpbmdEYXRhKHBhdGgpLFxuICAgICAgICAgICAgICB0LFxuICAgICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbGlkYXRpb25SZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZWRGaWVsZC5lcnJvck1lc3NhZ2UgPSB2YWxpZGF0aW9uUmVzdWx0XG4gICAgICAgICAgICB2YWxpZGF0ZWRGaWVsZC52YWxpZCA9IGZhbHNlXG4gICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YWxpZGF0ZWRGaWVsZFN0YXRlW3BhdGhdID0gdmFsaWRhdGVkRmllbGRcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodmFsaWRhdGlvblByb21pc2VzKVxuXG4gICAgaWYgKCFpc0RlZXBFcXVhbChjb250ZXh0UmVmLmN1cnJlbnQuZmllbGRzLCB2YWxpZGF0ZWRGaWVsZFN0YXRlKSkge1xuICAgICAgZGlzcGF0Y2hGaWVsZHMoeyB0eXBlOiAnUkVQTEFDRV9TVEFURScsIHN0YXRlOiB2YWxpZGF0ZWRGaWVsZFN0YXRlIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGlzVmFsaWRcbiAgfSwgW2lkLCB1c2VyLCBvcGVyYXRpb24sIHQsIGRpc3BhdGNoRmllbGRzLCBjb25maWddKVxuXG4gIGNvbnN0IHN1Ym1pdCA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChvcHRpb25zOiBTdWJtaXRPcHRpb25zID0ge30sIGUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWN0aW9uOiBhY3Rpb25Ub1VzZSA9IGFjdGlvbixcbiAgICAgICAgbWV0aG9kOiBtZXRob2RUb1VzZSA9IG1ldGhvZCxcbiAgICAgICAgb3ZlcnJpZGVzID0ge30sXG4gICAgICAgIHNraXBWYWxpZGF0aW9uLFxuICAgICAgfSA9IG9wdGlvbnNcblxuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICB9XG5cbiAgICAgIHNldFByb2Nlc3NpbmcodHJ1ZSlcbiAgICAgIHNldFN1Ym1pdHRlZCh0cnVlKVxuXG4gICAgICBpZiAod2FpdEZvckF1dG9jb21wbGV0ZSkgYXdhaXQgd2FpdCgxMDApXG5cbiAgICAgIC8vIEV4ZWN1dGUgc2VydmVyIHNpZGUgdmFsaWRhdGlvbnNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGJlZm9yZVN1Ym1pdCkpIHtcbiAgICAgICAgbGV0IHJldmFsaWRhdGVkRm9ybVN0YXRlOiBGb3JtU3RhdGVcblxuICAgICAgICBhd2FpdCBiZWZvcmVTdWJtaXQucmVkdWNlKGFzeW5jIChwcmlvck9uQ2hhbmdlLCBiZWZvcmVTdWJtaXRGbikgPT4ge1xuICAgICAgICAgIGF3YWl0IHByaW9yT25DaGFuZ2VcblxuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJlZm9yZVN1Ym1pdEZuKHtcbiAgICAgICAgICAgIGZvcm1TdGF0ZTogZmllbGRzLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICByZXZhbGlkYXRlZEZvcm1TdGF0ZSA9IHJlc3VsdFxuICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgICBjb25zdCBpc1ZhbGlkID0gT2JqZWN0LmVudHJpZXMocmV2YWxpZGF0ZWRGb3JtU3RhdGUpLmV2ZXJ5KChbLCBmaWVsZF0pID0+IGZpZWxkLnZhbGlkKVxuXG4gICAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICAgIHNldFByb2Nlc3NpbmcoZmFsc2UpXG4gICAgICAgICAgcmV0dXJuIGRpc3BhdGNoRmllbGRzKHsgdHlwZTogJ1JFUExBQ0VfU1RBVEUnLCBzdGF0ZTogcmV2YWxpZGF0ZWRGb3JtU3RhdGUgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpc1ZhbGlkID0gc2tpcFZhbGlkYXRpb24gPyB0cnVlIDogYXdhaXQgY29udGV4dFJlZi5jdXJyZW50LnZhbGlkYXRlRm9ybSgpXG5cbiAgICAgIC8vIElmIG5vdCB2YWxpZCwgcHJldmVudCBzdWJtaXNzaW9uXG4gICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgdG9hc3QuZXJyb3IodCgnZXJyb3I6Y29ycmVjdEludmFsaWRGaWVsZHMnKSlcbiAgICAgICAgc2V0UHJvY2Vzc2luZyhmYWxzZSlcblxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gSWYgc3VibWl0IGhhbmRsZXIgY29tZXMgdGhyb3VnaCB2aWEgcHJvcHMsIHJ1biB0aGF0XG4gICAgICBpZiAob25TdWJtaXQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAuLi5yZWR1Y2VGaWVsZHNUb1ZhbHVlcyhmaWVsZHMsIHRydWUpLFxuICAgICAgICAgIC4uLm92ZXJyaWRlcyxcbiAgICAgICAgfVxuXG4gICAgICAgIG9uU3VibWl0KGZpZWxkcywgZGF0YSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybURhdGEgPSBjb250ZXh0UmVmLmN1cnJlbnQuY3JlYXRlRm9ybURhdGEob3ZlcnJpZGVzKVxuXG4gICAgICB0cnkge1xuICAgICAgICBsZXQgcmVzXG5cbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb25Ub1VzZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXMgPSBhd2FpdCByZXF1ZXN0c1ttZXRob2RUb1VzZS50b0xvd2VyQ2FzZSgpXShhY3Rpb25Ub1VzZSwge1xuICAgICAgICAgICAgYm9keTogZm9ybURhdGEsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiBpMThuLmxhbmd1YWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhY3Rpb25Ub1VzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJlcyA9IGF3YWl0IGFjdGlvblRvVXNlKGZvcm1EYXRhKVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0TW9kaWZpZWQoZmFsc2UpXG5cbiAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVSZXNwb25zZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGhhbmRsZVJlc3BvbnNlKHJlcylcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHNldFByb2Nlc3NpbmcoZmFsc2UpXG5cbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpXG4gICAgICAgIGNvbnN0IGlzSlNPTiA9IGNvbnRlbnRUeXBlICYmIGNvbnRlbnRUeXBlLmluZGV4T2YoJ2FwcGxpY2F0aW9uL2pzb24nKSAhPT0gLTFcblxuICAgICAgICBsZXQganNvbjogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgaWYgKGlzSlNPTikganNvbiA9IGF3YWl0IHJlcy5qc29uKClcblxuICAgICAgICBpZiAocmVzLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICAgIHNldFN1Ym1pdHRlZChmYWxzZSlcblxuICAgICAgICAgIGlmICh0eXBlb2Ygb25TdWNjZXNzID09PSAnZnVuY3Rpb24nKSBvblN1Y2Nlc3MoanNvbilcblxuICAgICAgICAgIGlmIChyZWRpcmVjdCkge1xuICAgICAgICAgICAgLy8gY29uc3QgZGVzdGluYXRpb24gPSB7XG4gICAgICAgICAgICAvLyAgIHBhdGhuYW1lOiByZWRpcmVjdCxcbiAgICAgICAgICAgIC8vICAgc3RhdGU6IHt9LFxuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAvLyBpZiAodHlwZW9mIGpzb24gPT09ICdvYmplY3QnICYmIGpzb24ubWVzc2FnZSAmJiAhZGlzYWJsZVN1Y2Nlc3NTdGF0dXMpIHtcbiAgICAgICAgICAgIC8vICAgZGVzdGluYXRpb24uc3RhdGUgPSB7XG4gICAgICAgICAgICAvLyAgICAgc3RhdHVzOiBbXG4gICAgICAgICAgICAvLyAgICAgICB7XG4gICAgICAgICAgICAvLyAgICAgICAgIG1lc3NhZ2U6IGpzb24ubWVzc2FnZSxcbiAgICAgICAgICAgIC8vICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgLy8gICAgICAgfSxcbiAgICAgICAgICAgIC8vICAgICBdLFxuICAgICAgICAgICAgLy8gICB9XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIHJvdXRlci5wdXNoKHJlZGlyZWN0KVxuICAgICAgICAgIH0gZWxzZSBpZiAoIWRpc2FibGVTdWNjZXNzU3RhdHVzKSB7XG4gICAgICAgICAgICB0b2FzdC5zdWNjZXNzKGpzb24ubWVzc2FnZSB8fCB0KCdnZW5lcmFsOnN1Ym1pc3Npb25TdWNjZXNzZnVsJyksIHsgYXV0b0Nsb3NlOiAzMDAwIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnRleHRSZWYuY3VycmVudCA9IHsgLi4uY29udGV4dFJlZi5jdXJyZW50IH0gLy8gdHJpZ2dlcnMgcmVyZW5kZXIgb2YgYWxsIGNvbXBvbmVudHMgdGhhdCBzdWJzY3JpYmUgdG8gZm9ybVxuICAgICAgICAgIGlmIChqc29uLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRvYXN0LmVycm9yKGpzb24ubWVzc2FnZSlcblxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbi5lcnJvcnMpKSB7XG4gICAgICAgICAgICBjb25zdCBbZmllbGRFcnJvcnMsIG5vbkZpZWxkRXJyb3JzXSA9IGpzb24uZXJyb3JzLnJlZHVjZShcbiAgICAgICAgICAgICAgKFtmaWVsZEVycnMsIG5vbkZpZWxkRXJyc10sIGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0ZpZWxkRXJycyA9IFtdXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Tm9uRmllbGRFcnJzID0gW11cblxuICAgICAgICAgICAgICAgIGlmIChlcnI/Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgIG5ld05vbkZpZWxkRXJycy5wdXNoKGVycilcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlcnI/LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICBlcnIuZGF0YS5mb3JFYWNoKChkYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFFcnJvcj8uZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBuZXdGaWVsZEVycnMucHVzaChkYXRhRXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgbmV3Tm9uRmllbGRFcnJzLnB1c2goZGF0YUVycm9yKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICBbLi4uZmllbGRFcnJzLCAuLi5uZXdGaWVsZEVycnNdLFxuICAgICAgICAgICAgICAgICAgWy4uLm5vbkZpZWxkRXJycywgLi4ubmV3Tm9uRmllbGRFcnJzXSxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFtbXSwgW11dLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBmaWVsZEVycm9ycy5mb3JFYWNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgZGlzcGF0Y2hGaWVsZHMoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdVUERBVEUnLFxuICAgICAgICAgICAgICAgIC4uLihjb250ZXh0UmVmLmN1cnJlbnQ/LmZpZWxkcz8uW2Vyci5maWVsZF0gfHwge30pLFxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgcGF0aDogZXJyLmZpZWxkLFxuICAgICAgICAgICAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIG5vbkZpZWxkRXJyb3JzLmZvckVhY2goKGVycikgPT4ge1xuICAgICAgICAgICAgICB0b2FzdC5lcnJvcihlcnIubWVzc2FnZSB8fCB0KCdlcnJvcjp1bmtub3duJykpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3JNZXNzYWdlcz8uW3Jlcy5zdGF0dXNdIHx8IHJlcz8uc3RhdHVzVGV4dCB8fCB0KCdlcnJvcjp1bmtub3duJylcblxuICAgICAgICAgIHRvYXN0LmVycm9yKG1lc3NhZ2UpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzZXRQcm9jZXNzaW5nKGZhbHNlKVxuXG4gICAgICAgIHRvYXN0LmVycm9yKGVycilcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGFjdGlvbixcbiAgICAgIGRpc2FibGVTdWNjZXNzU3RhdHVzLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICBkaXNwYXRjaEZpZWxkcyxcbiAgICAgIGZpZWxkcyxcbiAgICAgIGhhbmRsZVJlc3BvbnNlLFxuICAgICAgbWV0aG9kLFxuICAgICAgb25TdWJtaXQsXG4gICAgICBvblN1Y2Nlc3MsXG4gICAgICByZWRpcmVjdCxcbiAgICAgIHJvdXRlcixcbiAgICAgIHQsXG4gICAgICBpMThuLFxuICAgICAgd2FpdEZvckF1dG9jb21wbGV0ZSxcbiAgICAgIGJlZm9yZVN1Ym1pdCxcbiAgICBdLFxuICApXG5cbiAgY29uc3QgZ2V0RmllbGRzID0gdXNlQ2FsbGJhY2soKCkgPT4gY29udGV4dFJlZi5jdXJyZW50LmZpZWxkcywgW10pXG5cbiAgY29uc3QgZ2V0RmllbGQgPSB1c2VDYWxsYmFjaygocGF0aDogc3RyaW5nKSA9PiBjb250ZXh0UmVmLmN1cnJlbnQuZmllbGRzW3BhdGhdLCBbXSlcblxuICBjb25zdCBnZXREYXRhID0gdXNlQ2FsbGJhY2soKCkgPT4gcmVkdWNlRmllbGRzVG9WYWx1ZXMoY29udGV4dFJlZi5jdXJyZW50LmZpZWxkcywgdHJ1ZSksIFtdKVxuXG4gIGNvbnN0IGdldFNpYmxpbmdEYXRhID0gdXNlQ2FsbGJhY2soXG4gICAgKHBhdGg6IHN0cmluZykgPT4gZ2V0U2libGluZ0RhdGFGdW5jKGNvbnRleHRSZWYuY3VycmVudC5maWVsZHMsIHBhdGgpLFxuICAgIFtdLFxuICApXG4gIGNvbnN0IGdldERhdGFCeVBhdGggPSB1c2VDYWxsYmFjazxHZXREYXRhQnlQYXRoPihcbiAgICAocGF0aDogc3RyaW5nKSA9PiBnZXREYXRhQnlQYXRoRnVuYyhjb250ZXh0UmVmLmN1cnJlbnQuZmllbGRzLCBwYXRoKSxcbiAgICBbXSxcbiAgKVxuXG4gIGNvbnN0IGNyZWF0ZUZvcm1EYXRhID0gdXNlQ2FsbGJhY2soKG92ZXJyaWRlczogYW55ID0ge30pID0+IHtcbiAgICBjb25zdCBkYXRhID0gcmVkdWNlRmllbGRzVG9WYWx1ZXMoY29udGV4dFJlZi5jdXJyZW50LmZpZWxkcywgdHJ1ZSlcblxuICAgIGNvbnN0IGZpbGUgPSBkYXRhPy5maWxlXG5cbiAgICBpZiAoZmlsZSkge1xuICAgICAgZGVsZXRlIGRhdGEuZmlsZVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGFXaXRoT3ZlcnJpZGVzID0ge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIC4uLm92ZXJyaWRlcyxcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhVG9TZXJpYWxpemUgPSB7XG4gICAgICBfcGF5bG9hZDogSlNPTi5zdHJpbmdpZnkoZGF0YVdpdGhPdmVycmlkZXMpLFxuICAgICAgZmlsZSxcbiAgICB9XG5cbiAgICAvLyBudWxsQXNVbmRlZmluZWRzIGlzIGltcG9ydGFudCB0byBhbGxvdyB1cGxvYWRzIGFuZCByZWxhdGlvbnNoaXAgZmllbGRzIHRvIGNsZWFyIHRoZW1zZWx2ZXNcbiAgICBjb25zdCBmb3JtRGF0YSA9IHNlcmlhbGl6ZShkYXRhVG9TZXJpYWxpemUsIHsgaW5kaWNlczogdHJ1ZSwgbnVsbHNBc1VuZGVmaW5lZHM6IGZhbHNlIH0pXG5cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfSwgW10pXG5cbiAgY29uc3QgcmVzZXQgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoZmllbGRTY2hlbWE6IEZpZWxkW10sIGRhdGE6IHVua25vd24pID0+IHtcbiAgICAgIGNvbnN0IHByZWZlcmVuY2VzID0gYXdhaXQgZ2V0RG9jUHJlZmVyZW5jZXMoKVxuICAgICAgLy8gY29uc3Qgc3RhdGUgPSBhd2FpdCBidWlsZFN0YXRlRnJvbVNjaGVtYSh7XG4gICAgICAvLyAgIGlkLFxuICAgICAgLy8gICAvLyBUT0RPOiBmaXggdGhpc1xuICAgICAgLy8gICAvLyBAdHMtaWdub3JlLW5leHQtbGluZVxuICAgICAgLy8gICBjb25maWcsXG4gICAgICAvLyAgIGRhdGEsXG4gICAgICAvLyAgIGZpZWxkU2NoZW1hLFxuICAgICAgLy8gICBsb2NhbGUsXG4gICAgICAvLyAgIG9wZXJhdGlvbixcbiAgICAgIC8vICAgcHJlZmVyZW5jZXMsXG4gICAgICAvLyAgIHQsXG4gICAgICAvLyAgIHVzZXIsXG4gICAgICAvLyB9KVxuICAgICAgY29udGV4dFJlZi5jdXJyZW50ID0geyAuLi5pbml0Q29udGV4dFN0YXRlIH0gYXMgRm9ybUNvbnRleHRUeXBlXG4gICAgICBzZXRNb2RpZmllZChmYWxzZSlcbiAgICAgIC8vIGRpc3BhdGNoRmllbGRzKHsgc3RhdGUsIHR5cGU6ICdSRVBMQUNFX1NUQVRFJyB9KVxuICAgIH0sXG4gICAgW2dldERvY1ByZWZlcmVuY2VzXSxcbiAgKVxuXG4gIGNvbnN0IHJlcGxhY2VTdGF0ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChzdGF0ZTogRm9ybVN0YXRlKSA9PiB7XG4gICAgICBjb250ZXh0UmVmLmN1cnJlbnQgPSB7IC4uLmluaXRDb250ZXh0U3RhdGUgfSBhcyBGb3JtQ29udGV4dFR5cGVcbiAgICAgIHNldE1vZGlmaWVkKGZhbHNlKVxuICAgICAgZGlzcGF0Y2hGaWVsZHMoeyB0eXBlOiAnUkVQTEFDRV9TVEFURScsIHN0YXRlIH0pXG4gICAgfSxcbiAgICBbZGlzcGF0Y2hGaWVsZHNdLFxuICApXG5cbiAgY29uc3QgZ2V0RmllbGRTdGF0ZUJ5UGF0aCA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jICh7IGRhdGEsIHBhdGggfSkgPT4ge1xuICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSBhd2FpdCBnZXRGb3JtU3RhdGUoe1xuICAgICAgICBhcGlSb3V0ZSxcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgZ2xvYmFsU2x1ZyxcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgIFR1cm5zOiAnYXJyYXlGaWVsZC4wLmdyb3VwMTIzZmllbGQuYXJyYXlGaWVsZC4wLnRleHRGaWVsZCdcbiAgICAgICAgICAgIEludG86ICdhcnJheUZpZWxkLmdyb3VwMTIzZmllbGQuYXJyYXlGaWVsZC50ZXh0RmllbGQnXG4gICAgICAgICAgKi9cbiAgICAgICAgICBzY2hlbWFQYXRoOiBgJHtjb2xsZWN0aW9uU2x1ZyB8fCBnbG9iYWxTbHVnfS4ke3BhdGh9YC5yZXBsYWNlKC9cXC5cXGQrXFwuL2csICcuJyksXG4gICAgICAgIH0sXG4gICAgICAgIHNlcnZlclVSTCxcbiAgICAgIH0pXG4gICAgICByZXR1cm4gZmllbGRTY2hlbWFcbiAgICB9LFxuICAgIFthcGlSb3V0ZSwgY29sbGVjdGlvblNsdWcsIGdsb2JhbFNsdWcsIHNlcnZlclVSTF0sXG4gIClcblxuICBjb25zdCBhZGRGaWVsZFJvdzogRm9ybUNvbnRleHRUeXBlWydhZGRGaWVsZFJvdyddID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHsgZGF0YSwgcGF0aCwgcm93SW5kZXggfSkgPT4ge1xuICAgICAgY29uc3Qgc3ViRmllbGRTdGF0ZSA9IGF3YWl0IGdldEZpZWxkU3RhdGVCeVBhdGgoeyBkYXRhLCBwYXRoIH0pXG5cbiAgICAgIGRpc3BhdGNoRmllbGRzKHtcbiAgICAgICAgdHlwZTogJ0FERF9ST1cnLFxuICAgICAgICBibG9ja1R5cGU6IGRhdGE/LmJsb2NrVHlwZSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgcm93SW5kZXgsXG4gICAgICAgIHN1YkZpZWxkU3RhdGUsXG4gICAgICB9KVxuICAgIH0sXG4gICAgW2dldEZpZWxkU3RhdGVCeVBhdGgsIGRpc3BhdGNoRmllbGRzXSxcbiAgKVxuXG4gIGNvbnN0IHJlbW92ZUZpZWxkUm93OiBGb3JtQ29udGV4dFR5cGVbJ3JlbW92ZUZpZWxkUm93J10gPSB1c2VDYWxsYmFjayhcbiAgICAoeyBwYXRoLCByb3dJbmRleCB9KSA9PiB7XG4gICAgICBkaXNwYXRjaEZpZWxkcyh7IHR5cGU6ICdSRU1PVkVfUk9XJywgcGF0aCwgcm93SW5kZXggfSlcbiAgICB9LFxuICAgIFtkaXNwYXRjaEZpZWxkc10sXG4gIClcblxuICBjb25zdCByZXBsYWNlRmllbGRSb3c6IEZvcm1Db250ZXh0VHlwZVsncmVwbGFjZUZpZWxkUm93J10gPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoeyBkYXRhLCBwYXRoLCByb3dJbmRleCB9KSA9PiB7XG4gICAgICBjb25zdCBzdWJGaWVsZFN0YXRlID0gYXdhaXQgZ2V0RmllbGRTdGF0ZUJ5UGF0aCh7IGRhdGEsIHBhdGggfSlcblxuICAgICAgZGlzcGF0Y2hGaWVsZHMoe1xuICAgICAgICB0eXBlOiAnUkVQTEFDRV9ST1cnLFxuICAgICAgICBibG9ja1R5cGU6IGRhdGE/LmJsb2NrVHlwZSxcbiAgICAgICAgcGF0aCxcbiAgICAgICAgcm93SW5kZXgsXG4gICAgICAgIHN1YkZpZWxkU3RhdGUsXG4gICAgICB9KVxuICAgIH0sXG4gICAgW2dldEZpZWxkU3RhdGVCeVBhdGgsIGRpc3BhdGNoRmllbGRzXSxcbiAgKVxuXG4gIGNvbnRleHRSZWYuY3VycmVudC5zdWJtaXQgPSBzdWJtaXRcbiAgY29udGV4dFJlZi5jdXJyZW50LmdldEZpZWxkcyA9IGdldEZpZWxkc1xuICBjb250ZXh0UmVmLmN1cnJlbnQuZ2V0RmllbGQgPSBnZXRGaWVsZFxuICBjb250ZXh0UmVmLmN1cnJlbnQuZ2V0RGF0YSA9IGdldERhdGFcbiAgY29udGV4dFJlZi5jdXJyZW50LmdldFNpYmxpbmdEYXRhID0gZ2V0U2libGluZ0RhdGFcbiAgY29udGV4dFJlZi5jdXJyZW50LmdldERhdGFCeVBhdGggPSBnZXREYXRhQnlQYXRoXG4gIGNvbnRleHRSZWYuY3VycmVudC52YWxpZGF0ZUZvcm0gPSB2YWxpZGF0ZUZvcm1cbiAgY29udGV4dFJlZi5jdXJyZW50LmNyZWF0ZUZvcm1EYXRhID0gY3JlYXRlRm9ybURhdGFcbiAgY29udGV4dFJlZi5jdXJyZW50LnNldE1vZGlmaWVkID0gc2V0TW9kaWZpZWRcbiAgY29udGV4dFJlZi5jdXJyZW50LnNldFByb2Nlc3NpbmcgPSBzZXRQcm9jZXNzaW5nXG4gIGNvbnRleHRSZWYuY3VycmVudC5zZXRTdWJtaXR0ZWQgPSBzZXRTdWJtaXR0ZWRcbiAgY29udGV4dFJlZi5jdXJyZW50LmRpc2FibGVkID0gZGlzYWJsZWRcbiAgY29udGV4dFJlZi5jdXJyZW50LmZvcm1SZWYgPSBmb3JtUmVmXG4gIGNvbnRleHRSZWYuY3VycmVudC5yZXNldCA9IHJlc2V0XG4gIGNvbnRleHRSZWYuY3VycmVudC5yZXBsYWNlU3RhdGUgPSByZXBsYWNlU3RhdGVcbiAgY29udGV4dFJlZi5jdXJyZW50LmRpc3BhdGNoRmllbGRzID0gZGlzcGF0Y2hGaWVsZHNcbiAgY29udGV4dFJlZi5jdXJyZW50LmFkZEZpZWxkUm93ID0gYWRkRmllbGRSb3dcbiAgY29udGV4dFJlZi5jdXJyZW50LnJlbW92ZUZpZWxkUm93ID0gcmVtb3ZlRmllbGRSb3dcbiAgY29udGV4dFJlZi5jdXJyZW50LnJlcGxhY2VGaWVsZFJvdyA9IHJlcGxhY2VGaWVsZFJvd1xuICBjb250ZXh0UmVmLmN1cnJlbnQudXVpZCA9IHV1aWRcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygc3VibWl0dGVkRnJvbVByb3BzID09PSAnYm9vbGVhbicpIHNldFN1Ym1pdHRlZChzdWJtaXR0ZWRGcm9tUHJvcHMpXG4gIH0sIFtzdWJtaXR0ZWRGcm9tUHJvcHNdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY29udGV4dFJlZi5jdXJyZW50ID0geyAuLi5pbml0Q29udGV4dFN0YXRlIH0gYXMgRm9ybUNvbnRleHRUeXBlXG4gICAgICBkaXNwYXRjaEZpZWxkcyh7IHR5cGU6ICdSRVBMQUNFX1NUQVRFJywgc3RhdGU6IGluaXRpYWxTdGF0ZSB9KVxuICAgIH1cbiAgfSwgW2luaXRpYWxTdGF0ZSwgZGlzcGF0Y2hGaWVsZHNdKVxuXG4gIHVzZVRocm90dGxlZEVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICByZWZyZXNoQ29va2llKClcbiAgICB9LFxuICAgIDE1MDAwLFxuICAgIFtmaWVsZHNdLFxuICApXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb250ZXh0UmVmLmN1cnJlbnQgPSB7IC4uLmNvbnRleHRSZWYuY3VycmVudCB9IC8vIHRyaWdnZXJzIHJlcmVuZGVyIG9mIGFsbCBjb21wb25lbnRzIHRoYXQgc3Vic2NyaWJlIHRvIGZvcm1cbiAgICBzZXRNb2RpZmllZChmYWxzZSlcbiAgfSwgW2xvY2FsZV0pXG5cbiAgY29uc3QgY2xhc3NlcyA9IFtjbGFzc05hbWUsIGJhc2VDbGFzc10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKVxuXG4gIHVzZURlYm91bmNlZEVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBleGVjdXRlT25DaGFuZ2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9uQ2hhbmdlKSkge1xuICAgICAgICAgIGxldCByZXZhbGlkYXRlZEZvcm1TdGF0ZTogRm9ybVN0YXRlXG5cbiAgICAgICAgICBhd2FpdCBvbkNoYW5nZS5yZWR1Y2UoYXN5bmMgKHByaW9yT25DaGFuZ2UsIG9uQ2hhbmdlRm4pID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHByaW9yT25DaGFuZ2VcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb25DaGFuZ2VGbih7XG4gICAgICAgICAgICAgIGZvcm1TdGF0ZTogZmllbGRzLFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgcmV2YWxpZGF0ZWRGb3JtU3RhdGUgPSByZXN1bHRcbiAgICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgICAgIGNvbnN0IHsgY2hhbmdlZCwgbmV3U3RhdGUgfSA9IG1lcmdlU2VydmVyRm9ybVN0YXRlKGZpZWxkcywgcmV2YWxpZGF0ZWRGb3JtU3RhdGUpXG5cbiAgICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgZGlzcGF0Y2hGaWVsZHMoeyB0eXBlOiAnUkVQTEFDRV9TVEFURScsIG9wdGltaXplOiBmYWxzZSwgc3RhdGU6IG5ld1N0YXRlIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGV4ZWN1dGVPbkNoYW5nZSgpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgfSxcbiAgICAxNTAsXG4gICAgW2ZpZWxkcywgZGlzcGF0Y2hGaWVsZHMsIG9uQ2hhbmdlXSxcbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPGZvcm1cbiAgICAgIGFjdGlvbj17YWN0aW9ufVxuICAgICAgY2xhc3NOYW1lPXtjbGFzc2VzfVxuICAgICAgbWV0aG9kPXttZXRob2R9XG4gICAgICBub1ZhbGlkYXRlXG4gICAgICBvblN1Ym1pdD17KGUpID0+IGNvbnRleHRSZWYuY3VycmVudC5zdWJtaXQoe30sIGUpfVxuICAgICAgcmVmPXtmb3JtUmVmfVxuICAgID5cbiAgICAgIDxGb3JtQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y29udGV4dFJlZi5jdXJyZW50fT5cbiAgICAgICAgPEZvcm1XYXRjaENvbnRleHQuUHJvdmlkZXJcbiAgICAgICAgICB2YWx1ZT17e1xuICAgICAgICAgICAgZmllbGRzLFxuICAgICAgICAgICAgLi4uY29udGV4dFJlZi5jdXJyZW50LFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8U3VibWl0dGVkQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17c3VibWl0dGVkfT5cbiAgICAgICAgICAgIDxQcm9jZXNzaW5nQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17cHJvY2Vzc2luZ30+XG4gICAgICAgICAgICAgIDxNb2RpZmllZENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e21vZGlmaWVkfT5cbiAgICAgICAgICAgICAgICA8Rm9ybUZpZWxkc0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2ZpZWxkc1JlZHVjZXJ9PlxuICAgICAgICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgICAgICAgIDwvRm9ybUZpZWxkc0NvbnRleHQuUHJvdmlkZXI+XG4gICAgICAgICAgICAgIDwvTW9kaWZpZWRDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgICAgICAgPC9Qcm9jZXNzaW5nQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgICAgICA8L1N1Ym1pdHRlZENvbnRleHQuUHJvdmlkZXI+XG4gICAgICAgIDwvRm9ybVdhdGNoQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgIDwvRm9ybUNvbnRleHQuUHJvdmlkZXI+XG4gICAgPC9mb3JtPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IEZvcm1cbiJdLCJuYW1lcyI6WyJpc0RlZXBFcXVhbCIsInVzZVJvdXRlciIsInNlcmlhbGl6ZSIsIndhaXQiLCJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlRWZmZWN0IiwidXNlUmVkdWNlciIsInVzZVJlZiIsInVzZVN0YXRlIiwidG9hc3QiLCJ1c2VEZWJvdW5jZWRFZmZlY3QiLCJ1c2VUaHJvdHRsZWRFZmZlY3QiLCJ1c2VBdXRoIiwidXNlQ29uZmlnIiwidXNlRG9jdW1lbnRJbmZvIiwidXNlTG9jYWxlIiwidXNlT3BlcmF0aW9uIiwidXNlVHJhbnNsYXRpb24iLCJyZXF1ZXN0cyIsImdldEZvcm1TdGF0ZSIsIkZvcm1Db250ZXh0IiwiRm9ybUZpZWxkc0NvbnRleHQiLCJGb3JtV2F0Y2hDb250ZXh0IiwiTW9kaWZpZWRDb250ZXh0IiwiUHJvY2Vzc2luZ0NvbnRleHQiLCJTdWJtaXR0ZWRDb250ZXh0IiwiZXJyb3JNZXNzYWdlcyIsImZpZWxkUmVkdWNlciIsImdldERhdGFCeVBhdGhGdW5jIiwiZ2V0U2libGluZ0RhdGFGdW5jIiwiaW5pdENvbnRleHRTdGF0ZSIsIm1lcmdlU2VydmVyRm9ybVN0YXRlIiwicmVkdWNlRmllbGRzVG9WYWx1ZXMiLCJiYXNlQ2xhc3MiLCJGb3JtIiwicHJvcHMiLCJpZCIsImdldERvY1ByZWZlcmVuY2VzIiwiYWN0aW9uIiwiY2hpbGRyZW4iLCJjbGFzc05hbWUiLCJkaXNhYmxlU3VjY2Vzc1N0YXR1cyIsImRpc2FibGVkIiwiYmVmb3JlU3VibWl0IiwiaGFuZGxlUmVzcG9uc2UiLCJpbml0aWFsU3RhdGUiLCJvbkNoYW5nZSIsIm9uU3VibWl0Iiwib25TdWNjZXNzIiwicmVkaXJlY3QiLCJzdWJtaXR0ZWQiLCJzdWJtaXR0ZWRGcm9tUHJvcHMiLCJ1dWlkIiwid2FpdEZvckF1dG9jb21wbGV0ZSIsIm1ldGhvZCIsInVuZGVmaW5lZCIsInJvdXRlciIsImNvZGUiLCJsb2NhbGUiLCJpMThuIiwidCIsInJlZnJlc2hDb29raWUiLCJ1c2VyIiwib3BlcmF0aW9uIiwiY29uZmlnIiwicm91dGVzIiwiYXBpIiwiYXBpUm91dGUiLCJzZXJ2ZXJVUkwiLCJtb2RpZmllZCIsInNldE1vZGlmaWVkIiwicHJvY2Vzc2luZyIsInNldFByb2Nlc3NpbmciLCJzZXRTdWJtaXR0ZWQiLCJmb3JtUmVmIiwiY29udGV4dFJlZiIsImNvbGxlY3Rpb25TbHVnIiwiZ2xvYmFsU2x1ZyIsImZpZWxkc1JlZHVjZXIiLCJmaWVsZHMiLCJkaXNwYXRjaEZpZWxkcyIsImN1cnJlbnQiLCJ2YWxpZGF0ZUZvcm0iLCJ2YWxpZGF0ZWRGaWVsZFN0YXRlIiwiaXNWYWxpZCIsImRhdGFGcm9tQ29udGV4dCIsImdldERhdGEiLCJkYXRhIiwidmFsaWRhdGlvblByb21pc2VzIiwiT2JqZWN0IiwiZW50cmllcyIsIm1hcCIsInBhdGgiLCJmaWVsZCIsInZhbGlkYXRlZEZpZWxkIiwidmFsaWQiLCJwYXNzZXNDb25kaXRpb24iLCJ2YWxpZGF0aW9uUmVzdWx0IiwidmFsaWRhdGUiLCJ2YWx1ZVRvVmFsaWRhdGUiLCJ2YWx1ZSIsInJvd3MiLCJBcnJheSIsImlzQXJyYXkiLCJnZXREYXRhQnlQYXRoIiwic2libGluZ0RhdGEiLCJnZXRTaWJsaW5nRGF0YSIsImVycm9yTWVzc2FnZSIsIlByb21pc2UiLCJhbGwiLCJ0eXBlIiwic3RhdGUiLCJzdWJtaXQiLCJvcHRpb25zIiwiZSIsImFjdGlvblRvVXNlIiwibWV0aG9kVG9Vc2UiLCJvdmVycmlkZXMiLCJza2lwVmFsaWRhdGlvbiIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwicmV2YWxpZGF0ZWRGb3JtU3RhdGUiLCJyZWR1Y2UiLCJwcmlvck9uQ2hhbmdlIiwiYmVmb3JlU3VibWl0Rm4iLCJyZXN1bHQiLCJmb3JtU3RhdGUiLCJyZXNvbHZlIiwiZXZlcnkiLCJlcnJvciIsImZvcm1EYXRhIiwiY3JlYXRlRm9ybURhdGEiLCJyZXMiLCJ0b0xvd2VyQ2FzZSIsImJvZHkiLCJoZWFkZXJzIiwibGFuZ3VhZ2UiLCJjb250ZW50VHlwZSIsImdldCIsImlzSlNPTiIsImluZGV4T2YiLCJqc29uIiwic3RhdHVzIiwicHVzaCIsInN1Y2Nlc3MiLCJtZXNzYWdlIiwiYXV0b0Nsb3NlIiwiZXJyb3JzIiwiZmllbGRFcnJvcnMiLCJub25GaWVsZEVycm9ycyIsImZpZWxkRXJycyIsIm5vbkZpZWxkRXJycyIsImVyciIsIm5ld0ZpZWxkRXJycyIsIm5ld05vbkZpZWxkRXJycyIsImZvckVhY2giLCJkYXRhRXJyb3IiLCJzdGF0dXNUZXh0IiwiZ2V0RmllbGRzIiwiZ2V0RmllbGQiLCJmaWxlIiwiZGF0YVdpdGhPdmVycmlkZXMiLCJkYXRhVG9TZXJpYWxpemUiLCJfcGF5bG9hZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJpbmRpY2VzIiwibnVsbHNBc1VuZGVmaW5lZHMiLCJyZXNldCIsImZpZWxkU2NoZW1hIiwicHJlZmVyZW5jZXMiLCJyZXBsYWNlU3RhdGUiLCJnZXRGaWVsZFN0YXRlQnlQYXRoIiwic2NoZW1hUGF0aCIsInJlcGxhY2UiLCJhZGRGaWVsZFJvdyIsInJvd0luZGV4Iiwic3ViRmllbGRTdGF0ZSIsImJsb2NrVHlwZSIsInJlbW92ZUZpZWxkUm93IiwicmVwbGFjZUZpZWxkUm93IiwiY2xhc3NlcyIsImZpbHRlciIsIkJvb2xlYW4iLCJqb2luIiwiZXhlY3V0ZU9uQ2hhbmdlIiwib25DaGFuZ2VGbiIsImNoYW5nZWQiLCJuZXdTdGF0ZSIsIm9wdGltaXplIiwiZm9ybSIsIm5vVmFsaWRhdGUiLCJyZWYiLCJQcm92aWRlciJdLCJtYXBwaW5ncyI6IkFBQUE7QUFHQSxrRUFBa0UsR0FDbEUsT0FBT0EsaUJBQWlCLGFBQVk7QUFDcEMsU0FBU0MsU0FBUyxRQUFRLGtCQUFpQjtBQUMzQyxTQUFTQyxTQUFTLFFBQVEscUJBQW9CO0FBQzlDLFNBQVNDLElBQUksUUFBUSxvQkFBbUI7QUFDeEMsT0FBT0MsU0FBU0MsV0FBVyxFQUFFQyxTQUFTLEVBQUVDLFVBQVUsRUFBRUMsTUFBTSxFQUFFQyxRQUFRLFFBQVEsUUFBTztBQUNuRixTQUFTQyxLQUFLLFFBQVEsaUJBQWdCO0FBSXRDLFNBQVNDLGtCQUFrQixRQUFRLGlDQUFnQztBQUNuRSxPQUFPQyx3QkFBd0IsaUNBQWdDO0FBQy9ELFNBQVNDLE9BQU8sUUFBUSx1QkFBc0I7QUFDOUMsU0FBU0MsU0FBUyxRQUFRLHlCQUF3QjtBQUNsRCxTQUFTQyxlQUFlLFFBQVEsK0JBQThCO0FBQzlELFNBQVNDLFNBQVMsUUFBUSx5QkFBd0I7QUFDbEQsU0FBU0MsWUFBWSxRQUFR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
|