@sapui5/sap.fe.core 1.108.2 → 1.110.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/README.md +5 -1
- package/package.json +11 -9
- package/src/.eslintrc +7 -0
- package/src/sap/fe/core/.library +39 -37
- package/src/sap/fe/core/.supportrc +3 -3
- package/src/sap/fe/core/ActionRuntime.js +72 -27
- package/src/sap/fe/core/ActionRuntime.ts +104 -21
- package/src/sap/fe/core/AppComponent.js +102 -120
- package/src/sap/fe/core/AppComponent.ts +148 -45
- package/src/sap/fe/core/AppStateHandler.js +105 -91
- package/src/sap/fe/core/AppStateHandler.ts +85 -23
- package/src/sap/fe/core/BaseController.js +5 -20
- package/src/sap/fe/core/BaseController.ts +11 -2
- package/src/sap/fe/core/CommonUtils.js +770 -1079
- package/src/sap/fe/core/CommonUtils.ts +750 -491
- package/src/sap/fe/core/ExtensionAPI.js +69 -96
- package/src/sap/fe/core/ExtensionAPI.ts +15 -17
- package/src/sap/fe/core/PageController.js +21 -46
- package/src/sap/fe/core/PageController.ts +11 -2
- package/src/sap/fe/core/TemplateComponent.js +6 -51
- package/src/sap/fe/core/TemplateComponent.ts +27 -16
- package/src/sap/fe/core/TemplateModel.js +18 -24
- package/src/sap/fe/core/TemplateModel.ts +25 -6
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +8 -23
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +5 -4
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +146 -180
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +144 -57
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +43 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +11 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +436 -556
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +288 -157
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +215 -202
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +93 -51
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +11 -26
- package/src/sap/fe/core/controllerextensions/EditFlow.js +407 -596
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +163 -56
- package/src/sap/fe/core/controllerextensions/Feedback.js +70 -0
- package/src/sap/fe/core/controllerextensions/Feedback.ts +64 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +12 -23
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -1
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +127 -182
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +65 -32
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +96 -198
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +4 -5
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +134 -291
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +21 -12
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +111 -214
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +44 -44
- package/src/sap/fe/core/controllerextensions/MassEdit.js +24 -44
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +3 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +39 -52
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +26 -7
- package/src/sap/fe/core/controllerextensions/PageReady.js +81 -119
- package/src/sap/fe/core/controllerextensions/PageReady.ts +36 -15
- package/src/sap/fe/core/controllerextensions/Paginator.js +16 -51
- package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -3
- package/src/sap/fe/core/controllerextensions/Placeholder.js +7 -33
- package/src/sap/fe/core/controllerextensions/Routing.js +24 -32
- package/src/sap/fe/core/controllerextensions/Routing.ts +6 -1
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +53 -98
- package/src/sap/fe/core/controllerextensions/Share.ts +6 -3
- package/src/sap/fe/core/controllerextensions/SideEffects.js +103 -174
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +37 -22
- package/src/sap/fe/core/controllerextensions/ViewState.js +341 -276
- package/src/sap/fe/core/controllerextensions/ViewState.ts +236 -84
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +6 -22
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -2
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +66 -88
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +64 -17
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +28 -34
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +22 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +69 -65
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +31 -12
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +15 -13
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +273 -906
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +142 -420
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +49 -115
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +12 -7
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +70 -89
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +313 -320
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +582 -683
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +507 -386
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +111 -102
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +102 -79
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +689 -154
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +866 -31
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +24 -101
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +5 -5
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +91 -217
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +3 -20
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +1 -0
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +46 -46
- package/src/sap/fe/core/controls/Any.js +1 -1
- package/src/sap/fe/core/controls/AnyElement.js +1 -1
- package/src/sap/fe/core/controls/CommandExecution.js +4 -26
- package/src/sap/fe/core/controls/ConditionalWrapper.js +16 -33
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +16 -2
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +41 -94
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +1 -1
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +5 -34
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +5 -7
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +7 -7
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +56 -58
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +53 -33
- package/src/sap/fe/core/controls/FieldWrapper.js +6 -49
- package/src/sap/fe/core/controls/FileWrapper.js +51 -136
- package/src/sap/fe/core/controls/FileWrapper.ts +25 -29
- package/src/sap/fe/core/controls/FilterBar.js +19 -54
- package/src/sap/fe/core/controls/FormElementWrapper.js +1 -22
- package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -5
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +2 -2
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +24 -46
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +14 -41
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +4 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +26 -67
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -20
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +12 -48
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +17 -46
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -3
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +1 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +6 -78
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +4 -4
- package/src/sap/fe/core/converters/ConverterContext.js +44 -98
- package/src/sap/fe/core/converters/ConverterContext.ts +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -20
- package/src/sap/fe/core/converters/ManifestSettings.ts +16 -9
- package/src/sap/fe/core/converters/ManifestWrapper.js +97 -158
- package/src/sap/fe/core/converters/ManifestWrapper.ts +4 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +28 -167
- package/src/sap/fe/core/converters/MetaModelConverter.ts +9 -3
- package/src/sap/fe/core/converters/TemplateConverter.js +10 -22
- package/src/sap/fe/core/converters/TemplateConverter.ts +10 -7
- package/src/sap/fe/core/converters/annotations/DataField.js +88 -132
- package/src/sap/fe/core/converters/annotations/DataField.ts +90 -38
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +57 -379
- package/src/sap/fe/core/converters/controls/Common/Action.js +45 -115
- package/src/sap/fe/core/converters/controls/Common/Action.ts +17 -5
- package/src/sap/fe/core/converters/controls/Common/Chart.js +20 -73
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +21 -14
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -9
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +40 -94
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +44 -31
- package/src/sap/fe/core/converters/controls/Common/Form.js +26 -63
- package/src/sap/fe/core/converters/controls/Common/Form.ts +24 -10
- package/src/sap/fe/core/converters/controls/Common/KPI.js +13 -63
- package/src/sap/fe/core/converters/controls/Common/Table.js +368 -707
- package/src/sap/fe/core/converters/controls/Common/Table.ts +308 -197
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +54 -109
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +15 -9
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +69 -210
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +23 -16
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +12 -80
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +3 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -19
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +45 -136
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +10 -10
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +82 -173
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +48 -22
- package/src/sap/fe/core/converters/helpers/Aggregation.js +24 -66
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +3 -7
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +9 -19
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +0 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +20 -48
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +5 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +12 -51
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +13 -11
- package/src/sap/fe/core/converters/helpers/ID.js +3 -17
- package/src/sap/fe/core/converters/helpers/ID.ts +2 -3
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -6
- package/src/sap/fe/core/converters/helpers/Key.js +10 -19
- package/src/sap/fe/core/converters/helpers/Key.ts +3 -3
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +2 -20
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +2 -37
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +126 -131
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +112 -31
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +67 -131
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +58 -27
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +106 -183
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +73 -104
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +74 -67
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +77 -69
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +20 -29
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +21 -0
- package/src/sap/fe/core/formatters/FPMFormatter.js +3 -7
- package/src/sap/fe/core/formatters/KPIFormatter.js +5 -13
- package/src/sap/fe/core/formatters/StandardFormatter.js +3 -18
- package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -2
- package/src/sap/fe/core/formatters/TableFormatter.js +87 -53
- package/src/sap/fe/core/formatters/TableFormatter.ts +96 -9
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -4
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -37
- package/src/sap/fe/core/fpm/Component.js +2 -17
- package/src/sap/fe/core/helpers/AnnotationEnum.js +10 -20
- package/src/sap/fe/core/helpers/AnnotationEnum.ts +6 -6
- package/src/sap/fe/core/helpers/AppStartupHelper.js +16 -52
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.js +106 -364
- package/src/sap/fe/core/helpers/BindingToolkit.ts +30 -7
- package/src/sap/fe/core/helpers/ClassSupport.js +16 -97
- package/src/sap/fe/core/helpers/ClassSupport.ts +7 -4
- package/src/sap/fe/core/helpers/DeleteHelper.js +621 -0
- package/src/sap/fe/core/helpers/DeleteHelper.ts +796 -0
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -12
- package/src/sap/fe/core/helpers/EditState.js +2 -5
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -10
- package/src/sap/fe/core/helpers/FPMHelper.js +3 -8
- package/src/sap/fe/core/helpers/FPMHelper.ts +2 -1
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +8 -38
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -5
- package/src/sap/fe/core/helpers/LoaderUtils.js +1 -7
- package/src/sap/fe/core/helpers/MassEditHelper.js +177 -289
- package/src/sap/fe/core/helpers/MassEditHelper.ts +124 -91
- package/src/sap/fe/core/helpers/MessageStrip.js +12 -28
- package/src/sap/fe/core/helpers/MessageStrip.ts +7 -7
- package/src/sap/fe/core/helpers/ModelHelper.js +62 -103
- package/src/sap/fe/core/helpers/ModelHelper.ts +58 -20
- package/src/sap/fe/core/helpers/PasteHelper.js +28 -51
- package/src/sap/fe/core/helpers/PasteHelper.ts +10 -9
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +112 -136
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +111 -111
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +5 -11
- package/src/sap/fe/core/helpers/SideEffectsHelper.js +26 -32
- package/src/sap/fe/core/helpers/StableIdHelper.js +166 -218
- package/src/sap/fe/core/helpers/StableIdHelper.ts +175 -191
- package/src/sap/fe/core/helpers/Synchronization.js +1 -8
- package/src/sap/fe/core/helpers/ToES6Promise.js +1 -4
- package/src/sap/fe/core/helpers/TypeGuards.js +22 -0
- package/src/sap/fe/core/helpers/TypeGuards.ts +9 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +1 -3
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +3 -23
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +3 -23
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +2 -1
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +4 -16
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.js +2 -5
- package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +4 -27
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
- package/src/sap/fe/core/library.js +9 -48
- package/src/sap/fe/core/library.support.js +3 -2
- package/src/sap/fe/core/library.support.ts +3 -1
- package/src/sap/fe/core/library.ts +3 -8
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +74 -39
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +71 -26
- package/src/sap/fe/core/messagebundle.properties +113 -67
- package/src/sap/fe/core/messagebundle_ar.properties +20 -3
- package/src/sap/fe/core/messagebundle_bg.properties +22 -5
- package/src/sap/fe/core/messagebundle_ca.properties +21 -4
- package/src/sap/fe/core/messagebundle_cs.properties +21 -4
- package/src/sap/fe/core/messagebundle_cy.properties +22 -5
- package/src/sap/fe/core/messagebundle_da.properties +20 -3
- package/src/sap/fe/core/messagebundle_de.properties +38 -21
- package/src/sap/fe/core/messagebundle_el.properties +20 -3
- package/src/sap/fe/core/messagebundle_en.properties +38 -21
- package/src/sap/fe/core/messagebundle_en_GB.properties +20 -3
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -28
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +41 -24
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +42 -29
- package/src/sap/fe/core/messagebundle_es.properties +40 -23
- package/src/sap/fe/core/messagebundle_es_MX.properties +20 -3
- package/src/sap/fe/core/messagebundle_et.properties +20 -3
- package/src/sap/fe/core/messagebundle_fi.properties +20 -3
- package/src/sap/fe/core/messagebundle_fr.properties +21 -4
- package/src/sap/fe/core/messagebundle_fr_CA.properties +22 -5
- package/src/sap/fe/core/messagebundle_hi.properties +20 -3
- package/src/sap/fe/core/messagebundle_hr.properties +22 -5
- package/src/sap/fe/core/messagebundle_hu.properties +20 -3
- package/src/sap/fe/core/messagebundle_id.properties +20 -3
- package/src/sap/fe/core/messagebundle_it.properties +23 -6
- package/src/sap/fe/core/messagebundle_iw.properties +20 -3
- package/src/sap/fe/core/messagebundle_ja.properties +22 -5
- package/src/sap/fe/core/messagebundle_kk.properties +21 -4
- package/src/sap/fe/core/messagebundle_ko.properties +20 -3
- package/src/sap/fe/core/messagebundle_lt.properties +20 -3
- package/src/sap/fe/core/messagebundle_lv.properties +20 -3
- package/src/sap/fe/core/messagebundle_ms.properties +20 -3
- package/src/sap/fe/core/messagebundle_nl.properties +20 -3
- package/src/sap/fe/core/messagebundle_no.properties +20 -3
- package/src/sap/fe/core/messagebundle_pl.properties +21 -4
- package/src/sap/fe/core/messagebundle_pt.properties +20 -3
- package/src/sap/fe/core/messagebundle_pt_PT.properties +20 -3
- package/src/sap/fe/core/messagebundle_ro.properties +20 -3
- package/src/sap/fe/core/messagebundle_ru.properties +20 -3
- package/src/sap/fe/core/messagebundle_sh.properties +20 -3
- package/src/sap/fe/core/messagebundle_sk.properties +20 -3
- package/src/sap/fe/core/messagebundle_sl.properties +26 -9
- package/src/sap/fe/core/messagebundle_sv.properties +20 -3
- package/src/sap/fe/core/messagebundle_th.properties +21 -4
- package/src/sap/fe/core/messagebundle_tr.properties +20 -3
- package/src/sap/fe/core/messagebundle_uk.properties +23 -6
- package/src/sap/fe/core/messagebundle_vi.properties +20 -3
- package/src/sap/fe/core/messagebundle_zh_CN.properties +20 -3
- package/src/sap/fe/core/messagebundle_zh_TW.properties +20 -3
- package/src/sap/fe/core/operationsHelper.js +74 -101
- package/src/sap/fe/core/operationsHelper.ts +113 -44
- package/src/sap/fe/core/rootView/Fcl.controller.js +151 -228
- package/src/sap/fe/core/rootView/Fcl.controller.ts +90 -15
- package/src/sap/fe/core/rootView/Fcl.view.xml +1 -8
- package/src/sap/fe/core/rootView/NavContainer.controller.js +41 -78
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +32 -38
- package/src/sap/fe/core/rootView/RootViewBaseController.js +110 -181
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +37 -17
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -18
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +13 -52
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -22
- package/src/sap/fe/core/services/NavigationServiceFactory.js +45 -87
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +17 -10
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -28
- package/src/sap/fe/core/services/RoutingServiceFactory.js +92 -250
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +8 -12
- package/src/sap/fe/core/services/ShellServicesFactory.js +122 -251
- package/src/sap/fe/core/services/ShellServicesFactory.ts +19 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +188 -273
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +143 -154
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +37 -135
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +59 -94
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -16
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
- package/src/sap/fe/core/support/AnnotationIssue.support.js +6 -9
- package/src/sap/fe/core/support/AnnotationIssue.support.ts +4 -4
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +6 -9
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.ts +3 -3
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +6 -9
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +3 -3
- package/src/sap/fe/core/support/CommonHelper.js +7 -16
- package/src/sap/fe/core/support/Diagnostics.js +1 -10
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +6 -9
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +3 -3
- package/src/sap/fe/core/templating/CommonFormatters.js +1 -15
- package/src/sap/fe/core/templating/CriticalityFormatters.js +4 -20
- package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -20
- package/src/sap/fe/core/templating/DataModelPathHelper.js +49 -121
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +41 -31
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +8 -15
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +7 -7
- package/src/sap/fe/core/templating/EntitySetHelper.js +6 -31
- package/src/sap/fe/core/templating/FieldControlHelper.js +4 -21
- package/src/sap/fe/core/templating/FieldControlHelper.ts +1 -1
- package/src/sap/fe/core/templating/FilterHelper.js +40 -111
- package/src/sap/fe/core/templating/FilterHelper.ts +20 -16
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -19
- package/src/sap/fe/core/templating/FilterTemplating.ts +1 -1
- package/src/sap/fe/core/templating/PropertyFormatters.js +1 -34
- package/src/sap/fe/core/templating/PropertyHelper.js +120 -163
- package/src/sap/fe/core/templating/PropertyHelper.ts +69 -33
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +46 -0
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +34 -0
- package/src/sap/fe/core/templating/UIFormatters.js +40 -180
- package/src/sap/fe/core/templating/UIFormatters.ts +37 -43
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -14
- package/src/sap/fe/core/type/Email.js +1 -10
- package/src/sap/fe/core/type/TypeUtil.js +1 -11
- package/ui5.yaml +0 -1
- package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +0 -35
- package/src/sap/fe/core/helpers/LRMessageStrip.js +0 -234
- package/src/sap/fe/core/helpers/LRMessageStrip.ts +0 -216
|
@@ -18,24 +18,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
18
18
|
// Called for
|
|
19
19
|
// 1. Out Parameters.
|
|
20
20
|
// 2. Transient context property change.
|
|
21
|
+
|
|
21
22
|
var source = Core.byId(mdcFieldId);
|
|
22
23
|
var transCtx = source && source.getBindingContext();
|
|
23
24
|
var fieldInfoModel = source && source.getModel("fieldsInfo");
|
|
24
25
|
var values = fieldInfoModel.getProperty("/values/".concat(dataProperty)) || fieldInfoModel.getProperty("/unitData/".concat(dataProperty)) || [];
|
|
25
|
-
|
|
26
26
|
if (transCtx && (values.inputType === "InputWithValueHelp" || values.inputType === "InputWithUnit") && !values.valueListInfo) {
|
|
27
27
|
MassEditHandlers._setValueListInfo(transCtx, source, fieldInfoModel, dataProperty);
|
|
28
28
|
}
|
|
29
|
-
|
|
30
29
|
var isDialogOpen = fieldInfoModel && fieldInfoModel.getProperty("/isOpen");
|
|
31
|
-
|
|
32
30
|
if (!isDialogOpen || !source.getVisible()) {
|
|
33
31
|
return;
|
|
34
32
|
}
|
|
35
|
-
|
|
36
33
|
MassEditHandlers._updateSelectKey(source, dataProperty, newValue);
|
|
37
34
|
},
|
|
38
|
-
|
|
39
35
|
/**
|
|
40
36
|
* Called for change in the MDC field.
|
|
41
37
|
* This is called on selection done through VHD.
|
|
@@ -48,19 +44,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
48
44
|
handleMDCFieldChange: function (event, propertyName) {
|
|
49
45
|
// Called for
|
|
50
46
|
// 1. VHD property change.
|
|
47
|
+
|
|
51
48
|
var source = event && event.getSource();
|
|
52
49
|
var changePromise = event && event.getParameter("promise");
|
|
53
50
|
var comboBox = source.getContent();
|
|
54
|
-
|
|
55
51
|
if (!comboBox || !propertyName) {
|
|
56
52
|
return;
|
|
57
53
|
}
|
|
58
|
-
|
|
59
54
|
changePromise.then(MassEditHandlers._updateSelectKeyForMDCFieldChange.bind(MassEditHandlers, source, propertyName)).catch(function (err) {
|
|
60
55
|
Log.warning("VHD selection couldn't be populated in the mass edit field.".concat(err));
|
|
61
56
|
});
|
|
62
57
|
},
|
|
63
|
-
|
|
64
58
|
/**
|
|
65
59
|
* Called for selection change through the drop down.
|
|
66
60
|
*
|
|
@@ -71,31 +65,24 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
71
65
|
// Called for Manual selection from dropdown(comboBox or select)
|
|
72
66
|
// 1. VHD select.
|
|
73
67
|
// 2. Any value change in the control.
|
|
68
|
+
|
|
74
69
|
var source = event && event.getSource();
|
|
75
70
|
var key = source.getSelectedKey();
|
|
76
71
|
var params = source && key && key.split("/");
|
|
77
72
|
var propertyName;
|
|
78
|
-
|
|
79
73
|
if (params[0] === "UseValueHelpValue") {
|
|
80
74
|
var prevItem = event.getParameter("previousSelectedItem");
|
|
81
75
|
var selectKey = prevItem.getKey();
|
|
82
76
|
propertyName = params.slice(1).join("/");
|
|
83
|
-
|
|
84
77
|
MassEditHandlers._onVHSelect(source, propertyName, selectKey);
|
|
85
|
-
|
|
86
78
|
return;
|
|
87
79
|
}
|
|
88
|
-
|
|
89
80
|
var fieldInfoModel = source && source.getModel("fieldsInfo");
|
|
90
81
|
propertyName = MassEditHandlers._getPropertyNameFromKey(key);
|
|
91
|
-
|
|
92
82
|
MassEditHandlers._updateSuggestionForFieldsWithInParameters(fieldInfoModel, propertyName, key.startsWith("Default/") || key.startsWith("ClearFieldValue/"), true);
|
|
93
|
-
|
|
94
83
|
MassEditHandlers._updateSuggestionForFieldsWithOutParameters(fieldInfoModel, propertyName, key.startsWith("Default/") || key.startsWith("ClearFieldValue/"), false);
|
|
95
|
-
|
|
96
84
|
MassEditHandlers._updateResults(source, params, true);
|
|
97
85
|
},
|
|
98
|
-
|
|
99
86
|
/**
|
|
100
87
|
* Update selections to results and the suggests in drop downs.
|
|
101
88
|
*
|
|
@@ -108,20 +95,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
108
95
|
var transCtx = source && source.getBindingContext();
|
|
109
96
|
var fieldInfoModel = source && source.getModel("fieldsInfo");
|
|
110
97
|
var values = fieldInfoModel.getProperty("/values/".concat(propertyName)) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) || [];
|
|
111
|
-
|
|
112
98
|
if (transCtx && (values.inputType === "InputWithValueHelp" || values.inputType === "InputWithUnit") && !values.valueListInfo) {
|
|
113
99
|
MassEditHandlers._setValueListInfo(transCtx, source, fieldInfoModel, propertyName);
|
|
114
100
|
}
|
|
115
|
-
|
|
116
101
|
MassEditHandlers._updateSuggestionForFieldsWithOutParameters(fieldInfoModel, propertyName, false, true);
|
|
117
|
-
|
|
118
102
|
MassEditHandlers._updateSuggestionForFieldsWithInParameters(fieldInfoModel, propertyName, false, true);
|
|
119
|
-
|
|
120
103
|
var formattedValue = source.getFormFormattedValue();
|
|
121
|
-
|
|
122
104
|
MassEditHandlers._updateSelectKey(source, propertyName, value, formattedValue);
|
|
123
105
|
},
|
|
124
|
-
|
|
125
106
|
/**
|
|
126
107
|
* Update suggests for all drop downs with InParameter as the propertyName.
|
|
127
108
|
*
|
|
@@ -139,7 +120,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
139
120
|
fieldPaths.forEach(MassEditHandlers._updateInParameterSuggetions.bind(MassEditHandlers, fieldInfoModel, "/values/", propertyName, resetValues, keepExistingSelection));
|
|
140
121
|
unitFieldPaths.forEach(MassEditHandlers._updateInParameterSuggetions.bind(MassEditHandlers, fieldInfoModel, "/unitData/", propertyName, resetValues, keepExistingSelection));
|
|
141
122
|
},
|
|
142
|
-
|
|
143
123
|
/**
|
|
144
124
|
* Update suggests for a drop down with InParameter as the srcPropertyName.
|
|
145
125
|
*
|
|
@@ -153,16 +133,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
153
133
|
*/
|
|
154
134
|
_updateInParameterSuggetions: function (fieldInfoModel, pathPrefix, srcPropertyName, resetValues, keepExistingSelection, propertyName) {
|
|
155
135
|
var valueListInfo = fieldInfoModel.getProperty("".concat(pathPrefix + propertyName, "/valueListInfo"));
|
|
156
|
-
|
|
157
136
|
if (valueListInfo && srcPropertyName != propertyName) {
|
|
158
137
|
var inParameters = valueListInfo.inParameters;
|
|
159
|
-
|
|
160
138
|
if (inParameters && inParameters.length > 0 && inParameters.includes(srcPropertyName)) {
|
|
161
139
|
MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, pathPrefix + propertyName, resetValues, keepExistingSelection);
|
|
162
140
|
}
|
|
163
141
|
}
|
|
164
142
|
},
|
|
165
|
-
|
|
166
143
|
/**
|
|
167
144
|
* Update suggests for all OutParameter's drop downs of the propertyName.
|
|
168
145
|
*
|
|
@@ -174,22 +151,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
174
151
|
*/
|
|
175
152
|
_updateSuggestionForFieldsWithOutParameters: function (fieldInfoModel, propertyName, resetValues, keepExistingSelection) {
|
|
176
153
|
var valueListInfo = fieldInfoModel.getProperty("/values/".concat(propertyName, "/valueListInfo")) || fieldInfoModel.getProperty("/unitData/".concat(propertyName, "/valueListInfo"));
|
|
177
|
-
|
|
178
154
|
if (valueListInfo && valueListInfo.outParameters) {
|
|
179
155
|
var outParameters = valueListInfo.outParameters;
|
|
180
|
-
|
|
181
156
|
if (outParameters.length && outParameters.length > 0) {
|
|
182
157
|
MassEditHandlers._updateOutParameterSuggetions(outParameters, fieldInfoModel, resetValues, keepExistingSelection);
|
|
183
|
-
|
|
184
158
|
var pathPrefix = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/".concat(propertyName) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/".concat(propertyName);
|
|
185
|
-
|
|
186
159
|
if (pathPrefix) {
|
|
187
160
|
MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, pathPrefix, false, true);
|
|
188
161
|
}
|
|
189
162
|
}
|
|
190
163
|
}
|
|
191
164
|
},
|
|
192
|
-
|
|
193
165
|
/**
|
|
194
166
|
* Update suggests for a drop down with InParameter as the srcPropertyName.
|
|
195
167
|
*
|
|
@@ -212,7 +184,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
212
184
|
}
|
|
213
185
|
});
|
|
214
186
|
},
|
|
215
|
-
|
|
216
187
|
/**
|
|
217
188
|
* Update suggests for a drop down of a field.
|
|
218
189
|
*
|
|
@@ -229,7 +200,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
229
200
|
var existingSelection = keepExistingSelection && options.find(function (option) {
|
|
230
201
|
return option.key === selectedKey;
|
|
231
202
|
});
|
|
232
|
-
|
|
233
203
|
if (resetValues) {
|
|
234
204
|
var selectOptions = options.selectOptions;
|
|
235
205
|
options.length = 0;
|
|
@@ -245,15 +215,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
245
215
|
return options.push(defaultOption);
|
|
246
216
|
});
|
|
247
217
|
}
|
|
248
|
-
|
|
249
218
|
fieldInfoModel.setProperty(fieldPathAbsolute, options);
|
|
250
|
-
|
|
251
219
|
if (existingSelection && !options.includes(existingSelection)) {
|
|
252
220
|
options.push(existingSelection);
|
|
253
221
|
fieldInfoModel.setProperty("".concat(fieldPathAbsolute, "/selectedKey"), selectedKey);
|
|
254
222
|
}
|
|
255
223
|
},
|
|
256
|
-
|
|
257
224
|
/**
|
|
258
225
|
* Update In and Out Parameters in the MED.
|
|
259
226
|
*
|
|
@@ -265,18 +232,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
265
232
|
*/
|
|
266
233
|
_setValueListInfo: function (transCtx, source, fieldInfoModel, propertyName) {
|
|
267
234
|
var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
|
|
268
|
-
|
|
269
235
|
if (fieldInfoModel.getProperty("".concat(propPath).concat(propertyName, "/valueListInfo"))) {
|
|
270
236
|
return;
|
|
271
237
|
}
|
|
272
|
-
|
|
273
238
|
var valueListInfo = fieldInfoModel.getProperty("".concat(propPath).concat(propertyName, "/valueListInfo"));
|
|
274
|
-
|
|
275
239
|
if (!valueListInfo) {
|
|
276
240
|
MassEditHandlers._requestValueList(transCtx, source, fieldInfoModel, propertyName);
|
|
277
241
|
}
|
|
278
242
|
},
|
|
279
|
-
|
|
280
243
|
/**
|
|
281
244
|
* Request and update In and Out Parameters in the MED.
|
|
282
245
|
*
|
|
@@ -288,7 +251,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
288
251
|
*/
|
|
289
252
|
_requestValueList: function (transCtx, source, fieldInfoModel, propertyName) {
|
|
290
253
|
var _fieldValueHelp$getDe;
|
|
291
|
-
|
|
292
254
|
var metaPath = ModelHelper.getMetaPathForContext(transCtx);
|
|
293
255
|
var propertyPath = metaPath && "".concat(metaPath, "/").concat(propertyName);
|
|
294
256
|
var dependents = source === null || source === void 0 ? void 0 : source.getDependents();
|
|
@@ -297,11 +259,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
297
259
|
return dependent.getId() === fieldHelp;
|
|
298
260
|
});
|
|
299
261
|
var payload = (_fieldValueHelp$getDe = fieldValueHelp.getDelegate()) === null || _fieldValueHelp$getDe === void 0 ? void 0 : _fieldValueHelp$getDe.payload;
|
|
300
|
-
|
|
301
262
|
if (!(fieldValueHelp !== null && fieldValueHelp !== void 0 && fieldValueHelp.getBindingContext())) {
|
|
302
263
|
fieldValueHelp === null || fieldValueHelp === void 0 ? void 0 : fieldValueHelp.setBindingContext(transCtx);
|
|
303
264
|
}
|
|
304
|
-
|
|
305
265
|
var metaModel = transCtx.getModel().getMetaModel();
|
|
306
266
|
ValueListHelper.createVHUIModel(fieldValueHelp, propertyPath, metaModel);
|
|
307
267
|
var valueListInfo = ValueListHelper.getValueListInfo(fieldValueHelp, propertyPath, payload);
|
|
@@ -317,7 +277,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
317
277
|
})
|
|
318
278
|
};
|
|
319
279
|
fieldInfoModel.setProperty("".concat(propPath).concat(propertyName, "/valueListInfo"), info);
|
|
320
|
-
|
|
321
280
|
if (info.outParameters.length > 0) {
|
|
322
281
|
MassEditHandlers._updateFieldPathSuggestions(fieldInfoModel, "/values/".concat(propertyName), false, true);
|
|
323
282
|
}
|
|
@@ -325,7 +284,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
325
284
|
Log.warning("Mass Edit: Couldn't load valueList info for ".concat(propertyPath));
|
|
326
285
|
});
|
|
327
286
|
},
|
|
328
|
-
|
|
329
287
|
/**
|
|
330
288
|
* Get field help control from MDC field.
|
|
331
289
|
*
|
|
@@ -341,7 +299,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
341
299
|
return dependent.getId() === fieldHelp;
|
|
342
300
|
});
|
|
343
301
|
},
|
|
344
|
-
|
|
345
302
|
/**
|
|
346
303
|
* Colled on drop down selection of VHD option.
|
|
347
304
|
*
|
|
@@ -353,20 +310,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
353
310
|
_onVHSelect: function (source, propertyName, selectKey) {
|
|
354
311
|
// Called for
|
|
355
312
|
// 1. VHD selected.
|
|
313
|
+
|
|
356
314
|
var fieldInfoModel = source && source.getModel("fieldsInfo");
|
|
357
315
|
var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
|
|
358
316
|
var transCtx = source.getBindingContext();
|
|
359
|
-
|
|
360
317
|
var fieldValueHelp = MassEditHandlers._getValueHelp(transCtx, source.getParent());
|
|
361
|
-
|
|
362
318
|
if (!(fieldValueHelp !== null && fieldValueHelp !== void 0 && fieldValueHelp.getBindingContext())) {
|
|
363
319
|
fieldValueHelp === null || fieldValueHelp === void 0 ? void 0 : fieldValueHelp.setBindingContext(transCtx);
|
|
364
320
|
}
|
|
365
|
-
|
|
366
321
|
source.fireValueHelpRequest();
|
|
367
322
|
fieldInfoModel.setProperty("".concat(propPath + propertyName, "/selectedKey"), selectKey);
|
|
368
323
|
},
|
|
369
|
-
|
|
370
324
|
/**
|
|
371
325
|
* Gets Property name from selection key.
|
|
372
326
|
*
|
|
@@ -376,16 +330,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
376
330
|
*/
|
|
377
331
|
_getPropertyNameFromKey: function (key) {
|
|
378
332
|
var propertyName = "";
|
|
379
|
-
|
|
380
333
|
if (key.startsWith("Default/") || key.startsWith("ClearFieldValue/") || key.startsWith("UseValueHelpValue/")) {
|
|
381
334
|
propertyName = key.substring(key.indexOf("/") + 1);
|
|
382
335
|
} else {
|
|
383
336
|
propertyName = key.substring(0, key.lastIndexOf("/"));
|
|
384
337
|
}
|
|
385
|
-
|
|
386
338
|
return propertyName;
|
|
387
339
|
},
|
|
388
|
-
|
|
389
340
|
/**
|
|
390
341
|
* Update selection to Custom Mass Edit Select from MDC field.
|
|
391
342
|
*
|
|
@@ -400,28 +351,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
400
351
|
// 1. VHD property change
|
|
401
352
|
// 2. Out Parameters.
|
|
402
353
|
// 3. Transient context property change.
|
|
403
|
-
var comboBox = source.getContent();
|
|
404
354
|
|
|
355
|
+
var comboBox = source.getContent();
|
|
405
356
|
if (!comboBox || !propertyName) {
|
|
406
357
|
return;
|
|
407
358
|
}
|
|
408
|
-
|
|
409
359
|
var key = comboBox.getSelectedKey();
|
|
410
|
-
|
|
411
360
|
if ((key.startsWith("Default/") || key.startsWith("ClearFieldValue/")) && !value) {
|
|
412
361
|
return;
|
|
413
362
|
}
|
|
414
|
-
|
|
415
363
|
var formattedText = MassEditHandlers._valueExists(fullText) ? fullText : value;
|
|
416
364
|
var fieldInfoModel = source && source.getModel("fieldsInfo");
|
|
417
365
|
var values = fieldInfoModel.getProperty("/values/".concat(propertyName)) || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) || [];
|
|
418
366
|
var propPath = fieldInfoModel.getProperty("/values/".concat(propertyName)) && "/values/" || fieldInfoModel.getProperty("/unitData/".concat(propertyName)) && "/unitData/";
|
|
419
367
|
var relatedField = values.find(function (fieldData) {
|
|
420
368
|
var _fieldData$textInfo;
|
|
421
|
-
|
|
422
369
|
return (fieldData === null || fieldData === void 0 ? void 0 : (_fieldData$textInfo = fieldData.textInfo) === null || _fieldData$textInfo === void 0 ? void 0 : _fieldData$textInfo.value) === value || fieldData.text === value;
|
|
423
370
|
});
|
|
424
|
-
|
|
425
371
|
if (relatedField) {
|
|
426
372
|
if (fullText && relatedField.textInfo && relatedField.textInfo.descriptionPath && (relatedField.text != formattedText || relatedField.textInfo.fullText != formattedText)) {
|
|
427
373
|
// Update the full text only when provided.
|
|
@@ -429,12 +375,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
429
375
|
relatedField.textInfo.fullText = formattedText;
|
|
430
376
|
relatedField.textInfo.description = source.getAdditionalValue();
|
|
431
377
|
}
|
|
432
|
-
|
|
433
378
|
if (relatedField.key === key) {
|
|
434
379
|
fieldInfoModel.setProperty("".concat(propPath + propertyName, "/selectedKey"), key);
|
|
435
380
|
return;
|
|
436
381
|
}
|
|
437
|
-
|
|
438
382
|
key = relatedField.key;
|
|
439
383
|
} else if ([undefined, null, ""].indexOf(value) === -1) {
|
|
440
384
|
key = "".concat(propertyName, "/").concat(value);
|
|
@@ -457,12 +401,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
457
401
|
} else {
|
|
458
402
|
key = "Default/".concat(propertyName);
|
|
459
403
|
}
|
|
460
|
-
|
|
461
404
|
fieldInfoModel.setProperty("".concat(propPath + propertyName, "/selectedKey"), key);
|
|
462
|
-
|
|
463
405
|
MassEditHandlers._updateResults(comboBox);
|
|
464
406
|
},
|
|
465
|
-
|
|
466
407
|
/**
|
|
467
408
|
* Get Value from Drop down.
|
|
468
409
|
*
|
|
@@ -472,13 +413,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
472
413
|
*/
|
|
473
414
|
_getValue: function (source) {
|
|
474
415
|
var _getSelectedItem;
|
|
475
|
-
|
|
476
416
|
return source.getMetadata().getName() === "sap.fe.core.controls.MassEditSelect" ? (_getSelectedItem = source.getSelectedItem()) === null || _getSelectedItem === void 0 ? void 0 : _getSelectedItem.getText() : source.getValue();
|
|
477
417
|
},
|
|
478
418
|
_getValueOnEmpty: function (oSource, fieldsInfoModel, value, sPropertyName) {
|
|
479
419
|
if (!value) {
|
|
480
420
|
var values = fieldsInfoModel.getProperty("/values/".concat(sPropertyName)) || fieldsInfoModel.getProperty("/unitData/".concat(sPropertyName)) || [];
|
|
481
|
-
|
|
482
421
|
if (values.unitProperty) {
|
|
483
422
|
value = 0;
|
|
484
423
|
oSource.setValue(value);
|
|
@@ -486,13 +425,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
486
425
|
value = false;
|
|
487
426
|
}
|
|
488
427
|
}
|
|
489
|
-
|
|
490
428
|
return value;
|
|
491
429
|
},
|
|
492
430
|
_valueExists: function (value) {
|
|
493
431
|
return value != undefined && value != null;
|
|
494
432
|
},
|
|
495
|
-
|
|
496
433
|
/**
|
|
497
434
|
* Updates selections to runtime model.
|
|
498
435
|
*
|
|
@@ -510,13 +447,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
510
447
|
// 3. transient context property change.
|
|
511
448
|
var fieldsInfoModel = oSource && oSource.getModel("fieldsInfo");
|
|
512
449
|
var oFieldsInfoData = fieldsInfoModel && fieldsInfoModel.getData();
|
|
513
|
-
|
|
514
450
|
var value = MassEditHandlers._getValue(oSource);
|
|
515
|
-
|
|
516
451
|
aParams = aParams.length > 0 ? aParams : oSource && oSource.getSelectedKey() && oSource.getSelectedKey().split("/");
|
|
517
452
|
var oDataObject;
|
|
518
453
|
var sPropertyName = oSource.data("fieldPath");
|
|
519
|
-
|
|
520
454
|
if (aParams[0] === "Default") {
|
|
521
455
|
oDataObject = {
|
|
522
456
|
keyValue: aParams[1],
|
|
@@ -540,7 +474,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
540
474
|
var propertyValues = fieldsInfoModel.getProperty("/values/".concat(propertyName)) || fieldsInfoModel.getProperty("/unitData/".concat(propertyName)) || [];
|
|
541
475
|
var relatedField = (propertyValues || []).find(function (oFieldData) {
|
|
542
476
|
var _oFieldData$textInfo;
|
|
543
|
-
|
|
544
477
|
return (oFieldData === null || oFieldData === void 0 ? void 0 : (_oFieldData$textInfo = oFieldData.textInfo) === null || _oFieldData$textInfo === void 0 ? void 0 : _oFieldData$textInfo.value) === value || oFieldData.text === value;
|
|
545
478
|
});
|
|
546
479
|
oDataObject = {
|
|
@@ -548,24 +481,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
548
481
|
value: relatedField.textInfo && MassEditHandlers._valueExists(relatedField.textInfo.value) ? relatedField.textInfo.value : relatedField.text
|
|
549
482
|
};
|
|
550
483
|
}
|
|
551
|
-
|
|
552
484
|
var bExistingElementindex = -1;
|
|
553
|
-
|
|
554
485
|
for (var i = 0; i < oFieldsInfoData.results.length; i++) {
|
|
555
486
|
if (oFieldsInfoData.results[i].keyValue === oDataObject.keyValue) {
|
|
556
487
|
bExistingElementindex = i;
|
|
557
488
|
}
|
|
558
489
|
}
|
|
559
|
-
|
|
560
490
|
if (bExistingElementindex !== -1) {
|
|
561
491
|
oFieldsInfoData.results[bExistingElementindex] = oDataObject;
|
|
562
492
|
} else {
|
|
563
493
|
oFieldsInfoData.results.push(oDataObject);
|
|
564
494
|
}
|
|
565
|
-
|
|
566
495
|
if (updateTransCtx && !oDataObject.keyValue.includes("/")) {
|
|
567
496
|
var transCtx = oSource.getBindingContext();
|
|
568
|
-
|
|
569
497
|
if (aParams[0] === "Default" || aParams[0] === "ClearFieldValue") {
|
|
570
498
|
transCtx.setProperty(oDataObject.keyValue, null);
|
|
571
499
|
} else if (oDataObject) {
|
|
@@ -576,4 +504,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/ModelHelper", "sap/fe/macros
|
|
|
576
504
|
};
|
|
577
505
|
return MassEditHandlers;
|
|
578
506
|
}, false);
|
|
579
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNYXNzRWRpdEhhbmRsZXJzIiwiY29udGV4dFByb3BlcnR5Q2hhbmdlIiwibmV3VmFsdWUiLCJkYXRhUHJvcGVydHkiLCJtZGNGaWVsZElkIiwic291cmNlIiwiQ29yZSIsImJ5SWQiLCJ0cmFuc0N0eCIsImdldEJpbmRpbmdDb250ZXh0IiwiZmllbGRJbmZvTW9kZWwiLCJnZXRNb2RlbCIsInZhbHVlcyIsImdldFByb3BlcnR5IiwiaW5wdXRUeXBlIiwidmFsdWVMaXN0SW5mbyIsIl9zZXRWYWx1ZUxpc3RJbmZvIiwiaXNEaWFsb2dPcGVuIiwiZ2V0VmlzaWJsZSIsIl91cGRhdGVTZWxlY3RLZXkiLCJoYW5kbGVNRENGaWVsZENoYW5nZSIsImV2ZW50IiwicHJvcGVydHlOYW1lIiwiZ2V0U291cmNlIiwiY2hhbmdlUHJvbWlzZSIsImdldFBhcmFtZXRlciIsImNvbWJvQm94IiwiZ2V0Q29udGVudCIsInRoZW4iLCJfdXBkYXRlU2VsZWN0S2V5Rm9yTURDRmllbGRDaGFuZ2UiLCJiaW5kIiwiY2F0Y2giLCJlcnIiLCJMb2ciLCJ3YXJuaW5nIiwiaGFuZGxlU2VsZWN0aW9uQ2hhbmdlIiwia2V5IiwiZ2V0U2VsZWN0ZWRLZXkiLCJwYXJhbXMiLCJzcGxpdCIsInByZXZJdGVtIiwic2VsZWN0S2V5IiwiZ2V0S2V5Iiwic2xpY2UiLCJqb2luIiwiX29uVkhTZWxlY3QiLCJfZ2V0UHJvcGVydHlOYW1lRnJvbUtleSIsIl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aEluUGFyYW1ldGVycyIsInN0YXJ0c1dpdGgiLCJfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhPdXRQYXJhbWV0ZXJzIiwiX3VwZGF0ZVJlc3VsdHMiLCJ2YWx1ZSIsImZvcm1hdHRlZFZhbHVlIiwiZ2V0Rm9ybUZvcm1hdHRlZFZhbHVlIiwicmVzZXRWYWx1ZXMiLCJrZWVwRXhpc3RpbmdTZWxlY3Rpb24iLCJ1bml0RGF0YSIsImZpZWxkUGF0aHMiLCJPYmplY3QiLCJrZXlzIiwidW5pdEZpZWxkUGF0aHMiLCJmb3JFYWNoIiwiX3VwZGF0ZUluUGFyYW1ldGVyU3VnZ2V0aW9ucyIsInBhdGhQcmVmaXgiLCJzcmNQcm9wZXJ0eU5hbWUiLCJpblBhcmFtZXRlcnMiLCJsZW5ndGgiLCJpbmNsdWRlcyIsIl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyIsIm91dFBhcmFtZXRlcnMiLCJfdXBkYXRlT3V0UGFyYW1ldGVyU3VnZ2V0aW9ucyIsIm91dFBhcmFtZXRlciIsImZpZWxkUGF0aEFic29sdXRlIiwib3B0aW9ucyIsImRlZmF1bHRPcHRpb25zIiwic2VsZWN0ZWRLZXkiLCJleGlzdGluZ1NlbGVjdGlvbiIsImZpbmQiLCJvcHRpb24iLCJzZWxlY3RPcHRpb25zIiwiZGVmYXVsdE9wdGlvbiIsInB1c2giLCJzZWxlY3RPcHRpb24iLCJzZXRQcm9wZXJ0eSIsInByb3BQYXRoIiwiX3JlcXVlc3RWYWx1ZUxpc3QiLCJtZXRhUGF0aCIsIk1vZGVsSGVscGVyIiwiZ2V0TWV0YVBhdGhGb3JDb250ZXh0IiwicHJvcGVydHlQYXRoIiwiZGVwZW5kZW50cyIsImdldERlcGVuZGVudHMiLCJmaWVsZEhlbHAiLCJnZXRGaWVsZEhlbHAiLCJmaWVsZFZhbHVlSGVscCIsImRlcGVuZGVudCIsImdldElkIiwicGF5bG9hZCIsImdldERlbGVnYXRlIiwic2V0QmluZGluZ0NvbnRleHQiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJWYWx1ZUxpc3RIZWxwZXIiLCJjcmVhdGVWSFVJTW9kZWwiLCJnZXRWYWx1ZUxpc3RJbmZvIiwidkxpbmZvcyIsInZMaW5mbyIsImluZm8iLCJ2aFBhcmFtZXRlcnMiLCJnZXRJblBhcmFtZXRlcnMiLCJtYXAiLCJpblBhcmFtIiwiaGVscFBhdGgiLCJnZXRPdXRQYXJhbWV0ZXJzIiwib3V0UGFyYW0iLCJfZ2V0VmFsdWVIZWxwIiwiZ2V0UGFyZW50IiwiZmlyZVZhbHVlSGVscFJlcXVlc3QiLCJzdWJzdHJpbmciLCJpbmRleE9mIiwibGFzdEluZGV4T2YiLCJmdWxsVGV4dCIsImZvcm1hdHRlZFRleHQiLCJfdmFsdWVFeGlzdHMiLCJyZWxhdGVkRmllbGQiLCJmaWVsZERhdGEiLCJ0ZXh0SW5mbyIsInRleHQiLCJkZXNjcmlwdGlvblBhdGgiLCJkZXNjcmlwdGlvbiIsImdldEFkZGl0aW9uYWxWYWx1ZSIsInVuZGVmaW5lZCIsInNlbGVjdGlvbkluZm8iLCJ0ZXh0QXJyYW5nZW1lbnQiLCJnZXREaXNwbGF5IiwiZ2V0VmFsdWUiLCJ2YWx1ZVBhdGgiLCJfZ2V0VmFsdWUiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJnZXRTZWxlY3RlZEl0ZW0iLCJnZXRUZXh0IiwiX2dldFZhbHVlT25FbXB0eSIsIm9Tb3VyY2UiLCJmaWVsZHNJbmZvTW9kZWwiLCJzUHJvcGVydHlOYW1lIiwidW5pdFByb3BlcnR5Iiwic2V0VmFsdWUiLCJhUGFyYW1zIiwidXBkYXRlVHJhbnNDdHgiLCJvRmllbGRzSW5mb0RhdGEiLCJnZXREYXRhIiwib0RhdGFPYmplY3QiLCJkYXRhIiwia2V5VmFsdWUiLCJwcm9wZXJ0eVZhbHVlcyIsIm9GaWVsZERhdGEiLCJiRXhpc3RpbmdFbGVtZW50aW5kZXgiLCJpIiwicmVzdWx0cyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTWFzc0VkaXRIYW5kbGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnN0cnVjdG9yIGZvciBhIG5ldyBWaXN1YWwgRmlsdGVyIENvbnRhaW5lci5cbiAqIFVzZWQgZm9yIHZpc3VhbCBmaWx0ZXJzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtzSWRdIElEIGZvciB0aGUgbmV3IGNvbnRyb2wsIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGlmIG5vIElEIGlzIGdpdmVuXG4gKiBAZXh0ZW5kcyBzYXAudWkubWRjLmZpbHRlcmJhci5JRmlsdGVyQ29udGFpbmVyXG4gKiBAY2xhc3NcbiAqIEBwcml2YXRlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbHMuZmlsdGVyYmFyLlZpc3VhbEZpbHRlckNvbnRhaW5lclxuICovXG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IFZhbHVlTGlzdEhlbHBlciwgeyBWYWx1ZUhlbHBQYXlsb2FkLCBWYWx1ZUxpc3RJbmZvIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvdmFsdWVoZWxwL1ZhbHVlTGlzdEhlbHBlck5ld1wiO1xuaW1wb3J0IHR5cGUgQ29tYm9Cb3ggZnJvbSBcInNhcC9tL0NvbWJvQm94XCI7XG5pbXBvcnQgdHlwZSBTZWxlY3QgZnJvbSBcInNhcC9tL1NlbGVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCB0eXBlIEZpZWxkIGZyb20gXCJzYXAvdWkvbWRjL0ZpZWxkXCI7XG5pbXBvcnQgVmFsdWVIZWxwIGZyb20gXCJzYXAvdWkvbWRjL1ZhbHVlSGVscFwiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuXG5jb25zdCBNYXNzRWRpdEhhbmRsZXJzOiBhbnkgPSB7XG5cdC8qKlxuXHQgKiBDYWxsZWQgZm9yIHByb3BlcnR5IGNoYW5nZSBpbiB0aGUgdHJhbnNpZW50IGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gbmV3VmFsdWUgTmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIGRhdGFQcm9wZXJ0eSBGaW5hbCBjb250ZXh0IHJldHVybmVkIGFmdGVyIHRoZSBwYWdpbmF0b3IgYWN0aW9uXG5cdCAqIEBwYXJhbSBtZGNGaWVsZElkIEZpbmFsIGNvbnRleHQgcmV0dXJuZWQgYWZ0ZXIgdGhlIHBhZ2luYXRvciBhY3Rpb25cblx0ICovXG5cdGNvbnRleHRQcm9wZXJ0eUNoYW5nZTogZnVuY3Rpb24gKG5ld1ZhbHVlOiBhbnksIGRhdGFQcm9wZXJ0eTogc3RyaW5nLCBtZGNGaWVsZElkOiBzdHJpbmcpIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMi4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3Qgc291cmNlID0gQ29yZS5ieUlkKG1kY0ZpZWxkSWQpIGFzIEZpZWxkO1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIChzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KTtcblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdGNvbnN0IHZhbHVlcyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke2RhdGFQcm9wZXJ0eX1gKSB8fCBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7ZGF0YVByb3BlcnR5fWApIHx8IFtdO1xuXG5cdFx0aWYgKHRyYW5zQ3R4ICYmICh2YWx1ZXMuaW5wdXRUeXBlID09PSBcIklucHV0V2l0aFZhbHVlSGVscFwiIHx8IHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVW5pdFwiKSAmJiAhdmFsdWVzLnZhbHVlTGlzdEluZm8pIHtcblx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3NldFZhbHVlTGlzdEluZm8odHJhbnNDdHgsIHNvdXJjZSwgZmllbGRJbmZvTW9kZWwsIGRhdGFQcm9wZXJ0eSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXNEaWFsb2dPcGVuID0gZmllbGRJbmZvTW9kZWwgJiYgZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvaXNPcGVuXCIpO1xuXHRcdGlmICghaXNEaWFsb2dPcGVuIHx8ICFzb3VyY2UuZ2V0VmlzaWJsZSgpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlU2VsZWN0S2V5KHNvdXJjZSwgZGF0YVByb3BlcnR5LCBuZXdWYWx1ZSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3IgY2hhbmdlIGluIHRoZSBNREMgZmllbGQuXG5cdCAqIFRoaXMgaXMgY2FsbGVkIG9uIHNlbGVjdGlvbiBkb25lIHRocm91Z2ggVkhELlxuXHQgKiBUaGlzIGlzIG5vdCBjYWxsZWQgb24gY2hhbmdlIG9mIHRoZSBkcm9wZG93biBhcyB3ZSBhcmUgdXNpbmcgYSBjdXN0b20gTWFzc0VkaXRTZWxlY3QgY29udHJvbCBhbmQgbm90IGdlbmVyYWwgU2VsZWN0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIGV2ZW50IEV2ZW50IG9iamVjdCBmb3IgY2hhbmdlLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRoYW5kbGVNRENGaWVsZENoYW5nZTogZnVuY3Rpb24gKGV2ZW50OiBhbnksIHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBwcm9wZXJ0eSBjaGFuZ2UuXG5cblx0XHRjb25zdCBzb3VyY2UgPSBldmVudCAmJiBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCBjaGFuZ2VQcm9taXNlID0gZXZlbnQgJiYgZXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKTtcblx0XHRjb25zdCBjb21ib0JveCA9IHNvdXJjZS5nZXRDb250ZW50KCk7XG5cdFx0aWYgKCFjb21ib0JveCB8fCAhcHJvcGVydHlOYW1lKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y2hhbmdlUHJvbWlzZVxuXHRcdFx0LnRoZW4oTWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlU2VsZWN0S2V5Rm9yTURDRmllbGRDaGFuZ2UuYmluZChNYXNzRWRpdEhhbmRsZXJzLCBzb3VyY2UsIHByb3BlcnR5TmFtZSkpXG5cdFx0XHQuY2F0Y2goKGVycjogYW55KSA9PiB7XG5cdFx0XHRcdExvZy53YXJuaW5nKGBWSEQgc2VsZWN0aW9uIGNvdWxkbid0IGJlIHBvcHVsYXRlZCBpbiB0aGUgbWFzcyBlZGl0IGZpZWxkLiR7ZXJyfWApO1xuXHRcdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3Igc2VsZWN0aW9uIGNoYW5nZSB0aHJvdWdoIHRoZSBkcm9wIGRvd24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZXZlbnQgRXZlbnQgb2JqZWN0IGZvciBjaGFuZ2UuXG5cdCAqL1xuXHRoYW5kbGVTZWxlY3Rpb25DaGFuZ2U6IGZ1bmN0aW9uIChldmVudDogYW55KSB7XG5cdFx0Ly8gQ2FsbGVkIGZvciBNYW51YWwgc2VsZWN0aW9uIGZyb20gZHJvcGRvd24oY29tYm9Cb3ggb3Igc2VsZWN0KVxuXHRcdC8vIDEuIFZIRCBzZWxlY3QuXG5cdFx0Ly8gMi4gQW55IHZhbHVlIGNoYW5nZSBpbiB0aGUgY29udHJvbC5cblxuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50ICYmIGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IGtleSA9IHNvdXJjZS5nZXRTZWxlY3RlZEtleSgpIGFzIHN0cmluZztcblx0XHRjb25zdCBwYXJhbXMgPSBzb3VyY2UgJiYga2V5ICYmIGtleS5zcGxpdChcIi9cIik7XG5cdFx0bGV0IHByb3BlcnR5TmFtZTtcblxuXHRcdGlmIChwYXJhbXNbMF0gPT09IFwiVXNlVmFsdWVIZWxwVmFsdWVcIikge1xuXHRcdFx0Y29uc3QgcHJldkl0ZW0gPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJwcmV2aW91c1NlbGVjdGVkSXRlbVwiKTtcblx0XHRcdGNvbnN0IHNlbGVjdEtleSA9IHByZXZJdGVtLmdldEtleSgpO1xuXHRcdFx0cHJvcGVydHlOYW1lID0gcGFyYW1zLnNsaWNlKDEpLmpvaW4oXCIvXCIpO1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fb25WSFNlbGVjdChzb3VyY2UsIHByb3BlcnR5TmFtZSwgc2VsZWN0S2V5KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdHByb3BlcnR5TmFtZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFByb3BlcnR5TmFtZUZyb21LZXkoa2V5KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aEluUGFyYW1ldGVycyhcblx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIiksXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoXG5cdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdHByb3BlcnR5TmFtZSxcblx0XHRcdGtleS5zdGFydHNXaXRoKFwiRGVmYXVsdC9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJDbGVhckZpZWxkVmFsdWUvXCIpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVJlc3VsdHMoc291cmNlLCBwYXJhbXMsIHRydWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc2VsZWN0aW9ucyB0byByZXN1bHRzIGFuZCB0aGUgc3VnZ2VzdHMgaW4gZHJvcCBkb3ducy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgTURDIGZpZWxkIHRoYXQgd2FzIGNoYW5nZWQuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZS5cblx0ICovXG5cdF91cGRhdGVTZWxlY3RLZXlGb3JNRENGaWVsZENoYW5nZTogZnVuY3Rpb24gKHNvdXJjZTogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIHNvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIChzb3VyY2UuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpIGFzIEpTT05Nb2RlbCk7XG5cdFx0Y29uc3QgdmFsdWVzID1cblx0XHRcdGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgfHwgW107XG5cblx0XHRpZiAodHJhbnNDdHggJiYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVmFsdWVIZWxwXCIgfHwgdmFsdWVzLmlucHV0VHlwZSA9PT0gXCJJbnB1dFdpdGhVbml0XCIpICYmICF2YWx1ZXMudmFsdWVMaXN0SW5mbykge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fc2V0VmFsdWVMaXN0SW5mbyh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoZmllbGRJbmZvTW9kZWwsIHByb3BlcnR5TmFtZSwgZmFsc2UsIHRydWUpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzKGZpZWxkSW5mb01vZGVsLCBwcm9wZXJ0eU5hbWUsIGZhbHNlLCB0cnVlKTtcblxuXHRcdGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gc291cmNlLmdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSgpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleShzb3VyY2UsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGZvcm1hdHRlZFZhbHVlKTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhbGwgZHJvcCBkb3ducyB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgdmFsdWVzID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzXCIpO1xuXHRcdGNvbnN0IHVuaXREYXRhID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGFcIik7XG5cdFx0Y29uc3QgZmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG5cdFx0Y29uc3QgdW5pdEZpZWxkUGF0aHMgPSBPYmplY3Qua2V5cyh1bml0RGF0YSk7XG5cblx0XHRmaWVsZFBhdGhzLmZvckVhY2goXG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMuYmluZChcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycyxcblx0XHRcdFx0ZmllbGRJbmZvTW9kZWwsXG5cdFx0XHRcdFwiL3ZhbHVlcy9cIixcblx0XHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0XHRyZXNldFZhbHVlcyxcblx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHQpXG5cdFx0KTtcblx0XHR1bml0RmllbGRQYXRocy5mb3JFYWNoKFxuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlSW5QYXJhbWV0ZXJTdWdnZXRpb25zLmJpbmQoXG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMsXG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0XHRcIi91bml0RGF0YS9cIixcblx0XHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0XHRyZXNldFZhbHVlcyxcblx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhIGRyb3AgZG93biB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBzcmNQcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwYXRoUHJlZml4IFBhdGggaW4gdGhlIHJ1bnRpbWUgbW9kZWwuXG5cdCAqIEBwYXJhbSBzcmNQcm9wZXJ0eU5hbWUgVGhlIEluUGFyYW1ldGVyIFByb3BlcnR5IHBhdGguXG5cdCAqIEBwYXJhbSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIGtlZXBFeGlzdGluZ1NlbGVjdGlvbiBTaG91bGQgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbiBiZWZvcmUgdXBkYXRlIHJlbWFpbi5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoIHRoYXQgbmVlZHMgdXBkYXRlIG9mIHN1Z2dlc3Rpb25zLlxuXHQgKi9cblx0X3VwZGF0ZUluUGFyYW1ldGVyU3VnZ2V0aW9uczogZnVuY3Rpb24gKFxuXHRcdGZpZWxkSW5mb01vZGVsOiBKU09OTW9kZWwsXG5cdFx0cGF0aFByZWZpeDogc3RyaW5nLFxuXHRcdHNyY1Byb3BlcnR5TmFtZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhbixcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZ1xuXHQpIHtcblx0XHRjb25zdCB2YWx1ZUxpc3RJbmZvID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cGF0aFByZWZpeCArIHByb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2ApO1xuXHRcdGlmICh2YWx1ZUxpc3RJbmZvICYmIHNyY1Byb3BlcnR5TmFtZSAhPSBwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHZhbHVlTGlzdEluZm8uaW5QYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKGluUGFyYW1ldGVycyAmJiBpblBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJiBpblBhcmFtZXRlcnMuaW5jbHVkZXMoc3JjUHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCArIHByb3BlcnR5TmFtZSwgcmVzZXRWYWx1ZXMsIGtlZXBFeGlzdGluZ1NlbGVjdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGFsbCBPdXRQYXJhbWV0ZXIncyBkcm9wIGRvd25zIG9mIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoT3V0UGFyYW1ldGVyczogZnVuY3Rpb24gKFxuXHRcdGZpZWxkSW5mb01vZGVsOiBKU09OTW9kZWwsXG5cdFx0cHJvcGVydHlOYW1lOiBzdHJpbmcsXG5cdFx0cmVzZXRWYWx1ZXM6IGJvb2xlYW4sXG5cdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uOiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IHZhbHVlTGlzdEluZm8gPVxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKSB8fFxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2ApO1xuXG5cdFx0aWYgKHZhbHVlTGlzdEluZm8gJiYgdmFsdWVMaXN0SW5mby5vdXRQYXJhbWV0ZXJzKSB7XG5cdFx0XHRjb25zdCBvdXRQYXJhbWV0ZXJzID0gdmFsdWVMaXN0SW5mby5vdXRQYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKG91dFBhcmFtZXRlcnMubGVuZ3RoICYmIG91dFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zKG91dFBhcmFtZXRlcnMsIGZpZWxkSW5mb01vZGVsLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdFx0Y29uc3QgcGF0aFByZWZpeCA9XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKTtcblx0XHRcdFx0aWYgKHBhdGhQcmVmaXgpIHtcblx0XHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGEgZHJvcCBkb3duIHdpdGggSW5QYXJhbWV0ZXIgYXMgdGhlIHNyY1Byb3BlcnR5TmFtZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBvdXRQYXJhbWV0ZXJzIFN0cmluZyBhcnJhcnkgb2YgT3V0UGFyYW1ldGVyIHByb3BlcnR5IHBhdGhzLlxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIGtlZXBFeGlzdGluZ1NlbGVjdGlvbiBTaG91bGQgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbiBiZWZvcmUgdXBkYXRlIHJlbWFpbi5cblx0ICovXG5cdF91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zOiBmdW5jdGlvbiAoXG5cdFx0b3V0UGFyYW1ldGVyczogc3RyaW5nW10sXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KSB7XG5cdFx0Y29uc3QgdmFsdWVzID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzXCIpO1xuXHRcdGNvbnN0IHVuaXREYXRhID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGFcIik7XG5cdFx0Y29uc3QgZmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG5cdFx0Y29uc3QgdW5pdEZpZWxkUGF0aHMgPSBPYmplY3Qua2V5cyh1bml0RGF0YSk7XG5cblx0XHRvdXRQYXJhbWV0ZXJzLmZvckVhY2goKG91dFBhcmFtZXRlcjogc3RyaW5nKSA9PiB7XG5cdFx0XHRpZiAoZmllbGRQYXRocy5pbmNsdWRlcyhvdXRQYXJhbWV0ZXIpKSB7XG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zKGZpZWxkSW5mb01vZGVsLCBgL3ZhbHVlcy8ke291dFBhcmFtZXRlcn1gLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdH0gZWxzZSBpZiAodW5pdEZpZWxkUGF0aHMuaW5jbHVkZXMob3V0UGFyYW1ldGVyKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhcblx0XHRcdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdFx0XHRgL3VuaXREYXRhLyR7b3V0UGFyYW1ldGVyfWAsXG5cdFx0XHRcdFx0cmVzZXRWYWx1ZXMsXG5cdFx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzdWdnZXN0cyBmb3IgYSBkcm9wIGRvd24gb2YgYSBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIGZpZWxkUGF0aEFic29sdXRlIENvbXBsZXRlIHJ1bnRpbWUgcHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRmaWVsZFBhdGhBYnNvbHV0ZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhblxuXHQpIHtcblx0XHRjb25zdCBvcHRpb25zID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoZmllbGRQYXRoQWJzb2x1dGUpO1xuXHRcdGNvbnN0IGRlZmF1bHRPcHRpb25zID0gb3B0aW9ucy5kZWZhdWx0T3B0aW9ucztcblx0XHRjb25zdCBzZWxlY3RlZEtleSA9IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAke2ZpZWxkUGF0aEFic29sdXRlfS9zZWxlY3RlZEtleWApO1xuXHRcdGNvbnN0IGV4aXN0aW5nU2VsZWN0aW9uID0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uICYmIG9wdGlvbnMuZmluZCgob3B0aW9uOiBhbnkpID0+IG9wdGlvbi5rZXkgPT09IHNlbGVjdGVkS2V5KTtcblx0XHRpZiAocmVzZXRWYWx1ZXMpIHtcblx0XHRcdGNvbnN0IHNlbGVjdE9wdGlvbnMgPSBvcHRpb25zLnNlbGVjdE9wdGlvbnM7XG5cdFx0XHRvcHRpb25zLmxlbmd0aCA9IDA7XG5cdFx0XHRkZWZhdWx0T3B0aW9ucy5mb3JFYWNoKChkZWZhdWx0T3B0aW9uOiBhbnkpID0+IG9wdGlvbnMucHVzaChkZWZhdWx0T3B0aW9uKSk7XG5cdFx0XHRzZWxlY3RPcHRpb25zLmZvckVhY2goKHNlbGVjdE9wdGlvbjogYW55KSA9PiBvcHRpb25zLnB1c2goc2VsZWN0T3B0aW9uKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9wdGlvbnMubGVuZ3RoID0gMDtcblx0XHRcdGRlZmF1bHRPcHRpb25zLmZvckVhY2goKGRlZmF1bHRPcHRpb246IGFueSkgPT4gb3B0aW9ucy5wdXNoKGRlZmF1bHRPcHRpb24pKTtcblx0XHR9XG5cblx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShmaWVsZFBhdGhBYnNvbHV0ZSwgb3B0aW9ucyk7XG5cblx0XHRpZiAoZXhpc3RpbmdTZWxlY3Rpb24gJiYgIW9wdGlvbnMuaW5jbHVkZXMoZXhpc3RpbmdTZWxlY3Rpb24pKSB7XG5cdFx0XHRvcHRpb25zLnB1c2goZXhpc3RpbmdTZWxlY3Rpb24pO1xuXHRcdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoYCR7ZmllbGRQYXRoQWJzb2x1dGV9L3NlbGVjdGVkS2V5YCwgc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIEluIGFuZCBPdXQgUGFyYW1ldGVycyBpbiB0aGUgTUVELlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHRyYW5zQ3R4IFRoZSB0cmFuc2llbnQgY29udGV4dCBvZiB0aGUgTUVELlxuXHQgKiBAcGFyYW0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHBhcmFtIGZpZWxkSW5mb01vZGVsIFJ1bnRpbWUgbW9kZWwgd2l0aCBwYXJhbWV0ZXJzIHN0b3JlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRfc2V0VmFsdWVMaXN0SW5mbzogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IEZpZWxkLCBmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi92YWx1ZXMvXCIpIHx8XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi91bml0RGF0YS9cIik7XG5cblx0XHRpZiAoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cHJvcFBhdGh9JHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCB2YWx1ZUxpc3RJbmZvID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cHJvcFBhdGh9JHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKTtcblxuXHRcdGlmICghdmFsdWVMaXN0SW5mbykge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fcmVxdWVzdFZhbHVlTGlzdCh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgYW5kIHVwZGF0ZSBJbiBhbmQgT3V0IFBhcmFtZXRlcnMgaW4gdGhlIE1FRC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB0cmFuc0N0eCBUaGUgdHJhbnNpZW50IGNvbnRleHQgb2YgdGhlIE1FRC5cblx0ICogQHBhcmFtIHNvdXJjZSBNREMgZmllbGQuXG5cdCAqIEBwYXJhbSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKi9cblx0X3JlcXVlc3RWYWx1ZUxpc3Q6IGZ1bmN0aW9uICh0cmFuc0N0eDogQ29udGV4dCwgc291cmNlOiBGaWVsZCwgZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBtZXRhUGF0aCA9IE1vZGVsSGVscGVyLmdldE1ldGFQYXRoRm9yQ29udGV4dCh0cmFuc0N0eCk7XG5cdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gKG1ldGFQYXRoICYmIGAke21ldGFQYXRofS8ke3Byb3BlcnR5TmFtZX1gKSBhcyBzdHJpbmc7XG5cdFx0Y29uc3QgZGVwZW5kZW50cyA9IHNvdXJjZT8uZ2V0RGVwZW5kZW50cygpO1xuXHRcdGNvbnN0IGZpZWxkSGVscCA9IHNvdXJjZT8uZ2V0RmllbGRIZWxwKCk7XG5cdFx0Y29uc3QgZmllbGRWYWx1ZUhlbHAgPSBkZXBlbmRlbnRzPy5maW5kKChkZXBlbmRlbnQ6IGFueSkgPT4gZGVwZW5kZW50LmdldElkKCkgPT09IGZpZWxkSGVscCkgYXMgVmFsdWVIZWxwO1xuXHRcdGNvbnN0IHBheWxvYWQgPSAoZmllbGRWYWx1ZUhlbHAuZ2V0RGVsZWdhdGUoKSBhcyBhbnkpPy5wYXlsb2FkIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0aWYgKCFmaWVsZFZhbHVlSGVscD8uZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0ZmllbGRWYWx1ZUhlbHA/LnNldEJpbmRpbmdDb250ZXh0KHRyYW5zQ3R4KTtcblx0XHR9XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gdHJhbnNDdHguZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0XHRWYWx1ZUxpc3RIZWxwZXIuY3JlYXRlVkhVSU1vZGVsKGZpZWxkVmFsdWVIZWxwLCBwcm9wZXJ0eVBhdGgsIG1ldGFNb2RlbCk7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9IFZhbHVlTGlzdEhlbHBlci5nZXRWYWx1ZUxpc3RJbmZvKGZpZWxkVmFsdWVIZWxwLCBwcm9wZXJ0eVBhdGgsIHBheWxvYWQpO1xuXG5cdFx0dmFsdWVMaXN0SW5mb1xuXHRcdFx0LnRoZW4oKHZMaW5mb3M6IFZhbHVlTGlzdEluZm9bXSkgPT4ge1xuXHRcdFx0XHRjb25zdCB2TGluZm8gPSB2TGluZm9zWzBdO1xuXHRcdFx0XHRjb25zdCBwcm9wUGF0aCA9XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3ZhbHVlcy9cIikgfHxcblx0XHRcdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi91bml0RGF0YS9cIik7XG5cdFx0XHRcdGNvbnN0IGluZm86IGFueSA9IHtcblx0XHRcdFx0XHRpblBhcmFtZXRlcnM6XG5cdFx0XHRcdFx0XHR2TGluZm8udmhQYXJhbWV0ZXJzICYmIFZhbHVlTGlzdEhlbHBlci5nZXRJblBhcmFtZXRlcnModkxpbmZvLnZoUGFyYW1ldGVycykubWFwKChpblBhcmFtOiBhbnkpID0+IGluUGFyYW0uaGVscFBhdGgpLFxuXHRcdFx0XHRcdG91dFBhcmFtZXRlcnM6XG5cdFx0XHRcdFx0XHR2TGluZm8udmhQYXJhbWV0ZXJzICYmXG5cdFx0XHRcdFx0XHRWYWx1ZUxpc3RIZWxwZXIuZ2V0T3V0UGFyYW1ldGVycyh2TGluZm8udmhQYXJhbWV0ZXJzKS5tYXAoKG91dFBhcmFtOiBhbnkpID0+IG91dFBhcmFtLmhlbHBQYXRoKVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShgJHtwcm9wUGF0aH0ke3Byb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2AsIGluZm8pO1xuXHRcdFx0XHRpZiAoaW5mby5vdXRQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0TG9nLndhcm5pbmcoYE1hc3MgRWRpdDogQ291bGRuJ3QgbG9hZCB2YWx1ZUxpc3QgaW5mbyBmb3IgJHtwcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHR9KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IGZpZWxkIGhlbHAgY29udHJvbCBmcm9tIE1EQyBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB0cmFuc0N0eCBUaGUgdHJhbnNpZW50IGNvbnRleHQgb2YgdGhlIE1FRC5cblx0ICogQHBhcmFtIHNvdXJjZSBNREMgZmllbGQuXG5cdCAqIEByZXR1cm5zIEZpZWxkIEhlbHAgY29udHJvbC5cblx0ICovXG5cdF9nZXRWYWx1ZUhlbHA6IGZ1bmN0aW9uICh0cmFuc0N0eDogQ29udGV4dCwgc291cmNlOiBGaWVsZCk6IGFueSB7XG5cdFx0Y29uc3QgZGVwZW5kZW50cyA9IHNvdXJjZT8uZ2V0RGVwZW5kZW50cygpO1xuXHRcdGNvbnN0IGZpZWxkSGVscCA9IHNvdXJjZT8uZ2V0RmllbGRIZWxwKCk7XG5cdFx0cmV0dXJuIGRlcGVuZGVudHM/LmZpbmQoKGRlcGVuZGVudDogYW55KSA9PiBkZXBlbmRlbnQuZ2V0SWQoKSA9PT0gZmllbGRIZWxwKTtcblx0fSxcblxuXHQvKipcblx0ICogQ29sbGVkIG9uIGRyb3AgZG93biBzZWxlY3Rpb24gb2YgVkhEIG9wdGlvbi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgQ3VzdG9tIE1hc3MgRWRpdCBTZWxlY3QgY29udHJvbC5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKiBAcGFyYW0gc2VsZWN0S2V5IFByZXZpb3VzIGtleSBiZWZvcmUgdGhlIFZIRCB3YXMgc2VsZWN0ZWQuXG5cdCAqL1xuXHRfb25WSFNlbGVjdDogZnVuY3Rpb24gKHNvdXJjZTogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgc2VsZWN0S2V5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gVkhEIHNlbGVjdGVkLlxuXG5cdFx0Y29uc3QgZmllbGRJbmZvTW9kZWwgPSBzb3VyY2UgJiYgc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKTtcblx0XHRjb25zdCBwcm9wUGF0aCA9XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgXCIvdmFsdWVzL1wiKSB8fFxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgXCIvdW5pdERhdGEvXCIpO1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgZmllbGRWYWx1ZUhlbHAgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZUhlbHAodHJhbnNDdHgsIHNvdXJjZS5nZXRQYXJlbnQoKSk7XG5cdFx0aWYgKCFmaWVsZFZhbHVlSGVscD8uZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0ZmllbGRWYWx1ZUhlbHA/LnNldEJpbmRpbmdDb250ZXh0KHRyYW5zQ3R4KTtcblx0XHR9XG5cdFx0c291cmNlLmZpcmVWYWx1ZUhlbHBSZXF1ZXN0KCk7XG5cblx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShgJHtwcm9wUGF0aCArIHByb3BlcnR5TmFtZX0vc2VsZWN0ZWRLZXlgLCBzZWxlY3RLZXkpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIFByb3BlcnR5IG5hbWUgZnJvbSBzZWxlY3Rpb24ga2V5LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIGtleSBTZWxlY3Rpb24ga2V5LlxuXHQgKiBAcmV0dXJucyBQcm9wZXJ0eSBuYW1lLlxuXHQgKi9cblx0X2dldFByb3BlcnR5TmFtZUZyb21LZXk6IGZ1bmN0aW9uIChrZXk6IHN0cmluZykge1xuXHRcdGxldCBwcm9wZXJ0eU5hbWUgPSBcIlwiO1xuXHRcdGlmIChrZXkuc3RhcnRzV2l0aChcIkRlZmF1bHQvXCIpIHx8IGtleS5zdGFydHNXaXRoKFwiQ2xlYXJGaWVsZFZhbHVlL1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIlVzZVZhbHVlSGVscFZhbHVlL1wiKSkge1xuXHRcdFx0cHJvcGVydHlOYW1lID0ga2V5LnN1YnN0cmluZyhrZXkuaW5kZXhPZihcIi9cIikgKyAxKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcGVydHlOYW1lID0ga2V5LnN1YnN0cmluZygwLCBrZXkubGFzdEluZGV4T2YoXCIvXCIpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHByb3BlcnR5TmFtZTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHNlbGVjdGlvbiB0byBDdXN0b20gTWFzcyBFZGl0IFNlbGVjdCBmcm9tIE1EQyBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgTURDIGZpZWxkLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byB1cGRhdGUuXG5cdCAqIEBwYXJhbSBmdWxsVGV4dCBGdWxsIHRleHQgdG8gdXNlLlxuXHQgKi9cblx0X3VwZGF0ZVNlbGVjdEtleTogZnVuY3Rpb24gKHNvdXJjZTogRmllbGQsIHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBmdWxsVGV4dD86IGFueSk6IHZvaWQge1xuXHRcdC8vIENhbGxlZCBmb3Jcblx0XHQvLyAxLiBWSEQgcHJvcGVydHkgY2hhbmdlXG5cdFx0Ly8gMi4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMy4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3QgY29tYm9Cb3ggPSBzb3VyY2UuZ2V0Q29udGVudCgpIGFzIENvbWJvQm94O1xuXHRcdGlmICghY29tYm9Cb3ggfHwgIXByb3BlcnR5TmFtZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRsZXQga2V5OiBzdHJpbmcgPSBjb21ib0JveC5nZXRTZWxlY3RlZEtleSgpO1xuXHRcdGlmICgoa2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIikpICYmICF2YWx1ZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZvcm1hdHRlZFRleHQgPSBNYXNzRWRpdEhhbmRsZXJzLl92YWx1ZUV4aXN0cyhmdWxsVGV4dCkgPyBmdWxsVGV4dCA6IHZhbHVlO1xuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIChzb3VyY2UuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpIGFzIEpTT05Nb2RlbCk7XG5cdFx0Y29uc3QgdmFsdWVzID1cblx0XHRcdGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgfHwgW107XG5cdFx0Y29uc3QgcHJvcFBhdGggPVxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3ZhbHVlcy9cIikgfHxcblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3VuaXREYXRhL1wiKTtcblxuXHRcdGNvbnN0IHJlbGF0ZWRGaWVsZCA9IHZhbHVlcy5maW5kKChmaWVsZERhdGE6IGFueSkgPT4gZmllbGREYXRhPy50ZXh0SW5mbz8udmFsdWUgPT09IHZhbHVlIHx8IGZpZWxkRGF0YS50ZXh0ID09PSB2YWx1ZSk7XG5cblx0XHRpZiAocmVsYXRlZEZpZWxkKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGZ1bGxUZXh0ICYmXG5cdFx0XHRcdHJlbGF0ZWRGaWVsZC50ZXh0SW5mbyAmJlxuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZGVzY3JpcHRpb25QYXRoICYmXG5cdFx0XHRcdChyZWxhdGVkRmllbGQudGV4dCAhPSBmb3JtYXR0ZWRUZXh0IHx8IHJlbGF0ZWRGaWVsZC50ZXh0SW5mby5mdWxsVGV4dCAhPSBmb3JtYXR0ZWRUZXh0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFVwZGF0ZSB0aGUgZnVsbCB0ZXh0IG9ubHkgd2hlbiBwcm92aWRlZC5cblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHQgPSBmb3JtYXR0ZWRUZXh0O1xuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZnVsbFRleHQgPSBmb3JtYXR0ZWRUZXh0O1xuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZGVzY3JpcHRpb24gPSBzb3VyY2UuZ2V0QWRkaXRpb25hbFZhbHVlKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVsYXRlZEZpZWxkLmtleSA9PT0ga2V5KSB7XG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGAke3Byb3BQYXRoICsgcHJvcGVydHlOYW1lfS9zZWxlY3RlZEtleWAsIGtleSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGtleSA9IHJlbGF0ZWRGaWVsZC5rZXk7XG5cdFx0fSBlbHNlIGlmIChbdW5kZWZpbmVkLCBudWxsLCBcIlwiXS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcblx0XHRcdGtleSA9IGAke3Byb3BlcnR5TmFtZX0vJHt2YWx1ZX1gO1xuXHRcdFx0Y29uc3Qgc2VsZWN0aW9uSW5mbyA9IHtcblx0XHRcdFx0dGV4dDogZm9ybWF0dGVkVGV4dCxcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHR0ZXh0SW5mbzoge1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBzb3VyY2UuZ2V0QWRkaXRpb25hbFZhbHVlKCksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25QYXRoOiB2YWx1ZXMgJiYgdmFsdWVzLnRleHRJbmZvICYmIHZhbHVlcy50ZXh0SW5mby5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0ZnVsbFRleHQ6IGZvcm1hdHRlZFRleHQsXG5cdFx0XHRcdFx0dGV4dEFycmFuZ2VtZW50OiBzb3VyY2UuZ2V0RGlzcGxheSgpLFxuXHRcdFx0XHRcdHZhbHVlOiBzb3VyY2UuZ2V0VmFsdWUoKSxcblx0XHRcdFx0XHR2YWx1ZVBhdGg6IHByb3BlcnR5TmFtZVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0dmFsdWVzLnB1c2goc2VsZWN0aW9uSW5mbyk7XG5cdFx0XHR2YWx1ZXMuc2VsZWN0T3B0aW9ucyA9IHZhbHVlcy5zZWxlY3RPcHRpb25zIHx8IFtdO1xuXHRcdFx0dmFsdWVzLnNlbGVjdE9wdGlvbnMucHVzaChzZWxlY3Rpb25JbmZvKTtcblx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KHByb3BQYXRoICsgcHJvcGVydHlOYW1lLCB2YWx1ZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRrZXkgPSBgRGVmYXVsdC8ke3Byb3BlcnR5TmFtZX1gO1xuXHRcdH1cblxuXHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGAke3Byb3BQYXRoICsgcHJvcGVydHlOYW1lfS9zZWxlY3RlZEtleWAsIGtleSk7XG5cdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlUmVzdWx0cyhjb21ib0JveCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBWYWx1ZSBmcm9tIERyb3AgZG93bi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgRHJvcCBkb3duIGNvbnRyb2wuXG5cdCAqIEByZXR1cm5zIFZhbHVlIG9mIHNlbGVjdGlvbi5cblx0ICovXG5cdF9nZXRWYWx1ZTogZnVuY3Rpb24gKHNvdXJjZTogQ29udHJvbCkge1xuXHRcdHJldHVybiBzb3VyY2UuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgPT09IFwic2FwLmZlLmNvcmUuY29udHJvbHMuTWFzc0VkaXRTZWxlY3RcIlxuXHRcdFx0PyAoc291cmNlIGFzIFNlbGVjdCkuZ2V0U2VsZWN0ZWRJdGVtKCk/LmdldFRleHQoKVxuXHRcdFx0OiAoc291cmNlIGFzIENvbWJvQm94KS5nZXRWYWx1ZSgpO1xuXHR9LFxuXG5cdF9nZXRWYWx1ZU9uRW1wdHk6IGZ1bmN0aW9uIChvU291cmNlOiBhbnksIGZpZWxkc0luZm9Nb2RlbDogSlNPTk1vZGVsLCB2YWx1ZTogYW55LCBzUHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHRpZiAoIXZhbHVlKSB7XG5cdFx0XHRjb25zdCB2YWx1ZXMgPVxuXHRcdFx0XHRmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtzUHJvcGVydHlOYW1lfWApIHx8IGZpZWxkc0luZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7c1Byb3BlcnR5TmFtZX1gKSB8fCBbXTtcblx0XHRcdGlmICh2YWx1ZXMudW5pdFByb3BlcnR5KSB7XG5cdFx0XHRcdHZhbHVlID0gMDtcblx0XHRcdFx0b1NvdXJjZS5zZXRWYWx1ZSh2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0XHR2YWx1ZSA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH0sXG5cblx0X3ZhbHVlRXhpc3RzOiBmdW5jdGlvbiAodmFsdWU6IGFueSkge1xuXHRcdHJldHVybiB2YWx1ZSAhPSB1bmRlZmluZWQgJiYgdmFsdWUgIT0gbnVsbDtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlcyBzZWxlY3Rpb25zIHRvIHJ1bnRpbWUgbW9kZWwuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gb1NvdXJjZSBEcm9wIGRvd24gY29udHJvbC5cblx0ICogQHBhcmFtIGFQYXJhbXMgUGFydHMgb2Yga2V5IGluIHJ1bnRpbWUgbW9kZWwuXG5cdCAqIEBwYXJhbSB1cGRhdGVUcmFuc0N0eCBTaG91bGQgdHJhbnNpZW50IGNvbnRleHQgYmUgdXBkYXRlZCB3aXRoIHRoZSB2YWx1ZS5cblx0ICovXG5cdF91cGRhdGVSZXN1bHRzOiBmdW5jdGlvbiAob1NvdXJjZTogYW55LCBhUGFyYW1zOiBBcnJheTxzdHJpbmc+ID0gW10sIHVwZGF0ZVRyYW5zQ3R4OiBib29sZWFuKSB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBwcm9wZXJ0eSBjaGFuZ2UuXG5cdFx0Ly8gMi4gT3V0IHBhcmFtZXRlci5cblx0XHQvLyAzLiB0cmFuc2llbnQgY29udGV4dCBwcm9wZXJ0eSBjaGFuZ2UuXG5cdFx0Y29uc3QgZmllbGRzSW5mb01vZGVsID0gb1NvdXJjZSAmJiBvU291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKTtcblx0XHRjb25zdCBvRmllbGRzSW5mb0RhdGEgPSBmaWVsZHNJbmZvTW9kZWwgJiYgZmllbGRzSW5mb01vZGVsLmdldERhdGEoKTtcblx0XHRsZXQgdmFsdWUgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZShvU291cmNlIGFzIENvbnRyb2wpO1xuXHRcdGFQYXJhbXMgPSBhUGFyYW1zLmxlbmd0aCA+IDAgPyBhUGFyYW1zIDogb1NvdXJjZSAmJiBvU291cmNlLmdldFNlbGVjdGVkS2V5KCkgJiYgb1NvdXJjZS5nZXRTZWxlY3RlZEtleSgpLnNwbGl0KFwiL1wiKTtcblxuXHRcdGxldCBvRGF0YU9iamVjdDtcblx0XHRjb25zdCBzUHJvcGVydHlOYW1lID0gb1NvdXJjZS5kYXRhKFwiZmllbGRQYXRoXCIpO1xuXG5cdFx0aWYgKGFQYXJhbXNbMF0gPT09IFwiRGVmYXVsdFwiKSB7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IGFQYXJhbXNbMV0sXG5cdFx0XHRcdHZhbHVlOiBhUGFyYW1zWzBdXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoYVBhcmFtc1swXSA9PT0gXCJDbGVhckZpZWxkVmFsdWVcIikge1xuXHRcdFx0dmFsdWUgPSBcIlwiO1xuXHRcdFx0dmFsdWUgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZU9uRW1wdHkob1NvdXJjZSwgZmllbGRzSW5mb01vZGVsLCB2YWx1ZSwgc1Byb3BlcnR5TmFtZSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IGFQYXJhbXNbMV0sXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKCFhUGFyYW1zKSB7XG5cdFx0XHR2YWx1ZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFZhbHVlT25FbXB0eShvU291cmNlLCBmaWVsZHNJbmZvTW9kZWwsIHZhbHVlLCBzUHJvcGVydHlOYW1lKTtcblx0XHRcdG9EYXRhT2JqZWN0ID0ge1xuXHRcdFx0XHRrZXlWYWx1ZTogc1Byb3BlcnR5TmFtZSxcblx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBhUGFyYW1zLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKTtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWVzID1cblx0XHRcdFx0ZmllbGRzSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8IGZpZWxkc0luZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApIHx8IFtdO1xuXG5cdFx0XHRjb25zdCByZWxhdGVkRmllbGQgPSAocHJvcGVydHlWYWx1ZXMgfHwgW10pLmZpbmQoZnVuY3Rpb24gKG9GaWVsZERhdGE6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0ZpZWxkRGF0YT8udGV4dEluZm8/LnZhbHVlID09PSB2YWx1ZSB8fCBvRmllbGREYXRhLnRleHQgPT09IHZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IHByb3BlcnR5TmFtZSxcblx0XHRcdFx0dmFsdWU6XG5cdFx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvICYmIE1hc3NFZGl0SGFuZGxlcnMuX3ZhbHVlRXhpc3RzKHJlbGF0ZWRGaWVsZC50ZXh0SW5mby52YWx1ZSlcblx0XHRcdFx0XHRcdD8gcmVsYXRlZEZpZWxkLnRleHRJbmZvLnZhbHVlXG5cdFx0XHRcdFx0XHQ6IHJlbGF0ZWRGaWVsZC50ZXh0XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRsZXQgYkV4aXN0aW5nRWxlbWVudGluZGV4ID0gLTE7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKG9GaWVsZHNJbmZvRGF0YS5yZXN1bHRzW2ldLmtleVZhbHVlID09PSBvRGF0YU9iamVjdC5rZXlWYWx1ZSkge1xuXHRcdFx0XHRiRXhpc3RpbmdFbGVtZW50aW5kZXggPSBpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoYkV4aXN0aW5nRWxlbWVudGluZGV4ICE9PSAtMSkge1xuXHRcdFx0b0ZpZWxkc0luZm9EYXRhLnJlc3VsdHNbYkV4aXN0aW5nRWxlbWVudGluZGV4XSA9IG9EYXRhT2JqZWN0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5wdXNoKG9EYXRhT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKHVwZGF0ZVRyYW5zQ3R4ICYmICFvRGF0YU9iamVjdC5rZXlWYWx1ZS5pbmNsdWRlcyhcIi9cIikpIHtcblx0XHRcdGNvbnN0IHRyYW5zQ3R4ID0gb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0aWYgKGFQYXJhbXNbMF0gPT09IFwiRGVmYXVsdFwiIHx8IGFQYXJhbXNbMF0gPT09IFwiQ2xlYXJGaWVsZFZhbHVlXCIpIHtcblx0XHRcdFx0dHJhbnNDdHguc2V0UHJvcGVydHkob0RhdGFPYmplY3Qua2V5VmFsdWUsIG51bGwpO1xuXHRcdFx0fSBlbHNlIGlmIChvRGF0YU9iamVjdCkge1xuXHRcdFx0XHR0cmFuc0N0eC5zZXRQcm9wZXJ0eShvRGF0YU9iamVjdC5rZXlWYWx1ZSwgb0RhdGFPYmplY3QudmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFzc0VkaXRIYW5kbGVycztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7OztFQXVCQSxJQUFNQSxnQkFBcUIsR0FBRztJQUM3QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLHFCQUFxQixFQUFFLFVBQVVDLFFBQVYsRUFBeUJDLFlBQXpCLEVBQStDQyxVQUEvQyxFQUFtRTtNQUN6RjtNQUNBO01BQ0E7TUFFQSxJQUFNQyxNQUFNLEdBQUdDLElBQUksQ0FBQ0MsSUFBTCxDQUFVSCxVQUFWLENBQWY7TUFDQSxJQUFNSSxRQUFRLEdBQUdILE1BQU0sSUFBS0EsTUFBTSxDQUFDSSxpQkFBUCxFQUE1QjtNQUNBLElBQU1DLGNBQWMsR0FBR0wsTUFBTSxJQUFLQSxNQUFNLENBQUNNLFFBQVAsQ0FBZ0IsWUFBaEIsQ0FBbEM7TUFDQSxJQUFNQyxNQUFN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
|
|
507
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNYXNzRWRpdEhhbmRsZXJzIiwiY29udGV4dFByb3BlcnR5Q2hhbmdlIiwibmV3VmFsdWUiLCJkYXRhUHJvcGVydHkiLCJtZGNGaWVsZElkIiwic291cmNlIiwiQ29yZSIsImJ5SWQiLCJ0cmFuc0N0eCIsImdldEJpbmRpbmdDb250ZXh0IiwiZmllbGRJbmZvTW9kZWwiLCJnZXRNb2RlbCIsInZhbHVlcyIsImdldFByb3BlcnR5IiwiaW5wdXRUeXBlIiwidmFsdWVMaXN0SW5mbyIsIl9zZXRWYWx1ZUxpc3RJbmZvIiwiaXNEaWFsb2dPcGVuIiwiZ2V0VmlzaWJsZSIsIl91cGRhdGVTZWxlY3RLZXkiLCJoYW5kbGVNRENGaWVsZENoYW5nZSIsImV2ZW50IiwicHJvcGVydHlOYW1lIiwiZ2V0U291cmNlIiwiY2hhbmdlUHJvbWlzZSIsImdldFBhcmFtZXRlciIsImNvbWJvQm94IiwiZ2V0Q29udGVudCIsInRoZW4iLCJfdXBkYXRlU2VsZWN0S2V5Rm9yTURDRmllbGRDaGFuZ2UiLCJiaW5kIiwiY2F0Y2giLCJlcnIiLCJMb2ciLCJ3YXJuaW5nIiwiaGFuZGxlU2VsZWN0aW9uQ2hhbmdlIiwia2V5IiwiZ2V0U2VsZWN0ZWRLZXkiLCJwYXJhbXMiLCJzcGxpdCIsInByZXZJdGVtIiwic2VsZWN0S2V5IiwiZ2V0S2V5Iiwic2xpY2UiLCJqb2luIiwiX29uVkhTZWxlY3QiLCJfZ2V0UHJvcGVydHlOYW1lRnJvbUtleSIsIl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aEluUGFyYW1ldGVycyIsInN0YXJ0c1dpdGgiLCJfdXBkYXRlU3VnZ2VzdGlvbkZvckZpZWxkc1dpdGhPdXRQYXJhbWV0ZXJzIiwiX3VwZGF0ZVJlc3VsdHMiLCJ2YWx1ZSIsImZvcm1hdHRlZFZhbHVlIiwiZ2V0Rm9ybUZvcm1hdHRlZFZhbHVlIiwicmVzZXRWYWx1ZXMiLCJrZWVwRXhpc3RpbmdTZWxlY3Rpb24iLCJ1bml0RGF0YSIsImZpZWxkUGF0aHMiLCJPYmplY3QiLCJrZXlzIiwidW5pdEZpZWxkUGF0aHMiLCJmb3JFYWNoIiwiX3VwZGF0ZUluUGFyYW1ldGVyU3VnZ2V0aW9ucyIsInBhdGhQcmVmaXgiLCJzcmNQcm9wZXJ0eU5hbWUiLCJpblBhcmFtZXRlcnMiLCJsZW5ndGgiLCJpbmNsdWRlcyIsIl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyIsIm91dFBhcmFtZXRlcnMiLCJfdXBkYXRlT3V0UGFyYW1ldGVyU3VnZ2V0aW9ucyIsIm91dFBhcmFtZXRlciIsImZpZWxkUGF0aEFic29sdXRlIiwib3B0aW9ucyIsImRlZmF1bHRPcHRpb25zIiwic2VsZWN0ZWRLZXkiLCJleGlzdGluZ1NlbGVjdGlvbiIsImZpbmQiLCJvcHRpb24iLCJzZWxlY3RPcHRpb25zIiwiZGVmYXVsdE9wdGlvbiIsInB1c2giLCJzZWxlY3RPcHRpb24iLCJzZXRQcm9wZXJ0eSIsInByb3BQYXRoIiwiX3JlcXVlc3RWYWx1ZUxpc3QiLCJtZXRhUGF0aCIsIk1vZGVsSGVscGVyIiwiZ2V0TWV0YVBhdGhGb3JDb250ZXh0IiwicHJvcGVydHlQYXRoIiwiZGVwZW5kZW50cyIsImdldERlcGVuZGVudHMiLCJmaWVsZEhlbHAiLCJnZXRGaWVsZEhlbHAiLCJmaWVsZFZhbHVlSGVscCIsImRlcGVuZGVudCIsImdldElkIiwicGF5bG9hZCIsImdldERlbGVnYXRlIiwic2V0QmluZGluZ0NvbnRleHQiLCJtZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJWYWx1ZUxpc3RIZWxwZXIiLCJjcmVhdGVWSFVJTW9kZWwiLCJnZXRWYWx1ZUxpc3RJbmZvIiwidkxpbmZvcyIsInZMaW5mbyIsImluZm8iLCJ2aFBhcmFtZXRlcnMiLCJnZXRJblBhcmFtZXRlcnMiLCJtYXAiLCJpblBhcmFtIiwiaGVscFBhdGgiLCJnZXRPdXRQYXJhbWV0ZXJzIiwib3V0UGFyYW0iLCJfZ2V0VmFsdWVIZWxwIiwiZ2V0UGFyZW50IiwiZmlyZVZhbHVlSGVscFJlcXVlc3QiLCJzdWJzdHJpbmciLCJpbmRleE9mIiwibGFzdEluZGV4T2YiLCJmdWxsVGV4dCIsImZvcm1hdHRlZFRleHQiLCJfdmFsdWVFeGlzdHMiLCJyZWxhdGVkRmllbGQiLCJmaWVsZERhdGEiLCJ0ZXh0SW5mbyIsInRleHQiLCJkZXNjcmlwdGlvblBhdGgiLCJkZXNjcmlwdGlvbiIsImdldEFkZGl0aW9uYWxWYWx1ZSIsInVuZGVmaW5lZCIsInNlbGVjdGlvbkluZm8iLCJ0ZXh0QXJyYW5nZW1lbnQiLCJnZXREaXNwbGF5IiwiZ2V0VmFsdWUiLCJ2YWx1ZVBhdGgiLCJfZ2V0VmFsdWUiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJnZXRTZWxlY3RlZEl0ZW0iLCJnZXRUZXh0IiwiX2dldFZhbHVlT25FbXB0eSIsIm9Tb3VyY2UiLCJmaWVsZHNJbmZvTW9kZWwiLCJzUHJvcGVydHlOYW1lIiwidW5pdFByb3BlcnR5Iiwic2V0VmFsdWUiLCJhUGFyYW1zIiwidXBkYXRlVHJhbnNDdHgiLCJvRmllbGRzSW5mb0RhdGEiLCJnZXREYXRhIiwib0RhdGFPYmplY3QiLCJkYXRhIiwia2V5VmFsdWUiLCJwcm9wZXJ0eVZhbHVlcyIsIm9GaWVsZERhdGEiLCJiRXhpc3RpbmdFbGVtZW50aW5kZXgiLCJpIiwicmVzdWx0cyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTWFzc0VkaXRIYW5kbGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnN0cnVjdG9yIGZvciBhIG5ldyBWaXN1YWwgRmlsdGVyIENvbnRhaW5lci5cbiAqIFVzZWQgZm9yIHZpc3VhbCBmaWx0ZXJzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtzSWRdIElEIGZvciB0aGUgbmV3IGNvbnRyb2wsIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGlmIG5vIElEIGlzIGdpdmVuXG4gKiBAZXh0ZW5kcyBzYXAudWkubWRjLmZpbHRlcmJhci5JRmlsdGVyQ29udGFpbmVyXG4gKiBAY2xhc3NcbiAqIEBwcml2YXRlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuY29udHJvbHMuZmlsdGVyYmFyLlZpc3VhbEZpbHRlckNvbnRhaW5lclxuICovXG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZUhlbHBQYXlsb2FkLCBWYWx1ZUxpc3RJbmZvIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvaW50ZXJuYWwvdmFsdWVoZWxwL1ZhbHVlTGlzdEhlbHBlck5ld1wiO1xuaW1wb3J0IFZhbHVlTGlzdEhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC92YWx1ZWhlbHAvVmFsdWVMaXN0SGVscGVyTmV3XCI7XG5pbXBvcnQgdHlwZSBDb21ib0JveCBmcm9tIFwic2FwL20vQ29tYm9Cb3hcIjtcbmltcG9ydCB0eXBlIFNlbGVjdCBmcm9tIFwic2FwL20vU2VsZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IHR5cGUgRmllbGQgZnJvbSBcInNhcC91aS9tZGMvRmllbGRcIjtcbmltcG9ydCB0eXBlIFZhbHVlSGVscCBmcm9tIFwic2FwL3VpL21kYy9WYWx1ZUhlbHBcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuXG5jb25zdCBNYXNzRWRpdEhhbmRsZXJzOiBhbnkgPSB7XG5cdC8qKlxuXHQgKiBDYWxsZWQgZm9yIHByb3BlcnR5IGNoYW5nZSBpbiB0aGUgdHJhbnNpZW50IGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gbmV3VmFsdWUgTmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIGRhdGFQcm9wZXJ0eSBGaW5hbCBjb250ZXh0IHJldHVybmVkIGFmdGVyIHRoZSBwYWdpbmF0b3IgYWN0aW9uXG5cdCAqIEBwYXJhbSBtZGNGaWVsZElkIEZpbmFsIGNvbnRleHQgcmV0dXJuZWQgYWZ0ZXIgdGhlIHBhZ2luYXRvciBhY3Rpb25cblx0ICovXG5cdGNvbnRleHRQcm9wZXJ0eUNoYW5nZTogZnVuY3Rpb24gKG5ld1ZhbHVlOiBhbnksIGRhdGFQcm9wZXJ0eTogc3RyaW5nLCBtZGNGaWVsZElkOiBzdHJpbmcpIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMi4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3Qgc291cmNlID0gQ29yZS5ieUlkKG1kY0ZpZWxkSWQpIGFzIEZpZWxkO1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIChzb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KTtcblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdGNvbnN0IHZhbHVlcyA9XG5cdFx0XHRmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke2RhdGFQcm9wZXJ0eX1gKSB8fCBmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7ZGF0YVByb3BlcnR5fWApIHx8IFtdO1xuXG5cdFx0aWYgKHRyYW5zQ3R4ICYmICh2YWx1ZXMuaW5wdXRUeXBlID09PSBcIklucHV0V2l0aFZhbHVlSGVscFwiIHx8IHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVW5pdFwiKSAmJiAhdmFsdWVzLnZhbHVlTGlzdEluZm8pIHtcblx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3NldFZhbHVlTGlzdEluZm8odHJhbnNDdHgsIHNvdXJjZSwgZmllbGRJbmZvTW9kZWwsIGRhdGFQcm9wZXJ0eSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXNEaWFsb2dPcGVuID0gZmllbGRJbmZvTW9kZWwgJiYgZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvaXNPcGVuXCIpO1xuXHRcdGlmICghaXNEaWFsb2dPcGVuIHx8ICFzb3VyY2UuZ2V0VmlzaWJsZSgpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlU2VsZWN0S2V5KHNvdXJjZSwgZGF0YVByb3BlcnR5LCBuZXdWYWx1ZSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3IgY2hhbmdlIGluIHRoZSBNREMgZmllbGQuXG5cdCAqIFRoaXMgaXMgY2FsbGVkIG9uIHNlbGVjdGlvbiBkb25lIHRocm91Z2ggVkhELlxuXHQgKiBUaGlzIGlzIG5vdCBjYWxsZWQgb24gY2hhbmdlIG9mIHRoZSBkcm9wZG93biBhcyB3ZSBhcmUgdXNpbmcgYSBjdXN0b20gTWFzc0VkaXRTZWxlY3QgY29udHJvbCBhbmQgbm90IGdlbmVyYWwgU2VsZWN0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIGV2ZW50IEV2ZW50IG9iamVjdCBmb3IgY2hhbmdlLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRoYW5kbGVNRENGaWVsZENoYW5nZTogZnVuY3Rpb24gKGV2ZW50OiBhbnksIHByb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBwcm9wZXJ0eSBjaGFuZ2UuXG5cblx0XHRjb25zdCBzb3VyY2UgPSBldmVudCAmJiBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCBjaGFuZ2VQcm9taXNlID0gZXZlbnQgJiYgZXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKTtcblx0XHRjb25zdCBjb21ib0JveCA9IHNvdXJjZS5nZXRDb250ZW50KCk7XG5cdFx0aWYgKCFjb21ib0JveCB8fCAhcHJvcGVydHlOYW1lKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y2hhbmdlUHJvbWlzZVxuXHRcdFx0LnRoZW4oTWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlU2VsZWN0S2V5Rm9yTURDRmllbGRDaGFuZ2UuYmluZChNYXNzRWRpdEhhbmRsZXJzLCBzb3VyY2UsIHByb3BlcnR5TmFtZSkpXG5cdFx0XHQuY2F0Y2goKGVycjogYW55KSA9PiB7XG5cdFx0XHRcdExvZy53YXJuaW5nKGBWSEQgc2VsZWN0aW9uIGNvdWxkbid0IGJlIHBvcHVsYXRlZCBpbiB0aGUgbWFzcyBlZGl0IGZpZWxkLiR7ZXJyfWApO1xuXHRcdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBmb3Igc2VsZWN0aW9uIGNoYW5nZSB0aHJvdWdoIHRoZSBkcm9wIGRvd24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZXZlbnQgRXZlbnQgb2JqZWN0IGZvciBjaGFuZ2UuXG5cdCAqL1xuXHRoYW5kbGVTZWxlY3Rpb25DaGFuZ2U6IGZ1bmN0aW9uIChldmVudDogYW55KSB7XG5cdFx0Ly8gQ2FsbGVkIGZvciBNYW51YWwgc2VsZWN0aW9uIGZyb20gZHJvcGRvd24oY29tYm9Cb3ggb3Igc2VsZWN0KVxuXHRcdC8vIDEuIFZIRCBzZWxlY3QuXG5cdFx0Ly8gMi4gQW55IHZhbHVlIGNoYW5nZSBpbiB0aGUgY29udHJvbC5cblxuXHRcdGNvbnN0IHNvdXJjZSA9IGV2ZW50ICYmIGV2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IGtleSA9IHNvdXJjZS5nZXRTZWxlY3RlZEtleSgpIGFzIHN0cmluZztcblx0XHRjb25zdCBwYXJhbXMgPSBzb3VyY2UgJiYga2V5ICYmIGtleS5zcGxpdChcIi9cIik7XG5cdFx0bGV0IHByb3BlcnR5TmFtZTtcblxuXHRcdGlmIChwYXJhbXNbMF0gPT09IFwiVXNlVmFsdWVIZWxwVmFsdWVcIikge1xuXHRcdFx0Y29uc3QgcHJldkl0ZW0gPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJwcmV2aW91c1NlbGVjdGVkSXRlbVwiKTtcblx0XHRcdGNvbnN0IHNlbGVjdEtleSA9IHByZXZJdGVtLmdldEtleSgpO1xuXHRcdFx0cHJvcGVydHlOYW1lID0gcGFyYW1zLnNsaWNlKDEpLmpvaW4oXCIvXCIpO1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fb25WSFNlbGVjdChzb3VyY2UsIHByb3BlcnR5TmFtZSwgc2VsZWN0S2V5KTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBmaWVsZEluZm9Nb2RlbCA9IHNvdXJjZSAmJiAoc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKSBhcyBKU09OTW9kZWwpO1xuXHRcdHByb3BlcnR5TmFtZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFByb3BlcnR5TmFtZUZyb21LZXkoa2V5KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aEluUGFyYW1ldGVycyhcblx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIiksXG5cdFx0XHR0cnVlXG5cdFx0KTtcblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoXG5cdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdHByb3BlcnR5TmFtZSxcblx0XHRcdGtleS5zdGFydHNXaXRoKFwiRGVmYXVsdC9cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJDbGVhckZpZWxkVmFsdWUvXCIpLFxuXHRcdFx0ZmFsc2Vcblx0XHQpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVJlc3VsdHMoc291cmNlLCBwYXJhbXMsIHRydWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc2VsZWN0aW9ucyB0byByZXN1bHRzIGFuZCB0aGUgc3VnZ2VzdHMgaW4gZHJvcCBkb3ducy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgTURDIGZpZWxkIHRoYXQgd2FzIGNoYW5nZWQuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZS5cblx0ICovXG5cdF91cGRhdGVTZWxlY3RLZXlGb3JNRENGaWVsZENoYW5nZTogZnVuY3Rpb24gKHNvdXJjZTogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlICYmIHNvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIChzb3VyY2UuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpIGFzIEpTT05Nb2RlbCk7XG5cdFx0Y29uc3QgdmFsdWVzID1cblx0XHRcdGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgfHwgW107XG5cblx0XHRpZiAodHJhbnNDdHggJiYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiSW5wdXRXaXRoVmFsdWVIZWxwXCIgfHwgdmFsdWVzLmlucHV0VHlwZSA9PT0gXCJJbnB1dFdpdGhVbml0XCIpICYmICF2YWx1ZXMudmFsdWVMaXN0SW5mbykge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fc2V0VmFsdWVMaXN0SW5mbyh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cblx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVTdWdnZXN0aW9uRm9yRmllbGRzV2l0aE91dFBhcmFtZXRlcnMoZmllbGRJbmZvTW9kZWwsIHByb3BlcnR5TmFtZSwgZmFsc2UsIHRydWUpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzKGZpZWxkSW5mb01vZGVsLCBwcm9wZXJ0eU5hbWUsIGZhbHNlLCB0cnVlKTtcblxuXHRcdGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gc291cmNlLmdldEZvcm1Gb3JtYXR0ZWRWYWx1ZSgpO1xuXHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZVNlbGVjdEtleShzb3VyY2UsIHByb3BlcnR5TmFtZSwgdmFsdWUsIGZvcm1hdHRlZFZhbHVlKTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhbGwgZHJvcCBkb3ducyB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoSW5QYXJhbWV0ZXJzOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZyxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgdmFsdWVzID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzXCIpO1xuXHRcdGNvbnN0IHVuaXREYXRhID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGFcIik7XG5cdFx0Y29uc3QgZmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG5cdFx0Y29uc3QgdW5pdEZpZWxkUGF0aHMgPSBPYmplY3Qua2V5cyh1bml0RGF0YSk7XG5cblx0XHRmaWVsZFBhdGhzLmZvckVhY2goXG5cdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVJblBhcmFtZXRlclN1Z2dldGlvbnMuYmluZChcblx0XHRcdFx0TWFzc0VkaXRIYW5kbGVycyxcblx0XHRcdFx0ZmllbGRJbmZvTW9kZWwsXG5cdFx0XHRcdFwiL3ZhbHVlcy9cIixcblx0XHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0XHRyZXNldFZhbHVlcyxcblx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHQpXG5cdFx0KTtcblx0XHR1bml0RmllbGRQYXRocy5mb3JFYWNoKFxuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlSW5QYXJhbWV0ZXJTdWdnZXRpb25zLmJpbmQoXG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMsXG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLFxuXHRcdFx0XHRcIi91bml0RGF0YS9cIixcblx0XHRcdFx0cHJvcGVydHlOYW1lLFxuXHRcdFx0XHRyZXNldFZhbHVlcyxcblx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHN1Z2dlc3RzIGZvciBhIGRyb3AgZG93biB3aXRoIEluUGFyYW1ldGVyIGFzIHRoZSBzcmNQcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwYXRoUHJlZml4IFBhdGggaW4gdGhlIHJ1bnRpbWUgbW9kZWwuXG5cdCAqIEBwYXJhbSBzcmNQcm9wZXJ0eU5hbWUgVGhlIEluUGFyYW1ldGVyIFByb3BlcnR5IHBhdGguXG5cdCAqIEBwYXJhbSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIGtlZXBFeGlzdGluZ1NlbGVjdGlvbiBTaG91bGQgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbiBiZWZvcmUgdXBkYXRlIHJlbWFpbi5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoIHRoYXQgbmVlZHMgdXBkYXRlIG9mIHN1Z2dlc3Rpb25zLlxuXHQgKi9cblx0X3VwZGF0ZUluUGFyYW1ldGVyU3VnZ2V0aW9uczogZnVuY3Rpb24gKFxuXHRcdGZpZWxkSW5mb01vZGVsOiBKU09OTW9kZWwsXG5cdFx0cGF0aFByZWZpeDogc3RyaW5nLFxuXHRcdHNyY1Byb3BlcnR5TmFtZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhbixcblx0XHRwcm9wZXJ0eU5hbWU6IHN0cmluZ1xuXHQpIHtcblx0XHRjb25zdCB2YWx1ZUxpc3RJbmZvID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cGF0aFByZWZpeCArIHByb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2ApO1xuXHRcdGlmICh2YWx1ZUxpc3RJbmZvICYmIHNyY1Byb3BlcnR5TmFtZSAhPSBwcm9wZXJ0eU5hbWUpIHtcblx0XHRcdGNvbnN0IGluUGFyYW1ldGVycyA9IHZhbHVlTGlzdEluZm8uaW5QYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKGluUGFyYW1ldGVycyAmJiBpblBhcmFtZXRlcnMubGVuZ3RoID4gMCAmJiBpblBhcmFtZXRlcnMuaW5jbHVkZXMoc3JjUHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCArIHByb3BlcnR5TmFtZSwgcmVzZXRWYWx1ZXMsIGtlZXBFeGlzdGluZ1NlbGVjdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGFsbCBPdXRQYXJhbWV0ZXIncyBkcm9wIGRvd25zIG9mIHRoZSBwcm9wZXJ0eU5hbWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgUHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZVN1Z2dlc3Rpb25Gb3JGaWVsZHNXaXRoT3V0UGFyYW1ldGVyczogZnVuY3Rpb24gKFxuXHRcdGZpZWxkSW5mb01vZGVsOiBKU09OTW9kZWwsXG5cdFx0cHJvcGVydHlOYW1lOiBzdHJpbmcsXG5cdFx0cmVzZXRWYWx1ZXM6IGJvb2xlYW4sXG5cdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uOiBib29sZWFuXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IHZhbHVlTGlzdEluZm8gPVxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKSB8fFxuXHRcdFx0ZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2ApO1xuXG5cdFx0aWYgKHZhbHVlTGlzdEluZm8gJiYgdmFsdWVMaXN0SW5mby5vdXRQYXJhbWV0ZXJzKSB7XG5cdFx0XHRjb25zdCBvdXRQYXJhbWV0ZXJzID0gdmFsdWVMaXN0SW5mby5vdXRQYXJhbWV0ZXJzO1xuXHRcdFx0aWYgKG91dFBhcmFtZXRlcnMubGVuZ3RoICYmIG91dFBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zKG91dFBhcmFtZXRlcnMsIGZpZWxkSW5mb01vZGVsLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdFx0Y29uc3QgcGF0aFByZWZpeCA9XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKTtcblx0XHRcdFx0aWYgKHBhdGhQcmVmaXgpIHtcblx0XHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgcGF0aFByZWZpeCwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBVcGRhdGUgc3VnZ2VzdHMgZm9yIGEgZHJvcCBkb3duIHdpdGggSW5QYXJhbWV0ZXIgYXMgdGhlIHNyY1Byb3BlcnR5TmFtZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBvdXRQYXJhbWV0ZXJzIFN0cmluZyBhcnJhcnkgb2YgT3V0UGFyYW1ldGVyIHByb3BlcnR5IHBhdGhzLlxuXHQgKiBAcGFyYW0gZmllbGRJbmZvTW9kZWwgUnVudGltZSBtb2RlbCB3aXRoIHBhcmFtZXRlcnMgc3RvcmUgaW5mb3JtYXRpb24uXG5cdCAqIEBwYXJhbSByZXNldFZhbHVlcyBTaG91bGQgdGhlIHZhbHVlcyBiZSByZXNldCB0byBvcmlnaW5hbCBzdGF0ZS5cblx0ICogQHBhcmFtIGtlZXBFeGlzdGluZ1NlbGVjdGlvbiBTaG91bGQgdGhlIGV4aXN0aW5nIHNlbGVjdGlvbiBiZWZvcmUgdXBkYXRlIHJlbWFpbi5cblx0ICovXG5cdF91cGRhdGVPdXRQYXJhbWV0ZXJTdWdnZXRpb25zOiBmdW5jdGlvbiAoXG5cdFx0b3V0UGFyYW1ldGVyczogc3RyaW5nW10sXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRyZXNldFZhbHVlczogYm9vbGVhbixcblx0XHRrZWVwRXhpc3RpbmdTZWxlY3Rpb246IGJvb2xlYW5cblx0KSB7XG5cdFx0Y29uc3QgdmFsdWVzID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdmFsdWVzXCIpO1xuXHRcdGNvbnN0IHVuaXREYXRhID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdW5pdERhdGFcIik7XG5cdFx0Y29uc3QgZmllbGRQYXRocyA9IE9iamVjdC5rZXlzKHZhbHVlcyk7XG5cdFx0Y29uc3QgdW5pdEZpZWxkUGF0aHMgPSBPYmplY3Qua2V5cyh1bml0RGF0YSk7XG5cblx0XHRvdXRQYXJhbWV0ZXJzLmZvckVhY2goKG91dFBhcmFtZXRlcjogc3RyaW5nKSA9PiB7XG5cdFx0XHRpZiAoZmllbGRQYXRocy5pbmNsdWRlcyhvdXRQYXJhbWV0ZXIpKSB7XG5cdFx0XHRcdE1hc3NFZGl0SGFuZGxlcnMuX3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zKGZpZWxkSW5mb01vZGVsLCBgL3ZhbHVlcy8ke291dFBhcmFtZXRlcn1gLCByZXNldFZhbHVlcywga2VlcEV4aXN0aW5nU2VsZWN0aW9uKTtcblx0XHRcdH0gZWxzZSBpZiAodW5pdEZpZWxkUGF0aHMuaW5jbHVkZXMob3V0UGFyYW1ldGVyKSkge1xuXHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhcblx0XHRcdFx0XHRmaWVsZEluZm9Nb2RlbCxcblx0XHRcdFx0XHRgL3VuaXREYXRhLyR7b3V0UGFyYW1ldGVyfWAsXG5cdFx0XHRcdFx0cmVzZXRWYWx1ZXMsXG5cdFx0XHRcdFx0a2VlcEV4aXN0aW5nU2VsZWN0aW9uXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZSBzdWdnZXN0cyBmb3IgYSBkcm9wIGRvd24gb2YgYSBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIGZpZWxkUGF0aEFic29sdXRlIENvbXBsZXRlIHJ1bnRpbWUgcHJvcGVydHkgcGF0aC5cblx0ICogQHBhcmFtIHJlc2V0VmFsdWVzIFNob3VsZCB0aGUgdmFsdWVzIGJlIHJlc2V0IHRvIG9yaWdpbmFsIHN0YXRlLlxuXHQgKiBAcGFyYW0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uIFNob3VsZCB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uIGJlZm9yZSB1cGRhdGUgcmVtYWluLlxuXHQgKi9cblx0X3VwZGF0ZUZpZWxkUGF0aFN1Z2dlc3Rpb25zOiBmdW5jdGlvbiAoXG5cdFx0ZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRmaWVsZFBhdGhBYnNvbHV0ZTogc3RyaW5nLFxuXHRcdHJlc2V0VmFsdWVzOiBib29sZWFuLFxuXHRcdGtlZXBFeGlzdGluZ1NlbGVjdGlvbjogYm9vbGVhblxuXHQpIHtcblx0XHRjb25zdCBvcHRpb25zID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoZmllbGRQYXRoQWJzb2x1dGUpO1xuXHRcdGNvbnN0IGRlZmF1bHRPcHRpb25zID0gb3B0aW9ucy5kZWZhdWx0T3B0aW9ucztcblx0XHRjb25zdCBzZWxlY3RlZEtleSA9IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAke2ZpZWxkUGF0aEFic29sdXRlfS9zZWxlY3RlZEtleWApO1xuXHRcdGNvbnN0IGV4aXN0aW5nU2VsZWN0aW9uID0ga2VlcEV4aXN0aW5nU2VsZWN0aW9uICYmIG9wdGlvbnMuZmluZCgob3B0aW9uOiBhbnkpID0+IG9wdGlvbi5rZXkgPT09IHNlbGVjdGVkS2V5KTtcblx0XHRpZiAocmVzZXRWYWx1ZXMpIHtcblx0XHRcdGNvbnN0IHNlbGVjdE9wdGlvbnMgPSBvcHRpb25zLnNlbGVjdE9wdGlvbnM7XG5cdFx0XHRvcHRpb25zLmxlbmd0aCA9IDA7XG5cdFx0XHRkZWZhdWx0T3B0aW9ucy5mb3JFYWNoKChkZWZhdWx0T3B0aW9uOiBhbnkpID0+IG9wdGlvbnMucHVzaChkZWZhdWx0T3B0aW9uKSk7XG5cdFx0XHRzZWxlY3RPcHRpb25zLmZvckVhY2goKHNlbGVjdE9wdGlvbjogYW55KSA9PiBvcHRpb25zLnB1c2goc2VsZWN0T3B0aW9uKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9wdGlvbnMubGVuZ3RoID0gMDtcblx0XHRcdGRlZmF1bHRPcHRpb25zLmZvckVhY2goKGRlZmF1bHRPcHRpb246IGFueSkgPT4gb3B0aW9ucy5wdXNoKGRlZmF1bHRPcHRpb24pKTtcblx0XHR9XG5cblx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShmaWVsZFBhdGhBYnNvbHV0ZSwgb3B0aW9ucyk7XG5cblx0XHRpZiAoZXhpc3RpbmdTZWxlY3Rpb24gJiYgIW9wdGlvbnMuaW5jbHVkZXMoZXhpc3RpbmdTZWxlY3Rpb24pKSB7XG5cdFx0XHRvcHRpb25zLnB1c2goZXhpc3RpbmdTZWxlY3Rpb24pO1xuXHRcdFx0ZmllbGRJbmZvTW9kZWwuc2V0UHJvcGVydHkoYCR7ZmllbGRQYXRoQWJzb2x1dGV9L3NlbGVjdGVkS2V5YCwgc2VsZWN0ZWRLZXkpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIEluIGFuZCBPdXQgUGFyYW1ldGVycyBpbiB0aGUgTUVELlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHRyYW5zQ3R4IFRoZSB0cmFuc2llbnQgY29udGV4dCBvZiB0aGUgTUVELlxuXHQgKiBAcGFyYW0gc291cmNlIE1EQyBmaWVsZC5cblx0ICogQHBhcmFtIGZpZWxkSW5mb01vZGVsIFJ1bnRpbWUgbW9kZWwgd2l0aCBwYXJhbWV0ZXJzIHN0b3JlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqL1xuXHRfc2V0VmFsdWVMaXN0SW5mbzogZnVuY3Rpb24gKHRyYW5zQ3R4OiBDb250ZXh0LCBzb3VyY2U6IEZpZWxkLCBmaWVsZEluZm9Nb2RlbDogSlNPTk1vZGVsLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IHByb3BQYXRoID1cblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3ZhbHVlcy8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi92YWx1ZXMvXCIpIHx8XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi91bml0RGF0YS9cIik7XG5cblx0XHRpZiAoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cHJvcFBhdGh9JHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCB2YWx1ZUxpc3RJbmZvID0gZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYCR7cHJvcFBhdGh9JHtwcm9wZXJ0eU5hbWV9L3ZhbHVlTGlzdEluZm9gKTtcblxuXHRcdGlmICghdmFsdWVMaXN0SW5mbykge1xuXHRcdFx0TWFzc0VkaXRIYW5kbGVycy5fcmVxdWVzdFZhbHVlTGlzdCh0cmFuc0N0eCwgc291cmNlLCBmaWVsZEluZm9Nb2RlbCwgcHJvcGVydHlOYW1lKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgYW5kIHVwZGF0ZSBJbiBhbmQgT3V0IFBhcmFtZXRlcnMgaW4gdGhlIE1FRC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB0cmFuc0N0eCBUaGUgdHJhbnNpZW50IGNvbnRleHQgb2YgdGhlIE1FRC5cblx0ICogQHBhcmFtIHNvdXJjZSBNREMgZmllbGQuXG5cdCAqIEBwYXJhbSBmaWVsZEluZm9Nb2RlbCBSdW50aW1lIG1vZGVsIHdpdGggcGFyYW1ldGVycyBzdG9yZSBpbmZvcm1hdGlvbi5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKi9cblx0X3JlcXVlc3RWYWx1ZUxpc3Q6IGZ1bmN0aW9uICh0cmFuc0N0eDogQ29udGV4dCwgc291cmNlOiBGaWVsZCwgZmllbGRJbmZvTW9kZWw6IEpTT05Nb2RlbCwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBtZXRhUGF0aCA9IE1vZGVsSGVscGVyLmdldE1ldGFQYXRoRm9yQ29udGV4dCh0cmFuc0N0eCk7XG5cdFx0Y29uc3QgcHJvcGVydHlQYXRoID0gKG1ldGFQYXRoICYmIGAke21ldGFQYXRofS8ke3Byb3BlcnR5TmFtZX1gKSBhcyBzdHJpbmc7XG5cdFx0Y29uc3QgZGVwZW5kZW50cyA9IHNvdXJjZT8uZ2V0RGVwZW5kZW50cygpO1xuXHRcdGNvbnN0IGZpZWxkSGVscCA9IHNvdXJjZT8uZ2V0RmllbGRIZWxwKCk7XG5cdFx0Y29uc3QgZmllbGRWYWx1ZUhlbHAgPSBkZXBlbmRlbnRzPy5maW5kKChkZXBlbmRlbnQ6IGFueSkgPT4gZGVwZW5kZW50LmdldElkKCkgPT09IGZpZWxkSGVscCkgYXMgVmFsdWVIZWxwO1xuXHRcdGNvbnN0IHBheWxvYWQgPSAoZmllbGRWYWx1ZUhlbHAuZ2V0RGVsZWdhdGUoKSBhcyBhbnkpPy5wYXlsb2FkIGFzIFZhbHVlSGVscFBheWxvYWQ7XG5cdFx0aWYgKCFmaWVsZFZhbHVlSGVscD8uZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0ZmllbGRWYWx1ZUhlbHA/LnNldEJpbmRpbmdDb250ZXh0KHRyYW5zQ3R4KTtcblx0XHR9XG5cdFx0Y29uc3QgbWV0YU1vZGVsID0gdHJhbnNDdHguZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRWYWx1ZUxpc3RIZWxwZXIuY3JlYXRlVkhVSU1vZGVsKGZpZWxkVmFsdWVIZWxwLCBwcm9wZXJ0eVBhdGgsIG1ldGFNb2RlbCk7XG5cdFx0Y29uc3QgdmFsdWVMaXN0SW5mbyA9IFZhbHVlTGlzdEhlbHBlci5nZXRWYWx1ZUxpc3RJbmZvKGZpZWxkVmFsdWVIZWxwLCBwcm9wZXJ0eVBhdGgsIHBheWxvYWQpO1xuXG5cdFx0dmFsdWVMaXN0SW5mb1xuXHRcdFx0LnRoZW4oKHZMaW5mb3M6IFZhbHVlTGlzdEluZm9bXSkgPT4ge1xuXHRcdFx0XHRjb25zdCB2TGluZm8gPSB2TGluZm9zWzBdO1xuXHRcdFx0XHRjb25zdCBwcm9wUGF0aCA9XG5cdFx0XHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3ZhbHVlcy9cIikgfHxcblx0XHRcdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC91bml0RGF0YS8ke3Byb3BlcnR5TmFtZX1gKSAmJiBcIi91bml0RGF0YS9cIik7XG5cdFx0XHRcdGNvbnN0IGluZm86IGFueSA9IHtcblx0XHRcdFx0XHRpblBhcmFtZXRlcnM6XG5cdFx0XHRcdFx0XHR2TGluZm8udmhQYXJhbWV0ZXJzICYmIFZhbHVlTGlzdEhlbHBlci5nZXRJblBhcmFtZXRlcnModkxpbmZvLnZoUGFyYW1ldGVycykubWFwKChpblBhcmFtOiBhbnkpID0+IGluUGFyYW0uaGVscFBhdGgpLFxuXHRcdFx0XHRcdG91dFBhcmFtZXRlcnM6XG5cdFx0XHRcdFx0XHR2TGluZm8udmhQYXJhbWV0ZXJzICYmXG5cdFx0XHRcdFx0XHRWYWx1ZUxpc3RIZWxwZXIuZ2V0T3V0UGFyYW1ldGVycyh2TGluZm8udmhQYXJhbWV0ZXJzKS5tYXAoKG91dFBhcmFtOiBhbnkpID0+IG91dFBhcmFtLmhlbHBQYXRoKVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShgJHtwcm9wUGF0aH0ke3Byb3BlcnR5TmFtZX0vdmFsdWVMaXN0SW5mb2AsIGluZm8pO1xuXHRcdFx0XHRpZiAoaW5mby5vdXRQYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRNYXNzRWRpdEhhbmRsZXJzLl91cGRhdGVGaWVsZFBhdGhTdWdnZXN0aW9ucyhmaWVsZEluZm9Nb2RlbCwgYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCwgZmFsc2UsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0TG9nLndhcm5pbmcoYE1hc3MgRWRpdDogQ291bGRuJ3QgbG9hZCB2YWx1ZUxpc3QgaW5mbyBmb3IgJHtwcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHR9KTtcblx0fSxcblxuXHQvKipcblx0ICogR2V0IGZpZWxkIGhlbHAgY29udHJvbCBmcm9tIE1EQyBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB0cmFuc0N0eCBUaGUgdHJhbnNpZW50IGNvbnRleHQgb2YgdGhlIE1FRC5cblx0ICogQHBhcmFtIHNvdXJjZSBNREMgZmllbGQuXG5cdCAqIEByZXR1cm5zIEZpZWxkIEhlbHAgY29udHJvbC5cblx0ICovXG5cdF9nZXRWYWx1ZUhlbHA6IGZ1bmN0aW9uICh0cmFuc0N0eDogQ29udGV4dCwgc291cmNlOiBGaWVsZCk6IGFueSB7XG5cdFx0Y29uc3QgZGVwZW5kZW50cyA9IHNvdXJjZT8uZ2V0RGVwZW5kZW50cygpO1xuXHRcdGNvbnN0IGZpZWxkSGVscCA9IHNvdXJjZT8uZ2V0RmllbGRIZWxwKCk7XG5cdFx0cmV0dXJuIGRlcGVuZGVudHM/LmZpbmQoKGRlcGVuZGVudDogYW55KSA9PiBkZXBlbmRlbnQuZ2V0SWQoKSA9PT0gZmllbGRIZWxwKTtcblx0fSxcblxuXHQvKipcblx0ICogQ29sbGVkIG9uIGRyb3AgZG93biBzZWxlY3Rpb24gb2YgVkhEIG9wdGlvbi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgQ3VzdG9tIE1hc3MgRWRpdCBTZWxlY3QgY29udHJvbC5cblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBwYXRoLlxuXHQgKiBAcGFyYW0gc2VsZWN0S2V5IFByZXZpb3VzIGtleSBiZWZvcmUgdGhlIFZIRCB3YXMgc2VsZWN0ZWQuXG5cdCAqL1xuXHRfb25WSFNlbGVjdDogZnVuY3Rpb24gKHNvdXJjZTogYW55LCBwcm9wZXJ0eU5hbWU6IHN0cmluZywgc2VsZWN0S2V5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHQvLyBDYWxsZWQgZm9yXG5cdFx0Ly8gMS4gVkhEIHNlbGVjdGVkLlxuXG5cdFx0Y29uc3QgZmllbGRJbmZvTW9kZWwgPSBzb3VyY2UgJiYgc291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKTtcblx0XHRjb25zdCBwcm9wUGF0aCA9XG5cdFx0XHQoZmllbGRJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgXCIvdmFsdWVzL1wiKSB8fFxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgJiYgXCIvdW5pdERhdGEvXCIpO1xuXHRcdGNvbnN0IHRyYW5zQ3R4ID0gc291cmNlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3QgZmllbGRWYWx1ZUhlbHAgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZUhlbHAodHJhbnNDdHgsIHNvdXJjZS5nZXRQYXJlbnQoKSk7XG5cdFx0aWYgKCFmaWVsZFZhbHVlSGVscD8uZ2V0QmluZGluZ0NvbnRleHQoKSkge1xuXHRcdFx0ZmllbGRWYWx1ZUhlbHA/LnNldEJpbmRpbmdDb250ZXh0KHRyYW5zQ3R4KTtcblx0XHR9XG5cdFx0c291cmNlLmZpcmVWYWx1ZUhlbHBSZXF1ZXN0KCk7XG5cblx0XHRmaWVsZEluZm9Nb2RlbC5zZXRQcm9wZXJ0eShgJHtwcm9wUGF0aCArIHByb3BlcnR5TmFtZX0vc2VsZWN0ZWRLZXlgLCBzZWxlY3RLZXkpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIFByb3BlcnR5IG5hbWUgZnJvbSBzZWxlY3Rpb24ga2V5LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIGtleSBTZWxlY3Rpb24ga2V5LlxuXHQgKiBAcmV0dXJucyBQcm9wZXJ0eSBuYW1lLlxuXHQgKi9cblx0X2dldFByb3BlcnR5TmFtZUZyb21LZXk6IGZ1bmN0aW9uIChrZXk6IHN0cmluZykge1xuXHRcdGxldCBwcm9wZXJ0eU5hbWUgPSBcIlwiO1xuXHRcdGlmIChrZXkuc3RhcnRzV2l0aChcIkRlZmF1bHQvXCIpIHx8IGtleS5zdGFydHNXaXRoKFwiQ2xlYXJGaWVsZFZhbHVlL1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIlVzZVZhbHVlSGVscFZhbHVlL1wiKSkge1xuXHRcdFx0cHJvcGVydHlOYW1lID0ga2V5LnN1YnN0cmluZyhrZXkuaW5kZXhPZihcIi9cIikgKyAxKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcGVydHlOYW1lID0ga2V5LnN1YnN0cmluZygwLCBrZXkubGFzdEluZGV4T2YoXCIvXCIpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHByb3BlcnR5TmFtZTtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIHNlbGVjdGlvbiB0byBDdXN0b20gTWFzcyBFZGl0IFNlbGVjdCBmcm9tIE1EQyBmaWVsZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgTURDIGZpZWxkLlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IHBhdGguXG5cdCAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSB0byB1cGRhdGUuXG5cdCAqIEBwYXJhbSBmdWxsVGV4dCBGdWxsIHRleHQgdG8gdXNlLlxuXHQgKi9cblx0X3VwZGF0ZVNlbGVjdEtleTogZnVuY3Rpb24gKHNvdXJjZTogRmllbGQsIHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBmdWxsVGV4dD86IGFueSk6IHZvaWQge1xuXHRcdC8vIENhbGxlZCBmb3Jcblx0XHQvLyAxLiBWSEQgcHJvcGVydHkgY2hhbmdlXG5cdFx0Ly8gMi4gT3V0IFBhcmFtZXRlcnMuXG5cdFx0Ly8gMy4gVHJhbnNpZW50IGNvbnRleHQgcHJvcGVydHkgY2hhbmdlLlxuXG5cdFx0Y29uc3QgY29tYm9Cb3ggPSBzb3VyY2UuZ2V0Q29udGVudCgpIGFzIENvbWJvQm94O1xuXHRcdGlmICghY29tYm9Cb3ggfHwgIXByb3BlcnR5TmFtZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRsZXQga2V5OiBzdHJpbmcgPSBjb21ib0JveC5nZXRTZWxlY3RlZEtleSgpO1xuXHRcdGlmICgoa2V5LnN0YXJ0c1dpdGgoXCJEZWZhdWx0L1wiKSB8fCBrZXkuc3RhcnRzV2l0aChcIkNsZWFyRmllbGRWYWx1ZS9cIikpICYmICF2YWx1ZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZvcm1hdHRlZFRleHQgPSBNYXNzRWRpdEhhbmRsZXJzLl92YWx1ZUV4aXN0cyhmdWxsVGV4dCkgPyBmdWxsVGV4dCA6IHZhbHVlO1xuXHRcdGNvbnN0IGZpZWxkSW5mb01vZGVsID0gc291cmNlICYmIChzb3VyY2UuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpIGFzIEpTT05Nb2RlbCk7XG5cdFx0Y29uc3QgdmFsdWVzID1cblx0XHRcdGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8IGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdW5pdERhdGEvJHtwcm9wZXJ0eU5hbWV9YCkgfHwgW107XG5cdFx0Y29uc3QgcHJvcFBhdGggPVxuXHRcdFx0KGZpZWxkSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3ZhbHVlcy9cIikgfHxcblx0XHRcdChmaWVsZEluZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApICYmIFwiL3VuaXREYXRhL1wiKTtcblxuXHRcdGNvbnN0IHJlbGF0ZWRGaWVsZCA9IHZhbHVlcy5maW5kKChmaWVsZERhdGE6IGFueSkgPT4gZmllbGREYXRhPy50ZXh0SW5mbz8udmFsdWUgPT09IHZhbHVlIHx8IGZpZWxkRGF0YS50ZXh0ID09PSB2YWx1ZSk7XG5cblx0XHRpZiAocmVsYXRlZEZpZWxkKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGZ1bGxUZXh0ICYmXG5cdFx0XHRcdHJlbGF0ZWRGaWVsZC50ZXh0SW5mbyAmJlxuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZGVzY3JpcHRpb25QYXRoICYmXG5cdFx0XHRcdChyZWxhdGVkRmllbGQudGV4dCAhPSBmb3JtYXR0ZWRUZXh0IHx8IHJlbGF0ZWRGaWVsZC50ZXh0SW5mby5mdWxsVGV4dCAhPSBmb3JtYXR0ZWRUZXh0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFVwZGF0ZSB0aGUgZnVsbCB0ZXh0IG9ubHkgd2hlbiBwcm92aWRlZC5cblx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHQgPSBmb3JtYXR0ZWRUZXh0O1xuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZnVsbFRleHQgPSBmb3JtYXR0ZWRUZXh0O1xuXHRcdFx0XHRyZWxhdGVkRmllbGQudGV4dEluZm8uZGVzY3JpcHRpb24gPSBzb3VyY2UuZ2V0QWRkaXRpb25hbFZhbHVlKCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAocmVsYXRlZEZpZWxkLmtleSA9PT0ga2V5KSB7XG5cdFx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGAke3Byb3BQYXRoICsgcHJvcGVydHlOYW1lfS9zZWxlY3RlZEtleWAsIGtleSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGtleSA9IHJlbGF0ZWRGaWVsZC5rZXk7XG5cdFx0fSBlbHNlIGlmIChbdW5kZWZpbmVkLCBudWxsLCBcIlwiXS5pbmRleE9mKHZhbHVlKSA9PT0gLTEpIHtcblx0XHRcdGtleSA9IGAke3Byb3BlcnR5TmFtZX0vJHt2YWx1ZX1gO1xuXHRcdFx0Y29uc3Qgc2VsZWN0aW9uSW5mbyA9IHtcblx0XHRcdFx0dGV4dDogZm9ybWF0dGVkVGV4dCxcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHR0ZXh0SW5mbzoge1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBzb3VyY2UuZ2V0QWRkaXRpb25hbFZhbHVlKCksXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25QYXRoOiB2YWx1ZXMgJiYgdmFsdWVzLnRleHRJbmZvICYmIHZhbHVlcy50ZXh0SW5mby5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0ZnVsbFRleHQ6IGZvcm1hdHRlZFRleHQsXG5cdFx0XHRcdFx0dGV4dEFycmFuZ2VtZW50OiBzb3VyY2UuZ2V0RGlzcGxheSgpLFxuXHRcdFx0XHRcdHZhbHVlOiBzb3VyY2UuZ2V0VmFsdWUoKSxcblx0XHRcdFx0XHR2YWx1ZVBhdGg6IHByb3BlcnR5TmFtZVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0dmFsdWVzLnB1c2goc2VsZWN0aW9uSW5mbyk7XG5cdFx0XHR2YWx1ZXMuc2VsZWN0T3B0aW9ucyA9IHZhbHVlcy5zZWxlY3RPcHRpb25zIHx8IFtdO1xuXHRcdFx0dmFsdWVzLnNlbGVjdE9wdGlvbnMucHVzaChzZWxlY3Rpb25JbmZvKTtcblx0XHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KHByb3BQYXRoICsgcHJvcGVydHlOYW1lLCB2YWx1ZXMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRrZXkgPSBgRGVmYXVsdC8ke3Byb3BlcnR5TmFtZX1gO1xuXHRcdH1cblxuXHRcdGZpZWxkSW5mb01vZGVsLnNldFByb3BlcnR5KGAke3Byb3BQYXRoICsgcHJvcGVydHlOYW1lfS9zZWxlY3RlZEtleWAsIGtleSk7XG5cdFx0TWFzc0VkaXRIYW5kbGVycy5fdXBkYXRlUmVzdWx0cyhjb21ib0JveCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBWYWx1ZSBmcm9tIERyb3AgZG93bi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSBzb3VyY2UgRHJvcCBkb3duIGNvbnRyb2wuXG5cdCAqIEByZXR1cm5zIFZhbHVlIG9mIHNlbGVjdGlvbi5cblx0ICovXG5cdF9nZXRWYWx1ZTogZnVuY3Rpb24gKHNvdXJjZTogQ29udHJvbCkge1xuXHRcdHJldHVybiBzb3VyY2UuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgPT09IFwic2FwLmZlLmNvcmUuY29udHJvbHMuTWFzc0VkaXRTZWxlY3RcIlxuXHRcdFx0PyAoc291cmNlIGFzIFNlbGVjdCkuZ2V0U2VsZWN0ZWRJdGVtKCk/LmdldFRleHQoKVxuXHRcdFx0OiAoc291cmNlIGFzIENvbWJvQm94KS5nZXRWYWx1ZSgpO1xuXHR9LFxuXG5cdF9nZXRWYWx1ZU9uRW1wdHk6IGZ1bmN0aW9uIChvU291cmNlOiBhbnksIGZpZWxkc0luZm9Nb2RlbDogSlNPTk1vZGVsLCB2YWx1ZTogYW55LCBzUHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHRpZiAoIXZhbHVlKSB7XG5cdFx0XHRjb25zdCB2YWx1ZXMgPVxuXHRcdFx0XHRmaWVsZHNJbmZvTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtzUHJvcGVydHlOYW1lfWApIHx8IGZpZWxkc0luZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7c1Byb3BlcnR5TmFtZX1gKSB8fCBbXTtcblx0XHRcdGlmICh2YWx1ZXMudW5pdFByb3BlcnR5KSB7XG5cdFx0XHRcdHZhbHVlID0gMDtcblx0XHRcdFx0b1NvdXJjZS5zZXRWYWx1ZSh2YWx1ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKHZhbHVlcy5pbnB1dFR5cGUgPT09IFwiQ2hlY2tCb3hcIikge1xuXHRcdFx0XHR2YWx1ZSA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH0sXG5cblx0X3ZhbHVlRXhpc3RzOiBmdW5jdGlvbiAodmFsdWU6IGFueSkge1xuXHRcdHJldHVybiB2YWx1ZSAhPSB1bmRlZmluZWQgJiYgdmFsdWUgIT0gbnVsbDtcblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlcyBzZWxlY3Rpb25zIHRvIHJ1bnRpbWUgbW9kZWwuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0gb1NvdXJjZSBEcm9wIGRvd24gY29udHJvbC5cblx0ICogQHBhcmFtIGFQYXJhbXMgUGFydHMgb2Yga2V5IGluIHJ1bnRpbWUgbW9kZWwuXG5cdCAqIEBwYXJhbSB1cGRhdGVUcmFuc0N0eCBTaG91bGQgdHJhbnNpZW50IGNvbnRleHQgYmUgdXBkYXRlZCB3aXRoIHRoZSB2YWx1ZS5cblx0ICovXG5cdF91cGRhdGVSZXN1bHRzOiBmdW5jdGlvbiAob1NvdXJjZTogYW55LCBhUGFyYW1zOiBBcnJheTxzdHJpbmc+ID0gW10sIHVwZGF0ZVRyYW5zQ3R4OiBib29sZWFuKSB7XG5cdFx0Ly8gQ2FsbGVkIGZvclxuXHRcdC8vIDEuIFZIRCBwcm9wZXJ0eSBjaGFuZ2UuXG5cdFx0Ly8gMi4gT3V0IHBhcmFtZXRlci5cblx0XHQvLyAzLiB0cmFuc2llbnQgY29udGV4dCBwcm9wZXJ0eSBjaGFuZ2UuXG5cdFx0Y29uc3QgZmllbGRzSW5mb01vZGVsID0gb1NvdXJjZSAmJiBvU291cmNlLmdldE1vZGVsKFwiZmllbGRzSW5mb1wiKTtcblx0XHRjb25zdCBvRmllbGRzSW5mb0RhdGEgPSBmaWVsZHNJbmZvTW9kZWwgJiYgZmllbGRzSW5mb01vZGVsLmdldERhdGEoKTtcblx0XHRsZXQgdmFsdWUgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZShvU291cmNlIGFzIENvbnRyb2wpO1xuXHRcdGFQYXJhbXMgPSBhUGFyYW1zLmxlbmd0aCA+IDAgPyBhUGFyYW1zIDogb1NvdXJjZSAmJiBvU291cmNlLmdldFNlbGVjdGVkS2V5KCkgJiYgb1NvdXJjZS5nZXRTZWxlY3RlZEtleSgpLnNwbGl0KFwiL1wiKTtcblxuXHRcdGxldCBvRGF0YU9iamVjdDtcblx0XHRjb25zdCBzUHJvcGVydHlOYW1lID0gb1NvdXJjZS5kYXRhKFwiZmllbGRQYXRoXCIpO1xuXG5cdFx0aWYgKGFQYXJhbXNbMF0gPT09IFwiRGVmYXVsdFwiKSB7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IGFQYXJhbXNbMV0sXG5cdFx0XHRcdHZhbHVlOiBhUGFyYW1zWzBdXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoYVBhcmFtc1swXSA9PT0gXCJDbGVhckZpZWxkVmFsdWVcIikge1xuXHRcdFx0dmFsdWUgPSBcIlwiO1xuXHRcdFx0dmFsdWUgPSBNYXNzRWRpdEhhbmRsZXJzLl9nZXRWYWx1ZU9uRW1wdHkob1NvdXJjZSwgZmllbGRzSW5mb01vZGVsLCB2YWx1ZSwgc1Byb3BlcnR5TmFtZSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IGFQYXJhbXNbMV0sXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKCFhUGFyYW1zKSB7XG5cdFx0XHR2YWx1ZSA9IE1hc3NFZGl0SGFuZGxlcnMuX2dldFZhbHVlT25FbXB0eShvU291cmNlLCBmaWVsZHNJbmZvTW9kZWwsIHZhbHVlLCBzUHJvcGVydHlOYW1lKTtcblx0XHRcdG9EYXRhT2JqZWN0ID0ge1xuXHRcdFx0XHRrZXlWYWx1ZTogc1Byb3BlcnR5TmFtZSxcblx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eU5hbWUgPSBhUGFyYW1zLnNsaWNlKDAsIC0xKS5qb2luKFwiL1wiKTtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWVzID1cblx0XHRcdFx0ZmllbGRzSW5mb01vZGVsLmdldFByb3BlcnR5KGAvdmFsdWVzLyR7cHJvcGVydHlOYW1lfWApIHx8IGZpZWxkc0luZm9Nb2RlbC5nZXRQcm9wZXJ0eShgL3VuaXREYXRhLyR7cHJvcGVydHlOYW1lfWApIHx8IFtdO1xuXG5cdFx0XHRjb25zdCByZWxhdGVkRmllbGQgPSAocHJvcGVydHlWYWx1ZXMgfHwgW10pLmZpbmQoZnVuY3Rpb24gKG9GaWVsZERhdGE6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0ZpZWxkRGF0YT8udGV4dEluZm8/LnZhbHVlID09PSB2YWx1ZSB8fCBvRmllbGREYXRhLnRleHQgPT09IHZhbHVlO1xuXHRcdFx0fSk7XG5cdFx0XHRvRGF0YU9iamVjdCA9IHtcblx0XHRcdFx0a2V5VmFsdWU6IHByb3BlcnR5TmFtZSxcblx0XHRcdFx0dmFsdWU6XG5cdFx0XHRcdFx0cmVsYXRlZEZpZWxkLnRleHRJbmZvICYmIE1hc3NFZGl0SGFuZGxlcnMuX3ZhbHVlRXhpc3RzKHJlbGF0ZWRGaWVsZC50ZXh0SW5mby52YWx1ZSlcblx0XHRcdFx0XHRcdD8gcmVsYXRlZEZpZWxkLnRleHRJbmZvLnZhbHVlXG5cdFx0XHRcdFx0XHQ6IHJlbGF0ZWRGaWVsZC50ZXh0XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRsZXQgYkV4aXN0aW5nRWxlbWVudGluZGV4ID0gLTE7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKG9GaWVsZHNJbmZvRGF0YS5yZXN1bHRzW2ldLmtleVZhbHVlID09PSBvRGF0YU9iamVjdC5rZXlWYWx1ZSkge1xuXHRcdFx0XHRiRXhpc3RpbmdFbGVtZW50aW5kZXggPSBpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoYkV4aXN0aW5nRWxlbWVudGluZGV4ICE9PSAtMSkge1xuXHRcdFx0b0ZpZWxkc0luZm9EYXRhLnJlc3VsdHNbYkV4aXN0aW5nRWxlbWVudGluZGV4XSA9IG9EYXRhT2JqZWN0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvRmllbGRzSW5mb0RhdGEucmVzdWx0cy5wdXNoKG9EYXRhT2JqZWN0KTtcblx0XHR9XG5cdFx0aWYgKHVwZGF0ZVRyYW5zQ3R4ICYmICFvRGF0YU9iamVjdC5rZXlWYWx1ZS5pbmNsdWRlcyhcIi9cIikpIHtcblx0XHRcdGNvbnN0IHRyYW5zQ3R4ID0gb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0aWYgKGFQYXJhbXNbMF0gPT09IFwiRGVmYXVsdFwiIHx8IGFQYXJhbXNbMF0gPT09IFwiQ2xlYXJGaWVsZFZhbHVlXCIpIHtcblx0XHRcdFx0dHJhbnNDdHguc2V0UHJvcGVydHkob0RhdGFPYmplY3Qua2V5VmFsdWUsIG51bGwpO1xuXHRcdFx0fSBlbHNlIGlmIChvRGF0YU9iamVjdCkge1xuXHRcdFx0XHR0cmFuc0N0eC5zZXRQcm9wZXJ0eShvRGF0YU9iamVjdC5rZXlWYWx1ZSwgb0RhdGFPYmplY3QudmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFzc0VkaXRIYW5kbGVycztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7OztFQXVCQSxJQUFNQSxnQkFBcUIsR0FBRztJQUM3QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLHFCQUFxQixFQUFFLFVBQVVDLFFBQWEsRUFBRUMsWUFBb0IsRUFBRUMsVUFBa0IsRUFBRTtNQUN6RjtNQUNBO01BQ0E7O01BRUEsSUFBTUMsTUFBTSxHQUFHQyxJQUFJLENBQUNDLElBQUksQ0FBQ0gsVUFBVSxDQUFVO01BQzdDLElBQU1JLFFBQVEsR0FBR0gsTUFBTSxJQUFLQSxNQUFNLENBQUNJLGlCQUFpQixFQUFjO01BQ2xFLElBQU1DLGNBQWMsR0FBR0wsTUFBTSxJQUFLQSxNQUFNLENBQUNNLFFBQVEsQ0FBQyxZQUFZLENBQWU7TUFDN0UsSUFBTUMsTUFBTSxHQUNYRixjQUFj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
|