@sapui5/sap.fe.core 1.111.1 → 1.112.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/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime-dbg.js +4 -4
- package/src/sap/fe/core/ActionRuntime.js +1 -1
- package/src/sap/fe/core/ActionRuntime.js.map +1 -1
- package/src/sap/fe/core/ActionRuntime.ts +11 -11
- package/src/sap/fe/core/AppComponent-dbg.js +27 -5
- package/src/sap/fe/core/AppComponent.js +1 -1
- package/src/sap/fe/core/AppComponent.js.map +1 -1
- package/src/sap/fe/core/AppComponent.ts +58 -3
- package/src/sap/fe/core/AppStateHandler-dbg.js +5 -2
- package/src/sap/fe/core/AppStateHandler.js +1 -1
- package/src/sap/fe/core/AppStateHandler.js.map +1 -1
- package/src/sap/fe/core/AppStateHandler.ts +10 -1
- package/src/sap/fe/core/BaseController-dbg.js +1 -1
- package/src/sap/fe/core/BaseController.ts +2 -1
- package/src/sap/fe/core/CommonUtils-dbg.js +152 -365
- package/src/sap/fe/core/CommonUtils.js +1 -1
- package/src/sap/fe/core/CommonUtils.js.map +1 -1
- package/src/sap/fe/core/CommonUtils.ts +201 -478
- package/src/sap/fe/core/ExtensionAPI-dbg.js +2 -1
- package/src/sap/fe/core/ExtensionAPI.js +1 -1
- package/src/sap/fe/core/ExtensionAPI.js.map +1 -1
- package/src/sap/fe/core/ExtensionAPI.ts +9 -1
- package/src/sap/fe/core/PageController-dbg.js +26 -31
- package/src/sap/fe/core/PageController.js +1 -1
- package/src/sap/fe/core/PageController.js.map +1 -1
- package/src/sap/fe/core/PageController.ts +17 -3
- package/src/sap/fe/core/ResourceModel-dbg.js +71 -0
- package/src/sap/fe/core/ResourceModel.js +6 -0
- package/src/sap/fe/core/ResourceModel.js.map +1 -0
- package/src/sap/fe/core/ResourceModel.ts +67 -0
- package/src/sap/fe/core/TemplateComponent-dbg.js +1 -1
- package/src/sap/fe/core/TemplateComponent.ts +1 -0
- package/src/sap/fe/core/TemplateModel-dbg.js +1 -1
- package/src/sap/fe/core/TemplateModel.ts +6 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel-dbg.js +5 -7
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +6 -5
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase-dbg.js +163 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +6 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +169 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport-dbg.js +88 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js +6 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.ts +147 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor-dbg.js +905 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js +21 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/{BuildingBlockRuntime.ts → BuildingBlockTemplateProcessor.ts} +290 -362
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock-dbg.js +79 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js +15 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.ts +68 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment-dbg.js +162 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js +6 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.ts +181 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo-dbg.js +4 -2
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +1 -1
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +5 -3
- package/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +890 -220
- package/src/sap/fe/core/controllerextensions/EditFlow.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +974 -239
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +24 -34
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +71 -61
- package/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +14 -17
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +23 -17
- package/src/sap/fe/core/controllerextensions/KPIManagement-dbg.js +1 -1
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -0
- package/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +3 -3
- package/src/sap/fe/core/controllerextensions/MassEdit.js +1 -1
- package/src/sap/fe/core/controllerextensions/MassEdit.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +2 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler-dbg.js +2 -1
- package/src/sap/fe/core/controllerextensions/MessageHandler.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +2 -0
- package/src/sap/fe/core/controllerextensions/PageReady-dbg.js +1 -1
- package/src/sap/fe/core/controllerextensions/PageReady.ts +24 -0
- package/src/sap/fe/core/controllerextensions/Paginator-dbg.js +2 -1
- package/src/sap/fe/core/controllerextensions/Paginator.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/Paginator.ts +7 -0
- package/src/sap/fe/core/controllerextensions/Placeholder-dbg.js +1 -1
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +8 -0
- package/src/sap/fe/core/controllerextensions/Share-dbg.js +8 -1
- package/src/sap/fe/core/controllerextensions/Share.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/Share.ts +11 -0
- package/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +14 -13
- package/src/sap/fe/core/controllerextensions/SideEffects.js +1 -1
- package/src/sap/fe/core/controllerextensions/SideEffects.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +27 -27
- package/src/sap/fe/core/controllerextensions/ViewState-dbg.js +17 -8
- package/src/sap/fe/core/controllerextensions/ViewState.js +1 -1
- package/src/sap/fe/core/controllerextensions/ViewState.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/ViewState.ts +35 -14
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase-dbg.js +6 -5
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +7 -4
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync-dbg.js +285 -82
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +326 -89
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon-dbg.js +23 -2
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +32 -3
- package/src/sap/fe/core/controllerextensions/collaboration/Manage-dbg.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +2 -3
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +17 -3
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block-dbg.js +65 -34
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +1 -1
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +33 -18
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +45 -31
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +52 -42
- package/src/sap/fe/core/controllerextensions/editFlow/draft-dbg.js +44 -49
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +43 -63
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal-dbg.js +77 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js +6 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.ts +114 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade-dbg.js +1505 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +6 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +1985 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations-dbg.js +3 -1415
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +2 -1921
- package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +10 -11
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +9 -13
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +43 -41
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +1 -1
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +44 -47
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher-dbg.js +12 -1
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +19 -0
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy-dbg.js +12 -13
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +1 -1
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +32 -13
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -1
- package/src/sap/fe/core/controls/CommandExecution-dbg.js +16 -5
- package/src/sap/fe/core/controls/CommandExecution.js +1 -1
- package/src/sap/fe/core/controls/CommandExecution.js.map +1 -1
- package/src/sap/fe/core/controls/CommandExecution.ts +15 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler-dbg.js +3 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +1 -1
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js.map +1 -1
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +4 -1
- package/src/sap/fe/core/controls/FilterBar-dbg.js +1 -1
- package/src/sap/fe/core/controls/FilterBar.ts +5 -0
- package/src/sap/fe/core/controls/FormElementWrapper-dbg.js +1 -1
- package/src/sap/fe/core/controls/FormElementWrapper.ts +3 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer-dbg.js +1 -1
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +7 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +4 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer-dbg.js +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +10 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils-dbg.js +4 -3
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js.map +1 -1
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -2
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +0 -1
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +2 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers-dbg.js +6 -1
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +1 -1
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js.map +1 -1
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +5 -0
- package/src/sap/fe/core/converters/ConverterContext-dbg.js +1 -1
- package/src/sap/fe/core/converters/ConverterContext.ts +2 -1
- package/src/sap/fe/core/converters/ManifestSettings-dbg.js +1 -8
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.js.map +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +15 -6
- package/src/sap/fe/core/converters/ManifestWrapper-dbg.js +17 -1
- package/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
- package/src/sap/fe/core/converters/ManifestWrapper.js.map +1 -1
- package/src/sap/fe/core/converters/ManifestWrapper.ts +16 -0
- package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +61 -49
- package/src/sap/fe/core/converters/MetaModelConverter.js +1 -1
- package/src/sap/fe/core/converters/MetaModelConverter.js.map +1 -1
- package/src/sap/fe/core/converters/MetaModelConverter.ts +65 -51
- package/src/sap/fe/core/converters/TemplateConverter-dbg.js +2 -1
- package/src/sap/fe/core/converters/TemplateConverter.js.map +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
- package/src/sap/fe/core/converters/annotations/DataField-dbg.js +65 -16
- package/src/sap/fe/core/converters/annotations/DataField.js +1 -1
- package/src/sap/fe/core/converters/annotations/DataField.js.map +1 -1
- package/src/sap/fe/core/converters/annotations/DataField.ts +62 -18
- package/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +1010 -957
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1 -1
- package/src/sap/fe/core/converters/common/AnnotationConverter.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Action-dbg.js +8 -8
- package/src/sap/fe/core/converters/controls/Common/Action.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Action.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Action.ts +28 -26
- package/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +95 -33
- package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Chart.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +133 -49
- package/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +99 -62
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +140 -75
- package/src/sap/fe/core/converters/controls/Common/Form-dbg.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Form.ts +3 -3
- package/src/sap/fe/core/converters/controls/Common/KPI-dbg.js +6 -6
- package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +15 -15
- package/src/sap/fe/core/converters/controls/Common/Table-dbg.js +97 -69
- package/src/sap/fe/core/converters/controls/Common/Table.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Table.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Table.ts +161 -137
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +10 -9
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +48 -44
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js.map +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +130 -86
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters-dbg.js +34 -26
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js.map +1 -1
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +62 -45
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar-dbg.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet-dbg.js +6 -6
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js.map +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +5 -8
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection-dbg.js +34 -13
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js.map +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +54 -20
- package/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +3 -1
- package/src/sap/fe/core/converters/helpers/Aggregation.js.map +1 -1
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +8 -0
- package/src/sap/fe/core/converters/helpers/ConfigurableObject-dbg.js +7 -6
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +1 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js.map +1 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +19 -10
- package/src/sap/fe/core/converters/helpers/DataFieldHelper-dbg.js +1 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +7 -2
- package/src/sap/fe/core/converters/helpers/ID-dbg.js +1 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +2 -1
- package/src/sap/fe/core/converters/helpers/IssueManager-dbg.js +9 -8
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.js.map +1 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +8 -7
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction-dbg.js +8 -7
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js.map +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +9 -6
- package/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +25 -33
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +1 -1
- package/src/sap/fe/core/converters/templates/ListReportConverter.js.map +1 -1
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +35 -35
- package/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +11 -4
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +1 -1
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js.map +1 -1
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +7 -1
- package/src/sap/fe/core/formatters/FPMFormatter-dbg.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/FiscalFormat-dbg.js +2 -2
- package/src/sap/fe/core/formatters/FiscalFormat.ts +6 -1
- package/src/sap/fe/core/formatters/TableFormatter-dbg.js +2 -2
- package/src/sap/fe/core/formatters/TableFormatter.js +1 -1
- package/src/sap/fe/core/formatters/TableFormatter.js.map +1 -1
- package/src/sap/fe/core/formatters/TableFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter-dbg.js +5 -5
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.js.map +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.ts +6 -4
- package/src/sap/fe/core/fpm/Component-dbg.js +1 -1
- package/src/sap/fe/core/fpm/Component.ts +1 -0
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper-dbg.js +2 -2
- package/src/sap/fe/core/helpers/AppStartupHelper.js +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +6 -6
- package/src/sap/fe/core/helpers/BindingToolkit.js.map +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.ts +8 -8
- package/src/sap/fe/core/helpers/ClassSupport-dbg.js +1 -1
- package/src/sap/fe/core/helpers/ClassSupport.js.map +1 -1
- package/src/sap/fe/core/helpers/ClassSupport.ts +1 -0
- package/src/sap/fe/core/helpers/DeleteHelper-dbg.js +93 -62
- package/src/sap/fe/core/helpers/DeleteHelper.js +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper.ts +140 -185
- package/src/sap/fe/core/helpers/MassEditHelper-dbg.js +20 -18
- package/src/sap/fe/core/helpers/MassEditHelper.js +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.ts +22 -23
- package/src/sap/fe/core/helpers/MessageStrip-dbg.js +4 -5
- package/src/sap/fe/core/helpers/MessageStrip.js +1 -1
- package/src/sap/fe/core/helpers/MessageStrip.js.map +1 -1
- package/src/sap/fe/core/helpers/MessageStrip.ts +4 -4
- package/src/sap/fe/core/helpers/MetaModelFunction-dbg.js +354 -0
- package/src/sap/fe/core/helpers/MetaModelFunction.js +6 -0
- package/src/sap/fe/core/helpers/MetaModelFunction.js.map +1 -0
- package/src/sap/fe/core/helpers/MetaModelFunction.ts +408 -0
- package/src/sap/fe/core/helpers/ModelHelper-dbg.js +13 -13
- package/src/sap/fe/core/helpers/ModelHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/ModelHelper.ts +13 -13
- package/src/sap/fe/core/helpers/PasteHelper-dbg.js +5 -5
- package/src/sap/fe/core/helpers/PasteHelper.js +1 -1
- package/src/sap/fe/core/helpers/PasteHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/PasteHelper.ts +6 -10
- package/src/sap/fe/core/helpers/ResourceModelHelper-dbg.js +26 -0
- package/src/sap/fe/core/helpers/ResourceModelHelper.js +6 -0
- package/src/sap/fe/core/helpers/ResourceModelHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/ResourceModelHelper.ts +19 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators-dbg.js +93 -18
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.js.map +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +70 -17
- package/src/sap/fe/core/helpers/SemanticKeyHelper-dbg.js +2 -2
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +1 -1
- package/src/sap/fe/core/helpers/Synchronization-dbg.js +1 -1
- package/src/sap/fe/core/helpers/Synchronization.ts +2 -0
- package/src/sap/fe/core/helpers/TypeGuards-dbg.js +5 -1
- package/src/sap/fe/core/helpers/TypeGuards.js +1 -1
- package/src/sap/fe/core/helpers/TypeGuards.js.map +1 -1
- package/src/sap/fe/core/helpers/TypeGuards.ts +12 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader-dbg.js +2 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js.map +1 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +6 -2
- package/src/sap/fe/core/jsx-runtime/jsx-control-dbg.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +3 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents-dbg.js +3 -3
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js.map +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
- package/src/sap/fe/core/library-dbg.js +2 -2
- package/src/sap/fe/core/library-preload.js +127 -125
- package/src/sap/fe/core/library-preload.js.map +1 -1
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/library.ts +7 -0
- package/src/sap/fe/core/manifest.json +1 -1
- package/src/sap/fe/core/messagebundle.properties +33 -0
- package/src/sap/fe/core/messagebundle_ar.properties +12 -10
- package/src/sap/fe/core/messagebundle_bg.properties +11 -9
- package/src/sap/fe/core/messagebundle_ca.properties +11 -9
- package/src/sap/fe/core/messagebundle_cs.properties +11 -9
- package/src/sap/fe/core/messagebundle_cy.properties +11 -9
- package/src/sap/fe/core/messagebundle_da.properties +11 -9
- package/src/sap/fe/core/messagebundle_de.properties +3 -1
- package/src/sap/fe/core/messagebundle_el.properties +11 -9
- package/src/sap/fe/core/messagebundle_en.properties +3 -1
- package/src/sap/fe/core/messagebundle_en_GB.properties +2 -0
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +2 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +20 -0
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +21 -3
- package/src/sap/fe/core/messagebundle_es.properties +11 -9
- package/src/sap/fe/core/messagebundle_es_MX.properties +11 -9
- package/src/sap/fe/core/messagebundle_et.properties +11 -9
- package/src/sap/fe/core/messagebundle_fi.properties +11 -9
- package/src/sap/fe/core/messagebundle_fr.properties +11 -9
- package/src/sap/fe/core/messagebundle_fr_CA.properties +3 -1
- package/src/sap/fe/core/messagebundle_hi.properties +2 -0
- package/src/sap/fe/core/messagebundle_hr.properties +11 -9
- package/src/sap/fe/core/messagebundle_hu.properties +11 -9
- package/src/sap/fe/core/messagebundle_id.properties +3 -1
- package/src/sap/fe/core/messagebundle_it.properties +11 -9
- package/src/sap/fe/core/messagebundle_iw.properties +11 -9
- package/src/sap/fe/core/messagebundle_ja.properties +11 -9
- package/src/sap/fe/core/messagebundle_kk.properties +11 -9
- package/src/sap/fe/core/messagebundle_ko.properties +2 -0
- package/src/sap/fe/core/messagebundle_lt.properties +11 -9
- package/src/sap/fe/core/messagebundle_lv.properties +2 -0
- package/src/sap/fe/core/messagebundle_ms.properties +12 -10
- package/src/sap/fe/core/messagebundle_nl.properties +12 -10
- package/src/sap/fe/core/messagebundle_no.properties +11 -9
- package/src/sap/fe/core/messagebundle_pl.properties +2 -0
- package/src/sap/fe/core/messagebundle_pt.properties +11 -9
- package/src/sap/fe/core/messagebundle_pt_PT.properties +11 -9
- package/src/sap/fe/core/messagebundle_ro.properties +3 -1
- package/src/sap/fe/core/messagebundle_ru.properties +3 -1
- package/src/sap/fe/core/messagebundle_sh.properties +11 -9
- package/src/sap/fe/core/messagebundle_sk.properties +11 -9
- package/src/sap/fe/core/messagebundle_sl.properties +11 -9
- package/src/sap/fe/core/messagebundle_sv.properties +2 -0
- package/src/sap/fe/core/messagebundle_th.properties +11 -9
- package/src/sap/fe/core/messagebundle_tr.properties +11 -9
- package/src/sap/fe/core/messagebundle_uk.properties +11 -9
- package/src/sap/fe/core/messagebundle_vi.properties +12 -10
- package/src/sap/fe/core/messagebundle_zh_CN.properties +2 -0
- package/src/sap/fe/core/messagebundle_zh_TW.properties +2 -0
- package/src/sap/fe/core/operationsHelper-dbg.js +70 -44
- package/src/sap/fe/core/operationsHelper.js +1 -1
- package/src/sap/fe/core/operationsHelper.js.map +1 -1
- package/src/sap/fe/core/operationsHelper.ts +88 -63
- package/src/sap/fe/core/rootView/Fcl-dbg.controller.js +1 -1
- package/src/sap/fe/core/rootView/Fcl.controller.ts +10 -0
- package/src/sap/fe/core/rootView/NavContainer-dbg.controller.js +2 -2
- package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
- package/src/sap/fe/core/rootView/NavContainer.controller.js.map +1 -1
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +5 -3
- package/src/sap/fe/core/rootView/RootViewBaseController-dbg.js +4 -3
- package/src/sap/fe/core/rootView/RootViewBaseController.js +1 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.js.map +1 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +15 -5
- package/src/sap/fe/core/services/AsyncComponentServiceFactory-dbg.js +1 -1
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory-dbg.js +1 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +15 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +4 -1
- package/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +9 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +19 -1
- package/src/sap/fe/core/services/ResourceModelServiceFactory-dbg.js +2 -2
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +10 -3
- package/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +3 -3
- package/src/sap/fe/core/services/RoutingServiceFactory.js +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +29 -3
- package/src/sap/fe/core/services/ShellServicesFactory-dbg.js +1 -1
- package/src/sap/fe/core/services/ShellServicesFactory.ts +14 -2
- package/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +448 -279
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +1 -1
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +502 -333
- package/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +18 -5
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +41 -12
- package/src/sap/fe/core/support/Diagnostics-dbg.js +1 -1
- package/src/sap/fe/core/support/Diagnostics.ts +5 -0
- package/src/sap/fe/core/templating/DataModelPathHelper-dbg.js +185 -86
- package/src/sap/fe/core/templating/DataModelPathHelper.js +1 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.js.map +1 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +190 -82
- package/src/sap/fe/core/templating/DisplayModeFormatter-dbg.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper-dbg.js +2 -3
- package/src/sap/fe/core/templating/EntitySetHelper.js +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper.js.map +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper.ts +1 -3
- package/src/sap/fe/core/templating/FilterHelper-dbg.js +3 -3
- package/src/sap/fe/core/templating/FilterHelper.js +1 -1
- package/src/sap/fe/core/templating/FilterHelper.js.map +1 -1
- package/src/sap/fe/core/templating/FilterHelper.ts +5 -3
- package/src/sap/fe/core/templating/PropertyHelper-dbg.js +1 -1
- package/src/sap/fe/core/templating/PropertyHelper.ts +2 -2
- package/src/sap/fe/core/templating/UIFormatters-dbg.js +1 -1
- package/src/sap/fe/core/templating/UIFormatters.ts +4 -0
- package/src/sap/fe/core/type/DateTimeWithTimezone-dbg.js +1 -1
- package/src/sap/fe/core/type/DateTimeWithTimezone.ts +2 -0
- package/src/sap/fe/core/type/FiscalDate-dbg.js +2 -2
- package/src/sap/fe/core/type/FiscalDate.js.map +1 -1
- package/src/sap/fe/core/type/FiscalDate.ts +2 -1
- package/src/sap/fe/core/type/TypeUtil-dbg.js +5 -10
- package/src/sap/fe/core/type/TypeUtil.js +1 -1
- package/src/sap/fe/core/type/TypeUtil.js.map +1 -1
- package/src/sap/fe/core/type/TypeUtil.ts +3 -6
- package/src/sap/fe/core/buildingBlocks/BuildingBlock-dbg.js +0 -410
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +0 -15
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js.map +0 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +0 -536
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment-dbg.js +0 -44
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +0 -6
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js.map +0 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +0 -14
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime-dbg.js +0 -948
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +0 -19
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js.map +0 -1
- package/src/sap/fe/core/controllerextensions/InternalEditFlow-dbg.js +0 -711
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +0 -6
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js.map +0 -1
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +0 -863
- package/src/sap/fe/core/controls/ConditionalWrapper-dbg.js +0 -151
- package/src/sap/fe/core/controls/ConditionalWrapper.js +0 -6
- package/src/sap/fe/core/controls/ConditionalWrapper.js.map +0 -1
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +0 -88
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper-dbg.js +0 -330
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +0 -6
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js.map +0 -1
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +0 -292
- package/src/sap/fe/core/controls/CustomQuickViewPage-dbg.js +0 -126
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +0 -6
- package/src/sap/fe/core/controls/CustomQuickViewPage.js.map +0 -1
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +0 -105
- package/src/sap/fe/core/controls/FieldWrapper-dbg.js +0 -194
- package/src/sap/fe/core/controls/FieldWrapper.js +0 -6
- package/src/sap/fe/core/controls/FieldWrapper.js.map +0 -1
- package/src/sap/fe/core/controls/FieldWrapper.ts +0 -121
- package/src/sap/fe/core/controls/FileWrapper-dbg.js +0 -280
- package/src/sap/fe/core/controls/FileWrapper.js +0 -6
- package/src/sap/fe/core/controls/FileWrapper.js.map +0 -1
- package/src/sap/fe/core/controls/FileWrapper.ts +0 -202
- package/src/sap/fe/core/helpers/SideEffectsHelper-dbg.js +0 -141
- package/src/sap/fe/core/helpers/SideEffectsHelper.js +0 -6
- package/src/sap/fe/core/helpers/SideEffectsHelper.js.map +0 -1
- package/src/sap/fe/core/helpers/SideEffectsHelper.ts +0 -129
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2023 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/collaboration/ActivityBase", "sap/fe/core/controllerextensions/collaboration/CollaborationCommon", "sap/m/MessageBox"], function (Log, CommonUtils, ActivityBase, CollaborationCommon, MessageBox) {
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/collaboration/ActivityBase", "sap/fe/core/controllerextensions/collaboration/CollaborationCommon", "sap/fe/core/converters/MetaModelConverter", "sap/m/MessageBox"], function (Log, CommonUtils, ActivityBase, CollaborationCommon, MetaModelConverter, MessageBox) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _exports = {};
|
|
@@ -21,10 +21,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
21
21
|
return isCollaborationConnected(internalModel);
|
|
22
22
|
};
|
|
23
23
|
_exports.isConnected = isConnected;
|
|
24
|
-
const send = function (control, action, content, triggeredActionName) {
|
|
24
|
+
const send = function (control, action, content, triggeredActionName, refreshListBinding, actionRequestedProperties) {
|
|
25
25
|
if (isConnected(control)) {
|
|
26
26
|
const internalModel = control.getModel("internal");
|
|
27
27
|
const clientContent = Array.isArray(content) ? content.join("|") : content;
|
|
28
|
+
const requestedProperties = actionRequestedProperties === null || actionRequestedProperties === void 0 ? void 0 : actionRequestedProperties.join("|");
|
|
28
29
|
const myActivity = internalModel.getProperty(MYACTIVITY);
|
|
29
30
|
if (action === Activity.LiveChange) {
|
|
30
31
|
// To avoid unnecessary traffic we keep track of live changes and send it only once
|
|
@@ -43,7 +44,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
43
44
|
// user finished the activity
|
|
44
45
|
internalModel.setProperty(MYACTIVITY, null);
|
|
45
46
|
}
|
|
46
|
-
broadcastCollaborationMessage(action, clientContent, internalModel, triggeredActionName);
|
|
47
|
+
broadcastCollaborationMessage(action, clientContent, internalModel, triggeredActionName, refreshListBinding, requestedProperties);
|
|
47
48
|
}
|
|
48
49
|
};
|
|
49
50
|
_exports.send = send;
|
|
@@ -77,15 +78,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
77
78
|
initializeCollaboration(me, webSocketBaseURL, sDraftUUID, serviceUrl, internalModel, message => {
|
|
78
79
|
messageReceive(message, view);
|
|
79
80
|
});
|
|
81
|
+
internalModel.setProperty(MYACTIVITY, null);
|
|
80
82
|
};
|
|
81
83
|
_exports.connect = connect;
|
|
82
84
|
const disconnect = function (control) {
|
|
83
85
|
const internalModel = control.getModel("internal");
|
|
84
86
|
endCollaboration(internalModel);
|
|
85
87
|
};
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Callback when a message is received from the websocket.
|
|
91
|
+
*
|
|
92
|
+
* @param message The message received
|
|
93
|
+
* @param view The view that was used initially when connecting the websocket
|
|
94
|
+
*/
|
|
86
95
|
_exports.disconnect = disconnect;
|
|
87
96
|
function messageReceive(message, view) {
|
|
88
|
-
var
|
|
97
|
+
var _activities;
|
|
89
98
|
const internalModel = view.getModel("internal");
|
|
90
99
|
let activeUsers = internalModel.getProperty(ACTIVEUSERS);
|
|
91
100
|
let activities;
|
|
@@ -139,40 +148,24 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
139
148
|
internalModel.setProperty(ACTIVITIES, allActivities);
|
|
140
149
|
break;
|
|
141
150
|
case Activity.Change:
|
|
142
|
-
|
|
143
|
-
return view.getModel().getMetaModel().getMetaPath(path);
|
|
144
|
-
});
|
|
145
|
-
metaPaths.forEach((currentMetaPath, i) => {
|
|
146
|
-
var _message$clientConten2, _currentActivities;
|
|
147
|
-
const nesteedMessage = {
|
|
148
|
-
...message,
|
|
149
|
-
clientContent: message === null || message === void 0 ? void 0 : (_message$clientConten2 = message.clientContent) === null || _message$clientConten2 === void 0 ? void 0 : _message$clientConten2.split("|")[i]
|
|
150
|
-
};
|
|
151
|
-
let currentActivities = internalModel.getProperty(ACTIVITIES + currentMetaPath) || [];
|
|
152
|
-
activityKey = getActivityKey(nesteedMessage.clientContent);
|
|
153
|
-
currentActivities = ((_currentActivities = currentActivities) === null || _currentActivities === void 0 ? void 0 : _currentActivities.filter) && currentActivities.filter(activity => activity.key !== activityKey);
|
|
154
|
-
if (currentActivities) {
|
|
155
|
-
internalModel.setProperty(ACTIVITIES + currentMetaPath, currentActivities);
|
|
156
|
-
update(view, nesteedMessage, currentMetaPath, Activity.Change);
|
|
157
|
-
}
|
|
158
|
-
});
|
|
151
|
+
updateOnChange(view, message);
|
|
159
152
|
break;
|
|
160
153
|
case Activity.Create:
|
|
161
154
|
// For create we actually just need to refresh the table
|
|
162
|
-
|
|
155
|
+
updateOnCreate(view, message);
|
|
163
156
|
break;
|
|
164
157
|
case Activity.Delete:
|
|
165
158
|
// For now also refresh the page but in case of deletion we need to inform the user
|
|
166
|
-
|
|
159
|
+
updateOnDelete(view, message);
|
|
167
160
|
break;
|
|
168
161
|
case Activity.Activate:
|
|
169
|
-
draftClosedByOtherUser(view, message, CollaborationUtils.getText("C_COLLABORATIONDRAFT_ACTIVATE", sender.name));
|
|
162
|
+
draftClosedByOtherUser(view, message.clientContent, CollaborationUtils.getText("C_COLLABORATIONDRAFT_ACTIVATE", sender.name));
|
|
170
163
|
break;
|
|
171
164
|
case Activity.Discard:
|
|
172
|
-
draftClosedByOtherUser(view, message, CollaborationUtils.getText("C_COLLABORATIONDRAFT_DISCARD", sender.name));
|
|
165
|
+
draftClosedByOtherUser(view, message.clientContent, CollaborationUtils.getText("C_COLLABORATIONDRAFT_DISCARD", sender.name));
|
|
173
166
|
break;
|
|
174
167
|
case Activity.Action:
|
|
175
|
-
|
|
168
|
+
updateOnAction(view, message);
|
|
176
169
|
break;
|
|
177
170
|
case Activity.LiveChange:
|
|
178
171
|
mactivity = sender;
|
|
@@ -200,78 +193,288 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
200
193
|
break;
|
|
201
194
|
}
|
|
202
195
|
}
|
|
203
|
-
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Displays a message that the current draft was closed be another user, and navigates back to a proper view.
|
|
199
|
+
*
|
|
200
|
+
* @param view The view that was used initially when connecting the websocket
|
|
201
|
+
* @param path The path of the context to navigate to
|
|
202
|
+
* @param messageText The message to display
|
|
203
|
+
*/
|
|
204
|
+
function draftClosedByOtherUser(view, path, messageText) {
|
|
204
205
|
disconnect(view);
|
|
205
|
-
MessageBox.information(
|
|
206
|
+
MessageBox.information(messageText);
|
|
206
207
|
view.getBindingContext().getBinding().resetChanges().then(function () {
|
|
207
|
-
navigate(
|
|
208
|
+
navigate(path, view);
|
|
208
209
|
}).catch(function () {
|
|
209
210
|
Log.error("Pending Changes could not be reset - still navigating to active instance");
|
|
210
|
-
navigate(
|
|
211
|
+
navigate(path, view);
|
|
211
212
|
});
|
|
212
213
|
}
|
|
213
|
-
|
|
214
|
-
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Updates data when a CHANGE message has been received.
|
|
217
|
+
*
|
|
218
|
+
* @param view The view that was used initially when connecting the websocket
|
|
219
|
+
* @param message The message received from the websocket
|
|
220
|
+
*/
|
|
221
|
+
function updateOnChange(view, message) {
|
|
222
|
+
const updatedObjectsPaths = message.clientContent.split("|");
|
|
215
223
|
const metaModel = view.getModel().getMetaModel();
|
|
224
|
+
const internalModel = view.getModel("internal");
|
|
225
|
+
|
|
226
|
+
// Remove all locks corresponding to the paths
|
|
227
|
+
updatedObjectsPaths.forEach(updatedPath => {
|
|
228
|
+
var _currentActivities;
|
|
229
|
+
const updatedMetaPath = metaModel.getMetaPath(updatedPath);
|
|
230
|
+
const activityKey = getActivityKey(updatedPath);
|
|
231
|
+
let currentActivities = internalModel.getProperty(ACTIVITIES + updatedMetaPath) || [];
|
|
232
|
+
currentActivities = ((_currentActivities = currentActivities) === null || _currentActivities === void 0 ? void 0 : _currentActivities.filter) && currentActivities.filter(activity => activity.key !== activityKey);
|
|
233
|
+
if (currentActivities) {
|
|
234
|
+
internalModel.setProperty(ACTIVITIES + updatedMetaPath, currentActivities);
|
|
235
|
+
}
|
|
236
|
+
});
|
|
216
237
|
const currentPage = getCurrentPage(view);
|
|
217
|
-
const sideEffectsService = appComponent.getSideEffectsService();
|
|
218
238
|
const currentContext = currentPage.getBindingContext();
|
|
219
|
-
const
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
239
|
+
const requestPromises = updatedObjectsPaths.map(path => applyUpdatesForChange(view, path));
|
|
240
|
+
|
|
241
|
+
// Simulate any change so the edit flow shows the draft indicator and sets the page to dirty
|
|
242
|
+
currentPage.getController().editFlow.updateDocument(currentContext, Promise.all(requestPromises));
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Updates data corresponding to a path.
|
|
247
|
+
*
|
|
248
|
+
* @param view The view that was used initially when connecting the websocket
|
|
249
|
+
* @param propertyPathForUpdate Absolute path to the updated property
|
|
250
|
+
* @returns A promise resolved when the data and its related side effects have been received
|
|
251
|
+
*/
|
|
252
|
+
async function applyUpdatesForChange(view, propertyPathForUpdate) {
|
|
253
|
+
const metaModel = view.getModel().getMetaModel();
|
|
254
|
+
const metaContext = metaModel.getMetaContext(propertyPathForUpdate);
|
|
255
|
+
const dataModelObject = MetaModelConverter.getInvolvedDataModelObjects(metaContext);
|
|
256
|
+
const targetContextPath = propertyPathForUpdate.substring(0, propertyPathForUpdate.lastIndexOf("/")); // Remove property name
|
|
257
|
+
const targetContext = findContextForUpdate(view, targetContextPath);
|
|
258
|
+
const parentCollectionPath = targetContextPath.substring(0, targetContextPath.lastIndexOf("("));
|
|
259
|
+
const parentContextPath = parentCollectionPath.substring(0, parentCollectionPath.lastIndexOf("/"));
|
|
260
|
+
const parentContext = parentContextPath ? findContextForUpdate(view, parentContextPath) : undefined;
|
|
261
|
+
if (!targetContext && !parentContext) {
|
|
262
|
+
return; // No context for update
|
|
237
263
|
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
if (
|
|
243
|
-
|
|
264
|
+
|
|
265
|
+
try {
|
|
266
|
+
const sideEffectsPromises = [];
|
|
267
|
+
const sideEffectsService = CollaborationUtils.getAppComponent(view).getSideEffectsService();
|
|
268
|
+
if (targetContext) {
|
|
269
|
+
// We have a target context, so we can retrieve the updated property
|
|
270
|
+
const targetMetaPath = metaModel.getMetaPath(targetContext.getPath());
|
|
271
|
+
const relativeMetaPathForUpdate = metaModel.getMetaPath(propertyPathForUpdate).replace(targetMetaPath, "").slice(1);
|
|
272
|
+
sideEffectsPromises.push(sideEffectsService.requestSideEffects([relativeMetaPathForUpdate], targetContext, SYNCGROUPID));
|
|
244
273
|
}
|
|
274
|
+
|
|
275
|
+
// Get the fieldGroupIds corresponding to pathForUpdate
|
|
276
|
+
const fieldGroupIds = sideEffectsService.computeFieldGroupIds(dataModelObject.targetEntityType.fullyQualifiedName, dataModelObject.targetObject.fullyQualifiedName);
|
|
277
|
+
|
|
278
|
+
// Execute the side effects for the fieldGroupIds
|
|
279
|
+
if (fieldGroupIds.length) {
|
|
280
|
+
const pageController = view.getController();
|
|
281
|
+
const sideEffectsMapForFieldGroup = pageController._sideEffects.getSideEffectsMapForFieldGroups(fieldGroupIds, targetContext || parentContext);
|
|
282
|
+
Object.keys(sideEffectsMapForFieldGroup).forEach(sideEffectName => {
|
|
283
|
+
const sideEffect = sideEffectsMapForFieldGroup[sideEffectName];
|
|
284
|
+
sideEffectsPromises.push(pageController._sideEffects.requestSideEffects(sideEffect.sideEffects, sideEffect.context, SYNCGROUPID));
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
await Promise.all(sideEffectsPromises);
|
|
288
|
+
} catch (err) {
|
|
289
|
+
Log.error("Failed to update data after change:" + err);
|
|
290
|
+
throw err;
|
|
245
291
|
}
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Updates data when a DELETE message has been received.
|
|
296
|
+
*
|
|
297
|
+
* @param view The view that was used initially when connecting the websocket
|
|
298
|
+
* @param message The message received from the websocket
|
|
299
|
+
*/
|
|
300
|
+
function updateOnDelete(view, message) {
|
|
301
|
+
const currentPage = getCurrentPage(view);
|
|
302
|
+
const currentContext = currentPage.getBindingContext();
|
|
303
|
+
const currentPath = currentContext.getPath();
|
|
304
|
+
const deletedObjectPaths = message.clientContent.split("|");
|
|
305
|
+
|
|
306
|
+
// check if user currently displays a deleted object or one of its descendants
|
|
307
|
+
const deletedPathInUse = deletedObjectPaths.find(deletedPath => currentPath.startsWith(deletedPath));
|
|
308
|
+
if (deletedPathInUse) {
|
|
309
|
+
// any other user deleted the object I'm currently looking at. Inform the user we will navigate to root now
|
|
310
|
+
MessageBox.information(CollaborationUtils.getText("C_COLLABORATIONDRAFT_DELETE", message.userDescription), {
|
|
311
|
+
onClose: () => {
|
|
312
|
+
// We retrieve the deleted context as a keep-alive, and disable its keepalive status,
|
|
313
|
+
// so that it is properly destroyed when refreshing data
|
|
314
|
+
const targetContext = currentContext.getModel().getKeepAliveContext(deletedPathInUse);
|
|
315
|
+
targetContext.setKeepAlive(false);
|
|
316
|
+
const requestPromise = applyUpdatesForCollection(view, deletedObjectPaths[0]);
|
|
317
|
+
currentPage.getController().editFlow.updateDocument(currentPage.getBindingContext(), requestPromise);
|
|
318
|
+
currentPage.getController()._routing.navigateBackFromContext(targetContext);
|
|
268
319
|
}
|
|
269
|
-
|
|
320
|
+
});
|
|
321
|
+
} else {
|
|
322
|
+
const requestPromise = applyUpdatesForCollection(view, deletedObjectPaths[0]);
|
|
323
|
+
currentPage.getController().editFlow.updateDocument(currentPage.getBindingContext(), requestPromise);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Updates data when a CREATE message has been received.
|
|
329
|
+
*
|
|
330
|
+
* @param view The view that was used initially when connecting the websocket
|
|
331
|
+
* @param message The message received from the websocket
|
|
332
|
+
*/
|
|
333
|
+
function updateOnCreate(view, message) {
|
|
334
|
+
const currentPage = getCurrentPage(view);
|
|
335
|
+
const createdObjectPaths = message.clientContent.split("|");
|
|
336
|
+
const requestPromise = applyUpdatesForCollection(view, createdObjectPaths[0]);
|
|
337
|
+
// Simulate a change so the edit flow shows the draft indicator and sets the page to dirty
|
|
338
|
+
currentPage.getController().editFlow.updateDocument(currentPage.getBindingContext(), requestPromise);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Updates data in a collection.
|
|
343
|
+
*
|
|
344
|
+
* @param view The view that was used initially when connecting the websocket
|
|
345
|
+
* @param pathInCollection A path to an entity in the collection
|
|
346
|
+
*/
|
|
347
|
+
async function applyUpdatesForCollection(view, pathInCollection) {
|
|
348
|
+
const appComponent = CollaborationUtils.getAppComponent(view);
|
|
349
|
+
const parentPath = pathInCollection.substring(0, pathInCollection.lastIndexOf("/"));
|
|
350
|
+
const parentContext = findContextForUpdate(view, parentPath);
|
|
351
|
+
if (parentContext) {
|
|
352
|
+
try {
|
|
353
|
+
const sideEffectsPromises = [];
|
|
354
|
+
const metaModel = parentContext.getModel().getMetaModel();
|
|
355
|
+
const metaPathForUpdate = metaModel.getMetaPath(pathInCollection);
|
|
356
|
+
const parentMetaPath = metaModel.getMetaPath(parentContext.getPath());
|
|
357
|
+
const relativePath = metaPathForUpdate.replace(`${parentMetaPath}/`, "");
|
|
358
|
+
|
|
359
|
+
// Reload the collection
|
|
360
|
+
const sideEffectsService = appComponent.getSideEffectsService();
|
|
361
|
+
sideEffectsPromises.push(sideEffectsService.requestSideEffects([relativePath], parentContext, SYNCGROUPID));
|
|
362
|
+
|
|
363
|
+
// Request the side effects for the collection
|
|
364
|
+
sideEffectsPromises.push(sideEffectsService.requestSideEffectsForNavigationProperty(relativePath, parentContext, SYNCGROUPID));
|
|
365
|
+
await Promise.all(sideEffectsPromises);
|
|
366
|
+
} catch (err) {
|
|
367
|
+
Log.error("Failed to update data after collection update:" + err);
|
|
270
368
|
}
|
|
271
369
|
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Updates data when a ACTION message has been received.
|
|
374
|
+
*
|
|
375
|
+
* @param view The view that was used initially when connecting the websocket
|
|
376
|
+
* @param message The message received from the websocket
|
|
377
|
+
*/
|
|
378
|
+
function updateOnAction(view, message) {
|
|
379
|
+
var _message$clientReques;
|
|
380
|
+
const currentPage = getCurrentPage(view);
|
|
381
|
+
const pathsForAction = message.clientContent.split("|");
|
|
382
|
+
const actionName = message.clientTriggeredActionName || "";
|
|
383
|
+
const requestedProperties = (_message$clientReques = message.clientRequestedProperties) === null || _message$clientReques === void 0 ? void 0 : _message$clientReques.split("|");
|
|
384
|
+
const refreshListBinding = message.clientRefreshListBinding === "true";
|
|
385
|
+
const requestPromises = pathsForAction.map(path => requestUpdateForAction(view, path, actionName, requestedProperties));
|
|
386
|
+
if (refreshListBinding) {
|
|
387
|
+
requestPromises.push(applyUpdatesForCollection(view, pathsForAction[0]));
|
|
388
|
+
}
|
|
272
389
|
|
|
273
390
|
// Simulate any change so the edit flow shows the draft indicator and sets the page to dirty
|
|
274
|
-
currentPage.getController().editFlow.updateDocument(
|
|
391
|
+
currentPage.getController().editFlow.updateDocument(currentPage.getBindingContext(), Promise.all(requestPromises));
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Updates side-effects data when an action has been triggered on a context.
|
|
396
|
+
*
|
|
397
|
+
* @param view The view that was used initially when connecting the websocket
|
|
398
|
+
* @param pathForAction Path of the context to apply the action to
|
|
399
|
+
* @param actionName Name of the action
|
|
400
|
+
* @param requestedProperties
|
|
401
|
+
* @returns Promise resolved when the side-effects data has been loaded
|
|
402
|
+
*/
|
|
403
|
+
async function requestUpdateForAction(view, pathForAction, actionName, requestedProperties) {
|
|
404
|
+
const targetContext = findContextForUpdate(view, pathForAction);
|
|
405
|
+
if (!targetContext) {
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
const appComponent = CollaborationUtils.getAppComponent(view);
|
|
409
|
+
const sideEffectService = appComponent.getSideEffectsService();
|
|
410
|
+
const sideEffectsFromAction = sideEffectService.getODataActionSideEffects(actionName, targetContext);
|
|
411
|
+
const sideEffectPromises = [];
|
|
412
|
+
if (sideEffectsFromAction) {
|
|
413
|
+
var _sideEffectsFromActio;
|
|
414
|
+
if ((_sideEffectsFromActio = sideEffectsFromAction.pathExpressions) !== null && _sideEffectsFromActio !== void 0 && _sideEffectsFromActio.length) {
|
|
415
|
+
sideEffectPromises.push(sideEffectService.requestSideEffects(sideEffectsFromAction.pathExpressions, targetContext, SYNCGROUPID));
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
if (requestedProperties && requestedProperties.length > 0) {
|
|
419
|
+
//clean-up of the properties to request list:
|
|
420
|
+
const metaModel = view.getModel().getMetaModel();
|
|
421
|
+
const metaPathForAction = calculateMetaPath(view, pathForAction);
|
|
422
|
+
const dataModelPath = MetaModelConverter.getInvolvedDataModelObjects(metaModel.getContext(metaPathForAction));
|
|
423
|
+
const propertiesToRequest = dataModelPath.targetEntityType.entityProperties.map(property => {
|
|
424
|
+
return property.name;
|
|
425
|
+
}).filter(prop => requestedProperties.includes(prop));
|
|
426
|
+
if (propertiesToRequest.length > 0) {
|
|
427
|
+
sideEffectPromises.push(sideEffectService.requestSideEffects(propertiesToRequest, targetContext, SYNCGROUPID));
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
await Promise.all(sideEffectPromises);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* Finds a context to apply an update message (CHANGE, CREATE, DELETE or ACTION).
|
|
435
|
+
*
|
|
436
|
+
* @param view The view that was used initially when connecting the websocket
|
|
437
|
+
* @param path The path of the context to be found (shall point to an entity, not a property)
|
|
438
|
+
* @returns A context if it could be found
|
|
439
|
+
*/
|
|
440
|
+
function findContextForUpdate(view, path) {
|
|
441
|
+
if (!path) {
|
|
442
|
+
return undefined;
|
|
443
|
+
}
|
|
444
|
+
// Find all potential paths
|
|
445
|
+
const targetPaths = [];
|
|
446
|
+
while (!path.endsWith(")")) {
|
|
447
|
+
targetPaths.unshift(path);
|
|
448
|
+
path = path.substring(0, path.lastIndexOf("/"));
|
|
449
|
+
}
|
|
450
|
+
targetPaths.unshift(path);
|
|
451
|
+
const parentCollectionPath = path.substring(0, path.lastIndexOf("(")); // Remove the last key
|
|
452
|
+
|
|
453
|
+
let targetContext;
|
|
454
|
+
let currentContext = getCurrentPage(view).getBindingContext();
|
|
455
|
+
while (currentContext && !targetContext) {
|
|
456
|
+
var _currentContext$getBi;
|
|
457
|
+
if (targetPaths.indexOf(currentContext.getPath()) >= 0) {
|
|
458
|
+
targetContext = currentContext;
|
|
459
|
+
}
|
|
460
|
+
currentContext = (_currentContext$getBi = currentContext.getBinding()) === null || _currentContext$getBi === void 0 ? void 0 : _currentContext$getBi.getContext();
|
|
461
|
+
}
|
|
462
|
+
if (targetContext) {
|
|
463
|
+
// Found !
|
|
464
|
+
return targetContext;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
// Try to find the target context in a listBinding
|
|
468
|
+
const model = getCurrentPage(view).getBindingContext().getModel();
|
|
469
|
+
const parentListBinding = model.getAllBindings().find(binding => {
|
|
470
|
+
const bindingPath = binding.isRelative() ? binding.getResolvedPath() : binding.getPath();
|
|
471
|
+
return binding.isA("sap.ui.model.odata.v4.ODataListBinding") && bindingPath === parentCollectionPath;
|
|
472
|
+
});
|
|
473
|
+
// We've found a list binding that could contain the target context --> look for it
|
|
474
|
+
targetContext = parentListBinding === null || parentListBinding === void 0 ? void 0 : parentListBinding.getAllCurrentContexts().find(context => {
|
|
475
|
+
return targetPaths.indexOf(context.getPath()) >= 0;
|
|
476
|
+
});
|
|
477
|
+
return targetContext;
|
|
275
478
|
}
|
|
276
479
|
function navigate(path, view) {
|
|
277
480
|
// TODO: routing.navigate doesn't consider semantic bookmarking
|
|
@@ -311,4 +514,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
311
514
|
send: send
|
|
312
515
|
};
|
|
313
516
|
}, false);
|
|
314
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNWUFDVElWSVRZIiwiQUNUSVZFVVNFUlMiLCJBQ1RJVklUSUVTIiwiU1lOQ0dST1VQSUQiLCJpc0Nvbm5lY3RlZCIsImNvbnRyb2wiLCJpbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJpc0NvbGxhYm9yYXRpb25Db25uZWN0ZWQiLCJzZW5kIiwiYWN0aW9uIiwiY29udGVudCIsInRyaWdnZXJlZEFjdGlvbk5hbWUiLCJjbGllbnRDb250ZW50IiwiQXJyYXkiLCJpc0FycmF5Iiwiam9pbiIsIm15QWN0aXZpdHkiLCJnZXRQcm9wZXJ0eSIsIkFjdGl2aXR5IiwiTGl2ZUNoYW5nZSIsInNldFByb3BlcnR5IiwiVW5kbyIsImJyb2FkY2FzdENvbGxhYm9yYXRpb25NZXNzYWdlIiwiZ2V0V2ViU29ja2V0QmFzZVVSTCIsImJpbmRpbmdDb250ZXh0IiwiZ2V0TWV0YU1vZGVsIiwiZ2V0T2JqZWN0IiwiaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCIsInZpZXciLCJnZXRCaW5kaW5nQ29udGV4dCIsImNvbm5lY3QiLCJtZSIsIkNvbGxhYm9yYXRpb25VdGlscyIsImdldE1lIiwid2ViU29ja2V0QmFzZVVSTCIsInNlcnZpY2VVcmwiLCJnZXRTZXJ2aWNlVXJsIiwic0RyYWZ0VVVJRCIsInJlcXVlc3RQcm9wZXJ0eSIsImluaXRpYWxpemVDb2xsYWJvcmF0aW9uIiwibWVzc2FnZSIsIm1lc3NhZ2VSZWNlaXZlIiwiZGlzY29ubmVjdCIsImVuZENvbGxhYm9yYXRpb24iLCJhY3RpdmVVc2VycyIsImFjdGl2aXRpZXMiLCJhY3Rpdml0eUtleSIsIm1ldGFQYXRoIiwiY2FsY3VsYXRlTWV0YVBhdGgiLCJ1c2VyQWN0aW9uIiwiY2xpZW50QWN0aW9uIiwic2VuZGVyIiwiaWQiLCJ1c2VySUQiLCJuYW1lIiwidXNlckRlc2NyaXB0aW9uIiwiaW5pdGlhbHMiLCJmb3JtYXRJbml0aWFscyIsImNvbG9yIiwiZ2V0VXNlckNvbG9yIiwibWFjdGl2aXR5IiwiSm9pbiIsIkpvaW5FY2hvIiwiZmluZEluZGV4IiwidXNlciIsInVuc2hpZnQiLCJMZWF2ZSIsImZpbHRlciIsImFsbEFjdGl2aXRpZXMiLCJyZW1vdmVVc2VyQWN0aXZpdGllcyIsImJhZyIsImFjdGl2aXR5IiwicCIsIkNoYW5nZSIsIm1ldGFQYXRocyIsInNwbGl0IiwibWFwIiwicGF0aCIsImdldE1ldGFQYXRoIiwiZm9yRWFjaCIsImN1cnJlbnRNZXRhUGF0aCIsImkiLCJuZXN0ZWVkTWVzc2FnZSIsImN1cnJlbnRBY3Rpdml0aWVzIiwiZ2V0QWN0aXZpdHlLZXkiLCJrZXkiLCJ1cGRhdGUiLCJDcmVhdGUiLCJEZWxldGUiLCJBY3RpdmF0ZSIsImRyYWZ0Q2xvc2VkQnlPdGhlclVzZXIiLCJnZXRUZXh0IiwiRGlzY2FyZCIsIkFjdGlvbiIsImluaXRKU09OTW9kZWwiLCJwYXJ0cyIsImxlbmd0aCIsInNsaWNlIiwicHVzaCIsImEiLCJ0ZXh0IiwiTWVzc2FnZUJveCIsImluZm9ybWF0aW9uIiwiZ2V0QmluZGluZyIsInJlc2V0Q2hhbmdlcyIsInRoZW4iLCJuYXZpZ2F0ZSIsImNhdGNoIiwiTG9nIiwiZXJyb3IiLCJhcHBDb21wb25lbnQiLCJnZXRBcHBDb21wb25lbnQiLCJtZXRhTW9kZWwiLCJjdXJyZW50UGFnZSIsImdldEN1cnJlbnRQYWdlIiwic2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiY3VycmVudENvbnRleHQiLCJjdXJyZW50UGF0aCIsImdldFBhdGgiLCJjaGFuZ2VkRG9jdW1lbnQiLCJkZWxldGVkT2JqZWN0cyIsInBhcmVudERlbGV0ZWRJbmRleCIsImRlbGV0ZWRPYmplY3QiLCJzdGFydHNXaXRoIiwib25DbG9zZSIsInRhcmdldENvbnRleHQiLCJiaW5kQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsImdldENvbnRyb2xsZXIiLCJfcm91dGluZyIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0IiwiYWN0aW9uTmFtZSIsImNsaWVudFRyaWdnZXJlZEFjdGlvbk5hbWUiLCJiaW5kaW5nUGFyYW1ldGVycyIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJ0YXJnZXRQYXRocyIsInBhdGhFeHByZXNzaW9ucyIsInJlcXVlc3RTaWRlRWZmZWN0cyIsImFjdGl2aXR5UGF0aCIsInJlcGxhY2UiLCJzaWRlRWZmZWN0cyIsIiRQcm9wZXJ0eVBhdGgiLCJlbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwiZW50aXR5VHlwZVNpZGVFZmZlY3RzIiwiZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsIm9iamVjdCIsIk9iamVjdCIsInJlbGV2YW50U2lkZUVmZmVjdHMiLCJmcm9tRW50cmllcyIsImVudHJpZXMiLCJ4IiwiU291cmNlUHJvcGVydGllcyIsInNvdXJjZSIsInZhbHVlIiwiVGFyZ2V0UHJvcGVydGllcyIsInRhcmdldFByb3BlcnR5IiwiZWRpdEZsb3ciLCJ1cGRhdGVEb2N1bWVudCIsIlByb21pc2UiLCJyZXNvbHZlIiwicm91dGluZyIsIkNvbW1vblV0aWxzIiwiZ2V0Q3VycmVudFBhZ2VWaWV3Iiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiLCJkYXRhUGF0aCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQWN0aXZpdHlTeW5jLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHtcblx0YnJvYWRjYXN0Q29sbGFib3JhdGlvbk1lc3NhZ2UsXG5cdGVuZENvbGxhYm9yYXRpb24sXG5cdGluaXRpYWxpemVDb2xsYWJvcmF0aW9uLFxuXHRpc0NvbGxhYm9yYXRpb25Db25uZWN0ZWRcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQWN0aXZpdHlCYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2UsIFVzZXIsIFVzZXJBY3Rpdml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCB7IEFjdGl2aXR5LCBDb2xsYWJvcmF0aW9uVXRpbHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9Db2xsYWJvcmF0aW9uQ29tbW9uXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IFY0Q29udGV4dCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcblxuY29uc3QgTVlBQ1RJVklUWSA9IFwiL2NvbGxhYm9yYXRpb24vbXlBY3Rpdml0eVwiO1xuY29uc3QgQUNUSVZFVVNFUlMgPSBcIi9jb2xsYWJvcmF0aW9uL2FjdGl2ZVVzZXJzXCI7XG5jb25zdCBBQ1RJVklUSUVTID0gXCIvY29sbGFib3JhdGlvbi9hY3Rpdml0aWVzXCI7XG5jb25zdCBTWU5DR1JPVVBJRCA9IFwiJGF1dG8uc3luY1wiO1xuXG5leHBvcnQgY29uc3QgaXNDb25uZWN0ZWQgPSBmdW5jdGlvbiAoY29udHJvbDogQ29udHJvbCk6IGJvb2xlYW4ge1xuXHRjb25zdCBpbnRlcm5hbE1vZGVsID0gY29udHJvbC5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0cmV0dXJuIGlzQ29sbGFib3JhdGlvbkNvbm5lY3RlZChpbnRlcm5hbE1vZGVsKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZW5kID0gZnVuY3Rpb24gKFxuXHRjb250cm9sOiBDb250cm9sLFxuXHRhY3Rpb246IEFjdGl2aXR5LFxuXHRjb250ZW50OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcblx0dHJpZ2dlcmVkQWN0aW9uTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZFxuKSB7XG5cdGlmIChpc0Nvbm5lY3RlZChjb250cm9sKSkge1xuXHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSBjb250cm9sLmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHRcdGNvbnN0IGNsaWVudENvbnRlbnQgPSBBcnJheS5pc0FycmF5KGNvbnRlbnQpID8gY29udGVudC5qb2luKFwifFwiKSA6IGNvbnRlbnQ7XG5cblx0XHRjb25zdCBteUFjdGl2aXR5ID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShNWUFDVElWSVRZKTtcblx0XHRpZiAoYWN0aW9uID09PSBBY3Rpdml0eS5MaXZlQ2hhbmdlKSB7XG5cdFx0XHQvLyBUbyBhdm9pZCB1bm5lY2Vzc2FyeSB0cmFmZmljIHdlIGtlZXAgdHJhY2sgb2YgbGl2ZSBjaGFuZ2VzIGFuZCBzZW5kIGl0IG9ubHkgb25jZVxuXG5cdFx0XHRpZiAobXlBY3Rpdml0eSA9PT0gY2xpZW50Q29udGVudCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KE1ZQUNUSVZJVFksIGNsaWVudENvbnRlbnQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBObyBuZWVkIHRvIHNlbmQgYW4gVW5kbyBtZXNzYWdlIGlmIHRoZXJlJ3Mgbm8gY3VycmVudCBhY3Rpdml0eVxuXHRcdFx0aWYgKGFjdGlvbiA9PT0gQWN0aXZpdHkuVW5kbyAmJiBteUFjdGl2aXR5ID09PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gdXNlciBmaW5pc2hlZCB0aGUgYWN0aXZpdHlcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoTVlBQ1RJVklUWSwgbnVsbCk7XG5cdFx0fVxuXG5cdFx0YnJvYWRjYXN0Q29sbGFib3JhdGlvbk1lc3NhZ2UoYWN0aW9uLCBjbGllbnRDb250ZW50LCBpbnRlcm5hbE1vZGVsLCB0cmlnZ2VyZWRBY3Rpb25OYW1lKTtcblx0fVxufTtcblxuY29uc3QgZ2V0V2ViU29ja2V0QmFzZVVSTCA9IGZ1bmN0aW9uIChiaW5kaW5nQ29udGV4dDogVjRDb250ZXh0KTogc3RyaW5nIHtcblx0cmV0dXJuIGJpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkuZ2V0T2JqZWN0KFwiL0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuV2ViU29ja2V0QmFzZVVSTFwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0NvbGxhYm9yYXRpb25FbmFibGVkID0gZnVuY3Rpb24gKHZpZXc6IFZpZXcpOiBib29sZWFuIHtcblx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSB2aWV3Py5nZXRCaW5kaW5nQ29udGV4dCAmJiAodmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIFY0Q29udGV4dCk7XG5cdHJldHVybiAhIShiaW5kaW5nQ29udGV4dCAmJiBnZXRXZWJTb2NrZXRCYXNlVVJMKGJpbmRpbmdDb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgY29ubmVjdCA9IGFzeW5jIGZ1bmN0aW9uICh2aWV3OiBWaWV3KSB7XG5cdGNvbnN0IGludGVybmFsTW9kZWwgPSB2aWV3LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHRjb25zdCBtZSA9IENvbGxhYm9yYXRpb25VdGlscy5nZXRNZSh2aWV3KTtcblxuXHQvLyBSZXRyaWV2aW5nIE1FIGZyb20gc2hlbGwgc2VydmljZVxuXHRpZiAoIW1lKSB7XG5cdFx0Ly8gbm8gbWUgPSBubyBzaGVsbCA9IG5vdCBzdXJlIHdoYXQgdG8gZG9cblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBiaW5kaW5nQ29udGV4dCA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBWNENvbnRleHQ7XG5cdGNvbnN0IHdlYlNvY2tldEJhc2VVUkwgPSBnZXRXZWJTb2NrZXRCYXNlVVJMKGJpbmRpbmdDb250ZXh0KTtcblx0Y29uc3Qgc2VydmljZVVybCA9IGJpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0U2VydmljZVVybCgpO1xuXG5cdGlmICghd2ViU29ja2V0QmFzZVVSTCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IHNEcmFmdFVVSUQgPSBhd2FpdCBiaW5kaW5nQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdFVVSURcIik7XG5cdGlmICghc0RyYWZ0VVVJRCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGluaXRpYWxpemVDb2xsYWJvcmF0aW9uKG1lLCB3ZWJTb2NrZXRCYXNlVVJMLCBzRHJhZnRVVUlELCBzZXJ2aWNlVXJsLCBpbnRlcm5hbE1vZGVsLCAobWVzc2FnZTogTWVzc2FnZSkgPT4ge1xuXHRcdG1lc3NhZ2VSZWNlaXZlKG1lc3NhZ2UsIHZpZXcpO1xuXHR9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBkaXNjb25uZWN0ID0gZnVuY3Rpb24gKGNvbnRyb2w6IENvbnRyb2wpIHtcblx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IGNvbnRyb2wuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdGVuZENvbGxhYm9yYXRpb24oaW50ZXJuYWxNb2RlbCk7XG59O1xuXG5mdW5jdGlvbiBtZXNzYWdlUmVjZWl2ZShtZXNzYWdlOiBNZXNzYWdlLCB2aWV3OiBWaWV3KSB7XG5cdGNvbnN0IGludGVybmFsTW9kZWw6IGFueSA9IHZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKTtcblx0bGV0IGFjdGl2ZVVzZXJzOiBVc2VyW10gPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KEFDVElWRVVTRVJTKTtcblx0bGV0IGFjdGl2aXRpZXM6IFVzZXJBY3Rpdml0eVtdO1xuXHRsZXQgYWN0aXZpdHlLZXk6IHN0cmluZztcblx0Y29uc3QgbWV0YVBhdGggPSBjYWxjdWxhdGVNZXRhUGF0aCh2aWV3LCBtZXNzYWdlLmNsaWVudENvbnRlbnQpO1xuXHRtZXNzYWdlLnVzZXJBY3Rpb24gPSBtZXNzYWdlLnVzZXJBY3Rpb24gfHwgbWVzc2FnZS5jbGllbnRBY3Rpb247XG5cblx0Y29uc3Qgc2VuZGVyOiBVc2VyID0ge1xuXHRcdGlkOiBtZXNzYWdlLnVzZXJJRCxcblx0XHRuYW1lOiBtZXNzYWdlLnVzZXJEZXNjcmlwdGlvbixcblx0XHRpbml0aWFsczogQ29sbGFib3JhdGlvblV0aWxzLmZvcm1hdEluaXRpYWxzKG1lc3NhZ2UudXNlckRlc2NyaXB0aW9uKSxcblx0XHRjb2xvcjogQ29sbGFib3JhdGlvblV0aWxzLmdldFVzZXJDb2xvcihtZXNzYWdlLnVzZXJJRCwgYWN0aXZlVXNlcnMsIFtdKVxuXHR9O1xuXG5cdGxldCBtYWN0aXZpdHk6IFVzZXJBY3Rpdml0eSA9IHNlbmRlcjtcblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVmYXVsdC1jYXNlXG5cdHN3aXRjaCAobWVzc2FnZS51c2VyQWN0aW9uKSB7XG5cdFx0Y2FzZSBBY3Rpdml0eS5Kb2luOlxuXHRcdGNhc2UgQWN0aXZpdHkuSm9pbkVjaG86XG5cdFx0XHRpZiAoYWN0aXZlVXNlcnMuZmluZEluZGV4KCh1c2VyKSA9PiB1c2VyLmlkID09PSBzZW5kZXIuaWQpID09PSAtMSkge1xuXHRcdFx0XHRhY3RpdmVVc2Vycy51bnNoaWZ0KHNlbmRlcik7XG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoQUNUSVZFVVNFUlMsIGFjdGl2ZVVzZXJzKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1lc3NhZ2UudXNlckFjdGlvbiA9PT0gQWN0aXZpdHkuSm9pbikge1xuXHRcdFx0XHQvLyB3ZSBlY2hvIG91ciBleGlzdGVuY2UgdG8gdGhlIG5ld2x5IGVudGVyZWQgdXNlciBhbmQgYWxzbyBzZW5kIHRoZSBjdXJyZW50IGFjdGl2aXR5IGlmIHRoZXJlIGlzIGFueVxuXHRcdFx0XHRicm9hZGNhc3RDb2xsYWJvcmF0aW9uTWVzc2FnZShBY3Rpdml0eS5Kb2luRWNobywgaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShNWUFDVElWSVRZKSwgaW50ZXJuYWxNb2RlbCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtZXNzYWdlLnVzZXJBY3Rpb24gPT09IEFjdGl2aXR5LkpvaW5FY2hvKSB7XG5cdFx0XHRcdGlmIChtZXNzYWdlLmNsaWVudENvbnRlbnQpIHtcblx0XHRcdFx0XHQvLyBhbm90aGVyIHVzZXIgd2FzIGFscmVhZHkgdHlwaW5nIHRoZXJlZm9yZSBJIHdhbnQgdG8gc2VlIGhpcyBhY3Rpdml0eSBpbW1lZGlhdGVseS4gQ2FsbGluZyBtZSBhZ2FpbiBhcyBhIGxpdmUgY2hhbmdlXG5cdFx0XHRcdFx0bWVzc2FnZS51c2VyQWN0aW9uID0gQWN0aXZpdHkuTGl2ZUNoYW5nZTtcblx0XHRcdFx0XHRtZXNzYWdlUmVjZWl2ZShtZXNzYWdlLCB2aWV3KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRicmVhaztcblx0XHRjYXNlIEFjdGl2aXR5LkxlYXZlOlxuXHRcdFx0Ly8gUmVtb3ZpbmcgdGhlIGFjdGl2ZSB1c2VyLiBOb3QgcmVtb3ZpbmcgXCJtZVwiIGlmIEkgaGFkIHRoZSBzY3JlZW4gb3BlbiBpbiBhbm90aGVyIHNlc3Npb25cblx0XHRcdGFjdGl2ZVVzZXJzID0gYWN0aXZlVXNlcnMuZmlsdGVyKCh1c2VyKSA9PiB1c2VyLmlkICE9PSBzZW5kZXIuaWQgfHwgdXNlci5tZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KEFDVElWRVVTRVJTLCBhY3RpdmVVc2Vycyk7XG5cdFx0XHRjb25zdCBhbGxBY3Rpdml0aWVzID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShBQ1RJVklUSUVTKSB8fCB7fTtcblx0XHRcdGNvbnN0IHJlbW92ZVVzZXJBY3Rpdml0aWVzID0gZnVuY3Rpb24gKGJhZzogYW55KSB7XG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGJhZykpIHtcblx0XHRcdFx0XHRyZXR1cm4gYmFnLmZpbHRlcigoYWN0aXZpdHkpID0+IGFjdGl2aXR5LmlkICE9PSBzZW5kZXIuaWQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgcCBpbiBiYWcpIHtcblx0XHRcdFx0XHRcdGJhZ1twXSA9IHJlbW92ZVVzZXJBY3Rpdml0aWVzKGJhZ1twXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBiYWc7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRyZW1vdmVVc2VyQWN0aXZpdGllcyhhbGxBY3Rpdml0aWVzKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoQUNUSVZJVElFUywgYWxsQWN0aXZpdGllcyk7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgQWN0aXZpdHkuQ2hhbmdlOlxuXHRcdFx0Y29uc3QgbWV0YVBhdGhzID0gbWVzc2FnZT8uY2xpZW50Q29udGVudD8uc3BsaXQoXCJ8XCIpLm1hcCgocGF0aCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gKHZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCkuZ2V0TWV0YVBhdGgocGF0aCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0bWV0YVBhdGhzLmZvckVhY2goKGN1cnJlbnRNZXRhUGF0aCwgaSkgPT4ge1xuXHRcdFx0XHRjb25zdCBuZXN0ZWVkTWVzc2FnZSA9IHtcblx0XHRcdFx0XHQuLi5tZXNzYWdlLFxuXHRcdFx0XHRcdGNsaWVudENvbnRlbnQ6IG1lc3NhZ2U/LmNsaWVudENvbnRlbnQ/LnNwbGl0KFwifFwiKVtpXVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRsZXQgY3VycmVudEFjdGl2aXRpZXM6IGFueVtdID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShBQ1RJVklUSUVTICsgY3VycmVudE1ldGFQYXRoKSB8fCBbXTtcblx0XHRcdFx0YWN0aXZpdHlLZXkgPSBnZXRBY3Rpdml0eUtleShuZXN0ZWVkTWVzc2FnZS5jbGllbnRDb250ZW50KTtcblx0XHRcdFx0Y3VycmVudEFjdGl2aXRpZXMgPSBjdXJyZW50QWN0aXZpdGllcz8uZmlsdGVyICYmIGN1cnJlbnRBY3Rpdml0aWVzLmZpbHRlcigoYWN0aXZpdHkpID0+IGFjdGl2aXR5LmtleSAhPT0gYWN0aXZpdHlLZXkpO1xuXHRcdFx0XHRpZiAoY3VycmVudEFjdGl2aXRpZXMpIHtcblx0XHRcdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KEFDVElWSVRJRVMgKyBjdXJyZW50TWV0YVBhdGgsIGN1cnJlbnRBY3Rpdml0aWVzKTtcblx0XHRcdFx0XHR1cGRhdGUodmlldywgbmVzdGVlZE1lc3NhZ2UsIGN1cnJlbnRNZXRhUGF0aCwgQWN0aXZpdHkuQ2hhbmdlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIEFjdGl2aXR5LkNyZWF0ZTpcblx0XHRcdC8vIEZvciBjcmVhdGUgd2UgYWN0dWFsbHkganVzdCBuZWVkIHRvIHJlZnJlc2ggdGhlIHRhYmxlXG5cdFx0XHR1cGRhdGUodmlldywgbWVzc2FnZSwgbWV0YVBhdGgsIEFjdGl2aXR5LkNyZWF0ZSk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIEFjdGl2aXR5LkRlbGV0ZTpcblx0XHRcdC8vIEZvciBub3cgYWxzbyByZWZyZXNoIHRoZSBwYWdlIGJ1dCBpbiBjYXNlIG9mIGRlbGV0aW9uIHdlIG5lZWQgdG8gaW5mb3JtIHRoZSB1c2VyXG5cdFx0XHR1cGRhdGUodmlldywgbWVzc2FnZSwgbWV0YVBhdGgsIEFjdGl2aXR5LkRlbGV0ZSk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIEFjdGl2aXR5LkFjdGl2YXRlOlxuXHRcdFx0ZHJhZnRDbG9zZWRCeU90aGVyVXNlcih2aWV3LCBtZXNzYWdlLCBDb2xsYWJvcmF0aW9uVXRpbHMuZ2V0VGV4dChcIkNfQ09MTEFCT1JBVElPTkRSQUZUX0FDVElWQVRFXCIsIHNlbmRlci5uYW1lKSk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIEFjdGl2aXR5LkRpc2NhcmQ6XG5cdFx0XHRkcmFmdENsb3NlZEJ5T3RoZXJVc2VyKHZpZXcsIG1lc3NhZ2UsIENvbGxhYm9yYXRpb25VdGlscy5nZXRUZXh0KFwiQ19DT0xMQUJPUkFUSU9ORFJBRlRfRElTQ0FSRFwiLCBzZW5kZXIubmFtZSkpO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIEFjdGl2aXR5LkFjdGlvbjpcblx0XHRcdHVwZGF0ZSh2aWV3LCBtZXNzYWdlLCBtZXRhUGF0aCwgQWN0aXZpdHkuQWN0aW9uKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBBY3Rpdml0eS5MaXZlQ2hhbmdlOlxuXHRcdFx0bWFjdGl2aXR5ID0gc2VuZGVyO1xuXHRcdFx0bWFjdGl2aXR5LmtleSA9IGdldEFjdGl2aXR5S2V5KG1lc3NhZ2UuY2xpZW50Q29udGVudCk7XG5cblx0XHRcdC8vIHN0dXBpZCBKU09OIG1vZGVsLi4uXG5cdFx0XHRsZXQgaW5pdEpTT05Nb2RlbDogc3RyaW5nID0gXCJcIjtcblx0XHRcdGNvbnN0IHBhcnRzID0gbWV0YVBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdFx0aW5pdEpTT05Nb2RlbCArPSBgLyR7cGFydHNbaV19YDtcblx0XHRcdFx0aWYgKCFpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KEFDVElWSVRJRVMgKyBpbml0SlNPTk1vZGVsKSkge1xuXHRcdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoQUNUSVZJVElFUyArIGluaXRKU09OTW9kZWwsIHt9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRhY3Rpdml0aWVzID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShBQ1RJVklUSUVTICsgbWV0YVBhdGgpO1xuXHRcdFx0YWN0aXZpdGllcyA9IGFjdGl2aXRpZXM/LnNsaWNlID8gYWN0aXZpdGllcy5zbGljZSgpIDogW107XG5cdFx0XHRhY3Rpdml0aWVzLnB1c2gobWFjdGl2aXR5KTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoQUNUSVZJVElFUyArIG1ldGFQYXRoLCBhY3Rpdml0aWVzKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgQWN0aXZpdHkuVW5kbzpcblx0XHRcdC8vIFRoZSB1c2VyIGRpZCBhIGNoYW5nZSBidXQgcmV2ZXJ0ZWQgaXQsIHRoZXJlZm9yZSB1bmJsb2NrIHRoZSBjb250cm9sXG5cdFx0XHRhY3Rpdml0aWVzID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShBQ1RJVklUSUVTICsgbWV0YVBhdGgpO1xuXHRcdFx0YWN0aXZpdHlLZXkgPSBnZXRBY3Rpdml0eUtleShtZXNzYWdlLmNsaWVudENvbnRlbnQpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcblx0XHRcdFx0QUNUSVZJVElFUyArIG1ldGFQYXRoLFxuXHRcdFx0XHRhY3Rpdml0aWVzLmZpbHRlcigoYSkgPT4gYS5rZXkgIT09IGFjdGl2aXR5S2V5KVxuXHRcdFx0KTtcblx0XHRcdGJyZWFrO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGRyYWZ0Q2xvc2VkQnlPdGhlclVzZXIodmlldzogVmlldywgbWVzc2FnZTogTWVzc2FnZSwgdGV4dDogc3RyaW5nKSB7XG5cdGRpc2Nvbm5lY3Qodmlldyk7XG5cdE1lc3NhZ2VCb3guaW5mb3JtYXRpb24odGV4dCk7XG5cdCh2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgVjRDb250ZXh0KVxuXHRcdC5nZXRCaW5kaW5nKClcblx0XHQucmVzZXRDaGFuZ2VzKClcblx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRuYXZpZ2F0ZShtZXNzYWdlLmNsaWVudENvbnRlbnQsIHZpZXcpO1xuXHRcdH0pXG5cdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdExvZy5lcnJvcihcIlBlbmRpbmcgQ2hhbmdlcyBjb3VsZCBub3QgYmUgcmVzZXQgLSBzdGlsbCBuYXZpZ2F0aW5nIHRvIGFjdGl2ZSBpbnN0YW5jZVwiKTtcblx0XHRcdG5hdmlnYXRlKG1lc3NhZ2UuY2xpZW50Q29udGVudCwgdmlldyk7XG5cdFx0fSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZSh2aWV3OiBWaWV3LCBtZXNzYWdlOiBNZXNzYWdlLCBtZXRhUGF0aDogc3RyaW5nLCBhY3Rpb246IEFjdGl2aXR5KSB7XG5cdGNvbnN0IGFwcENvbXBvbmVudCA9IENvbGxhYm9yYXRpb25VdGlscy5nZXRBcHBDb21wb25lbnQodmlldyk7XG5cdGNvbnN0IG1ldGFNb2RlbCA9IHZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0Y29uc3QgY3VycmVudFBhZ2UgPSBnZXRDdXJyZW50UGFnZSh2aWV3KTtcblx0Y29uc3Qgc2lkZUVmZmVjdHNTZXJ2aWNlID0gYXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRjb25zdCBjdXJyZW50Q29udGV4dCA9IGN1cnJlbnRQYWdlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdGNvbnN0IGN1cnJlbnRQYXRoID0gY3VycmVudENvbnRleHQuZ2V0UGF0aCgpO1xuXHRjb25zdCBjdXJyZW50TWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoY3VycmVudFBhdGgpO1xuXHRsZXQgY2hhbmdlZERvY3VtZW50ID0gbWVzc2FnZS5jbGllbnRDb250ZW50O1xuXG5cdGlmIChhY3Rpb24gPT09IEFjdGl2aXR5LkRlbGV0ZSkge1xuXHRcdC8vIGNoZWNrIGlmIHVzZXIgY3VycmVudGx5IGRpc3BsYXlzIG9uZSBkZWxldGVkIG9iamVjdFxuXHRcdGNvbnN0IGRlbGV0ZWRPYmplY3RzID0gbWVzc2FnZS5jbGllbnRDb250ZW50LnNwbGl0KFwifFwiKTtcblx0XHRjb25zdCBwYXJlbnREZWxldGVkSW5kZXggPSBkZWxldGVkT2JqZWN0cy5maW5kSW5kZXgoKGRlbGV0ZWRPYmplY3QpID0+IGN1cnJlbnRQYXRoLnN0YXJ0c1dpdGgoZGVsZXRlZE9iamVjdCkpO1xuXHRcdGlmIChwYXJlbnREZWxldGVkSW5kZXggPiAtMSkge1xuXHRcdFx0Ly8gYW55IG90aGVyIHVzZXIgZGVsZXRlZCB0aGUgb2JqZWN0IEknbSBjdXJyZW50bHkgbG9va2luZyBhdC4gSW5mb3JtIHRoZSB1c2VyIHdlIHdpbGwgbmF2aWdhdGUgdG8gcm9vdCBub3dcblx0XHRcdE1lc3NhZ2VCb3guaW5mb3JtYXRpb24oQ29sbGFib3JhdGlvblV0aWxzLmdldFRleHQoXCJDX0NPTExBQk9SQVRJT05EUkFGVF9ERUxFVEVcIiwgbWVzc2FnZS51c2VyRGVzY3JpcHRpb24pLCB7XG5cdFx0XHRcdG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRjb25zdCB0YXJnZXRDb250ZXh0ID0gdmlldy5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KGRlbGV0ZWRPYmplY3RzW3BhcmVudERlbGV0ZWRJbmRleF0pLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdGN1cnJlbnRQYWdlLmdldENvbnRyb2xsZXIoKS5fcm91dGluZy5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCh0YXJnZXRDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdC8vIFRPRE86IEZvciBub3cganVzdCB0YWtlIHRoZSBmaXJzdCBvYmplY3QgdG8gZ2V0IHRoZSBtZXRhIHBhdGggYW5kIGRvIGEgZnVsbCByZWZyZXNoIG9mIHRoZSB0YWJsZVxuXHRcdGNoYW5nZWREb2N1bWVudCA9IGRlbGV0ZWRPYmplY3RzWzBdO1xuXHR9XG5cblx0aWYgKGFjdGlvbiA9PT0gQWN0aXZpdHkuQWN0aW9uKSB7XG5cdFx0Y29uc3QgYWN0aW9uTmFtZSA9IG1lc3NhZ2UuY2xpZW50VHJpZ2dlcmVkQWN0aW9uTmFtZSxcblx0XHRcdGJpbmRpbmdQYXJhbWV0ZXJzID0gc2lkZUVmZmVjdHNTZXJ2aWNlLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoYWN0aW9uTmFtZSEsIGN1cnJlbnRDb250ZXh0KSxcblx0XHRcdHRhcmdldFBhdGhzID0gYmluZGluZ1BhcmFtZXRlcnM/LnBhdGhFeHByZXNzaW9ucztcblx0XHRpZiAodGFyZ2V0UGF0aHMgJiYgdGFyZ2V0UGF0aHMubGVuZ3RoID4gMCkge1xuXHRcdFx0c2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyh0YXJnZXRQYXRocywgY3VycmVudENvbnRleHQsIFNZTkNHUk9VUElEKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoY2hhbmdlZERvY3VtZW50LnN0YXJ0c1dpdGgoY3VycmVudFBhdGgpKSB7XG5cdFx0Ly8gRXhlY3V0ZSBTaWRlRWZmZWN0cyAoVE9ETyBmb3IgTWVldCB0aGVyZSBzaG91bGQgYmUgb25lIGNlbnRyYWwgbWV0aG9kKVxuXHRcdGNvbnN0IGFjdGl2aXR5UGF0aCA9IG1ldGFQYXRoLnJlcGxhY2UoY3VycmVudE1ldGFQYXRoLCBcIlwiKS5zbGljZSgxKTtcblx0XHRpZiAoYWN0aXZpdHlQYXRoKSB7XG5cdFx0XHQvLyBSZXF1ZXN0IGFsc28gdGhlIHByb3BlcnR5IGl0c2VsZlxuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHM6IGFueVtdID0gW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0JFByb3BlcnR5UGF0aDogYWN0aXZpdHlQYXRoXG5cdFx0XHRcdH1cblx0XHRcdF07XG5cdFx0XHRjb25zdCBlbnRpdHlUeXBlID0gc2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChjdXJyZW50Q29udGV4dCk7XG5cdFx0XHRjb25zdCBlbnRpdHlUeXBlU2lkZUVmZmVjdHMgPSBzaWRlRWZmZWN0c1NlcnZpY2UuZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlISk7XG5cdFx0XHQvLyBQb29yIG1hbiBzb2x1dGlvbiB3aXRob3V0IGNoZWNraW5nIHNvdXJjZSB0YXJnZXRzLCBqdXN0IGZvciBQT0MsIHRoaXMgaXMgdGhyb3ctd2F5IGNvZGluZyBvbmx5XG5cdFx0XHRjb25zdCBvYmplY3Q6IGFueSA9IE9iamVjdDsgLy8ganVzdCB0byBvdmVyY29tZSBUUyBpc3N1ZXMsIHdpbGwgYmUgYW55d2F5IHJlcGxhY2VkXG5cdFx0XHRjb25zdCByZWxldmFudFNpZGVFZmZlY3RzID0gb2JqZWN0LmZyb21FbnRyaWVzKFxuXHRcdFx0XHRvYmplY3Rcblx0XHRcdFx0XHQuZW50cmllcyhlbnRpdHlUeXBlU2lkZUVmZmVjdHMpXG5cdFx0XHRcdFx0LmZpbHRlcigoeDogYW55W10pID0+IHhbMV0uU291cmNlUHJvcGVydGllcz8uZmluZEluZGV4KChzb3VyY2U6IGFueSkgPT4gc291cmNlLnZhbHVlID09PSBhY3Rpdml0eVBhdGgpID4gLTEpXG5cdFx0XHQpO1xuXHRcdFx0Zm9yIChjb25zdCBwIGluIHJlbGV2YW50U2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0cmVsZXZhbnRTaWRlRWZmZWN0c1twXS5UYXJnZXRQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHRhcmdldFByb3BlcnR5OiBhbnkpIHtcblx0XHRcdFx0XHRzaWRlRWZmZWN0cy5wdXNoKHtcblx0XHRcdFx0XHRcdCRQcm9wZXJ0eVBhdGg6IHRhcmdldFByb3BlcnR5XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0c2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0cywgY3VycmVudENvbnRleHQsIFNZTkNHUk9VUElEKTtcblx0XHR9XG5cdH1cblxuXHQvLyBTaW11bGF0ZSBhbnkgY2hhbmdlIHNvIHRoZSBlZGl0IGZsb3cgc2hvd3MgdGhlIGRyYWZ0IGluZGljYXRvciBhbmQgc2V0cyB0aGUgcGFnZSB0byBkaXJ0eVxuXHRjdXJyZW50UGFnZS5nZXRDb250cm9sbGVyKCkuZWRpdEZsb3cudXBkYXRlRG9jdW1lbnQoY3VycmVudENvbnRleHQsIFByb21pc2UucmVzb2x2ZSgpKTtcbn1cblxuZnVuY3Rpb24gbmF2aWdhdGUocGF0aDogc3RyaW5nLCB2aWV3OiBWaWV3KSB7XG5cdC8vIFRPRE86IHJvdXRpbmcubmF2aWdhdGUgZG9lc24ndCBjb25zaWRlciBzZW1hbnRpYyBib29rbWFya2luZ1xuXHRjb25zdCBjdXJyZW50UGFnZSA9IGdldEN1cnJlbnRQYWdlKHZpZXcpO1xuXHRjb25zdCB0YXJnZXRDb250ZXh0ID0gdmlldy5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KHBhdGgpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRjdXJyZW50UGFnZS5nZXRDb250cm9sbGVyKCkucm91dGluZy5uYXZpZ2F0ZSh0YXJnZXRDb250ZXh0KTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudFBhZ2UodmlldzogVmlldykge1xuXHRjb25zdCBhcHBDb21wb25lbnQgPSBDb2xsYWJvcmF0aW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHZpZXcpO1xuXHRyZXR1cm4gQ29tbW9uVXRpbHMuZ2V0Q3VycmVudFBhZ2VWaWV3KGFwcENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGdldEFjdGl2aXR5S2V5KHg6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiB4LnN1YnN0cmluZyh4Lmxhc3RJbmRleE9mKFwiKFwiKSArIDEsIHgubGFzdEluZGV4T2YoXCIpXCIpKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBtZXRhcGF0aCBmcm9tIG9uZSBvciBtb3JlIGRhdGEgcGF0aChzKS5cbiAqXG4gKiBAcGFyYW0gdmlldyBUaGUgY3VycmVudCB2aWV3XG4gKiBAcGFyYW0gcGF0aCBPbmUgb3JlIG1vcmUgZGF0YSBwYXRoKHMpLCBpbiBjYXNlIG9mIG11bHRpcGxlIHBhdGhzIHNlcGFyYXRlZCBieSAnfCdcbiAqIEByZXR1cm5zIFRoZSBjYWxjdWxhdGVkIG1ldGFQYXRoXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZU1ldGFQYXRoKHZpZXc6IFZpZXcsIHBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRsZXQgbWV0YVBhdGggPSBcIlwiO1xuXHRpZiAocGF0aCkge1xuXHRcdC8vIGluIGNhc2UgbW9yZSB0aGFuIG9uZSBwYXRoIGlzIHNlbnQgYWxsIG9mIHRoZW0gaGF2ZSB0byB1c2UgdGhlIHNhbWUgbWV0YXBhdGggdGhlcmVmb3JlIHdlIGp1c3QgY29uc2lkZXIgdGhlIGZpcnN0IG9uZVxuXHRcdGNvbnN0IGRhdGFQYXRoID0gcGF0aC5zcGxpdChcInxcIilbMF07XG5cdFx0bWV0YVBhdGggPSAodmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKS5nZXRNZXRhUGF0aChkYXRhUGF0aCk7XG5cdH1cblx0cmV0dXJuIG1ldGFQYXRoO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG5cdGNvbm5lY3Q6IGNvbm5lY3QsXG5cdGRpc2Nvbm5lY3Q6IGRpc2Nvbm5lY3QsXG5cdGlzQ29ubmVjdGVkOiBpc0Nvbm5lY3RlZCxcblx0aXNDb2xsYWJvcmF0aW9uRW5hYmxlZDogaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCxcblx0c2VuZDogc2VuZFxufTtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7RUFpQkEsTUFBTUEsVUFBVSxHQUFHLDJCQUEyQjtFQUM5QyxNQUFNQyxXQUFXLEdBQUcsNEJBQTRCO0VBQ2hELE1BQU1DLFVBQVUsR0FBRywyQkFBMkI7RUFDOUMsTUFBTUMsV0FBVyxHQUFHLFlBQVk7RUFFekIsTUFBTUMsV0FBVyxHQUFHLFVBQVVDLE9BQWdCLEVBQVc7SUFDL0QsTUFBTUMsYUFBYSxHQUFHRCxPQUFPLENBQUNFLFFBQVEsQ0FBQyxVQUFVLENBQWM7SUFDL0QsT0FBT0Msd0JBQXdCLENBQUNGLGFBQWEsQ0FBQztFQUMvQyxDQUFDO0VBQUM7RUFFSyxNQUFNRyxJQUFJLEdBQUcsVUFDbkJKLE9BQWdCLEVBQ2hC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
|
|
517
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNWUFDVElWSVRZIiwiQUNUSVZFVVNFUlMiLCJBQ1RJVklUSUVTIiwiU1lOQ0dST1VQSUQiLCJpc0Nvbm5lY3RlZCIsImNvbnRyb2wiLCJpbnRlcm5hbE1vZGVsIiwiZ2V0TW9kZWwiLCJpc0NvbGxhYm9yYXRpb25Db25uZWN0ZWQiLCJzZW5kIiwiYWN0aW9uIiwiY29udGVudCIsInRyaWdnZXJlZEFjdGlvbk5hbWUiLCJyZWZyZXNoTGlzdEJpbmRpbmciLCJhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzIiwiY2xpZW50Q29udGVudCIsIkFycmF5IiwiaXNBcnJheSIsImpvaW4iLCJyZXF1ZXN0ZWRQcm9wZXJ0aWVzIiwibXlBY3Rpdml0eSIsImdldFByb3BlcnR5IiwiQWN0aXZpdHkiLCJMaXZlQ2hhbmdlIiwic2V0UHJvcGVydHkiLCJVbmRvIiwiYnJvYWRjYXN0Q29sbGFib3JhdGlvbk1lc3NhZ2UiLCJnZXRXZWJTb2NrZXRCYXNlVVJMIiwiYmluZGluZ0NvbnRleHQiLCJnZXRNZXRhTW9kZWwiLCJnZXRPYmplY3QiLCJpc0NvbGxhYm9yYXRpb25FbmFibGVkIiwidmlldyIsImdldEJpbmRpbmdDb250ZXh0IiwiY29ubmVjdCIsIm1lIiwiQ29sbGFib3JhdGlvblV0aWxzIiwiZ2V0TWUiLCJ3ZWJTb2NrZXRCYXNlVVJMIiwic2VydmljZVVybCIsImdldFNlcnZpY2VVcmwiLCJzRHJhZnRVVUlEIiwicmVxdWVzdFByb3BlcnR5IiwiaW5pdGlhbGl6ZUNvbGxhYm9yYXRpb24iLCJtZXNzYWdlIiwibWVzc2FnZVJlY2VpdmUiLCJkaXNjb25uZWN0IiwiZW5kQ29sbGFib3JhdGlvbiIsImFjdGl2ZVVzZXJzIiwiYWN0aXZpdGllcyIsImFjdGl2aXR5S2V5IiwibWV0YVBhdGgiLCJjYWxjdWxhdGVNZXRhUGF0aCIsInVzZXJBY3Rpb24iLCJjbGllbnRBY3Rpb24iLCJzZW5kZXIiLCJpZCIsInVzZXJJRCIsIm5hbWUiLCJ1c2VyRGVzY3JpcHRpb24iLCJpbml0aWFscyIsImZvcm1hdEluaXRpYWxzIiwiY29sb3IiLCJnZXRVc2VyQ29sb3IiLCJtYWN0aXZpdHkiLCJKb2luIiwiSm9pbkVjaG8iLCJmaW5kSW5kZXgiLCJ1c2VyIiwidW5zaGlmdCIsIkxlYXZlIiwiZmlsdGVyIiwiYWxsQWN0aXZpdGllcyIsInJlbW92ZVVzZXJBY3Rpdml0aWVzIiwiYmFnIiwiYWN0aXZpdHkiLCJwIiwiQ2hhbmdlIiwidXBkYXRlT25DaGFuZ2UiLCJDcmVhdGUiLCJ1cGRhdGVPbkNyZWF0ZSIsIkRlbGV0ZSIsInVwZGF0ZU9uRGVsZXRlIiwiQWN0aXZhdGUiLCJkcmFmdENsb3NlZEJ5T3RoZXJVc2VyIiwiZ2V0VGV4dCIsIkRpc2NhcmQiLCJBY3Rpb24iLCJ1cGRhdGVPbkFjdGlvbiIsImtleSIsImdldEFjdGl2aXR5S2V5IiwiaW5pdEpTT05Nb2RlbCIsInBhcnRzIiwic3BsaXQiLCJpIiwibGVuZ3RoIiwic2xpY2UiLCJwdXNoIiwiYSIsInBhdGgiLCJtZXNzYWdlVGV4dCIsIk1lc3NhZ2VCb3giLCJpbmZvcm1hdGlvbiIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJ0aGVuIiwibmF2aWdhdGUiLCJjYXRjaCIsIkxvZyIsImVycm9yIiwidXBkYXRlZE9iamVjdHNQYXRocyIsIm1ldGFNb2RlbCIsImZvckVhY2giLCJ1cGRhdGVkUGF0aCIsInVwZGF0ZWRNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiY3VycmVudEFjdGl2aXRpZXMiLCJjdXJyZW50UGFnZSIsImdldEN1cnJlbnRQYWdlIiwiY3VycmVudENvbnRleHQiLCJyZXF1ZXN0UHJvbWlzZXMiLCJtYXAiLCJhcHBseVVwZGF0ZXNGb3JDaGFuZ2UiLCJnZXRDb250cm9sbGVyIiwiZWRpdEZsb3ciLCJ1cGRhdGVEb2N1bWVudCIsIlByb21pc2UiLCJhbGwiLCJwcm9wZXJ0eVBhdGhGb3JVcGRhdGUiLCJtZXRhQ29udGV4dCIsImdldE1ldGFDb250ZXh0IiwiZGF0YU1vZGVsT2JqZWN0IiwiTWV0YU1vZGVsQ29udmVydGVyIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwidGFyZ2V0Q29udGV4dFBhdGgiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsInRhcmdldENvbnRleHQiLCJmaW5kQ29udGV4dEZvclVwZGF0ZSIsInBhcmVudENvbGxlY3Rpb25QYXRoIiwicGFyZW50Q29udGV4dFBhdGgiLCJwYXJlbnRDb250ZXh0IiwidW5kZWZpbmVkIiwic2lkZUVmZmVjdHNQcm9taXNlcyIsInNpZGVFZmZlY3RzU2VydmljZSIsImdldEFwcENvbXBvbmVudCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInRhcmdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsInJlbGF0aXZlTWV0YVBhdGhGb3JVcGRhdGUiLCJyZXBsYWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiZmllbGRHcm91cElkcyIsImNvbXB1dGVGaWVsZEdyb3VwSWRzIiwidGFyZ2V0RW50aXR5VHlwZSIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsInRhcmdldE9iamVjdCIsInBhZ2VDb250cm9sbGVyIiwic2lkZUVmZmVjdHNNYXBGb3JGaWVsZEdyb3VwIiwiX3NpZGVFZmZlY3RzIiwiZ2V0U2lkZUVmZmVjdHNNYXBGb3JGaWVsZEdyb3VwcyIsIk9iamVjdCIsImtleXMiLCJzaWRlRWZmZWN0TmFtZSIsInNpZGVFZmZlY3QiLCJzaWRlRWZmZWN0cyIsImNvbnRleHQiLCJlcnIiLCJjdXJyZW50UGF0aCIsImRlbGV0ZWRPYmplY3RQYXRocyIsImRlbGV0ZWRQYXRoSW5Vc2UiLCJmaW5kIiwiZGVsZXRlZFBhdGgiLCJzdGFydHNXaXRoIiwib25DbG9zZSIsImdldEtlZXBBbGl2ZUNvbnRleHQiLCJzZXRLZWVwQWxpdmUiLCJyZXF1ZXN0UHJvbWlzZSIsImFwcGx5VXBkYXRlc0ZvckNvbGxlY3Rpb24iLCJfcm91dGluZyIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0IiwiY3JlYXRlZE9iamVjdFBhdGhzIiwicGF0aEluQ29sbGVjdGlvbiIsImFwcENvbXBvbmVudCIsInBhcmVudFBhdGgiLCJtZXRhUGF0aEZvclVwZGF0ZSIsInBhcmVudE1ldGFQYXRoIiwicmVsYXRpdmVQYXRoIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwicGF0aHNGb3JBY3Rpb24iLCJhY3Rpb25OYW1lIiwiY2xpZW50VHJpZ2dlcmVkQWN0aW9uTmFtZSIsImNsaWVudFJlcXVlc3RlZFByb3BlcnRpZXMiLCJjbGllbnRSZWZyZXNoTGlzdEJpbmRpbmciLCJyZXF1ZXN0VXBkYXRlRm9yQWN0aW9uIiwicGF0aEZvckFjdGlvbiIsInNpZGVFZmZlY3RTZXJ2aWNlIiwic2lkZUVmZmVjdHNGcm9tQWN0aW9uIiwiZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyIsInNpZGVFZmZlY3RQcm9taXNlcyIsInBhdGhFeHByZXNzaW9ucyIsIm1ldGFQYXRoRm9yQWN0aW9uIiwiZGF0YU1vZGVsUGF0aCIsImdldENvbnRleHQiLCJwcm9wZXJ0aWVzVG9SZXF1ZXN0IiwiZW50aXR5UHJvcGVydGllcyIsInByb3BlcnR5IiwicHJvcCIsImluY2x1ZGVzIiwidGFyZ2V0UGF0aHMiLCJlbmRzV2l0aCIsImluZGV4T2YiLCJtb2RlbCIsInBhcmVudExpc3RCaW5kaW5nIiwiZ2V0QWxsQmluZGluZ3MiLCJiaW5kaW5nIiwiYmluZGluZ1BhdGgiLCJpc1JlbGF0aXZlIiwiZ2V0UmVzb2x2ZWRQYXRoIiwiaXNBIiwiZ2V0QWxsQ3VycmVudENvbnRleHRzIiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJyb3V0aW5nIiwiQ29tbW9uVXRpbHMiLCJnZXRDdXJyZW50UGFnZVZpZXciLCJ4IiwiZGF0YVBhdGgiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkFjdGl2aXR5U3luYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQge1xuXHRicm9hZGNhc3RDb2xsYWJvcmF0aW9uTWVzc2FnZSxcblx0ZW5kQ29sbGFib3JhdGlvbixcblx0aW5pdGlhbGl6ZUNvbGxhYm9yYXRpb24sXG5cdGlzQ29sbGFib3JhdGlvbkNvbm5lY3RlZFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9BY3Rpdml0eUJhc2VcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgVXNlciwgVXNlckFjdGl2aXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHsgQWN0aXZpdHksIENvbGxhYm9yYXRpb25VdGlscyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0NvbGxhYm9yYXRpb25Db21tb25cIjtcbmltcG9ydCB7IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvU2lkZUVmZmVjdHNcIjtcbmltcG9ydCAqIGFzIE1ldGFNb2RlbENvbnZlcnRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcblxuY29uc3QgTVlBQ1RJVklUWSA9IFwiL2NvbGxhYm9yYXRpb24vbXlBY3Rpdml0eVwiO1xuY29uc3QgQUNUSVZFVVNFUlMgPSBcIi9jb2xsYWJvcmF0aW9uL2FjdGl2ZVVzZXJzXCI7XG5jb25zdCBBQ1RJVklUSUVTID0gXCIvY29sbGFib3JhdGlvbi9hY3Rpdml0aWVzXCI7XG5jb25zdCBTWU5DR1JPVVBJRCA9IFwiJGF1dG8uc3luY1wiO1xuXG5leHBvcnQgY29uc3QgaXNDb25uZWN0ZWQgPSBmdW5jdGlvbiAoY29udHJvbDogQ29udHJvbCk6IGJvb2xlYW4ge1xuXHRjb25zdCBpbnRlcm5hbE1vZGVsID0gY29udHJvbC5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0cmV0dXJuIGlzQ29sbGFib3JhdGlvbkNvbm5lY3RlZChpbnRlcm5hbE1vZGVsKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZW5kID0gZnVuY3Rpb24gKFxuXHRjb250cm9sOiBDb250cm9sLFxuXHRhY3Rpb246IEFjdGl2aXR5LFxuXHRjb250ZW50OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcblx0dHJpZ2dlcmVkQWN0aW9uTmFtZT86IHN0cmluZyxcblx0cmVmcmVzaExpc3RCaW5kaW5nPzogYm9vbGVhbixcblx0YWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcz86IHN0cmluZ1tdXG4pIHtcblx0aWYgKGlzQ29ubmVjdGVkKGNvbnRyb2wpKSB7XG5cdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IGNvbnRyb2wuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0Y29uc3QgY2xpZW50Q29udGVudCA9IEFycmF5LmlzQXJyYXkoY29udGVudCkgPyBjb250ZW50LmpvaW4oXCJ8XCIpIDogY29udGVudDtcblx0XHRjb25zdCByZXF1ZXN0ZWRQcm9wZXJ0aWVzID0gYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcz8uam9pbihcInxcIik7XG5cdFx0Y29uc3QgbXlBY3Rpdml0eSA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoTVlBQ1RJVklUWSk7XG5cdFx0aWYgKGFjdGlvbiA9PT0gQWN0aXZpdHkuTGl2ZUNoYW5nZSkge1xuXHRcdFx0Ly8gVG8gYXZvaWQgdW5uZWNlc3NhcnkgdHJhZmZpYyB3ZSBrZWVwIHRyYWNrIG9mIGxpdmUgY2hhbmdlcyBhbmQgc2VuZCBpdCBvbmx5IG9uY2VcblxuXHRcdFx0aWYgKG15QWN0aXZpdHkgPT09IGNsaWVudENvbnRlbnQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShNWUFDVElWSVRZLCBjbGllbnRDb250ZW50KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gbmVlZCB0byBzZW5kIGFuIFVuZG8gbWVzc2FnZSBpZiB0aGVyZSdzIG5vIGN1cnJlbnQgYWN0aXZpdHlcblx0XHRcdGlmIChhY3Rpb24gPT09IEFjdGl2aXR5LlVuZG8gJiYgbXlBY3Rpdml0eSA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIHVzZXIgZmluaXNoZWQgdGhlIGFjdGl2aXR5XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KE1ZQUNUSVZJVFksIG51bGwpO1xuXHRcdH1cblxuXHRcdGJyb2FkY2FzdENvbGxhYm9yYXRpb25NZXNzYWdlKGFjdGlvbiwgY2xpZW50Q29udGVudCwgaW50ZXJuYWxNb2RlbCwgdHJpZ2dlcmVkQWN0aW9uTmFtZSwgcmVmcmVzaExpc3RCaW5kaW5nLCByZXF1ZXN0ZWRQcm9wZXJ0aWVzKTtcblx0fVxufTtcblxuY29uc3QgZ2V0V2ViU29ja2V0QmFzZVVSTCA9IGZ1bmN0aW9uIChiaW5kaW5nQ29udGV4dDogQ29udGV4dCk6IHN0cmluZyB7XG5cdHJldHVybiBiaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE9iamVjdChcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLldlYlNvY2tldEJhc2VVUkxcIik7XG59O1xuXG5leHBvcnQgY29uc3QgaXNDb2xsYWJvcmF0aW9uRW5hYmxlZCA9IGZ1bmN0aW9uICh2aWV3OiBWaWV3KTogYm9vbGVhbiB7XG5cdGNvbnN0IGJpbmRpbmdDb250ZXh0ID0gdmlldz8uZ2V0QmluZGluZ0NvbnRleHQgJiYgKHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KTtcblx0cmV0dXJuICEhKGJpbmRpbmdDb250ZXh0ICYmIGdldFdlYlNvY2tldEJhc2VVUkwoYmluZGluZ0NvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0ID0gYXN5bmMgZnVuY3Rpb24gKHZpZXc6IFZpZXcpIHtcblx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdGNvbnN0IG1lID0gQ29sbGFib3JhdGlvblV0aWxzLmdldE1lKHZpZXcpO1xuXG5cdC8vIFJldHJpZXZpbmcgTUUgZnJvbSBzaGVsbCBzZXJ2aWNlXG5cdGlmICghbWUpIHtcblx0XHQvLyBubyBtZSA9IG5vIHNoZWxsID0gbm90IHN1cmUgd2hhdCB0byBkb1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGJpbmRpbmdDb250ZXh0ID0gdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdGNvbnN0IHdlYlNvY2tldEJhc2VVUkwgPSBnZXRXZWJTb2NrZXRCYXNlVVJMKGJpbmRpbmdDb250ZXh0KTtcblx0Y29uc3Qgc2VydmljZVVybCA9IGJpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0U2VydmljZVVybCgpO1xuXG5cdGlmICghd2ViU29ja2V0QmFzZVVSTCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IHNEcmFmdFVVSUQgPSBhd2FpdCBiaW5kaW5nQ29udGV4dC5yZXF1ZXN0UHJvcGVydHkoXCJEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdFVVSURcIik7XG5cdGlmICghc0RyYWZ0VVVJRCkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGluaXRpYWxpemVDb2xsYWJvcmF0aW9uKG1lLCB3ZWJTb2NrZXRCYXNlVVJMLCBzRHJhZnRVVUlELCBzZXJ2aWNlVXJsLCBpbnRlcm5hbE1vZGVsLCAobWVzc2FnZTogTWVzc2FnZSkgPT4ge1xuXHRcdG1lc3NhZ2VSZWNlaXZlKG1lc3NhZ2UsIHZpZXcpO1xuXHR9KTtcblx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShNWUFDVElWSVRZLCBudWxsKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkaXNjb25uZWN0ID0gZnVuY3Rpb24gKGNvbnRyb2w6IENvbnRyb2wpIHtcblx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IGNvbnRyb2wuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdGVuZENvbGxhYm9yYXRpb24oaW50ZXJuYWxNb2RlbCk7XG59O1xuXG4vKipcbiAqIENhbGxiYWNrIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIGZyb20gdGhlIHdlYnNvY2tldC5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSByZWNlaXZlZFxuICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdGhhdCB3YXMgdXNlZCBpbml0aWFsbHkgd2hlbiBjb25uZWN0aW5nIHRoZSB3ZWJzb2NrZXRcbiAqL1xuZnVuY3Rpb24gbWVzc2FnZVJlY2VpdmUobWVzc2FnZTogTWVzc2FnZSwgdmlldzogVmlldykge1xuXHRjb25zdCBpbnRlcm5hbE1vZGVsOiBhbnkgPSB2aWV3LmdldE1vZGVsKFwiaW50ZXJuYWxcIik7XG5cdGxldCBhY3RpdmVVc2VyczogVXNlcltdID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShBQ1RJVkVVU0VSUyk7XG5cdGxldCBhY3Rpdml0aWVzOiBVc2VyQWN0aXZpdHlbXTtcblx0bGV0IGFjdGl2aXR5S2V5OiBzdHJpbmc7XG5cdGNvbnN0IG1ldGFQYXRoID0gY2FsY3VsYXRlTWV0YVBhdGgodmlldywgbWVzc2FnZS5jbGllbnRDb250ZW50KTtcblx0bWVzc2FnZS51c2VyQWN0aW9uID0gbWVzc2FnZS51c2VyQWN0aW9uIHx8IG1lc3NhZ2UuY2xpZW50QWN0aW9uO1xuXG5cdGNvbnN0IHNlbmRlcjogVXNlciA9IHtcblx0XHRpZDogbWVzc2FnZS51c2VySUQsXG5cdFx0bmFtZTogbWVzc2FnZS51c2VyRGVzY3JpcHRpb24sXG5cdFx0aW5pdGlhbHM6IENvbGxhYm9yYXRpb25VdGlscy5mb3JtYXRJbml0aWFscyhtZXNzYWdlLnVzZXJEZXNjcmlwdGlvbiksXG5cdFx0Y29sb3I6IENvbGxhYm9yYXRpb25VdGlscy5nZXRVc2VyQ29sb3IobWVzc2FnZS51c2VySUQsIGFjdGl2ZVVzZXJzLCBbXSlcblx0fTtcblxuXHRsZXQgbWFjdGl2aXR5OiBVc2VyQWN0aXZpdHkgPSBzZW5kZXI7XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlZmF1bHQtY2FzZVxuXHRzd2l0Y2ggKG1lc3NhZ2UudXNlckFjdGlvbikge1xuXHRcdGNhc2UgQWN0aXZpdHkuSm9pbjpcblx0XHRjYXNlIEFjdGl2aXR5LkpvaW5FY2hvOlxuXHRcdFx0aWYgKGFjdGl2ZVVzZXJzLmZpbmRJbmRleCgodXNlcikgPT4gdXNlci5pZCA9PT0gc2VuZGVyLmlkKSA9PT0gLTEpIHtcblx0XHRcdFx0YWN0aXZlVXNlcnMudW5zaGlmdChzZW5kZXIpO1xuXHRcdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KEFDVElWRVVTRVJTLCBhY3RpdmVVc2Vycyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtZXNzYWdlLnVzZXJBY3Rpb24gPT09IEFjdGl2aXR5LkpvaW4pIHtcblx0XHRcdFx0Ly8gd2UgZWNobyBvdXIgZXhpc3RlbmNlIHRvIHRoZSBuZXdseSBlbnRlcmVkIHVzZXIgYW5kIGFsc28gc2VuZCB0aGUgY3VycmVudCBhY3Rpdml0eSBpZiB0aGVyZSBpcyBhbnlcblx0XHRcdFx0YnJvYWRjYXN0Q29sbGFib3JhdGlvbk1lc3NhZ2UoQWN0aXZpdHkuSm9pbkVjaG8sIGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoTVlBQ1RJVklUWSksIGludGVybmFsTW9kZWwpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobWVzc2FnZS51c2VyQWN0aW9uID09PSBBY3Rpdml0eS5Kb2luRWNobykge1xuXHRcdFx0XHRpZiAobWVzc2FnZS5jbGllbnRDb250ZW50KSB7XG5cdFx0XHRcdFx0Ly8gYW5vdGhlciB1c2VyIHdhcyBhbHJlYWR5IHR5cGluZyB0aGVyZWZvcmUgSSB3YW50IHRvIHNlZSBoaXMgYWN0aXZpdHkgaW1tZWRpYXRlbHkuIENhbGxpbmcgbWUgYWdhaW4gYXMgYSBsaXZlIGNoYW5nZVxuXHRcdFx0XHRcdG1lc3NhZ2UudXNlckFjdGlvbiA9IEFjdGl2aXR5LkxpdmVDaGFuZ2U7XG5cdFx0XHRcdFx0bWVzc2FnZVJlY2VpdmUobWVzc2FnZSwgdmlldyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIEFjdGl2aXR5LkxlYXZlOlxuXHRcdFx0Ly8gUmVtb3ZpbmcgdGhlIGFjdGl2ZSB1c2VyLiBOb3QgcmVtb3ZpbmcgXCJtZVwiIGlmIEkgaGFkIHRoZSBzY3JlZW4gb3BlbiBpbiBhbm90aGVyIHNlc3Npb25cblx0XHRcdGFjdGl2ZVVzZXJzID0gYWN0aXZlVXNlcnMuZmlsdGVyKCh1c2VyKSA9PiB1c2VyLmlkICE9PSBzZW5kZXIuaWQgfHwgdXNlci5tZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KEFDVElWRVVTRVJTLCBhY3RpdmVVc2Vycyk7XG5cdFx0XHRjb25zdCBhbGxBY3Rpdml0aWVzID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShBQ1RJVklUSUVTKSB8fCB7fTtcblx0XHRcdGNvbnN0IHJlbW92ZVVzZXJBY3Rpdml0aWVzID0gZnVuY3Rpb24gKGJhZzogYW55KSB7XG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGJhZykpIHtcblx0XHRcdFx0XHRyZXR1cm4gYmFnLmZpbHRlcigoYWN0aXZpdHkpID0+IGFjdGl2aXR5LmlkICE9PSBzZW5kZXIuaWQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgcCBpbiBiYWcpIHtcblx0XHRcdFx0XHRcdGJhZ1twXSA9IHJlbW92ZVVzZXJBY3Rpdml0aWVzKGJhZ1twXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBiYWc7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRyZW1vdmVVc2VyQWN0aXZpdGllcyhhbGxBY3Rpdml0aWVzKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoQUNUSVZJVElFUywgYWxsQWN0aXZpdGllcyk7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgQWN0aXZpdHkuQ2hhbmdlOlxuXHRcdFx0dXBkYXRlT25DaGFuZ2UodmlldywgbWVzc2FnZSk7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgQWN0aXZpdHkuQ3JlYXRlOlxuXHRcdFx0Ly8gRm9yIGNyZWF0ZSB3ZSBhY3R1YWxseSBqdXN0IG5lZWQgdG8gcmVmcmVzaCB0aGUgdGFibGVcblx0XHRcdHVwZGF0ZU9uQ3JlYXRlKHZpZXcsIG1lc3NhZ2UpO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIEFjdGl2aXR5LkRlbGV0ZTpcblx0XHRcdC8vIEZvciBub3cgYWxzbyByZWZyZXNoIHRoZSBwYWdlIGJ1dCBpbiBjYXNlIG9mIGRlbGV0aW9uIHdlIG5lZWQgdG8gaW5mb3JtIHRoZSB1c2VyXG5cdFx0XHR1cGRhdGVPbkRlbGV0ZSh2aWV3LCBtZXNzYWdlKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBBY3Rpdml0eS5BY3RpdmF0ZTpcblx0XHRcdGRyYWZ0Q2xvc2VkQnlPdGhlclVzZXIodmlldywgbWVzc2FnZS5jbGllbnRDb250ZW50LCBDb2xsYWJvcmF0aW9uVXRpbHMuZ2V0VGV4dChcIkNfQ09MTEFCT1JBVElPTkRSQUZUX0FDVElWQVRFXCIsIHNlbmRlci5uYW1lKSk7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgQWN0aXZpdHkuRGlzY2FyZDpcblx0XHRcdGRyYWZ0Q2xvc2VkQnlPdGhlclVzZXIodmlldywgbWVzc2FnZS5jbGllbnRDb250ZW50LCBDb2xsYWJvcmF0aW9uVXRpbHMuZ2V0VGV4dChcIkNfQ09MTEFCT1JBVElPTkRSQUZUX0RJU0NBUkRcIiwgc2VuZGVyLm5hbWUpKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBBY3Rpdml0eS5BY3Rpb246XG5cdFx0XHR1cGRhdGVPbkFjdGlvbih2aWV3LCBtZXNzYWdlKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBBY3Rpdml0eS5MaXZlQ2hhbmdlOlxuXHRcdFx0bWFjdGl2aXR5ID0gc2VuZGVyO1xuXHRcdFx0bWFjdGl2aXR5LmtleSA9IGdldEFjdGl2aXR5S2V5KG1lc3NhZ2UuY2xpZW50Q29udGVudCk7XG5cblx0XHRcdC8vIHN0dXBpZCBKU09OIG1vZGVsLi4uXG5cdFx0XHRsZXQgaW5pdEpTT05Nb2RlbDogc3RyaW5nID0gXCJcIjtcblx0XHRcdGNvbnN0IHBhcnRzID0gbWV0YVBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcblx0XHRcdFx0aW5pdEpTT05Nb2RlbCArPSBgLyR7cGFydHNbaV19YDtcblx0XHRcdFx0aWYgKCFpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KEFDVElWSVRJRVMgKyBpbml0SlNPTk1vZGVsKSkge1xuXHRcdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoQUNUSVZJVElFUyArIGluaXRKU09OTW9kZWwsIHt9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRhY3Rpdml0aWVzID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShBQ1RJVklUSUVTICsgbWV0YVBhdGgpO1xuXHRcdFx0YWN0aXZpdGllcyA9IGFjdGl2aXRpZXM/LnNsaWNlID8gYWN0aXZpdGllcy5zbGljZSgpIDogW107XG5cdFx0XHRhY3Rpdml0aWVzLnB1c2gobWFjdGl2aXR5KTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoQUNUSVZJVElFUyArIG1ldGFQYXRoLCBhY3Rpdml0aWVzKTtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBBY3Rpdml0eS5VbmRvOlxuXHRcdFx0Ly8gVGhlIHVzZXIgZGlkIGEgY2hhbmdlIGJ1dCByZXZlcnRlZCBpdCwgdGhlcmVmb3JlIHVuYmxvY2sgdGhlIGNvbnRyb2xcblx0XHRcdGFjdGl2aXRpZXMgPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KEFDVElWSVRJRVMgKyBtZXRhUGF0aCk7XG5cdFx0XHRhY3Rpdml0eUtleSA9IGdldEFjdGl2aXR5S2V5KG1lc3NhZ2UuY2xpZW50Q29udGVudCk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFxuXHRcdFx0XHRBQ1RJVklUSUVTICsgbWV0YVBhdGgsXG5cdFx0XHRcdGFjdGl2aXRpZXMuZmlsdGVyKChhKSA9PiBhLmtleSAhPT0gYWN0aXZpdHlLZXkpXG5cdFx0XHQpO1xuXHRcdFx0YnJlYWs7XG5cdH1cbn1cblxuLyoqXG4gKiBEaXNwbGF5cyBhIG1lc3NhZ2UgdGhhdCB0aGUgY3VycmVudCBkcmFmdCB3YXMgY2xvc2VkIGJlIGFub3RoZXIgdXNlciwgYW5kIG5hdmlnYXRlcyBiYWNrIHRvIGEgcHJvcGVyIHZpZXcuXG4gKlxuICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdGhhdCB3YXMgdXNlZCBpbml0aWFsbHkgd2hlbiBjb25uZWN0aW5nIHRoZSB3ZWJzb2NrZXRcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBjb250ZXh0IHRvIG5hdmlnYXRlIHRvXG4gKiBAcGFyYW0gbWVzc2FnZVRleHQgVGhlIG1lc3NhZ2UgdG8gZGlzcGxheVxuICovXG5mdW5jdGlvbiBkcmFmdENsb3NlZEJ5T3RoZXJVc2VyKHZpZXc6IFZpZXcsIHBhdGg6IHN0cmluZywgbWVzc2FnZVRleHQ6IHN0cmluZykge1xuXHRkaXNjb25uZWN0KHZpZXcpO1xuXHRNZXNzYWdlQm94LmluZm9ybWF0aW9uKG1lc3NhZ2VUZXh0KTtcblx0KHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KVxuXHRcdC5nZXRCaW5kaW5nKClcblx0XHQucmVzZXRDaGFuZ2VzKClcblx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRuYXZpZ2F0ZShwYXRoLCB2aWV3KTtcblx0XHR9KVxuXHRcdC5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJQZW5kaW5nIENoYW5nZXMgY291bGQgbm90IGJlIHJlc2V0IC0gc3RpbGwgbmF2aWdhdGluZyB0byBhY3RpdmUgaW5zdGFuY2VcIik7XG5cdFx0XHRuYXZpZ2F0ZShwYXRoLCB2aWV3KTtcblx0XHR9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGRhdGEgd2hlbiBhIENIQU5HRSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkLlxuICpcbiAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgd2FzIHVzZWQgaW5pdGlhbGx5IHdoZW4gY29ubmVjdGluZyB0aGUgd2Vic29ja2V0XG4gKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSB3ZWJzb2NrZXRcbiAqL1xuZnVuY3Rpb24gdXBkYXRlT25DaGFuZ2UodmlldzogVmlldywgbWVzc2FnZTogTWVzc2FnZSkge1xuXHRjb25zdCB1cGRhdGVkT2JqZWN0c1BhdGhzID0gbWVzc2FnZS5jbGllbnRDb250ZW50LnNwbGl0KFwifFwiKTtcblx0Y29uc3QgbWV0YU1vZGVsID0gdmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdmlldy5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblxuXHQvLyBSZW1vdmUgYWxsIGxvY2tzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhdGhzXG5cdHVwZGF0ZWRPYmplY3RzUGF0aHMuZm9yRWFjaCgodXBkYXRlZFBhdGgpID0+IHtcblx0XHRjb25zdCB1cGRhdGVkTWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgodXBkYXRlZFBhdGgpO1xuXHRcdGNvbnN0IGFjdGl2aXR5S2V5ID0gZ2V0QWN0aXZpdHlLZXkodXBkYXRlZFBhdGgpO1xuXHRcdGxldCBjdXJyZW50QWN0aXZpdGllczogYW55W10gPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KEFDVElWSVRJRVMgKyB1cGRhdGVkTWV0YVBhdGgpIHx8IFtdO1xuXHRcdGN1cnJlbnRBY3Rpdml0aWVzID0gY3VycmVudEFjdGl2aXRpZXM/LmZpbHRlciAmJiBjdXJyZW50QWN0aXZpdGllcy5maWx0ZXIoKGFjdGl2aXR5KSA9PiBhY3Rpdml0eS5rZXkgIT09IGFjdGl2aXR5S2V5KTtcblx0XHRpZiAoY3VycmVudEFjdGl2aXRpZXMpIHtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoQUNUSVZJVElFUyArIHVwZGF0ZWRNZXRhUGF0aCwgY3VycmVudEFjdGl2aXRpZXMpO1xuXHRcdH1cblx0fSk7XG5cblx0Y29uc3QgY3VycmVudFBhZ2UgPSBnZXRDdXJyZW50UGFnZSh2aWV3KTtcblx0Y29uc3QgY3VycmVudENvbnRleHQgPSBjdXJyZW50UGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdGNvbnN0IHJlcXVlc3RQcm9taXNlcyA9IHVwZGF0ZWRPYmplY3RzUGF0aHMubWFwKChwYXRoKSA9PiBhcHBseVVwZGF0ZXNGb3JDaGFuZ2UodmlldywgcGF0aCkpO1xuXG5cdC8vIFNpbXVsYXRlIGFueSBjaGFuZ2Ugc28gdGhlIGVkaXQgZmxvdyBzaG93cyB0aGUgZHJhZnQgaW5kaWNhdG9yIGFuZCBzZXRzIHRoZSBwYWdlIHRvIGRpcnR5XG5cdGN1cnJlbnRQYWdlLmdldENvbnRyb2xsZXIoKS5lZGl0Rmxvdy51cGRhdGVEb2N1bWVudChjdXJyZW50Q29udGV4dCwgUHJvbWlzZS5hbGwocmVxdWVzdFByb21pc2VzKSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyBkYXRhIGNvcnJlc3BvbmRpbmcgdG8gYSBwYXRoLlxuICpcbiAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgd2FzIHVzZWQgaW5pdGlhbGx5IHdoZW4gY29ubmVjdGluZyB0aGUgd2Vic29ja2V0XG4gKiBAcGFyYW0gcHJvcGVydHlQYXRoRm9yVXBkYXRlIEFic29sdXRlIHBhdGggdG8gdGhlIHVwZGF0ZWQgcHJvcGVydHlcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHRoZSBkYXRhIGFuZCBpdHMgcmVsYXRlZCBzaWRlIGVmZmVjdHMgaGF2ZSBiZWVuIHJlY2VpdmVkXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5VXBkYXRlc0ZvckNoYW5nZSh2aWV3OiBWaWV3LCBwcm9wZXJ0eVBhdGhGb3JVcGRhdGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBtZXRhTW9kZWwgPSB2aWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KHByb3BlcnR5UGF0aEZvclVwZGF0ZSk7XG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpO1xuXHRjb25zdCB0YXJnZXRDb250ZXh0UGF0aCA9IHByb3BlcnR5UGF0aEZvclVwZGF0ZS5zdWJzdHJpbmcoMCwgcHJvcGVydHlQYXRoRm9yVXBkYXRlLmxhc3RJbmRleE9mKFwiL1wiKSk7IC8vIFJlbW92ZSBwcm9wZXJ0eSBuYW1lXG5cdGNvbnN0IHRhcmdldENvbnRleHQgPSBmaW5kQ29udGV4dEZvclVwZGF0ZSh2aWV3LCB0YXJnZXRDb250ZXh0UGF0aCk7XG5cdGNvbnN0IHBhcmVudENvbGxlY3Rpb25QYXRoID0gdGFyZ2V0Q29udGV4dFBhdGguc3Vic3RyaW5nKDAsIHRhcmdldENvbnRleHRQYXRoLmxhc3RJbmRleE9mKFwiKFwiKSk7XG5cdGNvbnN0IHBhcmVudENvbnRleHRQYXRoID0gcGFyZW50Q29sbGVjdGlvblBhdGguc3Vic3RyaW5nKDAsIHBhcmVudENvbGxlY3Rpb25QYXRoLmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdGNvbnN0IHBhcmVudENvbnRleHQgPSBwYXJlbnRDb250ZXh0UGF0aCA/IGZpbmRDb250ZXh0Rm9yVXBkYXRlKHZpZXcsIHBhcmVudENvbnRleHRQYXRoKSA6IHVuZGVmaW5lZDtcblxuXHRpZiAoIXRhcmdldENvbnRleHQgJiYgIXBhcmVudENvbnRleHQpIHtcblx0XHRyZXR1cm47IC8vIE5vIGNvbnRleHQgZm9yIHVwZGF0ZVxuXHR9XG5cblx0dHJ5IHtcblx0XHRjb25zdCBzaWRlRWZmZWN0c1Byb21pc2VzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzU2VydmljZSA9IENvbGxhYm9yYXRpb25VdGlscy5nZXRBcHBDb21wb25lbnQodmlldykuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cblx0XHRpZiAodGFyZ2V0Q29udGV4dCkge1xuXHRcdFx0Ly8gV2UgaGF2ZSBhIHRhcmdldCBjb250ZXh0LCBzbyB3ZSBjYW4gcmV0cmlldmUgdGhlIHVwZGF0ZWQgcHJvcGVydHlcblx0XHRcdGNvbnN0IHRhcmdldE1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKHRhcmdldENvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IHJlbGF0aXZlTWV0YVBhdGhGb3JVcGRhdGUgPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgocHJvcGVydHlQYXRoRm9yVXBkYXRlKS5yZXBsYWNlKHRhcmdldE1ldGFQYXRoLCBcIlwiKS5zbGljZSgxKTtcblx0XHRcdHNpZGVFZmZlY3RzUHJvbWlzZXMucHVzaChzaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFtyZWxhdGl2ZU1ldGFQYXRoRm9yVXBkYXRlXSwgdGFyZ2V0Q29udGV4dCwgU1lOQ0dST1VQSUQpKTtcblx0XHR9XG5cblx0XHQvLyBHZXQgdGhlIGZpZWxkR3JvdXBJZHMgY29ycmVzcG9uZGluZyB0byBwYXRoRm9yVXBkYXRlXG5cdFx0Y29uc3QgZmllbGRHcm91cElkcyA9IHNpZGVFZmZlY3RzU2VydmljZS5jb21wdXRlRmllbGRHcm91cElkcyhcblx0XHRcdGRhdGFNb2RlbE9iamVjdC50YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdGRhdGFNb2RlbE9iamVjdC50YXJnZXRPYmplY3QuZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0KTtcblxuXHRcdC8vIEV4ZWN1dGUgdGhlIHNpZGUgZWZmZWN0cyBmb3IgdGhlIGZpZWxkR3JvdXBJZHNcblx0XHRpZiAoZmllbGRHcm91cElkcy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IHBhZ2VDb250cm9sbGVyID0gdmlldy5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXI7XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0c01hcEZvckZpZWxkR3JvdXAgPSBwYWdlQ29udHJvbGxlci5fc2lkZUVmZmVjdHMuZ2V0U2lkZUVmZmVjdHNNYXBGb3JGaWVsZEdyb3Vwcyhcblx0XHRcdFx0ZmllbGRHcm91cElkcyxcblx0XHRcdFx0dGFyZ2V0Q29udGV4dCB8fCBwYXJlbnRDb250ZXh0XG5cdFx0XHQpIGFzIEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnk7XG5cdFx0XHRPYmplY3Qua2V5cyhzaWRlRWZmZWN0c01hcEZvckZpZWxkR3JvdXApLmZvckVhY2goKHNpZGVFZmZlY3ROYW1lKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHNpZGVFZmZlY3QgPSBzaWRlRWZmZWN0c01hcEZvckZpZWxkR3JvdXBbc2lkZUVmZmVjdE5hbWVdO1xuXHRcdFx0XHRzaWRlRWZmZWN0c1Byb21pc2VzLnB1c2goXG5cdFx0XHRcdFx0cGFnZUNvbnRyb2xsZXIuX3NpZGVFZmZlY3RzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0LnNpZGVFZmZlY3RzLCBzaWRlRWZmZWN0LmNvbnRleHQsIFNZTkNHUk9VUElEKVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoc2lkZUVmZmVjdHNQcm9taXNlcyk7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdExvZy5lcnJvcihcIkZhaWxlZCB0byB1cGRhdGUgZGF0YSBhZnRlciBjaGFuZ2U6XCIgKyBlcnIpO1xuXHRcdHRocm93IGVycjtcblx0fVxufVxuXG4vKipcbiAqIFVwZGF0ZXMgZGF0YSB3aGVuIGEgREVMRVRFIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQuXG4gKlxuICogQHBhcmFtIHZpZXcgVGhlIHZpZXcgdGhhdCB3YXMgdXNlZCBpbml0aWFsbHkgd2hlbiBjb25uZWN0aW5nIHRoZSB3ZWJzb2NrZXRcbiAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIHdlYnNvY2tldFxuICovXG5mdW5jdGlvbiB1cGRhdGVPbkRlbGV0ZSh2aWV3OiBWaWV3LCBtZXNzYWdlOiBNZXNzYWdlKSB7XG5cdGNvbnN0IGN1cnJlbnRQYWdlID0gZ2V0Q3VycmVudFBhZ2Uodmlldyk7XG5cdGNvbnN0IGN1cnJlbnRDb250ZXh0ID0gY3VycmVudFBhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRjb25zdCBjdXJyZW50UGF0aCA9IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoKTtcblxuXHRjb25zdCBkZWxldGVkT2JqZWN0UGF0aHMgPSBtZXNzYWdlLmNsaWVudENvbnRlbnQuc3BsaXQoXCJ8XCIpO1xuXG5cdC8vIGNoZWNrIGlmIHVzZXIgY3VycmVudGx5IGRpc3BsYXlzIGEgZGVsZXRlZCBvYmplY3Qgb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50c1xuXHRjb25zdCBkZWxldGVkUGF0aEluVXNlID0gZGVsZXRlZE9iamVjdFBhdGhzLmZpbmQoKGRlbGV0ZWRQYXRoKSA9PiBjdXJyZW50UGF0aC5zdGFydHNXaXRoKGRlbGV0ZWRQYXRoKSk7XG5cdGlmIChkZWxldGVkUGF0aEluVXNlKSB7XG5cdFx0Ly8gYW55IG90aGVyIHVzZXIgZGVsZXRlZCB0aGUgb2JqZWN0IEknbSBjdXJyZW50bHkgbG9va2luZyBhdC4gSW5mb3JtIHRoZSB1c2VyIHdlIHdpbGwgbmF2aWdhdGUgdG8gcm9vdCBub3dcblx0XHRNZXNzYWdlQm94LmluZm9ybWF0aW9uKENvbGxhYm9yYXRpb25VdGlscy5nZXRUZXh0KFwiQ19DT0xMQUJPUkFUSU9ORFJBRlRfREVMRVRFXCIsIG1lc3NhZ2UudXNlckRlc2NyaXB0aW9uKSwge1xuXHRcdFx0b25DbG9zZTogKCkgPT4ge1xuXHRcdFx0XHQvLyBXZSByZXRyaWV2ZSB0aGUgZGVsZXRlZCBjb250ZXh0IGFzIGEga2VlcC1hbGl2ZSwgYW5kIGRpc2FibGUgaXRzIGtlZXBhbGl2ZSBzdGF0dXMsXG5cdFx0XHRcdC8vIHNvIHRoYXQgaXQgaXMgcHJvcGVybHkgZGVzdHJveWVkIHdoZW4gcmVmcmVzaGluZyBkYXRhXG5cdFx0XHRcdGNvbnN0IHRhcmdldENvbnRleHQgPSBjdXJyZW50Q29udGV4dC5nZXRNb2RlbCgpLmdldEtlZXBBbGl2ZUNvbnRleHQoZGVsZXRlZFBhdGhJblVzZSk7XG5cdFx0XHRcdHRhcmdldENvbnRleHQuc2V0S2VlcEFsaXZlKGZhbHNlKTtcblx0XHRcdFx0Y29uc3QgcmVxdWVzdFByb21pc2UgPSBhcHBseVVwZGF0ZXNGb3JDb2xsZWN0aW9uKHZpZXcsIGRlbGV0ZWRPYmplY3RQYXRoc1swXSk7XG5cdFx0XHRcdGN1cnJlbnRQYWdlLmdldENvbnRyb2xsZXIoKS5lZGl0Rmxvdy51cGRhdGVEb2N1bWVudChjdXJyZW50UGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpLCByZXF1ZXN0UHJvbWlzZSk7XG5cdFx0XHRcdChjdXJyZW50UGFnZS5nZXRDb250cm9sbGVyKCkgYXMgUGFnZUNvbnRyb2xsZXIpLl9yb3V0aW5nLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KHRhcmdldENvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IHJlcXVlc3RQcm9taXNlID0gYXBwbHlVcGRhdGVzRm9yQ29sbGVjdGlvbih2aWV3LCBkZWxldGVkT2JqZWN0UGF0aHNbMF0pO1xuXHRcdGN1cnJlbnRQYWdlLmdldENvbnRyb2xsZXIoKS5lZGl0Rmxvdy51cGRhdGVEb2N1bWVudChjdXJyZW50UGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpLCByZXF1ZXN0UHJvbWlzZSk7XG5cdH1cbn1cblxuLyoqXG4gKiBVcGRhdGVzIGRhdGEgd2hlbiBhIENSRUFURSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkLlxuICpcbiAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgd2FzIHVzZWQgaW5pdGlhbGx5IHdoZW4gY29ubmVjdGluZyB0aGUgd2Vic29ja2V0XG4gKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSB3ZWJzb2NrZXRcbiAqL1xuZnVuY3Rpb24gdXBkYXRlT25DcmVhdGUodmlldzogVmlldywgbWVzc2FnZTogTWVzc2FnZSkge1xuXHRjb25zdCBjdXJyZW50UGFnZSA9IGdldEN1cnJlbnRQYWdlKHZpZXcpO1xuXHRjb25zdCBjcmVhdGVkT2JqZWN0UGF0aHMgPSBtZXNzYWdlLmNsaWVudENvbnRlbnQuc3BsaXQoXCJ8XCIpO1xuXG5cdGNvbnN0IHJlcXVlc3RQcm9taXNlID0gYXBwbHlVcGRhdGVzRm9yQ29sbGVjdGlvbih2aWV3LCBjcmVhdGVkT2JqZWN0UGF0aHNbMF0pO1xuXHQvLyBTaW11bGF0ZSBhIGNoYW5nZSBzbyB0aGUgZWRpdCBmbG93IHNob3dzIHRoZSBkcmFmdCBpbmRpY2F0b3IgYW5kIHNldHMgdGhlIHBhZ2UgdG8gZGlydHlcblx0Y3VycmVudFBhZ2UuZ2V0Q29udHJvbGxlcigpLmVkaXRGbG93LnVwZGF0ZURvY3VtZW50KGN1cnJlbnRQYWdlLmdldEJpbmRpbmdDb250ZXh0KCksIHJlcXVlc3RQcm9taXNlKTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGRhdGEgaW4gYSBjb2xsZWN0aW9uLlxuICpcbiAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgd2FzIHVzZWQgaW5pdGlhbGx5IHdoZW4gY29ubmVjdGluZyB0aGUgd2Vic29ja2V0XG4gKiBAcGFyYW0gcGF0aEluQ29sbGVjdGlvbiBBIHBhdGggdG8gYW4gZW50aXR5IGluIHRoZSBjb2xsZWN0aW9uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFwcGx5VXBkYXRlc0ZvckNvbGxlY3Rpb24odmlldzogVmlldywgcGF0aEluQ29sbGVjdGlvbjogc3RyaW5nKSB7XG5cdGNvbnN0IGFwcENvbXBvbmVudCA9IENvbGxhYm9yYXRpb25VdGlscy5nZXRBcHBDb21wb25lbnQodmlldyk7XG5cdGNvbnN0IHBhcmVudFBhdGggPSBwYXRoSW5Db2xsZWN0aW9uLnN1YnN0cmluZygwLCBwYXRoSW5Db2xsZWN0aW9uLmxhc3RJbmRleE9mKFwiL1wiKSk7XG5cdGNvbnN0IHBhcmVudENvbnRleHQgPSBmaW5kQ29udGV4dEZvclVwZGF0ZSh2aWV3LCBwYXJlbnRQYXRoKTtcblxuXHRpZiAocGFyZW50Q29udGV4dCkge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0c1Byb21pc2VzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuXG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBwYXJlbnRDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBtZXRhUGF0aEZvclVwZGF0ZSA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChwYXRoSW5Db2xsZWN0aW9uKTtcblx0XHRcdGNvbnN0IHBhcmVudE1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKHBhcmVudENvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IHJlbGF0aXZlUGF0aCA9IG1ldGFQYXRoRm9yVXBkYXRlLnJlcGxhY2UoYCR7cGFyZW50TWV0YVBhdGh9L2AsIFwiXCIpO1xuXG5cdFx0XHQvLyBSZWxvYWQgdGhlIGNvbGxlY3Rpb25cblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzU2VydmljZSA9IGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHRcdHNpZGVFZmZlY3RzUHJvbWlzZXMucHVzaChzaWRlRWZmZWN0c1NlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKFtyZWxhdGl2ZVBhdGhdLCBwYXJlbnRDb250ZXh0LCBTWU5DR1JPVVBJRCkpO1xuXG5cdFx0XHQvLyBSZXF1ZXN0IHRoZSBzaWRlIGVmZmVjdHMgZm9yIHRoZSBjb2xsZWN0aW9uXG5cdFx0XHRzaWRlRWZmZWN0c1Byb21pc2VzLnB1c2goc2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShyZWxhdGl2ZVBhdGgsIHBhcmVudENvbnRleHQsIFNZTkNHUk9VUElEKSk7XG5cblx0XHRcdGF3YWl0IFByb21pc2UuYWxsKHNpZGVFZmZlY3RzUHJvbWlzZXMpO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0TG9nLmVycm9yKFwiRmFpbGVkIHRvIHVwZGF0ZSBkYXRhIGFmdGVyIGNvbGxlY3Rpb24gdXBkYXRlOlwiICsgZXJyKTtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBVcGRhdGVzIGRhdGEgd2hlbiBhIEFDVElPTiBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkLlxuICpcbiAqIEBwYXJhbSB2aWV3IFRoZSB2aWV3IHRoYXQgd2FzIHVzZWQgaW5pdGlhbGx5IHdoZW4gY29ubmVjdGluZyB0aGUgd2Vic29ja2V0XG4gKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSB3ZWJzb2NrZXRcbiAqL1xuZnVuY3Rpb24gdXBkYXRlT25BY3Rpb24odmlldzogVmlldywgbWVzc2FnZTogTWVzc2FnZSkge1xuXHRjb25zdCBjdXJyZW50UGFnZSA9IGdldEN1cnJlbnRQYWdlKHZpZXcpO1xuXHRjb25zdCBwYXRoc0ZvckFjdGlvbiA9IG1lc3NhZ2UuY2xpZW50Q29udGVudC5zcGxpdChcInxcIik7XG5cdGNvbnN0IGFjdGlvbk5hbWUgPSBtZXNzYWdlLmNsaWVudFRyaWdnZXJlZEFjdGlvbk5hbWUgfHwgXCJcIjtcblx0Y29uc3QgcmVxdWVzdGVkUHJvcGVydGllcyA9IG1lc3NhZ2UuY2xpZW50UmVxdWVzdGVkUHJvcGVydGllcz8uc3BsaXQoXCJ8XCIpO1xuXHRjb25zdCByZWZyZXNoTGlzdEJpbmRpbmcgPSBtZXNzYWdlLmNsaWVudFJlZnJlc2hMaXN0QmluZGluZyA9PT0gXCJ0cnVlXCI7XG5cblx0Y29uc3QgcmVxdWVzdFByb21pc2VzID0gcGF0aHNGb3JBY3Rpb24ubWFwKChwYXRoKSA9PiByZXF1ZXN0VXBkYXRlRm9yQWN0aW9uKHZpZXcsIHBhdGgsIGFjdGlvbk5hbWUsIHJlcXVlc3RlZFByb3BlcnRpZXMpKTtcblxuXHRpZiAocmVmcmVzaExpc3RCaW5kaW5nKSB7XG5cdFx0cmVxdWVzdFByb21pc2VzLnB1c2goYXBwbHlVcGRhdGVzRm9yQ29sbGVjdGlvbih2aWV3LCBwYXRoc0ZvckFjdGlvblswXSkpO1xuXHR9XG5cblx0Ly8gU2ltdWxhdGUgYW55IGNoYW5nZSBzbyB0aGUgZWRpdCBmbG93IHNob3dzIHRoZSBkcmFmdCBpbmRpY2F0b3IgYW5kIHNldHMgdGhlIHBhZ2UgdG8gZGlydHlcblx0Y3VycmVudFBhZ2UuZ2V0Q29udHJvbGxlcigpLmVkaXRGbG93LnVwZGF0ZURvY3VtZW50KGN1cnJlbnRQYWdlLmdldEJpbmRpbmdDb250ZXh0KCksIFByb21pc2UuYWxsKHJlcXVlc3RQcm9taXNlcykpO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgc2lkZS1lZmZlY3RzIGRhdGEgd2hlbiBhbiBhY3Rpb24gaGFzIGJlZW4gdHJpZ2dlcmVkIG9uIGEgY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gdmlldyBUaGUgdmlldyB0aGF0IHdhcyB1c2VkIGluaXRpYWxseSB3aGVuIGNvbm5lY3RpbmcgdGhlIHdlYnNvY2tldFxuICogQHBhcmFtIHBhdGhGb3JBY3Rpb24gUGF0aCBvZiB0aGUgY29udGV4dCB0byBhcHBseSB0aGUgYWN0aW9uIHRvXG4gKiBAcGFyYW0gYWN0aW9uTmFtZSBOYW1lIG9mIHRoZSBhY3Rpb25cbiAqIEBwYXJhbSByZXF1ZXN0ZWRQcm9wZXJ0aWVzXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIHdoZW4gdGhlIHNpZGUtZWZmZWN0cyBkYXRhIGhhcyBiZWVuIGxvYWRlZFxuICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0VXBkYXRlRm9yQWN0aW9uKFxuXHR2aWV3OiBWaWV3LFxuXHRwYXRoRm9yQWN0aW9uOiBzdHJpbmcsXG5cdGFjdGlvbk5hbWU6IHN0cmluZyxcblx0cmVxdWVzdGVkUHJvcGVydGllcz86IHN0cmluZ1tdXG4pOiBQcm9taXNlPHZvaWQ+IHtcblx0Y29uc3QgdGFyZ2V0Q29udGV4dCA9IGZpbmRDb250ZXh0Rm9yVXBkYXRlKHZpZXcsIHBhdGhGb3JBY3Rpb24pO1xuXHRpZiAoIXRhcmdldENvbnRleHQpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCBhcHBDb21wb25lbnQgPSBDb2xsYWJvcmF0aW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHZpZXcpO1xuXHRjb25zdCBzaWRlRWZmZWN0U2VydmljZSA9IGFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0Y29uc3Qgc2lkZUVmZmVjdHNGcm9tQWN0aW9uID0gc2lkZUVmZmVjdFNlcnZpY2UuZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhhY3Rpb25OYW1lLCB0YXJnZXRDb250ZXh0KTtcblx0Y29uc3Qgc2lkZUVmZmVjdFByb21pc2VzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuXHRpZiAoc2lkZUVmZmVjdHNGcm9tQWN0aW9uKSB7XG5cdFx0aWYgKHNpZGVFZmZlY3RzRnJvbUFjdGlvbi5wYXRoRXhwcmVzc2lvbnM/Lmxlbmd0aCkge1xuXHRcdFx0c2lkZUVmZmVjdFByb21pc2VzLnB1c2goXG5cdFx0XHRcdHNpZGVFZmZlY3RTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0c0Zyb21BY3Rpb24ucGF0aEV4cHJlc3Npb25zLCB0YXJnZXRDb250ZXh0LCBTWU5DR1JPVVBJRClcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cdGlmIChyZXF1ZXN0ZWRQcm9wZXJ0aWVzICYmIHJlcXVlc3RlZFByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuXHRcdC8vY2xlYW4tdXAgb2YgdGhlIHByb3BlcnRpZXMgdG8gcmVxdWVzdCBsaXN0OlxuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IHZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRjb25zdCBtZXRhUGF0aEZvckFjdGlvbiA9IGNhbGN1bGF0ZU1ldGFQYXRoKHZpZXcsIHBhdGhGb3JBY3Rpb24pO1xuXHRcdGNvbnN0IGRhdGFNb2RlbFBhdGggPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRDb250ZXh0KG1ldGFQYXRoRm9yQWN0aW9uKSk7XG5cdFx0Y29uc3QgcHJvcGVydGllc1RvUmVxdWVzdCA9IGRhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzXG5cdFx0XHQubWFwKChwcm9wZXJ0eTogUHJvcGVydHkpID0+IHtcblx0XHRcdFx0cmV0dXJuIHByb3BlcnR5Lm5hbWU7XG5cdFx0XHR9KVxuXHRcdFx0LmZpbHRlcigocHJvcCkgPT4gcmVxdWVzdGVkUHJvcGVydGllcy5pbmNsdWRlcyhwcm9wKSk7XG5cdFx0aWYgKHByb3BlcnRpZXNUb1JlcXVlc3QubGVuZ3RoID4gMCkge1xuXHRcdFx0c2lkZUVmZmVjdFByb21pc2VzLnB1c2goc2lkZUVmZmVjdFNlcnZpY2UucmVxdWVzdFNpZGVFZmZlY3RzKHByb3BlcnRpZXNUb1JlcXVlc3QsIHRhcmdldENvbnRleHQsIFNZTkNHUk9VUElEKSk7XG5cdFx0fVxuXHR9XG5cblx0YXdhaXQgUHJvbWlzZS5hbGwoc2lkZUVmZmVjdFByb21pc2VzKTtcbn1cblxuLyoqXG4gKiBGaW5kcyBhIGNvbnRleHQgdG8gYXBwbHkgYW4gdXBkYXRlIG1lc3NhZ2UgKENIQU5HRSwgQ1JFQVRFLCBERUxFVEUgb3IgQUNUSU9OKS5cbiAqXG4gKiBAcGFyYW0gdmlldyAgVGhlIHZpZXcgdGhhdCB3YXMgdXNlZCBpbml0aWFsbHkgd2hlbiBjb25uZWN0aW5nIHRoZSB3ZWJzb2NrZXRcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBjb250ZXh0IHRvIGJlIGZvdW5kIChzaGFsbCBwb2ludCB0byBhbiBlbnRpdHksIG5vdCBhIHByb3BlcnR5KVxuICogQHJldHVybnMgQSBjb250ZXh0IGlmIGl0IGNvdWxkIGJlIGZvdW5kXG4gKi9cbmZ1bmN0aW9uIGZpbmRDb250ZXh0Rm9yVXBkYXRlKHZpZXc6IFZpZXcsIHBhdGg6IHN0cmluZyk6IENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRpZiAoIXBhdGgpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdC8vIEZpbmQgYWxsIHBvdGVudGlhbCBwYXRoc1xuXHRjb25zdCB0YXJnZXRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0d2hpbGUgKCFwYXRoLmVuZHNXaXRoKFwiKVwiKSkge1xuXHRcdHRhcmdldFBhdGhzLnVuc2hpZnQocGF0aCk7XG5cdFx0cGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoXCIvXCIpKTtcblx0fVxuXHR0YXJnZXRQYXRocy51bnNoaWZ0KHBhdGgpO1xuXG5cdGNvbnN0IHBhcmVudENvbGxlY3Rpb25QYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sYXN0SW5kZXhPZihcIihcIikpOyAvLyBSZW1vdmUgdGhlIGxhc3Qga2V5XG5cblx0bGV0IHRhcmdldENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdGxldCBjdXJyZW50Q29udGV4dCA9IGdldEN1cnJlbnRQYWdlKHZpZXcpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0d2hpbGUgKGN1cnJlbnRDb250ZXh0ICYmICF0YXJnZXRDb250ZXh0KSB7XG5cdFx0aWYgKHRhcmdldFBhdGhzLmluZGV4T2YoY3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSA+PSAwKSB7XG5cdFx0XHR0YXJnZXRDb250ZXh0ID0gY3VycmVudENvbnRleHQ7XG5cdFx0fVxuXG5cdFx0Y3VycmVudENvbnRleHQgPSBjdXJyZW50Q29udGV4dC5nZXRCaW5kaW5nKCk/LmdldENvbnRleHQoKSBhcyBDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHR9XG5cblx0aWYgKHRhcmdldENvbnRleHQpIHtcblx0XHQvLyBGb3VuZCAhXG5cdFx0cmV0dXJuIHRhcmdldENvbnRleHQ7XG5cdH1cblxuXHQvLyBUcnkgdG8gZmluZCB0aGUgdGFyZ2V0IGNvbnRleHQgaW4gYSBsaXN0QmluZGluZ1xuXHRjb25zdCBtb2RlbCA9IGdldEN1cnJlbnRQYWdlKHZpZXcpLmdldEJpbmRpbmdDb250ZXh0KCkuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXHRjb25zdCBwYXJlbnRMaXN0QmluZGluZyA9IG1vZGVsLmdldEFsbEJpbmRpbmdzKCkuZmluZCgoYmluZGluZykgPT4ge1xuXHRcdGNvbnN0IGJpbmRpbmdQYXRoID0gYmluZGluZy5pc1JlbGF0aXZlKCkgPyBiaW5kaW5nLmdldFJlc29sdmVkUGF0aCgpIDogYmluZGluZy5nZXRQYXRoKCk7XG5cdFx0cmV0dXJuIGJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikgJiYgYmluZGluZ1BhdGggPT09IHBhcmVudENvbGxlY3Rpb25QYXRoO1xuXHR9KSBhcyBPRGF0YUxpc3RCaW5kaW5nIHwgdW5kZWZpbmVkO1xuXHQvLyBXZSd2ZSBmb3VuZCBhIGxpc3QgYmluZGluZyB0aGF0IGNvdWxkIGNvbnRhaW4gdGhlIHRhcmdldCBjb250ZXh0IC0tPiBsb29rIGZvciBpdFxuXHR0YXJnZXRDb250ZXh0ID0gcGFyZW50TGlzdEJpbmRpbmc/LmdldEFsbEN1cnJlbnRDb250ZXh0cygpLmZpbmQoKGNvbnRleHQpID0+IHtcblx0XHRyZXR1cm4gdGFyZ2V0UGF0aHMuaW5kZXhPZihjb250ZXh0LmdldFBhdGgoKSkgPj0gMDtcblx0fSk7XG5cblx0cmV0dXJuIHRhcmdldENvbnRleHQ7XG59XG5cbmZ1bmN0aW9uIG5hdmlnYXRlKHBhdGg6IHN0cmluZywgdmlldzogVmlldykge1xuXHQvLyBUT0RPOiByb3V0aW5nLm5hdmlnYXRlIGRvZXNuJ3QgY29uc2lkZXIgc2VtYW50aWMgYm9va21hcmtpbmdcblx0Y29uc3QgY3VycmVudFBhZ2UgPSBnZXRDdXJyZW50UGFnZSh2aWV3KTtcblx0Y29uc3QgdGFyZ2V0Q29udGV4dCA9IHZpZXcuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChwYXRoKS5nZXRCb3VuZENvbnRleHQoKTtcblx0Y3VycmVudFBhZ2UuZ2V0Q29udHJvbGxlcigpLnJvdXRpbmcubmF2aWdhdGUodGFyZ2V0Q29udGV4dCk7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRQYWdlKHZpZXc6IFZpZXcpIHtcblx0Y29uc3QgYXBwQ29tcG9uZW50ID0gQ29sbGFib3JhdGlvblV0aWxzLmdldEFwcENvbXBvbmVudCh2aWV3KTtcblx0cmV0dXJuIENvbW1vblV0aWxzLmdldEN1cnJlbnRQYWdlVmlldyhhcHBDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBnZXRBY3Rpdml0eUtleSh4OiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4geC5zdWJzdHJpbmcoeC5sYXN0SW5kZXhPZihcIihcIikgKyAxLCB4Lmxhc3RJbmRleE9mKFwiKVwiKSk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbWV0YXBhdGggZnJvbSBvbmUgb3IgbW9yZSBkYXRhIHBhdGgocykuXG4gKlxuICogQHBhcmFtIHZpZXcgVGhlIGN1cnJlbnQgdmlld1xuICogQHBhcmFtIHBhdGggT25lIG9yZSBtb3JlIGRhdGEgcGF0aChzKSwgaW4gY2FzZSBvZiBtdWx0aXBsZSBwYXRocyBzZXBhcmF0ZWQgYnkgJ3wnXG4gKiBAcmV0dXJucyBUaGUgY2FsY3VsYXRlZCBtZXRhUGF0aFxuICovXG5mdW5jdGlvbiBjYWxjdWxhdGVNZXRhUGF0aCh2aWV3OiBWaWV3LCBwYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcblx0bGV0IG1ldGFQYXRoID0gXCJcIjtcblx0aWYgKHBhdGgpIHtcblx0XHQvLyBpbiBjYXNlIG1vcmUgdGhhbiBvbmUgcGF0aCBpcyBzZW50IGFsbCBvZiB0aGVtIGhhdmUgdG8gdXNlIHRoZSBzYW1lIG1ldGFwYXRoIHRoZXJlZm9yZSB3ZSBqdXN0IGNvbnNpZGVyIHRoZSBmaXJzdCBvbmVcblx0XHRjb25zdCBkYXRhUGF0aCA9IHBhdGguc3BsaXQoXCJ8XCIpWzBdO1xuXHRcdG1ldGFQYXRoID0gKHZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCkuZ2V0TWV0YVBhdGgoZGF0YVBhdGgpO1xuXHR9XG5cdHJldHVybiBtZXRhUGF0aDtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuXHRjb25uZWN0OiBjb25uZWN0LFxuXHRkaXNjb25uZWN0OiBkaXNjb25uZWN0LFxuXHRpc0Nvbm5lY3RlZDogaXNDb25uZWN0ZWQsXG5cdGlzQ29sbGFib3JhdGlvbkVuYWJsZWQ6IGlzQ29sbGFib3JhdGlvbkVuYWJsZWQsXG5cdHNlbmQ6IHNlbmRcbn07XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7O0VBdUJBLE1BQU1BLFVBQVUsR0FBRywyQkFBMkI7RUFDOUMsTUFBTUMsV0FBVyxHQUFHLDRCQUE0QjtFQUNoRCxNQUFNQyxVQUFVLEdBQUcsMkJBQTJCO0VBQzlDLE1BQU1DLFdBQVcsR0FBRyxZQUFZO0VBRXpCLE1BQU1DLFdBQVcsR0FBRyxVQUFVQyxPQUFnQixFQUFXO0lBQy9ELE1BQU1DLGFBQWEsR0FBR0QsT0FBTyxDQUFDRSxRQUFRLENBQUMsVUFBVSxDQUFjO0lBQy9ELE9BQU9DLHdCQUF3QixDQUFDRixhQUFhLENBQUM7RUFDL0MsQ0FBQztFQUFDO0VBRUssTUFBTUcsSUFBSSxHQUFHLFVBQ25CSixPQUFnQixFQUNoQkssTUFBZ0IsRUFDaEJDLE9BQXNDLEVBQ3RDQyxtQkFBNEIsRUFDNUJDLGtCQUE0QixFQUM1QkMseUJBQW9DLEVBQ25DO0lBQ0QsSUFBSVYsV0FBVyxDQUFDQyxPQUFPLENBQUMsRUFBRTtNQUN6QixNQUFNQyxhQUFhLEdBQUdELE9BQU8sQ0FBQ0UsUUFBUSxDQUFDLFVBQVUsQ0FBYztNQUMvRCxNQUFNUSxhQUFhLEdBQUdDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDTixPQUFPLENBQUMsR0FBR0EsT0FBTyxDQUFDTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUdQLE9BQU87TUFDMUUsTUFBTVEsbUJBQW1CLEdBQUdMLHlCQUF5QixhQUF6QkEseUJBQXlCLHVCQUF6QkEseUJBQXlCLENBQUVJLElBQUksQ0FBQyxHQUFHLENBQUM7TUFDaEUsTUFBTUUsVUFBVSxHQUFHZCxhQUFhLENBQUNlLFdBQVcsQ0FBQ3JCLFVBQVUsQ0FB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
|