@sapui5/sap.fe.core 1.112.0 → 1.114.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 +70 -6
- 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 +118 -3
- package/src/sap/fe/core/AppComponent-dbg.js +16 -6
- 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 +21 -7
- package/src/sap/fe/core/AppStateHandler-dbg.js +11 -10
- 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 +14 -11
- package/src/sap/fe/core/CommonUtils-dbg.js +102 -175
- 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 +114 -211
- package/src/sap/fe/core/ExtensionAPI-dbg.js +3 -1
- package/src/sap/fe/core/ExtensionAPI.js.map +1 -1
- package/src/sap/fe/core/ExtensionAPI.ts +2 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase-dbg.js +2 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport-dbg.js +2 -2
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.ts +13 -18
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor-dbg.js +32 -24
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js +4 -4
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.ts +41 -29
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock-dbg.js +2 -2
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js +1 -1
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlock.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment-dbg.js +2 -2
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js +1 -1
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.ts +3 -1
- package/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +124 -57
- 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 +146 -73
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +35 -74
- 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 +35 -78
- package/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +217 -127
- 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 +227 -129
- package/src/sap/fe/core/controllerextensions/PageReady-dbg.js +3 -5
- package/src/sap/fe/core/controllerextensions/PageReady.js +1 -1
- package/src/sap/fe/core/controllerextensions/PageReady.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/PageReady.ts +2 -4
- package/src/sap/fe/core/controllerextensions/Share-dbg.js +3 -2
- package/src/sap/fe/core/controllerextensions/Share.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/Share.ts +2 -1
- package/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +19 -14
- 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 +22 -14
- package/src/sap/fe/core/controllerextensions/ViewState-dbg.js +41 -24
- 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 +64 -31
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync-dbg.js +8 -8
- 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 +7 -9
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon-dbg.js +7 -45
- 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 +5 -48
- package/src/sap/fe/core/controllerextensions/collaboration/Manage-dbg.js +4 -4
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.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 -2
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +3 -3
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialogTemplating-dbg.js +52 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialogTemplating.js +6 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialogTemplating.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialogTemplating.ts +46 -0
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog-dbg.js +103 -0
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +6 -0
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +124 -0
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +106 -205
- 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 +121 -216
- package/src/sap/fe/core/controllerextensions/editFlow/draft-dbg.js +31 -4
- 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 +38 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup-dbg.js +13 -10
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +7 -20
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal-dbg.js +9 -4
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/_internal.ts +12 -3
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade-dbg.js +10 -6
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +20 -11
- package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +1 -8
- 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 +0 -9
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +19 -15
- 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 +19 -22
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy-dbg.js +67 -1
- 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 +68 -0
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -0
- package/src/sap/fe/core/controls/CommandExecution-dbg.js +4 -9
- 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 +0 -8
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block-dbg.js +335 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +6 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js.map +1 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +336 -0
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +3 -28
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js.map +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +8 -29
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils-dbg.js +30 -1
- 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 +38 -0
- package/src/sap/fe/core/converters/ConverterContext-dbg.js +3 -5
- package/src/sap/fe/core/converters/ConverterContext.js +1 -1
- package/src/sap/fe/core/converters/ConverterContext.js.map +1 -1
- package/src/sap/fe/core/converters/ConverterContext.ts +2 -5
- package/src/sap/fe/core/converters/ManifestSettings-dbg.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +7 -6
- package/src/sap/fe/core/converters/ManifestWrapper-dbg.js +5 -3
- 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 +7 -1
- package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +49 -28
- 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 +62 -30
- package/src/sap/fe/core/converters/TemplateConverter-dbg.js +2 -3
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.js.map +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +1 -6
- package/src/sap/fe/core/converters/annotations/DataField-dbg.js +22 -7
- 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 +20 -7
- package/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +701 -681
- 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 +6 -12
- 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 +9 -14
- package/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +32 -20
- 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 +30 -18
- package/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +4 -5
- 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 +6 -37
- package/src/sap/fe/core/converters/controls/Common/Form-dbg.js +7 -6
- package/src/sap/fe/core/converters/controls/Common/Form.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/Form.js.map +1 -1
- package/src/sap/fe/core/converters/controls/Common/Form.ts +5 -11
- package/src/sap/fe/core/converters/controls/Common/KPI-dbg.js +5 -5
- 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 +3 -4
- package/src/sap/fe/core/converters/controls/Common/Table-dbg.js +135 -85
- 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 +189 -119
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +56 -22
- 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 +67 -31
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +137 -49
- 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 +166 -43
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters-dbg.js +33 -14
- 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 +31 -12
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection-dbg.js +27 -18
- 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 +36 -23
- package/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +37 -15
- package/src/sap/fe/core/converters/helpers/Aggregation.js +1 -1
- package/src/sap/fe/core/converters/helpers/Aggregation.js.map +1 -1
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +36 -20
- package/src/sap/fe/core/converters/helpers/BindingHelper-dbg.js +8 -6
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/BindingHelper.js.map +1 -1
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +8 -6
- package/src/sap/fe/core/converters/helpers/InsightsHelpers-dbg.js +39 -0
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +6 -0
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js.map +1 -0
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +45 -0
- package/src/sap/fe/core/converters/helpers/IssueManager-dbg.js +3 -2
- 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 +2 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction-dbg.js +17 -16
- 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 +11 -11
- package/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +20 -17
- 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 +25 -56
- package/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +13 -13
- 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 +18 -13
- package/src/sap/fe/core/formatters/CollaborationFormatter-dbg.js +17 -33
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +1 -1
- package/src/sap/fe/core/formatters/CollaborationFormatter.js.map +1 -1
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +27 -22
- package/src/sap/fe/core/formatters/TableFormatter-dbg.js +2 -6
- 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 -5
- package/src/sap/fe/core/formatters/ValueFormatter-dbg.js +13 -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 +19 -9
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +2 -1
- package/src/sap/fe/core/helpers/BindingToolkit.js +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.js.map +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.ts +1 -1
- package/src/sap/fe/core/helpers/DeleteHelper-dbg.js +58 -35
- 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 +76 -54
- package/src/sap/fe/core/helpers/MassEditHelper-dbg.js +8 -4
- 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 +7 -5
- package/src/sap/fe/core/helpers/MessageStrip-dbg.js +6 -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 +167 -4
- package/src/sap/fe/core/helpers/MetaModelFunction.js +1 -1
- package/src/sap/fe/core/helpers/MetaModelFunction.js.map +1 -1
- package/src/sap/fe/core/helpers/MetaModelFunction.ts +205 -3
- package/src/sap/fe/core/helpers/ModelHelper-dbg.js +37 -73
- package/src/sap/fe/core/helpers/ModelHelper.js +1 -1
- package/src/sap/fe/core/helpers/ModelHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/ModelHelper.ts +41 -68
- package/src/sap/fe/core/helpers/RecommendationHelper-dbg.js +71 -0
- package/src/sap/fe/core/helpers/RecommendationHelper.js +6 -0
- package/src/sap/fe/core/helpers/RecommendationHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/RecommendationHelper.ts +94 -0
- package/src/sap/fe/core/helpers/ResourceModelHelper-dbg.js +19 -3
- package/src/sap/fe/core/helpers/ResourceModelHelper.js +1 -1
- package/src/sap/fe/core/helpers/ResourceModelHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/ResourceModelHelper.ts +21 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators-dbg.js +40 -6
- 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 +39 -5
- package/src/sap/fe/core/helpers/SizeHelper-dbg.js +53 -0
- package/src/sap/fe/core/helpers/SizeHelper.js +6 -0
- package/src/sap/fe/core/helpers/SizeHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/SizeHelper.ts +51 -0
- package/src/sap/fe/core/helpers/StableIdHelper-dbg.js +52 -26
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.js.map +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.ts +49 -25
- package/src/sap/fe/core/helpers/TypeGuards-dbg.js +147 -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 +151 -1
- package/src/sap/fe/core/jsx-runtime/jsx-control-dbg.js +25 -2
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx-control.js.map +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +24 -0
- package/src/sap/fe/core/jsx-runtime/jsx-dbg.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -0
- package/src/sap/fe/core/library-dbg.js +1 -1
- package/src/sap/fe/core/library-preload.js +123 -95
- 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/manifest.json +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration-dbg.js +67 -15
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js.map +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -14
- package/src/sap/fe/core/messagebundle.properties +6 -6
- package/src/sap/fe/core/messagebundle_ar.properties +5 -6
- package/src/sap/fe/core/messagebundle_bg.properties +11 -12
- package/src/sap/fe/core/messagebundle_ca.properties +3 -4
- package/src/sap/fe/core/messagebundle_cs.properties +3 -4
- package/src/sap/fe/core/messagebundle_cy.properties +3 -4
- package/src/sap/fe/core/messagebundle_da.properties +3 -4
- package/src/sap/fe/core/messagebundle_de.properties +11 -12
- package/src/sap/fe/core/messagebundle_el.properties +5 -6
- package/src/sap/fe/core/messagebundle_en.properties +3 -4
- package/src/sap/fe/core/messagebundle_en_GB.properties +4 -5
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +3 -4
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +3 -4
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +3 -2
- package/src/sap/fe/core/messagebundle_es.properties +3 -4
- package/src/sap/fe/core/messagebundle_es_MX.properties +3 -4
- package/src/sap/fe/core/messagebundle_et.properties +3 -4
- package/src/sap/fe/core/messagebundle_fi.properties +3 -4
- package/src/sap/fe/core/messagebundle_fr.properties +3 -4
- package/src/sap/fe/core/messagebundle_fr_CA.properties +11 -12
- package/src/sap/fe/core/messagebundle_hi.properties +11 -12
- package/src/sap/fe/core/messagebundle_hr.properties +3 -4
- package/src/sap/fe/core/messagebundle_hu.properties +3 -4
- package/src/sap/fe/core/messagebundle_id.properties +11 -12
- package/src/sap/fe/core/messagebundle_it.properties +3 -4
- package/src/sap/fe/core/messagebundle_iw.properties +3 -4
- package/src/sap/fe/core/messagebundle_ja.properties +4 -5
- package/src/sap/fe/core/messagebundle_kk.properties +3 -4
- package/src/sap/fe/core/messagebundle_ko.properties +11 -12
- package/src/sap/fe/core/messagebundle_lt.properties +3 -4
- package/src/sap/fe/core/messagebundle_lv.properties +11 -12
- package/src/sap/fe/core/messagebundle_ms.properties +3 -4
- package/src/sap/fe/core/messagebundle_nl.properties +3 -4
- package/src/sap/fe/core/messagebundle_no.properties +3 -4
- package/src/sap/fe/core/messagebundle_pl.properties +11 -12
- package/src/sap/fe/core/messagebundle_pt.properties +3 -4
- package/src/sap/fe/core/messagebundle_pt_PT.properties +3 -4
- package/src/sap/fe/core/messagebundle_ro.properties +14 -15
- package/src/sap/fe/core/messagebundle_ru.properties +11 -12
- package/src/sap/fe/core/messagebundle_sh.properties +3 -4
- package/src/sap/fe/core/messagebundle_sk.properties +3 -4
- package/src/sap/fe/core/messagebundle_sl.properties +3 -4
- package/src/sap/fe/core/messagebundle_sv.properties +11 -12
- package/src/sap/fe/core/messagebundle_th.properties +3 -4
- package/src/sap/fe/core/messagebundle_tr.properties +3 -4
- package/src/sap/fe/core/messagebundle_uk.properties +3 -4
- package/src/sap/fe/core/messagebundle_vi.properties +3 -4
- package/src/sap/fe/core/messagebundle_zh_CN.properties +11 -12
- package/src/sap/fe/core/messagebundle_zh_TW.properties +11 -12
- package/src/sap/fe/core/rootView/RootViewBaseController-dbg.js +22 -8
- 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 +17 -7
- package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +36 -3
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +37 -1
- package/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +13 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +13 -0
- package/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +7 -1
- 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 +20 -2
- package/src/sap/fe/core/services/ShellServicesFactory-dbg.js +7 -1
- package/src/sap/fe/core/services/ShellServicesFactory.js +1 -1
- package/src/sap/fe/core/services/ShellServicesFactory.js.map +1 -1
- package/src/sap/fe/core/services/ShellServicesFactory.ts +10 -0
- package/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +10 -7
- 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 +12 -13
- package/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +9 -3
- 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 +11 -15
- package/src/sap/fe/core/templating/CommonFormatters-dbg.js +4 -3
- package/src/sap/fe/core/templating/CommonFormatters.js +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.js.map +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.ts +2 -2
- package/src/sap/fe/core/templating/CriticalityFormatters-dbg.js +1 -1
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +2 -2
- package/src/sap/fe/core/templating/DataModelPathHelper-dbg.js +19 -18
- 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 +24 -18
- package/src/sap/fe/core/templating/DisplayModeFormatter-dbg.js +5 -5
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.js.map +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -2
- package/src/sap/fe/core/templating/EntitySetHelper-dbg.js +19 -28
- 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 +14 -24
- package/src/sap/fe/core/templating/EntityTypeHelper-dbg.js +48 -0
- package/src/sap/fe/core/templating/EntityTypeHelper.js +6 -0
- package/src/sap/fe/core/templating/EntityTypeHelper.js.map +1 -0
- package/src/sap/fe/core/templating/EntityTypeHelper.ts +37 -0
- package/src/sap/fe/core/templating/FilterHelper-dbg.js +12 -1
- 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 +12 -0
- package/src/sap/fe/core/templating/FilterTemplating-dbg.js +7 -8
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.js.map +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.ts +5 -8
- package/src/sap/fe/core/templating/PropertyFormatters-dbg.js +1 -6
- package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
- package/src/sap/fe/core/templating/PropertyFormatters.js.map +1 -1
- package/src/sap/fe/core/templating/PropertyFormatters.ts +0 -5
- package/src/sap/fe/core/templating/PropertyHelper-dbg.js +13 -46
- package/src/sap/fe/core/templating/PropertyHelper.js +1 -1
- package/src/sap/fe/core/templating/PropertyHelper.js.map +1 -1
- package/src/sap/fe/core/templating/PropertyHelper.ts +14 -43
- package/src/sap/fe/core/templating/UIFormatters-dbg.js +32 -26
- package/src/sap/fe/core/templating/UIFormatters.js +1 -1
- package/src/sap/fe/core/templating/UIFormatters.js.map +1 -1
- package/src/sap/fe/core/templating/UIFormatters.ts +45 -34
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +0 -91
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +0 -59
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler-dbg.js +0 -171
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +0 -6
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js.map +0 -1
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +0 -184
|
@@ -2,10 +2,10 @@
|
|
|
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/BusyLocker", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/collaboration/CollaborationCommon", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/controllerextensions/editFlow/TransactionHelper", "sap/fe/core/controllerextensions/Feedback", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/MetaModelFunction", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/helpers/SemanticKeyHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/Text", "sap/ui/core/Core", "sap/ui/core/library", "sap/ui/core/message/Message", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/ui/model/odata/v4/ODataListBinding", "../ActionRuntime"], function (Log, CommonUtils, BusyLocker, ActivitySync, CollaborationCommon, draft, sticky, TransactionHelper, Feedback, MetaModelConverter, ClassSupport, EditState, MetaModelFunction, ModelHelper, ResourceModelHelper, SemanticKeyHelper, FELibrary, Button, Dialog, Text, Core, coreLibrary, Message, ControllerExtension, OverrideExecution, ODataListBinding, ActionRuntime) {
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/collaboration/CollaborationCommon", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/controllerextensions/editFlow/TransactionHelper", "sap/fe/core/controllerextensions/Feedback", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/EditState", "sap/fe/core/helpers/MetaModelFunction", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/ResourceModelHelper", "sap/fe/core/helpers/SemanticKeyHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageToast", "sap/m/Text", "sap/ui/core/Core", "sap/ui/core/library", "sap/ui/core/message/Message", "sap/ui/core/mvc/ControllerExtension", "sap/ui/core/mvc/OverrideExecution", "sap/ui/model/odata/v4/ODataListBinding", "../ActionRuntime"], function (Log, CommonUtils, BusyLocker, ActivitySync, CollaborationCommon, draft, sticky, TransactionHelper, Feedback, MetaModelConverter, ClassSupport, EditState, MetaModelFunction, ModelHelper, ResourceModelHelper, SemanticKeyHelper, FELibrary, Button, Dialog, MessageToast, Text, Core, coreLibrary, Message, ControllerExtension, OverrideExecution, ODataListBinding, ActionRuntime) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _class, _class2;
|
|
8
|
+
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _dec27, _dec28, _dec29, _dec30, _dec31, _class, _class2;
|
|
9
9
|
var getResourceModel = ResourceModelHelper.getResourceModel;
|
|
10
10
|
var getNonComputedVisibleFields = MetaModelFunction.getNonComputedVisibleFields;
|
|
11
11
|
var publicExtension = ClassSupport.publicExtension;
|
|
@@ -37,7 +37,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
37
37
|
* @public
|
|
38
38
|
* @since 1.90.0
|
|
39
39
|
*/
|
|
40
|
-
let EditFlow = (_dec = defineUI5Class("sap.fe.core.controllerextensions.EditFlow"), _dec2 = publicExtension(), _dec3 = finalExtension(), _dec4 = publicExtension(), _dec5 = finalExtension(), _dec6 = publicExtension(), _dec7 = finalExtension(), _dec8 = publicExtension(), _dec9 = extensible(OverrideExecution.After), _dec10 = publicExtension(), _dec11 = extensible(OverrideExecution.After), _dec12 = publicExtension(), _dec13 = extensible(OverrideExecution.After), _dec14 = publicExtension(), _dec15 = extensible(OverrideExecution.After), _dec16 = publicExtension(), _dec17 = extensible(OverrideExecution.After), _dec18 = publicExtension(), _dec19 = finalExtension(), _dec20 = publicExtension(), _dec21 = finalExtension(), _dec22 = publicExtension(), _dec23 = finalExtension(), _dec24 = publicExtension(), _dec25 = finalExtension(), _dec26 = publicExtension(), _dec27 = finalExtension(), _dec28 = publicExtension(), _dec29 = finalExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
|
|
40
|
+
let EditFlow = (_dec = defineUI5Class("sap.fe.core.controllerextensions.EditFlow"), _dec2 = publicExtension(), _dec3 = finalExtension(), _dec4 = publicExtension(), _dec5 = finalExtension(), _dec6 = publicExtension(), _dec7 = finalExtension(), _dec8 = publicExtension(), _dec9 = extensible(OverrideExecution.After), _dec10 = publicExtension(), _dec11 = extensible(OverrideExecution.After), _dec12 = publicExtension(), _dec13 = extensible(OverrideExecution.After), _dec14 = publicExtension(), _dec15 = extensible(OverrideExecution.After), _dec16 = publicExtension(), _dec17 = extensible(OverrideExecution.After), _dec18 = publicExtension(), _dec19 = finalExtension(), _dec20 = publicExtension(), _dec21 = finalExtension(), _dec22 = publicExtension(), _dec23 = finalExtension(), _dec24 = publicExtension(), _dec25 = finalExtension(), _dec26 = publicExtension(), _dec27 = finalExtension(), _dec28 = publicExtension(), _dec29 = extensible(OverrideExecution.After), _dec30 = publicExtension(), _dec31 = finalExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
|
|
41
41
|
_inheritsLoose(EditFlow, _ControllerExtension);
|
|
42
42
|
function EditFlow() {
|
|
43
43
|
var _this;
|
|
@@ -78,14 +78,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
78
78
|
const oView = this.getView();
|
|
79
79
|
try {
|
|
80
80
|
if ((oViewData === null || oViewData === void 0 ? void 0 : oViewData.viewLevel) > 1) {
|
|
81
|
-
if (sProgrammingModel === ProgrammingModel.Draft) {
|
|
82
|
-
|
|
83
|
-
oRootContext = oView.getModel().bindContext(draftRootPath).getBoundContext();
|
|
84
|
-
await oRootContext.requestObject(draftRootPath);
|
|
85
|
-
} else if (sProgrammingModel === ProgrammingModel.Sticky) {
|
|
86
|
-
const sStickyRootPath = ModelHelper.getStickyRootPath(oContext);
|
|
87
|
-
oRootContext = oView.getModel().bindContext(sStickyRootPath).getBoundContext();
|
|
88
|
-
await oRootContext.requestObject(sStickyRootPath);
|
|
81
|
+
if (sProgrammingModel === ProgrammingModel.Draft || sProgrammingModel === ProgrammingModel.Sticky) {
|
|
82
|
+
oRootContext = await CommonUtils.createRootContext(sProgrammingModel, oView, this.getAppComponent());
|
|
89
83
|
}
|
|
90
84
|
}
|
|
91
85
|
await this.base.editFlow.onBeforeEdit({
|
|
@@ -108,7 +102,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
108
102
|
contextToNavigate = siblingInfo.targetContext;
|
|
109
103
|
}
|
|
110
104
|
} else if ((oViewData === null || oViewData === void 0 ? void 0 : oViewData.viewLevel) > 1) {
|
|
111
|
-
|
|
105
|
+
const rootSiblingPath = oNewDocumentContext === null || oNewDocumentContext === void 0 ? void 0 : oNewDocumentContext.getPath();
|
|
106
|
+
const rootContextInfo = {
|
|
107
|
+
rootSiblingPath: rootSiblingPath,
|
|
108
|
+
rootContextNotRequired: true
|
|
109
|
+
};
|
|
110
|
+
siblingInfo = await this._computeSiblingInformation(oRootContext, oContext, sProgrammingModel, true, rootContextInfo);
|
|
112
111
|
contextToNavigate = this._getNavigationTargetForEdit(oContext, oNewDocumentContext, siblingInfo);
|
|
113
112
|
}
|
|
114
113
|
await this._handleNewContext(contextToNavigate, true, false, bDraftNavigation, true);
|
|
@@ -137,16 +136,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
137
136
|
/**
|
|
138
137
|
* Deletes several documents.
|
|
139
138
|
*
|
|
140
|
-
* @param contextsToDelete The contexts of the documents to
|
|
139
|
+
* @param contextsToDelete The contexts of the documents to be deleted
|
|
141
140
|
* @param parameters The parameters
|
|
142
141
|
* @returns Promise resolved once the documents are deleted
|
|
143
142
|
*/;
|
|
144
143
|
_proto.deleteMultipleDocuments = async function deleteMultipleDocuments(contextsToDelete, parameters) {
|
|
145
144
|
if (parameters) {
|
|
146
145
|
parameters.beforeDeleteCallBack = this.base.editFlow.onBeforeDelete;
|
|
146
|
+
parameters.requestSideEffects = parameters.requestSideEffects !== false;
|
|
147
147
|
} else {
|
|
148
148
|
parameters = {
|
|
149
|
-
beforeDeleteCallBack: this.base.editFlow.onBeforeDelete
|
|
149
|
+
beforeDeleteCallBack: this.base.editFlow.onBeforeDelete,
|
|
150
|
+
requestSideEffects: true
|
|
150
151
|
};
|
|
151
152
|
}
|
|
152
153
|
const lockObject = this.getGlobalUIModel();
|
|
@@ -183,7 +184,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
183
184
|
// if there are transient contexts, we must avoid requesting side effects
|
|
184
185
|
// this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
|
|
185
186
|
// if list binding is refreshed, transient contexts might be lost
|
|
186
|
-
if (!CommonUtils.hasTransientContext(listBinding)) {
|
|
187
|
+
if (parameters.requestSideEffects && !CommonUtils.hasTransientContext(listBinding)) {
|
|
187
188
|
this.getAppComponent().getSideEffectsService().requestSideEffectsForNavigationProperty(listBinding.getPath(), viewBindingContext);
|
|
188
189
|
}
|
|
189
190
|
}
|
|
@@ -277,6 +278,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
277
278
|
* NewPage - the created document is shown in a new page, depending on whether metadata 'Sync', 'Async' or 'Deferred' is used
|
|
278
279
|
* Inline - The creation is done inline (in a table)
|
|
279
280
|
* External - The creation is done in a different application specified via the parameter 'outbound'
|
|
281
|
+
* @param mInParameters.tableId ID of the table
|
|
280
282
|
* @param mInParameters.outbound The navigation target where the document is created in case of creationMode 'External'
|
|
281
283
|
* @param mInParameters.createAtEnd Specifies if the new entry should be created at the top or bottom of a table in case of creationMode 'Inline'
|
|
282
284
|
* @returns Promise resolves once the object has been created
|
|
@@ -285,10 +287,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
285
287
|
* @since 1.90.0
|
|
286
288
|
*/;
|
|
287
289
|
_proto.createDocument = async function createDocument(vListBinding, mInParameters) {
|
|
290
|
+
var _oCreation;
|
|
288
291
|
const transactionHelper = this.getTransactionHelper(),
|
|
289
292
|
oLockObject = this.getGlobalUIModel();
|
|
290
293
|
let oTable; //should be Table but there are missing methods into the def
|
|
291
294
|
let mParameters = mInParameters;
|
|
295
|
+
let oCreation;
|
|
292
296
|
const bShouldBusyLock = !mParameters || mParameters.creationMode !== CreationMode.Inline && mParameters.creationMode !== CreationMode.CreationRow && mParameters.creationMode !== CreationMode.External;
|
|
293
297
|
let oExecCustomValidation = Promise.resolve([]);
|
|
294
298
|
const oAppComponent = this.getAppComponent();
|
|
@@ -322,7 +326,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
322
326
|
}
|
|
323
327
|
if (oTable && oTable.isA("sap.ui.mdc.Table")) {
|
|
324
328
|
const fnFocusOrScroll = mParameters.creationMode === CreationMode.Inline ? oTable.focusRow.bind(oTable) : oTable.scrollToIndex.bind(oTable);
|
|
325
|
-
oTable.getRowBinding().attachEventOnce("change", function () {
|
|
329
|
+
oTable.getRowBinding().attachEventOnce("change", async function () {
|
|
330
|
+
await oCreation;
|
|
326
331
|
fnFocusOrScroll(mParameters.createAtEnd ? oTable.getRowBinding().getLength() : 0, true);
|
|
327
332
|
});
|
|
328
333
|
}
|
|
@@ -457,7 +462,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
457
462
|
const oModel = oListBinding.getModel();
|
|
458
463
|
const sProgrammingModel = this.getProgrammingModel(oListBinding);
|
|
459
464
|
const resolvedCreationMode = resolveCreationMode(mParameters.creationMode, sProgrammingModel, oListBinding, oModel.getMetaModel());
|
|
460
|
-
let oCreation;
|
|
461
465
|
let mArgs;
|
|
462
466
|
const oCreationRow = mParameters.creationRow;
|
|
463
467
|
let oCreationRowContext;
|
|
@@ -532,7 +536,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
532
536
|
if (sProgrammingModel == ProgrammingModel.Sticky || mParameters.createAction) {
|
|
533
537
|
mArgs.transient = true;
|
|
534
538
|
}
|
|
535
|
-
oNavigation = oCreation.then(function (oNewDocumentContext) {
|
|
539
|
+
oNavigation = (_oCreation = oCreation) === null || _oCreation === void 0 ? void 0 : _oCreation.then(function (oNewDocumentContext) {
|
|
536
540
|
if (!oNewDocumentContext) {
|
|
537
541
|
const coreResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
|
|
538
542
|
return oRoutingListener.navigateToMessagePage(coreResourceBundle.getText("C_COMMON_SAPFE_DATA_RECEIVED_ERROR"), {
|
|
@@ -635,17 +639,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
635
639
|
*
|
|
636
640
|
* @param listBinding The listBinding used to create the documents
|
|
637
641
|
* @param dataForCreate The initial data for the new documents
|
|
638
|
-
* @param createAtEnd True if the new contexts need to be
|
|
642
|
+
* @param createAtEnd True if the new contexts need to be created at the end of the list binding
|
|
639
643
|
* @param isFromCopyPaste True if the creation has been triggered by a paste action
|
|
640
644
|
* @param beforeCreateCallBack Callback to be called before the creation
|
|
641
|
-
* @param createAsInactive True if the contexts need to be created inactive
|
|
645
|
+
* @param createAsInactive True if the contexts need to be created as inactive
|
|
646
|
+
* @param requestSideEffects True by default, false if SideEffects should not be requested
|
|
642
647
|
* @returns A Promise with the newly created contexts.
|
|
643
648
|
*/;
|
|
644
649
|
_proto.createMultipleDocuments = async function createMultipleDocuments(listBinding, dataForCreate, createAtEnd, isFromCopyPaste, beforeCreateCallBack) {
|
|
645
650
|
let createAsInactive = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
|
|
651
|
+
let requestSideEffects = arguments.length > 6 ? arguments[6] : undefined;
|
|
646
652
|
const transactionHelper = this.getTransactionHelper();
|
|
647
653
|
const lockObject = this.getGlobalUIModel();
|
|
648
654
|
const targetListBinding = listBinding;
|
|
655
|
+
requestSideEffects = requestSideEffects !== false;
|
|
649
656
|
BusyLocker.lock(lockObject);
|
|
650
657
|
try {
|
|
651
658
|
await this.syncTask();
|
|
@@ -699,7 +706,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
699
706
|
// if there are transient contexts, we must avoid requesting side effects
|
|
700
707
|
// this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
|
|
701
708
|
// if list binding is refreshed, transient contexts might be lost
|
|
702
|
-
if (!CommonUtils.hasTransientContext(targetListBinding)) {
|
|
709
|
+
if (requestSideEffects && !CommonUtils.hasTransientContext(targetListBinding)) {
|
|
703
710
|
this.getAppComponent().getSideEffectsService().requestSideEffectsForNavigationProperty(targetListBinding.getPath(), viewBindingContext);
|
|
704
711
|
}
|
|
705
712
|
return createdContexts;
|
|
@@ -906,7 +913,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
906
913
|
try {
|
|
907
914
|
const oRootViewController = this._getRootViewController();
|
|
908
915
|
const oRightmostContext = oRootViewController.isFclEnabled() ? oRootViewController.getRightmostContext() : oContext;
|
|
909
|
-
|
|
916
|
+
let siblingInfo = await this._computeSiblingInformation(oContext, oRightmostContext, ProgrammingModel.Draft, false);
|
|
917
|
+
if (!siblingInfo && oContext !== oRightmostContext) {
|
|
918
|
+
// Try to compute sibling info for the root context if it fails for the rightmost context
|
|
919
|
+
// --> In case of FCL, if we try to switch between draft and active but a child entity has no sibling, the switch will close the child column
|
|
920
|
+
siblingInfo = await this._computeSiblingInformation(oContext, oContext, ProgrammingModel.Draft, false);
|
|
921
|
+
}
|
|
910
922
|
if (siblingInfo) {
|
|
911
923
|
this.setEditMode(bEditable ? EditMode.Editable : EditMode.Display, false); //switch to edit mode only if a draft is available
|
|
912
924
|
|
|
@@ -951,6 +963,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
951
963
|
const transactionHelper = this.getTransactionHelper();
|
|
952
964
|
const mInParameters = mParameters;
|
|
953
965
|
let siblingInfo;
|
|
966
|
+
let isNewDocument = false;
|
|
954
967
|
mInParameters.cancelButton = mParameters.control || mInParameters.cancelButton;
|
|
955
968
|
mInParameters.beforeCancelCallBack = this.base.editFlow.onBeforeDiscard;
|
|
956
969
|
try {
|
|
@@ -963,6 +976,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
963
976
|
siblingInfo = await this._computeSiblingInformation(oContext, oRootViewController.getRightmostContext(), sProgrammingModel, true);
|
|
964
977
|
}
|
|
965
978
|
const cancelResult = await transactionHelper.cancelDocument(oContext, mInParameters, this.getAppComponent(), this._getResourceModel(), this.getMessageHandler(), this.getCreationMode(), this.isDocumentModified());
|
|
979
|
+
this._getRootViewController().getInstancedViews().forEach(view => {
|
|
980
|
+
const context = view.getBindingContext();
|
|
981
|
+
if (context && context.isKeepAlive()) {
|
|
982
|
+
context.setKeepAlive(false);
|
|
983
|
+
}
|
|
984
|
+
});
|
|
966
985
|
const bDraftNavigation = true;
|
|
967
986
|
this._removeStickySessionInternalProperties(sProgrammingModel);
|
|
968
987
|
this.setEditMode(EditMode.Display, false);
|
|
@@ -977,6 +996,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
977
996
|
//in case of a new document, no activeContext is returned --> navigate back.
|
|
978
997
|
if (!mInParameters.skipBackNavigation) {
|
|
979
998
|
await this.getInternalRouting().navigateBackFromContext(oContext);
|
|
999
|
+
isNewDocument = true;
|
|
980
1000
|
}
|
|
981
1001
|
} else {
|
|
982
1002
|
const oActiveDocumentContext = cancelResult;
|
|
@@ -1007,11 +1027,41 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1007
1027
|
await this._handleNewContext(contextToNavigate, false, false, bDraftNavigation, true);
|
|
1008
1028
|
}
|
|
1009
1029
|
}
|
|
1030
|
+
if (sProgrammingModel === ProgrammingModel.Draft) {
|
|
1031
|
+
//show Draft discarded message toast only for draft enabled apps
|
|
1032
|
+
this.showDocumentDiscardMessage(isNewDocument);
|
|
1033
|
+
}
|
|
1010
1034
|
} catch (oError) {
|
|
1011
1035
|
Log.error("Error while discarding the document", oError);
|
|
1012
1036
|
}
|
|
1013
1037
|
}
|
|
1014
1038
|
|
|
1039
|
+
/**
|
|
1040
|
+
* Brings up a message toast when a draft is discarded.
|
|
1041
|
+
*
|
|
1042
|
+
* @param isNewDocument This is a Boolean flag that determines whether the document is new or already exists.
|
|
1043
|
+
*/;
|
|
1044
|
+
_proto.showDocumentDiscardMessage = function showDocumentDiscardMessage(isNewDocument) {
|
|
1045
|
+
const resourceModel = this._getResourceModel();
|
|
1046
|
+
const message = resourceModel.getText("C_TRANSACTION_HELPER_DISCARD_DRAFT_TOAST");
|
|
1047
|
+
if (isNewDocument == true) {
|
|
1048
|
+
const appComponent = this.getAppComponent();
|
|
1049
|
+
appComponent.getRoutingService().attachAfterRouteMatched(this.showMessageWhenNoContext, this);
|
|
1050
|
+
} else {
|
|
1051
|
+
MessageToast.show(message);
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
/**
|
|
1056
|
+
* We use this function in showDocumentDiscardMessage when no context is passed.
|
|
1057
|
+
*/;
|
|
1058
|
+
_proto.showMessageWhenNoContext = function showMessageWhenNoContext() {
|
|
1059
|
+
const resourceModel = this._getResourceModel();
|
|
1060
|
+
const message = resourceModel.getText("C_TRANSACTION_HELPER_DISCARD_DRAFT_TOAST");
|
|
1061
|
+
const appComponent = this.getAppComponent();
|
|
1062
|
+
MessageToast.show(message);
|
|
1063
|
+
appComponent.getRoutingService().detachAfterRouteMatched(this.showMessageWhenNoContext, this);
|
|
1064
|
+
}
|
|
1015
1065
|
/**
|
|
1016
1066
|
* Checks if a context corresponds to a draft root.
|
|
1017
1067
|
*
|
|
@@ -1107,10 +1157,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1107
1157
|
*/;
|
|
1108
1158
|
_proto.applyDocument = async function applyDocument(oContext) {
|
|
1109
1159
|
const oLockObject = this.getGlobalUIModel();
|
|
1110
|
-
BusyLocker.lock(oLockObject);
|
|
1111
1160
|
try {
|
|
1112
1161
|
await this.syncTask();
|
|
1113
|
-
|
|
1162
|
+
if (oContext.getModel().hasPendingChanges("$auto")) {
|
|
1163
|
+
BusyLocker.lock(oLockObject);
|
|
1164
|
+
await this._submitOpenChanges(oContext);
|
|
1165
|
+
}
|
|
1114
1166
|
await this._checkForValidationErrors();
|
|
1115
1167
|
await this.getMessageHandler().showMessageDialog();
|
|
1116
1168
|
await this.getInternalRouting().navigateBackFromContext(oContext);
|
|
@@ -1275,7 +1327,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1275
1327
|
return true;
|
|
1276
1328
|
});
|
|
1277
1329
|
};
|
|
1278
|
-
const oActionContext = Array.isArray(mParameters.contexts) ? _fnValidContexts(mParameters.contexts, mParameters.
|
|
1330
|
+
const oActionContext = Array.isArray(mParameters.contexts) ? _fnValidContexts(mParameters.contexts, mParameters.applicableContexts)[0] : mParameters.contexts;
|
|
1279
1331
|
const sActionContextMetaPath = oActionContext && oMetaModel.getMetaPath(oActionContext.getPath());
|
|
1280
1332
|
if (sContextMetaPath != undefined && sContextMetaPath === sActionContextMetaPath) {
|
|
1281
1333
|
if (oActionContext.getPath() !== vContext.getPath()) {
|
|
@@ -1289,6 +1341,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1289
1341
|
}
|
|
1290
1342
|
}
|
|
1291
1343
|
}
|
|
1344
|
+
this.base.editFlow.onAfterActionExecution(sActionName);
|
|
1292
1345
|
return oResponse;
|
|
1293
1346
|
} catch (err) {
|
|
1294
1347
|
if (oCurrentActionCallBacks) {
|
|
@@ -1309,6 +1362,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1309
1362
|
}
|
|
1310
1363
|
}
|
|
1311
1364
|
|
|
1365
|
+
/**
|
|
1366
|
+
* Hook which can be overridden after the action execution.
|
|
1367
|
+
*
|
|
1368
|
+
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
1369
|
+
* @param _actionName Name of the action
|
|
1370
|
+
* @alias sap.fe.core.controllerextensions.EditFlow#onAfterActionExecution
|
|
1371
|
+
* @private
|
|
1372
|
+
* @since 1.114.0
|
|
1373
|
+
*/;
|
|
1374
|
+
_proto.onAfterActionExecution = async function onAfterActionExecution(_actionName) {
|
|
1375
|
+
//to be overridden
|
|
1376
|
+
}
|
|
1377
|
+
|
|
1312
1378
|
/**
|
|
1313
1379
|
* Secured execution of the given function. Ensures that the function is only executed when certain conditions are fulfilled.
|
|
1314
1380
|
*
|
|
@@ -1322,7 +1388,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1322
1388
|
* @returns A promise that is rejected if the execution is prohibited and resolved by the promise returned by the fnFunction.
|
|
1323
1389
|
* @alias sap.fe.core.controllerextensions.EditFlow#securedExecution
|
|
1324
1390
|
* @public
|
|
1325
|
-
* @experimental As of version 1.90.0
|
|
1326
1391
|
* @since 1.90.0
|
|
1327
1392
|
*/;
|
|
1328
1393
|
_proto.securedExecution = function securedExecution(fnFunction, mParameters) {
|
|
@@ -1529,9 +1594,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1529
1594
|
parameters.internalModelContext = parameters.controlId ? (_sap$ui$getCore$byId = sap.ui.getCore().byId(parameters.controlId)) === null || _sap$ui$getCore$byId === void 0 ? void 0 : _sap$ui$getCore$byId.getBindingContext("internal") : null;
|
|
1530
1595
|
await this.syncTask();
|
|
1531
1596
|
await transactionHelper.deleteDocument(contexts, parameters, this.getAppComponent(), resourceModel, this.getMessageHandler());
|
|
1532
|
-
const internalModel = this.getInternalModel();
|
|
1533
|
-
internalModel.setProperty("/sessionOn", false);
|
|
1534
|
-
internalModel.setProperty("/stickySessionToken", undefined);
|
|
1535
1597
|
};
|
|
1536
1598
|
_proto._getResourceModel = function _getResourceModel() {
|
|
1537
1599
|
return getResourceModel(this.getView());
|
|
@@ -1774,23 +1836,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1774
1836
|
return false;
|
|
1775
1837
|
}
|
|
1776
1838
|
return true;
|
|
1777
|
-
}
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
const view = this.getView();
|
|
1784
|
-
const routerProxy = this.getAppComponent().getRouterProxy();
|
|
1785
|
-
if (routerProxy.checkIfBackIsOutOfGuard()) {
|
|
1786
|
-
const bindingContext = view.getBindingContext();
|
|
1787
|
-
sticky.processDataLossConfirmation(async () => {
|
|
1788
|
-
await this.discardStickySession(bindingContext);
|
|
1789
|
-
history.back();
|
|
1790
|
-
}, view, this.getProgrammingModel(bindingContext));
|
|
1791
|
-
return;
|
|
1839
|
+
};
|
|
1840
|
+
_proto._setStickySessionInternalProperties = function _setStickySessionInternalProperties(programmingModel, model) {
|
|
1841
|
+
if (programmingModel === ProgrammingModel.Sticky) {
|
|
1842
|
+
const internalModel = this.getInternalModel();
|
|
1843
|
+
internalModel.setProperty("/sessionOn", true);
|
|
1844
|
+
internalModel.setProperty("/stickySessionToken", model.getHttpHeaders(true)["SAP-ContextId"]);
|
|
1792
1845
|
}
|
|
1793
|
-
history.back();
|
|
1794
1846
|
}
|
|
1795
1847
|
|
|
1796
1848
|
/**
|
|
@@ -1928,7 +1980,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1928
1980
|
if (discardedContext !== null && discardedContext !== void 0 && discardedContext.hasPendingChanges()) {
|
|
1929
1981
|
discardedContext.getBinding().resetChanges();
|
|
1930
1982
|
}
|
|
1931
|
-
|
|
1983
|
+
if (!this.getCreationMode()) {
|
|
1984
|
+
discardedContext === null || discardedContext === void 0 ? void 0 : discardedContext.refresh();
|
|
1985
|
+
}
|
|
1932
1986
|
this.handleStickyOff();
|
|
1933
1987
|
}
|
|
1934
1988
|
|
|
@@ -2077,13 +2131,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2077
2131
|
}
|
|
2078
2132
|
}
|
|
2079
2133
|
};
|
|
2080
|
-
_proto._setStickySessionInternalProperties = function _setStickySessionInternalProperties(programmingModel, model) {
|
|
2081
|
-
if (programmingModel === ProgrammingModel.Sticky) {
|
|
2082
|
-
const internalModel = this.getInternalModel();
|
|
2083
|
-
internalModel.setProperty("/sessionOn", true);
|
|
2084
|
-
internalModel.setProperty("/stickySessionToken", model.getHttpHeaders(true)["SAP-ContextId"]);
|
|
2085
|
-
}
|
|
2086
|
-
};
|
|
2087
2134
|
_proto._removeStickySessionInternalProperties = function _removeStickySessionInternalProperties(programmingModel) {
|
|
2088
2135
|
if (programmingModel === ProgrammingModel.Sticky) {
|
|
2089
2136
|
const internalModel = this.getInternalModel();
|
|
@@ -2091,6 +2138,25 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2091
2138
|
internalModel.setProperty("/stickySessionToken", undefined);
|
|
2092
2139
|
this.handleStickyOff();
|
|
2093
2140
|
}
|
|
2141
|
+
}
|
|
2142
|
+
|
|
2143
|
+
/**
|
|
2144
|
+
* Method to display a 'discard' popover when exiting a sticky session.
|
|
2145
|
+
*/;
|
|
2146
|
+
_proto.onBackNavigationInSession = function onBackNavigationInSession() {
|
|
2147
|
+
const view = this.getView();
|
|
2148
|
+
const routerProxy = this.getAppComponent().getRouterProxy();
|
|
2149
|
+
if (routerProxy.checkIfBackIsOutOfGuard()) {
|
|
2150
|
+
const bindingContext = view.getBindingContext();
|
|
2151
|
+
const programmingModel = this.getProgrammingModel(bindingContext);
|
|
2152
|
+
sticky.processDataLossConfirmation(async () => {
|
|
2153
|
+
await this.discardStickySession(bindingContext);
|
|
2154
|
+
this._removeStickySessionInternalProperties(programmingModel);
|
|
2155
|
+
history.back();
|
|
2156
|
+
}, view, programmingModel);
|
|
2157
|
+
return;
|
|
2158
|
+
}
|
|
2159
|
+
history.back();
|
|
2094
2160
|
};
|
|
2095
2161
|
_proto._handleNewContext = async function _handleNewContext(oContext, bEditable, bRecreateContext, bDraftNavigation) {
|
|
2096
2162
|
let bForceFocus = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
|
|
@@ -2295,9 +2361,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2295
2361
|
* @param rightmostCurrentContext The context of the subobject
|
|
2296
2362
|
* @param sProgrammingModel The programming model
|
|
2297
2363
|
* @param doNotComputeIfRoot If true, we don't compute siblingInfo if the root and the rightmost contexts are the same
|
|
2364
|
+
* @param rootContextInfo The root context information of root of the draft
|
|
2298
2365
|
* @returns Returns the siblingInformation object
|
|
2299
2366
|
*/;
|
|
2300
|
-
_proto._computeSiblingInformation = async function _computeSiblingInformation(rootCurrentContext, rightmostCurrentContext, sProgrammingModel, doNotComputeIfRoot) {
|
|
2367
|
+
_proto._computeSiblingInformation = async function _computeSiblingInformation(rootCurrentContext, rightmostCurrentContext, sProgrammingModel, doNotComputeIfRoot, rootContextInfo) {
|
|
2301
2368
|
rightmostCurrentContext = rightmostCurrentContext ?? rootCurrentContext;
|
|
2302
2369
|
if (!rightmostCurrentContext.getPath().startsWith(rootCurrentContext.getPath())) {
|
|
2303
2370
|
// Wrong usage !!
|
|
@@ -2309,7 +2376,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2309
2376
|
}
|
|
2310
2377
|
const model = rootCurrentContext.getModel();
|
|
2311
2378
|
if (sProgrammingModel === ProgrammingModel.Draft) {
|
|
2312
|
-
return draft.computeSiblingInformation(rootCurrentContext, rightmostCurrentContext);
|
|
2379
|
+
return draft.computeSiblingInformation(rootCurrentContext, rightmostCurrentContext, rootContextInfo);
|
|
2313
2380
|
} else {
|
|
2314
2381
|
// If not in draft mode, we just recreate a context from the path of the rightmost context
|
|
2315
2382
|
// No path mapping is needed
|
|
@@ -2323,7 +2390,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2323
2390
|
return this.getAppComponent()._isFclEnabled();
|
|
2324
2391
|
};
|
|
2325
2392
|
return EditFlow;
|
|
2326
|
-
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "editDocument", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeSave", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDiscard", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "saveDocument", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "saveDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "cancelDocument", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "cancelDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocument", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyDocument", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "applyDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "invokeAction", [_dec26, _dec27], Object.getOwnPropertyDescriptor(_class2.prototype, "invokeAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "
|
|
2393
|
+
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "editDocument", [_dec2, _dec3], Object.getOwnPropertyDescriptor(_class2.prototype, "editDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "updateDocument", [_dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "updateDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "createDocument", [_dec6, _dec7], Object.getOwnPropertyDescriptor(_class2.prototype, "createDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeSave", [_dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeSave"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeCreate", [_dec10, _dec11], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeCreate"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeEdit", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeEdit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDiscard", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDiscard"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onBeforeDelete", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "onBeforeDelete"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "saveDocument", [_dec18, _dec19], Object.getOwnPropertyDescriptor(_class2.prototype, "saveDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "cancelDocument", [_dec20, _dec21], Object.getOwnPropertyDescriptor(_class2.prototype, "cancelDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteDocument", [_dec22, _dec23], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "applyDocument", [_dec24, _dec25], Object.getOwnPropertyDescriptor(_class2.prototype, "applyDocument"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "invokeAction", [_dec26, _dec27], Object.getOwnPropertyDescriptor(_class2.prototype, "invokeAction"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onAfterActionExecution", [_dec28, _dec29], Object.getOwnPropertyDescriptor(_class2.prototype, "onAfterActionExecution"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "securedExecution", [_dec30, _dec31], Object.getOwnPropertyDescriptor(_class2.prototype, "securedExecution"), _class2.prototype)), _class2)) || _class);
|
|
2327
2394
|
return EditFlow;
|
|
2328
2395
|
}, false);
|
|
2329
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiTWVzc2FnZVR5cGUiLCJjb3JlTGlicmFyeSIsIkVkaXRGbG93IiwiZGVmaW5lVUk1Q2xhc3MiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwic3luY1Rhc2tzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXRBcHBDb21wb25lbnQiLCJiYXNlIiwiZWRpdERvY3VtZW50Iiwib0NvbnRleHQiLCJiRHJhZnROYXZpZ2F0aW9uIiwidHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJfZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwibW9kZWwiLCJnZXRNb2RlbCIsInJpZ2h0bW9zdENvbnRleHQiLCJzaWJsaW5nSW5mbyIsIm9WaWV3RGF0YSIsImdldFZpZXciLCJnZXRWaWV3RGF0YSIsInNQcm9ncmFtbWluZ01vZGVsIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsIm9Sb290Q29udGV4dCIsIm9WaWV3Iiwidmlld0xldmVsIiwiRHJhZnQiLCJkcmFmdFJvb3RQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXREcmFmdFJvb3RQYXRoIiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJyZXF1ZXN0T2JqZWN0IiwiU3RpY2t5Iiwic1N0aWNreVJvb3RQYXRoIiwiZ2V0U3RpY2t5Um9vdFBhdGgiLCJlZGl0RmxvdyIsIm9uQmVmb3JlRWRpdCIsImNvbnRleHQiLCJvTmV3RG9jdW1lbnRDb250ZXh0IiwiZ2V0TWVzc2FnZUhhbmRsZXIiLCJfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsInNldEVkaXRNb2RlIiwiRWRpdGFibGUiLCJzZXREb2N1bWVudE1vZGlmaWVkIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJjb250ZXh0VG9OYXZpZ2F0ZSIsIl9pc0ZjbEVuYWJsZWQiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwiX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJfY3JlYXRlU2libGluZ0luZm8iLCJfdXBkYXRlUGF0aHNJbkhpc3RvcnkiLCJwYXRoTWFwcGluZyIsInRhcmdldENvbnRleHQiLCJnZXRQYXRoIiwiX2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0IiwiX2hhbmRsZU5ld0NvbnRleHQiLCJzdGlja3lDb250ZXh0IiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsImhhbmRsZVN0aWNreU9uIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJnZXRNZXRhTW9kZWwiLCJzaGFyZU9iamVjdCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMiLCJjb250ZXh0c1RvRGVsZXRlIiwicGFyYW1ldGVycyIsImJlZm9yZURlbGV0ZUNhbGxCYWNrIiwib25CZWZvcmVEZWxldGUiLCJsb2NrT2JqZWN0IiwiZ2V0R2xvYmFsVUlNb2RlbCIsInBhcmVudENvbnRyb2wiLCJieUlkIiwiY29udHJvbElkIiwiRXJyb3IiLCJsaXN0QmluZGluZyIsImdldEJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbiIsInJlc3VsdCIsImlzQSIsImNsZWFyU2VsZWN0aW9uIiwidmlld0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJpc1Jvb3QiLCJhdHRhY2hFdmVudE9uY2UiLCJyZWZyZXNoIiwiQ29tbW9uVXRpbHMiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJBY3Rpdml0eVN5bmMiLCJzZW5kIiwiQWN0aXZpdHkiLCJEZWxldGUiLCJtYXAiLCJ1bmxvY2siLCJ1cGRhdGVEb2N1bWVudCIsInVwZGF0ZWRDb250ZXh0IiwidXBkYXRlUHJvbWlzZSIsIm9yaWdpbmFsQmluZGluZ0NvbnRleHQiLCJpc0RyYWZ0IiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwic3luY1Rhc2siLCJzZXREcmFmdFN0YXR1cyIsIlNhdmluZyIsImN1cnJlbnRCaW5kaW5nQ29udGV4dCIsIm1ldGFNb2RlbCIsImVudGl0eVNldE5hbWUiLCJnZXRNZXRhQ29udGV4dCIsImdldE9iamVjdCIsInNlbWFudGljS2V5cyIsIlNlbWFudGljS2V5SGVscGVyIiwiZ2V0U2VtYW50aWNLZXlzIiwibGVuZ3RoIiwiY3VycmVudFNlbWFudGljTWFwcGluZyIsIl9nZXRTZW1hbnRpY01hcHBpbmciLCJjdXJyZW50U2VtYW50aWNQYXRoIiwic2VtYW50aWNQYXRoIiwic0NoYW5nZWRQYXRoIiwiZ2V0U2VtYW50aWNQYXRoIiwiU2F2ZWQiLCJDbGVhciIsInNob3dNZXNzYWdlcyIsImNyZWF0ZURvY3VtZW50Iiwidkxpc3RCaW5kaW5nIiwibUluUGFyYW1ldGVycyIsIm9Mb2NrT2JqZWN0Iiwib1RhYmxlIiwibVBhcmFtZXRlcnMiLCJiU2hvdWxkQnVzeUxvY2siLCJjcmVhdGlvbk1vZGUiLCJJbmxpbmUiLCJDcmVhdGlvblJvdyIsIkV4dGVybmFsIiwib0V4ZWNDdXN0b21WYWxpZGF0aW9uIiwib0FwcENvbXBvbmVudCIsImdldFJvdXRlclByb3h5IiwicmVtb3ZlSUFwcFN0YXRlS2V5Iiwib0NvbnRyb2xsZXIiLCJnZXRDb250cm9sbGVyIiwic0NyZWF0ZVBhdGgiLCJnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJoYW5kbGVycyIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsIm91dGJvdW5kIiwidW5kZWZpbmVkIiwiY3JlYXRpb25Sb3ciLCJvQ3JlYXRpb25Sb3dPYmplY3RzIiwiZ2V0UGFyZW50IiwidmFsaWRhdGVEb2N1bWVudCIsImRhdGEiLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJnZXRDcmVhdGlvblJvdyIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsInNldFByb3BlcnR5IiwidGFibGVJZCIsImZuRm9jdXNPclNjcm9sbCIsImZvY3VzUm93IiwiYmluZCIsInNjcm9sbFRvSW5kZXgiLCJjcmVhdGVBdEVuZCIsImdldExlbmd0aCIsImhhbmRsZVNpZGVFZmZlY3RzIiwib0xpc3RCaW5kaW5nIiwib0NyZWF0aW9uUHJvbWlzZSIsIm9OZXdDb250ZXh0IiwiY3JlYXRlZCIsIm9CaW5kaW5nQ29udGV4dCIsImFwcENvbXBvbmVudCIsImNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyIsImFWYWxpZGF0aW9uTWVzc2FnZXMiLCJzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwibUN1c3RvbVZhbGlkaXR5IiwiZ2V0UHJvcGVydHkiLCJvTWVzc2FnZU1hbmFnZXIiLCJDb3JlIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJhQ3VzdG9tTWVzc2FnZXMiLCJvRmllbGRDb250cm9sIiwic1RhcmdldCIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJmb3JFYWNoIiwib01lc3NhZ2UiLCJjb2RlIiwicmVtb3ZlTWVzc2FnZXMiLCJvVmFsaWRhdGlvbk1lc3NhZ2UiLCJtZXNzYWdlVGFyZ2V0IiwiZ2V0Q29udHJvbCIsImZpZWxkSWQiLCJnZXRCaW5kaW5nUGF0aCIsImZpbHRlciIsInRhcmdldCIsImFkZE1lc3NhZ2VzIiwiTWVzc2FnZSIsIm1lc3NhZ2UiLCJtZXNzYWdlVGV4dCIsInByb2Nlc3NvciIsInR5cGUiLCJ0ZWNobmljYWwiLCJwZXJzaXN0ZW50IiwiYUV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzIiwiYWRkQ29udHJvbElkIiwicHVzaCIsInRleHQiLCJjdXN0b21NZXNzYWdlcyIsInJlc29sdmVDcmVhdGlvbk1vZGUiLCJpbml0aWFsQ3JlYXRpb25Nb2RlIiwicHJvZ3JhbW1pbmdNb2RlbCIsIm9NZXRhTW9kZWwiLCJOZXdQYWdlIiwiaXNSZWxhdGl2ZSIsInNQYXRoIiwic05ld0FjdGlvbiIsImFQYXJhbWV0ZXJzIiwiRGVmZXJyZWQiLCJzTWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImdldEhlYWRlckNvbnRleHQiLCJhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzIiwiZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIiwiQXN5bmMiLCJPRGF0YUxpc3RCaW5kaW5nIiwiU3luYyIsIm9Nb2RlbCIsInJlc29sdmVkQ3JlYXRpb25Nb2RlIiwib0NyZWF0aW9uIiwibUFyZ3MiLCJvQ3JlYXRpb25Sb3ciLCJvQ3JlYXRpb25Sb3dDb250ZXh0Iiwib1BheWxvYWQiLCJvUm91dGluZ0xpc3RlbmVyIiwiZ2V0SW50ZXJuYWxSb3V0aW5nIiwiT2JqZWN0Iiwia2V5cyIsInNQcm9wZXJ0eVBhdGgiLCJvUHJvcGVydHkiLCIka2luZCIsIl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiYnVzeU1vZGUiLCJidXN5SWQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJhbm5vdGF0aW9uIiwiaWQiLCJoYW5kbGVDcmVhdGVFdmVudHMiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIm9uQmVmb3JlQ3JlYXRlIiwic2tpcFBhcmFtZXRlckRpYWxvZyIsImdldFN0YXJ0dXBNb2RlIiwiQXV0b0NyZWF0ZSIsImJTa2lwU2lkZUVmZmVjdHMiLCJvTmF2aWdhdGlvbiIsIm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCIsImJEZWZlcnJlZENvbnRleHQiLCJlZGl0YWJsZSIsImJGb3JjZUZvY3VzIiwiYXN5bmNDb250ZXh0IiwiY3JlYXRlQWN0aW9uIiwidHJhbnNpZW50IiwidGhlbiIsImNvcmVSZXNvdXJjZUJ1bmRsZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsIm5hdmlnYXRlVG9NZXNzYWdlUGFnZSIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwiYkZyb21EZWZlcnJlZCIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NyZWF0aW9uUm93TGlzdEJpbmRpbmciLCJvTmV3VHJhbnNpZW50Q29udGV4dCIsImNyZWF0ZSIsInNldEJpbmRpbmdDb250ZXh0IiwiY2F0Y2giLCJ0cmFjZSIsImRlbGV0ZSIsImlzTG9ja2VkIiwicmVqZWN0IiwiYVBhcmFtcyIsImFsbCIsIm1ldGFDb250ZXh0IiwiZW50aXR5U2V0IiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJuZXdBY3Rpb24iLCJhbm5vdGF0aW9ucyIsIlNlc3Npb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiTmV3QWN0aW9uIiwiZ2V0SW50ZXJuYWxNb2RlbCIsInNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZSIsIl9zZW5kQWN0aXZpdHkiLCJDcmVhdGUiLCJpc0Nvbm5lY3RlZCIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsIkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCIsIkNyZWF0aW9uRmFpbGVkIiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwiY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMiLCJkYXRhRm9yQ3JlYXRlIiwiaXNGcm9tQ29weVBhc3RlIiwiY3JlYXRlQXNJbmFjdGl2ZSIsInRhcmdldExpc3RCaW5kaW5nIiwiY29udGV4dFBhdGgiLCJtZXRhUGF0aCIsImdldENvbnRleHQiLCJjcmVhdGlvblByb21pc2VzIiwicHJvcGVydHlWYWx1ZXMiLCJjcmVhdGVQYXJhbWV0ZXJzIiwiaW5hY3RpdmUiLCJwcm9wZXJ0eVBhdGgiLCJwcm9wZXJ0eSIsImluZGV4T2YiLCJjcmVhdGVkQ29udGV4dHMiLCJuZXdDb250ZXh0IiwiYkluYWN0aXZlIiwiZXJyIiwib25CZWZvcmVTYXZlIiwiX21QYXJhbWV0ZXJzIiwib25CZWZvcmVEaXNjYXJkIiwic2F2ZURvY3VtZW50IiwiYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJhQmluZGluZ3MiLCJiaW5kaW5ncyIsIl9zdWJtaXRPcGVuQ2hhbmdlcyIsImlzRmNsRW5hYmxlZCIsImFjdGl2ZURvY3VtZW50Q29udGV4dCIsIl9nZXRSZXNvdXJjZU1vZGVsIiwiZ2V0Q3JlYXRpb25Nb2RlIiwiX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMiLCJBY3RpdmF0ZSIsImRpc2Nvbm5lY3QiLCJfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkiLCJTdGFuZGFyZEFjdGlvbnMiLCJzYXZlIiwiVHJpZ2dlclR5cGUiLCJzdGFuZGFyZEFjdGlvbiIsIkRpc3BsYXkiLCJjYW5jZWxlZCIsInRvZ2dsZURyYWZ0QWN0aXZlIiwib0NvbnRleHREYXRhIiwiYkVkaXRhYmxlIiwiYklzRHJhZnQiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5Iiwib1JpZ2h0bW9zdENvbnRleHQiLCJsYXN0U2VtYW50aWNNYXBwaW5nIiwidGVjaG5pY2FsUGF0aCIsInRhcmdldFBhdGgiLCJuZXdQYXRoIiwib2xkUGF0aCIsImNhbmNlbERvY3VtZW50IiwiY2FuY2VsQnV0dG9uIiwiY29udHJvbCIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwiY2FuY2VsUmVzdWx0IiwiaXNEb2N1bWVudE1vZGlmaWVkIiwiRGlzY2FyZCIsInNraXBCYWNrTmF2aWdhdGlvbiIsIm5hdmlnYXRlQmFja0Zyb21Db250ZXh0Iiwib0FjdGl2ZURvY3VtZW50Q29udGV4dCIsIl9mZXRjaFNlbWFudGljS2V5VmFsdWVzIiwic2tpcEJpbmRpbmdUb1ZpZXciLCJpc0RyYWZ0Um9vdCIsInRhcmdldEVudGl0eVNldCIsImRlbGV0ZURvY3VtZW50IiwiZ2V0SW5kZXgiLCJzaWJsaW5nQ29udGV4dCIsImRyYWZ0UGF0aCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiZHJhZnRDb250ZXh0VG9SZW1vdmUiLCJyZXBsYWNlV2l0aCIsImdldFNoZWxsU2VydmljZXMiLCJzZXRCYWNrTmF2aWdhdGlvbiIsIkRlZXBsaW5rIiwiZXhpdEZyb21BcHAiLCJhcHBseURvY3VtZW50IiwiaW52b2tlQWN0aW9uIiwic0FjdGlvbk5hbWUiLCJtRXh0cmFQYXJhbXMiLCJvQ29udHJvbCIsImFQYXJ0cyIsInNPdmVybG9hZEVudGl0eVR5cGUiLCJvQ3VycmVudEFjdGlvbkNhbGxCYWNrcyIsIkFycmF5IiwiaXNBcnJheSIsImNvbnRleHRzIiwiaXNOYXZpZ2FibGUiLCJyZXF1aXJlc05hdmlnYXRpb24iLCJjb252ZXJ0ZWRNZXRhZGF0YSIsImNvbnZlcnRUeXBlcyIsImVudGl0eUNvbnRhaW5lciIsIm5hbWUiLCJpc0JvdW5kIiwiaW50ZXJuYWxNb2RlbENvbnRleHQiLCJzcGxpdCIsInJlcGxhY2VBbGwiLCJiU3RhdGljQWN0aW9uIiwiaXNUYWJsZUJvdW5kIiwic0JpbmRpbmdQYXRoIiwicGF0aCIsIl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoIiwiZW5hYmxlQXV0b1Njcm9sbCIsImNyZWF0ZUFjdGlvblByb21pc2UiLCJzSWQiLCJiR2V0Qm91bmRDb250ZXh0IiwiX2dldEJvdW5kQ29udGV4dCIsImJPYmplY3RQYWdlIiwiY29udmVydGVyVHlwZSIsIm9SZXNwb25zZSIsImNhbGxBY3Rpb24iLCJsaXN0UmVmcmVzaGVkIiwiX3JlZnJlc2hMaXN0SWZSZXF1aXJlZCIsImdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMiLCJhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzIiwidmFsdWUiLCJBY3Rpb24iLCJhY3Rpb24iLCJmUmVzb2x2ZXIiLCJ2Q29udGV4dCIsInNDb250ZXh0TWV0YVBhdGgiLCJfZm5WYWxpZENvbnRleHRzIiwiYXBwbGljYWJsZUNvbnRleHRzIiwiZWxlbWVudCIsIm9BY3Rpb25Db250ZXh0IiwiYXBwbGljYWJsZUNvbnRleHQiLCJzQWN0aW9uQ29udGV4dE1ldGFQYXRoIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJub0hpc3RvcnlFbnRyeSIsImluZm8iLCJmUmVqZWN0b3IiLCJyZWplY3RlZEl0ZW1zIiwic2VjdXJlZEV4ZWN1dGlvbiIsImZuRnVuY3Rpb24iLCJiQnVzeVNldCIsImJ1c3kiLCJzZXQiLCJiQnVzeUNoZWNrIiwiY2hlY2siLCJiVXBkYXRlc0RvY3VtZW50IiwidXBkYXRlc0RvY3VtZW50IiwiZmluYWxseSIsImhhbmRsZVBhdGNoU2VudCIsIm9FdmVudCIsImlzSW5Db2xsYWJvcmF0aXZlRHJhZnQiLCJnZXRTb3VyY2UiLCJzZXRJZ25vcmVFVGFnIiwic291cmNlQmluZGluZyIsIm9QYXRjaFByb21pc2UiLCJwYXRjaENvbXBsZXRlZEV2ZW50IiwiQWN0aW9uUnVudGltZSIsInNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoIiwiYlN1Y2Nlc3MiLCJnZXRQYXJhbWV0ZXIiLCJoYW5kbGVDcmVhdGVBY3RpdmF0ZSIsIm9CaW5kaW5nIiwiYkF0RW5kIiwib1BhcmFtcyIsImFjdGl2YXRlZENvbnRleHQiLCJ3YXJuaW5nIiwibmV3SW5hY3RpdmVDb250ZXh0IiwibmV3VGFzayIsImNvbXB1dGVFZGl0TW9kZSIsImdsb2JhbE1vZGVsIiwiaXNBY3RpdmVFbnRpdHkiLCJoYXNBY3RpdmVFbnRpdHkiLCJsYXN0SW52b2tlZEFjdGlvbk5hbWUiLCJpc05ld0FjdGlvbkZvclN0aWNreSIsInJlc291cmNlTW9kZWwiLCJnZXRSZXNvdXJjZU1vZGVsIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiaW50ZXJuYWxNb2RlbCIsIlRyYW5zYWN0aW9uSGVscGVyIiwibWVzc2FnZUhhbmRsZXIiLCJzZXRDcmVhdGlvbk1vZGUiLCJiQ3JlYXRpb25Nb2RlIiwidWlNb2RlbENvbnRleHQiLCJtb2RpZmllZCIsImJpbmRpbmciLCJhdHRhY2hFdmVudCIsInN1Y2Nlc3MiLCJkcmFmdFN0YXR1cyIsInNvdXJjZSIsImVkaXRNb2RlIiwiaXNDcmVhdGlvbiIsImFjdGlvbk5hbWUiLCJzdGlja3lTZXNzaW9uIiwiQWRkaXRpb25hbE5ld0FjdGlvbnMiLCJoYXNOYXZpZ2F0aW9uR3VhcmQiLCJoYXNoVHJhY2tlciIsImdldEhhc2giLCJzZXRUaW1lb3V0Iiwic2V0TmF2aWdhdGlvbkd1YXJkIiwic3Vic3RyaW5nIiwib25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbiIsImRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uIiwiZ2V0RGlydHlTdGF0ZVByb3ZpZGVyIiwicmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIiLCJpMThuTW9kZWwiLCJzZXNzaW9uVGltZW91dEZ1bmN0aW9uIiwiZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbiIsImF0dGFjaFNlc3Npb25UaW1lb3V0Iiwic3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uIiwiZ2V0Um91dGVNYXRjaGVkRnVuY3Rpb24iLCJnZXRSb3V0aW5nU2VydmljZSIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsImhhbmRsZVN0aWNreU9mZiIsImRpc2NhcmROYXZpZ2F0aW9uR3VhcmQiLCJkZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIiwiZGV0YWNoU2Vzc2lvblRpbWVvdXQiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJ2aWV3Iiwicm91dGVyUHJveHkiLCJjaGVja0lmQmFja0lzT3V0T2ZHdWFyZCIsImJpbmRpbmdDb250ZXh0Iiwic3RpY2t5IiwicHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uIiwiZGlzY2FyZFN0aWNreVNlc3Npb24iLCJoaXN0b3J5IiwiYmFjayIsIm5hdmlnYXRpb25Db250ZXh0IiwidGFyZ2V0SGFzaCIsImlubmVyQXBwUm91dGUiLCJsY2xIYXNoVHJhY2tlciIsImlzRGlydHkiLCJpc1Nlc3Npb25PbiIsImlzTmF2aWdhdGlvbkZpbmFsaXplZCIsImNoZWNrSGFzaFdpdGhHdWFyZCIsImlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIiLCJzZXREaXJ0eUZsYWciLCJ3YXJuaW5nRGlhbG9nIiwiRGlhbG9nIiwic3RhdGUiLCJjb250ZW50IiwiVGV4dCIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwicHJlc3MiLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsImFkZFN0eWxlQ2xhc3MiLCJzZXRNb2RlbCIsImFkZERlcGVuZGVudCIsIm9wZW4iLCJjdXJyZW50SGFzaCIsImNsZWFyU2Vzc2lvbkNvbnRleHQiLCJkaXNjYXJkZWRDb250ZXh0IiwiZGlzY2FyZERvY3VtZW50IiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJyZXNldENoYW5nZXMiLCJfcm91dGluZyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImdldExhc3RTZW1hbnRpY01hcHBpbmciLCJyZXNvbHZlRnVuY3Rpb24iLCJyZWplY3RGdW5jdGlvbiIsImFjdGlvblByb21pc2UiLCJhc3NpZ24iLCJyZXNwb25zZSIsImN1cnJlbnRWaWV3IiwibWV0YU1vZGVsRGF0YSIsImFjdGlvblJldHVyblR5cGUiLCIkUmV0dXJuVHlwZSIsIiRUeXBlIiwiJEtleSIsIm9EYXRhIiwiZ2V0Q3VycmVudEFjdGlvblByb21pc2UiLCJkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsIl9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3ciLCJ0YWJsZSIsInJvd0JpbmRpbmciLCJhY3RpdmVSb3dJbmRleCIsImdldENvdW50IiwiYWxsUm93Q29udGV4dHMiLCJnZXRDb250ZXh0cyIsImluZGV4Iiwic2luZ2xlQ29udGV4dCIsImlzSW5hY3RpdmUiLCJjcmVhdGVFbXB0eVJvd3NBbmRGb2N1cyIsInRhYmxlQVBJIiwidGFibGVEZWZpbml0aW9uIiwiaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSIsInNldFVwRW1wdHlSb3dzIiwicmVsYXRlZENvbnRleHRzIiwicmVmcmVzaExpc3RCaW5kaW5nIiwidHJpZ2dlclR5cGUiLCJ0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSIsInN1Ym1pdEJhdGNoIiwib1JlcXVlc3RvciIsIndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMiLCJnZXRIdHRwSGVhZGVycyIsImJSZWNyZWF0ZUNvbnRleHQiLCJiUGVyc2lzdE9QU2Nyb2xsIiwic2hvd1BsYWNlaG9sZGVyIiwia2VlcEN1cnJlbnRMYXlvdXQiLCJwYXJhbXMiLCJiUmVmcmVzaEFmdGVyQWN0aW9uIiwic1ZpZXdJZCIsImdldElkIiwiYU1lc3NhZ2VzIiwiaSIsInZhbGlkYXRpb24iLCJnZXRDb250cm9sSWQiLCJhS2V5cyIsIm9DdXJyZW50RGF0YSIsImJSZXR1cm5lZENvbnRleHRJc1NhbWUiLCJldmVyeSIsInNLZXkiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImUiLCJzRW50aXR5U2V0TmFtZSIsImFTZW1hbnRpY0tleXMiLCJhUmVxdWVzdFByb21pc2VzIiwib0tleSIsIiRQcm9wZXJ0eVBhdGgiLCJyb290Q29udGV4dCIsIm92ZXJsb2FkRW50aXR5VHlwZSIsImNvbnRleHRTZWdtZW50cyIsImN1cnJlbnRDb250ZXh0IiwicG9wIiwidW5zaGlmdCIsInBhcmVudENvbnRleHRzIiwicGF0aFNlZ21lbnQiLCJyZXZlcnNlIiwib3ZlcmxvYWRDb250ZXh0IiwiZmluZCIsInBhcmVudENvbnRleHQiLCJtYXBwaW5ncyIsInNldFBhdGhNYXBwaW5nIiwibmV3RG9jdW1lbnRDb250ZXh0Iiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJkb05vdENvbXB1dGVJZlJvb3QiLCJzdGFydHNXaXRoIiwiZHJhZnQiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRWRpdEZsb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgQWN0aXZpdHlTeW5jIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IHsgQWN0aXZpdHksIHNoYXJlT2JqZWN0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBTaWJsaW5nSW5mb3JtYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L3N0aWNreVwiO1xuaW1wb3J0IFRyYW5zYWN0aW9uSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9UcmFuc2FjdGlvbkhlbHBlclwiO1xuaW1wb3J0IHsgU3RhbmRhcmRBY3Rpb25zLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSwgVHJpZ2dlclR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvRmVlZGJhY2tcIjtcbmltcG9ydCB0eXBlIEludGVybmFsUm91dGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBwdWJsaWNFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgeyBnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9NZXRhTW9kZWxGdW5jdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgU2VtYW50aWNNYXBwaW5nIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IGNvcmVMaWJyYXJ5IGZyb20gXCJzYXAvdWkvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgTWVzc2FnZSBmcm9tIFwic2FwL3VpL2NvcmUvbWVzc2FnZS9NZXNzYWdlXCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0JpbmRpbmdcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcIi4uL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCB0eXBlIHsgQmFzZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwiLi4vY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5cbmNvbnN0IENyZWF0aW9uTW9kZSA9IEZFTGlicmFyeS5DcmVhdGlvbk1vZGUsXG5cdFByb2dyYW1taW5nTW9kZWwgPSBGRUxpYnJhcnkuUHJvZ3JhbW1pbmdNb2RlbCxcblx0Q29uc3RhbnRzID0gRkVMaWJyYXJ5LkNvbnN0YW50cyxcblx0RHJhZnRTdGF0dXMgPSBGRUxpYnJhcnkuRHJhZnRTdGF0dXMsXG5cdEVkaXRNb2RlID0gRkVMaWJyYXJ5LkVkaXRNb2RlLFxuXHRTdGFydHVwTW9kZSA9IEZFTGlicmFyeS5TdGFydHVwTW9kZSxcblx0TWVzc2FnZVR5cGUgPSBjb3JlTGlicmFyeS5NZXNzYWdlVHlwZTtcblxuLyoqXG4gKiBBIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9mZmVyaW5nIGhvb2tzIGludG8gdGhlIGVkaXQgZmxvdyBvZiB0aGUgYXBwbGljYXRpb25cbiAqXG4gKiBAaGlkZWNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKiBAc2luY2UgMS45MC4wXG4gKi9cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XCIpXG5jbGFzcyBFZGl0RmxvdyBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcm90ZWN0ZWQgYmFzZSE6IFBhZ2VDb250cm9sbGVyO1xuXG5cdHByaXZhdGUgZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24/OiBGdW5jdGlvbjtcblxuXHRwcml2YXRlIHNlc3Npb25UaW1lb3V0RnVuY3Rpb24/OiBGdW5jdGlvbjtcblxuXHRwcml2YXRlIHN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbj86IEZ1bmN0aW9uO1xuXG5cdHByaXZhdGUgc3luY1Rhc2tzOiBQcm9taXNlPGFueT4gPSBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRwcml2YXRlIGFjdGlvblByb21pc2U/OiBQcm9taXNlPGFueT47XG5cblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblx0Ly8gUHVibGljIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHRnZXRBcHBDb21wb25lbnQoKTogQXBwQ29tcG9uZW50IHtcblx0XHRyZXR1cm4gdGhpcy5iYXNlLmdldEFwcENvbXBvbmVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmb3IgYW4gZXhpc3RpbmcgYWN0aXZlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGVkaXRhYmxlIGRvY3VtZW50IGlzIGF2YWlsYWJsZVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjZWRpdERvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGVkaXREb2N1bWVudChvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGJEcmFmdE5hdmlnYXRpb24gPSB0cnVlO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnk7XG5cdFx0Y29uc3QgbW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGxldCByaWdodG1vc3RDb250ZXh0LCBzaWJsaW5nSW5mbztcblx0XHRjb25zdCBvVmlld0RhdGEgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIEJhc2VNYW5pZmVzdFNldHRpbmdzO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRsZXQgb1Jvb3RDb250ZXh0OiBDb250ZXh0ID0gb0NvbnRleHQ7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKChvVmlld0RhdGE/LnZpZXdMZXZlbCBhcyBudW1iZXIpID4gMSkge1xuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHRjb25zdCBkcmFmdFJvb3RQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBNb2RlbEhlbHBlci5nZXREcmFmdFJvb3RQYXRoKG9Db250ZXh0KTtcblx0XHRcdFx0XHRvUm9vdENvbnRleHQgPSBvVmlld1xuXHRcdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHRcdC5iaW5kQ29udGV4dChkcmFmdFJvb3RQYXRoIGFzIHN0cmluZylcblx0XHRcdFx0XHRcdC5nZXRCb3VuZENvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0XHRcdGF3YWl0IG9Sb290Q29udGV4dC5yZXF1ZXN0T2JqZWN0KGRyYWZ0Um9vdFBhdGgpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRcdGNvbnN0IHNTdGlja3lSb290UGF0aCA9IE1vZGVsSGVscGVyLmdldFN0aWNreVJvb3RQYXRoKG9Db250ZXh0KTtcblx0XHRcdFx0XHRvUm9vdENvbnRleHQgPSBvVmlld1xuXHRcdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHRcdC5iaW5kQ29udGV4dChzU3RpY2t5Um9vdFBhdGggYXMgc3RyaW5nKVxuXHRcdFx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRcdFx0YXdhaXQgb1Jvb3RDb250ZXh0LnJlcXVlc3RPYmplY3Qoc1N0aWNreVJvb3RQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRWRpdCh7IGNvbnRleHQ6IG9Sb290Q29udGV4dCB9KTtcblx0XHRcdGNvbnN0IG9OZXdEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5lZGl0RG9jdW1lbnQoXG5cdFx0XHRcdG9Sb290Q29udGV4dCxcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKVxuXHRcdFx0KTtcblxuXHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCwgbW9kZWwpO1xuXG5cdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlLCBmYWxzZSk7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXG5cdFx0XHRcdGlmIChvTmV3RG9jdW1lbnRDb250ZXh0ICE9PSBvUm9vdENvbnRleHQpIHtcblx0XHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCB1bmRlZmluZWQgPSBvTmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0cmlnaHRtb3N0Q29udGV4dCA9IG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpO1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Sb290Q29udGV4dCwgcmlnaHRtb3N0Q29udGV4dCwgc1Byb2dyYW1taW5nTW9kZWwsIHRydWUpO1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgb05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT0gb05ld0RvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoKG9WaWV3RGF0YT8udmlld0xldmVsIGFzIG51bWJlcikgPiAxKSB7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob1Jvb3RDb250ZXh0LCBvQ29udGV4dCwgc1Byb2dyYW1taW5nTW9kZWwsIHRydWUpO1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSB0aGlzLl9nZXROYXZpZ2F0aW9uVGFyZ2V0Rm9yRWRpdChvQ29udGV4dCwgb05ld0RvY3VtZW50Q29udGV4dCwgc2libGluZ0luZm8pIGFzIENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIHRydWUsIGZhbHNlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHQvLyBUaGUgc3RpY2t5T24gaGFuZGxlciBtdXN0IGJlIHNldCBhZnRlciB0aGUgbmF2aWdhdGlvbiBoYXMgYmVlbiBkb25lLFxuXHRcdFx0XHRcdFx0Ly8gYXMgdGhlIFVSTCBtYXkgY2hhbmdlIGluIHRoZSBjYXNlIG9mIEZDTFxuXHRcdFx0XHRcdFx0bGV0IHN0aWNreUNvbnRleHQ6IENvbnRleHQ7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byB1c2UgdGhlIGtlcHQtYWxpdmUgY29udGV4dCB1c2VkIHRvIGJpbmQgdGhlIHBhZ2Vcblx0XHRcdFx0XHRcdFx0c3RpY2t5Q29udGV4dCA9IG9OZXdEb2N1bWVudENvbnRleHQuZ2V0TW9kZWwoKS5nZXRLZWVwQWxpdmVDb250ZXh0KG9OZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHN0aWNreUNvbnRleHQgPSBvTmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPbihzdGlja3lDb250ZXh0KTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG1vZGVsLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0XHRcdFx0Ly8gYWNjb3JkaW5nIHRvIFVYIGluIGNhc2Ugb2YgZW5hYmxlZCBjb2xsYWJvcmF0aW9uIGRyYWZ0IHdlIHNoYXJlIHRoZSBvYmplY3QgaW1tZWRpYXRlbHlcblx0XHRcdFx0XHRcdGF3YWl0IHNoYXJlT2JqZWN0KG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZWRpdGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIGFueSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgc2V2ZXJhbCBkb2N1bWVudHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0c1RvRGVsZXRlIFRoZSBjb250ZXh0cyBvZiB0aGUgZG9jdW1lbnRzIHRvIGRlbGV0ZVxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGRvY3VtZW50cyBhcmUgZGVsZXRlZFxuXHQgKi9cblx0YXN5bmMgZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMoY29udGV4dHNUb0RlbGV0ZTogQ29udGV4dFtdLCBwYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRpZiAocGFyYW1ldGVycykge1xuXHRcdFx0cGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGFyYW1ldGVycyA9IHtcblx0XHRcdFx0YmVmb3JlRGVsZXRlQ2FsbEJhY2s6IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IHBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKHBhcmFtZXRlcnMuY29udHJvbElkKTtcblx0XHRpZiAoIXBhcmVudENvbnRyb2wpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInBhcmFtZXRlciBjb250cm9sSWQgbWlzc2luZyBvciBpbmNvcnJlY3RcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHBhcmVudENvbnRyb2w7XG5cdFx0fVxuXHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gKHBhcmVudENvbnRyb2wuZ2V0QmluZGluZyhcIml0ZW1zXCIpIHx8IChwYXJlbnRDb250cm9sIGFzIFRhYmxlKS5nZXRSb3dCaW5kaW5nKCkpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0cGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzID0gdHJ1ZTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKGNvbnRleHRzVG9EZWxldGUsIHBhcmFtZXRlcnMpO1xuXHRcdFx0bGV0IHJlc3VsdDtcblxuXHRcdFx0Ly8gTXVsdGlwbGUgb2JqZWN0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGEgbGlzdFxuXHRcdFx0Ly8gRmlyc3QgY2xlYXIgdGhlIHNlbGVjdGlvbiBpbiB0aGUgdGFibGUgYXMgaXQncyBub3QgdmFsaWQgYW55IG1vcmVcblx0XHRcdGlmIChwYXJlbnRDb250cm9sLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0KHBhcmVudENvbnRyb2wgYXMgYW55KS5jbGVhclNlbGVjdGlvbigpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGVuIHJlZnJlc2ggdGhlIGxpc3QtYmluZGluZyAoTFIpLCBvciByZXF1aXJlIHNpZGUtZWZmZWN0cyAoT1ApXG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0aWYgKChsaXN0QmluZGluZyBhcyBhbnkpLmlzUm9vdCgpKSB7XG5cdFx0XHRcdC8vIGtlZXAgcHJvbWlzZSBjaGFpbiBwZW5kaW5nIHVudGlsIHJlZnJlc2ggb2YgbGlzdGJpbmRpbmcgaXMgY29tcGxldGVkXG5cdFx0XHRcdHJlc3VsdCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0bGlzdEJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGxpc3RCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdH0gZWxzZSBpZiAodmlld0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgdmlld0JpbmRpbmdDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGRlbGV0aW5nIGF0IGxlYXN0IG9uZSBvYmplY3Qgc2hvdWxkIGFsc28gc2V0IHRoZSBVSSB0byBkaXJ0eVxuXHRcdFx0aWYgKCF0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH1cblxuXHRcdFx0QWN0aXZpdHlTeW5jLnNlbmQoXG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRBY3Rpdml0eS5EZWxldGUsXG5cdFx0XHRcdGNvbnRleHRzVG9EZWxldGUubWFwKChjb250ZXh0OiBDb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IGFueSkge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50KHMpXCIsIGVycm9yKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBhbmQgZGlzcGxheXMgdGhlIGVycm9yIG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBlcnJvcnMgZHVyaW5nIGFuIHVwZGF0ZS5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB1cGRhdGVkQ29udGV4dCBDb250ZXh0IG9mIHRoZSB1cGRhdGVkIGZpZWxkXG5cdCAqIEBwYXJhbSB1cGRhdGVQcm9taXNlIFByb21pc2UgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLiBUaGUgcHJvbWlzZSBzaG91bGQgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHNvIHRoZSBkcmFmdCBzdGF0dXMgY2FuIGJlIHVwZGF0ZWQuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBkcmFmdCBzdGF0dXMgaGFzIGJlZW4gdXBkYXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjdXBkYXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0dXBkYXRlRG9jdW1lbnQodXBkYXRlZENvbnRleHQ6IG9iamVjdCwgdXBkYXRlUHJvbWlzZTogUHJvbWlzZTxhbnk+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgaXNEcmFmdCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbCh1cGRhdGVkQ29udGV4dCBhcyBCaW5kaW5nIHwgQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNEcmFmdCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB1cGRhdGVQcm9taXNlO1xuXHRcdFx0XHRjb25zdCBjdXJyZW50QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRpZiAoIWlzRHJhZnQgfHwgIWN1cnJlbnRCaW5kaW5nQ29udGV4dCB8fCBjdXJyZW50QmluZGluZ0NvbnRleHQgIT09IG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHQvLyBJZiBhIG5hdmlnYXRpb24gaGFwcGVuZWQgd2hpbGUgb1Byb21pc2Ugd2FzIGJlaW5nIHJlc29sdmVkLCB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGNoYW5nZWRcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSdyZSBzdGlsbCBvbiB0aGUgc2FtZSBjb250ZXh0XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXROYW1lID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpO1xuXHRcdFx0XHRjb25zdCBzZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMobWV0YU1vZGVsLCBlbnRpdHlTZXROYW1lKTtcblx0XHRcdFx0aWYgKHNlbWFudGljS2V5cz8ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRTZW1hbnRpY1BhdGggPSBjdXJyZW50U2VtYW50aWNNYXBwaW5nPy5zZW1hbnRpY1BhdGgsXG5cdFx0XHRcdFx0XHRzQ2hhbmdlZFBhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgoY3VycmVudEJpbmRpbmdDb250ZXh0LCB0cnVlKTtcblx0XHRcdFx0XHQvLyBjdXJyZW50U2VtYW50aWNQYXRoIGNvdWxkIGJlIG51bGwgaWYgd2UgaGF2ZSBuYXZpZ2F0ZWQgdmlhIGRlZXAgbGluayB0aGVuIHRoZXJlIGFyZSBubyBzZW1hbnRpY01hcHBpbmdzIHRvIGNhbGN1bGF0ZSBpdCBmcm9tXG5cdFx0XHRcdFx0aWYgKGN1cnJlbnRTZW1hbnRpY1BhdGggJiYgY3VycmVudFNlbWFudGljUGF0aCAhPT0gc0NoYW5nZWRQYXRoKSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGN1cnJlbnRCaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0LCB0cnVlLCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHVwZGF0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvcik7XG5cdFx0XHRcdGlmIChpc0RyYWZ0ICYmIG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0YXdhaXQgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vICogQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgU3luYyAtIHRoZSBjcmVhdGlvbiBpcyB0cmlnZ2VyZWQgYW5kIG9uY2UgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQsIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmVcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQXN5bmMgLSB0aGUgY3JlYXRpb24gYW5kIHRoZSBuYXZpZ2F0aW9uIHRvIHRoZSBpbnN0YW5jZSBhcmUgZG9uZSBpbiBwYXJhbGxlbFxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZCAtIHRoZSBjcmVhdGlvbiBpcyBkb25lIG9uIHRoZSB0YXJnZXQgcGFnZVxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBDcmVhdGlvblJvdyAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGlubGluZSBhc3luYyBzbyB0aGUgdXNlciBpcyBub3QgYmxvY2tlZFxuXHQvLyBtUGFyYW1ldGVycy5jcmVhdGlvblJvdyBJbnN0YW5jZSBvZiB0aGUgY3JlYXRpb24gcm93IC0gKFRPRE86IGdldCByaWQgYnV0IHVzZSBsaXN0IGJpbmRpbmdzIG9ubHkpXG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gdkxpc3RCaW5kaW5nICBPRGF0YUxpc3RCaW5kaW5nIG9iamVjdCBvciB0aGUgYmluZGluZyBwYXRoIGZvciBhIHRlbXBvcmFyeSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdCAqICAgICAgICAgICAgICAgICAgICBOZXdQYWdlIC0gdGhlIGNyZWF0ZWQgZG9jdW1lbnQgaXMgc2hvd24gaW4gYSBuZXcgcGFnZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgbWV0YWRhdGEgJ1N5bmMnLCAnQXN5bmMnIG9yICdEZWZlcnJlZCcgaXMgdXNlZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgSW5saW5lIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW5saW5lIChpbiBhIHRhYmxlKVxuXHQgKiAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbiBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBzcGVjaWZpZWQgdmlhIHRoZSBwYXJhbWV0ZXIgJ291dGJvdW5kJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5vdXRib3VuZCBUaGUgbmF2aWdhdGlvbiB0YXJnZXQgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0V4dGVybmFsJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGVBdEVuZCBTcGVjaWZpZXMgaWYgdGhlIG5ldyBlbnRyeSBzaG91bGQgYmUgY3JlYXRlZCBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiBhIHRhYmxlIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdJbmxpbmUnXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2NyZWF0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNyZWF0ZURvY3VtZW50KFxuXHRcdHZMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0XHRcdG91dGJvdW5kPzogc3RyaW5nO1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGxldCBvVGFibGU6IGFueTsgLy9zaG91bGQgYmUgVGFibGUgYnV0IHRoZXJlIGFyZSBtaXNzaW5nIG1ldGhvZHMgaW50byB0aGUgZGVmXG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzO1xuXHRcdGNvbnN0IGJTaG91bGRCdXN5TG9jayA9XG5cdFx0XHQhbVBhcmFtZXRlcnMgfHxcblx0XHRcdChtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5JbmxpbmUgJiZcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiZcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpO1xuXHRcdGxldCBvRXhlY0N1c3RvbVZhbGlkYXRpb24gPSBQcm9taXNlLnJlc29sdmUoW10pO1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5yZW1vdmVJQXBwU3RhdGVLZXkoKTtcblxuXHRcdGlmIChtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5FeHRlcm5hbCkge1xuXHRcdFx0Ly8gQ3JlYXRlIGJ5IG5hdmlnYXRpbmcgdG8gYW4gZXh0ZXJuYWwgdGFyZ2V0XG5cdFx0XHQvLyBUT0RPOiBDYWxsIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIChjdXJyZW50bHkgdXNpbmcgdGhlIHNhbWUgYXMgZm9yIG91dGJvdW5kIGNoZXZyb24gbmF2LCBhbmQgd2l0aG91dCBhbnkgY29udGV4dCAtIDNyZCBwYXJhbSlcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0Y29uc3Qgc0NyZWF0ZVBhdGggPSBNb2RlbEhlbHBlci5nZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmcodGhpcy5nZXRWaWV3KCksIHZMaXN0QmluZGluZyk7XG5cblx0XHRcdChvQ29udHJvbGxlciBhcyBhbnkpLmhhbmRsZXJzLm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZChvQ29udHJvbGxlciwgbVBhcmFtZXRlcnMub3V0Ym91bmQsIHVuZGVmaW5lZCwgc0NyZWF0ZVBhdGgpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93KSB7XG5cdFx0XHRjb25zdCBvQ3JlYXRpb25Sb3dPYmplY3RzID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRPYmplY3QoKTtcblx0XHRcdGRlbGV0ZSBvQ3JlYXRpb25Sb3dPYmplY3RzW1wiQCR1aTUuY29udGV4dC5pc1RyYW5zaWVudFwiXTtcblx0XHRcdG9UYWJsZSA9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93LmdldFBhcmVudCgpO1xuXHRcdFx0b0V4ZWNDdXN0b21WYWxpZGF0aW9uID0gdGhpcy52YWxpZGF0ZURvY3VtZW50KG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dCgpLCB7XG5cdFx0XHRcdGRhdGE6IG9DcmVhdGlvblJvd09iamVjdHMsXG5cdFx0XHRcdGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbjogb1RhYmxlLmdldENyZWF0aW9uUm93KCkuZGF0YShcImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvblwiKVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIGRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGEgaXMgc2V0IHRvIGZhbHNlIGluIG1hbmlmZXN0IGNvbnZlcnRlciAoVGFibGUudHMpIGlmIGN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiBleGlzdHNcblx0XHRcdGlmIChvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YVwiKSA9PT0gXCJ0cnVlXCIpIHtcblx0XHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZSAmJiBtUGFyYW1ldGVycy50YWJsZUlkKSB7XG5cdFx0XHRvVGFibGUgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLnRhYmxlSWQpIGFzIFRhYmxlO1xuXHRcdH1cblxuXHRcdGlmIChvVGFibGUgJiYgb1RhYmxlLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdGNvbnN0IGZuRm9jdXNPclNjcm9sbCA9XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZSA/IG9UYWJsZS5mb2N1c1Jvdy5iaW5kKG9UYWJsZSkgOiBvVGFibGUuc2Nyb2xsVG9JbmRleC5iaW5kKG9UYWJsZSk7XG5cdFx0XHRvVGFibGUuZ2V0Um93QmluZGluZygpLmF0dGFjaEV2ZW50T25jZShcImNoYW5nZVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGZuRm9jdXNPclNjcm9sbChtUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA/IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0TGVuZ3RoKCkgOiAwLCB0cnVlKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IGhhbmRsZVNpZGVFZmZlY3RzID0gYXN5bmMgKG9MaXN0QmluZGluZzogYW55LCBvQ3JlYXRpb25Qcm9taXNlOiBQcm9taXNlPENvbnRleHQ+KSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvTmV3Q29udGV4dCA9IGF3YWl0IG9DcmVhdGlvblByb21pc2U7XG5cdFx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0XHRhd2FpdCBvTmV3Q29udGV4dC5jcmVhdGVkKCk7XG5cdFx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChvTGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gYVZhbGlkYXRpb25NZXNzYWdlcyBFcnJvciBtZXNzYWdlcyBmcm9tIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0Y29uc3QgY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzID0gKGFWYWxpZGF0aW9uTWVzc2FnZXM6IGFueVtdKSA9PiB7XG5cdFx0XHRjb25zdCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gb1RhYmxlICYmIG9UYWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIik7XG5cdFx0XHRjb25zdCBtQ3VzdG9tVmFsaWRpdHkgPSBvVGFibGUgJiYgb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dDdXN0b21WYWxpZGl0eVwiKTtcblx0XHRcdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0XHRcdGNvbnN0IGFDdXN0b21NZXNzYWdlczogYW55W10gPSBbXTtcblx0XHRcdGxldCBvRmllbGRDb250cm9sO1xuXHRcdFx0bGV0IHNUYXJnZXQ6IHN0cmluZztcblxuXHRcdFx0Ly8gUmVtb3ZlIGV4aXN0aW5nIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0b01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9NZXNzYWdlLmNvZGUgPT09IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pIHtcblx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhvTWVzc2FnZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0YVZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKChvVmFsaWRhdGlvbk1lc3NhZ2U6IGFueSkgPT4ge1xuXHRcdFx0XHQvLyBIYW5kbGUgQm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRcdGlmIChvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldCkge1xuXHRcdFx0XHRcdG9GaWVsZENvbnRyb2wgPSBDb3JlLmdldENvbnRyb2wobUN1c3RvbVZhbGlkaXR5W29WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKSBhcyBDb250cm9sO1xuXHRcdFx0XHRcdHNUYXJnZXQgPSBgJHtvRmllbGRDb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKX0vJHtvRmllbGRDb250cm9sLmdldEJpbmRpbmdQYXRoKFwidmFsdWVcIil9YDtcblx0XHRcdFx0XHQvLyBBZGQgdmFsaWRhdGlvbiBtZXNzYWdlIGlmIHN0aWxsIG5vdCBleGlzdHNcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvTWVzc2FnZS50YXJnZXQgPT09IHNUYXJnZXQ7XG5cdFx0XHRcdFx0XHRcdH0pLmxlbmd0aCA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyLmFkZE1lc3NhZ2VzKFxuXHRcdFx0XHRcdFx0XHRuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdFx0XHRcdFx0bWVzc2FnZTogb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XHRcdFx0XHRcdFx0XHRjb2RlOiBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdHRlY2huaWNhbDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0cGVyc2lzdGVudDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0OiBzVGFyZ2V0XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBBZGQgY29udHJvbElkIGluIG9yZGVyIHRvIGdldCB0aGUgZm9jdXMgaGFuZGxpbmcgb2YgdGhlIGVycm9yIHBvcG92ZXIgcnVuYWJsZVxuXHRcdFx0XHRcdGNvbnN0IGFFeGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyA9IG9NZXNzYWdlTWFuYWdlclxuXHRcdFx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvTWVzc2FnZS50YXJnZXQgPT09IHNUYXJnZXQ7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXNbMF0uYWRkQ29udHJvbElkKG1DdXN0b21WYWxpZGl0eVtvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCk7XG5cblx0XHRcdFx0XHQvLyBIYW5kbGUgVW5ib3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhQ3VzdG9tTWVzc2FnZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRjb2RlOiBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0dGV4dDogb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoYUN1c3RvbU1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0XHRjdXN0b21NZXNzYWdlczogYUN1c3RvbU1lc3NhZ2VzXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjb25zdCByZXNvbHZlQ3JlYXRpb25Nb2RlID0gKFxuXHRcdFx0aW5pdGlhbENyZWF0aW9uTW9kZTogc3RyaW5nLFxuXHRcdFx0cHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLFxuXHRcdFx0b0xpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWxcblx0XHQpOiBzdHJpbmcgPT4ge1xuXHRcdFx0aWYgKGluaXRpYWxDcmVhdGlvbk1vZGUgJiYgaW5pdGlhbENyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UpIHtcblx0XHRcdFx0Ly8gdXNlIHRoZSBwYXNzZWQgY3JlYXRpb24gbW9kZVxuXHRcdFx0XHRyZXR1cm4gaW5pdGlhbENyZWF0aW9uTW9kZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE5ld0FjdGlvbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgTmF2aWdhdGlvblByb3BlcnR5IGNvbGxlY3Rpb25cblx0XHRcdFx0aWYgKCFvTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1BhdGggPSBvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0Ly8gaWYgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycyBpcyBwcmVzZW50LCB0aGVuIGNyZWF0aW9uIGlzICdEZWZlcnJlZCdcblx0XHRcdFx0XHRcdC8vIGluIHRoZSBhYnNlbmNlIG9mIE5ld0FjdGlvbiBvciBOZXdBY3Rpb24gd2l0aCBwYXJhbWV0ZXJzLCBjcmVhdGlvbiBpcyBhc3luY1xuXHRcdFx0XHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHRcdFx0XHQ/IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L05ld0FjdGlvbmApXG5cdFx0XHRcdFx0XHRcdFx0OiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL05ld0FjdGlvbmApO1xuXHRcdFx0XHRcdGlmIChzTmV3QWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBhUGFyYW1ldGVycyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtzTmV3QWN0aW9ufS9AJHVpNS5vdmVybG9hZC8wLyRQYXJhbWV0ZXJgKSB8fCBbXTtcblx0XHRcdFx0XHRcdC8vIGJpbmRpbmcgcGFyYW1ldGVyIChlZzogX2l0KSBpcyBub3QgY29uc2lkZXJlZFxuXHRcdFx0XHRcdFx0aWYgKGFQYXJhbWV0ZXJzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTGlzdEJpbmRpbmc/LmdldEhlYWRlckNvbnRleHQoKSEuZ2V0UGF0aCgpKTtcblx0XHRcdFx0Y29uc3QgYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyA9IGdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyhvTWV0YU1vZGVsLCBzTWV0YVBhdGgsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdFx0XHRpZiAoYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkFzeW5jO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAoYlNob3VsZEJ1c3lMb2NrKSB7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgYVZhbGlkYXRpb25NZXNzYWdlcyA9IGF3YWl0IHRoaXMuc3luY1Rhc2sob0V4ZWNDdXN0b21WYWxpZGF0aW9uKTtcblx0XHRcdGlmIChhVmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzKGFWYWxpZGF0aW9uTWVzc2FnZXMpO1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDdXN0b20gVmFsaWRhdGlvbiBmYWlsZWRcIik7XG5cdFx0XHRcdC8vIGlmIGN1c3RvbSB2YWxpZGF0aW9uIGZhaWxzLCB3ZSBsZWF2ZSB0aGUgbWV0aG9kIGltbWVkaWF0ZWx5XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0bGV0IG9MaXN0QmluZGluZzogYW55O1xuXHRcdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdFx0aWYgKHZMaXN0QmluZGluZyAmJiB0eXBlb2Ygdkxpc3RCaW5kaW5nID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdC8vIHdlIGFscmVhZHkgZ2V0IGEgbGlzdCBiaW5kaW5nIHVzZSB0aGlzIG9uZVxuXHRcdFx0XHRvTGlzdEJpbmRpbmcgPSB2TGlzdEJpbmRpbmc7XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2TGlzdEJpbmRpbmcgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0b0xpc3RCaW5kaW5nID0gbmV3IChPRGF0YUxpc3RCaW5kaW5nIGFzIGFueSkodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSwgdkxpc3RCaW5kaW5nKTtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLlN5bmM7XG5cdFx0XHRcdGRlbGV0ZSBtUGFyYW1ldGVycy5jcmVhdGVBdEVuZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgb2JqZWN0IG9yIHBhdGggZXhwZWN0ZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9MaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvTGlzdEJpbmRpbmcpO1xuXHRcdFx0Y29uc3QgcmVzb2x2ZWRDcmVhdGlvbk1vZGUgPSByZXNvbHZlQ3JlYXRpb25Nb2RlKFxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUsXG5cdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRvTGlzdEJpbmRpbmcsXG5cdFx0XHRcdG9Nb2RlbC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0KTtcblxuXHRcdFx0bGV0IG9DcmVhdGlvbjogYW55O1xuXHRcdFx0bGV0IG1BcmdzOiBhbnk7XG5cdFx0XHRjb25zdCBvQ3JlYXRpb25Sb3cgPSBtUGFyYW1ldGVycy5jcmVhdGlvblJvdztcblx0XHRcdGxldCBvQ3JlYXRpb25Sb3dDb250ZXh0OiBhbnk7XG5cdFx0XHRsZXQgb1BheWxvYWQ6IGFueTtcblx0XHRcdGxldCBzTWV0YVBhdGg6IHN0cmluZztcblx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBvUm91dGluZ0xpc3RlbmVyID0gdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKTtcblxuXHRcdFx0aWYgKHJlc29sdmVkQ3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuRGVmZXJyZWQpIHtcblx0XHRcdFx0aWYgKHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cpIHtcblx0XHRcdFx0XHRvQ3JlYXRpb25Sb3dDb250ZXh0ID0gb0NyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQ3JlYXRpb25Sb3dDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0Ly8gcHJlZmlsbCBkYXRhIGZyb20gY3JlYXRpb24gcm93XG5cdFx0XHRcdFx0b1BheWxvYWQgPSBvQ3JlYXRpb25Sb3dDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGEgPSB7fTtcblx0XHRcdFx0XHRPYmplY3Qua2V5cyhvUGF5bG9hZCkuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5UGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvUHJvcGVydHkgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9LyR7c1Byb3BlcnR5UGF0aH1gKTtcblx0XHRcdFx0XHRcdC8vIGVuc3VyZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBkZWVwIGNyZWF0ZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5ICYmIG9Qcm9wZXJ0eS4ka2luZCA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhW3NQcm9wZXJ0eVBhdGhdID0gb1BheWxvYWRbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKC8qb0NyZWF0aW9uUm93Q29udGV4dCovKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocmVzb2x2ZWRDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyB8fCByZXNvbHZlZENyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLklubGluZSkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgPSBmYWxzZTsgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0XHQvLyBidXN5IGhhbmRsaW5nIHNoYWxsIGJlIGRvbmUgbG9jYWxseSBvbmx5XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuYnVzeU1vZGUgPSBcIkxvY2FsXCI7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuYnVzeUlkID0gb1RhYmxlPy5nZXRQYXJlbnQoKT8uZ2V0VGFibGVEZWZpbml0aW9uKCk/LmFubm90YXRpb24uaWQ7XG5cblx0XHRcdFx0XHQvLyB0YWtlIGNhcmUgb24gbWVzc2FnZSBoYW5kbGluZywgZHJhZnQgaW5kaWNhdG9yIChpbiBjYXNlIG9mIGRyYWZ0KVxuXHRcdFx0XHRcdC8vIEF0dGFjaCB0aGUgY3JlYXRlIHNlbnQgYW5kIGNyZWF0ZSBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHRcdFx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyhvTGlzdEJpbmRpbmcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrID0gdGhpcy5vbkJlZm9yZUNyZWF0ZTtcblxuXHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiB3YXMgY2FsbGVkIHdpdGggcHJlZmVycmVkTW9kZT1hdXRvQ3JlYXRlV2l0aCwgd2Ugd2FudCB0byBza2lwIHRoZVxuXHRcdFx0XHQvLyBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHRcdFx0XHRtUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nID0gb0FwcENvbXBvbmVudC5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5BdXRvQ3JlYXRlO1xuXG5cdFx0XHRcdG9DcmVhdGlvbiA9IHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdG9MaXN0QmluZGluZyxcblx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0XHRmYWxzZVxuXHRcdFx0XHQpO1xuXHRcdFx0XHQvLyBTaWRlRWZmZWN0cyBvbiBDcmVhdGVcblx0XHRcdFx0Ly8gaWYgU2F2ZSBpcyBwcmVzc2VkIGRpcmVjdGx5IGFmdGVyIGZpbGxpbmcgdGhlIENyZWF0aW9uUm93LCBubyBTaWRlRWZmZWN0cyByZXF1ZXN0XG5cdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuYlNraXBTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRcdGhhbmRsZVNpZGVFZmZlY3RzKG9MaXN0QmluZGluZywgb0NyZWF0aW9uKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRsZXQgb05hdmlnYXRpb247XG5cdFx0XHRzd2l0Y2ggKHJlc29sdmVkQ3JlYXRpb25Nb2RlKSB7XG5cdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkRlZmVycmVkOlxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0xpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdFx0XHRiRGVmZXJyZWRDb250ZXh0OiB0cnVlLFxuXHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRiRm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5Bc3luYzpcblx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG9MaXN0QmluZGluZywge1xuXHRcdFx0XHRcdFx0YXN5bmNDb250ZXh0OiBvQ3JlYXRpb24sXG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLlN5bmM6XG5cdFx0XHRcdFx0bUFyZ3MgPSB7XG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgbVBhcmFtZXRlcnMuY3JlYXRlQWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRtQXJncy50cmFuc2llbnQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IG9DcmVhdGlvbi50aGVuKGZ1bmN0aW9uIChvTmV3RG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmICghb05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjb3JlUmVzb3VyY2VCdW5kbGUgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UoXG5cdFx0XHRcdFx0XHRcdFx0Y29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19FRElURkxPV19TQVBGRV9DUkVBVElPTl9GQUlMRURfREVTQ1JJUFRJT05cIilcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBTeW5jIGNyZWF0aW9uIHdhcyB0cmlnZ2VyZWQgZm9yIGEgZGVmZXJyZWQgY3JlYXRpb24sIHdlIGRvbid0IG5hdmlnYXRlIGZvcndhcmRcblx0XHRcdFx0XHRcdFx0Ly8gYXMgd2UncmUgYWxyZWFkeSBvbiB0aGUgY29ycmVzcG9uZGluZyBPYmplY3RQYWdlXG5cdFx0XHRcdFx0XHRcdHJldHVybiBtUGFyYW1ldGVycy5iRnJvbURlZmVycmVkXG5cdFx0XHRcdFx0XHRcdFx0PyBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9Db250ZXh0KG9OZXdEb2N1bWVudENvbnRleHQsIG1BcmdzKVxuXHRcdFx0XHRcdFx0XHRcdDogb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob05ld0RvY3VtZW50Q29udGV4dCwgbUFyZ3MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5JbmxpbmU6XG5cdFx0XHRcdFx0dGhpcy5zeW5jVGFzayhvQ3JlYXRpb24pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdzpcblx0XHRcdFx0XHQvLyB0aGUgY3JlYXRpb24gcm93IHNoYWxsIGJlIGNsZWFyZWQgb25jZSB0aGUgdmFsaWRhdGlvbiBjaGVjayB3YXMgc3VjY2Vzc2Z1bCBhbmRcblx0XHRcdFx0XHQvLyB0aGVyZWZvcmUgdGhlIFBPU1QgY2FuIGJlIHNlbnQgYXN5bmMgdG8gdGhlIGJhY2tlbmRcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0NyZWF0aW9uUm93TGlzdEJpbmRpbmcgPSBvQ3JlYXRpb25Sb3dDb250ZXh0LmdldEJpbmRpbmcoKTtcblxuXHRcdFx0XHRcdFx0Y29uc3Qgb05ld1RyYW5zaWVudENvbnRleHQgPSBvQ3JlYXRpb25Sb3dMaXN0QmluZGluZy5jcmVhdGUoKTtcblx0XHRcdFx0XHRcdG9DcmVhdGlvblJvdy5zZXRCaW5kaW5nQ29udGV4dChvTmV3VHJhbnNpZW50Q29udGV4dCk7XG5cblx0XHRcdFx0XHRcdC8vIHRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIGNvbnNvbGUgZXJyb3JzIFRPIGJlIGNoZWNrZWQgd2l0aCBtb2RlbCBjb2xsZWFndWVzXG5cdFx0XHRcdFx0XHRvTmV3VHJhbnNpZW50Q29udGV4dC5jcmVhdGVkKCkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgZmFzdCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb0NyZWF0aW9uUm93Q29udGV4dC5kZWxldGUoXCIkZGlyZWN0XCIpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHQvLyBSZXNldCBidXN5IGluZGljYXRvciBhZnRlciBhIHZhbGlkYXRpb24gZXJyb3Jcblx0XHRcdFx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpKSB7XG5cdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ3JlYXRpb25Sb3cgbmF2aWdhdGlvbiBlcnJvcjogXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gUHJvbWlzZS5yZWplY3QoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgJHtyZXNvbHZlZENyZWF0aW9uTW9kZX1gKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9DcmVhdGlvbikge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IGFQYXJhbXMgPSBhd2FpdCBQcm9taXNlLmFsbChbb0NyZWF0aW9uLCBvTmF2aWdhdGlvbl0pO1xuXHRcdFx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwsIG9Nb2RlbCk7XG5cblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTsgLy8gVGhlIGNyZWF0ZU1vZGUgZmxhZyB3aWxsIGJlIHNldCBpbiBjb21wdXRlRWRpdE1vZGVcblx0XHRcdFx0XHRpZiAoIW9MaXN0QmluZGluZy5pc1JlbGF0aXZlKCkgJiYgc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHQvLyBXb3JrYXJvdW5kIHRvIHRlbGwgdGhlIE9QIHRoYXQgd2UndmUgY3JlYXRlZCBhIG5ldyBvYmplY3QgZnJvbSB0aGUgTFJcblx0XHRcdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG9MaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuYmluZENvbnRleHQobWV0YU1vZGVsLmdldE1ldGFQYXRoKG9MaXN0QmluZGluZy5nZXRQYXRoKCkpKTtcblx0XHRcdFx0XHRcdGNvbnN0IGVudGl0eVNldCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkuc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdFx0XHRcdFx0Y29uc3QgbmV3QWN0aW9uID0gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkPy5OZXdBY3Rpb247XG5cdFx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBuZXdBY3Rpb24pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBvTmV3RG9jdW1lbnRDb250ZXh0ID0gYVBhcmFtc1swXTtcblx0XHRcdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUob0xpc3RCaW5kaW5nKTtcblx0XHRcdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQ3JlYXRlLCBvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHRcdGlmIChNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChvTW9kZWwuZ2V0TWV0YU1vZGVsKCkpICYmICFBY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGFjY29yZGluZyB0byBVWCBpbiBjYXNlIG9mIGVuYWJsZWQgY29sbGFib3JhdGlvbiBkcmFmdCB3ZSBzaGFyZSB0aGUgb2JqZWN0IGltbWVkaWF0ZWx5XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHNoYXJlT2JqZWN0KG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHQvLyBUT0RPOiBjdXJyZW50bHksIHRoZSBvbmx5IGVycm9ycyBoYW5kbGVkIGhlcmUgYXJlIHJhaXNlZCBhcyBzdHJpbmcgLSBzaG91bGQgYmUgY2hhbmdlZCB0byBFcnJvciBvYmplY3RzXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0ZXJyb3IgPT09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cgfHxcblx0XHRcdFx0XHRcdGVycm9yID09PSBDb25zdGFudHMuQWN0aW9uRXhlY3V0aW9uRmFpbGVkIHx8XG5cdFx0XHRcdFx0XHRlcnJvciA9PT0gQ29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHQvLyBjcmVhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQgYnkgdXNlciBvciBmYWlsZWQgaW4gYmFja2VuZCA9PiBpbiBjYXNlIHdlIGhhdmUgbmF2aWdhdGVkIHRvIHRyYW5zaWVudCBjb250ZXh0IGJlZm9yZSwgbmF2aWdhdGUgYmFja1xuXHRcdFx0XHRcdFx0Ly8gdGhlIHN3aXRjaC1zdGF0ZW1lbnQgYWJvdmUgc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGhhcHBlbnMgaW4gY3JlYXRpb25Nb2RlcyBkZWZlcnJlZCBhbmQgYXN5bmMuIEJ1dCBpbiBmYWN0LCBpbiB0aGVzZSBjYXNlcyBhZnRlciB0aGUgbmF2aWdhdGlvbiBmcm9tIHJvdXRlTWF0Y2hlZCBpbiBPUCBjb21wb25lbnRcblx0XHRcdFx0XHRcdC8vIGNyZWF0ZURlZmVycmVkQ29udGV4dCBpcyB0cmlnZ2VyZCwgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgKGNyZWF0ZURvY3VtZW50KSBhZ2FpbiAtIHRoaXMgdGltZSB3aXRoIGNyZWF0aW9uTW9kZSBzeW5jLiBUaGVyZWZvcmUsIGFsc28gaW4gdGhhdCBtb2RlIHdlIG5lZWQgdG8gdHJpZ2dlciBiYWNrIG5hdmlnYXRpb24uXG5cdFx0XHRcdFx0XHQvLyBUaGUgb3RoZXIgY2FzZXMgbWlnaHQgc3RpbGwgYmUgbmVlZGVkIGluIGNhc2UgdGhlIG5hdmlnYXRpb24gZmFpbHMuXG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuU3luYyB8fFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkRlZmVycmVkIHx8XG5cdFx0XHRcdFx0XHRcdHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQXN5bmNcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoYlNob3VsZEJ1c3lMb2NrKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVmFsaWRhdGVzIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqL1xuXG5cdHZhbGlkYXRlRG9jdW1lbnQoY29udGV4dDogQ29udGV4dCwgcGFyYW1ldGVyczogYW55KTogUHJvbWlzZTxhbnk+IHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnZhbGlkYXRlRG9jdW1lbnQoY29udGV4dCwgcGFyYW1ldGVycywgdGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgc2V2ZXJhbCBkb2N1bWVudHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdEJpbmRpbmcgdXNlZCB0byBjcmVhdGUgdGhlIGRvY3VtZW50c1xuXHQgKiBAcGFyYW0gZGF0YUZvckNyZWF0ZSBUaGUgaW5pdGlhbCBkYXRhIGZvciB0aGUgbmV3IGRvY3VtZW50c1xuXHQgKiBAcGFyYW0gY3JlYXRlQXRFbmQgVHJ1ZSBpZiB0aGUgbmV3IGNvbnRleHRzIG5lZWQgdG8gYmUgY3JhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gaXNGcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcGFyYW0gYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIGNyZWF0ZUFzSW5hY3RpdmUgVHJ1ZSBpZiB0aGUgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGluYWN0aXZlXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHRzLlxuXHQgKi9cblx0YXN5bmMgY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0ZGF0YUZvckNyZWF0ZTogYW55W10sXG5cdFx0Y3JlYXRlQXRFbmQ6IGJvb2xlYW4sXG5cdFx0aXNGcm9tQ29weVBhc3RlOiBib29sZWFuLFxuXHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb24sXG5cdFx0Y3JlYXRlQXNJbmFjdGl2ZSA9IGZhbHNlXG5cdCkge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCB0YXJnZXRMaXN0QmluZGluZyA9IGxpc3RCaW5kaW5nO1xuXG5cdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGlmIChiZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0XHRhd2FpdCBiZWZvcmVDcmVhdGVDYWxsQmFjayh7IGNvbnRleHRQYXRoOiB0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCkgfSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IHRhcmdldExpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRsZXQgbWV0YVBhdGg6IHN0cmluZztcblxuXHRcdFx0aWYgKHRhcmdldExpc3RCaW5kaW5nLmdldENvbnRleHQoKSkge1xuXHRcdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChgJHt0YXJnZXRMaXN0QmluZGluZy5nZXRDb250ZXh0KCkuZ2V0UGF0aCgpfS8ke3RhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKX1gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKHRhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKHRhcmdldExpc3RCaW5kaW5nKTtcblxuXHRcdFx0Ly8gSXRlcmF0ZSBvbiBhbGwgaXRlbXMgYW5kIHN0b3JlIHRoZSBjb3JyZXNwb25kaW5nIGNyZWF0aW9uIHByb21pc2Vcblx0XHRcdGNvbnN0IGNyZWF0aW9uUHJvbWlzZXMgPSBkYXRhRm9yQ3JlYXRlLm1hcCgocHJvcGVydHlWYWx1ZXMpID0+IHtcblx0XHRcdFx0Y29uc3QgY3JlYXRlUGFyYW1ldGVyczogYW55ID0geyBkYXRhOiB7fSB9O1xuXG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmJ1c3lNb2RlID0gXCJOb25lXCI7XG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93O1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA9IGNyZWF0ZUF0RW5kO1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmluYWN0aXZlID0gY3JlYXRlQXNJbmFjdGl2ZTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFzIHdlIGRvbid0IHN1cHBvcnQgZGVlcCBjcmVhdGVcblx0XHRcdFx0Zm9yIChjb25zdCBwcm9wZXJ0eVBhdGggaW4gcHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7bWV0YVBhdGh9LyR7cHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdHByb3BlcnR5ICYmXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eS4ka2luZCAhPT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJlxuXHRcdFx0XHRcdFx0cHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpIDwgMCAmJlxuXHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcGVydHlQYXRoXVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5kYXRhW3Byb3BlcnR5UGF0aF0gPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0cmFuc2FjdGlvbkhlbHBlci5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0XHR0YXJnZXRMaXN0QmluZGluZyxcblx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRcdGlzRnJvbUNvcHlQYXN0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGNyZWF0ZWRDb250ZXh0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNyZWF0aW9uUHJvbWlzZXMpO1xuXHRcdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKHRhcmdldExpc3RCaW5kaW5nKTtcblx0XHRcdH1cblx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRcdGNyZWF0ZWRDb250ZXh0cy5tYXAoKG5ld0NvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdGlmICghbmV3Q29udGV4dC5iSW5hY3RpdmUpIHtcblx0XHRcdFx0XHRcdHJldHVybiBuZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0aWYgKCFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KHRhcmdldExpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSh0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCksIHZpZXdCaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNyZWF0ZWRDb250ZXh0cztcblx0XHR9IGNhdGNoIChlcnI6IGFueSkge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgbXVsdGlwbGUgZG9jdW1lbnRzLlwiKTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnU2F2ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ1NhdmUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdTYXZlJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZVNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIHNhdmVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlU2F2ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVTYXZlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdDcmVhdGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jcmVhdGVQYXJhbWV0ZXJzIEFycmF5IG9mIHZhbHVlcyB0aGF0IGFyZSBmaWxsZWQgaW4gdGhlIEFjdGlvbiBQYXJhbWV0ZXIgRGlhbG9nXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVDcmVhdGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0UGF0aD86IHN0cmluZzsgY3JlYXRlUGFyYW1ldGVycz86IGFueVtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRWRpdCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0VkaXQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdFZGl0JyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUVkaXRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGVkaXRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGRpc3BsYXkgbW9kZS5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZUVkaXRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQmVmb3JlRWRpdChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGlzY2FyZCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURpc2NhcmRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGRpc2NhcmRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZURpc2NhcmRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQmVmb3JlRGlzY2FyZChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGVsZXRlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgc3RvcHBlZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEZWxldGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBkZWxldGVkXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZURlbGV0ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVEZWxldGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIEluZGljYXRlcyB3aGV0aGVyIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgaWdub3JlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIFNhdmUgZHVyaW5nIGFuIElubGluZSBjcmVhdGlvblxuXHQvLyBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMuYmluZGluZ3MgTGlzdCBiaW5kaW5ncyBvZiB0aGUgdGFibGVzIGluIHRoZSB2aWV3LlxuXHQvLyBCb3RoIG9mIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGFyZSBmb3IgdGhlIHNhbWUgcHVycG9zZS4gVXNlciBjYW4gZW50ZXIgc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgY3JlYXRpb24gcm93KHMpIGJ1dCBkb2VzIG5vdCAnQWRkIHJvdycsIGluc3RlYWQgY2xpY2tzIFNhdmUuXG5cdC8vIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIGluIHRoZSB2aWV3LlxuXG5cdC8qKlxuXHQgKiBTYXZlcyBhIG5ldyBkb2N1bWVudCBhZnRlciBjaGVja2luZyBpdC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIFBSSVZBVEVcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHNhdmUgaXMgY29tcGxldGVcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3NhdmVEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBzYXZlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1QYXJhbWV0ZXJzOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGNvbnN0IGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgfHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGJEcmFmdE5hdmlnYXRpb24gPSB0cnVlO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGFCaW5kaW5ncyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGF3YWl0IHRoaXMuX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0KTtcblx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlU2F2ZSh7IGNvbnRleHQ6IG9Db250ZXh0IH0pO1xuXG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmXG5cdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuc2F2ZURvY3VtZW50KFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcixcblx0XHRcdFx0YUJpbmRpbmdzLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKClcblx0XHRcdCk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkFjdGl2YXRlLCBhY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0QWN0aXZpdHlTeW5jLmRpc2Nvbm5lY3QodGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0XHR0aGlzLl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShTdGFuZGFyZEFjdGlvbnMuc2F2ZSwgVHJpZ2dlclR5cGUuc3RhbmRhcmRBY3Rpb24pO1xuXG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblxuXHRcdFx0aWYgKGFjdGl2ZURvY3VtZW50Q29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gYWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gYWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCBmYWxzZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdGlmICghKG9FcnJvciAmJiBvRXJyb3IuY2FuY2VsZWQpKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdH1cblx0XHRcdHRocm93IG9FcnJvcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3dpdGNoZXMgdGhlIFVJIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIHN3aXRjaCBmcm9tXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgc3dpdGNoIGlzIGRvbmVcblx0ICovXG5cdGFzeW5jIHRvZ2dsZURyYWZ0QWN0aXZlKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0bGV0IGJFZGl0YWJsZTogYm9vbGVhbjtcblx0XHRjb25zdCBiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHQvL3RvZ2dsZSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQgaXMgb25seSBhdmFpbGFibGUgZm9yIGVkaXQgZHJhZnRzIGFuZCBhY3RpdmUgZG9jdW1lbnRzIHdpdGggZHJhZnQpXG5cdFx0aWYgKFxuXHRcdFx0IWJJc0RyYWZ0IHx8XG5cdFx0XHQhKFxuXHRcdFx0XHQoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB8fFxuXHRcdFx0XHQob0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSlcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHQvL3N0YXJ0IFBvaW50OiBlZGl0IGRyYWZ0XG5cdFx0XHRiRWRpdGFibGUgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gc3RhcnQgcG9pbnQgYWN0aXZlIGRvY3VtZW50XG5cdFx0XHRiRWRpdGFibGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0Y29uc3Qgb1JpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvQ29udGV4dDtcblx0XHRcdGNvbnN0IHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb1JpZ2h0bW9zdENvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdGlmIChzaWJsaW5nSW5mbykge1xuXHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKGJFZGl0YWJsZSA/IEVkaXRNb2RlLkVkaXRhYmxlIDogRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpOyAvL3N3aXRjaCB0byBlZGl0IG1vZGUgb25seSBpZiBhIGRyYWZ0IGlzIGF2YWlsYWJsZVxuXG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgbGFzdFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdFx0XHRcdGlmIChsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBvQ29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHRhcmdldFBhdGggPSBzaWJsaW5nSW5mby5wYXRoTWFwcGluZ1tzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdFx0XHRcdFx0c2libGluZ0luZm8ucGF0aE1hcHBpbmcucHVzaCh7IG9sZFBhdGg6IGxhc3RTZW1hbnRpY01hcHBpbmcuc2VtYW50aWNQYXRoLCBuZXdQYXRoOiB0YXJnZXRQYXRoIH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQsIGJFZGl0YWJsZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZSAtIENhbm5vdCBmaW5kIHNpYmxpbmdcIik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIEVkaXRGbG93LnRvZ2dsZURyYWZ0QWN0aXZlOiR7b0Vycm9yfWApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3NhcC5tLkJ1dHRvbn0gbVBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uIC0gQ3VycmVudGx5IHRoaXMgaXMgcGFzc2VkIGFzIGNhbmNlbEJ1dHRvbiBpbnRlcm5hbGx5IChyZXBsYWNlZCBieSBtUGFyYW1ldGVycy5jb250cm9sIGluIHRoZSBKU0RvYyBiZWxvdykuIEN1cnJlbnRseSBpdCBpcyBhbHNvIG1hbmRhdG9yeS5cblx0Ly8gUGxhbiAtIFRoaXMgc2hvdWxkIG5vdCBiZSBtYW5kYXRvcnkuIElmIG5vdCBwcm92aWRlZCwgd2Ugc2hvdWxkIGhhdmUgYSBkZWZhdWx0IHRoYXQgY2FuIGFjdCBhcyByZWZlcmVuY2UgY29udHJvbCBmb3IgdGhlIGRpc2NhcmQgcG9wb3ZlciBPUiB3ZSBjYW4gc2hvdyBhIGRpYWxvZyBpbnN0ZWFkIG9mIGEgcG9wb3Zlci5cblxuXHQvKipcblx0ICogRGlzY2FyZCB0aGUgZWRpdGFibGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGVkaXRhYmxlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5jb250cm9sIFRoaXMgaXMgdGhlIGNvbnRyb2wgdXNlZCB0byBvcGVuIHRoZSBkaXNjYXJkIHBvcG92ZXJcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnNraXBEaXNjYXJkUG9wb3ZlciBPcHRpb25hbCwgc3VwcmVzc2VzIHRoZSBkaXNjYXJkIHBvcG92ZXIgYW5kIGFsbG93cyBjdXN0b20gaGFuZGxpbmdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGVkaXRhYmxlIGRvY3VtZW50IGhhcyBiZWVuIGRpc2NhcmRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjY2FuY2VsRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgY2FuY2VsRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1QYXJhbWV0ZXJzOiB7IGNvbnRyb2w6IG9iamVjdDsgc2tpcERpc2NhcmRQb3BvdmVyPzogYm9vbGVhbiB9KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBtSW5QYXJhbWV0ZXJzOiBhbnkgPSBtUGFyYW1ldGVycztcblx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblxuXHRcdG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uID0gbVBhcmFtZXRlcnMuY29udHJvbCB8fCBtSW5QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbjtcblx0XHRtSW5QYXJhbWV0ZXJzLmJlZm9yZUNhbmNlbENhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGlzY2FyZDtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRpZiAoKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiYgdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueTtcblxuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY2FuY2VsUmVzdWx0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuY2FuY2VsRG9jdW1lbnQoXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRtSW5QYXJhbWV0ZXJzLFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0dGhpcy5nZXRDcmVhdGlvbk1vZGUoKSxcblx0XHRcdFx0dGhpcy5pc0RvY3VtZW50TW9kaWZpZWQoKVxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IGJEcmFmdE5hdmlnYXRpb24gPSB0cnVlO1xuXHRcdFx0dGhpcy5fcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCk7XG5cblx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0Ly8gd2UgZm9yY2UgdGhlIGVkaXQgc3RhdGUgZXZlbiBmb3IgRkNMIGJlY2F1c2UgdGhlIGRyYWZ0IGRpc2NhcmQgbWlnaHQgbm90IGJlIGltcGxlbWVudGVkXG5cdFx0XHQvLyBhbmQgd2UgbWF5IGp1c3QgZGVsZXRlIHRoZSBkcmFmdFxuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cblx0XHRcdGlmICghY2FuY2VsUmVzdWx0KSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCB1bmRlZmluZWQpO1xuXHRcdFx0XHRBY3Rpdml0eVN5bmMuZGlzY29ubmVjdCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0XHRcdC8vaW4gY2FzZSBvZiBhIG5ldyBkb2N1bWVudCwgbm8gYWN0aXZlQ29udGV4dCBpcyByZXR1cm5lZCAtLT4gbmF2aWdhdGUgYmFjay5cblx0XHRcdFx0aWYgKCFtSW5QYXJhbWV0ZXJzLnNraXBCYWNrTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gY2FuY2VsUmVzdWx0IGFzIENvbnRleHQ7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0QWN0aXZpdHlTeW5jLmRpc2Nvbm5lY3QodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGUgPSBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9PSBvQWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdC8vIFdlIG5lZWQgdG8gbG9hZCB0aGUgc2VtYW50aWMga2V5cyBvZiB0aGUgYWN0aXZlIGNvbnRleHQsIGFzIHdlIG5lZWQgdGhlbVxuXHRcdFx0XHRcdC8vIGZvciB0aGUgbmF2aWdhdGlvblxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMob0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0Ly8gV2UgZm9yY2UgdGhlIHJlY3JlYXRpb24gb2YgdGhlIGNvbnRleHQsIHNvIHRoYXQgaXQncyBjcmVhdGVkIGFuZCBib3VuZCBpbiB0aGUgc2FtZSBtaWNyb3Rhc2ssXG5cdFx0XHRcdFx0Ly8gc28gdGhhdCBhbGwgcHJvcGVydGllcyBhcmUgbG9hZGVkIHRvZ2V0aGVyIGJ5IGF1dG9FeHBhbmRTZWxlY3QsIHNvIHRoYXQgd2hlbiBzd2l0Y2hpbmcgYmFjayB0byBFZGl0IG1vZGVcblx0XHRcdFx0XHQvLyAkJGluaGVyaXRFeHBhbmRTZWxlY3QgdGFrZXMgYWxsIGxvYWRlZCBwcm9wZXJ0aWVzIGludG8gYWNjb3VudCAoQkNQIDIwNzA0NjIyNjUpXG5cdFx0XHRcdFx0aWYgKCFtSW5QYXJhbWV0ZXJzLnNraXBCaW5kaW5nVG9WaWV3KSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCBmYWxzZSwgdHJ1ZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvL2FjdGl2ZSBjb250ZXh0IGlzIHJldHVybmVkIGluIGNhc2Ugb2YgY2FuY2VsIG9mIGV4aXN0aW5nIGRvY3VtZW50XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgZmFsc2UsIGZhbHNlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGlzY2FyZGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIGFueSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIGNvbnRleHQgY29ycmVzcG9uZHMgdG8gYSBkcmFmdCByb290LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBjaGVja1xuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjb250ZXh0IHBvaW50cyB0byBhIGRyYWZ0IHJvb3Rcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHByb3RlY3RlZCBpc0RyYWZ0Um9vdChjb250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRyZXR1cm4gTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS50YXJnZXRFbnRpdHlTZXQpO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lIE5hbWUgb2YgdGhlIEVudGl0eVNldCB0byB3aGljaCB0aGUgb2JqZWN0IGJlbG9uZ3NcblxuXHQvKipcblx0ICogRGVsZXRlcyB0aGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZG9jdW1lbnQgaGFzIGJlZW4gZGVsZXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjZGVsZXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgZGVsZXRlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1JblBhcmFtZXRlcnM6IHsgdGl0bGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzO1xuXHRcdGlmICghbVBhcmFtZXRlcnMpIHtcblx0XHRcdG1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzOiBmYWxzZVxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0cyA9IGZhbHNlO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLl9pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0XHR0aGlzLmlzRHJhZnRSb290KG9Db250ZXh0KSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRJbmRleCgpID09PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0RyYWZ0RW50aXR5XCIpID09PSB0cnVlXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gRGVsZXRpbmcgYW4gYWN0aXZlIGVudGl0eSB3aGljaCBoYXMgYSBkcmFmdCB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGJlIGRpc3BsYXllZCBpbiB0aGUgTGlzdFJlcG9ydCAoRkNMIGNhc2UpXG5cdFx0XHRcdC8vIC0tPiBuZWVkIHRvIHJlbW92ZSB0aGUgZHJhZnQgZnJvbSB0aGUgTFIgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgYWN0aXZlIHZlcnNpb24sIHNvIHRoYXQgdGhlIExpc3RCaW5kaW5nIGlzIHByb3Blcmx5IHJlZnJlc2hlZFxuXHRcdFx0XHQvLyBUaGUgY29uZGl0aW9uICdvQ29udGV4dC5nZXRJbmRleCgpID09PSB1bmRlZmluZWQnIG1ha2VzIHN1cmUgdGhlIGFjdGl2ZSB2ZXJzaW9uIGlzbid0IGFscmVhZHkgZGlzcGxheWVkIGluIHRoZSBMUlxuXHRcdFx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IGFzeW5jIChwYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KSA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlKHBhcmFtZXRlcnMpO1xuXG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IG1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkcmFmdFBhdGggPSBhd2FpdCBzaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRDb250ZXh0VG9SZW1vdmUgPSBtb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGRyYWZ0UGF0aCk7XG5cdFx0XHRcdFx0XHRkcmFmdENvbnRleHRUb1JlbW92ZS5yZXBsYWNlV2l0aChvQ29udGV4dCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcGxhY2luZyB0aGUgZHJhZnQgaW5zdGFuY2UgaW4gdGhlIExSIE9ETEJcIiwgZXJyb3IgYXMgYW55KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0XHQvLyBTaW5nbGUgb2JqZXQgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYW4gT1AgaGVhZGVyIGJ1dHRvbiAobm90IGZyb20gYSBsaXN0KVxuXHRcdFx0Ly8gLS0+IE1hcmsgVUkgZGlydHkgYW5kIG5hdmlnYXRlIGJhY2sgdG8gZGlzbWlzcyB0aGUgT1Bcblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGVsZXRlLCBvQ29udGV4dCk7XG5cblx0XHRcdC8vIEFmdGVyIGRlbGV0ZSBpcyBzdWNjZXNzZnVsbCwgd2UgbmVlZCB0byBkZXRhY2ggdGhlIHNldEJhY2tOYXZpZ2F0aW9uIE1ldGhvZHNcblx0XHRcdGlmIChvQXBwQ29tcG9uZW50KSB7XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvQXBwQ29tcG9uZW50Py5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5EZWVwbGluayAmJiAhdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgYXBwIGhhcyBiZWVuIGxhdW5jaGVkIHdpdGggc2VtYW50aWMga2V5cywgZGVsZXRpbmcgdGhlIG9iamVjdCB3ZSd2ZSBsYW5kZWQgb24gc2hhbGwgbmF2aWdhdGUgYmFja1xuXHRcdFx0XHQvLyB0byB0aGUgYXBwIHdlIGNhbWUgZnJvbSAoZXhjZXB0IGZvciBGQ0wsIHdoZXJlIHdlIG5hdmlnYXRlIHRvIExSIGFzIHVzdWFsKVxuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZXhpdEZyb21BcHAoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgYW55KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3VibWl0IHRoZSBjdXJyZW50IHNldCBvZiBjaGFuZ2VzIGFuZCBuYXZpZ2F0ZSBiYWNrLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNhcHBseURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGFwcGx5RG9jdW1lbnQob0NvbnRleHQ6IG9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblx0XHRcdGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb25dIEJvb2xlYW4gdmFsdWUgZm9yIHN0YXRpYyBhY3Rpb24sIHVuZGVmaW5lZCBmb3Igb3RoZXIgYWN0aW9uc1xuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5pc05hdmlnYWJsZV0gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkXG5cdC8vIEN1cnJlbnRseSB0aGUgcGFyYW1ldGVyIGlzTmF2aWdhYmxlIGlzIHVzZWQgaW50ZXJuYWxseSBhbmQgc2hvdWxkIGJlIGNoYW5nZWQgdG8gcmVxdWlyZXNOYXZpZ2F0aW9uIGFzIGl0IGlzIGEgbW9yZSBhcHQgbmFtZSBmb3IgdGhpcyBwYXJhbVxuXG5cdC8qKlxuXHQgKiBJbnZva2VzIGFuIGFjdGlvbiAoYm91bmQgb3IgdW5ib3VuZCkgYW5kIHRyYWNrcyB0aGUgY2hhbmdlcyBzbyB0aGF0IG90aGVyIHBhZ2VzIGNhbiBiZSByZWZyZXNoZWQgYW5kIHNob3cgdGhlIHVwZGF0ZWQgZGF0YSB1cG9uIG5hdmlnYXRpb24uXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMgQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlcy5uYW1lIE5hbWUgb2YgdGhlIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMudmFsdWUgVmFsdWUgb2YgdGhlIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBpZiB2YWx1ZXMgYXJlIHByb3ZpZGVkIGZvciBhbGwgb2YgdGhlbSBpbiBwYXJhbWV0ZXJWYWx1ZXNcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY29udGV4dHMgRm9yIGEgYm91bmQgYWN0aW9uLCBhIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBjYWxsZWQgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5tb2RlbCBGb3IgYW4gdW5ib3VuZCBhY3Rpb24sIGFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsIG11c3QgYmUgcHJvdmlkZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMucmVxdWlyZXNOYXZpZ2F0aW9uIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZC4gTmF2aWdhdGlvbiB0YWtlcyBwbGFjZSB0byB0aGUgY29udGV4dCByZXR1cm5lZCBieSB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmxhYmVsIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb24uIFRoaXMgaXMgbmVlZGVkIGluIGNhc2UgdGhlIGFjdGlvbiBoYXMgYSBwYXJhbWV0ZXIgYW5kIGEgcGFyYW1ldGVyIGRpYWxvZyBpcyBzaG93biB0byB0aGUgdXNlci4gVGhlIGxhYmVsIHdpbGwgYmUgdXNlZCBmb3IgdGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgYW5kIGZvciB0aGUgY29uZmlybWF0aW9uIGJ1dHRvblxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSBtRXh0cmFQYXJhbXMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgb25jZSB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLCBwcm92aWRpbmcgdGhlIHJlc3BvbnNlXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNpbnZva2VBY3Rpb25cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGludm9rZUFjdGlvbihcblx0XHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM/OiB7XG5cdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IGFueSB9O1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRjb250ZXh0cz86IENvbnRleHQgfCBDb250ZXh0W107XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0fSxcblx0XHRtRXh0cmFQYXJhbXM/OiBhbnlcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IG9Db250cm9sOiBhbnk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0bGV0IGFQYXJ0cztcblx0XHRsZXQgc092ZXJsb2FkRW50aXR5VHlwZTtcblx0XHRsZXQgb0N1cnJlbnRBY3Rpb25DYWxsQmFja3M6IGFueTtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdC8vIER1ZSB0byBhIG1pc3Rha2UgdGhlIGludm9rZUFjdGlvbiBpbiB0aGUgZXh0ZW5zaW9uQVBJIGhhZCBhIGRpZmZlcmVudCBBUEkgdGhhbiB0aGlzIG9uZS5cblx0XHQvLyBUaGUgb25lIGZyb20gdGhlIGV4dGVuc2lvbkFQSSBkb2Vzbid0IGV4aXN0IGFueW1vcmUgYXMgd2UgZXhwb3NlIHRoZSBmdWxsIGVkaXQgZmxvdyBub3cgYnV0XG5cdFx0Ly8gZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlIG9sZCBzaWduYXR1cmVcblx0XHRpZiAoXG5cdFx0XHQobVBhcmFtZXRlcnMuaXNBICYmIG1QYXJhbWV0ZXJzLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB8fFxuXHRcdFx0QXJyYXkuaXNBcnJheShtUGFyYW1ldGVycykgfHxcblx0XHRcdG1FeHRyYVBhcmFtcyAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBjb250ZXh0cyA9IG1QYXJhbWV0ZXJzO1xuXHRcdFx0bVBhcmFtZXRlcnMgPSBtRXh0cmFQYXJhbXMgfHwge307XG5cdFx0XHRpZiAoY29udGV4dHMpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBjb250ZXh0cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLm1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRtUGFyYW1ldGVycy5pc05hdmlnYWJsZSA9IG1QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiB8fCBtUGFyYW1ldGVycy5pc05hdmlnYWJsZTtcblxuXHRcdC8vIERldGVybWluZSBpZiB0aGUgcmVmZXJlbmNlZCBhY3Rpb24gaXMgYm91bmQgb3IgdW5ib3VuZFxuXHRcdGNvbnN0IGNvbnZlcnRlZE1ldGFkYXRhID0gY29udmVydFR5cGVzKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKTtcblx0XHQvLyBUaGUgRW50aXR5Q29udGFpbmVyIG1heSBOT1QgYmUgbWlzc2luZywgc28gaXQgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGJlIHVuZGVmaW5lZCwgYnV0IHNpbmNlIGluIG91ciBjb252ZXJ0ZWQgTWV0YWRhdGFcblx0XHQvLyBpdCBjYW4gYmUgdW5kZWZpbmVkLCBJIG5lZWQgdGhpcyB3b3JrYXJvdW5kIGhlcmUgb2YgYWRkaW5nIFwiXCIgc2luY2UgaW5kZXhPZiBkb2VzIG5vdCBhY2NlcHQgc29tZXRoaW5nIHRoYXQnc1xuXHRcdC8vIHVuZGVmaW5lZC5cblx0XHRpZiAoc0FjdGlvbk5hbWUuaW5kZXhPZihcIlwiICsgY29udmVydGVkTWV0YWRhdGEuZW50aXR5Q29udGFpbmVyLm5hbWUpID4gLTEpIHtcblx0XHRcdC8vIFVuYm91bmQgYWN0aW9ucyBhcmUgYWx3YXlzIHJlZmVyZW5jZWQgdmlhIHRoZSBhY3Rpb24gaW1wb3J0IGFuZCB3ZSBmb3VuZCB0aGUgRW50aXR5Q29udGFpbmVyIGluIHRoZSBzQWN0aW9uTmFtZSBzb1xuXHRcdFx0Ly8gYW4gdW5ib3VuZCBhY3Rpb24gaXMgcmVmZXJlbmNlZCFcblx0XHRcdG1QYXJhbWV0ZXJzLmlzQm91bmQgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gZW50aXR5IGNvbnRhaW5lciBpbiB0aGUgc0FjdGlvbk5hbWUsIHNvIGVpdGhlciBhIGJvdW5kIG9yIHN0YXRpYyBhY3Rpb24gaXMgcmVmZXJlbmNlZCB3aGljaCBpcyBhbHNvIGJvdW5kIVxuXHRcdFx0bVBhcmFtZXRlcnMuaXNCb3VuZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCFtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0b0NvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0XHRpZiAob0NvbnRyb2wpIHtcblx0XHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoaXMgc2VsZWN0ZWQgY29udGV4dHMgdXBkYXRlIGlzIGRvbmUgd2l0aGluIHRoZSBvcGVyYXRpb24sIHNob3VsZCBiZSBtb3ZlZCBvdXRcblx0XHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHNBY3Rpb25OYW1lICYmIHNBY3Rpb25OYW1lLmluZGV4T2YoXCIoXCIpID4gLTEpIHtcblx0XHRcdC8vIGdldCBlbnRpdHkgdHlwZSBvZiBhY3Rpb24gb3ZlcmxvYWQgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBhY3Rpb24gcGF0aFxuXHRcdFx0Ly8gRXhhbXBsZSBzQWN0aW9uTmFtZSA9IFwiPEFjdGlvbk5hbWU+KENvbGxlY3Rpb24oPE92ZXJsb2FkRW50aXR5VHlwZT4pKVwiXG5cdFx0XHQvLyBzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXSAtLT4gPEFjdGlvbk5hbWU+XG5cdFx0XHQvLyBzT3ZlcmxvYWRFbnRpdHlUeXBlID0gYVBhcnRzWzJdIC0tPiA8T3ZlcmxvYWRFbnRpdHlUeXBlPlxuXHRcdFx0YVBhcnRzID0gc0FjdGlvbk5hbWUuc3BsaXQoXCIoXCIpO1xuXHRcdFx0c0FjdGlvbk5hbWUgPSBhUGFydHNbMF07XG5cdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlID0gKGFQYXJ0c1thUGFydHMubGVuZ3RoIC0gMV0gYXMgYW55KS5yZXBsYWNlQWxsKFwiKVwiLCBcIlwiKTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbikge1xuXHRcdFx0aWYgKG9Db250cm9sLmlzVGFibGVCb3VuZCgpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0NvbnRyb2wuZ2V0Um93QmluZGluZygpLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHNCaW5kaW5nUGF0aCA9IG9Db250cm9sLmRhdGEoXCJyb3dzQmluZGluZ0luZm9cIikucGF0aCxcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcgPSBuZXcgKE9EYXRhTGlzdEJpbmRpbmcgYXMgYW55KSh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLCBzQmluZGluZ1BhdGgpO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IG9MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlICYmIG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSB0aGlzLl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoKFxuXHRcdFx0XHRcdG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRcdFx0b0NvbnRyb2wuZ2V0Um93QmluZGluZygpLFxuXHRcdFx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmVuYWJsZUF1dG9TY3JvbGwpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MgPSB0aGlzLmNyZWF0ZUFjdGlvblByb21pc2Uoc0FjdGlvbk5hbWUsIG9Db250cm9sLnNJZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQgPSB0aGlzLl9nZXRCb3VuZENvbnRleHQob1ZpZXcsIG1QYXJhbWV0ZXJzKTtcblx0XHQvLyBOZWVkIHRvIGtub3cgdGhhdCB0aGUgYWN0aW9uIGlzIGNhbGxlZCBmcm9tIE9iamVjdFBhZ2UgZm9yIGNoYW5nZVNldCBJc29sYXRlZCB3b3JrYXJvdW5kXG5cdFx0bVBhcmFtZXRlcnMuYk9iamVjdFBhZ2UgPSAob1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmNvbnZlcnRlclR5cGUgPT09IFwiT2JqZWN0UGFnZVwiO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IG9SZXNwb25zZSA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbGxBY3Rpb24oXG5cdFx0XHRcdHNBY3Rpb25OYW1lLFxuXHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKVxuXHRcdFx0KTtcblx0XHRcdGxldCBsaXN0UmVmcmVzaGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzICYmIG1QYXJhbWV0ZXJzLmlzQm91bmQgPT09IHRydWUpIHtcblx0XHRcdFx0bGlzdFJlZnJlc2hlZCA9IGF3YWl0IHRoaXMuX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRcdFx0XHR0aGlzLmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSksXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHNbMF1cblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGlmIChBY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpKSB7XG5cdFx0XHRcdGxldCBhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRpZiAob1Jlc3BvbnNlKSB7XG5cdFx0XHRcdFx0YWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyA9IEFycmF5LmlzQXJyYXkob1Jlc3BvbnNlKVxuXHRcdFx0XHRcdFx0PyBPYmplY3Qua2V5cyhvUmVzcG9uc2VbMF0udmFsdWUuZ2V0T2JqZWN0KCkpXG5cdFx0XHRcdFx0XHQ6IE9iamVjdC5rZXlzKG9SZXNwb25zZS5nZXRPYmplY3QoKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkFjdGlvbiwgbVBhcmFtZXRlcnMuY29udGV4dHMsIHNBY3Rpb25OYW1lLCBsaXN0UmVmcmVzaGVkLCBhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lLCBUcmlnZ2VyVHlwZS5hY3Rpb24pO1xuXG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlc29sdmVyKG9SZXNwb25zZSk7XG5cdFx0XHR9XG5cdFx0XHQvKlxuXHRcdFx0XHRcdFdlIHNldCB0aGUgKHVwcGVyKSBwYWdlcyB0byBkaXJ0eSBhZnRlciBhbiBleGVjdXRpb24gb2YgYW4gYWN0aW9uXG5cdFx0XHRcdFx0VE9ETzogZ2V0IHJpZCBvZiB0aGlzIHdvcmthcm91bmRcblx0XHRcdFx0XHRUaGlzIHdvcmthcm91bmQgaXMgb25seSBuZWVkZWQgYXMgbG9uZyBhcyB0aGUgbW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3luY2hyb25pemF0aW9uLlxuXHRcdFx0XHRcdE9uY2UgdGhpcyBpcyBzdXBwb3J0ZWQgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIHBhZ2VzIHRvIGRpcnR5IGFueW1vcmUgYXMgdGhlIGNvbnRleHQgaXRzZWxmXG5cdFx0XHRcdFx0aXMgYWxyZWFkeSByZWZyZXNoZWQgKGl0J3MganVzdCBub3QgcmVmbGVjdGVkIGluIHRoZSBvYmplY3QgcGFnZSlcblx0XHRcdFx0XHR3ZSBleHBsaWNpdGx5IGRvbid0IGNhbGwgdGhpcyBtZXRob2QgZnJvbSB0aGUgbGlzdCByZXBvcnQgYnV0IG9ubHkgY2FsbCBpdCBmcm9tIHRoZSBvYmplY3QgcGFnZVxuXHRcdFx0XHRcdGFzIGlmIGl0IGlzIGNhbGxlZCBpbiB0aGUgbGlzdCByZXBvcnQgaXQncyBub3QgbmVlZGVkIC0gYXMgd2UgYW55d2F5IHdpbGwgcmVtb3ZlIHRoaXMgbG9naWNcblx0XHRcdFx0XHR3ZSBjYW4gbGl2ZSB3aXRoIHRoaXNcblx0XHRcdFx0XHR3ZSBuZWVkIGEgY29udGV4dCB0byBzZXQgdGhlIHVwcGVyIHBhZ2VzIHRvIGRpcnR5IC0gaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgd2UgdXNlIHRoZVxuXHRcdFx0XHRcdGZpcnN0IG9uZSBhcyB0aGV5IGFyZSBhbnl3YXkgc2libGluZ3Ncblx0XHRcdFx0XHQqL1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUpIHtcblx0XHRcdFx0bGV0IHZDb250ZXh0ID0gb1Jlc3BvbnNlO1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2Q29udGV4dCkgJiYgdkNvbnRleHQubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0dkNvbnRleHQgPSB2Q29udGV4dFswXS52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodkNvbnRleHQgJiYgIUFycmF5LmlzQXJyYXkodkNvbnRleHQpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0XHRcdFx0Y29uc3Qgc0NvbnRleHRNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgodkNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRjb25zdCBfZm5WYWxpZENvbnRleHRzID0gKGNvbnRleHRzOiBhbnksIGFwcGxpY2FibGVDb250ZXh0czogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29udGV4dHMuZmlsdGVyKChlbGVtZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKGFwcGxpY2FibGVDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBhcHBsaWNhYmxlQ29udGV4dHMuaW5kZXhPZihlbGVtZW50KSA+IC0xO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBvQWN0aW9uQ29udGV4dCA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpXG5cdFx0XHRcdFx0XHQ/IF9mblZhbGlkQ29udGV4dHMobVBhcmFtZXRlcnMuY29udGV4dHMsIG1QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0KVswXVxuXHRcdFx0XHRcdFx0OiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHRcdFx0XHRjb25zdCBzQWN0aW9uQ29udGV4dE1ldGFQYXRoID0gb0FjdGlvbkNvbnRleHQgJiYgb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvQWN0aW9uQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdGlmIChzQ29udGV4dE1ldGFQYXRoICE9IHVuZGVmaW5lZCAmJiBzQ29udGV4dE1ldGFQYXRoID09PSBzQWN0aW9uQ29udGV4dE1ldGFQYXRoKSB7XG5cdFx0XHRcdFx0XHRpZiAob0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpICE9PSB2Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQodkNvbnRleHQsIHtcblx0XHRcdFx0XHRcdFx0XHRjaGVja05vSGFzaENoYW5nZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRub0hpc3RvcnlFbnRyeTogZmFsc2Vcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRMb2cuaW5mbyhcIk5hdmlnYXRpb24gdG8gdGhlIHNhbWUgY29udGV4dCBpcyBub3QgYWxsb3dlZFwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBvUmVzcG9uc2U7XG5cdFx0fSBjYXRjaCAoZXJyOiBhbnkpIHtcblx0XHRcdGlmIChvQ3VycmVudEFjdGlvbkNhbGxCYWNrcykge1xuXHRcdFx0XHRvQ3VycmVudEFjdGlvbkNhbGxCYWNrcy5mUmVqZWN0b3IoKTtcblx0XHRcdH1cblx0XHRcdC8vIEZJWE1FOiBpbiBtb3N0IHNpdHVhdGlvbnMgdGhlcmUgaXMgbm8gaGFuZGxlciBmb3IgdGhlIHJlamVjdGVkIHByb21pc2VzIHJldHVybmVkcVxuXHRcdFx0aWYgKGVyciA9PT0gQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZykge1xuXHRcdFx0XHQvLyBUaGlzIGxlYWRzIHRvIGNvbnNvbGUgZXJyb3IuIEFjdHVhbGx5IHRoZSBlcnJvciBpcyBhbHJlYWR5IGhhbmRsZWQgKGN1cnJlbnRseSBkaXJlY3RseSBpbiBwcmVzcyBoYW5kbGVyIG9mIGVuZCBidXR0b24gaW4gZGlhbG9nKSwgc28gaXQgc2hvdWxkIG5vdCBiZSBmb3J3YXJkZWRcblx0XHRcdFx0Ly8gdXAgdG8gaGVyZS4gSG93ZXZlciwgd2hlbiBkaWFsb2cgaGFuZGxpbmcgYW5kIGJhY2tlbmQgZXhlY3V0aW9uIGFyZSBzZXBhcmF0ZWQsIGluZm9ybWF0aW9uIHdoZXRoZXIgZGlhbG9nIHdhcyBjYW5jZWxsZWQsIG9yIGJhY2tlbmQgZXhlY3V0aW9uIGhhcyBmYWlsZWQgbmVlZHNcblx0XHRcdFx0Ly8gdG8gYmUgdHJhbnNwb3J0ZWQgdG8gdGhlIHBsYWNlIHJlc3BvbnNpYmxlIGZvciBjb25uZWN0aW5nIHRoZXNlIHR3byB0aGluZ3MuXG5cdFx0XHRcdC8vIFRPRE86IHJlbW92ZSBzcGVjaWFsIGhhbmRsaW5nIG9uZSBkaWFsb2cgaGFuZGxpbmcgYW5kIGJhY2tlbmQgZXhlY3V0aW9uIGFyZSBzZXBhcmF0ZWRcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRGlhbG9nIGNhbmNlbGxlZFwiKTtcblx0XHRcdH0gZWxzZSBpZiAoIShlcnIgJiYgKGVyci5jYW5jZWxlZCB8fCAoZXJyLnJlamVjdGVkSXRlbXMgJiYgZXJyLnJlamVjdGVkSXRlbXNbMF0uY2FuY2VsZWQpKSkpIHtcblx0XHRcdFx0Ly8gVE9ETzogYW5hbHl6ZSwgd2hldGhlciB0aGlzIGlzIG9mIHRoZSBzYW1lIGNhdGVnb3J5IGFzIGFib3ZlXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gRWRpdEZsb3cuaW52b2tlQWN0aW9uOiR7ZXJyfWApO1xuXHRcdFx0fVxuXHRcdFx0Ly8gVE9ETzogQW55IHVuZXhwZWN0ZWQgZXJyb3JzIHByb2JhYmx5IHNob3VsZCBub3QgYmUgaWdub3JlZCFcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2VjdXJlZCBleGVjdXRpb24gb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiBFbnN1cmVzIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBjZXJ0YWluIGNvbmRpdGlvbnMgYXJlIGZ1bGZpbGxlZC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBmbkZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZC4gU2hvdWxkIHJldHVybiBhIHByb21pc2UgdGhhdCBpcyBzZXR0bGVkIGFmdGVyIGNvbXBsZXRpb24gb2YgdGhlIGV4ZWN1dGlvbi4gSWYgbm90aGluZyBpcyByZXR1cm5lZCwgaW1tZWRpYXRlIGNvbXBsZXRpb24gaXMgYXNzdW1lZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIERlZmluaXRpb25zIG9mIHRoZSBwcmVjb25kaXRpb25zIHRvIGJlIGNoZWNrZWQgYmVmb3JlIGV4ZWN1dGlvblxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeSBEZWZpbmVzIHRoZSBidXN5IGluZGljYXRvclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5zZXQgVHJpZ2dlcnMgYSBidXN5IGluZGljYXRvciB3aGVuIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZC5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kuY2hlY2sgRXhlY3V0ZXMgZnVuY3Rpb24gb25seSBpZiBhcHBsaWNhdGlvbiBpc24ndCBidXN5LlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMudXBkYXRlc0RvY3VtZW50IFRoaXMgb3BlcmF0aW9uIHVwZGF0ZXMgdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2l0aG91dCB1c2luZyB0aGUgYm91bmQgbW9kZWwgYW5kIGNvbnRleHQuIEFzIGEgcmVzdWx0LCB0aGUgZHJhZnQgc3RhdHVzIGlzIHVwZGF0ZWQgaWYgYSBkcmFmdCBkb2N1bWVudCBleGlzdHMsIGFuZCB0aGUgdXNlciBoYXMgdG8gY29uZmlybSB0aGUgY2FuY2VsbGF0aW9uIG9mIHRoZSBlZGl0aW5nIHByb2Nlc3MuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIHJlamVjdGVkIGlmIHRoZSBleGVjdXRpb24gaXMgcHJvaGliaXRlZCBhbmQgcmVzb2x2ZWQgYnkgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgdGhlIGZuRnVuY3Rpb24uXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNzZWN1cmVkRXhlY3V0aW9uXG5cdCAqIEBwdWJsaWNcblx0ICogQGV4cGVyaW1lbnRhbCBBcyBvZiB2ZXJzaW9uIDEuOTAuMFxuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c2VjdXJlZEV4ZWN1dGlvbihcblx0XHRmbkZ1bmN0aW9uOiBGdW5jdGlvbixcblx0XHRtUGFyYW1ldGVycz86IHtcblx0XHRcdGJ1c3k/OiB7XG5cdFx0XHRcdHNldD86IGJvb2xlYW47XG5cdFx0XHRcdGNoZWNrPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHR1cGRhdGVzRG9jdW1lbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkJ1c3lTZXQgPSBtUGFyYW1ldGVycz8uYnVzeT8uc2V0ID8/IHRydWUsXG5cdFx0XHRiQnVzeUNoZWNrID0gbVBhcmFtZXRlcnM/LmJ1c3k/LmNoZWNrID8/IHRydWUsXG5cdFx0XHRiVXBkYXRlc0RvY3VtZW50ID0gbVBhcmFtZXRlcnM/LnVwZGF0ZXNEb2N1bWVudCA/PyBmYWxzZSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCksXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCBhcyBDb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdGlmIChiQnVzeUNoZWNrICYmIEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJBcHBsaWNhdGlvbiBhbHJlYWR5IGJ1c3kgdGhlcmVmb3JlIGV4ZWN1dGlvbiByZWplY3RlZFwiKTtcblx0XHR9XG5cblx0XHQvLyB3ZSBoYXZlIHRvIHNldCBidXN5IGFuZCBkcmFmdCBpbmRpY2F0b3IgaW1tZWRpYXRlbHkgYWxzbyB0aGUgZnVuY3Rpb24gbWlnaHQgYmUgZXhlY3V0ZWQgbGF0ZXIgaW4gcXVldWVcblx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cdFx0fVxuXHRcdGlmIChiVXBkYXRlc0RvY3VtZW50ICYmIGJJc0RyYWZ0KSB7XG5cdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soZm5GdW5jdGlvbiBhcyAoKSA9PiBhbnkpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGlmIChiVXBkYXRlc0RvY3VtZW50KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoYklzRHJhZnQpIHtcblx0XHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIHBhdGNoU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50IFRoZSBldmVudCBzZW50IGJ5IHRoZSBiaW5kaW5nXG5cdCAqL1xuXHRoYW5kbGVQYXRjaFNlbnQob0V2ZW50OiBFdmVudCkge1xuXHRcdC8vIEluIGNvbGxhYm9yYXRpdmUgZHJhZnQsIGRpc2FibGUgRVRhZyBjaGVjayBmb3IgUEFUQ0ggcmVxdWVzdHNcblx0XHRjb25zdCBpc0luQ29sbGFib3JhdGl2ZURyYWZ0ID0gQWN0aXZpdHlTeW5jLmlzQ29ubmVjdGVkKHRoaXMuZ2V0VmlldygpKTtcblx0XHRpZiAoaXNJbkNvbGxhYm9yYXRpdmVEcmFmdCkge1xuXHRcdFx0KChvRXZlbnQuZ2V0U291cmNlKCkgYXMgQmluZGluZykuZ2V0TW9kZWwoKSBhcyBhbnkpLnNldElnbm9yZUVUYWcodHJ1ZSk7XG5cdFx0fVxuXHRcdGlmICghKHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KT8uZ2V0UHJvcGVydHkoXCJza2lwUGF0Y2hIYW5kbGVyc1wiKSkge1xuXHRcdFx0Y29uc3Qgc291cmNlQmluZGluZyA9IG9FdmVudC5nZXRTb3VyY2UoKSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdFx0Ly8gQ3JlYXRlIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiB0aGUgcGF0aCBpcyBjb21wbGV0ZWRcblx0XHRcdGNvbnN0IG9QYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdG9FdmVudC5nZXRTb3VyY2UoKS5hdHRhY2hFdmVudE9uY2UoXCJwYXRjaENvbXBsZXRlZFwiLCAocGF0Y2hDb21wbGV0ZWRFdmVudDogYW55KSA9PiB7XG5cdFx0XHRcdFx0Ly8gUmUtZW5hYmxlIEVUYWcgY2hlY2tzXG5cdFx0XHRcdFx0aWYgKGlzSW5Db2xsYWJvcmF0aXZlRHJhZnQpIHtcblx0XHRcdFx0XHRcdCgob0V2ZW50LmdldFNvdXJjZSgpIGFzIEJpbmRpbmcpLmdldE1vZGVsKCkgYXMgYW55KS5zZXRJZ25vcmVFVGFnKGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAob0V2ZW50LmdldFNvdXJjZSgpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoKFxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRcdFx0c291cmNlQmluZGluZyxcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGJTdWNjZXNzID0gcGF0Y2hDb21wbGV0ZWRFdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0XHRcdGlmIChiU3VjY2Vzcykge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLnVwZGF0ZURvY3VtZW50KHNvdXJjZUJpbmRpbmcsIG9QYXRjaFByb21pc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBDcmVhdGVBY3RpdmF0ZSBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudCBUaGUgZXZlbnQgc2VudCBieSB0aGUgYmluZGluZ1xuXHQgKi9cblx0YXN5bmMgaGFuZGxlQ3JlYXRlQWN0aXZhdGUob0V2ZW50OiBFdmVudCkge1xuXHRcdGNvbnN0IG9CaW5kaW5nID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGJBdEVuZCA9IHRydWU7XG5cdFx0Y29uc3QgYkluYWN0aXZlID0gdHJ1ZTtcblx0XHRjb25zdCBvUGFyYW1zOiBhbnkgPSB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5JbmxpbmUsXG5cdFx0XHRjcmVhdGVBdEVuZDogYkF0RW5kLFxuXHRcdFx0aW5hY3RpdmU6IGJJbmFjdGl2ZSxcblx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0YnVzeU1vZGU6IFwiTm9uZVwiXG5cdFx0fTtcblx0XHR0cnkge1xuXHRcdFx0Ly8gU2VuZCBub3RpZmljYXRpb24gdG8gb3RoZXIgdXNlcnMgb25seSBhZnRlciB0aGUgY3JlYXRpb24gaGFzIGJlZW4gZmluYWxpemVkXG5cdFx0XHRjb25zdCBhY3RpdmF0ZWRDb250ZXh0ID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIikgYXMgQ29udGV4dDtcblx0XHRcdGFjdGl2YXRlZENvbnRleHRcblx0XHRcdFx0LmNyZWF0ZWQoKVxuXHRcdFx0XHQ/LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIGFjdGl2YXRlZENvbnRleHQpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHRcdExvZy53YXJuaW5nKGBGYWlsZWQgdG8gYWN0aXZhdGUgY29udGV4dCAke2FjdGl2YXRlZENvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGEgbmV3IGluYWN0aXZlIGNvbnRleHQgKGVtcHR5IHJvdyBpbiB0aGUgdGFibGUpXG5cdFx0XHRjb25zdCBuZXdJbmFjdGl2ZUNvbnRleHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0b0JpbmRpbmcgYXMgT0RhdGFMaXN0QmluZGluZyxcblx0XHRcdFx0b1BhcmFtcyxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRmYWxzZVxuXHRcdFx0KTtcblx0XHRcdGlmIChuZXdJbmFjdGl2ZUNvbnRleHQpIHtcblx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkZhaWxlZCB0byBhY3RpdmF0ZSBuZXcgcm93IC1cIiwgZXJyb3IgYXMgYW55KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUGVyZm9ybXMgYSB0YXNrIGluIHN5bmMgd2l0aCBvdGhlciB0YXNrcyBjcmVhdGVkIHZpYSB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9taXNlIGNoYWluIG9mIHRoZSB0YXNrLlxuXHQgKlxuXHQgKiBAcGFyYW0gW25ld1Rhc2tdIE9wdGlvbmFsLCBhIHByb21pc2Ugb3IgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIHRhc2sgaXMgY29tcGxldGVkXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRzeW5jVGFzayhuZXdUYXNrPzogKCgpID0+IGFueSkgfCBQcm9taXNlPGFueT4pIHtcblx0XHRpZiAobmV3VGFzaykge1xuXHRcdFx0aWYgKHR5cGVvZiBuZXdUYXNrID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0dGhpcy5zeW5jVGFza3MgPSB0aGlzLnN5bmNUYXNrcy50aGVuKG5ld1Rhc2spLmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5zeW5jVGFza3MgPSB0aGlzLnN5bmNUYXNrc1xuXHRcdFx0XHRcdC50aGVuKCgpID0+IG5ld1Rhc2spXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFza3M7XG5cdH1cblxuXHQvKipcblx0ICogRGVjaWRlcyBpZiBhIGRvY3VtZW50IGlzIHRvIGJlIHNob3duIGluIGRpc3BsYXkgb3IgZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBiZSBkaXNwbGF5ZWQgb3IgZWRpdGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGVkaXQgbW9kZSBpcyBjb21wdXRlZFxuXHQgKi9cblxuXHRhc3luYyBjb21wdXRlRWRpdE1vZGUoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdGNvbnN0IGdsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVQZW5kaW5nXCIsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IGlzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdGlmIChpc0FjdGl2ZUVudGl0eSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHQvLyBpbiBjYXNlIHRoZSBkb2N1bWVudCBpcyBkcmFmdCBzZXQgaXQgaW4gZWRpdCBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSk7XG5cdFx0XHRcdFx0Y29uc3QgaGFzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSGFzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUodW5kZWZpbmVkLCAhaGFzQWN0aXZlRW50aXR5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBhY3RpdmUgZG9jdW1lbnQsIHN0YXkgb24gZGlzcGxheSBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVBlbmRpbmdcIiwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRldGVybWluaW5nIHRoZSBlZGl0TW9kZSBmb3IgZHJhZnRcIiwgZXJyb3IpO1xuXHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBsYXN0SW52b2tlZEFjdGlvbk5hbWUgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiKTtcblx0XHRcdGlmIChsYXN0SW52b2tlZEFjdGlvbk5hbWUgJiYgdGhpcy5pc05ld0FjdGlvbkZvclN0aWNreShsYXN0SW52b2tlZEFjdGlvbk5hbWUsIGNvbnRleHQpKSB7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIHRydWUpO1xuXHRcdFx0XHRpZiAoIXRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPbihjb250ZXh0KTtcblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgdW5kZWZpbmVkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBQcml2YXRlIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogSW50ZXJuYWwgbWV0aG9kIHRvIGRlbGV0ZSBhIGNvbnRleHQgb3IgYW4gYXJyYXkgb2YgY29udGV4dHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0cyBUaGUgY29udGV4dChzKSB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIFBhcmFtZXRlcnMgZm9yIGRlbGV0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24oY29udGV4dHM6IENvbnRleHQgfCBDb250ZXh0W10sIHBhcmFtZXRlcnM6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKHRoaXMpO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXG5cdFx0Ly8gVE9ETzogdGhpcyBzZXR0aW5nIGFuZCByZW1vdmluZyBvZiBjb250ZXh0cyBzaG91bGRuJ3QgYmUgaW4gdGhlIHRyYW5zYWN0aW9uIGhlbHBlciBhdCBhbGxcblx0XHQvLyBmb3IgdGhlIHRpbWUgYmVpbmcgSSBrZXB0IGl0IGFuZCBwcm92aWRlIHRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IHRvIG5vdCBicmVhayBzb21ldGhpbmdcblx0XHRwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gcGFyYW1ldGVycy5jb250cm9sSWRcblx0XHRcdD8gc2FwLnVpLmdldENvcmUoKS5ieUlkKHBhcmFtZXRlcnMuY29udHJvbElkKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKVxuXHRcdFx0OiBudWxsO1xuXG5cdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmRlbGV0ZURvY3VtZW50KGNvbnRleHRzLCBwYXJhbWV0ZXJzLCB0aGlzLmdldEFwcENvbXBvbmVudCgpLCByZXNvdXJjZU1vZGVsLCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkpO1xuXHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zdGlja3lTZXNzaW9uVG9rZW5cIiwgdW5kZWZpbmVkKTtcblx0fVxuXG5cdF9nZXRSZXNvdXJjZU1vZGVsKCk6IFJlc291cmNlTW9kZWwge1xuXHRcdHJldHVybiBnZXRSZXNvdXJjZU1vZGVsKHRoaXMuZ2V0VmlldygpKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKSB7XG5cdFx0cmV0dXJuIFRyYW5zYWN0aW9uSGVscGVyO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRNZXNzYWdlSGFuZGxlcigpIHtcblx0XHRpZiAodGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLm1lc3NhZ2VIYW5kbGVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gbWVzc2FnZSBoYW5kbGVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0SW50ZXJuYWxNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0R2xvYmFsVUlNb2RlbCgpOiBKU09OTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gYkNyZWF0aW9uTW9kZSBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbmV3XG5cdCAqL1xuXHRwcml2YXRlIHNldENyZWF0aW9uTW9kZShiQ3JlYXRpb25Nb2RlOiBib29sZWFuKSB7XG5cdFx0Y29uc3QgdWlNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcInVpXCIpIGFzIENvbnRleHQ7XG5cdFx0dGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuc2V0UHJvcGVydHkoXCJjcmVhdGVNb2RlXCIsIGJDcmVhdGlvbk1vZGUsIHVpTW9kZWxDb250ZXh0LCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY3VycmVudCBwYWdlIGNvbnRhaW5zIGEgbmV3bHkgY3JlYXRlZCBvYmplY3Qgb3Igbm90LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaXMgbmV3XG5cdCAqL1xuXHRwcml2YXRlIGdldENyZWF0aW9uTW9kZSgpOiBib29sZWFuIHtcblx0XHRjb25zdCB1aU1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwidWlcIikgYXMgQ29udGV4dDtcblx0XHRyZXR1cm4gISF0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShcImNyZWF0ZU1vZGVcIiwgdWlNb2RlbENvbnRleHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIChvciBvbmUgb2YgaXRzIHN1Yi1vYmplY3RzKSBoYXMgYmVlbiBtb2RpZmllZCBvciBub3QuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZFxuXHQgKi9cblx0cHJpdmF0ZSBpc0RvY3VtZW50TW9kaWZpZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICEhdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuZ2V0UHJvcGVydHkoXCIvaXNEb2N1bWVudE1vZGlmaWVkXCIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBtb2RpZmllZCBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RG9jdW1lbnRNb2RpZmllZChtb2RpZmllZDogYm9vbGVhbikge1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFwiL2lzRG9jdW1lbnRNb2RpZmllZFwiLCBtb2RpZmllZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIGhhcyBiZWVuIG1vZGlmaWVkIGJ5IGNyZWF0aW5nIGEgc3ViLW9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0IGJpbmRpbmcgb24gd2hpY2ggdGhlIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqL1xuXHRwcml2YXRlIHNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZShsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZykge1xuXHRcdC8vIFNldCB0aGUgbW9kaWZpZWQgZmxhZyBvbmx5IG9uIHJlbGF0aXZlIGxpc3RCaW5kaW5ncywgaS5lLiB3aGVuIGNyZWF0aW5nIGEgc3ViLW9iamVjdFxuXHRcdC8vIElmIHRoZSBsaXN0QmluZGluZyBpcyBub3QgcmVsYXRpdmUsIHRoZW4gaXQncyBhIGNyZWF0aW9uIGZyb20gdGhlIExpc3RSZXBvcnQsIGFuZCBieSBkZWZhdWx0IGEgbmV3bHkgY3JlYXRlZCByb290IG9iamVjdCBpc24ndCBjb25zaWRlcmVkIGFzIG1vZGlmaWVkXG5cdFx0aWYgKGxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBjcmVhdGUgZXZlbnQ6IHNob3dzIG1lc3NhZ2VzIGFuZCBpbiBjYXNlIG9mIGEgZHJhZnQsIHVwZGF0ZXMgdGhlIGRyYWZ0IGluZGljYXRvci5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBiaW5kaW5nIE9EYXRhIGxpc3QgYmluZGluZyBvYmplY3Rcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlQ3JlYXRlRXZlbnRzKGJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpIHtcblx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblxuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoYmluZGluZyk7XG5cblx0XHRiaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlU2VudFwiLCAoKSA9PiB7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0YmluZGluZy5hdHRhY2hFdmVudChcImNyZWF0ZUNvbXBsZXRlZFwiLCAob0V2ZW50OiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IHN1Y2Nlc3MgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoc3VjY2VzcyA/IERyYWZ0U3RhdHVzLlNhdmVkIDogRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgZHJhZnQgc3RhdHVzIG1lc3NhZ2UgKGRpc3BsYXllZCBhdCB0aGUgYm90dG9tIG9mIHRoZSBwYWdlKS5cblx0ICpcblx0ICogQHBhcmFtIGRyYWZ0U3RhdHVzIFRoZSBkcmFmdCBzdGF0dXMgbWVzc2FnZVxuXHQgKi9cblx0c2V0RHJhZnRTdGF0dXMoZHJhZnRTdGF0dXM6IHN0cmluZykge1xuXHRcdCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpIGFzIEpTT05Nb2RlbCkuc2V0UHJvcGVydHkoXCIvZHJhZnRTdGF0dXNcIiwgZHJhZnRTdGF0dXMsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvZ3JhbW1pbmcgbW9kZWwgZnJvbSBhIGJpbmRpbmcgb3IgYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc291cmNlIFRoZSBiaW5kaW5nIG9yIGNvbnRleHRcblx0ICogQHJldHVybnMgVGhlIHByb2dyYW1taW5nIG1vZGVsXG5cdCAqL1xuXHRwcml2YXRlIGdldFByb2dyYW1taW5nTW9kZWwoc291cmNlOiBDb250ZXh0IHwgQmluZGluZyk6IHR5cGVvZiBQcm9ncmFtbWluZ01vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLmdldFByb2dyYW1taW5nTW9kZWwoc291cmNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBlZGl0TW9kZSBUaGUgZWRpdCBtb2RlXG5cdCAqIEBwYXJhbSBpc0NyZWF0aW9uIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBuZXdseSBjcmVhdGVkXG5cdCAqL1xuXHRwcml2YXRlIHNldEVkaXRNb2RlKGVkaXRNb2RlPzogc3RyaW5nLCBpc0NyZWF0aW9uPzogYm9vbGVhbikge1xuXHRcdC8vIGF0IHRoaXMgcG9pbnQgb2YgdGltZSBpdCdzIG5vdCBtZWFudCB0byByZWxlYXNlIHRoZSBlZGl0IGZsb3cgZm9yIGZyZWVzdHlsZSB1c2FnZSB0aGVyZWZvcmUgd2UgY2FuXG5cdFx0Ly8gcmVseSBvbiB0aGUgZ2xvYmFsIFVJIG1vZGVsIHRvIGV4aXN0XG5cdFx0Y29uc3QgZ2xvYmFsTW9kZWwgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblxuXHRcdGlmIChlZGl0TW9kZSkge1xuXHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiLCBlZGl0TW9kZSA9PT0gXCJFZGl0YWJsZVwiLCB1bmRlZmluZWQsIHRydWUpO1xuXHRcdH1cblxuXHRcdGlmIChpc0NyZWF0aW9uICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFNpbmNlIHNldENyZWF0aW9uTW9kZSBpcyBwdWJsaWMgaW4gRWRpdEZsb3cgYW5kIGNhbiBiZSBvdmVycmlkZW4sIG1ha2Ugc3VyZSB0byBjYWxsIGl0IHZpYSB0aGUgY29udHJvbGxlclxuXHRcdFx0Ly8gdG8gZW5zdXJlIGFueSBvdmVycmlkZXMgYXJlIHRha2VuIGludG8gYWNjb3VudFxuXHRcdFx0dGhpcy5zZXRDcmVhdGlvbk1vZGUoaXNDcmVhdGlvbik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhbiBhY3Rpb24gY29ycmVzcG9uZHMgdG8gYSBjcmVhdGUgYWN0aW9uIGZvciBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgZm9yIHRoZSBzdGlja3kgc2Vzc2lvblxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBhY3Rpb24gaXMgYSBjcmVhdGUgYWN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGlzTmV3QWN0aW9uRm9yU3RpY2t5KGFjdGlvbk5hbWU6IHN0cmluZywgY29udGV4dDogQ29udGV4dCkge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRjb25zdCBlbnRpdHlTZXQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnN0YXJ0aW5nRW50aXR5U2V0IGFzIEVudGl0eVNldDtcblx0XHRcdGNvbnN0IHN0aWNreVNlc3Npb24gPSBlbnRpdHlTZXQuYW5ub3RhdGlvbnMuU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZDtcblx0XHRcdGlmIChzdGlja3lTZXNzaW9uPy5OZXdBY3Rpb24gPT09IGFjdGlvbk5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMgJiYgc3RpY2t5U2Vzc2lvbj8uQWRkaXRpb25hbE5ld0FjdGlvbnMuaW5kZXhPZihhY3Rpb25OYW1lKSAhPT0gLTEpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgYW55KTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHQvLyBUT0RPIE1vdmUgYWxsIHN0aWNreS1yZWxhdGVkIGJlbG93IHRvIGEgc3RpY2t5IHNlc3Npb24gbWFuYWdlciBjbGFzc1xuXG5cdC8qKlxuXHQgKiBFbmFibGVzIHRoZSBzdGlja3kgZWRpdCBzZXNzaW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWRcblx0ICogQHJldHVybnMgVHJ1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBoYW5kbGVTdGlja3lPbihjb250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBmb3IgZnVuY3Rpb24gaGFuZGxlU3RpY2t5T25cIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuaGFzTmF2aWdhdGlvbkd1YXJkKCkpIHtcblx0XHRcdFx0Y29uc3QgaGFzaFRyYWNrZXIgPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCk7XG5cdFx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblxuXHRcdFx0XHQvLyBTZXQgYSBndWFyZCBpbiB0aGUgUm91dGVyUHJveHlcblx0XHRcdFx0Ly8gQSB0aW1lb3V0IGlzIG5lY2Vzc2FyeSwgYXMgd2l0aCBkZWZlcnJlZCBjcmVhdGlvbiB0aGUgaGFzaENoYW5nZXIgaXMgbm90IHVwZGF0ZWQgeWV0IHdpdGhcblx0XHRcdFx0Ly8gdGhlIG5ldyBoYXNoLCBhbmQgdGhlIGd1YXJkIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgbWFuYWdlZCBoaXN0b3J5IG9mIHRoZSByb3V0ZXIgcHJveHlcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0TmF2aWdhdGlvbkd1YXJkKGNvbnRleHQuZ2V0UGF0aCgpLnN1YnN0cmluZygxKSk7XG5cdFx0XHRcdH0sIDApO1xuXG5cdFx0XHRcdC8vIFNldHRpbmcgYmFjayBuYXZpZ2F0aW9uIG9uIHNoZWxsIHNlcnZpY2UsIHRvIGdldCB0aGUgZGljYXJkIG1lc3NhZ2UgYm94IGluIGNhc2Ugb2Ygc3RpY2t5XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24odGhpcy5vbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uLmJpbmQodGhpcykpO1xuXG5cdFx0XHRcdHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24gPSB0aGlzLmdldERpcnR5U3RhdGVQcm92aWRlcihhcHBDb21wb25lbnQsIGludGVybmFsTW9kZWwsIGhhc2hUcmFja2VyKTtcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5yZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcih0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uKTtcblxuXHRcdFx0XHQvLyBoYW5kbGUgc2Vzc2lvbiB0aW1lb3V0XG5cdFx0XHRcdGNvbnN0IGkxOG5Nb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIik7XG5cdFx0XHRcdHRoaXMuc2Vzc2lvblRpbWVvdXRGdW5jdGlvbiA9IHRoaXMuZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbihjb250ZXh0LCBpMThuTW9kZWwpO1xuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSBhcyBhbnkpLmF0dGFjaFNlc3Npb25UaW1lb3V0KHRoaXMuc2Vzc2lvblRpbWVvdXRGdW5jdGlvbik7XG5cblx0XHRcdFx0dGhpcy5zdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24gPSB0aGlzLmdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmF0dGFjaFJvdXRlTWF0Y2hlZCh0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogRGlzYWJsZXMgdGhlIHN0aWNreSBlZGl0IHNlc3Npb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRydWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlU3RpY2t5T2ZmKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChhcHBDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bmRlZmluZWQgQXBwQ29tcG9uZW50IGZvciBmdW5jdGlvbiBoYW5kbGVTdGlja3lPZmZcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBleGl0ZWQgZnJvbSB0aGUgYXBwLCBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQgZG9lc24ndCByZXR1cm4gYVxuXHRcdFx0XHQvLyBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQsIGhlbmNlIHRoZSAnaWYnIGFib3ZlXG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmRpc2NhcmROYXZpZ2F0aW9uR3VhcmQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24pIHtcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5kZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24pO1xuXHRcdFx0XHR0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBtb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbDtcblx0XHRcdGlmIChtb2RlbCAmJiB0aGlzLnNlc3Npb25UaW1lb3V0RnVuY3Rpb24pIHtcblx0XHRcdFx0bW9kZWwuZGV0YWNoU2Vzc2lvblRpbWVvdXQodGhpcy5zZXNzaW9uVGltZW91dEZ1bmN0aW9uKTtcblx0XHRcdH1cblxuXHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZGV0YWNoUm91dGVNYXRjaGVkKHRoaXMuc3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uKTtcblx0XHRcdHRoaXMuc3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuXG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblxuXHRcdFx0aWYgKGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRpc3BsYXkgYSAnZGlzY2FyZCcgcG9wb3ZlciB3aGVuIGV4aXRpbmcgYSBzdGlja3kgc2Vzc2lvbi5cblx0ICovXG5cdHByaXZhdGUgb25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbigpIHtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgcm91dGVyUHJveHkgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAocm91dGVyUHJveHkuY2hlY2tJZkJhY2tJc091dE9mR3VhcmQoKSkge1xuXHRcdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblxuXHRcdFx0c3RpY2t5LnByb2Nlc3NEYXRhTG9zc0NvbmZpcm1hdGlvbihcblx0XHRcdFx0YXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24oYmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR2aWV3LFxuXHRcdFx0XHR0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoYmluZGluZ0NvbnRleHQpXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGhpc3RvcnkuYmFjaygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSB1c2VkIGFzIGEgRGlydHlTdGF0ZVByb3ZpZGVyIGluIHRoZSBTaGVsbC5cblx0ICpcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcGFyYW0gaW50ZXJuYWxNb2RlbCBUaGUgbW9kZWwgXCJpbnRlcm5hbFwiXG5cdCAqIEBwYXJhbSBoYXNoVHJhY2tlciBIYXNoIHRyYWNrZXJcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldERpcnR5U3RhdGVQcm92aWRlcihhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgaW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsLCBoYXNoVHJhY2tlcjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIChuYXZpZ2F0aW9uQ29udGV4dDogYW55KSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAobmF2aWdhdGlvbkNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQgcGFyYW1ldGVycyBmb3IgRGlydHlTdGF0ZVByb3ZpZGVyIGZ1bmN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgdGFyZ2V0SGFzaCA9IG5hdmlnYXRpb25Db250ZXh0LmlubmVyQXBwUm91dGU7XG5cdFx0XHRcdGNvbnN0IHJvdXRlclByb3h5ID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cdFx0XHRcdGxldCBsY2xIYXNoVHJhY2tlciA9IFwiXCI7XG5cdFx0XHRcdGxldCBpc0RpcnR5OiBib29sZWFuO1xuXHRcdFx0XHRjb25zdCBpc1Nlc3Npb25PbiA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIpO1xuXG5cdFx0XHRcdGlmICghaXNTZXNzaW9uT24pIHtcblx0XHRcdFx0XHQvLyBJZiB0aGUgc3RpY2t5IHNlc3Npb24gd2FzIHRlcm1pbmF0ZWQgYmVmb3JlIGhhbmQuXG5cdFx0XHRcdFx0Ly8gRXhhbXBsZSBpbiBjYXNlIG9mIG5hdmlnYXRpbmcgYXdheSBmcm9tIGFwcGxpY2F0aW9uIHVzaW5nIElCTi5cblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFyb3V0ZXJQcm94eS5pc05hdmlnYXRpb25GaW5hbGl6ZWQoKSkge1xuXHRcdFx0XHRcdC8vIElmIG5hdmlnYXRpb24gaXMgY3VycmVudGx5IGhhcHBlbmluZyBpbiBSb3V0ZXJQcm94eSwgaXQncyBhIHRyYW5zaWVudCBzdGF0ZVxuXHRcdFx0XHRcdC8vIChub3QgZGlydHkpXG5cdFx0XHRcdFx0aXNEaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHRcdGxjbEhhc2hUcmFja2VyID0gdGFyZ2V0SGFzaDtcblx0XHRcdFx0fSBlbHNlIGlmIChoYXNoVHJhY2tlciA9PT0gdGFyZ2V0SGFzaCkge1xuXHRcdFx0XHRcdC8vIHRoZSBoYXNoIGRpZG4ndCBjaGFuZ2Ugc28gZWl0aGVyIHRoZSB1c2VyIGF0dGVtcHRzIHRvIHJlZnJlc2ggb3IgdG8gbGVhdmUgdGhlIGFwcFxuXHRcdFx0XHRcdGlzRGlydHkgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHJvdXRlclByb3h5LmNoZWNrSGFzaFdpdGhHdWFyZCh0YXJnZXRIYXNoKSB8fCByb3V0ZXJQcm94eS5pc0d1YXJkQ3Jvc3NBbGxvd2VkQnlVc2VyKCkpIHtcblx0XHRcdFx0XHQvLyB0aGUgdXNlciBhdHRlbXB0cyB0byBuYXZpZ2F0ZSB3aXRoaW4gdGhlIHJvb3Qgb2JqZWN0XG5cdFx0XHRcdFx0Ly8gb3IgY3Jvc3NpbmcgdGhlIGd1YXJkIGhhcyBhbHJlYWR5IGJlZW4gYWxsb3dlZCBieSB0aGUgUm91dGVyUHJveHlcblx0XHRcdFx0XHRsY2xIYXNoVHJhY2tlciA9IHRhcmdldEhhc2g7XG5cdFx0XHRcdFx0aXNEaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgYXBwLCBmb3IgZXhhbXBsZSBiYWNrIHRvIHRoZSBsaXN0IHJlcG9ydFxuXHRcdFx0XHRcdGlzRGlydHkgPSB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGlzRGlydHkpIHtcblx0XHRcdFx0XHQvLyB0aGUgRkxQIGRvZXNuJ3QgY2FsbCB0aGUgZGlydHkgc3RhdGUgcHJvdmlkZXIgYW55bW9yZSBvbmNlIGl0J3MgZGlydHksIGFzIHRoZXkgY2FuJ3Rcblx0XHRcdFx0XHQvLyBjaGFuZ2UgdGhpcyBkdWUgdG8gY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIHNldCBpdCBiYWNrIHRvIG5vdC1kaXJ0eVxuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXREaXJ0eUZsYWcoZmFsc2UpO1xuXHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGhhc2hUcmFja2VyID0gbGNsSGFzaFRyYWNrZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gaXNEaXJ0eTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgdXNlZCB3aGVuIGEgc3RpY2t5IHNlc3Npb24gdGltZXMgb3V0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc3RpY2t5Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHN0aWNreSBzZXNzaW9uXG5cdCAqIEBwYXJhbSBpMThuTW9kZWxcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24oc3RpY2t5Q29udGV4dDogQ29udGV4dCwgaTE4bk1vZGVsOiBNb2RlbCkge1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoc3RpY2t5Q29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBtaXNzaW5nIGZvciBTZXNzaW9uVGltZW91dCBmdW5jdGlvblwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyByZW1vdmUgdHJhbnNpZW50IG1lc3NhZ2VzIHNpbmNlIHdlIHdpbGwgc2hvd2luZyBvdXIgb3duIG1lc3NhZ2Vcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0XHRcdGNvbnN0IHdhcm5pbmdEaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHR0aXRsZTogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX1RJVExFfVwiLFxuXHRcdFx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdFx0XHRjb250ZW50OiBuZXcgVGV4dCh7IHRleHQ6IFwie3NhcC5mZS5pMThuPkNfRURJVEZMT1dfT0JKRUNUX1BBR0VfU0VTU0lPTl9FWFBJUkVEX0RJQUxPR19NRVNTQUdFfVwiIH0pLFxuXHRcdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdHRleHQ6IFwie3NhcC5mZS5pMThuPkNfQ09NTU9OX0RJQUxPR19PS31cIixcblx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0cHJlc3M6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIHN0aWNreSBoYW5kbGluZyBhZnRlciBuYXZpZ2F0aW9uIHNpbmNlIHNlc3Npb24gaGFzIGFscmVhZHkgYmVlbiB0ZXJtaW5hdGVkXG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T2ZmKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQoc3RpY2t5Q29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0d2FybmluZ0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d2FybmluZ0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0d2FybmluZ0RpYWxvZy5zZXRNb2RlbChpMThuTW9kZWwsIFwic2FwLmZlLmkxOG5cIik7XG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLmFkZERlcGVuZGVudCh3YXJuaW5nRGlhbG9nKTtcblx0XHRcdFx0d2FybmluZ0RpYWxvZy5vcGVuKCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBvblJvdXRlTWF0Y2hlZCBldmVudCBpbiBjYXNlIG9mIHN0aWNreSBlZGl0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWQgKHJvb3Qgb2YgdGhlIHN0aWNreSBzZXNzaW9uKVxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbihjb250ZXh0OiBDb250ZXh0LCBhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCkge1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRjb25zdCBjdXJyZW50SGFzaCA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKTtcblx0XHRcdC8vIGVpdGhlciBjdXJyZW50IGhhc2ggaXMgZW1wdHkgc28gdGhlIHVzZXIgbGVmdCB0aGUgYXBwIG9yIGhlIG5hdmlnYXRlZCBhd2F5IGZyb20gdGhlIG9iamVjdFxuXHRcdFx0aWYgKCFjdXJyZW50SGFzaCB8fCAhYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuY2hlY2tIYXNoV2l0aEd1YXJkKGN1cnJlbnRIYXNoKSkge1xuXHRcdFx0XHR0aGlzLmRpc2NhcmRTdGlja3lTZXNzaW9uKGNvbnRleHQpO1xuXHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHQvL2NsZWFyIHRoZSBzZXNzaW9uIGNvbnRleHQgdG8gZW5zdXJlIHRoZSBMUiByZWZyZXNoZXMgdGhlIGxpc3Qgd2l0aG91dCBhIHNlc3Npb25cblx0XHRcdFx0XHQoY29udGV4dC5nZXRNb2RlbCgpIGFzIGFueSkuY2xlYXJTZXNzaW9uQ29udGV4dCgpO1xuXHRcdFx0XHR9LCAwKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEVuZHMgYSBzdGlja3kgc2Vzc2lvbiBieSBkaXNjYXJkaW5nIGNoYW5nZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZCAocm9vdCBvZiB0aGUgc3RpY2t5IHNlc3Npb24pXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGRpc2NhcmRTdGlja3lTZXNzaW9uKGNvbnRleHQ6IENvbnRleHQpIHtcblx0XHRjb25zdCBkaXNjYXJkZWRDb250ZXh0ID0gYXdhaXQgc3RpY2t5LmRpc2NhcmREb2N1bWVudChjb250ZXh0KTtcblx0XHRpZiAoZGlzY2FyZGVkQ29udGV4dD8uaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0ZGlzY2FyZGVkQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0fVxuXHRcdGRpc2NhcmRlZENvbnRleHQ/LnJlZnJlc2goKTtcblx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGludGVybmFsIHJvdXRpbmcgZXh0ZW5zaW9uLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgaW50ZXJuYWwgcm91dGluZyBleHRlbnNpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0SW50ZXJuYWxSb3V0aW5nKCk6IEludGVybmFsUm91dGluZyB7XG5cdFx0aWYgKHRoaXMuYmFzZS5fcm91dGluZykge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5fcm91dGluZztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIHJvdXRpbmcgbGlzdGVuZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0X2dldFJvb3RWaWV3Q29udHJvbGxlcigpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0fVxuXG5cdF9nZXRTZW1hbnRpY01hcHBpbmcoKTogU2VtYW50aWNNYXBwaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmdldExhc3RTZW1hbnRpY01hcHBpbmcoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHByb21pc2UgdG8gd2FpdCBmb3IgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250cm9sSWQgVGhlIElEIG9mIHRoZSBjb250cm9sXG5cdCAqIEByZXR1cm5zIHtGdW5jdGlvbn0gVGhlIHJlc29sdmVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4dGVybmFsbHkgcmVzb2x2ZSB0aGUgcHJvbWlzZVxuXHQgKi9cblx0cHJpdmF0ZSBjcmVhdGVBY3Rpb25Qcm9taXNlKGFjdGlvbk5hbWU6IHN0cmluZywgY29udHJvbElkOiBzdHJpbmcpIHtcblx0XHRsZXQgcmVzb2x2ZUZ1bmN0aW9uLCByZWplY3RGdW5jdGlvbjtcblx0XHR0aGlzLmFjdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRyZXNvbHZlRnVuY3Rpb24gPSByZXNvbHZlO1xuXHRcdFx0cmVqZWN0RnVuY3Rpb24gPSByZWplY3Q7XG5cdFx0fSkudGhlbigob1Jlc3BvbnNlOiBhbnkpID0+IHtcblx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKHsgY29udHJvbElkIH0sIHRoaXMuZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhhY3Rpb25OYW1lLCBvUmVzcG9uc2UpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4geyBmUmVzb2x2ZXI6IHJlc29sdmVGdW5jdGlvbiwgZlJlamVjdG9yOiByZWplY3RGdW5jdGlvbiB9O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdHByaXZhdGUgZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhhY3Rpb25OYW1lOiBzdHJpbmcsIHJlc3BvbnNlOiBhbnkpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZSkpIHtcblx0XHRcdGlmIChyZXNwb25zZS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0cmVzcG9uc2UgPSByZXNwb25zZVswXS52YWx1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIXJlc3BvbnNlKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0Y29uc3QgY3VycmVudFZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBtZXRhTW9kZWxEYXRhID0gKGN1cnJlbnRWaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgYW55KS5nZXREYXRhKCk7XG5cdFx0Y29uc3QgYWN0aW9uUmV0dXJuVHlwZSA9XG5cdFx0XHRtZXRhTW9kZWxEYXRhICYmIG1ldGFNb2RlbERhdGFbYWN0aW9uTmFtZV0gJiYgbWV0YU1vZGVsRGF0YVthY3Rpb25OYW1lXVswXSAmJiBtZXRhTW9kZWxEYXRhW2FjdGlvbk5hbWVdWzBdLiRSZXR1cm5UeXBlXG5cdFx0XHRcdD8gbWV0YU1vZGVsRGF0YVthY3Rpb25OYW1lXVswXS4kUmV0dXJuVHlwZS4kVHlwZVxuXHRcdFx0XHQ6IG51bGw7XG5cdFx0Y29uc3Qga2V5cyA9IGFjdGlvblJldHVyblR5cGUgJiYgbWV0YU1vZGVsRGF0YVthY3Rpb25SZXR1cm5UeXBlXSA/IG1ldGFNb2RlbERhdGFbYWN0aW9uUmV0dXJuVHlwZV0uJEtleSA6IG51bGw7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0b0RhdGE6IHJlc3BvbnNlLmdldE9iamVjdCgpLFxuXHRcdFx0a2V5c1xuXHRcdH07XG5cdH1cblxuXHRnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5hY3Rpb25Qcm9taXNlO1xuXHR9XG5cblx0ZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0dGhpcy5hY3Rpb25Qcm9taXNlID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0X3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyh0YWJsZTogVGFibGUpIHtcblx0XHRjb25zdCByb3dCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0Y29uc3QgYWN0aXZlUm93SW5kZXg6IG51bWJlciA9IHJvd0JpbmRpbmcuZ2V0Q291bnQoKSB8fCAwO1xuXHRcdGlmICh0YWJsZS5kYXRhKFwidGFibGVUeXBlXCIpICE9PSBcIlJlc3BvbnNpdmVUYWJsZVwiKSB7XG5cdFx0XHRpZiAoYWN0aXZlUm93SW5kZXggPiAwKSB7XG5cdFx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgoYWN0aXZlUm93SW5kZXggLSAxKTtcblx0XHRcdH1cblx0XHRcdHRhYmxlLmZvY3VzUm93KGFjdGl2ZVJvd0luZGV4LCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0LyogSW4gYSByZXNwb25zaXZlIHRhYmxlLCB0aGUgZW1wdHkgcm93cyBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGFibGUuIEJ1dCB3aGVuIHdlIGNyZWF0ZSBtb3JlLCB0aGV5IGFwcGVhciBiZWxvdyB0aGUgbmV3IGxpbmUuXG5cdFx0XHQgKiBTbyB3ZSBjaGVjayB0aGUgZmlyc3QgaW5hY3RpdmUgcm93IGZpcnN0LCB0aGVuIHdlIHNldCB0aGUgZm9jdXMgb24gaXQgd2hlbiB3ZSBwcmVzcyB0aGUgYnV0dG9uLlxuXHRcdFx0ICogVGhpcyBkb2Vzbid0IGltcGFjdCB0aGUgR3JpZFRhYmxlIGJlY2F1c2UgdGhleSBhcHBlYXIgYXQgdGhlIGVuZCwgYW5kIHdlIGFscmVhZHkgZm9jdXMgdGhlIGJlZm9yZS10aGUtbGFzdCByb3cgKGJlY2F1c2UgMiBlbXB0eSByb3dzIGV4aXN0KVxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBhbGxSb3dDb250ZXh0cyA9IHJvd0JpbmRpbmcuZ2V0Q29udGV4dHMoKTtcblx0XHRcdGlmICghYWxsUm93Q29udGV4dHM/Lmxlbmd0aCkge1xuXHRcdFx0XHR0YWJsZS5mb2N1c1JvdyhhY3RpdmVSb3dJbmRleCwgdHJ1ZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBmb2N1c1JvdyA9IGFjdGl2ZVJvd0luZGV4LFxuXHRcdFx0XHRpbmRleCA9IDA7XG5cdFx0XHRmb3IgKGNvbnN0IHNpbmdsZUNvbnRleHQgb2YgYWxsUm93Q29udGV4dHMpIHtcblx0XHRcdFx0aWYgKHNpbmdsZUNvbnRleHQuaXNJbmFjdGl2ZSgpICYmIGluZGV4IDwgZm9jdXNSb3cpIHtcblx0XHRcdFx0XHRmb2N1c1JvdyA9IGluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZm9jdXNSb3cgPiAwKSB7XG5cdFx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgoZm9jdXNSb3cpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coZm9jdXNSb3csIHRydWUpO1xuXHRcdH1cblx0fVxuXHRhc3luYyBjcmVhdGVFbXB0eVJvd3NBbmRGb2N1cyh0YWJsZTogVGFibGUpIHtcblx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdGlmIChcblx0XHRcdHRhYmxlQVBJPy50YWJsZURlZmluaXRpb24/LmNvbnRyb2w/LmlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUgJiZcblx0XHRcdCF0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcInVpXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0ZU1vZGVcIilcblx0XHQpIHtcblx0XHRcdC8vIFdpdGggdGhlIHBhcmFtZXRlciwgd2UgZG9uJ3QgaGF2ZSBlbXB0eSByb3dzIGluIEVkaXQgbW9kZSwgc28gd2UgbmVlZCB0byBjcmVhdGUgdGhlbSBiZWZvcmUgc2V0dGluZyB0aGUgZm9jdXMgb24gdGhlbVxuXHRcdFx0YXdhaXQgdGFibGVBUEkuc2V0VXBFbXB0eVJvd3ModGFibGUsIHRydWUpO1xuXHRcdH1cblx0XHR0aGlzLl9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGUpO1xuXHR9XG5cblx0X3NlbmRBY3Rpdml0eShcblx0XHRhY3Rpb246IEFjdGl2aXR5LFxuXHRcdHJlbGF0ZWRDb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSB8IHVuZGVmaW5lZCxcblx0XHRhY3Rpb25OYW1lPzogc3RyaW5nLFxuXHRcdHJlZnJlc2hMaXN0QmluZGluZz86IGJvb2xlYW4sXG5cdFx0YWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcz86IHN0cmluZ1tdXG5cdCkge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBBcnJheS5pc0FycmF5KHJlbGF0ZWRDb250ZXh0cykgPyByZWxhdGVkQ29udGV4dHMubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSkgOiByZWxhdGVkQ29udGV4dHM/LmdldFBhdGgoKTtcblx0XHRBY3Rpdml0eVN5bmMuc2VuZCh0aGlzLmdldFZpZXcoKSwgYWN0aW9uLCBjb250ZW50LCBhY3Rpb25OYW1lLCByZWZyZXNoTGlzdEJpbmRpbmcsIGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMpO1xuXHR9XG5cblx0X3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lOiBzdHJpbmcsIHRyaWdnZXJUeXBlOiBUcmlnZ2VyVHlwZSkge1xuXHRcdHRyaWdnZXJDb25maWd1cmVkU3VydmV5KHRoaXMuZ2V0VmlldygpLCBzQWN0aW9uTmFtZSwgdHJpZ2dlclR5cGUpO1xuXHR9XG5cblx0YXN5bmMgX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIFN1Ym1pdCBhbnkgbGVmdG92ZXIgY2hhbmdlcyB0aGF0IGFyZSBub3QgeWV0IHN1Ym1pdHRlZFxuXHRcdFx0Ly8gQ3VycmVudGx5IHdlIGFyZSB1c2luZyBvbmx5IDEgdXBkYXRlR3JvdXBJZCwgaGVuY2Ugc3VibWl0dGluZyB0aGUgYmF0Y2ggZGlyZWN0bHkgaGVyZVxuXHRcdFx0YXdhaXQgb01vZGVsLnN1Ym1pdEJhdGNoKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIFdhaXQgZm9yIGFsbCBjdXJyZW50bHkgcnVubmluZyBjaGFuZ2VzXG5cdFx0XHQvLyBGb3IgdGhlIHRpbWUgYmVpbmcgd2UgYWdyZWVkIHdpdGggdGhlIHY0IG1vZGVsIHRlYW0gdG8gdXNlIGFuIGludGVybmFsIG1ldGhvZC4gV2UnbGwgcmVwbGFjZSBpdCBvbmNlXG5cdFx0XHQvLyBhIHB1YmxpYyBvciByZXN0cmljdGVkIG1ldGhvZCB3YXMgcHJvdmlkZWRcblx0XHRcdGF3YWl0IG9Nb2RlbC5vUmVxdWVzdG9yLndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMoXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYWxsIGNoYW5nZXMgd2VyZSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5XG5cdFx0XHRpZiAob01vZGVsLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3VibWl0IG9mIG9wZW4gY2hhbmdlcyBmYWlsZWRcIik7XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogYW55LCBtb2RlbDogT0RhdGFNb2RlbCkge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCAobW9kZWwuZ2V0SHR0cEhlYWRlcnModHJ1ZSkgYXMgYW55KVtcIlNBUC1Db250ZXh0SWRcIl0pO1xuXHRcdH1cblx0fVxuXG5cdF9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWw6IGFueSkge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgZmFsc2UpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zdGlja3lTZXNzaW9uVG9rZW5cIiwgdW5kZWZpbmVkKTtcblx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T2ZmKCk7XG5cdFx0fVxuXHR9XG5cblx0YXN5bmMgX2hhbmRsZU5ld0NvbnRleHQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0YkVkaXRhYmxlOiBib29sZWFuLFxuXHRcdGJSZWNyZWF0ZUNvbnRleHQ6IGJvb2xlYW4sXG5cdFx0YkRyYWZ0TmF2aWdhdGlvbjogYm9vbGVhbixcblx0XHRiRm9yY2VGb2N1cyA9IGZhbHNlXG5cdCkge1xuXHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHtcblx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlLFxuXHRcdFx0ZWRpdGFibGU6IGJFZGl0YWJsZSxcblx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IHRydWUsXG5cdFx0XHRiUmVjcmVhdGVDb250ZXh0OiBiUmVjcmVhdGVDb250ZXh0LFxuXHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogYkRyYWZ0TmF2aWdhdGlvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogZmFsc2UsXG5cdFx0XHRiRm9yY2VGb2N1czogYkZvcmNlRm9jdXMsXG5cdFx0XHRrZWVwQ3VycmVudExheW91dDogdHJ1ZVxuXHRcdH0pO1xuXHR9XG5cblx0X2dldEJvdW5kQ29udGV4dCh2aWV3OiBhbnksIHBhcmFtczogYW55KSB7XG5cdFx0Y29uc3Qgdmlld0xldmVsID0gdmlldy5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbDtcblx0XHRjb25zdCBiUmVmcmVzaEFmdGVyQWN0aW9uID0gdmlld0xldmVsID4gMSB8fCAodmlld0xldmVsID09PSAxICYmIHBhcmFtcy5jb250cm9sSWQpO1xuXHRcdHJldHVybiAhcGFyYW1zLmlzTmF2aWdhYmxlIHx8ICEhYlJlZnJlc2hBZnRlckFjdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gKHBhcnNlKSBlcnJvcnMgZm9yIGNvbnRyb2xzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dFxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9yc1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRpb24gZXJyb3JzLCBhbmQgcmVqZWN0cyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiBlcnJvcnNcblx0ICovXG5cblx0X2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpIHtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzaygpLnRoZW4oKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc1ZpZXdJZCA9IHRoaXMuZ2V0VmlldygpLmdldElkKCk7XG5cdFx0XHRjb25zdCBhTWVzc2FnZXMgPSBzYXAudWkuZ2V0Q29yZSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0bGV0IG9Db250cm9sO1xuXHRcdFx0bGV0IG9NZXNzYWdlO1xuXG5cdFx0XHRpZiAoIWFNZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcIk5vIHZhbGlkYXRpb24gZXJyb3JzIGZvdW5kXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFNZXNzYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRvTWVzc2FnZSA9IGFNZXNzYWdlc1tpXTtcblx0XHRcdFx0aWYgKG9NZXNzYWdlLnZhbGlkYXRpb24pIHtcblx0XHRcdFx0XHRvQ29udHJvbCA9IENvcmUuYnlJZChvTWVzc2FnZS5nZXRDb250cm9sSWQoKSk7XG5cdFx0XHRcdFx0d2hpbGUgKG9Db250cm9sKSB7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRyb2wuZ2V0SWQoKSA9PT0gc1ZpZXdJZCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJ2YWxpZGF0aW9uIGVycm9ycyBleGlzdFwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9yZWZyZXNoTGlzdElmUmVxdWlyZWRcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvUmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9mIHRoZSBib3VuZCBhY3Rpb24gYW5kIHRoZSBuYW1lcyBvZiB0aGUga2V5IGZpZWxkc1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJvdW5kIGNvbnRleHQgb24gd2hpY2ggdGhlIGFjdGlvbiB3YXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgQWx3YXlzIHJlc29sdmVzIHRvIHBhcmFtIG9SZXNwb25zZVxuXHQgKi9cblx0X3JlZnJlc2hMaXN0SWZSZXF1aXJlZChvUmVzcG9uc2U6IGFueSwgb0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcblx0XHRpZiAoIW9Db250ZXh0IHx8ICFvUmVzcG9uc2UgfHwgIW9SZXNwb25zZS5vRGF0YSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHRcdH1cblx0XHRjb25zdCBvQmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHQvLyByZWZyZXNoIG9ubHkgbGlzdHNcblx0XHRpZiAob0JpbmRpbmcgJiYgb0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9SZXNwb25zZS5vRGF0YTtcblx0XHRcdGNvbnN0IGFLZXlzID0gb1Jlc3BvbnNlLmtleXM7XG5cdFx0XHRjb25zdCBvQ3VycmVudERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdGxldCBiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gdHJ1ZTtcblx0XHRcdC8vIGVuc3VyZSBjb250ZXh0IGlzIGluIHRoZSByZXNwb25zZVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db250ZXh0RGF0YSkubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGNoZWNrIGlmIGNvbnRleHQgaW4gcmVzcG9uc2UgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGJvdW5kIGNvbnRleHRcblx0XHRcdFx0YlJldHVybmVkQ29udGV4dElzU2FtZSA9IGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1cnJlbnREYXRhW3NLZXldID09PSBvQ29udGV4dERhdGFbc0tleV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdGlmICgob0JpbmRpbmcgYXMgYW55KS5pc1Jvb3QoKSkge1xuXHRcdFx0XHRcdFx0XHRvQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBvQmluZGluZy5nZXRQYXRoKCkgfV0sIG9CaW5kaW5nLmdldENvbnRleHQoKSBhcyBDb250ZXh0KVxuXHRcdFx0XHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCFiUmV0dXJuZWRDb250ZXh0SXNTYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRhYmxlXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCFiUmV0dXJuZWRDb250ZXh0SXNTYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRhYmxlXCIsIGUpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHJlc29sdmUgd2l0aCBvUmVzcG9uc2UgdG8gbm90IGRpc3R1cmIgdGhlIHByb21pc2UgY2hhaW4gYWZ0ZXJ3YXJkc1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0fVxuXG5cdF9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBhbnksXG5cdFx0XHRzRW50aXR5U2V0TmFtZSA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKSxcblx0XHRcdGFTZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMgJiYgYVNlbWFudGljS2V5cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFSZXF1ZXN0UHJvbWlzZXMgPSBhU2VtYW50aWNLZXlzLm1hcChmdW5jdGlvbiAob0tleTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KG9LZXkuJFByb3BlcnR5UGF0aCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXF1ZXN0UHJvbWlzZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIHRoZSBsYXRlc3QgY29udGV4dCBpbiB0aGUgbWV0YWRhdGEgaGllcmFyY2h5IGZyb20gcm9vdEJpbmRpbmcgdG8gZ2l2ZW4gY29udGV4dCBwb2ludGluZyB0byBnaXZlbiBlbnRpdHlUeXBlXG5cdCAqIGlmIGFueSBzdWNoIGNvbnRleHQgZXhpc3RzLiBPdGhlcndpc2UsIGl0IHJldHVybnMgdGhlIG9yaWdpbmFsIGNvbnRleHQuXG5cdCAqIE5vdGU6IEl0IGlzIG9ubHkgbmVlZGVkIGFzIHdvcmstYXJvdW5kIGZvciBpbmNvcnJlY3QgbW9kZWxsaW5nLiBDb3JyZWN0IG1vZGVsbGluZyB3b3VsZCBpbXBseSBhIERhdGFGaWVsZEZvckFjdGlvbiBpbiBhIExpbmVJdGVtXG5cdCAqIHRvIHBvaW50IHRvIGFuIG92ZXJsb2FkIGRlZmluZWQgZWl0aGVyIG9uIHRoZSBjb3JyZXNwb25kaW5nIEVudGl0eVR5cGUgb3IgYSBjb2xsZWN0aW9uIG9mIHRoZSBzYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0gcm9vdENvbnRleHQgVGhlIGNvbnRleHQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb21cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0QmluZGluZyBvZiB0aGUgdGFibGVcblx0ICogQHBhcmFtIG92ZXJsb2FkRW50aXR5VHlwZSBUaGUgQWN0aW9uT3ZlcmxvYWQgZW50aXR5IHR5cGUgdG8gc2VhcmNoIGZvclxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBBY3Rpb25PdmVybG9hZCBlbnRpdHlcblx0ICovXG5cdF9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoKHJvb3RDb250ZXh0OiBDb250ZXh0LCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgb3ZlcmxvYWRFbnRpdHlUeXBlOiBzdHJpbmcpOiBDb250ZXh0IHtcblx0XHRjb25zdCBtb2RlbDogT0RhdGFNb2RlbCA9IHJvb3RDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBjb250ZXh0U2VnbWVudHM6IHN0cmluZ1tdID0gbGlzdEJpbmRpbmcuZ2V0UGF0aCgpLnNwbGl0KFwiL1wiKTtcblx0XHRsZXQgY3VycmVudENvbnRleHQ6IENvbnRleHQgPSByb290Q29udGV4dDtcblxuXHRcdC8vIFdlIGV4cGVjdCB0aGF0IHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGxpc3RCaW5kaW5nIGlzIHRoZSBMaXN0QmluZGluZyBvZiB0aGUgdGFibGUuIFJlbW92ZSB0aGlzIGZyb20gY29udGV4dFNlZ21lbnRzXG5cdFx0Ly8gYmVjYXVzZSBpdCBpcyBpbmNvcnJlY3QgdG8gZXhlY3V0ZSBiaW5kQ29udGV4dCBvbiBhIGxpc3QuIFdlIGRvIG5vdCBhbnl3YXkgbmVlZCB0byBzZWFyY2ggdGhpcyBjb250ZXh0IGZvciB0aGUgb3ZlcmxvYWQuXG5cdFx0Y29udGV4dFNlZ21lbnRzLnBvcCgpO1xuXHRcdGlmIChjb250ZXh0U2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRjb250ZXh0U2VnbWVudHMgPSBbXCJcIl07IC8vIERvbid0IGxlYXZlIGNvbnRleHRTZWdtZW50cyB1bmRlZmluZWRcblx0XHR9XG5cblx0XHRpZiAoY29udGV4dFNlZ21lbnRzWzBdICE9PSBcIlwiKSB7XG5cdFx0XHRjb250ZXh0U2VnbWVudHMudW5zaGlmdChcIlwiKTsgLy8gdG8gYWxzbyBnZXQgdGhlIHJvb3QgY29udGV4dCwgaS5lLiB0aGUgYmluZGluZ0NvbnRleHQgb2YgdGhlIHRhYmxlXG5cdFx0fVxuXHRcdC8vIGxvYWQgYWxsIHRoZSBwYXJlbnQgY29udGV4dHMgaW50byBhbiBhcnJheVxuXHRcdGNvbnN0IHBhcmVudENvbnRleHRzOiBDb250ZXh0W10gPSBjb250ZXh0U2VnbWVudHNcblx0XHRcdC5tYXAoKHBhdGhTZWdtZW50OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0aWYgKHBhdGhTZWdtZW50ICE9PSBcIlwiKSB7XG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChwYXRoU2VnbWVudCwgY3VycmVudENvbnRleHQpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIENyZWF0aW5nIGEgbmV3IGNvbnRleHQgdXNpbmcgYmluZENvbnRleHQoLi4uKS5nZXRCb3VuZENvbnRleHQoKSBkb2VzIG5vdCB3b3JrIGlmIHRoZSBldGFnIGlzIG5lZWRlZC4gQWNjb3JkaW5nIHRvIG1vZGVsIGNvbGxlYWd1ZXMsXG5cdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIGFsd2F5cyB1c2UgYW4gZXhpc3RpbmcgY29udGV4dCBpZiBwb3NzaWJsZS5cblx0XHRcdFx0XHQvLyBDdXJyZW50bHksIHRoZSBvbmx5IGV4YW1wbGUgd2Uga25vdyBhYm91dCBpcyB1c2luZyB0aGUgcm9vdENvbnRleHQgLSBhbmQgaW4gdGhpcyBjYXNlLCB3ZSBjYW4gb2J2aW91c2x5IHJldXNlIHRoYXQgZXhpc3RpbmcgY29udGV4dC5cblx0XHRcdFx0XHQvLyBJZiBvdGhlciBleGFtcGxlcyBzaG91bGQgY29tZSB1cCwgdGhlIGJlc3QgcG9zc2libGUgd29yayBhcm91bmQgd291bGQgYmUgdG8gcmVxdWVzdCBzb21lIGRhdGEgdG8gZ2V0IGFuIGV4aXN0aW5nIGNvbnRleHQuIFRvIGtlZXAgdGhlXG5cdFx0XHRcdFx0Ly8gcmVxdWVzdCBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZSwgd2Ugc2hvdWxkIHJlcXVlc3Qgb25seSB0aGUgZmlyc3Qga2V5IHByb3BlcnR5LiBBcyB0aGlzIHdvdWxkIGludHJvZHVjZSBhc3luY2hyb25pc20sIGFuZCBhbnl3YXlcblx0XHRcdFx0XHQvLyB0aGUgd2hvbGUgbG9naWMgaXMgb25seSBwYXJ0IG9mIHdvcmstYXJvdW5kIGZvciBpbmNvcnJlY3QgbW9kZWxsaW5nLCB3ZSB3YWl0IHVudGlsIHdlIGhhdmUgYW4gZXhhbXBsZSBuZWVkaW5nIGl0IGJlZm9yZSBpbXBsZW1lbnRpbmcgdGhpcy5cblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCA9IHJvb3RDb250ZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBjdXJyZW50Q29udGV4dDtcblx0XHRcdH0pXG5cdFx0XHQucmV2ZXJzZSgpO1xuXHRcdC8vIHNlYXJjaCBmb3IgY29udGV4dCBiYWNrd2FyZHNcblx0XHRjb25zdCBvdmVybG9hZENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSBwYXJlbnRDb250ZXh0cy5maW5kKFxuXHRcdFx0KHBhcmVudENvbnRleHQ6IENvbnRleHQpID0+XG5cdFx0XHRcdChtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQocGFyZW50Q29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIiRUeXBlXCIpIGFzIHVua25vd24gYXMgc3RyaW5nKSA9PT0gb3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0KTtcblx0XHRyZXR1cm4gb3ZlcmxvYWRDb250ZXh0IHx8IGxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSE7XG5cdH1cblxuXHRfY3JlYXRlU2libGluZ0luZm8oY3VycmVudENvbnRleHQ6IENvbnRleHQsIG5ld0NvbnRleHQ6IENvbnRleHQpOiBTaWJsaW5nSW5mb3JtYXRpb24ge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRDb250ZXh0OiBuZXdDb250ZXh0LFxuXHRcdFx0cGF0aE1hcHBpbmc6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG9sZFBhdGg6IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRuZXdQYXRoOiBuZXdDb250ZXh0LmdldFBhdGgoKVxuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fTtcblx0fVxuXG5cdF91cGRhdGVQYXRoc0luSGlzdG9yeShtYXBwaW5nczogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W10pIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0UGF0aE1hcHBpbmcobWFwcGluZ3MpO1xuXG5cdFx0Ly8gQWxzbyB1cGRhdGUgdGhlIHNlbWFudGljIG1hcHBpbmcgaW4gdGhlIHJvdXRpbmcgc2VydmljZVxuXHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRpZiAobWFwcGluZ3MubGVuZ3RoICYmIGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm9sZFBhdGgpIHtcblx0XHRcdGxhc3RTZW1hbnRpY01hcHBpbmcudGVjaG5pY2FsUGF0aCA9IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0fVxuXHR9XG5cblx0X2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0KGNvbnRleHQ6IENvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dDogQ29udGV4dCwgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZCkge1xuXHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZTogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKGNvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPSBuZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0fVxuXHRcdHJldHVybiBjb250ZXh0VG9OYXZpZ2F0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgc2libGluZyBjb250ZXh0IGZvciBhIHN1Ym9iamVjdCBwYWdlLCBhbmQgY2FsY3VsYXRlcyBhIHNpYmxpbmcgcGF0aFxuXHQgKiBmb3IgYWxsIGludGVybWVkaWF0ZSBwYXRocyBiZXR3ZWVuIHRoZSBvYmplY3QgcGFnZSBhbmQgdGhlIHN1Ym9iamVjdCBwYWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcm9vdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgcm9vdCBvZiB0aGUgZHJhZnRcblx0ICogQHBhcmFtIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBzdWJvYmplY3Rcblx0ICogQHBhcmFtIHNQcm9ncmFtbWluZ01vZGVsIFRoZSBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKiBAcGFyYW0gZG9Ob3RDb21wdXRlSWZSb290IElmIHRydWUsIHdlIGRvbid0IGNvbXB1dGUgc2libGluZ0luZm8gaWYgdGhlIHJvb3QgYW5kIHRoZSByaWdodG1vc3QgY29udGV4dHMgYXJlIHRoZSBzYW1lXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHNpYmxpbmdJbmZvcm1hdGlvbiBvYmplY3Rcblx0ICovXG5cdGFzeW5jIF9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdHJvb3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dDogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0c1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRkb05vdENvbXB1dGVJZlJvb3Q6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID8/IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGlmIChkb05vdENvbXB1dGVJZlJvb3QgJiYgcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpID09PSByb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKHJvb3RDdXJyZW50Q29udGV4dCwgcmlnaHRtb3N0Q3VycmVudENvbnRleHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJZiBub3QgaW4gZHJhZnQgbW9kZSwgd2UganVzdCByZWNyZWF0ZSBhIGNvbnRleHQgZnJvbSB0aGUgcGF0aCBvZiB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdC8vIE5vIHBhdGggbWFwcGluZyBpcyBuZWVkZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0Qm91bmRDb250ZXh0KCksXG5cdFx0XHRcdHBhdGhNYXBwaW5nOiBbXVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHRfaXNGY2xFbmFibGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBFZGl0RmxvdztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBK0NBLE1BQU1BLFlBQVksR0FBR0MsU0FBUyxDQUFD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
|
|
2396
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiTWVzc2FnZVR5cGUiLCJjb3JlTGlicmFyeSIsIkVkaXRGbG93IiwiZGVmaW5lVUk1Q2xhc3MiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwic3luY1Rhc2tzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXRBcHBDb21wb25lbnQiLCJiYXNlIiwiZWRpdERvY3VtZW50Iiwib0NvbnRleHQiLCJiRHJhZnROYXZpZ2F0aW9uIiwidHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJfZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwibW9kZWwiLCJnZXRNb2RlbCIsInJpZ2h0bW9zdENvbnRleHQiLCJzaWJsaW5nSW5mbyIsIm9WaWV3RGF0YSIsImdldFZpZXciLCJnZXRWaWV3RGF0YSIsInNQcm9ncmFtbWluZ01vZGVsIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsIm9Sb290Q29udGV4dCIsIm9WaWV3Iiwidmlld0xldmVsIiwiRHJhZnQiLCJTdGlja3kiLCJDb21tb25VdGlscyIsImNyZWF0ZVJvb3RDb250ZXh0IiwiZWRpdEZsb3ciLCJvbkJlZm9yZUVkaXQiLCJjb250ZXh0Iiwib05ld0RvY3VtZW50Q29udGV4dCIsImdldE1lc3NhZ2VIYW5kbGVyIiwiX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMiLCJzZXRFZGl0TW9kZSIsIkVkaXRhYmxlIiwic2V0RG9jdW1lbnRNb2RpZmllZCIsInNob3dNZXNzYWdlRGlhbG9nIiwiY29udGV4dFRvTmF2aWdhdGUiLCJfaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwiX2NyZWF0ZVNpYmxpbmdJbmZvIiwiX3VwZGF0ZVBhdGhzSW5IaXN0b3J5IiwicGF0aE1hcHBpbmciLCJ0YXJnZXRDb250ZXh0IiwiZ2V0UGF0aCIsInJvb3RTaWJsaW5nUGF0aCIsInJvb3RDb250ZXh0SW5mbyIsInJvb3RDb250ZXh0Tm90UmVxdWlyZWQiLCJfZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQiLCJfaGFuZGxlTmV3Q29udGV4dCIsInN0aWNreUNvbnRleHQiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwiaGFuZGxlU3RpY2t5T24iLCJNb2RlbEhlbHBlciIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwiZ2V0TWV0YU1vZGVsIiwic2hhcmVPYmplY3QiLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzIiwiY29udGV4dHNUb0RlbGV0ZSIsInBhcmFtZXRlcnMiLCJiZWZvcmVEZWxldGVDYWxsQmFjayIsIm9uQmVmb3JlRGVsZXRlIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwibG9ja09iamVjdCIsImdldEdsb2JhbFVJTW9kZWwiLCJwYXJlbnRDb250cm9sIiwiYnlJZCIsImNvbnRyb2xJZCIsIkVycm9yIiwibGlzdEJpbmRpbmciLCJnZXRCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsImJGaW5kQWN0aXZlQ29udGV4dHMiLCJCdXN5TG9ja2VyIiwibG9jayIsImRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24iLCJyZXN1bHQiLCJpc0EiLCJjbGVhclNlbGVjdGlvbiIsInZpZXdCaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiaXNSb290IiwiYXR0YWNoRXZlbnRPbmNlIiwicmVmcmVzaCIsImhhc1RyYW5zaWVudENvbnRleHQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJFZGl0U3RhdGUiLCJzZXRFZGl0U3RhdGVEaXJ0eSIsIkFjdGl2aXR5U3luYyIsInNlbmQiLCJBY3Rpdml0eSIsIkRlbGV0ZSIsIm1hcCIsInVubG9jayIsInVwZGF0ZURvY3VtZW50IiwidXBkYXRlZENvbnRleHQiLCJ1cGRhdGVQcm9taXNlIiwib3JpZ2luYWxCaW5kaW5nQ29udGV4dCIsImlzRHJhZnQiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJzeW5jVGFzayIsInNldERyYWZ0U3RhdHVzIiwiU2F2aW5nIiwiY3VycmVudEJpbmRpbmdDb250ZXh0IiwibWV0YU1vZGVsIiwiZW50aXR5U2V0TmFtZSIsImdldE1ldGFDb250ZXh0IiwiZ2V0T2JqZWN0Iiwic2VtYW50aWNLZXlzIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJsZW5ndGgiLCJjdXJyZW50U2VtYW50aWNNYXBwaW5nIiwiX2dldFNlbWFudGljTWFwcGluZyIsImN1cnJlbnRTZW1hbnRpY1BhdGgiLCJzZW1hbnRpY1BhdGgiLCJzQ2hhbmdlZFBhdGgiLCJnZXRTZW1hbnRpY1BhdGgiLCJTYXZlZCIsIkNsZWFyIiwic2hvd01lc3NhZ2VzIiwiY3JlYXRlRG9jdW1lbnQiLCJ2TGlzdEJpbmRpbmciLCJtSW5QYXJhbWV0ZXJzIiwib0xvY2tPYmplY3QiLCJvVGFibGUiLCJtUGFyYW1ldGVycyIsIm9DcmVhdGlvbiIsImJTaG91bGRCdXN5TG9jayIsImNyZWF0aW9uTW9kZSIsIklubGluZSIsIkNyZWF0aW9uUm93IiwiRXh0ZXJuYWwiLCJvRXhlY0N1c3RvbVZhbGlkYXRpb24iLCJvQXBwQ29tcG9uZW50IiwiZ2V0Um91dGVyUHJveHkiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJvQ29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJzQ3JlYXRlUGF0aCIsImdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyIsImhhbmRsZXJzIiwib25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kIiwib3V0Ym91bmQiLCJ1bmRlZmluZWQiLCJjcmVhdGlvblJvdyIsIm9DcmVhdGlvblJvd09iamVjdHMiLCJnZXRQYXJlbnQiLCJ2YWxpZGF0ZURvY3VtZW50IiwiZGF0YSIsImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsImdldENyZWF0aW9uUm93Iiwib0ludGVybmFsTW9kZWxDb250ZXh0Iiwic2V0UHJvcGVydHkiLCJ0YWJsZUlkIiwiZm5Gb2N1c09yU2Nyb2xsIiwiZm9jdXNSb3ciLCJiaW5kIiwic2Nyb2xsVG9JbmRleCIsImNyZWF0ZUF0RW5kIiwiZ2V0TGVuZ3RoIiwiaGFuZGxlU2lkZUVmZmVjdHMiLCJvTGlzdEJpbmRpbmciLCJvQ3JlYXRpb25Qcm9taXNlIiwib05ld0NvbnRleHQiLCJjcmVhdGVkIiwib0JpbmRpbmdDb250ZXh0IiwiYXBwQ29tcG9uZW50IiwiY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzIiwiYVZhbGlkYXRpb25NZXNzYWdlcyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJtQ3VzdG9tVmFsaWRpdHkiLCJnZXRQcm9wZXJ0eSIsIm9NZXNzYWdlTWFuYWdlciIsIkNvcmUiLCJnZXRNZXNzYWdlTWFuYWdlciIsImFDdXN0b21NZXNzYWdlcyIsIm9GaWVsZENvbnRyb2wiLCJzVGFyZ2V0IiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZvckVhY2giLCJvTWVzc2FnZSIsImNvZGUiLCJyZW1vdmVNZXNzYWdlcyIsIm9WYWxpZGF0aW9uTWVzc2FnZSIsIm1lc3NhZ2VUYXJnZXQiLCJnZXRDb250cm9sIiwiZmllbGRJZCIsImdldEJpbmRpbmdQYXRoIiwiZmlsdGVyIiwidGFyZ2V0IiwiYWRkTWVzc2FnZXMiLCJNZXNzYWdlIiwibWVzc2FnZSIsIm1lc3NhZ2VUZXh0IiwicHJvY2Vzc29yIiwidHlwZSIsInRlY2huaWNhbCIsInBlcnNpc3RlbnQiLCJhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMiLCJhZGRDb250cm9sSWQiLCJwdXNoIiwidGV4dCIsImN1c3RvbU1lc3NhZ2VzIiwicmVzb2x2ZUNyZWF0aW9uTW9kZSIsImluaXRpYWxDcmVhdGlvbk1vZGUiLCJwcm9ncmFtbWluZ01vZGVsIiwib01ldGFNb2RlbCIsIk5ld1BhZ2UiLCJpc1JlbGF0aXZlIiwic1BhdGgiLCJzTmV3QWN0aW9uIiwiYVBhcmFtZXRlcnMiLCJEZWZlcnJlZCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0SGVhZGVyQ29udGV4dCIsImFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMiLCJnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMiLCJBc3luYyIsIk9EYXRhTGlzdEJpbmRpbmciLCJTeW5jIiwib01vZGVsIiwicmVzb2x2ZWRDcmVhdGlvbk1vZGUiLCJtQXJncyIsIm9DcmVhdGlvblJvdyIsIm9DcmVhdGlvblJvd0NvbnRleHQiLCJvUGF5bG9hZCIsIm9Sb3V0aW5nTGlzdGVuZXIiLCJnZXRJbnRlcm5hbFJvdXRpbmciLCJPYmplY3QiLCJrZXlzIiwic1Byb3BlcnR5UGF0aCIsIm9Qcm9wZXJ0eSIsIiRraW5kIiwiX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJidXN5TW9kZSIsImJ1c3lJZCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImFubm90YXRpb24iLCJpZCIsImhhbmRsZUNyZWF0ZUV2ZW50cyIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwib25CZWZvcmVDcmVhdGUiLCJza2lwUGFyYW1ldGVyRGlhbG9nIiwiZ2V0U3RhcnR1cE1vZGUiLCJBdXRvQ3JlYXRlIiwiYlNraXBTaWRlRWZmZWN0cyIsIm9OYXZpZ2F0aW9uIiwibmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0IiwiYkRlZmVycmVkQ29udGV4dCIsImVkaXRhYmxlIiwiYkZvcmNlRm9jdXMiLCJhc3luY0NvbnRleHQiLCJjcmVhdGVBY3Rpb24iLCJ0cmFuc2llbnQiLCJ0aGVuIiwiY29yZVJlc291cmNlQnVuZGxlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwibmF2aWdhdGVUb01lc3NhZ2VQYWdlIiwiZ2V0VGV4dCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJiRnJvbURlZmVycmVkIiwibmF2aWdhdGVUb0NvbnRleHQiLCJvQ3JlYXRpb25Sb3dMaXN0QmluZGluZyIsIm9OZXdUcmFuc2llbnRDb250ZXh0IiwiY3JlYXRlIiwic2V0QmluZGluZ0NvbnRleHQiLCJjYXRjaCIsInRyYWNlIiwiZGVsZXRlIiwiaXNMb2NrZWQiLCJyZWplY3QiLCJhUGFyYW1zIiwiYWxsIiwibWV0YUNvbnRleHQiLCJiaW5kQ29udGV4dCIsImVudGl0eVNldCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsInN0YXJ0aW5nRW50aXR5U2V0IiwibmV3QWN0aW9uIiwiYW5ub3RhdGlvbnMiLCJTZXNzaW9uIiwiU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsIk5ld0FjdGlvbiIsImdldEludGVybmFsTW9kZWwiLCJzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUiLCJfc2VuZEFjdGl2aXR5IiwiQ3JlYXRlIiwiaXNDb25uZWN0ZWQiLCJDYW5jZWxBY3Rpb25EaWFsb2ciLCJBY3Rpb25FeGVjdXRpb25GYWlsZWQiLCJDcmVhdGlvbkZhaWxlZCIsIm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSIsImNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzIiwiZGF0YUZvckNyZWF0ZSIsImlzRnJvbUNvcHlQYXN0ZSIsImNyZWF0ZUFzSW5hY3RpdmUiLCJ0YXJnZXRMaXN0QmluZGluZyIsImNvbnRleHRQYXRoIiwibWV0YVBhdGgiLCJnZXRDb250ZXh0IiwiY3JlYXRpb25Qcm9taXNlcyIsInByb3BlcnR5VmFsdWVzIiwiY3JlYXRlUGFyYW1ldGVycyIsImluYWN0aXZlIiwicHJvcGVydHlQYXRoIiwicHJvcGVydHkiLCJpbmRleE9mIiwiY3JlYXRlZENvbnRleHRzIiwibmV3Q29udGV4dCIsImJJbmFjdGl2ZSIsImVyciIsIm9uQmVmb3JlU2F2ZSIsIl9tUGFyYW1ldGVycyIsIm9uQmVmb3JlRGlzY2FyZCIsInNhdmVEb2N1bWVudCIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiYUJpbmRpbmdzIiwiYmluZGluZ3MiLCJfc3VibWl0T3BlbkNoYW5nZXMiLCJpc0ZjbEVuYWJsZWQiLCJhY3RpdmVEb2N1bWVudENvbnRleHQiLCJfZ2V0UmVzb3VyY2VNb2RlbCIsImdldENyZWF0aW9uTW9kZSIsIl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzIiwiQWN0aXZhdGUiLCJkaXNjb25uZWN0IiwiX3RyaWdnZXJDb25maWd1cmVkU3VydmV5IiwiU3RhbmRhcmRBY3Rpb25zIiwic2F2ZSIsIlRyaWdnZXJUeXBlIiwic3RhbmRhcmRBY3Rpb24iLCJEaXNwbGF5IiwiY2FuY2VsZWQiLCJ0b2dnbGVEcmFmdEFjdGl2ZSIsIm9Db250ZXh0RGF0YSIsImJFZGl0YWJsZSIsImJJc0RyYWZ0IiwiSXNBY3RpdmVFbnRpdHkiLCJIYXNBY3RpdmVFbnRpdHkiLCJIYXNEcmFmdEVudGl0eSIsIm9SaWdodG1vc3RDb250ZXh0IiwibGFzdFNlbWFudGljTWFwcGluZyIsInRlY2huaWNhbFBhdGgiLCJ0YXJnZXRQYXRoIiwibmV3UGF0aCIsIm9sZFBhdGgiLCJjYW5jZWxEb2N1bWVudCIsImlzTmV3RG9jdW1lbnQiLCJjYW5jZWxCdXR0b24iLCJjb250cm9sIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJjYW5jZWxSZXN1bHQiLCJpc0RvY3VtZW50TW9kaWZpZWQiLCJnZXRJbnN0YW5jZWRWaWV3cyIsInZpZXciLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsIkRpc2NhcmQiLCJza2lwQmFja05hdmlnYXRpb24iLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyIsInNraXBCaW5kaW5nVG9WaWV3Iiwic2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UiLCJyZXNvdXJjZU1vZGVsIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJhdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsInNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJkZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsImlzRHJhZnRSb290IiwidGFyZ2V0RW50aXR5U2V0IiwiZGVsZXRlRG9jdW1lbnQiLCJnZXRJbmRleCIsInNpYmxpbmdDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwiZHJhZnRQYXRoIiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJkcmFmdENvbnRleHRUb1JlbW92ZSIsInJlcGxhY2VXaXRoIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwiRGVlcGxpbmsiLCJleGl0RnJvbUFwcCIsImFwcGx5RG9jdW1lbnQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImludm9rZUFjdGlvbiIsInNBY3Rpb25OYW1lIiwibUV4dHJhUGFyYW1zIiwib0NvbnRyb2wiLCJhUGFydHMiLCJzT3ZlcmxvYWRFbnRpdHlUeXBlIiwib0N1cnJlbnRBY3Rpb25DYWxsQmFja3MiLCJBcnJheSIsImlzQXJyYXkiLCJjb250ZXh0cyIsImlzTmF2aWdhYmxlIiwicmVxdWlyZXNOYXZpZ2F0aW9uIiwiY29udmVydGVkTWV0YWRhdGEiLCJjb252ZXJ0VHlwZXMiLCJlbnRpdHlDb250YWluZXIiLCJuYW1lIiwiaXNCb3VuZCIsImludGVybmFsTW9kZWxDb250ZXh0Iiwic3BsaXQiLCJyZXBsYWNlQWxsIiwiYlN0YXRpY0FjdGlvbiIsImlzVGFibGVCb3VuZCIsInNCaW5kaW5nUGF0aCIsInBhdGgiLCJfZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbU1ldGFkYXRhUGF0aCIsImVuYWJsZUF1dG9TY3JvbGwiLCJjcmVhdGVBY3Rpb25Qcm9taXNlIiwic0lkIiwiYkdldEJvdW5kQ29udGV4dCIsIl9nZXRCb3VuZENvbnRleHQiLCJiT2JqZWN0UGFnZSIsImNvbnZlcnRlclR5cGUiLCJvUmVzcG9uc2UiLCJjYWxsQWN0aW9uIiwibGlzdFJlZnJlc2hlZCIsIl9yZWZyZXNoTGlzdElmUmVxdWlyZWQiLCJnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzIiwiYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyIsInZhbHVlIiwiQWN0aW9uIiwiYWN0aW9uIiwiZlJlc29sdmVyIiwidkNvbnRleHQiLCJzQ29udGV4dE1ldGFQYXRoIiwiX2ZuVmFsaWRDb250ZXh0cyIsImFwcGxpY2FibGVDb250ZXh0cyIsImVsZW1lbnQiLCJvQWN0aW9uQ29udGV4dCIsInNBY3Rpb25Db250ZXh0TWV0YVBhdGgiLCJjaGVja05vSGFzaENoYW5nZSIsIm5vSGlzdG9yeUVudHJ5IiwiaW5mbyIsIm9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24iLCJmUmVqZWN0b3IiLCJyZWplY3RlZEl0ZW1zIiwiX2FjdGlvbk5hbWUiLCJzZWN1cmVkRXhlY3V0aW9uIiwiZm5GdW5jdGlvbiIsImJCdXN5U2V0IiwiYnVzeSIsInNldCIsImJCdXN5Q2hlY2siLCJjaGVjayIsImJVcGRhdGVzRG9jdW1lbnQiLCJ1cGRhdGVzRG9jdW1lbnQiLCJmaW5hbGx5IiwiaGFuZGxlUGF0Y2hTZW50Iiwib0V2ZW50IiwiaXNJbkNvbGxhYm9yYXRpdmVEcmFmdCIsImdldFNvdXJjZSIsInNldElnbm9yZUVUYWciLCJzb3VyY2VCaW5kaW5nIiwib1BhdGNoUHJvbWlzZSIsInBhdGNoQ29tcGxldGVkRXZlbnQiLCJBY3Rpb25SdW50aW1lIiwic2V0QWN0aW9uRW5hYmxlbWVudEFmdGVyUGF0Y2giLCJiU3VjY2VzcyIsImdldFBhcmFtZXRlciIsImhhbmRsZUNyZWF0ZUFjdGl2YXRlIiwib0JpbmRpbmciLCJiQXRFbmQiLCJvUGFyYW1zIiwiYWN0aXZhdGVkQ29udGV4dCIsIndhcm5pbmciLCJuZXdJbmFjdGl2ZUNvbnRleHQiLCJuZXdUYXNrIiwiY29tcHV0ZUVkaXRNb2RlIiwiZ2xvYmFsTW9kZWwiLCJpc0FjdGl2ZUVudGl0eSIsInJlcXVlc3RPYmplY3QiLCJoYXNBY3RpdmVFbnRpdHkiLCJsYXN0SW52b2tlZEFjdGlvbk5hbWUiLCJpc05ld0FjdGlvbkZvclN0aWNreSIsImdldFJlc291cmNlTW9kZWwiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJUcmFuc2FjdGlvbkhlbHBlciIsIm1lc3NhZ2VIYW5kbGVyIiwic2V0Q3JlYXRpb25Nb2RlIiwiYkNyZWF0aW9uTW9kZSIsInVpTW9kZWxDb250ZXh0IiwibW9kaWZpZWQiLCJiaW5kaW5nIiwiYXR0YWNoRXZlbnQiLCJzdWNjZXNzIiwiZHJhZnRTdGF0dXMiLCJzb3VyY2UiLCJlZGl0TW9kZSIsImlzQ3JlYXRpb24iLCJhY3Rpb25OYW1lIiwic3RpY2t5U2Vzc2lvbiIsIkFkZGl0aW9uYWxOZXdBY3Rpb25zIiwiaGFzTmF2aWdhdGlvbkd1YXJkIiwiaGFzaFRyYWNrZXIiLCJnZXRIYXNoIiwiaW50ZXJuYWxNb2RlbCIsInNldFRpbWVvdXQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJzdWJzdHJpbmciLCJvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwiZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24iLCJnZXREaXJ0eVN0YXRlUHJvdmlkZXIiLCJyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImkxOG5Nb2RlbCIsInNlc3Npb25UaW1lb3V0RnVuY3Rpb24iLCJnZXRTZXNzaW9uVGltZW91dEZ1bmN0aW9uIiwiYXR0YWNoU2Vzc2lvblRpbWVvdXQiLCJzdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24iLCJnZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbiIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsImhhbmRsZVN0aWNreU9mZiIsImRpc2NhcmROYXZpZ2F0aW9uR3VhcmQiLCJkZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIiwiZGV0YWNoU2Vzc2lvblRpbWVvdXQiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJnZXRIdHRwSGVhZGVycyIsIm5hdmlnYXRpb25Db250ZXh0IiwidGFyZ2V0SGFzaCIsImlubmVyQXBwUm91dGUiLCJyb3V0ZXJQcm94eSIsImxjbEhhc2hUcmFja2VyIiwiaXNEaXJ0eSIsImlzU2Vzc2lvbk9uIiwiaXNOYXZpZ2F0aW9uRmluYWxpemVkIiwiY2hlY2tIYXNoV2l0aEd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsInNldERpcnR5RmxhZyIsIndhcm5pbmdEaWFsb2ciLCJEaWFsb2ciLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJwcmVzcyIsImFmdGVyQ2xvc2UiLCJkZXN0cm95IiwiYWRkU3R5bGVDbGFzcyIsInNldE1vZGVsIiwiYWRkRGVwZW5kZW50Iiwib3BlbiIsImN1cnJlbnRIYXNoIiwiZGlzY2FyZFN0aWNreVNlc3Npb24iLCJjbGVhclNlc3Npb25Db250ZXh0IiwiZGlzY2FyZGVkQ29udGV4dCIsInN0aWNreSIsImRpc2NhcmREb2N1bWVudCIsInJlc2V0Q2hhbmdlcyIsIl9yb3V0aW5nIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsInJlc29sdmVGdW5jdGlvbiIsInJlamVjdEZ1bmN0aW9uIiwiYWN0aW9uUHJvbWlzZSIsImFzc2lnbiIsInJlc3BvbnNlIiwiY3VycmVudFZpZXciLCJtZXRhTW9kZWxEYXRhIiwiYWN0aW9uUmV0dXJuVHlwZSIsIiRSZXR1cm5UeXBlIiwiJFR5cGUiLCIkS2V5Iiwib0RhdGEiLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiX3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyIsInRhYmxlIiwicm93QmluZGluZyIsImFjdGl2ZVJvd0luZGV4IiwiZ2V0Q291bnQiLCJhbGxSb3dDb250ZXh0cyIsImdldENvbnRleHRzIiwiaW5kZXgiLCJzaW5nbGVDb250ZXh0IiwiaXNJbmFjdGl2ZSIsImNyZWF0ZUVtcHR5Um93c0FuZEZvY3VzIiwidGFibGVBUEkiLCJ0YWJsZURlZmluaXRpb24iLCJpbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlIiwic2V0VXBFbXB0eVJvd3MiLCJyZWxhdGVkQ29udGV4dHMiLCJyZWZyZXNoTGlzdEJpbmRpbmciLCJ0cmlnZ2VyVHlwZSIsInRyaWdnZXJDb25maWd1cmVkU3VydmV5Iiwic3VibWl0QmF0Y2giLCJvUmVxdWVzdG9yIiwid2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0cyIsImNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkIiwiYmluZGluZ0NvbnRleHQiLCJwcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24iLCJoaXN0b3J5IiwiYmFjayIsImJSZWNyZWF0ZUNvbnRleHQiLCJiUGVyc2lzdE9QU2Nyb2xsIiwic2hvd1BsYWNlaG9sZGVyIiwia2VlcEN1cnJlbnRMYXlvdXQiLCJwYXJhbXMiLCJiUmVmcmVzaEFmdGVyQWN0aW9uIiwic1ZpZXdJZCIsImdldElkIiwiYU1lc3NhZ2VzIiwiaSIsInZhbGlkYXRpb24iLCJnZXRDb250cm9sSWQiLCJhS2V5cyIsIm9DdXJyZW50RGF0YSIsImJSZXR1cm5lZENvbnRleHRJc1NhbWUiLCJldmVyeSIsInNLZXkiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImUiLCJzRW50aXR5U2V0TmFtZSIsImFTZW1hbnRpY0tleXMiLCJhUmVxdWVzdFByb21pc2VzIiwib0tleSIsIiRQcm9wZXJ0eVBhdGgiLCJyb290Q29udGV4dCIsIm92ZXJsb2FkRW50aXR5VHlwZSIsImNvbnRleHRTZWdtZW50cyIsImN1cnJlbnRDb250ZXh0IiwicG9wIiwidW5zaGlmdCIsInBhcmVudENvbnRleHRzIiwicGF0aFNlZ21lbnQiLCJyZXZlcnNlIiwib3ZlcmxvYWRDb250ZXh0IiwiZmluZCIsInBhcmVudENvbnRleHQiLCJtYXBwaW5ncyIsInNldFBhdGhNYXBwaW5nIiwibmV3RG9jdW1lbnRDb250ZXh0Iiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJkb05vdENvbXB1dGVJZlJvb3QiLCJzdGFydHNXaXRoIiwiZHJhZnQiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRWRpdEZsb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgQWN0aXZpdHlTeW5jIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IHsgQWN0aXZpdHksIHNoYXJlT2JqZWN0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBSb290Q29udGV4dEluZm8sIFNpYmxpbmdJbmZvcm1hdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgVHJhbnNhY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgeyBTdGFuZGFyZEFjdGlvbnMsIHRyaWdnZXJDb25maWd1cmVkU3VydmV5LCBUcmlnZ2VyVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHR5cGUgSW50ZXJuYWxSb3V0aW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcywgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCB7IGdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01ldGFNb2RlbEZ1bmN0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTZW1hbnRpY01hcHBpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCB0eXBlIEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBjb3JlTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YVY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCBBY3Rpb25SdW50aW1lIGZyb20gXCIuLi9BY3Rpb25SdW50aW1lXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VNYW5pZmVzdFNldHRpbmdzIH0gZnJvbSBcIi4uL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlLFxuXHRQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWwsXG5cdENvbnN0YW50cyA9IEZFTGlicmFyeS5Db25zdGFudHMsXG5cdERyYWZ0U3RhdHVzID0gRkVMaWJyYXJ5LkRyYWZ0U3RhdHVzLFxuXHRFZGl0TW9kZSA9IEZFTGlicmFyeS5FZGl0TW9kZSxcblx0U3RhcnR1cE1vZGUgPSBGRUxpYnJhcnkuU3RhcnR1cE1vZGUsXG5cdE1lc3NhZ2VUeXBlID0gY29yZUxpYnJhcnkuTWVzc2FnZVR5cGU7XG5cbi8qKlxuICogQSBjb250cm9sbGVyIGV4dGVuc2lvbiBvZmZlcmluZyBob29rcyBpbnRvIHRoZSBlZGl0IGZsb3cgb2YgdGhlIGFwcGxpY2F0aW9uXG4gKlxuICogQGhpZGVjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICogQHNpbmNlIDEuOTAuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1wiKVxuY2xhc3MgRWRpdEZsb3cgZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIGRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBzZXNzaW9uVGltZW91dEZ1bmN0aW9uPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBzdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24/OiBGdW5jdGlvbjtcblxuXHRwcml2YXRlIHN5bmNUYXNrczogUHJvbWlzZTxhbnk+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0cHJpdmF0ZSBhY3Rpb25Qcm9taXNlPzogUHJvbWlzZTxhbnk+O1xuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFB1YmxpYyBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0Z2V0QXBwQ29tcG9uZW50KCk6IEFwcENvbXBvbmVudCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZm9yIGFuIGV4aXN0aW5nIGFjdGl2ZSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0YWJsZSBkb2N1bWVudCBpcyBhdmFpbGFibGVcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2VkaXREb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBlZGl0RG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBiRHJhZnROYXZpZ2F0aW9uID0gdHJ1ZTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdGNvbnN0IG1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRsZXQgcmlnaHRtb3N0Q29udGV4dCwgc2libGluZ0luZm87XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBCYXNlTWFuaWZlc3RTZXR0aW5ncztcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0bGV0IG9Sb290Q29udGV4dDogQ29udGV4dCA9IG9Db250ZXh0O1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0dHJ5IHtcblx0XHRcdGlmICgob1ZpZXdEYXRhPy52aWV3TGV2ZWwgYXMgbnVtYmVyKSA+IDEpIHtcblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0IHx8IHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRcdG9Sb290Q29udGV4dCA9IChhd2FpdCBDb21tb25VdGlscy5jcmVhdGVSb290Q29udGV4dChzUHJvZ3JhbW1pbmdNb2RlbCwgb1ZpZXcsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpKSBhcyBDb250ZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVFZGl0KHsgY29udGV4dDogb1Jvb3RDb250ZXh0IH0pO1xuXHRcdFx0Y29uc3Qgb05ld0RvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmVkaXREb2N1bWVudChcblx0XHRcdFx0b1Jvb3RDb250ZXh0LFxuXHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpXG5cdFx0XHQpO1xuXG5cdFx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsLCBtb2RlbCk7XG5cblx0XHRcdGlmIChvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIGZhbHNlKTtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cblx0XHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQgIT09IG9Sb290Q29udGV4dCkge1xuXHRcdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZTogQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9OZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRyaWdodG1vc3RDb250ZXh0ID0gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob1Jvb3RDb250ZXh0LCByaWdodG1vc3RDb250ZXh0LCBzUHJvZ3JhbW1pbmdNb2RlbCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPSBvTmV3RG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmICgob1ZpZXdEYXRhPy52aWV3TGV2ZWwgYXMgbnVtYmVyKSA+IDEpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHJvb3RTaWJsaW5nUGF0aCA9IG9OZXdEb2N1bWVudENvbnRleHQ/LmdldFBhdGgoKTtcblx0XHRcdFx0XHRcdGNvbnN0IHJvb3RDb250ZXh0SW5mbyA9IHtcblx0XHRcdFx0XHRcdFx0cm9vdFNpYmxpbmdQYXRoOiByb290U2libGluZ1BhdGgsXG5cdFx0XHRcdFx0XHRcdHJvb3RDb250ZXh0Tm90UmVxdWlyZWQ6IHRydWVcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0XHRcdG9Sb290Q29udGV4dCxcblx0XHRcdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdFx0XHRyb290Q29udGV4dEluZm9cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHRoaXMuX2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0KG9Db250ZXh0LCBvTmV3RG9jdW1lbnRDb250ZXh0LCBzaWJsaW5nSW5mbykgYXMgQ29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgdHJ1ZSwgZmFsc2UsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBzdGlja3lPbiBoYW5kbGVyIG11c3QgYmUgc2V0IGFmdGVyIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIGRvbmUsXG5cdFx0XHRcdFx0XHQvLyBhcyB0aGUgVVJMIG1heSBjaGFuZ2UgaW4gdGhlIGNhc2Ugb2YgRkNMXG5cdFx0XHRcdFx0XHRsZXQgc3RpY2t5Q29udGV4dDogQ29udGV4dDtcblx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIHVzZSB0aGUga2VwdC1hbGl2ZSBjb250ZXh0IHVzZWQgdG8gYmluZCB0aGUgcGFnZVxuXHRcdFx0XHRcdFx0XHRzdGlja3lDb250ZXh0ID0gb05ld0RvY3VtZW50Q29udGV4dC5nZXRNb2RlbCgpLmdldEtlZXBBbGl2ZUNvbnRleHQob05ld0RvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0c3RpY2t5Q29udGV4dCA9IG9OZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9uKHN0aWNreUNvbnRleHQpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobW9kZWwuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRcdFx0XHQvLyBhY2NvcmRpbmcgdG8gVVggaW4gY2FzZSBvZiBlbmFibGVkIGNvbGxhYm9yYXRpb24gZHJhZnQgd2Ugc2hhcmUgdGhlIG9iamVjdCBpbW1lZGlhdGVseVxuXHRcdFx0XHRcdFx0YXdhaXQgc2hhcmVPYmplY3Qob05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBlZGl0aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlcyBzZXZlcmFsIGRvY3VtZW50cy5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRzVG9EZWxldGUgVGhlIGNvbnRleHRzIG9mIHRoZSBkb2N1bWVudHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gcGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVkIG9uY2UgdGhlIGRvY3VtZW50cyBhcmUgZGVsZXRlZFxuXHQgKi9cblx0YXN5bmMgZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMoY29udGV4dHNUb0RlbGV0ZTogQ29udGV4dFtdLCBwYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRpZiAocGFyYW1ldGVycykge1xuXHRcdFx0cGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHRcdHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzID0gcGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgIT09IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRiZWZvcmVEZWxldGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlLFxuXHRcdFx0XHRyZXF1ZXN0U2lkZUVmZmVjdHM6IHRydWVcblx0XHRcdH07XG5cdFx0fVxuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCBwYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChwYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0aWYgKCFwYXJlbnRDb250cm9sKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwYXJhbWV0ZXIgY29udHJvbElkIG1pc3Npbmcgb3IgaW5jb3JyZWN0XCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSBwYXJlbnRDb250cm9sO1xuXHRcdH1cblx0XHRjb25zdCBsaXN0QmluZGluZyA9IChwYXJlbnRDb250cm9sLmdldEJpbmRpbmcoXCJpdGVtc1wiKSB8fCAocGFyZW50Q29udHJvbCBhcyBUYWJsZSkuZ2V0Um93QmluZGluZygpKSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdHBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0cyA9IHRydWU7XG5cdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihjb250ZXh0c1RvRGVsZXRlLCBwYXJhbWV0ZXJzKTtcblx0XHRcdGxldCByZXN1bHQ7XG5cblx0XHRcdC8vIE11bHRpcGxlIG9iamVjdCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhIGxpc3Rcblx0XHRcdC8vIEZpcnN0IGNsZWFyIHRoZSBzZWxlY3Rpb24gaW4gdGhlIHRhYmxlIGFzIGl0J3Mgbm90IHZhbGlkIGFueSBtb3JlXG5cdFx0XHRpZiAocGFyZW50Q29udHJvbC5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRcdChwYXJlbnRDb250cm9sIGFzIGFueSkuY2xlYXJTZWxlY3Rpb24oKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGhlbiByZWZyZXNoIHRoZSBsaXN0LWJpbmRpbmcgKExSKSwgb3IgcmVxdWlyZSBzaWRlLWVmZmVjdHMgKE9QKVxuXHRcdFx0Y29uc3Qgdmlld0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdGlmICgobGlzdEJpbmRpbmcgYXMgYW55KS5pc1Jvb3QoKSkge1xuXHRcdFx0XHQvLyBrZWVwIHByb21pc2UgY2hhaW4gcGVuZGluZyB1bnRpbCByZWZyZXNoIG9mIGxpc3RiaW5kaW5nIGlzIGNvbXBsZXRlZFxuXHRcdFx0XHRyZXN1bHQgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuXHRcdFx0XHRcdGxpc3RCaW5kaW5nLmF0dGFjaEV2ZW50T25jZShcImRhdGFSZWNlaXZlZFwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRsaXN0QmluZGluZy5yZWZyZXNoKCk7XG5cdFx0XHR9IGVsc2UgaWYgKHZpZXdCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdFx0aWYgKHBhcmFtZXRlcnMucmVxdWVzdFNpZGVFZmZlY3RzICYmICFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KGxpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdFx0XHRcdC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKVxuXHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShsaXN0QmluZGluZy5nZXRQYXRoKCksIHZpZXdCaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBkZWxldGluZyBhdCBsZWFzdCBvbmUgb2JqZWN0IHNob3VsZCBhbHNvIHNldCB0aGUgVUkgdG8gZGlydHlcblx0XHRcdGlmICghdGhpcy5nZXRBcHBDb21wb25lbnQoKS5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cblx0XHRcdEFjdGl2aXR5U3luYy5zZW5kKFxuXHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0QWN0aXZpdHkuRGVsZXRlLFxuXHRcdFx0XHRjb250ZXh0c1RvRGVsZXRlLm1hcCgoY29udGV4dDogQ29udGV4dCkgPT4gY29udGV4dC5nZXRQYXRoKCkpXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudChzKVwiLCBlcnJvcik7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKGxvY2tPYmplY3QpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBkcmFmdCBzdGF0dXMgYW5kIGRpc3BsYXlzIHRoZSBlcnJvciBtZXNzYWdlcyBpZiB0aGVyZSBhcmUgZXJyb3JzIGR1cmluZyBhbiB1cGRhdGUuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gdXBkYXRlZENvbnRleHQgQ29udGV4dCBvZiB0aGUgdXBkYXRlZCBmaWVsZFxuXHQgKiBAcGFyYW0gdXBkYXRlUHJvbWlzZSBQcm9taXNlIHRvIGRldGVybWluZSB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZC4gVGhlIHByb21pc2Ugc2hvdWxkIGJlIHJlc29sdmVkIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLCBzbyB0aGUgZHJhZnQgc3RhdHVzIGNhbiBiZSB1cGRhdGVkLlxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZHJhZnQgc3RhdHVzIGhhcyBiZWVuIHVwZGF0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3VwZGF0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHVwZGF0ZURvY3VtZW50KHVwZGF0ZWRDb250ZXh0OiBvYmplY3QsIHVwZGF0ZVByb21pc2U6IFByb21pc2U8YW55Pik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9yaWdpbmFsQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGlzRHJhZnQgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwodXBkYXRlZENvbnRleHQgYXMgQmluZGluZyB8IENvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrKGFzeW5jICgpID0+IHtcblx0XHRcdGlmIChvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGlzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgdXBkYXRlUHJvbWlzZTtcblx0XHRcdFx0Y29uc3QgY3VycmVudEJpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0aWYgKCFpc0RyYWZ0IHx8ICFjdXJyZW50QmluZGluZ0NvbnRleHQgfHwgY3VycmVudEJpbmRpbmdDb250ZXh0ICE9PSBvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0Ly8gSWYgYSBuYXZpZ2F0aW9uIGhhcHBlbmVkIHdoaWxlIG9Qcm9taXNlIHdhcyBiZWluZyByZXNvbHZlZCwgdGhlIGJpbmRpbmcgY29udGV4dCBvZiB0aGUgcGFnZSBjaGFuZ2VkXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UncmUgc3RpbGwgb24gdGhlIHNhbWUgY29udGV4dFxuXHRcdFx0XHRjb25zdCBtZXRhTW9kZWwgPSBjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRcdFx0Y29uc3QgZW50aXR5U2V0TmFtZSA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjdXJyZW50QmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKTtcblx0XHRcdFx0Y29uc3Qgc2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG1ldGFNb2RlbCwgZW50aXR5U2V0TmFtZSk7XG5cdFx0XHRcdGlmIChzZW1hbnRpY0tleXM/Lmxlbmd0aCkge1xuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50U2VtYW50aWNQYXRoID0gY3VycmVudFNlbWFudGljTWFwcGluZz8uc2VtYW50aWNQYXRoLFxuXHRcdFx0XHRcdFx0c0NoYW5nZWRQYXRoID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNQYXRoKGN1cnJlbnRCaW5kaW5nQ29udGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0Ly8gY3VycmVudFNlbWFudGljUGF0aCBjb3VsZCBiZSBudWxsIGlmIHdlIGhhdmUgbmF2aWdhdGVkIHZpYSBkZWVwIGxpbmsgdGhlbiB0aGVyZSBhcmUgbm8gc2VtYW50aWNNYXBwaW5ncyB0byBjYWxjdWxhdGUgaXQgZnJvbVxuXHRcdFx0XHRcdGlmIChjdXJyZW50U2VtYW50aWNQYXRoICYmIGN1cnJlbnRTZW1hbnRpY1BhdGggIT09IHNDaGFuZ2VkUGF0aCkge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjdXJyZW50QmluZGluZ0NvbnRleHQgYXMgQ29udGV4dCwgdHJ1ZSwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB1cGRhdGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IpO1xuXHRcdFx0XHRpZiAoaXNEcmFmdCAmJiBvcmlnaW5hbEJpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZXMoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyAqIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdC8vICogICAgICAgICAgICAgICAgICAgIFN5bmMgLSB0aGUgY3JlYXRpb24gaXMgdHJpZ2dlcmVkIGFuZCBvbmNlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkLCB0aGUgbmF2aWdhdGlvbiBpcyBkb25lXG5cdC8vICogICAgICAgICAgICAgICAgICAgIEFzeW5jIC0gdGhlIGNyZWF0aW9uIGFuZCB0aGUgbmF2aWdhdGlvbiB0byB0aGUgaW5zdGFuY2UgYXJlIGRvbmUgaW4gcGFyYWxsZWxcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWQgLSB0aGUgY3JlYXRpb24gaXMgZG9uZSBvbiB0aGUgdGFyZ2V0IHBhZ2Vcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25Sb3cgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbmxpbmUgYXN5bmMgc28gdGhlIHVzZXIgaXMgbm90IGJsb2NrZWRcblx0Ly8gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgSW5zdGFuY2Ugb2YgdGhlIGNyZWF0aW9uIHJvdyAtIChUT0RPOiBnZXQgcmlkIGJ1dCB1c2UgbGlzdCBiaW5kaW5ncyBvbmx5KVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHZMaXN0QmluZGluZyAgT0RhdGFMaXN0QmluZGluZyBvYmplY3Qgb3IgdGhlIGJpbmRpbmcgcGF0aCBmb3IgYSB0ZW1wb3JhcnkgbGlzdCBiaW5kaW5nXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXHQgKiAgICAgICAgICAgICAgICAgICAgTmV3UGFnZSAtIHRoZSBjcmVhdGVkIGRvY3VtZW50IGlzIHNob3duIGluIGEgbmV3IHBhZ2UsIGRlcGVuZGluZyBvbiB3aGV0aGVyIG1ldGFkYXRhICdTeW5jJywgJ0FzeW5jJyBvciAnRGVmZXJyZWQnIGlzIHVzZWRcblx0ICogICAgICAgICAgICAgICAgICAgIElubGluZSAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGlubGluZSAoaW4gYSB0YWJsZSlcblx0ICogICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW4gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24gc3BlY2lmaWVkIHZpYSB0aGUgcGFyYW1ldGVyICdvdXRib3VuZCdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMudGFibGVJZCBJRCBvZiB0aGUgdGFibGVcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMub3V0Ym91bmQgVGhlIG5hdmlnYXRpb24gdGFyZ2V0IHdoZXJlIHRoZSBkb2N1bWVudCBpcyBjcmVhdGVkIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdFeHRlcm5hbCdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgU3BlY2lmaWVzIGlmIHRoZSBuZXcgZW50cnkgc2hvdWxkIGJlIGNyZWF0ZWQgYXQgdGhlIHRvcCBvciBib3R0b20gb2YgYSB0YWJsZSBpbiBjYXNlIG9mIGNyZWF0aW9uTW9kZSAnSW5saW5lJ1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNjcmVhdGVEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBjcmVhdGVEb2N1bWVudChcblx0XHR2TGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcgfCBzdHJpbmcsXG5cdFx0bUluUGFyYW1ldGVyczoge1xuXHRcdFx0Y3JlYXRpb25Nb2RlOiBzdHJpbmc7XG5cdFx0XHR0YWJsZUlkPzogc3RyaW5nO1xuXHRcdFx0b3V0Ym91bmQ/OiBzdHJpbmc7XG5cdFx0XHRjcmVhdGVBdEVuZD86IGJvb2xlYW47XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0bGV0IG9UYWJsZTogYW55OyAvL3Nob3VsZCBiZSBUYWJsZSBidXQgdGhlcmUgYXJlIG1pc3NpbmcgbWV0aG9kcyBpbnRvIHRoZSBkZWZcblx0XHRsZXQgbVBhcmFtZXRlcnM6IGFueSA9IG1JblBhcmFtZXRlcnM7XG5cdFx0bGV0IG9DcmVhdGlvbjogUHJvbWlzZTxDb250ZXh0PiB8IHVuZGVmaW5lZDtcblx0XHRjb25zdCBiU2hvdWxkQnVzeUxvY2sgPVxuXHRcdFx0IW1QYXJhbWV0ZXJzIHx8XG5cdFx0XHQobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuSW5saW5lICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsKTtcblx0XHRsZXQgb0V4ZWNDdXN0b21WYWxpZGF0aW9uID0gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkucmVtb3ZlSUFwcFN0YXRlS2V5KCk7XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpIHtcblx0XHRcdC8vIENyZWF0ZSBieSBuYXZpZ2F0aW5nIHRvIGFuIGV4dGVybmFsIHRhcmdldFxuXHRcdFx0Ly8gVE9ETzogQ2FsbCBhcHByb3ByaWF0ZSBmdW5jdGlvbiAoY3VycmVudGx5IHVzaW5nIHRoZSBzYW1lIGFzIGZvciBvdXRib3VuZCBjaGV2cm9uIG5hdiwgYW5kIHdpdGhvdXQgYW55IGNvbnRleHQgLSAzcmQgcGFyYW0pXG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKTtcblx0XHRcdGNvbnN0IHNDcmVhdGVQYXRoID0gTW9kZWxIZWxwZXIuZ2V0QWJzb2x1dGVNZXRhUGF0aEZvckxpc3RCaW5kaW5nKHRoaXMuZ2V0VmlldygpLCB2TGlzdEJpbmRpbmcpO1xuXG5cdFx0XHQob0NvbnRyb2xsZXIgYXMgYW55KS5oYW5kbGVycy5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQob0NvbnRyb2xsZXIsIG1QYXJhbWV0ZXJzLm91dGJvdW5kLCB1bmRlZmluZWQsIHNDcmVhdGVQYXRoKTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJiBtUGFyYW1ldGVycy5jcmVhdGlvblJvdykge1xuXHRcdFx0Y29uc3Qgb0NyZWF0aW9uUm93T2JqZWN0cyA9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCkuZ2V0T2JqZWN0KCk7XG5cdFx0XHRkZWxldGUgb0NyZWF0aW9uUm93T2JqZWN0c1tcIkAkdWk1LmNvbnRleHQuaXNUcmFuc2llbnRcIl07XG5cdFx0XHRvVGFibGUgPSBtUGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRQYXJlbnQoKTtcblx0XHRcdG9FeGVjQ3VzdG9tVmFsaWRhdGlvbiA9IHRoaXMudmFsaWRhdGVEb2N1bWVudChvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoKSwge1xuXHRcdFx0XHRkYXRhOiBvQ3JlYXRpb25Sb3dPYmplY3RzLFxuXHRcdFx0XHRjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb246IG9UYWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIilcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhIGlzIHNldCB0byBmYWxzZSBpbiBtYW5pZmVzdCBjb252ZXJ0ZXIgKFRhYmxlLnRzKSBpZiBjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24gZXhpc3RzXG5cdFx0XHRpZiAob1RhYmxlLmdldENyZWF0aW9uUm93KCkuZGF0YShcImRpc2FibGVBZGRSb3dCdXR0b25Gb3JFbXB0eURhdGFcIikgPT09IFwidHJ1ZVwiKSB7XG5cdFx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiwge30pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmUgJiYgbVBhcmFtZXRlcnMudGFibGVJZCkge1xuXHRcdFx0b1RhYmxlID0gdGhpcy5nZXRWaWV3KCkuYnlJZChtUGFyYW1ldGVycy50YWJsZUlkKSBhcyBUYWJsZTtcblx0XHR9XG5cblx0XHRpZiAob1RhYmxlICYmIG9UYWJsZS5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpKSB7XG5cdFx0XHRjb25zdCBmbkZvY3VzT3JTY3JvbGwgPVxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmUgPyBvVGFibGUuZm9jdXNSb3cuYmluZChvVGFibGUpIDogb1RhYmxlLnNjcm9sbFRvSW5kZXguYmluZChvVGFibGUpO1xuXHRcdFx0b1RhYmxlLmdldFJvd0JpbmRpbmcoKS5hdHRhY2hFdmVudE9uY2UoXCJjaGFuZ2VcIiwgYXN5bmMgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRhd2FpdCBvQ3JlYXRpb247XG5cdFx0XHRcdGZuRm9jdXNPclNjcm9sbChtUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA/IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkuZ2V0TGVuZ3RoKCkgOiAwLCB0cnVlKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IGhhbmRsZVNpZGVFZmZlY3RzID0gYXN5bmMgKG9MaXN0QmluZGluZzogYW55LCBvQ3JlYXRpb25Qcm9taXNlOiBQcm9taXNlPENvbnRleHQ+KSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBvTmV3Q29udGV4dCA9IGF3YWl0IG9DcmVhdGlvblByb21pc2U7XG5cdFx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0XHRhd2FpdCBvTmV3Q29udGV4dC5jcmVhdGVkKCk7XG5cdFx0XHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChvTGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCkucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KG9MaXN0QmluZGluZy5nZXRQYXRoKCksIG9CaW5kaW5nQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gYVZhbGlkYXRpb25NZXNzYWdlcyBFcnJvciBtZXNzYWdlcyBmcm9tIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdFx0ICovXG5cdFx0Y29uc3QgY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzID0gKGFWYWxpZGF0aW9uTWVzc2FnZXM6IGFueVtdKSA9PiB7XG5cdFx0XHRjb25zdCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gb1RhYmxlICYmIG9UYWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb25cIik7XG5cdFx0XHRjb25zdCBtQ3VzdG9tVmFsaWRpdHkgPSBvVGFibGUgJiYgb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik/LmdldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dDdXN0b21WYWxpZGl0eVwiKTtcblx0XHRcdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0XHRcdGNvbnN0IGFDdXN0b21NZXNzYWdlczogYW55W10gPSBbXTtcblx0XHRcdGxldCBvRmllbGRDb250cm9sO1xuXHRcdFx0bGV0IHNUYXJnZXQ6IHN0cmluZztcblxuXHRcdFx0Ly8gUmVtb3ZlIGV4aXN0aW5nIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0b01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9NZXNzYWdlLmNvZGUgPT09IHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24pIHtcblx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhvTWVzc2FnZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0YVZhbGlkYXRpb25NZXNzYWdlcy5mb3JFYWNoKChvVmFsaWRhdGlvbk1lc3NhZ2U6IGFueSkgPT4ge1xuXHRcdFx0XHQvLyBIYW5kbGUgQm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRcdGlmIChvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldCkge1xuXHRcdFx0XHRcdG9GaWVsZENvbnRyb2wgPSBDb3JlLmdldENvbnRyb2wobUN1c3RvbVZhbGlkaXR5W29WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGFyZ2V0XS5maWVsZElkKSBhcyBDb250cm9sO1xuXHRcdFx0XHRcdHNUYXJnZXQgPSBgJHtvRmllbGRDb250cm9sLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKX0vJHtvRmllbGRDb250cm9sLmdldEJpbmRpbmdQYXRoKFwidmFsdWVcIil9YDtcblx0XHRcdFx0XHQvLyBBZGQgdmFsaWRhdGlvbiBtZXNzYWdlIGlmIHN0aWxsIG5vdCBleGlzdHNcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvTWVzc2FnZS50YXJnZXQgPT09IHNUYXJnZXQ7XG5cdFx0XHRcdFx0XHRcdH0pLmxlbmd0aCA9PT0gMFxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyLmFkZE1lc3NhZ2VzKFxuXHRcdFx0XHRcdFx0XHRuZXcgTWVzc2FnZSh7XG5cdFx0XHRcdFx0XHRcdFx0bWVzc2FnZTogb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3NvcjogdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvcixcblx0XHRcdFx0XHRcdFx0XHRjb2RlOiBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdHRlY2huaWNhbDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0cGVyc2lzdGVudDogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0OiBzVGFyZ2V0XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBBZGQgY29udHJvbElkIGluIG9yZGVyIHRvIGdldCB0aGUgZm9jdXMgaGFuZGxpbmcgb2YgdGhlIGVycm9yIHBvcG92ZXIgcnVuYWJsZVxuXHRcdFx0XHRcdGNvbnN0IGFFeGlzdGluZ1ZhbGlkYXRpb25NZXNzYWdlcyA9IG9NZXNzYWdlTWFuYWdlclxuXHRcdFx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvTWVzc2FnZS50YXJnZXQgPT09IHNUYXJnZXQ7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXNbMF0uYWRkQ29udHJvbElkKG1DdXN0b21WYWxpZGl0eVtvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCk7XG5cblx0XHRcdFx0XHQvLyBIYW5kbGUgVW5ib3VuZCBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhQ3VzdG9tTWVzc2FnZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRjb2RlOiBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0dGV4dDogb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUZXh0LFxuXHRcdFx0XHRcdFx0cGVyc2lzdGVudDogdHJ1ZSxcblx0XHRcdFx0XHRcdHR5cGU6IE1lc3NhZ2VUeXBlLkVycm9yXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoYUN1c3RvbU1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKHtcblx0XHRcdFx0XHRjdXN0b21NZXNzYWdlczogYUN1c3RvbU1lc3NhZ2VzXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjb25zdCByZXNvbHZlQ3JlYXRpb25Nb2RlID0gKFxuXHRcdFx0aW5pdGlhbENyZWF0aW9uTW9kZTogc3RyaW5nLFxuXHRcdFx0cHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLFxuXHRcdFx0b0xpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWxcblx0XHQpOiBzdHJpbmcgPT4ge1xuXHRcdFx0aWYgKGluaXRpYWxDcmVhdGlvbk1vZGUgJiYgaW5pdGlhbENyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLk5ld1BhZ2UpIHtcblx0XHRcdFx0Ly8gdXNlIHRoZSBwYXNzZWQgY3JlYXRpb24gbW9kZVxuXHRcdFx0XHRyZXR1cm4gaW5pdGlhbENyZWF0aW9uTW9kZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIE5ld0FjdGlvbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgTmF2aWdhdGlvblByb3BlcnR5IGNvbGxlY3Rpb25cblx0XHRcdFx0aWYgKCFvTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1BhdGggPSBvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0Ly8gaWYgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycyBpcyBwcmVzZW50LCB0aGVuIGNyZWF0aW9uIGlzICdEZWZlcnJlZCdcblx0XHRcdFx0XHRcdC8vIGluIHRoZSBhYnNlbmNlIG9mIE5ld0FjdGlvbiBvciBOZXdBY3Rpb24gd2l0aCBwYXJhbWV0ZXJzLCBjcmVhdGlvbiBpcyBhc3luY1xuXHRcdFx0XHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdFx0XHRcdHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHRcdFx0XHQ/IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L05ld0FjdGlvbmApXG5cdFx0XHRcdFx0XHRcdFx0OiBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL05ld0FjdGlvbmApO1xuXHRcdFx0XHRcdGlmIChzTmV3QWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBhUGFyYW1ldGVycyA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAvJHtzTmV3QWN0aW9ufS9AJHVpNS5vdmVybG9hZC8wLyRQYXJhbWV0ZXJgKSB8fCBbXTtcblx0XHRcdFx0XHRcdC8vIGJpbmRpbmcgcGFyYW1ldGVyIChlZzogX2l0KSBpcyBub3QgY29uc2lkZXJlZFxuXHRcdFx0XHRcdFx0aWYgKGFQYXJhbWV0ZXJzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgc01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTGlzdEJpbmRpbmc/LmdldEhlYWRlckNvbnRleHQoKSEuZ2V0UGF0aCgpKTtcblx0XHRcdFx0Y29uc3QgYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyA9IGdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyhvTWV0YU1vZGVsLCBzTWV0YVBhdGgsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkpO1xuXHRcdFx0XHRpZiAoYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5EZWZlcnJlZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gQ3JlYXRpb25Nb2RlLkFzeW5jO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAoYlNob3VsZEJ1c3lMb2NrKSB7XG5cdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdH1cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgYVZhbGlkYXRpb25NZXNzYWdlcyA9IGF3YWl0IHRoaXMuc3luY1Rhc2sob0V4ZWNDdXN0b21WYWxpZGF0aW9uKTtcblx0XHRcdGlmIChhVmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0Y3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzKGFWYWxpZGF0aW9uTWVzc2FnZXMpO1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJDdXN0b20gVmFsaWRhdGlvbiBmYWlsZWRcIik7XG5cdFx0XHRcdC8vIGlmIGN1c3RvbSB2YWxpZGF0aW9uIGZhaWxzLCB3ZSBsZWF2ZSB0aGUgbWV0aG9kIGltbWVkaWF0ZWx5XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0bGV0IG9MaXN0QmluZGluZzogYW55O1xuXHRcdFx0bVBhcmFtZXRlcnMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblxuXHRcdFx0aWYgKHZMaXN0QmluZGluZyAmJiB0eXBlb2Ygdkxpc3RCaW5kaW5nID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdC8vIHdlIGFscmVhZHkgZ2V0IGEgbGlzdCBiaW5kaW5nIHVzZSB0aGlzIG9uZVxuXHRcdFx0XHRvTGlzdEJpbmRpbmcgPSB2TGlzdEJpbmRpbmc7XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2TGlzdEJpbmRpbmcgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0b0xpc3RCaW5kaW5nID0gbmV3IChPRGF0YUxpc3RCaW5kaW5nIGFzIGFueSkodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSwgdkxpc3RCaW5kaW5nKTtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLlN5bmM7XG5cdFx0XHRcdGRlbGV0ZSBtUGFyYW1ldGVycy5jcmVhdGVBdEVuZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgb2JqZWN0IG9yIHBhdGggZXhwZWN0ZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG9Nb2RlbCA9IG9MaXN0QmluZGluZy5nZXRNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvTGlzdEJpbmRpbmcpO1xuXHRcdFx0Y29uc3QgcmVzb2x2ZWRDcmVhdGlvbk1vZGUgPSByZXNvbHZlQ3JlYXRpb25Nb2RlKFxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUsXG5cdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRvTGlzdEJpbmRpbmcsXG5cdFx0XHRcdG9Nb2RlbC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0KTtcblx0XHRcdGxldCBtQXJnczogYW55O1xuXHRcdFx0Y29uc3Qgb0NyZWF0aW9uUm93ID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3c7XG5cdFx0XHRsZXQgb0NyZWF0aW9uUm93Q29udGV4dDogYW55O1xuXHRcdFx0bGV0IG9QYXlsb2FkOiBhbnk7XG5cdFx0XHRsZXQgc01ldGFQYXRoOiBzdHJpbmc7XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3Qgb1JvdXRpbmdMaXN0ZW5lciA9IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCk7XG5cblx0XHRcdGlmIChyZXNvbHZlZENyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkRlZmVycmVkKSB7XG5cdFx0XHRcdGlmIChyZXNvbHZlZENyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93KSB7XG5cdFx0XHRcdFx0b0NyZWF0aW9uUm93Q29udGV4dCA9IG9DcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NyZWF0aW9uUm93Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdC8vIHByZWZpbGwgZGF0YSBmcm9tIGNyZWF0aW9uIHJvd1xuXHRcdFx0XHRcdG9QYXlsb2FkID0gb0NyZWF0aW9uUm93Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhID0ge307XG5cdFx0XHRcdFx0T2JqZWN0LmtleXMob1BheWxvYWQpLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS8ke3NQcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0XHQvLyBlbnN1cmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFyZSBub3QgcGFydCBvZiB0aGUgcGF5bG9hZCwgZGVlcCBjcmVhdGUgbm90IHN1cHBvcnRlZFxuXHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eSAmJiBvUHJvcGVydHkuJGtpbmQgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YVtzUHJvcGVydHlQYXRoXSA9IG9QYXlsb2FkW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygvKm9DcmVhdGlvblJvd0NvbnRleHQqLyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgfHwgcmVzb2x2ZWRDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5JbmxpbmUpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkID0gZmFsc2U7IC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdFx0Ly8gYnVzeSBoYW5kbGluZyBzaGFsbCBiZSBkb25lIGxvY2FsbHkgb25seVxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmJ1c3lNb2RlID0gXCJMb2NhbFwiO1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmJ1c3lJZCA9IG9UYWJsZT8uZ2V0UGFyZW50KCk/LmdldFRhYmxlRGVmaW5pdGlvbigpPy5hbm5vdGF0aW9uLmlkO1xuXG5cdFx0XHRcdFx0Ly8gdGFrZSBjYXJlIG9uIG1lc3NhZ2UgaGFuZGxpbmcsIGRyYWZ0IGluZGljYXRvciAoaW4gY2FzZSBvZiBkcmFmdClcblx0XHRcdFx0XHQvLyBBdHRhY2ggdGhlIGNyZWF0ZSBzZW50IGFuZCBjcmVhdGUgY29tcGxldGVkIGV2ZW50IHRvIHRoZSBvYmplY3QgcGFnZSBiaW5kaW5nIHNvIHRoYXQgd2UgY2FuIHJlYWN0XG5cdFx0XHRcdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHMob0xpc3RCaW5kaW5nKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCkge1xuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayA9IHRoaXMub25CZWZvcmVDcmVhdGU7XG5cblx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgYXBwbGljYXRpb24gd2FzIGNhbGxlZCB3aXRoIHByZWZlcnJlZE1vZGU9YXV0b0NyZWF0ZVdpdGgsIHdlIHdhbnQgdG8gc2tpcCB0aGVcblx0XHRcdFx0Ly8gYWN0aW9uIHBhcmFtZXRlciBkaWFsb2dcblx0XHRcdFx0bVBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyA9IG9BcHBDb21wb25lbnQuZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuQXV0b0NyZWF0ZTtcblxuXHRcdFx0XHRvQ3JlYXRpb24gPSB0cmFuc2FjdGlvbkhlbHBlci5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdFx0ZmFsc2Vcblx0XHRcdFx0KTtcblx0XHRcdFx0Ly8gU2lkZUVmZmVjdHMgb24gQ3JlYXRlXG5cdFx0XHRcdC8vIGlmIFNhdmUgaXMgcHJlc3NlZCBkaXJlY3RseSBhZnRlciBmaWxsaW5nIHRoZSBDcmVhdGlvblJvdywgbm8gU2lkZUVmZmVjdHMgcmVxdWVzdFxuXHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmJTa2lwU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0XHRoYW5kbGVTaWRlRWZmZWN0cyhvTGlzdEJpbmRpbmcsIG9DcmVhdGlvbik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0bGV0IG9OYXZpZ2F0aW9uO1xuXHRcdFx0c3dpdGNoIChyZXNvbHZlZENyZWF0aW9uTW9kZSkge1xuXHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5EZWZlcnJlZDpcblx0XHRcdFx0XHRvTmF2aWdhdGlvbiA9IG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KG9MaXN0QmluZGluZywge1xuXHRcdFx0XHRcdFx0YkRlZmVycmVkQ29udGV4dDogdHJ1ZSxcblx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuQXN5bmM6XG5cdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvTGlzdEJpbmRpbmcsIHtcblx0XHRcdFx0XHRcdGFzeW5jQ29udGV4dDogb0NyZWF0aW9uLFxuXHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRiRm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5TeW5jOlxuXHRcdFx0XHRcdG1BcmdzID0ge1xuXHRcdFx0XHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRiRm9yY2VGb2N1czogdHJ1ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IG1QYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbikge1xuXHRcdFx0XHRcdFx0bUFyZ3MudHJhbnNpZW50ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvQ3JlYXRpb24/LnRoZW4oZnVuY3Rpb24gKG9OZXdEb2N1bWVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKCFvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNvcmVSZXNvdXJjZUJ1bmRsZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9NZXNzYWdlUGFnZShcblx0XHRcdFx0XHRcdFx0XHRjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0RBVEFfUkVDRUlWRURfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogY29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0VESVRGTE9XX1NBUEZFX0NSRUFUSU9OX0ZBSUxFRF9ERVNDUklQVElPTlwiKVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIEluIGNhc2UgdGhlIFN5bmMgY3JlYXRpb24gd2FzIHRyaWdnZXJlZCBmb3IgYSBkZWZlcnJlZCBjcmVhdGlvbiwgd2UgZG9uJ3QgbmF2aWdhdGUgZm9yd2FyZFxuXHRcdFx0XHRcdFx0XHQvLyBhcyB3ZSdyZSBhbHJlYWR5IG9uIHRoZSBjb3JyZXNwb25kaW5nIE9iamVjdFBhZ2Vcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG1QYXJhbWV0ZXJzLmJGcm9tRGVmZXJyZWRcblx0XHRcdFx0XHRcdFx0XHQ/IG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVUb0NvbnRleHQob05ld0RvY3VtZW50Q29udGV4dCwgbUFyZ3MpXG5cdFx0XHRcdFx0XHRcdFx0OiBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvTmV3RG9jdW1lbnRDb250ZXh0LCBtQXJncyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLklubGluZTpcblx0XHRcdFx0XHR0aGlzLnN5bmNUYXNrKG9DcmVhdGlvbik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93OlxuXHRcdFx0XHRcdC8vIHRoZSBjcmVhdGlvbiByb3cgc2hhbGwgYmUgY2xlYXJlZCBvbmNlIHRoZSB2YWxpZGF0aW9uIGNoZWNrIHdhcyBzdWNjZXNzZnVsIGFuZFxuXHRcdFx0XHRcdC8vIHRoZXJlZm9yZSB0aGUgUE9TVCBjYW4gYmUgc2VudCBhc3luYyB0byB0aGUgYmFja2VuZFxuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvQ3JlYXRpb25Sb3dMaXN0QmluZGluZyA9IG9DcmVhdGlvblJvd0NvbnRleHQuZ2V0QmluZGluZygpO1xuXG5cdFx0XHRcdFx0XHRjb25zdCBvTmV3VHJhbnNpZW50Q29udGV4dCA9IG9DcmVhdGlvblJvd0xpc3RCaW5kaW5nLmNyZWF0ZSgpO1xuXHRcdFx0XHRcdFx0b0NyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG9OZXdUcmFuc2llbnRDb250ZXh0KTtcblxuXHRcdFx0XHRcdFx0Ly8gdGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgY29uc29sZSBlcnJvcnMgVE8gYmUgY2hlY2tlZCB3aXRoIG1vZGVsIGNvbGxlYWd1ZXNcblx0XHRcdFx0XHRcdG9OZXdUcmFuc2llbnRDb250ZXh0LmNyZWF0ZWQoKS5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBmYXN0IGNyZWF0aW9uIGNvbnRleHQgZGVsZXRlZFwiKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvQ3JlYXRpb25Sb3dDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdC8vIFJlc2V0IGJ1c3kgaW5kaWNhdG9yIGFmdGVyIGEgdmFsaWRhdGlvbiBlcnJvclxuXHRcdFx0XHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSkpIHtcblx0XHRcdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJDcmVhdGlvblJvdyBuYXZpZ2F0aW9uIGVycm9yOiBcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0b05hdmlnYXRpb24gPSBQcm9taXNlLnJlamVjdChgVW5oYW5kbGVkIGNyZWF0aW9uTW9kZSAke3Jlc29sdmVkQ3JlYXRpb25Nb2RlfWApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0NyZWF0aW9uKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3QgYVBhcmFtcyA9IGF3YWl0IFByb21pc2UuYWxsKFtvQ3JlYXRpb24sIG9OYXZpZ2F0aW9uXSk7XG5cdFx0XHRcdFx0dGhpcy5fc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCwgb01vZGVsKTtcblxuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUpOyAvLyBUaGUgY3JlYXRlTW9kZSBmbGFnIHdpbGwgYmUgc2V0IGluIGNvbXB1dGVFZGl0TW9kZVxuXHRcdFx0XHRcdGlmICghb0xpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSAmJiBzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRcdC8vIFdvcmthcm91bmQgdG8gdGVsbCB0aGUgT1AgdGhhdCB3ZSd2ZSBjcmVhdGVkIGEgbmV3IG9iamVjdCBmcm9tIHRoZSBMUlxuXHRcdFx0XHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gb0xpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5iaW5kQ29udGV4dChtZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0xpc3RCaW5kaW5nLmdldFBhdGgoKSkpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQ7XG5cdFx0XHRcdFx0XHRjb25zdCBuZXdBY3Rpb24gPSBlbnRpdHlTZXQ/LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ/Lk5ld0FjdGlvbjtcblx0XHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLnNldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIsIG5ld0FjdGlvbik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IG9OZXdEb2N1bWVudENvbnRleHQgPSBhUGFyYW1zWzBdO1xuXHRcdFx0XHRcdGlmIChvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZShvTGlzdEJpbmRpbmcpO1xuXHRcdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0aWYgKE1vZGVsSGVscGVyLmlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkKG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSkgJiYgIUFjdGl2aXR5U3luYy5pc0Nvbm5lY3RlZCh0aGlzLmdldFZpZXcoKSkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gYWNjb3JkaW5nIHRvIFVYIGluIGNhc2Ugb2YgZW5hYmxlZCBjb2xsYWJvcmF0aW9uIGRyYWZ0IHdlIHNoYXJlIHRoZSBvYmplY3QgaW1tZWRpYXRlbHlcblx0XHRcdFx0XHRcdFx0YXdhaXQgc2hhcmVPYmplY3Qob05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSwgdGhlIG9ubHkgZXJyb3JzIGhhbmRsZWQgaGVyZSBhcmUgcmFpc2VkIGFzIHN0cmluZyAtIHNob3VsZCBiZSBjaGFuZ2VkIHRvIEVycm9yIG9iamVjdHNcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRlcnJvciA9PT0gQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZyB8fFxuXHRcdFx0XHRcdFx0ZXJyb3IgPT09IENvbnN0YW50cy5BY3Rpb25FeGVjdXRpb25GYWlsZWQgfHxcblx0XHRcdFx0XHRcdGVycm9yID09PSBDb25zdGFudHMuQ3JlYXRpb25GYWlsZWRcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdC8vIGNyZWF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCBieSB1c2VyIG9yIGZhaWxlZCBpbiBiYWNrZW5kID0+IGluIGNhc2Ugd2UgaGF2ZSBuYXZpZ2F0ZWQgdG8gdHJhbnNpZW50IGNvbnRleHQgYmVmb3JlLCBuYXZpZ2F0ZSBiYWNrXG5cdFx0XHRcdFx0XHQvLyB0aGUgc3dpdGNoLXN0YXRlbWVudCBhYm92ZSBzZWVtcyB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaGFwcGVucyBpbiBjcmVhdGlvbk1vZGVzIGRlZmVycmVkIGFuZCBhc3luYy4gQnV0IGluIGZhY3QsIGluIHRoZXNlIGNhc2VzIGFmdGVyIHRoZSBuYXZpZ2F0aW9uIGZyb20gcm91dGVNYXRjaGVkIGluIE9QIGNvbXBvbmVudFxuXHRcdFx0XHRcdFx0Ly8gY3JlYXRlRGVmZXJyZWRDb250ZXh0IGlzIHRyaWdnZXJkLCB3aGljaCBjYWxscyB0aGlzIG1ldGhvZCAoY3JlYXRlRG9jdW1lbnQpIGFnYWluIC0gdGhpcyB0aW1lIHdpdGggY3JlYXRpb25Nb2RlIHN5bmMuIFRoZXJlZm9yZSwgYWxzbyBpbiB0aGF0IG1vZGUgd2UgbmVlZCB0byB0cmlnZ2VyIGJhY2sgbmF2aWdhdGlvbi5cblx0XHRcdFx0XHRcdC8vIFRoZSBvdGhlciBjYXNlcyBtaWdodCBzdGlsbCBiZSBuZWVkZWQgaW4gY2FzZSB0aGUgbmF2aWdhdGlvbiBmYWlscy5cblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZWRDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5TeW5jIHx8XG5cdFx0XHRcdFx0XHRcdHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuRGVmZXJyZWQgfHxcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZWRDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5Bc3luY1xuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdG9Sb3V0aW5nTGlzdGVuZXIubmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChiU2hvdWxkQnVzeUxvY2spIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIHJlc3VsdCBvZiB0aGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICovXG5cblx0dmFsaWRhdGVEb2N1bWVudChjb250ZXh0OiBDb250ZXh0LCBwYXJhbWV0ZXJzOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuXHRcdHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkudmFsaWRhdGVEb2N1bWVudChjb250ZXh0LCBwYXJhbWV0ZXJzLCB0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBzZXZlcmFsIGRvY3VtZW50cy5cblx0ICpcblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0QmluZGluZyB1c2VkIHRvIGNyZWF0ZSB0aGUgZG9jdW1lbnRzXG5cdCAqIEBwYXJhbSBkYXRhRm9yQ3JlYXRlIFRoZSBpbml0aWFsIGRhdGEgZm9yIHRoZSBuZXcgZG9jdW1lbnRzXG5cdCAqIEBwYXJhbSBjcmVhdGVBdEVuZCBUcnVlIGlmIHRoZSBuZXcgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gaXNGcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcGFyYW0gYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIGNyZWF0ZUFzSW5hY3RpdmUgVHJ1ZSBpZiB0aGUgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGFzIGluYWN0aXZlXG5cdCAqIEBwYXJhbSByZXF1ZXN0U2lkZUVmZmVjdHMgVHJ1ZSBieSBkZWZhdWx0LCBmYWxzZSBpZiBTaWRlRWZmZWN0cyBzaG91bGQgbm90IGJlIHJlcXVlc3RlZFxuXHQgKiBAcmV0dXJucyBBIFByb21pc2Ugd2l0aCB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0cy5cblx0ICovXG5cdGFzeW5jIGNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzKFxuXHRcdGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdGRhdGFGb3JDcmVhdGU6IGFueVtdLFxuXHRcdGNyZWF0ZUF0RW5kOiBib29sZWFuLFxuXHRcdGlzRnJvbUNvcHlQYXN0ZTogYm9vbGVhbixcblx0XHRiZWZvcmVDcmVhdGVDYWxsQmFjaz86IEZ1bmN0aW9uLFxuXHRcdGNyZWF0ZUFzSW5hY3RpdmUgPSBmYWxzZSxcblx0XHRyZXF1ZXN0U2lkZUVmZmVjdHM/OiBib29sZWFuXG5cdCkge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCB0YXJnZXRMaXN0QmluZGluZyA9IGxpc3RCaW5kaW5nO1xuXG5cdFx0cmVxdWVzdFNpZGVFZmZlY3RzID0gcmVxdWVzdFNpZGVFZmZlY3RzICE9PSBmYWxzZTtcblxuXHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRpZiAoYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0YXdhaXQgYmVmb3JlQ3JlYXRlQ2FsbEJhY2soeyBjb250ZXh0UGF0aDogdGFyZ2V0TGlzdEJpbmRpbmcuZ2V0UGF0aCgpIH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSB0YXJnZXRMaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0bGV0IG1ldGFQYXRoOiBzdHJpbmc7XG5cblx0XHRcdGlmICh0YXJnZXRMaXN0QmluZGluZy5nZXRDb250ZXh0KCkpIHtcblx0XHRcdFx0bWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgoYCR7dGFyZ2V0TGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLmdldFBhdGgoKX0vJHt0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCl9YCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aCh0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCkpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmhhbmRsZUNyZWF0ZUV2ZW50cyh0YXJnZXRMaXN0QmluZGluZyk7XG5cblx0XHRcdC8vIEl0ZXJhdGUgb24gYWxsIGl0ZW1zIGFuZCBzdG9yZSB0aGUgY29ycmVzcG9uZGluZyBjcmVhdGlvbiBwcm9taXNlXG5cdFx0XHRjb25zdCBjcmVhdGlvblByb21pc2VzID0gZGF0YUZvckNyZWF0ZS5tYXAoKHByb3BlcnR5VmFsdWVzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGNyZWF0ZVBhcmFtZXRlcnM6IGFueSA9IHsgZGF0YToge30gfTtcblxuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQgPSBmYWxzZTsgLy8gY3VycmVudGx5IG5vdCBmdWxseSBzdXBwb3J0ZWRcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5idXN5TW9kZSA9IFwiTm9uZVwiO1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdztcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgPSBjcmVhdGVBdEVuZDtcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5pbmFjdGl2ZSA9IGNyZWF0ZUFzSW5hY3RpdmU7XG5cblx0XHRcdFx0Ly8gUmVtb3ZlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcyB3ZSBkb24ndCBzdXBwb3J0IGRlZXAgY3JlYXRlXG5cdFx0XHRcdGZvciAoY29uc3QgcHJvcGVydHlQYXRoIGluIHByb3BlcnR5VmFsdWVzKSB7XG5cdFx0XHRcdFx0Y29uc3QgcHJvcGVydHkgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KGAke21ldGFQYXRofS8ke3Byb3BlcnR5UGF0aH1gKTtcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eSAmJlxuXHRcdFx0XHRcdFx0cHJvcGVydHkuJGtpbmQgIT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIgJiZcblx0XHRcdFx0XHRcdHByb3BlcnR5UGF0aC5pbmRleE9mKFwiL1wiKSA8IDAgJiZcblx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5UGF0aF1cblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuZGF0YVtwcm9wZXJ0eVBhdGhdID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdHJhbnNhY3Rpb25IZWxwZXIuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdFx0dGFyZ2V0TGlzdEJpbmRpbmcsXG5cdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycyxcblx0XHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0XHRpc0Zyb21Db3B5UGFzdGVcblx0XHRcdFx0KTtcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCBjcmVhdGVkQ29udGV4dHMgPSBhd2FpdCBQcm9taXNlLmFsbChjcmVhdGlvblByb21pc2VzKTtcblx0XHRcdGlmICghY3JlYXRlQXNJbmFjdGl2ZSkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZSh0YXJnZXRMaXN0QmluZGluZyk7XG5cdFx0XHR9XG5cdFx0XHQvLyB0cmFuc2llbnQgY29udGV4dHMgYXJlIHJlbGlhYmx5IHJlbW92ZWQgb25jZSBvTmV3Q29udGV4dC5jcmVhdGVkKCkgaXMgcmVzb2x2ZWRcblx0XHRcdGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0XHRjcmVhdGVkQ29udGV4dHMubWFwKChuZXdDb250ZXh0OiBhbnkpID0+IHtcblx0XHRcdFx0XHRpZiAoIW5ld0NvbnRleHQuYkluYWN0aXZlKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbmV3Q29udGV4dC5jcmVhdGVkKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3Qgdmlld0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblxuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0Ly8gaWYgbGlzdCBiaW5kaW5nIGlzIHJlZnJlc2hlZCwgdHJhbnNpZW50IGNvbnRleHRzIG1pZ2h0IGJlIGxvc3Rcblx0XHRcdGlmIChyZXF1ZXN0U2lkZUVmZmVjdHMgJiYgIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQodGFyZ2V0TGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KHRhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKSwgdmlld0JpbmRpbmdDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gY3JlYXRlZENvbnRleHRzO1xuXHRcdH0gY2F0Y2ggKGVycjogYW55KSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyBtdWx0aXBsZSBkb2N1bWVudHMuXCIpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdTYXZlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnU2F2ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlU2F2ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgc2F2ZWQuXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyB0cmlnZ2VyZWQuIElmIHJlamVjdGVkLCB0aGUgJ1NhdmUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjb25CZWZvcmVTYXZlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkJlZm9yZVNhdmUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0PzogQ29udGV4dCB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGludGVyY2VwdCB0aGUgJ0NyZWF0ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0NyZWF0ZScgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHN0b3BwZWQuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlQ3JlYXRlXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMuY29udGV4dFBhdGggUGF0aCBwb2ludGluZyB0byB0aGUgY29udGV4dCBvbiB3aGljaCBDcmVhdGUgYWN0aW9uIGlzIHRyaWdnZXJlZFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNyZWF0ZVBhcmFtZXRlcnMgQXJyYXkgb2YgdmFsdWVzIHRoYXQgYXJlIGZpbGxlZCBpbiB0aGUgQWN0aW9uIFBhcmFtZXRlciBEaWFsb2dcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlQ3JlYXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkJlZm9yZUNyZWF0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRQYXRoPzogc3RyaW5nOyBjcmVhdGVQYXJhbWV0ZXJzPzogYW55W10gfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdFZGl0JyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRWRpdCcgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0VkaXQnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBkaXNwbGF5IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRWRpdFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZWRpdGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdFZGl0JyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRWRpdFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVFZGl0KF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdEaXNjYXJkJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRGlzY2FyZCcgYWN0aW9uLlxuXHQgKiBJZiB5b3UgcmVqZWN0IHRoZSBwcm9taXNlLCB0aGUgJ0Rpc2NhcmQnIGFjdGlvbiBpcyBzdG9wcGVkIGFuZCB0aGUgdXNlciBzdGF5cyBpbiBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgaW5kaXZpZHVhbGx5IG92ZXJyaWRkZW4gYnkgY29uc3VtaW5nIGNvbnRyb2xsZXJzLCBidXQgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS5cblx0ICogVGhlIG92ZXJyaWRlIGV4ZWN1dGlvbiBpczoge0BsaW5rIHNhcC51aS5jb3JlLm12Yy5PdmVycmlkZUV4ZWN1dGlvbi5BZnRlcn0uXG5cdCAqXG5cdCAqIEBwYXJhbSBfbVBhcmFtZXRlcnMgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIG9uQmVmb3JlRGlzY2FyZFxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHQgUGFnZSBjb250ZXh0IHRoYXQgaXMgZ29pbmcgdG8gYmUgZGlzY2FyZGVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRGlzY2FyZFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVEaXNjYXJkKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdEZWxldGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdEZWxldGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURlbGV0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRzIEFuIGFycmF5IG9mIGNvbnRleHRzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGRlbGV0ZWRcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdEZWxldGUnIGFjdGlvbiBpcyBub3QgdHJpZ2dlcmVkLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlRGVsZXRlXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTguMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvbkJlZm9yZURlbGV0ZShfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgSW5kaWNhdGVzIHdoZXRoZXIgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBpZ25vcmVkIHdoZW4gdXNlciBjbGlja3Mgb24gU2F2ZSBkdXJpbmcgYW4gSW5saW5lIGNyZWF0aW9uXG5cdC8vIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycy5iaW5kaW5ncyBMaXN0IGJpbmRpbmdzIG9mIHRoZSB0YWJsZXMgaW4gdGhlIHZpZXcuXG5cdC8vIEJvdGggb2YgdGhlIGFib3ZlIHBhcmFtZXRlcnMgYXJlIGZvciB0aGUgc2FtZSBwdXJwb3NlLiBVc2VyIGNhbiBlbnRlciBzb21lIGluZm9ybWF0aW9uIGluIHRoZSBjcmVhdGlvbiByb3cocykgYnV0IGRvZXMgbm90ICdBZGQgcm93JywgaW5zdGVhZCBjbGlja3MgU2F2ZS5cblx0Ly8gVGhlcmUgY2FuIGJlIG1vcmUgdGhhbiBvbmUgaW4gdGhlIHZpZXcuXG5cblx0LyoqXG5cdCAqIFNhdmVzIGEgbmV3IGRvY3VtZW50IGFmdGVyIGNoZWNraW5nIGl0LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBlZGl0YWJsZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2Ugc2F2ZSBpcyBjb21wbGV0ZVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjc2F2ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIHNhdmVEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCwgbVBhcmFtZXRlcnM6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cdFx0Y29uc3QgYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgPSBtUGFyYW1ldGVycy5iRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciB8fCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgYkRyYWZ0TmF2aWdhdGlvbiA9IHRydWU7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3QgYUJpbmRpbmdzID0gbVBhcmFtZXRlcnMuYmluZGluZ3M7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVTYXZlKHsgY29udGV4dDogb0NvbnRleHQgfSk7XG5cblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnk7XG5cdFx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChcblx0XHRcdFx0KHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiZcblx0XHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gdHJ5IHRvIGdldCByaWdodG1vc3QgY29udGV4dCBpbiBjYXNlIG9mIGEgbmV3IG9iamVjdFxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBhY3RpdmVEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5zYXZlRG9jdW1lbnQoXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yLFxuXHRcdFx0XHRhQmluZGluZ3MsXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0dGhpcy5nZXRDcmVhdGlvbk1vZGUoKVxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQWN0aXZhdGUsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRBY3Rpdml0eVN5bmMuZGlzY29ubmVjdCh0aGlzLmdldFZpZXcoKSk7XG5cblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KFN0YW5kYXJkQWN0aW9ucy5zYXZlLCBUcmlnZ2VyVHlwZS5zdGFuZGFyZEFjdGlvbik7XG5cblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXG5cdFx0XHRpZiAoYWN0aXZlRG9jdW1lbnRDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGUgPSBhY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgYWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9PSBhY3RpdmVEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgZmFsc2UsIGZhbHNlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0aWYgKCEob0Vycm9yICYmIG9FcnJvci5jYW5jZWxlZCkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2F2aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTd2l0Y2hlcyB0aGUgVUkgYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdG8gc3dpdGNoIGZyb21cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBzd2l0Y2ggaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgdG9nZ2xlRHJhZnRBY3RpdmUob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRsZXQgYkVkaXRhYmxlOiBib29sZWFuO1xuXHRcdGNvbnN0IGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdC8vdG9nZ2xlIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBkb2N1bWVudCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZWRpdCBkcmFmdHMgYW5kIGFjdGl2ZSBkb2N1bWVudHMgd2l0aCBkcmFmdClcblx0XHRpZiAoXG5cdFx0XHQhYklzRHJhZnQgfHxcblx0XHRcdCEoXG5cdFx0XHRcdCghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHx8XG5cdFx0XHRcdChvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0RyYWZ0RW50aXR5KVxuXHRcdFx0KVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdC8vc3RhcnQgUG9pbnQ6IGVkaXQgZHJhZnRcblx0XHRcdGJFZGl0YWJsZSA9IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBzdGFydCBwb2ludCBhY3RpdmUgZG9jdW1lbnRcblx0XHRcdGJFZGl0YWJsZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnk7XG5cdFx0XHRjb25zdCBvUmlnaHRtb3N0Q29udGV4dCA9IG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkgPyBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IG9Db250ZXh0O1xuXHRcdFx0bGV0IHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb1JpZ2h0bW9zdENvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdGlmICghc2libGluZ0luZm8gJiYgb0NvbnRleHQgIT09IG9SaWdodG1vc3RDb250ZXh0KSB7XG5cdFx0XHRcdC8vIFRyeSB0byBjb21wdXRlIHNpYmxpbmcgaW5mbyBmb3IgdGhlIHJvb3QgY29udGV4dCBpZiBpdCBmYWlscyBmb3IgdGhlIHJpZ2h0bW9zdCBjb250ZXh0XG5cdFx0XHRcdC8vIC0tPiBJbiBjYXNlIG9mIEZDTCwgaWYgd2UgdHJ5IHRvIHN3aXRjaCBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgYnV0IGEgY2hpbGQgZW50aXR5IGhhcyBubyBzaWJsaW5nLCB0aGUgc3dpdGNoIHdpbGwgY2xvc2UgdGhlIGNoaWxkIGNvbHVtblxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIG9Db250ZXh0LCBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc2libGluZ0luZm8pIHtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShiRWRpdGFibGUgPyBFZGl0TW9kZS5FZGl0YWJsZSA6IEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTsgLy9zd2l0Y2ggdG8gZWRpdCBtb2RlIG9ubHkgaWYgYSBkcmFmdCBpcyBhdmFpbGFibGVcblxuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRpZiAobGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gb0NvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0YXJnZXRQYXRoID0gc2libGluZ0luZm8ucGF0aE1hcHBpbmdbc2libGluZ0luZm8ucGF0aE1hcHBpbmcubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLnB1c2goeyBvbGRQYXRoOiBsYXN0U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCwgbmV3UGF0aDogdGFyZ2V0UGF0aCB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LCBiRWRpdGFibGUsIHRydWUsIHRydWUsIHRydWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmUgLSBDYW5ub3QgZmluZCBzaWJsaW5nXCIpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZToke29FcnJvcn1gKTtcblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzYXAubS5CdXR0b259IG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiAtIEN1cnJlbnRseSB0aGlzIGlzIHBhc3NlZCBhcyBjYW5jZWxCdXR0b24gaW50ZXJuYWxseSAocmVwbGFjZWQgYnkgbVBhcmFtZXRlcnMuY29udHJvbCBpbiB0aGUgSlNEb2MgYmVsb3cpLiBDdXJyZW50bHkgaXQgaXMgYWxzbyBtYW5kYXRvcnkuXG5cdC8vIFBsYW4gLSBUaGlzIHNob3VsZCBub3QgYmUgbWFuZGF0b3J5LiBJZiBub3QgcHJvdmlkZWQsIHdlIHNob3VsZCBoYXZlIGEgZGVmYXVsdCB0aGF0IGNhbiBhY3QgYXMgcmVmZXJlbmNlIGNvbnRyb2wgZm9yIHRoZSBkaXNjYXJkIHBvcG92ZXIgT1Igd2UgY2FuIHNob3cgYSBkaWFsb2cgaW5zdGVhZCBvZiBhIHBvcG92ZXIuXG5cblx0LyoqXG5cdCAqIERpc2NhcmQgdGhlIGVkaXRhYmxlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBlZGl0YWJsZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udHJvbCBUaGlzIGlzIHRoZSBjb250cm9sIHVzZWQgdG8gb3BlbiB0aGUgZGlzY2FyZCBwb3BvdmVyXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGFuZCBhbGxvd3MgY3VzdG9tIGhhbmRsaW5nXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBlZGl0YWJsZSBkb2N1bWVudCBoYXMgYmVlbiBkaXNjYXJkZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2NhbmNlbERvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNhbmNlbERvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtUGFyYW1ldGVyczogeyBjb250cm9sPzogb2JqZWN0OyBza2lwRGlzY2FyZFBvcG92ZXI/OiBib29sZWFuIH0pOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG1JblBhcmFtZXRlcnM6IGFueSA9IG1QYXJhbWV0ZXJzO1xuXHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdGxldCBpc05ld0RvY3VtZW50ID0gZmFsc2U7XG5cdFx0bUluUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gPSBtUGFyYW1ldGVycy5jb250cm9sIHx8IG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uO1xuXHRcdG1JblBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEaXNjYXJkO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRcdGlmICgoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpKSAmJiB0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gdHJ5IHRvIGdldCByaWdodG1vc3QgY29udGV4dCBpbiBjYXNlIG9mIGEgbmV3IG9iamVjdFxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRjb25zdCBjYW5jZWxSZXN1bHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jYW5jZWxEb2N1bWVudChcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdG1JblBhcmFtZXRlcnMsXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHR0aGlzLmdldENyZWF0aW9uTW9kZSgpLFxuXHRcdFx0XHR0aGlzLmlzRG9jdW1lbnRNb2RpZmllZCgpXG5cdFx0XHQpO1xuICAgICAgICAgICAgICAgICAgXHR0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKVxuXHRcdFx0XHQuZ2V0SW5zdGFuY2VkVmlld3MoKVxuXHRcdFx0XHQuZm9yRWFjaCgodmlldykgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHQgPSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgT0RhdGFWNENvbnRleHQ7XG5cdFx0XHRcdFx0aWYgKGNvbnRleHQgJiYgY29udGV4dC5pc0tlZXBBbGl2ZSgpKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0LnNldEtlZXBBbGl2ZShmYWxzZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdGNvbnN0IGJEcmFmdE5hdmlnYXRpb24gPSB0cnVlO1xuXHRcdFx0dGhpcy5fcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhzUHJvZ3JhbW1pbmdNb2RlbCk7XG5cblx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0Ly8gd2UgZm9yY2UgdGhlIGVkaXQgc3RhdGUgZXZlbiBmb3IgRkNMIGJlY2F1c2UgdGhlIGRyYWZ0IGRpc2NhcmQgbWlnaHQgbm90IGJlIGltcGxlbWVudGVkXG5cdFx0XHQvLyBhbmQgd2UgbWF5IGp1c3QgZGVsZXRlIHRoZSBkcmFmdFxuXHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRpZiAoIWNhbmNlbFJlc3VsdCkge1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGlzY2FyZCwgdW5kZWZpbmVkKTtcblx0XHRcdFx0QWN0aXZpdHlTeW5jLmRpc2Nvbm5lY3QodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0XHQvL2luIGNhc2Ugb2YgYSBuZXcgZG9jdW1lbnQsIG5vIGFjdGl2ZUNvbnRleHQgaXMgcmV0dXJuZWQgLS0+IG5hdmlnYXRlIGJhY2suXG5cdFx0XHRcdGlmICghbUluUGFyYW1ldGVycy5za2lwQmFja05hdmlnYXRpb24pIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdFx0XHRpc05ld0RvY3VtZW50ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb0FjdGl2ZURvY3VtZW50Q29udGV4dCA9IGNhbmNlbFJlc3VsdCBhcyBDb250ZXh0O1xuXHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGlzY2FyZCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdEFjdGl2aXR5U3luYy5kaXNjb25uZWN0KHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgb0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gb0FjdGl2ZURvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIGxvYWQgdGhlIHNlbWFudGljIGtleXMgb2YgdGhlIGFjdGl2ZSBjb250ZXh0LCBhcyB3ZSBuZWVkIHRoZW1cblx0XHRcdFx0XHQvLyBmb3IgdGhlIG5hdmlnYXRpb25cblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdC8vIFdlIGZvcmNlIHRoZSByZWNyZWF0aW9uIG9mIHRoZSBjb250ZXh0LCBzbyB0aGF0IGl0J3MgY3JlYXRlZCBhbmQgYm91bmQgaW4gdGhlIHNhbWUgbWljcm90YXNrLFxuXHRcdFx0XHRcdC8vIHNvIHRoYXQgYWxsIHByb3BlcnRpZXMgYXJlIGxvYWRlZCB0b2dldGhlciBieSBhdXRvRXhwYW5kU2VsZWN0LCBzbyB0aGF0IHdoZW4gc3dpdGNoaW5nIGJhY2sgdG8gRWRpdCBtb2RlXG5cdFx0XHRcdFx0Ly8gJCRpbmhlcml0RXhwYW5kU2VsZWN0IHRha2VzIGFsbCBsb2FkZWQgcHJvcGVydGllcyBpbnRvIGFjY291bnQgKEJDUCAyMDcwNDYyMjY1KVxuXHRcdFx0XHRcdGlmICghbUluUGFyYW1ldGVycy5za2lwQmluZGluZ1RvVmlldykge1xuXHRcdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgZmFsc2UsIHRydWUsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly9hY3RpdmUgY29udGV4dCBpcyByZXR1cm5lZCBpbiBjYXNlIG9mIGNhbmNlbCBvZiBleGlzdGluZyBkb2N1bWVudFxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCBmYWxzZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHQvL3Nob3cgRHJhZnQgZGlzY2FyZGVkIG1lc3NhZ2UgdG9hc3Qgb25seSBmb3IgZHJhZnQgZW5hYmxlZCBhcHBzXG5cdFx0XHRcdHRoaXMuc2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UoaXNOZXdEb2N1bWVudCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkaXNjYXJkaW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQnJpbmdzIHVwIGEgbWVzc2FnZSB0b2FzdCB3aGVuIGEgZHJhZnQgaXMgZGlzY2FyZGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gaXNOZXdEb2N1bWVudCBUaGlzIGlzIGEgQm9vbGVhbiBmbGFnIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyBuZXcgb3IgYWxyZWFkeSBleGlzdHMuXG5cdCAqL1xuXHRzaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZShpc05ld0RvY3VtZW50PzogYm9vbGVhbikge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSB0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0Y29uc3QgbWVzc2FnZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RJU0NBUkRfRFJBRlRfVE9BU1RcIik7XG5cdFx0aWYgKGlzTmV3RG9jdW1lbnQgPT0gdHJ1ZSkge1xuXHRcdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmF0dGFjaEFmdGVyUm91dGVNYXRjaGVkKHRoaXMuc2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0LCB0aGlzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0TWVzc2FnZVRvYXN0LnNob3cobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFdlIHVzZSB0aGlzIGZ1bmN0aW9uIGluIHNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlIHdoZW4gbm8gY29udGV4dCBpcyBwYXNzZWQuXG5cdCAqL1xuXHRzaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQoKSB7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IHRoaXMuX2dldFJlc291cmNlTW9kZWwoKTtcblx0XHRjb25zdCBtZXNzYWdlID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRElTQ0FSRF9EUkFGVF9UT0FTVFwiKTtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdE1lc3NhZ2VUb2FzdC5zaG93KG1lc3NhZ2UpO1xuXHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmRldGFjaEFmdGVyUm91dGVNYXRjaGVkKHRoaXMuc2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0LCB0aGlzKTtcblx0fVxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGEgY29udGV4dCBjb3JyZXNwb25kcyB0byBhIGRyYWZ0IHJvb3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIGNoZWNrXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNvbnRleHQgcG9pbnRzIHRvIGEgZHJhZnQgcm9vdFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cHJvdGVjdGVkIGlzRHJhZnRSb290KGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBtZXRhTW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdHJldHVybiBNb2RlbEhlbHBlci5pc0RyYWZ0Um9vdChnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnRhcmdldEVudGl0eVNldCk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUgTmFtZSBvZiB0aGUgRW50aXR5U2V0IHRvIHdoaWNoIHRoZSBvYmplY3QgYmVsb25nc1xuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHRoZSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy50aXRsZSBUaXRsZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBkb2N1bWVudCBoYXMgYmVlbiBkZWxldGVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNkZWxldGVEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBkZWxldGVEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCwgbUluUGFyYW1ldGVyczogeyB0aXRsZTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRsZXQgbVBhcmFtZXRlcnM6IGFueSA9IG1JblBhcmFtZXRlcnM7XG5cdFx0aWYgKCFtUGFyYW1ldGVycykge1xuXHRcdFx0bVBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdGJGaW5kQWN0aXZlQ29udGV4dHM6IGZhbHNlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzID0gZmFsc2U7XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHRoaXMuX2lzRmNsRW5hYmxlZCgpICYmXG5cdFx0XHRcdHRoaXMuaXNEcmFmdFJvb3Qob0NvbnRleHQpICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldEluZGV4KCkgPT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpID09PSB0cnVlICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzRHJhZnRFbnRpdHlcIikgPT09IHRydWVcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBEZWxldGluZyBhbiBhY3RpdmUgZW50aXR5IHdoaWNoIGhhcyBhIGRyYWZ0IHRoYXQgY291bGQgcG90ZW50aWFsbHkgYmUgZGlzcGxheWVkIGluIHRoZSBMaXN0UmVwb3J0IChGQ0wgY2FzZSlcblx0XHRcdFx0Ly8gLS0+IG5lZWQgdG8gcmVtb3ZlIHRoZSBkcmFmdCBmcm9tIHRoZSBMUiBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBhY3RpdmUgdmVyc2lvbiwgc28gdGhhdCB0aGUgTGlzdEJpbmRpbmcgaXMgcHJvcGVybHkgcmVmcmVzaGVkXG5cdFx0XHRcdC8vIFRoZSBjb25kaXRpb24gJ29Db250ZXh0LmdldEluZGV4KCkgPT09IHVuZGVmaW5lZCcgbWFrZXMgc3VyZSB0aGUgYWN0aXZlIHZlcnNpb24gaXNuJ3QgYWxyZWFkeSBkaXNwbGF5ZWQgaW4gdGhlIExSXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gYXN5bmMgKHBhcmFtZXRlcnM/OiB7IGNvbnRleHRzPzogQ29udGV4dFtdIH0pID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGUocGFyYW1ldGVycyk7XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3QgbW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2libGluZ0NvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L1NpYmxpbmdFbnRpdHlgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdGNvbnN0IGRyYWZ0UGF0aCA9IGF3YWl0IHNpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkcmFmdENvbnRleHRUb1JlbW92ZSA9IG1vZGVsLmdldEtlZXBBbGl2ZUNvbnRleHQoZHJhZnRQYXRoKTtcblx0XHRcdFx0XHRcdGRyYWZ0Q29udGV4dFRvUmVtb3ZlLnJlcGxhY2VXaXRoKG9Db250ZXh0KTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgcmVwbGFjaW5nIHRoZSBkcmFmdCBpbnN0YW5jZSBpbiB0aGUgTFIgT0RMQlwiLCBlcnJvciBhcyBhbnkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cblx0XHRcdC8vIFNpbmdsZSBvYmpldCBkZWxldGlvbiBpcyB0cmlnZ2VyZWQgZnJvbSBhbiBPUCBoZWFkZXIgYnV0dG9uIChub3QgZnJvbSBhIGxpc3QpXG5cdFx0XHQvLyAtLT4gTWFyayBVSSBkaXJ0eSBhbmQgbmF2aWdhdGUgYmFjayB0byBkaXNtaXNzIHRoZSBPUFxuXHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EZWxldGUsIG9Db250ZXh0KTtcblxuXHRcdFx0Ly8gQWZ0ZXIgZGVsZXRlIGlzIHN1Y2Nlc3NmdWxsLCB3ZSBuZWVkIHRvIGRldGFjaCB0aGUgc2V0QmFja05hdmlnYXRpb24gTWV0aG9kc1xuXHRcdFx0aWYgKG9BcHBDb21wb25lbnQpIHtcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24oKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9BcHBDb21wb25lbnQ/LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkRlZXBsaW5rICYmICF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBhcHAgaGFzIGJlZW4gbGF1bmNoZWQgd2l0aCBzZW1hbnRpYyBrZXlzLCBkZWxldGluZyB0aGUgb2JqZWN0IHdlJ3ZlIGxhbmRlZCBvbiBzaGFsbCBuYXZpZ2F0ZSBiYWNrXG5cdFx0XHRcdC8vIHRvIHRoZSBhcHAgd2UgY2FtZSBmcm9tIChleGNlcHQgZm9yIEZDTCwgd2hlcmUgd2UgbmF2aWdhdGUgdG8gTFIgYXMgdXN1YWwpXG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5leGl0RnJvbUFwcCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRlbGV0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvciBhcyBhbnkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJtaXQgdGhlIGN1cnJlbnQgc2V0IG9mIGNoYW5nZXMgYW5kIG5hdmlnYXRlIGJhY2suXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgY2hhbmdlcyBoYXZlIGJlZW4gc2F2ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2FwcGx5RG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgYXBwbHlEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0aWYgKG9Db250ZXh0LmdldE1vZGVsKCkuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLl9zdWJtaXRPcGVuQ2hhbmdlcyhvQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKTtcblx0XHRcdGF3YWl0IHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb25dIEJvb2xlYW4gdmFsdWUgZm9yIHN0YXRpYyBhY3Rpb24sIHVuZGVmaW5lZCBmb3Igb3RoZXIgYWN0aW9uc1xuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5pc05hdmlnYWJsZV0gQm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbmF2aWdhdGlvbiBpcyByZXF1aXJlZCBhZnRlciB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkXG5cdC8vIEN1cnJlbnRseSB0aGUgcGFyYW1ldGVyIGlzTmF2aWdhYmxlIGlzIHVzZWQgaW50ZXJuYWxseSBhbmQgc2hvdWxkIGJlIGNoYW5nZWQgdG8gcmVxdWlyZXNOYXZpZ2F0aW9uIGFzIGl0IGlzIGEgbW9yZSBhcHQgbmFtZSBmb3IgdGhpcyBwYXJhbVxuXG5cdC8qKlxuXHQgKiBJbnZva2VzIGFuIGFjdGlvbiAoYm91bmQgb3IgdW5ib3VuZCkgYW5kIHRyYWNrcyB0aGUgY2hhbmdlcyBzbyB0aGF0IG90aGVyIHBhZ2VzIGNhbiBiZSByZWZyZXNoZWQgYW5kIHNob3cgdGhlIHVwZGF0ZWQgZGF0YSB1cG9uIG5hdmlnYXRpb24uXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMgQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlcy5uYW1lIE5hbWUgb2YgdGhlIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMudmFsdWUgVmFsdWUgb2YgdGhlIHBhcmFtZXRlclxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZyBpZiB2YWx1ZXMgYXJlIHByb3ZpZGVkIGZvciBhbGwgb2YgdGhlbSBpbiBwYXJhbWV0ZXJWYWx1ZXNcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuY29udGV4dHMgRm9yIGEgYm91bmQgYWN0aW9uLCBhIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyB0byBiZSBjYWxsZWQgbXVzdCBiZSBwcm92aWRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5tb2RlbCBGb3IgYW4gdW5ib3VuZCBhY3Rpb24sIGFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsIG11c3QgYmUgcHJvdmlkZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMucmVxdWlyZXNOYXZpZ2F0aW9uIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZC4gTmF2aWdhdGlvbiB0YWtlcyBwbGFjZSB0byB0aGUgY29udGV4dCByZXR1cm5lZCBieSB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmxhYmVsIEEgaHVtYW4tcmVhZGFibGUgbGFiZWwgZm9yIHRoZSBhY3Rpb24uIFRoaXMgaXMgbmVlZGVkIGluIGNhc2UgdGhlIGFjdGlvbiBoYXMgYSBwYXJhbWV0ZXIgYW5kIGEgcGFyYW1ldGVyIGRpYWxvZyBpcyBzaG93biB0byB0aGUgdXNlci4gVGhlIGxhYmVsIHdpbGwgYmUgdXNlZCBmb3IgdGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgYW5kIGZvciB0aGUgY29uZmlybWF0aW9uIGJ1dHRvblxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5pbnZvY2F0aW9uR3JvdXBpbmcgTW9kZSBob3cgYWN0aW9ucyBhcmUgdG8gYmUgY2FsbGVkOiAnQ2hhbmdlU2V0JyB0byBwdXQgYWxsIGFjdGlvbiBjYWxscyBpbnRvIG9uZSBjaGFuZ2VzZXQsICdJc29sYXRlZCcgdG8gcHV0IHRoZW0gaW50byBzZXBhcmF0ZSBjaGFuZ2VzZXRzXG5cdCAqIEBwYXJhbSBtRXh0cmFQYXJhbXMgUFJJVkFURVxuXHQgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgb25jZSB0aGUgYWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLCBwcm92aWRpbmcgdGhlIHJlc3BvbnNlXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNpbnZva2VBY3Rpb25cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGludm9rZUFjdGlvbihcblx0XHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM/OiB7XG5cdFx0XHRwYXJhbWV0ZXJWYWx1ZXM/OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IGFueSB9O1xuXHRcdFx0c2tpcFBhcmFtZXRlckRpYWxvZz86IGJvb2xlYW47XG5cdFx0XHRjb250ZXh0cz86IENvbnRleHQgfCBDb250ZXh0W107XG5cdFx0XHRtb2RlbD86IE9EYXRhTW9kZWw7XG5cdFx0XHRyZXF1aXJlc05hdmlnYXRpb24/OiBib29sZWFuO1xuXHRcdFx0bGFiZWw/OiBzdHJpbmc7XG5cdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc/OiBzdHJpbmc7XG5cdFx0fSxcblx0XHRtRXh0cmFQYXJhbXM/OiBhbnlcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IG9Db250cm9sOiBhbnk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0bGV0IGFQYXJ0cztcblx0XHRsZXQgc092ZXJsb2FkRW50aXR5VHlwZTtcblx0XHRsZXQgb0N1cnJlbnRBY3Rpb25DYWxsQmFja3M6IGFueTtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdC8vIER1ZSB0byBhIG1pc3Rha2UgdGhlIGludm9rZUFjdGlvbiBpbiB0aGUgZXh0ZW5zaW9uQVBJIGhhZCBhIGRpZmZlcmVudCBBUEkgdGhhbiB0aGlzIG9uZS5cblx0XHQvLyBUaGUgb25lIGZyb20gdGhlIGV4dGVuc2lvbkFQSSBkb2Vzbid0IGV4aXN0IGFueW1vcmUgYXMgd2UgZXhwb3NlIHRoZSBmdWxsIGVkaXQgZmxvdyBub3cgYnV0XG5cdFx0Ly8gZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlIG9sZCBzaWduYXR1cmVcblx0XHRpZiAoXG5cdFx0XHQobVBhcmFtZXRlcnMuaXNBICYmIG1QYXJhbWV0ZXJzLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB8fFxuXHRcdFx0QXJyYXkuaXNBcnJheShtUGFyYW1ldGVycykgfHxcblx0XHRcdG1FeHRyYVBhcmFtcyAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBjb250ZXh0cyA9IG1QYXJhbWV0ZXJzO1xuXHRcdFx0bVBhcmFtZXRlcnMgPSBtRXh0cmFQYXJhbXMgfHwge307XG5cdFx0XHRpZiAoY29udGV4dHMpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBjb250ZXh0cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLm1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRtUGFyYW1ldGVycy5pc05hdmlnYWJsZSA9IG1QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiB8fCBtUGFyYW1ldGVycy5pc05hdmlnYWJsZTtcblxuXHRcdC8vIERldGVybWluZSBpZiB0aGUgcmVmZXJlbmNlZCBhY3Rpb24gaXMgYm91bmQgb3IgdW5ib3VuZFxuXHRcdGNvbnN0IGNvbnZlcnRlZE1ldGFkYXRhID0gY29udmVydFR5cGVzKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKTtcblx0XHQvLyBUaGUgRW50aXR5Q29udGFpbmVyIG1heSBOT1QgYmUgbWlzc2luZywgc28gaXQgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGJlIHVuZGVmaW5lZCwgYnV0IHNpbmNlIGluIG91ciBjb252ZXJ0ZWQgTWV0YWRhdGFcblx0XHQvLyBpdCBjYW4gYmUgdW5kZWZpbmVkLCBJIG5lZWQgdGhpcyB3b3JrYXJvdW5kIGhlcmUgb2YgYWRkaW5nIFwiXCIgc2luY2UgaW5kZXhPZiBkb2VzIG5vdCBhY2NlcHQgc29tZXRoaW5nIHRoYXQnc1xuXHRcdC8vIHVuZGVmaW5lZC5cblx0XHRpZiAoc0FjdGlvbk5hbWUuaW5kZXhPZihcIlwiICsgY29udmVydGVkTWV0YWRhdGEuZW50aXR5Q29udGFpbmVyLm5hbWUpID4gLTEpIHtcblx0XHRcdC8vIFVuYm91bmQgYWN0aW9ucyBhcmUgYWx3YXlzIHJlZmVyZW5jZWQgdmlhIHRoZSBhY3Rpb24gaW1wb3J0IGFuZCB3ZSBmb3VuZCB0aGUgRW50aXR5Q29udGFpbmVyIGluIHRoZSBzQWN0aW9uTmFtZSBzb1xuXHRcdFx0Ly8gYW4gdW5ib3VuZCBhY3Rpb24gaXMgcmVmZXJlbmNlZCFcblx0XHRcdG1QYXJhbWV0ZXJzLmlzQm91bmQgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gZW50aXR5IGNvbnRhaW5lciBpbiB0aGUgc0FjdGlvbk5hbWUsIHNvIGVpdGhlciBhIGJvdW5kIG9yIHN0YXRpYyBhY3Rpb24gaXMgcmVmZXJlbmNlZCB3aGljaCBpcyBhbHNvIGJvdW5kIVxuXHRcdFx0bVBhcmFtZXRlcnMuaXNCb3VuZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCFtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0b0NvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0XHRpZiAob0NvbnRyb2wpIHtcblx0XHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoaXMgc2VsZWN0ZWQgY29udGV4dHMgdXBkYXRlIGlzIGRvbmUgd2l0aGluIHRoZSBvcGVyYXRpb24sIHNob3VsZCBiZSBtb3ZlZCBvdXRcblx0XHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHNBY3Rpb25OYW1lICYmIHNBY3Rpb25OYW1lLmluZGV4T2YoXCIoXCIpID4gLTEpIHtcblx0XHRcdC8vIGdldCBlbnRpdHkgdHlwZSBvZiBhY3Rpb24gb3ZlcmxvYWQgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBhY3Rpb24gcGF0aFxuXHRcdFx0Ly8gRXhhbXBsZSBzQWN0aW9uTmFtZSA9IFwiPEFjdGlvbk5hbWU+KENvbGxlY3Rpb24oPE92ZXJsb2FkRW50aXR5VHlwZT4pKVwiXG5cdFx0XHQvLyBzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXSAtLT4gPEFjdGlvbk5hbWU+XG5cdFx0XHQvLyBzT3ZlcmxvYWRFbnRpdHlUeXBlID0gYVBhcnRzWzJdIC0tPiA8T3ZlcmxvYWRFbnRpdHlUeXBlPlxuXHRcdFx0YVBhcnRzID0gc0FjdGlvbk5hbWUuc3BsaXQoXCIoXCIpO1xuXHRcdFx0c0FjdGlvbk5hbWUgPSBhUGFydHNbMF07XG5cdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlID0gKGFQYXJ0c1thUGFydHMubGVuZ3RoIC0gMV0gYXMgYW55KS5yZXBsYWNlQWxsKFwiKVwiLCBcIlwiKTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbikge1xuXHRcdFx0aWYgKG9Db250cm9sLmlzVGFibGVCb3VuZCgpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0NvbnRyb2wuZ2V0Um93QmluZGluZygpLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHNCaW5kaW5nUGF0aCA9IG9Db250cm9sLmRhdGEoXCJyb3dzQmluZGluZ0luZm9cIikucGF0aCxcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcgPSBuZXcgKE9EYXRhTGlzdEJpbmRpbmcgYXMgYW55KSh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLCBzQmluZGluZ1BhdGgpO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IG9MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlICYmIG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSB0aGlzLl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoKFxuXHRcdFx0XHRcdG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRcdFx0b0NvbnRyb2wuZ2V0Um93QmluZGluZygpLFxuXHRcdFx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmVuYWJsZUF1dG9TY3JvbGwpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MgPSB0aGlzLmNyZWF0ZUFjdGlvblByb21pc2Uoc0FjdGlvbk5hbWUsIG9Db250cm9sLnNJZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQgPSB0aGlzLl9nZXRCb3VuZENvbnRleHQob1ZpZXcsIG1QYXJhbWV0ZXJzKTtcblx0XHQvLyBOZWVkIHRvIGtub3cgdGhhdCB0aGUgYWN0aW9uIGlzIGNhbGxlZCBmcm9tIE9iamVjdFBhZ2UgZm9yIGNoYW5nZVNldCBJc29sYXRlZCB3b3JrYXJvdW5kXG5cdFx0bVBhcmFtZXRlcnMuYk9iamVjdFBhZ2UgPSAob1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmNvbnZlcnRlclR5cGUgPT09IFwiT2JqZWN0UGFnZVwiO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IG9SZXNwb25zZSA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbGxBY3Rpb24oXG5cdFx0XHRcdHNBY3Rpb25OYW1lLFxuXHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKVxuXHRcdFx0KTtcblx0XHRcdGxldCBsaXN0UmVmcmVzaGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzICYmIG1QYXJhbWV0ZXJzLmlzQm91bmQgPT09IHRydWUpIHtcblx0XHRcdFx0bGlzdFJlZnJlc2hlZCA9IGF3YWl0IHRoaXMuX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRcdFx0XHR0aGlzLmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSksXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHNbMF1cblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGlmIChBY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpKSB7XG5cdFx0XHRcdGxldCBhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRpZiAob1Jlc3BvbnNlKSB7XG5cdFx0XHRcdFx0YWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyA9IEFycmF5LmlzQXJyYXkob1Jlc3BvbnNlKVxuXHRcdFx0XHRcdFx0PyBPYmplY3Qua2V5cyhvUmVzcG9uc2VbMF0udmFsdWUuZ2V0T2JqZWN0KCkpXG5cdFx0XHRcdFx0XHQ6IE9iamVjdC5rZXlzKG9SZXNwb25zZS5nZXRPYmplY3QoKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkFjdGlvbiwgbVBhcmFtZXRlcnMuY29udGV4dHMsIHNBY3Rpb25OYW1lLCBsaXN0UmVmcmVzaGVkLCBhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lLCBUcmlnZ2VyVHlwZS5hY3Rpb24pO1xuXG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlc29sdmVyKG9SZXNwb25zZSk7XG5cdFx0XHR9XG5cdFx0XHQvKlxuXHRcdFx0XHRcdFdlIHNldCB0aGUgKHVwcGVyKSBwYWdlcyB0byBkaXJ0eSBhZnRlciBhbiBleGVjdXRpb24gb2YgYW4gYWN0aW9uXG5cdFx0XHRcdFx0VE9ETzogZ2V0IHJpZCBvZiB0aGlzIHdvcmthcm91bmRcblx0XHRcdFx0XHRUaGlzIHdvcmthcm91bmQgaXMgb25seSBuZWVkZWQgYXMgbG9uZyBhcyB0aGUgbW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3luY2hyb25pemF0aW9uLlxuXHRcdFx0XHRcdE9uY2UgdGhpcyBpcyBzdXBwb3J0ZWQgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIHBhZ2VzIHRvIGRpcnR5IGFueW1vcmUgYXMgdGhlIGNvbnRleHQgaXRzZWxmXG5cdFx0XHRcdFx0aXMgYWxyZWFkeSByZWZyZXNoZWQgKGl0J3MganVzdCBub3QgcmVmbGVjdGVkIGluIHRoZSBvYmplY3QgcGFnZSlcblx0XHRcdFx0XHR3ZSBleHBsaWNpdGx5IGRvbid0IGNhbGwgdGhpcyBtZXRob2QgZnJvbSB0aGUgbGlzdCByZXBvcnQgYnV0IG9ubHkgY2FsbCBpdCBmcm9tIHRoZSBvYmplY3QgcGFnZVxuXHRcdFx0XHRcdGFzIGlmIGl0IGlzIGNhbGxlZCBpbiB0aGUgbGlzdCByZXBvcnQgaXQncyBub3QgbmVlZGVkIC0gYXMgd2UgYW55d2F5IHdpbGwgcmVtb3ZlIHRoaXMgbG9naWNcblx0XHRcdFx0XHR3ZSBjYW4gbGl2ZSB3aXRoIHRoaXNcblx0XHRcdFx0XHR3ZSBuZWVkIGEgY29udGV4dCB0byBzZXQgdGhlIHVwcGVyIHBhZ2VzIHRvIGRpcnR5IC0gaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgd2UgdXNlIHRoZVxuXHRcdFx0XHRcdGZpcnN0IG9uZSBhcyB0aGV5IGFyZSBhbnl3YXkgc2libGluZ3Ncblx0XHRcdFx0XHQqL1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUpIHtcblx0XHRcdFx0bGV0IHZDb250ZXh0ID0gb1Jlc3BvbnNlO1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2Q29udGV4dCkgJiYgdkNvbnRleHQubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0dkNvbnRleHQgPSB2Q29udGV4dFswXS52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodkNvbnRleHQgJiYgIUFycmF5LmlzQXJyYXkodkNvbnRleHQpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0XHRcdFx0Y29uc3Qgc0NvbnRleHRNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgodkNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRjb25zdCBfZm5WYWxpZENvbnRleHRzID0gKGNvbnRleHRzOiBhbnksIGFwcGxpY2FibGVDb250ZXh0czogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29udGV4dHMuZmlsdGVyKChlbGVtZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKGFwcGxpY2FibGVDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBhcHBsaWNhYmxlQ29udGV4dHMuaW5kZXhPZihlbGVtZW50KSA+IC0xO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBvQWN0aW9uQ29udGV4dCA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpXG5cdFx0XHRcdFx0XHQ/IF9mblZhbGlkQ29udGV4dHMobVBhcmFtZXRlcnMuY29udGV4dHMsIG1QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0cylbMF1cblx0XHRcdFx0XHRcdDogbVBhcmFtZXRlcnMuY29udGV4dHM7XG5cdFx0XHRcdFx0Y29uc3Qgc0FjdGlvbkNvbnRleHRNZXRhUGF0aCA9IG9BY3Rpb25Db250ZXh0ICYmIG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRpZiAoc0NvbnRleHRNZXRhUGF0aCAhPSB1bmRlZmluZWQgJiYgc0NvbnRleHRNZXRhUGF0aCA9PT0gc0FjdGlvbkNvbnRleHRNZXRhUGF0aCkge1xuXHRcdFx0XHRcdFx0aWYgKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSAhPT0gdkNvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KHZDb250ZXh0LCB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0bm9IaXN0b3J5RW50cnk6IGZhbHNlXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0TG9nLmluZm8oXCJOYXZpZ2F0aW9uIHRvIHRoZSBzYW1lIGNvbnRleHQgaXMgbm90IGFsbG93ZWRcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckFjdGlvbkV4ZWN1dGlvbihzQWN0aW9uTmFtZSk7XG5cdFx0XHRyZXR1cm4gb1Jlc3BvbnNlO1xuXHRcdH0gY2F0Y2ggKGVycjogYW55KSB7XG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlamVjdG9yKCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBGSVhNRTogaW4gbW9zdCBzaXR1YXRpb25zIHRoZXJlIGlzIG5vIGhhbmRsZXIgZm9yIHRoZSByZWplY3RlZCBwcm9taXNlcyByZXR1cm5lZHFcblx0XHRcdGlmIChlcnIgPT09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpIHtcblx0XHRcdFx0Ly8gVGhpcyBsZWFkcyB0byBjb25zb2xlIGVycm9yLiBBY3R1YWxseSB0aGUgZXJyb3IgaXMgYWxyZWFkeSBoYW5kbGVkIChjdXJyZW50bHkgZGlyZWN0bHkgaW4gcHJlc3MgaGFuZGxlciBvZiBlbmQgYnV0dG9uIGluIGRpYWxvZyksIHNvIGl0IHNob3VsZCBub3QgYmUgZm9yd2FyZGVkXG5cdFx0XHRcdC8vIHVwIHRvIGhlcmUuIEhvd2V2ZXIsIHdoZW4gZGlhbG9nIGhhbmRsaW5nIGFuZCBiYWNrZW5kIGV4ZWN1dGlvbiBhcmUgc2VwYXJhdGVkLCBpbmZvcm1hdGlvbiB3aGV0aGVyIGRpYWxvZyB3YXMgY2FuY2VsbGVkLCBvciBiYWNrZW5kIGV4ZWN1dGlvbiBoYXMgZmFpbGVkIG5lZWRzXG5cdFx0XHRcdC8vIHRvIGJlIHRyYW5zcG9ydGVkIHRvIHRoZSBwbGFjZSByZXNwb25zaWJsZSBmb3IgY29ubmVjdGluZyB0aGVzZSB0d28gdGhpbmdzLlxuXHRcdFx0XHQvLyBUT0RPOiByZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvbmUgZGlhbG9nIGhhbmRsaW5nIGFuZCBiYWNrZW5kIGV4ZWN1dGlvbiBhcmUgc2VwYXJhdGVkXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkRpYWxvZyBjYW5jZWxsZWRcIik7XG5cdFx0XHR9IGVsc2UgaWYgKCEoZXJyICYmIChlcnIuY2FuY2VsZWQgfHwgKGVyci5yZWplY3RlZEl0ZW1zICYmIGVyci5yZWplY3RlZEl0ZW1zWzBdLmNhbmNlbGVkKSkpKSB7XG5cdFx0XHRcdC8vIFRPRE86IGFuYWx5emUsIHdoZXRoZXIgdGhpcyBpcyBvZiB0aGUgc2FtZSBjYXRlZ29yeSBhcyBhYm92ZVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIEVkaXRGbG93Lmludm9rZUFjdGlvbjoke2Vycn1gKTtcblx0XHRcdH1cblx0XHRcdC8vIFRPRE86IEFueSB1bmV4cGVjdGVkIGVycm9ycyBwcm9iYWJseSBzaG91bGQgbm90IGJlIGlnbm9yZWQhXG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gYWZ0ZXIgdGhlIGFjdGlvbiBleGVjdXRpb24uXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gX2FjdGlvbk5hbWUgTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkFmdGVyQWN0aW9uRXhlY3V0aW9uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBzaW5jZSAxLjExNC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24oX2FjdGlvbk5hbWU6IHN0cmluZykge1xuXHRcdC8vdG8gYmUgb3ZlcnJpZGRlblxuXHR9XG5cblx0LyoqXG5cdCAqIFNlY3VyZWQgZXhlY3V0aW9uIG9mIHRoZSBnaXZlbiBmdW5jdGlvbi4gRW5zdXJlcyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIHdoZW4gY2VydGFpbiBjb25kaXRpb25zIGFyZSBmdWxmaWxsZWQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gZm5GdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuIFNob3VsZCByZXR1cm4gYSBwcm9taXNlIHRoYXQgaXMgc2V0dGxlZCBhZnRlciBjb21wbGV0aW9uIG9mIHRoZSBleGVjdXRpb24uIElmIG5vdGhpbmcgaXMgcmV0dXJuZWQsIGltbWVkaWF0ZSBjb21wbGV0aW9uIGlzIGFzc3VtZWQuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBEZWZpbml0aW9ucyBvZiB0aGUgcHJlY29uZGl0aW9ucyB0byBiZSBjaGVja2VkIGJlZm9yZSBleGVjdXRpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kgRGVmaW5lcyB0aGUgYnVzeSBpbmRpY2F0b3Jcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kuc2V0IFRyaWdnZXJzIGEgYnVzeSBpbmRpY2F0b3Igd2hlbiB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5LmNoZWNrIEV4ZWN1dGVzIGZ1bmN0aW9uIG9ubHkgaWYgYXBwbGljYXRpb24gaXNuJ3QgYnVzeS5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnVwZGF0ZXNEb2N1bWVudCBUaGlzIG9wZXJhdGlvbiB1cGRhdGVzIHRoZSBjdXJyZW50IGRvY3VtZW50IHdpdGhvdXQgdXNpbmcgdGhlIGJvdW5kIG1vZGVsIGFuZCBjb250ZXh0LiBBcyBhIHJlc3VsdCwgdGhlIGRyYWZ0IHN0YXR1cyBpcyB1cGRhdGVkIGlmIGEgZHJhZnQgZG9jdW1lbnQgZXhpc3RzLCBhbmQgdGhlIHVzZXIgaGFzIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgZWRpdGluZyBwcm9jZXNzLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBpcyByZWplY3RlZCBpZiB0aGUgZXhlY3V0aW9uIGlzIHByb2hpYml0ZWQgYW5kIHJlc29sdmVkIGJ5IHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IHRoZSBmbkZ1bmN0aW9uLlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjc2VjdXJlZEV4ZWN1dGlvblxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzZWN1cmVkRXhlY3V0aW9uKFxuXHRcdGZuRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRcdG1QYXJhbWV0ZXJzPzoge1xuXHRcdFx0YnVzeT86IHtcblx0XHRcdFx0c2V0PzogYm9vbGVhbjtcblx0XHRcdFx0Y2hlY2s/OiBib29sZWFuO1xuXHRcdFx0fTtcblx0XHRcdHVwZGF0ZXNEb2N1bWVudD86IGJvb2xlYW47XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBiQnVzeVNldCA9IG1QYXJhbWV0ZXJzPy5idXN5Py5zZXQgPz8gdHJ1ZSxcblx0XHRcdGJCdXN5Q2hlY2sgPSBtUGFyYW1ldGVycz8uYnVzeT8uY2hlY2sgPz8gdHJ1ZSxcblx0XHRcdGJVcGRhdGVzRG9jdW1lbnQgPSBtUGFyYW1ldGVycz8udXBkYXRlc0RvY3VtZW50ID8/IGZhbHNlLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKSxcblx0XHRcdG9Db250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0IGFzIENvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0aWYgKGJCdXN5Q2hlY2sgJiYgQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkFwcGxpY2F0aW9uIGFscmVhZHkgYnVzeSB0aGVyZWZvcmUgZXhlY3V0aW9uIHJlamVjdGVkXCIpO1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgdG8gc2V0IGJ1c3kgYW5kIGRyYWZ0IGluZGljYXRvciBpbW1lZGlhdGVseSBhbHNvIHRoZSBmdW5jdGlvbiBtaWdodCBiZSBleGVjdXRlZCBsYXRlciBpbiBxdWV1ZVxuXHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHR9XG5cblx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzayhmbkZ1bmN0aW9uIGFzICgpID0+IGFueSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChiSXNEcmFmdCkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCAmJiBiSXNEcmFmdCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0aWYgKGJCdXN5U2V0KSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgcGF0Y2hTZW50IGV2ZW50OiByZWdpc3RlciBkb2N1bWVudCBtb2RpZmljYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnQgVGhlIGV2ZW50IHNlbnQgYnkgdGhlIGJpbmRpbmdcblx0ICovXG5cdGhhbmRsZVBhdGNoU2VudChvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Ly8gSW4gY29sbGFib3JhdGl2ZSBkcmFmdCwgZGlzYWJsZSBFVGFnIGNoZWNrIGZvciBQQVRDSCByZXF1ZXN0c1xuXHRcdGNvbnN0IGlzSW5Db2xsYWJvcmF0aXZlRHJhZnQgPSBBY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpO1xuXHRcdGlmIChpc0luQ29sbGFib3JhdGl2ZURyYWZ0KSB7XG5cdFx0XHQoKG9FdmVudC5nZXRTb3VyY2UoKSBhcyBCaW5kaW5nKS5nZXRNb2RlbCgpIGFzIGFueSkuc2V0SWdub3JlRVRhZyh0cnVlKTtcblx0XHR9XG5cdFx0aWYgKCEodGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpPy5nZXRQcm9wZXJ0eShcInNraXBQYXRjaEhhbmRsZXJzXCIpKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VCaW5kaW5nID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHQvLyBDcmVhdGUgYSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIHRoZSBwYXRoIGlzIGNvbXBsZXRlZFxuXHRcdFx0Y29uc3Qgb1BhdGNoUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0b0V2ZW50LmdldFNvdXJjZSgpLmF0dGFjaEV2ZW50T25jZShcInBhdGNoQ29tcGxldGVkXCIsIChwYXRjaENvbXBsZXRlZEV2ZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHQvLyBSZS1lbmFibGUgRVRhZyBjaGVja3Ncblx0XHRcdFx0XHRpZiAoaXNJbkNvbGxhYm9yYXRpdmVEcmFmdCkge1xuXHRcdFx0XHRcdFx0KChvRXZlbnQuZ2V0U291cmNlKCkgYXMgQmluZGluZykuZ2V0TW9kZWwoKSBhcyBhbnkpLnNldElnbm9yZUVUYWcoZmFsc2UpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChvRXZlbnQuZ2V0U291cmNlKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudEFmdGVyUGF0Y2goXG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdFx0XHRzb3VyY2VCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgYlN1Y2Nlc3MgPSBwYXRjaENvbXBsZXRlZEV2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRcdFx0aWYgKGJTdWNjZXNzKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMudXBkYXRlRG9jdW1lbnQoc291cmNlQmluZGluZywgb1BhdGNoUHJvbWlzZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIENyZWF0ZUFjdGl2YXRlIGV2ZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50IFRoZSBldmVudCBzZW50IGJ5IHRoZSBiaW5kaW5nXG5cdCAqL1xuXHRhc3luYyBoYW5kbGVDcmVhdGVBY3RpdmF0ZShvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Y29uc3Qgb0JpbmRpbmcgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3QgYkF0RW5kID0gdHJ1ZTtcblx0XHRjb25zdCBiSW5hY3RpdmUgPSB0cnVlO1xuXHRcdGNvbnN0IG9QYXJhbXM6IGFueSA9IHtcblx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLklubGluZSxcblx0XHRcdGNyZWF0ZUF0RW5kOiBiQXRFbmQsXG5cdFx0XHRpbmFjdGl2ZTogYkluYWN0aXZlLFxuXHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogZmFsc2UsIC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRidXN5TW9kZTogXCJOb25lXCJcblx0XHR9O1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBTZW5kIG5vdGlmaWNhdGlvbiB0byBvdGhlciB1c2VycyBvbmx5IGFmdGVyIHRoZSBjcmVhdGlvbiBoYXMgYmVlbiBmaW5hbGl6ZWRcblx0XHRcdGNvbnN0IGFjdGl2YXRlZENvbnRleHQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKSBhcyBDb250ZXh0O1xuXHRcdFx0YWN0aXZhdGVkQ29udGV4dFxuXHRcdFx0XHQuY3JlYXRlZCgpXG5cdFx0XHRcdD8udGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkNyZWF0ZSwgYWN0aXZhdGVkQ29udGV4dCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdFx0TG9nLndhcm5pbmcoYEZhaWxlZCB0byBhY3RpdmF0ZSBjb250ZXh0ICR7YWN0aXZhdGVkQ29udGV4dC5nZXRQYXRoKCl9YCk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHQvLyBDcmVhdGUgYSBuZXcgaW5hY3RpdmUgY29udGV4dCAoZW1wdHkgcm93IGluIHRoZSB0YWJsZSlcblx0XHRcdGNvbnN0IG5ld0luYWN0aXZlQ29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRvQmluZGluZyBhcyBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdFx0XHRvUGFyYW1zLFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpO1xuXHRcdFx0aWYgKG5ld0luYWN0aXZlQ29udGV4dCkge1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRmFpbGVkIHRvIGFjdGl2YXRlIG5ldyByb3cgLVwiLCBlcnJvciBhcyBhbnkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBQZXJmb3JtcyBhIHRhc2sgaW4gc3luYyB3aXRoIG90aGVyIHRhc2tzIGNyZWF0ZWQgdmlhIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFJldHVybnMgdGhlIHByb21pc2UgY2hhaW4gb2YgdGhlIHRhc2suXG5cdCAqXG5cdCAqIEBwYXJhbSBbbmV3VGFza10gT3B0aW9uYWwsIGEgcHJvbWlzZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBzeW5jaHJvbm91c2x5XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgdGFzayBpcyBjb21wbGV0ZWRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHN5bmNUYXNrKG5ld1Rhc2s/OiAoKCkgPT4gYW55KSB8IFByb21pc2U8YW55Pikge1xuXHRcdGlmIChuZXdUYXNrKSB7XG5cdFx0XHRpZiAodHlwZW9mIG5ld1Rhc2sgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHR0aGlzLnN5bmNUYXNrcyA9IHRoaXMuc3luY1Rhc2tzLnRoZW4obmV3VGFzaykuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnN5bmNUYXNrcyA9IHRoaXMuc3luY1Rhc2tzXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4gbmV3VGFzaylcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrcztcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNpZGVzIGlmIGEgZG9jdW1lbnQgaXMgdG8gYmUgc2hvd24gaW4gZGlzcGxheSBvciBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIGRpc3BsYXllZCBvciBlZGl0ZWRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZWRpdCBtb2RlIGlzIGNvbXB1dGVkXG5cdCAqL1xuXG5cdGFzeW5jIGNvbXB1dGVFZGl0TW9kZShjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblxuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0Y29uc3QgZ2xvYmFsTW9kZWwgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVBlbmRpbmdcIiwgdHJ1ZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdFx0Y29uc3QgaXNBY3RpdmVFbnRpdHkgPSBhd2FpdCBjb250ZXh0LnJlcXVlc3RPYmplY3QoXCJJc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRcdFx0aWYgKGlzQWN0aXZlRW50aXR5ID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdC8vIGluIGNhc2UgdGhlIGRvY3VtZW50IGlzIGRyYWZ0IHNldCBpdCBpbiBlZGl0IG1vZGVcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTtcblx0XHRcdFx0XHRjb25zdCBoYXNBY3RpdmVFbnRpdHkgPSBhd2FpdCBjb250ZXh0LnJlcXVlc3RPYmplY3QoXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZSh1bmRlZmluZWQsICFoYXNBY3RpdmVFbnRpdHkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGFjdGl2ZSBkb2N1bWVudCwgc3RheSBvbiBkaXNwbGF5IG1vZGVcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlUGVuZGluZ1wiLCBmYWxzZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGV0ZXJtaW5pbmcgdGhlIGVkaXRNb2RlIGZvciBkcmFmdFwiLCBlcnJvcik7XG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGxhc3RJbnZva2VkQWN0aW9uTmFtZSA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLmdldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIpO1xuXHRcdFx0aWYgKGxhc3RJbnZva2VkQWN0aW9uTmFtZSAmJiB0aGlzLmlzTmV3QWN0aW9uRm9yU3RpY2t5KGxhc3RJbnZva2VkQWN0aW9uTmFtZSwgY29udGV4dCkpIHtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgdHJ1ZSk7XG5cdFx0XHRcdGlmICghdGhpcy5nZXRBcHBDb21wb25lbnQoKS5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9uKGNvbnRleHQpO1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFByaXZhdGUgbWV0aG9kc1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBJbnRlcm5hbCBtZXRob2QgdG8gZGVsZXRlIGEgY29udGV4dCBvciBhbiBhcnJheSBvZiBjb250ZXh0cy5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRzIFRoZSBjb250ZXh0KHMpIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgUGFyYW1ldGVycyBmb3IgZGVsZXRpb25cblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihjb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSwgcGFyYW1ldGVyczogYW55KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IGdldFJlc291cmNlTW9kZWwodGhpcyk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHQvLyBUT0RPOiB0aGlzIHNldHRpbmcgYW5kIHJlbW92aW5nIG9mIGNvbnRleHRzIHNob3VsZG4ndCBiZSBpbiB0aGUgdHJhbnNhY3Rpb24gaGVscGVyIGF0IGFsbFxuXHRcdC8vIGZvciB0aGUgdGltZSBiZWluZyBJIGtlcHQgaXQgYW5kIHByb3ZpZGUgdGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQgdG8gbm90IGJyZWFrIHNvbWV0aGluZ1xuXHRcdHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBwYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHRcdFx0PyBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpXG5cdFx0XHQ6IG51bGw7XG5cblx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0YXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuZGVsZXRlRG9jdW1lbnQoY29udGV4dHMsIHBhcmFtZXRlcnMsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksIHJlc291cmNlTW9kZWwsIHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSk7XG5cdH1cblxuXHRfZ2V0UmVzb3VyY2VNb2RlbCgpOiBSZXNvdXJjZU1vZGVsIHtcblx0XHRyZXR1cm4gZ2V0UmVzb3VyY2VNb2RlbCh0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRwcml2YXRlIGdldFRyYW5zYWN0aW9uSGVscGVyKCkge1xuXHRcdHJldHVybiBUcmFuc2FjdGlvbkhlbHBlcjtcblx0fVxuXG5cdHByaXZhdGUgZ2V0TWVzc2FnZUhhbmRsZXIoKSB7XG5cdFx0aWYgKHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcikge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIG1lc3NhZ2UgaGFuZGxlclwiKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldEludGVybmFsTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHRwcml2YXRlIGdldEdsb2JhbFVJTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgYSBuZXdseSBjcmVhdGVkIG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIGJDcmVhdGlvbk1vZGUgVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG5ld1xuXHQgKi9cblx0cHJpdmF0ZSBzZXRDcmVhdGlvbk1vZGUoYkNyZWF0aW9uTW9kZTogYm9vbGVhbikge1xuXHRcdGNvbnN0IHVpTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJ1aVwiKSBhcyBDb250ZXh0O1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFwiY3JlYXRlTW9kZVwiLCBiQ3JlYXRpb25Nb2RlLCB1aU1vZGVsQ29udGV4dCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0IG9yIG5vdC5cblx0ICpcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG5ld1xuXHQgKi9cblx0cHJpdmF0ZSBnZXRDcmVhdGlvbk1vZGUoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgdWlNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcInVpXCIpIGFzIENvbnRleHQ7XG5cdFx0cmV0dXJuICEhdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuZ2V0UHJvcGVydHkoXCJjcmVhdGVNb2RlXCIsIHVpTW9kZWxDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQgb3Igbm90LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdHByaXZhdGUgaXNEb2N1bWVudE1vZGlmaWVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAhIXRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFwiL2lzRG9jdW1lbnRNb2RpZmllZFwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIG9iamVjdCBiZWluZyBlZGl0ZWQgKG9yIG9uZSBvZiBpdHMgc3ViLW9iamVjdHMpIGhhcyBiZWVuIG1vZGlmaWVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gbW9kaWZpZWQgVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkXG5cdCAqL1xuXHRwcml2YXRlIHNldERvY3VtZW50TW9kaWZpZWQobW9kaWZpZWQ6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9pc0RvY3VtZW50TW9kaWZpZWRcIiwgbW9kaWZpZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCBoYXMgYmVlbiBtb2RpZmllZCBieSBjcmVhdGluZyBhIHN1Yi1vYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIG9uIHdoaWNoIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpIHtcblx0XHQvLyBTZXQgdGhlIG1vZGlmaWVkIGZsYWcgb25seSBvbiByZWxhdGl2ZSBsaXN0QmluZGluZ3MsIGkuZS4gd2hlbiBjcmVhdGluZyBhIHN1Yi1vYmplY3Rcblx0XHQvLyBJZiB0aGUgbGlzdEJpbmRpbmcgaXMgbm90IHJlbGF0aXZlLCB0aGVuIGl0J3MgYSBjcmVhdGlvbiBmcm9tIHRoZSBMaXN0UmVwb3J0LCBhbmQgYnkgZGVmYXVsdCBhIG5ld2x5IGNyZWF0ZWQgcm9vdCBvYmplY3QgaXNuJ3QgY29uc2lkZXJlZCBhcyBtb2RpZmllZFxuXHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgY3JlYXRlIGV2ZW50OiBzaG93cyBtZXNzYWdlcyBhbmQgaW4gY2FzZSBvZiBhIGRyYWZ0LCB1cGRhdGVzIHRoZSBkcmFmdCBpbmRpY2F0b3IuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gYmluZGluZyBPRGF0YSBsaXN0IGJpbmRpbmcgb2JqZWN0XG5cdCAqL1xuXHRwcml2YXRlIGhhbmRsZUNyZWF0ZUV2ZW50cyhiaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKSB7XG5cdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGJpbmRpbmcpO1xuXG5cdFx0YmluZGluZy5hdHRhY2hFdmVudChcImNyZWF0ZVNlbnRcIiwgKCkgPT4ge1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGJpbmRpbmcuYXR0YWNoRXZlbnQoXCJjcmVhdGVDb21wbGV0ZWRcIiwgKG9FdmVudDogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBzdWNjZXNzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKHN1Y2Nlc3MgPyBEcmFmdFN0YXR1cy5TYXZlZCA6IERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBtZXNzYWdlIChkaXNwbGF5ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZSkuXG5cdCAqXG5cdCAqIEBwYXJhbSBkcmFmdFN0YXR1cyBUaGUgZHJhZnQgc3RhdHVzIG1lc3NhZ2Vcblx0ICovXG5cdHNldERyYWZ0U3RhdHVzKGRyYWZ0U3RhdHVzOiBzdHJpbmcpIHtcblx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWwpLnNldFByb3BlcnR5KFwiL2RyYWZ0U3RhdHVzXCIsIGRyYWZ0U3RhdHVzLCB1bmRlZmluZWQsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb2dyYW1taW5nIG1vZGVsIGZyb20gYSBiaW5kaW5nIG9yIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHNvdXJjZSBUaGUgYmluZGluZyBvciBjb250ZXh0XG5cdCAqIEByZXR1cm5zIFRoZSBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKi9cblx0cHJpdmF0ZSBnZXRQcm9ncmFtbWluZ01vZGVsKHNvdXJjZTogQ29udGV4dCB8IEJpbmRpbmcpOiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5nZXRQcm9ncmFtbWluZ01vZGVsKHNvdXJjZSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBAcGFyYW0gZWRpdE1vZGUgVGhlIGVkaXQgbW9kZVxuXHQgKiBAcGFyYW0gaXNDcmVhdGlvbiBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbmV3bHkgY3JlYXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXRFZGl0TW9kZShlZGl0TW9kZT86IHN0cmluZywgaXNDcmVhdGlvbj86IGJvb2xlYW4pIHtcblx0XHQvLyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgaXQncyBub3QgbWVhbnQgdG8gcmVsZWFzZSB0aGUgZWRpdCBmbG93IGZvciBmcmVlc3R5bGUgdXNhZ2UgdGhlcmVmb3JlIHdlIGNhblxuXHRcdC8vIHJlbHkgb24gdGhlIGdsb2JhbCBVSSBtb2RlbCB0byBleGlzdFxuXHRcdGNvbnN0IGdsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHRpZiAoZWRpdE1vZGUpIHtcblx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIiwgZWRpdE1vZGUgPT09IFwiRWRpdGFibGVcIiwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHR9XG5cblx0XHRpZiAoaXNDcmVhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBTaW5jZSBzZXRDcmVhdGlvbk1vZGUgaXMgcHVibGljIGluIEVkaXRGbG93IGFuZCBjYW4gYmUgb3ZlcnJpZGVuLCBtYWtlIHN1cmUgdG8gY2FsbCBpdCB2aWEgdGhlIGNvbnRyb2xsZXJcblx0XHRcdC8vIHRvIGVuc3VyZSBhbnkgb3ZlcnJpZGVzIGFyZSB0YWtlbiBpbnRvIGFjY291bnRcblx0XHRcdHRoaXMuc2V0Q3JlYXRpb25Nb2RlKGlzQ3JlYXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYW4gYWN0aW9uIGNvcnJlc3BvbmRzIHRvIGEgY3JlYXRlIGFjdGlvbiBmb3IgYSBzdGlja3kgc2Vzc2lvbi5cblx0ICpcblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB0aGUgc3RpY2t5IHNlc3Npb25cblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgYWN0aW9uIGlzIGEgY3JlYXRlIGFjdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBpc05ld0FjdGlvbkZvclN0aWNreShhY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQ7XG5cdFx0XHRjb25zdCBzdGlja3lTZXNzaW9uID0gZW50aXR5U2V0LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ7XG5cdFx0XHRpZiAoc3RpY2t5U2Vzc2lvbj8uTmV3QWN0aW9uID09PSBhY3Rpb25OYW1lKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHN0aWNreVNlc3Npb24/LkFkZGl0aW9uYWxOZXdBY3Rpb25zICYmIHN0aWNreVNlc3Npb24/LkFkZGl0aW9uYWxOZXdBY3Rpb25zLmluZGV4T2YoYWN0aW9uTmFtZSkgIT09IC0xKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVE9ETyBNb3ZlIGFsbCBzdGlja3ktcmVsYXRlZCBiZWxvdyB0byBhIHN0aWNreSBzZXNzaW9uIG1hbmFnZXIgY2xhc3NcblxuXHQvKipcblx0ICogRW5hYmxlcyB0aGUgc3RpY2t5IGVkaXQgc2Vzc2lvbi5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkXG5cdCAqIEByZXR1cm5zIFRydWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlU3RpY2t5T24oY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmhhc05hdmlnYXRpb25HdWFyZCgpKSB7XG5cdFx0XHRcdGNvbnN0IGhhc2hUcmFja2VyID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cblx0XHRcdFx0Ly8gU2V0IGEgZ3VhcmQgaW4gdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdC8vIEEgdGltZW91dCBpcyBuZWNlc3NhcnksIGFzIHdpdGggZGVmZXJyZWQgY3JlYXRpb24gdGhlIGhhc2hDaGFuZ2VyIGlzIG5vdCB1cGRhdGVkIHlldCB3aXRoXG5cdFx0XHRcdC8vIHRoZSBuZXcgaGFzaCwgYW5kIHRoZSBndWFyZCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSBvZiB0aGUgcm91dGVyIHByb3h5XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldE5hdmlnYXRpb25HdWFyZChjb250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMSkpO1xuXHRcdFx0XHR9LCAwKTtcblxuXHRcdFx0XHQvLyBTZXR0aW5nIGJhY2sgbmF2aWdhdGlvbiBvbiBzaGVsbCBzZXJ2aWNlLCB0byBnZXQgdGhlIGRpY2FyZCBtZXNzYWdlIGJveCBpbiBjYXNlIG9mIHN0aWNreVxuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKHRoaXMub25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbi5iaW5kKHRoaXMpKTtcblxuXHRcdFx0XHR0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uID0gdGhpcy5nZXREaXJ0eVN0YXRlUHJvdmlkZXIoYXBwQ29tcG9uZW50LCBpbnRlcm5hbE1vZGVsLCBoYXNoVHJhY2tlcik7XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkucmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIodGhpcy5kaXJ0eVN0YXRlUHJvdmlkZXJGdW5jdGlvbik7XG5cblx0XHRcdFx0Ly8gaGFuZGxlIHNlc3Npb24gdGltZW91dFxuXHRcdFx0XHRjb25zdCBpMThuTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpO1xuXHRcdFx0XHR0aGlzLnNlc3Npb25UaW1lb3V0RnVuY3Rpb24gPSB0aGlzLmdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24oY29udGV4dCwgaTE4bk1vZGVsKTtcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCkgYXMgYW55KS5hdHRhY2hTZXNzaW9uVGltZW91dCh0aGlzLnNlc3Npb25UaW1lb3V0RnVuY3Rpb24pO1xuXG5cdFx0XHRcdHRoaXMuc3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uID0gdGhpcy5nZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbihjb250ZXh0LCBhcHBDb21wb25lbnQpO1xuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5hdHRhY2hSb3V0ZU1hdGNoZWQodGhpcy5zdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc2FibGVzIHRoZSBzdGlja3kgZWRpdCBzZXNzaW9uLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUcnVlIGluIGNhc2Ugb2Ygc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGhhbmRsZVN0aWNreU9mZigpOiBib29sZWFuIHtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidW5kZWZpbmVkIEFwcENvbXBvbmVudCBmb3IgZnVuY3Rpb24gaGFuZGxlU3RpY2t5T2ZmXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5kaXNjYXJkTmF2aWdhdGlvbkd1YXJkKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uKSB7XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuZGVyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlcih0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uKTtcblx0XHRcdFx0dGhpcy5kaXJ0eVN0YXRlUHJvdmlkZXJGdW5jdGlvbiA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpIGFzIE9EYXRhTW9kZWw7XG5cdFx0XHRpZiAobW9kZWwgJiYgdGhpcy5zZXNzaW9uVGltZW91dEZ1bmN0aW9uKSB7XG5cdFx0XHRcdG1vZGVsLmRldGFjaFNlc3Npb25UaW1lb3V0KHRoaXMuc2Vzc2lvblRpbWVvdXRGdW5jdGlvbik7XG5cdFx0XHR9XG5cblx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmRldGFjaFJvdXRlTWF0Y2hlZCh0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbik7XG5cdFx0XHR0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbiA9IHVuZGVmaW5lZDtcblxuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cblx0XHRcdGlmIChhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcykge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0X3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLCBtb2RlbDogT0RhdGFNb2RlbCkge1xuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIiwgdHJ1ZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCAobW9kZWwuZ2V0SHR0cEhlYWRlcnModHJ1ZSkgYXMgYW55KVtcIlNBUC1Db250ZXh0SWRcIl0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgdXNlZCBhcyBhIERpcnR5U3RhdGVQcm92aWRlciBpbiB0aGUgU2hlbGwuXG5cdCAqXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHBhcmFtIGludGVybmFsTW9kZWwgVGhlIG1vZGVsIFwiaW50ZXJuYWxcIlxuXHQgKiBAcGFyYW0gaGFzaFRyYWNrZXIgSGFzaCB0cmFja2VyXG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXREaXJ0eVN0YXRlUHJvdmlkZXIoYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsIGludGVybmFsTW9kZWw6IEpTT05Nb2RlbCwgaGFzaFRyYWNrZXI6IHN0cmluZykge1xuXHRcdHJldHVybiAobmF2aWdhdGlvbkNvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKG5hdmlnYXRpb25Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0IHBhcmFtZXRlcnMgZm9yIERpcnR5U3RhdGVQcm92aWRlciBmdW5jdGlvblwiKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHRhcmdldEhhc2ggPSBuYXZpZ2F0aW9uQ29udGV4dC5pbm5lckFwcFJvdXRlO1xuXHRcdFx0XHRjb25zdCByb3V0ZXJQcm94eSA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpO1xuXHRcdFx0XHRsZXQgbGNsSGFzaFRyYWNrZXIgPSBcIlwiO1xuXHRcdFx0XHRsZXQgaXNEaXJ0eTogYm9vbGVhbjtcblx0XHRcdFx0Y29uc3QgaXNTZXNzaW9uT24gPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiKTtcblxuXHRcdFx0XHRpZiAoIWlzU2Vzc2lvbk9uKSB7XG5cdFx0XHRcdFx0Ly8gSWYgdGhlIHN0aWNreSBzZXNzaW9uIHdhcyB0ZXJtaW5hdGVkIGJlZm9yZSBoYW5kLlxuXHRcdFx0XHRcdC8vIEV4YW1wbGUgaW4gY2FzZSBvZiBuYXZpZ2F0aW5nIGF3YXkgZnJvbSBhcHBsaWNhdGlvbiB1c2luZyBJQk4uXG5cdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghcm91dGVyUHJveHkuaXNOYXZpZ2F0aW9uRmluYWxpemVkKCkpIHtcblx0XHRcdFx0XHQvLyBJZiBuYXZpZ2F0aW9uIGlzIGN1cnJlbnRseSBoYXBwZW5pbmcgaW4gUm91dGVyUHJveHksIGl0J3MgYSB0cmFuc2llbnQgc3RhdGVcblx0XHRcdFx0XHQvLyAobm90IGRpcnR5KVxuXHRcdFx0XHRcdGlzRGlydHkgPSBmYWxzZTtcblx0XHRcdFx0XHRsY2xIYXNoVHJhY2tlciA9IHRhcmdldEhhc2g7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaGFzaFRyYWNrZXIgPT09IHRhcmdldEhhc2gpIHtcblx0XHRcdFx0XHQvLyB0aGUgaGFzaCBkaWRuJ3QgY2hhbmdlIHNvIGVpdGhlciB0aGUgdXNlciBhdHRlbXB0cyB0byByZWZyZXNoIG9yIHRvIGxlYXZlIHRoZSBhcHBcblx0XHRcdFx0XHRpc0RpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIGlmIChyb3V0ZXJQcm94eS5jaGVja0hhc2hXaXRoR3VhcmQodGFyZ2V0SGFzaCkgfHwgcm91dGVyUHJveHkuaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlcigpKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSByb290IG9iamVjdFxuXHRcdFx0XHRcdC8vIG9yIGNyb3NzaW5nIHRoZSBndWFyZCBoYXMgYWxyZWFkeSBiZWVuIGFsbG93ZWQgYnkgdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdFx0bGNsSGFzaFRyYWNrZXIgPSB0YXJnZXRIYXNoO1xuXHRcdFx0XHRcdGlzRGlydHkgPSBmYWxzZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB0aGUgdXNlciBhdHRlbXB0cyB0byBuYXZpZ2F0ZSB3aXRoaW4gdGhlIGFwcCwgZm9yIGV4YW1wbGUgYmFjayB0byB0aGUgbGlzdCByZXBvcnRcblx0XHRcdFx0XHRpc0RpcnR5ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpc0RpcnR5KSB7XG5cdFx0XHRcdFx0Ly8gdGhlIEZMUCBkb2Vzbid0IGNhbGwgdGhlIGRpcnR5IHN0YXRlIHByb3ZpZGVyIGFueW1vcmUgb25jZSBpdCdzIGRpcnR5LCBhcyB0aGV5IGNhbid0XG5cdFx0XHRcdFx0Ly8gY2hhbmdlIHRoaXMgZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzZXQgaXQgYmFjayB0byBub3QtZGlydHlcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0RGlydHlGbGFnKGZhbHNlKTtcblx0XHRcdFx0XHR9LCAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRoYXNoVHJhY2tlciA9IGxjbEhhc2hUcmFja2VyO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGlzRGlydHk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIHVzZWQgd2hlbiBhIHN0aWNreSBzZXNzaW9uIHRpbWVzIG91dC5cblx0ICpcblx0ICogQHBhcmFtIHN0aWNreUNvbnRleHQgVGhlIGNvbnRleHQgZm9yIHRoZSBzdGlja3kgc2Vzc2lvblxuXHQgKiBAcGFyYW0gaTE4bk1vZGVsXG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRTZXNzaW9uVGltZW91dEZ1bmN0aW9uKHN0aWNreUNvbnRleHQ6IENvbnRleHQsIGkxOG5Nb2RlbDogTW9kZWwpIHtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKHN0aWNreUNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNvbnRleHQgbWlzc2luZyBmb3IgU2Vzc2lvblRpbWVvdXQgZnVuY3Rpb25cIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gcmVtb3ZlIHRyYW5zaWVudCBtZXNzYWdlcyBzaW5jZSB3ZSB3aWxsIHNob3dpbmcgb3VyIG93biBtZXNzYWdlXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdFx0XHRjb25zdCB3YXJuaW5nRGlhbG9nID0gbmV3IERpYWxvZyh7XG5cdFx0XHRcdFx0dGl0bGU6IFwie3NhcC5mZS5pMThuPkNfRURJVEZMT1dfT0JKRUNUX1BBR0VfU0VTU0lPTl9FWFBJUkVEX0RJQUxPR19USVRMRX1cIixcblx0XHRcdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRcdFx0Y29udGVudDogbmV3IFRleHQoeyB0ZXh0OiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfTUVTU0FHRX1cIiB9KSxcblx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHR0ZXh0OiBcIntzYXAuZmUuaTE4bj5DX0NPTU1PTl9ESUFMT0dfT0t9XCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRcdHByZXNzOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdC8vIHJlbW92ZSBzdGlja3kgaGFuZGxpbmcgYWZ0ZXIgbmF2aWdhdGlvbiBzaW5jZSBzZXNzaW9uIGhhcyBhbHJlYWR5IGJlZW4gdGVybWluYXRlZFxuXHRcdFx0XHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KHN0aWNreUNvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHdhcm5pbmdEaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHdhcm5pbmdEaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdHdhcm5pbmdEaWFsb2cuc2V0TW9kZWwoaTE4bk1vZGVsLCBcInNhcC5mZS5pMThuXCIpO1xuXHRcdFx0XHR0aGlzLmdldFZpZXcoKS5hZGREZXBlbmRlbnQod2FybmluZ0RpYWxvZyk7XG5cdFx0XHRcdHdhcm5pbmdEaWFsb2cub3BlbigpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgYW55KTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgb25Sb3V0ZU1hdGNoZWQgZXZlbnQgaW4gY2FzZSBvZiBzdGlja3kgZWRpdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkIChyb290IG9mIHRoZSBzdGlja3kgc2Vzc2lvbilcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0Um91dGVNYXRjaGVkRnVuY3Rpb24oY29udGV4dDogQ29udGV4dCwgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQpIHtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0Y29uc3QgY3VycmVudEhhc2ggPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCk7XG5cdFx0XHQvLyBlaXRoZXIgY3VycmVudCBoYXNoIGlzIGVtcHR5IHNvIHRoZSB1c2VyIGxlZnQgdGhlIGFwcCBvciBoZSBuYXZpZ2F0ZWQgYXdheSBmcm9tIHRoZSBvYmplY3Rcblx0XHRcdGlmICghY3VycmVudEhhc2ggfHwgIWFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmNoZWNrSGFzaFdpdGhHdWFyZChjdXJyZW50SGFzaCkpIHtcblx0XHRcdFx0dGhpcy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0KTtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0Ly9jbGVhciB0aGUgc2Vzc2lvbiBjb250ZXh0IHRvIGVuc3VyZSB0aGUgTFIgcmVmcmVzaGVzIHRoZSBsaXN0IHdpdGhvdXQgYSBzZXNzaW9uXG5cdFx0XHRcdFx0KGNvbnRleHQuZ2V0TW9kZWwoKSBhcyBhbnkpLmNsZWFyU2Vzc2lvbkNvbnRleHQoKTtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbmRzIGEgc3RpY2t5IHNlc3Npb24gYnkgZGlzY2FyZGluZyBjaGFuZ2VzLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWQgKHJvb3Qgb2YgdGhlIHN0aWNreSBzZXNzaW9uKVxuXHQgKi9cblx0cHJpdmF0ZSBhc3luYyBkaXNjYXJkU3RpY2t5U2Vzc2lvbihjb250ZXh0OiBDb250ZXh0KSB7XG5cdFx0Y29uc3QgZGlzY2FyZGVkQ29udGV4dCA9IGF3YWl0IHN0aWNreS5kaXNjYXJkRG9jdW1lbnQoY29udGV4dCk7XG5cdFx0aWYgKGRpc2NhcmRlZENvbnRleHQ/Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMuZ2V0Q3JlYXRpb25Nb2RlKCkpIHtcblx0XHRcdGRpc2NhcmRlZENvbnRleHQ/LnJlZnJlc2goKTtcblx0XHR9XG5cblx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGludGVybmFsIHJvdXRpbmcgZXh0ZW5zaW9uLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgaW50ZXJuYWwgcm91dGluZyBleHRlbnNpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0SW50ZXJuYWxSb3V0aW5nKCk6IEludGVybmFsUm91dGluZyB7XG5cdFx0aWYgKHRoaXMuYmFzZS5fcm91dGluZykge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5fcm91dGluZztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIHJvdXRpbmcgbGlzdGVuZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0X2dldFJvb3RWaWV3Q29udHJvbGxlcigpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0fVxuXG5cdF9nZXRTZW1hbnRpY01hcHBpbmcoKTogU2VtYW50aWNNYXBwaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb3V0aW5nU2VydmljZSgpLmdldExhc3RTZW1hbnRpY01hcHBpbmcoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHByb21pc2UgdG8gd2FpdCBmb3IgYW4gYWN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250cm9sSWQgVGhlIElEIG9mIHRoZSBjb250cm9sXG5cdCAqIEByZXR1cm5zIHtGdW5jdGlvbn0gVGhlIHJlc29sdmVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4dGVybmFsbHkgcmVzb2x2ZSB0aGUgcHJvbWlzZVxuXHQgKi9cblx0cHJpdmF0ZSBjcmVhdGVBY3Rpb25Qcm9taXNlKGFjdGlvbk5hbWU6IHN0cmluZywgY29udHJvbElkOiBzdHJpbmcpIHtcblx0XHRsZXQgcmVzb2x2ZUZ1bmN0aW9uLCByZWplY3RGdW5jdGlvbjtcblx0XHR0aGlzLmFjdGlvblByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRyZXNvbHZlRnVuY3Rpb24gPSByZXNvbHZlO1xuXHRcdFx0cmVqZWN0RnVuY3Rpb24gPSByZWplY3Q7XG5cdFx0fSkudGhlbigob1Jlc3BvbnNlOiBhbnkpID0+IHtcblx0XHRcdHJldHVybiBPYmplY3QuYXNzaWduKHsgY29udHJvbElkIH0sIHRoaXMuZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhhY3Rpb25OYW1lLCBvUmVzcG9uc2UpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4geyBmUmVzb2x2ZXI6IHJlc29sdmVGdW5jdGlvbiwgZlJlamVjdG9yOiByZWplY3RGdW5jdGlvbiB9O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdGhhdCBpcyBleGVjdXRlZFxuXHQgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIGJvdW5kIGFjdGlvbidzIHJlc3BvbnNlIGRhdGEgb3IgcmVzcG9uc2UgY29udGV4dFxuXHQgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBkYXRhIGFuZCBuYW1lcyBvZiB0aGUga2V5IGZpZWxkcyBvZiB0aGUgcmVzcG9uc2Vcblx0ICovXG5cdHByaXZhdGUgZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyhhY3Rpb25OYW1lOiBzdHJpbmcsIHJlc3BvbnNlOiBhbnkpIHtcblx0XHRpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZSkpIHtcblx0XHRcdGlmIChyZXNwb25zZS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0cmVzcG9uc2UgPSByZXNwb25zZVswXS52YWx1ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIXJlc3BvbnNlKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cdFx0Y29uc3QgY3VycmVudFZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBtZXRhTW9kZWxEYXRhID0gKGN1cnJlbnRWaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgYW55KS5nZXREYXRhKCk7XG5cdFx0Y29uc3QgYWN0aW9uUmV0dXJuVHlwZSA9XG5cdFx0XHRtZXRhTW9kZWxEYXRhICYmIG1ldGFNb2RlbERhdGFbYWN0aW9uTmFtZV0gJiYgbWV0YU1vZGVsRGF0YVthY3Rpb25OYW1lXVswXSAmJiBtZXRhTW9kZWxEYXRhW2FjdGlvbk5hbWVdWzBdLiRSZXR1cm5UeXBlXG5cdFx0XHRcdD8gbWV0YU1vZGVsRGF0YVthY3Rpb25OYW1lXVswXS4kUmV0dXJuVHlwZS4kVHlwZVxuXHRcdFx0XHQ6IG51bGw7XG5cdFx0Y29uc3Qga2V5cyA9IGFjdGlvblJldHVyblR5cGUgJiYgbWV0YU1vZGVsRGF0YVthY3Rpb25SZXR1cm5UeXBlXSA/IG1ldGFNb2RlbERhdGFbYWN0aW9uUmV0dXJuVHlwZV0uJEtleSA6IG51bGw7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0b0RhdGE6IHJlc3BvbnNlLmdldE9iamVjdCgpLFxuXHRcdFx0a2V5c1xuXHRcdH07XG5cdH1cblxuXHRnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5hY3Rpb25Qcm9taXNlO1xuXHR9XG5cblx0ZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0dGhpcy5hY3Rpb25Qcm9taXNlID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0X3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyh0YWJsZTogVGFibGUpIHtcblx0XHRjb25zdCByb3dCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0Y29uc3QgYWN0aXZlUm93SW5kZXg6IG51bWJlciA9IHJvd0JpbmRpbmcuZ2V0Q291bnQoKSB8fCAwO1xuXHRcdGlmICh0YWJsZS5kYXRhKFwidGFibGVUeXBlXCIpICE9PSBcIlJlc3BvbnNpdmVUYWJsZVwiKSB7XG5cdFx0XHRpZiAoYWN0aXZlUm93SW5kZXggPiAwKSB7XG5cdFx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgoYWN0aXZlUm93SW5kZXggLSAxKTtcblx0XHRcdH1cblx0XHRcdHRhYmxlLmZvY3VzUm93KGFjdGl2ZVJvd0luZGV4LCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0LyogSW4gYSByZXNwb25zaXZlIHRhYmxlLCB0aGUgZW1wdHkgcm93cyBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGFibGUuIEJ1dCB3aGVuIHdlIGNyZWF0ZSBtb3JlLCB0aGV5IGFwcGVhciBiZWxvdyB0aGUgbmV3IGxpbmUuXG5cdFx0XHQgKiBTbyB3ZSBjaGVjayB0aGUgZmlyc3QgaW5hY3RpdmUgcm93IGZpcnN0LCB0aGVuIHdlIHNldCB0aGUgZm9jdXMgb24gaXQgd2hlbiB3ZSBwcmVzcyB0aGUgYnV0dG9uLlxuXHRcdFx0ICogVGhpcyBkb2Vzbid0IGltcGFjdCB0aGUgR3JpZFRhYmxlIGJlY2F1c2UgdGhleSBhcHBlYXIgYXQgdGhlIGVuZCwgYW5kIHdlIGFscmVhZHkgZm9jdXMgdGhlIGJlZm9yZS10aGUtbGFzdCByb3cgKGJlY2F1c2UgMiBlbXB0eSByb3dzIGV4aXN0KVxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBhbGxSb3dDb250ZXh0cyA9IHJvd0JpbmRpbmcuZ2V0Q29udGV4dHMoKTtcblx0XHRcdGlmICghYWxsUm93Q29udGV4dHM/Lmxlbmd0aCkge1xuXHRcdFx0XHR0YWJsZS5mb2N1c1JvdyhhY3RpdmVSb3dJbmRleCwgdHJ1ZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBmb2N1c1JvdyA9IGFjdGl2ZVJvd0luZGV4LFxuXHRcdFx0XHRpbmRleCA9IDA7XG5cdFx0XHRmb3IgKGNvbnN0IHNpbmdsZUNvbnRleHQgb2YgYWxsUm93Q29udGV4dHMpIHtcblx0XHRcdFx0aWYgKHNpbmdsZUNvbnRleHQuaXNJbmFjdGl2ZSgpICYmIGluZGV4IDwgZm9jdXNSb3cpIHtcblx0XHRcdFx0XHRmb2N1c1JvdyA9IGluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZm9jdXNSb3cgPiAwKSB7XG5cdFx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgoZm9jdXNSb3cpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coZm9jdXNSb3csIHRydWUpO1xuXHRcdH1cblx0fVxuXHRhc3luYyBjcmVhdGVFbXB0eVJvd3NBbmRGb2N1cyh0YWJsZTogVGFibGUpIHtcblx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdGlmIChcblx0XHRcdHRhYmxlQVBJPy50YWJsZURlZmluaXRpb24/LmNvbnRyb2w/LmlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUgJiZcblx0XHRcdCF0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcInVpXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0ZU1vZGVcIilcblx0XHQpIHtcblx0XHRcdC8vIFdpdGggdGhlIHBhcmFtZXRlciwgd2UgZG9uJ3QgaGF2ZSBlbXB0eSByb3dzIGluIEVkaXQgbW9kZSwgc28gd2UgbmVlZCB0byBjcmVhdGUgdGhlbSBiZWZvcmUgc2V0dGluZyB0aGUgZm9jdXMgb24gdGhlbVxuXHRcdFx0YXdhaXQgdGFibGVBUEkuc2V0VXBFbXB0eVJvd3ModGFibGUsIHRydWUpO1xuXHRcdH1cblx0XHR0aGlzLl9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGUpO1xuXHR9XG5cblx0X3NlbmRBY3Rpdml0eShcblx0XHRhY3Rpb246IEFjdGl2aXR5LFxuXHRcdHJlbGF0ZWRDb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSB8IHVuZGVmaW5lZCxcblx0XHRhY3Rpb25OYW1lPzogc3RyaW5nLFxuXHRcdHJlZnJlc2hMaXN0QmluZGluZz86IGJvb2xlYW4sXG5cdFx0YWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcz86IHN0cmluZ1tdXG5cdCkge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBBcnJheS5pc0FycmF5KHJlbGF0ZWRDb250ZXh0cykgPyByZWxhdGVkQ29udGV4dHMubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSkgOiByZWxhdGVkQ29udGV4dHM/LmdldFBhdGgoKTtcblx0XHRBY3Rpdml0eVN5bmMuc2VuZCh0aGlzLmdldFZpZXcoKSwgYWN0aW9uLCBjb250ZW50LCBhY3Rpb25OYW1lLCByZWZyZXNoTGlzdEJpbmRpbmcsIGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMpO1xuXHR9XG5cblx0X3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lOiBzdHJpbmcsIHRyaWdnZXJUeXBlOiBUcmlnZ2VyVHlwZSkge1xuXHRcdHRyaWdnZXJDb25maWd1cmVkU3VydmV5KHRoaXMuZ2V0VmlldygpLCBzQWN0aW9uTmFtZSwgdHJpZ2dlclR5cGUpO1xuXHR9XG5cblx0YXN5bmMgX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIFN1Ym1pdCBhbnkgbGVmdG92ZXIgY2hhbmdlcyB0aGF0IGFyZSBub3QgeWV0IHN1Ym1pdHRlZFxuXHRcdFx0Ly8gQ3VycmVudGx5IHdlIGFyZSB1c2luZyBvbmx5IDEgdXBkYXRlR3JvdXBJZCwgaGVuY2Ugc3VibWl0dGluZyB0aGUgYmF0Y2ggZGlyZWN0bHkgaGVyZVxuXHRcdFx0YXdhaXQgb01vZGVsLnN1Ym1pdEJhdGNoKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIFdhaXQgZm9yIGFsbCBjdXJyZW50bHkgcnVubmluZyBjaGFuZ2VzXG5cdFx0XHQvLyBGb3IgdGhlIHRpbWUgYmVpbmcgd2UgYWdyZWVkIHdpdGggdGhlIHY0IG1vZGVsIHRlYW0gdG8gdXNlIGFuIGludGVybmFsIG1ldGhvZC4gV2UnbGwgcmVwbGFjZSBpdCBvbmNlXG5cdFx0XHQvLyBhIHB1YmxpYyBvciByZXN0cmljdGVkIG1ldGhvZCB3YXMgcHJvdmlkZWRcblx0XHRcdGF3YWl0IG9Nb2RlbC5vUmVxdWVzdG9yLndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMoXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYWxsIGNoYW5nZXMgd2VyZSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5XG5cdFx0XHRpZiAob01vZGVsLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3VibWl0IG9mIG9wZW4gY2hhbmdlcyBmYWlsZWRcIik7XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nKSB7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRpc3BsYXkgYSAnZGlzY2FyZCcgcG9wb3ZlciB3aGVuIGV4aXRpbmcgYSBzdGlja3kgc2Vzc2lvbi5cblx0ICovXG5cdHByaXZhdGUgb25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbigpIHtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgcm91dGVyUHJveHkgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCk7XG5cblx0XHRpZiAocm91dGVyUHJveHkuY2hlY2tJZkJhY2tJc091dE9mR3VhcmQoKSkge1xuXHRcdFx0Y29uc3QgYmluZGluZ0NvbnRleHQgPSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoYmluZGluZ0NvbnRleHQpO1xuXG5cdFx0XHRzdGlja3kucHJvY2Vzc0RhdGFMb3NzQ29uZmlybWF0aW9uKFxuXHRcdFx0XHRhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5kaXNjYXJkU3RpY2t5U2Vzc2lvbihiaW5kaW5nQ29udGV4dCk7XG5cdFx0XHRcdFx0dGhpcy5fcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsKTtcblx0XHRcdFx0XHRoaXN0b3J5LmJhY2soKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dmlldyxcblx0XHRcdFx0cHJvZ3JhbW1pbmdNb2RlbFxuXHRcdFx0KTtcblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRoaXN0b3J5LmJhY2soKTtcblx0fVxuXG5cdGFzeW5jIF9oYW5kbGVOZXdDb250ZXh0KFxuXHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdGJFZGl0YWJsZTogYm9vbGVhbixcblx0XHRiUmVjcmVhdGVDb250ZXh0OiBib29sZWFuLFxuXHRcdGJEcmFmdE5hdmlnYXRpb246IGJvb2xlYW4sXG5cdFx0YkZvcmNlRm9jdXMgPSBmYWxzZVxuXHQpIHtcblx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHR9XG5cblx0XHRhd2FpdCB0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlVG9Db250ZXh0KG9Db250ZXh0LCB7XG5cdFx0XHRjaGVja05vSGFzaENoYW5nZTogdHJ1ZSxcblx0XHRcdGVkaXRhYmxlOiBiRWRpdGFibGUsXG5cdFx0XHRiUGVyc2lzdE9QU2Nyb2xsOiB0cnVlLFxuXHRcdFx0YlJlY3JlYXRlQ29udGV4dDogYlJlY3JlYXRlQ29udGV4dCxcblx0XHRcdGJEcmFmdE5hdmlnYXRpb246IGJEcmFmdE5hdmlnYXRpb24sXG5cdFx0XHRzaG93UGxhY2Vob2xkZXI6IGZhbHNlLFxuXHRcdFx0YkZvcmNlRm9jdXM6IGJGb3JjZUZvY3VzLFxuXHRcdFx0a2VlcEN1cnJlbnRMYXlvdXQ6IHRydWVcblx0XHR9KTtcblx0fVxuXG5cdF9nZXRCb3VuZENvbnRleHQodmlldzogYW55LCBwYXJhbXM6IGFueSkge1xuXHRcdGNvbnN0IHZpZXdMZXZlbCA9IHZpZXcuZ2V0Vmlld0RhdGEoKS52aWV3TGV2ZWw7XG5cdFx0Y29uc3QgYlJlZnJlc2hBZnRlckFjdGlvbiA9IHZpZXdMZXZlbCA+IDEgfHwgKHZpZXdMZXZlbCA9PT0gMSAmJiBwYXJhbXMuY29udHJvbElkKTtcblx0XHRyZXR1cm4gIXBhcmFtcy5pc05hdmlnYWJsZSB8fCAhIWJSZWZyZXNoQWZ0ZXJBY3Rpb247XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZXJlIGFyZSB2YWxpZGF0aW9uIChwYXJzZSkgZXJyb3JzIGZvciBjb250cm9scyBib3VuZCB0byBhIGdpdmVuIGNvbnRleHRcblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnNcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIGlmIHRoZXJlIGFyZSBubyB2YWxpZGF0aW9uIGVycm9ycywgYW5kIHJlamVjdHMgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gZXJyb3JzXG5cdCAqL1xuXG5cdF9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soKS50aGVuKCgpID0+IHtcblx0XHRcdGNvbnN0IHNWaWV3SWQgPSB0aGlzLmdldFZpZXcoKS5nZXRJZCgpO1xuXHRcdFx0Y29uc3QgYU1lc3NhZ2VzID0gc2FwLnVpLmdldENvcmUoKS5nZXRNZXNzYWdlTWFuYWdlcigpLmdldE1lc3NhZ2VNb2RlbCgpLmdldERhdGEoKTtcblx0XHRcdGxldCBvQ29udHJvbDtcblx0XHRcdGxldCBvTWVzc2FnZTtcblxuXHRcdFx0aWYgKCFhTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXCJObyB2YWxpZGF0aW9uIGVycm9ycyBmb3VuZFwiKTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhTWVzc2FnZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0b01lc3NhZ2UgPSBhTWVzc2FnZXNbaV07XG5cdFx0XHRcdGlmIChvTWVzc2FnZS52YWxpZGF0aW9uKSB7XG5cdFx0XHRcdFx0b0NvbnRyb2wgPSBDb3JlLmJ5SWQob01lc3NhZ2UuZ2V0Q29udHJvbElkKCkpO1xuXHRcdFx0XHRcdHdoaWxlIChvQ29udHJvbCkge1xuXHRcdFx0XHRcdFx0aWYgKG9Db250cm9sLmdldElkKCkgPT09IHNWaWV3SWQpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KFwidmFsaWRhdGlvbiBlcnJvcnMgZXhpc3RcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvQ29udHJvbCA9IG9Db250cm9sLmdldFBhcmVudCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfcmVmcmVzaExpc3RJZlJlcXVpcmVkXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb1Jlc3BvbnNlIFRoZSByZXNwb25zZSBvZiB0aGUgYm91bmQgYWN0aW9uIGFuZCB0aGUgbmFtZXMgb2YgdGhlIGtleSBmaWVsZHNcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBib3VuZCBjb250ZXh0IG9uIHdoaWNoIHRoZSBhY3Rpb24gd2FzIGV4ZWN1dGVkXG5cdCAqIEByZXR1cm5zIEFsd2F5cyByZXNvbHZlcyB0byBwYXJhbSBvUmVzcG9uc2Vcblx0ICovXG5cdF9yZWZyZXNoTGlzdElmUmVxdWlyZWQob1Jlc3BvbnNlOiBhbnksIG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxib29sZWFuIHwgdW5kZWZpbmVkPiB7XG5cdFx0aWYgKCFvQ29udGV4dCB8fCAhb1Jlc3BvbnNlIHx8ICFvUmVzcG9uc2Uub0RhdGEpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0XHR9XG5cdFx0Y29uc3Qgb0JpbmRpbmcgPSBvQ29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0Ly8gcmVmcmVzaCBvbmx5IGxpc3RzXG5cdFx0aWYgKG9CaW5kaW5nICYmIG9CaW5kaW5nLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvUmVzcG9uc2Uub0RhdGE7XG5cdFx0XHRjb25zdCBhS2V5cyA9IG9SZXNwb25zZS5rZXlzO1xuXHRcdFx0Y29uc3Qgb0N1cnJlbnREYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRsZXQgYlJldHVybmVkQ29udGV4dElzU2FtZSA9IHRydWU7XG5cdFx0XHQvLyBlbnN1cmUgY29udGV4dCBpcyBpbiB0aGUgcmVzcG9uc2Vcblx0XHRcdGlmIChPYmplY3Qua2V5cyhvQ29udGV4dERhdGEpLmxlbmd0aCkge1xuXHRcdFx0XHQvLyBjaGVjayBpZiBjb250ZXh0IGluIHJlc3BvbnNlIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBib3VuZCBjb250ZXh0XG5cdFx0XHRcdGJSZXR1cm5lZENvbnRleHRJc1NhbWUgPSBhS2V5cy5ldmVyeShmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9DdXJyZW50RGF0YVtzS2V5XSA9PT0gb0NvbnRleHREYXRhW3NLZXldO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKCFiUmV0dXJuZWRDb250ZXh0SXNTYW1lKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoKG9CaW5kaW5nIGFzIGFueSkuaXNSb290KCkpIHtcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCFiUmV0dXJuZWRDb250ZXh0SXNTYW1lKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50XG5cdFx0XHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhbeyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogb0JpbmRpbmcuZ2V0UGF0aCgpIH1dLCBvQmluZGluZy5nZXRDb250ZXh0KCkgYXMgQ29udGV4dClcblx0XHRcdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSghYlJldHVybmVkQ29udGV4dElzU2FtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0YWJsZVwiKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSghYlJldHVybmVkQ29udGV4dElzU2FtZSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0YWJsZVwiLCBlKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyByZXNvbHZlIHdpdGggb1Jlc3BvbnNlIHRvIG5vdCBkaXN0dXJiIHRoZSBwcm9taXNlIGNoYWluIGFmdGVyd2FyZHNcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdH1cblxuXHRfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgYW55LFxuXHRcdFx0c0VudGl0eVNldE5hbWUgPSBvTWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KG9Db250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIiksXG5cdFx0XHRhU2VtYW50aWNLZXlzID0gU2VtYW50aWNLZXlIZWxwZXIuZ2V0U2VtYW50aWNLZXlzKG9NZXRhTW9kZWwsIHNFbnRpdHlTZXROYW1lKTtcblxuXHRcdGlmIChhU2VtYW50aWNLZXlzICYmIGFTZW1hbnRpY0tleXMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBhUmVxdWVzdFByb21pc2VzID0gYVNlbWFudGljS2V5cy5tYXAoZnVuY3Rpb24gKG9LZXk6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0NvbnRleHQucmVxdWVzdE9iamVjdChvS2V5LiRQcm9wZXJ0eVBhdGgpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChhUmVxdWVzdFByb21pc2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBQcm92aWRlcyB0aGUgbGF0ZXN0IGNvbnRleHQgaW4gdGhlIG1ldGFkYXRhIGhpZXJhcmNoeSBmcm9tIHJvb3RCaW5kaW5nIHRvIGdpdmVuIGNvbnRleHQgcG9pbnRpbmcgdG8gZ2l2ZW4gZW50aXR5VHlwZVxuXHQgKiBpZiBhbnkgc3VjaCBjb250ZXh0IGV4aXN0cy4gT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHRoZSBvcmlnaW5hbCBjb250ZXh0LlxuXHQgKiBOb3RlOiBJdCBpcyBvbmx5IG5lZWRlZCBhcyB3b3JrLWFyb3VuZCBmb3IgaW5jb3JyZWN0IG1vZGVsbGluZy4gQ29ycmVjdCBtb2RlbGxpbmcgd291bGQgaW1wbHkgYSBEYXRhRmllbGRGb3JBY3Rpb24gaW4gYSBMaW5lSXRlbVxuXHQgKiB0byBwb2ludCB0byBhbiBvdmVybG9hZCBkZWZpbmVkIGVpdGhlciBvbiB0aGUgY29ycmVzcG9uZGluZyBFbnRpdHlUeXBlIG9yIGEgY29sbGVjdGlvbiBvZiB0aGUgc2FtZS5cblx0ICpcblx0ICogQHBhcmFtIHJvb3RDb250ZXh0IFRoZSBjb250ZXh0IHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdEJpbmRpbmcgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBvdmVybG9hZEVudGl0eVR5cGUgVGhlIEFjdGlvbk92ZXJsb2FkIGVudGl0eSB0eXBlIHRvIHNlYXJjaCBmb3Jcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgQWN0aW9uT3ZlcmxvYWQgZW50aXR5XG5cdCAqL1xuXHRfZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbU1ldGFkYXRhUGF0aChyb290Q29udGV4dDogQ29udGV4dCwgbGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsIG92ZXJsb2FkRW50aXR5VHlwZTogc3RyaW5nKTogQ29udGV4dCB7XG5cdFx0Y29uc3QgbW9kZWw6IE9EYXRhTW9kZWwgPSByb290Q29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBtb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgY29udGV4dFNlZ21lbnRzOiBzdHJpbmdbXSA9IGxpc3RCaW5kaW5nLmdldFBhdGgoKS5zcGxpdChcIi9cIik7XG5cdFx0bGV0IGN1cnJlbnRDb250ZXh0OiBDb250ZXh0ID0gcm9vdENvbnRleHQ7XG5cblx0XHQvLyBXZSBleHBlY3QgdGhhdCB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBsaXN0QmluZGluZyBpcyB0aGUgTGlzdEJpbmRpbmcgb2YgdGhlIHRhYmxlLiBSZW1vdmUgdGhpcyBmcm9tIGNvbnRleHRTZWdtZW50c1xuXHRcdC8vIGJlY2F1c2UgaXQgaXMgaW5jb3JyZWN0IHRvIGV4ZWN1dGUgYmluZENvbnRleHQgb24gYSBsaXN0LiBXZSBkbyBub3QgYW55d2F5IG5lZWQgdG8gc2VhcmNoIHRoaXMgY29udGV4dCBmb3IgdGhlIG92ZXJsb2FkLlxuXHRcdGNvbnRleHRTZWdtZW50cy5wb3AoKTtcblx0XHRpZiAoY29udGV4dFNlZ21lbnRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Y29udGV4dFNlZ21lbnRzID0gW1wiXCJdOyAvLyBEb24ndCBsZWF2ZSBjb250ZXh0U2VnbWVudHMgdW5kZWZpbmVkXG5cdFx0fVxuXG5cdFx0aWYgKGNvbnRleHRTZWdtZW50c1swXSAhPT0gXCJcIikge1xuXHRcdFx0Y29udGV4dFNlZ21lbnRzLnVuc2hpZnQoXCJcIik7IC8vIHRvIGFsc28gZ2V0IHRoZSByb290IGNvbnRleHQsIGkuZS4gdGhlIGJpbmRpbmdDb250ZXh0IG9mIHRoZSB0YWJsZVxuXHRcdH1cblx0XHQvLyBsb2FkIGFsbCB0aGUgcGFyZW50IGNvbnRleHRzIGludG8gYW4gYXJyYXlcblx0XHRjb25zdCBwYXJlbnRDb250ZXh0czogQ29udGV4dFtdID0gY29udGV4dFNlZ21lbnRzXG5cdFx0XHQubWFwKChwYXRoU2VnbWVudDogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdGlmIChwYXRoU2VnbWVudCAhPT0gXCJcIikge1xuXHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQocGF0aFNlZ21lbnQsIGN1cnJlbnRDb250ZXh0KS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBDcmVhdGluZyBhIG5ldyBjb250ZXh0IHVzaW5nIGJpbmRDb250ZXh0KC4uLikuZ2V0Qm91bmRDb250ZXh0KCkgZG9lcyBub3Qgd29yayBpZiB0aGUgZXRhZyBpcyBuZWVkZWQuIEFjY29yZGluZyB0byBtb2RlbCBjb2xsZWFndWVzLFxuXHRcdFx0XHRcdC8vIHdlIHNob3VsZCBhbHdheXMgdXNlIGFuIGV4aXN0aW5nIGNvbnRleHQgaWYgcG9zc2libGUuXG5cdFx0XHRcdFx0Ly8gQ3VycmVudGx5LCB0aGUgb25seSBleGFtcGxlIHdlIGtub3cgYWJvdXQgaXMgdXNpbmcgdGhlIHJvb3RDb250ZXh0IC0gYW5kIGluIHRoaXMgY2FzZSwgd2UgY2FuIG9idmlvdXNseSByZXVzZSB0aGF0IGV4aXN0aW5nIGNvbnRleHQuXG5cdFx0XHRcdFx0Ly8gSWYgb3RoZXIgZXhhbXBsZXMgc2hvdWxkIGNvbWUgdXAsIHRoZSBiZXN0IHBvc3NpYmxlIHdvcmsgYXJvdW5kIHdvdWxkIGJlIHRvIHJlcXVlc3Qgc29tZSBkYXRhIHRvIGdldCBhbiBleGlzdGluZyBjb250ZXh0LiBUbyBrZWVwIHRoZVxuXHRcdFx0XHRcdC8vIHJlcXVlc3QgYXMgc21hbGwgYW5kIGZhc3QgYXMgcG9zc2libGUsIHdlIHNob3VsZCByZXF1ZXN0IG9ubHkgdGhlIGZpcnN0IGtleSBwcm9wZXJ0eS4gQXMgdGhpcyB3b3VsZCBpbnRyb2R1Y2UgYXN5bmNocm9uaXNtLCBhbmQgYW55d2F5XG5cdFx0XHRcdFx0Ly8gdGhlIHdob2xlIGxvZ2ljIGlzIG9ubHkgcGFydCBvZiB3b3JrLWFyb3VuZCBmb3IgaW5jb3JyZWN0IG1vZGVsbGluZywgd2Ugd2FpdCB1bnRpbCB3ZSBoYXZlIGFuIGV4YW1wbGUgbmVlZGluZyBpdCBiZWZvcmUgaW1wbGVtZW50aW5nIHRoaXMuXG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQgPSByb290Q29udGV4dDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gY3VycmVudENvbnRleHQ7XG5cdFx0XHR9KVxuXHRcdFx0LnJldmVyc2UoKTtcblx0XHQvLyBzZWFyY2ggZm9yIGNvbnRleHQgYmFja3dhcmRzXG5cdFx0Y29uc3Qgb3ZlcmxvYWRDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkID0gcGFyZW50Q29udGV4dHMuZmluZChcblx0XHRcdChwYXJlbnRDb250ZXh0OiBDb250ZXh0KSA9PlxuXHRcdFx0XHQobWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KHBhcmVudENvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCIkVHlwZVwiKSBhcyB1bmtub3duIGFzIHN0cmluZykgPT09IG92ZXJsb2FkRW50aXR5VHlwZVxuXHRcdCk7XG5cdFx0cmV0dXJuIG92ZXJsb2FkQ29udGV4dCB8fCBsaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhO1xuXHR9XG5cblx0X2NyZWF0ZVNpYmxpbmdJbmZvKGN1cnJlbnRDb250ZXh0OiBDb250ZXh0LCBuZXdDb250ZXh0OiBDb250ZXh0KTogU2libGluZ0luZm9ybWF0aW9uIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFyZ2V0Q29udGV4dDogbmV3Q29udGV4dCxcblx0XHRcdHBhdGhNYXBwaW5nOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRvbGRQYXRoOiBjdXJyZW50Q29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRcdFx0bmV3UGF0aDogbmV3Q29udGV4dC5nZXRQYXRoKClcblx0XHRcdFx0fVxuXHRcdFx0XVxuXHRcdH07XG5cdH1cblxuXHRfdXBkYXRlUGF0aHNJbkhpc3RvcnkobWFwcGluZ3M6IHsgb2xkUGF0aDogc3RyaW5nOyBuZXdQYXRoOiBzdHJpbmcgfVtdKSB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldFBhdGhNYXBwaW5nKG1hcHBpbmdzKTtcblxuXHRcdC8vIEFsc28gdXBkYXRlIHRoZSBzZW1hbnRpYyBtYXBwaW5nIGluIHRoZSByb3V0aW5nIHNlcnZpY2Vcblx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0aWYgKG1hcHBpbmdzLmxlbmd0aCAmJiBsYXN0U2VtYW50aWNNYXBwaW5nPy50ZWNobmljYWxQYXRoID09PSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5vbGRQYXRoKSB7XG5cdFx0XHRsYXN0U2VtYW50aWNNYXBwaW5nLnRlY2huaWNhbFBhdGggPSBtYXBwaW5nc1ttYXBwaW5ncy5sZW5ndGggLSAxXS5uZXdQYXRoO1xuXHRcdH1cblx0fVxuXG5cdF9nZXROYXZpZ2F0aW9uVGFyZ2V0Rm9yRWRpdChjb250ZXh0OiBDb250ZXh0LCBuZXdEb2N1bWVudENvbnRleHQ6IENvbnRleHQsIHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQpIHtcblx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGU6IENvbnRleHQgfCB1bmRlZmluZWQ7XG5cdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhjb250ZXh0LCBuZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT0gbmV3RG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdH1cblx0XHRyZXR1cm4gY29udGV4dFRvTmF2aWdhdGU7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHNpYmxpbmcgY29udGV4dCBmb3IgYSBzdWJvYmplY3QgcGFnZSwgYW5kIGNhbGN1bGF0ZXMgYSBzaWJsaW5nIHBhdGhcblx0ICogZm9yIGFsbCBpbnRlcm1lZGlhdGUgcGF0aHMgYmV0d2VlbiB0aGUgb2JqZWN0IHBhZ2UgYW5kIHRoZSBzdWJvYmplY3QgcGFnZS5cblx0ICpcblx0ICogQHBhcmFtIHJvb3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHJvb3Qgb2YgdGhlIGRyYWZ0XG5cdCAqIEBwYXJhbSByaWdodG1vc3RDdXJyZW50Q29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgc3Vib2JqZWN0XG5cdCAqIEBwYXJhbSBzUHJvZ3JhbW1pbmdNb2RlbCBUaGUgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICogQHBhcmFtIGRvTm90Q29tcHV0ZUlmUm9vdCBJZiB0cnVlLCB3ZSBkb24ndCBjb21wdXRlIHNpYmxpbmdJbmZvIGlmIHRoZSByb290IGFuZCB0aGUgcmlnaHRtb3N0IGNvbnRleHRzIGFyZSB0aGUgc2FtZVxuXHQgKiBAcGFyYW0gcm9vdENvbnRleHRJbmZvIFRoZSByb290IGNvbnRleHQgaW5mb3JtYXRpb24gb2Ygcm9vdCBvZiB0aGUgZHJhZnRcblx0ICogQHJldHVybnMgUmV0dXJucyB0aGUgc2libGluZ0luZm9ybWF0aW9uIG9iamVjdFxuXHQgKi9cblx0YXN5bmMgX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0cm9vdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0LFxuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0OiBDb250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZCxcblx0XHRzUHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nLFxuXHRcdGRvTm90Q29tcHV0ZUlmUm9vdDogYm9vbGVhbixcblx0XHRyb290Q29udGV4dEluZm8/OiBSb290Q29udGV4dEluZm9cblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID8/IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGlmIChkb05vdENvbXB1dGVJZlJvb3QgJiYgcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpID09PSByb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKHJvb3RDdXJyZW50Q29udGV4dCwgcmlnaHRtb3N0Q3VycmVudENvbnRleHQsIHJvb3RDb250ZXh0SW5mbyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIElmIG5vdCBpbiBkcmFmdCBtb2RlLCB3ZSBqdXN0IHJlY3JlYXRlIGEgY29udGV4dCBmcm9tIHRoZSBwYXRoIG9mIHRoZSByaWdodG1vc3QgY29udGV4dFxuXHRcdFx0Ly8gTm8gcGF0aCBtYXBwaW5nIGlzIG5lZWRlZFxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dGFyZ2V0Q29udGV4dDogbW9kZWwuYmluZENvbnRleHQocmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKS5nZXRCb3VuZENvbnRleHQoKSxcblx0XHRcdFx0cGF0aE1hcHBpbmc6IFtdXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdF9pc0ZjbEVuYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVkaXRGbG93O1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFpREEsTUFBTUEsWUFBWSxHQUFHQyxTQUFTLENBQUNELFlBQVk7SUFDMUNFLGdCQUFnQixHQUFHRCxTQUFTLENBQUNDLGdCQUFnQjtJQUM3Q0MsU0FBUyxHQUFHRixTQUFTLENBQUNFLFNBQVM7SUFDL0JDLFdBQVcsR0FBR0gsU0FBUyxDQUFDRyxXQUFXO0lBQ25DQyxRQUFRLEdBQUdK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
|