@sapui5/sap.fe.core 1.113.0 → 1.115.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 +68 -5
- 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 +120 -4
- package/src/sap/fe/core/AppComponent-dbg.js +8 -2
- 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 +19 -3
- package/src/sap/fe/core/AppStateHandler-dbg.js +14 -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 +17 -11
- package/src/sap/fe/core/BaseController-dbg.js +1 -1
- package/src/sap/fe/core/BaseController.ts +13 -2
- package/src/sap/fe/core/CommonUtils-dbg.js +74 -317
- 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 +96 -473
- package/src/sap/fe/core/ExtensionAPI-dbg.js +1 -1
- package/src/sap/fe/core/ExtensionAPI.ts +2 -2
- package/src/sap/fe/core/StateFilterToSelectionVariant-dbg.js +263 -0
- package/src/sap/fe/core/StateFilterToSelectionVariant.js +6 -0
- package/src/sap/fe/core/StateFilterToSelectionVariant.js.map +1 -0
- package/src/sap/fe/core/StateFilterToSelectionVariant.ts +316 -0
- package/src/sap/fe/core/TemplateComponent-dbg.js +1 -1
- package/src/sap/fe/core/TemplateComponent.ts +6 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase-dbg.js +10 -3
- 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 +8 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport-dbg.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockSupport.ts +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor-dbg.js +8 -8
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.js.map +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockTemplateProcessor.ts +7 -7
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment-dbg.js +1 -1
- package/src/sap/fe/core/buildingBlocks/RuntimeBuildingBlockFragment.ts +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +68 -36
- 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 +83 -43
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +12 -11
- 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 +17 -21
- package/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +233 -133
- 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 +260 -145
- package/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +1 -1
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +3 -3
- package/src/sap/fe/core/controllerextensions/Routing-dbg.js +5 -3
- package/src/sap/fe/core/controllerextensions/Routing.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/Routing.ts +5 -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 +25 -18
- package/src/sap/fe/core/controllerextensions/ViewState-dbg.js +40 -26
- 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 +59 -33
- 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 +23 -25
- 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/editFlow/NotApplicableContextDialog-dbg.js +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.js.map +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/NotApplicableContextDialog.tsx +7 -3
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +73 -90
- 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 +88 -101
- package/src/sap/fe/core/controllerextensions/editFlow/draft-dbg.js +26 -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 +29 -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/facade-dbg.js +64 -4
- 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 +91 -8
- package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +2 -4
- 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 +3 -5
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +9 -9
- 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 +8 -8
- 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/adapter/SelectionVariantToStateFilters-dbg.js +435 -0
- package/src/sap/fe/core/controls/filterbar/adapter/SelectionVariantToStateFilters.js +6 -0
- package/src/sap/fe/core/controls/filterbar/adapter/SelectionVariantToStateFilters.js.map +1 -0
- package/src/sap/fe/core/controls/filterbar/adapter/SelectionVariantToStateFilters.ts +532 -0
- 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/ManifestSettings-dbg.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +7 -5
- package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +36 -4
- 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 +45 -4
- 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 +18 -3
- 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 +18 -2
- package/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +679 -676
- 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/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/Table-dbg.js +100 -72
- 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 +146 -99
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +37 -10
- 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 +49 -16
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +47 -18
- 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 +74 -20
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters-dbg.js +26 -9
- 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 +24 -8
- package/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +28 -2
- 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 +28 -9
- 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/templates/ListReportConverter-dbg.js +13 -15
- 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 +18 -54
- package/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +12 -12
- 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 +16 -11
- 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/ValueFormatter-dbg.js +5 -11
- 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 +4 -25
- package/src/sap/fe/core/fpm/Component-dbg.js +3 -1
- package/src/sap/fe/core/fpm/Component.js +1 -1
- package/src/sap/fe/core/fpm/Component.js.map +1 -1
- package/src/sap/fe/core/fpm/Component.ts +3 -1
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +74 -26
- 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 +116 -33
- package/src/sap/fe/core/helpers/DeleteHelper-dbg.js +82 -37
- 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 +109 -56
- package/src/sap/fe/core/helpers/KeepAliveHelper-dbg.js +1 -1
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +7 -5
- package/src/sap/fe/core/helpers/MassEditHelper-dbg.js +13 -3
- 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 +28 -18
- package/src/sap/fe/core/helpers/MessageStrip-dbg.js +1 -1
- package/src/sap/fe/core/helpers/MessageStrip.ts +2 -1
- package/src/sap/fe/core/helpers/ModelHelper-dbg.js +1 -1
- package/src/sap/fe/core/helpers/ModelHelper.ts +3 -3
- 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 +5 -2
- 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 +5 -0
- package/src/sap/fe/core/helpers/StableIdHelper-dbg.js +24 -2
- 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 +23 -1
- package/src/sap/fe/core/helpers/TitleHelper-dbg.js +239 -0
- package/src/sap/fe/core/helpers/TitleHelper.js +6 -0
- package/src/sap/fe/core/helpers/TitleHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/TitleHelper.ts +295 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader-dbg.js +4 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +1 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js.map +1 -1
- package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +3 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control-dbg.js +41 -17
- 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 +45 -21
- 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/jsx-runtime/useMDXComponents-dbg.js +8 -4
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js.map +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +7 -2
- package/src/sap/fe/core/library-dbg.js +4 -3
- package/src/sap/fe/core/library-preload.js +91 -74
- package/src/sap/fe/core/library-preload.js.map +1 -1
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/library.js.map +1 -1
- package/src/sap/fe/core/library.ts +1 -1
- package/src/sap/fe/core/manifest.json +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration-dbg.js +4 -3
- 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 +3 -2
- package/src/sap/fe/core/messagebundle.properties +12 -8
- package/src/sap/fe/core/messagebundle_ar.properties +7 -5
- package/src/sap/fe/core/messagebundle_bg.properties +7 -5
- package/src/sap/fe/core/messagebundle_ca.properties +7 -5
- package/src/sap/fe/core/messagebundle_cs.properties +7 -5
- package/src/sap/fe/core/messagebundle_cy.properties +7 -5
- package/src/sap/fe/core/messagebundle_da.properties +7 -5
- package/src/sap/fe/core/messagebundle_de.properties +7 -5
- package/src/sap/fe/core/messagebundle_el.properties +7 -5
- package/src/sap/fe/core/messagebundle_en.properties +7 -5
- package/src/sap/fe/core/messagebundle_en_GB.properties +6 -4
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +7 -4
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +6 -4
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +7 -4
- package/src/sap/fe/core/messagebundle_es.properties +7 -5
- package/src/sap/fe/core/messagebundle_es_MX.properties +7 -5
- package/src/sap/fe/core/messagebundle_et.properties +7 -5
- package/src/sap/fe/core/messagebundle_fi.properties +7 -5
- package/src/sap/fe/core/messagebundle_fr.properties +7 -5
- package/src/sap/fe/core/messagebundle_fr_CA.properties +8 -6
- package/src/sap/fe/core/messagebundle_hi.properties +7 -5
- package/src/sap/fe/core/messagebundle_hr.properties +7 -5
- package/src/sap/fe/core/messagebundle_hu.properties +7 -5
- package/src/sap/fe/core/messagebundle_id.properties +7 -5
- package/src/sap/fe/core/messagebundle_it.properties +8 -6
- package/src/sap/fe/core/messagebundle_iw.properties +7 -5
- package/src/sap/fe/core/messagebundle_ja.properties +7 -5
- package/src/sap/fe/core/messagebundle_kk.properties +7 -5
- package/src/sap/fe/core/messagebundle_ko.properties +7 -5
- package/src/sap/fe/core/messagebundle_lt.properties +7 -5
- package/src/sap/fe/core/messagebundle_lv.properties +7 -5
- package/src/sap/fe/core/messagebundle_ms.properties +7 -5
- package/src/sap/fe/core/messagebundle_nl.properties +7 -5
- package/src/sap/fe/core/messagebundle_no.properties +7 -5
- package/src/sap/fe/core/messagebundle_pl.properties +7 -5
- package/src/sap/fe/core/messagebundle_pt.properties +7 -5
- package/src/sap/fe/core/messagebundle_pt_PT.properties +7 -5
- package/src/sap/fe/core/messagebundle_ro.properties +7 -5
- package/src/sap/fe/core/messagebundle_ru.properties +7 -5
- package/src/sap/fe/core/messagebundle_sh.properties +7 -5
- package/src/sap/fe/core/messagebundle_sk.properties +7 -5
- package/src/sap/fe/core/messagebundle_sl.properties +7 -5
- package/src/sap/fe/core/messagebundle_sv.properties +7 -5
- package/src/sap/fe/core/messagebundle_th.properties +7 -5
- package/src/sap/fe/core/messagebundle_tr.properties +7 -5
- package/src/sap/fe/core/messagebundle_uk.properties +7 -5
- package/src/sap/fe/core/messagebundle_vi.properties +7 -5
- package/src/sap/fe/core/messagebundle_zh_CN.properties +7 -5
- package/src/sap/fe/core/messagebundle_zh_TW.properties +7 -5
- package/src/sap/fe/core/operationsHelper-dbg.js +1 -1
- package/src/sap/fe/core/operationsHelper.ts +1 -1
- package/src/sap/fe/core/rootView/Fcl-dbg.controller.js +8 -2
- package/src/sap/fe/core/rootView/Fcl.controller.js +1 -1
- package/src/sap/fe/core/rootView/Fcl.controller.js.map +1 -1
- package/src/sap/fe/core/rootView/Fcl.controller.ts +8 -1
- package/src/sap/fe/core/rootView/NavContainer-dbg.controller.js +8 -2
- package/src/sap/fe/core/rootView/NavContainer.controller.js +1 -1
- package/src/sap/fe/core/rootView/NavContainer.controller.js.map +1 -1
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +10 -3
- package/src/sap/fe/core/rootView/RootViewBaseController-dbg.js +16 -6
- 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 +10 -4
- package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +54 -5
- 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 +52 -6
- package/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +31 -14
- 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 +15 -1
- package/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +10 -4
- package/src/sap/fe/core/services/RoutingServiceFactory.js +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +29 -7
- package/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +5 -2
- 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 +9 -5
- package/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +1 -2
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js.map +1 -1
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +2 -18
- package/src/sap/fe/core/templating/CommonFormatters-dbg.js +8 -8
- package/src/sap/fe/core/templating/CommonFormatters.js.map +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.ts +9 -9
- 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/DataFieldFormatters-dbg.js +38 -2
- package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
- package/src/sap/fe/core/templating/DataFieldFormatters.js.map +1 -1
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +40 -0
- package/src/sap/fe/core/templating/FieldControlHelper-dbg.js +5 -6
- package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
- package/src/sap/fe/core/templating/FieldControlHelper.js.map +1 -1
- package/src/sap/fe/core/templating/FieldControlHelper.ts +13 -11
- package/src/sap/fe/core/templating/FilterHelper-dbg.js +13 -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 +13 -1
- package/src/sap/fe/core/templating/PropertyHelper-dbg.js +1 -1
- package/src/sap/fe/core/templating/PropertyHelper.ts +7 -7
- package/src/sap/fe/core/templating/UIFormatters-dbg.js +5 -6
- 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 +6 -7
- package/src/sap/fe/core/type/TypeUtil-dbg.js +2 -2
- package/src/sap/fe/core/type/TypeUtil.js +1 -1
- package/src/sap/fe/core/type/TypeUtil.js.map +1 -1
- package/src/sap/fe/core/type/TypeUtil.ts +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/Manage-dbg.js +0 -243
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +0 -6
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js.map +0 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +0 -283
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +0 -121
- package/src/sap/fe/core/controllerextensions/collaboration/UserDetails.fragment.xml +0 -11
- 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
|
@@ -5,7 +5,7 @@
|
|
|
5
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;
|
|
@@ -75,17 +75,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
75
75
|
const oViewData = this.getView().getViewData();
|
|
76
76
|
const sProgrammingModel = this.getProgrammingModel(oContext);
|
|
77
77
|
let oRootContext = oContext;
|
|
78
|
-
const oView = this.getView();
|
|
78
|
+
const oView = this.base.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
|
}
|
|
@@ -301,7 +302,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
301
302
|
// TODO: Call appropriate function (currently using the same as for outbound chevron nav, and without any context - 3rd param)
|
|
302
303
|
await this.syncTask();
|
|
303
304
|
const oController = this.getView().getController();
|
|
304
|
-
const sCreatePath = ModelHelper.getAbsoluteMetaPathForListBinding(this.getView(), vListBinding);
|
|
305
|
+
const sCreatePath = ModelHelper.getAbsoluteMetaPathForListBinding(this.base.getView(), vListBinding);
|
|
305
306
|
oController.handlers.onChevronPressNavigateOutBound(oController, mParameters.outbound, undefined, sCreatePath);
|
|
306
307
|
return;
|
|
307
308
|
}
|
|
@@ -638,17 +639,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
638
639
|
*
|
|
639
640
|
* @param listBinding The listBinding used to create the documents
|
|
640
641
|
* @param dataForCreate The initial data for the new documents
|
|
641
|
-
* @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
|
|
642
643
|
* @param isFromCopyPaste True if the creation has been triggered by a paste action
|
|
643
644
|
* @param beforeCreateCallBack Callback to be called before the creation
|
|
644
|
-
* @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
|
|
645
647
|
* @returns A Promise with the newly created contexts.
|
|
646
648
|
*/;
|
|
647
649
|
_proto.createMultipleDocuments = async function createMultipleDocuments(listBinding, dataForCreate, createAtEnd, isFromCopyPaste, beforeCreateCallBack) {
|
|
648
650
|
let createAsInactive = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
|
|
651
|
+
let requestSideEffects = arguments.length > 6 ? arguments[6] : undefined;
|
|
649
652
|
const transactionHelper = this.getTransactionHelper();
|
|
650
653
|
const lockObject = this.getGlobalUIModel();
|
|
651
654
|
const targetListBinding = listBinding;
|
|
655
|
+
requestSideEffects = requestSideEffects !== false;
|
|
652
656
|
BusyLocker.lock(lockObject);
|
|
653
657
|
try {
|
|
654
658
|
await this.syncTask();
|
|
@@ -702,7 +706,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
702
706
|
// if there are transient contexts, we must avoid requesting side effects
|
|
703
707
|
// this is avoid a potential list refresh, there could be a side effect that refreshes the list binding
|
|
704
708
|
// if list binding is refreshed, transient contexts might be lost
|
|
705
|
-
if (!CommonUtils.hasTransientContext(targetListBinding)) {
|
|
709
|
+
if (requestSideEffects && !CommonUtils.hasTransientContext(targetListBinding)) {
|
|
706
710
|
this.getAppComponent().getSideEffectsService().requestSideEffectsForNavigationProperty(targetListBinding.getPath(), viewBindingContext);
|
|
707
711
|
}
|
|
708
712
|
return createdContexts;
|
|
@@ -845,6 +849,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
845
849
|
const aBindings = mParameters.bindings;
|
|
846
850
|
try {
|
|
847
851
|
await this.syncTask();
|
|
852
|
+
// in case of saving / activating the bound transition messages shall be removed before the PATCH/POST
|
|
853
|
+
// is sent to the backend
|
|
854
|
+
this.getMessageHandler().removeTransitionMessages();
|
|
848
855
|
await this._submitOpenChanges(oContext);
|
|
849
856
|
await this._checkForValidationErrors();
|
|
850
857
|
await this.base.editFlow.onBeforeSave({
|
|
@@ -972,6 +979,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
972
979
|
siblingInfo = await this._computeSiblingInformation(oContext, oRootViewController.getRightmostContext(), sProgrammingModel, true);
|
|
973
980
|
}
|
|
974
981
|
const cancelResult = await transactionHelper.cancelDocument(oContext, mInParameters, this.getAppComponent(), this._getResourceModel(), this.getMessageHandler(), this.getCreationMode(), this.isDocumentModified());
|
|
982
|
+
this._getRootViewController().getInstancedViews().forEach(view => {
|
|
983
|
+
const context = view.getBindingContext();
|
|
984
|
+
if (context && context.isKeepAlive()) {
|
|
985
|
+
context.setKeepAlive(false);
|
|
986
|
+
}
|
|
987
|
+
});
|
|
975
988
|
const bDraftNavigation = true;
|
|
976
989
|
this._removeStickySessionInternalProperties(sProgrammingModel);
|
|
977
990
|
this.setEditMode(EditMode.Display, false);
|
|
@@ -1017,7 +1030,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1017
1030
|
await this._handleNewContext(contextToNavigate, false, false, bDraftNavigation, true);
|
|
1018
1031
|
}
|
|
1019
1032
|
}
|
|
1020
|
-
|
|
1033
|
+
if (sProgrammingModel === ProgrammingModel.Draft) {
|
|
1034
|
+
//show Draft discarded message toast only for draft enabled apps
|
|
1035
|
+
this.showDocumentDiscardMessage(isNewDocument);
|
|
1036
|
+
}
|
|
1021
1037
|
} catch (oError) {
|
|
1022
1038
|
Log.error("Error while discarding the document", oError);
|
|
1023
1039
|
}
|
|
@@ -1026,7 +1042,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1026
1042
|
/**
|
|
1027
1043
|
* Brings up a message toast when a draft is discarded.
|
|
1028
1044
|
*
|
|
1029
|
-
* @param isNewDocument This is a Boolean flag that determines whether the document is new or
|
|
1045
|
+
* @param isNewDocument This is a Boolean flag that determines whether the document is new or already exists.
|
|
1030
1046
|
*/;
|
|
1031
1047
|
_proto.showDocumentDiscardMessage = function showDocumentDiscardMessage(isNewDocument) {
|
|
1032
1048
|
const resourceModel = this._getResourceModel();
|
|
@@ -1144,10 +1160,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1144
1160
|
*/;
|
|
1145
1161
|
_proto.applyDocument = async function applyDocument(oContext) {
|
|
1146
1162
|
const oLockObject = this.getGlobalUIModel();
|
|
1147
|
-
BusyLocker.lock(oLockObject);
|
|
1148
1163
|
try {
|
|
1149
1164
|
await this.syncTask();
|
|
1150
|
-
|
|
1165
|
+
if (oContext.getModel().hasPendingChanges("$auto")) {
|
|
1166
|
+
BusyLocker.lock(oLockObject);
|
|
1167
|
+
await this._submitOpenChanges(oContext);
|
|
1168
|
+
}
|
|
1151
1169
|
await this._checkForValidationErrors();
|
|
1152
1170
|
await this.getMessageHandler().showMessageDialog();
|
|
1153
1171
|
await this.getInternalRouting().navigateBackFromContext(oContext);
|
|
@@ -1192,7 +1210,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1192
1210
|
let aParts;
|
|
1193
1211
|
let sOverloadEntityType;
|
|
1194
1212
|
let oCurrentActionCallBacks;
|
|
1195
|
-
const oView = this.getView();
|
|
1213
|
+
const oView = this.base.getView();
|
|
1196
1214
|
let mParameters = mInParameters || {};
|
|
1197
1215
|
// Due to a mistake the invokeAction in the extensionAPI had a different API than this one.
|
|
1198
1216
|
// The one from the extensionAPI doesn't exist anymore as we expose the full edit flow now but
|
|
@@ -1326,6 +1344,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1326
1344
|
}
|
|
1327
1345
|
}
|
|
1328
1346
|
}
|
|
1347
|
+
this.base.editFlow.onAfterActionExecution(sActionName);
|
|
1329
1348
|
return oResponse;
|
|
1330
1349
|
} catch (err) {
|
|
1331
1350
|
if (oCurrentActionCallBacks) {
|
|
@@ -1346,6 +1365,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1346
1365
|
}
|
|
1347
1366
|
}
|
|
1348
1367
|
|
|
1368
|
+
/**
|
|
1369
|
+
* Hook which can be overridden after the action execution.
|
|
1370
|
+
*
|
|
1371
|
+
* @memberof sap.fe.core.controllerextensions.EditFlow
|
|
1372
|
+
* @param _actionName Name of the action
|
|
1373
|
+
* @alias sap.fe.core.controllerextensions.EditFlow#onAfterActionExecution
|
|
1374
|
+
* @private
|
|
1375
|
+
* @since 1.114.0
|
|
1376
|
+
*/;
|
|
1377
|
+
_proto.onAfterActionExecution = async function onAfterActionExecution(_actionName) {
|
|
1378
|
+
//to be overridden
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1349
1381
|
/**
|
|
1350
1382
|
* Secured execution of the given function. Ensures that the function is only executed when certain conditions are fulfilled.
|
|
1351
1383
|
*
|
|
@@ -1757,7 +1789,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1757
1789
|
appComponent.getShellServices().registerDirtyStateProvider(this.dirtyStateProviderFunction);
|
|
1758
1790
|
|
|
1759
1791
|
// handle session timeout
|
|
1760
|
-
const i18nModel = this.getView().getModel("sap.fe.i18n");
|
|
1792
|
+
const i18nModel = this.base.getView().getModel("sap.fe.i18n");
|
|
1761
1793
|
this.sessionTimeoutFunction = this.getSessionTimeoutFunction(context, i18nModel);
|
|
1762
1794
|
this.getView().getModel().attachSessionTimeout(this.sessionTimeoutFunction);
|
|
1763
1795
|
this.stickyDiscardAfterNavigationFunction = this.getRouteMatchedFunction(context, appComponent);
|
|
@@ -1933,10 +1965,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1933
1965
|
// either current hash is empty so the user left the app or he navigated away from the object
|
|
1934
1966
|
if (!currentHash || !appComponent.getRouterProxy().checkHashWithGuard(currentHash)) {
|
|
1935
1967
|
this.discardStickySession(context);
|
|
1936
|
-
|
|
1937
|
-
//clear the session context to ensure the LR refreshes the list without a session
|
|
1938
|
-
context.getModel().clearSessionContext();
|
|
1939
|
-
}, 0);
|
|
1968
|
+
context.getModel().clearSessionContext();
|
|
1940
1969
|
}
|
|
1941
1970
|
};
|
|
1942
1971
|
}
|
|
@@ -1951,7 +1980,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1951
1980
|
if (discardedContext !== null && discardedContext !== void 0 && discardedContext.hasPendingChanges()) {
|
|
1952
1981
|
discardedContext.getBinding().resetChanges();
|
|
1953
1982
|
}
|
|
1954
|
-
|
|
1983
|
+
if (!this.getCreationMode()) {
|
|
1984
|
+
discardedContext === null || discardedContext === void 0 ? void 0 : discardedContext.refresh();
|
|
1985
|
+
}
|
|
1955
1986
|
this.handleStickyOff();
|
|
1956
1987
|
}
|
|
1957
1988
|
|
|
@@ -2014,7 +2045,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2014
2045
|
if (!response) {
|
|
2015
2046
|
return null;
|
|
2016
2047
|
}
|
|
2017
|
-
const currentView = this.getView();
|
|
2048
|
+
const currentView = this.base.getView();
|
|
2018
2049
|
const metaModelData = currentView.getModel().getMetaModel().getData();
|
|
2019
2050
|
const actionReturnType = metaModelData && metaModelData[actionName] && metaModelData[actionName][0] && metaModelData[actionName][0].$ReturnType ? metaModelData[actionName][0].$ReturnType.$Type : null;
|
|
2020
2051
|
const keys = actionReturnType && metaModelData[actionReturnType] ? metaModelData[actionReturnType].$Key : null;
|
|
@@ -2113,7 +2144,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2113
2144
|
* Method to display a 'discard' popover when exiting a sticky session.
|
|
2114
2145
|
*/;
|
|
2115
2146
|
_proto.onBackNavigationInSession = function onBackNavigationInSession() {
|
|
2116
|
-
const view = this.getView();
|
|
2147
|
+
const view = this.base.getView();
|
|
2117
2148
|
const routerProxy = this.getAppComponent().getRouterProxy();
|
|
2118
2149
|
if (routerProxy.checkIfBackIsOutOfGuard()) {
|
|
2119
2150
|
const bindingContext = view.getBindingContext();
|
|
@@ -2330,9 +2361,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2330
2361
|
* @param rightmostCurrentContext The context of the subobject
|
|
2331
2362
|
* @param sProgrammingModel The programming model
|
|
2332
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
|
|
2333
2365
|
* @returns Returns the siblingInformation object
|
|
2334
2366
|
*/;
|
|
2335
|
-
_proto._computeSiblingInformation = async function _computeSiblingInformation(rootCurrentContext, rightmostCurrentContext, sProgrammingModel, doNotComputeIfRoot) {
|
|
2367
|
+
_proto._computeSiblingInformation = async function _computeSiblingInformation(rootCurrentContext, rightmostCurrentContext, sProgrammingModel, doNotComputeIfRoot, rootContextInfo) {
|
|
2336
2368
|
rightmostCurrentContext = rightmostCurrentContext ?? rootCurrentContext;
|
|
2337
2369
|
if (!rightmostCurrentContext.getPath().startsWith(rootCurrentContext.getPath())) {
|
|
2338
2370
|
// Wrong usage !!
|
|
@@ -2344,7 +2376,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2344
2376
|
}
|
|
2345
2377
|
const model = rootCurrentContext.getModel();
|
|
2346
2378
|
if (sProgrammingModel === ProgrammingModel.Draft) {
|
|
2347
|
-
return draft.computeSiblingInformation(rootCurrentContext, rightmostCurrentContext);
|
|
2379
|
+
return draft.computeSiblingInformation(rootCurrentContext, rightmostCurrentContext, rootContextInfo);
|
|
2348
2380
|
} else {
|
|
2349
2381
|
// If not in draft mode, we just recreate a context from the path of the rightmost context
|
|
2350
2382
|
// No path mapping is needed
|
|
@@ -2358,7 +2390,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2358
2390
|
return this.getAppComponent()._isFclEnabled();
|
|
2359
2391
|
};
|
|
2360
2392
|
return EditFlow;
|
|
2361
|
-
}(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);
|
|
2362
2394
|
return EditFlow;
|
|
2363
2395
|
}, false);
|
|
2364
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiTWVzc2FnZVR5cGUiLCJjb3JlTGlicmFyeSIsIkVkaXRGbG93IiwiZGVmaW5lVUk1Q2xhc3MiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwic3luY1Rhc2tzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXRBcHBDb21wb25lbnQiLCJiYXNlIiwiZWRpdERvY3VtZW50Iiwib0NvbnRleHQiLCJiRHJhZnROYXZpZ2F0aW9uIiwidHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJfZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwibW9kZWwiLCJnZXRNb2RlbCIsInJpZ2h0bW9zdENvbnRleHQiLCJzaWJsaW5nSW5mbyIsIm9WaWV3RGF0YSIsImdldFZpZXciLCJnZXRWaWV3RGF0YSIsInNQcm9ncmFtbWluZ01vZGVsIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsIm9Sb290Q29udGV4dCIsIm9WaWV3Iiwidmlld0xldmVsIiwiRHJhZnQiLCJkcmFmdFJvb3RQYXRoIiwiTW9kZWxIZWxwZXIiLCJnZXREcmFmdFJvb3RQYXRoIiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJyZXF1ZXN0T2JqZWN0IiwiU3RpY2t5Iiwic1N0aWNreVJvb3RQYXRoIiwiZ2V0U3RpY2t5Um9vdFBhdGgiLCJlZGl0RmxvdyIsIm9uQmVmb3JlRWRpdCIsImNvbnRleHQiLCJvTmV3RG9jdW1lbnRDb250ZXh0IiwiZ2V0TWVzc2FnZUhhbmRsZXIiLCJfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyIsInNldEVkaXRNb2RlIiwiRWRpdGFibGUiLCJzZXREb2N1bWVudE1vZGlmaWVkIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJjb250ZXh0VG9OYXZpZ2F0ZSIsIl9pc0ZjbEVuYWJsZWQiLCJnZXRSaWdodG1vc3RDb250ZXh0IiwiX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24iLCJfY3JlYXRlU2libGluZ0luZm8iLCJfdXBkYXRlUGF0aHNJbkhpc3RvcnkiLCJwYXRoTWFwcGluZyIsInRhcmdldENvbnRleHQiLCJnZXRQYXRoIiwiX2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0IiwiX2hhbmRsZU5ld0NvbnRleHQiLCJzdGlja3lDb250ZXh0IiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsImhhbmRsZVN0aWNreU9uIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJnZXRNZXRhTW9kZWwiLCJzaGFyZU9iamVjdCIsIm9FcnJvciIsIkxvZyIsImVycm9yIiwiZGVsZXRlTXVsdGlwbGVEb2N1bWVudHMiLCJjb250ZXh0c1RvRGVsZXRlIiwicGFyYW1ldGVycyIsImJlZm9yZURlbGV0ZUNhbGxCYWNrIiwib25CZWZvcmVEZWxldGUiLCJsb2NrT2JqZWN0IiwiZ2V0R2xvYmFsVUlNb2RlbCIsInBhcmVudENvbnRyb2wiLCJieUlkIiwiY29udHJvbElkIiwiRXJyb3IiLCJsaXN0QmluZGluZyIsImdldEJpbmRpbmciLCJnZXRSb3dCaW5kaW5nIiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbiIsInJlc3VsdCIsImlzQSIsImNsZWFyU2VsZWN0aW9uIiwidmlld0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJpc1Jvb3QiLCJhdHRhY2hFdmVudE9uY2UiLCJyZWZyZXNoIiwiQ29tbW9uVXRpbHMiLCJoYXNUcmFuc2llbnRDb250ZXh0IiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwiRWRpdFN0YXRlIiwic2V0RWRpdFN0YXRlRGlydHkiLCJBY3Rpdml0eVN5bmMiLCJzZW5kIiwiQWN0aXZpdHkiLCJEZWxldGUiLCJtYXAiLCJ1bmxvY2siLCJ1cGRhdGVEb2N1bWVudCIsInVwZGF0ZWRDb250ZXh0IiwidXBkYXRlUHJvbWlzZSIsIm9yaWdpbmFsQmluZGluZ0NvbnRleHQiLCJpc0RyYWZ0IiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwic3luY1Rhc2siLCJzZXREcmFmdFN0YXR1cyIsIlNhdmluZyIsImN1cnJlbnRCaW5kaW5nQ29udGV4dCIsIm1ldGFNb2RlbCIsImVudGl0eVNldE5hbWUiLCJnZXRNZXRhQ29udGV4dCIsImdldE9iamVjdCIsInNlbWFudGljS2V5cyIsIlNlbWFudGljS2V5SGVscGVyIiwiZ2V0U2VtYW50aWNLZXlzIiwibGVuZ3RoIiwiY3VycmVudFNlbWFudGljTWFwcGluZyIsIl9nZXRTZW1hbnRpY01hcHBpbmciLCJjdXJyZW50U2VtYW50aWNQYXRoIiwic2VtYW50aWNQYXRoIiwic0NoYW5nZWRQYXRoIiwiZ2V0U2VtYW50aWNQYXRoIiwiU2F2ZWQiLCJDbGVhciIsInNob3dNZXNzYWdlcyIsImNyZWF0ZURvY3VtZW50Iiwidkxpc3RCaW5kaW5nIiwibUluUGFyYW1ldGVycyIsIm9Mb2NrT2JqZWN0Iiwib1RhYmxlIiwibVBhcmFtZXRlcnMiLCJvQ3JlYXRpb24iLCJiU2hvdWxkQnVzeUxvY2siLCJjcmVhdGlvbk1vZGUiLCJJbmxpbmUiLCJDcmVhdGlvblJvdyIsIkV4dGVybmFsIiwib0V4ZWNDdXN0b21WYWxpZGF0aW9uIiwib0FwcENvbXBvbmVudCIsImdldFJvdXRlclByb3h5IiwicmVtb3ZlSUFwcFN0YXRlS2V5Iiwib0NvbnRyb2xsZXIiLCJnZXRDb250cm9sbGVyIiwic0NyZWF0ZVBhdGgiLCJnZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmciLCJoYW5kbGVycyIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsIm91dGJvdW5kIiwidW5kZWZpbmVkIiwiY3JlYXRpb25Sb3ciLCJvQ3JlYXRpb25Sb3dPYmplY3RzIiwiZ2V0UGFyZW50IiwidmFsaWRhdGVEb2N1bWVudCIsImRhdGEiLCJjdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJnZXRDcmVhdGlvblJvdyIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsInNldFByb3BlcnR5IiwidGFibGVJZCIsImZuRm9jdXNPclNjcm9sbCIsImZvY3VzUm93IiwiYmluZCIsInNjcm9sbFRvSW5kZXgiLCJjcmVhdGVBdEVuZCIsImdldExlbmd0aCIsImhhbmRsZVNpZGVFZmZlY3RzIiwib0xpc3RCaW5kaW5nIiwib0NyZWF0aW9uUHJvbWlzZSIsIm9OZXdDb250ZXh0IiwiY3JlYXRlZCIsIm9CaW5kaW5nQ29udGV4dCIsImFwcENvbXBvbmVudCIsImNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyIsImFWYWxpZGF0aW9uTWVzc2FnZXMiLCJzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwibUN1c3RvbVZhbGlkaXR5IiwiZ2V0UHJvcGVydHkiLCJvTWVzc2FnZU1hbmFnZXIiLCJDb3JlIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJhQ3VzdG9tTWVzc2FnZXMiLCJvRmllbGRDb250cm9sIiwic1RhcmdldCIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJmb3JFYWNoIiwib01lc3NhZ2UiLCJjb2RlIiwicmVtb3ZlTWVzc2FnZXMiLCJvVmFsaWRhdGlvbk1lc3NhZ2UiLCJtZXNzYWdlVGFyZ2V0IiwiZ2V0Q29udHJvbCIsImZpZWxkSWQiLCJnZXRCaW5kaW5nUGF0aCIsImZpbHRlciIsInRhcmdldCIsImFkZE1lc3NhZ2VzIiwiTWVzc2FnZSIsIm1lc3NhZ2UiLCJtZXNzYWdlVGV4dCIsInByb2Nlc3NvciIsInR5cGUiLCJ0ZWNobmljYWwiLCJwZXJzaXN0ZW50IiwiYUV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzIiwiYWRkQ29udHJvbElkIiwicHVzaCIsInRleHQiLCJjdXN0b21NZXNzYWdlcyIsInJlc29sdmVDcmVhdGlvbk1vZGUiLCJpbml0aWFsQ3JlYXRpb25Nb2RlIiwicHJvZ3JhbW1pbmdNb2RlbCIsIm9NZXRhTW9kZWwiLCJOZXdQYWdlIiwiaXNSZWxhdGl2ZSIsInNQYXRoIiwic05ld0FjdGlvbiIsImFQYXJhbWV0ZXJzIiwiRGVmZXJyZWQiLCJzTWV0YVBhdGgiLCJnZXRNZXRhUGF0aCIsImdldEhlYWRlckNvbnRleHQiLCJhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzIiwiZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzIiwiQXN5bmMiLCJPRGF0YUxpc3RCaW5kaW5nIiwiU3luYyIsIm9Nb2RlbCIsInJlc29sdmVkQ3JlYXRpb25Nb2RlIiwibUFyZ3MiLCJvQ3JlYXRpb25Sb3ciLCJvQ3JlYXRpb25Sb3dDb250ZXh0Iiwib1BheWxvYWQiLCJvUm91dGluZ0xpc3RlbmVyIiwiZ2V0SW50ZXJuYWxSb3V0aW5nIiwiT2JqZWN0Iiwia2V5cyIsInNQcm9wZXJ0eVBhdGgiLCJvUHJvcGVydHkiLCIka2luZCIsIl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiYnVzeU1vZGUiLCJidXN5SWQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJhbm5vdGF0aW9uIiwiaWQiLCJoYW5kbGVDcmVhdGVFdmVudHMiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIm9uQmVmb3JlQ3JlYXRlIiwic2tpcFBhcmFtZXRlckRpYWxvZyIsImdldFN0YXJ0dXBNb2RlIiwiQXV0b0NyZWF0ZSIsImJTa2lwU2lkZUVmZmVjdHMiLCJvTmF2aWdhdGlvbiIsIm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCIsImJEZWZlcnJlZENvbnRleHQiLCJlZGl0YWJsZSIsImJGb3JjZUZvY3VzIiwiYXN5bmNDb250ZXh0IiwiY3JlYXRlQWN0aW9uIiwidHJhbnNpZW50IiwidGhlbiIsImNvcmVSZXNvdXJjZUJ1bmRsZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsIm5hdmlnYXRlVG9NZXNzYWdlUGFnZSIsImdldFRleHQiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwiYkZyb21EZWZlcnJlZCIsIm5hdmlnYXRlVG9Db250ZXh0Iiwib0NyZWF0aW9uUm93TGlzdEJpbmRpbmciLCJvTmV3VHJhbnNpZW50Q29udGV4dCIsImNyZWF0ZSIsInNldEJpbmRpbmdDb250ZXh0IiwiY2F0Y2giLCJ0cmFjZSIsImRlbGV0ZSIsImlzTG9ja2VkIiwicmVqZWN0IiwiYVBhcmFtcyIsImFsbCIsIm1ldGFDb250ZXh0IiwiZW50aXR5U2V0IiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJuZXdBY3Rpb24iLCJhbm5vdGF0aW9ucyIsIlNlc3Npb24iLCJTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiTmV3QWN0aW9uIiwiZ2V0SW50ZXJuYWxNb2RlbCIsInNldERvY3VtZW50TW9kaWZpZWRPbkNyZWF0ZSIsIl9zZW5kQWN0aXZpdHkiLCJDcmVhdGUiLCJpc0Nvbm5lY3RlZCIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsIkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCIsIkNyZWF0aW9uRmFpbGVkIiwibmF2aWdhdGVCYWNrRnJvbVRyYW5zaWVudFN0YXRlIiwiY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMiLCJkYXRhRm9yQ3JlYXRlIiwiaXNGcm9tQ29weVBhc3RlIiwiY3JlYXRlQXNJbmFjdGl2ZSIsInRhcmdldExpc3RCaW5kaW5nIiwiY29udGV4dFBhdGgiLCJtZXRhUGF0aCIsImdldENvbnRleHQiLCJjcmVhdGlvblByb21pc2VzIiwicHJvcGVydHlWYWx1ZXMiLCJjcmVhdGVQYXJhbWV0ZXJzIiwiaW5hY3RpdmUiLCJwcm9wZXJ0eVBhdGgiLCJwcm9wZXJ0eSIsImluZGV4T2YiLCJjcmVhdGVkQ29udGV4dHMiLCJuZXdDb250ZXh0IiwiYkluYWN0aXZlIiwiZXJyIiwib25CZWZvcmVTYXZlIiwiX21QYXJhbWV0ZXJzIiwib25CZWZvcmVEaXNjYXJkIiwic2F2ZURvY3VtZW50IiwiYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJhQmluZGluZ3MiLCJiaW5kaW5ncyIsIl9zdWJtaXRPcGVuQ2hhbmdlcyIsImlzRmNsRW5hYmxlZCIsImFjdGl2ZURvY3VtZW50Q29udGV4dCIsIl9nZXRSZXNvdXJjZU1vZGVsIiwiZ2V0Q3JlYXRpb25Nb2RlIiwiX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMiLCJBY3RpdmF0ZSIsImRpc2Nvbm5lY3QiLCJfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkiLCJTdGFuZGFyZEFjdGlvbnMiLCJzYXZlIiwiVHJpZ2dlclR5cGUiLCJzdGFuZGFyZEFjdGlvbiIsIkRpc3BsYXkiLCJjYW5jZWxlZCIsInRvZ2dsZURyYWZ0QWN0aXZlIiwib0NvbnRleHREYXRhIiwiYkVkaXRhYmxlIiwiYklzRHJhZnQiLCJJc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIkhhc0RyYWZ0RW50aXR5Iiwib1JpZ2h0bW9zdENvbnRleHQiLCJsYXN0U2VtYW50aWNNYXBwaW5nIiwidGVjaG5pY2FsUGF0aCIsInRhcmdldFBhdGgiLCJuZXdQYXRoIiwib2xkUGF0aCIsImNhbmNlbERvY3VtZW50IiwiaXNOZXdEb2N1bWVudCIsImNhbmNlbEJ1dHRvbiIsImNvbnRyb2wiLCJiZWZvcmVDYW5jZWxDYWxsQmFjayIsImNhbmNlbFJlc3VsdCIsImlzRG9jdW1lbnRNb2RpZmllZCIsIkRpc2NhcmQiLCJza2lwQmFja05hdmlnYXRpb24iLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyIsInNraXBCaW5kaW5nVG9WaWV3Iiwic2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UiLCJyZXNvdXJjZU1vZGVsIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJhdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsInNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJkZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsImlzRHJhZnRSb290IiwidGFyZ2V0RW50aXR5U2V0IiwiZGVsZXRlRG9jdW1lbnQiLCJnZXRJbmRleCIsInNpYmxpbmdDb250ZXh0IiwiZHJhZnRQYXRoIiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJkcmFmdENvbnRleHRUb1JlbW92ZSIsInJlcGxhY2VXaXRoIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwiRGVlcGxpbmsiLCJleGl0RnJvbUFwcCIsImFwcGx5RG9jdW1lbnQiLCJpbnZva2VBY3Rpb24iLCJzQWN0aW9uTmFtZSIsIm1FeHRyYVBhcmFtcyIsIm9Db250cm9sIiwiYVBhcnRzIiwic092ZXJsb2FkRW50aXR5VHlwZSIsIm9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzIiwiQXJyYXkiLCJpc0FycmF5IiwiY29udGV4dHMiLCJpc05hdmlnYWJsZSIsInJlcXVpcmVzTmF2aWdhdGlvbiIsImNvbnZlcnRlZE1ldGFkYXRhIiwiY29udmVydFR5cGVzIiwiZW50aXR5Q29udGFpbmVyIiwibmFtZSIsImlzQm91bmQiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsInNwbGl0IiwicmVwbGFjZUFsbCIsImJTdGF0aWNBY3Rpb24iLCJpc1RhYmxlQm91bmQiLCJzQmluZGluZ1BhdGgiLCJwYXRoIiwiX2dldEFjdGlvbk92ZXJsb2FkQ29udGV4dEZyb21NZXRhZGF0YVBhdGgiLCJlbmFibGVBdXRvU2Nyb2xsIiwiY3JlYXRlQWN0aW9uUHJvbWlzZSIsInNJZCIsImJHZXRCb3VuZENvbnRleHQiLCJfZ2V0Qm91bmRDb250ZXh0IiwiYk9iamVjdFBhZ2UiLCJjb252ZXJ0ZXJUeXBlIiwib1Jlc3BvbnNlIiwiY2FsbEFjdGlvbiIsImxpc3RSZWZyZXNoZWQiLCJfcmVmcmVzaExpc3RJZlJlcXVpcmVkIiwiZ2V0QWN0aW9uUmVzcG9uc2VEYXRhQW5kS2V5cyIsImFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMiLCJ2YWx1ZSIsIkFjdGlvbiIsImFjdGlvbiIsImZSZXNvbHZlciIsInZDb250ZXh0Iiwic0NvbnRleHRNZXRhUGF0aCIsIl9mblZhbGlkQ29udGV4dHMiLCJhcHBsaWNhYmxlQ29udGV4dHMiLCJlbGVtZW50Iiwib0FjdGlvbkNvbnRleHQiLCJzQWN0aW9uQ29udGV4dE1ldGFQYXRoIiwiY2hlY2tOb0hhc2hDaGFuZ2UiLCJub0hpc3RvcnlFbnRyeSIsImluZm8iLCJmUmVqZWN0b3IiLCJyZWplY3RlZEl0ZW1zIiwic2VjdXJlZEV4ZWN1dGlvbiIsImZuRnVuY3Rpb24iLCJiQnVzeVNldCIsImJ1c3kiLCJzZXQiLCJiQnVzeUNoZWNrIiwiY2hlY2siLCJiVXBkYXRlc0RvY3VtZW50IiwidXBkYXRlc0RvY3VtZW50IiwiZmluYWxseSIsImhhbmRsZVBhdGNoU2VudCIsIm9FdmVudCIsImlzSW5Db2xsYWJvcmF0aXZlRHJhZnQiLCJnZXRTb3VyY2UiLCJzZXRJZ25vcmVFVGFnIiwic291cmNlQmluZGluZyIsIm9QYXRjaFByb21pc2UiLCJwYXRjaENvbXBsZXRlZEV2ZW50IiwiQWN0aW9uUnVudGltZSIsInNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoIiwiYlN1Y2Nlc3MiLCJnZXRQYXJhbWV0ZXIiLCJoYW5kbGVDcmVhdGVBY3RpdmF0ZSIsIm9CaW5kaW5nIiwiYkF0RW5kIiwib1BhcmFtcyIsImFjdGl2YXRlZENvbnRleHQiLCJ3YXJuaW5nIiwibmV3SW5hY3RpdmVDb250ZXh0IiwibmV3VGFzayIsImNvbXB1dGVFZGl0TW9kZSIsImdsb2JhbE1vZGVsIiwiaXNBY3RpdmVFbnRpdHkiLCJoYXNBY3RpdmVFbnRpdHkiLCJsYXN0SW52b2tlZEFjdGlvbk5hbWUiLCJpc05ld0FjdGlvbkZvclN0aWNreSIsImdldFJlc291cmNlTW9kZWwiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJUcmFuc2FjdGlvbkhlbHBlciIsIm1lc3NhZ2VIYW5kbGVyIiwic2V0Q3JlYXRpb25Nb2RlIiwiYkNyZWF0aW9uTW9kZSIsInVpTW9kZWxDb250ZXh0IiwibW9kaWZpZWQiLCJiaW5kaW5nIiwiYXR0YWNoRXZlbnQiLCJzdWNjZXNzIiwiZHJhZnRTdGF0dXMiLCJzb3VyY2UiLCJlZGl0TW9kZSIsImlzQ3JlYXRpb24iLCJhY3Rpb25OYW1lIiwic3RpY2t5U2Vzc2lvbiIsIkFkZGl0aW9uYWxOZXdBY3Rpb25zIiwiaGFzTmF2aWdhdGlvbkd1YXJkIiwiaGFzaFRyYWNrZXIiLCJnZXRIYXNoIiwiaW50ZXJuYWxNb2RlbCIsInNldFRpbWVvdXQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJzdWJzdHJpbmciLCJvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwiZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24iLCJnZXREaXJ0eVN0YXRlUHJvdmlkZXIiLCJyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImkxOG5Nb2RlbCIsInNlc3Npb25UaW1lb3V0RnVuY3Rpb24iLCJnZXRTZXNzaW9uVGltZW91dEZ1bmN0aW9uIiwiYXR0YWNoU2Vzc2lvblRpbWVvdXQiLCJzdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24iLCJnZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbiIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsImhhbmRsZVN0aWNreU9mZiIsImRpc2NhcmROYXZpZ2F0aW9uR3VhcmQiLCJkZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIiwiZGV0YWNoU2Vzc2lvblRpbWVvdXQiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJnZXRIdHRwSGVhZGVycyIsIm5hdmlnYXRpb25Db250ZXh0IiwidGFyZ2V0SGFzaCIsImlubmVyQXBwUm91dGUiLCJyb3V0ZXJQcm94eSIsImxjbEhhc2hUcmFja2VyIiwiaXNEaXJ0eSIsImlzU2Vzc2lvbk9uIiwiaXNOYXZpZ2F0aW9uRmluYWxpemVkIiwiY2hlY2tIYXNoV2l0aEd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsInNldERpcnR5RmxhZyIsIndhcm5pbmdEaWFsb2ciLCJEaWFsb2ciLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJwcmVzcyIsImFmdGVyQ2xvc2UiLCJkZXN0cm95IiwiYWRkU3R5bGVDbGFzcyIsInNldE1vZGVsIiwiYWRkRGVwZW5kZW50Iiwib3BlbiIsImN1cnJlbnRIYXNoIiwiZGlzY2FyZFN0aWNreVNlc3Npb24iLCJjbGVhclNlc3Npb25Db250ZXh0IiwiZGlzY2FyZGVkQ29udGV4dCIsInN0aWNreSIsImRpc2NhcmREb2N1bWVudCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwicmVzZXRDaGFuZ2VzIiwiX3JvdXRpbmciLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJnZXRMYXN0U2VtYW50aWNNYXBwaW5nIiwicmVzb2x2ZUZ1bmN0aW9uIiwicmVqZWN0RnVuY3Rpb24iLCJhY3Rpb25Qcm9taXNlIiwiYXNzaWduIiwicmVzcG9uc2UiLCJjdXJyZW50VmlldyIsIm1ldGFNb2RlbERhdGEiLCJhY3Rpb25SZXR1cm5UeXBlIiwiJFJldHVyblR5cGUiLCIkVHlwZSIsIiRLZXkiLCJvRGF0YSIsImdldEN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJfc2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93IiwidGFibGUiLCJyb3dCaW5kaW5nIiwiYWN0aXZlUm93SW5kZXgiLCJnZXRDb3VudCIsImFsbFJvd0NvbnRleHRzIiwiZ2V0Q29udGV4dHMiLCJpbmRleCIsInNpbmdsZUNvbnRleHQiLCJpc0luYWN0aXZlIiwiY3JlYXRlRW1wdHlSb3dzQW5kRm9jdXMiLCJ0YWJsZUFQSSIsInRhYmxlRGVmaW5pdGlvbiIsImlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUiLCJzZXRVcEVtcHR5Um93cyIsInJlbGF0ZWRDb250ZXh0cyIsInJlZnJlc2hMaXN0QmluZGluZyIsInRyaWdnZXJUeXBlIiwidHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkiLCJzdWJtaXRCYXRjaCIsIm9SZXF1ZXN0b3IiLCJ3YWl0Rm9yUnVubmluZ0NoYW5nZVJlcXVlc3RzIiwidmlldyIsImNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkIiwiYmluZGluZ0NvbnRleHQiLCJwcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24iLCJoaXN0b3J5IiwiYmFjayIsImJSZWNyZWF0ZUNvbnRleHQiLCJiUGVyc2lzdE9QU2Nyb2xsIiwic2hvd1BsYWNlaG9sZGVyIiwia2VlcEN1cnJlbnRMYXlvdXQiLCJwYXJhbXMiLCJiUmVmcmVzaEFmdGVyQWN0aW9uIiwic1ZpZXdJZCIsImdldElkIiwiYU1lc3NhZ2VzIiwiaSIsInZhbGlkYXRpb24iLCJnZXRDb250cm9sSWQiLCJhS2V5cyIsIm9DdXJyZW50RGF0YSIsImJSZXR1cm5lZENvbnRleHRJc1NhbWUiLCJldmVyeSIsInNLZXkiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImUiLCJzRW50aXR5U2V0TmFtZSIsImFTZW1hbnRpY0tleXMiLCJhUmVxdWVzdFByb21pc2VzIiwib0tleSIsIiRQcm9wZXJ0eVBhdGgiLCJyb290Q29udGV4dCIsIm92ZXJsb2FkRW50aXR5VHlwZSIsImNvbnRleHRTZWdtZW50cyIsImN1cnJlbnRDb250ZXh0IiwicG9wIiwidW5zaGlmdCIsInBhcmVudENvbnRleHRzIiwicGF0aFNlZ21lbnQiLCJyZXZlcnNlIiwib3ZlcmxvYWRDb250ZXh0IiwiZmluZCIsInBhcmVudENvbnRleHQiLCJtYXBwaW5ncyIsInNldFBhdGhNYXBwaW5nIiwibmV3RG9jdW1lbnRDb250ZXh0Iiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJkb05vdENvbXB1dGVJZlJvb3QiLCJzdGFydHNXaXRoIiwiZHJhZnQiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRWRpdEZsb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgQWN0aXZpdHlTeW5jIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IHsgQWN0aXZpdHksIHNoYXJlT2JqZWN0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBTaWJsaW5nSW5mb3JtYXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L3N0aWNreVwiO1xuaW1wb3J0IFRyYW5zYWN0aW9uSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9UcmFuc2FjdGlvbkhlbHBlclwiO1xuaW1wb3J0IHsgU3RhbmRhcmRBY3Rpb25zLCB0cmlnZ2VyQ29uZmlndXJlZFN1cnZleSwgVHJpZ2dlclR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvRmVlZGJhY2tcIjtcbmltcG9ydCB0eXBlIEludGVybmFsUm91dGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGV4dGVuc2libGUsIGZpbmFsRXh0ZW5zaW9uLCBwdWJsaWNFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBFZGl0U3RhdGUgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRWRpdFN0YXRlXCI7XG5pbXBvcnQgeyBnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9NZXRhTW9kZWxGdW5jdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCB7IGdldFJlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9SZXNvdXJjZU1vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2VtYW50aWNLZXlIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvU2VtYW50aWNLZXlIZWxwZXJcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IFJlc291cmNlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgU2VtYW50aWNNYXBwaW5nIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1JvdXRpbmdTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgVGFibGVBUEkgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVBUElcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgY29yZUxpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgQWN0aW9uUnVudGltZSBmcm9tIFwiLi4vQWN0aW9uUnVudGltZVwiO1xuaW1wb3J0IHR5cGUgeyBCYXNlTWFuaWZlc3RTZXR0aW5ncyB9IGZyb20gXCIuLi9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcblxuY29uc3QgQ3JlYXRpb25Nb2RlID0gRkVMaWJyYXJ5LkNyZWF0aW9uTW9kZSxcblx0UHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsLFxuXHRDb25zdGFudHMgPSBGRUxpYnJhcnkuQ29uc3RhbnRzLFxuXHREcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cyxcblx0RWRpdE1vZGUgPSBGRUxpYnJhcnkuRWRpdE1vZGUsXG5cdFN0YXJ0dXBNb2RlID0gRkVMaWJyYXJ5LlN0YXJ0dXBNb2RlLFxuXHRNZXNzYWdlVHlwZSA9IGNvcmVMaWJyYXJ5Lk1lc3NhZ2VUeXBlO1xuXG4vKipcbiAqIEEgY29udHJvbGxlciBleHRlbnNpb24gb2ZmZXJpbmcgaG9va3MgaW50byB0aGUgZWRpdCBmbG93IG9mIHRoZSBhcHBsaWNhdGlvblxuICpcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqIEBwdWJsaWNcbiAqIEBzaW5jZSAxLjkwLjBcbiAqL1xuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcIilcbmNsYXNzIEVkaXRGbG93IGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByb3RlY3RlZCBiYXNlITogUGFnZUNvbnRyb2xsZXI7XG5cblx0cHJpdmF0ZSBkaXJ0eVN0YXRlUHJvdmlkZXJGdW5jdGlvbj86IEZ1bmN0aW9uO1xuXG5cdHByaXZhdGUgc2Vzc2lvblRpbWVvdXRGdW5jdGlvbj86IEZ1bmN0aW9uO1xuXG5cdHByaXZhdGUgc3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBzeW5jVGFza3M6IFByb21pc2U8YW55PiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG5cdHByaXZhdGUgYWN0aW9uUHJvbWlzZT86IFByb21pc2U8YW55PjtcblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBQdWJsaWMgbWV0aG9kc1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdGdldEFwcENvbXBvbmVudCgpOiBBcHBDb21wb25lbnQge1xuXHRcdHJldHVybiB0aGlzLmJhc2UuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIGRyYWZ0IGRvY3VtZW50IGZvciBhbiBleGlzdGluZyBhY3RpdmUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZWRpdGFibGUgZG9jdW1lbnQgaXMgYXZhaWxhYmxlXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNlZGl0RG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgZWRpdERvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkRyYWZ0TmF2aWdhdGlvbiA9IHRydWU7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuX2dldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIGFueTtcblx0XHRjb25zdCBtb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0bGV0IHJpZ2h0bW9zdENvbnRleHQsIHNpYmxpbmdJbmZvO1xuXHRcdGNvbnN0IG9WaWV3RGF0YSA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3M7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdGxldCBvUm9vdENvbnRleHQ6IENvbnRleHQgPSBvQ29udGV4dDtcblx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoKG9WaWV3RGF0YT8udmlld0xldmVsIGFzIG51bWJlcikgPiAxKSB7XG5cdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdGNvbnN0IGRyYWZ0Um9vdFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCA9IE1vZGVsSGVscGVyLmdldERyYWZ0Um9vdFBhdGgob0NvbnRleHQpO1xuXHRcdFx0XHRcdG9Sb290Q29udGV4dCA9IG9WaWV3XG5cdFx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdFx0LmJpbmRDb250ZXh0KGRyYWZ0Um9vdFBhdGggYXMgc3RyaW5nKVxuXHRcdFx0XHRcdFx0LmdldEJvdW5kQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRcdFx0YXdhaXQgb1Jvb3RDb250ZXh0LnJlcXVlc3RPYmplY3QoZHJhZnRSb290UGF0aCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0Y29uc3Qgc1N0aWNreVJvb3RQYXRoID0gTW9kZWxIZWxwZXIuZ2V0U3RpY2t5Um9vdFBhdGgob0NvbnRleHQpO1xuXHRcdFx0XHRcdG9Sb290Q29udGV4dCA9IG9WaWV3XG5cdFx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdFx0LmJpbmRDb250ZXh0KHNTdGlja3lSb290UGF0aCBhcyBzdHJpbmcpXG5cdFx0XHRcdFx0XHQuZ2V0Qm91bmRDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRcdFx0XHRhd2FpdCBvUm9vdENvbnRleHQucmVxdWVzdE9iamVjdChzU3RpY2t5Um9vdFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVFZGl0KHsgY29udGV4dDogb1Jvb3RDb250ZXh0IH0pO1xuXHRcdFx0Y29uc3Qgb05ld0RvY3VtZW50Q29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmVkaXREb2N1bWVudChcblx0XHRcdFx0b1Jvb3RDb250ZXh0LFxuXHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpXG5cdFx0XHQpO1xuXG5cdFx0XHR0aGlzLl9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsLCBtb2RlbCk7XG5cblx0XHRcdGlmIChvTmV3RG9jdW1lbnRDb250ZXh0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIGZhbHNlKTtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKGZhbHNlKTtcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cblx0XHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQgIT09IG9Sb290Q29udGV4dCkge1xuXHRcdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZTogQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9OZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRyaWdodG1vc3RDb250ZXh0ID0gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob1Jvb3RDb250ZXh0LCByaWdodG1vc3RDb250ZXh0LCBzUHJvZ3JhbW1pbmdNb2RlbCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPSBvTmV3RG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIGlmICgob1ZpZXdEYXRhPy52aWV3TGV2ZWwgYXMgbnVtYmVyKSA+IDEpIHtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvUm9vdENvbnRleHQsIG9Db250ZXh0LCBzUHJvZ3JhbW1pbmdNb2RlbCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHRoaXMuX2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0KG9Db250ZXh0LCBvTmV3RG9jdW1lbnRDb250ZXh0LCBzaWJsaW5nSW5mbykgYXMgQ29udGV4dDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgdHJ1ZSwgZmFsc2UsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdFx0XHRcdC8vIFRoZSBzdGlja3lPbiBoYW5kbGVyIG11c3QgYmUgc2V0IGFmdGVyIHRoZSBuYXZpZ2F0aW9uIGhhcyBiZWVuIGRvbmUsXG5cdFx0XHRcdFx0XHQvLyBhcyB0aGUgVVJMIG1heSBjaGFuZ2UgaW4gdGhlIGNhc2Ugb2YgRkNMXG5cdFx0XHRcdFx0XHRsZXQgc3RpY2t5Q29udGV4dDogQ29udGV4dDtcblx0XHRcdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0XHQvLyBXZSBuZWVkIHRvIHVzZSB0aGUga2VwdC1hbGl2ZSBjb250ZXh0IHVzZWQgdG8gYmluZCB0aGUgcGFnZVxuXHRcdFx0XHRcdFx0XHRzdGlja3lDb250ZXh0ID0gb05ld0RvY3VtZW50Q29udGV4dC5nZXRNb2RlbCgpLmdldEtlZXBBbGl2ZUNvbnRleHQob05ld0RvY3VtZW50Q29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0c3RpY2t5Q29udGV4dCA9IG9OZXdEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9uKHN0aWNreUNvbnRleHQpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoTW9kZWxIZWxwZXIuaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQobW9kZWwuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRcdFx0XHQvLyBhY2NvcmRpbmcgdG8gVVggaW4gY2FzZSBvZiBlbmFibGVkIGNvbGxhYm9yYXRpb24gZHJhZnQgd2Ugc2hhcmUgdGhlIG9iamVjdCBpbW1lZGlhdGVseVxuXHRcdFx0XHRcdFx0YXdhaXQgc2hhcmVPYmplY3Qob05ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBlZGl0aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IgYXMgYW55KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGVsZXRlcyBzZXZlcmFsIGRvY3VtZW50cy5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRzVG9EZWxldGUgVGhlIGNvbnRleHRzIG9mIHRoZSBkb2N1bWVudHMgdG8gZGVsZXRlXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnRzIGFyZSBkZWxldGVkXG5cdCAqL1xuXHRhc3luYyBkZWxldGVNdWx0aXBsZURvY3VtZW50cyhjb250ZXh0c1RvRGVsZXRlOiBDb250ZXh0W10sIHBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGlmIChwYXJhbWV0ZXJzKSB7XG5cdFx0XHRwYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRiZWZvcmVEZWxldGVDYWxsQmFjazogdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3QgcGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpLmJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpO1xuXHRcdGlmICghcGFyZW50Q29udHJvbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwicGFyYW1ldGVyIGNvbnRyb2xJZCBtaXNzaW5nIG9yIGluY29ycmVjdFwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gcGFyZW50Q29udHJvbDtcblx0XHR9XG5cdFx0Y29uc3QgbGlzdEJpbmRpbmcgPSAocGFyZW50Q29udHJvbC5nZXRCaW5kaW5nKFwiaXRlbXNcIikgfHwgKHBhcmVudENvbnRyb2wgYXMgVGFibGUpLmdldFJvd0JpbmRpbmcoKSkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRwYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHMgPSB0cnVlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhsb2NrT2JqZWN0KTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLmRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24oY29udGV4dHNUb0RlbGV0ZSwgcGFyYW1ldGVycyk7XG5cdFx0XHRsZXQgcmVzdWx0O1xuXG5cdFx0XHQvLyBNdWx0aXBsZSBvYmplY3QgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYSBsaXN0XG5cdFx0XHQvLyBGaXJzdCBjbGVhciB0aGUgc2VsZWN0aW9uIGluIHRoZSB0YWJsZSBhcyBpdCdzIG5vdCB2YWxpZCBhbnkgbW9yZVxuXHRcdFx0aWYgKHBhcmVudENvbnRyb2wuaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHQocGFyZW50Q29udHJvbCBhcyBhbnkpLmNsZWFyU2VsZWN0aW9uKCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZW4gcmVmcmVzaCB0aGUgbGlzdC1iaW5kaW5nIChMUiksIG9yIHJlcXVpcmUgc2lkZS1lZmZlY3RzIChPUClcblx0XHRcdGNvbnN0IHZpZXdCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRpZiAoKGxpc3RCaW5kaW5nIGFzIGFueSkuaXNSb290KCkpIHtcblx0XHRcdFx0Ly8ga2VlcCBwcm9taXNlIGNoYWluIHBlbmRpbmcgdW50aWwgcmVmcmVzaCBvZiBsaXN0YmluZGluZyBpcyBjb21wbGV0ZWRcblx0XHRcdFx0cmVzdWx0ID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRsaXN0QmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0bGlzdEJpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0fSBlbHNlIGlmICh2aWV3QmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0Ly8gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBjb250ZXh0cywgd2UgbXVzdCBhdm9pZCByZXF1ZXN0aW5nIHNpZGUgZWZmZWN0c1xuXHRcdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRcdGlmICghQ29tbW9uVXRpbHMuaGFzVHJhbnNpZW50Q29udGV4dChsaXN0QmluZGluZykpIHtcblx0XHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdC5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCB2aWV3QmluZGluZ0NvbnRleHQgYXMgQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gZGVsZXRpbmcgYXQgbGVhc3Qgb25lIG9iamVjdCBzaG91bGQgYWxzbyBzZXQgdGhlIFVJIHRvIGRpcnR5XG5cdFx0XHRpZiAoIXRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0fVxuXG5cdFx0XHRBY3Rpdml0eVN5bmMuc2VuZChcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdEFjdGl2aXR5LkRlbGV0ZSxcblx0XHRcdFx0Y29udGV4dHNUb0RlbGV0ZS5tYXAoKGNvbnRleHQ6IENvbnRleHQpID0+IGNvbnRleHQuZ2V0UGF0aCgpKVxuXHRcdFx0KTtcblxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9IGNhdGNoIChlcnJvcjogYW55KSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnQocylcIiwgZXJyb3IpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayhsb2NrT2JqZWN0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgZHJhZnQgc3RhdHVzIGFuZCBkaXNwbGF5cyB0aGUgZXJyb3IgbWVzc2FnZXMgaWYgdGhlcmUgYXJlIGVycm9ycyBkdXJpbmcgYW4gdXBkYXRlLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHVwZGF0ZWRDb250ZXh0IENvbnRleHQgb2YgdGhlIHVwZGF0ZWQgZmllbGRcblx0ICogQHBhcmFtIHVwZGF0ZVByb21pc2UgUHJvbWlzZSB0byBkZXRlcm1pbmUgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuIFRoZSBwcm9taXNlIHNob3VsZCBiZSByZXNvbHZlZCB3aGVuIHRoZSB1cGRhdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCwgc28gdGhlIGRyYWZ0IHN0YXR1cyBjYW4gYmUgdXBkYXRlZC5cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGRyYWZ0IHN0YXR1cyBoYXMgYmVlbiB1cGRhdGVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyN1cGRhdGVEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHR1cGRhdGVEb2N1bWVudCh1cGRhdGVkQ29udGV4dDogb2JqZWN0LCB1cGRhdGVQcm9taXNlOiBQcm9taXNlPGFueT4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvcmlnaW5hbEJpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRjb25zdCBpc0RyYWZ0ID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKHVwZGF0ZWRDb250ZXh0IGFzIEJpbmRpbmcgfCBDb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzayhhc3luYyAoKSA9PiB7XG5cdFx0XHRpZiAob3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChpc0RyYWZ0KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHVwZGF0ZVByb21pc2U7XG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdGlmICghaXNEcmFmdCB8fCAhY3VycmVudEJpbmRpbmdDb250ZXh0IHx8IGN1cnJlbnRCaW5kaW5nQ29udGV4dCAhPT0gb3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdC8vIElmIGEgbmF2aWdhdGlvbiBoYXBwZW5lZCB3aGlsZSBvUHJvbWlzZSB3YXMgYmVpbmcgcmVzb2x2ZWQsIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIHBhZ2UgY2hhbmdlZFxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdlJ3JlIHN0aWxsIG9uIHRoZSBzYW1lIGNvbnRleHRcblx0XHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gY3VycmVudEJpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVNldE5hbWUgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY3VycmVudEJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSkuZ2V0T2JqZWN0KFwiQHNhcHVpLm5hbWVcIik7XG5cdFx0XHRcdGNvbnN0IHNlbWFudGljS2V5cyA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljS2V5cyhtZXRhTW9kZWwsIGVudGl0eVNldE5hbWUpO1xuXHRcdFx0XHRpZiAoc2VtYW50aWNLZXlzPy5sZW5ndGgpIHtcblx0XHRcdFx0XHRjb25zdCBjdXJyZW50U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFNlbWFudGljUGF0aCA9IGN1cnJlbnRTZW1hbnRpY01hcHBpbmc/LnNlbWFudGljUGF0aCxcblx0XHRcdFx0XHRcdHNDaGFuZ2VkUGF0aCA9IFNlbWFudGljS2V5SGVscGVyLmdldFNlbWFudGljUGF0aChjdXJyZW50QmluZGluZ0NvbnRleHQsIHRydWUpO1xuXHRcdFx0XHRcdC8vIGN1cnJlbnRTZW1hbnRpY1BhdGggY291bGQgYmUgbnVsbCBpZiB3ZSBoYXZlIG5hdmlnYXRlZCB2aWEgZGVlcCBsaW5rIHRoZW4gdGhlcmUgYXJlIG5vIHNlbWFudGljTWFwcGluZ3MgdG8gY2FsY3VsYXRlIGl0IGZyb21cblx0XHRcdFx0XHRpZiAoY3VycmVudFNlbWFudGljUGF0aCAmJiBjdXJyZW50U2VtYW50aWNQYXRoICE9PSBzQ2hhbmdlZFBhdGgpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY3VycmVudEJpbmRpbmdDb250ZXh0IGFzIENvbnRleHQsIHRydWUsIGZhbHNlLCB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmVkKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgdXBkYXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yKTtcblx0XHRcdFx0aWYgKGlzRHJhZnQgJiYgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gKiBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlIFRoZSBjcmVhdGlvbiBtb2RlIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBTeW5jIC0gdGhlIGNyZWF0aW9uIGlzIHRyaWdnZXJlZCBhbmQgb25jZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCwgdGhlIG5hdmlnYXRpb24gaXMgZG9uZVxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBBc3luYyAtIHRoZSBjcmVhdGlvbiBhbmQgdGhlIG5hdmlnYXRpb24gdG8gdGhlIGluc3RhbmNlIGFyZSBkb25lIGluIHBhcmFsbGVsXG5cdC8vICogICAgICAgICAgICAgICAgICAgIERlZmVycmVkIC0gdGhlIGNyZWF0aW9uIGlzIGRvbmUgb24gdGhlIHRhcmdldCBwYWdlXG5cdC8vICogICAgICAgICAgICAgICAgICAgIENyZWF0aW9uUm93IC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW5saW5lIGFzeW5jIHNvIHRoZSB1c2VyIGlzIG5vdCBibG9ja2VkXG5cdC8vIG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93IEluc3RhbmNlIG9mIHRoZSBjcmVhdGlvbiByb3cgLSAoVE9ETzogZ2V0IHJpZCBidXQgdXNlIGxpc3QgYmluZGluZ3Mgb25seSlcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB2TGlzdEJpbmRpbmcgIE9EYXRhTGlzdEJpbmRpbmcgb2JqZWN0IG9yIHRoZSBiaW5kaW5nIHBhdGggZm9yIGEgdGVtcG9yYXJ5IGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblx0ICogICAgICAgICAgICAgICAgICAgIE5ld1BhZ2UgLSB0aGUgY3JlYXRlZCBkb2N1bWVudCBpcyBzaG93biBpbiBhIG5ldyBwYWdlLCBkZXBlbmRpbmcgb24gd2hldGhlciBtZXRhZGF0YSAnU3luYycsICdBc3luYycgb3IgJ0RlZmVycmVkJyBpcyB1c2VkXG5cdCAqICAgICAgICAgICAgICAgICAgICBJbmxpbmUgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbmxpbmUgKGluIGEgdGFibGUpXG5cdCAqICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGluIGEgZGlmZmVyZW50IGFwcGxpY2F0aW9uIHNwZWNpZmllZCB2aWEgdGhlIHBhcmFtZXRlciAnb3V0Ym91bmQnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnRhYmxlSWQgSUQgb2YgdGhlIHRhYmxlXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLm91dGJvdW5kIFRoZSBuYXZpZ2F0aW9uIHRhcmdldCB3aGVyZSB0aGUgZG9jdW1lbnQgaXMgY3JlYXRlZCBpbiBjYXNlIG9mIGNyZWF0aW9uTW9kZSAnRXh0ZXJuYWwnXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kIFNwZWNpZmllcyBpZiB0aGUgbmV3IGVudHJ5IHNob3VsZCBiZSBjcmVhdGVkIGF0IHRoZSB0b3Agb3IgYm90dG9tIG9mIGEgdGFibGUgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0lubGluZSdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjY3JlYXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgY3JlYXRlRG9jdW1lbnQoXG5cdFx0dkxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nIHwgc3RyaW5nLFxuXHRcdG1JblBhcmFtZXRlcnM6IHtcblx0XHRcdGNyZWF0aW9uTW9kZTogc3RyaW5nO1xuXHRcdFx0dGFibGVJZD86IHN0cmluZztcblx0XHRcdG91dGJvdW5kPzogc3RyaW5nO1xuXHRcdFx0Y3JlYXRlQXRFbmQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGxldCBvVGFibGU6IGFueTsgLy9zaG91bGQgYmUgVGFibGUgYnV0IHRoZXJlIGFyZSBtaXNzaW5nIG1ldGhvZHMgaW50byB0aGUgZGVmXG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzO1xuXHRcdGxldCBvQ3JlYXRpb246IFByb21pc2U8Q29udGV4dD4gfCB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgYlNob3VsZEJ1c3lMb2NrID1cblx0XHRcdCFtUGFyYW1ldGVycyB8fFxuXHRcdFx0KG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZSAmJlxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdyAmJlxuXHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5FeHRlcm5hbCk7XG5cdFx0bGV0IG9FeGVjQ3VzdG9tVmFsaWRhdGlvbiA9IFByb21pc2UucmVzb2x2ZShbXSk7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnJlbW92ZUlBcHBTdGF0ZUtleSgpO1xuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkV4dGVybmFsKSB7XG5cdFx0XHQvLyBDcmVhdGUgYnkgbmF2aWdhdGluZyB0byBhbiBleHRlcm5hbCB0YXJnZXRcblx0XHRcdC8vIFRPRE86IENhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb24gKGN1cnJlbnRseSB1c2luZyB0aGUgc2FtZSBhcyBmb3Igb3V0Ym91bmQgY2hldnJvbiBuYXYsIGFuZCB3aXRob3V0IGFueSBjb250ZXh0IC0gM3JkIHBhcmFtKVxuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSB0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCk7XG5cdFx0XHRjb25zdCBzQ3JlYXRlUGF0aCA9IE1vZGVsSGVscGVyLmdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyh0aGlzLmdldFZpZXcoKSwgdkxpc3RCaW5kaW5nKTtcblxuXHRcdFx0KG9Db250cm9sbGVyIGFzIGFueSkuaGFuZGxlcnMub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyLCBtUGFyYW1ldGVycy5vdXRib3VuZCwgdW5kZWZpbmVkLCBzQ3JlYXRlUGF0aCk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cpIHtcblx0XHRcdGNvbnN0IG9DcmVhdGlvblJvd09iamVjdHMgPSBtUGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpLmdldE9iamVjdCgpO1xuXHRcdFx0ZGVsZXRlIG9DcmVhdGlvblJvd09iamVjdHNbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0b1RhYmxlID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0UGFyZW50KCk7XG5cdFx0XHRvRXhlY0N1c3RvbVZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlRG9jdW1lbnQob1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KCksIHtcblx0XHRcdFx0ZGF0YTogb0NyZWF0aW9uUm93T2JqZWN0cyxcblx0XHRcdFx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiBvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSBpcyBzZXQgdG8gZmFsc2UgaW4gbWFuaWZlc3QgY29udmVydGVyIChUYWJsZS50cykgaWYgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIGV4aXN0c1xuXHRcdFx0aWYgKG9UYWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhXCIpID09PSBcInRydWVcIikge1xuXHRcdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dGaWVsZFZhbGlkaXR5XCIsIHt9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lICYmIG1QYXJhbWV0ZXJzLnRhYmxlSWQpIHtcblx0XHRcdG9UYWJsZSA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMudGFibGVJZCkgYXMgVGFibGU7XG5cdFx0fVxuXG5cdFx0aWYgKG9UYWJsZSAmJiBvVGFibGUuaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0Y29uc3QgZm5Gb2N1c09yU2Nyb2xsID1cblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lID8gb1RhYmxlLmZvY3VzUm93LmJpbmQob1RhYmxlKSA6IG9UYWJsZS5zY3JvbGxUb0luZGV4LmJpbmQob1RhYmxlKTtcblx0XHRcdG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkuYXR0YWNoRXZlbnRPbmNlKFwiY2hhbmdlXCIsIGFzeW5jIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0YXdhaXQgb0NyZWF0aW9uO1xuXHRcdFx0XHRmbkZvY3VzT3JTY3JvbGwobVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgPyBvVGFibGUuZ2V0Um93QmluZGluZygpLmdldExlbmd0aCgpIDogMCwgdHJ1ZSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRjb25zdCBoYW5kbGVTaWRlRWZmZWN0cyA9IGFzeW5jIChvTGlzdEJpbmRpbmc6IGFueSwgb0NyZWF0aW9uUHJvbWlzZTogUHJvbWlzZTxDb250ZXh0PikgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3Qgb05ld0NvbnRleHQgPSBhd2FpdCBvQ3JlYXRpb25Qcm9taXNlO1xuXHRcdFx0XHQvLyB0cmFuc2llbnQgY29udGV4dHMgYXJlIHJlbGlhYmx5IHJlbW92ZWQgb25jZSBvTmV3Q29udGV4dC5jcmVhdGVkKCkgaXMgcmVzb2x2ZWRcblx0XHRcdFx0YXdhaXQgb05ld0NvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQob0xpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBvQmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIGFWYWxpZGF0aW9uTWVzc2FnZXMgRXJyb3IgbWVzc2FnZXMgZnJvbSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvblxuXHRcdCAqL1xuXHRcdGNvbnN0IGNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyA9IChhVmFsaWRhdGlvbk1lc3NhZ2VzOiBhbnlbXSkgPT4ge1xuXHRcdFx0Y29uc3Qgc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IG9UYWJsZSAmJiBvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpO1xuXHRcdFx0Y29uc3QgbUN1c3RvbVZhbGlkaXR5ID0gb1RhYmxlICYmIG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93Q3VzdG9tVmFsaWRpdHlcIik7XG5cdFx0XHRjb25zdCBvTWVzc2FnZU1hbmFnZXIgPSBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCk7XG5cdFx0XHRjb25zdCBhQ3VzdG9tTWVzc2FnZXM6IGFueVtdID0gW107XG5cdFx0XHRsZXQgb0ZpZWxkQ29udHJvbDtcblx0XHRcdGxldCBzVGFyZ2V0OiBzdHJpbmc7XG5cblx0XHRcdC8vIFJlbW92ZSBleGlzdGluZyBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdG9NZXNzYWdlTWFuYWdlclxuXHRcdFx0XHQuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHQuZm9yRWFjaChmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdGlmIChvTWVzc2FnZS5jb2RlID09PSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0XHRvTWVzc2FnZU1hbmFnZXIucmVtb3ZlTWVzc2FnZXMob01lc3NhZ2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdGFWYWxpZGF0aW9uTWVzc2FnZXMuZm9yRWFjaCgob1ZhbGlkYXRpb25NZXNzYWdlOiBhbnkpID0+IHtcblx0XHRcdFx0Ly8gSGFuZGxlIEJvdW5kIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0XHRpZiAob1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXQpIHtcblx0XHRcdFx0XHRvRmllbGRDb250cm9sID0gQ29yZS5nZXRDb250cm9sKG1DdXN0b21WYWxpZGl0eVtvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCkgYXMgQ29udHJvbDtcblx0XHRcdFx0XHRzVGFyZ2V0ID0gYCR7b0ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCl9LyR7b0ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nUGF0aChcInZhbHVlXCIpfWA7XG5cdFx0XHRcdFx0Ly8gQWRkIHZhbGlkYXRpb24gbWVzc2FnZSBpZiBzdGlsbCBub3QgZXhpc3RzXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb01lc3NhZ2UudGFyZ2V0ID09PSBzVGFyZ2V0O1xuXHRcdFx0XHRcdFx0XHR9KS5sZW5ndGggPT09IDBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5hZGRNZXNzYWdlcyhcblx0XHRcdFx0XHRcdFx0bmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6IG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzb3I6IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0XHRcdFx0Y29kZTogc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0XHR0ZWNobmljYWw6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHRhcmdldDogc1RhcmdldFxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gQWRkIGNvbnRyb2xJZCBpbiBvcmRlciB0byBnZXQgdGhlIGZvY3VzIGhhbmRsaW5nIG9mIHRoZSBlcnJvciBwb3BvdmVyIHJ1bmFibGVcblx0XHRcdFx0XHRjb25zdCBhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMgPSBvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb01lc3NhZ2UudGFyZ2V0ID09PSBzVGFyZ2V0O1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YUV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzWzBdLmFkZENvbnRyb2xJZChtQ3VzdG9tVmFsaWRpdHlbb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXRdLmZpZWxkSWQpO1xuXG5cdFx0XHRcdFx0Ly8gSGFuZGxlIFVuYm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUN1c3RvbU1lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y29kZTogc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdHRleHQ6IG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvclxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGFDdXN0b21NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7XG5cdFx0XHRcdFx0Y3VzdG9tTWVzc2FnZXM6IGFDdXN0b21NZXNzYWdlc1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y29uc3QgcmVzb2x2ZUNyZWF0aW9uTW9kZSA9IChcblx0XHRcdGluaXRpYWxDcmVhdGlvbk1vZGU6IHN0cmluZyxcblx0XHRcdHByb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRcdG9MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsXG5cdFx0KTogc3RyaW5nID0+IHtcblx0XHRcdGlmIChpbml0aWFsQ3JlYXRpb25Nb2RlICYmIGluaXRpYWxDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5OZXdQYWdlKSB7XG5cdFx0XHRcdC8vIHVzZSB0aGUgcGFzc2VkIGNyZWF0aW9uIG1vZGVcblx0XHRcdFx0cmV0dXJuIGluaXRpYWxDcmVhdGlvbk1vZGU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBOZXdBY3Rpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIE5hdmlnYXRpb25Qcm9wZXJ0eSBjb2xsZWN0aW9uXG5cdFx0XHRcdGlmICghb0xpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRcdGNvbnN0IHNQYXRoID0gb0xpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdC8vIGlmIE5ld0FjdGlvbiB3aXRoIHBhcmFtZXRlcnMgaXMgcHJlc2VudCwgdGhlbiBjcmVhdGlvbiBpcyAnRGVmZXJyZWQnXG5cdFx0XHRcdFx0XHQvLyBpbiB0aGUgYWJzZW5jZSBvZiBOZXdBY3Rpb24gb3IgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycywgY3JlYXRpb24gaXMgYXN5bmNcblx0XHRcdFx0XHRcdHNOZXdBY3Rpb24gPVxuXHRcdFx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0XHRcdFx0PyBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9OZXdBY3Rpb25gKVxuXHRcdFx0XHRcdFx0XHRcdDogb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c1BhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZC9OZXdBY3Rpb25gKTtcblx0XHRcdFx0XHRpZiAoc05ld0FjdGlvbikge1xuXHRcdFx0XHRcdFx0Y29uc3QgYVBhcmFtZXRlcnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7c05ld0FjdGlvbn0vQCR1aTUub3ZlcmxvYWQvMC8kUGFyYW1ldGVyYCkgfHwgW107XG5cdFx0XHRcdFx0XHQvLyBiaW5kaW5nIHBhcmFtZXRlciAoZWc6IF9pdCkgaXMgbm90IGNvbnNpZGVyZWRcblx0XHRcdFx0XHRcdGlmIChhUGFyYW1ldGVycy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0xpc3RCaW5kaW5nPy5nZXRIZWFkZXJDb250ZXh0KCkhLmdldFBhdGgoKSk7XG5cdFx0XHRcdGNvbnN0IGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMgPSBnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMob01ldGFNb2RlbCwgc01ldGFQYXRoLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdFx0aWYgKGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5Bc3luYztcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0aWYgKGJTaG91bGRCdXN5TG9jaykge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGFWYWxpZGF0aW9uTWVzc2FnZXMgPSBhd2FpdCB0aGlzLnN5bmNUYXNrKG9FeGVjQ3VzdG9tVmFsaWRhdGlvbik7XG5cdFx0XHRpZiAoYVZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyhhVmFsaWRhdGlvbk1lc3NhZ2VzKTtcblx0XHRcdFx0TG9nLmVycm9yKFwiQ3VzdG9tIFZhbGlkYXRpb24gZmFpbGVkXCIpO1xuXHRcdFx0XHQvLyBpZiBjdXN0b20gdmFsaWRhdGlvbiBmYWlscywgd2UgbGVhdmUgdGhlIG1ldGhvZCBpbW1lZGlhdGVseVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGxldCBvTGlzdEJpbmRpbmc6IGFueTtcblx0XHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cblx0XHRcdGlmICh2TGlzdEJpbmRpbmcgJiYgdHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHQvLyB3ZSBhbHJlYWR5IGdldCBhIGxpc3QgYmluZGluZyB1c2UgdGhpcyBvbmVcblx0XHRcdFx0b0xpc3RCaW5kaW5nID0gdkxpc3RCaW5kaW5nO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2Ygdkxpc3RCaW5kaW5nID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdG9MaXN0QmluZGluZyA9IG5ldyAoT0RhdGFMaXN0QmluZGluZyBhcyBhbnkpKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksIHZMaXN0QmluZGluZyk7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5TeW5jO1xuXHRcdFx0XHRkZWxldGUgbVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIG9iamVjdCBvciBwYXRoIGV4cGVjdGVkXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvTW9kZWwgPSBvTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0xpc3RCaW5kaW5nKTtcblx0XHRcdGNvbnN0IHJlc29sdmVkQ3JlYXRpb25Nb2RlID0gcmVzb2x2ZUNyZWF0aW9uTW9kZShcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0b0xpc3RCaW5kaW5nLFxuXHRcdFx0XHRvTW9kZWwuZ2V0TWV0YU1vZGVsKClcblx0XHRcdCk7XG5cdFx0XHRsZXQgbUFyZ3M6IGFueTtcblx0XHRcdGNvbnN0IG9DcmVhdGlvblJvdyA9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93O1xuXHRcdFx0bGV0IG9DcmVhdGlvblJvd0NvbnRleHQ6IGFueTtcblx0XHRcdGxldCBvUGF5bG9hZDogYW55O1xuXHRcdFx0bGV0IHNNZXRhUGF0aDogc3RyaW5nO1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IG9Sb3V0aW5nTGlzdGVuZXIgPSB0aGlzLmdldEludGVybmFsUm91dGluZygpO1xuXG5cdFx0XHRpZiAocmVzb2x2ZWRDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5EZWZlcnJlZCkge1xuXHRcdFx0XHRpZiAocmVzb2x2ZWRDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdykge1xuXHRcdFx0XHRcdG9DcmVhdGlvblJvd0NvbnRleHQgPSBvQ3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9DcmVhdGlvblJvd0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHQvLyBwcmVmaWxsIGRhdGEgZnJvbSBjcmVhdGlvbiByb3dcblx0XHRcdFx0XHRvUGF5bG9hZCA9IG9DcmVhdGlvblJvd0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YSA9IHt9O1xuXHRcdFx0XHRcdE9iamVjdC5rZXlzKG9QYXlsb2FkKS5mb3JFYWNoKGZ1bmN0aW9uIChzUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9Qcm9wZXJ0eSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzUHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdFx0Ly8gZW5zdXJlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcmUgbm90IHBhcnQgb2YgdGhlIHBheWxvYWQsIGRlZXAgY3JlYXRlIG5vdCBzdXBwb3J0ZWRcblx0XHRcdFx0XHRcdGlmIChvUHJvcGVydHkgJiYgb1Byb3BlcnR5LiRraW5kID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGFbc1Byb3BlcnR5UGF0aF0gPSBvUGF5bG9hZFtzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoLypvQ3JlYXRpb25Sb3dDb250ZXh0Ki8pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChyZXNvbHZlZENyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93IHx8IHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRcdC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5idXN5TW9kZSA9IFwiTG9jYWxcIjtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5idXN5SWQgPSBvVGFibGU/LmdldFBhcmVudCgpPy5nZXRUYWJsZURlZmluaXRpb24oKT8uYW5ub3RhdGlvbi5pZDtcblxuXHRcdFx0XHRcdC8vIHRha2UgY2FyZSBvbiBtZXNzYWdlIGhhbmRsaW5nLCBkcmFmdCBpbmRpY2F0b3IgKGluIGNhc2Ugb2YgZHJhZnQpXG5cdFx0XHRcdFx0Ly8gQXR0YWNoIHRoZSBjcmVhdGUgc2VudCBhbmQgY3JlYXRlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdFx0XHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKG9MaXN0QmluZGluZyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgPSB0aGlzLm9uQmVmb3JlQ3JlYXRlO1xuXG5cdFx0XHRcdC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlXG5cdFx0XHRcdC8vIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgPSBvQXBwQ29tcG9uZW50LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGU7XG5cblx0XHRcdFx0b0NyZWF0aW9uID0gdHJhbnNhY3Rpb25IZWxwZXIuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdFx0b0xpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRcdGZhbHNlXG5cdFx0XHRcdCk7XG5cdFx0XHRcdC8vIFNpZGVFZmZlY3RzIG9uIENyZWF0ZVxuXHRcdFx0XHQvLyBpZiBTYXZlIGlzIHByZXNzZWQgZGlyZWN0bHkgYWZ0ZXIgZmlsbGluZyB0aGUgQ3JlYXRpb25Sb3csIG5vIFNpZGVFZmZlY3RzIHJlcXVlc3Rcblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5iU2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdFx0aGFuZGxlU2lkZUVmZmVjdHMob0xpc3RCaW5kaW5nLCBvQ3JlYXRpb24pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGxldCBvTmF2aWdhdGlvbjtcblx0XHRcdHN3aXRjaCAocmVzb2x2ZWRDcmVhdGlvbk1vZGUpIHtcblx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ6XG5cdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvTGlzdEJpbmRpbmcsIHtcblx0XHRcdFx0XHRcdGJEZWZlcnJlZENvbnRleHQ6IHRydWUsXG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkFzeW5jOlxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0xpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdFx0XHRhc3luY0NvbnRleHQ6IG9DcmVhdGlvbixcblx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuU3luYzpcblx0XHRcdFx0XHRtQXJncyA9IHtcblx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBtUGFyYW1ldGVycy5jcmVhdGVBY3Rpb24pIHtcblx0XHRcdFx0XHRcdG1BcmdzLnRyYW5zaWVudCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb0NyZWF0aW9uPy50aGVuKGZ1bmN0aW9uIChvTmV3RG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmICghb05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjb3JlUmVzb3VyY2VCdW5kbGUgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UoXG5cdFx0XHRcdFx0XHRcdFx0Y29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19FRElURkxPV19TQVBGRV9DUkVBVElPTl9GQUlMRURfREVTQ1JJUFRJT05cIilcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBTeW5jIGNyZWF0aW9uIHdhcyB0cmlnZ2VyZWQgZm9yIGEgZGVmZXJyZWQgY3JlYXRpb24sIHdlIGRvbid0IG5hdmlnYXRlIGZvcndhcmRcblx0XHRcdFx0XHRcdFx0Ly8gYXMgd2UncmUgYWxyZWFkeSBvbiB0aGUgY29ycmVzcG9uZGluZyBPYmplY3RQYWdlXG5cdFx0XHRcdFx0XHRcdHJldHVybiBtUGFyYW1ldGVycy5iRnJvbURlZmVycmVkXG5cdFx0XHRcdFx0XHRcdFx0PyBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9Db250ZXh0KG9OZXdEb2N1bWVudENvbnRleHQsIG1BcmdzKVxuXHRcdFx0XHRcdFx0XHRcdDogb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob05ld0RvY3VtZW50Q29udGV4dCwgbUFyZ3MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5JbmxpbmU6XG5cdFx0XHRcdFx0dGhpcy5zeW5jVGFzayhvQ3JlYXRpb24pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdzpcblx0XHRcdFx0XHQvLyB0aGUgY3JlYXRpb24gcm93IHNoYWxsIGJlIGNsZWFyZWQgb25jZSB0aGUgdmFsaWRhdGlvbiBjaGVjayB3YXMgc3VjY2Vzc2Z1bCBhbmRcblx0XHRcdFx0XHQvLyB0aGVyZWZvcmUgdGhlIFBPU1QgY2FuIGJlIHNlbnQgYXN5bmMgdG8gdGhlIGJhY2tlbmRcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0NyZWF0aW9uUm93TGlzdEJpbmRpbmcgPSBvQ3JlYXRpb25Sb3dDb250ZXh0LmdldEJpbmRpbmcoKTtcblxuXHRcdFx0XHRcdFx0Y29uc3Qgb05ld1RyYW5zaWVudENvbnRleHQgPSBvQ3JlYXRpb25Sb3dMaXN0QmluZGluZy5jcmVhdGUoKTtcblx0XHRcdFx0XHRcdG9DcmVhdGlvblJvdy5zZXRCaW5kaW5nQ29udGV4dChvTmV3VHJhbnNpZW50Q29udGV4dCk7XG5cblx0XHRcdFx0XHRcdC8vIHRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIGNvbnNvbGUgZXJyb3JzIFRPIGJlIGNoZWNrZWQgd2l0aCBtb2RlbCBjb2xsZWFndWVzXG5cdFx0XHRcdFx0XHRvTmV3VHJhbnNpZW50Q29udGV4dC5jcmVhdGVkKCkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgZmFzdCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb0NyZWF0aW9uUm93Q29udGV4dC5kZWxldGUoXCIkZGlyZWN0XCIpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHQvLyBSZXNldCBidXN5IGluZGljYXRvciBhZnRlciBhIHZhbGlkYXRpb24gZXJyb3Jcblx0XHRcdFx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpKSB7XG5cdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ3JlYXRpb25Sb3cgbmF2aWdhdGlvbiBlcnJvcjogXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gUHJvbWlzZS5yZWplY3QoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgJHtyZXNvbHZlZENyZWF0aW9uTW9kZX1gKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9DcmVhdGlvbikge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IGFQYXJhbXMgPSBhd2FpdCBQcm9taXNlLmFsbChbb0NyZWF0aW9uLCBvTmF2aWdhdGlvbl0pO1xuXHRcdFx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwsIG9Nb2RlbCk7XG5cblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTsgLy8gVGhlIGNyZWF0ZU1vZGUgZmxhZyB3aWxsIGJlIHNldCBpbiBjb21wdXRlRWRpdE1vZGVcblx0XHRcdFx0XHRpZiAoIW9MaXN0QmluZGluZy5pc1JlbGF0aXZlKCkgJiYgc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHQvLyBXb3JrYXJvdW5kIHRvIHRlbGwgdGhlIE9QIHRoYXQgd2UndmUgY3JlYXRlZCBhIG5ldyBvYmplY3QgZnJvbSB0aGUgTFJcblx0XHRcdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG9MaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuYmluZENvbnRleHQobWV0YU1vZGVsLmdldE1ldGFQYXRoKG9MaXN0QmluZGluZy5nZXRQYXRoKCkpKTtcblx0XHRcdFx0XHRcdGNvbnN0IGVudGl0eVNldCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkuc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdFx0XHRcdFx0Y29uc3QgbmV3QWN0aW9uID0gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkPy5OZXdBY3Rpb247XG5cdFx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBuZXdBY3Rpb24pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBvTmV3RG9jdW1lbnRDb250ZXh0ID0gYVBhcmFtc1swXTtcblx0XHRcdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUob0xpc3RCaW5kaW5nKTtcblx0XHRcdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQ3JlYXRlLCBvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHRcdGlmIChNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChvTW9kZWwuZ2V0TWV0YU1vZGVsKCkpICYmICFBY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGFjY29yZGluZyB0byBVWCBpbiBjYXNlIG9mIGVuYWJsZWQgY29sbGFib3JhdGlvbiBkcmFmdCB3ZSBzaGFyZSB0aGUgb2JqZWN0IGltbWVkaWF0ZWx5XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHNoYXJlT2JqZWN0KG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHQvLyBUT0RPOiBjdXJyZW50bHksIHRoZSBvbmx5IGVycm9ycyBoYW5kbGVkIGhlcmUgYXJlIHJhaXNlZCBhcyBzdHJpbmcgLSBzaG91bGQgYmUgY2hhbmdlZCB0byBFcnJvciBvYmplY3RzXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0ZXJyb3IgPT09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cgfHxcblx0XHRcdFx0XHRcdGVycm9yID09PSBDb25zdGFudHMuQWN0aW9uRXhlY3V0aW9uRmFpbGVkIHx8XG5cdFx0XHRcdFx0XHRlcnJvciA9PT0gQ29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHQvLyBjcmVhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQgYnkgdXNlciBvciBmYWlsZWQgaW4gYmFja2VuZCA9PiBpbiBjYXNlIHdlIGhhdmUgbmF2aWdhdGVkIHRvIHRyYW5zaWVudCBjb250ZXh0IGJlZm9yZSwgbmF2aWdhdGUgYmFja1xuXHRcdFx0XHRcdFx0Ly8gdGhlIHN3aXRjaC1zdGF0ZW1lbnQgYWJvdmUgc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGhhcHBlbnMgaW4gY3JlYXRpb25Nb2RlcyBkZWZlcnJlZCBhbmQgYXN5bmMuIEJ1dCBpbiBmYWN0LCBpbiB0aGVzZSBjYXNlcyBhZnRlciB0aGUgbmF2aWdhdGlvbiBmcm9tIHJvdXRlTWF0Y2hlZCBpbiBPUCBjb21wb25lbnRcblx0XHRcdFx0XHRcdC8vIGNyZWF0ZURlZmVycmVkQ29udGV4dCBpcyB0cmlnZ2VyZCwgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgKGNyZWF0ZURvY3VtZW50KSBhZ2FpbiAtIHRoaXMgdGltZSB3aXRoIGNyZWF0aW9uTW9kZSBzeW5jLiBUaGVyZWZvcmUsIGFsc28gaW4gdGhhdCBtb2RlIHdlIG5lZWQgdG8gdHJpZ2dlciBiYWNrIG5hdmlnYXRpb24uXG5cdFx0XHRcdFx0XHQvLyBUaGUgb3RoZXIgY2FzZXMgbWlnaHQgc3RpbGwgYmUgbmVlZGVkIGluIGNhc2UgdGhlIG5hdmlnYXRpb24gZmFpbHMuXG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuU3luYyB8fFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkRlZmVycmVkIHx8XG5cdFx0XHRcdFx0XHRcdHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQXN5bmNcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoYlNob3VsZEJ1c3lMb2NrKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVmFsaWRhdGVzIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqL1xuXG5cdHZhbGlkYXRlRG9jdW1lbnQoY29udGV4dDogQ29udGV4dCwgcGFyYW1ldGVyczogYW55KTogUHJvbWlzZTxhbnk+IHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnZhbGlkYXRlRG9jdW1lbnQoY29udGV4dCwgcGFyYW1ldGVycywgdGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgc2V2ZXJhbCBkb2N1bWVudHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdEJpbmRpbmcgdXNlZCB0byBjcmVhdGUgdGhlIGRvY3VtZW50c1xuXHQgKiBAcGFyYW0gZGF0YUZvckNyZWF0ZSBUaGUgaW5pdGlhbCBkYXRhIGZvciB0aGUgbmV3IGRvY3VtZW50c1xuXHQgKiBAcGFyYW0gY3JlYXRlQXRFbmQgVHJ1ZSBpZiB0aGUgbmV3IGNvbnRleHRzIG5lZWQgdG8gYmUgY3JhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgYmluZGluZ1xuXHQgKiBAcGFyYW0gaXNGcm9tQ29weVBhc3RlIFRydWUgaWYgdGhlIGNyZWF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCBieSBhIHBhc3RlIGFjdGlvblxuXHQgKiBAcGFyYW0gYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgQ2FsbGJhY2sgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY3JlYXRpb25cblx0ICogQHBhcmFtIGNyZWF0ZUFzSW5hY3RpdmUgVHJ1ZSBpZiB0aGUgY29udGV4dHMgbmVlZCB0byBiZSBjcmVhdGVkIGluYWN0aXZlXG5cdCAqIEByZXR1cm5zIEEgUHJvbWlzZSB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIGNvbnRleHRzLlxuXHQgKi9cblx0YXN5bmMgY3JlYXRlTXVsdGlwbGVEb2N1bWVudHMoXG5cdFx0bGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcsXG5cdFx0ZGF0YUZvckNyZWF0ZTogYW55W10sXG5cdFx0Y3JlYXRlQXRFbmQ6IGJvb2xlYW4sXG5cdFx0aXNGcm9tQ29weVBhc3RlOiBib29sZWFuLFxuXHRcdGJlZm9yZUNyZWF0ZUNhbGxCYWNrPzogRnVuY3Rpb24sXG5cdFx0Y3JlYXRlQXNJbmFjdGl2ZSA9IGZhbHNlXG5cdCkge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGxvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRjb25zdCB0YXJnZXRMaXN0QmluZGluZyA9IGxpc3RCaW5kaW5nO1xuXG5cdFx0QnVzeUxvY2tlci5sb2NrKGxvY2tPYmplY3QpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGlmIChiZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0XHRhd2FpdCBiZWZvcmVDcmVhdGVDYWxsQmFjayh7IGNvbnRleHRQYXRoOiB0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCkgfSk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IHRhcmdldExpc3RCaW5kaW5nLmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRsZXQgbWV0YVBhdGg6IHN0cmluZztcblxuXHRcdFx0aWYgKHRhcmdldExpc3RCaW5kaW5nLmdldENvbnRleHQoKSkge1xuXHRcdFx0XHRtZXRhUGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChgJHt0YXJnZXRMaXN0QmluZGluZy5nZXRDb250ZXh0KCkuZ2V0UGF0aCgpfS8ke3RhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKX1gKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKHRhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKHRhcmdldExpc3RCaW5kaW5nKTtcblxuXHRcdFx0Ly8gSXRlcmF0ZSBvbiBhbGwgaXRlbXMgYW5kIHN0b3JlIHRoZSBjb3JyZXNwb25kaW5nIGNyZWF0aW9uIHByb21pc2Vcblx0XHRcdGNvbnN0IGNyZWF0aW9uUHJvbWlzZXMgPSBkYXRhRm9yQ3JlYXRlLm1hcCgocHJvcGVydHlWYWx1ZXMpID0+IHtcblx0XHRcdFx0Y29uc3QgY3JlYXRlUGFyYW1ldGVyczogYW55ID0geyBkYXRhOiB7fSB9O1xuXG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmJ1c3lNb2RlID0gXCJOb25lXCI7XG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93O1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5jcmVhdGVBdEVuZCA9IGNyZWF0ZUF0RW5kO1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmluYWN0aXZlID0gY3JlYXRlQXNJbmFjdGl2ZTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFzIHdlIGRvbid0IHN1cHBvcnQgZGVlcCBjcmVhdGVcblx0XHRcdFx0Zm9yIChjb25zdCBwcm9wZXJ0eVBhdGggaW4gcHJvcGVydHlWYWx1ZXMpIHtcblx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eSA9IG1ldGFNb2RlbC5nZXRPYmplY3QoYCR7bWV0YVBhdGh9LyR7cHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdHByb3BlcnR5ICYmXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eS4ka2luZCAhPT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIiAmJlxuXHRcdFx0XHRcdFx0cHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpIDwgMCAmJlxuXHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcGVydHlQYXRoXVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5kYXRhW3Byb3BlcnR5UGF0aF0gPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0cmFuc2FjdGlvbkhlbHBlci5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0XHR0YXJnZXRMaXN0QmluZGluZyxcblx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRcdGlzRnJvbUNvcHlQYXN0ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGNyZWF0ZWRDb250ZXh0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNyZWF0aW9uUHJvbWlzZXMpO1xuXHRcdFx0aWYgKCFjcmVhdGVBc0luYWN0aXZlKSB7XG5cdFx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKHRhcmdldExpc3RCaW5kaW5nKTtcblx0XHRcdH1cblx0XHRcdC8vIHRyYW5zaWVudCBjb250ZXh0cyBhcmUgcmVsaWFibHkgcmVtb3ZlZCBvbmNlIG9OZXdDb250ZXh0LmNyZWF0ZWQoKSBpcyByZXNvbHZlZFxuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRcdGNyZWF0ZWRDb250ZXh0cy5tYXAoKG5ld0NvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdGlmICghbmV3Q29udGV4dC5iSW5hY3RpdmUpIHtcblx0XHRcdFx0XHRcdHJldHVybiBuZXdDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHQpO1xuXG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGNvbnRleHRzLCB3ZSBtdXN0IGF2b2lkIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXG5cdFx0XHQvLyB0aGlzIGlzIGF2b2lkIGEgcG90ZW50aWFsIGxpc3QgcmVmcmVzaCwgdGhlcmUgY291bGQgYmUgYSBzaWRlIGVmZmVjdCB0aGF0IHJlZnJlc2hlcyB0aGUgbGlzdCBiaW5kaW5nXG5cdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0aWYgKCFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KHRhcmdldExpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSh0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCksIHZpZXdCaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNyZWF0ZWRDb250ZXh0cztcblx0XHR9IGNhdGNoIChlcnI6IGFueSkge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgbXVsdGlwbGUgZG9jdW1lbnRzLlwiKTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnU2F2ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ1NhdmUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdTYXZlJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZVNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIHNhdmVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlU2F2ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVTYXZlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdDcmVhdGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jcmVhdGVQYXJhbWV0ZXJzIEFycmF5IG9mIHZhbHVlcyB0aGF0IGFyZSBmaWxsZWQgaW4gdGhlIEFjdGlvbiBQYXJhbWV0ZXIgRGlhbG9nXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVDcmVhdGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0UGF0aD86IHN0cmluZzsgY3JlYXRlUGFyYW1ldGVycz86IGFueVtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRWRpdCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0VkaXQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdFZGl0JyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUVkaXRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGVkaXRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGRpc3BsYXkgbW9kZS5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZUVkaXRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQmVmb3JlRWRpdChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGlzY2FyZCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURpc2NhcmRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGRpc2NhcmRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZURpc2NhcmRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQmVmb3JlRGlzY2FyZChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGVsZXRlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgc3RvcHBlZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEZWxldGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBkZWxldGVkXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZURlbGV0ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVEZWxldGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIEluZGljYXRlcyB3aGV0aGVyIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgaWdub3JlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIFNhdmUgZHVyaW5nIGFuIElubGluZSBjcmVhdGlvblxuXHQvLyBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMuYmluZGluZ3MgTGlzdCBiaW5kaW5ncyBvZiB0aGUgdGFibGVzIGluIHRoZSB2aWV3LlxuXHQvLyBCb3RoIG9mIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGFyZSBmb3IgdGhlIHNhbWUgcHVycG9zZS4gVXNlciBjYW4gZW50ZXIgc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgY3JlYXRpb24gcm93KHMpIGJ1dCBkb2VzIG5vdCAnQWRkIHJvdycsIGluc3RlYWQgY2xpY2tzIFNhdmUuXG5cdC8vIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIGluIHRoZSB2aWV3LlxuXG5cdC8qKlxuXHQgKiBTYXZlcyBhIG5ldyBkb2N1bWVudCBhZnRlciBjaGVja2luZyBpdC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIFBSSVZBVEVcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHNhdmUgaXMgY29tcGxldGVcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3NhdmVEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBzYXZlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1QYXJhbWV0ZXJzOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGNvbnN0IGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgfHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGJEcmFmdE5hdmlnYXRpb24gPSB0cnVlO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGFCaW5kaW5ncyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGF3YWl0IHRoaXMuX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0KTtcblx0XHRcdGF3YWl0IHRoaXMuX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpO1xuXHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlU2F2ZSh7IGNvbnRleHQ6IG9Db250ZXh0IH0pO1xuXG5cdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0bGV0IHNpYmxpbmdJbmZvOiBTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kgfHwgb0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNBY3RpdmVFbnRpdHlcIikpICYmXG5cdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHRyeSB0byBnZXQgcmlnaHRtb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBhIG5ldyBvYmplY3Rcblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHRcdG9Sb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0Q29udGV4dCgpLFxuXHRcdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsLFxuXHRcdFx0XHRcdHRydWVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuc2F2ZURvY3VtZW50KFxuXHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpLFxuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcixcblx0XHRcdFx0YUJpbmRpbmdzLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdHRoaXMuZ2V0Q3JlYXRpb25Nb2RlKClcblx0XHRcdCk7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkFjdGl2YXRlLCBhY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0QWN0aXZpdHlTeW5jLmRpc2Nvbm5lY3QodGhpcy5nZXRWaWV3KCkpO1xuXG5cdFx0XHR0aGlzLl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShTdGFuZGFyZEFjdGlvbnMuc2F2ZSwgVHJpZ2dlclR5cGUuc3RhbmRhcmRBY3Rpb24pO1xuXG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblxuXHRcdFx0aWYgKGFjdGl2ZURvY3VtZW50Q29udGV4dCAhPT0gb0NvbnRleHQpIHtcblx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlID0gYWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPT0gYWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCBmYWxzZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdGlmICghKG9FcnJvciAmJiBvRXJyb3IuY2FuY2VsZWQpKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNhdmluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdH1cblx0XHRcdHRocm93IG9FcnJvcjtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3dpdGNoZXMgdGhlIFVJIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBkb2N1bWVudC5cblx0ICpcblx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIHN3aXRjaCBmcm9tXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgc3dpdGNoIGlzIGRvbmVcblx0ICovXG5cdGFzeW5jIHRvZ2dsZURyYWZ0QWN0aXZlKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0bGV0IGJFZGl0YWJsZTogYm9vbGVhbjtcblx0XHRjb25zdCBiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHQvL3RvZ2dsZSBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgZG9jdW1lbnQgaXMgb25seSBhdmFpbGFibGUgZm9yIGVkaXQgZHJhZnRzIGFuZCBhY3RpdmUgZG9jdW1lbnRzIHdpdGggZHJhZnQpXG5cdFx0aWYgKFxuXHRcdFx0IWJJc0RyYWZ0IHx8XG5cdFx0XHQhKFxuXHRcdFx0XHQoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB8fFxuXHRcdFx0XHQob0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNEcmFmdEVudGl0eSlcblx0XHRcdClcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIW9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSAmJiBvQ29udGV4dERhdGEuSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHQvL3N0YXJ0IFBvaW50OiBlZGl0IGRyYWZ0XG5cdFx0XHRiRWRpdGFibGUgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gc3RhcnQgcG9pbnQgYWN0aXZlIGRvY3VtZW50XG5cdFx0XHRiRWRpdGFibGUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdFx0Y29uc3Qgb1JpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpID8gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCkgOiBvQ29udGV4dDtcblx0XHRcdGxldCBzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIG9SaWdodG1vc3RDb250ZXh0LCBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LCBmYWxzZSk7XG5cdFx0XHRpZiAoIXNpYmxpbmdJbmZvICYmIG9Db250ZXh0ICE9PSBvUmlnaHRtb3N0Q29udGV4dCkge1xuXHRcdFx0XHQvLyBUcnkgdG8gY29tcHV0ZSBzaWJsaW5nIGluZm8gZm9yIHRoZSByb290IGNvbnRleHQgaWYgaXQgZmFpbHMgZm9yIHRoZSByaWdodG1vc3QgY29udGV4dFxuXHRcdFx0XHQvLyAtLT4gSW4gY2FzZSBvZiBGQ0wsIGlmIHdlIHRyeSB0byBzd2l0Y2ggYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGJ1dCBhIGNoaWxkIGVudGl0eSBoYXMgbm8gc2libGluZywgdGhlIHN3aXRjaCB3aWxsIGNsb3NlIHRoZSBjaGlsZCBjb2x1bW5cblx0XHRcdFx0c2libGluZ0luZm8gPSBhd2FpdCB0aGlzLl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKG9Db250ZXh0LCBvQ29udGV4dCwgUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCwgZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNpYmxpbmdJbmZvKSB7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoYkVkaXRhYmxlID8gRWRpdE1vZGUuRWRpdGFibGUgOiBFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7IC8vc3dpdGNoIHRvIGVkaXQgbW9kZSBvbmx5IGlmIGEgZHJhZnQgaXMgYXZhaWxhYmxlXG5cblx0XHRcdFx0aWYgKG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRjb25zdCBsYXN0U2VtYW50aWNNYXBwaW5nID0gdGhpcy5fZ2V0U2VtYW50aWNNYXBwaW5nKCk7XG5cdFx0XHRcdFx0aWYgKGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG9Db250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFyZ2V0UGF0aCA9IHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nW3NpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0XHRcdFx0XHRzaWJsaW5nSW5mby5wYXRoTWFwcGluZy5wdXNoKHsgb2xkUGF0aDogbGFzdFNlbWFudGljTWFwcGluZy5zZW1hbnRpY1BhdGgsIG5ld1BhdGg6IHRhcmdldFBhdGggfSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dCwgYkVkaXRhYmxlLCB0cnVlLCB0cnVlLCB0cnVlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVycm9yIGluIEVkaXRGbG93LnRvZ2dsZURyYWZ0QWN0aXZlIC0gQ2Fubm90IGZpbmQgc2libGluZ1wiKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmU6JHtvRXJyb3J9YCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7c2FwLm0uQnV0dG9ufSBtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gLSBDdXJyZW50bHkgdGhpcyBpcyBwYXNzZWQgYXMgY2FuY2VsQnV0dG9uIGludGVybmFsbHkgKHJlcGxhY2VkIGJ5IG1QYXJhbWV0ZXJzLmNvbnRyb2wgaW4gdGhlIEpTRG9jIGJlbG93KS4gQ3VycmVudGx5IGl0IGlzIGFsc28gbWFuZGF0b3J5LlxuXHQvLyBQbGFuIC0gVGhpcyBzaG91bGQgbm90IGJlIG1hbmRhdG9yeS4gSWYgbm90IHByb3ZpZGVkLCB3ZSBzaG91bGQgaGF2ZSBhIGRlZmF1bHQgdGhhdCBjYW4gYWN0IGFzIHJlZmVyZW5jZSBjb250cm9sIGZvciB0aGUgZGlzY2FyZCBwb3BvdmVyIE9SIHdlIGNhbiBzaG93IGEgZGlhbG9nIGluc3RlYWQgb2YgYSBwb3BvdmVyLlxuXG5cdC8qKlxuXHQgKiBEaXNjYXJkIHRoZSBlZGl0YWJsZSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmNvbnRyb2wgVGhpcyBpcyB0aGUgY29udHJvbCB1c2VkIHRvIG9wZW4gdGhlIGRpc2NhcmQgcG9wb3ZlclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyIE9wdGlvbmFsLCBzdXByZXNzZXMgdGhlIGRpc2NhcmQgcG9wb3ZlciBhbmQgYWxsb3dzIGN1c3RvbSBoYW5kbGluZ1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZWRpdGFibGUgZG9jdW1lbnQgaGFzIGJlZW4gZGlzY2FyZGVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNjYW5jZWxEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBjYW5jZWxEb2N1bWVudChvQ29udGV4dDogQ29udGV4dCwgbVBhcmFtZXRlcnM6IHsgY29udHJvbDogb2JqZWN0OyBza2lwRGlzY2FyZFBvcG92ZXI/OiBib29sZWFuIH0pOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG1JblBhcmFtZXRlcnM6IGFueSA9IG1QYXJhbWV0ZXJzO1xuXHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdGxldCBpc05ld0RvY3VtZW50ID0gZmFsc2U7XG5cdFx0bUluUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gPSBtUGFyYW1ldGVycy5jb250cm9sIHx8IG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uO1xuXHRcdG1JblBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEaXNjYXJkO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRcdGlmICgoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpKSAmJiB0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gdHJ5IHRvIGdldCByaWdodG1vc3QgY29udGV4dCBpbiBjYXNlIG9mIGEgbmV3IG9iamVjdFxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjYW5jZWxSZXN1bHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jYW5jZWxEb2N1bWVudChcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdG1JblBhcmFtZXRlcnMsXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHR0aGlzLmdldENyZWF0aW9uTW9kZSgpLFxuXHRcdFx0XHR0aGlzLmlzRG9jdW1lbnRNb2RpZmllZCgpXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgYkRyYWZ0TmF2aWdhdGlvbiA9IHRydWU7XG5cdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHNQcm9ncmFtbWluZ01vZGVsKTtcblxuXHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHQvLyB3ZSBmb3JjZSB0aGUgZWRpdCBzdGF0ZSBldmVuIGZvciBGQ0wgYmVjYXVzZSB0aGUgZHJhZnQgZGlzY2FyZCBtaWdodCBub3QgYmUgaW1wbGVtZW50ZWRcblx0XHRcdC8vIGFuZCB3ZSBtYXkganVzdCBkZWxldGUgdGhlIGRyYWZ0XG5cdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdGlmICghY2FuY2VsUmVzdWx0KSB7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCB1bmRlZmluZWQpO1xuXHRcdFx0XHRBY3Rpdml0eVN5bmMuZGlzY29ubmVjdCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0XHRcdC8vaW4gY2FzZSBvZiBhIG5ldyBkb2N1bWVudCwgbm8gYWN0aXZlQ29udGV4dCBpcyByZXR1cm5lZCAtLT4gbmF2aWdhdGUgYmFjay5cblx0XHRcdFx0aWYgKCFtSW5QYXJhbWV0ZXJzLnNraXBCYWNrTmF2aWdhdGlvbikge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0XHRcdGlzTmV3RG9jdW1lbnQgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0ID0gY2FuY2VsUmVzdWx0IGFzIENvbnRleHQ7XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5EaXNjYXJkLCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0QWN0aXZpdHlTeW5jLmRpc2Nvbm5lY3QodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGUgPSBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKG9Db250ZXh0LCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9PSBvQWN0aXZlRG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dFRvTmF2aWdhdGUgPSBzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRcdC8vIFdlIG5lZWQgdG8gbG9hZCB0aGUgc2VtYW50aWMga2V5cyBvZiB0aGUgYWN0aXZlIGNvbnRleHQsIGFzIHdlIG5lZWQgdGhlbVxuXHRcdFx0XHRcdC8vIGZvciB0aGUgbmF2aWdhdGlvblxuXHRcdFx0XHRcdGF3YWl0IHRoaXMuX2ZldGNoU2VtYW50aWNLZXlWYWx1ZXMob0FjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRcdFx0Ly8gV2UgZm9yY2UgdGhlIHJlY3JlYXRpb24gb2YgdGhlIGNvbnRleHQsIHNvIHRoYXQgaXQncyBjcmVhdGVkIGFuZCBib3VuZCBpbiB0aGUgc2FtZSBtaWNyb3Rhc2ssXG5cdFx0XHRcdFx0Ly8gc28gdGhhdCBhbGwgcHJvcGVydGllcyBhcmUgbG9hZGVkIHRvZ2V0aGVyIGJ5IGF1dG9FeHBhbmRTZWxlY3QsIHNvIHRoYXQgd2hlbiBzd2l0Y2hpbmcgYmFjayB0byBFZGl0IG1vZGVcblx0XHRcdFx0XHQvLyAkJGluaGVyaXRFeHBhbmRTZWxlY3QgdGFrZXMgYWxsIGxvYWRlZCBwcm9wZXJ0aWVzIGludG8gYWNjb3VudCAoQkNQIDIwNzA0NjIyNjUpXG5cdFx0XHRcdFx0aWYgKCFtSW5QYXJhbWV0ZXJzLnNraXBCaW5kaW5nVG9WaWV3KSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCBmYWxzZSwgdHJ1ZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQWN0aXZlRG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvL2FjdGl2ZSBjb250ZXh0IGlzIHJldHVybmVkIGluIGNhc2Ugb2YgY2FuY2VsIG9mIGV4aXN0aW5nIGRvY3VtZW50XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgZmFsc2UsIGZhbHNlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5zaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZShpc05ld0RvY3VtZW50KTtcblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRpc2NhcmRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBhbnkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBCcmluZ3MgdXAgYSBtZXNzYWdlIHRvYXN0IHdoZW4gYSBkcmFmdCBpcyBkaXNjYXJkZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBpc05ld0RvY3VtZW50IFRoaXMgaXMgYSBCb29sZWFuIGZsYWcgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRvY3VtZW50IGlzIG5ldyBvciBpdCBpcyBhbiBleGlzdGluZyBkb2N1bWVudC5cblx0ICovXG5cdHNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlKGlzTmV3RG9jdW1lbnQ/OiBib29sZWFuKSB7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IHRoaXMuX2dldFJlc291cmNlTW9kZWwoKTtcblx0XHRjb25zdCBtZXNzYWdlID0gcmVzb3VyY2VNb2RlbC5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRElTQ0FSRF9EUkFGVF9UT0FTVFwiKTtcblx0XHRpZiAoaXNOZXdEb2N1bWVudCA9PSB0cnVlKSB7XG5cdFx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuYXR0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQodGhpcy5zaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQsIHRoaXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogV2UgdXNlIHRoaXMgZnVuY3Rpb24gaW4gc2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2Ugd2hlbiBubyBjb250ZXh0IGlzIHBhc3NlZC5cblx0ICovXG5cdHNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCgpIHtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gdGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ESVNDQVJEX0RSQUZUX1RPQVNUXCIpO1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0TWVzc2FnZVRvYXN0LnNob3cobWVzc2FnZSk7XG5cdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZGV0YWNoQWZ0ZXJSb3V0ZU1hdGNoZWQodGhpcy5zaG93TWVzc2FnZVdoZW5Ob0NvbnRleHQsIHRoaXMpO1xuXHR9XG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYSBjb250ZXh0IGNvcnJlc3BvbmRzIHRvIGEgZHJhZnQgcm9vdC5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgdG8gY2hlY2tcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY29udGV4dCBwb2ludHMgdG8gYSBkcmFmdCByb290XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwcm90ZWN0ZWQgaXNEcmFmdFJvb3QoY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBtZXRhQ29udGV4dCA9IG1ldGFNb2RlbC5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0cmV0dXJuIE1vZGVsSGVscGVyLmlzRHJhZnRSb290KGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkudGFyZ2V0RW50aXR5U2V0KTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge3N0cmluZ30gbVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZSBOYW1lIG9mIHRoZSBFbnRpdHlTZXQgdG8gd2hpY2ggdGhlIG9iamVjdCBiZWxvbmdzXG5cblx0LyoqXG5cdCAqIERlbGV0ZXMgdGhlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycyBDYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnRpdGxlIFRpdGxlIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlbGV0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIGRvY3VtZW50IGhhcyBiZWVuIGRlbGV0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2RlbGV0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGRlbGV0ZURvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtSW5QYXJhbWV0ZXJzOiB7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdGxldCBtUGFyYW1ldGVyczogYW55ID0gbUluUGFyYW1ldGVycztcblx0XHRpZiAoIW1QYXJhbWV0ZXJzKSB7XG5cdFx0XHRtUGFyYW1ldGVycyA9IHtcblx0XHRcdFx0YkZpbmRBY3RpdmVDb250ZXh0czogZmFsc2Vcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHMgPSBmYWxzZTtcblx0XHR9XG5cdFx0bVBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGU7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChcblx0XHRcdFx0dGhpcy5faXNGY2xFbmFibGVkKCkgJiZcblx0XHRcdFx0dGhpcy5pc0RyYWZ0Um9vdChvQ29udGV4dCkgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0SW5kZXgoKSA9PT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdG9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikgPT09IHRydWUgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0UHJvcGVydHkoXCJIYXNEcmFmdEVudGl0eVwiKSA9PT0gdHJ1ZVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIERlbGV0aW5nIGFuIGFjdGl2ZSBlbnRpdHkgd2hpY2ggaGFzIGEgZHJhZnQgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBiZSBkaXNwbGF5ZWQgaW4gdGhlIExpc3RSZXBvcnQgKEZDTCBjYXNlKVxuXHRcdFx0XHQvLyAtLT4gbmVlZCB0byByZW1vdmUgdGhlIGRyYWZ0IGZyb20gdGhlIExSIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIGFjdGl2ZSB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBMaXN0QmluZGluZyBpcyBwcm9wZXJseSByZWZyZXNoZWRcblx0XHRcdFx0Ly8gVGhlIGNvbmRpdGlvbiAnb0NvbnRleHQuZ2V0SW5kZXgoKSA9PT0gdW5kZWZpbmVkJyBtYWtlcyBzdXJlIHRoZSBhY3RpdmUgdmVyc2lvbiBpc24ndCBhbHJlYWR5IGRpc3BsYXllZCBpbiB0aGUgTFJcblx0XHRcdFx0bVBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2sgPSBhc3luYyAocGFyYW1ldGVycz86IHsgY29udGV4dHM/OiBDb250ZXh0W10gfSkgPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZShwYXJhbWV0ZXJzKTtcblxuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRjb25zdCBtb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRcdFx0XHRjb25zdCBzaWJsaW5nQ29udGV4dCA9IG1vZGVsLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vU2libGluZ0VudGl0eWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRQYXRoID0gYXdhaXQgc2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKTtcblx0XHRcdFx0XHRcdGNvbnN0IGRyYWZ0Q29udGV4dFRvUmVtb3ZlID0gbW9kZWwuZ2V0S2VlcEFsaXZlQ29udGV4dChkcmFmdFBhdGgpO1xuXHRcdFx0XHRcdFx0ZHJhZnRDb250ZXh0VG9SZW1vdmUucmVwbGFjZVdpdGgob0NvbnRleHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSByZXBsYWNpbmcgdGhlIGRyYWZ0IGluc3RhbmNlIGluIHRoZSBMUiBPRExCXCIsIGVycm9yIGFzIGFueSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCB0aGlzLmRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24ob0NvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblxuXHRcdFx0Ly8gU2luZ2xlIG9iamV0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGFuIE9QIGhlYWRlciBidXR0b24gKG5vdCBmcm9tIGEgbGlzdClcblx0XHRcdC8vIC0tPiBNYXJrIFVJIGRpcnR5IGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIGRpc21pc3MgdGhlIE9QXG5cdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRlbGV0ZSwgb0NvbnRleHQpO1xuXG5cdFx0XHQvLyBBZnRlciBkZWxldGUgaXMgc3VjY2Vzc2Z1bGwsIHdlIG5lZWQgdG8gZGV0YWNoIHRoZSBzZXRCYWNrTmF2aWdhdGlvbiBNZXRob2RzXG5cdFx0XHRpZiAob0FwcENvbXBvbmVudCkge1xuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob0FwcENvbXBvbmVudD8uZ2V0U3RhcnR1cE1vZGUoKSA9PT0gU3RhcnR1cE1vZGUuRGVlcGxpbmsgJiYgIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdC8vIEluIGNhc2UgdGhlIGFwcCBoYXMgYmVlbiBsYXVuY2hlZCB3aXRoIHNlbWFudGljIGtleXMsIGRlbGV0aW5nIHRoZSBvYmplY3Qgd2UndmUgbGFuZGVkIG9uIHNoYWxsIG5hdmlnYXRlIGJhY2tcblx0XHRcdFx0Ly8gdG8gdGhlIGFwcCB3ZSBjYW1lIGZyb20gKGV4Y2VwdCBmb3IgRkNMLCB3aGVyZSB3ZSBuYXZpZ2F0ZSB0byBMUiBhcyB1c3VhbClcblx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmV4aXRGcm9tQXBwKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlQmFja0Zyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50XCIsIGVycm9yIGFzIGFueSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN1Ym1pdCB0aGUgY3VycmVudCBzZXQgb2YgY2hhbmdlcyBhbmQgbmF2aWdhdGUgYmFjay5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBzYXZlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjYXBwbHlEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBhcHBseURvY3VtZW50KG9Db250ZXh0OiBvYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cdFx0XHRhd2FpdCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uXSBCb29sZWFuIHZhbHVlIGZvciBzdGF0aWMgYWN0aW9uLCB1bmRlZmluZWQgZm9yIG90aGVyIGFjdGlvbnNcblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGVdIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZFxuXHQvLyBDdXJyZW50bHkgdGhlIHBhcmFtZXRlciBpc05hdmlnYWJsZSBpcyB1c2VkIGludGVybmFsbHkgYW5kIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHJlcXVpcmVzTmF2aWdhdGlvbiBhcyBpdCBpcyBhIG1vcmUgYXB0IG5hbWUgZm9yIHRoaXMgcGFyYW1cblxuXHQvKipcblx0ICogSW52b2tlcyBhbiBhY3Rpb24gKGJvdW5kIG9yIHVuYm91bmQpIGFuZCB0cmFja3MgdGhlIGNoYW5nZXMgc28gdGhhdCBvdGhlciBwYWdlcyBjYW4gYmUgcmVmcmVzaGVkIGFuZCBzaG93IHRoZSB1cGRhdGVkIGRhdGEgdXBvbiBuYXZpZ2F0aW9uLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzIEEgbWFwIG9mIGFjdGlvbiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHByb3ZpZGVkIHZhbHVlc1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMubmFtZSBOYW1lIG9mIHRoZSBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzLnZhbHVlIFZhbHVlIG9mIHRoZSBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIG9mIHRoZW0gaW4gcGFyYW1ldGVyVmFsdWVzXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNvbnRleHRzIEZvciBhIGJvdW5kIGFjdGlvbiwgYSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkIG11c3QgYmUgcHJvdmlkZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubW9kZWwgRm9yIGFuIHVuYm91bmQgYWN0aW9uLCBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBuYXZpZ2F0aW9uIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQuIE5hdmlnYXRpb24gdGFrZXMgcGxhY2UgdG8gdGhlIGNvbnRleHQgcmV0dXJuZWQgYnkgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5sYWJlbCBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uLiBUaGlzIGlzIG5lZWRlZCBpbiBjYXNlIHRoZSBhY3Rpb24gaGFzIGEgcGFyYW1ldGVyIGFuZCBhIHBhcmFtZXRlciBkaWFsb2cgaXMgc2hvd24gdG8gdGhlIHVzZXIuIFRoZSBsYWJlbCB3aWxsIGJlIHVzZWQgZm9yIHRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIGFuZCBmb3IgdGhlIGNvbmZpcm1hdGlvbiBidXR0b25cblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogJ0NoYW5nZVNldCcgdG8gcHV0IGFsbCBhY3Rpb24gY2FsbHMgaW50byBvbmUgY2hhbmdlc2V0LCAnSXNvbGF0ZWQnIHRvIHB1dCB0aGVtIGludG8gc2VwYXJhdGUgY2hhbmdlc2V0c1xuXHQgKiBAcGFyYW0gbUV4dHJhUGFyYW1zIFBSSVZBVEVcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIG9uY2UgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZCwgcHJvdmlkaW5nIHRoZSByZXNwb25zZVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjaW52b2tlQWN0aW9uXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKiBAZmluYWxcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBpbnZva2VBY3Rpb24oXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzPzoge1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBhbnkgfTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0Y29udGV4dHM/OiBDb250ZXh0IHwgQ29udGV4dFtdO1xuXHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdH0sXG5cdFx0bUV4dHJhUGFyYW1zPzogYW55XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBvQ29udHJvbDogYW55O1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGxldCBhUGFydHM7XG5cdFx0bGV0IHNPdmVybG9hZEVudGl0eVR5cGU7XG5cdFx0bGV0IG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzOiBhbnk7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblxuXHRcdGxldCBtUGFyYW1ldGVyczogYW55ID0gbUluUGFyYW1ldGVycyB8fCB7fTtcblx0XHQvLyBEdWUgdG8gYSBtaXN0YWtlIHRoZSBpbnZva2VBY3Rpb24gaW4gdGhlIGV4dGVuc2lvbkFQSSBoYWQgYSBkaWZmZXJlbnQgQVBJIHRoYW4gdGhpcyBvbmUuXG5cdFx0Ly8gVGhlIG9uZSBmcm9tIHRoZSBleHRlbnNpb25BUEkgZG9lc24ndCBleGlzdCBhbnltb3JlIGFzIHdlIGV4cG9zZSB0aGUgZnVsbCBlZGl0IGZsb3cgbm93IGJ1dFxuXHRcdC8vIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc3RpbGwgbmVlZCB0byBzdXBwb3J0IHRoZSBvbGQgc2lnbmF0dXJlXG5cdFx0aWYgKFxuXHRcdFx0KG1QYXJhbWV0ZXJzLmlzQSAmJiBtUGFyYW1ldGVycy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dFwiKSkgfHxcblx0XHRcdEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMpIHx8XG5cdFx0XHRtRXh0cmFQYXJhbXMgIT09IHVuZGVmaW5lZFxuXHRcdCkge1xuXHRcdFx0Y29uc3QgY29udGV4dHMgPSBtUGFyYW1ldGVycztcblx0XHRcdG1QYXJhbWV0ZXJzID0gbUV4dHJhUGFyYW1zIHx8IHt9O1xuXHRcdFx0aWYgKGNvbnRleHRzKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gY29udGV4dHM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5tb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUgPSBtUGFyYW1ldGVycy5yZXF1aXJlc05hdmlnYXRpb24gfHwgbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGU7XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgdGhlIHJlZmVyZW5jZWQgYWN0aW9uIGlzIGJvdW5kIG9yIHVuYm91bmRcblx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhZGF0YSA9IGNvbnZlcnRUeXBlcyh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpPy5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbCk7XG5cdFx0Ly8gVGhlIEVudGl0eUNvbnRhaW5lciBtYXkgTk9UIGJlIG1pc3NpbmcsIHNvIGl0IHNob3VsZCBub3QgYmUgYWJsZSB0byBiZSB1bmRlZmluZWQsIGJ1dCBzaW5jZSBpbiBvdXIgY29udmVydGVkIE1ldGFkYXRhXG5cdFx0Ly8gaXQgY2FuIGJlIHVuZGVmaW5lZCwgSSBuZWVkIHRoaXMgd29ya2Fyb3VuZCBoZXJlIG9mIGFkZGluZyBcIlwiIHNpbmNlIGluZGV4T2YgZG9lcyBub3QgYWNjZXB0IHNvbWV0aGluZyB0aGF0J3Ncblx0XHQvLyB1bmRlZmluZWQuXG5cdFx0aWYgKHNBY3Rpb25OYW1lLmluZGV4T2YoXCJcIiArIGNvbnZlcnRlZE1ldGFkYXRhLmVudGl0eUNvbnRhaW5lci5uYW1lKSA+IC0xKSB7XG5cdFx0XHQvLyBVbmJvdW5kIGFjdGlvbnMgYXJlIGFsd2F5cyByZWZlcmVuY2VkIHZpYSB0aGUgYWN0aW9uIGltcG9ydCBhbmQgd2UgZm91bmQgdGhlIEVudGl0eUNvbnRhaW5lciBpbiB0aGUgc0FjdGlvbk5hbWUgc29cblx0XHRcdC8vIGFuIHVuYm91bmQgYWN0aW9uIGlzIHJlZmVyZW5jZWQhXG5cdFx0XHRtUGFyYW1ldGVycy5pc0JvdW5kID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIE5vIGVudGl0eSBjb250YWluZXIgaW4gdGhlIHNBY3Rpb25OYW1lLCBzbyBlaXRoZXIgYSBib3VuZCBvciBzdGF0aWMgYWN0aW9uIGlzIHJlZmVyZW5jZWQgd2hpY2ggaXMgYWxzbyBib3VuZCFcblx0XHRcdG1QYXJhbWV0ZXJzLmlzQm91bmQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICghbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCkge1xuXHRcdFx0bVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdH1cblxuXHRcdGlmIChtUGFyYW1ldGVycy5jb250cm9sSWQpIHtcblx0XHRcdG9Db250cm9sID0gdGhpcy5nZXRWaWV3KCkuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpO1xuXHRcdFx0aWYgKG9Db250cm9sKSB7XG5cdFx0XHRcdC8vIFRPRE86IGN1cnJlbnRseSB0aGlzIHNlbGVjdGVkIGNvbnRleHRzIHVwZGF0ZSBpcyBkb25lIHdpdGhpbiB0aGUgb3BlcmF0aW9uLCBzaG91bGQgYmUgbW92ZWQgb3V0XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gb0NvbnRyb2wuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdH1cblxuXHRcdGlmIChzQWN0aW9uTmFtZSAmJiBzQWN0aW9uTmFtZS5pbmRleE9mKFwiKFwiKSA+IC0xKSB7XG5cdFx0XHQvLyBnZXQgZW50aXR5IHR5cGUgb2YgYWN0aW9uIG92ZXJsb2FkIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgYWN0aW9uIHBhdGhcblx0XHRcdC8vIEV4YW1wbGUgc0FjdGlvbk5hbWUgPSBcIjxBY3Rpb25OYW1lPihDb2xsZWN0aW9uKDxPdmVybG9hZEVudGl0eVR5cGU+KSlcIlxuXHRcdFx0Ly8gc0FjdGlvbk5hbWUgPSBhUGFydHNbMF0gLS0+IDxBY3Rpb25OYW1lPlxuXHRcdFx0Ly8gc092ZXJsb2FkRW50aXR5VHlwZSA9IGFQYXJ0c1syXSAtLT4gPE92ZXJsb2FkRW50aXR5VHlwZT5cblx0XHRcdGFQYXJ0cyA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiKFwiKTtcblx0XHRcdHNBY3Rpb25OYW1lID0gYVBhcnRzWzBdO1xuXHRcdFx0c092ZXJsb2FkRW50aXR5VHlwZSA9IChhUGFydHNbYVBhcnRzLmxlbmd0aCAtIDFdIGFzIGFueSkucmVwbGFjZUFsbChcIilcIiwgXCJcIik7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmJTdGF0aWNBY3Rpb24pIHtcblx0XHRcdGlmIChvQ29udHJvbC5pc1RhYmxlQm91bmQoKSkge1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IG9Db250cm9sLmdldFJvd0JpbmRpbmcoKS5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBzQmluZGluZ1BhdGggPSBvQ29udHJvbC5kYXRhKFwicm93c0JpbmRpbmdJbmZvXCIpLnBhdGgsXG5cdFx0XHRcdFx0b0xpc3RCaW5kaW5nID0gbmV3IChPRGF0YUxpc3RCaW5kaW5nIGFzIGFueSkodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSwgc0JpbmRpbmdQYXRoKTtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBvTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc092ZXJsb2FkRW50aXR5VHlwZSAmJiBvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gdGhpcy5fZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbU1ldGFkYXRhUGF0aChcblx0XHRcdFx0XHRvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0XHRcdG9Db250cm9sLmdldFJvd0JpbmRpbmcoKSxcblx0XHRcdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtUGFyYW1ldGVycy5lbmFibGVBdXRvU2Nyb2xsKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzID0gdGhpcy5jcmVhdGVBY3Rpb25Qcm9taXNlKHNBY3Rpb25OYW1lLCBvQ29udHJvbC5zSWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iR2V0Qm91bmRDb250ZXh0ID0gdGhpcy5fZ2V0Qm91bmRDb250ZXh0KG9WaWV3LCBtUGFyYW1ldGVycyk7XG5cdFx0Ly8gTmVlZCB0byBrbm93IHRoYXQgdGhlIGFjdGlvbiBpcyBjYWxsZWQgZnJvbSBPYmplY3RQYWdlIGZvciBjaGFuZ2VTZXQgSXNvbGF0ZWQgd29ya2Fyb3VuZFxuXHRcdG1QYXJhbWV0ZXJzLmJPYmplY3RQYWdlID0gKG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KS5jb252ZXJ0ZXJUeXBlID09PSBcIk9iamVjdFBhZ2VcIjtcblxuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0XHRjb25zdCBvUmVzcG9uc2UgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jYWxsQWN0aW9uKFxuXHRcdFx0XHRzQWN0aW9uTmFtZSxcblx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKClcblx0XHRcdCk7XG5cdFx0XHRsZXQgbGlzdFJlZnJlc2hlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250ZXh0cyAmJiBtUGFyYW1ldGVycy5pc0JvdW5kID09PSB0cnVlKSB7XG5cdFx0XHRcdGxpc3RSZWZyZXNoZWQgPSBhd2FpdCB0aGlzLl9yZWZyZXNoTGlzdElmUmVxdWlyZWQoXG5cdFx0XHRcdFx0dGhpcy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKHNBY3Rpb25OYW1lLCBvUmVzcG9uc2UpLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzWzBdXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoQWN0aXZpdHlTeW5jLmlzQ29ubmVjdGVkKHRoaXMuZ2V0VmlldygpKSkge1xuXHRcdFx0XHRsZXQgYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRcdFx0aWYgKG9SZXNwb25zZSkge1xuXHRcdFx0XHRcdGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMgPSBBcnJheS5pc0FycmF5KG9SZXNwb25zZSlcblx0XHRcdFx0XHRcdD8gT2JqZWN0LmtleXMob1Jlc3BvbnNlWzBdLnZhbHVlLmdldE9iamVjdCgpKVxuXHRcdFx0XHRcdFx0OiBPYmplY3Qua2V5cyhvUmVzcG9uc2UuZ2V0T2JqZWN0KCkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5BY3Rpb24sIG1QYXJhbWV0ZXJzLmNvbnRleHRzLCBzQWN0aW9uTmFtZSwgbGlzdFJlZnJlc2hlZCwgYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl90cmlnZ2VyQ29uZmlndXJlZFN1cnZleShzQWN0aW9uTmFtZSwgVHJpZ2dlclR5cGUuYWN0aW9uKTtcblxuXHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzLmZSZXNvbHZlcihvUmVzcG9uc2UpO1xuXHRcdFx0fVxuXHRcdFx0Lypcblx0XHRcdFx0XHRXZSBzZXQgdGhlICh1cHBlcikgcGFnZXMgdG8gZGlydHkgYWZ0ZXIgYW4gZXhlY3V0aW9uIG9mIGFuIGFjdGlvblxuXHRcdFx0XHRcdFRPRE86IGdldCByaWQgb2YgdGhpcyB3b3JrYXJvdW5kXG5cdFx0XHRcdFx0VGhpcyB3b3JrYXJvdW5kIGlzIG9ubHkgbmVlZGVkIGFzIGxvbmcgYXMgdGhlIG1vZGVsIGRvZXMgbm90IHN1cHBvcnQgdGhlIHN5bmNocm9uaXphdGlvbi5cblx0XHRcdFx0XHRPbmNlIHRoaXMgaXMgc3VwcG9ydGVkIHdlIGRvbid0IG5lZWQgdG8gc2V0IHRoZSBwYWdlcyB0byBkaXJ0eSBhbnltb3JlIGFzIHRoZSBjb250ZXh0IGl0c2VsZlxuXHRcdFx0XHRcdGlzIGFscmVhZHkgcmVmcmVzaGVkIChpdCdzIGp1c3Qgbm90IHJlZmxlY3RlZCBpbiB0aGUgb2JqZWN0IHBhZ2UpXG5cdFx0XHRcdFx0d2UgZXhwbGljaXRseSBkb24ndCBjYWxsIHRoaXMgbWV0aG9kIGZyb20gdGhlIGxpc3QgcmVwb3J0IGJ1dCBvbmx5IGNhbGwgaXQgZnJvbSB0aGUgb2JqZWN0IHBhZ2Vcblx0XHRcdFx0XHRhcyBpZiBpdCBpcyBjYWxsZWQgaW4gdGhlIGxpc3QgcmVwb3J0IGl0J3Mgbm90IG5lZWRlZCAtIGFzIHdlIGFueXdheSB3aWxsIHJlbW92ZSB0aGlzIGxvZ2ljXG5cdFx0XHRcdFx0d2UgY2FuIGxpdmUgd2l0aCB0aGlzXG5cdFx0XHRcdFx0d2UgbmVlZCBhIGNvbnRleHQgdG8gc2V0IHRoZSB1cHBlciBwYWdlcyB0byBkaXJ0eSAtIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHdlIHVzZSB0aGVcblx0XHRcdFx0XHRmaXJzdCBvbmUgYXMgdGhleSBhcmUgYW55d2F5IHNpYmxpbmdzXG5cdFx0XHRcdFx0Ki9cblx0XHRcdGlmIChtUGFyYW1ldGVycy5jb250ZXh0cykge1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgc0FjdGlvbk5hbWUpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmlzTmF2aWdhYmxlKSB7XG5cdFx0XHRcdGxldCB2Q29udGV4dCA9IG9SZXNwb25zZTtcblx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodkNvbnRleHQpICYmIHZDb250ZXh0Lmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdHZDb250ZXh0ID0gdkNvbnRleHRbMF0udmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHZDb250ZXh0ICYmICFBcnJheS5pc0FycmF5KHZDb250ZXh0KSkge1xuXHRcdFx0XHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvVmlldy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0TWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHZDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0Y29uc3QgX2ZuVmFsaWRDb250ZXh0cyA9IChjb250ZXh0czogYW55LCBhcHBsaWNhYmxlQ29udGV4dHM6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRleHRzLmZpbHRlcigoZWxlbWVudDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChhcHBsaWNhYmxlQ29udGV4dHMpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gYXBwbGljYWJsZUNvbnRleHRzLmluZGV4T2YoZWxlbWVudCkgPiAtMTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0Y29uc3Qgb0FjdGlvbkNvbnRleHQgPSBBcnJheS5pc0FycmF5KG1QYXJhbWV0ZXJzLmNvbnRleHRzKVxuXHRcdFx0XHRcdFx0PyBfZm5WYWxpZENvbnRleHRzKG1QYXJhbWV0ZXJzLmNvbnRleHRzLCBtUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dHMpWzBdXG5cdFx0XHRcdFx0XHQ6IG1QYXJhbWV0ZXJzLmNvbnRleHRzO1xuXHRcdFx0XHRcdGNvbnN0IHNBY3Rpb25Db250ZXh0TWV0YVBhdGggPSBvQWN0aW9uQ29udGV4dCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0aWYgKHNDb250ZXh0TWV0YVBhdGggIT0gdW5kZWZpbmVkICYmIHNDb250ZXh0TWV0YVBhdGggPT09IHNBY3Rpb25Db250ZXh0TWV0YVBhdGgpIHtcblx0XHRcdFx0XHRcdGlmIChvQWN0aW9uQ29udGV4dC5nZXRQYXRoKCkgIT09IHZDb250ZXh0LmdldFBhdGgoKSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsUm91dGluZygpLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dCh2Q29udGV4dCwge1xuXHRcdFx0XHRcdFx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdG5vSGlzdG9yeUVudHJ5OiBmYWxzZVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdExvZy5pbmZvKFwiTmF2aWdhdGlvbiB0byB0aGUgc2FtZSBjb250ZXh0IGlzIG5vdCBhbGxvd2VkXCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG9SZXNwb25zZTtcblx0XHR9IGNhdGNoIChlcnI6IGFueSkge1xuXHRcdFx0aWYgKG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzKSB7XG5cdFx0XHRcdG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzLmZSZWplY3RvcigpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gRklYTUU6IGluIG1vc3Qgc2l0dWF0aW9ucyB0aGVyZSBpcyBubyBoYW5kbGVyIGZvciB0aGUgcmVqZWN0ZWQgcHJvbWlzZXMgcmV0dXJuZWRxXG5cdFx0XHRpZiAoZXJyID09PSBDb25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nKSB7XG5cdFx0XHRcdC8vIFRoaXMgbGVhZHMgdG8gY29uc29sZSBlcnJvci4gQWN0dWFsbHkgdGhlIGVycm9yIGlzIGFscmVhZHkgaGFuZGxlZCAoY3VycmVudGx5IGRpcmVjdGx5IGluIHByZXNzIGhhbmRsZXIgb2YgZW5kIGJ1dHRvbiBpbiBkaWFsb2cpLCBzbyBpdCBzaG91bGQgbm90IGJlIGZvcndhcmRlZFxuXHRcdFx0XHQvLyB1cCB0byBoZXJlLiBIb3dldmVyLCB3aGVuIGRpYWxvZyBoYW5kbGluZyBhbmQgYmFja2VuZCBleGVjdXRpb24gYXJlIHNlcGFyYXRlZCwgaW5mb3JtYXRpb24gd2hldGhlciBkaWFsb2cgd2FzIGNhbmNlbGxlZCwgb3IgYmFja2VuZCBleGVjdXRpb24gaGFzIGZhaWxlZCBuZWVkc1xuXHRcdFx0XHQvLyB0byBiZSB0cmFuc3BvcnRlZCB0byB0aGUgcGxhY2UgcmVzcG9uc2libGUgZm9yIGNvbm5lY3RpbmcgdGhlc2UgdHdvIHRoaW5ncy5cblx0XHRcdFx0Ly8gVE9ETzogcmVtb3ZlIHNwZWNpYWwgaGFuZGxpbmcgb25lIGRpYWxvZyBoYW5kbGluZyBhbmQgYmFja2VuZCBleGVjdXRpb24gYXJlIHNlcGFyYXRlZFxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJEaWFsb2cgY2FuY2VsbGVkXCIpO1xuXHRcdFx0fSBlbHNlIGlmICghKGVyciAmJiAoZXJyLmNhbmNlbGVkIHx8IChlcnIucmVqZWN0ZWRJdGVtcyAmJiBlcnIucmVqZWN0ZWRJdGVtc1swXS5jYW5jZWxlZCkpKSkge1xuXHRcdFx0XHQvLyBUT0RPOiBhbmFseXplLCB3aGV0aGVyIHRoaXMgaXMgb2YgdGhlIHNhbWUgY2F0ZWdvcnkgYXMgYWJvdmVcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBFZGl0Rmxvdy5pbnZva2VBY3Rpb246JHtlcnJ9YCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBUT0RPOiBBbnkgdW5leHBlY3RlZCBlcnJvcnMgcHJvYmFibHkgc2hvdWxkIG5vdCBiZSBpZ25vcmVkIVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTZWN1cmVkIGV4ZWN1dGlvbiBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb24uIEVuc3VyZXMgdGhhdCB0aGUgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCB3aGVuIGNlcnRhaW4gY29uZGl0aW9ucyBhcmUgZnVsZmlsbGVkLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIGZuRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLiBTaG91bGQgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IGlzIHNldHRsZWQgYWZ0ZXIgY29tcGxldGlvbiBvZiB0aGUgZXhlY3V0aW9uLiBJZiBub3RoaW5nIGlzIHJldHVybmVkLCBpbW1lZGlhdGUgY29tcGxldGlvbiBpcyBhc3N1bWVkLlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgRGVmaW5pdGlvbnMgb2YgdGhlIHByZWNvbmRpdGlvbnMgdG8gYmUgY2hlY2tlZCBiZWZvcmUgZXhlY3V0aW9uXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5IERlZmluZXMgdGhlIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5LnNldCBUcmlnZ2VycyBhIGJ1c3kgaW5kaWNhdG9yIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuYnVzeS5jaGVjayBFeGVjdXRlcyBmdW5jdGlvbiBvbmx5IGlmIGFwcGxpY2F0aW9uIGlzbid0IGJ1c3kuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy51cGRhdGVzRG9jdW1lbnQgVGhpcyBvcGVyYXRpb24gdXBkYXRlcyB0aGUgY3VycmVudCBkb2N1bWVudCB3aXRob3V0IHVzaW5nIHRoZSBib3VuZCBtb2RlbCBhbmQgY29udGV4dC4gQXMgYSByZXN1bHQsIHRoZSBkcmFmdCBzdGF0dXMgaXMgdXBkYXRlZCBpZiBhIGRyYWZ0IGRvY3VtZW50IGV4aXN0cywgYW5kIHRoZSB1c2VyIGhhcyB0byBjb25maXJtIHRoZSBjYW5jZWxsYXRpb24gb2YgdGhlIGVkaXRpbmcgcHJvY2Vzcy5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgaXMgcmVqZWN0ZWQgaWYgdGhlIGV4ZWN1dGlvbiBpcyBwcm9oaWJpdGVkIGFuZCByZXNvbHZlZCBieSB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSB0aGUgZm5GdW5jdGlvbi5cblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3NlY3VyZWRFeGVjdXRpb25cblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0c2VjdXJlZEV4ZWN1dGlvbihcblx0XHRmbkZ1bmN0aW9uOiBGdW5jdGlvbixcblx0XHRtUGFyYW1ldGVycz86IHtcblx0XHRcdGJ1c3k/OiB7XG5cdFx0XHRcdHNldD86IGJvb2xlYW47XG5cdFx0XHRcdGNoZWNrPzogYm9vbGVhbjtcblx0XHRcdH07XG5cdFx0XHR1cGRhdGVzRG9jdW1lbnQ/OiBib29sZWFuO1xuXHRcdH1cblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgYkJ1c3lTZXQgPSBtUGFyYW1ldGVycz8uYnVzeT8uc2V0ID8/IHRydWUsXG5cdFx0XHRiQnVzeUNoZWNrID0gbVBhcmFtZXRlcnM/LmJ1c3k/LmNoZWNrID8/IHRydWUsXG5cdFx0XHRiVXBkYXRlc0RvY3VtZW50ID0gbVBhcmFtZXRlcnM/LnVwZGF0ZXNEb2N1bWVudCA/PyBmYWxzZSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCksXG5cdFx0XHRvQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRiSXNEcmFmdCA9IG9Db250ZXh0ICYmIHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCBhcyBDb250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdGlmIChiQnVzeUNoZWNrICYmIEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJBcHBsaWNhdGlvbiBhbHJlYWR5IGJ1c3kgdGhlcmVmb3JlIGV4ZWN1dGlvbiByZWplY3RlZFwiKTtcblx0XHR9XG5cblx0XHQvLyB3ZSBoYXZlIHRvIHNldCBidXN5IGFuZCBkcmFmdCBpbmRpY2F0b3IgaW1tZWRpYXRlbHkgYWxzbyB0aGUgZnVuY3Rpb24gbWlnaHQgYmUgZXhlY3V0ZWQgbGF0ZXIgaW4gcXVldWVcblx0XHRpZiAoYkJ1c3lTZXQpIHtcblx0XHRcdEJ1c3lMb2NrZXIubG9jayhvTG9ja09iamVjdCk7XG5cdFx0fVxuXHRcdGlmIChiVXBkYXRlc0RvY3VtZW50ICYmIGJJc0RyYWZ0KSB7XG5cdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLlNhdmluZyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soZm5GdW5jdGlvbiBhcyAoKSA9PiBhbnkpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGlmIChiVXBkYXRlc0RvY3VtZW50KSB7XG5cdFx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoYklzRHJhZnQpIHtcblx0XHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3Qob0Vycm9yKTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIHBhdGNoU2VudCBldmVudDogcmVnaXN0ZXIgZG9jdW1lbnQgbW9kaWZpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50IFRoZSBldmVudCBzZW50IGJ5IHRoZSBiaW5kaW5nXG5cdCAqL1xuXHRoYW5kbGVQYXRjaFNlbnQob0V2ZW50OiBFdmVudCkge1xuXHRcdC8vIEluIGNvbGxhYm9yYXRpdmUgZHJhZnQsIGRpc2FibGUgRVRhZyBjaGVjayBmb3IgUEFUQ0ggcmVxdWVzdHNcblx0XHRjb25zdCBpc0luQ29sbGFib3JhdGl2ZURyYWZ0ID0gQWN0aXZpdHlTeW5jLmlzQ29ubmVjdGVkKHRoaXMuZ2V0VmlldygpKTtcblx0XHRpZiAoaXNJbkNvbGxhYm9yYXRpdmVEcmFmdCkge1xuXHRcdFx0KChvRXZlbnQuZ2V0U291cmNlKCkgYXMgQmluZGluZykuZ2V0TW9kZWwoKSBhcyBhbnkpLnNldElnbm9yZUVUYWcodHJ1ZSk7XG5cdFx0fVxuXHRcdGlmICghKHRoaXMuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KT8uZ2V0UHJvcGVydHkoXCJza2lwUGF0Y2hIYW5kbGVyc1wiKSkge1xuXHRcdFx0Y29uc3Qgc291cmNlQmluZGluZyA9IG9FdmVudC5nZXRTb3VyY2UoKSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHRcdFx0Ly8gQ3JlYXRlIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiB0aGUgcGF0aCBpcyBjb21wbGV0ZWRcblx0XHRcdGNvbnN0IG9QYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdG9FdmVudC5nZXRTb3VyY2UoKS5hdHRhY2hFdmVudE9uY2UoXCJwYXRjaENvbXBsZXRlZFwiLCAocGF0Y2hDb21wbGV0ZWRFdmVudDogYW55KSA9PiB7XG5cdFx0XHRcdFx0Ly8gUmUtZW5hYmxlIEVUYWcgY2hlY2tzXG5cdFx0XHRcdFx0aWYgKGlzSW5Db2xsYWJvcmF0aXZlRHJhZnQpIHtcblx0XHRcdFx0XHRcdCgob0V2ZW50LmdldFNvdXJjZSgpIGFzIEJpbmRpbmcpLmdldE1vZGVsKCkgYXMgYW55KS5zZXRJZ25vcmVFVGFnKGZhbHNlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAob0V2ZW50LmdldFNvdXJjZSgpLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCIpKSB7XG5cdFx0XHRcdFx0XHRBY3Rpb25SdW50aW1lLnNldEFjdGlvbkVuYWJsZW1lbnRBZnRlclBhdGNoKFxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKSxcblx0XHRcdFx0XHRcdFx0c291cmNlQmluZGluZyxcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGJTdWNjZXNzID0gcGF0Y2hDb21wbGV0ZWRFdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0XHRcdGlmIChiU3VjY2Vzcykge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLnVwZGF0ZURvY3VtZW50KHNvdXJjZUJpbmRpbmcsIG9QYXRjaFByb21pc2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBDcmVhdGVBY3RpdmF0ZSBldmVudC5cblx0ICpcblx0ICogQHBhcmFtIG9FdmVudCBUaGUgZXZlbnQgc2VudCBieSB0aGUgYmluZGluZ1xuXHQgKi9cblx0YXN5bmMgaGFuZGxlQ3JlYXRlQWN0aXZhdGUob0V2ZW50OiBFdmVudCkge1xuXHRcdGNvbnN0IG9CaW5kaW5nID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGJBdEVuZCA9IHRydWU7XG5cdFx0Y29uc3QgYkluYWN0aXZlID0gdHJ1ZTtcblx0XHRjb25zdCBvUGFyYW1zOiBhbnkgPSB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IENyZWF0aW9uTW9kZS5JbmxpbmUsXG5cdFx0XHRjcmVhdGVBdEVuZDogYkF0RW5kLFxuXHRcdFx0aW5hY3RpdmU6IGJJbmFjdGl2ZSxcblx0XHRcdGtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQ6IGZhbHNlLCAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0YnVzeU1vZGU6IFwiTm9uZVwiXG5cdFx0fTtcblx0XHR0cnkge1xuXHRcdFx0Ly8gU2VuZCBub3RpZmljYXRpb24gdG8gb3RoZXIgdXNlcnMgb25seSBhZnRlciB0aGUgY3JlYXRpb24gaGFzIGJlZW4gZmluYWxpemVkXG5cdFx0XHRjb25zdCBhY3RpdmF0ZWRDb250ZXh0ID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImNvbnRleHRcIikgYXMgQ29udGV4dDtcblx0XHRcdGFjdGl2YXRlZENvbnRleHRcblx0XHRcdFx0LmNyZWF0ZWQoKVxuXHRcdFx0XHQ/LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX3NlbmRBY3Rpdml0eShBY3Rpdml0eS5DcmVhdGUsIGFjdGl2YXRlZENvbnRleHQpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKCkgPT4ge1xuXHRcdFx0XHRcdExvZy53YXJuaW5nKGBGYWlsZWQgdG8gYWN0aXZhdGUgY29udGV4dCAke2FjdGl2YXRlZENvbnRleHQuZ2V0UGF0aCgpfWApO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0Ly8gQ3JlYXRlIGEgbmV3IGluYWN0aXZlIGNvbnRleHQgKGVtcHR5IHJvdyBpbiB0aGUgdGFibGUpXG5cdFx0XHRjb25zdCBuZXdJbmFjdGl2ZUNvbnRleHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jcmVhdGVEb2N1bWVudChcblx0XHRcdFx0b0JpbmRpbmcgYXMgT0RhdGFMaXN0QmluZGluZyxcblx0XHRcdFx0b1BhcmFtcyxcblx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRmYWxzZVxuXHRcdFx0KTtcblx0XHRcdGlmIChuZXdJbmFjdGl2ZUNvbnRleHQpIHtcblx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkZhaWxlZCB0byBhY3RpdmF0ZSBuZXcgcm93IC1cIiwgZXJyb3IgYXMgYW55KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUGVyZm9ybXMgYSB0YXNrIGluIHN5bmMgd2l0aCBvdGhlciB0YXNrcyBjcmVhdGVkIHZpYSB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBSZXR1cm5zIHRoZSBwcm9taXNlIGNoYWluIG9mIHRoZSB0YXNrLlxuXHQgKlxuXHQgKiBAcGFyYW0gW25ld1Rhc2tdIE9wdGlvbmFsLCBhIHByb21pc2Ugb3IgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgc3luY2hyb25vdXNseVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIHRhc2sgaXMgY29tcGxldGVkXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRzeW5jVGFzayhuZXdUYXNrPzogKCgpID0+IGFueSkgfCBQcm9taXNlPGFueT4pIHtcblx0XHRpZiAobmV3VGFzaykge1xuXHRcdFx0aWYgKHR5cGVvZiBuZXdUYXNrID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0dGhpcy5zeW5jVGFza3MgPSB0aGlzLnN5bmNUYXNrcy50aGVuKG5ld1Rhc2spLmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5zeW5jVGFza3MgPSB0aGlzLnN5bmNUYXNrc1xuXHRcdFx0XHRcdC50aGVuKCgpID0+IG5ld1Rhc2spXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFza3M7XG5cdH1cblxuXHQvKipcblx0ICogRGVjaWRlcyBpZiBhIGRvY3VtZW50IGlzIHRvIGJlIHNob3duIGluIGRpc3BsYXkgb3IgZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0byBiZSBkaXNwbGF5ZWQgb3IgZWRpdGVkXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGVkaXQgbW9kZSBpcyBjb21wdXRlZFxuXHQgKi9cblxuXHRhc3luYyBjb21wdXRlRWRpdE1vZGUoY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHByb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwoY29udGV4dCk7XG5cblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdGNvbnN0IGdsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVQZW5kaW5nXCIsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IGlzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdGlmIChpc0FjdGl2ZUVudGl0eSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0XHQvLyBpbiBjYXNlIHRoZSBkb2N1bWVudCBpcyBkcmFmdCBzZXQgaXQgaW4gZWRpdCBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSk7XG5cdFx0XHRcdFx0Y29uc3QgaGFzQWN0aXZlRW50aXR5ID0gYXdhaXQgY29udGV4dC5yZXF1ZXN0T2JqZWN0KFwiSGFzQWN0aXZlRW50aXR5XCIpO1xuXHRcdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUodW5kZWZpbmVkLCAhaGFzQWN0aXZlRW50aXR5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBhY3RpdmUgZG9jdW1lbnQsIHN0YXkgb24gZGlzcGxheSBtb2RlXG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5EaXNwbGF5LCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVBlbmRpbmdcIiwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGRldGVybWluaW5nIHRoZSBlZGl0TW9kZSBmb3IgZHJhZnRcIiwgZXJyb3IpO1xuXHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBsYXN0SW52b2tlZEFjdGlvbk5hbWUgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiKTtcblx0XHRcdGlmIChsYXN0SW52b2tlZEFjdGlvbk5hbWUgJiYgdGhpcy5pc05ld0FjdGlvbkZvclN0aWNreShsYXN0SW52b2tlZEFjdGlvbk5hbWUsIGNvbnRleHQpKSB7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRWRpdGFibGUsIHRydWUpO1xuXHRcdFx0XHRpZiAoIXRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPbihjb250ZXh0KTtcblx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbE1vZGVsKCkuc2V0UHJvcGVydHkoXCIvbGFzdEludm9rZWRBY3Rpb25cIiwgdW5kZWZpbmVkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXHQvLyBQcml2YXRlIG1ldGhvZHNcblx0Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuXHQvKipcblx0ICogSW50ZXJuYWwgbWV0aG9kIHRvIGRlbGV0ZSBhIGNvbnRleHQgb3IgYW4gYXJyYXkgb2YgY29udGV4dHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0cyBUaGUgY29udGV4dChzKSB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIFBhcmFtZXRlcnMgZm9yIGRlbGV0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGFzeW5jIGRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24oY29udGV4dHM6IENvbnRleHQgfCBDb250ZXh0W10sIHBhcmFtZXRlcnM6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKHRoaXMpO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXG5cdFx0Ly8gVE9ETzogdGhpcyBzZXR0aW5nIGFuZCByZW1vdmluZyBvZiBjb250ZXh0cyBzaG91bGRuJ3QgYmUgaW4gdGhlIHRyYW5zYWN0aW9uIGhlbHBlciBhdCBhbGxcblx0XHQvLyBmb3IgdGhlIHRpbWUgYmVpbmcgSSBrZXB0IGl0IGFuZCBwcm92aWRlIHRoZSBpbnRlcm5hbCBtb2RlbCBjb250ZXh0IHRvIG5vdCBicmVhayBzb21ldGhpbmdcblx0XHRwYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0ID0gcGFyYW1ldGVycy5jb250cm9sSWRcblx0XHRcdD8gc2FwLnVpLmdldENvcmUoKS5ieUlkKHBhcmFtZXRlcnMuY29udHJvbElkKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKVxuXHRcdFx0OiBudWxsO1xuXG5cdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmRlbGV0ZURvY3VtZW50KGNvbnRleHRzLCBwYXJhbWV0ZXJzLCB0aGlzLmdldEFwcENvbXBvbmVudCgpLCByZXNvdXJjZU1vZGVsLCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkpO1xuXHR9XG5cblx0X2dldFJlc291cmNlTW9kZWwoKTogUmVzb3VyY2VNb2RlbCB7XG5cdFx0cmV0dXJuIGdldFJlc291cmNlTW9kZWwodGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRUcmFuc2FjdGlvbkhlbHBlcigpIHtcblx0XHRyZXR1cm4gVHJhbnNhY3Rpb25IZWxwZXI7XG5cdH1cblxuXHRwcml2YXRlIGdldE1lc3NhZ2VIYW5kbGVyKCkge1xuXHRcdGlmICh0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXIpIHtcblx0XHRcdHJldHVybiB0aGlzLmJhc2UubWVzc2FnZUhhbmRsZXI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVkaXQgRmxvdyB3b3JrcyBvbmx5IHdpdGggYSBnaXZlbiBtZXNzYWdlIGhhbmRsZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRJbnRlcm5hbE1vZGVsKCk6IEpTT05Nb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRHbG9iYWxVSU1vZGVsKCk6IEpTT05Nb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgY3VycmVudCBwYWdlIGNvbnRhaW5zIGEgbmV3bHkgY3JlYXRlZCBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBiQ3JlYXRpb25Nb2RlIFRydWUgaWYgdGhlIG9iamVjdCBpcyBuZXdcblx0ICovXG5cdHByaXZhdGUgc2V0Q3JlYXRpb25Nb2RlKGJDcmVhdGlvbk1vZGU6IGJvb2xlYW4pIHtcblx0XHRjb25zdCB1aU1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwidWlcIikgYXMgQ29udGV4dDtcblx0XHR0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5zZXRQcm9wZXJ0eShcImNyZWF0ZU1vZGVcIiwgYkNyZWF0aW9uTW9kZSwgdWlNb2RlbENvbnRleHQsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgYSBuZXdseSBjcmVhdGVkIG9iamVjdCBvciBub3QuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9iamVjdCBpcyBuZXdcblx0ICovXG5cdHByaXZhdGUgZ2V0Q3JlYXRpb25Nb2RlKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHVpTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJ1aVwiKSBhcyBDb250ZXh0O1xuXHRcdHJldHVybiAhIXRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFwiY3JlYXRlTW9kZVwiLCB1aU1vZGVsQ29udGV4dCk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG9iamVjdCBiZWluZyBlZGl0ZWQgKG9yIG9uZSBvZiBpdHMgc3ViLW9iamVjdHMpIGhhcyBiZWVuIG1vZGlmaWVkIG9yIG5vdC5cblx0ICpcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkXG5cdCAqL1xuXHRwcml2YXRlIGlzRG9jdW1lbnRNb2RpZmllZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gISF0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5nZXRQcm9wZXJ0eShcIi9pc0RvY3VtZW50TW9kaWZpZWRcIik7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBvYmplY3QgYmVpbmcgZWRpdGVkIChvciBvbmUgb2YgaXRzIHN1Yi1vYmplY3RzKSBoYXMgYmVlbiBtb2RpZmllZC5cblx0ICpcblx0ICogQHBhcmFtIG1vZGlmaWVkIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXREb2N1bWVudE1vZGlmaWVkKG1vZGlmaWVkOiBib29sZWFuKSB7XG5cdFx0dGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuc2V0UHJvcGVydHkoXCIvaXNEb2N1bWVudE1vZGlmaWVkXCIsIG1vZGlmaWVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIG9iamVjdCBiZWluZyBlZGl0ZWQgaGFzIGJlZW4gbW9kaWZpZWQgYnkgY3JlYXRpbmcgYSBzdWItb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gbGlzdEJpbmRpbmcgVGhlIGxpc3QgYmluZGluZyBvbiB3aGljaCB0aGUgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RG9jdW1lbnRNb2RpZmllZE9uQ3JlYXRlKGxpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKSB7XG5cdFx0Ly8gU2V0IHRoZSBtb2RpZmllZCBmbGFnIG9ubHkgb24gcmVsYXRpdmUgbGlzdEJpbmRpbmdzLCBpLmUuIHdoZW4gY3JlYXRpbmcgYSBzdWItb2JqZWN0XG5cdFx0Ly8gSWYgdGhlIGxpc3RCaW5kaW5nIGlzIG5vdCByZWxhdGl2ZSwgdGhlbiBpdCdzIGEgY3JlYXRpb24gZnJvbSB0aGUgTGlzdFJlcG9ydCwgYW5kIGJ5IGRlZmF1bHQgYSBuZXdseSBjcmVhdGVkIHJvb3Qgb2JqZWN0IGlzbid0IGNvbnNpZGVyZWQgYXMgbW9kaWZpZWRcblx0XHRpZiAobGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIGNyZWF0ZSBldmVudDogc2hvd3MgbWVzc2FnZXMgYW5kIGluIGNhc2Ugb2YgYSBkcmFmdCwgdXBkYXRlcyB0aGUgZHJhZnQgaW5kaWNhdG9yLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIGJpbmRpbmcgT0RhdGEgbGlzdCBiaW5kaW5nIG9iamVjdFxuXHQgKi9cblx0cHJpdmF0ZSBoYW5kbGVDcmVhdGVFdmVudHMoYmluZGluZzogT0RhdGFMaXN0QmluZGluZykge1xuXHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChiaW5kaW5nKTtcblxuXHRcdGJpbmRpbmcuYXR0YWNoRXZlbnQoXCJjcmVhdGVTZW50XCIsICgpID0+IHtcblx0XHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRiaW5kaW5nLmF0dGFjaEV2ZW50KFwiY3JlYXRlQ29tcGxldGVkXCIsIChvRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgc3VjY2VzcyA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWNjZXNzXCIpO1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhzdWNjZXNzID8gRHJhZnRTdGF0dXMuU2F2ZWQgOiBEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBkcmFmdCBzdGF0dXMgbWVzc2FnZSAoZGlzcGxheWVkIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UpLlxuXHQgKlxuXHQgKiBAcGFyYW0gZHJhZnRTdGF0dXMgVGhlIGRyYWZ0IHN0YXR1cyBtZXNzYWdlXG5cdCAqL1xuXHRzZXREcmFmdFN0YXR1cyhkcmFmdFN0YXR1czogc3RyaW5nKSB7XG5cdFx0KHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikgYXMgSlNPTk1vZGVsKS5zZXRQcm9wZXJ0eShcIi9kcmFmdFN0YXR1c1wiLCBkcmFmdFN0YXR1cywgdW5kZWZpbmVkLCB0cnVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9ncmFtbWluZyBtb2RlbCBmcm9tIGEgYmluZGluZyBvciBhIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzb3VyY2UgVGhlIGJpbmRpbmcgb3IgY29udGV4dFxuXHQgKiBAcmV0dXJucyBUaGUgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICovXG5cdHByaXZhdGUgZ2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2U6IENvbnRleHQgfCBCaW5kaW5nKTogdHlwZW9mIFByb2dyYW1taW5nTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCkuZ2V0UHJvZ3JhbW1pbmdNb2RlbChzb3VyY2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGVkaXQgbW9kZS5cblx0ICpcblx0ICogQHBhcmFtIGVkaXRNb2RlIFRoZSBlZGl0IG1vZGVcblx0ICogQHBhcmFtIGlzQ3JlYXRpb24gVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG5ld2x5IGNyZWF0ZWRcblx0ICovXG5cdHByaXZhdGUgc2V0RWRpdE1vZGUoZWRpdE1vZGU/OiBzdHJpbmcsIGlzQ3JlYXRpb24/OiBib29sZWFuKSB7XG5cdFx0Ly8gYXQgdGhpcyBwb2ludCBvZiB0aW1lIGl0J3Mgbm90IG1lYW50IHRvIHJlbGVhc2UgdGhlIGVkaXQgZmxvdyBmb3IgZnJlZXN0eWxlIHVzYWdlIHRoZXJlZm9yZSB3ZSBjYW5cblx0XHQvLyByZWx5IG9uIHRoZSBnbG9iYWwgVUkgbW9kZWwgdG8gZXhpc3Rcblx0XHRjb25zdCBnbG9iYWxNb2RlbCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0aWYgKGVkaXRNb2RlKSB7XG5cdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIsIGVkaXRNb2RlID09PSBcIkVkaXRhYmxlXCIsIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0aWYgKGlzQ3JlYXRpb24gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gU2luY2Ugc2V0Q3JlYXRpb25Nb2RlIGlzIHB1YmxpYyBpbiBFZGl0RmxvdyBhbmQgY2FuIGJlIG92ZXJyaWRlbiwgbWFrZSBzdXJlIHRvIGNhbGwgaXQgdmlhIHRoZSBjb250cm9sbGVyXG5cdFx0XHQvLyB0byBlbnN1cmUgYW55IG92ZXJyaWRlcyBhcmUgdGFrZW4gaW50byBhY2NvdW50XG5cdFx0XHR0aGlzLnNldENyZWF0aW9uTW9kZShpc0NyZWF0aW9uKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIGFuIGFjdGlvbiBjb3JyZXNwb25kcyB0byBhIGNyZWF0ZSBhY3Rpb24gZm9yIGEgc3RpY2t5IHNlc3Npb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCBmb3IgdGhlIHN0aWNreSBzZXNzaW9uXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGFjdGlvbiBpcyBhIGNyZWF0ZSBhY3Rpb25cblx0ICovXG5cdHByaXZhdGUgaXNOZXdBY3Rpb25Gb3JTdGlja3koYWN0aW9uTmFtZTogc3RyaW5nLCBjb250ZXh0OiBDb250ZXh0KSB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IGVudGl0eVNldCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkuc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdFx0Y29uc3Qgc3RpY2t5U2Vzc2lvbiA9IGVudGl0eVNldC5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkO1xuXHRcdFx0aWYgKHN0aWNreVNlc3Npb24/Lk5ld0FjdGlvbiA9PT0gYWN0aW9uTmFtZSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdGlmIChzdGlja3lTZXNzaW9uPy5BZGRpdGlvbmFsTmV3QWN0aW9ucyAmJiBzdGlja3lTZXNzaW9uPy5BZGRpdGlvbmFsTmV3QWN0aW9ucy5pbmRleE9mKGFjdGlvbk5hbWUpICE9PSAtMSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdC8vIFRPRE8gTW92ZSBhbGwgc3RpY2t5LXJlbGF0ZWQgYmVsb3cgdG8gYSBzdGlja3kgc2Vzc2lvbiBtYW5hZ2VyIGNsYXNzXG5cblx0LyoqXG5cdCAqIEVuYWJsZXMgdGhlIHN0aWNreSBlZGl0IHNlc3Npb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZFxuXHQgKiBAcmV0dXJucyBUcnVlIGluIGNhc2Ugb2Ygc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlXG5cdCAqL1xuXHRwcml2YXRlIGhhbmRsZVN0aWNreU9uKGNvbnRleHQ6IENvbnRleHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBhcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGlmIChhcHBDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bmRlZmluZWQgQXBwQ29tcG9uZW50IGZvciBmdW5jdGlvbiBoYW5kbGVTdGlja3lPblwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5oYXNOYXZpZ2F0aW9uR3VhcmQoKSkge1xuXHRcdFx0XHRjb25zdCBoYXNoVHJhY2tlciA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKTtcblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpO1xuXG5cdFx0XHRcdC8vIFNldCBhIGd1YXJkIGluIHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHQvLyBBIHRpbWVvdXQgaXMgbmVjZXNzYXJ5LCBhcyB3aXRoIGRlZmVycmVkIGNyZWF0aW9uIHRoZSBoYXNoQ2hhbmdlciBpcyBub3QgdXBkYXRlZCB5ZXQgd2l0aFxuXHRcdFx0XHQvLyB0aGUgbmV3IGhhc2gsIGFuZCB0aGUgZ3VhcmQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBtYW5hZ2VkIGhpc3Rvcnkgb2YgdGhlIHJvdXRlciBwcm94eVxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5zZXROYXZpZ2F0aW9uR3VhcmQoY29udGV4dC5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpKTtcblx0XHRcdFx0fSwgMCk7XG5cblx0XHRcdFx0Ly8gU2V0dGluZyBiYWNrIG5hdmlnYXRpb24gb24gc2hlbGwgc2VydmljZSwgdG8gZ2V0IHRoZSBkaWNhcmQgbWVzc2FnZSBib3ggaW4gY2FzZSBvZiBzdGlja3lcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbih0aGlzLm9uQmFja05hdmlnYXRpb25JblNlc3Npb24uYmluZCh0aGlzKSk7XG5cblx0XHRcdFx0dGhpcy5kaXJ0eVN0YXRlUHJvdmlkZXJGdW5jdGlvbiA9IHRoaXMuZ2V0RGlydHlTdGF0ZVByb3ZpZGVyKGFwcENvbXBvbmVudCwgaW50ZXJuYWxNb2RlbCwgaGFzaFRyYWNrZXIpO1xuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24pO1xuXG5cdFx0XHRcdC8vIGhhbmRsZSBzZXNzaW9uIHRpbWVvdXRcblx0XHRcdFx0Y29uc3QgaTE4bk1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0dGhpcy5zZXNzaW9uVGltZW91dEZ1bmN0aW9uID0gdGhpcy5nZXRTZXNzaW9uVGltZW91dEZ1bmN0aW9uKGNvbnRleHQsIGkxOG5Nb2RlbCk7XG5cdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpIGFzIGFueSkuYXR0YWNoU2Vzc2lvblRpbWVvdXQodGhpcy5zZXNzaW9uVGltZW91dEZ1bmN0aW9uKTtcblxuXHRcdFx0XHR0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbiA9IHRoaXMuZ2V0Um91dGVNYXRjaGVkRnVuY3Rpb24oY29udGV4dCwgYXBwQ29tcG9uZW50KTtcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuYXR0YWNoUm91dGVNYXRjaGVkKHRoaXMuc3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgYW55KTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNhYmxlcyB0aGUgc3RpY2t5IGVkaXQgc2Vzc2lvbi5cblx0ICpcblx0ICogQHJldHVybnMgVHJ1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZVxuXHQgKi9cblx0cHJpdmF0ZSBoYW5kbGVTdGlja3lPZmYoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9mZlwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSkge1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGV4aXRlZCBmcm9tIHRoZSBhcHAsIENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCBkb2Vzbid0IHJldHVybiBhXG5cdFx0XHRcdC8vIHNhcC5mZS5jb3JlLkFwcENvbXBvbmVudCwgaGVuY2UgdGhlICdpZicgYWJvdmVcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZGlzY2FyZE5hdmlnYXRpb25HdWFyZCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5kaXJ0eVN0YXRlUHJvdmlkZXJGdW5jdGlvbikge1xuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLmRlcmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIodGhpcy5kaXJ0eVN0YXRlUHJvdmlkZXJGdW5jdGlvbik7XG5cdFx0XHRcdHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsO1xuXHRcdFx0aWYgKG1vZGVsICYmIHRoaXMuc2Vzc2lvblRpbWVvdXRGdW5jdGlvbikge1xuXHRcdFx0XHRtb2RlbC5kZXRhY2hTZXNzaW9uVGltZW91dCh0aGlzLnNlc3Npb25UaW1lb3V0RnVuY3Rpb24pO1xuXHRcdFx0fVxuXG5cdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5kZXRhY2hSb3V0ZU1hdGNoZWQodGhpcy5zdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24pO1xuXHRcdFx0dGhpcy5zdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24gPSB1bmRlZmluZWQ7XG5cblx0XHRcdHRoaXMuc2V0RWRpdE1vZGUoRWRpdE1vZGUuRGlzcGxheSwgZmFsc2UpO1xuXG5cdFx0XHRpZiAoYXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBleGl0ZWQgZnJvbSB0aGUgYXBwLCBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQgZG9lc24ndCByZXR1cm4gYVxuXHRcdFx0XHQvLyBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQsIGhlbmNlIHRoZSAnaWYnIGFib3ZlXG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkuc2V0QmFja05hdmlnYXRpb24oKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgYW55KTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdF9zZXRTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWw6IHN0cmluZywgbW9kZWw6IE9EYXRhTW9kZWwpIHtcblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIHRydWUpO1xuXHRcdFx0aW50ZXJuYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9zdGlja3lTZXNzaW9uVG9rZW5cIiwgKG1vZGVsLmdldEh0dHBIZWFkZXJzKHRydWUpIGFzIGFueSlbXCJTQVAtQ29udGV4dElkXCJdKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIHVzZWQgYXMgYSBEaXJ0eVN0YXRlUHJvdmlkZXIgaW4gdGhlIFNoZWxsLlxuXHQgKlxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEBwYXJhbSBpbnRlcm5hbE1vZGVsIFRoZSBtb2RlbCBcImludGVybmFsXCJcblx0ICogQHBhcmFtIGhhc2hUcmFja2VyIEhhc2ggdHJhY2tlclxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0RGlydHlTdGF0ZVByb3ZpZGVyKGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBpbnRlcm5hbE1vZGVsOiBKU09OTW9kZWwsIGhhc2hUcmFja2VyOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gKG5hdmlnYXRpb25Db250ZXh0OiBhbnkpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChuYXZpZ2F0aW9uQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGZvciBEaXJ0eVN0YXRlUHJvdmlkZXIgZnVuY3Rpb25cIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCB0YXJnZXRIYXNoID0gbmF2aWdhdGlvbkNvbnRleHQuaW5uZXJBcHBSb3V0ZTtcblx0XHRcdFx0Y29uc3Qgcm91dGVyUHJveHkgPSBhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKTtcblx0XHRcdFx0bGV0IGxjbEhhc2hUcmFja2VyID0gXCJcIjtcblx0XHRcdFx0bGV0IGlzRGlydHk6IGJvb2xlYW47XG5cdFx0XHRcdGNvbnN0IGlzU2Vzc2lvbk9uID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9zZXNzaW9uT25cIik7XG5cblx0XHRcdFx0aWYgKCFpc1Nlc3Npb25Pbikge1xuXHRcdFx0XHRcdC8vIElmIHRoZSBzdGlja3kgc2Vzc2lvbiB3YXMgdGVybWluYXRlZCBiZWZvcmUgaGFuZC5cblx0XHRcdFx0XHQvLyBFeGFtcGxlIGluIGNhc2Ugb2YgbmF2aWdhdGluZyBhd2F5IGZyb20gYXBwbGljYXRpb24gdXNpbmcgSUJOLlxuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIXJvdXRlclByb3h5LmlzTmF2aWdhdGlvbkZpbmFsaXplZCgpKSB7XG5cdFx0XHRcdFx0Ly8gSWYgbmF2aWdhdGlvbiBpcyBjdXJyZW50bHkgaGFwcGVuaW5nIGluIFJvdXRlclByb3h5LCBpdCdzIGEgdHJhbnNpZW50IHN0YXRlXG5cdFx0XHRcdFx0Ly8gKG5vdCBkaXJ0eSlcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0bGNsSGFzaFRyYWNrZXIgPSB0YXJnZXRIYXNoO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGhhc2hUcmFja2VyID09PSB0YXJnZXRIYXNoKSB7XG5cdFx0XHRcdFx0Ly8gdGhlIGhhc2ggZGlkbid0IGNoYW5nZSBzbyBlaXRoZXIgdGhlIHVzZXIgYXR0ZW1wdHMgdG8gcmVmcmVzaCBvciB0byBsZWF2ZSB0aGUgYXBwXG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSBpZiAocm91dGVyUHJveHkuY2hlY2tIYXNoV2l0aEd1YXJkKHRhcmdldEhhc2gpIHx8IHJvdXRlclByb3h5LmlzR3VhcmRDcm9zc0FsbG93ZWRCeVVzZXIoKSkge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgcm9vdCBvYmplY3Rcblx0XHRcdFx0XHQvLyBvciBjcm9zc2luZyB0aGUgZ3VhcmQgaGFzIGFscmVhZHkgYmVlbiBhbGxvd2VkIGJ5IHRoZSBSb3V0ZXJQcm94eVxuXHRcdFx0XHRcdGxjbEhhc2hUcmFja2VyID0gdGFyZ2V0SGFzaDtcblx0XHRcdFx0XHRpc0RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdGhlIHVzZXIgYXR0ZW1wdHMgdG8gbmF2aWdhdGUgd2l0aGluIHRoZSBhcHAsIGZvciBleGFtcGxlIGJhY2sgdG8gdGhlIGxpc3QgcmVwb3J0XG5cdFx0XHRcdFx0aXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNEaXJ0eSkge1xuXHRcdFx0XHRcdC8vIHRoZSBGTFAgZG9lc24ndCBjYWxsIHRoZSBkaXJ0eSBzdGF0ZSBwcm92aWRlciBhbnltb3JlIG9uY2UgaXQncyBkaXJ0eSwgYXMgdGhleSBjYW4ndFxuXHRcdFx0XHRcdC8vIGNoYW5nZSB0aGlzIGR1ZSB0byBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2Ugc2V0IGl0IGJhY2sgdG8gbm90LWRpcnR5XG5cdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldERpcnR5RmxhZyhmYWxzZSk7XG5cdFx0XHRcdFx0fSwgMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aGFzaFRyYWNrZXIgPSBsY2xIYXNoVHJhY2tlcjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBpc0RpcnR5O1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLmluZm8oZXJyb3IgYXMgYW55KTtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSB1c2VkIHdoZW4gYSBzdGlja3kgc2Vzc2lvbiB0aW1lcyBvdXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBzdGlja3lDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgc3RpY2t5IHNlc3Npb25cblx0ICogQHBhcmFtIGkxOG5Nb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbihzdGlja3lDb250ZXh0OiBDb250ZXh0LCBpMThuTW9kZWw6IE1vZGVsKSB7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmIChzdGlja3lDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IG1pc3NpbmcgZm9yIFNlc3Npb25UaW1lb3V0IGZ1bmN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHJlbW92ZSB0cmFuc2llbnQgbWVzc2FnZXMgc2luY2Ugd2Ugd2lsbCBzaG93aW5nIG91ciBvd24gbWVzc2FnZVxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRcdFx0Y29uc3Qgd2FybmluZ0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBcIntzYXAuZmUuaTE4bj5DX0VESVRGTE9XX09CSkVDVF9QQUdFX1NFU1NJT05fRVhQSVJFRF9ESUFMT0dfVElUTEV9XCIsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHsgdGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX01FU1NBR0V9XCIgfSksXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogXCJ7c2FwLmZlLmkxOG4+Q19DT01NT05fRElBTE9HX09LfVwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyByZW1vdmUgc3RpY2t5IGhhbmRsaW5nIGFmdGVyIG5hdmlnYXRpb24gc2luY2Ugc2Vzc2lvbiBoYXMgYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWRcblx0XHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChzdGlja3lDb250ZXh0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHR3YXJuaW5nRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLnNldE1vZGVsKGkxOG5Nb2RlbCwgXCJzYXAuZmUuaTE4blwiKTtcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCkuYWRkRGVwZW5kZW50KHdhcm5pbmdEaWFsb2cpO1xuXHRcdFx0XHR3YXJuaW5nRGlhbG9nLm9wZW4oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIG9uUm91dGVNYXRjaGVkIGV2ZW50IGluIGNhc2Ugb2Ygc3RpY2t5IGVkaXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0IGJlaW5nIGVkaXRlZCAocm9vdCBvZiB0aGUgc3RpY2t5IHNlc3Npb24pXG5cdCAqIEBwYXJhbSBhcHBDb21wb25lbnQgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQ6IENvbnRleHQsIGFwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGNvbnN0IGN1cnJlbnRIYXNoID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0Ly8gZWl0aGVyIGN1cnJlbnQgaGFzaCBpcyBlbXB0eSBzbyB0aGUgdXNlciBsZWZ0IHRoZSBhcHAgb3IgaGUgbmF2aWdhdGVkIGF3YXkgZnJvbSB0aGUgb2JqZWN0XG5cdFx0XHRpZiAoIWN1cnJlbnRIYXNoIHx8ICFhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5jaGVja0hhc2hXaXRoR3VhcmQoY3VycmVudEhhc2gpKSB7XG5cdFx0XHRcdHRoaXMuZGlzY2FyZFN0aWNreVNlc3Npb24oY29udGV4dCk7XG5cdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdC8vY2xlYXIgdGhlIHNlc3Npb24gY29udGV4dCB0byBlbnN1cmUgdGhlIExSIHJlZnJlc2hlcyB0aGUgbGlzdCB3aXRob3V0IGEgc2Vzc2lvblxuXHRcdFx0XHRcdChjb250ZXh0LmdldE1vZGVsKCkgYXMgYW55KS5jbGVhclNlc3Npb25Db250ZXh0KCk7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogRW5kcyBhIHN0aWNreSBzZXNzaW9uIGJ5IGRpc2NhcmRpbmcgY2hhbmdlcy5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkIChyb290IG9mIHRoZSBzdGlja3kgc2Vzc2lvbilcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZGlzY2FyZFN0aWNreVNlc3Npb24oY29udGV4dDogQ29udGV4dCkge1xuXHRcdGNvbnN0IGRpc2NhcmRlZENvbnRleHQgPSBhd2FpdCBzdGlja3kuZGlzY2FyZERvY3VtZW50KGNvbnRleHQpO1xuXHRcdGlmIChkaXNjYXJkZWRDb250ZXh0Py5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRkaXNjYXJkZWRDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHR9XG5cdFx0ZGlzY2FyZGVkQ29udGV4dD8ucmVmcmVzaCgpO1xuXHRcdHRoaXMuaGFuZGxlU3RpY2t5T2ZmKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaW50ZXJuYWwgcm91dGluZyBleHRlbnNpb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBpbnRlcm5hbCByb3V0aW5nIGV4dGVuc2lvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRJbnRlcm5hbFJvdXRpbmcoKTogSW50ZXJuYWxSb3V0aW5nIHtcblx0XHRpZiAodGhpcy5iYXNlLl9yb3V0aW5nKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlLl9yb3V0aW5nO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IEZsb3cgd29ya3Mgb25seSB3aXRoIGEgZ2l2ZW4gcm91dGluZyBsaXN0ZW5lclwiKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RWaWV3Q29udHJvbGxlcigpO1xuXHR9XG5cblx0X2dldFNlbWFudGljTWFwcGluZygpOiBTZW1hbnRpY01hcHBpbmcgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0TGFzdFNlbWFudGljTWFwcGluZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgcHJvbWlzZSB0byB3YWl0IGZvciBhbiBhY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBhY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIGNvbnRyb2xJZCBUaGUgSUQgb2YgdGhlIGNvbnRyb2xcblx0ICogQHJldHVybnMge0Z1bmN0aW9ufSBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXh0ZXJuYWxseSByZXNvbHZlIHRoZSBwcm9taXNlXG5cdCAqL1xuXHRwcml2YXRlIGNyZWF0ZUFjdGlvblByb21pc2UoYWN0aW9uTmFtZTogc3RyaW5nLCBjb250cm9sSWQ6IHN0cmluZykge1xuXHRcdGxldCByZXNvbHZlRnVuY3Rpb24sIHJlamVjdEZ1bmN0aW9uO1xuXHRcdHRoaXMuYWN0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHJlc29sdmVGdW5jdGlvbiA9IHJlc29sdmU7XG5cdFx0XHRyZWplY3RGdW5jdGlvbiA9IHJlamVjdDtcblx0XHR9KS50aGVuKChvUmVzcG9uc2U6IGFueSkgPT4ge1xuXHRcdFx0cmV0dXJuIE9iamVjdC5hc3NpZ24oeyBjb250cm9sSWQgfSwgdGhpcy5nZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKGFjdGlvbk5hbWUsIG9SZXNwb25zZSkpO1xuXHRcdH0pO1xuXHRcdHJldHVybiB7IGZSZXNvbHZlcjogcmVzb2x2ZUZ1bmN0aW9uLCBmUmVqZWN0b3I6IHJlamVjdEZ1bmN0aW9uIH07XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0aGF0IGlzIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSByZXNwb25zZSBUaGUgYm91bmQgYWN0aW9uJ3MgcmVzcG9uc2UgZGF0YSBvciByZXNwb25zZSBjb250ZXh0XG5cdCAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGRhdGEgYW5kIG5hbWVzIG9mIHRoZSBrZXkgZmllbGRzIG9mIHRoZSByZXNwb25zZVxuXHQgKi9cblx0cHJpdmF0ZSBnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzKGFjdGlvbk5hbWU6IHN0cmluZywgcmVzcG9uc2U6IGFueSkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHJlc3BvbnNlKSkge1xuXHRcdFx0aWYgKHJlc3BvbnNlLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRyZXNwb25zZSA9IHJlc3BvbnNlWzBdLnZhbHVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghcmVzcG9uc2UpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0XHRjb25zdCBjdXJyZW50VmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IG1ldGFNb2RlbERhdGEgPSAoY3VycmVudFZpZXcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBhbnkpLmdldERhdGEoKTtcblx0XHRjb25zdCBhY3Rpb25SZXR1cm5UeXBlID1cblx0XHRcdG1ldGFNb2RlbERhdGEgJiYgbWV0YU1vZGVsRGF0YVthY3Rpb25OYW1lXSAmJiBtZXRhTW9kZWxEYXRhW2FjdGlvbk5hbWVdWzBdICYmIG1ldGFNb2RlbERhdGFbYWN0aW9uTmFtZV1bMF0uJFJldHVyblR5cGVcblx0XHRcdFx0PyBtZXRhTW9kZWxEYXRhW2FjdGlvbk5hbWVdWzBdLiRSZXR1cm5UeXBlLiRUeXBlXG5cdFx0XHRcdDogbnVsbDtcblx0XHRjb25zdCBrZXlzID0gYWN0aW9uUmV0dXJuVHlwZSAmJiBtZXRhTW9kZWxEYXRhW2FjdGlvblJldHVyblR5cGVdID8gbWV0YU1vZGVsRGF0YVthY3Rpb25SZXR1cm5UeXBlXS4kS2V5IDogbnVsbDtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRvRGF0YTogcmVzcG9uc2UuZ2V0T2JqZWN0KCksXG5cdFx0XHRrZXlzXG5cdFx0fTtcblx0fVxuXG5cdGdldEN1cnJlbnRBY3Rpb25Qcm9taXNlKCkge1xuXHRcdHJldHVybiB0aGlzLmFjdGlvblByb21pc2U7XG5cdH1cblxuXHRkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHR0aGlzLmFjdGlvblByb21pc2UgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRfc2Nyb2xsQW5kRm9jdXNPbkluYWN0aXZlUm93KHRhYmxlOiBUYWJsZSkge1xuXHRcdGNvbnN0IHJvd0JpbmRpbmcgPSB0YWJsZS5nZXRSb3dCaW5kaW5nKCkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRjb25zdCBhY3RpdmVSb3dJbmRleDogbnVtYmVyID0gcm93QmluZGluZy5nZXRDb3VudCgpIHx8IDA7XG5cdFx0aWYgKHRhYmxlLmRhdGEoXCJ0YWJsZVR5cGVcIikgIT09IFwiUmVzcG9uc2l2ZVRhYmxlXCIpIHtcblx0XHRcdGlmIChhY3RpdmVSb3dJbmRleCA+IDApIHtcblx0XHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChhY3RpdmVSb3dJbmRleCAtIDEpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coYWN0aXZlUm93SW5kZXgsIHRydWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvKiBJbiBhIHJlc3BvbnNpdmUgdGFibGUsIHRoZSBlbXB0eSByb3dzIGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YWJsZS4gQnV0IHdoZW4gd2UgY3JlYXRlIG1vcmUsIHRoZXkgYXBwZWFyIGJlbG93IHRoZSBuZXcgbGluZS5cblx0XHRcdCAqIFNvIHdlIGNoZWNrIHRoZSBmaXJzdCBpbmFjdGl2ZSByb3cgZmlyc3QsIHRoZW4gd2Ugc2V0IHRoZSBmb2N1cyBvbiBpdCB3aGVuIHdlIHByZXNzIHRoZSBidXR0b24uXG5cdFx0XHQgKiBUaGlzIGRvZXNuJ3QgaW1wYWN0IHRoZSBHcmlkVGFibGUgYmVjYXVzZSB0aGV5IGFwcGVhciBhdCB0aGUgZW5kLCBhbmQgd2UgYWxyZWFkeSBmb2N1cyB0aGUgYmVmb3JlLXRoZS1sYXN0IHJvdyAoYmVjYXVzZSAyIGVtcHR5IHJvd3MgZXhpc3QpXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IGFsbFJvd0NvbnRleHRzID0gcm93QmluZGluZy5nZXRDb250ZXh0cygpO1xuXHRcdFx0aWYgKCFhbGxSb3dDb250ZXh0cz8ubGVuZ3RoKSB7XG5cdFx0XHRcdHRhYmxlLmZvY3VzUm93KGFjdGl2ZVJvd0luZGV4LCB0cnVlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0bGV0IGZvY3VzUm93ID0gYWN0aXZlUm93SW5kZXgsXG5cdFx0XHRcdGluZGV4ID0gMDtcblx0XHRcdGZvciAoY29uc3Qgc2luZ2xlQ29udGV4dCBvZiBhbGxSb3dDb250ZXh0cykge1xuXHRcdFx0XHRpZiAoc2luZ2xlQ29udGV4dC5pc0luYWN0aXZlKCkgJiYgaW5kZXggPCBmb2N1c1Jvdykge1xuXHRcdFx0XHRcdGZvY3VzUm93ID0gaW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdH1cblx0XHRcdGlmIChmb2N1c1JvdyA+IDApIHtcblx0XHRcdFx0dGFibGUuc2Nyb2xsVG9JbmRleChmb2N1c1Jvdyk7XG5cdFx0XHR9XG5cdFx0XHR0YWJsZS5mb2N1c1Jvdyhmb2N1c1JvdywgdHJ1ZSk7XG5cdFx0fVxuXHR9XG5cdGFzeW5jIGNyZWF0ZUVtcHR5Um93c0FuZEZvY3VzKHRhYmxlOiBUYWJsZSkge1xuXHRcdGNvbnN0IHRhYmxlQVBJID0gdGFibGUuZ2V0UGFyZW50KCkgYXMgVGFibGVBUEk7XG5cdFx0aWYgKFxuXHRcdFx0dGFibGVBUEk/LnRhYmxlRGVmaW5pdGlvbj8uY29udHJvbD8uaW5saW5lQ3JlYXRpb25Sb3dzSGlkZGVuSW5FZGl0TW9kZSAmJlxuXHRcdFx0IXRhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwidWlcIik/LmdldFByb3BlcnR5KFwiY3JlYXRlTW9kZVwiKVxuXHRcdCkge1xuXHRcdFx0Ly8gV2l0aCB0aGUgcGFyYW1ldGVyLCB3ZSBkb24ndCBoYXZlIGVtcHR5IHJvd3MgaW4gRWRpdCBtb2RlLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGVtIGJlZm9yZSBzZXR0aW5nIHRoZSBmb2N1cyBvbiB0aGVtXG5cdFx0XHRhd2FpdCB0YWJsZUFQSS5zZXRVcEVtcHR5Um93cyh0YWJsZSwgdHJ1ZSk7XG5cdFx0fVxuXHRcdHRoaXMuX3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyh0YWJsZSk7XG5cdH1cblxuXHRfc2VuZEFjdGl2aXR5KFxuXHRcdGFjdGlvbjogQWN0aXZpdHksXG5cdFx0cmVsYXRlZENvbnRleHRzOiBDb250ZXh0IHwgQ29udGV4dFtdIHwgdW5kZWZpbmVkLFxuXHRcdGFjdGlvbk5hbWU/OiBzdHJpbmcsXG5cdFx0cmVmcmVzaExpc3RCaW5kaW5nPzogYm9vbGVhbixcblx0XHRhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzPzogc3RyaW5nW11cblx0KSB7XG5cdFx0Y29uc3QgY29udGVudCA9IEFycmF5LmlzQXJyYXkocmVsYXRlZENvbnRleHRzKSA/IHJlbGF0ZWRDb250ZXh0cy5tYXAoKGNvbnRleHQpID0+IGNvbnRleHQuZ2V0UGF0aCgpKSA6IHJlbGF0ZWRDb250ZXh0cz8uZ2V0UGF0aCgpO1xuXHRcdEFjdGl2aXR5U3luYy5zZW5kKHRoaXMuZ2V0VmlldygpLCBhY3Rpb24sIGNvbnRlbnQsIGFjdGlvbk5hbWUsIHJlZnJlc2hMaXN0QmluZGluZywgYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyk7XG5cdH1cblxuXHRfdHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkoc0FjdGlvbk5hbWU6IHN0cmluZywgdHJpZ2dlclR5cGU6IFRyaWdnZXJUeXBlKSB7XG5cdFx0dHJpZ2dlckNvbmZpZ3VyZWRTdXJ2ZXkodGhpcy5nZXRWaWV3KCksIHNBY3Rpb25OYW1lLCB0cmlnZ2VyVHlwZSk7XG5cdH1cblxuXHRhc3luYyBfc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQ6IGFueSk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdG9Mb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gU3VibWl0IGFueSBsZWZ0b3ZlciBjaGFuZ2VzIHRoYXQgYXJlIG5vdCB5ZXQgc3VibWl0dGVkXG5cdFx0XHQvLyBDdXJyZW50bHkgd2UgYXJlIHVzaW5nIG9ubHkgMSB1cGRhdGVHcm91cElkLCBoZW5jZSBzdWJtaXR0aW5nIHRoZSBiYXRjaCBkaXJlY3RseSBoZXJlXG5cdFx0XHRhd2FpdCBvTW9kZWwuc3VibWl0QmF0Y2goXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gV2FpdCBmb3IgYWxsIGN1cnJlbnRseSBydW5uaW5nIGNoYW5nZXNcblx0XHRcdC8vIEZvciB0aGUgdGltZSBiZWluZyB3ZSBhZ3JlZWQgd2l0aCB0aGUgdjQgbW9kZWwgdGVhbSB0byB1c2UgYW4gaW50ZXJuYWwgbWV0aG9kLiBXZSdsbCByZXBsYWNlIGl0IG9uY2Vcblx0XHRcdC8vIGEgcHVibGljIG9yIHJlc3RyaWN0ZWQgbWV0aG9kIHdhcyBwcm92aWRlZFxuXHRcdFx0YXdhaXQgb01vZGVsLm9SZXF1ZXN0b3Iud2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0cyhcIiRhdXRvXCIpO1xuXG5cdFx0XHQvLyBDaGVjayBpZiBhbGwgY2hhbmdlcyB3ZXJlIHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHlcblx0XHRcdGlmIChvTW9kZWwuaGFzUGVuZGluZ0NoYW5nZXMoXCIkYXV0b1wiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJzdWJtaXQgb2Ygb3BlbiBjaGFuZ2VzIGZhaWxlZFwiKTtcblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob0xvY2tPYmplY3QpKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfcmVtb3ZlU3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcpIHtcblx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB0aGlzLmdldEludGVybmFsTW9kZWwoKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIsIGZhbHNlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIHVuZGVmaW5lZCk7XG5cdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9mZigpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gZGlzcGxheSBhICdkaXNjYXJkJyBwb3BvdmVyIHdoZW4gZXhpdGluZyBhIHN0aWNreSBzZXNzaW9uLlxuXHQgKi9cblx0cHJpdmF0ZSBvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uKCkge1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCByb3V0ZXJQcm94eSA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmIChyb3V0ZXJQcm94eS5jaGVja0lmQmFja0lzT3V0T2ZHdWFyZCgpKSB7XG5cdFx0XHRjb25zdCBiaW5kaW5nQ29udGV4dCA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChiaW5kaW5nQ29udGV4dCk7XG5cblx0XHRcdHN0aWNreS5wcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24oXG5cdFx0XHRcdGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRpc2NhcmRTdGlja3lTZXNzaW9uKGJpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWwpO1xuXHRcdFx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR2aWV3LFxuXHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGhpc3RvcnkuYmFjaygpO1xuXHR9XG5cblx0YXN5bmMgX2hhbmRsZU5ld0NvbnRleHQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0YkVkaXRhYmxlOiBib29sZWFuLFxuXHRcdGJSZWNyZWF0ZUNvbnRleHQ6IGJvb2xlYW4sXG5cdFx0YkRyYWZ0TmF2aWdhdGlvbjogYm9vbGVhbixcblx0XHRiRm9yY2VGb2N1cyA9IGZhbHNlXG5cdCkge1xuXHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHtcblx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlLFxuXHRcdFx0ZWRpdGFibGU6IGJFZGl0YWJsZSxcblx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IHRydWUsXG5cdFx0XHRiUmVjcmVhdGVDb250ZXh0OiBiUmVjcmVhdGVDb250ZXh0LFxuXHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogYkRyYWZ0TmF2aWdhdGlvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogZmFsc2UsXG5cdFx0XHRiRm9yY2VGb2N1czogYkZvcmNlRm9jdXMsXG5cdFx0XHRrZWVwQ3VycmVudExheW91dDogdHJ1ZVxuXHRcdH0pO1xuXHR9XG5cblx0X2dldEJvdW5kQ29udGV4dCh2aWV3OiBhbnksIHBhcmFtczogYW55KSB7XG5cdFx0Y29uc3Qgdmlld0xldmVsID0gdmlldy5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbDtcblx0XHRjb25zdCBiUmVmcmVzaEFmdGVyQWN0aW9uID0gdmlld0xldmVsID4gMSB8fCAodmlld0xldmVsID09PSAxICYmIHBhcmFtcy5jb250cm9sSWQpO1xuXHRcdHJldHVybiAhcGFyYW1zLmlzTmF2aWdhYmxlIHx8ICEhYlJlZnJlc2hBZnRlckFjdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gKHBhcnNlKSBlcnJvcnMgZm9yIGNvbnRyb2xzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dFxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9yc1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRpb24gZXJyb3JzLCBhbmQgcmVqZWN0cyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiBlcnJvcnNcblx0ICovXG5cblx0X2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpIHtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzaygpLnRoZW4oKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc1ZpZXdJZCA9IHRoaXMuZ2V0VmlldygpLmdldElkKCk7XG5cdFx0XHRjb25zdCBhTWVzc2FnZXMgPSBzYXAudWkuZ2V0Q29yZSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0bGV0IG9Db250cm9sO1xuXHRcdFx0bGV0IG9NZXNzYWdlO1xuXG5cdFx0XHRpZiAoIWFNZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcIk5vIHZhbGlkYXRpb24gZXJyb3JzIGZvdW5kXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFNZXNzYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRvTWVzc2FnZSA9IGFNZXNzYWdlc1tpXTtcblx0XHRcdFx0aWYgKG9NZXNzYWdlLnZhbGlkYXRpb24pIHtcblx0XHRcdFx0XHRvQ29udHJvbCA9IENvcmUuYnlJZChvTWVzc2FnZS5nZXRDb250cm9sSWQoKSk7XG5cdFx0XHRcdFx0d2hpbGUgKG9Db250cm9sKSB7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRyb2wuZ2V0SWQoKSA9PT0gc1ZpZXdJZCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJ2YWxpZGF0aW9uIGVycm9ycyBleGlzdFwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9yZWZyZXNoTGlzdElmUmVxdWlyZWRcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvUmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9mIHRoZSBib3VuZCBhY3Rpb24gYW5kIHRoZSBuYW1lcyBvZiB0aGUga2V5IGZpZWxkc1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJvdW5kIGNvbnRleHQgb24gd2hpY2ggdGhlIGFjdGlvbiB3YXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgQWx3YXlzIHJlc29sdmVzIHRvIHBhcmFtIG9SZXNwb25zZVxuXHQgKi9cblx0X3JlZnJlc2hMaXN0SWZSZXF1aXJlZChvUmVzcG9uc2U6IGFueSwgb0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcblx0XHRpZiAoIW9Db250ZXh0IHx8ICFvUmVzcG9uc2UgfHwgIW9SZXNwb25zZS5vRGF0YSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHRcdH1cblx0XHRjb25zdCBvQmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHQvLyByZWZyZXNoIG9ubHkgbGlzdHNcblx0XHRpZiAob0JpbmRpbmcgJiYgb0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9SZXNwb25zZS5vRGF0YTtcblx0XHRcdGNvbnN0IGFLZXlzID0gb1Jlc3BvbnNlLmtleXM7XG5cdFx0XHRjb25zdCBvQ3VycmVudERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdGxldCBiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gdHJ1ZTtcblx0XHRcdC8vIGVuc3VyZSBjb250ZXh0IGlzIGluIHRoZSByZXNwb25zZVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db250ZXh0RGF0YSkubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGNoZWNrIGlmIGNvbnRleHQgaW4gcmVzcG9uc2UgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGJvdW5kIGNvbnRleHRcblx0XHRcdFx0YlJldHVybmVkQ29udGV4dElzU2FtZSA9IGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1cnJlbnREYXRhW3NLZXldID09PSBvQ29udGV4dERhdGFbc0tleV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdGlmICgob0JpbmRpbmcgYXMgYW55KS5pc1Jvb3QoKSkge1xuXHRcdFx0XHRcdFx0XHRvQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBvQmluZGluZy5nZXRQYXRoKCkgfV0sIG9CaW5kaW5nLmdldENvbnRleHQoKSBhcyBDb250ZXh0KVxuXHRcdFx0XHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCFiUmV0dXJuZWRDb250ZXh0SXNTYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRhYmxlXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCFiUmV0dXJuZWRDb250ZXh0SXNTYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRhYmxlXCIsIGUpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHJlc29sdmUgd2l0aCBvUmVzcG9uc2UgdG8gbm90IGRpc3R1cmIgdGhlIHByb21pc2UgY2hhaW4gYWZ0ZXJ3YXJkc1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0fVxuXG5cdF9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBhbnksXG5cdFx0XHRzRW50aXR5U2V0TmFtZSA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKSxcblx0XHRcdGFTZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMgJiYgYVNlbWFudGljS2V5cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFSZXF1ZXN0UHJvbWlzZXMgPSBhU2VtYW50aWNLZXlzLm1hcChmdW5jdGlvbiAob0tleTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KG9LZXkuJFByb3BlcnR5UGF0aCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXF1ZXN0UHJvbWlzZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIHRoZSBsYXRlc3QgY29udGV4dCBpbiB0aGUgbWV0YWRhdGEgaGllcmFyY2h5IGZyb20gcm9vdEJpbmRpbmcgdG8gZ2l2ZW4gY29udGV4dCBwb2ludGluZyB0byBnaXZlbiBlbnRpdHlUeXBlXG5cdCAqIGlmIGFueSBzdWNoIGNvbnRleHQgZXhpc3RzLiBPdGhlcndpc2UsIGl0IHJldHVybnMgdGhlIG9yaWdpbmFsIGNvbnRleHQuXG5cdCAqIE5vdGU6IEl0IGlzIG9ubHkgbmVlZGVkIGFzIHdvcmstYXJvdW5kIGZvciBpbmNvcnJlY3QgbW9kZWxsaW5nLiBDb3JyZWN0IG1vZGVsbGluZyB3b3VsZCBpbXBseSBhIERhdGFGaWVsZEZvckFjdGlvbiBpbiBhIExpbmVJdGVtXG5cdCAqIHRvIHBvaW50IHRvIGFuIG92ZXJsb2FkIGRlZmluZWQgZWl0aGVyIG9uIHRoZSBjb3JyZXNwb25kaW5nIEVudGl0eVR5cGUgb3IgYSBjb2xsZWN0aW9uIG9mIHRoZSBzYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0gcm9vdENvbnRleHQgVGhlIGNvbnRleHQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb21cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0QmluZGluZyBvZiB0aGUgdGFibGVcblx0ICogQHBhcmFtIG92ZXJsb2FkRW50aXR5VHlwZSBUaGUgQWN0aW9uT3ZlcmxvYWQgZW50aXR5IHR5cGUgdG8gc2VhcmNoIGZvclxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBBY3Rpb25PdmVybG9hZCBlbnRpdHlcblx0ICovXG5cdF9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoKHJvb3RDb250ZXh0OiBDb250ZXh0LCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgb3ZlcmxvYWRFbnRpdHlUeXBlOiBzdHJpbmcpOiBDb250ZXh0IHtcblx0XHRjb25zdCBtb2RlbDogT0RhdGFNb2RlbCA9IHJvb3RDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBjb250ZXh0U2VnbWVudHM6IHN0cmluZ1tdID0gbGlzdEJpbmRpbmcuZ2V0UGF0aCgpLnNwbGl0KFwiL1wiKTtcblx0XHRsZXQgY3VycmVudENvbnRleHQ6IENvbnRleHQgPSByb290Q29udGV4dDtcblxuXHRcdC8vIFdlIGV4cGVjdCB0aGF0IHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGxpc3RCaW5kaW5nIGlzIHRoZSBMaXN0QmluZGluZyBvZiB0aGUgdGFibGUuIFJlbW92ZSB0aGlzIGZyb20gY29udGV4dFNlZ21lbnRzXG5cdFx0Ly8gYmVjYXVzZSBpdCBpcyBpbmNvcnJlY3QgdG8gZXhlY3V0ZSBiaW5kQ29udGV4dCBvbiBhIGxpc3QuIFdlIGRvIG5vdCBhbnl3YXkgbmVlZCB0byBzZWFyY2ggdGhpcyBjb250ZXh0IGZvciB0aGUgb3ZlcmxvYWQuXG5cdFx0Y29udGV4dFNlZ21lbnRzLnBvcCgpO1xuXHRcdGlmIChjb250ZXh0U2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRjb250ZXh0U2VnbWVudHMgPSBbXCJcIl07IC8vIERvbid0IGxlYXZlIGNvbnRleHRTZWdtZW50cyB1bmRlZmluZWRcblx0XHR9XG5cblx0XHRpZiAoY29udGV4dFNlZ21lbnRzWzBdICE9PSBcIlwiKSB7XG5cdFx0XHRjb250ZXh0U2VnbWVudHMudW5zaGlmdChcIlwiKTsgLy8gdG8gYWxzbyBnZXQgdGhlIHJvb3QgY29udGV4dCwgaS5lLiB0aGUgYmluZGluZ0NvbnRleHQgb2YgdGhlIHRhYmxlXG5cdFx0fVxuXHRcdC8vIGxvYWQgYWxsIHRoZSBwYXJlbnQgY29udGV4dHMgaW50byBhbiBhcnJheVxuXHRcdGNvbnN0IHBhcmVudENvbnRleHRzOiBDb250ZXh0W10gPSBjb250ZXh0U2VnbWVudHNcblx0XHRcdC5tYXAoKHBhdGhTZWdtZW50OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0aWYgKHBhdGhTZWdtZW50ICE9PSBcIlwiKSB7XG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChwYXRoU2VnbWVudCwgY3VycmVudENvbnRleHQpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIENyZWF0aW5nIGEgbmV3IGNvbnRleHQgdXNpbmcgYmluZENvbnRleHQoLi4uKS5nZXRCb3VuZENvbnRleHQoKSBkb2VzIG5vdCB3b3JrIGlmIHRoZSBldGFnIGlzIG5lZWRlZC4gQWNjb3JkaW5nIHRvIG1vZGVsIGNvbGxlYWd1ZXMsXG5cdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIGFsd2F5cyB1c2UgYW4gZXhpc3RpbmcgY29udGV4dCBpZiBwb3NzaWJsZS5cblx0XHRcdFx0XHQvLyBDdXJyZW50bHksIHRoZSBvbmx5IGV4YW1wbGUgd2Uga25vdyBhYm91dCBpcyB1c2luZyB0aGUgcm9vdENvbnRleHQgLSBhbmQgaW4gdGhpcyBjYXNlLCB3ZSBjYW4gb2J2aW91c2x5IHJldXNlIHRoYXQgZXhpc3RpbmcgY29udGV4dC5cblx0XHRcdFx0XHQvLyBJZiBvdGhlciBleGFtcGxlcyBzaG91bGQgY29tZSB1cCwgdGhlIGJlc3QgcG9zc2libGUgd29yayBhcm91bmQgd291bGQgYmUgdG8gcmVxdWVzdCBzb21lIGRhdGEgdG8gZ2V0IGFuIGV4aXN0aW5nIGNvbnRleHQuIFRvIGtlZXAgdGhlXG5cdFx0XHRcdFx0Ly8gcmVxdWVzdCBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZSwgd2Ugc2hvdWxkIHJlcXVlc3Qgb25seSB0aGUgZmlyc3Qga2V5IHByb3BlcnR5LiBBcyB0aGlzIHdvdWxkIGludHJvZHVjZSBhc3luY2hyb25pc20sIGFuZCBhbnl3YXlcblx0XHRcdFx0XHQvLyB0aGUgd2hvbGUgbG9naWMgaXMgb25seSBwYXJ0IG9mIHdvcmstYXJvdW5kIGZvciBpbmNvcnJlY3QgbW9kZWxsaW5nLCB3ZSB3YWl0IHVudGlsIHdlIGhhdmUgYW4gZXhhbXBsZSBuZWVkaW5nIGl0IGJlZm9yZSBpbXBsZW1lbnRpbmcgdGhpcy5cblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCA9IHJvb3RDb250ZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBjdXJyZW50Q29udGV4dDtcblx0XHRcdH0pXG5cdFx0XHQucmV2ZXJzZSgpO1xuXHRcdC8vIHNlYXJjaCBmb3IgY29udGV4dCBiYWNrd2FyZHNcblx0XHRjb25zdCBvdmVybG9hZENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSBwYXJlbnRDb250ZXh0cy5maW5kKFxuXHRcdFx0KHBhcmVudENvbnRleHQ6IENvbnRleHQpID0+XG5cdFx0XHRcdChtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQocGFyZW50Q29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIiRUeXBlXCIpIGFzIHVua25vd24gYXMgc3RyaW5nKSA9PT0gb3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0KTtcblx0XHRyZXR1cm4gb3ZlcmxvYWRDb250ZXh0IHx8IGxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSE7XG5cdH1cblxuXHRfY3JlYXRlU2libGluZ0luZm8oY3VycmVudENvbnRleHQ6IENvbnRleHQsIG5ld0NvbnRleHQ6IENvbnRleHQpOiBTaWJsaW5nSW5mb3JtYXRpb24ge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRDb250ZXh0OiBuZXdDb250ZXh0LFxuXHRcdFx0cGF0aE1hcHBpbmc6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG9sZFBhdGg6IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRuZXdQYXRoOiBuZXdDb250ZXh0LmdldFBhdGgoKVxuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fTtcblx0fVxuXG5cdF91cGRhdGVQYXRoc0luSGlzdG9yeShtYXBwaW5nczogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W10pIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0UGF0aE1hcHBpbmcobWFwcGluZ3MpO1xuXG5cdFx0Ly8gQWxzbyB1cGRhdGUgdGhlIHNlbWFudGljIG1hcHBpbmcgaW4gdGhlIHJvdXRpbmcgc2VydmljZVxuXHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRpZiAobWFwcGluZ3MubGVuZ3RoICYmIGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm9sZFBhdGgpIHtcblx0XHRcdGxhc3RTZW1hbnRpY01hcHBpbmcudGVjaG5pY2FsUGF0aCA9IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0fVxuXHR9XG5cblx0X2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0KGNvbnRleHQ6IENvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dDogQ29udGV4dCwgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZCkge1xuXHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZTogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKGNvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPSBuZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0fVxuXHRcdHJldHVybiBjb250ZXh0VG9OYXZpZ2F0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgc2libGluZyBjb250ZXh0IGZvciBhIHN1Ym9iamVjdCBwYWdlLCBhbmQgY2FsY3VsYXRlcyBhIHNpYmxpbmcgcGF0aFxuXHQgKiBmb3IgYWxsIGludGVybWVkaWF0ZSBwYXRocyBiZXR3ZWVuIHRoZSBvYmplY3QgcGFnZSBhbmQgdGhlIHN1Ym9iamVjdCBwYWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcm9vdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgcm9vdCBvZiB0aGUgZHJhZnRcblx0ICogQHBhcmFtIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBzdWJvYmplY3Rcblx0ICogQHBhcmFtIHNQcm9ncmFtbWluZ01vZGVsIFRoZSBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKiBAcGFyYW0gZG9Ob3RDb21wdXRlSWZSb290IElmIHRydWUsIHdlIGRvbid0IGNvbXB1dGUgc2libGluZ0luZm8gaWYgdGhlIHJvb3QgYW5kIHRoZSByaWdodG1vc3QgY29udGV4dHMgYXJlIHRoZSBzYW1lXG5cdCAqIEByZXR1cm5zIFJldHVybnMgdGhlIHNpYmxpbmdJbmZvcm1hdGlvbiBvYmplY3Rcblx0ICovXG5cdGFzeW5jIF9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKFxuXHRcdHJvb3RDdXJyZW50Q29udGV4dDogQ29udGV4dCxcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dDogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQsXG5cdFx0c1Byb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRkb05vdENvbXB1dGVJZlJvb3Q6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxTaWJsaW5nSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ+IHtcblx0XHRyaWdodG1vc3RDdXJyZW50Q29udGV4dCA9IHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID8/IHJvb3RDdXJyZW50Q29udGV4dDtcblx0XHRpZiAoIXJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKS5zdGFydHNXaXRoKHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpKSB7XG5cdFx0XHQvLyBXcm9uZyB1c2FnZSAhIVxuXHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb21wdXRlIHJpZ2h0bW9zdCBzaWJsaW5nIGNvbnRleHRcIik7XG5cdFx0fVxuXHRcdGlmIChkb05vdENvbXB1dGVJZlJvb3QgJiYgcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpID09PSByb290Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kZWwgPSByb290Q3VycmVudENvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdHJldHVybiBkcmFmdC5jb21wdXRlU2libGluZ0luZm9ybWF0aW9uKHJvb3RDdXJyZW50Q29udGV4dCwgcmlnaHRtb3N0Q3VycmVudENvbnRleHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBJZiBub3QgaW4gZHJhZnQgbW9kZSwgd2UganVzdCByZWNyZWF0ZSBhIGNvbnRleHQgZnJvbSB0aGUgcGF0aCBvZiB0aGUgcmlnaHRtb3N0IGNvbnRleHRcblx0XHRcdC8vIE5vIHBhdGggbWFwcGluZyBpcyBuZWVkZWRcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldENvbnRleHQ6IG1vZGVsLmJpbmRDb250ZXh0KHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkuZ2V0Qm91bmRDb250ZXh0KCksXG5cdFx0XHRcdHBhdGhNYXBwaW5nOiBbXVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHRfaXNGY2xFbmFibGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBFZGl0Rmxvdztc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
|
|
2396
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDcmVhdGlvbk1vZGUiLCJGRUxpYnJhcnkiLCJQcm9ncmFtbWluZ01vZGVsIiwiQ29uc3RhbnRzIiwiRHJhZnRTdGF0dXMiLCJFZGl0TW9kZSIsIlN0YXJ0dXBNb2RlIiwiTWVzc2FnZVR5cGUiLCJjb3JlTGlicmFyeSIsIkVkaXRGbG93IiwiZGVmaW5lVUk1Q2xhc3MiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwic3luY1Rhc2tzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJnZXRBcHBDb21wb25lbnQiLCJiYXNlIiwiZWRpdERvY3VtZW50Iiwib0NvbnRleHQiLCJiRHJhZnROYXZpZ2F0aW9uIiwidHJhbnNhY3Rpb25IZWxwZXIiLCJnZXRUcmFuc2FjdGlvbkhlbHBlciIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJfZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwibW9kZWwiLCJnZXRNb2RlbCIsInJpZ2h0bW9zdENvbnRleHQiLCJzaWJsaW5nSW5mbyIsIm9WaWV3RGF0YSIsImdldFZpZXciLCJnZXRWaWV3RGF0YSIsInNQcm9ncmFtbWluZ01vZGVsIiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsIm9Sb290Q29udGV4dCIsIm9WaWV3Iiwidmlld0xldmVsIiwiRHJhZnQiLCJTdGlja3kiLCJDb21tb25VdGlscyIsImNyZWF0ZVJvb3RDb250ZXh0IiwiZWRpdEZsb3ciLCJvbkJlZm9yZUVkaXQiLCJjb250ZXh0Iiwib05ld0RvY3VtZW50Q29udGV4dCIsImdldE1lc3NhZ2VIYW5kbGVyIiwiX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMiLCJzZXRFZGl0TW9kZSIsIkVkaXRhYmxlIiwic2V0RG9jdW1lbnRNb2RpZmllZCIsInNob3dNZXNzYWdlRGlhbG9nIiwiY29udGV4dFRvTmF2aWdhdGUiLCJfaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0Q29udGV4dCIsIl9jb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwiX2NyZWF0ZVNpYmxpbmdJbmZvIiwiX3VwZGF0ZVBhdGhzSW5IaXN0b3J5IiwicGF0aE1hcHBpbmciLCJ0YXJnZXRDb250ZXh0IiwiZ2V0UGF0aCIsInJvb3RTaWJsaW5nUGF0aCIsInJvb3RDb250ZXh0SW5mbyIsInJvb3RDb250ZXh0Tm90UmVxdWlyZWQiLCJfZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQiLCJfaGFuZGxlTmV3Q29udGV4dCIsInN0aWNreUNvbnRleHQiLCJnZXRLZWVwQWxpdmVDb250ZXh0IiwiaGFuZGxlU3RpY2t5T24iLCJNb2RlbEhlbHBlciIsImlzQ29sbGFib3JhdGlvbkRyYWZ0U3VwcG9ydGVkIiwiZ2V0TWV0YU1vZGVsIiwic2hhcmVPYmplY3QiLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsImRlbGV0ZU11bHRpcGxlRG9jdW1lbnRzIiwiY29udGV4dHNUb0RlbGV0ZSIsInBhcmFtZXRlcnMiLCJiZWZvcmVEZWxldGVDYWxsQmFjayIsIm9uQmVmb3JlRGVsZXRlIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwibG9ja09iamVjdCIsImdldEdsb2JhbFVJTW9kZWwiLCJwYXJlbnRDb250cm9sIiwiYnlJZCIsImNvbnRyb2xJZCIsIkVycm9yIiwibGlzdEJpbmRpbmciLCJnZXRCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsImJGaW5kQWN0aXZlQ29udGV4dHMiLCJCdXN5TG9ja2VyIiwibG9jayIsImRlbGV0ZURvY3VtZW50VHJhbnNhY3Rpb24iLCJyZXN1bHQiLCJpc0EiLCJjbGVhclNlbGVjdGlvbiIsInZpZXdCaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwiaXNSb290IiwiYXR0YWNoRXZlbnRPbmNlIiwicmVmcmVzaCIsImhhc1RyYW5zaWVudENvbnRleHQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJFZGl0U3RhdGUiLCJzZXRFZGl0U3RhdGVEaXJ0eSIsIkFjdGl2aXR5U3luYyIsInNlbmQiLCJBY3Rpdml0eSIsIkRlbGV0ZSIsIm1hcCIsInVubG9jayIsInVwZGF0ZURvY3VtZW50IiwidXBkYXRlZENvbnRleHQiLCJ1cGRhdGVQcm9taXNlIiwib3JpZ2luYWxCaW5kaW5nQ29udGV4dCIsImlzRHJhZnQiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJzeW5jVGFzayIsInNldERyYWZ0U3RhdHVzIiwiU2F2aW5nIiwiY3VycmVudEJpbmRpbmdDb250ZXh0IiwibWV0YU1vZGVsIiwiZW50aXR5U2V0TmFtZSIsImdldE1ldGFDb250ZXh0IiwiZ2V0T2JqZWN0Iiwic2VtYW50aWNLZXlzIiwiU2VtYW50aWNLZXlIZWxwZXIiLCJnZXRTZW1hbnRpY0tleXMiLCJsZW5ndGgiLCJjdXJyZW50U2VtYW50aWNNYXBwaW5nIiwiX2dldFNlbWFudGljTWFwcGluZyIsImN1cnJlbnRTZW1hbnRpY1BhdGgiLCJzZW1hbnRpY1BhdGgiLCJzQ2hhbmdlZFBhdGgiLCJnZXRTZW1hbnRpY1BhdGgiLCJTYXZlZCIsIkNsZWFyIiwic2hvd01lc3NhZ2VzIiwiY3JlYXRlRG9jdW1lbnQiLCJ2TGlzdEJpbmRpbmciLCJtSW5QYXJhbWV0ZXJzIiwib0xvY2tPYmplY3QiLCJvVGFibGUiLCJtUGFyYW1ldGVycyIsIm9DcmVhdGlvbiIsImJTaG91bGRCdXN5TG9jayIsImNyZWF0aW9uTW9kZSIsIklubGluZSIsIkNyZWF0aW9uUm93IiwiRXh0ZXJuYWwiLCJvRXhlY0N1c3RvbVZhbGlkYXRpb24iLCJvQXBwQ29tcG9uZW50IiwiZ2V0Um91dGVyUHJveHkiLCJyZW1vdmVJQXBwU3RhdGVLZXkiLCJvQ29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJzQ3JlYXRlUGF0aCIsImdldEFic29sdXRlTWV0YVBhdGhGb3JMaXN0QmluZGluZyIsImhhbmRsZXJzIiwib25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kIiwib3V0Ym91bmQiLCJ1bmRlZmluZWQiLCJjcmVhdGlvblJvdyIsIm9DcmVhdGlvblJvd09iamVjdHMiLCJnZXRQYXJlbnQiLCJ2YWxpZGF0ZURvY3VtZW50IiwiZGF0YSIsImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsImdldENyZWF0aW9uUm93Iiwib0ludGVybmFsTW9kZWxDb250ZXh0Iiwic2V0UHJvcGVydHkiLCJ0YWJsZUlkIiwiZm5Gb2N1c09yU2Nyb2xsIiwiZm9jdXNSb3ciLCJiaW5kIiwic2Nyb2xsVG9JbmRleCIsImNyZWF0ZUF0RW5kIiwiZ2V0TGVuZ3RoIiwiaGFuZGxlU2lkZUVmZmVjdHMiLCJvTGlzdEJpbmRpbmciLCJvQ3JlYXRpb25Qcm9taXNlIiwib05ld0NvbnRleHQiLCJjcmVhdGVkIiwib0JpbmRpbmdDb250ZXh0IiwiYXBwQ29tcG9uZW50IiwiY3JlYXRlQ3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2VzIiwiYVZhbGlkYXRpb25NZXNzYWdlcyIsInNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24iLCJtQ3VzdG9tVmFsaWRpdHkiLCJnZXRQcm9wZXJ0eSIsIm9NZXNzYWdlTWFuYWdlciIsIkNvcmUiLCJnZXRNZXNzYWdlTWFuYWdlciIsImFDdXN0b21NZXNzYWdlcyIsIm9GaWVsZENvbnRyb2wiLCJzVGFyZ2V0IiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsImZvckVhY2giLCJvTWVzc2FnZSIsImNvZGUiLCJyZW1vdmVNZXNzYWdlcyIsIm9WYWxpZGF0aW9uTWVzc2FnZSIsIm1lc3NhZ2VUYXJnZXQiLCJnZXRDb250cm9sIiwiZmllbGRJZCIsImdldEJpbmRpbmdQYXRoIiwiZmlsdGVyIiwidGFyZ2V0IiwiYWRkTWVzc2FnZXMiLCJNZXNzYWdlIiwibWVzc2FnZSIsIm1lc3NhZ2VUZXh0IiwicHJvY2Vzc29yIiwidHlwZSIsInRlY2huaWNhbCIsInBlcnNpc3RlbnQiLCJhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMiLCJhZGRDb250cm9sSWQiLCJwdXNoIiwidGV4dCIsImN1c3RvbU1lc3NhZ2VzIiwicmVzb2x2ZUNyZWF0aW9uTW9kZSIsImluaXRpYWxDcmVhdGlvbk1vZGUiLCJwcm9ncmFtbWluZ01vZGVsIiwib01ldGFNb2RlbCIsIk5ld1BhZ2UiLCJpc1JlbGF0aXZlIiwic1BhdGgiLCJzTmV3QWN0aW9uIiwiYVBhcmFtZXRlcnMiLCJEZWZlcnJlZCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0SGVhZGVyQ29udGV4dCIsImFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMiLCJnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMiLCJBc3luYyIsIk9EYXRhTGlzdEJpbmRpbmciLCJTeW5jIiwib01vZGVsIiwicmVzb2x2ZWRDcmVhdGlvbk1vZGUiLCJtQXJncyIsIm9DcmVhdGlvblJvdyIsIm9DcmVhdGlvblJvd0NvbnRleHQiLCJvUGF5bG9hZCIsIm9Sb3V0aW5nTGlzdGVuZXIiLCJnZXRJbnRlcm5hbFJvdXRpbmciLCJPYmplY3QiLCJrZXlzIiwic1Byb3BlcnR5UGF0aCIsIm9Qcm9wZXJ0eSIsIiRraW5kIiwiX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycyIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJidXN5TW9kZSIsImJ1c3lJZCIsImdldFRhYmxlRGVmaW5pdGlvbiIsImFubm90YXRpb24iLCJpZCIsImhhbmRsZUNyZWF0ZUV2ZW50cyIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwib25CZWZvcmVDcmVhdGUiLCJza2lwUGFyYW1ldGVyRGlhbG9nIiwiZ2V0U3RhcnR1cE1vZGUiLCJBdXRvQ3JlYXRlIiwiYlNraXBTaWRlRWZmZWN0cyIsIm9OYXZpZ2F0aW9uIiwibmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0IiwiYkRlZmVycmVkQ29udGV4dCIsImVkaXRhYmxlIiwiYkZvcmNlRm9jdXMiLCJhc3luY0NvbnRleHQiLCJjcmVhdGVBY3Rpb24iLCJ0cmFuc2llbnQiLCJ0aGVuIiwiY29yZVJlc291cmNlQnVuZGxlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwibmF2aWdhdGVUb01lc3NhZ2VQYWdlIiwiZ2V0VGV4dCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJiRnJvbURlZmVycmVkIiwibmF2aWdhdGVUb0NvbnRleHQiLCJvQ3JlYXRpb25Sb3dMaXN0QmluZGluZyIsIm9OZXdUcmFuc2llbnRDb250ZXh0IiwiY3JlYXRlIiwic2V0QmluZGluZ0NvbnRleHQiLCJjYXRjaCIsInRyYWNlIiwiZGVsZXRlIiwiaXNMb2NrZWQiLCJyZWplY3QiLCJhUGFyYW1zIiwiYWxsIiwibWV0YUNvbnRleHQiLCJiaW5kQ29udGV4dCIsImVudGl0eVNldCIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsInN0YXJ0aW5nRW50aXR5U2V0IiwibmV3QWN0aW9uIiwiYW5ub3RhdGlvbnMiLCJTZXNzaW9uIiwiU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsIk5ld0FjdGlvbiIsImdldEludGVybmFsTW9kZWwiLCJzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUiLCJfc2VuZEFjdGl2aXR5IiwiQ3JlYXRlIiwiaXNDb25uZWN0ZWQiLCJDYW5jZWxBY3Rpb25EaWFsb2ciLCJBY3Rpb25FeGVjdXRpb25GYWlsZWQiLCJDcmVhdGlvbkZhaWxlZCIsIm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSIsImNyZWF0ZU11bHRpcGxlRG9jdW1lbnRzIiwiZGF0YUZvckNyZWF0ZSIsImlzRnJvbUNvcHlQYXN0ZSIsImNyZWF0ZUFzSW5hY3RpdmUiLCJ0YXJnZXRMaXN0QmluZGluZyIsImNvbnRleHRQYXRoIiwibWV0YVBhdGgiLCJnZXRDb250ZXh0IiwiY3JlYXRpb25Qcm9taXNlcyIsInByb3BlcnR5VmFsdWVzIiwiY3JlYXRlUGFyYW1ldGVycyIsImluYWN0aXZlIiwicHJvcGVydHlQYXRoIiwicHJvcGVydHkiLCJpbmRleE9mIiwiY3JlYXRlZENvbnRleHRzIiwibmV3Q29udGV4dCIsImJJbmFjdGl2ZSIsImVyciIsIm9uQmVmb3JlU2F2ZSIsIl9tUGFyYW1ldGVycyIsIm9uQmVmb3JlRGlzY2FyZCIsInNhdmVEb2N1bWVudCIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiYUJpbmRpbmdzIiwiYmluZGluZ3MiLCJfc3VibWl0T3BlbkNoYW5nZXMiLCJpc0ZjbEVuYWJsZWQiLCJhY3RpdmVEb2N1bWVudENvbnRleHQiLCJfZ2V0UmVzb3VyY2VNb2RlbCIsImdldENyZWF0aW9uTW9kZSIsIl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzIiwiQWN0aXZhdGUiLCJkaXNjb25uZWN0IiwiX3RyaWdnZXJDb25maWd1cmVkU3VydmV5IiwiU3RhbmRhcmRBY3Rpb25zIiwic2F2ZSIsIlRyaWdnZXJUeXBlIiwic3RhbmRhcmRBY3Rpb24iLCJEaXNwbGF5IiwiY2FuY2VsZWQiLCJ0b2dnbGVEcmFmdEFjdGl2ZSIsIm9Db250ZXh0RGF0YSIsImJFZGl0YWJsZSIsImJJc0RyYWZ0IiwiSXNBY3RpdmVFbnRpdHkiLCJIYXNBY3RpdmVFbnRpdHkiLCJIYXNEcmFmdEVudGl0eSIsIm9SaWdodG1vc3RDb250ZXh0IiwibGFzdFNlbWFudGljTWFwcGluZyIsInRlY2huaWNhbFBhdGgiLCJ0YXJnZXRQYXRoIiwibmV3UGF0aCIsIm9sZFBhdGgiLCJjYW5jZWxEb2N1bWVudCIsImlzTmV3RG9jdW1lbnQiLCJjYW5jZWxCdXR0b24iLCJjb250cm9sIiwiYmVmb3JlQ2FuY2VsQ2FsbEJhY2siLCJjYW5jZWxSZXN1bHQiLCJpc0RvY3VtZW50TW9kaWZpZWQiLCJnZXRJbnN0YW5jZWRWaWV3cyIsInZpZXciLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsIkRpc2NhcmQiLCJza2lwQmFja05hdmlnYXRpb24iLCJuYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dCIsIm9BY3RpdmVEb2N1bWVudENvbnRleHQiLCJfZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyIsInNraXBCaW5kaW5nVG9WaWV3Iiwic2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UiLCJyZXNvdXJjZU1vZGVsIiwiZ2V0Um91dGluZ1NlcnZpY2UiLCJhdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsInNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJkZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCIsImlzRHJhZnRSb290IiwidGFyZ2V0RW50aXR5U2V0IiwiZGVsZXRlRG9jdW1lbnQiLCJnZXRJbmRleCIsInNpYmxpbmdDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwiZHJhZnRQYXRoIiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJkcmFmdENvbnRleHRUb1JlbW92ZSIsInJlcGxhY2VXaXRoIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsInNldEJhY2tOYXZpZ2F0aW9uIiwiRGVlcGxpbmsiLCJleGl0RnJvbUFwcCIsImFwcGx5RG9jdW1lbnQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImludm9rZUFjdGlvbiIsInNBY3Rpb25OYW1lIiwibUV4dHJhUGFyYW1zIiwib0NvbnRyb2wiLCJhUGFydHMiLCJzT3ZlcmxvYWRFbnRpdHlUeXBlIiwib0N1cnJlbnRBY3Rpb25DYWxsQmFja3MiLCJBcnJheSIsImlzQXJyYXkiLCJjb250ZXh0cyIsImlzTmF2aWdhYmxlIiwicmVxdWlyZXNOYXZpZ2F0aW9uIiwiY29udmVydGVkTWV0YWRhdGEiLCJjb252ZXJ0VHlwZXMiLCJlbnRpdHlDb250YWluZXIiLCJuYW1lIiwiaXNCb3VuZCIsImludGVybmFsTW9kZWxDb250ZXh0Iiwic3BsaXQiLCJyZXBsYWNlQWxsIiwiYlN0YXRpY0FjdGlvbiIsImlzVGFibGVCb3VuZCIsInNCaW5kaW5nUGF0aCIsInBhdGgiLCJfZ2V0QWN0aW9uT3ZlcmxvYWRDb250ZXh0RnJvbU1ldGFkYXRhUGF0aCIsImVuYWJsZUF1dG9TY3JvbGwiLCJjcmVhdGVBY3Rpb25Qcm9taXNlIiwic0lkIiwiYkdldEJvdW5kQ29udGV4dCIsIl9nZXRCb3VuZENvbnRleHQiLCJiT2JqZWN0UGFnZSIsImNvbnZlcnRlclR5cGUiLCJvUmVzcG9uc2UiLCJjYWxsQWN0aW9uIiwibGlzdFJlZnJlc2hlZCIsIl9yZWZyZXNoTGlzdElmUmVxdWlyZWQiLCJnZXRBY3Rpb25SZXNwb25zZURhdGFBbmRLZXlzIiwiYWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyIsInZhbHVlIiwiQWN0aW9uIiwiYWN0aW9uIiwiZlJlc29sdmVyIiwidkNvbnRleHQiLCJzQ29udGV4dE1ldGFQYXRoIiwiX2ZuVmFsaWRDb250ZXh0cyIsImFwcGxpY2FibGVDb250ZXh0cyIsImVsZW1lbnQiLCJvQWN0aW9uQ29udGV4dCIsInNBY3Rpb25Db250ZXh0TWV0YVBhdGgiLCJjaGVja05vSGFzaENoYW5nZSIsIm5vSGlzdG9yeUVudHJ5IiwiaW5mbyIsIm9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24iLCJmUmVqZWN0b3IiLCJyZWplY3RlZEl0ZW1zIiwiX2FjdGlvbk5hbWUiLCJzZWN1cmVkRXhlY3V0aW9uIiwiZm5GdW5jdGlvbiIsImJCdXN5U2V0IiwiYnVzeSIsInNldCIsImJCdXN5Q2hlY2siLCJjaGVjayIsImJVcGRhdGVzRG9jdW1lbnQiLCJ1cGRhdGVzRG9jdW1lbnQiLCJmaW5hbGx5IiwiaGFuZGxlUGF0Y2hTZW50Iiwib0V2ZW50IiwiaXNJbkNvbGxhYm9yYXRpdmVEcmFmdCIsImdldFNvdXJjZSIsInNldElnbm9yZUVUYWciLCJzb3VyY2VCaW5kaW5nIiwib1BhdGNoUHJvbWlzZSIsInBhdGNoQ29tcGxldGVkRXZlbnQiLCJBY3Rpb25SdW50aW1lIiwic2V0QWN0aW9uRW5hYmxlbWVudEFmdGVyUGF0Y2giLCJiU3VjY2VzcyIsImdldFBhcmFtZXRlciIsImhhbmRsZUNyZWF0ZUFjdGl2YXRlIiwib0JpbmRpbmciLCJiQXRFbmQiLCJvUGFyYW1zIiwiYWN0aXZhdGVkQ29udGV4dCIsIndhcm5pbmciLCJuZXdJbmFjdGl2ZUNvbnRleHQiLCJuZXdUYXNrIiwiY29tcHV0ZUVkaXRNb2RlIiwiZ2xvYmFsTW9kZWwiLCJpc0FjdGl2ZUVudGl0eSIsInJlcXVlc3RPYmplY3QiLCJoYXNBY3RpdmVFbnRpdHkiLCJsYXN0SW52b2tlZEFjdGlvbk5hbWUiLCJpc05ld0FjdGlvbkZvclN0aWNreSIsImdldFJlc291cmNlTW9kZWwiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJUcmFuc2FjdGlvbkhlbHBlciIsIm1lc3NhZ2VIYW5kbGVyIiwic2V0Q3JlYXRpb25Nb2RlIiwiYkNyZWF0aW9uTW9kZSIsInVpTW9kZWxDb250ZXh0IiwibW9kaWZpZWQiLCJiaW5kaW5nIiwiYXR0YWNoRXZlbnQiLCJzdWNjZXNzIiwiZHJhZnRTdGF0dXMiLCJzb3VyY2UiLCJlZGl0TW9kZSIsImlzQ3JlYXRpb24iLCJhY3Rpb25OYW1lIiwic3RpY2t5U2Vzc2lvbiIsIkFkZGl0aW9uYWxOZXdBY3Rpb25zIiwiaGFzTmF2aWdhdGlvbkd1YXJkIiwiaGFzaFRyYWNrZXIiLCJnZXRIYXNoIiwiaW50ZXJuYWxNb2RlbCIsInNldFRpbWVvdXQiLCJzZXROYXZpZ2F0aW9uR3VhcmQiLCJzdWJzdHJpbmciLCJvbkJhY2tOYXZpZ2F0aW9uSW5TZXNzaW9uIiwiZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24iLCJnZXREaXJ0eVN0YXRlUHJvdmlkZXIiLCJyZWdpc3RlckRpcnR5U3RhdGVQcm92aWRlciIsImkxOG5Nb2RlbCIsInNlc3Npb25UaW1lb3V0RnVuY3Rpb24iLCJnZXRTZXNzaW9uVGltZW91dEZ1bmN0aW9uIiwiYXR0YWNoU2Vzc2lvblRpbWVvdXQiLCJzdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24iLCJnZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbiIsImF0dGFjaFJvdXRlTWF0Y2hlZCIsImhhbmRsZVN0aWNreU9mZiIsImRpc2NhcmROYXZpZ2F0aW9uR3VhcmQiLCJkZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyIiwiZGV0YWNoU2Vzc2lvblRpbWVvdXQiLCJkZXRhY2hSb3V0ZU1hdGNoZWQiLCJnZXRIdHRwSGVhZGVycyIsIm5hdmlnYXRpb25Db250ZXh0IiwidGFyZ2V0SGFzaCIsImlubmVyQXBwUm91dGUiLCJyb3V0ZXJQcm94eSIsImxjbEhhc2hUcmFja2VyIiwiaXNEaXJ0eSIsImlzU2Vzc2lvbk9uIiwiaXNOYXZpZ2F0aW9uRmluYWxpemVkIiwiY2hlY2tIYXNoV2l0aEd1YXJkIiwiaXNHdWFyZENyb3NzQWxsb3dlZEJ5VXNlciIsInNldERpcnR5RmxhZyIsIndhcm5pbmdEaWFsb2ciLCJEaWFsb2ciLCJzdGF0ZSIsImNvbnRlbnQiLCJUZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJwcmVzcyIsImFmdGVyQ2xvc2UiLCJkZXN0cm95IiwiYWRkU3R5bGVDbGFzcyIsInNldE1vZGVsIiwiYWRkRGVwZW5kZW50Iiwib3BlbiIsImN1cnJlbnRIYXNoIiwiZGlzY2FyZFN0aWNreVNlc3Npb24iLCJjbGVhclNlc3Npb25Db250ZXh0IiwiZGlzY2FyZGVkQ29udGV4dCIsInN0aWNreSIsImRpc2NhcmREb2N1bWVudCIsInJlc2V0Q2hhbmdlcyIsIl9yb3V0aW5nIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0TGFzdFNlbWFudGljTWFwcGluZyIsInJlc29sdmVGdW5jdGlvbiIsInJlamVjdEZ1bmN0aW9uIiwiYWN0aW9uUHJvbWlzZSIsImFzc2lnbiIsInJlc3BvbnNlIiwiY3VycmVudFZpZXciLCJtZXRhTW9kZWxEYXRhIiwiYWN0aW9uUmV0dXJuVHlwZSIsIiRSZXR1cm5UeXBlIiwiJFR5cGUiLCIkS2V5Iiwib0RhdGEiLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImRlbGV0ZUN1cnJlbnRBY3Rpb25Qcm9taXNlIiwiX3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyIsInRhYmxlIiwicm93QmluZGluZyIsImFjdGl2ZVJvd0luZGV4IiwiZ2V0Q291bnQiLCJhbGxSb3dDb250ZXh0cyIsImdldENvbnRleHRzIiwiaW5kZXgiLCJzaW5nbGVDb250ZXh0IiwiaXNJbmFjdGl2ZSIsImNyZWF0ZUVtcHR5Um93c0FuZEZvY3VzIiwidGFibGVBUEkiLCJ0YWJsZURlZmluaXRpb24iLCJpbmxpbmVDcmVhdGlvblJvd3NIaWRkZW5JbkVkaXRNb2RlIiwic2V0VXBFbXB0eVJvd3MiLCJyZWxhdGVkQ29udGV4dHMiLCJyZWZyZXNoTGlzdEJpbmRpbmciLCJ0cmlnZ2VyVHlwZSIsInRyaWdnZXJDb25maWd1cmVkU3VydmV5Iiwic3VibWl0QmF0Y2giLCJvUmVxdWVzdG9yIiwid2FpdEZvclJ1bm5pbmdDaGFuZ2VSZXF1ZXN0cyIsImNoZWNrSWZCYWNrSXNPdXRPZkd1YXJkIiwiYmluZGluZ0NvbnRleHQiLCJwcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24iLCJoaXN0b3J5IiwiYmFjayIsImJSZWNyZWF0ZUNvbnRleHQiLCJiUGVyc2lzdE9QU2Nyb2xsIiwic2hvd1BsYWNlaG9sZGVyIiwia2VlcEN1cnJlbnRMYXlvdXQiLCJwYXJhbXMiLCJiUmVmcmVzaEFmdGVyQWN0aW9uIiwic1ZpZXdJZCIsImdldElkIiwiYU1lc3NhZ2VzIiwiaSIsInZhbGlkYXRpb24iLCJnZXRDb250cm9sSWQiLCJhS2V5cyIsIm9DdXJyZW50RGF0YSIsImJSZXR1cm5lZENvbnRleHRJc1NhbWUiLCJldmVyeSIsInNLZXkiLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsImUiLCJzRW50aXR5U2V0TmFtZSIsImFTZW1hbnRpY0tleXMiLCJhUmVxdWVzdFByb21pc2VzIiwib0tleSIsIiRQcm9wZXJ0eVBhdGgiLCJyb290Q29udGV4dCIsIm92ZXJsb2FkRW50aXR5VHlwZSIsImNvbnRleHRTZWdtZW50cyIsImN1cnJlbnRDb250ZXh0IiwicG9wIiwidW5zaGlmdCIsInBhcmVudENvbnRleHRzIiwicGF0aFNlZ21lbnQiLCJyZXZlcnNlIiwib3ZlcmxvYWRDb250ZXh0IiwiZmluZCIsInBhcmVudENvbnRleHQiLCJtYXBwaW5ncyIsInNldFBhdGhNYXBwaW5nIiwibmV3RG9jdW1lbnRDb250ZXh0Iiwicm9vdEN1cnJlbnRDb250ZXh0IiwicmlnaHRtb3N0Q3VycmVudENvbnRleHQiLCJkb05vdENvbXB1dGVJZlJvb3QiLCJzdGFydHNXaXRoIiwiZHJhZnQiLCJjb21wdXRlU2libGluZ0luZm9ybWF0aW9uIiwiQ29udHJvbGxlckV4dGVuc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiRWRpdEZsb3cudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCJzYXAvZmUvY29yZS9BcHBDb21wb25lbnRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgQWN0aXZpdHlTeW5jIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IHsgQWN0aXZpdHksIHNoYXJlT2JqZWN0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vQ29sbGFib3JhdGlvbkNvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBSb290Q29udGV4dEluZm8sIFNpYmxpbmdJbmZvcm1hdGlvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IHN0aWNreSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvc3RpY2t5XCI7XG5pbXBvcnQgVHJhbnNhY3Rpb25IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L1RyYW5zYWN0aW9uSGVscGVyXCI7XG5pbXBvcnQgeyBTdGFuZGFyZEFjdGlvbnMsIHRyaWdnZXJDb25maWd1cmVkU3VydmV5LCBUcmlnZ2VyVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9GZWVkYmFja1wiO1xuaW1wb3J0IHR5cGUgSW50ZXJuYWxSb3V0aW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcywgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEVkaXRTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9FZGl0U3RhdGVcIjtcbmltcG9ydCB7IGdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01ldGFNb2RlbEZ1bmN0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHsgZ2V0UmVzb3VyY2VNb2RlbCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1Jlc291cmNlTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBTZW1hbnRpY0tleUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9TZW1hbnRpY0tleUhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBTZW1hbnRpY01hcHBpbmcgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvUm91dGluZ1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBUYWJsZUFQSSBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9UYWJsZUFQSVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCB0eXBlIEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBjb3JlTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgVGFibGUgZnJvbSBcInNhcC91aS9tZGMvVGFibGVcIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YVY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCBBY3Rpb25SdW50aW1lIGZyb20gXCIuLi9BY3Rpb25SdW50aW1lXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VNYW5pZmVzdFNldHRpbmdzIH0gZnJvbSBcIi4uL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlLFxuXHRQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWwsXG5cdENvbnN0YW50cyA9IEZFTGlicmFyeS5Db25zdGFudHMsXG5cdERyYWZ0U3RhdHVzID0gRkVMaWJyYXJ5LkRyYWZ0U3RhdHVzLFxuXHRFZGl0TW9kZSA9IEZFTGlicmFyeS5FZGl0TW9kZSxcblx0U3RhcnR1cE1vZGUgPSBGRUxpYnJhcnkuU3RhcnR1cE1vZGUsXG5cdE1lc3NhZ2VUeXBlID0gY29yZUxpYnJhcnkuTWVzc2FnZVR5cGU7XG5cbi8qKlxuICogQSBjb250cm9sbGVyIGV4dGVuc2lvbiBvZmZlcmluZyBob29rcyBpbnRvIHRoZSBlZGl0IGZsb3cgb2YgdGhlIGFwcGxpY2F0aW9uXG4gKlxuICogQGhpZGVjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICogQHNpbmNlIDEuOTAuMFxuICovXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1wiKVxuY2xhc3MgRWRpdEZsb3cgZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJvdGVjdGVkIGJhc2UhOiBQYWdlQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIGRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBzZXNzaW9uVGltZW91dEZ1bmN0aW9uPzogRnVuY3Rpb247XG5cblx0cHJpdmF0ZSBzdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24/OiBGdW5jdGlvbjtcblxuXHRwcml2YXRlIHN5bmNUYXNrczogUHJvbWlzZTxhbnk+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0cHJpdmF0ZSBhY3Rpb25Qcm9taXNlPzogUHJvbWlzZTxhbnk+O1xuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFB1YmxpYyBtZXRob2RzXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cblx0Z2V0QXBwQ29tcG9uZW50KCk6IEFwcENvbXBvbmVudCB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZS5nZXRBcHBDb21wb25lbnQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgZHJhZnQgZG9jdW1lbnQgZm9yIGFuIGV4aXN0aW5nIGFjdGl2ZSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHRoZSBlZGl0YWJsZSBkb2N1bWVudCBpcyBhdmFpbGFibGVcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2VkaXREb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBlZGl0RG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBiRHJhZnROYXZpZ2F0aW9uID0gdHJ1ZTtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdGNvbnN0IG1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRsZXQgcmlnaHRtb3N0Q29udGV4dCwgc2libGluZ0luZm87XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBCYXNlTWFuaWZlc3RTZXR0aW5ncztcblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0bGV0IG9Sb290Q29udGV4dDogQ29udGV4dCA9IG9Db250ZXh0O1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKChvVmlld0RhdGE/LnZpZXdMZXZlbCBhcyBudW1iZXIpID4gMSkge1xuXHRcdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgfHwgc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0b1Jvb3RDb250ZXh0ID0gKGF3YWl0IENvbW1vblV0aWxzLmNyZWF0ZVJvb3RDb250ZXh0KHNQcm9ncmFtbWluZ01vZGVsLCBvVmlldywgdGhpcy5nZXRBcHBDb21wb25lbnQoKSkpIGFzIENvbnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGF3YWl0IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZUVkaXQoeyBjb250ZXh0OiBvUm9vdENvbnRleHQgfSk7XG5cdFx0XHRjb25zdCBvTmV3RG9jdW1lbnRDb250ZXh0ID0gYXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuZWRpdERvY3VtZW50KFxuXHRcdFx0XHRvUm9vdENvbnRleHQsXG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKClcblx0XHRcdCk7XG5cblx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwsIG1vZGVsKTtcblxuXHRcdFx0aWYgKG9OZXdEb2N1bWVudENvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgZmFsc2UpO1xuXHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQoZmFsc2UpO1xuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblxuXHRcdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCAhPT0gb1Jvb3RDb250ZXh0KSB7XG5cdFx0XHRcdFx0bGV0IGNvbnRleHRUb05hdmlnYXRlOiBDb250ZXh0IHwgdW5kZWZpbmVkID0gb05ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHRpZiAodGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdHJpZ2h0bW9zdENvbnRleHQgPSBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKTtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvUm9vdENvbnRleHQsIHJpZ2h0bW9zdENvbnRleHQsIHNQcm9ncmFtbWluZ01vZGVsLCB0cnVlKTtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9IG9OZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gc2libGluZ0luZm8udGFyZ2V0Q29udGV4dDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKChvVmlld0RhdGE/LnZpZXdMZXZlbCBhcyBudW1iZXIpID4gMSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgcm9vdFNpYmxpbmdQYXRoID0gb05ld0RvY3VtZW50Q29udGV4dD8uZ2V0UGF0aCgpO1xuXHRcdFx0XHRcdFx0Y29uc3Qgcm9vdENvbnRleHRJbmZvID0ge1xuXHRcdFx0XHRcdFx0XHRyb290U2libGluZ1BhdGg6IHJvb3RTaWJsaW5nUGF0aCxcblx0XHRcdFx0XHRcdFx0cm9vdENvbnRleHROb3RSZXF1aXJlZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRcdFx0XHRcdFx0b1Jvb3RDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRvQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRcdHJvb3RDb250ZXh0SW5mb1xuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdGNvbnRleHRUb05hdmlnYXRlID0gdGhpcy5fZ2V0TmF2aWdhdGlvblRhcmdldEZvckVkaXQob0NvbnRleHQsIG9OZXdEb2N1bWVudENvbnRleHQsIHNpYmxpbmdJbmZvKSBhcyBDb250ZXh0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCB0cnVlLCBmYWxzZSwgYkRyYWZ0TmF2aWdhdGlvbiwgdHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIHN0aWNreU9uIGhhbmRsZXIgbXVzdCBiZSBzZXQgYWZ0ZXIgdGhlIG5hdmlnYXRpb24gaGFzIGJlZW4gZG9uZSxcblx0XHRcdFx0XHRcdC8vIGFzIHRoZSBVUkwgbWF5IGNoYW5nZSBpbiB0aGUgY2FzZSBvZiBGQ0xcblx0XHRcdFx0XHRcdGxldCBzdGlja3lDb250ZXh0OiBDb250ZXh0O1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBrZXB0LWFsaXZlIGNvbnRleHQgdXNlZCB0byBiaW5kIHRoZSBwYWdlXG5cdFx0XHRcdFx0XHRcdHN0aWNreUNvbnRleHQgPSBvTmV3RG9jdW1lbnRDb250ZXh0LmdldE1vZGVsKCkuZ2V0S2VlcEFsaXZlQ29udGV4dChvTmV3RG9jdW1lbnRDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzdGlja3lDb250ZXh0ID0gb05ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T24oc3RpY2t5Q29udGV4dCk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChtb2RlbC5nZXRNZXRhTW9kZWwoKSkpIHtcblx0XHRcdFx0XHRcdC8vIGFjY29yZGluZyB0byBVWCBpbiBjYXNlIG9mIGVuYWJsZWQgY29sbGFib3JhdGlvbiBkcmFmdCB3ZSBzaGFyZSB0aGUgb2JqZWN0IGltbWVkaWF0ZWx5XG5cdFx0XHRcdFx0XHRhd2FpdCBzaGFyZU9iamVjdChvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3IpIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGVkaXRpbmcgdGhlIGRvY3VtZW50XCIsIG9FcnJvciBhcyBhbnkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEZWxldGVzIHNldmVyYWwgZG9jdW1lbnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dHNUb0RlbGV0ZSBUaGUgY29udGV4dHMgb2YgdGhlIGRvY3VtZW50cyB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnRzIGFyZSBkZWxldGVkXG5cdCAqL1xuXHRhc3luYyBkZWxldGVNdWx0aXBsZURvY3VtZW50cyhjb250ZXh0c1RvRGVsZXRlOiBDb250ZXh0W10sIHBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGlmIChwYXJhbWV0ZXJzKSB7XG5cdFx0XHRwYXJhbWV0ZXJzLmJlZm9yZURlbGV0ZUNhbGxCYWNrID0gdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlO1xuXHRcdFx0cGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgPSBwYXJhbWV0ZXJzLnJlcXVlc3RTaWRlRWZmZWN0cyAhPT0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdGJlZm9yZURlbGV0ZUNhbGxCYWNrOiB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEZWxldGUsXG5cdFx0XHRcdHJlcXVlc3RTaWRlRWZmZWN0czogdHJ1ZVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0Y29uc3QgbG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXHRcdGNvbnN0IHBhcmVudENvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKHBhcmFtZXRlcnMuY29udHJvbElkKTtcblx0XHRpZiAoIXBhcmVudENvbnRyb2wpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInBhcmFtZXRlciBjb250cm9sSWQgbWlzc2luZyBvciBpbmNvcnJlY3RcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHBhcmVudENvbnRyb2w7XG5cdFx0fVxuXHRcdGNvbnN0IGxpc3RCaW5kaW5nID0gKHBhcmVudENvbnRyb2wuZ2V0QmluZGluZyhcIml0ZW1zXCIpIHx8IChwYXJlbnRDb250cm9sIGFzIFRhYmxlKS5nZXRSb3dCaW5kaW5nKCkpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0cGFyYW1ldGVycy5iRmluZEFjdGl2ZUNvbnRleHRzID0gdHJ1ZTtcblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5kZWxldGVEb2N1bWVudFRyYW5zYWN0aW9uKGNvbnRleHRzVG9EZWxldGUsIHBhcmFtZXRlcnMpO1xuXHRcdFx0bGV0IHJlc3VsdDtcblxuXHRcdFx0Ly8gTXVsdGlwbGUgb2JqZWN0IGRlbGV0aW9uIGlzIHRyaWdnZXJlZCBmcm9tIGEgbGlzdFxuXHRcdFx0Ly8gRmlyc3QgY2xlYXIgdGhlIHNlbGVjdGlvbiBpbiB0aGUgdGFibGUgYXMgaXQncyBub3QgdmFsaWQgYW55IG1vcmVcblx0XHRcdGlmIChwYXJlbnRDb250cm9sLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0KHBhcmVudENvbnRyb2wgYXMgYW55KS5jbGVhclNlbGVjdGlvbigpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGVuIHJlZnJlc2ggdGhlIGxpc3QtYmluZGluZyAoTFIpLCBvciByZXF1aXJlIHNpZGUtZWZmZWN0cyAoT1ApXG5cdFx0XHRjb25zdCB2aWV3QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0aWYgKChsaXN0QmluZGluZyBhcyBhbnkpLmlzUm9vdCgpKSB7XG5cdFx0XHRcdC8vIGtlZXAgcHJvbWlzZSBjaGFpbiBwZW5kaW5nIHVudGlsIHJlZnJlc2ggb2YgbGlzdGJpbmRpbmcgaXMgY29tcGxldGVkXG5cdFx0XHRcdHJlc3VsdCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRcdFx0bGlzdEJpbmRpbmcuYXR0YWNoRXZlbnRPbmNlKFwiZGF0YVJlY2VpdmVkXCIsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGxpc3RCaW5kaW5nLnJlZnJlc2goKTtcblx0XHRcdH0gZWxzZSBpZiAodmlld0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0XHRpZiAocGFyYW1ldGVycy5yZXF1ZXN0U2lkZUVmZmVjdHMgJiYgIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQobGlzdEJpbmRpbmcpKSB7XG5cdFx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KGxpc3RCaW5kaW5nLmdldFBhdGgoKSwgdmlld0JpbmRpbmdDb250ZXh0IGFzIENvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGRlbGV0aW5nIGF0IGxlYXN0IG9uZSBvYmplY3Qgc2hvdWxkIGFsc28gc2V0IHRoZSBVSSB0byBkaXJ0eVxuXHRcdFx0aWYgKCF0aGlzLmdldEFwcENvbXBvbmVudCgpLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdH1cblxuXHRcdFx0QWN0aXZpdHlTeW5jLnNlbmQoXG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRBY3Rpdml0eS5EZWxldGUsXG5cdFx0XHRcdGNvbnRleHRzVG9EZWxldGUubWFwKChjb250ZXh0OiBDb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSlcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyb3I6IGFueSkge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGhlIGRvY3VtZW50KHMpXCIsIGVycm9yKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBhbmQgZGlzcGxheXMgdGhlIGVycm9yIG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBlcnJvcnMgZHVyaW5nIGFuIHVwZGF0ZS5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSB1cGRhdGVkQ29udGV4dCBDb250ZXh0IG9mIHRoZSB1cGRhdGVkIGZpZWxkXG5cdCAqIEBwYXJhbSB1cGRhdGVQcm9taXNlIFByb21pc2UgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHVwZGF0ZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLiBUaGUgcHJvbWlzZSBzaG91bGQgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgdXBkYXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQsIHNvIHRoZSBkcmFmdCBzdGF0dXMgY2FuIGJlIHVwZGF0ZWQuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBkcmFmdCBzdGF0dXMgaGFzIGJlZW4gdXBkYXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjdXBkYXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0dXBkYXRlRG9jdW1lbnQodXBkYXRlZENvbnRleHQ6IG9iamVjdCwgdXBkYXRlUHJvbWlzZTogUHJvbWlzZTxhbnk+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb3JpZ2luYWxCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgaXNEcmFmdCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbCh1cGRhdGVkQ29udGV4dCBhcyBCaW5kaW5nIHwgQ29udGV4dCkgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cblx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0cmV0dXJuIHRoaXMuc3luY1Rhc2soYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkKHRydWUpO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoaXNEcmFmdCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB1cGRhdGVQcm9taXNlO1xuXHRcdFx0XHRjb25zdCBjdXJyZW50QmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRpZiAoIWlzRHJhZnQgfHwgIWN1cnJlbnRCaW5kaW5nQ29udGV4dCB8fCBjdXJyZW50QmluZGluZ0NvbnRleHQgIT09IG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHQvLyBJZiBhIG5hdmlnYXRpb24gaGFwcGVuZWQgd2hpbGUgb1Byb21pc2Ugd2FzIGJlaW5nIHJlc29sdmVkLCB0aGUgYmluZGluZyBjb250ZXh0IG9mIHRoZSBwYWdlIGNoYW5nZWRcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSdyZSBzdGlsbCBvbiB0aGUgc2FtZSBjb250ZXh0XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHRcdFx0XHRjb25zdCBlbnRpdHlTZXROYW1lID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGN1cnJlbnRCaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIkBzYXB1aS5uYW1lXCIpO1xuXHRcdFx0XHRjb25zdCBzZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMobWV0YU1vZGVsLCBlbnRpdHlTZXROYW1lKTtcblx0XHRcdFx0aWYgKHNlbWFudGljS2V5cz8ubGVuZ3RoKSB7XG5cdFx0XHRcdFx0Y29uc3QgY3VycmVudFNlbWFudGljTWFwcGluZyA9IHRoaXMuX2dldFNlbWFudGljTWFwcGluZygpO1xuXHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRTZW1hbnRpY1BhdGggPSBjdXJyZW50U2VtYW50aWNNYXBwaW5nPy5zZW1hbnRpY1BhdGgsXG5cdFx0XHRcdFx0XHRzQ2hhbmdlZFBhdGggPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY1BhdGgoY3VycmVudEJpbmRpbmdDb250ZXh0LCB0cnVlKTtcblx0XHRcdFx0XHQvLyBjdXJyZW50U2VtYW50aWNQYXRoIGNvdWxkIGJlIG51bGwgaWYgd2UgaGF2ZSBuYXZpZ2F0ZWQgdmlhIGRlZXAgbGluayB0aGVuIHRoZXJlIGFyZSBubyBzZW1hbnRpY01hcHBpbmdzIHRvIGNhbGN1bGF0ZSBpdCBmcm9tXG5cdFx0XHRcdFx0aWYgKGN1cnJlbnRTZW1hbnRpY1BhdGggJiYgY3VycmVudFNlbWFudGljUGF0aCAhPT0gc0NoYW5nZWRQYXRoKSB7XG5cdFx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGN1cnJlbnRCaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0LCB0cnVlLCBmYWxzZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHVwZGF0aW5nIHRoZSBkb2N1bWVudFwiLCBlcnJvcik7XG5cdFx0XHRcdGlmIChpc0RyYWZ0ICYmIG9yaWdpbmFsQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0YXdhaXQgdGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vICogQHBhcmFtIHtzdHJpbmd9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSBUaGUgY3JlYXRpb24gbW9kZSB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgU3luYyAtIHRoZSBjcmVhdGlvbiBpcyB0cmlnZ2VyZWQgYW5kIG9uY2UgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQsIHRoZSBuYXZpZ2F0aW9uIGlzIGRvbmVcblx0Ly8gKiAgICAgICAgICAgICAgICAgICAgQXN5bmMgLSB0aGUgY3JlYXRpb24gYW5kIHRoZSBuYXZpZ2F0aW9uIHRvIHRoZSBpbnN0YW5jZSBhcmUgZG9uZSBpbiBwYXJhbGxlbFxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZCAtIHRoZSBjcmVhdGlvbiBpcyBkb25lIG9uIHRoZSB0YXJnZXQgcGFnZVxuXHQvLyAqICAgICAgICAgICAgICAgICAgICBDcmVhdGlvblJvdyAtIFRoZSBjcmVhdGlvbiBpcyBkb25lIGlubGluZSBhc3luYyBzbyB0aGUgdXNlciBpcyBub3QgYmxvY2tlZFxuXHQvLyBtUGFyYW1ldGVycy5jcmVhdGlvblJvdyBJbnN0YW5jZSBvZiB0aGUgY3JlYXRpb24gcm93IC0gKFRPRE86IGdldCByaWQgYnV0IHVzZSBsaXN0IGJpbmRpbmdzIG9ubHkpXG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gdkxpc3RCaW5kaW5nICBPRGF0YUxpc3RCaW5kaW5nIG9iamVjdCBvciB0aGUgYmluZGluZyBwYXRoIGZvciBhIHRlbXBvcmFyeSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgVGhlIGNyZWF0aW9uIG1vZGUgdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG5cdCAqICAgICAgICAgICAgICAgICAgICBOZXdQYWdlIC0gdGhlIGNyZWF0ZWQgZG9jdW1lbnQgaXMgc2hvd24gaW4gYSBuZXcgcGFnZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgbWV0YWRhdGEgJ1N5bmMnLCAnQXN5bmMnIG9yICdEZWZlcnJlZCcgaXMgdXNlZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgSW5saW5lIC0gVGhlIGNyZWF0aW9uIGlzIGRvbmUgaW5saW5lIChpbiBhIHRhYmxlKVxuXHQgKiAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgLSBUaGUgY3JlYXRpb24gaXMgZG9uZSBpbiBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBzcGVjaWZpZWQgdmlhIHRoZSBwYXJhbWV0ZXIgJ291dGJvdW5kJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy50YWJsZUlkIElEIG9mIHRoZSB0YWJsZVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5vdXRib3VuZCBUaGUgbmF2aWdhdGlvbiB0YXJnZXQgd2hlcmUgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgaW4gY2FzZSBvZiBjcmVhdGlvbk1vZGUgJ0V4dGVybmFsJ1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jcmVhdGVBdEVuZCBTcGVjaWZpZXMgaWYgdGhlIG5ldyBlbnRyeSBzaG91bGQgYmUgY3JlYXRlZCBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiBhIHRhYmxlIGluIGNhc2Ugb2YgY3JlYXRpb25Nb2RlICdJbmxpbmUnXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2NyZWF0ZURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNyZWF0ZURvY3VtZW50KFxuXHRcdHZMaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyB8IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzOiB7XG5cdFx0XHRjcmVhdGlvbk1vZGU6IHN0cmluZztcblx0XHRcdHRhYmxlSWQ/OiBzdHJpbmc7XG5cdFx0XHRvdXRib3VuZD86IHN0cmluZztcblx0XHRcdGNyZWF0ZUF0RW5kPzogYm9vbGVhbjtcblx0XHR9XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRsZXQgb1RhYmxlOiBhbnk7IC8vc2hvdWxkIGJlIFRhYmxlIGJ1dCB0aGVyZSBhcmUgbWlzc2luZyBtZXRob2RzIGludG8gdGhlIGRlZlxuXHRcdGxldCBtUGFyYW1ldGVyczogYW55ID0gbUluUGFyYW1ldGVycztcblx0XHRsZXQgb0NyZWF0aW9uOiBQcm9taXNlPENvbnRleHQ+IHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGJTaG91bGRCdXN5TG9jayA9XG5cdFx0XHQhbVBhcmFtZXRlcnMgfHxcblx0XHRcdChtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5JbmxpbmUgJiZcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiZcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuRXh0ZXJuYWwpO1xuXHRcdGxldCBvRXhlY0N1c3RvbVZhbGlkYXRpb24gPSBQcm9taXNlLnJlc29sdmUoW10pO1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpO1xuXHRcdG9BcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkoKS5yZW1vdmVJQXBwU3RhdGVLZXkoKTtcblxuXHRcdGlmIChtUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5FeHRlcm5hbCkge1xuXHRcdFx0Ly8gQ3JlYXRlIGJ5IG5hdmlnYXRpbmcgdG8gYW4gZXh0ZXJuYWwgdGFyZ2V0XG5cdFx0XHQvLyBUT0RPOiBDYWxsIGFwcHJvcHJpYXRlIGZ1bmN0aW9uIChjdXJyZW50bHkgdXNpbmcgdGhlIHNhbWUgYXMgZm9yIG91dGJvdW5kIGNoZXZyb24gbmF2LCBhbmQgd2l0aG91dCBhbnkgY29udGV4dCAtIDNyZCBwYXJhbSlcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IG9Db250cm9sbGVyID0gdGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0Y29uc3Qgc0NyZWF0ZVBhdGggPSBNb2RlbEhlbHBlci5nZXRBYnNvbHV0ZU1ldGFQYXRoRm9yTGlzdEJpbmRpbmcodGhpcy5iYXNlLmdldFZpZXcoKSwgdkxpc3RCaW5kaW5nKTtcblxuXHRcdFx0KG9Db250cm9sbGVyIGFzIGFueSkuaGFuZGxlcnMub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyLCBtUGFyYW1ldGVycy5vdXRib3VuZCwgdW5kZWZpbmVkLCBzQ3JlYXRlUGF0aCk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cpIHtcblx0XHRcdGNvbnN0IG9DcmVhdGlvblJvd09iamVjdHMgPSBtUGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpLmdldE9iamVjdCgpO1xuXHRcdFx0ZGVsZXRlIG9DcmVhdGlvblJvd09iamVjdHNbXCJAJHVpNS5jb250ZXh0LmlzVHJhbnNpZW50XCJdO1xuXHRcdFx0b1RhYmxlID0gbVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0UGFyZW50KCk7XG5cdFx0XHRvRXhlY0N1c3RvbVZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlRG9jdW1lbnQob1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KCksIHtcblx0XHRcdFx0ZGF0YTogb0NyZWF0aW9uUm93T2JqZWN0cyxcblx0XHRcdFx0Y3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uOiBvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gZGlzYWJsZUFkZFJvd0J1dHRvbkZvckVtcHR5RGF0YSBpcyBzZXQgdG8gZmFsc2UgaW4gbWFuaWZlc3QgY29udmVydGVyIChUYWJsZS50cykgaWYgY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIGV4aXN0c1xuXHRcdFx0aWYgKG9UYWJsZS5nZXRDcmVhdGlvblJvdygpLmRhdGEoXCJkaXNhYmxlQWRkUm93QnV0dG9uRm9yRW1wdHlEYXRhXCIpID09PSBcInRydWVcIikge1xuXHRcdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dGaWVsZFZhbGlkaXR5XCIsIHt9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lICYmIG1QYXJhbWV0ZXJzLnRhYmxlSWQpIHtcblx0XHRcdG9UYWJsZSA9IHRoaXMuZ2V0VmlldygpLmJ5SWQobVBhcmFtZXRlcnMudGFibGVJZCkgYXMgVGFibGU7XG5cdFx0fVxuXG5cdFx0aWYgKG9UYWJsZSAmJiBvVGFibGUuaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0Y29uc3QgZm5Gb2N1c09yU2Nyb2xsID1cblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lID8gb1RhYmxlLmZvY3VzUm93LmJpbmQob1RhYmxlKSA6IG9UYWJsZS5zY3JvbGxUb0luZGV4LmJpbmQob1RhYmxlKTtcblx0XHRcdG9UYWJsZS5nZXRSb3dCaW5kaW5nKCkuYXR0YWNoRXZlbnRPbmNlKFwiY2hhbmdlXCIsIGFzeW5jIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0YXdhaXQgb0NyZWF0aW9uO1xuXHRcdFx0XHRmbkZvY3VzT3JTY3JvbGwobVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQgPyBvVGFibGUuZ2V0Um93QmluZGluZygpLmdldExlbmd0aCgpIDogMCwgdHJ1ZSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRjb25zdCBoYW5kbGVTaWRlRWZmZWN0cyA9IGFzeW5jIChvTGlzdEJpbmRpbmc6IGFueSwgb0NyZWF0aW9uUHJvbWlzZTogUHJvbWlzZTxDb250ZXh0PikgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3Qgb05ld0NvbnRleHQgPSBhd2FpdCBvQ3JlYXRpb25Qcm9taXNlO1xuXHRcdFx0XHQvLyB0cmFuc2llbnQgY29udGV4dHMgYXJlIHJlbGlhYmx5IHJlbW92ZWQgb25jZSBvTmV3Q29udGV4dC5jcmVhdGVkKCkgaXMgcmVzb2x2ZWRcblx0XHRcdFx0YXdhaXQgb05ld0NvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdFx0Ly8gdGhpcyBpcyBhdm9pZCBhIHBvdGVudGlhbCBsaXN0IHJlZnJlc2gsIHRoZXJlIGNvdWxkIGJlIGEgc2lkZSBlZmZlY3QgdGhhdCByZWZyZXNoZXMgdGhlIGxpc3QgYmluZGluZ1xuXHRcdFx0XHQvLyBpZiBsaXN0IGJpbmRpbmcgaXMgcmVmcmVzaGVkLCB0cmFuc2llbnQgY29udGV4dHMgbWlnaHQgYmUgbG9zdFxuXHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQob0xpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eShvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBvQmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIGFWYWxpZGF0aW9uTWVzc2FnZXMgRXJyb3IgbWVzc2FnZXMgZnJvbSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvblxuXHRcdCAqL1xuXHRcdGNvbnN0IGNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyA9IChhVmFsaWRhdGlvbk1lc3NhZ2VzOiBhbnlbXSkgPT4ge1xuXHRcdFx0Y29uc3Qgc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiA9IG9UYWJsZSAmJiBvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKS5kYXRhKFwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXCIpO1xuXHRcdFx0Y29uc3QgbUN1c3RvbVZhbGlkaXR5ID0gb1RhYmxlICYmIG9UYWJsZS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93Q3VzdG9tVmFsaWRpdHlcIik7XG5cdFx0XHRjb25zdCBvTWVzc2FnZU1hbmFnZXIgPSBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCk7XG5cdFx0XHRjb25zdCBhQ3VzdG9tTWVzc2FnZXM6IGFueVtdID0gW107XG5cdFx0XHRsZXQgb0ZpZWxkQ29udHJvbDtcblx0XHRcdGxldCBzVGFyZ2V0OiBzdHJpbmc7XG5cblx0XHRcdC8vIFJlbW92ZSBleGlzdGluZyBDdXN0b21WYWxpZGF0aW9uIG1lc3NhZ2Vcblx0XHRcdG9NZXNzYWdlTWFuYWdlclxuXHRcdFx0XHQuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHQuZm9yRWFjaChmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdGlmIChvTWVzc2FnZS5jb2RlID09PSBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0XHRvTWVzc2FnZU1hbmFnZXIucmVtb3ZlTWVzc2FnZXMob01lc3NhZ2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdGFWYWxpZGF0aW9uTWVzc2FnZXMuZm9yRWFjaCgob1ZhbGlkYXRpb25NZXNzYWdlOiBhbnkpID0+IHtcblx0XHRcdFx0Ly8gSGFuZGxlIEJvdW5kIEN1c3RvbVZhbGlkYXRpb24gbWVzc2FnZVxuXHRcdFx0XHRpZiAob1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXQpIHtcblx0XHRcdFx0XHRvRmllbGRDb250cm9sID0gQ29yZS5nZXRDb250cm9sKG1DdXN0b21WYWxpZGl0eVtvVmFsaWRhdGlvbk1lc3NhZ2UubWVzc2FnZVRhcmdldF0uZmllbGRJZCkgYXMgQ29udHJvbDtcblx0XHRcdFx0XHRzVGFyZ2V0ID0gYCR7b0ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCl9LyR7b0ZpZWxkQ29udHJvbC5nZXRCaW5kaW5nUGF0aChcInZhbHVlXCIpfWA7XG5cdFx0XHRcdFx0Ly8gQWRkIHZhbGlkYXRpb24gbWVzc2FnZSBpZiBzdGlsbCBub3QgZXhpc3RzXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyXG5cdFx0XHRcdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0XHQuZ2V0RGF0YSgpXG5cdFx0XHRcdFx0XHRcdC5maWx0ZXIoZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb01lc3NhZ2UudGFyZ2V0ID09PSBzVGFyZ2V0O1xuXHRcdFx0XHRcdFx0XHR9KS5sZW5ndGggPT09IDBcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5hZGRNZXNzYWdlcyhcblx0XHRcdFx0XHRcdFx0bmV3IE1lc3NhZ2Uoe1xuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6IG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzb3I6IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogTWVzc2FnZVR5cGUuRXJyb3IsXG5cdFx0XHRcdFx0XHRcdFx0Y29kZTogc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdFx0XHR0ZWNobmljYWw6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdHRhcmdldDogc1RhcmdldFxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gQWRkIGNvbnRyb2xJZCBpbiBvcmRlciB0byBnZXQgdGhlIGZvY3VzIGhhbmRsaW5nIG9mIHRoZSBlcnJvciBwb3BvdmVyIHJ1bmFibGVcblx0XHRcdFx0XHRjb25zdCBhRXhpc3RpbmdWYWxpZGF0aW9uTWVzc2FnZXMgPSBvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb01lc3NhZ2UudGFyZ2V0ID09PSBzVGFyZ2V0O1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YUV4aXN0aW5nVmFsaWRhdGlvbk1lc3NhZ2VzWzBdLmFkZENvbnRyb2xJZChtQ3VzdG9tVmFsaWRpdHlbb1ZhbGlkYXRpb25NZXNzYWdlLm1lc3NhZ2VUYXJnZXRdLmZpZWxkSWQpO1xuXG5cdFx0XHRcdFx0Ly8gSGFuZGxlIFVuYm91bmQgQ3VzdG9tVmFsaWRhdGlvbiBtZXNzYWdlXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUN1c3RvbU1lc3NhZ2VzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y29kZTogc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbixcblx0XHRcdFx0XHRcdHRleHQ6IG9WYWxpZGF0aW9uTWVzc2FnZS5tZXNzYWdlVGV4dCxcblx0XHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0XHR0eXBlOiBNZXNzYWdlVHlwZS5FcnJvclxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGFDdXN0b21NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZyh7XG5cdFx0XHRcdFx0Y3VzdG9tTWVzc2FnZXM6IGFDdXN0b21NZXNzYWdlc1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y29uc3QgcmVzb2x2ZUNyZWF0aW9uTW9kZSA9IChcblx0XHRcdGluaXRpYWxDcmVhdGlvbk1vZGU6IHN0cmluZyxcblx0XHRcdHByb2dyYW1taW5nTW9kZWw6IHN0cmluZyxcblx0XHRcdG9MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsXG5cdFx0KTogc3RyaW5nID0+IHtcblx0XHRcdGlmIChpbml0aWFsQ3JlYXRpb25Nb2RlICYmIGluaXRpYWxDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5OZXdQYWdlKSB7XG5cdFx0XHRcdC8vIHVzZSB0aGUgcGFzc2VkIGNyZWF0aW9uIG1vZGVcblx0XHRcdFx0cmV0dXJuIGluaXRpYWxDcmVhdGlvbk1vZGU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBOZXdBY3Rpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIE5hdmlnYXRpb25Qcm9wZXJ0eSBjb2xsZWN0aW9uXG5cdFx0XHRcdGlmICghb0xpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKSkge1xuXHRcdFx0XHRcdGNvbnN0IHNQYXRoID0gb0xpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdC8vIGlmIE5ld0FjdGlvbiB3aXRoIHBhcmFtZXRlcnMgaXMgcHJlc2VudCwgdGhlbiBjcmVhdGlvbiBpcyAnRGVmZXJyZWQnXG5cdFx0XHRcdFx0XHQvLyBpbiB0aGUgYWJzZW5jZSBvZiBOZXdBY3Rpb24gb3IgTmV3QWN0aW9uIHdpdGggcGFyYW1ldGVycywgY3JlYXRpb24gaXMgYXN5bmNcblx0XHRcdFx0XHRcdHNOZXdBY3Rpb24gPVxuXHRcdFx0XHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0XHRcdFx0PyBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9OZXdBY3Rpb25gKVxuXHRcdFx0XHRcdFx0XHRcdDogb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c1BhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZC9OZXdBY3Rpb25gKTtcblx0XHRcdFx0XHRpZiAoc05ld0FjdGlvbikge1xuXHRcdFx0XHRcdFx0Y29uc3QgYVBhcmFtZXRlcnMgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgLyR7c05ld0FjdGlvbn0vQCR1aTUub3ZlcmxvYWQvMC8kUGFyYW1ldGVyYCkgfHwgW107XG5cdFx0XHRcdFx0XHQvLyBiaW5kaW5nIHBhcmFtZXRlciAoZWc6IF9pdCkgaXMgbm90IGNvbnNpZGVyZWRcblx0XHRcdFx0XHRcdGlmIChhUGFyYW1ldGVycy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0xpc3RCaW5kaW5nPy5nZXRIZWFkZXJDb250ZXh0KCkhLmdldFBhdGgoKSk7XG5cdFx0XHRcdGNvbnN0IGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMgPSBnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMob01ldGFNb2RlbCwgc01ldGFQYXRoLCB0aGlzLmdldEFwcENvbXBvbmVudCgpKTtcblx0XHRcdFx0aWYgKGFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHJldHVybiBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIENyZWF0aW9uTW9kZS5Bc3luYztcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0aWYgKGJTaG91bGRCdXN5TG9jaykge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGFWYWxpZGF0aW9uTWVzc2FnZXMgPSBhd2FpdCB0aGlzLnN5bmNUYXNrKG9FeGVjQ3VzdG9tVmFsaWRhdGlvbik7XG5cdFx0XHRpZiAoYVZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNyZWF0ZUN1c3RvbVZhbGlkYXRpb25NZXNzYWdlcyhhVmFsaWRhdGlvbk1lc3NhZ2VzKTtcblx0XHRcdFx0TG9nLmVycm9yKFwiQ3VzdG9tIFZhbGlkYXRpb24gZmFpbGVkXCIpO1xuXHRcdFx0XHQvLyBpZiBjdXN0b20gdmFsaWRhdGlvbiBmYWlscywgd2UgbGVhdmUgdGhlIG1ldGhvZCBpbW1lZGlhdGVseVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGxldCBvTGlzdEJpbmRpbmc6IGFueTtcblx0XHRcdG1QYXJhbWV0ZXJzID0gbVBhcmFtZXRlcnMgfHwge307XG5cblx0XHRcdGlmICh2TGlzdEJpbmRpbmcgJiYgdHlwZW9mIHZMaXN0QmluZGluZyA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHQvLyB3ZSBhbHJlYWR5IGdldCBhIGxpc3QgYmluZGluZyB1c2UgdGhpcyBvbmVcblx0XHRcdFx0b0xpc3RCaW5kaW5nID0gdkxpc3RCaW5kaW5nO1xuXHRcdFx0fSBlbHNlIGlmICh0eXBlb2Ygdkxpc3RCaW5kaW5nID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdG9MaXN0QmluZGluZyA9IG5ldyAoT0RhdGFMaXN0QmluZGluZyBhcyBhbnkpKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCksIHZMaXN0QmluZGluZyk7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSA9IENyZWF0aW9uTW9kZS5TeW5jO1xuXHRcdFx0XHRkZWxldGUgbVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIG9iamVjdCBvciBwYXRoIGV4cGVjdGVkXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvTW9kZWwgPSBvTGlzdEJpbmRpbmcuZ2V0TW9kZWwoKTtcblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0xpc3RCaW5kaW5nKTtcblx0XHRcdGNvbnN0IHJlc29sdmVkQ3JlYXRpb25Nb2RlID0gcmVzb2x2ZUNyZWF0aW9uTW9kZShcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlLFxuXHRcdFx0XHRzUHJvZ3JhbW1pbmdNb2RlbCxcblx0XHRcdFx0b0xpc3RCaW5kaW5nLFxuXHRcdFx0XHRvTW9kZWwuZ2V0TWV0YU1vZGVsKClcblx0XHRcdCk7XG5cdFx0XHRsZXQgbUFyZ3M6IGFueTtcblx0XHRcdGNvbnN0IG9DcmVhdGlvblJvdyA9IG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93O1xuXHRcdFx0bGV0IG9DcmVhdGlvblJvd0NvbnRleHQ6IGFueTtcblx0XHRcdGxldCBvUGF5bG9hZDogYW55O1xuXHRcdFx0bGV0IHNNZXRhUGF0aDogc3RyaW5nO1xuXHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IG9Sb3V0aW5nTGlzdGVuZXIgPSB0aGlzLmdldEludGVybmFsUm91dGluZygpO1xuXG5cdFx0XHRpZiAocmVzb2x2ZWRDcmVhdGlvbk1vZGUgIT09IENyZWF0aW9uTW9kZS5EZWZlcnJlZCkge1xuXHRcdFx0XHRpZiAocmVzb2x2ZWRDcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdykge1xuXHRcdFx0XHRcdG9DcmVhdGlvblJvd0NvbnRleHQgPSBvQ3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9DcmVhdGlvblJvd0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHQvLyBwcmVmaWxsIGRhdGEgZnJvbSBjcmVhdGlvbiByb3dcblx0XHRcdFx0XHRvUGF5bG9hZCA9IG9DcmVhdGlvblJvd0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuZGF0YSA9IHt9O1xuXHRcdFx0XHRcdE9iamVjdC5rZXlzKG9QYXlsb2FkKS5mb3JFYWNoKGZ1bmN0aW9uIChzUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9Qcm9wZXJ0eSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzUHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdFx0Ly8gZW5zdXJlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcmUgbm90IHBhcnQgb2YgdGhlIHBheWxvYWQsIGRlZXAgY3JlYXRlIG5vdCBzdXBwb3J0ZWRcblx0XHRcdFx0XHRcdGlmIChvUHJvcGVydHkgJiYgb1Byb3BlcnR5LiRraW5kID09PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGFbc1Byb3BlcnR5UGF0aF0gPSBvUGF5bG9hZFtzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9jaGVja0ZvclZhbGlkYXRpb25FcnJvcnMoLypvQ3JlYXRpb25Sb3dDb250ZXh0Ki8pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChyZXNvbHZlZENyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93IHx8IHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuSW5saW5lKSB7XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMua2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZCA9IGZhbHNlOyAvLyBjdXJyZW50bHkgbm90IGZ1bGx5IHN1cHBvcnRlZFxuXHRcdFx0XHRcdC8vIGJ1c3kgaGFuZGxpbmcgc2hhbGwgYmUgZG9uZSBsb2NhbGx5IG9ubHlcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5idXN5TW9kZSA9IFwiTG9jYWxcIjtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5idXN5SWQgPSBvVGFibGU/LmdldFBhcmVudCgpPy5nZXRUYWJsZURlZmluaXRpb24oKT8uYW5ub3RhdGlvbi5pZDtcblxuXHRcdFx0XHRcdC8vIHRha2UgY2FyZSBvbiBtZXNzYWdlIGhhbmRsaW5nLCBkcmFmdCBpbmRpY2F0b3IgKGluIGNhc2Ugb2YgZHJhZnQpXG5cdFx0XHRcdFx0Ly8gQXR0YWNoIHRoZSBjcmVhdGUgc2VudCBhbmQgY3JlYXRlIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdFx0XHRcdHRoaXMuaGFuZGxlQ3JlYXRlRXZlbnRzKG9MaXN0QmluZGluZyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wpIHtcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2sgPSB0aGlzLm9uQmVmb3JlQ3JlYXRlO1xuXG5cdFx0XHRcdC8vIEluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHdhcyBjYWxsZWQgd2l0aCBwcmVmZXJyZWRNb2RlPWF1dG9DcmVhdGVXaXRoLCB3ZSB3YW50IHRvIHNraXAgdGhlXG5cdFx0XHRcdC8vIGFjdGlvbiBwYXJhbWV0ZXIgZGlhbG9nXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2cgPSBvQXBwQ29tcG9uZW50LmdldFN0YXJ0dXBNb2RlKCkgPT09IFN0YXJ0dXBNb2RlLkF1dG9DcmVhdGU7XG5cblx0XHRcdFx0b0NyZWF0aW9uID0gdHJhbnNhY3Rpb25IZWxwZXIuY3JlYXRlRG9jdW1lbnQoXG5cdFx0XHRcdFx0b0xpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHRcdGZhbHNlXG5cdFx0XHRcdCk7XG5cdFx0XHRcdC8vIFNpZGVFZmZlY3RzIG9uIENyZWF0ZVxuXHRcdFx0XHQvLyBpZiBTYXZlIGlzIHByZXNzZWQgZGlyZWN0bHkgYWZ0ZXIgZmlsbGluZyB0aGUgQ3JlYXRpb25Sb3csIG5vIFNpZGVFZmZlY3RzIHJlcXVlc3Rcblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5iU2tpcFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdFx0aGFuZGxlU2lkZUVmZmVjdHMob0xpc3RCaW5kaW5nLCBvQ3JlYXRpb24pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGxldCBvTmF2aWdhdGlvbjtcblx0XHRcdHN3aXRjaCAocmVzb2x2ZWRDcmVhdGlvbk1vZGUpIHtcblx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuRGVmZXJyZWQ6XG5cdFx0XHRcdFx0b05hdmlnYXRpb24gPSBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlRm9yd2FyZFRvQ29udGV4dChvTGlzdEJpbmRpbmcsIHtcblx0XHRcdFx0XHRcdGJEZWZlcnJlZENvbnRleHQ6IHRydWUsXG5cdFx0XHRcdFx0XHRlZGl0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdGJGb3JjZUZvY3VzOiB0cnVlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgQ3JlYXRpb25Nb2RlLkFzeW5jOlxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob0xpc3RCaW5kaW5nLCB7XG5cdFx0XHRcdFx0XHRhc3luY0NvbnRleHQ6IG9DcmVhdGlvbixcblx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBDcmVhdGlvbk1vZGUuU3luYzpcblx0XHRcdFx0XHRtQXJncyA9IHtcblx0XHRcdFx0XHRcdGVkaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0YkZvcmNlRm9jdXM6IHRydWVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBtUGFyYW1ldGVycy5jcmVhdGVBY3Rpb24pIHtcblx0XHRcdFx0XHRcdG1BcmdzLnRyYW5zaWVudCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb0NyZWF0aW9uPy50aGVuKGZ1bmN0aW9uIChvTmV3RG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmICghb05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjb3JlUmVzb3VyY2VCdW5kbGUgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZVRvTWVzc2FnZVBhZ2UoXG5cdFx0XHRcdFx0XHRcdFx0Y29yZVJlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9EQVRBX1JFQ0VJVkVEX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiBjb3JlUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SXCIpLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IGNvcmVSZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19FRElURkxPV19TQVBGRV9DUkVBVElPTl9GQUlMRURfREVTQ1JJUFRJT05cIilcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBJbiBjYXNlIHRoZSBTeW5jIGNyZWF0aW9uIHdhcyB0cmlnZ2VyZWQgZm9yIGEgZGVmZXJyZWQgY3JlYXRpb24sIHdlIGRvbid0IG5hdmlnYXRlIGZvcndhcmRcblx0XHRcdFx0XHRcdFx0Ly8gYXMgd2UncmUgYWxyZWFkeSBvbiB0aGUgY29ycmVzcG9uZGluZyBPYmplY3RQYWdlXG5cdFx0XHRcdFx0XHRcdHJldHVybiBtUGFyYW1ldGVycy5iRnJvbURlZmVycmVkXG5cdFx0XHRcdFx0XHRcdFx0PyBvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlVG9Db250ZXh0KG9OZXdEb2N1bWVudENvbnRleHQsIG1BcmdzKVxuXHRcdFx0XHRcdFx0XHRcdDogb1JvdXRpbmdMaXN0ZW5lci5uYXZpZ2F0ZUZvcndhcmRUb0NvbnRleHQob05ld0RvY3VtZW50Q29udGV4dCwgbUFyZ3MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5JbmxpbmU6XG5cdFx0XHRcdFx0dGhpcy5zeW5jVGFzayhvQ3JlYXRpb24pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdzpcblx0XHRcdFx0XHQvLyB0aGUgY3JlYXRpb24gcm93IHNoYWxsIGJlIGNsZWFyZWQgb25jZSB0aGUgdmFsaWRhdGlvbiBjaGVjayB3YXMgc3VjY2Vzc2Z1bCBhbmRcblx0XHRcdFx0XHQvLyB0aGVyZWZvcmUgdGhlIFBPU1QgY2FuIGJlIHNlbnQgYXN5bmMgdG8gdGhlIGJhY2tlbmRcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0NyZWF0aW9uUm93TGlzdEJpbmRpbmcgPSBvQ3JlYXRpb25Sb3dDb250ZXh0LmdldEJpbmRpbmcoKTtcblxuXHRcdFx0XHRcdFx0Y29uc3Qgb05ld1RyYW5zaWVudENvbnRleHQgPSBvQ3JlYXRpb25Sb3dMaXN0QmluZGluZy5jcmVhdGUoKTtcblx0XHRcdFx0XHRcdG9DcmVhdGlvblJvdy5zZXRCaW5kaW5nQ29udGV4dChvTmV3VHJhbnNpZW50Q29udGV4dCk7XG5cblx0XHRcdFx0XHRcdC8vIHRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIGNvbnNvbGUgZXJyb3JzIFRPIGJlIGNoZWNrZWQgd2l0aCBtb2RlbCBjb2xsZWFndWVzXG5cdFx0XHRcdFx0XHRvTmV3VHJhbnNpZW50Q29udGV4dC5jcmVhdGVkKCkuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgZmFzdCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gb0NyZWF0aW9uUm93Q29udGV4dC5kZWxldGUoXCIkZGlyZWN0XCIpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHQvLyBSZXNldCBidXN5IGluZGljYXRvciBhZnRlciBhIHZhbGlkYXRpb24gZXJyb3Jcblx0XHRcdFx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpKSB7XG5cdFx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQ3JlYXRpb25Sb3cgbmF2aWdhdGlvbiBlcnJvcjogXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdG9OYXZpZ2F0aW9uID0gUHJvbWlzZS5yZWplY3QoYFVuaGFuZGxlZCBjcmVhdGlvbk1vZGUgJHtyZXNvbHZlZENyZWF0aW9uTW9kZX1gKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9DcmVhdGlvbikge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IGFQYXJhbXMgPSBhd2FpdCBQcm9taXNlLmFsbChbb0NyZWF0aW9uLCBvTmF2aWdhdGlvbl0pO1xuXHRcdFx0XHRcdHRoaXMuX3NldFN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwsIG9Nb2RlbCk7XG5cblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTsgLy8gVGhlIGNyZWF0ZU1vZGUgZmxhZyB3aWxsIGJlIHNldCBpbiBjb21wdXRlRWRpdE1vZGVcblx0XHRcdFx0XHRpZiAoIW9MaXN0QmluZGluZy5pc1JlbGF0aXZlKCkgJiYgc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRcdFx0XHQvLyBXb3JrYXJvdW5kIHRvIHRlbGwgdGhlIE9QIHRoYXQgd2UndmUgY3JlYXRlZCBhIG5ldyBvYmplY3QgZnJvbSB0aGUgTFJcblx0XHRcdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG9MaXN0QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuYmluZENvbnRleHQobWV0YU1vZGVsLmdldE1ldGFQYXRoKG9MaXN0QmluZGluZy5nZXRQYXRoKCkpKTtcblx0XHRcdFx0XHRcdGNvbnN0IGVudGl0eVNldCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhtZXRhQ29udGV4dCkuc3RhcnRpbmdFbnRpdHlTZXQgYXMgRW50aXR5U2V0O1xuXHRcdFx0XHRcdFx0Y29uc3QgbmV3QWN0aW9uID0gZW50aXR5U2V0Py5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkPy5OZXdBY3Rpb247XG5cdFx0XHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBuZXdBY3Rpb24pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBvTmV3RG9jdW1lbnRDb250ZXh0ID0gYVBhcmFtc1swXTtcblx0XHRcdFx0XHRpZiAob05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUob0xpc3RCaW5kaW5nKTtcblx0XHRcdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQ3JlYXRlLCBvTmV3RG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHRcdGlmIChNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChvTW9kZWwuZ2V0TWV0YU1vZGVsKCkpICYmICFBY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIGFjY29yZGluZyB0byBVWCBpbiBjYXNlIG9mIGVuYWJsZWQgY29sbGFib3JhdGlvbiBkcmFmdCB3ZSBzaGFyZSB0aGUgb2JqZWN0IGltbWVkaWF0ZWx5XG5cdFx0XHRcdFx0XHRcdGF3YWl0IHNoYXJlT2JqZWN0KG9OZXdEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcblx0XHRcdFx0XHQvLyBUT0RPOiBjdXJyZW50bHksIHRoZSBvbmx5IGVycm9ycyBoYW5kbGVkIGhlcmUgYXJlIHJhaXNlZCBhcyBzdHJpbmcgLSBzaG91bGQgYmUgY2hhbmdlZCB0byBFcnJvciBvYmplY3RzXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0ZXJyb3IgPT09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cgfHxcblx0XHRcdFx0XHRcdGVycm9yID09PSBDb25zdGFudHMuQWN0aW9uRXhlY3V0aW9uRmFpbGVkIHx8XG5cdFx0XHRcdFx0XHRlcnJvciA9PT0gQ29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHQvLyBjcmVhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQgYnkgdXNlciBvciBmYWlsZWQgaW4gYmFja2VuZCA9PiBpbiBjYXNlIHdlIGhhdmUgbmF2aWdhdGVkIHRvIHRyYW5zaWVudCBjb250ZXh0IGJlZm9yZSwgbmF2aWdhdGUgYmFja1xuXHRcdFx0XHRcdFx0Ly8gdGhlIHN3aXRjaC1zdGF0ZW1lbnQgYWJvdmUgc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGhhcHBlbnMgaW4gY3JlYXRpb25Nb2RlcyBkZWZlcnJlZCBhbmQgYXN5bmMuIEJ1dCBpbiBmYWN0LCBpbiB0aGVzZSBjYXNlcyBhZnRlciB0aGUgbmF2aWdhdGlvbiBmcm9tIHJvdXRlTWF0Y2hlZCBpbiBPUCBjb21wb25lbnRcblx0XHRcdFx0XHRcdC8vIGNyZWF0ZURlZmVycmVkQ29udGV4dCBpcyB0cmlnZ2VyZCwgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgKGNyZWF0ZURvY3VtZW50KSBhZ2FpbiAtIHRoaXMgdGltZSB3aXRoIGNyZWF0aW9uTW9kZSBzeW5jLiBUaGVyZWZvcmUsIGFsc28gaW4gdGhhdCBtb2RlIHdlIG5lZWQgdG8gdHJpZ2dlciBiYWNrIG5hdmlnYXRpb24uXG5cdFx0XHRcdFx0XHQvLyBUaGUgb3RoZXIgY2FzZXMgbWlnaHQgc3RpbGwgYmUgbmVlZGVkIGluIGNhc2UgdGhlIG5hdmlnYXRpb24gZmFpbHMuXG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuU3luYyB8fFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlZENyZWF0aW9uTW9kZSA9PT0gQ3JlYXRpb25Nb2RlLkRlZmVycmVkIHx8XG5cdFx0XHRcdFx0XHRcdHJlc29sdmVkQ3JlYXRpb25Nb2RlID09PSBDcmVhdGlvbk1vZGUuQXN5bmNcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRvUm91dGluZ0xpc3RlbmVyLm5hdmlnYXRlQmFja0Zyb21UcmFuc2llbnRTdGF0ZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoYlNob3VsZEJ1c3lMb2NrKSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogVmFsaWRhdGVzIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCByZXN1bHQgb2YgdGhlIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uXG5cdCAqL1xuXG5cdHZhbGlkYXRlRG9jdW1lbnQoY29udGV4dDogQ29udGV4dCwgcGFyYW1ldGVyczogYW55KTogUHJvbWlzZTxhbnk+IHtcblx0XHRyZXR1cm4gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpLnZhbGlkYXRlRG9jdW1lbnQoY29udGV4dCwgcGFyYW1ldGVycywgdGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgc2V2ZXJhbCBkb2N1bWVudHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdEJpbmRpbmcgdXNlZCB0byBjcmVhdGUgdGhlIGRvY3VtZW50c1xuXHQgKiBAcGFyYW0gZGF0YUZvckNyZWF0ZSBUaGUgaW5pdGlhbCBkYXRhIGZvciB0aGUgbmV3IGRvY3VtZW50c1xuXHQgKiBAcGFyYW0gY3JlYXRlQXRFbmQgVHJ1ZSBpZiB0aGUgbmV3IGNvbnRleHRzIG5lZWQgdG8gYmUgY3JlYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IGJpbmRpbmdcblx0ICogQHBhcmFtIGlzRnJvbUNvcHlQYXN0ZSBUcnVlIGlmIHRoZSBjcmVhdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQgYnkgYSBwYXN0ZSBhY3Rpb25cblx0ICogQHBhcmFtIGJlZm9yZUNyZWF0ZUNhbGxCYWNrIENhbGxiYWNrIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBjcmVhdGVBc0luYWN0aXZlIFRydWUgaWYgdGhlIGNvbnRleHRzIG5lZWQgdG8gYmUgY3JlYXRlZCBhcyBpbmFjdGl2ZVxuXHQgKiBAcGFyYW0gcmVxdWVzdFNpZGVFZmZlY3RzIFRydWUgYnkgZGVmYXVsdCwgZmFsc2UgaWYgU2lkZUVmZmVjdHMgc2hvdWxkIG5vdCBiZSByZXF1ZXN0ZWRcblx0ICogQHJldHVybnMgQSBQcm9taXNlIHdpdGggdGhlIG5ld2x5IGNyZWF0ZWQgY29udGV4dHMuXG5cdCAqL1xuXHRhc3luYyBjcmVhdGVNdWx0aXBsZURvY3VtZW50cyhcblx0XHRsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRkYXRhRm9yQ3JlYXRlOiBhbnlbXSxcblx0XHRjcmVhdGVBdEVuZDogYm9vbGVhbixcblx0XHRpc0Zyb21Db3B5UGFzdGU6IGJvb2xlYW4sXG5cdFx0YmVmb3JlQ3JlYXRlQ2FsbEJhY2s/OiBGdW5jdGlvbixcblx0XHRjcmVhdGVBc0luYWN0aXZlID0gZmFsc2UsXG5cdFx0cmVxdWVzdFNpZGVFZmZlY3RzPzogYm9vbGVhblxuXHQpIHtcblx0XHRjb25zdCB0cmFuc2FjdGlvbkhlbHBlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKTtcblx0XHRjb25zdCBsb2NrT2JqZWN0ID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cdFx0Y29uc3QgdGFyZ2V0TGlzdEJpbmRpbmcgPSBsaXN0QmluZGluZztcblxuXHRcdHJlcXVlc3RTaWRlRWZmZWN0cyA9IHJlcXVlc3RTaWRlRWZmZWN0cyAhPT0gZmFsc2U7XG5cblx0XHRCdXN5TG9ja2VyLmxvY2sobG9ja09iamVjdCk7XG5cblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5zeW5jVGFzaygpO1xuXHRcdFx0aWYgKGJlZm9yZUNyZWF0ZUNhbGxCYWNrKSB7XG5cdFx0XHRcdGF3YWl0IGJlZm9yZUNyZWF0ZUNhbGxCYWNrKHsgY29udGV4dFBhdGg6IHRhcmdldExpc3RCaW5kaW5nLmdldFBhdGgoKSB9KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gdGFyZ2V0TGlzdEJpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGxldCBtZXRhUGF0aDogc3RyaW5nO1xuXG5cdFx0XHRpZiAodGFyZ2V0TGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpKSB7XG5cdFx0XHRcdG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGAke3RhcmdldExpc3RCaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCl9LyR7dGFyZ2V0TGlzdEJpbmRpbmcuZ2V0UGF0aCgpfWApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWV0YVBhdGggPSBtZXRhTW9kZWwuZ2V0TWV0YVBhdGgodGFyZ2V0TGlzdEJpbmRpbmcuZ2V0UGF0aCgpKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5oYW5kbGVDcmVhdGVFdmVudHModGFyZ2V0TGlzdEJpbmRpbmcpO1xuXG5cdFx0XHQvLyBJdGVyYXRlIG9uIGFsbCBpdGVtcyBhbmQgc3RvcmUgdGhlIGNvcnJlc3BvbmRpbmcgY3JlYXRpb24gcHJvbWlzZVxuXHRcdFx0Y29uc3QgY3JlYXRpb25Qcm9taXNlcyA9IGRhdGFGb3JDcmVhdGUubWFwKChwcm9wZXJ0eVZhbHVlcykgPT4ge1xuXHRcdFx0XHRjb25zdCBjcmVhdGVQYXJhbWV0ZXJzOiBhbnkgPSB7IGRhdGE6IHt9IH07XG5cblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkID0gZmFsc2U7IC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuYnVzeU1vZGUgPSBcIk5vbmVcIjtcblx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVycy5jcmVhdGlvbk1vZGUgPSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3c7XG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kID0gY3JlYXRlQXRFbmQ7XG5cdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMuaW5hY3RpdmUgPSBjcmVhdGVBc0luYWN0aXZlO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBkZWVwIGNyZWF0ZVxuXHRcdFx0XHRmb3IgKGNvbnN0IHByb3BlcnR5UGF0aCBpbiBwcm9wZXJ0eVZhbHVlcykge1xuXHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5ID0gbWV0YU1vZGVsLmdldE9iamVjdChgJHttZXRhUGF0aH0vJHtwcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0cHJvcGVydHkgJiZcblx0XHRcdFx0XHRcdHByb3BlcnR5LiRraW5kICE9PSBcIk5hdmlnYXRpb25Qcm9wZXJ0eVwiICYmXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVBhdGguaW5kZXhPZihcIi9cIikgPCAwICYmXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eVBhdGhdXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzLmRhdGFbcHJvcGVydHlQYXRoXSA9IHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRcdHRhcmdldExpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdGNyZWF0ZVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKSxcblx0XHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdFx0aXNGcm9tQ29weVBhc3RlXG5cdFx0XHRcdCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgY3JlYXRlZENvbnRleHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoY3JlYXRpb25Qcm9taXNlcyk7XG5cdFx0XHRpZiAoIWNyZWF0ZUFzSW5hY3RpdmUpIHtcblx0XHRcdFx0dGhpcy5zZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUodGFyZ2V0TGlzdEJpbmRpbmcpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gdHJhbnNpZW50IGNvbnRleHRzIGFyZSByZWxpYWJseSByZW1vdmVkIG9uY2Ugb05ld0NvbnRleHQuY3JlYXRlZCgpIGlzIHJlc29sdmVkXG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdFx0Y3JlYXRlZENvbnRleHRzLm1hcCgobmV3Q29udGV4dDogYW55KSA9PiB7XG5cdFx0XHRcdFx0aWYgKCFuZXdDb250ZXh0LmJJbmFjdGl2ZSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG5ld0NvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IHZpZXdCaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRcdC8vIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgY29udGV4dHMsIHdlIG11c3QgYXZvaWQgcmVxdWVzdGluZyBzaWRlIGVmZmVjdHNcblx0XHRcdC8vIHRoaXMgaXMgYXZvaWQgYSBwb3RlbnRpYWwgbGlzdCByZWZyZXNoLCB0aGVyZSBjb3VsZCBiZSBhIHNpZGUgZWZmZWN0IHRoYXQgcmVmcmVzaGVzIHRoZSBsaXN0IGJpbmRpbmdcblx0XHRcdC8vIGlmIGxpc3QgYmluZGluZyBpcyByZWZyZXNoZWQsIHRyYW5zaWVudCBjb250ZXh0cyBtaWdodCBiZSBsb3N0XG5cdFx0XHRpZiAocmVxdWVzdFNpZGVFZmZlY3RzICYmICFDb21tb25VdGlscy5oYXNUcmFuc2llbnRDb250ZXh0KHRhcmdldExpc3RCaW5kaW5nKSkge1xuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpXG5cdFx0XHRcdFx0LmdldFNpZGVFZmZlY3RzU2VydmljZSgpXG5cdFx0XHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSh0YXJnZXRMaXN0QmluZGluZy5nZXRQYXRoKCksIHZpZXdCaW5kaW5nQ29udGV4dCBhcyBDb250ZXh0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNyZWF0ZWRDb250ZXh0cztcblx0XHR9IGNhdGNoIChlcnI6IGFueSkge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgbXVsdGlwbGUgZG9jdW1lbnRzLlwiKTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sobG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnU2F2ZScgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ1NhdmUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdTYXZlJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZVNhdmVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIHNhdmVkLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIG92ZXJyaWRkZW4gbWV0aG9kLiBJZiByZXNvbHZlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgdHJpZ2dlcmVkLiBJZiByZWplY3RlZCwgdGhlICdTYXZlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I29uQmVmb3JlU2F2ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVTYXZlKF9tUGFyYW1ldGVycz86IHsgY29udGV4dD86IENvbnRleHQgfSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdC8vIHRvIGJlIG92ZXJyaWRkZW5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlICdDcmVhdGUnIGFjdGlvbi4gWW91IGNhbiBleGVjdXRlIGN1c3RvbSBjb2RpbmcgaW4gdGhpcyBmdW5jdGlvbi5cblx0ICogVGhlIGZyYW1ld29yayB3YWl0cyBmb3IgdGhlIHJldHVybmVkIHByb21pc2UgdG8gYmUgcmVzb2x2ZWQgYmVmb3JlIGNvbnRpbnVpbmcgdGhlICdDcmVhdGUnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdDcmVhdGUnIGFjdGlvbiBpcyBzdG9wcGVkLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzLmNvbnRleHRQYXRoIFBhdGggcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgb24gd2hpY2ggQ3JlYXRlIGFjdGlvbiBpcyB0cmlnZ2VyZWRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jcmVhdGVQYXJhbWV0ZXJzIEFycmF5IG9mIHZhbHVlcyB0aGF0IGFyZSBmaWxsZWQgaW4gdGhlIEFjdGlvbiBQYXJhbWV0ZXIgRGlhbG9nXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0NyZWF0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnQ3JlYXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZUNyZWF0ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVDcmVhdGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0UGF0aD86IHN0cmluZzsgY3JlYXRlUGFyYW1ldGVycz86IGFueVtdIH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRWRpdCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0VkaXQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdFZGl0JyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZGlzcGxheSBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZUVkaXRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGVkaXRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRWRpdCcgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGRpc3BsYXkgbW9kZS5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZUVkaXRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQmVmb3JlRWRpdChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGlzY2FyZCcgYWN0aW9uLiBZb3UgY2FuIGV4ZWN1dGUgY3VzdG9tIGNvZGluZyBpbiB0aGlzIGZ1bmN0aW9uLlxuXHQgKiBUaGUgZnJhbWV3b3JrIHdhaXRzIGZvciB0aGUgcmV0dXJuZWQgcHJvbWlzZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgY29udGludWluZyB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi5cblx0ICogSWYgeW91IHJlamVjdCB0aGUgcHJvbWlzZSwgdGhlICdEaXNjYXJkJyBhY3Rpb24gaXMgc3RvcHBlZCBhbmQgdGhlIHVzZXIgc3RheXMgaW4gZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGluZGl2aWR1YWxseSBvdmVycmlkZGVuIGJ5IGNvbnN1bWluZyBjb250cm9sbGVycywgYnV0IG5vdCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG5cdCAqIFRoZSBvdmVycmlkZSBleGVjdXRpb24gaXM6IHtAbGluayBzYXAudWkuY29yZS5tdmMuT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXJ9LlxuXHQgKlxuXHQgKiBAcGFyYW0gX21QYXJhbWV0ZXJzIE9iamVjdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBvbkJlZm9yZURpc2NhcmRcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0IFBhZ2UgY29udGV4dCB0aGF0IGlzIGdvaW5nIHRvIGJlIGRpc2NhcmRlZC5cblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBvdmVycmlkZGVuIG1ldGhvZC4gSWYgcmVzb2x2ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRGlzY2FyZCcgYWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgYW5kIHRoZSB1c2VyIHN0YXlzIGluIGVkaXQgbW9kZS5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZURpc2NhcmRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45OC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uQmVmb3JlRGlzY2FyZChfbVBhcmFtZXRlcnM/OiB7IGNvbnRleHQ/OiBDb250ZXh0IH0pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHQvLyB0byBiZSBvdmVycmlkZGVuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSAnRGVsZXRlJyBhY3Rpb24uIFlvdSBjYW4gZXhlY3V0ZSBjdXN0b20gY29kaW5nIGluIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFRoZSBmcmFtZXdvcmsgd2FpdHMgZm9yIHRoZSByZXR1cm5lZCBwcm9taXNlIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nIHRoZSAnRGVsZXRlJyBhY3Rpb24uXG5cdCAqIElmIHlvdSByZWplY3QgdGhlIHByb21pc2UsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgc3RvcHBlZC5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBtZWFudCB0byBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbiBieSBjb25zdW1pbmcgY29udHJvbGxlcnMsIGJ1dCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LlxuXHQgKiBUaGUgb3ZlcnJpZGUgZXhlY3V0aW9uIGlzOiB7QGxpbmsgc2FwLnVpLmNvcmUubXZjLk92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyfS5cblx0ICpcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycyBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgdG8gb25CZWZvcmVEZWxldGVcblx0ICogQHBhcmFtIF9tUGFyYW1ldGVycy5jb250ZXh0cyBBbiBhcnJheSBvZiBjb250ZXh0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBkZWxldGVkXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0byBiZSByZXR1cm5lZCBieSB0aGUgb3ZlcnJpZGRlbiBtZXRob2QuIElmIHJlc29sdmVkLCB0aGUgJ0RlbGV0ZScgYWN0aW9uIGlzIHRyaWdnZXJlZC4gSWYgcmVqZWN0ZWQsIHRoZSAnRGVsZXRlJyBhY3Rpb24gaXMgbm90IHRyaWdnZXJlZC5cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkJlZm9yZURlbGV0ZVxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjk4LjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25CZWZvcmVEZWxldGUoX21QYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Ly8gdG8gYmUgb3ZlcnJpZGRlblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IG1QYXJhbWV0ZXJzLmJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIEluZGljYXRlcyB3aGV0aGVyIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgaWdub3JlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIFNhdmUgZHVyaW5nIGFuIElubGluZSBjcmVhdGlvblxuXHQvLyBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMuYmluZGluZ3MgTGlzdCBiaW5kaW5ncyBvZiB0aGUgdGFibGVzIGluIHRoZSB2aWV3LlxuXHQvLyBCb3RoIG9mIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGFyZSBmb3IgdGhlIHNhbWUgcHVycG9zZS4gVXNlciBjYW4gZW50ZXIgc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgY3JlYXRpb24gcm93KHMpIGJ1dCBkb2VzIG5vdCAnQWRkIHJvdycsIGluc3RlYWQgY2xpY2tzIFNhdmUuXG5cdC8vIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIGluIHRoZSB2aWV3LlxuXG5cdC8qKlxuXHQgKiBTYXZlcyBhIG5ldyBkb2N1bWVudCBhZnRlciBjaGVja2luZyBpdC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvQ29udGV4dCAgQ29udGV4dCBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzIFBSSVZBVEVcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBvbmNlIHNhdmUgaXMgY29tcGxldGVcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I3NhdmVEb2N1bWVudFxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBzYXZlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1QYXJhbWV0ZXJzOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRtUGFyYW1ldGVycyA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdGNvbnN0IGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yID0gbVBhcmFtZXRlcnMuYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgfHwgdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGJEcmFmdE5hdmlnYXRpb24gPSB0cnVlO1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IGFCaW5kaW5ncyA9IG1QYXJhbWV0ZXJzLmJpbmRpbmdzO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdC8vIGluIGNhc2Ugb2Ygc2F2aW5nIC8gYWN0aXZhdGluZyB0aGUgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBzaGFsbCBiZSByZW1vdmVkIGJlZm9yZSB0aGUgUEFUQ0gvUE9TVFxuXHRcdFx0Ly8gaXMgc2VudCB0byB0aGUgYmFja2VuZFxuXHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cdFx0XHRhd2FpdCB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVTYXZlKHsgY29udGV4dDogb0NvbnRleHQgfSk7XG5cblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnk7XG5cdFx0XHRsZXQgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblx0XHRcdGlmIChcblx0XHRcdFx0KHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSB8fCBvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0FjdGl2ZUVudGl0eVwiKSkgJiZcblx0XHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gdHJ5IHRvIGdldCByaWdodG1vc3QgY29udGV4dCBpbiBjYXNlIG9mIGEgbmV3IG9iamVjdFxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBhY3RpdmVEb2N1bWVudENvbnRleHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5zYXZlRG9jdW1lbnQoXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCksXG5cdFx0XHRcdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yLFxuXHRcdFx0XHRhQmluZGluZ3MsXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSxcblx0XHRcdFx0dGhpcy5nZXRDcmVhdGlvbk1vZGUoKVxuXHRcdFx0KTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuQWN0aXZhdGUsIGFjdGl2ZURvY3VtZW50Q29udGV4dCk7XG5cdFx0XHRBY3Rpdml0eVN5bmMuZGlzY29ubmVjdCh0aGlzLmdldFZpZXcoKSk7XG5cblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KFN0YW5kYXJkQWN0aW9ucy5zYXZlLCBUcmlnZ2VyVHlwZS5zdGFuZGFyZEFjdGlvbik7XG5cblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXG5cdFx0XHRpZiAoYWN0aXZlRG9jdW1lbnRDb250ZXh0ICE9PSBvQ29udGV4dCkge1xuXHRcdFx0XHRsZXQgY29udGV4dFRvTmF2aWdhdGUgPSBhY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdGlmIChvUm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0c2libGluZ0luZm8gPSBzaWJsaW5nSW5mbyA/PyB0aGlzLl9jcmVhdGVTaWJsaW5nSW5mbyhvQ29udGV4dCwgYWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVQYXRoc0luSGlzdG9yeShzaWJsaW5nSW5mby5wYXRoTWFwcGluZyk7XG5cdFx0XHRcdFx0aWYgKHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQuZ2V0UGF0aCgpICE9PSBhY3RpdmVEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChjb250ZXh0VG9OYXZpZ2F0ZSwgZmFsc2UsIGZhbHNlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0aWYgKCEob0Vycm9yICYmIG9FcnJvci5jYW5jZWxlZCkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2F2aW5nIHRoZSBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0fVxuXHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTd2l0Y2hlcyB0aGUgVUkgYmV0d2VlbiBkcmFmdCBhbmQgYWN0aXZlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdG8gc3dpdGNoIGZyb21cblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlZCBvbmNlIHRoZSBzd2l0Y2ggaXMgZG9uZVxuXHQgKi9cblx0YXN5bmMgdG9nZ2xlRHJhZnRBY3RpdmUob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRsZXQgYkVkaXRhYmxlOiBib29sZWFuO1xuXHRcdGNvbnN0IGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KSA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDtcblxuXHRcdC8vdG9nZ2xlIGJldHdlZW4gZHJhZnQgYW5kIGFjdGl2ZSBkb2N1bWVudCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgZWRpdCBkcmFmdHMgYW5kIGFjdGl2ZSBkb2N1bWVudHMgd2l0aCBkcmFmdClcblx0XHRpZiAoXG5cdFx0XHQhYklzRHJhZnQgfHxcblx0XHRcdCEoXG5cdFx0XHRcdCghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHx8XG5cdFx0XHRcdChvQ29udGV4dERhdGEuSXNBY3RpdmVFbnRpdHkgJiYgb0NvbnRleHREYXRhLkhhc0RyYWZ0RW50aXR5KVxuXHRcdFx0KVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICghb0NvbnRleHREYXRhLklzQWN0aXZlRW50aXR5ICYmIG9Db250ZXh0RGF0YS5IYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdC8vc3RhcnQgUG9pbnQ6IGVkaXQgZHJhZnRcblx0XHRcdGJFZGl0YWJsZSA9IGZhbHNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBzdGFydCBwb2ludCBhY3RpdmUgZG9jdW1lbnRcblx0XHRcdGJFZGl0YWJsZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSB0aGlzLl9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnk7XG5cdFx0XHRjb25zdCBvUmlnaHRtb3N0Q29udGV4dCA9IG9Sb290Vmlld0NvbnRyb2xsZXIuaXNGY2xFbmFibGVkKCkgPyBvUm9vdFZpZXdDb250cm9sbGVyLmdldFJpZ2h0bW9zdENvbnRleHQoKSA6IG9Db250ZXh0O1xuXHRcdFx0bGV0IHNpYmxpbmdJbmZvID0gYXdhaXQgdGhpcy5fY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihvQ29udGV4dCwgb1JpZ2h0bW9zdENvbnRleHQsIFByb2dyYW1taW5nTW9kZWwuRHJhZnQsIGZhbHNlKTtcblx0XHRcdGlmICghc2libGluZ0luZm8gJiYgb0NvbnRleHQgIT09IG9SaWdodG1vc3RDb250ZXh0KSB7XG5cdFx0XHRcdC8vIFRyeSB0byBjb21wdXRlIHNpYmxpbmcgaW5mbyBmb3IgdGhlIHJvb3QgY29udGV4dCBpZiBpdCBmYWlscyBmb3IgdGhlIHJpZ2h0bW9zdCBjb250ZXh0XG5cdFx0XHRcdC8vIC0tPiBJbiBjYXNlIG9mIEZDTCwgaWYgd2UgdHJ5IHRvIHN3aXRjaCBiZXR3ZWVuIGRyYWZ0IGFuZCBhY3RpdmUgYnV0IGEgY2hpbGQgZW50aXR5IGhhcyBubyBzaWJsaW5nLCB0aGUgc3dpdGNoIHdpbGwgY2xvc2UgdGhlIGNoaWxkIGNvbHVtblxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ob0NvbnRleHQsIG9Db250ZXh0LCBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0LCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoc2libGluZ0luZm8pIHtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShiRWRpdGFibGUgPyBFZGl0TW9kZS5FZGl0YWJsZSA6IEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTsgLy9zd2l0Y2ggdG8gZWRpdCBtb2RlIG9ubHkgaWYgYSBkcmFmdCBpcyBhdmFpbGFibGVcblxuXHRcdFx0XHRpZiAob1Jvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRcdFx0XHRpZiAobGFzdFNlbWFudGljTWFwcGluZz8udGVjaG5pY2FsUGF0aCA9PT0gb0NvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB0YXJnZXRQYXRoID0gc2libGluZ0luZm8ucGF0aE1hcHBpbmdbc2libGluZ0luZm8ucGF0aE1hcHBpbmcubGVuZ3RoIC0gMV0ubmV3UGF0aDtcblx0XHRcdFx0XHRcdHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nLnB1c2goeyBvbGRQYXRoOiBsYXN0U2VtYW50aWNNYXBwaW5nLnNlbWFudGljUGF0aCwgbmV3UGF0aDogdGFyZ2V0UGF0aCB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXdhaXQgdGhpcy5faGFuZGxlTmV3Q29udGV4dChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LCBiRWRpdGFibGUsIHRydWUsIHRydWUsIHRydWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgaW4gRWRpdEZsb3cudG9nZ2xlRHJhZnRBY3RpdmUgLSBDYW5ub3QgZmluZCBzaWJsaW5nXCIpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBFcnJvciBpbiBFZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZToke29FcnJvcn1gKTtcblx0XHR9XG5cdH1cblxuXHQvLyBJbnRlcm5hbCBvbmx5IHBhcmFtcyAtLS1cblx0Ly8gQHBhcmFtIHtzYXAubS5CdXR0b259IG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiAtIEN1cnJlbnRseSB0aGlzIGlzIHBhc3NlZCBhcyBjYW5jZWxCdXR0b24gaW50ZXJuYWxseSAocmVwbGFjZWQgYnkgbVBhcmFtZXRlcnMuY29udHJvbCBpbiB0aGUgSlNEb2MgYmVsb3cpLiBDdXJyZW50bHkgaXQgaXMgYWxzbyBtYW5kYXRvcnkuXG5cdC8vIFBsYW4gLSBUaGlzIHNob3VsZCBub3QgYmUgbWFuZGF0b3J5LiBJZiBub3QgcHJvdmlkZWQsIHdlIHNob3VsZCBoYXZlIGEgZGVmYXVsdCB0aGF0IGNhbiBhY3QgYXMgcmVmZXJlbmNlIGNvbnRyb2wgZm9yIHRoZSBkaXNjYXJkIHBvcG92ZXIgT1Igd2UgY2FuIHNob3cgYSBkaWFsb2cgaW5zdGVhZCBvZiBhIHBvcG92ZXIuXG5cblx0LyoqXG5cdCAqIERpc2NhcmQgdGhlIGVkaXRhYmxlIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBlZGl0YWJsZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMuY29udHJvbCBUaGlzIGlzIHRoZSBjb250cm9sIHVzZWQgdG8gb3BlbiB0aGUgZGlzY2FyZCBwb3BvdmVyXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGFuZCBhbGxvd3MgY3VzdG9tIGhhbmRsaW5nXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSBlZGl0YWJsZSBkb2N1bWVudCBoYXMgYmVlbiBkaXNjYXJkZWRcblx0ICogQGFsaWFzIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93I2NhbmNlbERvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGNhbmNlbERvY3VtZW50KG9Db250ZXh0OiBDb250ZXh0LCBtUGFyYW1ldGVyczogeyBjb250cm9sPzogb2JqZWN0OyBza2lwRGlzY2FyZFBvcG92ZXI/OiBib29sZWFuIH0pOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGNvbnN0IG1JblBhcmFtZXRlcnM6IGFueSA9IG1QYXJhbWV0ZXJzO1xuXHRcdGxldCBzaWJsaW5nSW5mbzogU2libGluZ0luZm9ybWF0aW9uIHwgdW5kZWZpbmVkO1xuXHRcdGxldCBpc05ld0RvY3VtZW50ID0gZmFsc2U7XG5cdFx0bUluUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gPSBtUGFyYW1ldGVycy5jb250cm9sIHx8IG1JblBhcmFtZXRlcnMuY2FuY2VsQnV0dG9uO1xuXHRcdG1JblBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2sgPSB0aGlzLmJhc2UuZWRpdEZsb3cub25CZWZvcmVEaXNjYXJkO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRcdGlmICgoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5IHx8IG9Db250ZXh0LmdldFByb3BlcnR5KFwiSGFzQWN0aXZlRW50aXR5XCIpKSAmJiB0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXG5cdFx0XHRcdC8vIE5vIG5lZWQgdG8gdHJ5IHRvIGdldCByaWdodG1vc3QgY29udGV4dCBpbiBjYXNlIG9mIGEgbmV3IG9iamVjdFxuXHRcdFx0XHRzaWJsaW5nSW5mbyA9IGF3YWl0IHRoaXMuX2NvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24oXG5cdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0b1Jvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RDb250ZXh0KCksXG5cdFx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwsXG5cdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjYW5jZWxSZXN1bHQgPSBhd2FpdCB0cmFuc2FjdGlvbkhlbHBlci5jYW5jZWxEb2N1bWVudChcblx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdG1JblBhcmFtZXRlcnMsXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuX2dldFJlc291cmNlTW9kZWwoKSxcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLFxuXHRcdFx0XHR0aGlzLmdldENyZWF0aW9uTW9kZSgpLFxuXHRcdFx0XHR0aGlzLmlzRG9jdW1lbnRNb2RpZmllZCgpXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5fZ2V0Um9vdFZpZXdDb250cm9sbGVyKClcblx0XHRcdFx0LmdldEluc3RhbmNlZFZpZXdzKClcblx0XHRcdFx0LmZvckVhY2goKHZpZXcpID0+IHtcblx0XHRcdFx0XHRjb25zdCBjb250ZXh0ID0gdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIE9EYXRhVjRDb250ZXh0O1xuXHRcdFx0XHRcdGlmIChjb250ZXh0ICYmIGNvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRLZWVwQWxpdmUoZmFsc2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRjb25zdCBiRHJhZnROYXZpZ2F0aW9uID0gdHJ1ZTtcblx0XHRcdHRoaXMuX3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMoc1Byb2dyYW1taW5nTW9kZWwpO1xuXG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZChmYWxzZSk7XG5cdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdC8vIHdlIGZvcmNlIHRoZSBlZGl0IHN0YXRlIGV2ZW4gZm9yIEZDTCBiZWNhdXNlIHRoZSBkcmFmdCBkaXNjYXJkIG1pZ2h0IG5vdCBiZSBpbXBsZW1lbnRlZFxuXHRcdFx0Ly8gYW5kIHdlIG1heSBqdXN0IGRlbGV0ZSB0aGUgZHJhZnRcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdFx0aWYgKCFjYW5jZWxSZXN1bHQpIHtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIHVuZGVmaW5lZCk7XG5cdFx0XHRcdEFjdGl2aXR5U3luYy5kaXNjb25uZWN0KHRoaXMuZ2V0VmlldygpKTtcblx0XHRcdFx0Ly9pbiBjYXNlIG9mIGEgbmV3IGRvY3VtZW50LCBubyBhY3RpdmVDb250ZXh0IGlzIHJldHVybmVkIC0tPiBuYXZpZ2F0ZSBiYWNrLlxuXHRcdFx0XHRpZiAoIW1JblBhcmFtZXRlcnMuc2tpcEJhY2tOYXZpZ2F0aW9uKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5nZXRJbnRlcm5hbFJvdXRpbmcoKS5uYXZpZ2F0ZUJhY2tGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdFx0aXNOZXdEb2N1bWVudCA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9BY3RpdmVEb2N1bWVudENvbnRleHQgPSBjYW5jZWxSZXN1bHQgYXMgQ29udGV4dDtcblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkRpc2NhcmQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRBY3Rpdml0eVN5bmMuZGlzY29ubmVjdCh0aGlzLmdldFZpZXcoKSk7XG5cdFx0XHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZSA9IG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdGlmICh0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdHNpYmxpbmdJbmZvID0gc2libGluZ0luZm8gPz8gdGhpcy5fY3JlYXRlU2libGluZ0luZm8ob0NvbnRleHQsIG9BY3RpdmVEb2N1bWVudENvbnRleHQpO1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVBhdGhzSW5IaXN0b3J5KHNpYmxpbmdJbmZvLnBhdGhNYXBwaW5nKTtcblx0XHRcdFx0XHRpZiAoc2libGluZ0luZm8udGFyZ2V0Q29udGV4dC5nZXRQYXRoKCkgIT09IG9BY3RpdmVEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0Ly8gV2UgbmVlZCB0byBsb2FkIHRoZSBzZW1hbnRpYyBrZXlzIG9mIHRoZSBhY3RpdmUgY29udGV4dCwgYXMgd2UgbmVlZCB0aGVtXG5cdFx0XHRcdFx0Ly8gZm9yIHRoZSBuYXZpZ2F0aW9uXG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5fZmV0Y2hTZW1hbnRpY0tleVZhbHVlcyhvQWN0aXZlRG9jdW1lbnRDb250ZXh0KTtcblx0XHRcdFx0XHQvLyBXZSBmb3JjZSB0aGUgcmVjcmVhdGlvbiBvZiB0aGUgY29udGV4dCwgc28gdGhhdCBpdCdzIGNyZWF0ZWQgYW5kIGJvdW5kIGluIHRoZSBzYW1lIG1pY3JvdGFzayxcblx0XHRcdFx0XHQvLyBzbyB0aGF0IGFsbCBwcm9wZXJ0aWVzIGFyZSBsb2FkZWQgdG9nZXRoZXIgYnkgYXV0b0V4cGFuZFNlbGVjdCwgc28gdGhhdCB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIEVkaXQgbW9kZVxuXHRcdFx0XHRcdC8vICQkaW5oZXJpdEV4cGFuZFNlbGVjdCB0YWtlcyBhbGwgbG9hZGVkIHByb3BlcnRpZXMgaW50byBhY2NvdW50IChCQ1AgMjA3MDQ2MjI2NSlcblx0XHRcdFx0XHRpZiAoIW1JblBhcmFtZXRlcnMuc2tpcEJpbmRpbmdUb1ZpZXcpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZU5ld0NvbnRleHQoY29udGV4dFRvTmF2aWdhdGUsIGZhbHNlLCB0cnVlLCBiRHJhZnROYXZpZ2F0aW9uLCB0cnVlKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vYWN0aXZlIGNvbnRleHQgaXMgcmV0dXJuZWQgaW4gY2FzZSBvZiBjYW5jZWwgb2YgZXhpc3RpbmcgZG9jdW1lbnRcblx0XHRcdFx0XHRhd2FpdCB0aGlzLl9oYW5kbGVOZXdDb250ZXh0KGNvbnRleHRUb05hdmlnYXRlLCBmYWxzZSwgZmFsc2UsIGJEcmFmdE5hdmlnYXRpb24sIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0Ly9zaG93IERyYWZ0IGRpc2NhcmRlZCBtZXNzYWdlIHRvYXN0IG9ubHkgZm9yIGRyYWZ0IGVuYWJsZWQgYXBwc1xuXHRcdFx0XHR0aGlzLnNob3dEb2N1bWVudERpc2NhcmRNZXNzYWdlKGlzTmV3RG9jdW1lbnQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGlzY2FyZGluZyB0aGUgZG9jdW1lbnRcIiwgb0Vycm9yIGFzIGFueSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEJyaW5ncyB1cCBhIG1lc3NhZ2UgdG9hc3Qgd2hlbiBhIGRyYWZ0IGlzIGRpc2NhcmRlZC5cblx0ICpcblx0ICogQHBhcmFtIGlzTmV3RG9jdW1lbnQgVGhpcyBpcyBhIEJvb2xlYW4gZmxhZyB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgZG9jdW1lbnQgaXMgbmV3IG9yIGFscmVhZHkgZXhpc3RzLlxuXHQgKi9cblx0c2hvd0RvY3VtZW50RGlzY2FyZE1lc3NhZ2UoaXNOZXdEb2N1bWVudD86IGJvb2xlYW4pIHtcblx0XHRjb25zdCByZXNvdXJjZU1vZGVsID0gdGhpcy5fZ2V0UmVzb3VyY2VNb2RlbCgpO1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSByZXNvdXJjZU1vZGVsLmdldFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ESVNDQVJEX0RSQUZUX1RPQVNUXCIpO1xuXHRcdGlmIChpc05ld0RvY3VtZW50ID09IHRydWUpIHtcblx0XHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5hdHRhY2hBZnRlclJvdXRlTWF0Y2hlZCh0aGlzLnNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCwgdGhpcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBXZSB1c2UgdGhpcyBmdW5jdGlvbiBpbiBzaG93RG9jdW1lbnREaXNjYXJkTWVzc2FnZSB3aGVuIG5vIGNvbnRleHQgaXMgcGFzc2VkLlxuXHQgKi9cblx0c2hvd01lc3NhZ2VXaGVuTm9Db250ZXh0KCkge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSB0aGlzLl9nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0Y29uc3QgbWVzc2FnZSA9IHJlc291cmNlTW9kZWwuZ2V0VGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RJU0NBUkRfRFJBRlRfVE9BU1RcIik7XG5cdFx0Y29uc3QgYXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRNZXNzYWdlVG9hc3Quc2hvdyhtZXNzYWdlKTtcblx0XHRhcHBDb21wb25lbnQuZ2V0Um91dGluZ1NlcnZpY2UoKS5kZXRhY2hBZnRlclJvdXRlTWF0Y2hlZCh0aGlzLnNob3dNZXNzYWdlV2hlbk5vQ29udGV4dCwgdGhpcyk7XG5cdH1cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBhIGNvbnRleHQgY29ycmVzcG9uZHMgdG8gYSBkcmFmdCByb290LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCB0byBjaGVja1xuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjb250ZXh0IHBvaW50cyB0byBhIGRyYWZ0IHJvb3Rcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHByb3RlY3RlZCBpc0RyYWZ0Um9vdChjb250ZXh0OiBDb250ZXh0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gbWV0YU1vZGVsLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRyZXR1cm4gTW9kZWxIZWxwZXIuaXNEcmFmdFJvb3QoZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS50YXJnZXRFbnRpdHlTZXQpO1xuXHR9XG5cblx0Ly8gSW50ZXJuYWwgb25seSBwYXJhbXMgLS0tXG5cdC8vIEBwYXJhbSB7c3RyaW5nfSBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lIE5hbWUgb2YgdGhlIEVudGl0eVNldCB0byB3aGljaCB0aGUgb2JqZWN0IGJlbG9uZ3NcblxuXHQvKipcblx0ICogRGVsZXRlcyB0aGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgIENvbnRleHQgb2YgdGhlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgZG9jdW1lbnQgaGFzIGJlZW4gZGVsZXRlZFxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjZGVsZXRlRG9jdW1lbnRcblx0ICogQHB1YmxpY1xuXHQgKiBAc2luY2UgMS45MC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0YXN5bmMgZGVsZXRlRG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQsIG1JblBhcmFtZXRlcnM6IHsgdGl0bGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzO1xuXHRcdGlmICghbVBhcmFtZXRlcnMpIHtcblx0XHRcdG1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRiRmluZEFjdGl2ZUNvbnRleHRzOiBmYWxzZVxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bVBhcmFtZXRlcnMuYkZpbmRBY3RpdmVDb250ZXh0cyA9IGZhbHNlO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IHRoaXMuYmFzZS5lZGl0Rmxvdy5vbkJlZm9yZURlbGV0ZTtcblx0XHR0cnkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLl9pc0ZjbEVuYWJsZWQoKSAmJlxuXHRcdFx0XHR0aGlzLmlzRHJhZnRSb290KG9Db250ZXh0KSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRJbmRleCgpID09PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0b0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRvQ29udGV4dC5nZXRQcm9wZXJ0eShcIkhhc0RyYWZ0RW50aXR5XCIpID09PSB0cnVlXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gRGVsZXRpbmcgYW4gYWN0aXZlIGVudGl0eSB3aGljaCBoYXMgYSBkcmFmdCB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGJlIGRpc3BsYXllZCBpbiB0aGUgTGlzdFJlcG9ydCAoRkNMIGNhc2UpXG5cdFx0XHRcdC8vIC0tPiBuZWVkIHRvIHJlbW92ZSB0aGUgZHJhZnQgZnJvbSB0aGUgTFIgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgYWN0aXZlIHZlcnNpb24sIHNvIHRoYXQgdGhlIExpc3RCaW5kaW5nIGlzIHByb3Blcmx5IHJlZnJlc2hlZFxuXHRcdFx0XHQvLyBUaGUgY29uZGl0aW9uICdvQ29udGV4dC5nZXRJbmRleCgpID09PSB1bmRlZmluZWQnIG1ha2VzIHN1cmUgdGhlIGFjdGl2ZSB2ZXJzaW9uIGlzbid0IGFscmVhZHkgZGlzcGxheWVkIGluIHRoZSBMUlxuXHRcdFx0XHRtUGFyYW1ldGVycy5iZWZvcmVEZWxldGVDYWxsQmFjayA9IGFzeW5jIChwYXJhbWV0ZXJzPzogeyBjb250ZXh0cz86IENvbnRleHRbXSB9KSA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5iYXNlLmVkaXRGbG93Lm9uQmVmb3JlRGVsZXRlKHBhcmFtZXRlcnMpO1xuXG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IG1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHRcdGNvbnN0IHNpYmxpbmdDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9TaWJsaW5nRW50aXR5YCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdFx0XHRjb25zdCBkcmFmdFBhdGggPSBhd2FpdCBzaWJsaW5nQ29udGV4dC5yZXF1ZXN0Q2Fub25pY2FsUGF0aCgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRDb250ZXh0VG9SZW1vdmUgPSBtb2RlbC5nZXRLZWVwQWxpdmVDb250ZXh0KGRyYWZ0UGF0aCk7XG5cdFx0XHRcdFx0XHRkcmFmdENvbnRleHRUb1JlbW92ZS5yZXBsYWNlV2l0aChvQ29udGV4dCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcGxhY2luZyB0aGUgZHJhZnQgaW5zdGFuY2UgaW4gdGhlIExSIE9ETEJcIiwgZXJyb3IgYXMgYW55KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXG5cdFx0XHQvLyBTaW5nbGUgb2JqZXQgZGVsZXRpb24gaXMgdHJpZ2dlcmVkIGZyb20gYW4gT1AgaGVhZGVyIGJ1dHRvbiAobm90IGZyb20gYSBsaXN0KVxuXHRcdFx0Ly8gLS0+IE1hcmsgVUkgZGlydHkgYW5kIG5hdmlnYXRlIGJhY2sgdG8gZGlzbWlzcyB0aGUgT1Bcblx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9zZW5kQWN0aXZpdHkoQWN0aXZpdHkuRGVsZXRlLCBvQ29udGV4dCk7XG5cblx0XHRcdC8vIEFmdGVyIGRlbGV0ZSBpcyBzdWNjZXNzZnVsbCwgd2UgbmVlZCB0byBkZXRhY2ggdGhlIHNldEJhY2tOYXZpZ2F0aW9uIE1ldGhvZHNcblx0XHRcdGlmIChvQXBwQ29tcG9uZW50KSB7XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvQXBwQ29tcG9uZW50Py5nZXRTdGFydHVwTW9kZSgpID09PSBTdGFydHVwTW9kZS5EZWVwbGluayAmJiAhdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0Ly8gSW4gY2FzZSB0aGUgYXBwIGhhcyBiZWVuIGxhdW5jaGVkIHdpdGggc2VtYW50aWMga2V5cywgZGVsZXRpbmcgdGhlIG9iamVjdCB3ZSd2ZSBsYW5kZWQgb24gc2hhbGwgbmF2aWdhdGUgYmFja1xuXHRcdFx0XHQvLyB0byB0aGUgYXBwIHdlIGNhbWUgZnJvbSAoZXhjZXB0IGZvciBGQ0wsIHdoZXJlIHdlIG5hdmlnYXRlIHRvIExSIGFzIHVzdWFsKVxuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZXhpdEZyb21BcHAoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBkZWxldGluZyB0aGUgZG9jdW1lbnRcIiwgZXJyb3IgYXMgYW55KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU3VibWl0IHRoZSBjdXJyZW50IHNldCBvZiBjaGFuZ2VzIGFuZCBuYXZpZ2F0ZSBiYWNrLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIG9Db250ZXh0ICBDb250ZXh0IG9mIHRoZSBkb2N1bWVudFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIG9uY2UgdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNhcHBseURvY3VtZW50XG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGFzeW5jIGFwcGx5RG9jdW1lbnQob0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGlmIChvQ29udGV4dC5nZXRNb2RlbCgpLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikpIHtcblx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0YXdhaXQgdGhpcy5fc3VibWl0T3BlbkNoYW5nZXMob0NvbnRleHQpO1xuXHRcdFx0fVxuXHRcdFx0YXdhaXQgdGhpcy5fY2hlY2tGb3JWYWxpZGF0aW9uRXJyb3JzKCk7XG5cdFx0XHRhd2FpdCB0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRpZiAoQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEludGVybmFsIG9ubHkgcGFyYW1zIC0tLVxuXHQvLyBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iU3RhdGljQWN0aW9uXSBCb29sZWFuIHZhbHVlIGZvciBzdGF0aWMgYWN0aW9uLCB1bmRlZmluZWQgZm9yIG90aGVyIGFjdGlvbnNcblx0Ly8gQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuaXNOYXZpZ2FibGVdIEJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIG5hdmlnYXRpb24gaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZFxuXHQvLyBDdXJyZW50bHkgdGhlIHBhcmFtZXRlciBpc05hdmlnYWJsZSBpcyB1c2VkIGludGVybmFsbHkgYW5kIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHJlcXVpcmVzTmF2aWdhdGlvbiBhcyBpdCBpcyBhIG1vcmUgYXB0IG5hbWUgZm9yIHRoaXMgcGFyYW1cblxuXHQvKipcblx0ICogSW52b2tlcyBhbiBhY3Rpb24gKGJvdW5kIG9yIHVuYm91bmQpIGFuZCB0cmFja3MgdGhlIGNoYW5nZXMgc28gdGhhdCBvdGhlciBwYWdlcyBjYW4gYmUgcmVmcmVzaGVkIGFuZCBzaG93IHRoZSB1cGRhdGVkIGRhdGEgdXBvbiBuYXZpZ2F0aW9uLlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHBhcmFtIHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzIEEgbWFwIG9mIGFjdGlvbiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHByb3ZpZGVkIHZhbHVlc1xuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMubmFtZSBOYW1lIG9mIHRoZSBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMucGFyYW1ldGVyVmFsdWVzLnZhbHVlIFZhbHVlIG9mIHRoZSBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZyBTa2lwcyB0aGUgYWN0aW9uIHBhcmFtZXRlciBkaWFsb2cgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIG9mIHRoZW0gaW4gcGFyYW1ldGVyVmFsdWVzXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNvbnRleHRzIEZvciBhIGJvdW5kIGFjdGlvbiwgYSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkIG11c3QgYmUgcHJvdmlkZWRcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMubW9kZWwgRm9yIGFuIHVuYm91bmQgYWN0aW9uLCBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbCBtdXN0IGJlIHByb3ZpZGVkXG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciBuYXZpZ2F0aW9uIGlzIHJlcXVpcmVkIGFmdGVyIHRoZSBhY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQuIE5hdmlnYXRpb24gdGFrZXMgcGxhY2UgdG8gdGhlIGNvbnRleHQgcmV0dXJuZWQgYnkgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5sYWJlbCBBIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGUgYWN0aW9uLiBUaGlzIGlzIG5lZWRlZCBpbiBjYXNlIHRoZSBhY3Rpb24gaGFzIGEgcGFyYW1ldGVyIGFuZCBhIHBhcmFtZXRlciBkaWFsb2cgaXMgc2hvd24gdG8gdGhlIHVzZXIuIFRoZSBsYWJlbCB3aWxsIGJlIHVzZWQgZm9yIHRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIGFuZCBmb3IgdGhlIGNvbmZpcm1hdGlvbiBidXR0b25cblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nIE1vZGUgaG93IGFjdGlvbnMgYXJlIHRvIGJlIGNhbGxlZDogJ0NoYW5nZVNldCcgdG8gcHV0IGFsbCBhY3Rpb24gY2FsbHMgaW50byBvbmUgY2hhbmdlc2V0LCAnSXNvbGF0ZWQnIHRvIHB1dCB0aGVtIGludG8gc2VwYXJhdGUgY2hhbmdlc2V0c1xuXHQgKiBAcGFyYW0gbUV4dHJhUGFyYW1zIFBSSVZBVEVcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIG9uY2UgdGhlIGFjdGlvbiBoYXMgYmVlbiBleGVjdXRlZCwgcHJvdmlkaW5nIHRoZSByZXNwb25zZVxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjaW52b2tlQWN0aW9uXG5cdCAqIEBwdWJsaWNcblx0ICogQHNpbmNlIDEuOTAuMFxuXHQgKiBAZmluYWxcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRhc3luYyBpbnZva2VBY3Rpb24oXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRtSW5QYXJhbWV0ZXJzPzoge1xuXHRcdFx0cGFyYW1ldGVyVmFsdWVzPzogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBhbnkgfTtcblx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c/OiBib29sZWFuO1xuXHRcdFx0Y29udGV4dHM/OiBDb250ZXh0IHwgQ29udGV4dFtdO1xuXHRcdFx0bW9kZWw/OiBPRGF0YU1vZGVsO1xuXHRcdFx0cmVxdWlyZXNOYXZpZ2F0aW9uPzogYm9vbGVhbjtcblx0XHRcdGxhYmVsPzogc3RyaW5nO1xuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nPzogc3RyaW5nO1xuXHRcdH0sXG5cdFx0bUV4dHJhUGFyYW1zPzogYW55XG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBvQ29udHJvbDogYW55O1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uSGVscGVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkhlbHBlcigpO1xuXHRcdGxldCBhUGFydHM7XG5cdFx0bGV0IHNPdmVybG9hZEVudGl0eVR5cGU7XG5cdFx0bGV0IG9DdXJyZW50QWN0aW9uQ2FsbEJhY2tzOiBhbnk7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmJhc2UuZ2V0VmlldygpO1xuXG5cdFx0bGV0IG1QYXJhbWV0ZXJzOiBhbnkgPSBtSW5QYXJhbWV0ZXJzIHx8IHt9O1xuXHRcdC8vIER1ZSB0byBhIG1pc3Rha2UgdGhlIGludm9rZUFjdGlvbiBpbiB0aGUgZXh0ZW5zaW9uQVBJIGhhZCBhIGRpZmZlcmVudCBBUEkgdGhhbiB0aGlzIG9uZS5cblx0XHQvLyBUaGUgb25lIGZyb20gdGhlIGV4dGVuc2lvbkFQSSBkb2Vzbid0IGV4aXN0IGFueW1vcmUgYXMgd2UgZXhwb3NlIHRoZSBmdWxsIGVkaXQgZmxvdyBub3cgYnV0XG5cdFx0Ly8gZHVlIHRvIGNvbXBhdGliaWxpdHkgcmVhc29ucyB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlIG9sZCBzaWduYXR1cmVcblx0XHRpZiAoXG5cdFx0XHQobVBhcmFtZXRlcnMuaXNBICYmIG1QYXJhbWV0ZXJzLmlzQShcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCIpKSB8fFxuXHRcdFx0QXJyYXkuaXNBcnJheShtUGFyYW1ldGVycykgfHxcblx0XHRcdG1FeHRyYVBhcmFtcyAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBjb250ZXh0cyA9IG1QYXJhbWV0ZXJzO1xuXHRcdFx0bVBhcmFtZXRlcnMgPSBtRXh0cmFQYXJhbXMgfHwge307XG5cdFx0XHRpZiAoY29udGV4dHMpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSBjb250ZXh0cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLm1vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRtUGFyYW1ldGVycy5pc05hdmlnYWJsZSA9IG1QYXJhbWV0ZXJzLnJlcXVpcmVzTmF2aWdhdGlvbiB8fCBtUGFyYW1ldGVycy5pc05hdmlnYWJsZTtcblxuXHRcdC8vIERldGVybWluZSBpZiB0aGUgcmVmZXJlbmNlZCBhY3Rpb24gaXMgYm91bmQgb3IgdW5ib3VuZFxuXHRcdGNvbnN0IGNvbnZlcnRlZE1ldGFkYXRhID0gY29udmVydFR5cGVzKHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCk/LmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKTtcblx0XHQvLyBUaGUgRW50aXR5Q29udGFpbmVyIG1heSBOT1QgYmUgbWlzc2luZywgc28gaXQgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGJlIHVuZGVmaW5lZCwgYnV0IHNpbmNlIGluIG91ciBjb252ZXJ0ZWQgTWV0YWRhdGFcblx0XHQvLyBpdCBjYW4gYmUgdW5kZWZpbmVkLCBJIG5lZWQgdGhpcyB3b3JrYXJvdW5kIGhlcmUgb2YgYWRkaW5nIFwiXCIgc2luY2UgaW5kZXhPZiBkb2VzIG5vdCBhY2NlcHQgc29tZXRoaW5nIHRoYXQnc1xuXHRcdC8vIHVuZGVmaW5lZC5cblx0XHRpZiAoc0FjdGlvbk5hbWUuaW5kZXhPZihcIlwiICsgY29udmVydGVkTWV0YWRhdGEuZW50aXR5Q29udGFpbmVyLm5hbWUpID4gLTEpIHtcblx0XHRcdC8vIFVuYm91bmQgYWN0aW9ucyBhcmUgYWx3YXlzIHJlZmVyZW5jZWQgdmlhIHRoZSBhY3Rpb24gaW1wb3J0IGFuZCB3ZSBmb3VuZCB0aGUgRW50aXR5Q29udGFpbmVyIGluIHRoZSBzQWN0aW9uTmFtZSBzb1xuXHRcdFx0Ly8gYW4gdW5ib3VuZCBhY3Rpb24gaXMgcmVmZXJlbmNlZCFcblx0XHRcdG1QYXJhbWV0ZXJzLmlzQm91bmQgPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gZW50aXR5IGNvbnRhaW5lciBpbiB0aGUgc0FjdGlvbk5hbWUsIHNvIGVpdGhlciBhIGJvdW5kIG9yIHN0YXRpYyBhY3Rpb24gaXMgcmVmZXJlbmNlZCB3aGljaCBpcyBhbHNvIGJvdW5kIVxuXHRcdFx0bVBhcmFtZXRlcnMuaXNCb3VuZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCFtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sKSB7XG5cdFx0XHRtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0b0NvbnRyb2wgPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCk7XG5cdFx0XHRpZiAob0NvbnRyb2wpIHtcblx0XHRcdFx0Ly8gVE9ETzogY3VycmVudGx5IHRoaXMgc2VsZWN0ZWQgY29udGV4dHMgdXBkYXRlIGlzIGRvbmUgd2l0aGluIHRoZSBvcGVyYXRpb24sIHNob3VsZCBiZSBtb3ZlZCBvdXRcblx0XHRcdFx0bVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBvQ29udHJvbC5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHNBY3Rpb25OYW1lICYmIHNBY3Rpb25OYW1lLmluZGV4T2YoXCIoXCIpID4gLTEpIHtcblx0XHRcdC8vIGdldCBlbnRpdHkgdHlwZSBvZiBhY3Rpb24gb3ZlcmxvYWQgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBhY3Rpb24gcGF0aFxuXHRcdFx0Ly8gRXhhbXBsZSBzQWN0aW9uTmFtZSA9IFwiPEFjdGlvbk5hbWU+KENvbGxlY3Rpb24oPE92ZXJsb2FkRW50aXR5VHlwZT4pKVwiXG5cdFx0XHQvLyBzQWN0aW9uTmFtZSA9IGFQYXJ0c1swXSAtLT4gPEFjdGlvbk5hbWU+XG5cdFx0XHQvLyBzT3ZlcmxvYWRFbnRpdHlUeXBlID0gYVBhcnRzWzJdIC0tPiA8T3ZlcmxvYWRFbnRpdHlUeXBlPlxuXHRcdFx0YVBhcnRzID0gc0FjdGlvbk5hbWUuc3BsaXQoXCIoXCIpO1xuXHRcdFx0c0FjdGlvbk5hbWUgPSBhUGFydHNbMF07XG5cdFx0XHRzT3ZlcmxvYWRFbnRpdHlUeXBlID0gKGFQYXJ0c1thUGFydHMubGVuZ3RoIC0gMV0gYXMgYW55KS5yZXBsYWNlQWxsKFwiKVwiLCBcIlwiKTtcblx0XHR9XG5cblx0XHRpZiAobVBhcmFtZXRlcnMuYlN0YXRpY0FjdGlvbikge1xuXHRcdFx0aWYgKG9Db250cm9sLmlzVGFibGVCb3VuZCgpKSB7XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNvbnRleHRzID0gb0NvbnRyb2wuZ2V0Um93QmluZGluZygpLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IHNCaW5kaW5nUGF0aCA9IG9Db250cm9sLmRhdGEoXCJyb3dzQmluZGluZ0luZm9cIikucGF0aCxcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcgPSBuZXcgKE9EYXRhTGlzdEJpbmRpbmcgYXMgYW55KSh0aGlzLmdldFZpZXcoKS5nZXRNb2RlbCgpLCBzQmluZGluZ1BhdGgpO1xuXHRcdFx0XHRtUGFyYW1ldGVycy5jb250ZXh0cyA9IG9MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzT3ZlcmxvYWRFbnRpdHlUeXBlICYmIG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KCkpIHtcblx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHMgPSB0aGlzLl9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoKFxuXHRcdFx0XHRcdG9Db250cm9sLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRcdFx0b0NvbnRyb2wuZ2V0Um93QmluZGluZygpLFxuXHRcdFx0XHRcdHNPdmVybG9hZEVudGl0eVR5cGVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmVuYWJsZUF1dG9TY3JvbGwpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MgPSB0aGlzLmNyZWF0ZUFjdGlvblByb21pc2Uoc0FjdGlvbk5hbWUsIG9Db250cm9sLnNJZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdG1QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHQgPSB0aGlzLl9nZXRCb3VuZENvbnRleHQob1ZpZXcsIG1QYXJhbWV0ZXJzKTtcblx0XHQvLyBOZWVkIHRvIGtub3cgdGhhdCB0aGUgYWN0aW9uIGlzIGNhbGxlZCBmcm9tIE9iamVjdFBhZ2UgZm9yIGNoYW5nZVNldCBJc29sYXRlZCB3b3JrYXJvdW5kXG5cdFx0bVBhcmFtZXRlcnMuYk9iamVjdFBhZ2UgPSAob1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmNvbnZlcnRlclR5cGUgPT09IFwiT2JqZWN0UGFnZVwiO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IG9SZXNwb25zZSA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNhbGxBY3Rpb24oXG5cdFx0XHRcdHNBY3Rpb25OYW1lLFxuXHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0dGhpcy5nZXRWaWV3KCksXG5cdFx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKVxuXHRcdFx0KTtcblx0XHRcdGxldCBsaXN0UmVmcmVzaGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzICYmIG1QYXJhbWV0ZXJzLmlzQm91bmQgPT09IHRydWUpIHtcblx0XHRcdFx0bGlzdFJlZnJlc2hlZCA9IGF3YWl0IHRoaXMuX3JlZnJlc2hMaXN0SWZSZXF1aXJlZChcblx0XHRcdFx0XHR0aGlzLmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoc0FjdGlvbk5hbWUsIG9SZXNwb25zZSksXG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY29udGV4dHNbMF1cblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGlmIChBY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpKSB7XG5cdFx0XHRcdGxldCBhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHRpZiAob1Jlc3BvbnNlKSB7XG5cdFx0XHRcdFx0YWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcyA9IEFycmF5LmlzQXJyYXkob1Jlc3BvbnNlKVxuXHRcdFx0XHRcdFx0PyBPYmplY3Qua2V5cyhvUmVzcG9uc2VbMF0udmFsdWUuZ2V0T2JqZWN0KCkpXG5cdFx0XHRcdFx0XHQ6IE9iamVjdC5rZXlzKG9SZXNwb25zZS5nZXRPYmplY3QoKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkFjdGlvbiwgbVBhcmFtZXRlcnMuY29udGV4dHMsIHNBY3Rpb25OYW1lLCBsaXN0UmVmcmVzaGVkLCBhY3Rpb25SZXF1ZXN0ZWRQcm9wZXJ0aWVzKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuX3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lLCBUcmlnZ2VyVHlwZS5hY3Rpb24pO1xuXG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlc29sdmVyKG9SZXNwb25zZSk7XG5cdFx0XHR9XG5cdFx0XHQvKlxuXHRcdFx0XHRcdFdlIHNldCB0aGUgKHVwcGVyKSBwYWdlcyB0byBkaXJ0eSBhZnRlciBhbiBleGVjdXRpb24gb2YgYW4gYWN0aW9uXG5cdFx0XHRcdFx0VE9ETzogZ2V0IHJpZCBvZiB0aGlzIHdvcmthcm91bmRcblx0XHRcdFx0XHRUaGlzIHdvcmthcm91bmQgaXMgb25seSBuZWVkZWQgYXMgbG9uZyBhcyB0aGUgbW9kZWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3luY2hyb25pemF0aW9uLlxuXHRcdFx0XHRcdE9uY2UgdGhpcyBpcyBzdXBwb3J0ZWQgd2UgZG9uJ3QgbmVlZCB0byBzZXQgdGhlIHBhZ2VzIHRvIGRpcnR5IGFueW1vcmUgYXMgdGhlIGNvbnRleHQgaXRzZWxmXG5cdFx0XHRcdFx0aXMgYWxyZWFkeSByZWZyZXNoZWQgKGl0J3MganVzdCBub3QgcmVmbGVjdGVkIGluIHRoZSBvYmplY3QgcGFnZSlcblx0XHRcdFx0XHR3ZSBleHBsaWNpdGx5IGRvbid0IGNhbGwgdGhpcyBtZXRob2QgZnJvbSB0aGUgbGlzdCByZXBvcnQgYnV0IG9ubHkgY2FsbCBpdCBmcm9tIHRoZSBvYmplY3QgcGFnZVxuXHRcdFx0XHRcdGFzIGlmIGl0IGlzIGNhbGxlZCBpbiB0aGUgbGlzdCByZXBvcnQgaXQncyBub3QgbmVlZGVkIC0gYXMgd2UgYW55d2F5IHdpbGwgcmVtb3ZlIHRoaXMgbG9naWNcblx0XHRcdFx0XHR3ZSBjYW4gbGl2ZSB3aXRoIHRoaXNcblx0XHRcdFx0XHR3ZSBuZWVkIGEgY29udGV4dCB0byBzZXQgdGhlIHVwcGVyIHBhZ2VzIHRvIGRpcnR5IC0gaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgd2UgdXNlIHRoZVxuXHRcdFx0XHRcdGZpcnN0IG9uZSBhcyB0aGV5IGFyZSBhbnl3YXkgc2libGluZ3Ncblx0XHRcdFx0XHQqL1xuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRleHRzKSB7XG5cdFx0XHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCBzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuaXNOYXZpZ2FibGUpIHtcblx0XHRcdFx0bGV0IHZDb250ZXh0ID0gb1Jlc3BvbnNlO1xuXHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2Q29udGV4dCkgJiYgdkNvbnRleHQubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0dkNvbnRleHQgPSB2Q29udGV4dFswXS52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodkNvbnRleHQgJiYgIUFycmF5LmlzQXJyYXkodkNvbnRleHQpKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9WaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRcdFx0Y29uc3Qgc0NvbnRleHRNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgodkNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRjb25zdCBfZm5WYWxpZENvbnRleHRzID0gKGNvbnRleHRzOiBhbnksIGFwcGxpY2FibGVDb250ZXh0czogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY29udGV4dHMuZmlsdGVyKChlbGVtZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKGFwcGxpY2FibGVDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBhcHBsaWNhYmxlQ29udGV4dHMuaW5kZXhPZihlbGVtZW50KSA+IC0xO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRjb25zdCBvQWN0aW9uQ29udGV4dCA9IEFycmF5LmlzQXJyYXkobVBhcmFtZXRlcnMuY29udGV4dHMpXG5cdFx0XHRcdFx0XHQ/IF9mblZhbGlkQ29udGV4dHMobVBhcmFtZXRlcnMuY29udGV4dHMsIG1QYXJhbWV0ZXJzLmFwcGxpY2FibGVDb250ZXh0cylbMF1cblx0XHRcdFx0XHRcdDogbVBhcmFtZXRlcnMuY29udGV4dHM7XG5cdFx0XHRcdFx0Y29uc3Qgc0FjdGlvbkNvbnRleHRNZXRhUGF0aCA9IG9BY3Rpb25Db250ZXh0ICYmIG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0FjdGlvbkNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdFx0XHRpZiAoc0NvbnRleHRNZXRhUGF0aCAhPSB1bmRlZmluZWQgJiYgc0NvbnRleHRNZXRhUGF0aCA9PT0gc0FjdGlvbkNvbnRleHRNZXRhUGF0aCkge1xuXHRcdFx0XHRcdFx0aWYgKG9BY3Rpb25Db250ZXh0LmdldFBhdGgoKSAhPT0gdkNvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVGb3J3YXJkVG9Db250ZXh0KHZDb250ZXh0LCB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hlY2tOb0hhc2hDaGFuZ2U6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0bm9IaXN0b3J5RW50cnk6IGZhbHNlXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0TG9nLmluZm8oXCJOYXZpZ2F0aW9uIHRvIHRoZSBzYW1lIGNvbnRleHQgaXMgbm90IGFsbG93ZWRcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmJhc2UuZWRpdEZsb3cub25BZnRlckFjdGlvbkV4ZWN1dGlvbihzQWN0aW9uTmFtZSk7XG5cdFx0XHRyZXR1cm4gb1Jlc3BvbnNlO1xuXHRcdH0gY2F0Y2ggKGVycjogYW55KSB7XG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25DYWxsQmFja3MpIHtcblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25DYWxsQmFja3MuZlJlamVjdG9yKCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBGSVhNRTogaW4gbW9zdCBzaXR1YXRpb25zIHRoZXJlIGlzIG5vIGhhbmRsZXIgZm9yIHRoZSByZWplY3RlZCBwcm9taXNlcyByZXR1cm5lZHFcblx0XHRcdGlmIChlcnIgPT09IENvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cpIHtcblx0XHRcdFx0Ly8gVGhpcyBsZWFkcyB0byBjb25zb2xlIGVycm9yLiBBY3R1YWxseSB0aGUgZXJyb3IgaXMgYWxyZWFkeSBoYW5kbGVkIChjdXJyZW50bHkgZGlyZWN0bHkgaW4gcHJlc3MgaGFuZGxlciBvZiBlbmQgYnV0dG9uIGluIGRpYWxvZyksIHNvIGl0IHNob3VsZCBub3QgYmUgZm9yd2FyZGVkXG5cdFx0XHRcdC8vIHVwIHRvIGhlcmUuIEhvd2V2ZXIsIHdoZW4gZGlhbG9nIGhhbmRsaW5nIGFuZCBiYWNrZW5kIGV4ZWN1dGlvbiBhcmUgc2VwYXJhdGVkLCBpbmZvcm1hdGlvbiB3aGV0aGVyIGRpYWxvZyB3YXMgY2FuY2VsbGVkLCBvciBiYWNrZW5kIGV4ZWN1dGlvbiBoYXMgZmFpbGVkIG5lZWRzXG5cdFx0XHRcdC8vIHRvIGJlIHRyYW5zcG9ydGVkIHRvIHRoZSBwbGFjZSByZXNwb25zaWJsZSBmb3IgY29ubmVjdGluZyB0aGVzZSB0d28gdGhpbmdzLlxuXHRcdFx0XHQvLyBUT0RPOiByZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvbmUgZGlhbG9nIGhhbmRsaW5nIGFuZCBiYWNrZW5kIGV4ZWN1dGlvbiBhcmUgc2VwYXJhdGVkXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkRpYWxvZyBjYW5jZWxsZWRcIik7XG5cdFx0XHR9IGVsc2UgaWYgKCEoZXJyICYmIChlcnIuY2FuY2VsZWQgfHwgKGVyci5yZWplY3RlZEl0ZW1zICYmIGVyci5yZWplY3RlZEl0ZW1zWzBdLmNhbmNlbGVkKSkpKSB7XG5cdFx0XHRcdC8vIFRPRE86IGFuYWx5emUsIHdoZXRoZXIgdGhpcyBpcyBvZiB0aGUgc2FtZSBjYXRlZ29yeSBhcyBhYm92ZVxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIEVkaXRGbG93Lmludm9rZUFjdGlvbjoke2Vycn1gKTtcblx0XHRcdH1cblx0XHRcdC8vIFRPRE86IEFueSB1bmV4cGVjdGVkIGVycm9ycyBwcm9iYWJseSBzaG91bGQgbm90IGJlIGlnbm9yZWQhXG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhvb2sgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gYWZ0ZXIgdGhlIGFjdGlvbiBleGVjdXRpb24uXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gX2FjdGlvbk5hbWUgTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBhbGlhcyBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0RmxvdyNvbkFmdGVyQWN0aW9uRXhlY3V0aW9uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBzaW5jZSAxLjExNC4wXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdGFzeW5jIG9uQWZ0ZXJBY3Rpb25FeGVjdXRpb24oX2FjdGlvbk5hbWU6IHN0cmluZykge1xuXHRcdC8vdG8gYmUgb3ZlcnJpZGRlblxuXHR9XG5cblx0LyoqXG5cdCAqIFNlY3VyZWQgZXhlY3V0aW9uIG9mIHRoZSBnaXZlbiBmdW5jdGlvbi4gRW5zdXJlcyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIHdoZW4gY2VydGFpbiBjb25kaXRpb25zIGFyZSBmdWxmaWxsZWQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gZm5GdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuIFNob3VsZCByZXR1cm4gYSBwcm9taXNlIHRoYXQgaXMgc2V0dGxlZCBhZnRlciBjb21wbGV0aW9uIG9mIHRoZSBleGVjdXRpb24uIElmIG5vdGhpbmcgaXMgcmV0dXJuZWQsIGltbWVkaWF0ZSBjb21wbGV0aW9uIGlzIGFzc3VtZWQuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBEZWZpbml0aW9ucyBvZiB0aGUgcHJlY29uZGl0aW9ucyB0byBiZSBjaGVja2VkIGJlZm9yZSBleGVjdXRpb25cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kgRGVmaW5lcyB0aGUgYnVzeSBpbmRpY2F0b3Jcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLmJ1c3kuc2V0IFRyaWdnZXJzIGEgYnVzeSBpbmRpY2F0b3Igd2hlbiB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQuXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5idXN5LmNoZWNrIEV4ZWN1dGVzIGZ1bmN0aW9uIG9ubHkgaWYgYXBwbGljYXRpb24gaXNuJ3QgYnVzeS5cblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLnVwZGF0ZXNEb2N1bWVudCBUaGlzIG9wZXJhdGlvbiB1cGRhdGVzIHRoZSBjdXJyZW50IGRvY3VtZW50IHdpdGhvdXQgdXNpbmcgdGhlIGJvdW5kIG1vZGVsIGFuZCBjb250ZXh0LiBBcyBhIHJlc3VsdCwgdGhlIGRyYWZ0IHN0YXR1cyBpcyB1cGRhdGVkIGlmIGEgZHJhZnQgZG9jdW1lbnQgZXhpc3RzLCBhbmQgdGhlIHVzZXIgaGFzIHRvIGNvbmZpcm0gdGhlIGNhbmNlbGxhdGlvbiBvZiB0aGUgZWRpdGluZyBwcm9jZXNzLlxuXHQgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCBpcyByZWplY3RlZCBpZiB0aGUgZXhlY3V0aW9uIGlzIHByb2hpYml0ZWQgYW5kIHJlc29sdmVkIGJ5IHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IHRoZSBmbkZ1bmN0aW9uLlxuXHQgKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3cjc2VjdXJlZEV4ZWN1dGlvblxuXHQgKiBAcHVibGljXG5cdCAqIEBzaW5jZSAxLjkwLjBcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRzZWN1cmVkRXhlY3V0aW9uKFxuXHRcdGZuRnVuY3Rpb246IEZ1bmN0aW9uLFxuXHRcdG1QYXJhbWV0ZXJzPzoge1xuXHRcdFx0YnVzeT86IHtcblx0XHRcdFx0c2V0PzogYm9vbGVhbjtcblx0XHRcdFx0Y2hlY2s/OiBib29sZWFuO1xuXHRcdFx0fTtcblx0XHRcdHVwZGF0ZXNEb2N1bWVudD86IGJvb2xlYW47XG5cdFx0fVxuXHQpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBiQnVzeVNldCA9IG1QYXJhbWV0ZXJzPy5idXN5Py5zZXQgPz8gdHJ1ZSxcblx0XHRcdGJCdXN5Q2hlY2sgPSBtUGFyYW1ldGVycz8uYnVzeT8uY2hlY2sgPz8gdHJ1ZSxcblx0XHRcdGJVcGRhdGVzRG9jdW1lbnQgPSBtUGFyYW1ldGVycz8udXBkYXRlc0RvY3VtZW50ID8/IGZhbHNlLFxuXHRcdFx0b0xvY2tPYmplY3QgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKSxcblx0XHRcdG9Db250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdGJJc0RyYWZ0ID0gb0NvbnRleHQgJiYgdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0IGFzIENvbnRleHQpID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXG5cdFx0aWYgKGJCdXN5Q2hlY2sgJiYgQnVzeUxvY2tlci5pc0xvY2tlZChvTG9ja09iamVjdCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChcIkFwcGxpY2F0aW9uIGFscmVhZHkgYnVzeSB0aGVyZWZvcmUgZXhlY3V0aW9uIHJlamVjdGVkXCIpO1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgdG8gc2V0IGJ1c3kgYW5kIGRyYWZ0IGluZGljYXRvciBpbW1lZGlhdGVseSBhbHNvIHRoZSBmdW5jdGlvbiBtaWdodCBiZSBleGVjdXRlZCBsYXRlciBpbiBxdWV1ZVxuXHRcdGlmIChiQnVzeVNldCkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKG9Mb2NrT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQgJiYgYklzRHJhZnQpIHtcblx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2aW5nKTtcblx0XHR9XG5cblx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCkucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzayhmbkZ1bmN0aW9uIGFzICgpID0+IGFueSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0aWYgKGJVcGRhdGVzRG9jdW1lbnQpIHtcblx0XHRcdFx0XHR0aGlzLnNldERvY3VtZW50TW9kaWZpZWQodHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLl9pc0ZjbEVuYWJsZWQoKSkge1xuXHRcdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChiSXNEcmFmdCkge1xuXHRcdFx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZlZCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoYlVwZGF0ZXNEb2N1bWVudCAmJiBiSXNEcmFmdCkge1xuXHRcdFx0XHRcdHRoaXMuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuQ2xlYXIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChvRXJyb3IpO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0aWYgKGJCdXN5U2V0KSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci51bmxvY2sob0xvY2tPYmplY3QpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgcGF0Y2hTZW50IGV2ZW50OiByZWdpc3RlciBkb2N1bWVudCBtb2RpZmljYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBvRXZlbnQgVGhlIGV2ZW50IHNlbnQgYnkgdGhlIGJpbmRpbmdcblx0ICovXG5cdGhhbmRsZVBhdGNoU2VudChvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Ly8gSW4gY29sbGFib3JhdGl2ZSBkcmFmdCwgZGlzYWJsZSBFVGFnIGNoZWNrIGZvciBQQVRDSCByZXF1ZXN0c1xuXHRcdGNvbnN0IGlzSW5Db2xsYWJvcmF0aXZlRHJhZnQgPSBBY3Rpdml0eVN5bmMuaXNDb25uZWN0ZWQodGhpcy5nZXRWaWV3KCkpO1xuXHRcdGlmIChpc0luQ29sbGFib3JhdGl2ZURyYWZ0KSB7XG5cdFx0XHQoKG9FdmVudC5nZXRTb3VyY2UoKSBhcyBCaW5kaW5nKS5nZXRNb2RlbCgpIGFzIGFueSkuc2V0SWdub3JlRVRhZyh0cnVlKTtcblx0XHR9XG5cdFx0aWYgKCEodGhpcy5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpPy5nZXRQcm9wZXJ0eShcInNraXBQYXRjaEhhbmRsZXJzXCIpKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VCaW5kaW5nID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0XHQvLyBDcmVhdGUgYSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIHRoZSBwYXRoIGlzIGNvbXBsZXRlZFxuXHRcdFx0Y29uc3Qgb1BhdGNoUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0b0V2ZW50LmdldFNvdXJjZSgpLmF0dGFjaEV2ZW50T25jZShcInBhdGNoQ29tcGxldGVkXCIsIChwYXRjaENvbXBsZXRlZEV2ZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHQvLyBSZS1lbmFibGUgRVRhZyBjaGVja3Ncblx0XHRcdFx0XHRpZiAoaXNJbkNvbGxhYm9yYXRpdmVEcmFmdCkge1xuXHRcdFx0XHRcdFx0KChvRXZlbnQuZ2V0U291cmNlKCkgYXMgQmluZGluZykuZ2V0TW9kZWwoKSBhcyBhbnkpLnNldElnbm9yZUVUYWcoZmFsc2UpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChvRXZlbnQuZ2V0U291cmNlKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdFx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudEFmdGVyUGF0Y2goXG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0XHRcdFx0XHRzb3VyY2VCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHR0aGlzLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgYlN1Y2Nlc3MgPSBwYXRjaENvbXBsZXRlZEV2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRcdFx0aWYgKGJTdWNjZXNzKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMudXBkYXRlRG9jdW1lbnQoc291cmNlQmluZGluZywgb1BhdGNoUHJvbWlzZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIENyZWF0ZUFjdGl2YXRlIGV2ZW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gb0V2ZW50IFRoZSBldmVudCBzZW50IGJ5IHRoZSBiaW5kaW5nXG5cdCAqL1xuXHRhc3luYyBoYW5kbGVDcmVhdGVBY3RpdmF0ZShvRXZlbnQ6IEV2ZW50KSB7XG5cdFx0Y29uc3Qgb0JpbmRpbmcgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cdFx0Y29uc3QgYkF0RW5kID0gdHJ1ZTtcblx0XHRjb25zdCBiSW5hY3RpdmUgPSB0cnVlO1xuXHRcdGNvbnN0IG9QYXJhbXM6IGFueSA9IHtcblx0XHRcdGNyZWF0aW9uTW9kZTogQ3JlYXRpb25Nb2RlLklubGluZSxcblx0XHRcdGNyZWF0ZUF0RW5kOiBiQXRFbmQsXG5cdFx0XHRpbmFjdGl2ZTogYkluYWN0aXZlLFxuXHRcdFx0a2VlcFRyYW5zaWVudENvbnRleHRPbkZhaWxlZDogZmFsc2UsIC8vIGN1cnJlbnRseSBub3QgZnVsbHkgc3VwcG9ydGVkXG5cdFx0XHRidXN5TW9kZTogXCJOb25lXCJcblx0XHR9O1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBTZW5kIG5vdGlmaWNhdGlvbiB0byBvdGhlciB1c2VycyBvbmx5IGFmdGVyIHRoZSBjcmVhdGlvbiBoYXMgYmVlbiBmaW5hbGl6ZWRcblx0XHRcdGNvbnN0IGFjdGl2YXRlZENvbnRleHQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKSBhcyBDb250ZXh0O1xuXHRcdFx0YWN0aXZhdGVkQ29udGV4dFxuXHRcdFx0XHQuY3JlYXRlZCgpXG5cdFx0XHRcdD8udGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fc2VuZEFjdGl2aXR5KEFjdGl2aXR5LkNyZWF0ZSwgYWN0aXZhdGVkQ29udGV4dCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdFx0TG9nLndhcm5pbmcoYEZhaWxlZCB0byBhY3RpdmF0ZSBjb250ZXh0ICR7YWN0aXZhdGVkQ29udGV4dC5nZXRQYXRoKCl9YCk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHQvLyBDcmVhdGUgYSBuZXcgaW5hY3RpdmUgY29udGV4dCAoZW1wdHkgcm93IGluIHRoZSB0YWJsZSlcblx0XHRcdGNvbnN0IG5ld0luYWN0aXZlQ29udGV4dCA9IGF3YWl0IHRyYW5zYWN0aW9uSGVscGVyLmNyZWF0ZURvY3VtZW50KFxuXHRcdFx0XHRvQmluZGluZyBhcyBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdFx0XHRvUGFyYW1zLFxuXHRcdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0XHR0aGlzLmdldE1lc3NhZ2VIYW5kbGVyKCksXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpO1xuXHRcdFx0aWYgKG5ld0luYWN0aXZlQ29udGV4dCkge1xuXHRcdFx0XHRpZiAoIXRoaXMuX2lzRmNsRW5hYmxlZCgpKSB7XG5cdFx0XHRcdFx0RWRpdFN0YXRlLnNldEVkaXRTdGF0ZURpcnR5KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0TG9nLmVycm9yKFwiRmFpbGVkIHRvIGFjdGl2YXRlIG5ldyByb3cgLVwiLCBlcnJvciBhcyBhbnkpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBQZXJmb3JtcyBhIHRhc2sgaW4gc3luYyB3aXRoIG90aGVyIHRhc2tzIGNyZWF0ZWQgdmlhIHRoaXMgZnVuY3Rpb24uXG5cdCAqIFJldHVybnMgdGhlIHByb21pc2UgY2hhaW4gb2YgdGhlIHRhc2suXG5cdCAqXG5cdCAqIEBwYXJhbSBbbmV3VGFza10gT3B0aW9uYWwsIGEgcHJvbWlzZSBvciBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBzeW5jaHJvbm91c2x5XG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgdGFzayBpcyBjb21wbGV0ZWRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHN5bmNUYXNrKG5ld1Rhc2s/OiAoKCkgPT4gYW55KSB8IFByb21pc2U8YW55Pikge1xuXHRcdGlmIChuZXdUYXNrKSB7XG5cdFx0XHRpZiAodHlwZW9mIG5ld1Rhc2sgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHR0aGlzLnN5bmNUYXNrcyA9IHRoaXMuc3luY1Rhc2tzLnRoZW4obmV3VGFzaykuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnN5bmNUYXNrcyA9IHRoaXMuc3luY1Rhc2tzXG5cdFx0XHRcdFx0LnRoZW4oKCkgPT4gbmV3VGFzaylcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnN5bmNUYXNrcztcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWNpZGVzIGlmIGEgZG9jdW1lbnQgaXMgdG8gYmUgc2hvd24gaW4gZGlzcGxheSBvciBlZGl0IG1vZGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRvIGJlIGRpc3BsYXllZCBvciBlZGl0ZWRcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgb25jZSB0aGUgZWRpdCBtb2RlIGlzIGNvbXB1dGVkXG5cdCAqL1xuXG5cdGFzeW5jIGNvbXB1dGVFZGl0TW9kZShjb250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChjb250ZXh0KTtcblxuXHRcdGlmIChwcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdFx0Y29uc3QgZ2xvYmFsTW9kZWwgPSB0aGlzLmdldEdsb2JhbFVJTW9kZWwoKTtcblx0XHRcdFx0Z2xvYmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVBlbmRpbmdcIiwgdHJ1ZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdFx0Y29uc3QgaXNBY3RpdmVFbnRpdHkgPSBhd2FpdCBjb250ZXh0LnJlcXVlc3RPYmplY3QoXCJJc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRcdFx0aWYgKGlzQWN0aXZlRW50aXR5ID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdC8vIGluIGNhc2UgdGhlIGRvY3VtZW50IGlzIGRyYWZ0IHNldCBpdCBpbiBlZGl0IG1vZGVcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkVkaXRhYmxlKTtcblx0XHRcdFx0XHRjb25zdCBoYXNBY3RpdmVFbnRpdHkgPSBhd2FpdCBjb250ZXh0LnJlcXVlc3RPYmplY3QoXCJIYXNBY3RpdmVFbnRpdHlcIik7XG5cdFx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZSh1bmRlZmluZWQsICFoYXNBY3RpdmVFbnRpdHkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGFjdGl2ZSBkb2N1bWVudCwgc3RheSBvbiBkaXNwbGF5IG1vZGVcblx0XHRcdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRnbG9iYWxNb2RlbC5zZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlUGVuZGluZ1wiLCBmYWxzZSwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgZGV0ZXJtaW5pbmcgdGhlIGVkaXRNb2RlIGZvciBkcmFmdFwiLCBlcnJvcik7XG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdGNvbnN0IGxhc3RJbnZva2VkQWN0aW9uTmFtZSA9IHRoaXMuZ2V0SW50ZXJuYWxNb2RlbCgpLmdldFByb3BlcnR5KFwiL2xhc3RJbnZva2VkQWN0aW9uXCIpO1xuXHRcdFx0aWYgKGxhc3RJbnZva2VkQWN0aW9uTmFtZSAmJiB0aGlzLmlzTmV3QWN0aW9uRm9yU3RpY2t5KGxhc3RJbnZva2VkQWN0aW9uTmFtZSwgY29udGV4dCkpIHtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TW9kZShFZGl0TW9kZS5FZGl0YWJsZSwgdHJ1ZSk7XG5cdFx0XHRcdGlmICghdGhpcy5nZXRBcHBDb21wb25lbnQoKS5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdFx0XHRFZGl0U3RhdGUuc2V0RWRpdFN0YXRlRGlydHkoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLmhhbmRsZVN0aWNreU9uKGNvbnRleHQpO1xuXHRcdFx0XHR0aGlzLmdldEludGVybmFsTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9sYXN0SW52b2tlZEFjdGlvblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cdC8vIFByaXZhdGUgbWV0aG9kc1xuXHQvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5cdC8qKlxuXHQgKiBJbnRlcm5hbCBtZXRob2QgdG8gZGVsZXRlIGEgY29udGV4dCBvciBhbiBhcnJheSBvZiBjb250ZXh0cy5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHRzIFRoZSBjb250ZXh0KHMpIHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgUGFyYW1ldGVycyBmb3IgZGVsZXRpb25cblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZGVsZXRlRG9jdW1lbnRUcmFuc2FjdGlvbihjb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSwgcGFyYW1ldGVyczogYW55KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IGdldFJlc291cmNlTW9kZWwodGhpcyk7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25IZWxwZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uSGVscGVyKCk7XG5cblx0XHQvLyBUT0RPOiB0aGlzIHNldHRpbmcgYW5kIHJlbW92aW5nIG9mIGNvbnRleHRzIHNob3VsZG4ndCBiZSBpbiB0aGUgdHJhbnNhY3Rpb24gaGVscGVyIGF0IGFsbFxuXHRcdC8vIGZvciB0aGUgdGltZSBiZWluZyBJIGtlcHQgaXQgYW5kIHByb3ZpZGUgdGhlIGludGVybmFsIG1vZGVsIGNvbnRleHQgdG8gbm90IGJyZWFrIHNvbWV0aGluZ1xuXHRcdHBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQgPSBwYXJhbWV0ZXJzLmNvbnRyb2xJZFxuXHRcdFx0PyBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQocGFyYW1ldGVycy5jb250cm9sSWQpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpXG5cdFx0XHQ6IG51bGw7XG5cblx0XHRhd2FpdCB0aGlzLnN5bmNUYXNrKCk7XG5cdFx0YXdhaXQgdHJhbnNhY3Rpb25IZWxwZXIuZGVsZXRlRG9jdW1lbnQoY29udGV4dHMsIHBhcmFtZXRlcnMsIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksIHJlc291cmNlTW9kZWwsIHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKSk7XG5cdH1cblxuXHRfZ2V0UmVzb3VyY2VNb2RlbCgpOiBSZXNvdXJjZU1vZGVsIHtcblx0XHRyZXR1cm4gZ2V0UmVzb3VyY2VNb2RlbCh0aGlzLmdldFZpZXcoKSk7XG5cdH1cblxuXHRwcml2YXRlIGdldFRyYW5zYWN0aW9uSGVscGVyKCkge1xuXHRcdHJldHVybiBUcmFuc2FjdGlvbkhlbHBlcjtcblx0fVxuXG5cdHByaXZhdGUgZ2V0TWVzc2FnZUhhbmRsZXIoKSB7XG5cdFx0aWYgKHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcikge1xuXHRcdFx0cmV0dXJuIHRoaXMuYmFzZS5tZXNzYWdlSGFuZGxlcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRWRpdCBGbG93IHdvcmtzIG9ubHkgd2l0aCBhIGdpdmVuIG1lc3NhZ2UgaGFuZGxlclwiKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldEludGVybmFsTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHRwcml2YXRlIGdldEdsb2JhbFVJTW9kZWwoKTogSlNPTk1vZGVsIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGF0IHRoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgYSBuZXdseSBjcmVhdGVkIG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIGJDcmVhdGlvbk1vZGUgVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG5ld1xuXHQgKi9cblx0cHJpdmF0ZSBzZXRDcmVhdGlvbk1vZGUoYkNyZWF0aW9uTW9kZTogYm9vbGVhbikge1xuXHRcdGNvbnN0IHVpTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJ1aVwiKSBhcyBDb250ZXh0O1xuXHRcdHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLnNldFByb3BlcnR5KFwiY3JlYXRlTW9kZVwiLCBiQ3JlYXRpb25Nb2RlLCB1aU1vZGVsQ29udGV4dCwgdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgcGFnZSBjb250YWlucyBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0IG9yIG5vdC5cblx0ICpcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIG5ld1xuXHQgKi9cblx0cHJpdmF0ZSBnZXRDcmVhdGlvbk1vZGUoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgdWlNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcInVpXCIpIGFzIENvbnRleHQ7XG5cdFx0cmV0dXJuICEhdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCkuZ2V0UHJvcGVydHkoXCJjcmVhdGVNb2RlXCIsIHVpTW9kZWxDb250ZXh0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCAob3Igb25lIG9mIGl0cyBzdWItb2JqZWN0cykgaGFzIGJlZW4gbW9kaWZpZWQgb3Igbm90LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbW9kaWZpZWRcblx0ICovXG5cdHByaXZhdGUgaXNEb2N1bWVudE1vZGlmaWVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiAhIXRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpLmdldFByb3BlcnR5KFwiL2lzRG9jdW1lbnRNb2RpZmllZFwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoYXQgdGhlIG9iamVjdCBiZWluZyBlZGl0ZWQgKG9yIG9uZSBvZiBpdHMgc3ViLW9iamVjdHMpIGhhcyBiZWVuIG1vZGlmaWVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gbW9kaWZpZWQgVHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkXG5cdCAqL1xuXHRwcml2YXRlIHNldERvY3VtZW50TW9kaWZpZWQobW9kaWZpZWQ6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmdldEdsb2JhbFVJTW9kZWwoKS5zZXRQcm9wZXJ0eShcIi9pc0RvY3VtZW50TW9kaWZpZWRcIiwgbW9kaWZpZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhhdCB0aGUgb2JqZWN0IGJlaW5nIGVkaXRlZCBoYXMgYmVlbiBtb2RpZmllZCBieSBjcmVhdGluZyBhIHN1Yi1vYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBsaXN0QmluZGluZyBUaGUgbGlzdCBiaW5kaW5nIG9uIHdoaWNoIHRoZSBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXREb2N1bWVudE1vZGlmaWVkT25DcmVhdGUobGlzdEJpbmRpbmc6IE9EYXRhTGlzdEJpbmRpbmcpIHtcblx0XHQvLyBTZXQgdGhlIG1vZGlmaWVkIGZsYWcgb25seSBvbiByZWxhdGl2ZSBsaXN0QmluZGluZ3MsIGkuZS4gd2hlbiBjcmVhdGluZyBhIHN1Yi1vYmplY3Rcblx0XHQvLyBJZiB0aGUgbGlzdEJpbmRpbmcgaXMgbm90IHJlbGF0aXZlLCB0aGVuIGl0J3MgYSBjcmVhdGlvbiBmcm9tIHRoZSBMaXN0UmVwb3J0LCBhbmQgYnkgZGVmYXVsdCBhIG5ld2x5IGNyZWF0ZWQgcm9vdCBvYmplY3QgaXNuJ3QgY29uc2lkZXJlZCBhcyBtb2RpZmllZFxuXHRcdGlmIChsaXN0QmluZGluZy5pc1JlbGF0aXZlKCkpIHtcblx0XHRcdHRoaXMuc2V0RG9jdW1lbnRNb2RpZmllZCh0cnVlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgY3JlYXRlIGV2ZW50OiBzaG93cyBtZXNzYWdlcyBhbmQgaW4gY2FzZSBvZiBhIGRyYWZ0LCB1cGRhdGVzIHRoZSBkcmFmdCBpbmRpY2F0b3IuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5FZGl0Rmxvd1xuXHQgKiBAcGFyYW0gYmluZGluZyBPRGF0YSBsaXN0IGJpbmRpbmcgb2JqZWN0XG5cdCAqL1xuXHRwcml2YXRlIGhhbmRsZUNyZWF0ZUV2ZW50cyhiaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nKSB7XG5cdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cblx0XHRjb25zdCBwcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGJpbmRpbmcpO1xuXG5cdFx0YmluZGluZy5hdHRhY2hFdmVudChcImNyZWF0ZVNlbnRcIiwgKCkgPT4ge1xuXHRcdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQpIHtcblx0XHRcdFx0dGhpcy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5TYXZpbmcpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGJpbmRpbmcuYXR0YWNoRXZlbnQoXCJjcmVhdGVDb21wbGV0ZWRcIiwgKG9FdmVudDogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBzdWNjZXNzID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInN1Y2Nlc3NcIik7XG5cdFx0XHRpZiAocHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHR0aGlzLnNldERyYWZ0U3RhdHVzKHN1Y2Nlc3MgPyBEcmFmdFN0YXR1cy5TYXZlZCA6IERyYWZ0U3RhdHVzLkNsZWFyKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGRyYWZ0IHN0YXR1cyBtZXNzYWdlIChkaXNwbGF5ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZSkuXG5cdCAqXG5cdCAqIEBwYXJhbSBkcmFmdFN0YXR1cyBUaGUgZHJhZnQgc3RhdHVzIG1lc3NhZ2Vcblx0ICovXG5cdHNldERyYWZ0U3RhdHVzKGRyYWZ0U3RhdHVzOiBzdHJpbmcpIHtcblx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSBhcyBKU09OTW9kZWwpLnNldFByb3BlcnR5KFwiL2RyYWZ0U3RhdHVzXCIsIGRyYWZ0U3RhdHVzLCB1bmRlZmluZWQsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb2dyYW1taW5nIG1vZGVsIGZyb20gYSBiaW5kaW5nIG9yIGEgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHNvdXJjZSBUaGUgYmluZGluZyBvciBjb250ZXh0XG5cdCAqIEByZXR1cm5zIFRoZSBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKi9cblx0cHJpdmF0ZSBnZXRQcm9ncmFtbWluZ01vZGVsKHNvdXJjZTogQ29udGV4dCB8IEJpbmRpbmcpOiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VHJhbnNhY3Rpb25IZWxwZXIoKS5nZXRQcm9ncmFtbWluZ01vZGVsKHNvdXJjZSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgZWRpdCBtb2RlLlxuXHQgKlxuXHQgKiBAcGFyYW0gZWRpdE1vZGUgVGhlIGVkaXQgbW9kZVxuXHQgKiBAcGFyYW0gaXNDcmVhdGlvbiBUcnVlIGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gbmV3bHkgY3JlYXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBzZXRFZGl0TW9kZShlZGl0TW9kZT86IHN0cmluZywgaXNDcmVhdGlvbj86IGJvb2xlYW4pIHtcblx0XHQvLyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgaXQncyBub3QgbWVhbnQgdG8gcmVsZWFzZSB0aGUgZWRpdCBmbG93IGZvciBmcmVlc3R5bGUgdXNhZ2UgdGhlcmVmb3JlIHdlIGNhblxuXHRcdC8vIHJlbHkgb24gdGhlIGdsb2JhbCBVSSBtb2RlbCB0byBleGlzdFxuXHRcdGNvbnN0IGdsb2JhbE1vZGVsID0gdGhpcy5nZXRHbG9iYWxVSU1vZGVsKCk7XG5cblx0XHRpZiAoZWRpdE1vZGUpIHtcblx0XHRcdGdsb2JhbE1vZGVsLnNldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIiwgZWRpdE1vZGUgPT09IFwiRWRpdGFibGVcIiwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHR9XG5cblx0XHRpZiAoaXNDcmVhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBTaW5jZSBzZXRDcmVhdGlvbk1vZGUgaXMgcHVibGljIGluIEVkaXRGbG93IGFuZCBjYW4gYmUgb3ZlcnJpZGVuLCBtYWtlIHN1cmUgdG8gY2FsbCBpdCB2aWEgdGhlIGNvbnRyb2xsZXJcblx0XHRcdC8vIHRvIGVuc3VyZSBhbnkgb3ZlcnJpZGVzIGFyZSB0YWtlbiBpbnRvIGFjY291bnRcblx0XHRcdHRoaXMuc2V0Q3JlYXRpb25Nb2RlKGlzQ3JlYXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgYW4gYWN0aW9uIGNvcnJlc3BvbmRzIHRvIGEgY3JlYXRlIGFjdGlvbiBmb3IgYSBzdGlja3kgc2Vzc2lvbi5cblx0ICpcblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGZvciB0aGUgc3RpY2t5IHNlc3Npb25cblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgYWN0aW9uIGlzIGEgY3JlYXRlIGFjdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBpc05ld0FjdGlvbkZvclN0aWNreShhY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29uc3QgbWV0YUNvbnRleHQgPSBtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQoY29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0Y29uc3QgZW50aXR5U2V0ID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFDb250ZXh0KS5zdGFydGluZ0VudGl0eVNldCBhcyBFbnRpdHlTZXQ7XG5cdFx0XHRjb25zdCBzdGlja3lTZXNzaW9uID0gZW50aXR5U2V0LmFubm90YXRpb25zLlNlc3Npb24/LlN0aWNreVNlc3Npb25TdXBwb3J0ZWQ7XG5cdFx0XHRpZiAoc3RpY2t5U2Vzc2lvbj8uTmV3QWN0aW9uID09PSBhY3Rpb25OYW1lKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHN0aWNreVNlc3Npb24/LkFkZGl0aW9uYWxOZXdBY3Rpb25zICYmIHN0aWNreVNlc3Npb24/LkFkZGl0aW9uYWxOZXdBY3Rpb25zLmluZGV4T2YoYWN0aW9uTmFtZSkgIT09IC0xKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVE9ETyBNb3ZlIGFsbCBzdGlja3ktcmVsYXRlZCBiZWxvdyB0byBhIHN0aWNreSBzZXNzaW9uIG1hbmFnZXIgY2xhc3NcblxuXHQvKipcblx0ICogRW5hYmxlcyB0aGUgc3RpY2t5IGVkaXQgc2Vzc2lvbi5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkXG5cdCAqIEByZXR1cm5zIFRydWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlU3RpY2t5T24oY29udGV4dDogQ29udGV4dCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKGFwcENvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInVuZGVmaW5lZCBBcHBDb21wb25lbnQgZm9yIGZ1bmN0aW9uIGhhbmRsZVN0aWNreU9uXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmhhc05hdmlnYXRpb25HdWFyZCgpKSB7XG5cdFx0XHRcdGNvbnN0IGhhc2hUcmFja2VyID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpO1xuXHRcdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cblx0XHRcdFx0Ly8gU2V0IGEgZ3VhcmQgaW4gdGhlIFJvdXRlclByb3h5XG5cdFx0XHRcdC8vIEEgdGltZW91dCBpcyBuZWNlc3NhcnksIGFzIHdpdGggZGVmZXJyZWQgY3JlYXRpb24gdGhlIGhhc2hDaGFuZ2VyIGlzIG5vdCB1cGRhdGVkIHlldCB3aXRoXG5cdFx0XHRcdC8vIHRoZSBuZXcgaGFzaCwgYW5kIHRoZSBndWFyZCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIG1hbmFnZWQgaGlzdG9yeSBvZiB0aGUgcm91dGVyIHByb3h5XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLnNldE5hdmlnYXRpb25HdWFyZChjb250ZXh0LmdldFBhdGgoKS5zdWJzdHJpbmcoMSkpO1xuXHRcdFx0XHR9LCAwKTtcblxuXHRcdFx0XHQvLyBTZXR0aW5nIGJhY2sgbmF2aWdhdGlvbiBvbiBzaGVsbCBzZXJ2aWNlLCB0byBnZXQgdGhlIGRpY2FyZCBtZXNzYWdlIGJveCBpbiBjYXNlIG9mIHN0aWNreVxuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKHRoaXMub25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbi5iaW5kKHRoaXMpKTtcblxuXHRcdFx0XHR0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uID0gdGhpcy5nZXREaXJ0eVN0YXRlUHJvdmlkZXIoYXBwQ29tcG9uZW50LCBpbnRlcm5hbE1vZGVsLCBoYXNoVHJhY2tlcik7XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKCkucmVnaXN0ZXJEaXJ0eVN0YXRlUHJvdmlkZXIodGhpcy5kaXJ0eVN0YXRlUHJvdmlkZXJGdW5jdGlvbik7XG5cblx0XHRcdFx0Ly8gaGFuZGxlIHNlc3Npb24gdGltZW91dFxuXHRcdFx0XHRjb25zdCBpMThuTW9kZWwgPSB0aGlzLmJhc2UuZ2V0VmlldygpLmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIik7XG5cdFx0XHRcdHRoaXMuc2Vzc2lvblRpbWVvdXRGdW5jdGlvbiA9IHRoaXMuZ2V0U2Vzc2lvblRpbWVvdXRGdW5jdGlvbihjb250ZXh0LCBpMThuTW9kZWwpO1xuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoKSBhcyBhbnkpLmF0dGFjaFNlc3Npb25UaW1lb3V0KHRoaXMuc2Vzc2lvblRpbWVvdXRGdW5jdGlvbik7XG5cblx0XHRcdFx0dGhpcy5zdGlja3lEaXNjYXJkQWZ0ZXJOYXZpZ2F0aW9uRnVuY3Rpb24gPSB0aGlzLmdldFJvdXRlTWF0Y2hlZEZ1bmN0aW9uKGNvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0aW5nU2VydmljZSgpLmF0dGFjaFJvdXRlTWF0Y2hlZCh0aGlzLnN0aWNreURpc2NhcmRBZnRlck5hdmlnYXRpb25GdW5jdGlvbik7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogRGlzYWJsZXMgdGhlIHN0aWNreSBlZGl0IHNlc3Npb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRydWUgaW4gY2FzZSBvZiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2Vcblx0ICovXG5cdHByaXZhdGUgaGFuZGxlU3RpY2t5T2ZmKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChhcHBDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJ1bmRlZmluZWQgQXBwQ29tcG9uZW50IGZvciBmdW5jdGlvbiBoYW5kbGVTdGlja3lPZmZcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhcHBDb21wb25lbnQuZ2V0Um91dGVyUHJveHkpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBleGl0ZWQgZnJvbSB0aGUgYXBwLCBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQgZG9lc24ndCByZXR1cm4gYVxuXHRcdFx0XHQvLyBzYXAuZmUuY29yZS5BcHBDb21wb25lbnQsIGhlbmNlIHRoZSAnaWYnIGFib3ZlXG5cdFx0XHRcdGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmRpc2NhcmROYXZpZ2F0aW9uR3VhcmQoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24pIHtcblx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5kZXJlZ2lzdGVyRGlydHlTdGF0ZVByb3ZpZGVyKHRoaXMuZGlydHlTdGF0ZVByb3ZpZGVyRnVuY3Rpb24pO1xuXHRcdFx0XHR0aGlzLmRpcnR5U3RhdGVQcm92aWRlckZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBtb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbDtcblx0XHRcdGlmIChtb2RlbCAmJiB0aGlzLnNlc3Npb25UaW1lb3V0RnVuY3Rpb24pIHtcblx0XHRcdFx0bW9kZWwuZGV0YWNoU2Vzc2lvblRpbWVvdXQodGhpcy5zZXNzaW9uVGltZW91dEZ1bmN0aW9uKTtcblx0XHRcdH1cblxuXHRcdFx0YXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZGV0YWNoUm91dGVNYXRjaGVkKHRoaXMuc3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uKTtcblx0XHRcdHRoaXMuc3RpY2t5RGlzY2FyZEFmdGVyTmF2aWdhdGlvbkZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuXG5cdFx0XHR0aGlzLnNldEVkaXRNb2RlKEVkaXRNb2RlLkRpc3BsYXksIGZhbHNlKTtcblxuXHRcdFx0aWYgKGFwcENvbXBvbmVudC5nZXRTaGVsbFNlcnZpY2VzKSB7XG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZXhpdGVkIGZyb20gdGhlIGFwcCwgQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50IGRvZXNuJ3QgcmV0dXJuIGFcblx0XHRcdFx0Ly8gc2FwLmZlLmNvcmUuQXBwQ29tcG9uZW50LCBoZW5jZSB0aGUgJ2lmJyBhYm92ZVxuXHRcdFx0XHRhcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRfc2V0U3RpY2t5U2Vzc2lvbkludGVybmFsUHJvcGVydGllcyhwcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcsIG1vZGVsOiBPRGF0YU1vZGVsKSB7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCB0cnVlKTtcblx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc3RpY2t5U2Vzc2lvblRva2VuXCIsIChtb2RlbC5nZXRIdHRwSGVhZGVycyh0cnVlKSBhcyBhbnkpW1wiU0FQLUNvbnRleHRJZFwiXSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSB1c2VkIGFzIGEgRGlydHlTdGF0ZVByb3ZpZGVyIGluIHRoZSBTaGVsbC5cblx0ICpcblx0ICogQHBhcmFtIGFwcENvbXBvbmVudCBUaGUgYXBwIGNvbXBvbmVudFxuXHQgKiBAcGFyYW0gaW50ZXJuYWxNb2RlbCBUaGUgbW9kZWwgXCJpbnRlcm5hbFwiXG5cdCAqIEBwYXJhbSBoYXNoVHJhY2tlciBIYXNoIHRyYWNrZXJcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldERpcnR5U3RhdGVQcm92aWRlcihhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCwgaW50ZXJuYWxNb2RlbDogSlNPTk1vZGVsLCBoYXNoVHJhY2tlcjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIChuYXZpZ2F0aW9uQ29udGV4dDogYW55KSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAobmF2aWdhdGlvbkNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXQgcGFyYW1ldGVycyBmb3IgRGlydHlTdGF0ZVByb3ZpZGVyIGZ1bmN0aW9uXCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgdGFyZ2V0SGFzaCA9IG5hdmlnYXRpb25Db250ZXh0LmlubmVyQXBwUm91dGU7XG5cdFx0XHRcdGNvbnN0IHJvdXRlclByb3h5ID0gYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCk7XG5cdFx0XHRcdGxldCBsY2xIYXNoVHJhY2tlciA9IFwiXCI7XG5cdFx0XHRcdGxldCBpc0RpcnR5OiBib29sZWFuO1xuXHRcdFx0XHRjb25zdCBpc1Nlc3Npb25PbiA9IGludGVybmFsTW9kZWwuZ2V0UHJvcGVydHkoXCIvc2Vzc2lvbk9uXCIpO1xuXG5cdFx0XHRcdGlmICghaXNTZXNzaW9uT24pIHtcblx0XHRcdFx0XHQvLyBJZiB0aGUgc3RpY2t5IHNlc3Npb24gd2FzIHRlcm1pbmF0ZWQgYmVmb3JlIGhhbmQuXG5cdFx0XHRcdFx0Ly8gRXhhbXBsZSBpbiBjYXNlIG9mIG5hdmlnYXRpbmcgYXdheSBmcm9tIGFwcGxpY2F0aW9uIHVzaW5nIElCTi5cblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFyb3V0ZXJQcm94eS5pc05hdmlnYXRpb25GaW5hbGl6ZWQoKSkge1xuXHRcdFx0XHRcdC8vIElmIG5hdmlnYXRpb24gaXMgY3VycmVudGx5IGhhcHBlbmluZyBpbiBSb3V0ZXJQcm94eSwgaXQncyBhIHRyYW5zaWVudCBzdGF0ZVxuXHRcdFx0XHRcdC8vIChub3QgZGlydHkpXG5cdFx0XHRcdFx0aXNEaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHRcdGxjbEhhc2hUcmFja2VyID0gdGFyZ2V0SGFzaDtcblx0XHRcdFx0fSBlbHNlIGlmIChoYXNoVHJhY2tlciA9PT0gdGFyZ2V0SGFzaCkge1xuXHRcdFx0XHRcdC8vIHRoZSBoYXNoIGRpZG4ndCBjaGFuZ2Ugc28gZWl0aGVyIHRoZSB1c2VyIGF0dGVtcHRzIHRvIHJlZnJlc2ggb3IgdG8gbGVhdmUgdGhlIGFwcFxuXHRcdFx0XHRcdGlzRGlydHkgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHJvdXRlclByb3h5LmNoZWNrSGFzaFdpdGhHdWFyZCh0YXJnZXRIYXNoKSB8fCByb3V0ZXJQcm94eS5pc0d1YXJkQ3Jvc3NBbGxvd2VkQnlVc2VyKCkpIHtcblx0XHRcdFx0XHQvLyB0aGUgdXNlciBhdHRlbXB0cyB0byBuYXZpZ2F0ZSB3aXRoaW4gdGhlIHJvb3Qgb2JqZWN0XG5cdFx0XHRcdFx0Ly8gb3IgY3Jvc3NpbmcgdGhlIGd1YXJkIGhhcyBhbHJlYWR5IGJlZW4gYWxsb3dlZCBieSB0aGUgUm91dGVyUHJveHlcblx0XHRcdFx0XHRsY2xIYXNoVHJhY2tlciA9IHRhcmdldEhhc2g7XG5cdFx0XHRcdFx0aXNEaXJ0eSA9IGZhbHNlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHRoZSB1c2VyIGF0dGVtcHRzIHRvIG5hdmlnYXRlIHdpdGhpbiB0aGUgYXBwLCBmb3IgZXhhbXBsZSBiYWNrIHRvIHRoZSBsaXN0IHJlcG9ydFxuXHRcdFx0XHRcdGlzRGlydHkgPSB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGlzRGlydHkpIHtcblx0XHRcdFx0XHQvLyB0aGUgRkxQIGRvZXNuJ3QgY2FsbCB0aGUgZGlydHkgc3RhdGUgcHJvdmlkZXIgYW55bW9yZSBvbmNlIGl0J3MgZGlydHksIGFzIHRoZXkgY2FuJ3Rcblx0XHRcdFx0XHQvLyBjaGFuZ2UgdGhpcyBkdWUgdG8gY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIHNldCBpdCBiYWNrIHRvIG5vdC1kaXJ0eVxuXHRcdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXREaXJ0eUZsYWcoZmFsc2UpO1xuXHRcdFx0XHRcdH0sIDApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGhhc2hUcmFja2VyID0gbGNsSGFzaFRyYWNrZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gaXNEaXJ0eTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdExvZy5pbmZvKGVycm9yIGFzIGFueSk7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgdXNlZCB3aGVuIGEgc3RpY2t5IHNlc3Npb24gdGltZXMgb3V0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc3RpY2t5Q29udGV4dCBUaGUgY29udGV4dCBmb3IgdGhlIHN0aWNreSBzZXNzaW9uXG5cdCAqIEBwYXJhbSBpMThuTW9kZWxcblx0ICogQHJldHVybnMgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldFNlc3Npb25UaW1lb3V0RnVuY3Rpb24oc3RpY2t5Q29udGV4dDogQ29udGV4dCwgaTE4bk1vZGVsOiBNb2RlbCkge1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRpZiAoc3RpY2t5Q29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBtaXNzaW5nIGZvciBTZXNzaW9uVGltZW91dCBmdW5jdGlvblwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyByZW1vdmUgdHJhbnNpZW50IG1lc3NhZ2VzIHNpbmNlIHdlIHdpbGwgc2hvd2luZyBvdXIgb3duIG1lc3NhZ2Vcblx0XHRcdFx0dGhpcy5nZXRNZXNzYWdlSGFuZGxlcigpLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0XHRcdGNvbnN0IHdhcm5pbmdEaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHR0aXRsZTogXCJ7c2FwLmZlLmkxOG4+Q19FRElURkxPV19PQkpFQ1RfUEFHRV9TRVNTSU9OX0VYUElSRURfRElBTE9HX1RJVExFfVwiLFxuXHRcdFx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdFx0XHRjb250ZW50OiBuZXcgVGV4dCh7IHRleHQ6IFwie3NhcC5mZS5pMThuPkNfRURJVEZMT1dfT0JKRUNUX1BBR0VfU0VTU0lPTl9FWFBJUkVEX0RJQUxPR19NRVNTQUdFfVwiIH0pLFxuXHRcdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdHRleHQ6IFwie3NhcC5mZS5pMThuPkNfQ09NTU9OX0RJQUxPR19PS31cIixcblx0XHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdFx0cHJlc3M6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gcmVtb3ZlIHN0aWNreSBoYW5kbGluZyBhZnRlciBuYXZpZ2F0aW9uIHNpbmNlIHNlc3Npb24gaGFzIGFscmVhZHkgYmVlbiB0ZXJtaW5hdGVkXG5cdFx0XHRcdFx0XHRcdHRoaXMuaGFuZGxlU3RpY2t5T2ZmKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVCYWNrRnJvbUNvbnRleHQoc3RpY2t5Q29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0d2FybmluZ0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0d2FybmluZ0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdFx0d2FybmluZ0RpYWxvZy5zZXRNb2RlbChpMThuTW9kZWwsIFwic2FwLmZlLmkxOG5cIik7XG5cdFx0XHRcdHRoaXMuZ2V0VmlldygpLmFkZERlcGVuZGVudCh3YXJuaW5nRGlhbG9nKTtcblx0XHRcdFx0d2FybmluZ0RpYWxvZy5vcGVuKCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRMb2cuaW5mbyhlcnJvciBhcyBhbnkpO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBvblJvdXRlTWF0Y2hlZCBldmVudCBpbiBjYXNlIG9mIHN0aWNreSBlZGl0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBiZWluZyBlZGl0ZWQgKHJvb3Qgb2YgdGhlIHN0aWNreSBzZXNzaW9uKVxuXHQgKiBAcGFyYW0gYXBwQ29tcG9uZW50IFRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHJpdmF0ZSBnZXRSb3V0ZU1hdGNoZWRGdW5jdGlvbihjb250ZXh0OiBDb250ZXh0LCBhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCkge1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRjb25zdCBjdXJyZW50SGFzaCA9IGFwcENvbXBvbmVudC5nZXRSb3V0ZXJQcm94eSgpLmdldEhhc2goKTtcblx0XHRcdC8vIGVpdGhlciBjdXJyZW50IGhhc2ggaXMgZW1wdHkgc28gdGhlIHVzZXIgbGVmdCB0aGUgYXBwIG9yIGhlIG5hdmlnYXRlZCBhd2F5IGZyb20gdGhlIG9iamVjdFxuXHRcdFx0aWYgKCFjdXJyZW50SGFzaCB8fCAhYXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuY2hlY2tIYXNoV2l0aEd1YXJkKGN1cnJlbnRIYXNoKSkge1xuXHRcdFx0XHR0aGlzLmRpc2NhcmRTdGlja3lTZXNzaW9uKGNvbnRleHQpO1xuXHRcdFx0XHRjb250ZXh0LmdldE1vZGVsKCkuY2xlYXJTZXNzaW9uQ29udGV4dCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogRW5kcyBhIHN0aWNreSBzZXNzaW9uIGJ5IGRpc2NhcmRpbmcgY2hhbmdlcy5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQgYmVpbmcgZWRpdGVkIChyb290IG9mIHRoZSBzdGlja3kgc2Vzc2lvbilcblx0ICovXG5cdHByaXZhdGUgYXN5bmMgZGlzY2FyZFN0aWNreVNlc3Npb24oY29udGV4dDogQ29udGV4dCkge1xuXHRcdGNvbnN0IGRpc2NhcmRlZENvbnRleHQgPSBhd2FpdCBzdGlja3kuZGlzY2FyZERvY3VtZW50KGNvbnRleHQpO1xuXHRcdGlmIChkaXNjYXJkZWRDb250ZXh0Py5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRkaXNjYXJkZWRDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHR9XG5cdFx0aWYgKCF0aGlzLmdldENyZWF0aW9uTW9kZSgpKSB7XG5cdFx0XHRkaXNjYXJkZWRDb250ZXh0Py5yZWZyZXNoKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBpbnRlcm5hbCByb3V0aW5nIGV4dGVuc2lvbi5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGludGVybmFsIHJvdXRpbmcgZXh0ZW5zaW9uXG5cdCAqL1xuXHRwcml2YXRlIGdldEludGVybmFsUm91dGluZygpOiBJbnRlcm5hbFJvdXRpbmcge1xuXHRcdGlmICh0aGlzLmJhc2UuX3JvdXRpbmcpIHtcblx0XHRcdHJldHVybiB0aGlzLmJhc2UuX3JvdXRpbmc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVkaXQgRmxvdyB3b3JrcyBvbmx5IHdpdGggYSBnaXZlbiByb3V0aW5nIGxpc3RlbmVyXCIpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRSb290Vmlld0NvbnRyb2xsZXIoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdH1cblxuXHRfZ2V0U2VtYW50aWNNYXBwaW5nKCk6IFNlbWFudGljTWFwcGluZyB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRMYXN0U2VtYW50aWNNYXBwaW5nKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBwcm9taXNlIHRvIHdhaXQgZm9yIGFuIGFjdGlvbiB0byBiZSBleGVjdXRlZC5cblx0ICpcblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gY29udHJvbElkIFRoZSBJRCBvZiB0aGUgY29udHJvbFxuXHQgKiBAcmV0dXJucyB7RnVuY3Rpb259IFRoZSByZXNvbHZlciBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBleHRlcm5hbGx5IHJlc29sdmUgdGhlIHByb21pc2Vcblx0ICovXG5cdHByaXZhdGUgY3JlYXRlQWN0aW9uUHJvbWlzZShhY3Rpb25OYW1lOiBzdHJpbmcsIGNvbnRyb2xJZDogc3RyaW5nKSB7XG5cdFx0bGV0IHJlc29sdmVGdW5jdGlvbiwgcmVqZWN0RnVuY3Rpb247XG5cdFx0dGhpcy5hY3Rpb25Qcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0cmVzb2x2ZUZ1bmN0aW9uID0gcmVzb2x2ZTtcblx0XHRcdHJlamVjdEZ1bmN0aW9uID0gcmVqZWN0O1xuXHRcdH0pLnRoZW4oKG9SZXNwb25zZTogYW55KSA9PiB7XG5cdFx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7IGNvbnRyb2xJZCB9LCB0aGlzLmdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoYWN0aW9uTmFtZSwgb1Jlc3BvbnNlKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHsgZlJlc29sdmVyOiByZXNvbHZlRnVuY3Rpb24sIGZSZWplY3RvcjogcmVqZWN0RnVuY3Rpb24gfTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gYWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRoYXQgaXMgZXhlY3V0ZWRcblx0ICogQHBhcmFtIHJlc3BvbnNlIFRoZSBib3VuZCBhY3Rpb24ncyByZXNwb25zZSBkYXRhIG9yIHJlc3BvbnNlIGNvbnRleHRcblx0ICogQHJldHVybnMgT2JqZWN0IHdpdGggZGF0YSBhbmQgbmFtZXMgb2YgdGhlIGtleSBmaWVsZHMgb2YgdGhlIHJlc3BvbnNlXG5cdCAqL1xuXHRwcml2YXRlIGdldEFjdGlvblJlc3BvbnNlRGF0YUFuZEtleXMoYWN0aW9uTmFtZTogc3RyaW5nLCByZXNwb25zZTogYW55KSB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2UpKSB7XG5cdFx0XHRpZiAocmVzcG9uc2UubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gcmVzcG9uc2VbMF0udmFsdWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCFyZXNwb25zZSkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHRcdGNvbnN0IGN1cnJlbnRWaWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCBtZXRhTW9kZWxEYXRhID0gKGN1cnJlbnRWaWV3LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgYW55KS5nZXREYXRhKCk7XG5cdFx0Y29uc3QgYWN0aW9uUmV0dXJuVHlwZSA9XG5cdFx0XHRtZXRhTW9kZWxEYXRhICYmIG1ldGFNb2RlbERhdGFbYWN0aW9uTmFtZV0gJiYgbWV0YU1vZGVsRGF0YVthY3Rpb25OYW1lXVswXSAmJiBtZXRhTW9kZWxEYXRhW2FjdGlvbk5hbWVdWzBdLiRSZXR1cm5UeXBlXG5cdFx0XHRcdD8gbWV0YU1vZGVsRGF0YVthY3Rpb25OYW1lXVswXS4kUmV0dXJuVHlwZS4kVHlwZVxuXHRcdFx0XHQ6IG51bGw7XG5cdFx0Y29uc3Qga2V5cyA9IGFjdGlvblJldHVyblR5cGUgJiYgbWV0YU1vZGVsRGF0YVthY3Rpb25SZXR1cm5UeXBlXSA/IG1ldGFNb2RlbERhdGFbYWN0aW9uUmV0dXJuVHlwZV0uJEtleSA6IG51bGw7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0b0RhdGE6IHJlc3BvbnNlLmdldE9iamVjdCgpLFxuXHRcdFx0a2V5c1xuXHRcdH07XG5cdH1cblxuXHRnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5hY3Rpb25Qcm9taXNlO1xuXHR9XG5cblx0ZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKSB7XG5cdFx0dGhpcy5hY3Rpb25Qcm9taXNlID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0X3Njcm9sbEFuZEZvY3VzT25JbmFjdGl2ZVJvdyh0YWJsZTogVGFibGUpIHtcblx0XHRjb25zdCByb3dCaW5kaW5nID0gdGFibGUuZ2V0Um93QmluZGluZygpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdFx0Y29uc3QgYWN0aXZlUm93SW5kZXg6IG51bWJlciA9IHJvd0JpbmRpbmcuZ2V0Q291bnQoKSB8fCAwO1xuXHRcdGlmICh0YWJsZS5kYXRhKFwidGFibGVUeXBlXCIpICE9PSBcIlJlc3BvbnNpdmVUYWJsZVwiKSB7XG5cdFx0XHRpZiAoYWN0aXZlUm93SW5kZXggPiAwKSB7XG5cdFx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgoYWN0aXZlUm93SW5kZXggLSAxKTtcblx0XHRcdH1cblx0XHRcdHRhYmxlLmZvY3VzUm93KGFjdGl2ZVJvd0luZGV4LCB0cnVlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0LyogSW4gYSByZXNwb25zaXZlIHRhYmxlLCB0aGUgZW1wdHkgcm93cyBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGFibGUuIEJ1dCB3aGVuIHdlIGNyZWF0ZSBtb3JlLCB0aGV5IGFwcGVhciBiZWxvdyB0aGUgbmV3IGxpbmUuXG5cdFx0XHQgKiBTbyB3ZSBjaGVjayB0aGUgZmlyc3QgaW5hY3RpdmUgcm93IGZpcnN0LCB0aGVuIHdlIHNldCB0aGUgZm9jdXMgb24gaXQgd2hlbiB3ZSBwcmVzcyB0aGUgYnV0dG9uLlxuXHRcdFx0ICogVGhpcyBkb2Vzbid0IGltcGFjdCB0aGUgR3JpZFRhYmxlIGJlY2F1c2UgdGhleSBhcHBlYXIgYXQgdGhlIGVuZCwgYW5kIHdlIGFscmVhZHkgZm9jdXMgdGhlIGJlZm9yZS10aGUtbGFzdCByb3cgKGJlY2F1c2UgMiBlbXB0eSByb3dzIGV4aXN0KVxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBhbGxSb3dDb250ZXh0cyA9IHJvd0JpbmRpbmcuZ2V0Q29udGV4dHMoKTtcblx0XHRcdGlmICghYWxsUm93Q29udGV4dHM/Lmxlbmd0aCkge1xuXHRcdFx0XHR0YWJsZS5mb2N1c1JvdyhhY3RpdmVSb3dJbmRleCwgdHJ1ZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGxldCBmb2N1c1JvdyA9IGFjdGl2ZVJvd0luZGV4LFxuXHRcdFx0XHRpbmRleCA9IDA7XG5cdFx0XHRmb3IgKGNvbnN0IHNpbmdsZUNvbnRleHQgb2YgYWxsUm93Q29udGV4dHMpIHtcblx0XHRcdFx0aWYgKHNpbmdsZUNvbnRleHQuaXNJbmFjdGl2ZSgpICYmIGluZGV4IDwgZm9jdXNSb3cpIHtcblx0XHRcdFx0XHRmb2N1c1JvdyA9IGluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZm9jdXNSb3cgPiAwKSB7XG5cdFx0XHRcdHRhYmxlLnNjcm9sbFRvSW5kZXgoZm9jdXNSb3cpO1xuXHRcdFx0fVxuXHRcdFx0dGFibGUuZm9jdXNSb3coZm9jdXNSb3csIHRydWUpO1xuXHRcdH1cblx0fVxuXHRhc3luYyBjcmVhdGVFbXB0eVJvd3NBbmRGb2N1cyh0YWJsZTogVGFibGUpIHtcblx0XHRjb25zdCB0YWJsZUFQSSA9IHRhYmxlLmdldFBhcmVudCgpIGFzIFRhYmxlQVBJO1xuXHRcdGlmIChcblx0XHRcdHRhYmxlQVBJPy50YWJsZURlZmluaXRpb24/LmNvbnRyb2w/LmlubGluZUNyZWF0aW9uUm93c0hpZGRlbkluRWRpdE1vZGUgJiZcblx0XHRcdCF0YWJsZS5nZXRCaW5kaW5nQ29udGV4dChcInVpXCIpPy5nZXRQcm9wZXJ0eShcImNyZWF0ZU1vZGVcIilcblx0XHQpIHtcblx0XHRcdC8vIFdpdGggdGhlIHBhcmFtZXRlciwgd2UgZG9uJ3QgaGF2ZSBlbXB0eSByb3dzIGluIEVkaXQgbW9kZSwgc28gd2UgbmVlZCB0byBjcmVhdGUgdGhlbSBiZWZvcmUgc2V0dGluZyB0aGUgZm9jdXMgb24gdGhlbVxuXHRcdFx0YXdhaXQgdGFibGVBUEkuc2V0VXBFbXB0eVJvd3ModGFibGUsIHRydWUpO1xuXHRcdH1cblx0XHR0aGlzLl9zY3JvbGxBbmRGb2N1c09uSW5hY3RpdmVSb3codGFibGUpO1xuXHR9XG5cblx0X3NlbmRBY3Rpdml0eShcblx0XHRhY3Rpb246IEFjdGl2aXR5LFxuXHRcdHJlbGF0ZWRDb250ZXh0czogQ29udGV4dCB8IENvbnRleHRbXSB8IHVuZGVmaW5lZCxcblx0XHRhY3Rpb25OYW1lPzogc3RyaW5nLFxuXHRcdHJlZnJlc2hMaXN0QmluZGluZz86IGJvb2xlYW4sXG5cdFx0YWN0aW9uUmVxdWVzdGVkUHJvcGVydGllcz86IHN0cmluZ1tdXG5cdCkge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBBcnJheS5pc0FycmF5KHJlbGF0ZWRDb250ZXh0cykgPyByZWxhdGVkQ29udGV4dHMubWFwKChjb250ZXh0KSA9PiBjb250ZXh0LmdldFBhdGgoKSkgOiByZWxhdGVkQ29udGV4dHM/LmdldFBhdGgoKTtcblx0XHRBY3Rpdml0eVN5bmMuc2VuZCh0aGlzLmdldFZpZXcoKSwgYWN0aW9uLCBjb250ZW50LCBhY3Rpb25OYW1lLCByZWZyZXNoTGlzdEJpbmRpbmcsIGFjdGlvblJlcXVlc3RlZFByb3BlcnRpZXMpO1xuXHR9XG5cblx0X3RyaWdnZXJDb25maWd1cmVkU3VydmV5KHNBY3Rpb25OYW1lOiBzdHJpbmcsIHRyaWdnZXJUeXBlOiBUcmlnZ2VyVHlwZSkge1xuXHRcdHRyaWdnZXJDb25maWd1cmVkU3VydmV5KHRoaXMuZ2V0VmlldygpLCBzQWN0aW9uTmFtZSwgdHJpZ2dlclR5cGUpO1xuXHR9XG5cblx0YXN5bmMgX3N1Ym1pdE9wZW5DaGFuZ2VzKG9Db250ZXh0OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCksXG5cdFx0XHRvTG9ja09iamVjdCA9IHRoaXMuZ2V0R2xvYmFsVUlNb2RlbCgpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIFN1Ym1pdCBhbnkgbGVmdG92ZXIgY2hhbmdlcyB0aGF0IGFyZSBub3QgeWV0IHN1Ym1pdHRlZFxuXHRcdFx0Ly8gQ3VycmVudGx5IHdlIGFyZSB1c2luZyBvbmx5IDEgdXBkYXRlR3JvdXBJZCwgaGVuY2Ugc3VibWl0dGluZyB0aGUgYmF0Y2ggZGlyZWN0bHkgaGVyZVxuXHRcdFx0YXdhaXQgb01vZGVsLnN1Ym1pdEJhdGNoKFwiJGF1dG9cIik7XG5cblx0XHRcdC8vIFdhaXQgZm9yIGFsbCBjdXJyZW50bHkgcnVubmluZyBjaGFuZ2VzXG5cdFx0XHQvLyBGb3IgdGhlIHRpbWUgYmVpbmcgd2UgYWdyZWVkIHdpdGggdGhlIHY0IG1vZGVsIHRlYW0gdG8gdXNlIGFuIGludGVybmFsIG1ldGhvZC4gV2UnbGwgcmVwbGFjZSBpdCBvbmNlXG5cdFx0XHQvLyBhIHB1YmxpYyBvciByZXN0cmljdGVkIG1ldGhvZCB3YXMgcHJvdmlkZWRcblx0XHRcdGF3YWl0IG9Nb2RlbC5vUmVxdWVzdG9yLndhaXRGb3JSdW5uaW5nQ2hhbmdlUmVxdWVzdHMoXCIkYXV0b1wiKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYWxsIGNoYW5nZXMgd2VyZSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5XG5cdFx0XHRpZiAob01vZGVsLmhhc1BlbmRpbmdDaGFuZ2VzKFwiJGF1dG9cIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3VibWl0IG9mIG9wZW4gY2hhbmdlcyBmYWlsZWRcIik7XG5cdFx0XHR9XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Mb2NrT2JqZWN0KSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTG9ja09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X3JlbW92ZVN0aWNreVNlc3Npb25JbnRlcm5hbFByb3BlcnRpZXMocHJvZ3JhbW1pbmdNb2RlbDogc3RyaW5nKSB7XG5cdFx0aWYgKHByb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHRjb25zdCBpbnRlcm5hbE1vZGVsID0gdGhpcy5nZXRJbnRlcm5hbE1vZGVsKCk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3Nlc3Npb25PblwiLCBmYWxzZSk7XG5cdFx0XHRpbnRlcm5hbE1vZGVsLnNldFByb3BlcnR5KFwiL3N0aWNreVNlc3Npb25Ub2tlblwiLCB1bmRlZmluZWQpO1xuXHRcdFx0dGhpcy5oYW5kbGVTdGlja3lPZmYoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGRpc3BsYXkgYSAnZGlzY2FyZCcgcG9wb3ZlciB3aGVuIGV4aXRpbmcgYSBzdGlja3kgc2Vzc2lvbi5cblx0ICovXG5cdHByaXZhdGUgb25CYWNrTmF2aWdhdGlvbkluU2Vzc2lvbigpIHtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5iYXNlLmdldFZpZXcoKTtcblx0XHRjb25zdCByb3V0ZXJQcm94eSA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKTtcblxuXHRcdGlmIChyb3V0ZXJQcm94eS5jaGVja0lmQmFja0lzT3V0T2ZHdWFyZCgpKSB7XG5cdFx0XHRjb25zdCBiaW5kaW5nQ29udGV4dCA9IHZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdFx0Y29uc3QgcHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChiaW5kaW5nQ29udGV4dCk7XG5cblx0XHRcdHN0aWNreS5wcm9jZXNzRGF0YUxvc3NDb25maXJtYXRpb24oXG5cdFx0XHRcdGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmRpc2NhcmRTdGlja3lTZXNzaW9uKGJpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0XHR0aGlzLl9yZW1vdmVTdGlja3lTZXNzaW9uSW50ZXJuYWxQcm9wZXJ0aWVzKHByb2dyYW1taW5nTW9kZWwpO1xuXHRcdFx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR2aWV3LFxuXHRcdFx0XHRwcm9ncmFtbWluZ01vZGVsXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGhpc3RvcnkuYmFjaygpO1xuXHR9XG5cblx0YXN5bmMgX2hhbmRsZU5ld0NvbnRleHQoXG5cdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0YkVkaXRhYmxlOiBib29sZWFuLFxuXHRcdGJSZWNyZWF0ZUNvbnRleHQ6IGJvb2xlYW4sXG5cdFx0YkRyYWZ0TmF2aWdhdGlvbjogYm9vbGVhbixcblx0XHRiRm9yY2VGb2N1cyA9IGZhbHNlXG5cdCkge1xuXHRcdGlmICghdGhpcy5faXNGY2xFbmFibGVkKCkpIHtcblx0XHRcdEVkaXRTdGF0ZS5zZXRFZGl0U3RhdGVEaXJ0eSgpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuZ2V0SW50ZXJuYWxSb3V0aW5nKCkubmF2aWdhdGVUb0NvbnRleHQob0NvbnRleHQsIHtcblx0XHRcdGNoZWNrTm9IYXNoQ2hhbmdlOiB0cnVlLFxuXHRcdFx0ZWRpdGFibGU6IGJFZGl0YWJsZSxcblx0XHRcdGJQZXJzaXN0T1BTY3JvbGw6IHRydWUsXG5cdFx0XHRiUmVjcmVhdGVDb250ZXh0OiBiUmVjcmVhdGVDb250ZXh0LFxuXHRcdFx0YkRyYWZ0TmF2aWdhdGlvbjogYkRyYWZ0TmF2aWdhdGlvbixcblx0XHRcdHNob3dQbGFjZWhvbGRlcjogZmFsc2UsXG5cdFx0XHRiRm9yY2VGb2N1czogYkZvcmNlRm9jdXMsXG5cdFx0XHRrZWVwQ3VycmVudExheW91dDogdHJ1ZVxuXHRcdH0pO1xuXHR9XG5cblx0X2dldEJvdW5kQ29udGV4dCh2aWV3OiBhbnksIHBhcmFtczogYW55KSB7XG5cdFx0Y29uc3Qgdmlld0xldmVsID0gdmlldy5nZXRWaWV3RGF0YSgpLnZpZXdMZXZlbDtcblx0XHRjb25zdCBiUmVmcmVzaEFmdGVyQWN0aW9uID0gdmlld0xldmVsID4gMSB8fCAodmlld0xldmVsID09PSAxICYmIHBhcmFtcy5jb250cm9sSWQpO1xuXHRcdHJldHVybiAhcGFyYW1zLmlzTmF2aWdhYmxlIHx8ICEhYlJlZnJlc2hBZnRlckFjdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlcmUgYXJlIHZhbGlkYXRpb24gKHBhcnNlKSBlcnJvcnMgZm9yIGNvbnRyb2xzIGJvdW5kIHRvIGEgZ2l2ZW4gY29udGV4dFxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2NoZWNrRm9yVmFsaWRhdGlvbkVycm9yc1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuY29udHJvbGxlcmV4dGVuc2lvbnMuRWRpdEZsb3dcblx0ICogQHJldHVybnMge1Byb21pc2V9IFByb21pc2UgcmVzb2x2ZXMgaWYgdGhlcmUgYXJlIG5vIHZhbGlkYXRpb24gZXJyb3JzLCBhbmQgcmVqZWN0cyBpZiB0aGVyZSBhcmUgdmFsaWRhdGlvbiBlcnJvcnNcblx0ICovXG5cblx0X2NoZWNrRm9yVmFsaWRhdGlvbkVycm9ycygpIHtcblx0XHRyZXR1cm4gdGhpcy5zeW5jVGFzaygpLnRoZW4oKCkgPT4ge1xuXHRcdFx0Y29uc3Qgc1ZpZXdJZCA9IHRoaXMuZ2V0VmlldygpLmdldElkKCk7XG5cdFx0XHRjb25zdCBhTWVzc2FnZXMgPSBzYXAudWkuZ2V0Q29yZSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0RGF0YSgpO1xuXHRcdFx0bGV0IG9Db250cm9sO1xuXHRcdFx0bGV0IG9NZXNzYWdlO1xuXG5cdFx0XHRpZiAoIWFNZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcIk5vIHZhbGlkYXRpb24gZXJyb3JzIGZvdW5kXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFNZXNzYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRvTWVzc2FnZSA9IGFNZXNzYWdlc1tpXTtcblx0XHRcdFx0aWYgKG9NZXNzYWdlLnZhbGlkYXRpb24pIHtcblx0XHRcdFx0XHRvQ29udHJvbCA9IENvcmUuYnlJZChvTWVzc2FnZS5nZXRDb250cm9sSWQoKSk7XG5cdFx0XHRcdFx0d2hpbGUgKG9Db250cm9sKSB7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRyb2wuZ2V0SWQoKSA9PT0gc1ZpZXdJZCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoXCJ2YWxpZGF0aW9uIGVycm9ycyBleGlzdFwiKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9yZWZyZXNoTGlzdElmUmVxdWlyZWRcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLkVkaXRGbG93XG5cdCAqIEBwYXJhbSBvUmVzcG9uc2UgVGhlIHJlc3BvbnNlIG9mIHRoZSBib3VuZCBhY3Rpb24gYW5kIHRoZSBuYW1lcyBvZiB0aGUga2V5IGZpZWxkc1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGJvdW5kIGNvbnRleHQgb24gd2hpY2ggdGhlIGFjdGlvbiB3YXMgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgQWx3YXlzIHJlc29sdmVzIHRvIHBhcmFtIG9SZXNwb25zZVxuXHQgKi9cblx0X3JlZnJlc2hMaXN0SWZSZXF1aXJlZChvUmVzcG9uc2U6IGFueSwgb0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4gfCB1bmRlZmluZWQ+IHtcblx0XHRpZiAoIW9Db250ZXh0IHx8ICFvUmVzcG9uc2UgfHwgIW9SZXNwb25zZS5vRGF0YSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuXHRcdH1cblx0XHRjb25zdCBvQmluZGluZyA9IG9Db250ZXh0LmdldEJpbmRpbmcoKTtcblx0XHQvLyByZWZyZXNoIG9ubHkgbGlzdHNcblx0XHRpZiAob0JpbmRpbmcgJiYgb0JpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIikpIHtcblx0XHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9SZXNwb25zZS5vRGF0YTtcblx0XHRcdGNvbnN0IGFLZXlzID0gb1Jlc3BvbnNlLmtleXM7XG5cdFx0XHRjb25zdCBvQ3VycmVudERhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdGxldCBiUmV0dXJuZWRDb250ZXh0SXNTYW1lID0gdHJ1ZTtcblx0XHRcdC8vIGVuc3VyZSBjb250ZXh0IGlzIGluIHRoZSByZXNwb25zZVxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9Db250ZXh0RGF0YSkubGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGNoZWNrIGlmIGNvbnRleHQgaW4gcmVzcG9uc2UgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGJvdW5kIGNvbnRleHRcblx0XHRcdFx0YlJldHVybmVkQ29udGV4dElzU2FtZSA9IGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1cnJlbnREYXRhW3NLZXldID09PSBvQ29udGV4dERhdGFbc0tleV07XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcblx0XHRcdFx0XHRcdGlmICgob0JpbmRpbmcgYXMgYW55KS5pc1Jvb3QoKSkge1xuXHRcdFx0XHRcdFx0XHRvQmluZGluZy5hdHRhY2hFdmVudE9uY2UoXCJkYXRhUmVjZWl2ZWRcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIWJSZXR1cm5lZENvbnRleHRJc1NhbWUpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmcucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRcdFx0XHRcdG9BcHBDb21wb25lbnRcblx0XHRcdFx0XHRcdFx0XHQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKClcblx0XHRcdFx0XHRcdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKFt7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBvQmluZGluZy5nZXRQYXRoKCkgfV0sIG9CaW5kaW5nLmdldENvbnRleHQoKSBhcyBDb250ZXh0KVxuXHRcdFx0XHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCFiUmV0dXJuZWRDb250ZXh0SXNTYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRhYmxlXCIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCFiUmV0dXJuZWRDb250ZXh0SXNTYW1lKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRhYmxlXCIsIGUpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIHJlc29sdmUgd2l0aCBvUmVzcG9uc2UgdG8gbm90IGRpc3R1cmIgdGhlIHByb21pc2UgY2hhaW4gYWZ0ZXJ3YXJkc1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0fVxuXG5cdF9mZXRjaFNlbWFudGljS2V5VmFsdWVzKG9Db250ZXh0OiBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBhbnksXG5cdFx0XHRzRW50aXR5U2V0TmFtZSA9IG9NZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQob0NvbnRleHQuZ2V0UGF0aCgpKS5nZXRPYmplY3QoXCJAc2FwdWkubmFtZVwiKSxcblx0XHRcdGFTZW1hbnRpY0tleXMgPSBTZW1hbnRpY0tleUhlbHBlci5nZXRTZW1hbnRpY0tleXMob01ldGFNb2RlbCwgc0VudGl0eVNldE5hbWUpO1xuXG5cdFx0aWYgKGFTZW1hbnRpY0tleXMgJiYgYVNlbWFudGljS2V5cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGFSZXF1ZXN0UHJvbWlzZXMgPSBhU2VtYW50aWNLZXlzLm1hcChmdW5jdGlvbiAob0tleTogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvQ29udGV4dC5yZXF1ZXN0T2JqZWN0KG9LZXkuJFByb3BlcnR5UGF0aCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKGFSZXF1ZXN0UHJvbWlzZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIHRoZSBsYXRlc3QgY29udGV4dCBpbiB0aGUgbWV0YWRhdGEgaGllcmFyY2h5IGZyb20gcm9vdEJpbmRpbmcgdG8gZ2l2ZW4gY29udGV4dCBwb2ludGluZyB0byBnaXZlbiBlbnRpdHlUeXBlXG5cdCAqIGlmIGFueSBzdWNoIGNvbnRleHQgZXhpc3RzLiBPdGhlcndpc2UsIGl0IHJldHVybnMgdGhlIG9yaWdpbmFsIGNvbnRleHQuXG5cdCAqIE5vdGU6IEl0IGlzIG9ubHkgbmVlZGVkIGFzIHdvcmstYXJvdW5kIGZvciBpbmNvcnJlY3QgbW9kZWxsaW5nLiBDb3JyZWN0IG1vZGVsbGluZyB3b3VsZCBpbXBseSBhIERhdGFGaWVsZEZvckFjdGlvbiBpbiBhIExpbmVJdGVtXG5cdCAqIHRvIHBvaW50IHRvIGFuIG92ZXJsb2FkIGRlZmluZWQgZWl0aGVyIG9uIHRoZSBjb3JyZXNwb25kaW5nIEVudGl0eVR5cGUgb3IgYSBjb2xsZWN0aW9uIG9mIHRoZSBzYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0gcm9vdENvbnRleHQgVGhlIGNvbnRleHQgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb21cblx0ICogQHBhcmFtIGxpc3RCaW5kaW5nIFRoZSBsaXN0QmluZGluZyBvZiB0aGUgdGFibGVcblx0ICogQHBhcmFtIG92ZXJsb2FkRW50aXR5VHlwZSBUaGUgQWN0aW9uT3ZlcmxvYWQgZW50aXR5IHR5cGUgdG8gc2VhcmNoIGZvclxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBjb250ZXh0IG9mIHRoZSBBY3Rpb25PdmVybG9hZCBlbnRpdHlcblx0ICovXG5cdF9nZXRBY3Rpb25PdmVybG9hZENvbnRleHRGcm9tTWV0YWRhdGFQYXRoKHJvb3RDb250ZXh0OiBDb250ZXh0LCBsaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZywgb3ZlcmxvYWRFbnRpdHlUeXBlOiBzdHJpbmcpOiBDb250ZXh0IHtcblx0XHRjb25zdCBtb2RlbDogT0RhdGFNb2RlbCA9IHJvb3RDb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0Y29uc3QgbWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBjb250ZXh0U2VnbWVudHM6IHN0cmluZ1tdID0gbGlzdEJpbmRpbmcuZ2V0UGF0aCgpLnNwbGl0KFwiL1wiKTtcblx0XHRsZXQgY3VycmVudENvbnRleHQ6IENvbnRleHQgPSByb290Q29udGV4dDtcblxuXHRcdC8vIFdlIGV4cGVjdCB0aGF0IHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGxpc3RCaW5kaW5nIGlzIHRoZSBMaXN0QmluZGluZyBvZiB0aGUgdGFibGUuIFJlbW92ZSB0aGlzIGZyb20gY29udGV4dFNlZ21lbnRzXG5cdFx0Ly8gYmVjYXVzZSBpdCBpcyBpbmNvcnJlY3QgdG8gZXhlY3V0ZSBiaW5kQ29udGV4dCBvbiBhIGxpc3QuIFdlIGRvIG5vdCBhbnl3YXkgbmVlZCB0byBzZWFyY2ggdGhpcyBjb250ZXh0IGZvciB0aGUgb3ZlcmxvYWQuXG5cdFx0Y29udGV4dFNlZ21lbnRzLnBvcCgpO1xuXHRcdGlmIChjb250ZXh0U2VnbWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRjb250ZXh0U2VnbWVudHMgPSBbXCJcIl07IC8vIERvbid0IGxlYXZlIGNvbnRleHRTZWdtZW50cyB1bmRlZmluZWRcblx0XHR9XG5cblx0XHRpZiAoY29udGV4dFNlZ21lbnRzWzBdICE9PSBcIlwiKSB7XG5cdFx0XHRjb250ZXh0U2VnbWVudHMudW5zaGlmdChcIlwiKTsgLy8gdG8gYWxzbyBnZXQgdGhlIHJvb3QgY29udGV4dCwgaS5lLiB0aGUgYmluZGluZ0NvbnRleHQgb2YgdGhlIHRhYmxlXG5cdFx0fVxuXHRcdC8vIGxvYWQgYWxsIHRoZSBwYXJlbnQgY29udGV4dHMgaW50byBhbiBhcnJheVxuXHRcdGNvbnN0IHBhcmVudENvbnRleHRzOiBDb250ZXh0W10gPSBjb250ZXh0U2VnbWVudHNcblx0XHRcdC5tYXAoKHBhdGhTZWdtZW50OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0aWYgKHBhdGhTZWdtZW50ICE9PSBcIlwiKSB7XG5cdFx0XHRcdFx0Y3VycmVudENvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChwYXRoU2VnbWVudCwgY3VycmVudENvbnRleHQpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIENyZWF0aW5nIGEgbmV3IGNvbnRleHQgdXNpbmcgYmluZENvbnRleHQoLi4uKS5nZXRCb3VuZENvbnRleHQoKSBkb2VzIG5vdCB3b3JrIGlmIHRoZSBldGFnIGlzIG5lZWRlZC4gQWNjb3JkaW5nIHRvIG1vZGVsIGNvbGxlYWd1ZXMsXG5cdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIGFsd2F5cyB1c2UgYW4gZXhpc3RpbmcgY29udGV4dCBpZiBwb3NzaWJsZS5cblx0XHRcdFx0XHQvLyBDdXJyZW50bHksIHRoZSBvbmx5IGV4YW1wbGUgd2Uga25vdyBhYm91dCBpcyB1c2luZyB0aGUgcm9vdENvbnRleHQgLSBhbmQgaW4gdGhpcyBjYXNlLCB3ZSBjYW4gb2J2aW91c2x5IHJldXNlIHRoYXQgZXhpc3RpbmcgY29udGV4dC5cblx0XHRcdFx0XHQvLyBJZiBvdGhlciBleGFtcGxlcyBzaG91bGQgY29tZSB1cCwgdGhlIGJlc3QgcG9zc2libGUgd29yayBhcm91bmQgd291bGQgYmUgdG8gcmVxdWVzdCBzb21lIGRhdGEgdG8gZ2V0IGFuIGV4aXN0aW5nIGNvbnRleHQuIFRvIGtlZXAgdGhlXG5cdFx0XHRcdFx0Ly8gcmVxdWVzdCBhcyBzbWFsbCBhbmQgZmFzdCBhcyBwb3NzaWJsZSwgd2Ugc2hvdWxkIHJlcXVlc3Qgb25seSB0aGUgZmlyc3Qga2V5IHByb3BlcnR5LiBBcyB0aGlzIHdvdWxkIGludHJvZHVjZSBhc3luY2hyb25pc20sIGFuZCBhbnl3YXlcblx0XHRcdFx0XHQvLyB0aGUgd2hvbGUgbG9naWMgaXMgb25seSBwYXJ0IG9mIHdvcmstYXJvdW5kIGZvciBpbmNvcnJlY3QgbW9kZWxsaW5nLCB3ZSB3YWl0IHVudGlsIHdlIGhhdmUgYW4gZXhhbXBsZSBuZWVkaW5nIGl0IGJlZm9yZSBpbXBsZW1lbnRpbmcgdGhpcy5cblx0XHRcdFx0XHRjdXJyZW50Q29udGV4dCA9IHJvb3RDb250ZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBjdXJyZW50Q29udGV4dDtcblx0XHRcdH0pXG5cdFx0XHQucmV2ZXJzZSgpO1xuXHRcdC8vIHNlYXJjaCBmb3IgY29udGV4dCBiYWNrd2FyZHNcblx0XHRjb25zdCBvdmVybG9hZENvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSBwYXJlbnRDb250ZXh0cy5maW5kKFxuXHRcdFx0KHBhcmVudENvbnRleHQ6IENvbnRleHQpID0+XG5cdFx0XHRcdChtZXRhTW9kZWwuZ2V0TWV0YUNvbnRleHQocGFyZW50Q29udGV4dC5nZXRQYXRoKCkpLmdldE9iamVjdChcIiRUeXBlXCIpIGFzIHVua25vd24gYXMgc3RyaW5nKSA9PT0gb3ZlcmxvYWRFbnRpdHlUeXBlXG5cdFx0KTtcblx0XHRyZXR1cm4gb3ZlcmxvYWRDb250ZXh0IHx8IGxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSE7XG5cdH1cblxuXHRfY3JlYXRlU2libGluZ0luZm8oY3VycmVudENvbnRleHQ6IENvbnRleHQsIG5ld0NvbnRleHQ6IENvbnRleHQpOiBTaWJsaW5nSW5mb3JtYXRpb24ge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRDb250ZXh0OiBuZXdDb250ZXh0LFxuXHRcdFx0cGF0aE1hcHBpbmc6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdG9sZFBhdGg6IGN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0XHRuZXdQYXRoOiBuZXdDb250ZXh0LmdldFBhdGgoKVxuXHRcdFx0XHR9XG5cdFx0XHRdXG5cdFx0fTtcblx0fVxuXG5cdF91cGRhdGVQYXRoc0luSGlzdG9yeShtYXBwaW5nczogeyBvbGRQYXRoOiBzdHJpbmc7IG5ld1BhdGg6IHN0cmluZyB9W10pIHtcblx0XHRjb25zdCBvQXBwQ29tcG9uZW50ID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKTtcblx0XHRvQXBwQ29tcG9uZW50LmdldFJvdXRlclByb3h5KCkuc2V0UGF0aE1hcHBpbmcobWFwcGluZ3MpO1xuXG5cdFx0Ly8gQWxzbyB1cGRhdGUgdGhlIHNlbWFudGljIG1hcHBpbmcgaW4gdGhlIHJvdXRpbmcgc2VydmljZVxuXHRcdGNvbnN0IGxhc3RTZW1hbnRpY01hcHBpbmcgPSB0aGlzLl9nZXRTZW1hbnRpY01hcHBpbmcoKTtcblx0XHRpZiAobWFwcGluZ3MubGVuZ3RoICYmIGxhc3RTZW1hbnRpY01hcHBpbmc/LnRlY2huaWNhbFBhdGggPT09IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm9sZFBhdGgpIHtcblx0XHRcdGxhc3RTZW1hbnRpY01hcHBpbmcudGVjaG5pY2FsUGF0aCA9IG1hcHBpbmdzW21hcHBpbmdzLmxlbmd0aCAtIDFdLm5ld1BhdGg7XG5cdFx0fVxuXHR9XG5cblx0X2dldE5hdmlnYXRpb25UYXJnZXRGb3JFZGl0KGNvbnRleHQ6IENvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dDogQ29udGV4dCwgc2libGluZ0luZm86IFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZCkge1xuXHRcdGxldCBjb250ZXh0VG9OYXZpZ2F0ZTogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRzaWJsaW5nSW5mbyA9IHNpYmxpbmdJbmZvID8/IHRoaXMuX2NyZWF0ZVNpYmxpbmdJbmZvKGNvbnRleHQsIG5ld0RvY3VtZW50Q29udGV4dCk7XG5cdFx0dGhpcy5fdXBkYXRlUGF0aHNJbkhpc3Rvcnkoc2libGluZ0luZm8ucGF0aE1hcHBpbmcpO1xuXHRcdGlmIChzaWJsaW5nSW5mby50YXJnZXRDb250ZXh0LmdldFBhdGgoKSAhPSBuZXdEb2N1bWVudENvbnRleHQuZ2V0UGF0aCgpKSB7XG5cdFx0XHRjb250ZXh0VG9OYXZpZ2F0ZSA9IHNpYmxpbmdJbmZvLnRhcmdldENvbnRleHQ7XG5cdFx0fVxuXHRcdHJldHVybiBjb250ZXh0VG9OYXZpZ2F0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgc2libGluZyBjb250ZXh0IGZvciBhIHN1Ym9iamVjdCBwYWdlLCBhbmQgY2FsY3VsYXRlcyBhIHNpYmxpbmcgcGF0aFxuXHQgKiBmb3IgYWxsIGludGVybWVkaWF0ZSBwYXRocyBiZXR3ZWVuIHRoZSBvYmplY3QgcGFnZSBhbmQgdGhlIHN1Ym9iamVjdCBwYWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcm9vdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IGZvciB0aGUgcm9vdCBvZiB0aGUgZHJhZnRcblx0ICogQHBhcmFtIHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0IFRoZSBjb250ZXh0IG9mIHRoZSBzdWJvYmplY3Rcblx0ICogQHBhcmFtIHNQcm9ncmFtbWluZ01vZGVsIFRoZSBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKiBAcGFyYW0gZG9Ob3RDb21wdXRlSWZSb290IElmIHRydWUsIHdlIGRvbid0IGNvbXB1dGUgc2libGluZ0luZm8gaWYgdGhlIHJvb3QgYW5kIHRoZSByaWdodG1vc3QgY29udGV4dHMgYXJlIHRoZSBzYW1lXG5cdCAqIEBwYXJhbSByb290Q29udGV4dEluZm8gVGhlIHJvb3QgY29udGV4dCBpbmZvcm1hdGlvbiBvZiByb290IG9mIHRoZSBkcmFmdFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBzaWJsaW5nSW5mb3JtYXRpb24gb2JqZWN0XG5cdCAqL1xuXHRhc3luYyBfY29tcHV0ZVNpYmxpbmdJbmZvcm1hdGlvbihcblx0XHRyb290Q3VycmVudENvbnRleHQ6IENvbnRleHQsXG5cdFx0cmlnaHRtb3N0Q3VycmVudENvbnRleHQ6IENvbnRleHQgfCBudWxsIHwgdW5kZWZpbmVkLFxuXHRcdHNQcm9ncmFtbWluZ01vZGVsOiBzdHJpbmcsXG5cdFx0ZG9Ob3RDb21wdXRlSWZSb290OiBib29sZWFuLFxuXHRcdHJvb3RDb250ZXh0SW5mbz86IFJvb3RDb250ZXh0SW5mb1xuXHQpOiBQcm9taXNlPFNpYmxpbmdJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZD4ge1xuXHRcdHJpZ2h0bW9zdEN1cnJlbnRDb250ZXh0ID0gcmlnaHRtb3N0Q3VycmVudENvbnRleHQgPz8gcm9vdEN1cnJlbnRDb250ZXh0O1xuXHRcdGlmICghcmlnaHRtb3N0Q3VycmVudENvbnRleHQuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgocm9vdEN1cnJlbnRDb250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHRcdC8vIFdyb25nIHVzYWdlICEhXG5cdFx0XHRMb2cuZXJyb3IoXCJDYW5ub3QgY29tcHV0ZSByaWdodG1vc3Qgc2libGluZyBjb250ZXh0XCIpO1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbXB1dGUgcmlnaHRtb3N0IHNpYmxpbmcgY29udGV4dFwiKTtcblx0XHR9XG5cdFx0aWYgKGRvTm90Q29tcHV0ZUlmUm9vdCAmJiByaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkgPT09IHJvb3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcblx0XHR9XG5cblx0XHRjb25zdCBtb2RlbCA9IHJvb3RDdXJyZW50Q29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0cmV0dXJuIGRyYWZ0LmNvbXB1dGVTaWJsaW5nSW5mb3JtYXRpb24ocm9vdEN1cnJlbnRDb250ZXh0LCByaWdodG1vc3RDdXJyZW50Q29udGV4dCwgcm9vdENvbnRleHRJbmZvKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gSWYgbm90IGluIGRyYWZ0IG1vZGUsIHdlIGp1c3QgcmVjcmVhdGUgYSBjb250ZXh0IGZyb20gdGhlIHBhdGggb2YgdGhlIHJpZ2h0bW9zdCBjb250ZXh0XG5cdFx0XHQvLyBObyBwYXRoIG1hcHBpbmcgaXMgbmVlZGVkXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0YXJnZXRDb250ZXh0OiBtb2RlbC5iaW5kQ29udGV4dChyaWdodG1vc3RDdXJyZW50Q29udGV4dC5nZXRQYXRoKCkpLmdldEJvdW5kQ29udGV4dCgpLFxuXHRcdFx0XHRwYXRoTWFwcGluZzogW11cblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cblx0X2lzRmNsRW5hYmxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5faXNGY2xFbmFibGVkKCk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRWRpdEZsb3c7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWlEQSxNQUFNQSxZQUFZLEdBQUdDLFNBQVMsQ0FBQ0QsWUFBWTtJQUMxQ0UsZ0JBQWdCLEdBQUdELFNBQVMsQ0FBQ0MsZ0JBQWdCO0lBQzdDQyxTQUFTLEdBQUdGLFNBQVMsQ0FBQ0UsU0FBUztJQUMv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
|