@sap/open.fe 1.99.0 → 1.100.0
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/package.json +1 -1
- package/packages/sap.fe.common/src/sap/fe/common/.library +1 -1
- package/packages/sap.fe.common/src/sap/fe/common/.theming +1 -1
- package/packages/sap.fe.common/src/sap/fe/common/MessageButton-dbg.js +1748 -1813
- package/packages/sap.fe.common/src/sap/fe/common/MessageButton.js +2 -3
- package/packages/sap.fe.common/src/sap/fe/common/MessageButton.ts +1801 -0
- package/packages/sap.fe.common/src/sap/fe/common/MessageFilter-dbg.js +77 -32
- package/packages/sap.fe.common/src/sap/fe/common/MessageFilter.js +2 -3
- package/packages/sap.fe.common/src/sap/fe/common/MessageFilter.ts +26 -0
- package/packages/sap.fe.common/src/sap/fe/common/MessagePopover-dbg.js +43 -53
- package/packages/sap.fe.common/src/sap/fe/common/MessagePopover.js +2 -3
- package/packages/sap.fe.common/src/sap/fe/common/MessagePopover.ts +39 -0
- package/packages/sap.fe.common/src/sap/fe/common/library-dbg.js +31 -38
- package/packages/sap.fe.common/src/sap/fe/common/library-h2-preload.js +8 -9
- package/packages/sap.fe.common/src/sap/fe/common/library-h2-preload.js.map +3 -3
- package/packages/sap.fe.common/src/sap/fe/common/library-preload.js +23 -71
- package/packages/sap.fe.common/src/sap/fe/common/library-preload.js.map +4 -4
- package/packages/sap.fe.common/src/sap/fe/common/library.js +4 -5
- package/packages/sap.fe.common/src/sap/fe/common/library.ts +35 -0
- package/packages/sap.fe.common/src/sap/fe/common/manifest.json +3 -3
- package/packages/sap.fe.common/src/sap/fe/common/resources.json +54 -32
- package/packages/sap.fe.common/test/sap/fe/common/designtime/api.json +1 -1
- package/packages/sap.fe.common/test/sap/fe/common/designtime/apiref/api.json +1 -1
- package/packages/sap.fe.common/test/sap/fe/common/designtime/codeassistance/Library.jsmeta.json +1 -1
- package/packages/sap.fe.common/test/sap/fe/common/designtime/codeassistance/Library.xmlmeta.json +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/.library +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/.theming +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/AnnotationHelper-dbg.js +1 -69
- package/packages/sap.fe.core/src/sap/fe/core/AnnotationHelper.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/AnnotationHelper.ts +0 -70
- package/packages/sap.fe.core/src/sap/fe/core/AppComponent-dbg.js +388 -399
- package/packages/sap.fe.core/src/sap/fe/core/AppComponent.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/AppComponent.ts +403 -0
- package/packages/sap.fe.core/src/sap/fe/core/AppStateHandler-dbg.js +127 -158
- package/packages/sap.fe.core/src/sap/fe/core/AppStateHandler.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/BaseController-dbg.js +82 -58
- package/packages/sap.fe.core/src/sap/fe/core/BaseController.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/BaseController.ts +68 -0
- package/packages/sap.fe.core/src/sap/fe/core/CommonUtils-dbg.js +111 -20
- package/packages/sap.fe.core/src/sap/fe/core/CommonUtils.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/CommonUtils.ts +131 -32
- package/packages/sap.fe.core/src/sap/fe/core/ExtensionAPI-dbg.js +278 -274
- package/packages/sap.fe.core/src/sap/fe/core/ExtensionAPI.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/ExtensionAPI.ts +250 -0
- package/packages/sap.fe.core/src/sap/fe/core/PageController-dbg.js +157 -29
- package/packages/sap.fe.core/src/sap/fe/core/PageController.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/PageController.ts +60 -32
- package/packages/sap.fe.core/src/sap/fe/core/RouterProxy-dbg.js +694 -756
- package/packages/sap.fe.core/src/sap/fe/core/RouterProxy.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/RouterProxy.ts +11 -9
- package/packages/sap.fe.core/src/sap/fe/core/Synchronization-dbg.js +21 -31
- package/packages/sap.fe.core/src/sap/fe/core/Synchronization.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/TemplateComponent-dbg.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/TemplateComponent.ts +10 -3
- package/packages/sap.fe.core/src/sap/fe/core/TemplateModel-dbg.js +20 -38
- package/packages/sap.fe.core/src/sap/fe/core/TemplateModel.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/TemplateModel.ts +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/TransactionHelper-dbg.js +1354 -1370
- package/packages/sap.fe.core/src/sap/fe/core/TransactionHelper.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/TransactionHelper.ts +33 -22
- package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/ActivitySync-dbg.js +392 -0
- package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/ActivitySync.js +5 -0
- package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
- package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/CollaborationCommon-dbg.js +136 -0
- package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +5 -0
- package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
- package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/Manage-dbg.js +262 -0
- package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/Manage.js +5 -0
- package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
- package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
- package/packages/sap.fe.core/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
- package/packages/sap.fe.core/src/sap/fe/core/actions/draft-dbg.js +30 -68
- package/packages/sap.fe.core/src/sap/fe/core/actions/draft.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/actions/draft.ts +44 -71
- package/packages/sap.fe.core/src/sap/fe/core/actions/messageHandling-dbg.js +55 -36
- package/packages/sap.fe.core/src/sap/fe/core/actions/messageHandling.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/actions/messageHandling.ts +66 -46
- package/packages/sap.fe.core/src/sap/fe/core/actions/operations-dbg.js +34 -15
- package/packages/sap.fe.core/src/sap/fe/core/actions/operations.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/actions/operations.ts +48 -18
- package/packages/sap.fe.core/src/sap/fe/core/actions/sticky-dbg.js +17 -4
- package/packages/sap.fe.core/src/sap/fe/core/actions/sticky.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/actions/sticky.ts +21 -4
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata-dbg.js +69 -66
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +1593 -1669
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/EditFlow.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/IntentBasedNavigation-dbg.js +79 -54
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalEditFlow-dbg.js +718 -779
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalEditFlow.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +796 -816
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +1004 -1005
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalRouting.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/KPIManagement-dbg.js +487 -521
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/KPIManagement.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -2
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +141 -169
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MassEdit.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MessageHandler-dbg.js +233 -244
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MessageHandler.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/PageReady-dbg.js +301 -336
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/PageReady.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/PageReady.ts +12 -10
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Paginator-dbg.js +188 -175
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Paginator.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Placeholder-dbg.js +157 -149
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Placeholder.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Routing-dbg.js +144 -125
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Routing.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/RoutingListener-dbg.js +7 -6
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/RoutingListener.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Share-dbg.js +230 -268
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Share.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/Share.ts +231 -0
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +592 -633
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/SideEffects.ts +8 -7
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/ViewState-dbg.js +788 -806
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/ViewState.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
- package/packages/sap.fe.core/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
- package/packages/sap.fe.core/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
- package/packages/sap.fe.core/src/sap/fe/core/controls/CommandExecution-dbg.js +67 -66
- package/packages/sap.fe.core/src/sap/fe/core/controls/CommandExecution.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controls/CommandExecution.ts +72 -0
- package/packages/sap.fe.core/src/sap/fe/core/controls/ConditionalWrapper-dbg.js +90 -75
- package/packages/sap.fe.core/src/sap/fe/core/controls/ConditionalWrapper.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
- package/packages/sap.fe.core/src/sap/fe/core/controls/CustomQuickViewPage-dbg.js +130 -125
- package/packages/sap.fe.core/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
- package/packages/sap.fe.core/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler-dbg.js +103 -112
- package/packages/sap.fe.core/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
- package/packages/sap.fe.core/src/sap/fe/core/controls/FieldWrapper-dbg.js +122 -135
- package/packages/sap.fe.core/src/sap/fe/core/controls/FieldWrapper.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
- package/packages/sap.fe.core/src/sap/fe/core/controls/FilterBar-dbg.js +162 -159
- package/packages/sap.fe.core/src/sap/fe/core/controls/FilterBar.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controls/FilterBar.ts +143 -0
- package/packages/sap.fe.core/src/sap/fe/core/controls/FormElementWrapper-dbg.js +45 -39
- package/packages/sap.fe.core/src/sap/fe/core/controls/FormElementWrapper.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
- package/packages/sap.fe.core/src/sap/fe/core/controls/MultiValueParameterDelegate-dbg.js +37 -42
- package/packages/sap.fe.core/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -2
- package/packages/sap.fe.core/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
- package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/FilterContainer-dbg.js +126 -116
- package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/FilterContainer.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
- package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +241 -255
- package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/VisualFilter.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
- package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/VisualFilterContainer-dbg.js +150 -141
- package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
- package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils-dbg.js +335 -322
- package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
- package/packages/sap.fe.core/src/sap/fe/core/controls/massEdit/MassEditHandlers-dbg.js +74 -74
- package/packages/sap.fe.core/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
- package/packages/sap.fe.core/src/sap/fe/core/converters/ConverterContext-dbg.js +348 -379
- package/packages/sap.fe.core/src/sap/fe/core/converters/ConverterContext.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/ConverterContext.ts +19 -16
- package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestSettings-dbg.js +12 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestSettings.ts +12 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestWrapper-dbg.js +354 -378
- package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/ManifestWrapper.ts +10 -0
- package/packages/sap.fe.core/src/sap/fe/core/converters/MetaModelConverter-dbg.js +6 -4
- package/packages/sap.fe.core/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/MetaModelConverter.ts +5 -2
- package/packages/sap.fe.core/src/sap/fe/core/converters/TemplateConverter-dbg.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/annotations/DataField-dbg.js +26 -12
- package/packages/sap.fe.core/src/sap/fe/core/converters/annotations/DataField.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/annotations/DataField.ts +37 -13
- package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Form-dbg.js +2 -2
- package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Form.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Form.ts +4 -2
- package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/KPI-dbg.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/KPI.ts +3 -2
- package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Table-dbg.js +130 -23
- package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Table.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/Table.ts +134 -29
- package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +118 -53
- package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +156 -93
- package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +161 -207
- package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +148 -206
- package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +115 -133
- package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/Aggregation.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/BindingHelper-dbg.js +20 -6
- package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/BindingHelper.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
- package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/ConfigurableObject-dbg.js +12 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
- package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/Key-dbg.js +42 -57
- package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/Key.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/helpers/Key.ts +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction-dbg.js +25 -4
- package/packages/sap.fe.core/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +20 -3
- package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +10 -4
- package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ListReportConverter.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ListReportConverter.ts +15 -4
- package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +7 -5
- package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
- package/packages/sap.fe.core/src/sap/fe/core/designtime/AppComponent-dbg.designtime.js +92 -98
- package/packages/sap.fe.core/src/sap/fe/core/designtime/AppComponent.designtime.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
- package/packages/sap.fe.core/src/sap/fe/core/designtime/library-preload.designtime.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/designtime/library-preload.designtime.js.map +3 -3
- package/packages/sap.fe.core/src/sap/fe/core/formatters/CollaborationFormatter-dbg.js +104 -0
- package/packages/sap.fe.core/src/sap/fe/core/formatters/CollaborationFormatter.js +5 -0
- package/packages/sap.fe.core/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
- package/packages/sap.fe.core/src/sap/fe/core/formatters/TableFormatter-dbg.js +53 -2
- package/packages/sap.fe.core/src/sap/fe/core/formatters/TableFormatter.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/formatters/TableFormatter.ts +51 -0
- package/packages/sap.fe.core/src/sap/fe/core/fpm/Component-dbg.js +50 -54
- package/packages/sap.fe.core/src/sap/fe/core/fpm/Component.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/fpm/Component.ts +48 -0
- package/packages/sap.fe.core/src/sap/fe/core/fpm/manifest.json +2 -2
- package/packages/sap.fe.core/src/sap/fe/core/fpm/resources.json +7 -3
- package/packages/sap.fe.core/src/sap/fe/core/helpers/AppStartupHelper-dbg.js +323 -309
- package/packages/sap.fe.core/src/sap/fe/core/helpers/AppStartupHelper.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/helpers/AppStartupHelper.ts +363 -337
- package/packages/sap.fe.core/src/sap/fe/core/helpers/BindingExpression-dbg.js +7 -7
- package/packages/sap.fe.core/src/sap/fe/core/helpers/BindingExpression.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/helpers/BindingExpression.ts +7 -7
- package/packages/sap.fe.core/src/sap/fe/core/helpers/ClassSupport-dbg.js +186 -62
- package/packages/sap.fe.core/src/sap/fe/core/helpers/ClassSupport.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/helpers/ClassSupport.ts +168 -52
- package/packages/sap.fe.core/src/sap/fe/core/helpers/DynamicAnnotationPathHelper-dbg.js +5 -4
- package/packages/sap.fe.core/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -5
- package/packages/sap.fe.core/src/sap/fe/core/helpers/FPMHelper-dbg.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/helpers/MassEditHelper-dbg.js +601 -684
- package/packages/sap.fe.core/src/sap/fe/core/helpers/MassEditHelper.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
- package/packages/sap.fe.core/src/sap/fe/core/helpers/ModelHelper-dbg.js +25 -1
- package/packages/sap.fe.core/src/sap/fe/core/helpers/ModelHelper.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/helpers/ModelHelper.ts +23 -0
- package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticDateOperators-dbg.js +5 -1
- package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/helpers/SemanticDateOperators.ts +4 -0
- package/packages/sap.fe.core/src/sap/fe/core/library-dbg.js +426 -451
- package/packages/sap.fe.core/src/sap/fe/core/library-h2-preload.js +36 -32
- package/packages/sap.fe.core/src/sap/fe/core/library-h2-preload.js.map +3 -3
- package/packages/sap.fe.core/src/sap/fe/core/library-preload.js +644 -738
- package/packages/sap.fe.core/src/sap/fe/core/library-preload.js.map +4 -4
- package/packages/sap.fe.core/src/sap/fe/core/library-preload.support.js +24 -35
- package/packages/sap.fe.core/src/sap/fe/core/library-preload.support.js.map +2 -2
- package/packages/sap.fe.core/src/sap/fe/core/library.js +2 -3
- package/packages/sap.fe.core/src/sap/fe/core/library.support.js +22 -33
- package/packages/sap.fe.core/src/sap/fe/core/library.support.ts +23 -0
- package/packages/sap.fe.core/src/sap/fe/core/library.ts +420 -0
- package/packages/sap.fe.core/src/sap/fe/core/manifest.json +10 -10
- package/packages/sap.fe.core/src/sap/fe/core/manifestMerger/ChangePageConfiguration-dbg.js +5 -3
- package/packages/sap.fe.core/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +4 -1
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle.properties +22 -5
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ar.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_bg.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ca.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_cs.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_cy.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_da.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_de.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_el.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en_GB.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en_US_sappsd.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en_US_saprigi.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_en_US_saptrc.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_es.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_es_MX.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_et.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_fi.properties +28 -8
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_fr.properties +28 -8
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_fr_CA.properties +29 -9
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_hi.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_hr.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_hu.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_id.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_it.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_iw.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ja.properties +26 -6
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_kk.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ko.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_lt.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_lv.properties +28 -8
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ms.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_nl.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_no.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_pl.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_pt.properties +28 -8
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_pt_PT.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ro.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_ru.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_sh.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_sk.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_sl.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_sv.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_th.properties +26 -6
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_tr.properties +30 -10
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_uk.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_vi.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_zh_CN.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/messagebundle_zh_TW.properties +27 -7
- package/packages/sap.fe.core/src/sap/fe/core/resources.json +745 -384
- package/packages/sap.fe.core/src/sap/fe/core/services/AsyncComponentServiceFactory-dbg.js +45 -71
- package/packages/sap.fe.core/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/services/CacheHandlerServiceFactory-dbg.js +154 -192
- package/packages/sap.fe.core/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +4 -4
- package/packages/sap.fe.core/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +66 -92
- package/packages/sap.fe.core/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/services/EnvironmentServiceFactory.ts +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +284 -339
- package/packages/sap.fe.core/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/services/NavigationServiceFactory.ts +10 -13
- package/packages/sap.fe.core/src/sap/fe/core/services/ResourceModelServiceFactory-dbg.js +67 -102
- package/packages/sap.fe.core/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/services/ResourceModelServiceFactory.ts +5 -2
- package/packages/sap.fe.core/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +754 -814
- package/packages/sap.fe.core/src/sap/fe/core/services/RoutingServiceFactory.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/services/RoutingServiceFactory.ts +13 -13
- package/packages/sap.fe.core/src/sap/fe/core/services/ShellServicesFactory-dbg.js +649 -736
- package/packages/sap.fe.core/src/sap/fe/core/services/ShellServicesFactory.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/services/ShellServicesFactory.ts +7 -4
- package/packages/sap.fe.core/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +567 -592
- package/packages/sap.fe.core/src/sap/fe/core/services/SideEffectsServiceFactory.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/services/SideEffectsServiceFactory.ts +22 -3
- package/packages/sap.fe.core/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +354 -386
- package/packages/sap.fe.core/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +21 -14
- package/packages/sap.fe.core/src/sap/fe/core/services/view/TemplatingErrorPage-dbg.controller.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/support/CommonHelper-dbg.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/support/CommonHelper.ts +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/support/Diagnostics-dbg.js +36 -48
- package/packages/sap.fe.core/src/sap/fe/core/support/Diagnostics.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/templating/DataModelPathHelper-dbg.js +93 -85
- package/packages/sap.fe.core/src/sap/fe/core/templating/DataModelPathHelper.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/templating/DataModelPathHelper.ts +104 -95
- package/packages/sap.fe.core/src/sap/fe/core/templating/FilterHelper-dbg.js +25 -32
- package/packages/sap.fe.core/src/sap/fe/core/templating/FilterHelper.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/templating/FilterHelper.ts +36 -35
- package/packages/sap.fe.core/src/sap/fe/core/templating/PropertyHelper-dbg.js +2 -2
- package/packages/sap.fe.core/src/sap/fe/core/templating/PropertyHelper.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/templating/UIFormatters-dbg.js +32 -26
- package/packages/sap.fe.core/src/sap/fe/core/templating/UIFormatters.js +1 -1
- package/packages/sap.fe.core/src/sap/fe/core/templating/UIFormatters.ts +37 -24
- package/packages/sap.fe.core/test/sap/fe/core/designtime/api.json +1664 -1
- package/packages/sap.fe.core/test/sap/fe/core/designtime/apiref/api.json +1 -1
- package/packages/sap.fe.core/test/sap/fe/core/designtime/codeassistance/Library.jsmeta.json +1 -1
- package/packages/sap.fe.core/test/sap/fe/core/designtime/codeassistance/Library.jstemplates.json +1 -1
- package/packages/sap.fe.core/test/sap/fe/core/designtime/codeassistance/Library.xmlmeta.json +1 -1
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/model/MacroNavigationModel.js +59 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldDisplay/localService/RootEntity.json +1 -1
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldMessages/Component.js +33 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldMessages/FieldMessages.controller.js +34 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldMessages/FieldMessages.view.xml +18 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldMessages/localService/Entities.json +6 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldMessages/localService/service.cds +6 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/field/fieldMessages/manifest.json +68 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/fieldMessages.html +37 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/filterBar/filterBarSVandAnnotationDefaults/FilterBarSVandAnnotationDefaults.controller.js +1 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableCustoms/Page.controller.js +7 -2
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableCustoms/Page.view.xml +9 -3
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableCustoms/localService/RootEntity.js +23 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableCustoms/localService/RootEntity.ts +11 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableCustoms/localService/service.cds +11 -23
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableMessages/Component.js +40 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableMessages/TableMessages.controller.js +35 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableMessages/TableMessages.view.xml +21 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableMessages/localService/RootEntity.json +82 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableMessages/localService/service.cds +82 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/table/tableMessages/manifest.json +78 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/buildingBlocks/tableMessages.html +37 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/controllerExtensions/basicExtensibility/localService/ChildEntity.json +5 -4
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/topics/customElements/customColumn/customColumnContent/manifest.json +3 -0
- package/packages/sap.fe.core/test/sap/fe/core/fpmExplorer/view/App.view.xml +1 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/AnnotationHelper.spec.js +1 -169
- package/packages/sap.fe.core/test/sap/fe/core/jest/AnnotationHelper.spec.ts +0 -212
- package/packages/sap.fe.core/test/sap/fe/core/jest/CommonUtils.spec.js +2305 -119
- package/packages/sap.fe.core/test/sap/fe/core/jest/CommonUtils.spec.ts +2206 -67
- package/packages/sap.fe.core/test/sap/fe/core/jest/FilterUtils.spec.js +40 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/FilterUtils.spec.ts +34 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/FlexibleColumnLayout.spec.js +114 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/FlexibleColumnLayout.spec.ts +114 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/Paginators.spec.js +113 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/Paginators.spec.ts +78 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/RouterProxy.spec.js +599 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/RouterProxy.spec.ts +614 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/TemplateConverter.spec.js +23 -5
- package/packages/sap.fe.core/test/sap/fe/core/jest/TemplateConverter.spec.ts +26 -14
- package/packages/sap.fe.core/test/sap/fe/core/jest/TransactionHelper.spec.js +87 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/TransactionHelper.spec.ts +82 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/VisualFilterUtils.spec.js +124 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/VisualFilterUtils.spec.ts +141 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/__snapshots__/TemplateConverter.spec.ts.snap +34768 -67
- package/packages/sap.fe.core/test/sap/fe/core/jest/actions/collaboration/ActivitySync.spec.js +170 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/actions/collaboration/ActivitySync.spec.ts +155 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/actions/collaboration/CollaborationCommon.spec.js +101 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/actions/collaboration/CollaborationCommon.spec.ts +94 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/actions/collaboration/Manage.spec.js +82 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/actions/collaboration/Manage.spec.ts +77 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/actions/draft.spec.js +2 -2
- package/packages/sap.fe.core/test/sap/fe/core/jest/actions/draft.spec.ts +1 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/actions/messageHandling.spec.js +7 -2
- package/packages/sap.fe.core/test/sap/fe/core/jest/actions/messageHandling.spec.ts +7 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/actions/operations.spec.js +104 -2
- package/packages/sap.fe.core/test/sap/fe/core/jest/actions/operations.spec.ts +96 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/actions/sticky.spec.js +83 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/actions/sticky.spec.ts +79 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/appcomponent.spec.js +72 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/appcomponent.spec.ts +64 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/EditFlow.spec.js +619 -3
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/EditFlow.spec.ts +668 -5
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalEditFlow.spec.js +297 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalEditFlow.spec.ts +276 -6
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalIntentBasedNavigation.spec.js +149 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalIntentBasedNavigation.spec.ts +142 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalRouting.spec.js +776 -182
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/InternalRouting.spec.ts +181 -3
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/KPIManagement.spec.js +19 -43
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MassEdit.spec.js +2 -18
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MassEdit.spec.ts +8 -6
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MessageHandler.spec.js +5 -27
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/MessageHandler.spec.ts +1 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/Routing.spec.js +1 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/Routing.spec.ts +1 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/Share.spec.js +86 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/Share.spec.ts +80 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/SideEffects.spec.js +1 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/SideEffects.spec.ts +1 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/ViewState.spec.js +2 -18
- package/packages/sap.fe.core/test/sap/fe/core/jest/controllerextensions/ViewState.spec.ts +1 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/controls/DataLossOrDraftDiscardHandler.spec.js +45 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/controls/DataLossOrDraftDiscardHandler.spec.ts +29 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/controls/FilterBar.spec.js +51 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/controls/FilterBar.spec.ts +47 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/controls/__snapshots__/FilterBar.spec.ts.snap +3 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ConverterContext.spec.js +2 -2
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ConverterContext.spec.ts +1 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/Filter.spec.js +25 -36
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/Filter.spec.ts +26 -36
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ListReportConverter.spec.js +3 -3
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/ListReportConverter.spec.ts +2 -2
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/MetaModelConverter.spec.js +1 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/MetaModelConverter.spec.ts +6 -5
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/Table.spec.js +133 -9
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/Table.spec.ts +171 -8
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/TableStandardActions.spec.js +174 -210
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/TableStandardActions.spec.ts +294 -230
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/__snapshots__/Filter.spec.ts.snap +3 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/Chart.spec.js +237 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/Chart.spec.ts +246 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/DataVisualization.spec.js +9993 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/DataVisualization.spec.ts +11352 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/Table.spec.js +460 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/Table.spec.ts +543 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/TableAnalytics.spec.js +616 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/TableAnalytics.spec.ts +711 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/controls/manifest.json +887 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/objectPage/HeaderAndFooterAction.spec.js +393 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/converters/objectPage/HeaderAndFooterAction.spec.ts +434 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/data/DataConverter.js +31 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/data/DataConverter.ts +12 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/data/Filter.cds +27 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/data/MassEditHelper.cds +12 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/data/OKRA/manifest.json +150 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/data/OKRA/metadata.xml +365 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/data/OKRA/metadata_groupable_options.xml +96 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/data/OKRA/metadata_textArrangement.xml +102 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/data/OKRA/metadata_withPV.xml +359 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/data/Table.cds +89 -27
- package/packages/sap.fe.core/test/sap/fe/core/jest/data/TemplatingTestData.js +421 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/data/TemplatingTestData.ts +413 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/data/aggregatedSD/metadata.xml +3767 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/data/dsr/manifest.json +185 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/data/dsr/metadata.xml +1534 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/data/manifest.json +887 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/data/salesOrderMetadata_qunit.xml +4995 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/formatters/CollaborationFormatters.spec.js +48 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/formatters/CollaborationFormatters.spec.ts +48 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/formatters/TableFormatters.spec.js +131 -51
- package/packages/sap.fe.core/test/sap/fe/core/jest/formatters/TableFormatters.spec.ts +81 -31
- package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/AppStartupHelper.spec.js +13 -7
- package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/AppStartupHelper.spec.ts +12 -6
- package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/MassEditHelper.spec.js +17 -3
- package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/MassEditHelper.spec.ts +24 -7
- package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/ModelHelper.spec.js +61 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/ModelHelper.spec.ts +59 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/PasteHelper.spec.js +3 -3
- package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/PasteHelper.spec.ts +1 -2
- package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/SemanticDateOperators.spec.js +4 -4
- package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/SemanticDateOperators.spec.ts +6 -3
- package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/StableIdHelper.spec.js +1 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/StableIdHelper.spec.ts +1 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/__snapshots__/AppStartupHelper.spec.ts.snap +19 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/helpers/__snapshots__/MassEditHelper.spec.ts.snap +0 -73
- package/packages/sap.fe.core/test/sap/fe/core/jest/manifestmerger/ChangePageConfiguration.spec.js +11 -1
- package/packages/sap.fe.core/test/sap/fe/core/jest/manifestmerger/ChangePageConfiguration.spec.ts +15 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/manifestmerger/__snapshots__/ChangePageConfiguration.spec.ts.snap +30 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/services/SideEffectsService.spec.js +49 -5
- package/packages/sap.fe.core/test/sap/fe/core/jest/services/SideEffectsService.spec.ts +60 -5
- package/packages/sap.fe.core/test/sap/fe/core/jest/templating/DataModelPathHelper.spec.js +384 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/templating/DataModelPathHelper.spec.ts +427 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/templating/PropertyHelper.spec.js +132 -2
- package/packages/sap.fe.core/test/sap/fe/core/jest/templating/PropertyHelper.spec.ts +156 -2
- package/packages/sap.fe.core/test/sap/fe/core/jest/templating/UIFormatters.spec.js +273 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/templating/UIFormatters.spec.ts +402 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/templating/ValueHelpTemplating.spec.js +45 -0
- package/packages/sap.fe.core/test/sap/fe/core/jest/templating/ValueHelpTemplating.spec.ts +40 -0
- package/packages/sap.fe.core/test/sap/fe/core/qunit/TemplatingExpressions.qunit.js +2 -1
- package/packages/sap.fe.core/test/sap/fe/core/qunit/apps/generalTests.json +0 -102
- package/packages/sap.fe.core/test/sap/fe/core/relnotes/changes-1.100.json +326 -0
- package/packages/sap.fe.core/test/sap/fe/core/relnotes/changes-1.99.json +0 -22
- package/packages/sap.fe.macros/src/sap/fe/macros/.library +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/.theming +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/Chart.metadata-dbg.js +2 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/Chart.metadata.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/ChartAPI-dbg.js +22 -43
- package/packages/sap.fe.macros/src/sap/fe/macros/ChartAPI.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/ChartAPI.ts +3 -3
- package/packages/sap.fe.macros/src/sap/fe/macros/ChartDelegate-dbg.js +14 -24
- package/packages/sap.fe.macros/src/sap/fe/macros/ChartDelegate.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/CommonHelper-dbg.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/DraftIndicator.fragment.xml +3 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/Field.fragment.xml +16 -18
- package/packages/sap.fe.macros/src/sap/fe/macros/FieldAPI-dbg.js +162 -100
- package/packages/sap.fe.macros/src/sap/fe/macros/FieldAPI.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/FieldAPI.ts +93 -16
- package/packages/sap.fe.macros/src/sap/fe/macros/FilterBar.fragment.xml +2 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/FilterBar.metadata-dbg.js +16 -8
- package/packages/sap.fe.macros/src/sap/fe/macros/FilterBar.metadata.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarAPI-dbg.js +58 -83
- package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarAPI.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarAPI.ts +16 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarDelegate-dbg.js +112 -192
- package/packages/sap.fe.macros/src/sap/fe/macros/FilterBarDelegate.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/Form.metadata-dbg.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/Form.metadata.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/FormAPI-dbg.js +4 -20
- package/packages/sap.fe.macros/src/sap/fe/macros/FormAPI.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/FormContainer.fragment.xml +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/FormContainerAPI-dbg.js +10 -31
- package/packages/sap.fe.macros/src/sap/fe/macros/FormContainerAPI.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/MacroAPI-dbg.js +147 -162
- package/packages/sap.fe.macros/src/sap/fe/macros/MacroAPI.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/MacroAPI.ts +32 -8
- package/packages/sap.fe.macros/src/sap/fe/macros/MacroMetadata-dbg.js +5 -0
- package/packages/sap.fe.macros/src/sap/fe/macros/MacroMetadata.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/PhantomUtil-dbg.js +56 -74
- package/packages/sap.fe.macros/src/sap/fe/macros/PhantomUtil.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/Table.fragment.xml +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/Table.metadata-dbg.js +90 -39
- package/packages/sap.fe.macros/src/sap/fe/macros/Table.metadata.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/TableAPI-dbg.js +284 -251
- package/packages/sap.fe.macros/src/sap/fe/macros/TableAPI.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/TableAPI.ts +126 -14
- package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldHelper-dbg.js +38 -101
- package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldHelper.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldRuntime-dbg.js +68 -6
- package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldRuntime.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldTemplating-dbg.js +72 -12
- package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldTemplating.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/field/FieldTemplating.ts +67 -10
- package/packages/sap.fe.macros/src/sap/fe/macros/field/QuickViewLinkDelegate-dbg.js +5 -12
- package/packages/sap.fe.macros/src/sap/fe/macros/field/QuickViewLinkDelegate.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/filter/DraftEditState.fragment.xml +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/filter/FilterFieldHelper-dbg.js +1 -3
- package/packages/sap.fe.macros/src/sap/fe/macros/filter/FilterFieldHelper.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/filter/FilterUtils-dbg.js +62 -39
- package/packages/sap.fe.macros/src/sap/fe/macros/filter/FilterUtils.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/MultiValue-dbg.js +104 -50
- package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/MultiValue.js +2 -3
- package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/MultiValue.ts +68 -0
- package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/Range-dbg.js +83 -35
- package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/Range.js +2 -3
- package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/Range.ts +66 -0
- package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/Value-dbg.js +327 -216
- package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/Value.js +2 -3
- package/packages/sap.fe.macros/src/sap/fe/macros/filter/type/Value.ts +303 -0
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/CollaborationAvatar.fragment.xml +15 -0
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/CollectionField.metadata-dbg.js +14 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/CollectionField.metadata.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/CollectionField.metadata.ts +18 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/DataPoint.fragment.xml +12 -29
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/DataPoint.metadata-dbg.js +9 -0
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/DataPoint.metadata.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/Field.fragment.xml +1 -0
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/Field.metadata-dbg.js +529 -533
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/Field.metadata.js +2 -3
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/Field.metadata.ts +568 -0
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/FilterField.fragment.xml +0 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/SituationsIndicator-dbg.js +3 -3
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/SituationsIndicator.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/SituationsIndicator.ts +3 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/FieldContent.fragment.xml +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/FieldStructure.fragment.xml +13 -3
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/DataPoint.fragment.xml +4 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/ExpandableText.fragment.xml +1 -0
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/LabelSemanticKey.fragment.xml +1 -0
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/Link.fragment.xml +38 -4
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/LinkWithQuickViewForm.fragment.xml +2 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/LinkWrapper.fragment.xml +3 -3
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/MdcFieldWithValueHelp.fragment.xml +1 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/ObjectIdentifier.fragment.xml +55 -11
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/SemanticKeyWithDraftIndicator.fragment.xml +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/displayStyle/Text.fragment.xml +3 -3
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/DatePicker.fragment.xml +9 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/DateTimePicker.fragment.xml +9 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/Input.fragment.xml +12 -3
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/InputWithUnit.fragment.xml +26 -5
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/InputWithValueHelp.fragment.xml +10 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/RatingIndicator.fragment.xml +9 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/editStyle/TimePicker.fragment.xml +9 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/field/fragments/ObjectIdentifierContent.fragment.xml +4 -0
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/helpers/DataPointTemplating-dbg.js +31 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/helpers/DataPointTemplating.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/helpers/DataPointTemplating.ts +20 -0
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Runtime-dbg.js +2 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Runtime.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/situations/Runtime.ts +7 -9
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueListHelper-dbg.js +90 -118
- package/packages/sap.fe.macros/src/sap/fe/macros/internal/valuehelp/ValueListHelper.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/library-dbg.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/library-h2-preload.js +13 -12
- package/packages/sap.fe.macros/src/sap/fe/macros/library-h2-preload.js.map +2 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/library-preload.js +185 -214
- package/packages/sap.fe.macros/src/sap/fe/macros/library-preload.js.map +4 -4
- package/packages/sap.fe.macros/src/sap/fe/macros/library.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/manifest.json +9 -9
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle.properties +4 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ar.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_bg.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ca.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_cs.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_cy.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_da.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_de.properties +4 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_el.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en_GB.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en_US_sappsd.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en_US_saprigi.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_en_US_saptrc.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_es.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_es_MX.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_et.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_fi.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_fr.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_fr_CA.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_hi.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_hr.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_hu.properties +4 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_id.properties +4 -2
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_it.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_iw.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ja.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_kk.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ko.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_lt.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_lv.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ms.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_nl.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_no.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_pl.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_pt.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_pt_PT.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ro.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_ru.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_sh.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_sk.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_sl.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_sv.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_th.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_tr.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_uk.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_vi.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_zh_CN.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/messagebundle_zh_TW.properties +3 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/resources.json +273 -199
- package/packages/sap.fe.macros/src/sap/fe/macros/table/Actions.fragment.xml +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/table/Column.fragment.xml +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/table/ColumnContent.fragment.xml +2 -0
- package/packages/sap.fe.macros/src/sap/fe/macros/table/CreationRow.fragment.xml +13 -20
- package/packages/sap.fe.macros/src/sap/fe/macros/table/CustomColumn.fragment.xml +1 -0
- package/packages/sap.fe.macros/src/sap/fe/macros/table/TableHelper-dbg.js +5 -110
- package/packages/sap.fe.macros/src/sap/fe/macros/table/TableHelper.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/table/delegates/TableDelegate-dbg.js +98 -78
- package/packages/sap.fe.macros/src/sap/fe/macros/table/delegates/TableDelegate.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/valuehelp/ValueHelpFilterBar.metadata-dbg.js +1 -1
- package/packages/sap.fe.macros/src/sap/fe/macros/valuehelp/ValueHelpFilterBar.metadata.js +1 -1
- package/packages/sap.fe.macros/test/sap/fe/macros/designtime/api.json +211 -10
- package/packages/sap.fe.macros/test/sap/fe/macros/designtime/apiref/api.json +1 -1
- package/packages/sap.fe.macros/test/sap/fe/macros/designtime/codeassistance/Library.jsmeta.json +1 -1
- package/packages/sap.fe.macros/test/sap/fe/macros/designtime/codeassistance/Library.xmlmeta.json +1 -1
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/ChartDelegate.spec.js +1 -45
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/ChartDelegate.spec.ts +0 -60
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/FieldAPI.spec.js +78 -0
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/FieldAPI.spec.ts +71 -0
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/FieldMacroDataFieldTypes.spec.js +35 -1
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/FieldMacroDataFieldTypes.spec.ts +44 -0
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterBarDelegate.spec.js +0 -76
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterBarMacro.spec.js +27 -1
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterBarMacro.spec.ts +28 -0
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterFieldHelper.spec.js +10 -12
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterFieldHelper.spec.ts +10 -10
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/FilterUtils.spec.js +129 -15
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/MacroAPI.spec.js +13 -39
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/MacroAPI.spec.ts +2 -2
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/RetrieveTextFromValueList.spec.js +119 -0
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/RetrieveTextFromValueList.spec.ts +113 -0
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/Table.spec.js +166 -2
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/Table.spec.ts +190 -3
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableAPI.spec.js +457 -389
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableAPI.spec.ts +504 -425
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableMacro.spec.js +104 -2
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/TableMacro.spec.ts +158 -1
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/ChartDelegate.spec.ts.snap +0 -6
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/DatapointMacro.spec.ts.snap +5 -5
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FieldMacroDataFieldTypes.spec.ts.snap +114 -25
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FieldMacroWithSemanticKey.spec.ts.snap +40 -40
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FieldMacroWithValueHelp.spec.ts.snap +4 -8
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FilterBarMacro.spec.ts.snap +19 -19
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/FilterField.spec.ts.snap +3 -5
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/QuickViewForm.spec.ts.snap +12 -0
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/SimpleFieldMacro.spec.ts.snap +89 -90
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/Table.spec.ts.snap +1314 -58
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/__snapshots__/TableMacro.spec.ts.snap +459 -0
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/FieldMacroDataFieldTypes.cds +18 -2
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/QuickViewForm.cds +6 -1
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/Table.cds +107 -106
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/data/TableAPI.cds +197 -0
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/field/FieldRuntime.spec.js +33 -4
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/field/FieldRuntime.spec.ts +30 -4
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/field/FieldTemplating.spec.js +72 -29
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/field/FieldTemplating.spec.ts +86 -18
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/__snapshots__/columnWidth.spec.ts.snap +51 -27
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/columnWidth.spec.js +55 -9
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/columnWidth.spec.ts +46 -6
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/data/columnWidth.cds +28 -1
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/delegates/TableDelegate.spec.js +170 -43
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/delegates/TableDelegate.spec.ts +131 -15
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/table/delegates/__snapshots__/TableDelegate.spec.ts.snap +90 -53
- package/packages/sap.fe.macros/test/sap/fe/macros/jest/tsx/TestTSX.spec.tsx +2 -1
- package/packages/sap.fe.macros/test/sap/fe/macros/qunit/index.json +0 -5
- package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/FieldHelper.qunit.js +1 -99
- package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/FormElementTemplating.qunit.js +1 -1
- package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/MacroMetadata.qunit.js +4 -4
- package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/TableHelper.qunit.js +4 -4
- package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/ValueHelpTemplating.qunit.js +15 -0
- package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/ValueListHelper.qunit.js +265 -106
- package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/metadata/simpleMetadata.js +38 -0
- package/packages/sap.fe.macros/test/sap/fe/macros/relnotes/changes-1.100.json +372 -0
- package/packages/sap.fe.macros/test/sap/fe/macros/relnotes/changes-1.99.json +0 -11
- package/packages/sap.fe.navigation/src/sap/fe/navigation/.library +1 -1
- package/packages/sap.fe.navigation/src/sap/fe/navigation/.theming +1 -1
- package/packages/sap.fe.navigation/src/sap/fe/navigation/library-dbg.js +1 -1
- package/packages/sap.fe.navigation/src/sap/fe/navigation/library-h2-preload.js +2 -2
- package/packages/sap.fe.navigation/src/sap/fe/navigation/library-h2-preload.js.map +2 -2
- package/packages/sap.fe.navigation/src/sap/fe/navigation/library-preload.js +2 -2
- package/packages/sap.fe.navigation/src/sap/fe/navigation/library-preload.js.map +2 -2
- package/packages/sap.fe.navigation/src/sap/fe/navigation/library.js +1 -1
- package/packages/sap.fe.navigation/src/sap/fe/navigation/manifest.json +3 -3
- package/packages/sap.fe.navigation/src/sap/fe/navigation/resources.json +8 -8
- package/packages/sap.fe.navigation/test/sap/fe/navigation/designtime/api.json +1 -1
- package/packages/sap.fe.navigation/test/sap/fe/navigation/designtime/apiref/api.json +1 -1
- package/packages/sap.fe.navigation/test/sap/fe/navigation/designtime/codeassistance/Library.xmlmeta.json +1 -1
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/.library +1 -1
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/.theming +1 -1
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library-dbg.js +1 -1
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library-h2-preload.js +2 -2
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library-h2-preload.js.map +2 -2
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library-preload.js +2 -2
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library-preload.js.map +2 -2
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/library.js +1 -1
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/manifest.json +3 -3
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/resources.json +27 -27
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/base/css_variables.source.less +316 -15
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/base/resources.json +1 -1
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize/css_variables.less +315 -14
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize/css_variables.source.less +315 -14
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize/resources.json +2 -2
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_hcb/css_variables.less +316 -15
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_hcb/css_variables.source.less +316 -15
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_hcb/resources.json +2 -2
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_hcw/css_variables.less +316 -15
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_hcw/css_variables.source.less +316 -15
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_hcw/resources.json +2 -2
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_plus/css_variables.less +315 -14
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_plus/css_variables.source.less +315 -14
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_belize_plus/resources.json +2 -2
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3/css_variables.less +317 -16
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3/css_variables.source.less +317 -16
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3/resources.json +2 -2
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_dark/css_variables.less +317 -16
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_dark/css_variables.source.less +317 -16
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_dark/resources.json +2 -2
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_hcb/css_variables.less +316 -15
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_hcb/css_variables.source.less +316 -15
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_hcb/resources.json +2 -2
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_hcw/css_variables.less +316 -15
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_hcw/css_variables.source.less +316 -15
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_fiori_3_hcw/resources.json +2 -2
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_horizon/css_variables.less +400 -99
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_horizon/css_variables.source.less +400 -99
- package/packages/sap.fe.placeholder/src/sap/fe/placeholder/themes/sap_horizon/resources.json +2 -2
- package/packages/sap.fe.placeholder/test/sap/fe/placeholder/designtime/api.json +1 -1
- package/packages/sap.fe.placeholder/test/sap/fe/placeholder/designtime/apiref/api.json +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/.library +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/.theming +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/AnalyticalListPage/manifest.json +2 -2
- package/packages/sap.fe.templates/src/sap/fe/templates/AnalyticalListPage/resources.json +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/ListComponent-dbg.js +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/ListComponent.js +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/Component-dbg.js +7 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/Component.js +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/ListReport.view.xml +22 -21
- package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/ListReportController-dbg.controller.js +13 -18
- package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/ListReportController.controller.js +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/manifest.json +2 -2
- package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/resources.json +7 -7
- package/packages/sap.fe.templates/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.xml +3 -3
- package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/AnnotationHelper-dbg.js +50 -9
- package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/AnnotationHelper.js +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/Component-dbg.js +1 -12
- package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/Component.js +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +5 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/ObjectPageController-dbg.controller.js +50 -17
- package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/controls/StashableHBox-dbg.js +7 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/designtime/FlexBox-dbg.designtime.js +3 -0
- package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/manifest.json +2 -2
- package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/resources.json +19 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/CollaborationDraft.fragment.xml +36 -0
- package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacet.fragment.xml +1 -0
- package/packages/sap.fe.templates/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacetCustomContainer.fragment.xml +1 -0
- package/packages/sap.fe.templates/src/sap/fe/templates/RootContainer/controller/Fcl-dbg.controller.js +3 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/RootContainer/controller/NavContainer-dbg.controller.js +3 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/designtime/library-preload.designtime.js +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/designtime/library-preload.designtime.js.map +2 -2
- package/packages/sap.fe.templates/src/sap/fe/templates/library-dbg.js +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/library-h2-preload.js +4 -3
- package/packages/sap.fe.templates/src/sap/fe/templates/library-h2-preload.js.map +2 -2
- package/packages/sap.fe.templates/src/sap/fe/templates/library-preload.js +22 -21
- package/packages/sap.fe.templates/src/sap/fe/templates/library-preload.js.map +4 -4
- package/packages/sap.fe.templates/src/sap/fe/templates/library.js +1 -1
- package/packages/sap.fe.templates/src/sap/fe/templates/manifest.json +14 -14
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ar.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_bg.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ca.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_cs.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_cy.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_da.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_de.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_el.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en_GB.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_es.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_es_MX.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_et.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_fi.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_fr.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_fr_CA.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_hi.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_hr.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_hu.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_id.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_it.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_iw.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ja.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_kk.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ko.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_lt.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_lv.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ms.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_nl.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_no.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_pl.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_pt.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_pt_PT.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ro.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_ru.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_sh.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_sk.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_sl.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_sv.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_th.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_tr.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_uk.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_vi.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_zh_CN.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/messagebundle_zh_TW.properties +0 -15
- package/packages/sap.fe.templates/src/sap/fe/templates/resources.json +115 -89
- package/packages/sap.fe.templates/test/sap/fe/templates/demokit/apps/itelo/webapp/manifest.json +1 -1
- package/packages/sap.fe.templates/test/sap/fe/templates/designtime/api.json +353 -1
- package/packages/sap.fe.templates/test/sap/fe/templates/designtime/apiref/api.json +1 -1
- package/packages/sap.fe.templates/test/sap/fe/templates/designtime/codeassistance/Library.jsmeta.json +1 -1
- package/packages/sap.fe.templates/test/sap/fe/templates/designtime/codeassistance/Library.xmlmeta.json +1 -1
- package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/IntentBasedNavigation.spec.js +1 -1
- package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/IntentBasedNavigation.spec.ts +3 -3
- package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/Share.spec.js +1 -1
- package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/Share.spec.ts +4 -4
- package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/ViewState.spec.js +1 -1
- package/packages/sap.fe.templates/test/sap/fe/templates/jest/ListReport/overrides/ViewState.spec.ts +2 -2
- package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/view/fragments/ObjectPageHeaderForm.spec.js +2 -1
- package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/view/fragments/ObjectPageHeaderForm.spec.ts +2 -1
- package/packages/sap.fe.templates/test/sap/fe/templates/jest/ObjectPage/view/fragments/__snapshots__/HeaderFacet.spec.ts.snap +7 -7
- package/packages/sap.fe.templates/test/sap/fe/templates/jest/RootContainer/RootContainerBaseController.spec.js +30 -61
- package/packages/sap.fe.templates/test/sap/fe/templates/jest/RootContainer/RootContainerBaseController.spec.ts +1 -1
- package/packages/sap.fe.templates/test/sap/fe/templates/relnotes/changes-1.100.json +192 -0
- package/packages/sap.fe.templates/test/sap/fe/templates/relnotes/changes-1.99.json +0 -11
- package/packages/sap.fe.test/src/sap/fe/test/.library +1 -1
- package/packages/sap.fe.test/src/sap/fe/test/.theming +1 -1
- package/packages/sap.fe.test/src/sap/fe/test/FeMocks-dbg.js +1 -1
- package/packages/sap.fe.test/src/sap/fe/test/FeMocks.ts +8 -8
- package/packages/sap.fe.test/src/sap/fe/test/JestTemplatingHelper-dbg.js +6 -4
- package/packages/sap.fe.test/src/sap/fe/test/JestTemplatingHelper.js +1 -1
- package/packages/sap.fe.test/src/sap/fe/test/JestTemplatingHelper.ts +10 -6
- package/packages/sap.fe.test/src/sap/fe/test/UI5MockHelper-dbg.js +126 -203
- package/packages/sap.fe.test/src/sap/fe/test/UI5MockHelper.js +1 -1
- package/packages/sap.fe.test/src/sap/fe/test/UI5MockHelper.ts +17 -2
- package/packages/sap.fe.test/src/sap/fe/test/api/FilterBarAPI-dbg.js +9 -1
- package/packages/sap.fe.test/src/sap/fe/test/api/FilterBarAPI.js +1 -1
- package/packages/sap.fe.test/src/sap/fe/test/library-dbg.js +1 -1
- package/packages/sap.fe.test/src/sap/fe/test/library-h2-preload.js +2 -2
- package/packages/sap.fe.test/src/sap/fe/test/library-h2-preload.js.map +2 -2
- package/packages/sap.fe.test/src/sap/fe/test/library-preload.js +9 -18
- package/packages/sap.fe.test/src/sap/fe/test/library-preload.js.map +3 -3
- package/packages/sap.fe.test/src/sap/fe/test/library.js +1 -1
- package/packages/sap.fe.test/src/sap/fe/test/manifest.json +3 -3
- package/packages/sap.fe.test/src/sap/fe/test/resources.json +18 -18
- package/packages/sap.fe.test/test/sap/fe/test/designtime/api.json +1 -1
- package/packages/sap.fe.test/test/sap/fe/test/designtime/apiref/api.json +1 -1
- package/packages/sap.fe.test/test/sap/fe/test/designtime/codeassistance/Library.xmlmeta.json +1 -1
- package/packages/sap.fe.macros/test/sap/fe/macros/qunit/macros/FormTemplatingTs.qunit.js +0 -271
|
@@ -1,1816 +1,1751 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
5
4
|
*/
|
|
6
|
-
sap.ui.define(
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
this.oObjectPageLayout && this.oObjectPageLayout.getModel() && this.oObjectPageLayout.getModel().getMetaModel(),
|
|
1753
|
-
contextPath = oMetaModel && oMetaModel.getMetaPath(messageObject.target),
|
|
1754
|
-
oContextPathMetadata = oMetaModel && oMetaModel.getObject(contextPath);
|
|
1755
|
-
if (oContextPathMetadata && oContextPathMetadata.$kind == "Property") {
|
|
1756
|
-
return true;
|
|
1757
|
-
}
|
|
1758
|
-
}
|
|
1759
|
-
};
|
|
1760
|
-
MessageButton.prototype._fnEnableBindings = function(aSections) {
|
|
1761
|
-
if (UriParameters.fromQuery(window.location.search).get("sap-fe-xx-lazyloadingtest")) {
|
|
1762
|
-
return;
|
|
1763
|
-
}
|
|
1764
|
-
for (var iSection = 0; iSection < aSections.length; iSection++) {
|
|
1765
|
-
var oSection = aSections[iSection];
|
|
1766
|
-
var nonTableChartcontrolFound = false;
|
|
1767
|
-
var aSubSections = oSection.getSubSections();
|
|
1768
|
-
for (var iSubSection = 0; iSubSection < aSubSections.length; iSubSection++) {
|
|
1769
|
-
var oSubSection = aSubSections[iSubSection];
|
|
1770
|
-
var oAllBlocks = oSubSection.getBlocks();
|
|
1771
|
-
if (oAllBlocks) {
|
|
1772
|
-
for (var block = 0; block < oSubSection.getBlocks().length; block++) {
|
|
1773
|
-
if (oAllBlocks[block].getContent && !oAllBlocks[block].getContent().isA("sap.fe.macros.TableAPI")) {
|
|
1774
|
-
nonTableChartcontrolFound = true;
|
|
1775
|
-
break;
|
|
1776
|
-
}
|
|
1777
|
-
}
|
|
1778
|
-
if (nonTableChartcontrolFound) {
|
|
1779
|
-
oSubSection.setBindingContext(undefined);
|
|
1780
|
-
}
|
|
1781
|
-
}
|
|
1782
|
-
if (oSubSection.getBindingContext() && this._findMessageGroupAfterRebinding()) {
|
|
1783
|
-
oSubSection
|
|
1784
|
-
.getBindingContext()
|
|
1785
|
-
.getBinding()
|
|
1786
|
-
.attachDataReceived(this._findMessageGroupAfterRebinding());
|
|
1787
|
-
}
|
|
1788
|
-
}
|
|
1789
|
-
}
|
|
1790
|
-
};
|
|
1791
|
-
MessageButton.prototype._findMessageGroupAfterRebinding = function() {
|
|
1792
|
-
var aMessages = this.oMessagePopover.getItems();
|
|
1793
|
-
this._checkControlIdInSections(aMessages, true);
|
|
1794
|
-
};
|
|
1795
|
-
/**
|
|
1796
|
-
* The method that retrieves the view ID (HTMLView/XMLView/JSONview/JSView/Templateview) of any control.
|
|
1797
|
-
*
|
|
1798
|
-
* @param {string} sControlId ID of the control needed to retrieve the view ID
|
|
1799
|
-
* @returns {string} The view ID of the control
|
|
1800
|
-
*/
|
|
1801
|
-
MessageButton.prototype._getViewId = function(sControlId) {
|
|
1802
|
-
var sViewId,
|
|
1803
|
-
oControl = sap.ui.getCore().byId(sControlId);
|
|
1804
|
-
while (oControl) {
|
|
1805
|
-
if (oControl instanceof sap.ui.core.mvc.View) {
|
|
1806
|
-
sViewId = oControl.getId();
|
|
1807
|
-
break;
|
|
1808
|
-
}
|
|
1809
|
-
oControl = oControl.getParent();
|
|
1810
|
-
}
|
|
1811
|
-
return sViewId;
|
|
1812
|
-
};
|
|
1813
|
-
return MessageButton;
|
|
1814
|
-
},
|
|
1815
|
-
/* bExport= */ true
|
|
1816
|
-
);
|
|
5
|
+
sap.ui.define(["sap/m/Button", "sap/m/Dialog", "sap/m/library", "sap/fe/common/MessagePopover", "sap/fe/core/CommonUtils", "sap/ui/core/library", "sap/ui/model/Filter", "sap/ui/model/Sorter", "sap/ui/model/FilterOperator", "sap/base/Log", "sap/base/util/UriParameters", "sap/m/FormattedText", "sap/ui/core/mvc/View", "sap/fe/core/helpers/ClassSupport"], function (Button, Dialog, mLib, MessagePopover, CommonUtils, coreLib, Filter, Sorter, FilterOperator, Log, UriParameters, FormattedText, View, ClassSupport) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var _dec, _dec2, _class, _class2, _descriptor, _descriptor2;
|
|
9
|
+
|
|
10
|
+
var Event = ClassSupport.Event;
|
|
11
|
+
var UI5Class = ClassSupport.UI5Class;
|
|
12
|
+
var Aggregation = ClassSupport.Aggregation;
|
|
13
|
+
|
|
14
|
+
function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
|
|
15
|
+
|
|
16
|
+
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
17
|
+
|
|
18
|
+
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
|
|
19
|
+
|
|
20
|
+
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
21
|
+
|
|
22
|
+
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
23
|
+
|
|
24
|
+
function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
|
|
25
|
+
|
|
26
|
+
var ButtonType = mLib.ButtonType;
|
|
27
|
+
var MessageType = coreLib.MessageType;
|
|
28
|
+
var MessageButton = (_dec = UI5Class("sap.fe.common.MessageButton"), _dec2 = Aggregation({
|
|
29
|
+
type: "sap.fe.common.MessageFilter",
|
|
30
|
+
multiple: true,
|
|
31
|
+
singularName: "customFilter"
|
|
32
|
+
}), _dec(_class = (_class2 = /*#__PURE__*/function (_Button) {
|
|
33
|
+
_inherits(MessageButton, _Button);
|
|
34
|
+
|
|
35
|
+
function MessageButton() {
|
|
36
|
+
var _this;
|
|
37
|
+
|
|
38
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
39
|
+
args[_key] = arguments[_key];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
_this = _Button.call.apply(_Button, [this].concat(args)) || this;
|
|
43
|
+
|
|
44
|
+
_initializerDefineProperty(_this, "customFilters", _descriptor, _assertThisInitialized(_this));
|
|
45
|
+
|
|
46
|
+
_initializerDefineProperty(_this, "messageChange", _descriptor2, _assertThisInitialized(_this));
|
|
47
|
+
|
|
48
|
+
_this.sLastActionText = "";
|
|
49
|
+
_this.sGeneralGroupText = "";
|
|
50
|
+
_this.sViewId = "";
|
|
51
|
+
return _this;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
var _proto = MessageButton.prototype;
|
|
55
|
+
|
|
56
|
+
_proto.init = function init() {
|
|
57
|
+
Button.prototype.init.apply(this); //press event handler attached to open the message popover
|
|
58
|
+
|
|
59
|
+
this.attachPress(this.handleMessagePopoverPress, this);
|
|
60
|
+
this.oMessagePopover = new MessagePopover();
|
|
61
|
+
this.oItemBinding = this.oMessagePopover.getBinding("items");
|
|
62
|
+
this.oItemBinding.attachChange(this._setMessageData, this);
|
|
63
|
+
var messageButtonId = this.getId();
|
|
64
|
+
|
|
65
|
+
if (messageButtonId) {
|
|
66
|
+
this.oMessagePopover.addCustomData(new sap.ui.core.CustomData({
|
|
67
|
+
key: "messageButtonId",
|
|
68
|
+
value: messageButtonId
|
|
69
|
+
})); // TODO check for custom data type
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
this.attachModelContextChange(this._applyFiltersAndSort.bind(this));
|
|
73
|
+
this.oMessagePopover.attachActiveTitlePress(this._activeTitlePress.bind(this));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The method that is called when a user clicks on the MessageButton control.
|
|
77
|
+
*
|
|
78
|
+
* @param {object} oEvent Event object
|
|
79
|
+
*/
|
|
80
|
+
;
|
|
81
|
+
|
|
82
|
+
_proto.handleMessagePopoverPress = function handleMessagePopoverPress(oEvent) {
|
|
83
|
+
this.oMessagePopover.toggle(oEvent.getSource());
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The method that groups the messages based on the section or subsection they belong to.
|
|
87
|
+
* This method force the loading of contexts for all tables before to apply the grouping.
|
|
88
|
+
*
|
|
89
|
+
* @param {object} oView Current view.
|
|
90
|
+
* @returns {Promise} Return promise.
|
|
91
|
+
*
|
|
92
|
+
* @private
|
|
93
|
+
*/
|
|
94
|
+
;
|
|
95
|
+
|
|
96
|
+
_proto._applyGroupingAsync = function _applyGroupingAsync(oView) {
|
|
97
|
+
var that = this;
|
|
98
|
+
var aWaitForData = [];
|
|
99
|
+
var oViewBindingContext = oView.getBindingContext();
|
|
100
|
+
|
|
101
|
+
var _findTablesRelatedToMessages = function (oView) {
|
|
102
|
+
var oRes = [];
|
|
103
|
+
var aMessages = that.oItemBinding.getContexts().map(function (oContext) {
|
|
104
|
+
return oContext.getObject();
|
|
105
|
+
});
|
|
106
|
+
var oViewContext = oView.getBindingContext();
|
|
107
|
+
|
|
108
|
+
if (oViewContext) {
|
|
109
|
+
var oObjectPage = oView.getContent()[0];
|
|
110
|
+
that.getVisibleSectionsFromObjectPageLayout(oObjectPage).forEach(function (oSection) {
|
|
111
|
+
oSection.getSubSections().forEach(function (oSubSection) {
|
|
112
|
+
oSubSection.findElements(true).forEach(function (oElem) {
|
|
113
|
+
if (oElem.isA("sap.ui.mdc.Table")) {
|
|
114
|
+
for (var i = 0; i < aMessages.length; i++) {
|
|
115
|
+
var oRowBinding = oElem.getRowBinding();
|
|
116
|
+
|
|
117
|
+
if (oRowBinding) {
|
|
118
|
+
var sElemeBindingPath = oViewContext.getPath() + "/" + oElem.getRowBinding().getPath();
|
|
119
|
+
|
|
120
|
+
if (aMessages[i].target.indexOf(sElemeBindingPath) === 0) {
|
|
121
|
+
oRes.push({
|
|
122
|
+
table: oElem,
|
|
123
|
+
subsection: oSubSection
|
|
124
|
+
});
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return oRes;
|
|
136
|
+
}; // Search for table related to Messages and initialize the binding context of the parent subsection to retrieve the data
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
var oTables = _findTablesRelatedToMessages.bind(this)(oView);
|
|
140
|
+
|
|
141
|
+
oTables.forEach(function (_oTable) {
|
|
142
|
+
var _oMDCTable$getBinding;
|
|
143
|
+
|
|
144
|
+
var oMDCTable = _oTable.table,
|
|
145
|
+
oSubsection = _oTable.subsection;
|
|
146
|
+
|
|
147
|
+
if (!oMDCTable.getBindingContext() || ((_oMDCTable$getBinding = oMDCTable.getBindingContext()) === null || _oMDCTable$getBinding === void 0 ? void 0 : _oMDCTable$getBinding.getPath()) !== (oViewBindingContext === null || oViewBindingContext === void 0 ? void 0 : oViewBindingContext.getPath())) {
|
|
148
|
+
oSubsection.setBindingContext(oViewBindingContext);
|
|
149
|
+
|
|
150
|
+
if (!oMDCTable.getRowBinding().isLengthFinal()) {
|
|
151
|
+
aWaitForData.push(new Promise(function (resolve) {
|
|
152
|
+
oMDCTable.getRowBinding().attachEventOnce("dataReceived", function () {
|
|
153
|
+
resolve();
|
|
154
|
+
});
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
return Promise.all(aWaitForData).then(function () {
|
|
160
|
+
// the checkMessages call will refresh the controlIds for each messages
|
|
161
|
+
oView.getModel().checkMessages();
|
|
162
|
+
return new Promise(function (resolve) {
|
|
163
|
+
setTimeout(function () {
|
|
164
|
+
that._applyGrouping();
|
|
165
|
+
|
|
166
|
+
resolve();
|
|
167
|
+
}, 0);
|
|
168
|
+
});
|
|
169
|
+
}).catch(function () {
|
|
170
|
+
Log.error("Error while grouping the messages in the messagePopOver");
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* The method retrieves the visible sections from an objectpage.
|
|
175
|
+
*
|
|
176
|
+
* @param {object} oObjectPageLayout The objectPageLayout object for which we want to retrieve the visible sections.
|
|
177
|
+
* @returns {Array} Array of visible sections.
|
|
178
|
+
* @private
|
|
179
|
+
*/
|
|
180
|
+
;
|
|
181
|
+
|
|
182
|
+
_proto.getVisibleSectionsFromObjectPageLayout = function getVisibleSectionsFromObjectPageLayout(oObjectPageLayout) {
|
|
183
|
+
return oObjectPageLayout.getSections().filter(function (oSection) {
|
|
184
|
+
return oSection.getVisible();
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* The method that groups the messages based on the section or subsection they belong to.
|
|
189
|
+
*
|
|
190
|
+
* @private
|
|
191
|
+
*/
|
|
192
|
+
;
|
|
193
|
+
|
|
194
|
+
_proto._applyGrouping = function _applyGrouping() {
|
|
195
|
+
this.oObjectPageLayout = this._getObjectPageLayout(this, this.oObjectPageLayout);
|
|
196
|
+
|
|
197
|
+
if (!this.oObjectPageLayout) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
var aMessages = this.oMessagePopover.getItems();
|
|
202
|
+
var aSections = this.getVisibleSectionsFromObjectPageLayout(this.oObjectPageLayout);
|
|
203
|
+
|
|
204
|
+
var bEnableBinding = this._checkControlIdInSections(aMessages, false);
|
|
205
|
+
|
|
206
|
+
if (bEnableBinding) {
|
|
207
|
+
this._fnEnableBindings(aSections);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* The method retrieves the binding context for the refError object.
|
|
212
|
+
* The refError contains a map to store the indexes of the rows with errors.
|
|
213
|
+
*
|
|
214
|
+
* @param {object} oTable The table for which we want to get the refError Object.
|
|
215
|
+
* @returns {object} Context of the refError.
|
|
216
|
+
* @private
|
|
217
|
+
*/
|
|
218
|
+
;
|
|
219
|
+
|
|
220
|
+
_proto._getTableRefErrorContext = function _getTableRefErrorContext(oTable) {
|
|
221
|
+
var oModel = oTable.getModel("internal"); //initialize the refError property if it doesn't exist
|
|
222
|
+
|
|
223
|
+
if (!oTable.getBindingContext("internal").getProperty("refError")) {
|
|
224
|
+
oModel.setProperty("refError", {}, oTable.getBindingContext("internal"));
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
var sRefErrorContextPath = oTable.getBindingContext("internal").getPath() + "/refError/" + oTable.getBindingContext().getPath().replace("/", "$") + "$" + oTable.getRowBinding().getPath().replace("/", "$");
|
|
228
|
+
var oContext = oModel.getContext(sRefErrorContextPath);
|
|
229
|
+
|
|
230
|
+
if (!oContext.getProperty("")) {
|
|
231
|
+
oModel.setProperty("", {}, oContext);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return oContext;
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
_proto._getBackendMessageToRemove = function _getBackendMessageToRemove(oTable, oMessageObject, oErrorContext) {
|
|
238
|
+
//Test if there is already a message for the same context:
|
|
239
|
+
var oBackendMessageToRemove;
|
|
240
|
+
|
|
241
|
+
var oContext = this._getTableRefErrorContext(oTable),
|
|
242
|
+
aMessageIds = Object.keys(oContext.getProperty()).filter(function (key) {
|
|
243
|
+
return Object.keys(oContext.getProperty()[key]).every(function (childKey) {
|
|
244
|
+
return key !== oMessageObject.getId() && oContext.getProperty()[key][childKey] === oErrorContext[childKey];
|
|
245
|
+
});
|
|
246
|
+
}),
|
|
247
|
+
aValidMessageIds = sap.ui.getCore().getMessageManager().getMessageModel().getData().map(function (m) {
|
|
248
|
+
return m.id;
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
if (aMessageIds.length > 0) {
|
|
252
|
+
aValidMessageIds.indexOf(aMessageIds[0]);
|
|
253
|
+
oBackendMessageToRemove = sap.ui.getCore().getMessageManager().getMessageModel().getData()[aValidMessageIds.indexOf(aMessageIds[0])];
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return oBackendMessageToRemove;
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
_proto._updateInternalModel = function _updateInternalModel(oTableRowContext, iRowIndex, sTableTargetColProperty, oTable, oMessageObject, bIsCreationRow) {
|
|
260
|
+
var oTemp;
|
|
261
|
+
|
|
262
|
+
if (bIsCreationRow) {
|
|
263
|
+
oTemp = {
|
|
264
|
+
rowIndex: "CreationRow",
|
|
265
|
+
targetColProperty: sTableTargetColProperty ? sTableTargetColProperty : ""
|
|
266
|
+
};
|
|
267
|
+
} else {
|
|
268
|
+
oTemp = {
|
|
269
|
+
rowIndex: oTableRowContext ? iRowIndex : "",
|
|
270
|
+
targetColProperty: sTableTargetColProperty ? sTableTargetColProperty : ""
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
var oModel = oTable.getModel("internal"),
|
|
275
|
+
oContext = this._getTableRefErrorContext(oTable); //we first remove the entries with obsolete message ids from the internal model before inserting the new error info :
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
var aValidMessageIds = sap.ui.getCore().getMessageManager().getMessageModel().getData().map(function (message) {
|
|
279
|
+
return message.id;
|
|
280
|
+
});
|
|
281
|
+
var aObsoleteMessagelIds;
|
|
282
|
+
|
|
283
|
+
if (oContext.getProperty()) {
|
|
284
|
+
aObsoleteMessagelIds = Object.keys(oContext.getProperty()).filter(function (internalMessageId) {
|
|
285
|
+
return aValidMessageIds.indexOf(internalMessageId) === -1;
|
|
286
|
+
});
|
|
287
|
+
aObsoleteMessagelIds.forEach(function (obsoleteId) {
|
|
288
|
+
delete oContext.getProperty()[obsoleteId];
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
oModel.setProperty(oMessageObject.getId(), Object.assign({}, oContext.getProperty(oMessageObject.getId()) ? oContext.getProperty(oMessageObject.getId()) : {}, oTemp), oContext);
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
_proto._getControlFromMessageRelatingToSubSection = function _getControlFromMessageRelatingToSubSection(subSection, message) {
|
|
296
|
+
var that = this;
|
|
297
|
+
var oMessageObject = message.getBindingContext("message").getObject();
|
|
298
|
+
var aElements = subSection.findElements(true, function (oElem) {
|
|
299
|
+
return that._fnFilterUponIds(oMessageObject.getControlIds(), oElem);
|
|
300
|
+
}).sort(function (a, b) {
|
|
301
|
+
// controls are sorted in order to have the table on top of the array
|
|
302
|
+
// it will help to compute the subtitle of the message based on the type of related controls
|
|
303
|
+
if (a.isA("sap.ui.mdc.Table") && !b.isA("sap.ui.mdc.Table")) {
|
|
304
|
+
return -1;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
return 1;
|
|
308
|
+
});
|
|
309
|
+
return aElements;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* The method that sets groups for transient messages.
|
|
313
|
+
*
|
|
314
|
+
* @param {object} message The message we want to compute group and subtitle.
|
|
315
|
+
* @param {string} sActionName The action name.
|
|
316
|
+
* @private
|
|
317
|
+
*/
|
|
318
|
+
;
|
|
319
|
+
|
|
320
|
+
_proto._setGroupLabelForTransientMsg = function _setGroupLabelForTransientMsg(message, sActionName) {
|
|
321
|
+
this.sLastActionText = this.sLastActionText ? this.sLastActionText : sap.ui.getCore().getLibraryResourceBundle("sap.fe.core").getText("T_MESSAGE_BUTTON_SAPFE_MESSAGE_GROUP_LAST_ACTION");
|
|
322
|
+
message.setGroupName(this.sLastActionText + ": " + sActionName);
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* The method that group messages and add the subtitle.
|
|
326
|
+
*
|
|
327
|
+
* @param {object} message The message we want to compute group and subtitle.
|
|
328
|
+
* @param {object} section The section containing the controls.
|
|
329
|
+
* @param {object} subSection The subsection containing the controls.
|
|
330
|
+
* @param {object} aElements List of controls from a subsection related to a message .
|
|
331
|
+
* @param {boolean} bMultipleSubSections True if there are more than 1 subsection in the section.
|
|
332
|
+
* @param {string} sActionName The action name.
|
|
333
|
+
* @returns {object} Return the control targeted by the message.
|
|
334
|
+
* @private
|
|
335
|
+
*/
|
|
336
|
+
;
|
|
337
|
+
|
|
338
|
+
_proto._computeMessageGroupAndSubTitle = function _computeMessageGroupAndSubTitle(message, section, subSection, aElements, bMultipleSubSections, sActionName) {
|
|
339
|
+
var that = this;
|
|
340
|
+
this.oItemBinding.detachChange(this._setMessageData, this);
|
|
341
|
+
var oMessageObject = message.getBindingContext("message").getObject();
|
|
342
|
+
var oElement, oTable, oTargetTableInfo, l, iRowIndex, oTargetedControl, oBackendMessageToRemove, bIsCreationRow;
|
|
343
|
+
var bIsBackendMessage = new RegExp("^/").test(oMessageObject.getTarget()),
|
|
344
|
+
oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
|
|
345
|
+
|
|
346
|
+
if (bIsBackendMessage) {
|
|
347
|
+
for (l = 0; l < aElements.length; l++) {
|
|
348
|
+
oElement = aElements[l];
|
|
349
|
+
oTargetedControl = oElement;
|
|
350
|
+
|
|
351
|
+
if (oElement.isA("sap.m.Table") || oElement.isA("sap.ui.table.Table")) {
|
|
352
|
+
oTargetTableInfo = {};
|
|
353
|
+
oTable = oElement.getParent();
|
|
354
|
+
oTargetTableInfo.tableHeader = oTable.getHeader();
|
|
355
|
+
var oRowBinding = oTable.getRowBinding();
|
|
356
|
+
|
|
357
|
+
if (oRowBinding && oRowBinding.isLengthFinal() && oTable.getBindingContext()) {
|
|
358
|
+
oTargetTableInfo.sTableTargetColProperty = this._getTableColProperty(oTable, oMessageObject);
|
|
359
|
+
|
|
360
|
+
var oTableColInfo = this._getTableColInfo(oTable, oTargetTableInfo.sTableTargetColProperty);
|
|
361
|
+
|
|
362
|
+
oTargetTableInfo.oTableRowBindingContexts = oElement.isA("sap.ui.table.Table") ? oRowBinding.getContexts() : oRowBinding.getCurrentContexts();
|
|
363
|
+
oTargetTableInfo.sTableTargetColName = oTableColInfo.sTableTargetColName;
|
|
364
|
+
oTargetTableInfo.sTableTargetProperty = oTargetTableInfo.sTableTargetColProperty;
|
|
365
|
+
oTargetTableInfo.sTableTargetColProperty = oTableColInfo.sTableTargetColProperty;
|
|
366
|
+
oTargetTableInfo.oTableRowContext = oTargetTableInfo.oTableRowBindingContexts.find(function (oMessageObject, rowContext) {
|
|
367
|
+
return rowContext && oMessageObject.getTarget().indexOf(rowContext.getPath()) === 0;
|
|
368
|
+
}.bind(this, oMessageObject));
|
|
369
|
+
var sControlId = void 0;
|
|
370
|
+
|
|
371
|
+
if (!oTargetTableInfo.oTableRowContext) {
|
|
372
|
+
sControlId = oMessageObject.controlIds.find(function (oTable, sId) {
|
|
373
|
+
return that._IsControlInTable(oTable, sId);
|
|
374
|
+
}.bind(this, oTable));
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
if (sControlId) {
|
|
378
|
+
var oControl = sap.ui.getCore().byId(sControlId);
|
|
379
|
+
bIsCreationRow = this._IsControlPartOfCreationRow(oControl);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
this._setMessageSubtitle(message, oTargetTableInfo.oTableRowBindingContexts, oTargetTableInfo.oTableRowContext, oTargetTableInfo.sTableTargetColName, oResourceBundle, oTargetTableInfo.sTableTargetProperty, oTable, bIsCreationRow);
|
|
383
|
+
|
|
384
|
+
if (oTargetTableInfo.oTableRowContext) {
|
|
385
|
+
this._formatMessageDescription(message, oTargetTableInfo.oTableRowContext, oTargetTableInfo.sTableTargetColName, oResourceBundle, oTable);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
iRowIndex = oTargetTableInfo.oTableRowContext && oTargetTableInfo.oTableRowContext.getIndex();
|
|
389
|
+
|
|
390
|
+
this._updateInternalModel(oTargetTableInfo.oTableRowContext, iRowIndex, oTargetTableInfo.sTableTargetColProperty, oTable, oMessageObject);
|
|
391
|
+
}
|
|
392
|
+
} else {
|
|
393
|
+
message.setActiveTitle(true); //check if the targeted control is a child of one of the other controls
|
|
394
|
+
|
|
395
|
+
var bIsTargetedControlOrphan = this._bIsOrphanElement(oTargetedControl, aElements);
|
|
396
|
+
|
|
397
|
+
if (bIsTargetedControlOrphan) {
|
|
398
|
+
//set the subtitle
|
|
399
|
+
message.setSubtitle("");
|
|
400
|
+
break;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
} else {
|
|
405
|
+
//There is only one elt as this is a frontEnd message
|
|
406
|
+
oTargetedControl = aElements[0];
|
|
407
|
+
oTable = this._getMdcTable(oTargetedControl);
|
|
408
|
+
|
|
409
|
+
if (oTable) {
|
|
410
|
+
oTargetTableInfo = {};
|
|
411
|
+
oTargetTableInfo.tableHeader = oTable.getHeader();
|
|
412
|
+
|
|
413
|
+
var iTargetColumnIndex = this._getTableColumnIndex(oTargetedControl);
|
|
414
|
+
|
|
415
|
+
oTargetTableInfo.sTableTargetColProperty = iTargetColumnIndex > -1 ? oTable.getColumns()[iTargetColumnIndex].getDataProperty() : undefined;
|
|
416
|
+
oTargetTableInfo.sTableTargetProperty = oTargetTableInfo.sTableTargetColProperty;
|
|
417
|
+
oTargetTableInfo.sTableTargetColName = oTargetTableInfo.sTableTargetColProperty && iTargetColumnIndex > -1 ? oTable.getColumns()[iTargetColumnIndex].getHeader() : undefined;
|
|
418
|
+
bIsCreationRow = this._getTableRow(oTargetedControl).isA("sap.ui.table.CreationRow");
|
|
419
|
+
|
|
420
|
+
if (!bIsCreationRow) {
|
|
421
|
+
iRowIndex = this._getTableRowIndex(oTargetedControl);
|
|
422
|
+
oTargetTableInfo.oTableRowBindingContexts = oTable.getRowBinding().getCurrentContexts();
|
|
423
|
+
oTargetTableInfo.oTableRowContext = oTargetTableInfo.oTableRowBindingContexts[iRowIndex];
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
this._setMessageSubtitle(message, oTargetTableInfo.oTableRowBindingContexts, oTargetTableInfo.oTableRowContext, oTargetTableInfo.sTableTargetColName, oResourceBundle, oTargetTableInfo.sTableTargetProperty, oTable, bIsCreationRow);
|
|
427
|
+
|
|
428
|
+
this._updateInternalModel(oTargetTableInfo.oTableRowContext, iRowIndex, oTargetTableInfo.sTableTargetColProperty, oTable, oMessageObject, bIsCreationRow);
|
|
429
|
+
|
|
430
|
+
if (oTargetTableInfo.oTableRowContext) {
|
|
431
|
+
var oErrorContext = {
|
|
432
|
+
rowIndex: oTargetTableInfo.oTableRowContext ? iRowIndex : "",
|
|
433
|
+
targetColProperty: oTargetTableInfo.sTableTargetColProperty ? oTargetTableInfo.sTableTargetColProperty : ""
|
|
434
|
+
};
|
|
435
|
+
oBackendMessageToRemove = this._getBackendMessageToRemove(oTable, oMessageObject, oErrorContext);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
if (oMessageObject.persistent && sActionName) {
|
|
441
|
+
this._setGroupLabelForTransientMsg(message, sActionName);
|
|
442
|
+
} else {
|
|
443
|
+
message.setGroupName(section.getTitle() + (subSection.getTitle() && bMultipleSubSections ? ", " + subSection.getTitle() : "") + (oTargetTableInfo ? ", " + oResourceBundle.getText("T_MESSAGE_GROUP_TITLE_TABLE_DENOMINATOR") + ": " + oTargetTableInfo.tableHeader : ""));
|
|
444
|
+
|
|
445
|
+
var sViewId = this._getViewId(this.getId());
|
|
446
|
+
|
|
447
|
+
var oView = sap.ui.getCore().byId(sViewId);
|
|
448
|
+
var oMessageTargetProperty = oMessageObject.getTarget() && oMessageObject.getTarget().split("/").pop();
|
|
449
|
+
var oUIModel = oView === null || oView === void 0 ? void 0 : oView.getModel("internal");
|
|
450
|
+
|
|
451
|
+
if (oUIModel && oUIModel.getProperty("/messageTargetProperty") && oMessageTargetProperty && oMessageTargetProperty == oUIModel.getProperty("/messageTargetProperty")) {
|
|
452
|
+
this.oMessagePopover.fireActiveTitlePress({
|
|
453
|
+
"item": message
|
|
454
|
+
});
|
|
455
|
+
oUIModel.setProperty("/messageTargetProperty", false);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
this.oItemBinding.attachChange(this._setMessageData, this);
|
|
460
|
+
|
|
461
|
+
if (oBackendMessageToRemove && !bIsBackendMessage) {
|
|
462
|
+
/*Pending further investigation, along with the deletion of the backendEnd message,
|
|
463
|
+
we remove and reinsert all the other existing messages from the message manager to
|
|
464
|
+
make the highlight of the field on error persistent.*/
|
|
465
|
+
this._removeMessage(oBackendMessageToRemove);
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
return oTargetedControl;
|
|
469
|
+
};
|
|
470
|
+
|
|
471
|
+
_proto._checkControlIdInSections = function _checkControlIdInSections(aMessages, bEnableBinding) {
|
|
472
|
+
var section, aSubSections, message, i, j, k;
|
|
473
|
+
this.sGeneralGroupText = this.sGeneralGroupText ? this.sGeneralGroupText : sap.ui.getCore().getLibraryResourceBundle("sap.fe.core").getText("T_MESSAGE_BUTTON_SAPFE_MESSAGE_GROUP_GENERAL"); //Get all sections from the object page layout
|
|
474
|
+
|
|
475
|
+
var aVisibleSections = this.getVisibleSectionsFromObjectPageLayout(this.oObjectPageLayout);
|
|
476
|
+
|
|
477
|
+
if (aVisibleSections) {
|
|
478
|
+
var _oView$getBindingCont;
|
|
479
|
+
|
|
480
|
+
var viewId = this._getViewId(this.getId());
|
|
481
|
+
|
|
482
|
+
var oView = sap.ui.getCore().byId(viewId);
|
|
483
|
+
var sActionName = oView === null || oView === void 0 ? void 0 : (_oView$getBindingCont = oView.getBindingContext("internal")) === null || _oView$getBindingCont === void 0 ? void 0 : _oView$getBindingCont.getProperty("sActionName");
|
|
484
|
+
|
|
485
|
+
if (sActionName) {
|
|
486
|
+
(oView === null || oView === void 0 ? void 0 : oView.getBindingContext("internal")).setProperty("sActionName", null);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
for (i = aMessages.length - 1; i >= 0; --i) {
|
|
490
|
+
// Loop over all messages
|
|
491
|
+
message = aMessages[i];
|
|
492
|
+
var bIsGeneralGroupName = true;
|
|
493
|
+
|
|
494
|
+
for (j = aVisibleSections.length - 1; j >= 0; --j) {
|
|
495
|
+
// Loop over all visible sections
|
|
496
|
+
section = aVisibleSections[j];
|
|
497
|
+
aSubSections = section.getSubSections();
|
|
498
|
+
|
|
499
|
+
for (k = aSubSections.length - 1; k >= 0; --k) {
|
|
500
|
+
// Loop over all sub-sections
|
|
501
|
+
var subSection = aSubSections[k];
|
|
502
|
+
|
|
503
|
+
var aControls = this._getControlFromMessageRelatingToSubSection(subSection, message);
|
|
504
|
+
|
|
505
|
+
if (aControls.length > 0) {
|
|
506
|
+
var oTargetedControl = this._computeMessageGroupAndSubTitle(message, section, subSection, aControls, aSubSections.length > 1, sActionName); // if we found table that matches with the message, we don't stop the loop
|
|
507
|
+
// in case we find an additional control (eg mdc field) that also match with the message
|
|
508
|
+
|
|
509
|
+
|
|
510
|
+
if (oTargetedControl && !oTargetedControl.isA("sap.m.Table") && !oTargetedControl.isA("sap.ui.table.Table")) {
|
|
511
|
+
j = k = -1;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
bIsGeneralGroupName = false;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
if (bIsGeneralGroupName) {
|
|
520
|
+
var oMessageObject = message.getBindingContext("message").getObject();
|
|
521
|
+
message.setActiveTitle(false);
|
|
522
|
+
|
|
523
|
+
if (oMessageObject.persistent && sActionName) {
|
|
524
|
+
this._setGroupLabelForTransientMsg(message, sActionName);
|
|
525
|
+
} else {
|
|
526
|
+
message.setGroupName(this.sGeneralGroupText);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
if (!bEnableBinding && message.getGroupName() === this.sGeneralGroupText && this._findTargetForMessage(message)) {
|
|
531
|
+
return true;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
};
|
|
536
|
+
|
|
537
|
+
_proto._findTargetForMessage = function _findTargetForMessage(message) {
|
|
538
|
+
var messageObject = message.getBindingContext("message") && message.getBindingContext("message").getObject();
|
|
539
|
+
|
|
540
|
+
if (messageObject && messageObject.target) {
|
|
541
|
+
var oMetaModel = this.oObjectPageLayout && this.oObjectPageLayout.getModel() && this.oObjectPageLayout.getModel().getMetaModel(),
|
|
542
|
+
contextPath = oMetaModel && oMetaModel.getMetaPath(messageObject.target),
|
|
543
|
+
oContextPathMetadata = oMetaModel && oMetaModel.getObject(contextPath);
|
|
544
|
+
|
|
545
|
+
if (oContextPathMetadata && oContextPathMetadata.$kind == "Property") {
|
|
546
|
+
return true;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
};
|
|
550
|
+
|
|
551
|
+
_proto._fnEnableBindings = function _fnEnableBindings(aSections) {
|
|
552
|
+
if (UriParameters.fromQuery(window.location.search).get("sap-fe-xx-lazyloadingtest")) {
|
|
553
|
+
return;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
for (var iSection = 0; iSection < aSections.length; iSection++) {
|
|
557
|
+
var oSection = aSections[iSection];
|
|
558
|
+
var nonTableChartcontrolFound = false;
|
|
559
|
+
var aSubSections = oSection.getSubSections();
|
|
560
|
+
|
|
561
|
+
for (var iSubSection = 0; iSubSection < aSubSections.length; iSubSection++) {
|
|
562
|
+
var oSubSection = aSubSections[iSubSection];
|
|
563
|
+
var oAllBlocks = oSubSection.getBlocks();
|
|
564
|
+
|
|
565
|
+
if (oAllBlocks) {
|
|
566
|
+
for (var block = 0; block < oSubSection.getBlocks().length; block++) {
|
|
567
|
+
if (oAllBlocks[block].getContent && !oAllBlocks[block].getContent().isA("sap.fe.macros.TableAPI")) {
|
|
568
|
+
nonTableChartcontrolFound = true;
|
|
569
|
+
break;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
if (nonTableChartcontrolFound) {
|
|
574
|
+
oSubSection.setBindingContext(undefined);
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
if (oSubSection.getBindingContext() && this._findMessageGroupAfterRebinding()) {
|
|
579
|
+
oSubSection.getBindingContext().getBinding().attachDataReceived(this._findMessageGroupAfterRebinding());
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
};
|
|
584
|
+
|
|
585
|
+
_proto._findMessageGroupAfterRebinding = function _findMessageGroupAfterRebinding() {
|
|
586
|
+
var aMessages = this.oMessagePopover.getItems();
|
|
587
|
+
|
|
588
|
+
this._checkControlIdInSections(aMessages, true);
|
|
589
|
+
}
|
|
590
|
+
/**
|
|
591
|
+
* The method that retrieves the view ID (HTMLView/XMLView/JSONview/JSView/Templateview) of any control.
|
|
592
|
+
*
|
|
593
|
+
* @param {string} sControlId ID of the control needed to retrieve the view ID
|
|
594
|
+
* @returns {string} The view ID of the control
|
|
595
|
+
*/
|
|
596
|
+
;
|
|
597
|
+
|
|
598
|
+
_proto._getViewId = function _getViewId(sControlId) {
|
|
599
|
+
var sViewId,
|
|
600
|
+
oControl = sap.ui.getCore().byId(sControlId);
|
|
601
|
+
|
|
602
|
+
while (oControl) {
|
|
603
|
+
if (oControl instanceof View) {
|
|
604
|
+
sViewId = oControl.getId();
|
|
605
|
+
break;
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
oControl = oControl.getParent();
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
return sViewId;
|
|
612
|
+
};
|
|
613
|
+
|
|
614
|
+
_proto._setLongtextUrlDescription = function _setLongtextUrlDescription(sMessageDescriptionContent, oDiagnosisTitle) {
|
|
615
|
+
this.oMessagePopover.setAsyncDescriptionHandler(function (config) {
|
|
616
|
+
// This stores the old description
|
|
617
|
+
var sOldDescription = sMessageDescriptionContent; // Here we can fetch the data and concatenate it to the old one
|
|
618
|
+
// By default, the longtextUrl fetching will overwrite the description (with the default behaviour)
|
|
619
|
+
// Here as we have overwritten the default async handler, which fetches and replaces the description of the item
|
|
620
|
+
// we can manually modify it to include whatever needed.
|
|
621
|
+
|
|
622
|
+
var sLongTextUrl = config.item.getLongtextUrl();
|
|
623
|
+
|
|
624
|
+
if (sLongTextUrl) {
|
|
625
|
+
jQuery.ajax({
|
|
626
|
+
type: "GET",
|
|
627
|
+
url: sLongTextUrl,
|
|
628
|
+
success: function (data) {
|
|
629
|
+
var sDiagnosisText = oDiagnosisTitle.getHtmlText() + data;
|
|
630
|
+
config.item.setDescription(sOldDescription + "" + sDiagnosisText);
|
|
631
|
+
config.promise.resolve();
|
|
632
|
+
},
|
|
633
|
+
error: function () {
|
|
634
|
+
config.item.setDescription(sMessageDescriptionContent);
|
|
635
|
+
var sError = "A request has failed for long text data. URL: " + sLongTextUrl;
|
|
636
|
+
Log.error(sError);
|
|
637
|
+
config.promise.reject(sError);
|
|
638
|
+
}
|
|
639
|
+
});
|
|
640
|
+
}
|
|
641
|
+
});
|
|
642
|
+
};
|
|
643
|
+
|
|
644
|
+
_proto._formatMessageDescription = function _formatMessageDescription(message, oTableRowContext, sTableTargetColName, oResourceBundle, oTable) {
|
|
645
|
+
var sTableFirstColProperty = this._getTableFirstColProperty(oTable);
|
|
646
|
+
|
|
647
|
+
var sColumnInfo = "";
|
|
648
|
+
|
|
649
|
+
var oColFromTableSettings = this._fetchColumnInfo(message, oTable);
|
|
650
|
+
|
|
651
|
+
if (sTableTargetColName) {
|
|
652
|
+
// if column in present in table definition
|
|
653
|
+
sColumnInfo = oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_COLUMN") + ": " + sTableTargetColName;
|
|
654
|
+
} else if (oColFromTableSettings) {
|
|
655
|
+
if (oColFromTableSettings.availability === "Hidden") {
|
|
656
|
+
// if column in neither in table definition nor personalization
|
|
657
|
+
if (message.getType() === "Error") {
|
|
658
|
+
sColumnInfo = oResourceBundle.getText("T_COLUMN_AVAILABLE_DIAGNOSIS_MSGDESC_ERROR") + " " + oTableRowContext.getValue(sTableFirstColProperty);
|
|
659
|
+
} else {
|
|
660
|
+
sColumnInfo = oResourceBundle.getText("T_COLUMN_AVAILABLE_DIAGNOSIS_MSGDESC") + " " + oTableRowContext.getValue(sTableFirstColProperty);
|
|
661
|
+
}
|
|
662
|
+
} else {
|
|
663
|
+
// if column is not in table definition but in personalization
|
|
664
|
+
sColumnInfo = oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_COLUMN") + ": " + oColFromTableSettings.label + " (" + oResourceBundle.getText("T_COLUMN_INDICATOR_IN_TABLE_DEFINITION") + ")";
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
var oFieldsAffectedTitle = new FormattedText({
|
|
669
|
+
htmlText: "<html><body><strong>" + oResourceBundle.getText("T_FIELDS_AFFECTED_TITLE") + "</strong></body></html><br>"
|
|
670
|
+
});
|
|
671
|
+
var sFieldAffectedText = oFieldsAffectedTitle.getHtmlText() + "<br>" + oResourceBundle.getText("T_MESSAGE_GROUP_TITLE_TABLE_DENOMINATOR") + ": " + oTable.getHeader() + "<br>" + oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_ROW") + ": " + oTableRowContext.getValue(sTableFirstColProperty) + "<br>" + sColumnInfo + "<br>";
|
|
672
|
+
var oDiagnosisTitle = new FormattedText({
|
|
673
|
+
htmlText: "<html><body><strong>" + oResourceBundle.getText("T_DIAGNOSIS_TITLE") + "</strong></body></html><br>"
|
|
674
|
+
}); // get the UI messages from the message context to set it to Diagnosis section
|
|
675
|
+
|
|
676
|
+
var sUIMessageDescription = message.getBindingContext("message").getObject().description; //set the description to null to reset it below
|
|
677
|
+
|
|
678
|
+
message.setDescription(null);
|
|
679
|
+
var sDiagnosisText = "";
|
|
680
|
+
var sMessageDescriptionContent = "";
|
|
681
|
+
|
|
682
|
+
if (message.getLongtextUrl()) {
|
|
683
|
+
sMessageDescriptionContent = sFieldAffectedText + "<br>";
|
|
684
|
+
|
|
685
|
+
this._setLongtextUrlDescription(sMessageDescriptionContent, oDiagnosisTitle);
|
|
686
|
+
} else if (sUIMessageDescription) {
|
|
687
|
+
sDiagnosisText = oDiagnosisTitle.getHtmlText() + "<br>" + sUIMessageDescription;
|
|
688
|
+
sMessageDescriptionContent = sFieldAffectedText + "<br>" + sDiagnosisText;
|
|
689
|
+
message.setDescription(sMessageDescriptionContent);
|
|
690
|
+
} else {
|
|
691
|
+
message.setDescription(sFieldAffectedText);
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
/**
|
|
695
|
+
* Method to set the button text, count and icon property based upon the message items
|
|
696
|
+
* ButtonType: Possible settings for warning and error messages are 'critical' and 'negative'.
|
|
697
|
+
*
|
|
698
|
+
*
|
|
699
|
+
* @private
|
|
700
|
+
*/
|
|
701
|
+
;
|
|
702
|
+
|
|
703
|
+
_proto._setMessageData = function _setMessageData() {
|
|
704
|
+
clearTimeout(this._setMessageDataTimeout);
|
|
705
|
+
var that = this;
|
|
706
|
+
this._setMessageDataTimeout = setTimeout(function () {
|
|
707
|
+
var sIcon = "",
|
|
708
|
+
oMessages = that.oMessagePopover.getItems(),
|
|
709
|
+
oMessageCount = {
|
|
710
|
+
Error: 0,
|
|
711
|
+
Warning: 0,
|
|
712
|
+
Success: 0,
|
|
713
|
+
Information: 0
|
|
714
|
+
},
|
|
715
|
+
oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
|
|
716
|
+
iMessageLength = oMessages.length;
|
|
717
|
+
var sButtonType = ButtonType.Default,
|
|
718
|
+
sMessageKey = "",
|
|
719
|
+
sTooltipText = "",
|
|
720
|
+
sMessageText = "";
|
|
721
|
+
|
|
722
|
+
if (iMessageLength > 0) {
|
|
723
|
+
for (var i = 0; i < iMessageLength; i++) {
|
|
724
|
+
if (!oMessages[i].getType() || oMessages[i].getType() == "") {
|
|
725
|
+
++oMessageCount["Information"];
|
|
726
|
+
} else {
|
|
727
|
+
++oMessageCount[oMessages[i].getType()];
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
if (oMessageCount[MessageType.Error] > 0) {
|
|
732
|
+
sButtonType = ButtonType.Negative;
|
|
733
|
+
} else if (oMessageCount[MessageType.Warning] > 0) {
|
|
734
|
+
sButtonType = ButtonType.Critical;
|
|
735
|
+
} else if (oMessageCount[MessageType.Success] > 0) {
|
|
736
|
+
sButtonType = ButtonType.Success;
|
|
737
|
+
} else if (oMessageCount[MessageType.Information] > 0) {
|
|
738
|
+
sButtonType = ButtonType.Neutral;
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
if (oMessageCount.Error > 0) {
|
|
742
|
+
that.setText(oMessageCount.Error);
|
|
743
|
+
} else {
|
|
744
|
+
that.setText("");
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
if (oMessageCount.Error === 1) {
|
|
748
|
+
sMessageKey = "C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_TITLE_ERROR";
|
|
749
|
+
} else if (oMessageCount.Error > 1) {
|
|
750
|
+
sMessageKey = "C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_MULTIPLE_ERROR_TOOLTIP";
|
|
751
|
+
} else if (!oMessageCount.Error && oMessageCount.Warning) {
|
|
752
|
+
sMessageKey = "C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_WARNING_TOOLTIP";
|
|
753
|
+
} else if (!oMessageCount.Error && !oMessageCount.Warning && oMessageCount.Information) {
|
|
754
|
+
sMessageKey = "C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_INFO";
|
|
755
|
+
} else if (!oMessageCount.Error && !oMessageCount.Warning && !oMessageCount.Information && oMessageCount.Success) {
|
|
756
|
+
sMessageKey = "C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_SUCCESS";
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
if (sMessageKey) {
|
|
760
|
+
sMessageText = oResourceBundle.getText(sMessageKey);
|
|
761
|
+
sTooltipText = oMessageCount.Error ? oMessageCount.Error + " " + sMessageText : sMessageText;
|
|
762
|
+
that.setTooltip(sTooltipText);
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
that.setIcon(sIcon);
|
|
766
|
+
that.setType(sButtonType);
|
|
767
|
+
that.setVisible(true);
|
|
768
|
+
var oView = sap.ui.getCore().byId(that.sViewId);
|
|
769
|
+
|
|
770
|
+
if (oView) {
|
|
771
|
+
var oPageReady = oView.getController().pageReady;
|
|
772
|
+
oPageReady.waitPageReady().then(function () {
|
|
773
|
+
return that._applyGroupingAsync(oView);
|
|
774
|
+
}).finally(function () {
|
|
775
|
+
that.fireMessageChange({
|
|
776
|
+
iMessageLength: iMessageLength
|
|
777
|
+
});
|
|
778
|
+
}).catch(function () {
|
|
779
|
+
Log.error("fail grouping messages");
|
|
780
|
+
});
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
if (iMessageLength > 1) {
|
|
784
|
+
that.oMessagePopover.navigateBack();
|
|
785
|
+
}
|
|
786
|
+
} else {
|
|
787
|
+
that.setVisible(false);
|
|
788
|
+
that.fireMessageChange({
|
|
789
|
+
iMessageLength: iMessageLength
|
|
790
|
+
});
|
|
791
|
+
}
|
|
792
|
+
}, 100);
|
|
793
|
+
};
|
|
794
|
+
|
|
795
|
+
_proto._bIsOrphanElement = function _bIsOrphanElement(oElement, aElements) {
|
|
796
|
+
return !aElements.some(function (oElement, oElem) {
|
|
797
|
+
var oParentElement = oElement.getParent();
|
|
798
|
+
|
|
799
|
+
while (oParentElement && oParentElement !== oElem) {
|
|
800
|
+
oParentElement = oParentElement.getParent();
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
return oParentElement ? true : false;
|
|
804
|
+
}.bind(this, oElement));
|
|
805
|
+
}
|
|
806
|
+
/**
|
|
807
|
+
* The method that is called when a user clicks on the title of the message.
|
|
808
|
+
*
|
|
809
|
+
* @function
|
|
810
|
+
* @name _activeTitlePress
|
|
811
|
+
* @private
|
|
812
|
+
* @param {Event} oEvent Event object passed from the handler
|
|
813
|
+
*/
|
|
814
|
+
;
|
|
815
|
+
|
|
816
|
+
_proto._activeTitlePress = function _activeTitlePress(oEvent) {
|
|
817
|
+
var that = this;
|
|
818
|
+
var oInternalModelContext = this.getBindingContext("pageInternal");
|
|
819
|
+
oInternalModelContext.setProperty("errorNavigationSectionFlag", true);
|
|
820
|
+
var oItem = oEvent.getParameter("item"),
|
|
821
|
+
oMessage = oItem.getBindingContext("message").getObject(),
|
|
822
|
+
bIsBackendMessage = new RegExp("^/").test(oMessage.getTarget()),
|
|
823
|
+
oView = sap.ui.getCore().byId(this.sViewId),
|
|
824
|
+
oMessagePopover = this.oMessagePopover;
|
|
825
|
+
var oControl, sSectionTitle;
|
|
826
|
+
|
|
827
|
+
if (oMessagePopover && oMessagePopover.isOpen()) {
|
|
828
|
+
oMessagePopover.close();
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
var _focusOnMessageTargetControl = function (oMessage, oTargetMdcTable, iRowIndex) {
|
|
832
|
+
var aAllViewElements = oView.findElements(true);
|
|
833
|
+
var aErroneousControls = oMessage.getControlIds().filter(function (sControlId) {
|
|
834
|
+
return aAllViewElements.some(function (oElem) {
|
|
835
|
+
return oElem.getId() === sControlId;
|
|
836
|
+
});
|
|
837
|
+
}).map(function (sControlId) {
|
|
838
|
+
return sap.ui.getCore().byId(sControlId);
|
|
839
|
+
});
|
|
840
|
+
var aNotTableErroneousControls = aErroneousControls.filter(function (oElem) {
|
|
841
|
+
return !oElem.isA("sap.m.Table") && !oElem.isA("sap.ui.table.Table");
|
|
842
|
+
}); //The focus is set on Not Table control in priority
|
|
843
|
+
|
|
844
|
+
if (aNotTableErroneousControls.length > 0) {
|
|
845
|
+
aNotTableErroneousControls[0].focus();
|
|
846
|
+
} else if (aErroneousControls.length > 0) {
|
|
847
|
+
aErroneousControls[0].focus();
|
|
848
|
+
var aTargetMdcTableRow = oTargetMdcTable ? oTargetMdcTable.findElements(true, function (oElem) {
|
|
849
|
+
return oElem.isA("sap.m.ColumnListItem");
|
|
850
|
+
}) : [];
|
|
851
|
+
|
|
852
|
+
if (aTargetMdcTableRow.length > 0 && aTargetMdcTableRow[0]) {
|
|
853
|
+
var oTargetRow = aTargetMdcTableRow[iRowIndex];
|
|
854
|
+
|
|
855
|
+
var oTargetCell = _getTargetCell(oTargetRow, oMessage);
|
|
856
|
+
|
|
857
|
+
if (oTargetCell) {
|
|
858
|
+
var oTargetField = oTargetCell.isA("sap.fe.macros.FieldAPI") ? oTargetCell.getContent().getContentEdit()[0] : oTargetCell.getItems()[0].getContent().getContentEdit()[0];
|
|
859
|
+
oTargetField.focus();
|
|
860
|
+
} else {
|
|
861
|
+
// control not found on table
|
|
862
|
+
var errorProperty = oMessage.getTarget().split("/").pop();
|
|
863
|
+
|
|
864
|
+
if (errorProperty) {
|
|
865
|
+
oView.getModel("internal").setProperty("/messageTargetProperty", errorProperty);
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
oView.getController()._routing.navigateForwardToContext(oTargetRow.getBindingContext());
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
};
|
|
873
|
+
|
|
874
|
+
function _getTargetCell(oTargetRow, oMessage) {
|
|
875
|
+
var oTargetCell = oMessage.controlIds.map(function (sControlId) {
|
|
876
|
+
var isControlInTable = oTargetRow.findElements(true, function (oElem) {
|
|
877
|
+
return oElem.getId() === sControlId;
|
|
878
|
+
});
|
|
879
|
+
return isControlInTable.length > 0 ? sap.ui.getCore().byId(sControlId) : null;
|
|
880
|
+
}).reduce(function (acc, val) {
|
|
881
|
+
return val ? val : acc;
|
|
882
|
+
});
|
|
883
|
+
return oTargetCell;
|
|
884
|
+
} //check if the pressed item is related to a table control
|
|
885
|
+
|
|
886
|
+
|
|
887
|
+
if (oItem.getGroupName().indexOf("Table:") !== -1) {
|
|
888
|
+
var oTargetMdcTable;
|
|
889
|
+
|
|
890
|
+
if (bIsBackendMessage) {
|
|
891
|
+
oTargetMdcTable = oMessage.controlIds.map(function (sControlId) {
|
|
892
|
+
var oControl = sap.ui.getCore().byId(sControlId);
|
|
893
|
+
var oParentControl = oControl && oControl.getParent();
|
|
894
|
+
return oParentControl && oParentControl.isA("sap.ui.mdc.Table") && oParentControl.getHeader() === oItem.getGroupName().split(", Table: ")[1] ? oParentControl : null;
|
|
895
|
+
}).reduce(function (acc, val) {
|
|
896
|
+
return val ? val : acc;
|
|
897
|
+
});
|
|
898
|
+
|
|
899
|
+
if (oTargetMdcTable) {
|
|
900
|
+
sSectionTitle = oItem.getGroupName().split(", ")[0];
|
|
901
|
+
|
|
902
|
+
this._navigateFromMessageToSectionTableInIconTabBarMode(oTargetMdcTable, this.oObjectPageLayout, sSectionTitle).then(function () {
|
|
903
|
+
var oRefErrorContext = that._getTableRefErrorContext(oTargetMdcTable);
|
|
904
|
+
|
|
905
|
+
var oRefError = oRefErrorContext.getProperty(oItem.getBindingContext("message").getObject().getId());
|
|
906
|
+
|
|
907
|
+
var _setFocusOnTargetField = function (oTargetMdcTable, iRowIndex) {
|
|
908
|
+
var aTargetMdcTableRow = that._getMdcTableRows(oTargetMdcTable),
|
|
909
|
+
iFirstVisibleRow = that._getGridTable(oTargetMdcTable).getFirstVisibleRow();
|
|
910
|
+
|
|
911
|
+
if (aTargetMdcTableRow.length > 0 && aTargetMdcTableRow[0]) {
|
|
912
|
+
var oTargetRow = aTargetMdcTableRow[iRowIndex - iFirstVisibleRow],
|
|
913
|
+
oTargetCell = _getTargetCell(oTargetRow, oMessage);
|
|
914
|
+
|
|
915
|
+
if (oTargetCell) {
|
|
916
|
+
oTargetCell.focus();
|
|
917
|
+
} else {
|
|
918
|
+
// control not found on table
|
|
919
|
+
var errorProperty = oMessage.getTarget().split("/").pop();
|
|
920
|
+
|
|
921
|
+
if (errorProperty) {
|
|
922
|
+
oView.getModel("internal").setProperty("/messageTargetProperty", errorProperty);
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
oView.getController()._routing.navigateForwardToContext(oTargetRow.getBindingContext());
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
return {
|
|
929
|
+
targetRow: oTargetRow,
|
|
930
|
+
targetCell: oTargetCell
|
|
931
|
+
};
|
|
932
|
+
}
|
|
933
|
+
|
|
934
|
+
return {
|
|
935
|
+
targetRow: null,
|
|
936
|
+
targetCell: null
|
|
937
|
+
};
|
|
938
|
+
};
|
|
939
|
+
|
|
940
|
+
if (oTargetMdcTable.data("tableType") === "GridTable" && oRefError.rowIndex !== "") {
|
|
941
|
+
var iFirstVisibleRow = that._getGridTable(oTargetMdcTable).getFirstVisibleRow();
|
|
942
|
+
|
|
943
|
+
oTargetMdcTable.scrollToIndex(oRefError.rowIndex).then(function () {
|
|
944
|
+
var aTargetMdcTableRow = that._getMdcTableRows(oTargetMdcTable);
|
|
945
|
+
|
|
946
|
+
var iNewFirstVisibleRow, bScrollNeeded;
|
|
947
|
+
|
|
948
|
+
if (aTargetMdcTableRow.length > 0 && aTargetMdcTableRow[0]) {
|
|
949
|
+
iNewFirstVisibleRow = aTargetMdcTableRow[0].getParent().getFirstVisibleRow();
|
|
950
|
+
bScrollNeeded = iFirstVisibleRow - iNewFirstVisibleRow !== 0;
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
if (bScrollNeeded) {
|
|
954
|
+
//The scrollToIndex function does not wait for the UI update. As a workdaround, pending a fix from MDC (BCP: 2170251631) we use the event "UIUpdated".
|
|
955
|
+
var oWaitControlIdAdded = new Promise(function (resolve) {
|
|
956
|
+
sap.ui.getCore().attachEvent("UIUpdated", resolve);
|
|
957
|
+
});
|
|
958
|
+
return oWaitControlIdAdded;
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
return null;
|
|
962
|
+
}).then(function () {
|
|
963
|
+
setTimeout(function () {
|
|
964
|
+
_setFocusOnTargetField(oTargetMdcTable, oRefError.rowIndex);
|
|
965
|
+
}, 0);
|
|
966
|
+
}).catch(function () {
|
|
967
|
+
Log.error("Error while focusing on error");
|
|
968
|
+
});
|
|
969
|
+
} else if (oTargetMdcTable.data("tableType") === "ResponsiveTable" && oRefError) {
|
|
970
|
+
_focusOnMessageTargetControl(oMessage, oTargetMdcTable, oRefError.rowIndex);
|
|
971
|
+
} else {
|
|
972
|
+
_focusOnMessageTargetControl(oMessage);
|
|
973
|
+
}
|
|
974
|
+
}).catch(function () {
|
|
975
|
+
Log.error("Fail to navigate to Error control");
|
|
976
|
+
});
|
|
977
|
+
}
|
|
978
|
+
} else {
|
|
979
|
+
var _oControl;
|
|
980
|
+
|
|
981
|
+
oControl = sap.ui.getCore().byId(oMessage.controlIds[0]); //If the control underlying the frontEnd message is not within the current section, we first go into the target section:
|
|
982
|
+
|
|
983
|
+
var oSelectedSection = sap.ui.getCore().byId(this.oObjectPageLayout.getSelectedSection());
|
|
984
|
+
|
|
985
|
+
if ((oSelectedSection === null || oSelectedSection === void 0 ? void 0 : oSelectedSection.findElements(true).indexOf(oControl)) === -1) {
|
|
986
|
+
sSectionTitle = oItem.getGroupName().split(", ")[0];
|
|
987
|
+
|
|
988
|
+
this._navigateFromMessageToSectionInIconTabBarMode(this.oObjectPageLayout, sSectionTitle);
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
(_oControl = oControl) === null || _oControl === void 0 ? void 0 : _oControl.focus();
|
|
992
|
+
}
|
|
993
|
+
} else {
|
|
994
|
+
// focus on control
|
|
995
|
+
sSectionTitle = oItem.getGroupName().split(", ")[0];
|
|
996
|
+
|
|
997
|
+
this._navigateFromMessageToSectionInIconTabBarMode(this.oObjectPageLayout, sSectionTitle);
|
|
998
|
+
|
|
999
|
+
_focusOnMessageTargetControl(oMessage);
|
|
1000
|
+
}
|
|
1001
|
+
};
|
|
1002
|
+
|
|
1003
|
+
_proto._getTableColInfo = function _getTableColInfo(oTable, sTableTargetColProperty) {
|
|
1004
|
+
var sTableTargetColName;
|
|
1005
|
+
var oTableTargetCol = oTable.getColumns().find(function (sTableTargetColProperty, column) {
|
|
1006
|
+
return column.getDataProperty() === sTableTargetColProperty;
|
|
1007
|
+
}.bind(this, sTableTargetColProperty));
|
|
1008
|
+
|
|
1009
|
+
if (!oTableTargetCol) {
|
|
1010
|
+
/* If the target column is not found, we check for a custom column */
|
|
1011
|
+
var oCustomColumn = oTable.getControlDelegate().getColumnsFor(oTable).find(function (oColumn) {
|
|
1012
|
+
if (!!oColumn.template && oColumn.propertyInfos) {
|
|
1013
|
+
return oColumn.propertyInfos[0] === sTableTargetColProperty || oColumn.propertyInfos[0].replace("Property::", "") === sTableTargetColProperty;
|
|
1014
|
+
} else {
|
|
1015
|
+
return false;
|
|
1016
|
+
}
|
|
1017
|
+
});
|
|
1018
|
+
|
|
1019
|
+
if (oCustomColumn) {
|
|
1020
|
+
oTableTargetCol = oCustomColumn;
|
|
1021
|
+
sTableTargetColProperty = oTableTargetCol.name;
|
|
1022
|
+
sTableTargetColName = oTable.getColumns().find(function (oColumn) {
|
|
1023
|
+
return sTableTargetColProperty === oColumn.getDataProperty();
|
|
1024
|
+
}).getHeader();
|
|
1025
|
+
} else {
|
|
1026
|
+
/* If the target column is not found, we check for a field group */
|
|
1027
|
+
var aColumns = oTable.getControlDelegate().getColumnsFor(oTable);
|
|
1028
|
+
oTableTargetCol = aColumns.find(function (aColumns, sTableTargetColProperty, oColumn) {
|
|
1029
|
+
if (oColumn.key.indexOf("::FieldGroup::") !== -1) {
|
|
1030
|
+
return oColumn.propertyInfos.find(function () {
|
|
1031
|
+
return aColumns.find(function (oColumn) {
|
|
1032
|
+
return oColumn.relativePath === sTableTargetColProperty;
|
|
1033
|
+
});
|
|
1034
|
+
});
|
|
1035
|
+
}
|
|
1036
|
+
}.bind(this, aColumns, sTableTargetColProperty));
|
|
1037
|
+
/* check if the column with the field group is visible in the table: */
|
|
1038
|
+
|
|
1039
|
+
var bIsTableTargetColVisible = false;
|
|
1040
|
+
|
|
1041
|
+
if (oTableTargetCol && oTableTargetCol.label) {
|
|
1042
|
+
bIsTableTargetColVisible = oTable.getColumns().some(function (column) {
|
|
1043
|
+
return column.getHeader() === oTableTargetCol.label;
|
|
1044
|
+
});
|
|
1045
|
+
}
|
|
1046
|
+
|
|
1047
|
+
sTableTargetColName = bIsTableTargetColVisible && oTableTargetCol.label;
|
|
1048
|
+
sTableTargetColProperty = bIsTableTargetColVisible && oTableTargetCol.key;
|
|
1049
|
+
}
|
|
1050
|
+
} else {
|
|
1051
|
+
sTableTargetColName = oTableTargetCol && oTableTargetCol.getHeader();
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
return {
|
|
1055
|
+
sTableTargetColName: sTableTargetColName,
|
|
1056
|
+
sTableTargetColProperty: sTableTargetColProperty
|
|
1057
|
+
};
|
|
1058
|
+
}
|
|
1059
|
+
/**
|
|
1060
|
+
*
|
|
1061
|
+
* @param {object} obj The message object
|
|
1062
|
+
* @param {Array} aSections The array of sections in the object page
|
|
1063
|
+
*
|
|
1064
|
+
* @returns {number} The rank of the message
|
|
1065
|
+
*/
|
|
1066
|
+
;
|
|
1067
|
+
|
|
1068
|
+
_proto._getMessageRank = function _getMessageRank(obj, aSections) {
|
|
1069
|
+
if (aSections) {
|
|
1070
|
+
var section, aSubSections, subSection, j, k, aElements, aAllElements, sectionRank;
|
|
1071
|
+
|
|
1072
|
+
for (j = aSections.length - 1; j >= 0; --j) {
|
|
1073
|
+
// Loop over all sections
|
|
1074
|
+
section = aSections[j];
|
|
1075
|
+
aSubSections = section.getSubSections();
|
|
1076
|
+
|
|
1077
|
+
for (k = aSubSections.length - 1; k >= 0; --k) {
|
|
1078
|
+
// Loop over all sub-sections
|
|
1079
|
+
subSection = aSubSections[k];
|
|
1080
|
+
aAllElements = subSection.findElements(true); // Get all elements inside a sub-section
|
|
1081
|
+
//Try to find the control 1 inside the sub section
|
|
1082
|
+
|
|
1083
|
+
aElements = aAllElements.filter(this._fnFilterUponId.bind(this, obj.getControlId()));
|
|
1084
|
+
sectionRank = j + 1;
|
|
1085
|
+
|
|
1086
|
+
if (aElements.length > 0) {
|
|
1087
|
+
obj.sectionName = section.getTitle();
|
|
1088
|
+
obj.subSectionName = subSection.getTitle();
|
|
1089
|
+
return sectionRank * 10 + (k + 1);
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
} //if sub section title is Other messages, we return a high number(rank), which ensures
|
|
1093
|
+
//that messages belonging to this sub section always come later in messagePopover
|
|
1094
|
+
|
|
1095
|
+
|
|
1096
|
+
if (!obj.sectionName && !obj.subSectionName && obj.persistent) {
|
|
1097
|
+
return 1;
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
return 999;
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
return 999;
|
|
1104
|
+
}
|
|
1105
|
+
/**
|
|
1106
|
+
* Method to set the filters based upon the message items
|
|
1107
|
+
* The desired filter operation is:
|
|
1108
|
+
* ( filters provided by user && ( validation = true && Control should be present in view ) || messages for the current matching context ).
|
|
1109
|
+
*
|
|
1110
|
+
* @private
|
|
1111
|
+
*/
|
|
1112
|
+
;
|
|
1113
|
+
|
|
1114
|
+
_proto._applyFiltersAndSort = function _applyFiltersAndSort() {
|
|
1115
|
+
var oValidationFilters,
|
|
1116
|
+
oValidationAndContextFilter,
|
|
1117
|
+
oFilters,
|
|
1118
|
+
sPath,
|
|
1119
|
+
oSorter,
|
|
1120
|
+
oDialogFilter,
|
|
1121
|
+
objectPageLayoutSections = null;
|
|
1122
|
+
var aUserDefinedFilter = [];
|
|
1123
|
+
|
|
1124
|
+
function filterOutMessagesInDialog() {
|
|
1125
|
+
var fnTest = function (aControlIds) {
|
|
1126
|
+
var index = Infinity,
|
|
1127
|
+
oControl = sap.ui.getCore().byId(aControlIds[0]);
|
|
1128
|
+
var errorFieldControl = sap.ui.getCore().byId(aControlIds[0]);
|
|
1129
|
+
|
|
1130
|
+
while (oControl) {
|
|
1131
|
+
var fieldRankinDialog = oControl instanceof Dialog ? (errorFieldControl === null || errorFieldControl === void 0 ? void 0 : errorFieldControl.getParent()).findElements(true).indexOf(errorFieldControl) : Infinity;
|
|
1132
|
+
|
|
1133
|
+
if (oControl instanceof Dialog) {
|
|
1134
|
+
if (index > fieldRankinDialog) {
|
|
1135
|
+
index = fieldRankinDialog; // Set the focus to the dialog's control
|
|
1136
|
+
|
|
1137
|
+
errorFieldControl === null || errorFieldControl === void 0 ? void 0 : errorFieldControl.focus();
|
|
1138
|
+
} // messages for sap.m.Dialog should not appear in the message button
|
|
1139
|
+
|
|
1140
|
+
|
|
1141
|
+
return false;
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1144
|
+
oControl = oControl.getParent();
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
return true;
|
|
1148
|
+
};
|
|
1149
|
+
|
|
1150
|
+
return new Filter({
|
|
1151
|
+
path: "controlIds",
|
|
1152
|
+
test: fnTest,
|
|
1153
|
+
caseSensitive: true
|
|
1154
|
+
});
|
|
1155
|
+
} //Filter function to verify if the control is part of the current view or not
|
|
1156
|
+
|
|
1157
|
+
|
|
1158
|
+
function getCheckControlInViewFilter() {
|
|
1159
|
+
var fnTest = function (aControlIds) {
|
|
1160
|
+
if (!aControlIds.length) {
|
|
1161
|
+
return false;
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
var oControl = sap.ui.getCore().byId(aControlIds[0]);
|
|
1165
|
+
|
|
1166
|
+
while (oControl) {
|
|
1167
|
+
if (oControl.getId() === sViewId) {
|
|
1168
|
+
return true;
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
if (oControl instanceof Dialog) {
|
|
1172
|
+
// messages for sap.m.Dialog should not appear in the message button
|
|
1173
|
+
return false;
|
|
1174
|
+
}
|
|
1175
|
+
|
|
1176
|
+
oControl = oControl.getParent();
|
|
1177
|
+
}
|
|
1178
|
+
|
|
1179
|
+
return false;
|
|
1180
|
+
};
|
|
1181
|
+
|
|
1182
|
+
return new Filter({
|
|
1183
|
+
path: "controlIds",
|
|
1184
|
+
test: fnTest,
|
|
1185
|
+
caseSensitive: true
|
|
1186
|
+
});
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
if (!this.sViewId) {
|
|
1190
|
+
this.sViewId = this._getViewId(this.getId());
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
var sViewId = this.sViewId; //Add the filters provided by the user
|
|
1194
|
+
|
|
1195
|
+
var aCustomFilters = this.getAggregation("customFilters");
|
|
1196
|
+
|
|
1197
|
+
if (aCustomFilters) {
|
|
1198
|
+
aCustomFilters.forEach(function (filter) {
|
|
1199
|
+
aUserDefinedFilter.push(new Filter({
|
|
1200
|
+
path: filter.getProperty("path"),
|
|
1201
|
+
operator: filter.getProperty("operator"),
|
|
1202
|
+
value1: filter.getProperty("value1"),
|
|
1203
|
+
value2: filter.getProperty("value2")
|
|
1204
|
+
}));
|
|
1205
|
+
});
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
var oBindingContext = this.getBindingContext();
|
|
1209
|
+
|
|
1210
|
+
if (!oBindingContext) {
|
|
1211
|
+
this.setVisible(false);
|
|
1212
|
+
return;
|
|
1213
|
+
} else {
|
|
1214
|
+
sPath = oBindingContext.getPath(); //Filter for filtering out only validation messages which are currently present in the view
|
|
1215
|
+
|
|
1216
|
+
oValidationFilters = new Filter({
|
|
1217
|
+
filters: [new Filter({
|
|
1218
|
+
path: "validation",
|
|
1219
|
+
operator: FilterOperator.EQ,
|
|
1220
|
+
value1: true
|
|
1221
|
+
}), getCheckControlInViewFilter()],
|
|
1222
|
+
and: true
|
|
1223
|
+
}); //Filter for filtering out the bound messages i.e target starts with the context path
|
|
1224
|
+
|
|
1225
|
+
oValidationAndContextFilter = new Filter({
|
|
1226
|
+
filters: [oValidationFilters, new Filter({
|
|
1227
|
+
path: "target",
|
|
1228
|
+
operator: FilterOperator.StartsWith,
|
|
1229
|
+
value1: sPath
|
|
1230
|
+
})],
|
|
1231
|
+
and: false
|
|
1232
|
+
});
|
|
1233
|
+
oDialogFilter = new Filter({
|
|
1234
|
+
filters: [filterOutMessagesInDialog()]
|
|
1235
|
+
});
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1238
|
+
var oValidationContextDialogFilters = new Filter({
|
|
1239
|
+
filters: [oValidationAndContextFilter, oDialogFilter],
|
|
1240
|
+
and: true
|
|
1241
|
+
}); // and finally - if there any - add custom filter (via OR)
|
|
1242
|
+
|
|
1243
|
+
if (aUserDefinedFilter.length > 0) {
|
|
1244
|
+
oFilters = new Filter({
|
|
1245
|
+
filters: [aUserDefinedFilter, oValidationContextDialogFilters],
|
|
1246
|
+
and: false
|
|
1247
|
+
});
|
|
1248
|
+
} else {
|
|
1249
|
+
oFilters = oValidationContextDialogFilters;
|
|
1250
|
+
}
|
|
1251
|
+
|
|
1252
|
+
this.oItemBinding.filter(oFilters);
|
|
1253
|
+
this.oObjectPageLayout = this._getObjectPageLayout(this, this.oObjectPageLayout); // We support sorting only for ObjectPageLayout use-case.
|
|
1254
|
+
|
|
1255
|
+
if (this.oObjectPageLayout) {
|
|
1256
|
+
var that = this;
|
|
1257
|
+
oSorter = new Sorter("", null, null, function (obj1, obj2) {
|
|
1258
|
+
if (!objectPageLayoutSections) {
|
|
1259
|
+
objectPageLayoutSections = that.oObjectPageLayout && that.oObjectPageLayout.getSections();
|
|
1260
|
+
}
|
|
1261
|
+
|
|
1262
|
+
var rankA = that._getMessageRank(obj1, objectPageLayoutSections);
|
|
1263
|
+
|
|
1264
|
+
var rankB = that._getMessageRank(obj2, objectPageLayoutSections);
|
|
1265
|
+
|
|
1266
|
+
if (rankA < rankB) {
|
|
1267
|
+
return -1;
|
|
1268
|
+
}
|
|
1269
|
+
|
|
1270
|
+
if (rankA > rankB) {
|
|
1271
|
+
return 1;
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
return 0;
|
|
1275
|
+
});
|
|
1276
|
+
this.oItemBinding.sort(oSorter);
|
|
1277
|
+
}
|
|
1278
|
+
}
|
|
1279
|
+
/**
|
|
1280
|
+
*
|
|
1281
|
+
* @param {object} sControlId
|
|
1282
|
+
* @param {object} oItem
|
|
1283
|
+
*
|
|
1284
|
+
* @returns {boolean} True if the control ID matches the item ID
|
|
1285
|
+
*/
|
|
1286
|
+
;
|
|
1287
|
+
|
|
1288
|
+
_proto._fnFilterUponId = function _fnFilterUponId(sControlId, oItem) {
|
|
1289
|
+
return sControlId === oItem.getId();
|
|
1290
|
+
}
|
|
1291
|
+
/**
|
|
1292
|
+
*
|
|
1293
|
+
* @param {Array} aControlIds
|
|
1294
|
+
* @param {object} oItem
|
|
1295
|
+
*
|
|
1296
|
+
* @returns {boolean} True if matches the item ID matcheds with one of the controlIds
|
|
1297
|
+
*/
|
|
1298
|
+
;
|
|
1299
|
+
|
|
1300
|
+
_proto._fnFilterUponIds = function _fnFilterUponIds(aControlIds, oItem) {
|
|
1301
|
+
return aControlIds.some(function (sControlId) {
|
|
1302
|
+
if (sControlId === oItem.getId()) {
|
|
1303
|
+
return true;
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
return false;
|
|
1307
|
+
});
|
|
1308
|
+
}
|
|
1309
|
+
/**
|
|
1310
|
+
* Retrieves the section based on section title and visibility.
|
|
1311
|
+
*
|
|
1312
|
+
* @param {object} oObjectPage Object page.
|
|
1313
|
+
* @param {string} sSectionTitle Section title.
|
|
1314
|
+
* @returns {object}
|
|
1315
|
+
* @private
|
|
1316
|
+
* @ignore
|
|
1317
|
+
*/
|
|
1318
|
+
;
|
|
1319
|
+
|
|
1320
|
+
_proto._getSectionBySectionTitle = function _getSectionBySectionTitle(oObjectPage, sSectionTitle) {
|
|
1321
|
+
if (sSectionTitle) {
|
|
1322
|
+
var aSections = oObjectPage.getSections();
|
|
1323
|
+
var oSection;
|
|
1324
|
+
|
|
1325
|
+
for (var i = 0; i < aSections.length; i++) {
|
|
1326
|
+
if (aSections[i].getVisible() && aSections[i].getTitle() === sSectionTitle) {
|
|
1327
|
+
oSection = aSections[i];
|
|
1328
|
+
break;
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1332
|
+
return oSection;
|
|
1333
|
+
}
|
|
1334
|
+
}
|
|
1335
|
+
/**
|
|
1336
|
+
* Navigates to the section if the object page uses an IconTabBar and if the current section is not the target of the navigation.
|
|
1337
|
+
*
|
|
1338
|
+
* @param {object} oObjectPage Object page.
|
|
1339
|
+
* @param {string} sSectionTitle Section title.
|
|
1340
|
+
* @private
|
|
1341
|
+
* @ignore
|
|
1342
|
+
*/
|
|
1343
|
+
;
|
|
1344
|
+
|
|
1345
|
+
_proto._navigateFromMessageToSectionInIconTabBarMode = function _navigateFromMessageToSectionInIconTabBarMode(oObjectPage, sSectionTitle) {
|
|
1346
|
+
var bUseIconTabBar = oObjectPage.getUseIconTabBar();
|
|
1347
|
+
|
|
1348
|
+
if (bUseIconTabBar) {
|
|
1349
|
+
var oSection = this._getSectionBySectionTitle(oObjectPage, sSectionTitle);
|
|
1350
|
+
|
|
1351
|
+
var sSelectedSectionId = oObjectPage.getSelectedSection();
|
|
1352
|
+
|
|
1353
|
+
if (oSection && sSelectedSectionId !== oSection.getId()) {
|
|
1354
|
+
oObjectPage.setSelectedSection(oSection.getId());
|
|
1355
|
+
}
|
|
1356
|
+
}
|
|
1357
|
+
};
|
|
1358
|
+
|
|
1359
|
+
_proto._navigateFromMessageToSectionTableInIconTabBarMode = function _navigateFromMessageToSectionTableInIconTabBarMode(oTable, oObjectPage, sSectionTitle) {
|
|
1360
|
+
var oRowBinding = oTable.getRowBinding();
|
|
1361
|
+
var oTableContext = oTable.getBindingContext();
|
|
1362
|
+
var oOPContext = oObjectPage.getBindingContext();
|
|
1363
|
+
var bShouldWaitForTableRefresh = !(oTableContext === oOPContext);
|
|
1364
|
+
|
|
1365
|
+
this._navigateFromMessageToSectionInIconTabBarMode(oObjectPage, sSectionTitle);
|
|
1366
|
+
|
|
1367
|
+
return new Promise(function (resolve) {
|
|
1368
|
+
if (bShouldWaitForTableRefresh) {
|
|
1369
|
+
oRowBinding.attachEventOnce("change", function () {
|
|
1370
|
+
resolve();
|
|
1371
|
+
});
|
|
1372
|
+
} else {
|
|
1373
|
+
resolve();
|
|
1374
|
+
}
|
|
1375
|
+
});
|
|
1376
|
+
}
|
|
1377
|
+
/**
|
|
1378
|
+
* Retrieves the MDC table if it is found among any of the parent elements.
|
|
1379
|
+
*
|
|
1380
|
+
* @param {object} oElement Control
|
|
1381
|
+
* @returns {object} MDC table || undefined
|
|
1382
|
+
* @private
|
|
1383
|
+
* @ignore
|
|
1384
|
+
*/
|
|
1385
|
+
;
|
|
1386
|
+
|
|
1387
|
+
_proto._getMdcTable = function _getMdcTable(oElement) {
|
|
1388
|
+
//check if the element has a table within any of its parents
|
|
1389
|
+
var oParentElement = oElement.getParent();
|
|
1390
|
+
|
|
1391
|
+
while (oParentElement && !oParentElement.isA("sap.ui.mdc.Table")) {
|
|
1392
|
+
oParentElement = oParentElement.getParent();
|
|
1393
|
+
}
|
|
1394
|
+
|
|
1395
|
+
var oMdcTable = oParentElement && oParentElement.isA("sap.ui.mdc.Table") ? oParentElement : undefined;
|
|
1396
|
+
return oMdcTable;
|
|
1397
|
+
};
|
|
1398
|
+
|
|
1399
|
+
_proto._getGridTable = function _getGridTable(oMdcTable) {
|
|
1400
|
+
return oMdcTable.findElements(true, function (oElem) {
|
|
1401
|
+
return oElem.isA("sap.ui.table.Table") &&
|
|
1402
|
+
/** We check the element belongs to the Mdc Table :*/
|
|
1403
|
+
oElem.getParent() === oMdcTable;
|
|
1404
|
+
})[0];
|
|
1405
|
+
}
|
|
1406
|
+
/**
|
|
1407
|
+
* Retrieves the table row (if available) containing the element.
|
|
1408
|
+
*
|
|
1409
|
+
* @param {object} oElement Control
|
|
1410
|
+
* @returns {object} Table row || undefined
|
|
1411
|
+
* @private
|
|
1412
|
+
* @ignore
|
|
1413
|
+
*/
|
|
1414
|
+
;
|
|
1415
|
+
|
|
1416
|
+
_proto._getTableRow = function _getTableRow(oElement) {
|
|
1417
|
+
var oParentElement = oElement.getParent();
|
|
1418
|
+
|
|
1419
|
+
while (oParentElement && !oParentElement.isA("sap.ui.table.Row") && !oParentElement.isA("sap.ui.table.CreationRow") && !oParentElement.isA("sap.m.ColumnListItem")) {
|
|
1420
|
+
oParentElement = oParentElement.getParent();
|
|
1421
|
+
}
|
|
1422
|
+
|
|
1423
|
+
var oTableRow = oParentElement && (oParentElement.isA("sap.ui.table.Row") || oParentElement.isA("sap.ui.table.CreationRow") || oParentElement.isA("sap.m.ColumnListItem")) ? oParentElement : undefined;
|
|
1424
|
+
return oTableRow;
|
|
1425
|
+
}
|
|
1426
|
+
/**
|
|
1427
|
+
* Retrieves the index of the table row containing the element.
|
|
1428
|
+
*
|
|
1429
|
+
* @param {object} oElement Control
|
|
1430
|
+
* @returns {object} Row index || undefined
|
|
1431
|
+
* @private
|
|
1432
|
+
* @ignore
|
|
1433
|
+
*/
|
|
1434
|
+
;
|
|
1435
|
+
|
|
1436
|
+
_proto._getTableRowIndex = function _getTableRowIndex(oElement) {
|
|
1437
|
+
var oTableRow = this._getTableRow(oElement);
|
|
1438
|
+
|
|
1439
|
+
var iRowIndex;
|
|
1440
|
+
|
|
1441
|
+
if (oTableRow.isA("sap.ui.table.Row")) {
|
|
1442
|
+
iRowIndex = oTableRow.getIndex();
|
|
1443
|
+
} else {
|
|
1444
|
+
iRowIndex = oTableRow.getTable().getItems().findIndex(function (element) {
|
|
1445
|
+
return element.getId() === oTableRow.getId();
|
|
1446
|
+
});
|
|
1447
|
+
}
|
|
1448
|
+
|
|
1449
|
+
return iRowIndex;
|
|
1450
|
+
}
|
|
1451
|
+
/**
|
|
1452
|
+
* Retrieves the index of the table column containing the element.
|
|
1453
|
+
*
|
|
1454
|
+
* @param {object} oElement Control
|
|
1455
|
+
* @returns {object} Column index || undefined
|
|
1456
|
+
* @private
|
|
1457
|
+
* @ignore
|
|
1458
|
+
*/
|
|
1459
|
+
;
|
|
1460
|
+
|
|
1461
|
+
_proto._getTableColumnIndex = function _getTableColumnIndex(oElement) {
|
|
1462
|
+
var getTargetCellIndex = function (oElement, oTargetRow) {
|
|
1463
|
+
return oTargetRow.getCells().findIndex(function (oCell) {
|
|
1464
|
+
return oCell.getId() === oElement.getId();
|
|
1465
|
+
});
|
|
1466
|
+
};
|
|
1467
|
+
|
|
1468
|
+
var getTargetColumnIndex = function (oElement, oTargetRow) {
|
|
1469
|
+
var oTargetElement = oElement.getParent(),
|
|
1470
|
+
iTargetCellIndex = getTargetCellIndex(oTargetElement, oTargetRow);
|
|
1471
|
+
|
|
1472
|
+
while (oTargetElement && iTargetCellIndex < 0) {
|
|
1473
|
+
oTargetElement = oTargetElement.getParent();
|
|
1474
|
+
iTargetCellIndex = getTargetCellIndex(oTargetElement, oTargetRow);
|
|
1475
|
+
}
|
|
1476
|
+
|
|
1477
|
+
return iTargetCellIndex;
|
|
1478
|
+
};
|
|
1479
|
+
|
|
1480
|
+
var oTargetRow = this._getTableRow(oElement);
|
|
1481
|
+
|
|
1482
|
+
var iTargetColumnIndex;
|
|
1483
|
+
iTargetColumnIndex = getTargetColumnIndex(oElement, oTargetRow);
|
|
1484
|
+
|
|
1485
|
+
if (oTargetRow.isA("sap.ui.table.CreationRow")) {
|
|
1486
|
+
var sTargetCellId = oTargetRow.getCells()[iTargetColumnIndex].getId(),
|
|
1487
|
+
aTableColumns = oTargetRow.getTable().getColumns();
|
|
1488
|
+
iTargetColumnIndex = aTableColumns.findIndex(function (column) {
|
|
1489
|
+
if (column.getCreationTemplate()) {
|
|
1490
|
+
return sTargetCellId.search(column.getCreationTemplate().getId()) > -1 ? true : false;
|
|
1491
|
+
} else {
|
|
1492
|
+
return false;
|
|
1493
|
+
}
|
|
1494
|
+
});
|
|
1495
|
+
}
|
|
1496
|
+
|
|
1497
|
+
return iTargetColumnIndex;
|
|
1498
|
+
};
|
|
1499
|
+
|
|
1500
|
+
_proto._getMdcTableRows = function _getMdcTableRows(oMdcTable) {
|
|
1501
|
+
return oMdcTable.findElements(true, function (oElem) {
|
|
1502
|
+
return oElem.isA("sap.ui.table.Row") &&
|
|
1503
|
+
/** We check the element belongs to the Mdc Table :*/
|
|
1504
|
+
oElem.getTable().getParent() === oMdcTable;
|
|
1505
|
+
});
|
|
1506
|
+
};
|
|
1507
|
+
|
|
1508
|
+
_proto._getTableColProperty = function _getTableColProperty(oTable, oMessageObject) {
|
|
1509
|
+
//this function escapes a string to use it as a regex
|
|
1510
|
+
var fnRegExpescape = function (s) {
|
|
1511
|
+
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
|
|
1512
|
+
}; // based on the target path of the message we retrieve the property name.
|
|
1513
|
+
// to achieve it we remove the bindingContext path and the row binding path from the target
|
|
1514
|
+
|
|
1515
|
+
|
|
1516
|
+
var sTableTargetColProperty = oMessageObject.getTarget().replace(new RegExp(fnRegExpescape(oTable.getBindingContext().getPath() + "/" + oTable.getRowBinding().getPath()) + "\\(.*\\)/"), "");
|
|
1517
|
+
return sTableTargetColProperty;
|
|
1518
|
+
};
|
|
1519
|
+
|
|
1520
|
+
_proto._getObjectPageLayout = function _getObjectPageLayout(oElement, oObjectPageLayout) {
|
|
1521
|
+
if (oObjectPageLayout) {
|
|
1522
|
+
return oObjectPageLayout;
|
|
1523
|
+
}
|
|
1524
|
+
|
|
1525
|
+
oObjectPageLayout = oElement; //Iterate over parent till you have not reached the object page layout
|
|
1526
|
+
|
|
1527
|
+
while (oObjectPageLayout && !oObjectPageLayout.isA("sap.uxap.ObjectPageLayout")) {
|
|
1528
|
+
oObjectPageLayout = oObjectPageLayout.getParent();
|
|
1529
|
+
}
|
|
1530
|
+
|
|
1531
|
+
return oObjectPageLayout;
|
|
1532
|
+
};
|
|
1533
|
+
|
|
1534
|
+
_proto._getCustomColumnInfo = function _getCustomColumnInfo(oTable, iPosition) {
|
|
1535
|
+
var sTableColProperty = oTable.getColumns()[iPosition].getDataProperty();
|
|
1536
|
+
var oCustomColumn = oTable.getControlDelegate().getColumnsFor(oTable).find(function (oColumn) {
|
|
1537
|
+
return oColumn.name === sTableColProperty && !!oColumn.template;
|
|
1538
|
+
});
|
|
1539
|
+
return oCustomColumn;
|
|
1540
|
+
};
|
|
1541
|
+
|
|
1542
|
+
_proto._getTableFirstColProperty = function _getTableFirstColProperty(oTable) {
|
|
1543
|
+
var oCustomColumnInfo = this._getCustomColumnInfo(oTable, 0);
|
|
1544
|
+
|
|
1545
|
+
var sTableFirstColProperty;
|
|
1546
|
+
|
|
1547
|
+
if (oCustomColumnInfo) {
|
|
1548
|
+
if (oCustomColumnInfo.propertyInfos) {
|
|
1549
|
+
sTableFirstColProperty = oCustomColumnInfo.propertyInfos[0].replace("Property::", "");
|
|
1550
|
+
} else {
|
|
1551
|
+
sTableFirstColProperty = undefined;
|
|
1552
|
+
}
|
|
1553
|
+
} else {
|
|
1554
|
+
sTableFirstColProperty = oTable.getColumns()[0].getDataProperty();
|
|
1555
|
+
}
|
|
1556
|
+
|
|
1557
|
+
return sTableFirstColProperty;
|
|
1558
|
+
};
|
|
1559
|
+
|
|
1560
|
+
_proto._getTableFirstColBindingContextForTextAnnotation = function _getTableFirstColBindingContextForTextAnnotation(oTable, oTableRowContext, sTableFirstColProperty) {
|
|
1561
|
+
var oBindingContext;
|
|
1562
|
+
|
|
1563
|
+
if (oTableRowContext && sTableFirstColProperty) {
|
|
1564
|
+
var oModel = oTable.getModel();
|
|
1565
|
+
var oMetaModel = oModel.getMetaModel();
|
|
1566
|
+
var sMetaPath = oMetaModel.getMetaPath(oTableRowContext.getPath());
|
|
1567
|
+
|
|
1568
|
+
if (oMetaModel.getObject(sMetaPath + "/" + sTableFirstColProperty + "@com.sap.vocabularies.Common.v1.Text/$Path")) {
|
|
1569
|
+
oBindingContext = oMetaModel.createBindingContext(sMetaPath + "/" + sTableFirstColProperty + "@com.sap.vocabularies.Common.v1.Text");
|
|
1570
|
+
}
|
|
1571
|
+
}
|
|
1572
|
+
|
|
1573
|
+
return oBindingContext;
|
|
1574
|
+
};
|
|
1575
|
+
|
|
1576
|
+
_proto._getTableFirstColValue = function _getTableFirstColValue(sTableFirstColProperty, oTableRowContext, sTextAnnotationPath, sTextArrangement) {
|
|
1577
|
+
var sCodeValue = oTableRowContext.getValue(sTableFirstColProperty);
|
|
1578
|
+
var sTextValue;
|
|
1579
|
+
var sComputedValue = sCodeValue;
|
|
1580
|
+
|
|
1581
|
+
if (sTextAnnotationPath) {
|
|
1582
|
+
if (sTableFirstColProperty.lastIndexOf("/") > 0) {
|
|
1583
|
+
// the target property is replaced with the text annotation path
|
|
1584
|
+
sTableFirstColProperty = sTableFirstColProperty.slice(0, sTableFirstColProperty.lastIndexOf("/") + 1);
|
|
1585
|
+
sTableFirstColProperty = sTableFirstColProperty.concat(sTextAnnotationPath);
|
|
1586
|
+
} else {
|
|
1587
|
+
sTableFirstColProperty = sTextAnnotationPath;
|
|
1588
|
+
}
|
|
1589
|
+
|
|
1590
|
+
sTextValue = oTableRowContext.getValue(sTableFirstColProperty);
|
|
1591
|
+
|
|
1592
|
+
if (sTextValue) {
|
|
1593
|
+
if (sTextArrangement) {
|
|
1594
|
+
var sEnumNumber = sTextArrangement.slice(sTextArrangement.indexOf("/") + 1);
|
|
1595
|
+
|
|
1596
|
+
switch (sEnumNumber) {
|
|
1597
|
+
case "TextOnly":
|
|
1598
|
+
sComputedValue = sTextValue;
|
|
1599
|
+
break;
|
|
1600
|
+
|
|
1601
|
+
case "TextFirst":
|
|
1602
|
+
sComputedValue = sTextValue + " (" + sCodeValue + ")";
|
|
1603
|
+
break;
|
|
1604
|
+
|
|
1605
|
+
case "TextLast":
|
|
1606
|
+
sComputedValue = sCodeValue + " (" + sTextValue + ")";
|
|
1607
|
+
break;
|
|
1608
|
+
|
|
1609
|
+
case "TextSeparate":
|
|
1610
|
+
sComputedValue = sCodeValue;
|
|
1611
|
+
break;
|
|
1612
|
+
|
|
1613
|
+
default:
|
|
1614
|
+
}
|
|
1615
|
+
} else {
|
|
1616
|
+
sComputedValue = sTextValue + " (" + sCodeValue + ")";
|
|
1617
|
+
}
|
|
1618
|
+
}
|
|
1619
|
+
}
|
|
1620
|
+
|
|
1621
|
+
return sComputedValue;
|
|
1622
|
+
};
|
|
1623
|
+
|
|
1624
|
+
_proto._IsControlInTable = function _IsControlInTable(oTable, sControlId) {
|
|
1625
|
+
var oControl = sap.ui.getCore().byId(sControlId);
|
|
1626
|
+
|
|
1627
|
+
if (oControl && !oControl.isA("sap.ui.table.Table") && !oControl.isA("sap.m.Table")) {
|
|
1628
|
+
return oTable.findElements(true, function (oElem) {
|
|
1629
|
+
return oElem.getId() === oControl;
|
|
1630
|
+
});
|
|
1631
|
+
}
|
|
1632
|
+
|
|
1633
|
+
return false;
|
|
1634
|
+
};
|
|
1635
|
+
|
|
1636
|
+
_proto._IsControlPartOfCreationRow = function _IsControlPartOfCreationRow(oControl) {
|
|
1637
|
+
var oParentControl = oControl.getParent();
|
|
1638
|
+
|
|
1639
|
+
while (oParentControl && !oParentControl.isA("sap.ui.table.Row") && !oParentControl.isA("sap.ui.table.CreationRow") && !oParentControl.isA("sap.m.ColumnListItem")) {
|
|
1640
|
+
oParentControl = oParentControl.getParent();
|
|
1641
|
+
}
|
|
1642
|
+
|
|
1643
|
+
return !!oParentControl && oParentControl.isA("sap.ui.table.CreationRow");
|
|
1644
|
+
}
|
|
1645
|
+
/**
|
|
1646
|
+
* The method that is called to retrive the column info for associated messages in message popover.
|
|
1647
|
+
* @private
|
|
1648
|
+
* @param {oMessage} oMessage Message object
|
|
1649
|
+
* @param {oTable} oTable MDC Table
|
|
1650
|
+
* @returns {oColFromTableSettings} Returns the column info.
|
|
1651
|
+
*/
|
|
1652
|
+
;
|
|
1653
|
+
|
|
1654
|
+
_proto._fetchColumnInfo = function _fetchColumnInfo(oMessage, oTable) {
|
|
1655
|
+
var sColNameFromMessageObj = oMessage.getBindingContext("message").getObject().getTarget().split("/").pop();
|
|
1656
|
+
var oColFromTableSettings = oTable.getParent().getTableDefinition().columns.find(function (oColumn) {
|
|
1657
|
+
return oColumn.key.split("::").pop() === sColNameFromMessageObj;
|
|
1658
|
+
});
|
|
1659
|
+
return oColFromTableSettings;
|
|
1660
|
+
};
|
|
1661
|
+
|
|
1662
|
+
_proto._setMessageSubtitle = function _setMessageSubtitle(message, oTableRowBindingContexts, oTableRowContext, sTableTargetColName, oResourceBundle, sTableTargetProperty, oTable, bIsCreationRow) {
|
|
1663
|
+
var sMessageSubtitle;
|
|
1664
|
+
var sRowSubtitleValue, sColumnSubtitleText;
|
|
1665
|
+
|
|
1666
|
+
var sTableFirstColProperty = this._getTableFirstColProperty(oTable);
|
|
1667
|
+
|
|
1668
|
+
var oColFromTableSettings = this._fetchColumnInfo(message, oTable);
|
|
1669
|
+
|
|
1670
|
+
if (bIsCreationRow) {
|
|
1671
|
+
sMessageSubtitle = CommonUtils.getTranslatedText("T_MESSAGE_ITEM_SUBTITLE", oResourceBundle, [oResourceBundle.getText("T_MESSAGE_ITEM_SUBTITLE_CREATION_ROW_INDICATOR"), sTableTargetColName ? sTableTargetColName : oColFromTableSettings.label]);
|
|
1672
|
+
} else {
|
|
1673
|
+
var oTableFirstColBindingContextTextAnnotation = this._getTableFirstColBindingContextForTextAnnotation(oTable, oTableRowContext, sTableFirstColProperty);
|
|
1674
|
+
|
|
1675
|
+
var sTableFirstColTextAnnotationPath = oTableFirstColBindingContextTextAnnotation ? oTableFirstColBindingContextTextAnnotation.getObject("$Path") : undefined;
|
|
1676
|
+
var sTableFirstColTextArrangement = sTableFirstColTextAnnotationPath && oTableFirstColBindingContextTextAnnotation ? oTableFirstColBindingContextTextAnnotation.getObject("@com.sap.vocabularies.UI.v1.TextArrangement/$EnumMember") : undefined;
|
|
1677
|
+
|
|
1678
|
+
if (oTableRowBindingContexts.length > 0) {
|
|
1679
|
+
// set Row subtitle text
|
|
1680
|
+
if (oTableRowContext && sTableFirstColProperty) {
|
|
1681
|
+
sRowSubtitleValue = this._getTableFirstColValue(sTableFirstColProperty, oTableRowContext, sTableFirstColTextAnnotationPath, sTableFirstColTextArrangement);
|
|
1682
|
+
} else {
|
|
1683
|
+
sRowSubtitleValue = oResourceBundle.getText("T_MESSAGE_ITEM_SUBTITLE_INDICATOR_UNKNOWN");
|
|
1684
|
+
} // set the message subtitle
|
|
1685
|
+
|
|
1686
|
+
|
|
1687
|
+
if (sTableTargetColName) {
|
|
1688
|
+
// if column is present in table definition
|
|
1689
|
+
sMessageSubtitle = CommonUtils.getTranslatedText("T_MESSAGE_ITEM_SUBTITLE", oResourceBundle, [sRowSubtitleValue, sTableTargetColName]);
|
|
1690
|
+
} else if (oColFromTableSettings) {
|
|
1691
|
+
// if column is neither in table definition nor personalization, show only row subtitle text
|
|
1692
|
+
if (oColFromTableSettings.availability === "Hidden") {
|
|
1693
|
+
sMessageSubtitle = oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_ROW") + ": " + sRowSubtitleValue;
|
|
1694
|
+
} else {
|
|
1695
|
+
//if column is in table personalization but not in table definition, show Column (Hidden) : <colName>
|
|
1696
|
+
sColumnSubtitleText = oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_COLUMN") + " (" + oResourceBundle.getText("T_COLUMN_INDICATOR_IN_TABLE_DEFINITION") + "): " + oColFromTableSettings.label;
|
|
1697
|
+
sMessageSubtitle = oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_ROW") + ": " + sRowSubtitleValue + ", " + sColumnSubtitleText;
|
|
1698
|
+
}
|
|
1699
|
+
} else {
|
|
1700
|
+
sMessageSubtitle = CommonUtils.getTranslatedText("T_MESSAGE_ITEM_SUBTITLE", oResourceBundle, [sRowSubtitleValue, oResourceBundle.getText("T_MESSAGE_ITEM_SUBTITLE_INDICATOR_UNKNOWN")]);
|
|
1701
|
+
}
|
|
1702
|
+
} else {
|
|
1703
|
+
sMessageSubtitle = null;
|
|
1704
|
+
}
|
|
1705
|
+
} //set the subtitle
|
|
1706
|
+
|
|
1707
|
+
|
|
1708
|
+
message.setSubtitle(sMessageSubtitle);
|
|
1709
|
+
var oTableProperties = Object.keys(oTable.getModel().getMetaModel().getObject(oTable.data("entityType"))); // TODO: this logic would be moved to check the same at the template time to avoid the same check happening multiple times
|
|
1710
|
+
|
|
1711
|
+
var oComponent = sap.ui.require("sap/ui/core/Component");
|
|
1712
|
+
|
|
1713
|
+
var oNavObject = oTable && oComponent.getOwnerComponentFor(oTable) && oComponent.getOwnerComponentFor(oTable).getNavigation();
|
|
1714
|
+
var bSubOPConfigured = false;
|
|
1715
|
+
|
|
1716
|
+
if (oNavObject && Object.keys(oNavObject).indexOf(oTable.getRowBinding().sPath) != -1) {
|
|
1717
|
+
bSubOPConfigured = oNavObject[oTable.getRowBinding().sPath] && oNavObject[oTable.getRowBinding().sPath].detail && oNavObject[oTable.getRowBinding().sPath].detail.route ? true : false;
|
|
1718
|
+
}
|
|
1719
|
+
|
|
1720
|
+
var bIsNavigationConfigured = bSubOPConfigured && oTable.getRowAction() && oTable.getRowAction().indexOf("Navigation") != -1 && oTableProperties.indexOf(sTableTargetProperty) != -1 ? true : false; // Deactivation of the error link when the error column is not displayed
|
|
1721
|
+
// but The Link should be displayed if there is no subtitle
|
|
1722
|
+
|
|
1723
|
+
message.setActiveTitle(!sMessageSubtitle || bIsNavigationConfigured || bIsCreationRow || (!!sTableTargetColName ? !!oTableRowContext : !!sTableTargetColName));
|
|
1724
|
+
return sMessageSubtitle;
|
|
1725
|
+
};
|
|
1726
|
+
|
|
1727
|
+
_proto._removeMessage = function _removeMessage(oMessage) {
|
|
1728
|
+
var oTemp = sap.ui.getCore().getMessageManager().getMessageModel().getData();
|
|
1729
|
+
sap.ui.getCore().getMessageManager().removeAllMessages();
|
|
1730
|
+
oTemp.forEach(function (message) {
|
|
1731
|
+
if (message !== oMessage) {
|
|
1732
|
+
sap.ui.getCore().getMessageManager().addMessages([message]);
|
|
1733
|
+
}
|
|
1734
|
+
});
|
|
1735
|
+
};
|
|
1736
|
+
|
|
1737
|
+
return MessageButton;
|
|
1738
|
+
}(Button), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "customFilters", [_dec2], {
|
|
1739
|
+
configurable: true,
|
|
1740
|
+
enumerable: true,
|
|
1741
|
+
writable: true,
|
|
1742
|
+
initializer: null
|
|
1743
|
+
}), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "messageChange", [Event], {
|
|
1744
|
+
configurable: true,
|
|
1745
|
+
enumerable: true,
|
|
1746
|
+
writable: true,
|
|
1747
|
+
initializer: null
|
|
1748
|
+
})), _class2)) || _class);
|
|
1749
|
+
return MessageButton;
|
|
1750
|
+
}, false);
|
|
1751
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1lc3NhZ2VCdXR0b24udHMiXSwibmFtZXMiOlsiQnV0dG9uVHlwZSIsIm1MaWIiLCJNZXNzYWdlVHlwZSIsImNvcmVMaWIiLCJNZXNzYWdlQnV0dG9uIiwiVUk1Q2xhc3MiLCJBZ2dyZWdhdGlvbiIsInR5cGUiLCJtdWx0aXBsZSIsInNpbmd1bGFyTmFtZSIsInNMYXN0QWN0aW9uVGV4dCIsInNHZW5lcmFsR3JvdXBUZXh0Iiwic1ZpZXdJZCIsImluaXQiLCJCdXR0b24iLCJwcm90b3R5cGUiLCJhcHBseSIsImF0dGFjaFByZXNzIiwiaGFuZGxlTWVzc2FnZVBvcG92ZXJQcmVzcyIsIm9NZXNzYWdlUG9wb3ZlciIsIk1lc3NhZ2VQb3BvdmVyIiwib0l0ZW1CaW5kaW5nIiwiZ2V0QmluZGluZyIsImF0dGFjaENoYW5nZSIsIl9zZXRNZXNzYWdlRGF0YSIsIm1lc3NhZ2VCdXR0b25JZCIsImdldElkIiwiYWRkQ3VzdG9tRGF0YSIsInNhcCIsInVpIiwiY29yZSIsIkN1c3RvbURhdGEiLCJrZXkiLCJ2YWx1ZSIsImF0dGFjaE1vZGVsQ29udGV4dENoYW5nZSIsIl9hcHBseUZpbHRlcnNBbmRTb3J0IiwiYmluZCIsImF0dGFjaEFjdGl2ZVRpdGxlUHJlc3MiLCJfYWN0aXZlVGl0bGVQcmVzcyIsIm9FdmVudCIsInRvZ2dsZSIsImdldFNvdXJjZSIsIl9hcHBseUdyb3VwaW5nQXN5bmMiLCJvVmlldyIsInRoYXQiLCJhV2FpdEZvckRhdGEiLCJvVmlld0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJfZmluZFRhYmxlc1JlbGF0ZWRUb01lc3NhZ2VzIiwib1JlcyIsImFNZXNzYWdlcyIsImdldENvbnRleHRzIiwibWFwIiwib0NvbnRleHQiLCJnZXRPYmplY3QiLCJvVmlld0NvbnRleHQiLCJvT2JqZWN0UGFnZSIsImdldENvbnRlbnQiLCJnZXRWaXNpYmxlU2VjdGlvbnNGcm9tT2JqZWN0UGFnZUxheW91dCIsImZvckVhY2giLCJvU2VjdGlvbiIsImdldFN1YlNlY3Rpb25zIiwib1N1YlNlY3Rpb24iLCJmaW5kRWxlbWVudHMiLCJvRWxlbSIsImlzQSIsImkiLCJsZW5ndGgiLCJvUm93QmluZGluZyIsImdldFJvd0JpbmRpbmciLCJzRWxlbWVCaW5kaW5nUGF0aCIsImdldFBhdGgiLCJ0YXJnZXQiLCJpbmRleE9mIiwicHVzaCIsInRhYmxlIiwic3Vic2VjdGlvbiIsIm9UYWJsZXMiLCJfb1RhYmxlIiwib01EQ1RhYmxlIiwib1N1YnNlY3Rpb24iLCJzZXRCaW5kaW5nQ29udGV4dCIsImlzTGVuZ3RoRmluYWwiLCJQcm9taXNlIiwicmVzb2x2ZSIsImF0dGFjaEV2ZW50T25jZSIsImFsbCIsInRoZW4iLCJnZXRNb2RlbCIsImNoZWNrTWVzc2FnZXMiLCJzZXRUaW1lb3V0IiwiX2FwcGx5R3JvdXBpbmciLCJjYXRjaCIsIkxvZyIsImVycm9yIiwib09iamVjdFBhZ2VMYXlvdXQiLCJnZXRTZWN0aW9ucyIsImZpbHRlciIsImdldFZpc2libGUiLCJfZ2V0T2JqZWN0UGFnZUxheW91dCIsImdldEl0ZW1zIiwiYVNlY3Rpb25zIiwiYkVuYWJsZUJpbmRpbmciLCJfY2hlY2tDb250cm9sSWRJblNlY3Rpb25zIiwiX2ZuRW5hYmxlQmluZGluZ3MiLCJfZ2V0VGFibGVSZWZFcnJvckNvbnRleHQiLCJvVGFibGUiLCJvTW9kZWwiLCJnZXRQcm9wZXJ0eSIsInNldFByb3BlcnR5Iiwic1JlZkVycm9yQ29udGV4dFBhdGgiLCJyZXBsYWNlIiwiZ2V0Q29udGV4dCIsIl9nZXRCYWNrZW5kTWVzc2FnZVRvUmVtb3ZlIiwib01lc3NhZ2VPYmplY3QiLCJvRXJyb3JDb250ZXh0Iiwib0JhY2tlbmRNZXNzYWdlVG9SZW1vdmUiLCJhTWVzc2FnZUlkcyIsIk9iamVjdCIsImtleXMiLCJldmVyeSIsImNoaWxkS2V5IiwiYVZhbGlkTWVzc2FnZUlkcyIsImdldENvcmUiLCJnZXRNZXNzYWdlTWFuYWdlciIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJtIiwiaWQiLCJfdXBkYXRlSW50ZXJuYWxNb2RlbCIsIm9UYWJsZVJvd0NvbnRleHQiLCJpUm93SW5kZXgiLCJzVGFibGVUYXJnZXRDb2xQcm9wZXJ0eSIsImJJc0NyZWF0aW9uUm93Iiwib1RlbXAiLCJyb3dJbmRleCIsInRhcmdldENvbFByb3BlcnR5IiwibWVzc2FnZSIsImFPYnNvbGV0ZU1lc3NhZ2VsSWRzIiwiaW50ZXJuYWxNZXNzYWdlSWQiLCJvYnNvbGV0ZUlkIiwiYXNzaWduIiwiX2dldENvbnRyb2xGcm9tTWVzc2FnZVJlbGF0aW5nVG9TdWJTZWN0aW9uIiwic3ViU2VjdGlvbiIsImFFbGVtZW50cyIsIl9mbkZpbHRlclVwb25JZHMiLCJnZXRDb250cm9sSWRzIiwic29ydCIsImEiLCJiIiwiX3NldEdyb3VwTGFiZWxGb3JUcmFuc2llbnRNc2ciLCJzQWN0aW9uTmFtZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsImdldFRleHQiLCJzZXRHcm91cE5hbWUiLCJfY29tcHV0ZU1lc3NhZ2VHcm91cEFuZFN1YlRpdGxlIiwic2VjdGlvbiIsImJNdWx0aXBsZVN1YlNlY3Rpb25zIiwiZGV0YWNoQ2hhbmdlIiwib0VsZW1lbnQiLCJvVGFyZ2V0VGFibGVJbmZvIiwibCIsIm9UYXJnZXRlZENvbnRyb2wiLCJiSXNCYWNrZW5kTWVzc2FnZSIsIlJlZ0V4cCIsInRlc3QiLCJnZXRUYXJnZXQiLCJvUmVzb3VyY2VCdW5kbGUiLCJnZXRQYXJlbnQiLCJ0YWJsZUhlYWRlciIsImdldEhlYWRlciIsIl9nZXRUYWJsZUNvbFByb3BlcnR5Iiwib1RhYmxlQ29sSW5mbyIsIl9nZXRUYWJsZUNvbEluZm8iLCJvVGFibGVSb3dCaW5kaW5nQ29udGV4dHMiLCJnZXRDdXJyZW50Q29udGV4dHMiLCJzVGFibGVUYXJnZXRDb2xOYW1lIiwic1RhYmxlVGFyZ2V0UHJvcGVydHkiLCJmaW5kIiwicm93Q29udGV4dCIsInNDb250cm9sSWQiLCJjb250cm9sSWRzIiwic0lkIiwiX0lzQ29udHJvbEluVGFibGUiLCJvQ29udHJvbCIsImJ5SWQiLCJfSXNDb250cm9sUGFydE9mQ3JlYXRpb25Sb3ciLCJfc2V0TWVzc2FnZVN1YnRpdGxlIiwiX2Zvcm1hdE1lc3NhZ2VEZXNjcmlwdGlvbiIsImdldEluZGV4Iiwic2V0QWN0aXZlVGl0bGUiLCJiSXNUYXJnZXRlZENvbnRyb2xPcnBoYW4iLCJfYklzT3JwaGFuRWxlbWVudCIsInNldFN1YnRpdGxlIiwiX2dldE1kY1RhYmxlIiwiaVRhcmdldENvbHVtbkluZGV4IiwiX2dldFRhYmxlQ29sdW1uSW5kZXgiLCJnZXRDb2x1bW5zIiwiZ2V0RGF0YVByb3BlcnR5IiwidW5kZWZpbmVkIiwiX2dldFRhYmxlUm93IiwiX2dldFRhYmxlUm93SW5kZXgiLCJwZXJzaXN0ZW50IiwiZ2V0VGl0bGUiLCJfZ2V0Vmlld0lkIiwib01lc3NhZ2VUYXJnZXRQcm9wZXJ0eSIsInNwbGl0IiwicG9wIiwib1VJTW9kZWwiLCJmaXJlQWN0aXZlVGl0bGVQcmVzcyIsIl9yZW1vdmVNZXNzYWdlIiwiYVN1YlNlY3Rpb25zIiwiaiIsImsiLCJhVmlzaWJsZVNlY3Rpb25zIiwidmlld0lkIiwiYklzR2VuZXJhbEdyb3VwTmFtZSIsImFDb250cm9scyIsImdldEdyb3VwTmFtZSIsIl9maW5kVGFyZ2V0Rm9yTWVzc2FnZSIsIm1lc3NhZ2VPYmplY3QiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiY29udGV4dFBhdGgiLCJnZXRNZXRhUGF0aCIsIm9Db250ZXh0UGF0aE1ldGFkYXRhIiwiJGtpbmQiLCJVcmlQYXJhbWV0ZXJzIiwiZnJvbVF1ZXJ5Iiwid2luZG93IiwibG9jYXRpb24iLCJzZWFyY2giLCJnZXQiLCJpU2VjdGlvbiIsIm5vblRhYmxlQ2hhcnRjb250cm9sRm91bmQiLCJpU3ViU2VjdGlvbiIsIm9BbGxCbG9ja3MiLCJnZXRCbG9ja3MiLCJibG9jayIsIl9maW5kTWVzc2FnZUdyb3VwQWZ0ZXJSZWJpbmRpbmciLCJhdHRhY2hEYXRhUmVjZWl2ZWQiLCJWaWV3IiwiX3NldExvbmd0ZXh0VXJsRGVzY3JpcHRpb24iLCJzTWVzc2FnZURlc2NyaXB0aW9uQ29udGVudCIsIm9EaWFnbm9zaXNUaXRsZSIsInNldEFzeW5jRGVzY3JpcHRpb25IYW5kbGVyIiwiY29uZmlnIiwic09sZERlc2NyaXB0aW9uIiwic0xvbmdUZXh0VXJsIiwiaXRlbSIsImdldExvbmd0ZXh0VXJsIiwialF1ZXJ5IiwiYWpheCIsInVybCIsInN1Y2Nlc3MiLCJkYXRhIiwic0RpYWdub3Npc1RleHQiLCJnZXRIdG1sVGV4dCIsInNldERlc2NyaXB0aW9uIiwicHJvbWlzZSIsInNFcnJvciIsInJlamVjdCIsInNUYWJsZUZpcnN0Q29sUHJvcGVydHkiLCJfZ2V0VGFibGVGaXJzdENvbFByb3BlcnR5Iiwic0NvbHVtbkluZm8iLCJvQ29sRnJvbVRhYmxlU2V0dGluZ3MiLCJfZmV0Y2hDb2x1bW5JbmZvIiwiYXZhaWxhYmlsaXR5IiwiZ2V0VHlwZSIsImdldFZhbHVlIiwibGFiZWwiLCJvRmllbGRzQWZmZWN0ZWRUaXRsZSIsIkZvcm1hdHRlZFRleHQiLCJodG1sVGV4dCIsInNGaWVsZEFmZmVjdGVkVGV4dCIsInNVSU1lc3NhZ2VEZXNjcmlwdGlvbiIsImRlc2NyaXB0aW9uIiwiY2xlYXJUaW1lb3V0IiwiX3NldE1lc3NhZ2VEYXRhVGltZW91dCIsInNJY29uIiwib01lc3NhZ2VzIiwib01lc3NhZ2VDb3VudCIsIkVycm9yIiwiV2FybmluZyIsIlN1Y2Nlc3MiLCJJbmZvcm1hdGlvbiIsImlNZXNzYWdlTGVuZ3RoIiwic0J1dHRvblR5cGUiLCJEZWZhdWx0Iiwic01lc3NhZ2VLZXkiLCJzVG9vbHRpcFRleHQiLCJzTWVzc2FnZVRleHQiLCJOZWdhdGl2ZSIsIkNyaXRpY2FsIiwiTmV1dHJhbCIsInNldFRleHQiLCJzZXRUb29sdGlwIiwic2V0SWNvbiIsInNldFR5cGUiLCJzZXRWaXNpYmxlIiwib1BhZ2VSZWFkeSIsImdldENvbnRyb2xsZXIiLCJwYWdlUmVhZHkiLCJ3YWl0UGFnZVJlYWR5IiwiZmluYWxseSIsImZpcmVNZXNzYWdlQ2hhbmdlIiwibmF2aWdhdGVCYWNrIiwic29tZSIsIm9QYXJlbnRFbGVtZW50Iiwib0ludGVybmFsTW9kZWxDb250ZXh0Iiwib0l0ZW0iLCJnZXRQYXJhbWV0ZXIiLCJvTWVzc2FnZSIsInNTZWN0aW9uVGl0bGUiLCJpc09wZW4iLCJjbG9zZSIsIl9mb2N1c09uTWVzc2FnZVRhcmdldENvbnRyb2wiLCJvVGFyZ2V0TWRjVGFibGUiLCJhQWxsVmlld0VsZW1lbnRzIiwiYUVycm9uZW91c0NvbnRyb2xzIiwiYU5vdFRhYmxlRXJyb25lb3VzQ29udHJvbHMiLCJmb2N1cyIsImFUYXJnZXRNZGNUYWJsZVJvdyIsIm9UYXJnZXRSb3ciLCJvVGFyZ2V0Q2VsbCIsIl9nZXRUYXJnZXRDZWxsIiwib1RhcmdldEZpZWxkIiwiZ2V0Q29udGVudEVkaXQiLCJlcnJvclByb3BlcnR5IiwiX3JvdXRpbmciLCJuYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQiLCJpc0NvbnRyb2xJblRhYmxlIiwicmVkdWNlIiwiYWNjIiwidmFsIiwib1BhcmVudENvbnRyb2wiLCJfbmF2aWdhdGVGcm9tTWVzc2FnZVRvU2VjdGlvblRhYmxlSW5JY29uVGFiQmFyTW9kZSIsIm9SZWZFcnJvckNvbnRleHQiLCJvUmVmRXJyb3IiLCJfc2V0Rm9jdXNPblRhcmdldEZpZWxkIiwiX2dldE1kY1RhYmxlUm93cyIsImlGaXJzdFZpc2libGVSb3ciLCJfZ2V0R3JpZFRhYmxlIiwiZ2V0Rmlyc3RWaXNpYmxlUm93IiwidGFyZ2V0Um93IiwidGFyZ2V0Q2VsbCIsInNjcm9sbFRvSW5kZXgiLCJpTmV3Rmlyc3RWaXNpYmxlUm93IiwiYlNjcm9sbE5lZWRlZCIsIm9XYWl0Q29udHJvbElkQWRkZWQiLCJhdHRhY2hFdmVudCIsIm9TZWxlY3RlZFNlY3Rpb24iLCJnZXRTZWxlY3RlZFNlY3Rpb24iLCJfbmF2aWdhdGVGcm9tTWVzc2FnZVRvU2VjdGlvbkluSWNvblRhYkJhck1vZGUiLCJvVGFibGVUYXJnZXRDb2wiLCJjb2x1bW4iLCJvQ3VzdG9tQ29sdW1uIiwiZ2V0Q29udHJvbERlbGVnYXRlIiwiZ2V0Q29sdW1uc0ZvciIsIm9Db2x1bW4iLCJ0ZW1wbGF0ZSIsInByb3BlcnR5SW5mb3MiLCJuYW1lIiwiYUNvbHVtbnMiLCJyZWxhdGl2ZVBhdGgiLCJiSXNUYWJsZVRhcmdldENvbFZpc2libGUiLCJfZ2V0TWVzc2FnZVJhbmsiLCJvYmoiLCJhQWxsRWxlbWVudHMiLCJzZWN0aW9uUmFuayIsIl9mbkZpbHRlclVwb25JZCIsImdldENvbnRyb2xJZCIsInNlY3Rpb25OYW1lIiwic3ViU2VjdGlvbk5hbWUiLCJvVmFsaWRhdGlvbkZpbHRlcnMiLCJvVmFsaWRhdGlvbkFuZENvbnRleHRGaWx0ZXIiLCJvRmlsdGVycyIsInNQYXRoIiwib1NvcnRlciIsIm9EaWFsb2dGaWx0ZXIiLCJvYmplY3RQYWdlTGF5b3V0U2VjdGlvbnMiLCJhVXNlckRlZmluZWRGaWx0ZXIiLCJmaWx0ZXJPdXRNZXNzYWdlc0luRGlhbG9nIiwiZm5UZXN0IiwiYUNvbnRyb2xJZHMiLCJpbmRleCIsIkluZmluaXR5IiwiZXJyb3JGaWVsZENvbnRyb2wiLCJmaWVsZFJhbmtpbkRpYWxvZyIsIkRpYWxvZyIsIkZpbHRlciIsInBhdGgiLCJjYXNlU2Vuc2l0aXZlIiwiZ2V0Q2hlY2tDb250cm9sSW5WaWV3RmlsdGVyIiwiYUN1c3RvbUZpbHRlcnMiLCJnZXRBZ2dyZWdhdGlvbiIsIm9wZXJhdG9yIiwidmFsdWUxIiwidmFsdWUyIiwib0JpbmRpbmdDb250ZXh0IiwiZmlsdGVycyIsIkZpbHRlck9wZXJhdG9yIiwiRVEiLCJhbmQiLCJTdGFydHNXaXRoIiwib1ZhbGlkYXRpb25Db250ZXh0RGlhbG9nRmlsdGVycyIsIlNvcnRlciIsIm9iajEiLCJvYmoyIiwicmFua0EiLCJyYW5rQiIsIl9nZXRTZWN0aW9uQnlTZWN0aW9uVGl0bGUiLCJiVXNlSWNvblRhYkJhciIsImdldFVzZUljb25UYWJCYXIiLCJzU2VsZWN0ZWRTZWN0aW9uSWQiLCJzZXRTZWxlY3RlZFNlY3Rpb24iLCJvVGFibGVDb250ZXh0Iiwib09QQ29udGV4dCIsImJTaG91bGRXYWl0Rm9yVGFibGVSZWZyZXNoIiwib01kY1RhYmxlIiwib1RhYmxlUm93IiwiZ2V0VGFibGUiLCJmaW5kSW5kZXgiLCJlbGVtZW50IiwiZ2V0VGFyZ2V0Q2VsbEluZGV4IiwiZ2V0Q2VsbHMiLCJvQ2VsbCIsImdldFRhcmdldENvbHVtbkluZGV4Iiwib1RhcmdldEVsZW1lbnQiLCJpVGFyZ2V0Q2VsbEluZGV4Iiwic1RhcmdldENlbGxJZCIsImFUYWJsZUNvbHVtbnMiLCJnZXRDcmVhdGlvblRlbXBsYXRlIiwiZm5SZWdFeHBlc2NhcGUiLCJzIiwiX2dldEN1c3RvbUNvbHVtbkluZm8iLCJpUG9zaXRpb24iLCJzVGFibGVDb2xQcm9wZXJ0eSIsIm9DdXN0b21Db2x1bW5JbmZvIiwiX2dldFRhYmxlRmlyc3RDb2xCaW5kaW5nQ29udGV4dEZvclRleHRBbm5vdGF0aW9uIiwic01ldGFQYXRoIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJfZ2V0VGFibGVGaXJzdENvbFZhbHVlIiwic1RleHRBbm5vdGF0aW9uUGF0aCIsInNUZXh0QXJyYW5nZW1lbnQiLCJzQ29kZVZhbHVlIiwic1RleHRWYWx1ZSIsInNDb21wdXRlZFZhbHVlIiwibGFzdEluZGV4T2YiLCJzbGljZSIsImNvbmNhdCIsInNFbnVtTnVtYmVyIiwic0NvbE5hbWVGcm9tTWVzc2FnZU9iaiIsImdldFRhYmxlRGVmaW5pdGlvbiIsImNvbHVtbnMiLCJzTWVzc2FnZVN1YnRpdGxlIiwic1Jvd1N1YnRpdGxlVmFsdWUiLCJzQ29sdW1uU3VidGl0bGVUZXh0IiwiQ29tbW9uVXRpbHMiLCJnZXRUcmFuc2xhdGVkVGV4dCIsIm9UYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRUZXh0QW5ub3RhdGlvbiIsInNUYWJsZUZpcnN0Q29sVGV4dEFubm90YXRpb25QYXRoIiwic1RhYmxlRmlyc3RDb2xUZXh0QXJyYW5nZW1lbnQiLCJvVGFibGVQcm9wZXJ0aWVzIiwib0NvbXBvbmVudCIsInJlcXVpcmUiLCJvTmF2T2JqZWN0IiwiZ2V0T3duZXJDb21wb25lbnRGb3IiLCJnZXROYXZpZ2F0aW9uIiwiYlN1Yk9QQ29uZmlndXJlZCIsImRldGFpbCIsInJvdXRlIiwiYklzTmF2aWdhdGlvbkNvbmZpZ3VyZWQiLCJnZXRSb3dBY3Rpb24iLCJyZW1vdmVBbGxNZXNzYWdlcyIsImFkZE1lc3NhZ2VzIiwiRXZlbnQiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkEsTUFBTUEsVUFBVSxHQUFHQyxJQUFJLENBQUNELFVBQXhCO0FBQ0EsTUFBTUUsV0FBVyxHQUFHQyxPQUFPLENBQUNELFdBQTVCO01BR01FLGEsV0FETEMsUUFBUSxDQUFDLDZCQUFELEMsVUFFUEMsV0FBVyxDQUFDO0FBQUVDLElBQUFBLElBQUksRUFBRSw2QkFBUjtBQUF1Q0MsSUFBQUEsUUFBUSxFQUFFLElBQWpEO0FBQXVEQyxJQUFBQSxZQUFZLEVBQUU7QUFBckUsR0FBRCxDOzs7Ozs7Ozs7Ozs7Ozs7O1lBU0pDLGUsR0FBa0IsRTtZQUNsQkMsaUIsR0FBb0IsRTtZQUVwQkMsTyxHQUFVLEU7Ozs7OztXQUVsQkMsSSxHQUFBLGdCQUFPO0FBQ05DLE1BQUFBLE1BQU0sQ0FBQ0MsU0FBUCxDQUFpQkYsSUFBakIsQ0FBc0JHLEtBQXRCLENBQTRCLElBQTVCLEVBRE0sQ0FFTjs7QUFDQSxXQUFLQyxXQUFMLENBQWlCLEtBQUtDLHlCQUF0QixFQUFpRCxJQUFqRDtBQUNBLFdBQUtDLGVBQUwsR0FBdUIsSUFBSUMsY0FBSixFQUF2QjtBQUNBLFdBQUtDLFlBQUwsR0FBb0IsS0FBS0YsZUFBTCxDQUFxQkcsVUFBckIsQ0FBZ0MsT0FBaEMsQ0FBcEI7QUFDQSxXQUFLRCxZQUFMLENBQWtCRSxZQUFsQixDQUErQixLQUFLQyxlQUFwQyxFQUFxRCxJQUFyRDtBQUNBLFVBQU1DLGVBQWUsR0FBRyxLQUFLQyxLQUFMLEVBQXhCOztBQUNBLFVBQUlELGVBQUosRUFBcUI7QUFDcEIsYUFBS04sZUFBTCxDQUFx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WSxPQUFqQixDQUF5QndHLG9CQUF6QixLQUFrRCxDQUFDLENBSG5ELEdBSUcsSUFKSCxHQUtHLEtBTkosQ0EzRkMsQ0FrR0Q7QUFDQTs7QUFDQXhDLE1BQUFBLE9BQU8sQ0FBQ3FELGNBQVIsQ0FDQyxDQUFDeVEsZ0JBQUQsSUFDQ2lCLHVCQURELElBRUNuVixjQUZELEtBR0UsQ0FBQyxDQUFDMkMsbUJBQUYsR0FBd0IsQ0FBQyxDQUFDOUMsZ0JBQTFCLEdBQTZDLENBQUMsQ0FBQzhDLG1CQUhqRCxDQUREO0FBTUEsYUFBT3VSLGdCQUFQO0FBQ0EsSzs7V0FFRHJQLGMsR0FBQSx3QkFBZXNHLFFBQWYsRUFBOEI7QUFDN0IsVUFBTWxMLEtBQUssR0FBRzFHLEdBQUcsQ0FBQ0MsRUFBSixDQUNaOEYsT0FEWSxHQUVaQyxpQkFGWSxHQUdaQyxlQUhZLEdBSVpDLE9BSlksRUFBZDtBQUtBbEcsTUFBQUEsR0FBRyxDQUFDQyxFQUFKLENBQ0U4RixPQURGLEdBRUVDLGlCQUZGLEdBR0U4VixpQkFIRjtBQUlBcFYsTUFBQUEsS0FBSyxDQUFDM0UsT0FBTixDQUFjLFVBQVM4RSxPQUFULEVBQXVCO0FBQ3BDLFlBQUlBLE9BQU8sS0FBSytLLFFBQWhCLEVBQTBCO0FBQ3pCNVIsVUFBQUEsR0FBRyxDQUFDQyxFQUFKLENBQ0U4RixPQURGLEdBRUVDLGlCQUZGLEdBR0UrVixXQUhGLENBR2MsQ0FBQ2xWLE9BQUQsQ0FIZDtBQUlBO0FBQ0QsT0FQRDtBQVFBLEs7OztJQXp1RDBCM0gsTTs7Ozs7b0ZBSTFCOGMsSzs7Ozs7O1NBd3VEYXhkLGEiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogJHtjb3B5cmlnaHR9XG4gKi9cbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgbUxpYiBmcm9tIFwic2FwL20vbGlicmFyeVwiO1xuaW1wb3J0IE1lc3NhZ2VQb3BvdmVyIGZyb20gXCJzYXAvZmUvY29tbW9uL01lc3NhZ2VQb3BvdmVyXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgY29yZUxpYiBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IFNvcnRlciBmcm9tIFwic2FwL3VpL21vZGVsL1NvcnRlclwiO1xuaW1wb3J0IEZpbHRlck9wZXJhdG9yIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyT3BlcmF0b3JcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IFVyaVBhcmFtZXRlcnMgZnJvbSBcInNhcC9iYXNlL3V0aWwvVXJpUGFyYW1ldGVyc1wiO1xuaW1wb3J0IEZvcm1hdHRlZFRleHQgZnJvbSBcInNhcC9tL0Zvcm1hdHRlZFRleHRcIjtcbmltcG9ydCBDb3JlRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgQWdncmVnYXRpb24sIFVJNUNsYXNzLCBFdmVudCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IE1lc3NhZ2VGaWx0ZXIgZnJvbSBcInNhcC9mZS9jb21tb24vTWVzc2FnZUZpbHRlclwiO1xuXG5jb25zdCBCdXR0b25UeXBlID0gbUxpYi5CdXR0b25UeXBlO1xuY29uc3QgTWVzc2FnZVR5cGUgPSBjb3JlTGliLk1lc3NhZ2VUeXBlO1xuXG5AVUk1Q2xhc3MoXCJzYXAuZmUuY29tbW9uLk1lc3NhZ2VCdXR0b25cIilcbmNsYXNzIE1lc3NhZ2VCdXR0b24gZXh0ZW5kcyBCdXR0b24ge1xuXHRAQWdncmVnYXRpb24oeyB0eXBlOiBcInNhcC5mZS5jb21tb24uTWVzc2FnZUZpbHRlclwiLCBtdWx0aXBsZTogdHJ1ZSwgc2luZ3VsYXJOYW1lOiBcImN1c3RvbUZpbHRlclwiIH0pXG5cdGN1c3RvbUZpbHRlcnMhOiBNZXNzYWdlRmlsdGVyO1xuXG5cdEBFdmVudFxuXHRtZXNzYWdlQ2hhbmdlITogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBvTWVzc2FnZVBvcG92ZXI6IGFueTtcblx0cHJpdmF0ZSBvSXRlbUJpbmRpbmc6IGFueTtcblx0cHJpdmF0ZSBvT2JqZWN0UGFnZUxheW91dDogYW55O1xuXHRwcml2YXRlIHNMYXN0QWN0aW9uVGV4dCA9IFwiXCI7XG5cdHByaXZhdGUgc0dlbmVyYWxHcm91cFRleHQgPSBcIlwiO1xuXHRwcml2YXRlIF9zZXRNZXNzYWdlRGF0YVRpbWVvdXQ6IGFueTtcblx0cHJpdmF0ZSBzVmlld0lkID0gXCJcIjtcblxuXHRpbml0KCkge1xuXHRcdEJ1dHRvbi5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzKTtcblx0XHQvL3ByZXNzIGV2ZW50IGhhbmRsZXIgYXR0YWNoZWQgdG8gb3BlbiB0aGUgbWVzc2FnZSBwb3BvdmVyXG5cdFx0dGhpcy5hdHRhY2hQcmVzcyh0aGlzLmhhbmRsZU1lc3NhZ2VQb3BvdmVyUHJlc3MsIHRoaXMpO1xuXHRcdHRoaXMub01lc3NhZ2VQb3BvdmVyID0gbmV3IE1lc3NhZ2VQb3BvdmVyKCk7XG5cdFx0dGhpcy5vSXRlbUJpbmRpbmcgPSB0aGlzLm9NZXNzYWdlUG9wb3Zlci5nZXRCaW5kaW5nKFwiaXRlbXNcIik7XG5cdFx0dGhpcy5vSXRlbUJpbmRpbmcuYXR0YWNoQ2hhbmdlKHRoaXMuX3NldE1lc3NhZ2VEYXRhLCB0aGlzKTtcblx0XHRjb25zdCBtZXNzYWdlQnV0dG9uSWQgPSB0aGlzLmdldElkKCk7XG5cdFx0aWYgKG1lc3NhZ2VCdXR0b25JZCkge1xuXHRcdFx0dGhpcy5vTWVzc2FnZVBvcG92ZXIuYWRkQ3VzdG9tRGF0YShuZXcgKHNhcCBhcyBhbnkpLnVpLmNvcmUuQ3VzdG9tRGF0YSh7IGtleTogXCJtZXNzYWdlQnV0dG9uSWRcIiwgdmFsdWU6IG1lc3NhZ2VCdXR0b25JZCB9KSk7IC8vIFRPRE8gY2hlY2sgZm9yIGN1c3RvbSBkYXRhIHR5cGVcblx0XHR9XG5cdFx0dGhpcy5hdHRhY2hNb2RlbENvbnRleHRDaGFuZ2UodGhpcy5fYXBwbHlGaWx0ZXJzQW5kU29ydC5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLm9NZXNzYWdlUG9wb3Zlci5hdHRhY2hBY3RpdmVUaXRsZVByZXNzKHRoaXMuX2FjdGl2ZVRpdGxlUHJlc3MuYmluZCh0aGlzKSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCB3aGVuIGEgdXNlciBjbGlja3Mgb24gdGhlIE1lc3NhZ2VCdXR0b24gY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBFdmVudCBvYmplY3Rcblx0ICovXG5cdGhhbmRsZU1lc3NhZ2VQb3BvdmVyUHJlc3Mob0V2ZW50OiBDb3JlRXZlbnQpIHtcblx0XHR0aGlzLm9NZXNzYWdlUG9wb3Zlci50b2dnbGUob0V2ZW50LmdldFNvdXJjZSgpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWV0aG9kIHRoYXQgZ3JvdXBzIHRoZSBtZXNzYWdlcyBiYXNlZCBvbiB0aGUgc2VjdGlvbiBvciBzdWJzZWN0aW9uIHRoZXkgYmVsb25nIHRvLlxuXHQgKiBUaGlzIG1ldGhvZCBmb3JjZSB0aGUgbG9hZGluZyBvZiBjb250ZXh0cyBmb3IgYWxsIHRhYmxlcyBiZWZvcmUgdG8gYXBwbHkgdGhlIGdyb3VwaW5nLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1ZpZXcgQ3VycmVudCB2aWV3LlxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmV0dXJuIHByb21pc2UuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfYXBwbHlHcm91cGluZ0FzeW5jKG9WaWV3OiBWaWV3KSB7XG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMgYXMgTWVzc2FnZUJ1dHRvbjtcblx0XHRjb25zdCBhV2FpdEZvckRhdGE6IGFueVtdID0gW107XG5cdFx0Y29uc3Qgb1ZpZXdCaW5kaW5nQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgX2ZpbmRUYWJsZXNSZWxhdGVkVG9NZXNzYWdlcyA9IGZ1bmN0aW9uKG9WaWV3OiBWaWV3KSB7XG5cdFx0XHRjb25zdCBvUmVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0Y29uc3QgYU1lc3NhZ2VzID0gdGhhdC5vSXRlbUJpbmRpbmcuZ2V0Q29udGV4dHMoKS5tYXAoZnVuY3Rpb24ob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IG9WaWV3Q29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRpZiAob1ZpZXdDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IG9PYmplY3RQYWdlID0gb1ZpZXcuZ2V0Q29udGVudCgpWzBdO1xuXHRcdFx0XHR0aGF0LmdldFZpc2libGVTZWN0aW9uc0Zyb21PYmplY3RQYWdlTGF5b3V0KG9PYmplY3RQYWdlKS5mb3JFYWNoKGZ1bmN0aW9uKG9TZWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0XHRvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24ob1N1YlNlY3Rpb246IGFueSkge1xuXHRcdFx0XHRcdFx0b1N1YlNlY3Rpb24uZmluZEVsZW1lbnRzKHRydWUpLmZvckVhY2goZnVuY3Rpb24ob0VsZW06IGFueSkge1xuXHRcdFx0XHRcdFx0XHRpZiAob0VsZW0uaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYU1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvUm93QmluZGluZyA9IG9FbGVtLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChvUm93QmluZGluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBzRWxlbWVCaW5kaW5nUGF0aCA9IG9WaWV3Q29udGV4dC5nZXRQYXRoKCkgKyBcIi9cIiArIG9FbGVtLmdldFJvd0JpbmRpbmcoKS5nZXRQYXRoKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhTWVzc2FnZXNbaV0udGFyZ2V0LmluZGV4T2Yoc0VsZW1lQmluZGluZ1BhdGgpID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlcy5wdXNoKHsgdGFibGU6IG9FbGVtLCBzdWJzZWN0aW9uOiBvU3ViU2VjdGlvbiB9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG9SZXM7XG5cdFx0fTtcblx0XHQvLyBTZWFyY2ggZm9yIHRhYmxlIHJlbGF0ZWQgdG8gTWVzc2FnZXMgYW5kIGluaXRpYWxpemUgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFyZW50IHN1YnNlY3Rpb24gdG8gcmV0cmlldmUgdGhlIGRhdGFcblx0XHRjb25zdCBvVGFibGVzID0gX2ZpbmRUYWJsZXNSZWxhdGVkVG9NZXNzYWdlcy5iaW5kKHRoaXMpKG9WaWV3KTtcblx0XHRvVGFibGVzLmZvckVhY2goZnVuY3Rpb24oX29UYWJsZSkge1xuXHRcdFx0Y29uc3Qgb01EQ1RhYmxlID0gX29UYWJsZS50YWJsZSxcblx0XHRcdFx0b1N1YnNlY3Rpb24gPSBfb1RhYmxlLnN1YnNlY3Rpb247XG5cdFx0XHRpZiAoIW9NRENUYWJsZS5nZXRCaW5kaW5nQ29udGV4dCgpIHx8IG9NRENUYWJsZS5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCkgIT09IG9WaWV3QmluZGluZ0NvbnRleHQ/LmdldFBhdGgoKSkge1xuXHRcdFx0XHRvU3Vic2VjdGlvbi5zZXRCaW5kaW5nQ29udGV4dChvVmlld0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0aWYgKCFvTURDVGFibGUuZ2V0Um93QmluZGluZygpLmlzTGVuZ3RoRmluYWwoKSkge1xuXHRcdFx0XHRcdGFXYWl0Rm9yRGF0YS5wdXNoKFxuXHRcdFx0XHRcdFx0bmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZTogRnVuY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0b01EQ1RhYmxlLmdldFJvd0JpbmRpbmcoKS5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBQcm9taXNlLmFsbChhV2FpdEZvckRhdGEpXG5cdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0Ly8gdGhlIGNoZWNrTWVzc2FnZXMgY2FsbCB3aWxsIHJlZnJlc2ggdGhlIGNvbnRyb2xJZHMgZm9yIGVhY2ggbWVzc2FnZXNcblx0XHRcdFx0b1ZpZXcuZ2V0TW9kZWwoKS5jaGVja01lc3NhZ2VzKCk7XG5cdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlOiBGdW5jdGlvbikge1xuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHR0aGF0Ll9hcHBseUdyb3VwaW5nKCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZ3JvdXBpbmcgdGhlIG1lc3NhZ2VzIGluIHRoZSBtZXNzYWdlUG9wT3ZlclwiKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgcmV0cmlldmVzIHRoZSB2aXNpYmxlIHNlY3Rpb25zIGZyb20gYW4gb2JqZWN0cGFnZS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9PYmplY3RQYWdlTGF5b3V0IFRoZSBvYmplY3RQYWdlTGF5b3V0IG9iamVjdCBmb3Igd2hpY2ggd2Ugd2FudCB0byByZXRyaWV2ZSB0aGUgdmlzaWJsZSBzZWN0aW9ucy5cblx0ICogQHJldHVybnMge0FycmF5fSBBcnJheSBvZiB2aXNpYmxlIHNlY3Rpb25zLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0Z2V0VmlzaWJsZVNlY3Rpb25zRnJvbU9iamVjdFBhZ2VMYXlvdXQob09iamVjdFBhZ2VMYXlvdXQ6IGFueSkge1xuXHRcdHJldHVybiBvT2JqZWN0UGFnZUxheW91dC5nZXRTZWN0aW9ucygpLmZpbHRlcihmdW5jdGlvbihvU2VjdGlvbjogYW55KSB7XG5cdFx0XHRyZXR1cm4gb1NlY3Rpb24uZ2V0VmlzaWJsZSgpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgdGhhdCBncm91cHMgdGhlIG1lc3NhZ2VzIGJhc2VkIG9uIHRoZSBzZWN0aW9uIG9yIHN1YnNlY3Rpb24gdGhleSBiZWxvbmcgdG8uXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfYXBwbHlHcm91cGluZygpIHtcblx0XHR0aGlzLm9PYmplY3RQYWdlTGF5b3V0ID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dCh0aGlzLCB0aGlzLm9PYmplY3RQYWdlTGF5b3V0KTtcblx0XHRpZiAoIXRoaXMub09iamVjdFBhZ2VMYXlvdXQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgYU1lc3NhZ2VzID0gdGhpcy5vTWVzc2FnZVBvcG92ZXIuZ2V0SXRlbXMoKTtcblx0XHRjb25zdCBhU2VjdGlvbnMgPSB0aGlzLmdldFZpc2libGVTZWN0aW9uc0Zyb21PYmplY3RQYWdlTGF5b3V0KHRoaXMub09iamVjdFBhZ2VMYXlvdXQpO1xuXHRcdGNvbnN0IGJFbmFibGVCaW5kaW5nID0gdGhpcy5fY2hlY2tDb250cm9sSWRJblNlY3Rpb25zKGFNZXNzYWdlcywgZmFsc2UpO1xuXHRcdGlmIChiRW5hYmxlQmluZGluZykge1xuXHRcdFx0dGhpcy5fZm5FbmFibGVCaW5kaW5ncyhhU2VjdGlvbnMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWV0aG9kIHJldHJpZXZlcyB0aGUgYmluZGluZyBjb250ZXh0IGZvciB0aGUgcmVmRXJyb3Igb2JqZWN0LlxuXHQgKiBUaGUgcmVmRXJyb3IgY29udGFpbnMgYSBtYXAgdG8gc3RvcmUgdGhlIGluZGV4ZXMgb2YgdGhlIHJvd3Mgd2l0aCBlcnJvcnMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvVGFibGUgVGhlIHRhYmxlIGZvciB3aGljaCB3ZSB3YW50IHRvIGdldCB0aGUgcmVmRXJyb3IgT2JqZWN0LlxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBDb250ZXh0IG9mIHRoZSByZWZFcnJvci5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9nZXRUYWJsZVJlZkVycm9yQ29udGV4dChvVGFibGU6IGFueSkge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9UYWJsZS5nZXRNb2RlbChcImludGVybmFsXCIpO1xuXHRcdC8vaW5pdGlhbGl6ZSB0aGUgcmVmRXJyb3IgcHJvcGVydHkgaWYgaXQgZG9lc24ndCBleGlzdFxuXHRcdGlmICghb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikuZ2V0UHJvcGVydHkoXCJyZWZFcnJvclwiKSkge1xuXHRcdFx0b01vZGVsLnNldFByb3BlcnR5KFwicmVmRXJyb3JcIiwge30sIG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpKTtcblx0XHR9XG5cdFx0Y29uc3Qgc1JlZkVycm9yQ29udGV4dFBhdGggPVxuXHRcdFx0b1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikuZ2V0UGF0aCgpICtcblx0XHRcdFwiL3JlZkVycm9yL1wiICtcblx0XHRcdG9UYWJsZVxuXHRcdFx0XHQuZ2V0QmluZGluZ0NvbnRleHQoKVxuXHRcdFx0XHQuZ2V0UGF0aCgpXG5cdFx0XHRcdC5yZXBsYWNlKFwiL1wiLCBcIiRcIikgK1xuXHRcdFx0XCIkXCIgK1xuXHRcdFx0b1RhYmxlXG5cdFx0XHRcdC5nZXRSb3dCaW5kaW5nKClcblx0XHRcdFx0LmdldFBhdGgoKVxuXHRcdFx0XHQucmVwbGFjZShcIi9cIiwgXCIkXCIpO1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gb01vZGVsLmdldENvbnRleHQoc1JlZkVycm9yQ29udGV4dFBhdGgpO1xuXHRcdGlmICghb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJcIikpIHtcblx0XHRcdG9Nb2RlbC5zZXRQcm9wZXJ0eShcIlwiLCB7fSwgb0NvbnRleHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gb0NvbnRleHQ7XG5cdH1cblxuXHRfZ2V0QmFja2VuZE1lc3NhZ2VUb1JlbW92ZShvVGFibGU6IGFueSwgb01lc3NhZ2VPYmplY3Q6IGFueSwgb0Vycm9yQ29udGV4dDogYW55KSB7XG5cdFx0Ly9UZXN0IGlmIHRoZXJlIGlzIGFscmVhZHkgYSBtZXNzYWdlIGZvciB0aGUgc2FtZSBjb250ZXh0OlxuXHRcdGxldCBvQmFja2VuZE1lc3NhZ2VUb1JlbW92ZTtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuX2dldFRhYmxlUmVmRXJyb3JDb250ZXh0KG9UYWJsZSksXG5cdFx0XHRhTWVzc2FnZUlkcyA9IE9iamVjdC5rZXlzKG9Db250ZXh0LmdldFByb3BlcnR5KCkpLmZpbHRlcihmdW5jdGlvbihrZXkpIHtcblx0XHRcdFx0cmV0dXJuIE9iamVjdC5rZXlzKG9Db250ZXh0LmdldFByb3BlcnR5KClba2V5XSkuZXZlcnkoZnVuY3Rpb24oY2hpbGRLZXkpIHtcblx0XHRcdFx0XHRyZXR1cm4ga2V5ICE9PSBvTWVzc2FnZU9iamVjdC5nZXRJZCgpICYmIG9Db250ZXh0LmdldFByb3BlcnR5KClba2V5XVtjaGlsZEtleV0gPT09IG9FcnJvckNvbnRleHRbY2hpbGRLZXldO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pLFxuXHRcdFx0YVZhbGlkTWVzc2FnZUlkcyA9IHNhcC51aVxuXHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdC5nZXRNZXNzYWdlTWFuYWdlcigpXG5cdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdC5tYXAoZnVuY3Rpb24obTogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG0uaWQ7XG5cdFx0XHRcdH0pO1xuXHRcdGlmIChhTWVzc2FnZUlkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRhVmFsaWRNZXNzYWdlSWRzLmluZGV4T2YoYU1lc3NhZ2VJZHNbMF0pO1xuXHRcdFx0b0JhY2tlbmRNZXNzYWdlVG9SZW1vdmUgPSBzYXAudWlcblx0XHRcdFx0LmdldENvcmUoKVxuXHRcdFx0XHQuZ2V0TWVzc2FnZU1hbmFnZXIoKVxuXHRcdFx0XHQuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0LmdldERhdGEoKVthVmFsaWRNZXNzYWdlSWRzLmluZGV4T2YoYU1lc3NhZ2VJZHNbMF0pXTtcblx0XHR9XG5cdFx0cmV0dXJuIG9CYWNrZW5kTWVzc2FnZVRvUmVtb3ZlO1xuXHR9XG5cblx0X3VwZGF0ZUludGVybmFsTW9kZWwoXG5cdFx0b1RhYmxlUm93Q29udGV4dDogYW55LFxuXHRcdGlSb3dJbmRleDogbnVtYmVyLFxuXHRcdHNUYWJsZVRhcmdldENvbFByb3BlcnR5OiBzdHJpbmcsXG5cdFx0b1RhYmxlOiBhbnksXG5cdFx0b01lc3NhZ2VPYmplY3Q6IGFueSxcblx0XHRiSXNDcmVhdGlvblJvdz86IGJvb2xlYW5cblx0KSB7XG5cdFx0bGV0IG9UZW1wO1xuXHRcdGlmIChiSXNDcmVhdGlvblJvdykge1xuXHRcdFx0b1RlbXAgPSB7XG5cdFx0XHRcdHJvd0luZGV4OiBcIkNyZWF0aW9uUm93XCIsXG5cdFx0XHRcdHRhcmdldENvbFByb3BlcnR5OiBzVGFibGVUYXJnZXRDb2xQcm9wZXJ0eSA/IHNUYWJsZVRhcmdldENvbFByb3BlcnR5IDogXCJcIlxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b1RlbXAgPSB7XG5cdFx0XHRcdHJvd0luZGV4OiBvVGFibGVSb3dDb250ZXh0ID8gaVJvd0luZGV4IDogXCJcIixcblx0XHRcdFx0dGFyZ2V0Q29sUHJvcGVydHk6IHNUYWJsZVRhcmdldENvbFByb3BlcnR5ID8gc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgOiBcIlwiXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRjb25zdCBvTW9kZWwgPSBvVGFibGUuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSxcblx0XHRcdG9Db250ZXh0ID0gdGhpcy5fZ2V0VGFibGVSZWZFcnJvckNvbnRleHQob1RhYmxlKTtcblx0XHQvL3dlIGZpcnN0IHJlbW92ZSB0aGUgZW50cmllcyB3aXRoIG9ic29sZXRlIG1lc3NhZ2UgaWRzIGZyb20gdGhlIGludGVybmFsIG1vZGVsIGJlZm9yZSBpbnNlcnRpbmcgdGhlIG5ldyBlcnJvciBpbmZvIDpcblx0XHRjb25zdCBhVmFsaWRNZXNzYWdlSWRzID0gc2FwLnVpXG5cdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHQuZ2V0TWVzc2FnZU1hbmFnZXIoKVxuXHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHQubWFwKGZ1bmN0aW9uKG1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gbWVzc2FnZS5pZDtcblx0XHRcdH0pO1xuXHRcdGxldCBhT2Jzb2xldGVNZXNzYWdlbElkcztcblx0XHRpZiAob0NvbnRleHQuZ2V0UHJvcGVydHkoKSkge1xuXHRcdFx0YU9ic29sZXRlTWVzc2FnZWxJZHMgPSBPYmplY3Qua2V5cyhvQ29udGV4dC5nZXRQcm9wZXJ0eSgpKS5maWx0ZXIoZnVuY3Rpb24oaW50ZXJuYWxNZXNzYWdlSWQpIHtcblx0XHRcdFx0cmV0dXJuIGFWYWxpZE1lc3NhZ2VJZHMuaW5kZXhPZihpbnRlcm5hbE1lc3NhZ2VJZCkgPT09IC0xO1xuXHRcdFx0fSk7XG5cdFx0XHRhT2Jzb2xldGVNZXNzYWdlbElkcy5mb3JFYWNoKGZ1bmN0aW9uKG9ic29sZXRlSWQpIHtcblx0XHRcdFx0ZGVsZXRlIG9Db250ZXh0LmdldFByb3BlcnR5KClbb2Jzb2xldGVJZF07XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0b01vZGVsLnNldFByb3BlcnR5KFxuXHRcdFx0b01lc3NhZ2VPYmplY3QuZ2V0SWQoKSxcblx0XHRcdE9iamVjdC5hc3NpZ24oe30sIG9Db250ZXh0LmdldFByb3BlcnR5KG9NZXNzYWdlT2JqZWN0LmdldElkKCkpID8gb0NvbnRleHQuZ2V0UHJvcGVydHkob01lc3NhZ2VPYmplY3QuZ2V0SWQoKSkgOiB7fSwgb1RlbXApLFxuXHRcdFx0b0NvbnRleHRcblx0XHQpO1xuXHR9XG5cblx0X2dldENvbnRyb2xGcm9tTWVzc2FnZVJlbGF0aW5nVG9TdWJTZWN0aW9uKHN1YlNlY3Rpb246IGFueSwgbWVzc2FnZTogYW55KSB7XG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMgYXMgTWVzc2FnZUJ1dHRvbjtcblx0XHRjb25zdCBvTWVzc2FnZU9iamVjdCA9IG1lc3NhZ2UuZ2V0QmluZGluZ0NvbnRleHQoXCJtZXNzYWdlXCIpLmdldE9iamVjdCgpO1xuXHRcdGNvbnN0IGFFbGVtZW50cyA9IHN1YlNlY3Rpb25cblx0XHRcdC5maW5kRWxlbWVudHModHJ1ZSwgZnVuY3Rpb24ob0VsZW06IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gdGhhdC5fZm5GaWx0ZXJVcG9uSWRzKG9NZXNzYWdlT2JqZWN0LmdldENvbnRyb2xJZHMoKSwgb0VsZW0pO1xuXHRcdFx0fSlcblx0XHRcdC5zb3J0KGZ1bmN0aW9uKGE6IGFueSwgYjogYW55KSB7XG5cdFx0XHRcdC8vIGNvbnRyb2xzIGFyZSBzb3J0ZWQgaW4gb3JkZXIgdG8gaGF2ZSB0aGUgdGFibGUgb24gdG9wIG9mIHRoZSBhcnJheVxuXHRcdFx0XHQvLyBpdCB3aWxsIGhlbHAgdG8gY29tcHV0ZSB0aGUgc3VidGl0bGUgb2YgdGhlIG1lc3NhZ2UgYmFzZWQgb24gdGhlIHR5cGUgb2YgcmVsYXRlZCBjb250cm9sc1xuXHRcdFx0XHRpZiAoYS5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpICYmICFiLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHR9KTtcblx0XHRyZXR1cm4gYUVsZW1lbnRzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgdGhhdCBzZXRzIGdyb3VwcyBmb3IgdHJhbnNpZW50IG1lc3NhZ2VzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gbWVzc2FnZSBUaGUgbWVzc2FnZSB3ZSB3YW50IHRvIGNvbXB1dGUgZ3JvdXAgYW5kIHN1YnRpdGxlLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0FjdGlvbk5hbWUgVGhlIGFjdGlvbiBuYW1lLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblxuXHRfc2V0R3JvdXBMYWJlbEZvclRyYW5zaWVudE1zZyhtZXNzYWdlOiBhbnksIHNBY3Rpb25OYW1lOiBzdHJpbmcpIHtcblx0XHR0aGlzLnNMYXN0QWN0aW9uVGV4dCA9IHRoaXMuc0xhc3RBY3Rpb25UZXh0XG5cdFx0XHQ/IHRoaXMuc0xhc3RBY3Rpb25UZXh0XG5cdFx0XHQ6IChzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIGFueSkuZ2V0VGV4dChcIlRfTUVTU0FHRV9CVVRUT05fU0FQRkVfTUVTU0FHRV9HUk9VUF9MQVNUX0FDVElPTlwiKTtcblxuXHRcdG1lc3NhZ2Uuc2V0R3JvdXBOYW1lKHRoaXMuc0xhc3RBY3Rpb25UZXh0ICsgXCI6IFwiICsgc0FjdGlvbk5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgdGhhdCBncm91cCBtZXNzYWdlcyBhbmQgYWRkIHRoZSBzdWJ0aXRsZS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG1lc3NhZ2UgVGhlIG1lc3NhZ2Ugd2Ugd2FudCB0byBjb21wdXRlIGdyb3VwIGFuZCBzdWJ0aXRsZS5cblx0ICogQHBhcmFtIHtvYmplY3R9IHNlY3Rpb24gVGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgY29udHJvbHMuXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBzdWJTZWN0aW9uIFRoZSBzdWJzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGNvbnRyb2xzLlxuXHQgKiBAcGFyYW0ge29iamVjdH0gYUVsZW1lbnRzIExpc3Qgb2YgY29udHJvbHMgZnJvbSBhIHN1YnNlY3Rpb24gcmVsYXRlZCB0byBhIG1lc3NhZ2UgLlxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IGJNdWx0aXBsZVN1YlNlY3Rpb25zIFRydWUgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiAxIHN1YnNlY3Rpb24gaW4gdGhlIHNlY3Rpb24uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQWN0aW9uTmFtZSBUaGUgYWN0aW9uIG5hbWUuXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFJldHVybiB0aGUgY29udHJvbCB0YXJnZXRlZCBieSB0aGUgbWVzc2FnZS5cblx0ICogQHByaXZhdGVcblx0ICovXG5cblx0X2NvbXB1dGVNZXNzYWdlR3JvdXBBbmRTdWJUaXRsZShcblx0XHRtZXNzYWdlOiBhbnksXG5cdFx0c2VjdGlvbjogYW55LFxuXHRcdHN1YlNlY3Rpb246IGFueSxcblx0XHRhRWxlbWVudHM6IGFueVtdLFxuXHRcdGJNdWx0aXBsZVN1YlNlY3Rpb25zOiBib29sZWFuLFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmdcblx0KSB7XG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMgYXMgTWVzc2FnZUJ1dHRvbjtcblx0XHR0aGlzLm9JdGVtQmluZGluZy5kZXRhY2hDaGFuZ2UodGhpcy5fc2V0TWVzc2FnZURhdGEsIHRoaXMpO1xuXHRcdGNvbnN0IG9NZXNzYWdlT2JqZWN0ID0gbWVzc2FnZS5nZXRCaW5kaW5nQ29udGV4dChcIm1lc3NhZ2VcIikuZ2V0T2JqZWN0KCk7XG5cblx0XHRsZXQgb0VsZW1lbnQsIG9UYWJsZSwgb1RhcmdldFRhYmxlSW5mbzogYW55LCBsLCBpUm93SW5kZXgsIG9UYXJnZXRlZENvbnRyb2wsIG9CYWNrZW5kTWVzc2FnZVRvUmVtb3ZlLCBiSXNDcmVhdGlvblJvdztcblx0XHRjb25zdCBiSXNCYWNrZW5kTWVzc2FnZSA9IG5ldyBSZWdFeHAoXCJeL1wiKS50ZXN0KG9NZXNzYWdlT2JqZWN0LmdldFRhcmdldCgpKSxcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIikgYXMgYW55O1xuXHRcdGlmIChiSXNCYWNrZW5kTWVzc2FnZSkge1xuXHRcdFx0Zm9yIChsID0gMDsgbCA8IGFFbGVtZW50cy5sZW5ndGg7IGwrKykge1xuXHRcdFx0XHRvRWxlbWVudCA9IGFFbGVtZW50c1tsXTtcblx0XHRcdFx0b1RhcmdldGVkQ29udHJvbCA9IG9FbGVtZW50O1xuXHRcdFx0XHRpZiAob0VsZW1lbnQuaXNBKFwic2FwLm0uVGFibGVcIikgfHwgb0VsZW1lbnQuaXNBKFwic2FwLnVpLnRhYmxlLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0b1RhcmdldFRhYmxlSW5mbyA9IHt9O1xuXHRcdFx0XHRcdG9UYWJsZSA9IG9FbGVtZW50LmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8udGFibGVIZWFkZXIgPSBvVGFibGUuZ2V0SGVhZGVyKCk7XG5cdFx0XHRcdFx0Y29uc3Qgb1Jvd0JpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdFx0XHRcdGlmIChvUm93QmluZGluZyAmJiBvUm93QmluZGluZy5pc0xlbmd0aEZpbmFsKCkgJiYgb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgPSB0aGlzLl9nZXRUYWJsZUNvbFByb3BlcnR5KG9UYWJsZSwgb01lc3NhZ2VPYmplY3QpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1RhYmxlQ29sSW5mbyA9IHRoaXMuX2dldFRhYmxlQ29sSW5mbyhvVGFibGUsIG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkpO1xuXHRcdFx0XHRcdFx0b1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dCaW5kaW5nQ29udGV4dHMgPSBvRWxlbWVudC5pc0EoXCJzYXAudWkudGFibGUuVGFibGVcIilcblx0XHRcdFx0XHRcdFx0PyBvUm93QmluZGluZy5nZXRDb250ZXh0cygpXG5cdFx0XHRcdFx0XHRcdDogb1Jvd0JpbmRpbmcuZ2V0Q3VycmVudENvbnRleHRzKCk7XG5cdFx0XHRcdFx0XHRvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbE5hbWUgPSBvVGFibGVDb2xJbmZvLnNUYWJsZVRhcmdldENvbE5hbWU7XG5cdFx0XHRcdFx0XHRvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldFByb3BlcnR5ID0gb1RhcmdldFRhYmxlSW5mby5zVGFibGVUYXJnZXRDb2xQcm9wZXJ0eTtcblx0XHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgPSBvVGFibGVDb2xJbmZvLnNUYWJsZVRhcmdldENvbFByb3BlcnR5O1xuXHRcdFx0XHRcdFx0b1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dDb250ZXh0ID0gb1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dCaW5kaW5nQ29udGV4dHMuZmluZChcblx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24ob01lc3NhZ2VPYmplY3Q6IGFueSwgcm93Q29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJvd0NvbnRleHQgJiYgb01lc3NhZ2VPYmplY3QuZ2V0VGFyZ2V0KCkuaW5kZXhPZihyb3dDb250ZXh0LmdldFBhdGgoKSkgPT09IDA7XG5cdFx0XHRcdFx0XHRcdH0uYmluZCh0aGlzLCBvTWVzc2FnZU9iamVjdClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRsZXQgc0NvbnRyb2xJZDtcblx0XHRcdFx0XHRcdGlmICghb1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdHNDb250cm9sSWQgPSBvTWVzc2FnZU9iamVjdC5jb250cm9sSWRzLmZpbmQoXG5cdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24ob1RhYmxlOiBhbnksIHNJZDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhhdC5fSXNDb250cm9sSW5UYWJsZShvVGFibGUsIHNJZCk7XG5cdFx0XHRcdFx0XHRcdFx0fS5iaW5kKHRoaXMsIG9UYWJsZSlcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChzQ29udHJvbElkKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9Db250cm9sID0gc2FwLnVpLmdldENvcmUoKS5ieUlkKHNDb250cm9sSWQpO1xuXHRcdFx0XHRcdFx0XHRiSXNDcmVhdGlvblJvdyA9IHRoaXMuX0lzQ29udHJvbFBhcnRPZkNyZWF0aW9uUm93KG9Db250cm9sKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMuX3NldE1lc3NhZ2VTdWJ0aXRsZShcblx0XHRcdFx0XHRcdFx0bWVzc2FnZSxcblx0XHRcdFx0XHRcdFx0b1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dCaW5kaW5nQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0b1RhcmdldFRhYmxlSW5mby5zVGFibGVUYXJnZXRDb2xOYW1lLFxuXHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0UHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdG9UYWJsZSxcblx0XHRcdFx0XHRcdFx0YklzQ3JlYXRpb25Sb3dcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRpZiAob1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2Zvcm1hdE1lc3NhZ2VEZXNjcmlwdGlvbihcblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlLFxuXHRcdFx0XHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0XHRvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbE5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdG9UYWJsZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aVJvd0luZGV4ID0gb1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dDb250ZXh0ICYmIG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93Q29udGV4dC5nZXRJbmRleCgpO1xuXHRcdFx0XHRcdFx0dGhpcy5fdXBkYXRlSW50ZXJuYWxNb2RlbChcblx0XHRcdFx0XHRcdFx0b1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRpUm93SW5kZXgsXG5cdFx0XHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdG9UYWJsZSxcblx0XHRcdFx0XHRcdFx0b01lc3NhZ2VPYmplY3Rcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1lc3NhZ2Uuc2V0QWN0aXZlVGl0bGUodHJ1ZSk7XG5cdFx0XHRcdFx0Ly9jaGVjayBpZiB0aGUgdGFyZ2V0ZWQgY29udHJvbCBpcyBhIGNoaWxkIG9mIG9uZSBvZiB0aGUgb3RoZXIgY29udHJvbHNcblx0XHRcdFx0XHRjb25zdCBiSXNUYXJnZXRlZENvbnRyb2xPcnBoYW4gPSB0aGlzLl9iSXNPcnBoYW5FbGVtZW50KG9UYXJnZXRlZENvbnRyb2wsIGFFbGVtZW50cyk7XG5cdFx0XHRcdFx0aWYgKGJJc1RhcmdldGVkQ29udHJvbE9ycGhhbikge1xuXHRcdFx0XHRcdFx0Ly9zZXQgdGhlIHN1YnRpdGxlXG5cdFx0XHRcdFx0XHRtZXNzYWdlLnNldFN1YnRpdGxlKFwiXCIpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vVGhlcmUgaXMgb25seSBvbmUgZWx0IGFzIHRoaXMgaXMgYSBmcm9udEVuZCBtZXNzYWdlXG5cdFx0XHRvVGFyZ2V0ZWRDb250cm9sID0gYUVsZW1lbnRzWzBdO1xuXHRcdFx0b1RhYmxlID0gdGhpcy5fZ2V0TWRjVGFibGUob1RhcmdldGVkQ29udHJvbCk7XG5cdFx0XHRpZiAob1RhYmxlKSB7XG5cdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8gPSB7fTtcblx0XHRcdFx0b1RhcmdldFRhYmxlSW5mby50YWJsZUhlYWRlciA9IG9UYWJsZS5nZXRIZWFkZXIoKTtcblx0XHRcdFx0Y29uc3QgaVRhcmdldENvbHVtbkluZGV4ID0gdGhpcy5fZ2V0VGFibGVDb2x1bW5JbmRleChvVGFyZ2V0ZWRDb250cm9sKTtcblx0XHRcdFx0b1RhcmdldFRhYmxlSW5mby5zVGFibGVUYXJnZXRDb2xQcm9wZXJ0eSA9XG5cdFx0XHRcdFx0aVRhcmdldENvbHVtbkluZGV4ID4gLTEgPyBvVGFibGUuZ2V0Q29sdW1ucygpW2lUYXJnZXRDb2x1bW5JbmRleF0uZ2V0RGF0YVByb3BlcnR5KCkgOiB1bmRlZmluZWQ7XG5cdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0UHJvcGVydHkgPSBvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbFByb3BlcnR5O1xuXHRcdFx0XHRvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbE5hbWUgPVxuXHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgJiYgaVRhcmdldENvbHVtbkluZGV4ID4gLTFcblx0XHRcdFx0XHRcdD8gb1RhYmxlLmdldENvbHVtbnMoKVtpVGFyZ2V0Q29sdW1uSW5kZXhdLmdldEhlYWRlcigpXG5cdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdFx0YklzQ3JlYXRpb25Sb3cgPSB0aGlzLl9nZXRUYWJsZVJvdyhvVGFyZ2V0ZWRDb250cm9sKS5pc0EoXCJzYXAudWkudGFibGUuQ3JlYXRpb25Sb3dcIik7XG5cdFx0XHRcdGlmICghYklzQ3JlYXRpb25Sb3cpIHtcblx0XHRcdFx0XHRpUm93SW5kZXggPSB0aGlzLl9nZXRUYWJsZVJvd0luZGV4KG9UYXJnZXRlZENvbnRyb2wpO1xuXHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93QmluZGluZ0NvbnRleHRzID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKS5nZXRDdXJyZW50Q29udGV4dHMoKTtcblx0XHRcdFx0XHRvVGFyZ2V0VGFibGVJbmZvLm9UYWJsZVJvd0NvbnRleHQgPSBvVGFyZ2V0VGFibGVJbmZvLm9UYWJsZVJvd0JpbmRpbmdDb250ZXh0c1tpUm93SW5kZXhdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX3NldE1lc3NhZ2VTdWJ0aXRsZShcblx0XHRcdFx0XHRtZXNzYWdlLFxuXHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93QmluZGluZ0NvbnRleHRzLFxuXHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93Q29udGV4dCxcblx0XHRcdFx0XHRvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbE5hbWUsXG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0UHJvcGVydHksXG5cdFx0XHRcdFx0b1RhYmxlLFxuXHRcdFx0XHRcdGJJc0NyZWF0aW9uUm93XG5cdFx0XHRcdCk7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUludGVybmFsTW9kZWwoXG5cdFx0XHRcdFx0b1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dDb250ZXh0LFxuXHRcdFx0XHRcdGlSb3dJbmRleCxcblx0XHRcdFx0XHRvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbFByb3BlcnR5LFxuXHRcdFx0XHRcdG9UYWJsZSxcblx0XHRcdFx0XHRvTWVzc2FnZU9iamVjdCxcblx0XHRcdFx0XHRiSXNDcmVhdGlvblJvd1xuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAob1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dDb250ZXh0KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0Vycm9yQ29udGV4dCA9IHtcblx0XHRcdFx0XHRcdHJvd0luZGV4OiBvVGFyZ2V0VGFibGVJbmZvLm9UYWJsZVJvd0NvbnRleHQgPyBpUm93SW5kZXggOiBcIlwiLFxuXHRcdFx0XHRcdFx0dGFyZ2V0Q29sUHJvcGVydHk6IG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgPyBvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbFByb3BlcnR5IDogXCJcIlxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0b0JhY2tlbmRNZXNzYWdlVG9SZW1vdmUgPSB0aGlzLl9nZXRCYWNrZW5kTWVzc2FnZVRvUmVtb3ZlKG9UYWJsZSwgb01lc3NhZ2VPYmplY3QsIG9FcnJvckNvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvTWVzc2FnZU9iamVjdC5wZXJzaXN0ZW50ICYmIHNBY3Rpb25OYW1lKSB7XG5cdFx0XHR0aGlzLl9zZXRHcm91cExhYmVsRm9yVHJhbnNpZW50TXNnKG1lc3NhZ2UsIHNBY3Rpb25OYW1lKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWVzc2FnZS5zZXRHcm91cE5hbWUoXG5cdFx0XHRcdHNlY3Rpb24uZ2V0VGl0bGUoKSArXG5cdFx0XHRcdFx0KHN1YlNlY3Rpb24uZ2V0VGl0bGUoKSAmJiBiTXVsdGlwbGVTdWJTZWN0aW9ucyA/IFwiLCBcIiArIHN1YlNlY3Rpb24uZ2V0VGl0bGUoKSA6IFwiXCIpICtcblx0XHRcdFx0XHQob1RhcmdldFRhYmxlSW5mb1xuXHRcdFx0XHRcdFx0PyBcIiwgXCIgKyBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlRfTUVTU0FHRV9HUk9VUF9USVRMRV9UQUJMRV9ERU5PTUlOQVRPUlwiKSArIFwiOiBcIiArIG9UYXJnZXRUYWJsZUluZm8udGFibGVIZWFkZXJcblx0XHRcdFx0XHRcdDogXCJcIilcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBzVmlld0lkID0gdGhpcy5fZ2V0Vmlld0lkKHRoaXMuZ2V0SWQoKSk7XG5cdFx0XHRjb25zdCBvVmlldyA9IHNhcC51aS5nZXRDb3JlKCkuYnlJZChzVmlld0lkIGFzIHN0cmluZyk7XG5cdFx0XHRjb25zdCBvTWVzc2FnZVRhcmdldFByb3BlcnR5ID1cblx0XHRcdFx0b01lc3NhZ2VPYmplY3QuZ2V0VGFyZ2V0KCkgJiZcblx0XHRcdFx0b01lc3NhZ2VPYmplY3Rcblx0XHRcdFx0XHQuZ2V0VGFyZ2V0KClcblx0XHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdFx0LnBvcCgpO1xuXHRcdFx0Y29uc3Qgb1VJTW9kZWwgPSBvVmlldz8uZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG9VSU1vZGVsICYmXG5cdFx0XHRcdG9VSU1vZGVsLmdldFByb3BlcnR5KFwiL21lc3NhZ2VUYXJnZXRQcm9wZXJ0eVwiKSAmJlxuXHRcdFx0XHRvTWVzc2FnZVRhcmdldFByb3BlcnR5ICYmXG5cdFx0XHRcdG9NZXNzYWdlVGFyZ2V0UHJvcGVydHkgPT0gb1VJTW9kZWwuZ2V0UHJvcGVydHkoXCIvbWVzc2FnZVRhcmdldFByb3BlcnR5XCIpXG5cdFx0XHQpIHtcblx0XHRcdFx0dGhpcy5vTWVzc2FnZVBvcG92ZXIuZmlyZUFjdGl2ZVRpdGxlUHJlc3MoeyBcIml0ZW1cIjogbWVzc2FnZSB9KTtcblx0XHRcdFx0b1VJTW9kZWwuc2V0UHJvcGVydHkoXCIvbWVzc2FnZVRhcmdldFByb3BlcnR5XCIsIGZhbHNlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5vSXRlbUJpbmRpbmcuYXR0YWNoQ2hhbmdlKHRoaXMuX3NldE1lc3NhZ2VEYXRhLCB0aGlzKTtcblx0XHRpZiAob0JhY2tlbmRNZXNzYWdlVG9SZW1vdmUgJiYgIWJJc0JhY2tlbmRNZXNzYWdlKSB7XG5cdFx0XHQvKlBlbmRpbmcgZnVydGhlciBpbnZlc3RpZ2F0aW9uLCBhbG9uZyB3aXRoIHRoZSBkZWxldGlvbiBvZiB0aGUgYmFja2VuZEVuZCBtZXNzYWdlLFxuXHRcdFx0XHRcdHdlIHJlbW92ZSBhbmQgcmVpbnNlcnQgYWxsIHRoZSBvdGhlciBleGlzdGluZyBtZXNzYWdlcyBmcm9tIHRoZSBtZXNzYWdlIG1hbmFnZXIgdG9cblx0XHRcdFx0XHRtYWtlIHRoZSBoaWdobGlnaHRcdG9mIHRoZSBmaWVsZCBvbiBlcnJvciBwZXJzaXN0ZW50LiovXG5cdFx0XHR0aGlzLl9yZW1vdmVNZXNzYWdlKG9CYWNrZW5kTWVzc2FnZVRvUmVtb3ZlKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9UYXJnZXRlZENvbnRyb2w7XG5cdH1cblxuXHRfY2hlY2tDb250cm9sSWRJblNlY3Rpb25zKGFNZXNzYWdlczogYW55W10sIGJFbmFibGVCaW5kaW5nOiBib29sZWFuKSB7XG5cdFx0bGV0IHNlY3Rpb24sIGFTdWJTZWN0aW9ucywgbWVzc2FnZSwgaSwgaiwgaztcblx0XHR0aGlzLnNHZW5lcmFsR3JvdXBUZXh0ID0gdGhpcy5zR2VuZXJhbEdyb3VwVGV4dFxuXHRcdFx0PyB0aGlzLnNHZW5lcmFsR3JvdXBUZXh0XG5cdFx0XHQ6IChzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIGFueSkuZ2V0VGV4dChcIlRfTUVTU0FHRV9CVVRUT05fU0FQRkVfTUVTU0FHRV9HUk9VUF9HRU5FUkFMXCIpO1xuXHRcdC8vR2V0IGFsbCBzZWN0aW9ucyBmcm9tIHRoZSBvYmplY3QgcGFnZSBsYXlvdXRcblx0XHRjb25zdCBhVmlzaWJsZVNlY3Rpb25zID0gdGhpcy5nZXRWaXNpYmxlU2VjdGlvbnNGcm9tT2JqZWN0UGFnZUxheW91dCh0aGlzLm9PYmplY3RQYWdlTGF5b3V0KTtcblx0XHRpZiAoYVZpc2libGVTZWN0aW9ucykge1xuXHRcdFx0Y29uc3Qgdmlld0lkID0gdGhpcy5fZ2V0Vmlld0lkKHRoaXMuZ2V0SWQoKSk7XG5cdFx0XHRjb25zdCBvVmlldyA9IHNhcC51aS5nZXRDb3JlKCkuYnlJZCh2aWV3SWQgYXMgc3RyaW5nKTtcblx0XHRcdGNvbnN0IHNBY3Rpb25OYW1lID0gb1ZpZXc/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwic0FjdGlvbk5hbWVcIik7XG5cdFx0XHRpZiAoc0FjdGlvbk5hbWUpIHtcblx0XHRcdFx0KG9WaWV3Py5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIGFueSkuc2V0UHJvcGVydHkoXCJzQWN0aW9uTmFtZVwiLCBudWxsKTtcblx0XHRcdH1cblx0XHRcdGZvciAoaSA9IGFNZXNzYWdlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuXHRcdFx0XHQvLyBMb29wIG92ZXIgYWxsIG1lc3NhZ2VzXG5cdFx0XHRcdG1lc3NhZ2UgPSBhTWVzc2FnZXNbaV07XG5cdFx0XHRcdGxldCBiSXNHZW5lcmFsR3JvdXBOYW1lID0gdHJ1ZTtcblx0XHRcdFx0Zm9yIChqID0gYVZpc2libGVTZWN0aW9ucy5sZW5ndGggLSAxOyBqID49IDA7IC0taikge1xuXHRcdFx0XHRcdC8vIExvb3Agb3ZlciBhbGwgdmlzaWJsZSBzZWN0aW9uc1xuXHRcdFx0XHRcdHNlY3Rpb24gPSBhVmlzaWJsZVNlY3Rpb25zW2pdO1xuXHRcdFx0XHRcdGFTdWJTZWN0aW9ucyA9IHNlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKTtcblx0XHRcdFx0XHRmb3IgKGsgPSBhU3ViU2VjdGlvbnMubGVuZ3RoIC0gMTsgayA+PSAwOyAtLWspIHtcblx0XHRcdFx0XHRcdC8vIExvb3Agb3ZlciBhbGwgc3ViLXNlY3Rpb25zXG5cdFx0XHRcdFx0XHRjb25zdCBzdWJTZWN0aW9uID0gYVN1YlNlY3Rpb25zW2tdO1xuXHRcdFx0XHRcdFx0Y29uc3QgYUNvbnRyb2xzID0gdGhpcy5fZ2V0Q29udHJvbEZyb21NZXNzYWdlUmVsYXRpbmdUb1N1YlNlY3Rpb24oc3ViU2VjdGlvbiwgbWVzc2FnZSk7XG5cdFx0XHRcdFx0XHRpZiAoYUNvbnRyb2xzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb1RhcmdldGVkQ29udHJvbCA9IHRoaXMuX2NvbXB1dGVNZXNzYWdlR3JvdXBBbmRTdWJUaXRsZShcblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlLFxuXHRcdFx0XHRcdFx0XHRcdHNlY3Rpb24sXG5cdFx0XHRcdFx0XHRcdFx0c3ViU2VjdGlvbixcblx0XHRcdFx0XHRcdFx0XHRhQ29udHJvbHMsXG5cdFx0XHRcdFx0XHRcdFx0YVN1YlNlY3Rpb25zLmxlbmd0aCA+IDEsXG5cdFx0XHRcdFx0XHRcdFx0c0FjdGlvbk5hbWVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0Ly8gaWYgd2UgZm91bmQgdGFibGUgdGhhdCBtYXRjaGVzIHdpdGggdGhlIG1lc3NhZ2UsIHdlIGRvbid0IHN0b3AgdGhlIGxvb3Bcblx0XHRcdFx0XHRcdFx0Ly8gaW4gY2FzZSB3ZSBmaW5kIGFuIGFkZGl0aW9uYWwgY29udHJvbCAoZWcgbWRjIGZpZWxkKSB0aGF0IGFsc28gbWF0Y2ggd2l0aCB0aGUgbWVzc2FnZVxuXHRcdFx0XHRcdFx0XHRpZiAob1RhcmdldGVkQ29udHJvbCAmJiAhb1RhcmdldGVkQ29udHJvbC5pc0EoXCJzYXAubS5UYWJsZVwiKSAmJiAhb1RhcmdldGVkQ29udHJvbC5pc0EoXCJzYXAudWkudGFibGUuVGFibGVcIikpIHtcblx0XHRcdFx0XHRcdFx0XHRqID0gayA9IC0xO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGJJc0dlbmVyYWxHcm91cE5hbWUgPSBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGJJc0dlbmVyYWxHcm91cE5hbWUpIHtcblx0XHRcdFx0XHRjb25zdCBvTWVzc2FnZU9iamVjdCA9IG1lc3NhZ2UuZ2V0QmluZGluZ0NvbnRleHQoXCJtZXNzYWdlXCIpLmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdG1lc3NhZ2Uuc2V0QWN0aXZlVGl0bGUoZmFsc2UpO1xuXHRcdFx0XHRcdGlmIChvTWVzc2FnZU9iamVjdC5wZXJzaXN0ZW50ICYmIHNBY3Rpb25OYW1lKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRHcm91cExhYmVsRm9yVHJhbnNpZW50TXNnKG1lc3NhZ2UsIHNBY3Rpb25OYW1lKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bWVzc2FnZS5zZXRHcm91cE5hbWUodGhpcy5zR2VuZXJhbEdyb3VwVGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghYkVuYWJsZUJpbmRpbmcgJiYgbWVzc2FnZS5nZXRHcm91cE5hbWUoKSA9PT0gdGhpcy5zR2VuZXJhbEdyb3VwVGV4dCAmJiB0aGlzLl9maW5kVGFyZ2V0Rm9yTWVzc2FnZShtZXNzYWdlKSkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2ZpbmRUYXJnZXRGb3JNZXNzYWdlKG1lc3NhZ2U6IGFueSkge1xuXHRcdGNvbnN0IG1lc3NhZ2VPYmplY3QgPSBtZXNzYWdlLmdldEJpbmRpbmdDb250ZXh0KFwibWVzc2FnZVwiKSAmJiBtZXNzYWdlLmdldEJpbmRpbmdDb250ZXh0KFwibWVzc2FnZVwiKS5nZXRPYmplY3QoKTtcblx0XHRpZiAobWVzc2FnZU9iamVjdCAmJiBtZXNzYWdlT2JqZWN0LnRhcmdldCkge1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9XG5cdFx0XHRcdFx0dGhpcy5vT2JqZWN0UGFnZUxheW91dCAmJiB0aGlzLm9PYmplY3RQYWdlTGF5b3V0LmdldE1vZGVsKCkgJiYgdGhpcy5vT2JqZWN0UGFnZUxheW91dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRjb250ZXh0UGF0aCA9IG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChtZXNzYWdlT2JqZWN0LnRhcmdldCksXG5cdFx0XHRcdG9Db250ZXh0UGF0aE1ldGFkYXRhID0gb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE9iamVjdChjb250ZXh0UGF0aCk7XG5cdFx0XHRpZiAob0NvbnRleHRQYXRoTWV0YWRhdGEgJiYgb0NvbnRleHRQYXRoTWV0YWRhdGEuJGtpbmQgPT0gXCJQcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9mbkVuYWJsZUJpbmRpbmdzKGFTZWN0aW9uczogYW55W10pIHtcblx0XHRpZiAoVXJpUGFyYW1ldGVycy5mcm9tUXVlcnkod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KFwic2FwLWZlLXh4LWxhenlsb2FkaW5ndGVzdFwiKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRmb3IgKGxldCBpU2VjdGlvbiA9IDA7IGlTZWN0aW9uIDwgYVNlY3Rpb25zLmxlbmd0aDsgaVNlY3Rpb24rKykge1xuXHRcdFx0Y29uc3Qgb1NlY3Rpb24gPSBhU2VjdGlvbnNbaVNlY3Rpb25dO1xuXHRcdFx0bGV0IG5vblRhYmxlQ2hhcnRjb250cm9sRm91bmQgPSBmYWxzZTtcblx0XHRcdGNvbnN0IGFTdWJTZWN0aW9ucyA9IG9TZWN0aW9uLmdldFN1YlNlY3Rpb25zKCk7XG5cdFx0XHRmb3IgKGxldCBpU3ViU2VjdGlvbiA9IDA7IGlTdWJTZWN0aW9uIDwgYVN1YlNlY3Rpb25zLmxlbmd0aDsgaVN1YlNlY3Rpb24rKykge1xuXHRcdFx0XHRjb25zdCBvU3ViU2VjdGlvbiA9IGFTdWJTZWN0aW9uc1tpU3ViU2VjdGlvbl07XG5cdFx0XHRcdGNvbnN0IG9BbGxCbG9ja3MgPSBvU3ViU2VjdGlvbi5nZXRCbG9ja3MoKTtcblx0XHRcdFx0aWYgKG9BbGxCbG9ja3MpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBibG9jayA9IDA7IGJsb2NrIDwgb1N1YlNlY3Rpb24uZ2V0QmxvY2tzKCkubGVuZ3RoOyBibG9jaysrKSB7XG5cdFx0XHRcdFx0XHRpZiAob0FsbEJsb2Nrc1tibG9ja10uZ2V0Q29udGVudCAmJiAhb0FsbEJsb2Nrc1tibG9ja10uZ2V0Q29udGVudCgpLmlzQShcInNhcC5mZS5tYWNyb3MuVGFibGVBUElcIikpIHtcblx0XHRcdFx0XHRcdFx0bm9uVGFibGVDaGFydGNvbnRyb2xGb3VuZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAobm9uVGFibGVDaGFydGNvbnRyb2xGb3VuZCkge1xuXHRcdFx0XHRcdFx0b1N1YlNlY3Rpb24uc2V0QmluZGluZ0NvbnRleHQodW5kZWZpbmVkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9TdWJTZWN0aW9uLmdldEJpbmRpbmdDb250ZXh0KCkgJiYgdGhpcy5fZmluZE1lc3NhZ2VHcm91cEFmdGVyUmViaW5kaW5nKCkpIHtcblx0XHRcdFx0XHRvU3ViU2VjdGlvblxuXHRcdFx0XHRcdFx0LmdldEJpbmRpbmdDb250ZXh0KClcblx0XHRcdFx0XHRcdC5nZXRCaW5kaW5nKClcblx0XHRcdFx0XHRcdC5hdHRhY2hEYXRhUmVjZWl2ZWQodGhpcy5fZmluZE1lc3NhZ2VHcm91cEFmdGVyUmViaW5kaW5nKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2ZpbmRNZXNzYWdlR3JvdXBBZnRlclJlYmluZGluZygpIHtcblx0XHRjb25zdCBhTWVzc2FnZXMgPSB0aGlzLm9NZXNzYWdlUG9wb3Zlci5nZXRJdGVtcygpO1xuXHRcdHRoaXMuX2NoZWNrQ29udHJvbElkSW5TZWN0aW9ucyhhTWVzc2FnZXMsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtZXRob2QgdGhhdCByZXRyaWV2ZXMgdGhlIHZpZXcgSUQgKEhUTUxWaWV3L1hNTFZpZXcvSlNPTnZpZXcvSlNWaWV3L1RlbXBsYXRldmlldykgb2YgYW55IGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzQ29udHJvbElkIElEIG9mIHRoZSBjb250cm9sIG5lZWRlZCB0byByZXRyaWV2ZSB0aGUgdmlldyBJRFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgdmlldyBJRCBvZiB0aGUgY29udHJvbFxuXHQgKi9cblx0X2dldFZpZXdJZChzQ29udHJvbElkOiBzdHJpbmcpIHtcblx0XHRsZXQgc1ZpZXdJZCxcblx0XHRcdG9Db250cm9sID0gc2FwLnVpLmdldENvcmUoKS5ieUlkKHNDb250cm9sSWQpIGFzIGFueTtcblx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdGlmIChvQ29udHJvbCBpbnN0YW5jZW9mIFZpZXcpIHtcblx0XHRcdFx0c1ZpZXdJZCA9IG9Db250cm9sLmdldElkKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0b0NvbnRyb2wgPSBvQ29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNWaWV3SWQ7XG5cdH1cblxuXHRfc2V0TG9uZ3RleHRVcmxEZXNjcmlwdGlvbihzTWVzc2FnZURlc2NyaXB0aW9uQ29udGVudDogc3RyaW5nLCBvRGlhZ25vc2lzVGl0bGU6IGFueSkge1xuXHRcdHRoaXMub01lc3NhZ2VQb3BvdmVyLnNldEFzeW5jRGVzY3JpcHRpb25IYW5kbGVyKGZ1bmN0aW9uKGNvbmZpZzogYW55KSB7XG5cdFx0XHQvLyBUaGlzIHN0b3JlcyB0aGUgb2xkIGRlc2NyaXB0aW9uXG5cdFx0XHRjb25zdCBzT2xkRGVzY3JpcHRpb24gPSBzTWVzc2FnZURlc2NyaXB0aW9uQ29udGVudDtcblx0XHRcdC8vIEhlcmUgd2UgY2FuIGZldGNoIHRoZSBkYXRhIGFuZCBjb25jYXRlbmF0ZSBpdCB0byB0aGUgb2xkIG9uZVxuXHRcdFx0Ly8gQnkgZGVmYXVsdCwgdGhlIGxvbmd0ZXh0VXJsIGZldGNoaW5nIHdpbGwgb3ZlcndyaXRlIHRoZSBkZXNjcmlwdGlvbiAod2l0aCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIpXG5cdFx0XHQvLyBIZXJlIGFzIHdlIGhhdmUgb3ZlcndyaXR0ZW4gdGhlIGRlZmF1bHQgYXN5bmMgaGFuZGxlciwgd2hpY2ggZmV0Y2hlcyBhbmQgcmVwbGFjZXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBpdGVtXG5cdFx0XHQvLyB3ZSBjYW4gbWFudWFsbHkgbW9kaWZ5IGl0IHRvIGluY2x1ZGUgd2hhdGV2ZXIgbmVlZGVkLlxuXHRcdFx0Y29uc3Qgc0xvbmdUZXh0VXJsID0gY29uZmlnLml0ZW0uZ2V0TG9uZ3RleHRVcmwoKTtcblx0XHRcdGlmIChzTG9uZ1RleHRVcmwpIHtcblx0XHRcdFx0alF1ZXJ5LmFqYXgoe1xuXHRcdFx0XHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0XHRcdFx0dXJsOiBzTG9uZ1RleHRVcmwsXG5cdFx0XHRcdFx0c3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0RpYWdub3Npc1RleHQgPSBvRGlhZ25vc2lzVGl0bGUuZ2V0SHRtbFRleHQoKSArIGRhdGE7XG5cdFx0XHRcdFx0XHRjb25maWcuaXRlbS5zZXREZXNjcmlwdGlvbihzT2xkRGVzY3JpcHRpb24gKyBcIlwiICsgc0RpYWdub3Npc1RleHQpO1xuXHRcdFx0XHRcdFx0Y29uZmlnLnByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZXJyb3I6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0Y29uZmlnLml0ZW0uc2V0RGVzY3JpcHRpb24oc01lc3NhZ2VEZXNjcmlwdGlvbkNvbnRlbnQpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0Vycm9yID0gXCJBIHJlcXVlc3QgaGFzIGZhaWxlZCBmb3IgbG9uZyB0ZXh0IGRhdGEuIFVSTDogXCIgKyBzTG9uZ1RleHRVcmw7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3Ioc0Vycm9yKTtcblx0XHRcdFx0XHRcdGNvbmZpZy5wcm9taXNlLnJlamVjdChzRXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRfZm9ybWF0TWVzc2FnZURlc2NyaXB0aW9uKG1lc3NhZ2U6IGFueSwgb1RhYmxlUm93Q29udGV4dDogYW55LCBzVGFibGVUYXJnZXRDb2xOYW1lOiBzdHJpbmcsIG9SZXNvdXJjZUJ1bmRsZTogYW55LCBvVGFibGU6IGFueSkge1xuXHRcdGNvbnN0IHNUYWJsZUZpcnN0Q29sUHJvcGVydHkgPSB0aGlzLl9nZXRUYWJsZUZpcnN0Q29sUHJvcGVydHkob1RhYmxlKTtcblx0XHRsZXQgc0NvbHVtbkluZm8gPSBcIlwiO1xuXHRcdGNvbnN0IG9Db2xGcm9tVGFibGVTZXR0aW5ncyA9IHRoaXMuX2ZldGNoQ29sdW1uSW5mbyhtZXNzYWdlLCBvVGFibGUpO1xuXHRcdGlmIChzVGFibGVUYXJnZXRDb2xOYW1lKSB7XG5cdFx0XHQvLyBpZiBjb2x1bW4gaW4gcHJlc2VudCBpbiB0YWJsZSBkZWZpbml0aW9uXG5cdFx0XHRzQ29sdW1uSW5mbyA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0dST1VQX0RFU0NSSVBUSU9OX1RBQkxFX0NPTFVNTlwiKSArIFwiOiBcIiArIHNUYWJsZVRhcmdldENvbE5hbWU7XG5cdFx0fSBlbHNlIGlmIChvQ29sRnJvbVRhYmxlU2V0dGluZ3MpIHtcblx0XHRcdGlmIChvQ29sRnJvbVRhYmxlU2V0dGluZ3MuYXZhaWxhYmlsaXR5ID09PSBcIkhpZGRlblwiKSB7XG5cdFx0XHRcdC8vIGlmIGNvbHVtbiBpbiBuZWl0aGVyIGluIHRhYmxlIGRlZmluaXRpb24gbm9yIHBlcnNvbmFsaXphdGlvblxuXHRcdFx0XHRpZiAobWVzc2FnZS5nZXRUeXBlKCkgPT09IFwiRXJyb3JcIikge1xuXHRcdFx0XHRcdHNDb2x1bW5JbmZvID1cblx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9DT0xVTU5fQVZBSUxBQkxFX0RJQUdOT1NJU19NU0dERVNDX0VSUk9SXCIpICtcblx0XHRcdFx0XHRcdFwiIFwiICtcblx0XHRcdFx0XHRcdG9UYWJsZVJvd0NvbnRleHQuZ2V0VmFsdWUoc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c0NvbHVtbkluZm8gPVxuXHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJUX0NPTFVNTl9BVkFJTEFCTEVfRElBR05PU0lTX01TR0RFU0NcIikgK1xuXHRcdFx0XHRcdFx0XCIgXCIgK1xuXHRcdFx0XHRcdFx0b1RhYmxlUm93Q29udGV4dC5nZXRWYWx1ZShzVGFibGVGaXJzdENvbFByb3BlcnR5KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gaWYgY29sdW1uIGlzIG5vdCBpbiB0YWJsZSBkZWZpbml0aW9uIGJ1dCBpbiBwZXJzb25hbGl6YXRpb25cblx0XHRcdFx0c0NvbHVtbkluZm8gPVxuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0dST1VQX0RFU0NSSVBUSU9OX1RBQkxFX0NPTFVNTlwiKSArXG5cdFx0XHRcdFx0XCI6IFwiICtcblx0XHRcdFx0XHRvQ29sRnJvbVRhYmxlU2V0dGluZ3MubGFiZWwgK1xuXHRcdFx0XHRcdFwiIChcIiArXG5cdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJUX0NPTFVNTl9JTkRJQ0FUT1JfSU5fVEFCTEVfREVGSU5JVElPTlwiKSArXG5cdFx0XHRcdFx0XCIpXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IG9GaWVsZHNBZmZlY3RlZFRpdGxlID0gbmV3IEZvcm1hdHRlZFRleHQoe1xuXHRcdFx0aHRtbFRleHQ6IFwiPGh0bWw+PGJvZHk+PHN0cm9uZz5cIiArIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9GSUVMRFNfQUZGRUNURURfVElUTEVcIikgKyBcIjwvc3Ryb25nPjwvYm9keT48L2h0bWw+PGJyPlwiXG5cdFx0fSk7XG5cdFx0Y29uc3Qgc0ZpZWxkQWZmZWN0ZWRUZXh0ID1cblx0XHRcdG9GaWVsZHNBZmZlY3RlZFRpdGxlLmdldEh0bWxUZXh0KCkgK1xuXHRcdFx0XCI8YnI+XCIgK1xuXHRcdFx0b1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJUX01FU1NBR0VfR1JPVVBfVElUTEVfVEFCTEVfREVOT01JTkFUT1JcIikgK1xuXHRcdFx0XCI6IFwiICtcblx0XHRcdG9UYWJsZS5nZXRIZWFkZXIoKSArXG5cdFx0XHRcIjxicj5cIiArXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlRfTUVTU0FHRV9HUk9VUF9ERVNDUklQVElPTl9UQUJMRV9ST1dcIikgK1xuXHRcdFx0XCI6IFwiICtcblx0XHRcdG9UYWJsZVJvd0NvbnRleHQuZ2V0VmFsdWUoc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSkgK1xuXHRcdFx0XCI8YnI+XCIgK1xuXHRcdFx0c0NvbHVtbkluZm8gK1xuXHRcdFx0XCI8YnI+XCI7XG5cdFx0Y29uc3Qgb0RpYWdub3Npc1RpdGxlID0gbmV3IEZvcm1hdHRlZFRleHQoe1xuXHRcdFx0aHRtbFRleHQ6IFwiPGh0bWw+PGJvZHk+PHN0cm9uZz5cIiArIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9ESUFHTk9TSVNfVElUTEVcIikgKyBcIjwvc3Ryb25nPjwvYm9keT48L2h0bWw+PGJyPlwiXG5cdFx0fSk7XG5cdFx0Ly8gZ2V0IHRoZSBVSSBtZXNzYWdlcyBmcm9tIHRoZSBtZXNzYWdlIGNvbnRleHQgdG8gc2V0IGl0IHRvIERpYWdub3NpcyBzZWN0aW9uXG5cdFx0Y29uc3Qgc1VJTWVzc2FnZURlc2NyaXB0aW9uID0gbWVzc2FnZS5nZXRCaW5kaW5nQ29udGV4dChcIm1lc3NhZ2VcIikuZ2V0T2JqZWN0KCkuZGVzY3JpcHRpb247XG5cdFx0Ly9zZXQgdGhlIGRlc2NyaXB0aW9uIHRvIG51bGwgdG8gcmVzZXQgaXQgYmVsb3dcblx0XHRtZXNzYWdlLnNldERlc2NyaXB0aW9uKG51bGwpO1xuXHRcdGxldCBzRGlhZ25vc2lzVGV4dCA9IFwiXCI7XG5cdFx0bGV0IHNNZXNzYWdlRGVzY3JpcHRpb25Db250ZW50ID0gXCJcIjtcblx0XHRpZiAobWVzc2FnZS5nZXRMb25ndGV4dFVybCgpKSB7XG5cdFx0XHRzTWVzc2FnZURlc2NyaXB0aW9uQ29udGVudCA9IHNGaWVsZEFmZmVjdGVkVGV4dCArIFwiPGJyPlwiO1xuXHRcdFx0dGhpcy5fc2V0TG9uZ3RleHRVcmxEZXNjcmlwdGlvbihzTWVzc2FnZURlc2NyaXB0aW9uQ29udGVudCwgb0RpYWdub3Npc1RpdGxlKTtcblx0XHR9IGVsc2UgaWYgKHNVSU1lc3NhZ2VEZXNjcmlwdGlvbikge1xuXHRcdFx0c0RpYWdub3Npc1RleHQgPSBvRGlhZ25vc2lzVGl0bGUuZ2V0SHRtbFRleHQoKSArIFwiPGJyPlwiICsgc1VJTWVzc2FnZURlc2NyaXB0aW9uO1xuXHRcdFx0c01lc3NhZ2VEZXNjcmlwdGlvbkNvbnRlbnQgPSBzRmllbGRBZmZlY3RlZFRleHQgKyBcIjxicj5cIiArIHNEaWFnbm9zaXNUZXh0O1xuXHRcdFx0bWVzc2FnZS5zZXREZXNjcmlwdGlvbihzTWVzc2FnZURlc2NyaXB0aW9uQ29udGVudCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1lc3NhZ2Uuc2V0RGVzY3JpcHRpb24oc0ZpZWxkQWZmZWN0ZWRUZXh0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHNldCB0aGUgYnV0dG9uIHRleHQsIGNvdW50IGFuZCBpY29uIHByb3BlcnR5IGJhc2VkIHVwb24gdGhlIG1lc3NhZ2UgaXRlbXNcblx0ICogQnV0dG9uVHlwZTogIFBvc3NpYmxlIHNldHRpbmdzIGZvciB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcyBhcmUgJ2NyaXRpY2FsJyBhbmQgJ25lZ2F0aXZlJy5cblx0ICpcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9zZXRNZXNzYWdlRGF0YSgpIHtcblx0XHRjbGVhclRpbWVvdXQodGhpcy5fc2V0TWVzc2FnZURhdGFUaW1lb3V0KTtcblx0XHRjb25zdCB0aGF0ID0gdGhpcyBhcyBNZXNzYWdlQnV0dG9uO1xuXG5cdFx0dGhpcy5fc2V0TWVzc2FnZURhdGFUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRcdGNvbnN0IHNJY29uID0gXCJcIixcblx0XHRcdFx0b01lc3NhZ2VzID0gdGhhdC5vTWVzc2FnZVBvcG92ZXIuZ2V0SXRlbXMoKSxcblx0XHRcdFx0b01lc3NhZ2VDb3VudDogYW55ID0geyBFcnJvcjogMCwgV2FybmluZzogMCwgU3VjY2VzczogMCwgSW5mb3JtYXRpb246IDAgfSxcblx0XHRcdFx0b1Jlc291cmNlQnVuZGxlID0gc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSBhcyBhbnksXG5cdFx0XHRcdGlNZXNzYWdlTGVuZ3RoID0gb01lc3NhZ2VzLmxlbmd0aDtcblx0XHRcdGxldCBzQnV0dG9uVHlwZSA9IEJ1dHRvblR5cGUuRGVmYXVsdCxcblx0XHRcdFx0c01lc3NhZ2VLZXkgPSBcIlwiLFxuXHRcdFx0XHRzVG9vbHRpcFRleHQgPSBcIlwiLFxuXHRcdFx0XHRzTWVzc2FnZVRleHQgPSBcIlwiO1xuXHRcdFx0aWYgKGlNZXNzYWdlTGVuZ3RoID4gMCkge1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGlNZXNzYWdlTGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRpZiAoIW9NZXNzYWdlc1tpXS5nZXRUeXBlKCkgfHwgb01lc3NhZ2VzW2ldLmdldFR5cGUoKSA9PSBcIlwiKSB7XG5cdFx0XHRcdFx0XHQrK29NZXNzYWdlQ291bnRbXCJJbmZvcm1hdGlvblwiXTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0KytvTWVzc2FnZUNvdW50W29NZXNzYWdlc1tpXS5nZXRUeXBlKCldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob01lc3NhZ2VDb3VudFtNZXNzYWdlVHlwZS5FcnJvcl0gPiAwKSB7XG5cdFx0XHRcdFx0c0J1dHRvblR5cGUgPSBCdXR0b25UeXBlLk5lZ2F0aXZlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9NZXNzYWdlQ291bnRbTWVzc2FnZVR5cGUuV2FybmluZ10gPiAwKSB7XG5cdFx0XHRcdFx0c0J1dHRvblR5cGUgPSBCdXR0b25UeXBlLkNyaXRpY2FsO1xuXHRcdFx0XHR9IGVsc2UgaWYgKG9NZXNzYWdlQ291bnRbTWVzc2FnZVR5cGUuU3VjY2Vzc10gPiAwKSB7XG5cdFx0XHRcdFx0c0J1dHRvblR5cGUgPSBCdXR0b25UeXBlLlN1Y2Nlc3M7XG5cdFx0XHRcdH0gZWxzZSBpZiAob01lc3NhZ2VDb3VudFtNZXNzYWdlVHlwZS5JbmZvcm1hdGlvbl0gPiAwKSB7XG5cdFx0XHRcdFx0c0J1dHRvblR5cGUgPSBCdXR0b25UeXBlLk5ldXRyYWw7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9NZXNzYWdlQ291bnQuRXJyb3IgPiAwKSB7XG5cdFx0XHRcdFx0dGhhdC5zZXRUZXh0KG9NZXNzYWdlQ291bnQuRXJyb3IpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoYXQuc2V0VGV4dChcIlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAob01lc3NhZ2VDb3VudC5FcnJvciA9PT0gMSkge1xuXHRcdFx0XHRcdHNNZXNzYWdlS2V5ID0gXCJDX0NPTU1PTl9TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX0VSUk9SXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAob01lc3NhZ2VDb3VudC5FcnJvciA+IDEpIHtcblx0XHRcdFx0XHRzTWVzc2FnZUtleSA9IFwiQ19DT01NT05fU0FQRkVfRVJST1JfTUVTU0FHRVNfUEFHRV9NVUxUSVBMRV9FUlJPUl9UT09MVElQXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIW9NZXNzYWdlQ291bnQuRXJyb3IgJiYgb01lc3NhZ2VDb3VudC5XYXJuaW5nKSB7XG5cdFx0XHRcdFx0c01lc3NhZ2VLZXkgPSBcIkNfQ09NTU9OX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfV0FSTklOR19UT09MVElQXCI7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIW9NZXNzYWdlQ291bnQuRXJyb3IgJiYgIW9NZXNzYWdlQ291bnQuV2FybmluZyAmJiBvTWVzc2FnZUNvdW50LkluZm9ybWF0aW9uKSB7XG5cdFx0XHRcdFx0c01lc3NhZ2VLZXkgPSBcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX0lORk9cIjtcblx0XHRcdFx0fSBlbHNlIGlmICghb01lc3NhZ2VDb3VudC5FcnJvciAmJiAhb01lc3NhZ2VDb3VudC5XYXJuaW5nICYmICFvTWVzc2FnZUNvdW50LkluZm9ybWF0aW9uICYmIG9NZXNzYWdlQ291bnQuU3VjY2Vzcykge1xuXHRcdFx0XHRcdHNNZXNzYWdlS2V5ID0gXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfRVJST1JfTUVTU0FHRVNfUEFHRV9USVRMRV9TVUNDRVNTXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHNNZXNzYWdlS2V5KSB7XG5cdFx0XHRcdFx0c01lc3NhZ2VUZXh0ID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoc01lc3NhZ2VLZXkpO1xuXHRcdFx0XHRcdHNUb29sdGlwVGV4dCA9IG9NZXNzYWdlQ291bnQuRXJyb3IgPyBvTWVzc2FnZUNvdW50LkVycm9yICsgXCIgXCIgKyBzTWVzc2FnZVRleHQgOiBzTWVzc2FnZVRleHQ7XG5cdFx0XHRcdFx0dGhhdC5zZXRUb29sdGlwKHNUb29sdGlwVGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhhdC5zZXRJY29uKHNJY29uKTtcblx0XHRcdFx0dGhhdC5zZXRUeXBlKHNCdXR0b25UeXBlKTtcblx0XHRcdFx0dGhhdC5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdFx0XHRjb25zdCBvVmlldyA9IHNhcC51aS5nZXRDb3JlKCkuYnlJZCh0aGF0LnNWaWV3SWQpIGFzIFZpZXc7XG5cdFx0XHRcdGlmIChvVmlldykge1xuXHRcdFx0XHRcdGNvbnN0IG9QYWdlUmVhZHkgPSAob1ZpZXcuZ2V0Q29udHJvbGxlcigpIGFzIFBhZ2VDb250cm9sbGVyKS5wYWdlUmVhZHk7XG5cdFx0XHRcdFx0b1BhZ2VSZWFkeVxuXHRcdFx0XHRcdFx0LndhaXRQYWdlUmVhZHkoKVxuXHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0aGF0Ll9hcHBseUdyb3VwaW5nQXN5bmMob1ZpZXcpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdC5maW5hbGx5KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHQodGhhdCBhcyBhbnkpLmZpcmVNZXNzYWdlQ2hhbmdlKHtcblx0XHRcdFx0XHRcdFx0XHRpTWVzc2FnZUxlbmd0aDogaU1lc3NhZ2VMZW5ndGhcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJmYWlsIGdyb3VwaW5nIG1lc3NhZ2VzXCIpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGlNZXNzYWdlTGVuZ3RoID4gMSkge1xuXHRcdFx0XHRcdHRoYXQub01lc3NhZ2VQb3BvdmVyLm5hdmlnYXRlQmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGF0LnNldFZpc2libGUoZmFsc2UpO1xuXHRcdFx0XHQodGhhdCBhcyBhbnkpLmZpcmVNZXNzYWdlQ2hhbmdlKHtcblx0XHRcdFx0XHRpTWVzc2FnZUxlbmd0aDogaU1lc3NhZ2VMZW5ndGhcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSwgMTAwKTtcblx0fVxuXG5cdF9iSXNPcnBoYW5FbGVtZW50KG9FbGVtZW50OiBhbnksIGFFbGVtZW50czogYW55W10pIHtcblx0XHRyZXR1cm4gIWFFbGVtZW50cy5zb21lKFxuXHRcdFx0ZnVuY3Rpb24ob0VsZW1lbnQ6IGFueSwgb0VsZW06IGFueSkge1xuXHRcdFx0XHRsZXQgb1BhcmVudEVsZW1lbnQgPSBvRWxlbWVudC5nZXRQYXJlbnQoKTtcblx0XHRcdFx0d2hpbGUgKG9QYXJlbnRFbGVtZW50ICYmIG9QYXJlbnRFbGVtZW50ICE9PSBvRWxlbSkge1xuXHRcdFx0XHRcdG9QYXJlbnRFbGVtZW50ID0gb1BhcmVudEVsZW1lbnQuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG9QYXJlbnRFbGVtZW50ID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdFx0fS5iaW5kKHRoaXMsIG9FbGVtZW50KVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCB3aGVuIGEgdXNlciBjbGlja3Mgb24gdGhlIHRpdGxlIG9mIHRoZSBtZXNzYWdlLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2FjdGl2ZVRpdGxlUHJlc3Ncblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtFdmVudH0gb0V2ZW50IEV2ZW50IG9iamVjdCBwYXNzZWQgZnJvbSB0aGUgaGFuZGxlclxuXHQgKi9cblx0X2FjdGl2ZVRpdGxlUHJlc3Mob0V2ZW50OiBDb3JlRXZlbnQpIHtcblx0XHRjb25zdCB0aGF0ID0gdGhpcyBhcyBNZXNzYWdlQnV0dG9uO1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0QmluZGluZ0NvbnRleHQoXCJwYWdlSW50ZXJuYWxcIik7XG5cdFx0KG9JbnRlcm5hbE1vZGVsQ29udGV4dCBhcyBhbnkpLnNldFByb3BlcnR5KFwiZXJyb3JOYXZpZ2F0aW9uU2VjdGlvbkZsYWdcIiwgdHJ1ZSk7XG5cdFx0Y29uc3Qgb0l0ZW0gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiaXRlbVwiKSxcblx0XHRcdG9NZXNzYWdlID0gb0l0ZW0uZ2V0QmluZGluZ0NvbnRleHQoXCJtZXNzYWdlXCIpLmdldE9iamVjdCgpLFxuXHRcdFx0YklzQmFja2VuZE1lc3NhZ2UgPSBuZXcgUmVnRXhwKFwiXi9cIikudGVzdChvTWVzc2FnZS5nZXRUYXJnZXQoKSksXG5cdFx0XHRvVmlldyA9IHNhcC51aS5nZXRDb3JlKCkuYnlJZCh0aGlzLnNWaWV3SWQpIGFzIFZpZXcsXG5cdFx0XHRvTWVzc2FnZVBvcG92ZXIgPSB0aGlzLm9NZXNzYWdlUG9wb3Zlcjtcblx0XHRsZXQgb0NvbnRyb2wsIHNTZWN0aW9uVGl0bGU7XG5cblx0XHRpZiAob01lc3NhZ2VQb3BvdmVyICYmIG9NZXNzYWdlUG9wb3Zlci5pc09wZW4oKSkge1xuXHRcdFx0b01lc3NhZ2VQb3BvdmVyLmNsb3NlKCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgX2ZvY3VzT25NZXNzYWdlVGFyZ2V0Q29udHJvbCA9IGZ1bmN0aW9uKG9NZXNzYWdlOiBhbnksIG9UYXJnZXRNZGNUYWJsZT86IGFueSwgaVJvd0luZGV4PzogbnVtYmVyKSB7XG5cdFx0XHRjb25zdCBhQWxsVmlld0VsZW1lbnRzID0gb1ZpZXcuZmluZEVsZW1lbnRzKHRydWUpO1xuXHRcdFx0Y29uc3QgYUVycm9uZW91c0NvbnRyb2xzID0gb01lc3NhZ2Vcblx0XHRcdFx0LmdldENvbnRyb2xJZHMoKVxuXHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uKHNDb250cm9sSWQ6IHN0cmluZykge1xuXHRcdFx0XHRcdHJldHVybiBhQWxsVmlld0VsZW1lbnRzLnNvbWUoZnVuY3Rpb24ob0VsZW0pIHtcblx0XHRcdFx0XHRcdHJldHVybiBvRWxlbS5nZXRJZCgpID09PSBzQ29udHJvbElkO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQubWFwKGZ1bmN0aW9uKHNDb250cm9sSWQ6IHN0cmluZykge1xuXHRcdFx0XHRcdHJldHVybiBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoc0NvbnRyb2xJZCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgYU5vdFRhYmxlRXJyb25lb3VzQ29udHJvbHMgPSBhRXJyb25lb3VzQ29udHJvbHMuZmlsdGVyKGZ1bmN0aW9uKG9FbGVtOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuICFvRWxlbS5pc0EoXCJzYXAubS5UYWJsZVwiKSAmJiAhb0VsZW0uaXNBKFwic2FwLnVpLnRhYmxlLlRhYmxlXCIpO1xuXHRcdFx0fSk7XG5cdFx0XHQvL1RoZSBmb2N1cyBpcyBzZXQgb24gTm90IFRhYmxlIGNvbnRyb2wgaW4gcHJpb3JpdHlcblx0XHRcdGlmIChhTm90VGFibGVFcnJvbmVvdXNDb250cm9scy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGFOb3RUYWJsZUVycm9uZW91c0NvbnRyb2xzWzBdLmZvY3VzKCk7XG5cdFx0XHR9IGVsc2UgaWYgKGFFcnJvbmVvdXNDb250cm9scy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGFFcnJvbmVvdXNDb250cm9sc1swXS5mb2N1cygpO1xuXHRcdFx0XHRjb25zdCBhVGFyZ2V0TWRjVGFibGVSb3cgPSBvVGFyZ2V0TWRjVGFibGVcblx0XHRcdFx0XHQ/IG9UYXJnZXRNZGNUYWJsZS5maW5kRWxlbWVudHModHJ1ZSwgZnVuY3Rpb24ob0VsZW06IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb0VsZW0uaXNBKFwic2FwLm0uQ29sdW1uTGlzdEl0ZW1cIik7XG5cdFx0XHRcdFx0ICB9KVxuXHRcdFx0XHRcdDogW107XG5cdFx0XHRcdGlmIChhVGFyZ2V0TWRjVGFibGVSb3cubGVuZ3RoID4gMCAmJiBhVGFyZ2V0TWRjVGFibGVSb3dbMF0pIHtcblx0XHRcdFx0XHRjb25zdCBvVGFyZ2V0Um93ID0gYVRhcmdldE1kY1RhYmxlUm93W2lSb3dJbmRleCBhcyBudW1iZXJdO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRDZWxsID0gX2dldFRhcmdldENlbGwob1RhcmdldFJvdywgb01lc3NhZ2UpO1xuXHRcdFx0XHRcdGlmIChvVGFyZ2V0Q2VsbCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1RhcmdldEZpZWxkID0gb1RhcmdldENlbGwuaXNBKFwic2FwLmZlLm1hY3Jvcy5GaWVsZEFQSVwiKVxuXHRcdFx0XHRcdFx0XHQ/IG9UYXJnZXRDZWxsLmdldENvbnRlbnQoKS5nZXRDb250ZW50RWRpdCgpWzBdXG5cdFx0XHRcdFx0XHRcdDogb1RhcmdldENlbGxcblx0XHRcdFx0XHRcdFx0XHRcdC5nZXRJdGVtcygpWzBdXG5cdFx0XHRcdFx0XHRcdFx0XHQuZ2V0Q29udGVudCgpXG5cdFx0XHRcdFx0XHRcdFx0XHQuZ2V0Q29udGVudEVkaXQoKVswXTtcblx0XHRcdFx0XHRcdG9UYXJnZXRGaWVsZC5mb2N1cygpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBjb250cm9sIG5vdCBmb3VuZCBvbiB0YWJsZVxuXHRcdFx0XHRcdFx0Y29uc3QgZXJyb3JQcm9wZXJ0eSA9IG9NZXNzYWdlXG5cdFx0XHRcdFx0XHRcdC5nZXRUYXJnZXQoKVxuXHRcdFx0XHRcdFx0XHQuc3BsaXQoXCIvXCIpXG5cdFx0XHRcdFx0XHRcdC5wb3AoKTtcblx0XHRcdFx0XHRcdGlmIChlcnJvclByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdChvVmlldy5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbCkuc2V0UHJvcGVydHkoXCIvbWVzc2FnZVRhcmdldFByb3BlcnR5XCIsIGVycm9yUHJvcGVydHkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0KG9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX3JvdXRpbmcubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG9UYXJnZXRSb3cuZ2V0QmluZGluZ0NvbnRleHQoKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGZ1bmN0aW9uIF9nZXRUYXJnZXRDZWxsKG9UYXJnZXRSb3c6IGFueSwgb01lc3NhZ2U6IGFueSkge1xuXHRcdFx0Y29uc3Qgb1RhcmdldENlbGwgPSBvTWVzc2FnZS5jb250cm9sSWRzXG5cdFx0XHRcdC5tYXAoZnVuY3Rpb24oc0NvbnRyb2xJZDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0Y29uc3QgaXNDb250cm9sSW5UYWJsZSA9IG9UYXJnZXRSb3cuZmluZEVsZW1lbnRzKHRydWUsIGZ1bmN0aW9uKG9FbGVtOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvRWxlbS5nZXRJZCgpID09PSBzQ29udHJvbElkO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybiBpc0NvbnRyb2xJblRhYmxlLmxlbmd0aCA+IDAgPyBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoc0NvbnRyb2xJZCkgOiBudWxsO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQucmVkdWNlKGZ1bmN0aW9uKGFjYzogYW55LCB2YWw6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiB2YWwgPyB2YWwgOiBhY2M7XG5cdFx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIG9UYXJnZXRDZWxsO1xuXHRcdH1cblxuXHRcdC8vY2hlY2sgaWYgdGhlIHByZXNzZWQgaXRlbSBpcyByZWxhdGVkIHRvIGEgdGFibGUgY29udHJvbFxuXHRcdGlmIChvSXRlbS5nZXRHcm91cE5hbWUoKS5pbmRleE9mKFwiVGFibGU6XCIpICE9PSAtMSkge1xuXHRcdFx0bGV0IG9UYXJnZXRNZGNUYWJsZTogYW55O1xuXHRcdFx0aWYgKGJJc0JhY2tlbmRNZXNzYWdlKSB7XG5cdFx0XHRcdG9UYXJnZXRNZGNUYWJsZSA9IG9NZXNzYWdlLmNvbnRyb2xJZHNcblx0XHRcdFx0XHQubWFwKGZ1bmN0aW9uKHNDb250cm9sSWQ6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0NvbnRyb2wgPSBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoc0NvbnRyb2xJZCk7XG5cdFx0XHRcdFx0XHRjb25zdCBvUGFyZW50Q29udHJvbCA9IG9Db250cm9sICYmIChvQ29udHJvbC5nZXRQYXJlbnQoKSBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9QYXJlbnRDb250cm9sICYmXG5cdFx0XHRcdFx0XHRcdG9QYXJlbnRDb250cm9sLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikgJiZcblx0XHRcdFx0XHRcdFx0b1BhcmVudENvbnRyb2wuZ2V0SGVhZGVyKCkgPT09IG9JdGVtLmdldEdyb3VwTmFtZSgpLnNwbGl0KFwiLCBUYWJsZTogXCIpWzFdXG5cdFx0XHRcdFx0XHRcdD8gb1BhcmVudENvbnRyb2xcblx0XHRcdFx0XHRcdFx0OiBudWxsO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LnJlZHVjZShmdW5jdGlvbihhY2M6IGFueSwgdmFsOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJldHVybiB2YWwgPyB2YWwgOiBhY2M7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChvVGFyZ2V0TWRjVGFibGUpIHtcblx0XHRcdFx0XHRzU2VjdGlvblRpdGxlID0gb0l0ZW0uZ2V0R3JvdXBOYW1lKCkuc3BsaXQoXCIsIFwiKVswXTtcblx0XHRcdFx0XHR0aGlzLl9uYXZpZ2F0ZUZyb21NZXNzYWdlVG9TZWN0aW9uVGFibGVJbkljb25UYWJCYXJNb2RlKG9UYXJnZXRNZGNUYWJsZSwgdGhpcy5vT2JqZWN0UGFnZUxheW91dCwgc1NlY3Rpb25UaXRsZSlcblx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvUmVmRXJyb3JDb250ZXh0ID0gdGhhdC5fZ2V0VGFibGVSZWZFcnJvckNvbnRleHQob1RhcmdldE1kY1RhYmxlKTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb1JlZkVycm9yID0gb1JlZkVycm9yQ29udGV4dC5nZXRQcm9wZXJ0eShcblx0XHRcdFx0XHRcdFx0XHRvSXRlbVxuXHRcdFx0XHRcdFx0XHRcdFx0LmdldEJpbmRpbmdDb250ZXh0KFwibWVzc2FnZVwiKVxuXHRcdFx0XHRcdFx0XHRcdFx0LmdldE9iamVjdCgpXG5cdFx0XHRcdFx0XHRcdFx0XHQuZ2V0SWQoKVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBfc2V0Rm9jdXNPblRhcmdldEZpZWxkID0gZnVuY3Rpb24ob1RhcmdldE1kY1RhYmxlOiBhbnksIGlSb3dJbmRleDogbnVtYmVyKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgYVRhcmdldE1kY1RhYmxlUm93ID0gdGhhdC5fZ2V0TWRjVGFibGVSb3dzKG9UYXJnZXRNZGNUYWJsZSksXG5cdFx0XHRcdFx0XHRcdFx0XHRpRmlyc3RWaXNpYmxlUm93ID0gdGhhdC5fZ2V0R3JpZFRhYmxlKG9UYXJnZXRNZGNUYWJsZSkuZ2V0Rmlyc3RWaXNpYmxlUm93KCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGFUYXJnZXRNZGNUYWJsZVJvdy5sZW5ndGggPiAwICYmIGFUYXJnZXRNZGNUYWJsZVJvd1swXSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1RhcmdldFJvdyA9IGFUYXJnZXRNZGNUYWJsZVJvd1tpUm93SW5kZXggLSBpRmlyc3RWaXNpYmxlUm93XSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1RhcmdldENlbGwgPSBfZ2V0VGFyZ2V0Q2VsbChvVGFyZ2V0Um93LCBvTWVzc2FnZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAob1RhcmdldENlbGwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1RhcmdldENlbGwuZm9jdXMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGNvbnRyb2wgbm90IGZvdW5kIG9uIHRhYmxlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGVycm9yUHJvcGVydHkgPSBvTWVzc2FnZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5nZXRUYXJnZXQoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5zcGxpdChcIi9cIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQucG9wKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChlcnJvclByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KG9WaWV3LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsKS5zZXRQcm9wZXJ0eShcIi9tZXNzYWdlVGFyZ2V0UHJvcGVydHlcIiwgZXJyb3JQcm9wZXJ0eSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0KG9WaWV3LmdldENvbnRyb2xsZXIoKSBhcyBQYWdlQ29udHJvbGxlcikuX3JvdXRpbmcubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9UYXJnZXRSb3cuZ2V0QmluZGluZ0NvbnRleHQoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHsgdGFyZ2V0Um93OiBvVGFyZ2V0Um93LCB0YXJnZXRDZWxsOiBvVGFyZ2V0Q2VsbCB9O1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4geyB0YXJnZXRSb3c6IG51bGwsIHRhcmdldENlbGw6IG51bGwgfTtcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0aWYgKG9UYXJnZXRNZGNUYWJsZS5kYXRhKFwidGFibGVUeXBlXCIpID09PSBcIkdyaWRUYWJsZVwiICYmIG9SZWZFcnJvci5yb3dJbmRleCAhPT0gXCJcIikge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGlGaXJzdFZpc2libGVSb3cgPSB0aGF0Ll9nZXRHcmlkVGFibGUob1RhcmdldE1kY1RhYmxlKS5nZXRGaXJzdFZpc2libGVSb3coKTtcblx0XHRcdFx0XHRcdFx0XHRvVGFyZ2V0TWRjVGFibGVcblx0XHRcdFx0XHRcdFx0XHRcdC5zY3JvbGxUb0luZGV4KG9SZWZFcnJvci5yb3dJbmRleClcblx0XHRcdFx0XHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhVGFyZ2V0TWRjVGFibGVSb3cgPSB0aGF0Ll9nZXRNZGNUYWJsZVJvd3Mob1RhcmdldE1kY1RhYmxlKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0bGV0IGlOZXdGaXJzdFZpc2libGVSb3csIGJTY3JvbGxOZWVkZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhVGFyZ2V0TWRjVGFibGVSb3cubGVuZ3RoID4gMCAmJiBhVGFyZ2V0TWRjVGFibGVSb3dbMF0pIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpTmV3Rmlyc3RWaXNpYmxlUm93ID0gYVRhcmdldE1kY1RhYmxlUm93WzBdLmdldFBhcmVudCgpLmdldEZpcnN0VmlzaWJsZVJvdygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJTY3JvbGxOZWVkZWQgPSBpRmlyc3RWaXNpYmxlUm93IC0gaU5ld0ZpcnN0VmlzaWJsZVJvdyAhPT0gMDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoYlNjcm9sbE5lZWRlZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vVGhlIHNjcm9sbFRvSW5kZXggZnVuY3Rpb24gZG9lcyBub3Qgd2FpdCBmb3IgdGhlIFVJIHVwZGF0ZS4gQXMgYSB3b3JrZGFyb3VuZCwgcGVuZGluZyBhIGZpeCBmcm9tIE1EQyAoQkNQOiAyMTcwMjUxNjMxKSB3ZSB1c2UgdGhlIGV2ZW50IFwiVUlVcGRhdGVkXCIuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1dhaXRDb250cm9sSWRBZGRlZCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHNhcC51aS5nZXRDb3JlKCkuYXR0YWNoRXZlbnQoXCJVSVVwZGF0ZWRcIiwgcmVzb2x2ZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9XYWl0Q29udHJvbElkQWRkZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0X3NldEZvY3VzT25UYXJnZXRGaWVsZChvVGFyZ2V0TWRjVGFibGUsIG9SZWZFcnJvci5yb3dJbmRleCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZm9jdXNpbmcgb24gZXJyb3JcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChvVGFyZ2V0TWRjVGFibGUuZGF0YShcInRhYmxlVHlwZVwiKSA9PT0gXCJSZXNwb25zaXZlVGFibGVcIiAmJiBvUmVmRXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0XHRfZm9jdXNPbk1lc3NhZ2VUYXJnZXRDb250cm9sKG9NZXNzYWdlLCBvVGFyZ2V0TWRjVGFibGUsIG9SZWZFcnJvci5yb3dJbmRleCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0X2ZvY3VzT25NZXNzYWdlVGFyZ2V0Q29udHJvbChvTWVzc2FnZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkZhaWwgdG8gbmF2aWdhdGUgdG8gRXJyb3IgY29udHJvbFwiKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvQ29udHJvbCA9IHNhcC51aS5nZXRDb3JlKCkuYnlJZChvTWVzc2FnZS5jb250cm9sSWRzWzBdKTtcblx0XHRcdFx0Ly9JZiB0aGUgY29udHJvbCB1bmRlcmx5aW5nIHRoZSBmcm9udEVuZCBtZXNzYWdlIGlzIG5vdCB3aXRoaW4gdGhlIGN1cnJlbnQgc2VjdGlvbiwgd2UgZmlyc3QgZ28gaW50byB0aGUgdGFyZ2V0IHNlY3Rpb246XG5cdFx0XHRcdGNvbnN0IG9TZWxlY3RlZFNlY3Rpb246IGFueSA9IHNhcC51aS5nZXRDb3JlKCkuYnlJZCh0aGlzLm9PYmplY3RQYWdlTGF5b3V0LmdldFNlbGVjdGVkU2VjdGlvbigpKTtcblx0XHRcdFx0aWYgKG9TZWxlY3RlZFNlY3Rpb24/LmZpbmRFbGVtZW50cyh0cnVlKS5pbmRleE9mKG9Db250cm9sKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRzU2VjdGlvblRpdGxlID0gb0l0ZW0uZ2V0R3JvdXBOYW1lKCkuc3BsaXQoXCIsIFwiKVswXTtcblx0XHRcdFx0XHR0aGlzLl9uYXZpZ2F0ZUZyb21NZXNzYWdlVG9TZWN0aW9uSW5JY29uVGFiQmFyTW9kZSh0aGlzLm9PYmplY3RQYWdlTGF5b3V0LCBzU2VjdGlvblRpdGxlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvQ29udHJvbD8uZm9jdXMoKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gZm9jdXMgb24gY29udHJvbFxuXHRcdFx0c1NlY3Rpb25UaXRsZSA9IG9JdGVtLmdldEdyb3VwTmFtZSgpLnNwbGl0KFwiLCBcIilbMF07XG5cdFx0XHR0aGlzLl9uYXZpZ2F0ZUZyb21NZXNzYWdlVG9TZWN0aW9uSW5JY29uVGFiQmFyTW9kZSh0aGlzLm9PYmplY3RQYWdlTGF5b3V0LCBzU2VjdGlvblRpdGxlKTtcblx0XHRcdF9mb2N1c09uTWVzc2FnZVRhcmdldENvbnRyb2wob01lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRUYWJsZUNvbEluZm8ob1RhYmxlOiBhbnksIHNUYWJsZVRhcmdldENvbFByb3BlcnR5OiBzdHJpbmcpIHtcblx0XHRsZXQgc1RhYmxlVGFyZ2V0Q29sTmFtZTtcblx0XHRsZXQgb1RhYmxlVGFyZ2V0Q29sID0gb1RhYmxlLmdldENvbHVtbnMoKS5maW5kKFxuXHRcdFx0ZnVuY3Rpb24oc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHk6IGFueSwgY29sdW1uOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIGNvbHVtbi5nZXREYXRhUHJvcGVydHkoKSA9PT0gc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHk7XG5cdFx0XHR9LmJpbmQodGhpcywgc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkpXG5cdFx0KTtcblx0XHRpZiAoIW9UYWJsZVRhcmdldENvbCkge1xuXHRcdFx0LyogSWYgdGhlIHRhcmdldCBjb2x1bW4gaXMgbm90IGZvdW5kLCB3ZSBjaGVjayBmb3IgYSBjdXN0b20gY29sdW1uICovXG5cdFx0XHRjb25zdCBvQ3VzdG9tQ29sdW1uID0gb1RhYmxlXG5cdFx0XHRcdC5nZXRDb250cm9sRGVsZWdhdGUoKVxuXHRcdFx0XHQuZ2V0Q29sdW1uc0ZvcihvVGFibGUpXG5cdFx0XHRcdC5maW5kKGZ1bmN0aW9uKG9Db2x1bW46IGFueSkge1xuXHRcdFx0XHRcdGlmICghIW9Db2x1bW4udGVtcGxhdGUgJiYgb0NvbHVtbi5wcm9wZXJ0eUluZm9zKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHRvQ29sdW1uLnByb3BlcnR5SW5mb3NbMF0gPT09IHNUYWJsZVRhcmdldENvbFByb3BlcnR5IHx8XG5cdFx0XHRcdFx0XHRcdG9Db2x1bW4ucHJvcGVydHlJbmZvc1swXS5yZXBsYWNlKFwiUHJvcGVydHk6OlwiLCBcIlwiKSA9PT0gc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0aWYgKG9DdXN0b21Db2x1bW4pIHtcblx0XHRcdFx0b1RhYmxlVGFyZ2V0Q29sID0gb0N1c3RvbUNvbHVtbjtcblx0XHRcdFx0c1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgPSBvVGFibGVUYXJnZXRDb2wubmFtZTtcblxuXHRcdFx0XHRzVGFibGVUYXJnZXRDb2xOYW1lID0gb1RhYmxlXG5cdFx0XHRcdFx0LmdldENvbHVtbnMoKVxuXHRcdFx0XHRcdC5maW5kKGZ1bmN0aW9uKG9Db2x1bW46IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHNUYWJsZVRhcmdldENvbFByb3BlcnR5ID09PSBvQ29sdW1uLmdldERhdGFQcm9wZXJ0eSgpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmdldEhlYWRlcigpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0LyogSWYgdGhlIHRhcmdldCBjb2x1bW4gaXMgbm90IGZvdW5kLCB3ZSBjaGVjayBmb3IgYSBmaWVsZCBncm91cCAqL1xuXHRcdFx0XHRjb25zdCBhQ29sdW1ucyA9IG9UYWJsZS5nZXRDb250cm9sRGVsZWdhdGUoKS5nZXRDb2x1bW5zRm9yKG9UYWJsZSk7XG5cdFx0XHRcdG9UYWJsZVRhcmdldENvbCA9IGFDb2x1bW5zLmZpbmQoXG5cdFx0XHRcdFx0ZnVuY3Rpb24oYUNvbHVtbnM6IGFueVtdLCBzVGFibGVUYXJnZXRDb2xQcm9wZXJ0eTogc3RyaW5nLCBvQ29sdW1uOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChvQ29sdW1uLmtleS5pbmRleE9mKFwiOjpGaWVsZEdyb3VwOjpcIikgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvQ29sdW1uLnByb3BlcnR5SW5mb3MuZmluZChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gYUNvbHVtbnMuZmluZChmdW5jdGlvbihvQ29sdW1uKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0NvbHVtbi5yZWxhdGl2ZVBhdGggPT09IHNUYWJsZVRhcmdldENvbFByb3BlcnR5O1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LmJpbmQodGhpcywgYUNvbHVtbnMsIHNUYWJsZVRhcmdldENvbFByb3BlcnR5KVxuXHRcdFx0XHQpO1xuXHRcdFx0XHQvKiBjaGVjayBpZiB0aGUgY29sdW1uIHdpdGggdGhlIGZpZWxkIGdyb3VwIGlzIHZpc2libGUgaW4gdGhlIHRhYmxlOiAqL1xuXHRcdFx0XHRsZXQgYklzVGFibGVUYXJnZXRDb2xWaXNpYmxlID0gZmFsc2U7XG5cdFx0XHRcdGlmIChvVGFibGVUYXJnZXRDb2wgJiYgb1RhYmxlVGFyZ2V0Q29sLmxhYmVsKSB7XG5cdFx0XHRcdFx0YklzVGFibGVUYXJnZXRDb2xWaXNpYmxlID0gb1RhYmxlLmdldENvbHVtbnMoKS5zb21lKGZ1bmN0aW9uKGNvbHVtbjogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29sdW1uLmdldEhlYWRlcigpID09PSBvVGFibGVUYXJnZXRDb2wubGFiZWw7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0c1RhYmxlVGFyZ2V0Q29sTmFtZSA9IGJJc1RhYmxlVGFyZ2V0Q29sVmlzaWJsZSAmJiBvVGFibGVUYXJnZXRDb2wubGFiZWw7XG5cdFx0XHRcdHNUYWJsZVRhcmdldENvbFByb3BlcnR5ID0gYklzVGFibGVUYXJnZXRDb2xWaXNpYmxlICYmIG9UYWJsZVRhcmdldENvbC5rZXk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNUYWJsZVRhcmdldENvbE5hbWUgPSBvVGFibGVUYXJnZXRDb2wgJiYgb1RhYmxlVGFyZ2V0Q29sLmdldEhlYWRlcigpO1xuXHRcdH1cblx0XHRyZXR1cm4geyBzVGFibGVUYXJnZXRDb2xOYW1lOiBzVGFibGVUYXJnZXRDb2xOYW1lLCBzVGFibGVUYXJnZXRDb2xQcm9wZXJ0eTogc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgfTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb2JqIFRoZSBtZXNzYWdlIG9iamVjdFxuXHQgKiBAcGFyYW0ge0FycmF5fSBhU2VjdGlvbnMgVGhlIGFycmF5IG9mIHNlY3Rpb25zIGluIHRoZSBvYmplY3QgcGFnZVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgcmFuayBvZiB0aGUgbWVzc2FnZVxuXHQgKi9cblx0X2dldE1lc3NhZ2VSYW5rKG9iajogYW55LCBhU2VjdGlvbnM6IGFueVtdKSB7XG5cdFx0aWYgKGFTZWN0aW9ucykge1xuXHRcdFx0bGV0IHNlY3Rpb24sIGFTdWJTZWN0aW9ucywgc3ViU2VjdGlvbiwgaiwgaywgYUVsZW1lbnRzLCBhQWxsRWxlbWVudHMsIHNlY3Rpb25SYW5rO1xuXHRcdFx0Zm9yIChqID0gYVNlY3Rpb25zLmxlbmd0aCAtIDE7IGogPj0gMDsgLS1qKSB7XG5cdFx0XHRcdC8vIExvb3Agb3ZlciBhbGwgc2VjdGlvbnNcblx0XHRcdFx0c2VjdGlvbiA9IGFTZWN0aW9uc1tqXTtcblx0XHRcdFx0YVN1YlNlY3Rpb25zID0gc2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpO1xuXHRcdFx0XHRmb3IgKGsgPSBhU3ViU2VjdGlvbnMubGVuZ3RoIC0gMTsgayA+PSAwOyAtLWspIHtcblx0XHRcdFx0XHQvLyBMb29wIG92ZXIgYWxsIHN1Yi1zZWN0aW9uc1xuXHRcdFx0XHRcdHN1YlNlY3Rpb24gPSBhU3ViU2VjdGlvbnNba107XG5cdFx0XHRcdFx0YUFsbEVsZW1lbnRzID0gc3ViU2VjdGlvbi5maW5kRWxlbWVudHModHJ1ZSk7IC8vIEdldCBhbGwgZWxlbWVudHMgaW5zaWRlIGEgc3ViLXNlY3Rpb25cblx0XHRcdFx0XHQvL1RyeSB0byBmaW5kIHRoZSBjb250cm9sIDEgaW5zaWRlIHRoZSBzdWIgc2VjdGlvblxuXHRcdFx0XHRcdGFFbGVtZW50cyA9IGFBbGxFbGVtZW50cy5maWx0ZXIodGhpcy5fZm5GaWx0ZXJVcG9uSWQuYmluZCh0aGlzLCBvYmouZ2V0Q29udHJvbElkKCkpKTtcblx0XHRcdFx0XHRzZWN0aW9uUmFuayA9IGogKyAxO1xuXHRcdFx0XHRcdGlmIChhRWxlbWVudHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0b2JqLnNlY3Rpb25OYW1lID0gc2VjdGlvbi5nZXRUaXRsZSgpO1xuXHRcdFx0XHRcdFx0b2JqLnN1YlNlY3Rpb25OYW1lID0gc3ViU2VjdGlvbi5nZXRUaXRsZSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHNlY3Rpb25SYW5rICogMTAgKyAoayArIDEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly9pZiBzdWIgc2VjdGlvbiB0aXRsZSBpcyBPdGhlciBtZXNzYWdlcywgd2UgcmV0dXJuIGEgaGlnaCBudW1iZXIocmFuayksIHdoaWNoIGVuc3VyZXNcblx0XHRcdC8vdGhhdCBtZXNzYWdlcyBiZWxvbmdpbmcgdG8gdGhpcyBzdWIgc2VjdGlvbiBhbHdheXMgY29tZSBsYXRlciBpbiBtZXNzYWdlUG9wb3ZlclxuXHRcdFx0aWYgKCFvYmouc2VjdGlvbk5hbWUgJiYgIW9iai5zdWJTZWN0aW9uTmFtZSAmJiBvYmoucGVyc2lzdGVudCkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblx0XHRcdHJldHVybiA5OTk7XG5cdFx0fVxuXHRcdHJldHVybiA5OTk7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIHNldCB0aGUgZmlsdGVycyBiYXNlZCB1cG9uIHRoZSBtZXNzYWdlIGl0ZW1zXG5cdCAqIFRoZSBkZXNpcmVkIGZpbHRlciBvcGVyYXRpb24gaXM6XG5cdCAqICggZmlsdGVycyBwcm92aWRlZCBieSB1c2VyICYmICggdmFsaWRhdGlvbiA9IHRydWUgJiYgQ29udHJvbCBzaG91bGQgYmUgcHJlc2VudCBpbiB2aWV3ICkgfHwgbWVzc2FnZXMgZm9yIHRoZSBjdXJyZW50IG1hdGNoaW5nIGNvbnRleHQgKS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9hcHBseUZpbHRlcnNBbmRTb3J0KCkge1xuXHRcdGxldCBvVmFsaWRhdGlvbkZpbHRlcnMsXG5cdFx0XHRvVmFsaWRhdGlvbkFuZENvbnRleHRGaWx0ZXIsXG5cdFx0XHRvRmlsdGVycyxcblx0XHRcdHNQYXRoLFxuXHRcdFx0b1NvcnRlcixcblx0XHRcdG9EaWFsb2dGaWx0ZXIsXG5cdFx0XHRvYmplY3RQYWdlTGF5b3V0U2VjdGlvbnM6IGFueSA9IG51bGw7XG5cdFx0Y29uc3QgYVVzZXJEZWZpbmVkRmlsdGVyOiBhbnlbXSA9IFtdO1xuXHRcdGZ1bmN0aW9uIGZpbHRlck91dE1lc3NhZ2VzSW5EaWFsb2coKSB7XG5cdFx0XHRjb25zdCBmblRlc3QgPSBmdW5jdGlvbihhQ29udHJvbElkczogc3RyaW5nW10pIHtcblx0XHRcdFx0bGV0IGluZGV4ID0gSW5maW5pdHksXG5cdFx0XHRcdFx0b0NvbnRyb2wgPSBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoYUNvbnRyb2xJZHNbMF0pIGFzIGFueTtcblx0XHRcdFx0Y29uc3QgZXJyb3JGaWVsZENvbnRyb2wgPSBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoYUNvbnRyb2xJZHNbMF0pO1xuXHRcdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0XHRjb25zdCBmaWVsZFJhbmtpbkRpYWxvZyA9XG5cdFx0XHRcdFx0XHRvQ29udHJvbCBpbnN0YW5jZW9mIERpYWxvZ1xuXHRcdFx0XHRcdFx0XHQ/IChlcnJvckZpZWxkQ29udHJvbD8uZ2V0UGFyZW50KCkgYXMgYW55KS5maW5kRWxlbWVudHModHJ1ZSkuaW5kZXhPZihlcnJvckZpZWxkQ29udHJvbClcblx0XHRcdFx0XHRcdFx0OiBJbmZpbml0eTtcblx0XHRcdFx0XHRpZiAob0NvbnRyb2wgaW5zdGFuY2VvZiBEaWFsb2cpIHtcblx0XHRcdFx0XHRcdGlmIChpbmRleCA+IGZpZWxkUmFua2luRGlhbG9nKSB7XG5cdFx0XHRcdFx0XHRcdGluZGV4ID0gZmllbGRSYW5raW5EaWFsb2c7XG5cdFx0XHRcdFx0XHRcdC8vIFNldCB0aGUgZm9jdXMgdG8gdGhlIGRpYWxvZydzIGNvbnRyb2xcblx0XHRcdFx0XHRcdFx0ZXJyb3JGaWVsZENvbnRyb2w/LmZvY3VzKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQvLyBtZXNzYWdlcyBmb3Igc2FwLm0uRGlhbG9nIHNob3VsZCBub3QgYXBwZWFyIGluIHRoZSBtZXNzYWdlIGJ1dHRvblxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvQ29udHJvbCA9IG9Db250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiBuZXcgRmlsdGVyKHtcblx0XHRcdFx0cGF0aDogXCJjb250cm9sSWRzXCIsXG5cdFx0XHRcdHRlc3Q6IGZuVGVzdCxcblx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vRmlsdGVyIGZ1bmN0aW9uIHRvIHZlcmlmeSBpZiB0aGUgY29udHJvbCBpcyBwYXJ0IG9mIHRoZSBjdXJyZW50IHZpZXcgb3Igbm90XG5cdFx0ZnVuY3Rpb24gZ2V0Q2hlY2tDb250cm9sSW5WaWV3RmlsdGVyKCkge1xuXHRcdFx0Y29uc3QgZm5UZXN0ID0gZnVuY3Rpb24oYUNvbnRyb2xJZHM6IHN0cmluZ1tdKSB7XG5cdFx0XHRcdGlmICghYUNvbnRyb2xJZHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxldCBvQ29udHJvbDogYW55ID0gc2FwLnVpLmdldENvcmUoKS5ieUlkKGFDb250cm9sSWRzWzBdKTtcblx0XHRcdFx0d2hpbGUgKG9Db250cm9sKSB7XG5cdFx0XHRcdFx0aWYgKG9Db250cm9sLmdldElkKCkgPT09IHNWaWV3SWQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0NvbnRyb2wgaW5zdGFuY2VvZiBEaWFsb2cpIHtcblx0XHRcdFx0XHRcdC8vIG1lc3NhZ2VzIGZvciBzYXAubS5EaWFsb2cgc2hvdWxkIG5vdCBhcHBlYXIgaW4gdGhlIG1lc3NhZ2UgYnV0dG9uXG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiBuZXcgRmlsdGVyKHtcblx0XHRcdFx0cGF0aDogXCJjb250cm9sSWRzXCIsXG5cdFx0XHRcdHRlc3Q6IGZuVGVzdCxcblx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5zVmlld0lkKSB7XG5cdFx0XHR0aGlzLnNWaWV3SWQgPSB0aGlzLl9nZXRWaWV3SWQodGhpcy5nZXRJZCgpKSBhcyBzdHJpbmc7XG5cdFx0fVxuXHRcdGNvbnN0IHNWaWV3SWQgPSB0aGlzLnNWaWV3SWQ7XG5cdFx0Ly9BZGQgdGhlIGZpbHRlcnMgcHJvdmlkZWQgYnkgdGhlIHVzZXJcblx0XHRjb25zdCBhQ3VzdG9tRmlsdGVycyA9IHRoaXMuZ2V0QWdncmVnYXRpb24oXCJjdXN0b21GaWx0ZXJzXCIpIGFzIGFueTtcblx0XHRpZiAoYUN1c3RvbUZpbHRlcnMpIHtcblx0XHRcdGFDdXN0b21GaWx0ZXJzLmZvckVhY2goZnVuY3Rpb24oZmlsdGVyOiBhbnkpIHtcblx0XHRcdFx0YVVzZXJEZWZpbmVkRmlsdGVyLnB1c2goXG5cdFx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBmaWx0ZXIuZ2V0UHJvcGVydHkoXCJwYXRoXCIpLFxuXHRcdFx0XHRcdFx0b3BlcmF0b3I6IGZpbHRlci5nZXRQcm9wZXJ0eShcIm9wZXJhdG9yXCIpLFxuXHRcdFx0XHRcdFx0dmFsdWUxOiBmaWx0ZXIuZ2V0UHJvcGVydHkoXCJ2YWx1ZTFcIiksXG5cdFx0XHRcdFx0XHR2YWx1ZTI6IGZpbHRlci5nZXRQcm9wZXJ0eShcInZhbHVlMlwiKVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGlmICghb0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHR0aGlzLnNldFZpc2libGUoZmFsc2UpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzUGF0aCA9IG9CaW5kaW5nQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHQvL0ZpbHRlciBmb3IgZmlsdGVyaW5nIG91dCBvbmx5IHZhbGlkYXRpb24gbWVzc2FnZXMgd2hpY2ggYXJlIGN1cnJlbnRseSBwcmVzZW50IGluIHRoZSB2aWV3XG5cdFx0XHRvVmFsaWRhdGlvbkZpbHRlcnMgPSBuZXcgRmlsdGVyKHtcblx0XHRcdFx0ZmlsdGVyczogW1xuXHRcdFx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRcdFx0cGF0aDogXCJ2YWxpZGF0aW9uXCIsXG5cdFx0XHRcdFx0XHRvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsXG5cdFx0XHRcdFx0XHR2YWx1ZTE6IHRydWVcblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRnZXRDaGVja0NvbnRyb2xJblZpZXdGaWx0ZXIoKVxuXHRcdFx0XHRdLFxuXHRcdFx0XHRhbmQ6IHRydWVcblx0XHRcdH0pO1xuXHRcdFx0Ly9GaWx0ZXIgZm9yIGZpbHRlcmluZyBvdXQgdGhlIGJvdW5kIG1lc3NhZ2VzIGkuZSB0YXJnZXQgc3RhcnRzIHdpdGggdGhlIGNvbnRleHQgcGF0aFxuXHRcdFx0b1ZhbGlkYXRpb25BbmRDb250ZXh0RmlsdGVyID0gbmV3IEZpbHRlcih7XG5cdFx0XHRcdGZpbHRlcnM6IFtcblx0XHRcdFx0XHRvVmFsaWRhdGlvbkZpbHRlcnMsXG5cdFx0XHRcdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRcdFx0XHRwYXRoOiBcInRhcmdldFwiLFxuXHRcdFx0XHRcdFx0b3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLlN0YXJ0c1dpdGgsXG5cdFx0XHRcdFx0XHR2YWx1ZTE6IHNQYXRoXG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XSxcblx0XHRcdFx0YW5kOiBmYWxzZVxuXHRcdFx0fSk7XG5cdFx0XHRvRGlhbG9nRmlsdGVyID0gbmV3IEZpbHRlcih7XG5cdFx0XHRcdGZpbHRlcnM6IFtmaWx0ZXJPdXRNZXNzYWdlc0luRGlhbG9nKCldXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Y29uc3Qgb1ZhbGlkYXRpb25Db250ZXh0RGlhbG9nRmlsdGVycyA9IG5ldyBGaWx0ZXIoe1xuXHRcdFx0ZmlsdGVyczogW29WYWxpZGF0aW9uQW5kQ29udGV4dEZpbHRlciwgb0RpYWxvZ0ZpbHRlcl0sXG5cdFx0XHRhbmQ6IHRydWVcblx0XHR9KTtcblx0XHQvLyBhbmQgZmluYWxseSAtIGlmIHRoZXJlIGFueSAtIGFkZCBjdXN0b20gZmlsdGVyICh2aWEgT1IpXG5cdFx0aWYgKGFVc2VyRGVmaW5lZEZpbHRlci5sZW5ndGggPiAwKSB7XG5cdFx0XHRvRmlsdGVycyA9IG5ldyAoRmlsdGVyIGFzIGFueSkoe1xuXHRcdFx0XHRmaWx0ZXJzOiBbYVVzZXJEZWZpbmVkRmlsdGVyLCBvVmFsaWRhdGlvbkNvbnRleHREaWFsb2dGaWx0ZXJzXSxcblx0XHRcdFx0YW5kOiBmYWxzZVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9GaWx0ZXJzID0gb1ZhbGlkYXRpb25Db250ZXh0RGlhbG9nRmlsdGVycztcblx0XHR9XG5cdFx0dGhpcy5vSXRlbUJpbmRpbmcuZmlsdGVyKG9GaWx0ZXJzKTtcblx0XHR0aGlzLm9PYmplY3RQYWdlTGF5b3V0ID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dCh0aGlzLCB0aGlzLm9PYmplY3RQYWdlTGF5b3V0KTtcblx0XHQvLyBXZSBzdXBwb3J0IHNvcnRpbmcgb25seSBmb3IgT2JqZWN0UGFnZUxheW91dCB1c2UtY2FzZS5cblx0XHRpZiAodGhpcy5vT2JqZWN0UGFnZUxheW91dCkge1xuXHRcdFx0Y29uc3QgdGhhdCA9IHRoaXMgYXMgTWVzc2FnZUJ1dHRvbjtcblx0XHRcdG9Tb3J0ZXIgPSBuZXcgKFNvcnRlciBhcyBhbnkpKFwiXCIsIG51bGwsIG51bGwsIGZ1bmN0aW9uKG9iajE6IGFueSwgb2JqMjogYW55KSB7XG5cdFx0XHRcdGlmICghb2JqZWN0UGFnZUxheW91dFNlY3Rpb25zKSB7XG5cdFx0XHRcdFx0b2JqZWN0UGFnZUxheW91dFNlY3Rpb25zID0gdGhhdC5vT2JqZWN0UGFnZUxheW91dCAmJiB0aGF0Lm9PYmplY3RQYWdlTGF5b3V0LmdldFNlY3Rpb25zKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgcmFua0EgPSB0aGF0Ll9nZXRNZXNzYWdlUmFuayhvYmoxLCBvYmplY3RQYWdlTGF5b3V0U2VjdGlvbnMpO1xuXHRcdFx0XHRjb25zdCByYW5rQiA9IHRoYXQuX2dldE1lc3NhZ2VSYW5rKG9iajIsIG9iamVjdFBhZ2VMYXlvdXRTZWN0aW9ucyk7XG5cdFx0XHRcdGlmIChyYW5rQSA8IHJhbmtCKSB7XG5cdFx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChyYW5rQSA+IHJhbmtCKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMub0l0ZW1CaW5kaW5nLnNvcnQob1NvcnRlcik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBzQ29udHJvbElkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvSXRlbVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29udHJvbCBJRCBtYXRjaGVzIHRoZSBpdGVtIElEXG5cdCAqL1xuXHRfZm5GaWx0ZXJVcG9uSWQoc0NvbnRyb2xJZDogc3RyaW5nLCBvSXRlbTogYW55KSB7XG5cdFx0cmV0dXJuIHNDb250cm9sSWQgPT09IG9JdGVtLmdldElkKCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnRyb2xJZHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9JdGVtXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIG1hdGNoZXMgdGhlIGl0ZW0gSUQgbWF0Y2hlZHMgd2l0aCBvbmUgb2YgdGhlIGNvbnRyb2xJZHNcblx0ICovXG5cdF9mbkZpbHRlclVwb25JZHMoYUNvbnRyb2xJZHM6IHN0cmluZ1tdLCBvSXRlbTogYW55KSB7XG5cdFx0cmV0dXJuIGFDb250cm9sSWRzLnNvbWUoZnVuY3Rpb24oc0NvbnRyb2xJZCkge1xuXHRcdFx0aWYgKHNDb250cm9sSWQgPT09IG9JdGVtLmdldElkKCkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBzZWN0aW9uIGJhc2VkIG9uIHNlY3Rpb24gdGl0bGUgYW5kIHZpc2liaWxpdHkuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvT2JqZWN0UGFnZSBPYmplY3QgcGFnZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNTZWN0aW9uVGl0bGUgU2VjdGlvbiB0aXRsZS5cblx0ICogQHJldHVybnMge29iamVjdH1cblx0ICogQHByaXZhdGVcblx0ICogQGlnbm9yZVxuXHQgKi9cblx0X2dldFNlY3Rpb25CeVNlY3Rpb25UaXRsZShvT2JqZWN0UGFnZTogYW55LCBzU2VjdGlvblRpdGxlOiBzdHJpbmcpIHtcblx0XHRpZiAoc1NlY3Rpb25UaXRsZSkge1xuXHRcdFx0Y29uc3QgYVNlY3Rpb25zID0gb09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKTtcblx0XHRcdGxldCBvU2VjdGlvbjtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYVNlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChhU2VjdGlvbnNbaV0uZ2V0VmlzaWJsZSgpICYmIGFTZWN0aW9uc1tpXS5nZXRUaXRsZSgpID09PSBzU2VjdGlvblRpdGxlKSB7XG5cdFx0XHRcdFx0b1NlY3Rpb24gPSBhU2VjdGlvbnNbaV07XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBvU2VjdGlvbjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTmF2aWdhdGVzIHRvIHRoZSBzZWN0aW9uIGlmIHRoZSBvYmplY3QgcGFnZSB1c2VzIGFuIEljb25UYWJCYXIgYW5kIGlmIHRoZSBjdXJyZW50IHNlY3Rpb24gaXMgbm90IHRoZSB0YXJnZXQgb2YgdGhlIG5hdmlnYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvT2JqZWN0UGFnZSBPYmplY3QgcGFnZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNTZWN0aW9uVGl0bGUgU2VjdGlvbiB0aXRsZS5cblx0ICogQHByaXZhdGVcblx0ICogQGlnbm9yZVxuXHQgKi9cblx0X25hdmlnYXRlRnJvbU1lc3NhZ2VUb1NlY3Rpb25Jbkljb25UYWJCYXJNb2RlKG9PYmplY3RQYWdlOiBhbnksIHNTZWN0aW9uVGl0bGU6IHN0cmluZykge1xuXHRcdGNvbnN0IGJVc2VJY29uVGFiQmFyID0gb09iamVjdFBhZ2UuZ2V0VXNlSWNvblRhYkJhcigpO1xuXHRcdGlmIChiVXNlSWNvblRhYkJhcikge1xuXHRcdFx0Y29uc3Qgb1NlY3Rpb24gPSB0aGlzLl9nZXRTZWN0aW9uQnlTZWN0aW9uVGl0bGUob09iamVjdFBhZ2UsIHNTZWN0aW9uVGl0bGUpO1xuXHRcdFx0Y29uc3Qgc1NlbGVjdGVkU2VjdGlvbklkID0gb09iamVjdFBhZ2UuZ2V0U2VsZWN0ZWRTZWN0aW9uKCk7XG5cdFx0XHRpZiAob1NlY3Rpb24gJiYgc1NlbGVjdGVkU2VjdGlvbklkICE9PSBvU2VjdGlvbi5nZXRJZCgpKSB7XG5cdFx0XHRcdG9PYmplY3RQYWdlLnNldFNlbGVjdGVkU2VjdGlvbihvU2VjdGlvbi5nZXRJZCgpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfbmF2aWdhdGVGcm9tTWVzc2FnZVRvU2VjdGlvblRhYmxlSW5JY29uVGFiQmFyTW9kZShvVGFibGU6IGFueSwgb09iamVjdFBhZ2U6IGFueSwgc1NlY3Rpb25UaXRsZTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb1Jvd0JpbmRpbmcgPSBvVGFibGUuZ2V0Um93QmluZGluZygpO1xuXHRcdGNvbnN0IG9UYWJsZUNvbnRleHQgPSBvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBvT1BDb250ZXh0ID0gb09iamVjdFBhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBiU2hvdWxkV2FpdEZvclRhYmxlUmVmcmVzaCA9ICEob1RhYmxlQ29udGV4dCA9PT0gb09QQ29udGV4dCk7XG5cdFx0dGhpcy5fbmF2aWdhdGVGcm9tTWVzc2FnZVRvU2VjdGlvbkluSWNvblRhYkJhck1vZGUob09iamVjdFBhZ2UsIHNTZWN0aW9uVGl0bGUpO1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlOiBGdW5jdGlvbikge1xuXHRcdFx0aWYgKGJTaG91bGRXYWl0Rm9yVGFibGVSZWZyZXNoKSB7XG5cdFx0XHRcdG9Sb3dCaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImNoYW5nZVwiLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgTURDIHRhYmxlIGlmIGl0IGlzIGZvdW5kIGFtb25nIGFueSBvZiB0aGUgcGFyZW50IGVsZW1lbnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0VsZW1lbnQgQ29udHJvbFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBNREMgdGFibGUgfHwgdW5kZWZpbmVkXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBpZ25vcmVcblx0ICovXG5cdF9nZXRNZGNUYWJsZShvRWxlbWVudDogYW55KSB7XG5cdFx0Ly9jaGVjayBpZiB0aGUgZWxlbWVudCBoYXMgYSB0YWJsZSB3aXRoaW4gYW55IG9mIGl0cyBwYXJlbnRzXG5cdFx0bGV0IG9QYXJlbnRFbGVtZW50ID0gb0VsZW1lbnQuZ2V0UGFyZW50KCk7XG5cdFx0d2hpbGUgKG9QYXJlbnRFbGVtZW50ICYmICFvUGFyZW50RWxlbWVudC5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRvUGFyZW50RWxlbWVudCA9IG9QYXJlbnRFbGVtZW50LmdldFBhcmVudCgpO1xuXHRcdH1cblx0XHRjb25zdCBvTWRjVGFibGUgPSBvUGFyZW50RWxlbWVudCAmJiBvUGFyZW50RWxlbWVudC5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpID8gb1BhcmVudEVsZW1lbnQgOiB1bmRlZmluZWQ7XG5cdFx0cmV0dXJuIG9NZGNUYWJsZTtcblx0fVxuXG5cdF9nZXRHcmlkVGFibGUob01kY1RhYmxlOiBhbnkpIHtcblx0XHRyZXR1cm4gb01kY1RhYmxlLmZpbmRFbGVtZW50cyh0cnVlLCBmdW5jdGlvbihvRWxlbTogYW55KSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRvRWxlbS5pc0EoXCJzYXAudWkudGFibGUuVGFibGVcIikgJiZcblx0XHRcdFx0LyoqIFdlIGNoZWNrIHRoZSBlbGVtZW50IGJlbG9uZ3MgdG8gdGhlIE1kYyBUYWJsZSA6Ki9cblx0XHRcdFx0b0VsZW0uZ2V0UGFyZW50KCkgPT09IG9NZGNUYWJsZVxuXHRcdFx0KTtcblx0XHR9KVswXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHRhYmxlIHJvdyAoaWYgYXZhaWxhYmxlKSBjb250YWluaW5nIHRoZSBlbGVtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0VsZW1lbnQgQ29udHJvbFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBUYWJsZSByb3cgfHwgdW5kZWZpbmVkXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBpZ25vcmVcblx0ICovXG5cdF9nZXRUYWJsZVJvdyhvRWxlbWVudDogYW55KSB7XG5cdFx0bGV0IG9QYXJlbnRFbGVtZW50ID0gb0VsZW1lbnQuZ2V0UGFyZW50KCk7XG5cdFx0d2hpbGUgKFxuXHRcdFx0b1BhcmVudEVsZW1lbnQgJiZcblx0XHRcdCFvUGFyZW50RWxlbWVudC5pc0EoXCJzYXAudWkudGFibGUuUm93XCIpICYmXG5cdFx0XHQhb1BhcmVudEVsZW1lbnQuaXNBKFwic2FwLnVpLnRhYmxlLkNyZWF0aW9uUm93XCIpICYmXG5cdFx0XHQhb1BhcmVudEVsZW1lbnQuaXNBKFwic2FwLm0uQ29sdW1uTGlzdEl0ZW1cIilcblx0XHQpIHtcblx0XHRcdG9QYXJlbnRFbGVtZW50ID0gb1BhcmVudEVsZW1lbnQuZ2V0UGFyZW50KCk7XG5cdFx0fVxuXHRcdGNvbnN0IG9UYWJsZVJvdyA9XG5cdFx0XHRvUGFyZW50RWxlbWVudCAmJlxuXHRcdFx0KG9QYXJlbnRFbGVtZW50LmlzQShcInNhcC51aS50YWJsZS5Sb3dcIikgfHxcblx0XHRcdFx0b1BhcmVudEVsZW1lbnQuaXNBKFwic2FwLnVpLnRhYmxlLkNyZWF0aW9uUm93XCIpIHx8XG5cdFx0XHRcdG9QYXJlbnRFbGVtZW50LmlzQShcInNhcC5tLkNvbHVtbkxpc3RJdGVtXCIpKVxuXHRcdFx0XHQ/IG9QYXJlbnRFbGVtZW50XG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdHJldHVybiBvVGFibGVSb3c7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBpbmRleCBvZiB0aGUgdGFibGUgcm93IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRWxlbWVudCBDb250cm9sXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFJvdyBpbmRleCB8fCB1bmRlZmluZWRcblx0ICogQHByaXZhdGVcblx0ICogQGlnbm9yZVxuXHQgKi9cblx0X2dldFRhYmxlUm93SW5kZXgob0VsZW1lbnQ6IGFueSkge1xuXHRcdGNvbnN0IG9UYWJsZVJvdyA9IHRoaXMuX2dldFRhYmxlUm93KG9FbGVtZW50KTtcblx0XHRsZXQgaVJvd0luZGV4O1xuXHRcdGlmIChvVGFibGVSb3cuaXNBKFwic2FwLnVpLnRhYmxlLlJvd1wiKSkge1xuXHRcdFx0aVJvd0luZGV4ID0gb1RhYmxlUm93LmdldEluZGV4KCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlSb3dJbmRleCA9IG9UYWJsZVJvd1xuXHRcdFx0XHQuZ2V0VGFibGUoKVxuXHRcdFx0XHQuZ2V0SXRlbXMoKVxuXHRcdFx0XHQuZmluZEluZGV4KGZ1bmN0aW9uKGVsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBlbGVtZW50LmdldElkKCkgPT09IG9UYWJsZVJvdy5nZXRJZCgpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGlSb3dJbmRleDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIGluZGV4IG9mIHRoZSB0YWJsZSBjb2x1bW4gY29udGFpbmluZyB0aGUgZWxlbWVudC5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FbGVtZW50IENvbnRyb2xcblx0ICogQHJldHVybnMge29iamVjdH0gQ29sdW1uIGluZGV4IHx8IHVuZGVmaW5lZFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAaWdub3JlXG5cdCAqL1xuXHRfZ2V0VGFibGVDb2x1bW5JbmRleChvRWxlbWVudDogYW55KSB7XG5cdFx0Y29uc3QgZ2V0VGFyZ2V0Q2VsbEluZGV4ID0gZnVuY3Rpb24ob0VsZW1lbnQ6IGFueSwgb1RhcmdldFJvdzogYW55KSB7XG5cdFx0XHRyZXR1cm4gb1RhcmdldFJvdy5nZXRDZWxscygpLmZpbmRJbmRleChmdW5jdGlvbihvQ2VsbDogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ2VsbC5nZXRJZCgpID09PSBvRWxlbWVudC5nZXRJZCgpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0XHRjb25zdCBnZXRUYXJnZXRDb2x1bW5JbmRleCA9IGZ1bmN0aW9uKG9FbGVtZW50OiBhbnksIG9UYXJnZXRSb3c6IGFueSkge1xuXHRcdFx0bGV0IG9UYXJnZXRFbGVtZW50ID0gb0VsZW1lbnQuZ2V0UGFyZW50KCksXG5cdFx0XHRcdGlUYXJnZXRDZWxsSW5kZXggPSBnZXRUYXJnZXRDZWxsSW5kZXgob1RhcmdldEVsZW1lbnQsIG9UYXJnZXRSb3cpO1xuXHRcdFx0d2hpbGUgKG9UYXJnZXRFbGVtZW50ICYmIGlUYXJnZXRDZWxsSW5kZXggPCAwKSB7XG5cdFx0XHRcdG9UYXJnZXRFbGVtZW50ID0gb1RhcmdldEVsZW1lbnQuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdGlUYXJnZXRDZWxsSW5kZXggPSBnZXRUYXJnZXRDZWxsSW5kZXgob1RhcmdldEVsZW1lbnQsIG9UYXJnZXRSb3cpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGlUYXJnZXRDZWxsSW5kZXg7XG5cdFx0fTtcblx0XHRjb25zdCBvVGFyZ2V0Um93ID0gdGhpcy5fZ2V0VGFibGVSb3cob0VsZW1lbnQpO1xuXHRcdGxldCBpVGFyZ2V0Q29sdW1uSW5kZXg7XG5cdFx0aVRhcmdldENvbHVtbkluZGV4ID0gZ2V0VGFyZ2V0Q29sdW1uSW5kZXgob0VsZW1lbnQsIG9UYXJnZXRSb3cpO1xuXHRcdGlmIChvVGFyZ2V0Um93LmlzQShcInNhcC51aS50YWJsZS5DcmVhdGlvblJvd1wiKSkge1xuXHRcdFx0Y29uc3Qgc1RhcmdldENlbGxJZCA9IG9UYXJnZXRSb3cuZ2V0Q2VsbHMoKVtpVGFyZ2V0Q29sdW1uSW5kZXhdLmdldElkKCksXG5cdFx0XHRcdGFUYWJsZUNvbHVtbnMgPSBvVGFyZ2V0Um93LmdldFRhYmxlKCkuZ2V0Q29sdW1ucygpO1xuXHRcdFx0aVRhcmdldENvbHVtbkluZGV4ID0gYVRhYmxlQ29sdW1ucy5maW5kSW5kZXgoZnVuY3Rpb24oY29sdW1uOiBhbnkpIHtcblx0XHRcdFx0aWYgKGNvbHVtbi5nZXRDcmVhdGlvblRlbXBsYXRlKCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gc1RhcmdldENlbGxJZC5zZWFyY2goY29sdW1uLmdldENyZWF0aW9uVGVtcGxhdGUoKS5nZXRJZCgpKSA+IC0xID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBpVGFyZ2V0Q29sdW1uSW5kZXg7XG5cdH1cblxuXHRfZ2V0TWRjVGFibGVSb3dzKG9NZGNUYWJsZTogYW55KSB7XG5cdFx0cmV0dXJuIG9NZGNUYWJsZS5maW5kRWxlbWVudHModHJ1ZSwgZnVuY3Rpb24ob0VsZW06IGFueSkge1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0b0VsZW0uaXNBKFwic2FwLnVpLnRhYmxlLlJvd1wiKSAmJlxuXHRcdFx0XHQvKiogV2UgY2hlY2sgdGhlIGVsZW1lbnQgYmVsb25ncyB0byB0aGUgTWRjIFRhYmxlIDoqL1xuXHRcdFx0XHRvRWxlbS5nZXRUYWJsZSgpLmdldFBhcmVudCgpID09PSBvTWRjVGFibGVcblx0XHRcdCk7XG5cdFx0fSk7XG5cdH1cblxuXHRfZ2V0VGFibGVDb2xQcm9wZXJ0eShvVGFibGU6IGFueSwgb01lc3NhZ2VPYmplY3Q6IGFueSkge1xuXHRcdC8vdGhpcyBmdW5jdGlvbiBlc2NhcGVzIGEgc3RyaW5nIHRvIHVzZSBpdCBhcyBhIHJlZ2V4XG5cdFx0Y29uc3QgZm5SZWdFeHBlc2NhcGUgPSBmdW5jdGlvbihzOiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiBzLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgXCJcXFxcJCZcIik7XG5cdFx0fTtcblx0XHQvLyBiYXNlZCBvbiB0aGUgdGFyZ2V0IHBhdGggb2YgdGhlIG1lc3NhZ2Ugd2UgcmV0cmlldmUgdGhlIHByb3BlcnR5IG5hbWUuXG5cdFx0Ly8gdG8gYWNoaWV2ZSBpdCB3ZSByZW1vdmUgdGhlIGJpbmRpbmdDb250ZXh0IHBhdGggYW5kIHRoZSByb3cgYmluZGluZyBwYXRoIGZyb20gdGhlIHRhcmdldFxuXHRcdGNvbnN0IHNUYWJsZVRhcmdldENvbFByb3BlcnR5ID0gb01lc3NhZ2VPYmplY3Rcblx0XHRcdC5nZXRUYXJnZXQoKVxuXHRcdFx0LnJlcGxhY2UoXG5cdFx0XHRcdG5ldyBSZWdFeHAoZm5SZWdFeHBlc2NhcGUob1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KCkuZ2V0UGF0aCgpICsgXCIvXCIgKyBvVGFibGUuZ2V0Um93QmluZGluZygpLmdldFBhdGgoKSkgKyBcIlxcXFwoLipcXFxcKS9cIiksXG5cdFx0XHRcdFwiXCJcblx0XHRcdCk7XG5cdFx0cmV0dXJuIHNUYWJsZVRhcmdldENvbFByb3BlcnR5O1xuXHR9XG5cblx0X2dldE9iamVjdFBhZ2VMYXlvdXQob0VsZW1lbnQ6IGFueSwgb09iamVjdFBhZ2VMYXlvdXQ6IGFueSkge1xuXHRcdGlmIChvT2JqZWN0UGFnZUxheW91dCkge1xuXHRcdFx0cmV0dXJuIG9PYmplY3RQYWdlTGF5b3V0O1xuXHRcdH1cblx0XHRvT2JqZWN0UGFnZUxheW91dCA9IG9FbGVtZW50O1xuXHRcdC8vSXRlcmF0ZSBvdmVyIHBhcmVudCB0aWxsIHlvdSBoYXZlIG5vdCByZWFjaGVkIHRoZSBvYmplY3QgcGFnZSBsYXlvdXRcblx0XHR3aGlsZSAob09iamVjdFBhZ2VMYXlvdXQgJiYgIW9PYmplY3RQYWdlTGF5b3V0LmlzQShcInNhcC51eGFwLk9iamVjdFBhZ2VMYXlvdXRcIikpIHtcblx0XHRcdG9PYmplY3RQYWdlTGF5b3V0ID0gb09iamVjdFBhZ2VMYXlvdXQuZ2V0UGFyZW50KCk7XG5cdFx0fVxuXHRcdHJldHVybiBvT2JqZWN0UGFnZUxheW91dDtcblx0fVxuXG5cdF9nZXRDdXN0b21Db2x1bW5JbmZvKG9UYWJsZTogYW55LCBpUG9zaXRpb246IG51bWJlcikge1xuXHRcdGNvbnN0IHNUYWJsZUNvbFByb3BlcnR5ID0gb1RhYmxlLmdldENvbHVtbnMoKVtpUG9zaXRpb25dLmdldERhdGFQcm9wZXJ0eSgpO1xuXHRcdGNvbnN0IG9DdXN0b21Db2x1bW4gPSBvVGFibGVcblx0XHRcdC5nZXRDb250cm9sRGVsZWdhdGUoKVxuXHRcdFx0LmdldENvbHVtbnNGb3Iob1RhYmxlKVxuXHRcdFx0LmZpbmQoZnVuY3Rpb24ob0NvbHVtbjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ29sdW1uLm5hbWUgPT09IHNUYWJsZUNvbFByb3BlcnR5ICYmICEhb0NvbHVtbi50ZW1wbGF0ZTtcblx0XHRcdH0pO1xuXHRcdHJldHVybiBvQ3VzdG9tQ29sdW1uO1xuXHR9XG5cblx0X2dldFRhYmxlRmlyc3RDb2xQcm9wZXJ0eShvVGFibGU6IGFueSkge1xuXHRcdGNvbnN0IG9DdXN0b21Db2x1bW5JbmZvID0gdGhpcy5fZ2V0Q3VzdG9tQ29sdW1uSW5mbyhvVGFibGUsIDApO1xuXHRcdGxldCBzVGFibGVGaXJzdENvbFByb3BlcnR5O1xuXHRcdGlmIChvQ3VzdG9tQ29sdW1uSW5mbykge1xuXHRcdFx0aWYgKG9DdXN0b21Db2x1bW5JbmZvLnByb3BlcnR5SW5mb3MpIHtcblx0XHRcdFx0c1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSA9IG9DdXN0b21Db2x1bW5JbmZvLnByb3BlcnR5SW5mb3NbMF0ucmVwbGFjZShcIlByb3BlcnR5OjpcIiwgXCJcIik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzVGFibGVGaXJzdENvbFByb3BlcnR5ID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzVGFibGVGaXJzdENvbFByb3BlcnR5ID0gb1RhYmxlLmdldENvbHVtbnMoKVswXS5nZXREYXRhUHJvcGVydHkoKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNUYWJsZUZpcnN0Q29sUHJvcGVydHk7XG5cdH1cblxuXHRfZ2V0VGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0Rm9yVGV4dEFubm90YXRpb24ob1RhYmxlOiBhbnksIG9UYWJsZVJvd0NvbnRleHQ6IGFueSwgc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eTogc3RyaW5nKSB7XG5cdFx0bGV0IG9CaW5kaW5nQ29udGV4dDtcblx0XHRpZiAob1RhYmxlUm93Q29udGV4dCAmJiBzVGFibGVGaXJzdENvbFByb3BlcnR5KSB7XG5cdFx0XHRjb25zdCBvTW9kZWwgPSBvVGFibGUuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9UYWJsZVJvd0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGlmIChvTWV0YU1vZGVsLmdldE9iamVjdChzTWV0YVBhdGggKyBcIi9cIiArIHNUYWJsZUZpcnN0Q29sUHJvcGVydHkgKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dC8kUGF0aFwiKSkge1xuXHRcdFx0XHRvQmluZGluZ0NvbnRleHQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFxuXHRcdFx0XHRcdHNNZXRhUGF0aCArIFwiL1wiICsgc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5UZXh0XCJcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9CaW5kaW5nQ29udGV4dDtcblx0fVxuXG5cdF9nZXRUYWJsZUZpcnN0Q29sVmFsdWUoc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eTogc3RyaW5nLCBvVGFibGVSb3dDb250ZXh0OiBhbnksIHNUZXh0QW5ub3RhdGlvblBhdGg6IHN0cmluZywgc1RleHRBcnJhbmdlbWVudDogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgc0NvZGVWYWx1ZSA9IG9UYWJsZVJvd0NvbnRleHQuZ2V0VmFsdWUoc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSk7XG5cdFx0bGV0IHNUZXh0VmFsdWU7XG5cdFx0bGV0IHNDb21wdXRlZFZhbHVlID0gc0NvZGVWYWx1ZTtcblx0XHRpZiAoc1RleHRBbm5vdGF0aW9uUGF0aCkge1xuXHRcdFx0aWYgKHNUYWJsZUZpcnN0Q29sUHJvcGVydHkubGFzdEluZGV4T2YoXCIvXCIpID4gMCkge1xuXHRcdFx0XHQvLyB0aGUgdGFyZ2V0IHByb3BlcnR5IGlzIHJlcGxhY2VkIHdpdGggdGhlIHRleHQgYW5ub3RhdGlvbiBwYXRoXG5cdFx0XHRcdHNUYWJsZUZpcnN0Q29sUHJvcGVydHkgPSBzVGFibGVGaXJzdENvbFByb3BlcnR5LnNsaWNlKDAsIHNUYWJsZUZpcnN0Q29sUHJvcGVydHkubGFzdEluZGV4T2YoXCIvXCIpICsgMSk7XG5cdFx0XHRcdHNUYWJsZUZpcnN0Q29sUHJvcGVydHkgPSBzVGFibGVGaXJzdENvbFByb3BlcnR5LmNvbmNhdChzVGV4dEFubm90YXRpb25QYXRoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNUYWJsZUZpcnN0Q29sUHJvcGVydHkgPSBzVGV4dEFubm90YXRpb25QYXRoO1xuXHRcdFx0fVxuXHRcdFx0c1RleHRWYWx1ZSA9IG9UYWJsZVJvd0NvbnRleHQuZ2V0VmFsdWUoc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSk7XG5cdFx0XHRpZiAoc1RleHRWYWx1ZSkge1xuXHRcdFx0XHRpZiAoc1RleHRBcnJhbmdlbWVudCkge1xuXHRcdFx0XHRcdGNvbnN0IHNFbnVtTnVtYmVyID0gc1RleHRBcnJhbmdlbWVudC5zbGljZShzVGV4dEFycmFuZ2VtZW50LmluZGV4T2YoXCIvXCIpICsgMSk7XG5cdFx0XHRcdFx0c3dpdGNoIChzRW51bU51bWJlcikge1xuXHRcdFx0XHRcdFx0Y2FzZSBcIlRleHRPbmx5XCI6XG5cdFx0XHRcdFx0XHRcdHNDb21wdXRlZFZhbHVlID0gc1RleHRWYWx1ZTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwiVGV4dEZpcnN0XCI6XG5cdFx0XHRcdFx0XHRcdHNDb21wdXRlZFZhbHVlID0gc1RleHRWYWx1ZSArIFwiIChcIiArIHNDb2RlVmFsdWUgKyBcIilcIjtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwiVGV4dExhc3RcIjpcblx0XHRcdFx0XHRcdFx0c0NvbXB1dGVkVmFsdWUgPSBzQ29kZVZhbHVlICsgXCIgKFwiICsgc1RleHRWYWx1ZSArIFwiKVwiO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJUZXh0U2VwYXJhdGVcIjpcblx0XHRcdFx0XHRcdFx0c0NvbXB1dGVkVmFsdWUgPSBzQ29kZVZhbHVlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHNDb21wdXRlZFZhbHVlID0gc1RleHRWYWx1ZSArIFwiIChcIiArIHNDb2RlVmFsdWUgKyBcIilcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc0NvbXB1dGVkVmFsdWU7XG5cdH1cblxuXHRfSXNDb250cm9sSW5UYWJsZShvVGFibGU6IGFueSwgc0NvbnRyb2xJZDogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb0NvbnRyb2wgPSBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoc0NvbnRyb2xJZCk7XG5cdFx0aWYgKG9Db250cm9sICYmICFvQ29udHJvbC5pc0EoXCJzYXAudWkudGFibGUuVGFibGVcIikgJiYgIW9Db250cm9sLmlzQShcInNhcC5tLlRhYmxlXCIpKSB7XG5cdFx0XHRyZXR1cm4gb1RhYmxlLmZpbmRFbGVtZW50cyh0cnVlLCBmdW5jdGlvbihvRWxlbTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvRWxlbS5nZXRJZCgpID09PSBvQ29udHJvbDtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRfSXNDb250cm9sUGFydE9mQ3JlYXRpb25Sb3cob0NvbnRyb2w6IGFueSkge1xuXHRcdGxldCBvUGFyZW50Q29udHJvbCA9IG9Db250cm9sLmdldFBhcmVudCgpO1xuXHRcdHdoaWxlIChcblx0XHRcdG9QYXJlbnRDb250cm9sICYmXG5cdFx0XHQhb1BhcmVudENvbnRyb2wuaXNBKFwic2FwLnVpLnRhYmxlLlJvd1wiKSAmJlxuXHRcdFx0IW9QYXJlbnRDb250cm9sLmlzQShcInNhcC51aS50YWJsZS5DcmVhdGlvblJvd1wiKSAmJlxuXHRcdFx0IW9QYXJlbnRDb250cm9sLmlzQShcInNhcC5tLkNvbHVtbkxpc3RJdGVtXCIpXG5cdFx0KSB7XG5cdFx0XHRvUGFyZW50Q29udHJvbCA9IG9QYXJlbnRDb250cm9sLmdldFBhcmVudCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiAhIW9QYXJlbnRDb250cm9sICYmIG9QYXJlbnRDb250cm9sLmlzQShcInNhcC51aS50YWJsZS5DcmVhdGlvblJvd1wiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIHRvIHJldHJpdmUgdGhlIGNvbHVtbiBpbmZvIGZvciBhc3NvY2lhdGVkIG1lc3NhZ2VzIGluIG1lc3NhZ2UgcG9wb3Zlci5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtvTWVzc2FnZX0gb01lc3NhZ2UgTWVzc2FnZSBvYmplY3Rcblx0ICogQHBhcmFtIHtvVGFibGV9IG9UYWJsZSBNREMgVGFibGVcblx0ICogQHJldHVybnMge29Db2xGcm9tVGFibGVTZXR0aW5nc30gUmV0dXJucyB0aGUgY29sdW1uIGluZm8uXG5cdCAqL1xuXHRfZmV0Y2hDb2x1bW5JbmZvKG9NZXNzYWdlOiBhbnksIG9UYWJsZTogYW55KSB7XG5cdFx0Y29uc3Qgc0NvbE5hbWVGcm9tTWVzc2FnZU9iaiA9IG9NZXNzYWdlXG5cdFx0XHQuZ2V0QmluZGluZ0NvbnRleHQoXCJtZXNzYWdlXCIpXG5cdFx0XHQuZ2V0T2JqZWN0KClcblx0XHRcdC5nZXRUYXJnZXQoKVxuXHRcdFx0LnNwbGl0KFwiL1wiKVxuXHRcdFx0LnBvcCgpO1xuXHRcdGNvbnN0IG9Db2xGcm9tVGFibGVTZXR0aW5ncyA9IG9UYWJsZVxuXHRcdFx0LmdldFBhcmVudCgpXG5cdFx0XHQuZ2V0VGFibGVEZWZpbml0aW9uKClcblx0XHRcdC5jb2x1bW5zLmZpbmQoZnVuY3Rpb24ob0NvbHVtbjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ29sdW1uLmtleS5zcGxpdChcIjo6XCIpLnBvcCgpID09PSBzQ29sTmFtZUZyb21NZXNzYWdlT2JqO1xuXHRcdFx0fSk7XG5cdFx0cmV0dXJuIG9Db2xGcm9tVGFibGVTZXR0aW5ncztcblx0fVxuXG5cdF9zZXRNZXNzYWdlU3VidGl0bGUoXG5cdFx0bWVzc2FnZTogYW55LFxuXHRcdG9UYWJsZVJvd0JpbmRpbmdDb250ZXh0czogYW55LFxuXHRcdG9UYWJsZVJvd0NvbnRleHQ6IGFueSxcblx0XHRzVGFibGVUYXJnZXRDb2xOYW1lOiBzdHJpbmcsXG5cdFx0b1Jlc291cmNlQnVuZGxlOiBhbnksXG5cdFx0c1RhYmxlVGFyZ2V0UHJvcGVydHk6IHN0cmluZyxcblx0XHRvVGFibGU6IGFueSxcblx0XHRiSXNDcmVhdGlvblJvdzogYm9vbGVhblxuXHQpIHtcblx0XHRsZXQgc01lc3NhZ2VTdWJ0aXRsZTtcblx0XHRsZXQgc1Jvd1N1YnRpdGxlVmFsdWUsIHNDb2x1bW5TdWJ0aXRsZVRleHQ7XG5cdFx0Y29uc3Qgc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSA9IHRoaXMuX2dldFRhYmxlRmlyc3RDb2xQcm9wZXJ0eShvVGFibGUpO1xuXHRcdGNvbnN0IG9Db2xGcm9tVGFibGVTZXR0aW5ncyA9IHRoaXMuX2ZldGNoQ29sdW1uSW5mbyhtZXNzYWdlLCBvVGFibGUpO1xuXHRcdGlmIChiSXNDcmVhdGlvblJvdykge1xuXHRcdFx0c01lc3NhZ2VTdWJ0aXRsZSA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9NRVNTQUdFX0lURU1fU1VCVElUTEVcIiwgb1Jlc291cmNlQnVuZGxlLCBbXG5cdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0lURU1fU1VCVElUTEVfQ1JFQVRJT05fUk9XX0lORElDQVRPUlwiKSxcblx0XHRcdFx0c1RhYmxlVGFyZ2V0Q29sTmFtZSA/IHNUYWJsZVRhcmdldENvbE5hbWUgOiBvQ29sRnJvbVRhYmxlU2V0dGluZ3MubGFiZWxcblx0XHRcdF0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBvVGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0VGV4dEFubm90YXRpb24gPSB0aGlzLl9nZXRUYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRGb3JUZXh0QW5ub3RhdGlvbihcblx0XHRcdFx0b1RhYmxlLFxuXHRcdFx0XHRvVGFibGVSb3dDb250ZXh0LFxuXHRcdFx0XHRzVGFibGVGaXJzdENvbFByb3BlcnR5XG5cdFx0XHQpO1xuXHRcdFx0Y29uc3Qgc1RhYmxlRmlyc3RDb2xUZXh0QW5ub3RhdGlvblBhdGggPSBvVGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0VGV4dEFubm90YXRpb25cblx0XHRcdFx0PyBvVGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0VGV4dEFubm90YXRpb24uZ2V0T2JqZWN0KFwiJFBhdGhcIilcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBzVGFibGVGaXJzdENvbFRleHRBcnJhbmdlbWVudCA9XG5cdFx0XHRcdHNUYWJsZUZpcnN0Q29sVGV4dEFubm90YXRpb25QYXRoICYmIG9UYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRUZXh0QW5ub3RhdGlvblxuXHRcdFx0XHRcdD8gb1RhYmxlRmlyc3RDb2xCaW5kaW5nQ29udGV4dFRleHRBbm5vdGF0aW9uLmdldE9iamVjdChcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5UZXh0QXJyYW5nZW1lbnQvJEVudW1NZW1iZXJcIilcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGlmIChvVGFibGVSb3dCaW5kaW5nQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHQvLyBzZXQgUm93IHN1YnRpdGxlIHRleHRcblx0XHRcdFx0aWYgKG9UYWJsZVJvd0NvbnRleHQgJiYgc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdHNSb3dTdWJ0aXRsZVZhbHVlID0gdGhpcy5fZ2V0VGFibGVGaXJzdENvbFZhbHVlKFxuXHRcdFx0XHRcdFx0c1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdG9UYWJsZVJvd0NvbnRleHQsXG5cdFx0XHRcdFx0XHRzVGFibGVGaXJzdENvbFRleHRBbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0XHRcdHNUYWJsZUZpcnN0Q29sVGV4dEFycmFuZ2VtZW50XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzUm93U3VidGl0bGVWYWx1ZSA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0lURU1fU1VCVElUTEVfSU5ESUNBVE9SX1VOS05PV05cIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gc2V0IHRoZSBtZXNzYWdlIHN1YnRpdGxlXG5cdFx0XHRcdGlmIChzVGFibGVUYXJnZXRDb2xOYW1lKSB7XG5cdFx0XHRcdFx0Ly8gaWYgY29sdW1uIGlzIHByZXNlbnQgaW4gdGFibGUgZGVmaW5pdGlvblxuXHRcdFx0XHRcdHNNZXNzYWdlU3VidGl0bGUgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIlRfTUVTU0FHRV9JVEVNX1NVQlRJVExFXCIsIG9SZXNvdXJjZUJ1bmRsZSwgW1xuXHRcdFx0XHRcdFx0c1Jvd1N1YnRpdGxlVmFsdWUsXG5cdFx0XHRcdFx0XHRzVGFibGVUYXJnZXRDb2xOYW1lXG5cdFx0XHRcdFx0XSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAob0NvbEZyb21UYWJsZVNldHRpbmdzKSB7XG5cdFx0XHRcdFx0Ly8gaWYgY29sdW1uIGlzIG5laXRoZXIgaW4gdGFibGUgZGVmaW5pdGlvbiBub3IgcGVyc29uYWxpemF0aW9uLCBzaG93IG9ubHkgcm93IHN1YnRpdGxlIHRleHRcblx0XHRcdFx0XHRpZiAob0NvbEZyb21UYWJsZVNldHRpbmdzLmF2YWlsYWJpbGl0eSA9PT0gXCJIaWRkZW5cIikge1xuXHRcdFx0XHRcdFx0c01lc3NhZ2VTdWJ0aXRsZSA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0dST1VQX0RFU0NSSVBUSU9OX1RBQkxFX1JPV1wiKSArIFwiOiBcIiArIHNSb3dTdWJ0aXRsZVZhbHVlO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvL2lmIGNvbHVtbiBpcyBpbiB0YWJsZSBwZXJzb25hbGl6YXRpb24gYnV0IG5vdCBpbiB0YWJsZSBkZWZpbml0aW9uLCBzaG93IENvbHVtbiAoSGlkZGVuKSA6IDxjb2xOYW1lPlxuXHRcdFx0XHRcdFx0c0NvbHVtblN1YnRpdGxlVGV4dCA9XG5cdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0dST1VQX0RFU0NSSVBUSU9OX1RBQkxFX0NPTFVNTlwiKSArXG5cdFx0XHRcdFx0XHRcdFwiIChcIiArXG5cdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9DT0xVTU5fSU5ESUNBVE9SX0lOX1RBQkxFX0RFRklOSVRJT05cIikgK1xuXHRcdFx0XHRcdFx0XHRcIik6IFwiICtcblx0XHRcdFx0XHRcdFx0b0NvbEZyb21UYWJsZVNldHRpbmdzLmxhYmVsO1xuXHRcdFx0XHRcdFx0c01lc3NhZ2VTdWJ0aXRsZSA9XG5cdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0dST1VQX0RFU0NSSVBUSU9OX1RBQkxFX1JPV1wiKSArXG5cdFx0XHRcdFx0XHRcdFwiOiBcIiArXG5cdFx0XHRcdFx0XHRcdHNSb3dTdWJ0aXRsZVZhbHVlICtcblx0XHRcdFx0XHRcdFx0XCIsIFwiICtcblx0XHRcdFx0XHRcdFx0c0NvbHVtblN1YnRpdGxlVGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c01lc3NhZ2VTdWJ0aXRsZSA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9NRVNTQUdFX0lURU1fU1VCVElUTEVcIiwgb1Jlc291cmNlQnVuZGxlLCBbXG5cdFx0XHRcdFx0XHRzUm93U3VidGl0bGVWYWx1ZSxcblx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0lURU1fU1VCVElUTEVfSU5ESUNBVE9SX1VOS05PV05cIilcblx0XHRcdFx0XHRdKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c01lc3NhZ2VTdWJ0aXRsZSA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vc2V0IHRoZSBzdWJ0aXRsZVxuXHRcdG1lc3NhZ2Uuc2V0U3VidGl0bGUoc01lc3NhZ2VTdWJ0aXRsZSk7XG5cdFx0Y29uc3Qgb1RhYmxlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKFxuXHRcdFx0b1RhYmxlXG5cdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHQuZ2V0T2JqZWN0KG9UYWJsZS5kYXRhKFwiZW50aXR5VHlwZVwiKSlcblx0XHQpO1xuXHRcdC8vIFRPRE86IHRoaXMgbG9naWMgd291bGQgYmUgbW92ZWQgdG8gY2hlY2sgdGhlIHNhbWUgYXQgdGhlIHRlbXBsYXRlIHRpbWUgdG8gYXZvaWQgdGhlIHNhbWUgY2hlY2sgaGFwcGVuaW5nIG11bHRpcGxlIHRpbWVzXG5cdFx0Y29uc3Qgb0NvbXBvbmVudCA9IHNhcC51aS5yZXF1aXJlKFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCIpO1xuXHRcdGNvbnN0IG9OYXZPYmplY3QgPSBvVGFibGUgJiYgb0NvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcihvVGFibGUpICYmIG9Db21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3Iob1RhYmxlKS5nZXROYXZpZ2F0aW9uKCk7XG5cdFx0bGV0IGJTdWJPUENvbmZpZ3VyZWQgPSBmYWxzZTtcblx0XHRpZiAob05hdk9iamVjdCAmJiBPYmplY3Qua2V5cyhvTmF2T2JqZWN0KS5pbmRleE9mKG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkuc1BhdGgpICE9IC0xKSB7XG5cdFx0XHRiU3ViT1BDb25maWd1cmVkID1cblx0XHRcdFx0b05hdk9iamVjdFtvVGFibGUuZ2V0Um93QmluZGluZygpLnNQYXRoXSAmJlxuXHRcdFx0XHRvTmF2T2JqZWN0W29UYWJsZS5nZXRSb3dCaW5kaW5nKCkuc1BhdGhdLmRldGFpbCAmJlxuXHRcdFx0XHRvTmF2T2JqZWN0W29UYWJsZS5nZXRSb3dCaW5kaW5nKCkuc1BhdGhdLmRldGFpbC5yb3V0ZVxuXHRcdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHRcdDogZmFsc2U7XG5cdFx0fVxuXHRcdGNvbnN0IGJJc05hdmlnYXRpb25Db25maWd1cmVkID1cblx0XHRcdGJTdWJPUENvbmZpZ3VyZWQgJiZcblx0XHRcdG9UYWJsZS5nZXRSb3dBY3Rpb24oKSAmJlxuXHRcdFx0b1RhYmxlLmdldFJvd0FjdGlvbigpLmluZGV4T2YoXCJOYXZpZ2F0aW9uXCIpICE9IC0xICYmXG5cdFx0XHRvVGFibGVQcm9wZXJ0aWVzLmluZGV4T2Yoc1RhYmxlVGFyZ2V0UHJvcGVydHkpICE9IC0xXG5cdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHQ6IGZhbHNlO1xuXHRcdC8vIERlYWN0aXZhdGlvbiBvZiB0aGUgZXJyb3IgbGluayB3aGVuIHRoZSBlcnJvciBjb2x1bW4gaXMgbm90IGRpc3BsYXllZFxuXHRcdC8vIGJ1dCBUaGUgTGluayBzaG91bGQgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIG5vIHN1YnRpdGxlXG5cdFx0bWVzc2FnZS5zZXRBY3RpdmVUaXRsZShcblx0XHRcdCFzTWVzc2FnZVN1YnRpdGxlIHx8XG5cdFx0XHRcdGJJc05hdmlnYXRpb25Db25maWd1cmVkIHx8XG5cdFx0XHRcdGJJc0NyZWF0aW9uUm93IHx8XG5cdFx0XHRcdCghIXNUYWJsZVRhcmdldENvbE5hbWUgPyAhIW9UYWJsZVJvd0NvbnRleHQgOiAhIXNUYWJsZVRhcmdldENvbE5hbWUpXG5cdFx0KTtcblx0XHRyZXR1cm4gc01lc3NhZ2VTdWJ0aXRsZTtcblx0fVxuXG5cdF9yZW1vdmVNZXNzYWdlKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRjb25zdCBvVGVtcCA9IHNhcC51aVxuXHRcdFx0LmdldENvcmUoKVxuXHRcdFx0LmdldE1lc3NhZ2VNYW5hZ2VyKClcblx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0LmdldERhdGEoKTtcblx0XHRzYXAudWlcblx0XHRcdC5nZXRDb3JlKClcblx0XHRcdC5nZXRNZXNzYWdlTWFuYWdlcigpXG5cdFx0XHQucmVtb3ZlQWxsTWVzc2FnZXMoKTtcblx0XHRvVGVtcC5mb3JFYWNoKGZ1bmN0aW9uKG1lc3NhZ2U6IGFueSkge1xuXHRcdFx0aWYgKG1lc3NhZ2UgIT09IG9NZXNzYWdlKSB7XG5cdFx0XHRcdHNhcC51aVxuXHRcdFx0XHRcdC5nZXRDb3JlKClcblx0XHRcdFx0XHQuZ2V0TWVzc2FnZU1hbmFnZXIoKVxuXHRcdFx0XHRcdC5hZGRNZXNzYWdlcyhbbWVzc2FnZV0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1lc3NhZ2VCdXR0b247XG4iXX0=
|