@sapui5/sap.fe.core 1.110.0 → 1.111.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 +0 -4
- package/package.json +2 -23
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime-dbg.js +182 -0
- package/src/sap/fe/core/ActionRuntime.js +3 -181
- package/src/sap/fe/core/ActionRuntime.js.map +1 -0
- package/src/sap/fe/core/ActionRuntime.ts +3 -5
- package/src/sap/fe/core/AppComponent-dbg.js +435 -0
- package/src/sap/fe/core/AppComponent.js +3 -439
- package/src/sap/fe/core/AppComponent.js.map +1 -0
- package/src/sap/fe/core/AppComponent.ts +0 -3
- package/src/sap/fe/core/AppStateHandler-dbg.js +200 -0
- package/src/sap/fe/core/AppStateHandler.js +3 -227
- package/src/sap/fe/core/AppStateHandler.js.map +1 -0
- package/src/sap/fe/core/BaseController-dbg.js +76 -0
- package/src/sap/fe/core/BaseController.js +3 -73
- package/src/sap/fe/core/BaseController.js.map +1 -0
- package/src/sap/fe/core/CommonUtils-dbg.js +2135 -0
- package/src/sap/fe/core/CommonUtils.js +3 -2296
- package/src/sap/fe/core/CommonUtils.js.map +1 -0
- package/src/sap/fe/core/CommonUtils.ts +34 -28
- package/src/sap/fe/core/ExtensionAPI-dbg.js +273 -0
- package/src/sap/fe/core/ExtensionAPI.js +3 -280
- package/src/sap/fe/core/ExtensionAPI.js.map +1 -0
- package/src/sap/fe/core/PageController-dbg.js +203 -0
- package/src/sap/fe/core/PageController.js +3 -200
- package/src/sap/fe/core/PageController.js.map +1 -0
- package/src/sap/fe/core/TemplateComponent-dbg.js +218 -0
- package/src/sap/fe/core/TemplateComponent.js +3 -216
- package/src/sap/fe/core/TemplateComponent.js.map +1 -0
- package/src/sap/fe/core/TemplateModel-dbg.js +75 -0
- package/src/sap/fe/core/TemplateModel.js +3 -72
- package/src/sap/fe/core/TemplateModel.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/AttributeModel-dbg.js +57 -0
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +3 -54
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock-dbg.js +410 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +11 -355
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +118 -52
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter-dbg.js +14 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +3 -11
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment-dbg.js +44 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +3 -40
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +3 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime-dbg.js +932 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +16 -1292
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +40 -42
- package/src/sap/fe/core/buildingBlocks/TraceInfo-dbg.js +434 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +3 -481
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js.map +1 -0
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +5 -5
- package/src/sap/fe/core/controllerextensions/BusyLocker-dbg.js +92 -0
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +3 -89
- package/src/sap/fe/core/controllerextensions/BusyLocker.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/EditFlow-dbg.js +1659 -0
- package/src/sap/fe/core/controllerextensions/EditFlow.js +3 -1868
- package/src/sap/fe/core/controllerextensions/EditFlow.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +180 -125
- package/src/sap/fe/core/controllerextensions/Feedback-dbg.js +70 -0
- package/src/sap/fe/core/controllerextensions/Feedback.js +3 -67
- package/src/sap/fe/core/controllerextensions/Feedback.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation-dbg.js +83 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -84
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +6 -8
- package/src/sap/fe/core/controllerextensions/InternalEditFlow-dbg.js +711 -0
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +3 -707
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +79 -48
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation-dbg.js +791 -0
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +3 -696
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +107 -7
- package/src/sap/fe/core/controllerextensions/InternalRouting-dbg.js +984 -0
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +3 -996
- package/src/sap/fe/core/controllerextensions/InternalRouting.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +43 -23
- package/src/sap/fe/core/controllerextensions/KPIManagement-dbg.js +1013 -0
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +3 -1011
- package/src/sap/fe/core/controllerextensions/KPIManagement.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +12 -10
- package/src/sap/fe/core/controllerextensions/MassEdit-dbg.js +135 -0
- package/src/sap/fe/core/controllerextensions/MassEdit.js +3 -133
- package/src/sap/fe/core/controllerextensions/MassEdit.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +1 -1
- package/src/sap/fe/core/controllerextensions/MessageHandler-dbg.js +221 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +3 -224
- package/src/sap/fe/core/controllerextensions/MessageHandler.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/PageReady-dbg.js +254 -0
- package/src/sap/fe/core/controllerextensions/PageReady.js +3 -279
- package/src/sap/fe/core/controllerextensions/PageReady.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/PageReady.ts +2 -2
- package/src/sap/fe/core/controllerextensions/Paginator-dbg.js +169 -0
- package/src/sap/fe/core/controllerextensions/Paginator.js +3 -174
- package/src/sap/fe/core/controllerextensions/Paginator.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/Paginator.ts +4 -5
- package/src/sap/fe/core/controllerextensions/Placeholder-dbg.js +132 -0
- package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -130
- package/src/sap/fe/core/controllerextensions/Placeholder.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/Routing-dbg.js +138 -0
- package/src/sap/fe/core/controllerextensions/Routing.js +3 -135
- package/src/sap/fe/core/controllerextensions/Routing.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/RoutingListener-dbg.js +10 -0
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +3 -7
- package/src/sap/fe/core/controllerextensions/RoutingListener.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/Share-dbg.js +317 -0
- package/src/sap/fe/core/controllerextensions/Share.js +3 -356
- package/src/sap/fe/core/controllerextensions/Share.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/Share.ts +6 -1
- package/src/sap/fe/core/controllerextensions/SideEffects-dbg.js +553 -0
- package/src/sap/fe/core/controllerextensions/SideEffects.js +3 -651
- package/src/sap/fe/core/controllerextensions/SideEffects.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +411 -553
- package/src/sap/fe/core/controllerextensions/ViewState-dbg.js +903 -0
- package/src/sap/fe/core/controllerextensions/ViewState.js +3 -967
- package/src/sap/fe/core/controllerextensions/ViewState.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/ViewState.ts +90 -41
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase-dbg.js +99 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +3 -96
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync-dbg.js +314 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +3 -336
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon-dbg.js +152 -0
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +3 -161
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/collaboration/Manage-dbg.js +243 -0
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +3 -302
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block-dbg.js +252 -0
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +6 -0
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +188 -0
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper-dbg.js +1196 -0
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +3 -1479
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +239 -289
- package/src/sap/fe/core/controllerextensions/editFlow/draft-dbg.js +689 -0
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +3 -785
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +134 -142
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup-dbg.js +236 -0
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +3 -287
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations-dbg.js +1422 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +3 -1598
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +40 -24
- package/src/sap/fe/core/controllerextensions/editFlow/sticky-dbg.js +185 -0
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +3 -214
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +4 -5
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling-dbg.js +1219 -0
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +3 -1213
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher-dbg.js +304 -0
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +3 -339
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/routing/NavigationReason-dbg.js +15 -0
- package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js +6 -0
- package/src/sap/fe/core/controllerextensions/routing/NavigationReason.js.map +1 -0
- package/src/sap/fe/core/controllerextensions/routing/NavigationReason.ts +6 -0
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy-dbg.js +798 -0
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +3 -799
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js.map +1 -0
- package/src/sap/fe/core/controls/Any-dbg.js +32 -0
- package/src/sap/fe/core/controls/Any.js +3 -29
- package/src/sap/fe/core/controls/Any.js.map +1 -0
- package/src/sap/fe/core/controls/AnyElement-dbg.js +29 -0
- package/src/sap/fe/core/controls/AnyElement.js +3 -26
- package/src/sap/fe/core/controls/AnyElement.js.map +1 -0
- package/src/sap/fe/core/controls/CommandExecution-dbg.js +72 -0
- package/src/sap/fe/core/controls/CommandExecution.js +3 -69
- package/src/sap/fe/core/controls/CommandExecution.js.map +1 -0
- package/src/sap/fe/core/controls/ConditionalWrapper-dbg.js +151 -0
- package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -148
- package/src/sap/fe/core/controls/ConditionalWrapper.js.map +1 -0
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper-dbg.js +330 -0
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +3 -328
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js.map +1 -0
- package/src/sap/fe/core/controls/CustomQuickViewPage-dbg.js +126 -0
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -124
- package/src/sap/fe/core/controls/CustomQuickViewPage.js.map +1 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler-dbg.js +170 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -171
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js.map +1 -0
- package/src/sap/fe/core/controls/FieldWrapper-dbg.js +194 -0
- package/src/sap/fe/core/controls/FieldWrapper.js +3 -191
- package/src/sap/fe/core/controls/FieldWrapper.js.map +1 -0
- package/src/sap/fe/core/controls/FileWrapper-dbg.js +280 -0
- package/src/sap/fe/core/controls/FileWrapper.js +3 -277
- package/src/sap/fe/core/controls/FileWrapper.js.map +1 -0
- package/src/sap/fe/core/controls/FilterBar-dbg.js +167 -0
- package/src/sap/fe/core/controls/FilterBar.js +3 -166
- package/src/sap/fe/core/controls/FilterBar.js.map +1 -0
- package/src/sap/fe/core/controls/FormElementWrapper-dbg.js +92 -0
- package/src/sap/fe/core/controls/FormElementWrapper.js +3 -89
- package/src/sap/fe/core/controls/FormElementWrapper.js.map +1 -0
- package/src/sap/fe/core/controls/MassEditSelect-dbg.js +33 -0
- package/src/sap/fe/core/controls/MassEditSelect.js +3 -30
- package/src/sap/fe/core/controls/MassEditSelect.js.map +1 -0
- package/src/sap/fe/core/controls/MultiValueParameterDelegate-dbg.js +37 -0
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -34
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js.map +1 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer-dbg.js +119 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -121
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js.map +1 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter-dbg.js +267 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +3 -264
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js.map +1 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer-dbg.js +150 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -150
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js.map +1 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils-dbg.js +310 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -307
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js.map +1 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +1 -1
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers-dbg.js +491 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +3 -504
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js.map +1 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +2 -2
- package/src/sap/fe/core/converters/ConverterContext-dbg.js +403 -0
- package/src/sap/fe/core/converters/ConverterContext.js +3 -406
- package/src/sap/fe/core/converters/ConverterContext.js.map +1 -0
- package/src/sap/fe/core/converters/ManifestSettings-dbg.js +88 -0
- package/src/sap/fe/core/converters/ManifestSettings.js +3 -84
- package/src/sap/fe/core/converters/ManifestSettings.js.map +1 -0
- package/src/sap/fe/core/converters/ManifestSettings.ts +3 -1
- package/src/sap/fe/core/converters/ManifestWrapper-dbg.js +402 -0
- package/src/sap/fe/core/converters/ManifestWrapper.js +3 -406
- package/src/sap/fe/core/converters/ManifestWrapper.js.map +1 -0
- package/src/sap/fe/core/converters/MetaModelConverter-dbg.js +1161 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +3 -1225
- package/src/sap/fe/core/converters/MetaModelConverter.js.map +1 -0
- package/src/sap/fe/core/converters/MetaModelConverter.ts +193 -199
- package/src/sap/fe/core/converters/TemplateConverter-dbg.js +89 -0
- package/src/sap/fe/core/converters/TemplateConverter.js +3 -86
- package/src/sap/fe/core/converters/TemplateConverter.js.map +1 -0
- package/src/sap/fe/core/converters/annotations/DataField-dbg.js +396 -0
- package/src/sap/fe/core/converters/annotations/DataField.js +3 -394
- package/src/sap/fe/core/converters/annotations/DataField.js.map +1 -0
- package/src/sap/fe/core/converters/annotations/DataField.ts +5 -5
- package/src/sap/fe/core/converters/common/AnnotationConverter-dbg.js +1948 -0
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +3 -1868
- package/src/sap/fe/core/converters/common/AnnotationConverter.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/Action-dbg.js +424 -0
- package/src/sap/fe/core/converters/controls/Common/Action.js +3 -446
- package/src/sap/fe/core/converters/controls/Common/Action.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/Action.ts +31 -14
- package/src/sap/fe/core/converters/controls/Common/Chart-dbg.js +276 -0
- package/src/sap/fe/core/converters/controls/Common/Chart.js +3 -260
- package/src/sap/fe/core/converters/controls/Common/Chart.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +52 -7
- package/src/sap/fe/core/converters/controls/Common/Criticality-dbg.js +42 -0
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -39
- package/src/sap/fe/core/converters/controls/Common/Criticality.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/DataVisualization-dbg.js +247 -0
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -242
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +1 -1
- package/src/sap/fe/core/converters/controls/Common/Form-dbg.js +229 -0
- package/src/sap/fe/core/converters/controls/Common/Form.js +3 -234
- package/src/sap/fe/core/converters/controls/Common/Form.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/KPI-dbg.js +374 -0
- package/src/sap/fe/core/converters/controls/Common/KPI.js +3 -371
- package/src/sap/fe/core/converters/controls/Common/KPI.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/Table-dbg.js +2596 -0
- package/src/sap/fe/core/converters/controls/Common/Table.js +3 -2527
- package/src/sap/fe/core/converters/controls/Common/Table.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/Table.ts +214 -77
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions-dbg.js +522 -0
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +3 -527
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js.map +1 -0
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +51 -50
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar-dbg.js +786 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +3 -845
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js.map +1 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +0 -64
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters-dbg.js +291 -0
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +3 -316
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js.map +1 -0
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +30 -12
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar-dbg.js +56 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +3 -53
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js.map +1 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet-dbg.js +438 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +3 -431
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js.map +1 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection-dbg.js +597 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +3 -630
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js.map +1 -0
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +1 -1
- package/src/sap/fe/core/converters/helpers/Aggregation-dbg.js +204 -0
- package/src/sap/fe/core/converters/helpers/Aggregation.js +3 -204
- package/src/sap/fe/core/converters/helpers/Aggregation.js.map +1 -0
- package/src/sap/fe/core/converters/helpers/BindingHelper-dbg.js +100 -0
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -99
- package/src/sap/fe/core/converters/helpers/BindingHelper.js.map +1 -0
- package/src/sap/fe/core/converters/helpers/ConfigurableObject-dbg.js +199 -0
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +3 -199
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js.map +1 -0
- package/src/sap/fe/core/converters/helpers/DataFieldHelper-dbg.js +143 -0
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +3 -140
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js.map +1 -0
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +2 -1
- package/src/sap/fe/core/converters/helpers/ID-dbg.js +92 -0
- package/src/sap/fe/core/converters/helpers/ID.js +3 -89
- package/src/sap/fe/core/converters/helpers/ID.js.map +1 -0
- package/src/sap/fe/core/converters/helpers/IssueManager-dbg.js +62 -0
- package/src/sap/fe/core/converters/helpers/IssueManager.js +3 -59
- package/src/sap/fe/core/converters/helpers/IssueManager.js.map +1 -0
- package/src/sap/fe/core/converters/helpers/Key-dbg.js +62 -0
- package/src/sap/fe/core/converters/helpers/Key.js +3 -59
- package/src/sap/fe/core/converters/helpers/Key.js.map +1 -0
- package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper-dbg.js +80 -0
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +3 -77
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js.map +1 -0
- package/src/sap/fe/core/converters/objectPage/FormMenuActions-dbg.js +142 -0
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +3 -139
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js.map +1 -0
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction-dbg.js +406 -0
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +3 -422
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js.map +1 -0
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +132 -111
- package/src/sap/fe/core/converters/templates/ListReportConverter-dbg.js +557 -0
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +3 -589
- package/src/sap/fe/core/converters/templates/ListReportConverter.js.map +1 -0
- package/src/sap/fe/core/converters/templates/ObjectPageConverter-dbg.js +474 -0
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +3 -477
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js.map +1 -0
- package/src/sap/fe/core/designtime/AppComponent-dbg.designtime.js +103 -0
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -100
- package/src/sap/fe/core/designtime/AppComponent.designtime.js.map +1 -0
- package/src/sap/fe/core/designtime/library-preload.designtime.js +7 -0
- package/src/sap/fe/core/designtime/library-preload.designtime.js.map +1 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter-dbg.js +95 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +3 -92
- package/src/sap/fe/core/formatters/CollaborationFormatter.js.map +1 -0
- package/src/sap/fe/core/formatters/FPMFormatter-dbg.js +46 -0
- package/src/sap/fe/core/formatters/FPMFormatter.js +3 -44
- package/src/sap/fe/core/formatters/FPMFormatter.js.map +1 -0
- package/src/sap/fe/core/formatters/FPMFormatter.ts +3 -2
- package/src/sap/fe/core/formatters/FiscalFormat-dbg.js +343 -0
- package/src/sap/fe/core/formatters/FiscalFormat.js +6 -0
- package/src/sap/fe/core/formatters/FiscalFormat.js.map +1 -0
- package/src/sap/fe/core/formatters/FiscalFormat.ts +319 -0
- package/src/sap/fe/core/formatters/KPIFormatter-dbg.js +86 -0
- package/src/sap/fe/core/formatters/KPIFormatter.js +3 -83
- package/src/sap/fe/core/formatters/KPIFormatter.js.map +1 -0
- package/src/sap/fe/core/formatters/StandardFormatter-dbg.js +80 -0
- package/src/sap/fe/core/formatters/StandardFormatter.js +3 -78
- package/src/sap/fe/core/formatters/StandardFormatter.js.map +1 -0
- package/src/sap/fe/core/formatters/TableFormatter-dbg.js +276 -0
- package/src/sap/fe/core/formatters/TableFormatter.js +3 -275
- package/src/sap/fe/core/formatters/TableFormatter.js.map +1 -0
- package/src/sap/fe/core/formatters/TableFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/TableFormatterTypes-dbg.js +20 -0
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +3 -17
- package/src/sap/fe/core/formatters/TableFormatterTypes.js.map +1 -0
- package/src/sap/fe/core/formatters/ValueFormatter-dbg.js +172 -0
- package/src/sap/fe/core/formatters/ValueFormatter.js +3 -161
- package/src/sap/fe/core/formatters/ValueFormatter.js.map +1 -0
- package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -8
- package/src/sap/fe/core/fpm/Component-dbg.js +94 -0
- package/src/sap/fe/core/fpm/Component.js +3 -91
- package/src/sap/fe/core/fpm/Component.js.map +1 -0
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AnnotationEnum-dbg.js +30 -0
- package/src/sap/fe/core/helpers/AnnotationEnum.js +3 -36
- package/src/sap/fe/core/helpers/AnnotationEnum.js.map +1 -0
- package/src/sap/fe/core/helpers/AppStartupHelper-dbg.js +334 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.js +3 -335
- package/src/sap/fe/core/helpers/AppStartupHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/BindingToolkit-dbg.js +1739 -0
- package/src/sap/fe/core/helpers/BindingToolkit.js +3 -1611
- package/src/sap/fe/core/helpers/BindingToolkit.js.map +1 -0
- package/src/sap/fe/core/helpers/BindingToolkit.ts +277 -97
- package/src/sap/fe/core/helpers/ClassSupport-dbg.js +421 -0
- package/src/sap/fe/core/helpers/ClassSupport.js +3 -420
- package/src/sap/fe/core/helpers/ClassSupport.js.map +1 -0
- package/src/sap/fe/core/helpers/ClassSupport.ts +13 -15
- package/src/sap/fe/core/helpers/DeleteHelper-dbg.js +526 -0
- package/src/sap/fe/core/helpers/DeleteHelper.js +3 -618
- package/src/sap/fe/core/helpers/DeleteHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/DeleteHelper.ts +116 -134
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper-dbg.js +55 -0
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +3 -52
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/EditState-dbg.js +80 -0
- package/src/sap/fe/core/helpers/EditState.js +3 -77
- package/src/sap/fe/core/helpers/EditState.js.map +1 -0
- package/src/sap/fe/core/helpers/ExcelFormatHelper-dbg.js +55 -0
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +3 -52
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/FPMHelper-dbg.js +55 -0
- package/src/sap/fe/core/helpers/FPMHelper.js +3 -52
- package/src/sap/fe/core/helpers/FPMHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper-dbg.js +180 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +3 -177
- package/src/sap/fe/core/helpers/KeepAliveHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes-dbg.js +28 -0
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +3 -25
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js.map +1 -0
- package/src/sap/fe/core/helpers/LoaderUtils-dbg.js +29 -0
- package/src/sap/fe/core/helpers/LoaderUtils.js +3 -30
- package/src/sap/fe/core/helpers/LoaderUtils.js.map +1 -0
- package/src/sap/fe/core/helpers/MassEditHelper-dbg.js +1229 -0
- package/src/sap/fe/core/helpers/MassEditHelper.js +3 -1309
- package/src/sap/fe/core/helpers/MassEditHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/MassEditHelper.ts +6 -6
- package/src/sap/fe/core/helpers/MessageStrip-dbg.js +65 -0
- package/src/sap/fe/core/helpers/MessageStrip.js +3 -62
- package/src/sap/fe/core/helpers/MessageStrip.js.map +1 -0
- package/src/sap/fe/core/helpers/ModelHelper-dbg.js +489 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +3 -503
- package/src/sap/fe/core/helpers/ModelHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/ModelHelper.ts +13 -36
- package/src/sap/fe/core/helpers/PasteHelper-dbg.js +174 -0
- package/src/sap/fe/core/helpers/PasteHelper.js +3 -185
- package/src/sap/fe/core/helpers/PasteHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators-dbg.js +371 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +3 -368
- package/src/sap/fe/core/helpers/SemanticDateOperators.js.map +1 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper-dbg.js +70 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -67
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/SideEffectsHelper-dbg.js +141 -0
- package/src/sap/fe/core/helpers/SideEffectsHelper.js +3 -137
- package/src/sap/fe/core/helpers/SideEffectsHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/SideEffectsHelper.ts +3 -2
- package/src/sap/fe/core/helpers/StableIdHelper-dbg.js +204 -0
- package/src/sap/fe/core/helpers/StableIdHelper.js +3 -208
- package/src/sap/fe/core/helpers/StableIdHelper.js.map +1 -0
- package/src/sap/fe/core/helpers/Synchronization-dbg.js +35 -0
- package/src/sap/fe/core/helpers/Synchronization.js +3 -33
- package/src/sap/fe/core/helpers/Synchronization.js.map +1 -0
- package/src/sap/fe/core/helpers/ToES6Promise-dbg.js +29 -0
- package/src/sap/fe/core/helpers/ToES6Promise.js +3 -26
- package/src/sap/fe/core/helpers/ToES6Promise.js.map +1 -0
- package/src/sap/fe/core/helpers/TypeGuards-dbg.js +20 -0
- package/src/sap/fe/core/helpers/TypeGuards.js +3 -19
- package/src/sap/fe/core/helpers/TypeGuards.js.map +1 -0
- package/src/sap/fe/core/helpers/TypeGuards.ts +5 -1
- package/src/sap/fe/core/jsx-runtime/Fragment-dbg.js +14 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +3 -11
- package/src/sap/fe/core/jsx-runtime/Fragment.js.map +1 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader-dbg.js +76 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +3 -86
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js.map +1 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control-dbg.js +124 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +3 -98
- package/src/sap/fe/core/jsx-runtime/jsx-control.js.map +1 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +43 -17
- package/src/sap/fe/core/jsx-runtime/jsx-dbg.js +41 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml-dbg.js +94 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +3 -90
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js.map +1 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.js +3 -28
- package/src/sap/fe/core/jsx-runtime/jsx.js.map +1 -0
- package/src/sap/fe/core/jsx-runtime/jsx.ts +19 -1
- package/src/sap/fe/core/jsx-runtime/jsxs-dbg.js +10 -0
- package/src/sap/fe/core/jsx-runtime/jsxs.js +3 -7
- package/src/sap/fe/core/jsx-runtime/jsxs.js.map +1 -0
- package/src/sap/fe/core/jsx-runtime/useMDXComponents-dbg.js +154 -0
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +3 -153
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js.map +1 -0
- package/src/sap/fe/core/library-dbg.js +437 -0
- package/src/sap/fe/core/library-preload.js +900 -0
- package/src/sap/fe/core/library-preload.js.map +1 -0
- package/src/sap/fe/core/library-preload.support.js +177 -0
- package/src/sap/fe/core/library-preload.support.js.map +1 -0
- package/src/sap/fe/core/library.js +3 -461
- package/src/sap/fe/core/library.js.map +1 -0
- package/src/sap/fe/core/library.support.js +1 -1
- package/src/sap/fe/core/library.ts +12 -25
- package/src/sap/fe/core/manifest.json +100 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration-dbg.js +99 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -96
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js.map +1 -0
- package/src/sap/fe/core/messagebundle.properties +6 -0
- package/src/sap/fe/core/messagebundle_ar.properties +22 -0
- package/src/sap/fe/core/messagebundle_bg.properties +22 -0
- package/src/sap/fe/core/messagebundle_ca.properties +22 -0
- package/src/sap/fe/core/messagebundle_cs.properties +22 -0
- package/src/sap/fe/core/messagebundle_cy.properties +22 -0
- package/src/sap/fe/core/messagebundle_da.properties +22 -0
- package/src/sap/fe/core/messagebundle_de.properties +22 -0
- package/src/sap/fe/core/messagebundle_el.properties +22 -0
- package/src/sap/fe/core/messagebundle_en.properties +22 -0
- package/src/sap/fe/core/messagebundle_en_GB.properties +22 -0
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +22 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +4 -0
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +4 -0
- package/src/sap/fe/core/messagebundle_es.properties +22 -0
- package/src/sap/fe/core/messagebundle_es_MX.properties +22 -0
- package/src/sap/fe/core/messagebundle_et.properties +22 -0
- package/src/sap/fe/core/messagebundle_fi.properties +22 -0
- package/src/sap/fe/core/messagebundle_fr.properties +22 -0
- package/src/sap/fe/core/messagebundle_fr_CA.properties +22 -0
- package/src/sap/fe/core/messagebundle_hi.properties +22 -0
- package/src/sap/fe/core/messagebundle_hr.properties +23 -1
- package/src/sap/fe/core/messagebundle_hu.properties +22 -0
- package/src/sap/fe/core/messagebundle_id.properties +22 -0
- package/src/sap/fe/core/messagebundle_it.properties +22 -0
- package/src/sap/fe/core/messagebundle_iw.properties +22 -0
- package/src/sap/fe/core/messagebundle_ja.properties +22 -0
- package/src/sap/fe/core/messagebundle_kk.properties +22 -0
- package/src/sap/fe/core/messagebundle_ko.properties +22 -0
- package/src/sap/fe/core/messagebundle_lt.properties +22 -0
- package/src/sap/fe/core/messagebundle_lv.properties +22 -0
- package/src/sap/fe/core/messagebundle_ms.properties +22 -0
- package/src/sap/fe/core/messagebundle_nl.properties +22 -0
- package/src/sap/fe/core/messagebundle_no.properties +22 -0
- package/src/sap/fe/core/messagebundle_pl.properties +22 -0
- package/src/sap/fe/core/messagebundle_pt.properties +22 -0
- package/src/sap/fe/core/messagebundle_pt_PT.properties +22 -0
- package/src/sap/fe/core/messagebundle_ro.properties +22 -0
- package/src/sap/fe/core/messagebundle_ru.properties +22 -0
- package/src/sap/fe/core/messagebundle_sh.properties +22 -0
- package/src/sap/fe/core/messagebundle_sk.properties +22 -0
- package/src/sap/fe/core/messagebundle_sl.properties +22 -0
- package/src/sap/fe/core/messagebundle_sv.properties +22 -0
- package/src/sap/fe/core/messagebundle_th.properties +22 -0
- package/src/sap/fe/core/messagebundle_tr.properties +22 -0
- package/src/sap/fe/core/messagebundle_uk.properties +22 -0
- package/src/sap/fe/core/messagebundle_vi.properties +22 -0
- package/src/sap/fe/core/messagebundle_zh_CN.properties +22 -0
- package/src/sap/fe/core/messagebundle_zh_TW.properties +22 -0
- package/src/sap/fe/core/operationsHelper-dbg.js +155 -0
- package/src/sap/fe/core/operationsHelper.js +3 -205
- package/src/sap/fe/core/operationsHelper.js.map +1 -0
- package/src/sap/fe/core/operationsHelper.ts +14 -68
- package/src/sap/fe/core/rootView/Fcl-dbg.controller.js +837 -0
- package/src/sap/fe/core/rootView/Fcl.controller.js +3 -855
- package/src/sap/fe/core/rootView/Fcl.controller.js.map +1 -0
- package/src/sap/fe/core/rootView/NavContainer-dbg.controller.js +190 -0
- package/src/sap/fe/core/rootView/NavContainer.controller.js +3 -190
- package/src/sap/fe/core/rootView/NavContainer.controller.js.map +1 -0
- package/src/sap/fe/core/rootView/RootViewBaseController-dbg.js +506 -0
- package/src/sap/fe/core/rootView/RootViewBaseController.js +3 -538
- package/src/sap/fe/core/rootView/RootViewBaseController.js.map +1 -0
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +3 -4
- package/src/sap/fe/core/services/AsyncComponentServiceFactory-dbg.js +60 -0
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -60
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js.map +1 -0
- package/src/sap/fe/core/services/CacheHandlerServiceFactory-dbg.js +196 -0
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +3 -219
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js.map +1 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory-dbg.js +80 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +3 -82
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js.map +1 -0
- package/src/sap/fe/core/services/NavigationServiceFactory-dbg.js +320 -0
- package/src/sap/fe/core/services/NavigationServiceFactory.js +3 -320
- package/src/sap/fe/core/services/NavigationServiceFactory.js.map +1 -0
- package/src/sap/fe/core/services/ResourceModelServiceFactory-dbg.js +91 -0
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -89
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js.map +1 -0
- package/src/sap/fe/core/services/RoutingServiceFactory-dbg.js +817 -0
- package/src/sap/fe/core/services/RoutingServiceFactory.js +3 -847
- package/src/sap/fe/core/services/RoutingServiceFactory.js.map +1 -0
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +6 -3
- package/src/sap/fe/core/services/ShellServicesFactory-dbg.js +732 -0
- package/src/sap/fe/core/services/ShellServicesFactory.js +3 -752
- package/src/sap/fe/core/services/ShellServicesFactory.js.map +1 -0
- package/src/sap/fe/core/services/SideEffectsServiceFactory-dbg.js +569 -0
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +3 -599
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js.map +1 -0
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +3 -3
- package/src/sap/fe/core/services/TemplatedViewServiceFactory-dbg.js +355 -0
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +3 -387
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js.map +1 -0
- package/src/sap/fe/core/services/view/TemplatingErrorPage-dbg.controller.js +37 -0
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +3 -34
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js.map +1 -0
- package/src/sap/fe/core/support/AnnotationIssue.support.js +4 -4
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +3 -3
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +3 -3
- package/src/sap/fe/core/support/CommonHelper-dbg.js +63 -0
- package/src/sap/fe/core/support/CommonHelper.js +3 -60
- package/src/sap/fe/core/support/CommonHelper.js.map +1 -0
- package/src/sap/fe/core/support/Diagnostics-dbg.js +44 -0
- package/src/sap/fe/core/support/Diagnostics.js +3 -49
- package/src/sap/fe/core/support/Diagnostics.js.map +1 -0
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +3 -3
- package/src/sap/fe/core/templating/CommonFormatters-dbg.js +70 -0
- package/src/sap/fe/core/templating/CommonFormatters.js +3 -66
- package/src/sap/fe/core/templating/CommonFormatters.js.map +1 -0
- package/src/sap/fe/core/templating/CommonFormatters.ts +9 -3
- package/src/sap/fe/core/templating/CriticalityFormatters-dbg.js +136 -0
- package/src/sap/fe/core/templating/CriticalityFormatters.js +3 -133
- package/src/sap/fe/core/templating/CriticalityFormatters.js.map +1 -0
- package/src/sap/fe/core/templating/DataFieldFormatters-dbg.js +58 -0
- package/src/sap/fe/core/templating/DataFieldFormatters.js +3 -55
- package/src/sap/fe/core/templating/DataFieldFormatters.js.map +1 -0
- package/src/sap/fe/core/templating/DataModelPathHelper-dbg.js +363 -0
- package/src/sap/fe/core/templating/DataModelPathHelper.js +3 -372
- package/src/sap/fe/core/templating/DataModelPathHelper.js.map +1 -0
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +17 -8
- package/src/sap/fe/core/templating/DisplayModeFormatter-dbg.js +56 -0
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +3 -124
- package/src/sap/fe/core/templating/DisplayModeFormatter.js.map +1 -0
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +0 -47
- package/src/sap/fe/core/templating/EntitySetHelper-dbg.js +68 -0
- package/src/sap/fe/core/templating/EntitySetHelper.js +3 -81
- package/src/sap/fe/core/templating/EntitySetHelper.js.map +1 -0
- package/src/sap/fe/core/templating/FieldControlHelper-dbg.js +77 -0
- package/src/sap/fe/core/templating/FieldControlHelper.js +3 -74
- package/src/sap/fe/core/templating/FieldControlHelper.js.map +1 -0
- package/src/sap/fe/core/templating/FilterHelper-dbg.js +346 -0
- package/src/sap/fe/core/templating/FilterHelper.js +3 -339
- package/src/sap/fe/core/templating/FilterHelper.js.map +1 -0
- package/src/sap/fe/core/templating/FilterHelper.ts +2 -21
- package/src/sap/fe/core/templating/FilterTemplating-dbg.js +62 -0
- package/src/sap/fe/core/templating/FilterTemplating.js +3 -59
- package/src/sap/fe/core/templating/FilterTemplating.js.map +1 -0
- package/src/sap/fe/core/templating/PropertyFormatters-dbg.js +93 -0
- package/src/sap/fe/core/templating/PropertyFormatters.js +3 -90
- package/src/sap/fe/core/templating/PropertyFormatters.js.map +1 -0
- package/src/sap/fe/core/templating/PropertyHelper-dbg.js +340 -0
- package/src/sap/fe/core/templating/PropertyHelper.js +3 -337
- package/src/sap/fe/core/templating/PropertyHelper.js.map +1 -0
- package/src/sap/fe/core/templating/SemanticObjectHelper-dbg.js +91 -0
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +3 -43
- package/src/sap/fe/core/templating/SemanticObjectHelper.js.map +1 -0
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +45 -1
- package/src/sap/fe/core/templating/UIFormatters-dbg.js +498 -0
- package/src/sap/fe/core/templating/UIFormatters.js +3 -544
- package/src/sap/fe/core/templating/UIFormatters.js.map +1 -0
- package/src/sap/fe/core/templating/UIFormatters.ts +60 -110
- package/src/sap/fe/core/type/DateTimeWithTimezone-dbg.js +35 -0
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -33
- package/src/sap/fe/core/type/DateTimeWithTimezone.js.map +1 -0
- package/src/sap/fe/core/type/EDM-dbg.js +84 -0
- package/src/sap/fe/core/type/EDM.js +6 -0
- package/src/sap/fe/core/type/EDM.js.map +1 -0
- package/src/sap/fe/core/type/EDM.ts +70 -0
- package/src/sap/fe/core/type/Email-dbg.js +29 -0
- package/src/sap/fe/core/type/Email.js +3 -26
- package/src/sap/fe/core/type/Email.js.map +1 -0
- package/src/sap/fe/core/type/FiscalDate-dbg.js +174 -0
- package/src/sap/fe/core/type/FiscalDate.js +6 -0
- package/src/sap/fe/core/type/FiscalDate.js.map +1 -0
- package/src/sap/fe/core/type/FiscalDate.ts +179 -0
- package/src/sap/fe/core/type/TypeUtil-dbg.js +58 -0
- package/src/sap/fe/core/type/TypeUtil.js +3 -55
- package/src/sap/fe/core/type/TypeUtil.js.map +1 -0
- package/src/sap/fe/core/type/TypeUtil.ts +1 -0
- package/src/.eslintrc +0 -7
|
@@ -0,0 +1,1229 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2023 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/helpers/BindingToolkit", "sap/fe/core/library", "sap/fe/core/TemplateModel", "sap/fe/core/templating/DataModelPathHelper", "sap/fe/core/templating/PropertyHelper", "sap/fe/macros/field/FieldHelper", "sap/fe/macros/field/FieldTemplating", "sap/fe/macros/table/TableHelper", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageToast", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/mdc/enum/EditMode", "sap/ui/model/json/JSONModel", "../controllerextensions/messageHandler/messageHandling", "../controls/Any", "../converters/MetaModelConverter", "../templating/FieldControlHelper", "../templating/UIFormatters", "./SideEffectsHelper"], function (Log, CommonUtils, BindingToolkit, FELibrary, TemplateModel, DataModelPathHelper, PropertyHelper, FieldHelper, FieldTemplating, TableHelper, Button, Dialog, MessageToast, Core, Fragment, XMLPreprocessor, XMLTemplateProcessor, EditMode, JSONModel, messageHandling, Any, MetaModelConverter, FieldControlHelper, UIFormatters, SideEffectsHelper) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var isMultiValueField = UIFormatters.isMultiValueField;
|
|
9
|
+
var getRequiredExpression = UIFormatters.getRequiredExpression;
|
|
10
|
+
var getEditMode = UIFormatters.getEditMode;
|
|
11
|
+
var isReadOnlyExpression = FieldControlHelper.isReadOnlyExpression;
|
|
12
|
+
var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
|
|
13
|
+
var convertMetaModelContext = MetaModelConverter.convertMetaModelContext;
|
|
14
|
+
var setEditStyleProperties = FieldTemplating.setEditStyleProperties;
|
|
15
|
+
var getTextBinding = FieldTemplating.getTextBinding;
|
|
16
|
+
var hasValueHelpWithFixedValues = PropertyHelper.hasValueHelpWithFixedValues;
|
|
17
|
+
var hasValueHelp = PropertyHelper.hasValueHelp;
|
|
18
|
+
var hasUnit = PropertyHelper.hasUnit;
|
|
19
|
+
var hasCurrency = PropertyHelper.hasCurrency;
|
|
20
|
+
var getAssociatedUnitPropertyPath = PropertyHelper.getAssociatedUnitPropertyPath;
|
|
21
|
+
var getAssociatedUnitProperty = PropertyHelper.getAssociatedUnitProperty;
|
|
22
|
+
var getRelativePaths = DataModelPathHelper.getRelativePaths;
|
|
23
|
+
var enhanceDataModelPath = DataModelPathHelper.enhanceDataModelPath;
|
|
24
|
+
var pathInModel = BindingToolkit.pathInModel;
|
|
25
|
+
var or = BindingToolkit.or;
|
|
26
|
+
var not = BindingToolkit.not;
|
|
27
|
+
var ifElse = BindingToolkit.ifElse;
|
|
28
|
+
var constant = BindingToolkit.constant;
|
|
29
|
+
var compileExpression = BindingToolkit.compileExpression;
|
|
30
|
+
const MassEditHelper = {
|
|
31
|
+
/**
|
|
32
|
+
* Initializes the value at final or deepest level path with a blank array.
|
|
33
|
+
* Return an empty array pointing to the final or deepest level path.
|
|
34
|
+
*
|
|
35
|
+
* @param sPath Property path
|
|
36
|
+
* @param aValues Array instance where the default data needs to be added
|
|
37
|
+
* @returns The final path
|
|
38
|
+
*/
|
|
39
|
+
initLastLevelOfPropertyPath: function (sPath, aValues) {
|
|
40
|
+
let aFinalPath;
|
|
41
|
+
let index = 0;
|
|
42
|
+
const aPaths = sPath.split("/");
|
|
43
|
+
let sFullPath = "";
|
|
44
|
+
aPaths.forEach(function (sPropertyPath) {
|
|
45
|
+
if (!aValues[sPropertyPath] && index === 0) {
|
|
46
|
+
aValues[sPropertyPath] = {};
|
|
47
|
+
aFinalPath = aValues[sPropertyPath];
|
|
48
|
+
sFullPath = sFullPath + sPropertyPath;
|
|
49
|
+
index++;
|
|
50
|
+
} else if (!aFinalPath[sPropertyPath]) {
|
|
51
|
+
sFullPath = `${sFullPath}/${sPropertyPath}`;
|
|
52
|
+
if (sFullPath !== sPath) {
|
|
53
|
+
aFinalPath[sPropertyPath] = {};
|
|
54
|
+
aFinalPath = aFinalPath[sPropertyPath];
|
|
55
|
+
} else {
|
|
56
|
+
aFinalPath[sPropertyPath] = [];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return aFinalPath;
|
|
61
|
+
},
|
|
62
|
+
/**
|
|
63
|
+
* Method to get unique values for given array values.
|
|
64
|
+
*
|
|
65
|
+
* @param sValue Property value
|
|
66
|
+
* @param index Index of the property value
|
|
67
|
+
* @param self Instance of the array
|
|
68
|
+
* @returns The unique value
|
|
69
|
+
*/
|
|
70
|
+
getUniqueValues: function (sValue, index, self) {
|
|
71
|
+
return sValue != undefined && sValue != null ? self.indexOf(sValue) === index : undefined;
|
|
72
|
+
},
|
|
73
|
+
/**
|
|
74
|
+
* Gets the property value for a multi-level path (for example: _Materials/Material_Details gets the value of Material_Details under _Materials Object).
|
|
75
|
+
* Returns the propertyValue, which can be of any type (string, number, etc..).
|
|
76
|
+
*
|
|
77
|
+
* @param sDataPropertyPath Property path
|
|
78
|
+
* @param oValues Object of property values
|
|
79
|
+
* @returns The property value
|
|
80
|
+
*/
|
|
81
|
+
getValueForMultiLevelPath: function (sDataPropertyPath, oValues) {
|
|
82
|
+
let result;
|
|
83
|
+
if (sDataPropertyPath && sDataPropertyPath.indexOf("/") > 0) {
|
|
84
|
+
const aPropertyPaths = sDataPropertyPath.split("/");
|
|
85
|
+
aPropertyPaths.forEach(function (sPath) {
|
|
86
|
+
result = oValues && oValues[sPath] ? oValues[sPath] : result && result[sPath];
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
},
|
|
91
|
+
/**
|
|
92
|
+
* Gets the key path for the key of a combo box that must be selected initially when the dialog opens:
|
|
93
|
+
* => If propertyValue for all selected contexts is different, then < Keep Existing Values > is preselected.
|
|
94
|
+
* => If propertyValue for all selected contexts is the same, then the propertyValue is preselected.
|
|
95
|
+
* => If propertyValue for all selected contexts is empty, then < Leave Blank > is preselected.
|
|
96
|
+
*
|
|
97
|
+
*
|
|
98
|
+
* @param aContexts Contexts for mass edit
|
|
99
|
+
* @param sDataPropertyPath Data property path
|
|
100
|
+
* @returns The key path
|
|
101
|
+
*/
|
|
102
|
+
getDefaultSelectionPathComboBox: function (aContexts, sDataPropertyPath) {
|
|
103
|
+
let result;
|
|
104
|
+
if (sDataPropertyPath && aContexts.length > 0) {
|
|
105
|
+
const oSelectedContext = aContexts,
|
|
106
|
+
aPropertyValues = [];
|
|
107
|
+
oSelectedContext.forEach(function (oContext) {
|
|
108
|
+
const oDataObject = oContext.getObject();
|
|
109
|
+
const sMultiLevelPathCondition = sDataPropertyPath.indexOf("/") > -1 && oDataObject.hasOwnProperty(sDataPropertyPath.split("/")[0]);
|
|
110
|
+
if (oContext && (oDataObject.hasOwnProperty(sDataPropertyPath) || sMultiLevelPathCondition)) {
|
|
111
|
+
aPropertyValues.push(oContext.getObject(sDataPropertyPath));
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
const aUniquePropertyValues = aPropertyValues.filter(MassEditHelper.getUniqueValues);
|
|
115
|
+
if (aUniquePropertyValues.length > 1) {
|
|
116
|
+
result = `Default/${sDataPropertyPath}`;
|
|
117
|
+
} else if (aUniquePropertyValues.length === 0) {
|
|
118
|
+
result = `Empty/${sDataPropertyPath}`;
|
|
119
|
+
} else if (aUniquePropertyValues.length === 1) {
|
|
120
|
+
result = `${sDataPropertyPath}/${aUniquePropertyValues[0]}`;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return result;
|
|
124
|
+
},
|
|
125
|
+
/**
|
|
126
|
+
* Checks hidden annotation value [both static and path based] for table's selected context.
|
|
127
|
+
*
|
|
128
|
+
* @param hiddenValue Hidden annotation value / path for field
|
|
129
|
+
* @param aContexts Contexts for mass edit
|
|
130
|
+
* @returns The hidden annotation value
|
|
131
|
+
*/
|
|
132
|
+
getHiddenValueForContexts: function (hiddenValue, aContexts) {
|
|
133
|
+
if (hiddenValue && hiddenValue.$Path) {
|
|
134
|
+
return !aContexts.some(function (oSelectedContext) {
|
|
135
|
+
return oSelectedContext.getObject(hiddenValue.$Path) === false;
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
return hiddenValue;
|
|
139
|
+
},
|
|
140
|
+
getInputType: function (propertyInfo, dataFieldConverted, oDataModelPath) {
|
|
141
|
+
const editStyleProperties = {};
|
|
142
|
+
let inputType;
|
|
143
|
+
if (propertyInfo) {
|
|
144
|
+
setEditStyleProperties(editStyleProperties, dataFieldConverted, oDataModelPath, true);
|
|
145
|
+
inputType = (editStyleProperties === null || editStyleProperties === void 0 ? void 0 : editStyleProperties.editStyle) || "";
|
|
146
|
+
}
|
|
147
|
+
const isValidForMassEdit = inputType && ["DatePicker", "TimePicker", "DateTimePicker", "RatingIndicator"].indexOf(inputType) === -1 && !isMultiValueField(oDataModelPath) && !hasValueHelpWithFixedValues(propertyInfo);
|
|
148
|
+
return (isValidForMassEdit || "") && inputType;
|
|
149
|
+
},
|
|
150
|
+
getIsFieldGrp: function (dataFieldConverted) {
|
|
151
|
+
return dataFieldConverted && dataFieldConverted.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAnnotation" && dataFieldConverted.Target && dataFieldConverted.Target.value && dataFieldConverted.Target.value.indexOf("FieldGroup") > -1;
|
|
152
|
+
},
|
|
153
|
+
/**
|
|
154
|
+
* Get text path for the mass edit field.
|
|
155
|
+
*
|
|
156
|
+
* @param property Property path
|
|
157
|
+
* @param textBinding Text Binding Info
|
|
158
|
+
* @param displayMode Display mode
|
|
159
|
+
* @returns Text Property Path if it exists
|
|
160
|
+
*/
|
|
161
|
+
getTextPath: function (property, textBinding, displayMode) {
|
|
162
|
+
let descriptionPath;
|
|
163
|
+
if (textBinding && (textBinding.path || textBinding.parameters && textBinding.parameters.length) && property) {
|
|
164
|
+
if (textBinding.path && displayMode === "Description") {
|
|
165
|
+
descriptionPath = textBinding.path;
|
|
166
|
+
} else if (textBinding.parameters) {
|
|
167
|
+
textBinding.parameters.forEach(function (props) {
|
|
168
|
+
if (props.path && props.path !== property) {
|
|
169
|
+
descriptionPath = props.path;
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return descriptionPath;
|
|
175
|
+
},
|
|
176
|
+
/**
|
|
177
|
+
* Initializes a JSON Model for properties of dialog fields [label, visiblity, dataproperty, etc.].
|
|
178
|
+
*
|
|
179
|
+
* @param oTable Instance of Table
|
|
180
|
+
* @param aContexts Contexts for mass edit
|
|
181
|
+
* @param aDataArray Array containing data related to the dialog used by both the static and the runtime model
|
|
182
|
+
* @returns The model
|
|
183
|
+
*/
|
|
184
|
+
prepareDataForDialog: function (oTable, aContexts, aDataArray) {
|
|
185
|
+
const oMetaModel = oTable && oTable.getModel().getMetaModel(),
|
|
186
|
+
sCurrentEntitySetName = oTable.data("metaPath"),
|
|
187
|
+
aTableFields = MassEditHelper.getTableFields(oTable),
|
|
188
|
+
oEntityTypeContext = oMetaModel.getContext(`${sCurrentEntitySetName}/@`),
|
|
189
|
+
oEntitySetContext = oMetaModel.getContext(sCurrentEntitySetName),
|
|
190
|
+
oDataModelObjectPath = getInvolvedDataModelObjects(oEntityTypeContext);
|
|
191
|
+
const oDataFieldModel = new JSONModel();
|
|
192
|
+
let oResult;
|
|
193
|
+
let sLabelText;
|
|
194
|
+
let bValueHelpEnabled;
|
|
195
|
+
let sUnitPropertyPath;
|
|
196
|
+
let bValueHelpEnabledForUnit;
|
|
197
|
+
let oTextBinding;
|
|
198
|
+
aTableFields.forEach(function (oColumnInfo) {
|
|
199
|
+
const sDataPropertyPath = oColumnInfo.dataProperty;
|
|
200
|
+
if (sDataPropertyPath) {
|
|
201
|
+
var _oDataFieldConverted$, _oDataFieldConverted$2, _oPropertyInfo, _oPropertyInfo$annota, _oPropertyInfo$annota2, _unitPropertyInfo$ann, _unitPropertyInfo$ann2;
|
|
202
|
+
let oPropertyInfo = sDataPropertyPath && oMetaModel.getObject(`${sCurrentEntitySetName}/${sDataPropertyPath}@`);
|
|
203
|
+
sLabelText = oColumnInfo.label || oPropertyInfo && oPropertyInfo["@com.sap.vocabularies.Common.v1.Label"] || sDataPropertyPath;
|
|
204
|
+
if (oDataModelObjectPath) {
|
|
205
|
+
oDataModelObjectPath.targetObject = oDataModelObjectPath.targetEntityType.entityProperties.filter(function (oProperty) {
|
|
206
|
+
return oProperty.name === sDataPropertyPath;
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
oDataModelObjectPath.targetObject = oDataModelObjectPath.targetObject[0] || {};
|
|
210
|
+
oTextBinding = getTextBinding(oDataModelObjectPath, {}, true) || {};
|
|
211
|
+
const oFieldContext = oMetaModel.getContext(oColumnInfo.annotationPath),
|
|
212
|
+
oDataFieldConverted = convertMetaModelContext(oFieldContext),
|
|
213
|
+
oPropertyContext = oMetaModel.getContext(`${sCurrentEntitySetName}/${sDataPropertyPath}@`),
|
|
214
|
+
oInterface = oPropertyContext && oPropertyContext.getInterface();
|
|
215
|
+
let oDataModelPath = getInvolvedDataModelObjects(oFieldContext, oEntitySetContext);
|
|
216
|
+
if ((oDataFieldConverted === null || oDataFieldConverted === void 0 ? void 0 : (_oDataFieldConverted$ = oDataFieldConverted.Value) === null || _oDataFieldConverted$ === void 0 ? void 0 : (_oDataFieldConverted$2 = _oDataFieldConverted$.path) === null || _oDataFieldConverted$2 === void 0 ? void 0 : _oDataFieldConverted$2.length) > 0) {
|
|
217
|
+
oDataModelPath = enhanceDataModelPath(oDataModelPath, sDataPropertyPath);
|
|
218
|
+
}
|
|
219
|
+
const bHiddenField = MassEditHelper.getHiddenValueForContexts(oFieldContext && oFieldContext.getObject()["@com.sap.vocabularies.UI.v1.Hidden"], aContexts) || false;
|
|
220
|
+
const isImage = oPropertyInfo && oPropertyInfo["@com.sap.vocabularies.UI.v1.IsImageURL"];
|
|
221
|
+
oInterface.context = {
|
|
222
|
+
getModel: function () {
|
|
223
|
+
return oInterface.getModel();
|
|
224
|
+
},
|
|
225
|
+
getPath: function () {
|
|
226
|
+
return `${sCurrentEntitySetName}/${sDataPropertyPath}`;
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
oPropertyInfo = oDataFieldConverted._type === "Property" ? oDataFieldConverted : oDataFieldConverted && oDataFieldConverted.Value && oDataFieldConverted.Value.$target || oDataFieldConverted && oDataFieldConverted.Target && oDataFieldConverted.Target.$target;
|
|
230
|
+
// Datafield is not included in the FieldControl calculation, needs to be implemented
|
|
231
|
+
|
|
232
|
+
const chartProperty = oPropertyInfo && oPropertyInfo.term && oPropertyInfo.term === "com.sap.vocabularies.UI.v1.Chart";
|
|
233
|
+
const isAction = !!oDataFieldConverted.Action;
|
|
234
|
+
const isFieldGrp = MassEditHelper.getIsFieldGrp(oDataFieldConverted);
|
|
235
|
+
if (isImage || bHiddenField || chartProperty || isAction || isFieldGrp) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// ValueHelp properties
|
|
240
|
+
sUnitPropertyPath = (hasCurrency(oPropertyInfo) || hasUnit(oPropertyInfo)) && getAssociatedUnitPropertyPath(oPropertyInfo) || "";
|
|
241
|
+
const unitPropertyInfo = sUnitPropertyPath && getAssociatedUnitProperty(oPropertyInfo);
|
|
242
|
+
bValueHelpEnabled = hasValueHelp(oPropertyInfo);
|
|
243
|
+
bValueHelpEnabledForUnit = unitPropertyInfo && hasValueHelp(unitPropertyInfo);
|
|
244
|
+
const hasContextDependentVH = (bValueHelpEnabled || bValueHelpEnabledForUnit) && (((_oPropertyInfo = oPropertyInfo) === null || _oPropertyInfo === void 0 ? void 0 : (_oPropertyInfo$annota = _oPropertyInfo.annotations) === null || _oPropertyInfo$annota === void 0 ? void 0 : (_oPropertyInfo$annota2 = _oPropertyInfo$annota.Common) === null || _oPropertyInfo$annota2 === void 0 ? void 0 : _oPropertyInfo$annota2.ValueListRelevantQualifiers) || unitPropertyInfo && (unitPropertyInfo === null || unitPropertyInfo === void 0 ? void 0 : (_unitPropertyInfo$ann = unitPropertyInfo.annotations) === null || _unitPropertyInfo$ann === void 0 ? void 0 : (_unitPropertyInfo$ann2 = _unitPropertyInfo$ann.Common) === null || _unitPropertyInfo$ann2 === void 0 ? void 0 : _unitPropertyInfo$ann2.ValueListRelevantQualifiers));
|
|
245
|
+
if (hasContextDependentVH) {
|
|
246
|
+
// context dependent VH is not supported for Mass Edit.
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// EditMode and InputType
|
|
251
|
+
const propertyForFieldControl = oPropertyInfo && oPropertyInfo.Value ? oPropertyInfo.Value : oPropertyInfo;
|
|
252
|
+
const expBinding = getEditMode(propertyForFieldControl, oDataModelPath, false, false, oDataFieldConverted, constant(true));
|
|
253
|
+
const editModeValues = Object.keys(EditMode);
|
|
254
|
+
const editModeIsStatic = !!expBinding && editModeValues.includes(expBinding);
|
|
255
|
+
const editable = !!expBinding && (editModeIsStatic && expBinding === EditMode.Editable || !editModeIsStatic);
|
|
256
|
+
const navPropertyWithValueHelp = sDataPropertyPath.includes("/") && bValueHelpEnabled;
|
|
257
|
+
if (!editable || navPropertyWithValueHelp) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const inputType = MassEditHelper.getInputType(oPropertyInfo, oDataFieldConverted, oDataModelPath);
|
|
261
|
+
if (inputType) {
|
|
262
|
+
const relativePath = getRelativePaths(oDataModelPath);
|
|
263
|
+
const isReadOnly = isReadOnlyExpression(oPropertyInfo, relativePath);
|
|
264
|
+
const displayMode = CommonUtils.computeDisplayMode(oPropertyContext.getObject());
|
|
265
|
+
const isValueHelpEnabled = bValueHelpEnabled ? bValueHelpEnabled : false;
|
|
266
|
+
const isValueHelpEnabledForUnit = bValueHelpEnabledForUnit && !sUnitPropertyPath.includes("/") ? bValueHelpEnabledForUnit : false;
|
|
267
|
+
const unitProperty = sUnitPropertyPath && !sDataPropertyPath.includes("/") ? sUnitPropertyPath : false;
|
|
268
|
+
oResult = {
|
|
269
|
+
label: sLabelText,
|
|
270
|
+
dataProperty: sDataPropertyPath,
|
|
271
|
+
isValueHelpEnabled: bValueHelpEnabled ? bValueHelpEnabled : false,
|
|
272
|
+
unitProperty,
|
|
273
|
+
isFieldRequired: getRequiredExpression(oPropertyInfo, oDataFieldConverted, true, false, {}, oDataModelPath),
|
|
274
|
+
defaultSelectionPath: sDataPropertyPath ? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sDataPropertyPath) : false,
|
|
275
|
+
defaultSelectionUnitPath: sUnitPropertyPath ? MassEditHelper.getDefaultSelectionPathComboBox(aContexts, sUnitPropertyPath) : false,
|
|
276
|
+
entitySet: sCurrentEntitySetName,
|
|
277
|
+
display: displayMode,
|
|
278
|
+
descriptionPath: MassEditHelper.getTextPath(sDataPropertyPath, oTextBinding, displayMode),
|
|
279
|
+
nullable: oPropertyInfo.nullable !== undefined ? oPropertyInfo.nullable : true,
|
|
280
|
+
isPropertyReadOnly: isReadOnly !== undefined ? isReadOnly : false,
|
|
281
|
+
inputType: inputType,
|
|
282
|
+
editMode: editable ? expBinding : undefined,
|
|
283
|
+
propertyInfo: {
|
|
284
|
+
hasVH: isValueHelpEnabled,
|
|
285
|
+
runtimePath: "fieldsInfo>/values/",
|
|
286
|
+
relativePath: sDataPropertyPath,
|
|
287
|
+
propertyPathForValueHelp: `${sCurrentEntitySetName}/${sDataPropertyPath}`
|
|
288
|
+
},
|
|
289
|
+
unitInfo: unitProperty && {
|
|
290
|
+
hasVH: isValueHelpEnabledForUnit,
|
|
291
|
+
runtimePath: "fieldsInfo>/unitData/",
|
|
292
|
+
relativePath: unitProperty,
|
|
293
|
+
propertyPathForValueHelp: `${sCurrentEntitySetName}/${unitProperty}`
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
aDataArray.push(oResult);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
oDataFieldModel.setData(aDataArray);
|
|
301
|
+
return oDataFieldModel;
|
|
302
|
+
},
|
|
303
|
+
getTableFields: function (oTable) {
|
|
304
|
+
const aColumns = oTable && oTable.getColumns() || [];
|
|
305
|
+
const columnsData = oTable && oTable.getParent().getTableDefinition().columns;
|
|
306
|
+
return aColumns.map(function (oColumn) {
|
|
307
|
+
const sDataProperty = oColumn && oColumn.getDataProperty(),
|
|
308
|
+
aRealtedColumnInfo = columnsData && columnsData.filter(function (oColumnInfo) {
|
|
309
|
+
return oColumnInfo.name === sDataProperty && oColumnInfo.type === "Annotation";
|
|
310
|
+
});
|
|
311
|
+
return {
|
|
312
|
+
dataProperty: sDataProperty,
|
|
313
|
+
label: oColumn.getHeader(),
|
|
314
|
+
annotationPath: aRealtedColumnInfo && aRealtedColumnInfo[0] && aRealtedColumnInfo[0].annotationPath
|
|
315
|
+
};
|
|
316
|
+
});
|
|
317
|
+
},
|
|
318
|
+
getDefaultTextsForDialog: function (oResourceBundle, iSelectedContexts, oTable) {
|
|
319
|
+
// The confirm button text is "Save" for table in Display mode and "Apply" for table in edit mode. This can be later exposed if needed.
|
|
320
|
+
const bDisplayMode = oTable.data("displayModePropertyBinding") === "true";
|
|
321
|
+
return {
|
|
322
|
+
keepExistingPrefix: "< Keep",
|
|
323
|
+
leaveBlankValue: "< Leave Blank >",
|
|
324
|
+
clearFieldValue: "< Clear Values >",
|
|
325
|
+
massEditTitle: oResourceBundle.getText("C_MASS_EDIT_DIALOG_TITLE", iSelectedContexts.toString()),
|
|
326
|
+
applyButtonText: bDisplayMode ? oResourceBundle.getText("C_MASS_EDIT_SAVE_BUTTON_TEXT") : oResourceBundle.getText("C_MASS_EDIT_APPLY_BUTTON_TEXT"),
|
|
327
|
+
useValueHelpValue: "< Use Value Help >",
|
|
328
|
+
cancelButtonText: oResourceBundle.getText("C_COMMON_OBJECT_PAGE_CANCEL"),
|
|
329
|
+
noFields: oResourceBundle.getText("C_MASS_EDIT_NO_EDITABLE_FIELDS"),
|
|
330
|
+
okButtonText: oResourceBundle.getText("C_COMMON_DIALOG_OK")
|
|
331
|
+
};
|
|
332
|
+
},
|
|
333
|
+
/**
|
|
334
|
+
* Adds a suffix to the 'keep existing' property of the comboBox.
|
|
335
|
+
*
|
|
336
|
+
* @param sInputType InputType of the field
|
|
337
|
+
* @returns The modified string
|
|
338
|
+
*/
|
|
339
|
+
// getSuffixForKeepExisiting: function (sInputType: string) {
|
|
340
|
+
// let sResult = "Values";
|
|
341
|
+
|
|
342
|
+
// switch (sInputType) {
|
|
343
|
+
// //TODO - Add for other control types as well (Radio Button, Email, Input, MDC Fields, Image etc.)
|
|
344
|
+
// case "DatePicker":
|
|
345
|
+
// sResult = "Dates";
|
|
346
|
+
// break;
|
|
347
|
+
// case "CheckBox":
|
|
348
|
+
// sResult = "Settings";
|
|
349
|
+
// break;
|
|
350
|
+
// default:
|
|
351
|
+
// sResult = "Values";
|
|
352
|
+
// }
|
|
353
|
+
// return sResult;
|
|
354
|
+
// },
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* Adds default values to the model [Keep Existing Values, Leave Blank].
|
|
358
|
+
*
|
|
359
|
+
* @param aValues Array instance where the default data needs to be added
|
|
360
|
+
* @param oDefaultValues Default values from Application Manifest
|
|
361
|
+
* @param oPropertyInfo Property information
|
|
362
|
+
* @param bUOMField
|
|
363
|
+
*/
|
|
364
|
+
setDefaultValuesToDialog: function (aValues, oDefaultValues, oPropertyInfo, bUOMField) {
|
|
365
|
+
const sPropertyPath = bUOMField ? oPropertyInfo.unitProperty : oPropertyInfo.dataProperty,
|
|
366
|
+
sInputType = oPropertyInfo.inputType,
|
|
367
|
+
bPropertyRequired = oPropertyInfo.isFieldRequired;
|
|
368
|
+
// const sSuffixForKeepExisting = MassEditHelper.getSuffixForKeepExisiting(sInputType);
|
|
369
|
+
const sSuffixForKeepExisting = "Values";
|
|
370
|
+
aValues.defaultOptions = aValues.defaultOptions || [];
|
|
371
|
+
const selectOptionsExist = aValues.selectOptions && aValues.selectOptions.length > 0;
|
|
372
|
+
const keepEntry = {
|
|
373
|
+
text: `${oDefaultValues.keepExistingPrefix} ${sSuffixForKeepExisting} >`,
|
|
374
|
+
key: `Default/${sPropertyPath}`
|
|
375
|
+
};
|
|
376
|
+
if (sInputType === "CheckBox") {
|
|
377
|
+
const falseEntry = {
|
|
378
|
+
text: "No",
|
|
379
|
+
key: `${sPropertyPath}/false`,
|
|
380
|
+
textInfo: {
|
|
381
|
+
value: false
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
const truthyEntry = {
|
|
385
|
+
text: "Yes",
|
|
386
|
+
key: `${sPropertyPath}/true`,
|
|
387
|
+
textInfo: {
|
|
388
|
+
value: true
|
|
389
|
+
}
|
|
390
|
+
};
|
|
391
|
+
aValues.unshift(falseEntry);
|
|
392
|
+
aValues.defaultOptions.unshift(falseEntry);
|
|
393
|
+
aValues.unshift(truthyEntry);
|
|
394
|
+
aValues.defaultOptions.unshift(truthyEntry);
|
|
395
|
+
aValues.unshift(keepEntry);
|
|
396
|
+
aValues.defaultOptions.unshift(keepEntry);
|
|
397
|
+
} else {
|
|
398
|
+
var _oPropertyInfo$proper, _oPropertyInfo$unitIn;
|
|
399
|
+
if (oPropertyInfo !== null && oPropertyInfo !== void 0 && (_oPropertyInfo$proper = oPropertyInfo.propertyInfo) !== null && _oPropertyInfo$proper !== void 0 && _oPropertyInfo$proper.hasVH || oPropertyInfo !== null && oPropertyInfo !== void 0 && (_oPropertyInfo$unitIn = oPropertyInfo.unitInfo) !== null && _oPropertyInfo$unitIn !== void 0 && _oPropertyInfo$unitIn.hasVH && bUOMField) {
|
|
400
|
+
const vhdEntry = {
|
|
401
|
+
text: oDefaultValues.useValueHelpValue,
|
|
402
|
+
key: `UseValueHelpValue/${sPropertyPath}`
|
|
403
|
+
};
|
|
404
|
+
aValues.unshift(vhdEntry);
|
|
405
|
+
aValues.defaultOptions.unshift(vhdEntry);
|
|
406
|
+
}
|
|
407
|
+
if (selectOptionsExist) {
|
|
408
|
+
if (bPropertyRequired !== "true" && !bUOMField) {
|
|
409
|
+
const clearEntry = {
|
|
410
|
+
text: oDefaultValues.clearFieldValue,
|
|
411
|
+
key: `ClearFieldValue/${sPropertyPath}`
|
|
412
|
+
};
|
|
413
|
+
aValues.unshift(clearEntry);
|
|
414
|
+
aValues.defaultOptions.unshift(clearEntry);
|
|
415
|
+
}
|
|
416
|
+
aValues.unshift(keepEntry);
|
|
417
|
+
aValues.defaultOptions.unshift(keepEntry);
|
|
418
|
+
} else {
|
|
419
|
+
const emptyEntry = {
|
|
420
|
+
text: oDefaultValues.leaveBlankValue,
|
|
421
|
+
key: `Default/${sPropertyPath}`
|
|
422
|
+
};
|
|
423
|
+
aValues.unshift(emptyEntry);
|
|
424
|
+
aValues.defaultOptions.unshift(emptyEntry);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
},
|
|
428
|
+
/**
|
|
429
|
+
* Get text arrangement info for a context property.
|
|
430
|
+
*
|
|
431
|
+
* @param property Property Path
|
|
432
|
+
* @param descriptionPath Path to text association of the property
|
|
433
|
+
* @param displayMode Display mode of the property and text association
|
|
434
|
+
* @param selectedContext Context to find the full text
|
|
435
|
+
* @returns The text arrangement
|
|
436
|
+
*/
|
|
437
|
+
getTextArrangementInfo: function (property, descriptionPath, displayMode, selectedContext) {
|
|
438
|
+
let value = selectedContext.getObject(property),
|
|
439
|
+
descriptionValue,
|
|
440
|
+
fullText;
|
|
441
|
+
if (descriptionPath && property) {
|
|
442
|
+
switch (displayMode) {
|
|
443
|
+
case "Description":
|
|
444
|
+
descriptionValue = selectedContext.getObject(descriptionPath) || "";
|
|
445
|
+
fullText = descriptionValue;
|
|
446
|
+
break;
|
|
447
|
+
case "Value":
|
|
448
|
+
value = selectedContext.getObject(property) || "";
|
|
449
|
+
fullText = value;
|
|
450
|
+
break;
|
|
451
|
+
case "ValueDescription":
|
|
452
|
+
value = selectedContext.getObject(property) || "";
|
|
453
|
+
descriptionValue = selectedContext.getObject(descriptionPath) || "";
|
|
454
|
+
fullText = descriptionValue ? `${value} (${descriptionValue})` : value;
|
|
455
|
+
break;
|
|
456
|
+
case "DescriptionValue":
|
|
457
|
+
value = selectedContext.getObject(property) || "";
|
|
458
|
+
descriptionValue = selectedContext.getObject(descriptionPath) || "";
|
|
459
|
+
fullText = descriptionValue ? `${descriptionValue} (${value})` : value;
|
|
460
|
+
break;
|
|
461
|
+
default:
|
|
462
|
+
Log.info(`Display Property not applicable: ${property}`);
|
|
463
|
+
break;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
return {
|
|
467
|
+
textArrangement: displayMode,
|
|
468
|
+
valuePath: property,
|
|
469
|
+
descriptionPath: descriptionPath,
|
|
470
|
+
value: value,
|
|
471
|
+
description: descriptionValue,
|
|
472
|
+
fullText: fullText
|
|
473
|
+
};
|
|
474
|
+
},
|
|
475
|
+
/**
|
|
476
|
+
* Return the visibility valuue for the ManagedObject Any.
|
|
477
|
+
*
|
|
478
|
+
* @param any The ManagedObject Any to be used to calculate the visible value of the binding.
|
|
479
|
+
* @returns Returns true if the mass edit field is editable.
|
|
480
|
+
*/
|
|
481
|
+
isEditable: function (any) {
|
|
482
|
+
const binding = any.getBinding("any");
|
|
483
|
+
const value = binding.getExternalValue();
|
|
484
|
+
return value === EditMode.Editable;
|
|
485
|
+
},
|
|
486
|
+
/**
|
|
487
|
+
* Calculate and update the visibility of mass edit field on change of the ManagedObject Any binding.
|
|
488
|
+
*
|
|
489
|
+
* @param oDialogDataModel Model to be used runtime.
|
|
490
|
+
* @param dataProperty Field name.
|
|
491
|
+
*/
|
|
492
|
+
onContextEditableChange: function (oDialogDataModel, dataProperty) {
|
|
493
|
+
const objectsForVisibility = oDialogDataModel.getProperty(`/values/${dataProperty}/objectsForVisibility`) || [];
|
|
494
|
+
const editable = objectsForVisibility.some(MassEditHelper.isEditable);
|
|
495
|
+
if (editable) {
|
|
496
|
+
oDialogDataModel.setProperty(`/values/${dataProperty}/visible`, editable);
|
|
497
|
+
}
|
|
498
|
+
},
|
|
499
|
+
/**
|
|
500
|
+
* Update Managed Object Any for visibility of the mass edit fields.
|
|
501
|
+
*
|
|
502
|
+
* @param mOToUse The ManagedObject Any to be used to calculate the visible value of the binding.
|
|
503
|
+
* @param oDialogDataModel Model to be used runtime.
|
|
504
|
+
* @param dataProperty Field name.
|
|
505
|
+
* @param values Values of the field.
|
|
506
|
+
*/
|
|
507
|
+
updateOnContextChange: function (mOToUse, oDialogDataModel, dataProperty, values) {
|
|
508
|
+
const binding = mOToUse.getBinding("any");
|
|
509
|
+
values.objectsForVisibility = values.objectsForVisibility || [];
|
|
510
|
+
values.objectsForVisibility.push(mOToUse);
|
|
511
|
+
binding === null || binding === void 0 ? void 0 : binding.attachChange(MassEditHelper.onContextEditableChange.bind(null, oDialogDataModel, dataProperty));
|
|
512
|
+
},
|
|
513
|
+
/**
|
|
514
|
+
* Get bound object to calculate the visibility of contexts.
|
|
515
|
+
*
|
|
516
|
+
* @param expBinding Binding String object.
|
|
517
|
+
* @param context Context the binding value.
|
|
518
|
+
* @returns The ManagedObject Any to be used to calculate the visible value of the binding.
|
|
519
|
+
*/
|
|
520
|
+
getBoundObject: function (expBinding, context) {
|
|
521
|
+
const mOToUse = new Any({
|
|
522
|
+
any: expBinding
|
|
523
|
+
});
|
|
524
|
+
const model = context.getModel();
|
|
525
|
+
mOToUse.setModel(model);
|
|
526
|
+
mOToUse.setBindingContext(context);
|
|
527
|
+
return mOToUse;
|
|
528
|
+
},
|
|
529
|
+
/**
|
|
530
|
+
* Get the visibility of the field.
|
|
531
|
+
*
|
|
532
|
+
* @param expBinding Binding String object.
|
|
533
|
+
* @param oDialogDataModel Model to be used runtime.
|
|
534
|
+
* @param dataProperty Field name.
|
|
535
|
+
* @param values Values of the field.
|
|
536
|
+
* @param context Context the binding value.
|
|
537
|
+
* @returns Returns true if the mass edit field is editable.
|
|
538
|
+
*/
|
|
539
|
+
getFieldVisiblity: function (expBinding, oDialogDataModel, dataProperty, values, context) {
|
|
540
|
+
const mOToUse = MassEditHelper.getBoundObject(expBinding, context);
|
|
541
|
+
const isContextEditable = MassEditHelper.isEditable(mOToUse);
|
|
542
|
+
if (!isContextEditable) {
|
|
543
|
+
MassEditHelper.updateOnContextChange(mOToUse, oDialogDataModel, dataProperty, values);
|
|
544
|
+
}
|
|
545
|
+
return isContextEditable;
|
|
546
|
+
},
|
|
547
|
+
/**
|
|
548
|
+
* Initializes a runtime model:
|
|
549
|
+
* => The model consists of values shown in the comboBox of the dialog (Leave Blank, Keep Existing Values, or any property value for the selected context, etc.)
|
|
550
|
+
* => The model will capture runtime changes in the results property (the value entered in the comboBox).
|
|
551
|
+
*
|
|
552
|
+
* @param aContexts Contexts for mass edit
|
|
553
|
+
* @param aDataArray Array containing data related to the dialog used by both the static and the runtime model
|
|
554
|
+
* @param oDefaultValues Default values from i18n
|
|
555
|
+
* @param dialogContext Transient context for mass edit dialog.
|
|
556
|
+
* @returns The runtime model
|
|
557
|
+
*/
|
|
558
|
+
setRuntimeModelOnDialog: function (aContexts, aDataArray, oDefaultValues, dialogContext) {
|
|
559
|
+
const aValues = [];
|
|
560
|
+
const aUnitData = [];
|
|
561
|
+
const aResults = [];
|
|
562
|
+
const textPaths = [];
|
|
563
|
+
const aReadOnlyFieldInfo = [];
|
|
564
|
+
const oData = {
|
|
565
|
+
values: aValues,
|
|
566
|
+
unitData: aUnitData,
|
|
567
|
+
results: aResults,
|
|
568
|
+
readablePropertyData: aReadOnlyFieldInfo,
|
|
569
|
+
selectedKey: undefined,
|
|
570
|
+
textPaths: textPaths,
|
|
571
|
+
noFields: oDefaultValues.noFields
|
|
572
|
+
};
|
|
573
|
+
const oDialogDataModel = new JSONModel(oData);
|
|
574
|
+
aDataArray.forEach(function (oInData) {
|
|
575
|
+
let oTextInfo;
|
|
576
|
+
let sPropertyKey;
|
|
577
|
+
let sUnitPropertyName;
|
|
578
|
+
const oDistinctValueMap = {};
|
|
579
|
+
const oDistinctUnitMap = {};
|
|
580
|
+
if (oInData.dataProperty && oInData.dataProperty.indexOf("/") > -1) {
|
|
581
|
+
const aFinalPath = MassEditHelper.initLastLevelOfPropertyPath(oInData.dataProperty, aValues /*, dialogContext */);
|
|
582
|
+
const aPropertyPaths = oInData.dataProperty.split("/");
|
|
583
|
+
for (const context of aContexts) {
|
|
584
|
+
const sMultiLevelPathValue = context.getObject(oInData.dataProperty);
|
|
585
|
+
sPropertyKey = `${oInData.dataProperty}/${sMultiLevelPathValue}`;
|
|
586
|
+
if (!oDistinctValueMap[sPropertyKey] && aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]]) {
|
|
587
|
+
oTextInfo = MassEditHelper.getTextArrangementInfo(oInData.dataProperty, oInData.descriptionPath, oInData.display, context);
|
|
588
|
+
aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]].push({
|
|
589
|
+
text: oTextInfo && oTextInfo.fullText || sMultiLevelPathValue,
|
|
590
|
+
key: sPropertyKey,
|
|
591
|
+
textInfo: oTextInfo
|
|
592
|
+
});
|
|
593
|
+
oDistinctValueMap[sPropertyKey] = sMultiLevelPathValue;
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
// if (Object.keys(oDistinctValueMap).length === 1) {
|
|
597
|
+
// dialogContext.setProperty(oData.dataProperty, sPropertyKey && oDistinctValueMap[sPropertyKey]);
|
|
598
|
+
// }
|
|
599
|
+
|
|
600
|
+
aFinalPath[aPropertyPaths[aPropertyPaths.length - 1]].textInfo = {
|
|
601
|
+
descriptionPath: oInData.descriptionPath,
|
|
602
|
+
valuePath: oInData.dataProperty,
|
|
603
|
+
displayMode: oInData.display
|
|
604
|
+
};
|
|
605
|
+
} else {
|
|
606
|
+
aValues[oInData.dataProperty] = aValues[oInData.dataProperty] || [];
|
|
607
|
+
aValues[oInData.dataProperty]["selectOptions"] = aValues[oInData.dataProperty]["selectOptions"] || [];
|
|
608
|
+
if (oInData.unitProperty) {
|
|
609
|
+
aUnitData[oInData.unitProperty] = aUnitData[oInData.unitProperty] || [];
|
|
610
|
+
aUnitData[oInData.unitProperty]["selectOptions"] = aUnitData[oInData.unitProperty]["selectOptions"] || [];
|
|
611
|
+
}
|
|
612
|
+
for (const context of aContexts) {
|
|
613
|
+
const oDataObject = context.getObject();
|
|
614
|
+
sPropertyKey = `${oInData.dataProperty}/${oDataObject[oInData.dataProperty]}`;
|
|
615
|
+
if (oInData.dataProperty && oDataObject[oInData.dataProperty] && !oDistinctValueMap[sPropertyKey]) {
|
|
616
|
+
if (oInData.inputType != "CheckBox") {
|
|
617
|
+
oTextInfo = MassEditHelper.getTextArrangementInfo(oInData.dataProperty, oInData.descriptionPath, oInData.display, context);
|
|
618
|
+
const entry = {
|
|
619
|
+
text: oTextInfo && oTextInfo.fullText || oDataObject[oInData.dataProperty],
|
|
620
|
+
key: sPropertyKey,
|
|
621
|
+
textInfo: oTextInfo
|
|
622
|
+
};
|
|
623
|
+
aValues[oInData.dataProperty].push(entry);
|
|
624
|
+
aValues[oInData.dataProperty]["selectOptions"].push(entry);
|
|
625
|
+
}
|
|
626
|
+
oDistinctValueMap[sPropertyKey] = oDataObject[oInData.dataProperty];
|
|
627
|
+
}
|
|
628
|
+
if (oInData.unitProperty && oDataObject[oInData.unitProperty]) {
|
|
629
|
+
sUnitPropertyName = `${oInData.unitProperty}/${oDataObject[oInData.unitProperty]}`;
|
|
630
|
+
if (!oDistinctUnitMap[sUnitPropertyName]) {
|
|
631
|
+
if (oInData.inputType != "CheckBox") {
|
|
632
|
+
oTextInfo = MassEditHelper.getTextArrangementInfo(oInData.unitProperty, oInData.descriptionPath, oInData.display, context);
|
|
633
|
+
const unitEntry = {
|
|
634
|
+
text: oTextInfo && oTextInfo.fullText || oDataObject[oInData.unitProperty],
|
|
635
|
+
key: sUnitPropertyName,
|
|
636
|
+
textInfo: oTextInfo
|
|
637
|
+
};
|
|
638
|
+
aUnitData[oInData.unitProperty].push(unitEntry);
|
|
639
|
+
aUnitData[oInData.unitProperty]["selectOptions"].push(unitEntry);
|
|
640
|
+
}
|
|
641
|
+
oDistinctUnitMap[sUnitPropertyName] = oDataObject[oInData.unitProperty];
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
aValues[oInData.dataProperty].textInfo = {
|
|
646
|
+
descriptionPath: oInData.descriptionPath,
|
|
647
|
+
valuePath: oInData.dataProperty,
|
|
648
|
+
displayMode: oInData.display
|
|
649
|
+
};
|
|
650
|
+
if (Object.keys(oDistinctValueMap).length === 1) {
|
|
651
|
+
dialogContext.setProperty(oInData.dataProperty, sPropertyKey && oDistinctValueMap[sPropertyKey]);
|
|
652
|
+
}
|
|
653
|
+
if (Object.keys(oDistinctUnitMap).length === 1) {
|
|
654
|
+
dialogContext.setProperty(oInData.unitProperty, sUnitPropertyName && oDistinctUnitMap[sUnitPropertyName]);
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
textPaths[oInData.dataProperty] = oInData.descriptionPath ? [oInData.descriptionPath] : [];
|
|
658
|
+
});
|
|
659
|
+
aDataArray.forEach(function (oInData) {
|
|
660
|
+
let values = {};
|
|
661
|
+
if (oInData.dataProperty.indexOf("/") > -1) {
|
|
662
|
+
const sMultiLevelPropPathValue = MassEditHelper.getValueForMultiLevelPath(oInData.dataProperty, aValues);
|
|
663
|
+
if (!sMultiLevelPropPathValue) {
|
|
664
|
+
sMultiLevelPropPathValue.push({
|
|
665
|
+
text: oDefaultValues.leaveBlankValue,
|
|
666
|
+
key: `Empty/${oInData.dataProperty}`
|
|
667
|
+
});
|
|
668
|
+
} else {
|
|
669
|
+
MassEditHelper.setDefaultValuesToDialog(sMultiLevelPropPathValue, oDefaultValues, oInData);
|
|
670
|
+
}
|
|
671
|
+
values = sMultiLevelPropPathValue;
|
|
672
|
+
} else if (aValues[oInData.dataProperty]) {
|
|
673
|
+
aValues[oInData.dataProperty] = aValues[oInData.dataProperty] || [];
|
|
674
|
+
MassEditHelper.setDefaultValuesToDialog(aValues[oInData.dataProperty], oDefaultValues, oInData);
|
|
675
|
+
values = aValues[oInData.dataProperty];
|
|
676
|
+
}
|
|
677
|
+
if (aUnitData[oInData.unitProperty] && aUnitData[oInData.unitProperty].length) {
|
|
678
|
+
MassEditHelper.setDefaultValuesToDialog(aUnitData[oInData.unitProperty], oDefaultValues, oInData, true);
|
|
679
|
+
aUnitData[oInData.unitProperty].textInfo = {};
|
|
680
|
+
aUnitData[oInData.unitProperty].selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oInData.unitProperty);
|
|
681
|
+
aUnitData[oInData.unitProperty].inputType = oInData.inputType;
|
|
682
|
+
} else if (oInData.dataProperty && aValues[oInData.dataProperty] && !aValues[oInData.dataProperty].length || oInData.unitProperty && aUnitData[oInData.unitProperty] && !aUnitData[oInData.unitProperty].length) {
|
|
683
|
+
const bClearFieldOrBlankValueExists = aValues[oInData.dataProperty] && aValues[oInData.dataProperty].some(function (obj) {
|
|
684
|
+
return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
|
|
685
|
+
});
|
|
686
|
+
if (oInData.dataProperty && !bClearFieldOrBlankValueExists) {
|
|
687
|
+
aValues[oInData.dataProperty].push({
|
|
688
|
+
text: oDefaultValues.leaveBlankValue,
|
|
689
|
+
key: `Empty/${oInData.dataProperty}`
|
|
690
|
+
});
|
|
691
|
+
}
|
|
692
|
+
const bClearFieldOrBlankUnitValueExists = aUnitData[oInData.unitProperty] && aUnitData[oInData.unitProperty].some(function (obj) {
|
|
693
|
+
return obj.text === "< Clear Values >" || obj.text === "< Leave Blank >";
|
|
694
|
+
});
|
|
695
|
+
if (oInData.unitProperty) {
|
|
696
|
+
if (!bClearFieldOrBlankUnitValueExists) {
|
|
697
|
+
aUnitData[oInData.unitProperty].push({
|
|
698
|
+
text: oDefaultValues.leaveBlankValue,
|
|
699
|
+
key: `Empty/${oInData.unitProperty}`
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
aUnitData[oInData.unitProperty].textInfo = {};
|
|
703
|
+
aUnitData[oInData.unitProperty].selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oInData.unitProperty);
|
|
704
|
+
aUnitData[oInData.unitProperty].inputType = oInData.inputType;
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
if (oInData.isPropertyReadOnly && typeof oInData.isPropertyReadOnly === "boolean") {
|
|
708
|
+
aReadOnlyFieldInfo.push({
|
|
709
|
+
property: oInData.dataProperty,
|
|
710
|
+
value: oInData.isPropertyReadOnly,
|
|
711
|
+
type: "Default"
|
|
712
|
+
});
|
|
713
|
+
} else if (oInData.isPropertyReadOnly && oInData.isPropertyReadOnly.operands && oInData.isPropertyReadOnly.operands[0] && oInData.isPropertyReadOnly.operands[0].operand1 && oInData.isPropertyReadOnly.operands[0].operand2) {
|
|
714
|
+
// This needs to be refactored in accordance with the ReadOnlyExpression change
|
|
715
|
+
aReadOnlyFieldInfo.push({
|
|
716
|
+
property: oInData.dataProperty,
|
|
717
|
+
propertyPath: oInData.isPropertyReadOnly.operands[0].operand1.path,
|
|
718
|
+
propertyValue: oInData.isPropertyReadOnly.operands[0].operand2.value,
|
|
719
|
+
type: "Path"
|
|
720
|
+
});
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
// Setting visbility of the mass edit field.
|
|
724
|
+
if (oInData.editMode) {
|
|
725
|
+
values.visible = oInData.editMode === EditMode.Editable || aContexts.some(MassEditHelper.getFieldVisiblity.bind(MassEditHelper, oInData.editMode, oDialogDataModel, oInData.dataProperty, values));
|
|
726
|
+
} else {
|
|
727
|
+
values.visible = true;
|
|
728
|
+
}
|
|
729
|
+
values.selectedKey = MassEditHelper.getDefaultSelectionPathComboBox(aContexts, oInData.dataProperty);
|
|
730
|
+
values.inputType = oInData.inputType;
|
|
731
|
+
values.unitProperty = oInData.unitProperty;
|
|
732
|
+
});
|
|
733
|
+
return oDialogDataModel;
|
|
734
|
+
},
|
|
735
|
+
/**
|
|
736
|
+
* Gets transient context for dialog.
|
|
737
|
+
*
|
|
738
|
+
* @param table Instance of Table.
|
|
739
|
+
* @param dialog Mass Edit Dialog.
|
|
740
|
+
* @returns Promise returning instance of dialog.
|
|
741
|
+
*/
|
|
742
|
+
getDialogContext: function (table, dialog) {
|
|
743
|
+
let transCtx = dialog && dialog.getBindingContext();
|
|
744
|
+
if (!transCtx) {
|
|
745
|
+
const model = table.getModel();
|
|
746
|
+
const listBinding = table.getRowBinding();
|
|
747
|
+
const transientListBinding = model.bindList(listBinding.getPath(), listBinding.getContext(), [], [], {
|
|
748
|
+
$$updateGroupId: "submitLater"
|
|
749
|
+
});
|
|
750
|
+
transientListBinding.refreshInternal = function () {
|
|
751
|
+
/* */
|
|
752
|
+
};
|
|
753
|
+
transCtx = transientListBinding.create({}, true);
|
|
754
|
+
}
|
|
755
|
+
return transCtx;
|
|
756
|
+
},
|
|
757
|
+
onDialogOpen: function (event) {
|
|
758
|
+
const source = event.getSource();
|
|
759
|
+
const fieldsInfoModel = source.getModel("fieldsInfo");
|
|
760
|
+
fieldsInfoModel.setProperty("/isOpen", true);
|
|
761
|
+
},
|
|
762
|
+
closeDialog: function (oDialog) {
|
|
763
|
+
oDialog.close();
|
|
764
|
+
oDialog.destroy();
|
|
765
|
+
},
|
|
766
|
+
messageHandlingForMassEdit: async function (oTable, aContexts, oController, oInDialog, aResults, errorContexts) {
|
|
767
|
+
var _oController$getView, _oController$getView$, _oController$getView4, _oController$getView5;
|
|
768
|
+
const DraftStatus = FELibrary.DraftStatus;
|
|
769
|
+
const oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
|
|
770
|
+
(_oController$getView = oController.getView()) === null || _oController$getView === void 0 ? void 0 : (_oController$getView$ = _oController$getView.getBindingContext("internal")) === null || _oController$getView$ === void 0 ? void 0 : _oController$getView$.setProperty("getBoundMessagesForMassEdit", true);
|
|
771
|
+
oController._editFlow.getMessageHandler().showMessages({
|
|
772
|
+
onBeforeShowMessage: function (messages, showMessageParameters) {
|
|
773
|
+
//messages.concatenate(messageHandling.getMessages(true, true));
|
|
774
|
+
showMessageParameters.fnGetMessageSubtitle = messageHandling.setMessageSubtitle.bind({}, oTable, aContexts);
|
|
775
|
+
const unboundErrors = [];
|
|
776
|
+
messages.forEach(function (message) {
|
|
777
|
+
if (!message.getTarget()) {
|
|
778
|
+
unboundErrors.push(message);
|
|
779
|
+
}
|
|
780
|
+
});
|
|
781
|
+
if (aResults.length > 0 && errorContexts.length === 0) {
|
|
782
|
+
oController._editFlow.setDraftStatus(DraftStatus.Saved);
|
|
783
|
+
const successToast = oResourceBundle.getText("C_MASS_EDIT_SUCCESS_TOAST");
|
|
784
|
+
MessageToast.show(successToast);
|
|
785
|
+
} else if (errorContexts.length < oTable.getSelectedContexts().length) {
|
|
786
|
+
oController._editFlow.setDraftStatus(DraftStatus.Saved);
|
|
787
|
+
} else if (errorContexts.length === oTable.getSelectedContexts().length) {
|
|
788
|
+
oController._editFlow.setDraftStatus(DraftStatus.Clear);
|
|
789
|
+
}
|
|
790
|
+
if (oController.getModel("ui").getProperty("/isEditable") && unboundErrors.length === 0) {
|
|
791
|
+
showMessageParameters.showMessageBox = false;
|
|
792
|
+
showMessageParameters.showMessageDialog = false;
|
|
793
|
+
}
|
|
794
|
+
return showMessageParameters;
|
|
795
|
+
}
|
|
796
|
+
});
|
|
797
|
+
if (oInDialog.isOpen()) {
|
|
798
|
+
var _oController$getView2, _oController$getView3;
|
|
799
|
+
MassEditHelper.closeDialog(oInDialog);
|
|
800
|
+
(_oController$getView2 = oController.getView()) === null || _oController$getView2 === void 0 ? void 0 : (_oController$getView3 = _oController$getView2.getBindingContext("internal")) === null || _oController$getView3 === void 0 ? void 0 : _oController$getView3.setProperty("skipPatchHandlers", false);
|
|
801
|
+
}
|
|
802
|
+
(_oController$getView4 = oController.getView()) === null || _oController$getView4 === void 0 ? void 0 : (_oController$getView5 = _oController$getView4.getBindingContext("internal")) === null || _oController$getView5 === void 0 ? void 0 : _oController$getView5.setProperty("getBoundMessagesForMassEdit", false);
|
|
803
|
+
},
|
|
804
|
+
/**
|
|
805
|
+
* This function generates side effects map from side effects ids(which is a combination of entity type and qualifier).
|
|
806
|
+
*
|
|
807
|
+
* @param oEntitySetContext
|
|
808
|
+
* @param aSideEffects
|
|
809
|
+
* @param oController
|
|
810
|
+
* @param aResults
|
|
811
|
+
* @returns Side effect map with data.
|
|
812
|
+
*/
|
|
813
|
+
getSideEffectDataForKey: function (oEntitySetContext, aSideEffects, oController, aResults) {
|
|
814
|
+
const sOwnerEntityType = oEntitySetContext.getProperty("$Type");
|
|
815
|
+
const baseSideEffectsMapArray = {};
|
|
816
|
+
aResults.forEach(result => {
|
|
817
|
+
const sPath = result.keyValue;
|
|
818
|
+
const sideEffectsArray = FieldHelper.getSideEffectsOnEntityAndProperty(sPath, sOwnerEntityType, aSideEffects);
|
|
819
|
+
baseSideEffectsMapArray[sPath] = oController._sideEffects.getSideEffectsMapForFieldGroups(sideEffectsArray);
|
|
820
|
+
});
|
|
821
|
+
return baseSideEffectsMapArray;
|
|
822
|
+
},
|
|
823
|
+
/**
|
|
824
|
+
* Give the entity type for a given spath for e.g.RequestedQuantity.
|
|
825
|
+
*
|
|
826
|
+
* @param sPath
|
|
827
|
+
* @param sEntityType
|
|
828
|
+
* @param oMetaModel
|
|
829
|
+
* @returns Object having entity, spath and navigation path.
|
|
830
|
+
*/
|
|
831
|
+
fnGetPathForSourceProperty: function (sPath, sEntityType, oMetaModel) {
|
|
832
|
+
// if the property path has a navigation, get the target entity type of the navigation
|
|
833
|
+
const sNavigationPath = sPath.indexOf("/") > 0 ? "/" + sEntityType + "/" + sPath.substr(0, sPath.lastIndexOf("/") + 1) + "@sapui.name" : false,
|
|
834
|
+
pOwnerEntity = !sNavigationPath ? Promise.resolve(sEntityType) : oMetaModel.requestObject(sNavigationPath);
|
|
835
|
+
sPath = sNavigationPath ? sPath.substr(sPath.lastIndexOf("/") + 1) : sPath;
|
|
836
|
+
return {
|
|
837
|
+
sPath,
|
|
838
|
+
pOwnerEntity,
|
|
839
|
+
sNavigationPath
|
|
840
|
+
};
|
|
841
|
+
},
|
|
842
|
+
fnGetEntityTypeOfOwner: function (oMetaModel, baseNavPath, oEntitySetContext, targetEntity, aTargets) {
|
|
843
|
+
const ownerEntityType = oEntitySetContext.getProperty("$Type");
|
|
844
|
+
const {
|
|
845
|
+
$Type: pOwner,
|
|
846
|
+
$Partner: ownerNavPath
|
|
847
|
+
} = oMetaModel.getObject(`${oEntitySetContext}/${baseNavPath}`); // nav path
|
|
848
|
+
if (ownerNavPath) {
|
|
849
|
+
const entityObjOfOwnerPartner = oMetaModel.getObject(`/${pOwner}/${ownerNavPath}`);
|
|
850
|
+
if (entityObjOfOwnerPartner) {
|
|
851
|
+
const entityTypeOfOwnerPartner = entityObjOfOwnerPartner["$Type"];
|
|
852
|
+
// if the entity types defer, then base nav path is not from owner
|
|
853
|
+
if (entityTypeOfOwnerPartner !== ownerEntityType) {
|
|
854
|
+
// if target Prop is not from owner, we add it as immediate
|
|
855
|
+
aTargets.push(targetEntity);
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
} else {
|
|
859
|
+
// if there is no $Partner attribute, it may not be from owner
|
|
860
|
+
aTargets.push(targetEntity);
|
|
861
|
+
}
|
|
862
|
+
return aTargets;
|
|
863
|
+
},
|
|
864
|
+
/**
|
|
865
|
+
* Give targets that are immediate or deferred based on the entity type of that target.
|
|
866
|
+
*
|
|
867
|
+
*
|
|
868
|
+
* @param sideEffectsData
|
|
869
|
+
* @param oEntitySetContext
|
|
870
|
+
* @param sEntityType
|
|
871
|
+
* @param oMetaModel
|
|
872
|
+
* @returns Targets to request side effects.
|
|
873
|
+
*/
|
|
874
|
+
fnGetTargetsForMassEdit: function (sideEffectsData, oEntitySetContext, sEntityType, oMetaModel) {
|
|
875
|
+
const {
|
|
876
|
+
TargetProperties: aTargetProperties,
|
|
877
|
+
TargetEntities: aTargetEntities
|
|
878
|
+
} = sideEffectsData;
|
|
879
|
+
const aPromises = [];
|
|
880
|
+
let aTargets = [];
|
|
881
|
+
const ownerEntityType = oEntitySetContext.getProperty("$Type");
|
|
882
|
+
if (sEntityType === ownerEntityType) {
|
|
883
|
+
// if SalesOrdr Item
|
|
884
|
+
aTargetEntities === null || aTargetEntities === void 0 ? void 0 : aTargetEntities.forEach(targetEntity => {
|
|
885
|
+
targetEntity = targetEntity["$NavigationPropertyPath"];
|
|
886
|
+
let baseNavPath;
|
|
887
|
+
if (targetEntity.includes("/")) {
|
|
888
|
+
baseNavPath = targetEntity.split("/")[0];
|
|
889
|
+
} else {
|
|
890
|
+
baseNavPath = targetEntity;
|
|
891
|
+
}
|
|
892
|
+
aTargets = MassEditHelper.fnGetEntityTypeOfOwner(oMetaModel, baseNavPath, oEntitySetContext, targetEntity, aTargets);
|
|
893
|
+
});
|
|
894
|
+
}
|
|
895
|
+
if (aTargetProperties.length) {
|
|
896
|
+
aTargetProperties.forEach(targetProp => {
|
|
897
|
+
const {
|
|
898
|
+
pOwnerEntity
|
|
899
|
+
} = MassEditHelper.fnGetPathForSourceProperty(targetProp, sEntityType, oMetaModel);
|
|
900
|
+
aPromises.push(pOwnerEntity.then(resultEntity => {
|
|
901
|
+
// if entity is SalesOrderItem, Target Property is from Items table
|
|
902
|
+
if (resultEntity === ownerEntityType) {
|
|
903
|
+
aTargets.push(targetProp); // get immediate targets
|
|
904
|
+
} else if (targetProp.includes("/")) {
|
|
905
|
+
const baseNavPath = targetProp.split("/")[0];
|
|
906
|
+
aTargets = MassEditHelper.fnGetEntityTypeOfOwner(oMetaModel, baseNavPath, oEntitySetContext, targetProp, aTargets);
|
|
907
|
+
}
|
|
908
|
+
return Promise.resolve(aTargets);
|
|
909
|
+
}));
|
|
910
|
+
});
|
|
911
|
+
} else {
|
|
912
|
+
aPromises.push(Promise.resolve(aTargets));
|
|
913
|
+
}
|
|
914
|
+
return Promise.all(aPromises);
|
|
915
|
+
},
|
|
916
|
+
/**
|
|
917
|
+
* This function checks if in the given side Effects Obj, if _Item is set as Target Entity for any side Effects on
|
|
918
|
+
* other entity set.
|
|
919
|
+
*
|
|
920
|
+
* @param sideEffectsMap
|
|
921
|
+
* @param oEntitySetContext
|
|
922
|
+
* @returns Length of sideEffectsArray where current Entity is set as Target Entity
|
|
923
|
+
*/
|
|
924
|
+
checkIfEntityExistsAsTargetEntity: (sideEffectsMap, oEntitySetContext) => {
|
|
925
|
+
const ownerEntityType = oEntitySetContext.getProperty("$Type");
|
|
926
|
+
const sideEffectsOnOtherEntity = Object.values(sideEffectsMap).filter(obj => {
|
|
927
|
+
return obj.name.indexOf(ownerEntityType) == -1;
|
|
928
|
+
});
|
|
929
|
+
const entitySetName = oEntitySetContext.getPath().split("/").pop();
|
|
930
|
+
const sideEffectsWithCurrentEntityAsTarget = sideEffectsOnOtherEntity.filter(obj => {
|
|
931
|
+
const targetEntitiesArray = obj.sideEffects.TargetEntities;
|
|
932
|
+
return targetEntitiesArray !== null && targetEntitiesArray !== void 0 && targetEntitiesArray.filter(innerObj => innerObj["$NavigationPropertyPath"] === entitySetName).length ? obj : false;
|
|
933
|
+
});
|
|
934
|
+
return sideEffectsWithCurrentEntityAsTarget.length;
|
|
935
|
+
},
|
|
936
|
+
/**
|
|
937
|
+
* Upon updating the field, array of immediate and deferred side effects for that field are created.
|
|
938
|
+
* If there are any failed side effects for that context, they will also be used to generate the map.
|
|
939
|
+
* If the field has text associated with it, then add it to request side effects.
|
|
940
|
+
*
|
|
941
|
+
* @param mParams
|
|
942
|
+
* @param mParams.oController Controller
|
|
943
|
+
* @param mParams.oFieldPromise Promise to update field
|
|
944
|
+
* @param mParams.sideEffectMap SideEffectsMap for the field
|
|
945
|
+
* @param mParams.textPaths TextPaths of the field if any
|
|
946
|
+
* @param mParams.groupId Group Id to used to group requests
|
|
947
|
+
* @param mParams.key KeyValue of the field
|
|
948
|
+
* @param mParams.oEntitySetContext EntitySetcontext
|
|
949
|
+
* @param mParams.oMetaModel Metamodel data
|
|
950
|
+
* @param mParams.selectedContext Selected row context
|
|
951
|
+
* @param mParams.deferredTargetsForAQualifiedName Deferred targets data
|
|
952
|
+
* @returns Promise for all immediately requested side effects.
|
|
953
|
+
*/
|
|
954
|
+
handleMassEditFieldUpdateAndRequestSideEffects: async function (mParams) {
|
|
955
|
+
const {
|
|
956
|
+
oController,
|
|
957
|
+
oFieldPromise,
|
|
958
|
+
sideEffectsMap,
|
|
959
|
+
textPaths,
|
|
960
|
+
groupId,
|
|
961
|
+
key,
|
|
962
|
+
oEntitySetContext,
|
|
963
|
+
oMetaModel,
|
|
964
|
+
oSelectedContext,
|
|
965
|
+
deferredTargetsForAQualifiedName
|
|
966
|
+
} = mParams;
|
|
967
|
+
const immediateSideEffectsPromises = [oFieldPromise];
|
|
968
|
+
const ownerEntityType = oEntitySetContext.getProperty("$Type");
|
|
969
|
+
const oAppComponent = CommonUtils.getAppComponent(oController.getView());
|
|
970
|
+
const oSideEffectsService = oAppComponent.getSideEffectsService();
|
|
971
|
+
const isSideEffectsWithCurrentEntityAsTarget = MassEditHelper.checkIfEntityExistsAsTargetEntity(sideEffectsMap, oEntitySetContext);
|
|
972
|
+
if (sideEffectsMap) {
|
|
973
|
+
const allEntityTypesWithQualifier = Object.keys(sideEffectsMap);
|
|
974
|
+
const sideEffectsDataForField = Object.values(sideEffectsMap);
|
|
975
|
+
const mVisitedSideEffects = {};
|
|
976
|
+
deferredTargetsForAQualifiedName[key] = {};
|
|
977
|
+
for (const [index, data] of sideEffectsDataForField.entries()) {
|
|
978
|
+
const entityTypeWithQualifier = allEntityTypesWithQualifier[index];
|
|
979
|
+
const sEntityType = entityTypeWithQualifier.split("#")[0];
|
|
980
|
+
const oContext = oController._sideEffects.getContextForSideEffects(oSelectedContext, sEntityType);
|
|
981
|
+
data.context = oContext;
|
|
982
|
+
const allFailedSideEffects = oController._sideEffects.getRegisteredFailedRequests();
|
|
983
|
+
const aFailedSideEffects = allFailedSideEffects[oContext.getPath()];
|
|
984
|
+
oController._sideEffects.unregisterFailedSideEffectsForAContext(oContext);
|
|
985
|
+
let sideEffectsForCurrentContext = [data.sideEffects];
|
|
986
|
+
sideEffectsForCurrentContext = aFailedSideEffects && aFailedSideEffects.length ? sideEffectsForCurrentContext.concat(aFailedSideEffects) : sideEffectsForCurrentContext;
|
|
987
|
+
mVisitedSideEffects[oContext] = {};
|
|
988
|
+
for (const aSideEffect of sideEffectsForCurrentContext) {
|
|
989
|
+
if (!mVisitedSideEffects[oContext].hasOwnProperty(aSideEffect.fullyQualifiedName)) {
|
|
990
|
+
mVisitedSideEffects[oContext][aSideEffect.fullyQualifiedName] = true;
|
|
991
|
+
let aImmediateTargets = [],
|
|
992
|
+
allTargets = [],
|
|
993
|
+
triggerActionName;
|
|
994
|
+
const fnGetImmediateTargetsAndActions = async function (mSideEffect) {
|
|
995
|
+
const {
|
|
996
|
+
TargetProperties: aTargetProperties,
|
|
997
|
+
TargetEntities: aTargetEntities
|
|
998
|
+
} = mSideEffect;
|
|
999
|
+
const sideEffectEntityType = mSideEffect.fullyQualifiedName.split("@")[0];
|
|
1000
|
+
const targetsArrayForAllProperties = await MassEditHelper.fnGetTargetsForMassEdit(mSideEffect, oEntitySetContext, sideEffectEntityType, oMetaModel);
|
|
1001
|
+
aImmediateTargets = targetsArrayForAllProperties[0];
|
|
1002
|
+
allTargets = (aTargetProperties || []).concat(aTargetEntities || []);
|
|
1003
|
+
const actionName = mSideEffect.TriggerAction;
|
|
1004
|
+
const aDeferredTargets = allTargets.filter(target => {
|
|
1005
|
+
return !aImmediateTargets.includes(target);
|
|
1006
|
+
});
|
|
1007
|
+
deferredTargetsForAQualifiedName[key][mSideEffect.fullyQualifiedName] = {
|
|
1008
|
+
aTargets: aDeferredTargets,
|
|
1009
|
+
oContext: oContext,
|
|
1010
|
+
mSideEffect
|
|
1011
|
+
};
|
|
1012
|
+
|
|
1013
|
+
// if entity is other than items table then action is defered
|
|
1014
|
+
if (actionName && sideEffectEntityType === ownerEntityType) {
|
|
1015
|
+
// static action is on collection, so we defer it, else add to immediate requests array
|
|
1016
|
+
const isStaticAction = TableHelper._isStaticAction(oMetaModel.getObject(`/${actionName}`), actionName);
|
|
1017
|
+
if (!isStaticAction) {
|
|
1018
|
+
triggerActionName = actionName;
|
|
1019
|
+
} else {
|
|
1020
|
+
deferredTargetsForAQualifiedName[key][mSideEffect.fullyQualifiedName]["TriggerAction"] = actionName;
|
|
1021
|
+
}
|
|
1022
|
+
} else {
|
|
1023
|
+
deferredTargetsForAQualifiedName[key][mSideEffect.fullyQualifiedName]["TriggerAction"] = actionName;
|
|
1024
|
+
}
|
|
1025
|
+
if (isSideEffectsWithCurrentEntityAsTarget) {
|
|
1026
|
+
aImmediateTargets = [];
|
|
1027
|
+
}
|
|
1028
|
+
return {
|
|
1029
|
+
aTargets: aImmediateTargets,
|
|
1030
|
+
TriggerAction: triggerActionName
|
|
1031
|
+
};
|
|
1032
|
+
};
|
|
1033
|
+
immediateSideEffectsPromises.push(oController._sideEffects.requestSideEffects(aSideEffect, oContext, groupId, fnGetImmediateTargetsAndActions));
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
if (textPaths !== null && textPaths !== void 0 && textPaths[key] && textPaths[key].length) {
|
|
1039
|
+
immediateSideEffectsPromises.push(oSideEffectsService.requestSideEffects(textPaths[key], oSelectedContext, groupId));
|
|
1040
|
+
}
|
|
1041
|
+
return Promise.allSettled(immediateSideEffectsPromises);
|
|
1042
|
+
},
|
|
1043
|
+
/**
|
|
1044
|
+
* Create the mass edit dialog.
|
|
1045
|
+
*
|
|
1046
|
+
* @param oTable Instance of Table
|
|
1047
|
+
* @param aContexts Contexts for mass edit
|
|
1048
|
+
* @param oController Controller for the view
|
|
1049
|
+
* @returns Promise returning instance of dialog.
|
|
1050
|
+
*/
|
|
1051
|
+
createDialog: async function (oTable, aContexts, oController) {
|
|
1052
|
+
const sFragmentName = "sap/fe/core/controls/massEdit/MassEditDialog",
|
|
1053
|
+
aDataArray = [],
|
|
1054
|
+
oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core"),
|
|
1055
|
+
oDefaultValues = MassEditHelper.getDefaultTextsForDialog(oResourceBundle, aContexts.length, oTable),
|
|
1056
|
+
oDataFieldModel = MassEditHelper.prepareDataForDialog(oTable, aContexts, aDataArray),
|
|
1057
|
+
dialogContext = MassEditHelper.getDialogContext(oTable),
|
|
1058
|
+
oDialogDataModel = MassEditHelper.setRuntimeModelOnDialog(aContexts, aDataArray, oDefaultValues, dialogContext),
|
|
1059
|
+
model = oTable.getModel(),
|
|
1060
|
+
metaModel = model.getMetaModel(),
|
|
1061
|
+
itemsModel = new TemplateModel(oDataFieldModel.getData(), metaModel);
|
|
1062
|
+
const oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
|
|
1063
|
+
const oCreatedFragment = await Promise.resolve(XMLPreprocessor.process(oFragment, {
|
|
1064
|
+
name: sFragmentName
|
|
1065
|
+
}, {
|
|
1066
|
+
bindingContexts: {
|
|
1067
|
+
dataFieldModel: itemsModel.createBindingContext("/"),
|
|
1068
|
+
metaModel: metaModel.createBindingContext("/"),
|
|
1069
|
+
contextPath: metaModel.createBindingContext(metaModel.getMetaPath(dialogContext.getPath()))
|
|
1070
|
+
},
|
|
1071
|
+
models: {
|
|
1072
|
+
dataFieldModel: itemsModel,
|
|
1073
|
+
metaModel: metaModel,
|
|
1074
|
+
contextPath: metaModel
|
|
1075
|
+
}
|
|
1076
|
+
}));
|
|
1077
|
+
const oDialogContent = await Fragment.load({
|
|
1078
|
+
definition: oCreatedFragment
|
|
1079
|
+
});
|
|
1080
|
+
const oDialog = new Dialog({
|
|
1081
|
+
resizable: true,
|
|
1082
|
+
title: oDefaultValues.massEditTitle,
|
|
1083
|
+
content: [oDialogContent],
|
|
1084
|
+
afterOpen: MassEditHelper.onDialogOpen,
|
|
1085
|
+
beginButton: new Button({
|
|
1086
|
+
text: MassEditHelper.helpers.getExpBindingForApplyButtonTxt(oDefaultValues, oDataFieldModel.getObject("/")),
|
|
1087
|
+
type: "Emphasized",
|
|
1088
|
+
press: async function (oEvent) {
|
|
1089
|
+
var _oController$getView6, _oController$getView7;
|
|
1090
|
+
messageHandling.removeBoundTransitionMessages();
|
|
1091
|
+
messageHandling.removeUnboundTransitionMessages();
|
|
1092
|
+
(_oController$getView6 = oController.getView()) === null || _oController$getView6 === void 0 ? void 0 : (_oController$getView7 = _oController$getView6.getBindingContext("internal")) === null || _oController$getView7 === void 0 ? void 0 : _oController$getView7.setProperty("skipPatchHandlers", true);
|
|
1093
|
+
const oInDialog = oEvent.getSource().getParent();
|
|
1094
|
+
const oModel = oInDialog.getModel("fieldsInfo");
|
|
1095
|
+
const aResults = oModel.getProperty("/results");
|
|
1096
|
+
const oMetaModel = oTable && oTable.getModel().getMetaModel(),
|
|
1097
|
+
sCurrentEntitySetName = oTable.data("metaPath"),
|
|
1098
|
+
oEntitySetContext = oMetaModel.getContext(sCurrentEntitySetName);
|
|
1099
|
+
const aSideEffects = await SideEffectsHelper.generateSideEffectsMapFromMetaModel(oMetaModel);
|
|
1100
|
+
const errorContexts = [];
|
|
1101
|
+
const textPaths = oModel.getProperty("/textPaths");
|
|
1102
|
+
const aPropertyReadableInfo = oModel.getProperty("/readablePropertyData");
|
|
1103
|
+
let groupId;
|
|
1104
|
+
let allSideEffects;
|
|
1105
|
+
const massEditPromises = [];
|
|
1106
|
+
const failedFieldsData = {};
|
|
1107
|
+
const selectedRowsLength = aContexts.length;
|
|
1108
|
+
const deferredTargetsForAQualifiedName = {};
|
|
1109
|
+
const baseSideEffectsMapArray = MassEditHelper.getSideEffectDataForKey(oEntitySetContext, aSideEffects, oController, aResults);
|
|
1110
|
+
//const changePromise: any[] = [];
|
|
1111
|
+
//let bReadOnlyField = false;
|
|
1112
|
+
//const errorContexts: object[] = [];
|
|
1113
|
+
|
|
1114
|
+
aContexts.forEach(function (oSelectedContext, idx) {
|
|
1115
|
+
allSideEffects = [];
|
|
1116
|
+
aResults.forEach(async function (oResult) {
|
|
1117
|
+
if (!failedFieldsData.hasOwnProperty(oResult.keyValue)) {
|
|
1118
|
+
failedFieldsData[oResult.keyValue] = 0;
|
|
1119
|
+
}
|
|
1120
|
+
//TODO - Add save implementation for Value Help.
|
|
1121
|
+
if (baseSideEffectsMapArray[oResult.keyValue]) {
|
|
1122
|
+
allSideEffects[oResult.keyValue] = baseSideEffectsMapArray[oResult.keyValue];
|
|
1123
|
+
}
|
|
1124
|
+
if (aPropertyReadableInfo) {
|
|
1125
|
+
aPropertyReadableInfo.some(function (oPropertyInfo) {
|
|
1126
|
+
if (oResult.keyValue === oPropertyInfo.property) {
|
|
1127
|
+
if (oPropertyInfo.type === "Default") {
|
|
1128
|
+
return oPropertyInfo.value === true;
|
|
1129
|
+
} else if (oPropertyInfo.type === "Path" && oPropertyInfo.propertyValue && oPropertyInfo.propertyPath) {
|
|
1130
|
+
return oSelectedContext.getObject(oPropertyInfo.propertyPath) === oPropertyInfo.propertyValue;
|
|
1131
|
+
}
|
|
1132
|
+
}
|
|
1133
|
+
});
|
|
1134
|
+
}
|
|
1135
|
+
groupId = `$auto.${idx}`;
|
|
1136
|
+
const oFieldPromise = oSelectedContext.setProperty(oResult.keyValue, oResult.value, groupId).catch(function (oError) {
|
|
1137
|
+
errorContexts.push(oSelectedContext.getObject());
|
|
1138
|
+
Log.error("Mass Edit: Something went wrong in updating entries.", oError);
|
|
1139
|
+
failedFieldsData[oResult.keyValue] = failedFieldsData[oResult.keyValue] + 1;
|
|
1140
|
+
return Promise.reject({
|
|
1141
|
+
isFieldUpdateFailed: true
|
|
1142
|
+
});
|
|
1143
|
+
});
|
|
1144
|
+
const dataToUpdateFieldAndSideEffects = {
|
|
1145
|
+
oController,
|
|
1146
|
+
oFieldPromise,
|
|
1147
|
+
sideEffectsMap: baseSideEffectsMapArray[oResult.keyValue],
|
|
1148
|
+
textPaths,
|
|
1149
|
+
groupId,
|
|
1150
|
+
key: oResult.keyValue,
|
|
1151
|
+
oEntitySetContext,
|
|
1152
|
+
oMetaModel,
|
|
1153
|
+
oSelectedContext,
|
|
1154
|
+
deferredTargetsForAQualifiedName
|
|
1155
|
+
};
|
|
1156
|
+
massEditPromises.push(MassEditHelper.handleMassEditFieldUpdateAndRequestSideEffects(dataToUpdateFieldAndSideEffects));
|
|
1157
|
+
});
|
|
1158
|
+
});
|
|
1159
|
+
await Promise.allSettled(massEditPromises).then(async function () {
|
|
1160
|
+
groupId = `$auto.massEditDeferred`;
|
|
1161
|
+
const deferredRequests = [];
|
|
1162
|
+
const sideEffectsDataForAllKeys = Object.values(deferredTargetsForAQualifiedName);
|
|
1163
|
+
const keysWithSideEffects = Object.keys(deferredTargetsForAQualifiedName);
|
|
1164
|
+
sideEffectsDataForAllKeys.forEach((aSideEffect, index) => {
|
|
1165
|
+
const currentKey = keysWithSideEffects[index];
|
|
1166
|
+
if (failedFieldsData[currentKey] !== selectedRowsLength) {
|
|
1167
|
+
const deferredSideEffectsData = Object.values(aSideEffect);
|
|
1168
|
+
deferredSideEffectsData.forEach(req => {
|
|
1169
|
+
const {
|
|
1170
|
+
aTargets,
|
|
1171
|
+
oContext,
|
|
1172
|
+
TriggerAction,
|
|
1173
|
+
mSideEffect
|
|
1174
|
+
} = req;
|
|
1175
|
+
const fnGetDeferredTargets = function () {
|
|
1176
|
+
return aTargets;
|
|
1177
|
+
};
|
|
1178
|
+
const fnGetDeferredTargetsAndActions = function () {
|
|
1179
|
+
return {
|
|
1180
|
+
aTargets: fnGetDeferredTargets(),
|
|
1181
|
+
TriggerAction: TriggerAction
|
|
1182
|
+
};
|
|
1183
|
+
};
|
|
1184
|
+
deferredRequests.push(
|
|
1185
|
+
// if some deferred is rejected, it will be add to failed queue
|
|
1186
|
+
oController._sideEffects.requestSideEffects(mSideEffect, oContext, groupId, fnGetDeferredTargetsAndActions));
|
|
1187
|
+
});
|
|
1188
|
+
}
|
|
1189
|
+
});
|
|
1190
|
+
}).then(function () {
|
|
1191
|
+
MassEditHelper.messageHandlingForMassEdit(oTable, aContexts, oController, oInDialog, aResults, errorContexts);
|
|
1192
|
+
}).catch(e => {
|
|
1193
|
+
MassEditHelper.closeDialog(oDialog);
|
|
1194
|
+
return Promise.reject(e);
|
|
1195
|
+
});
|
|
1196
|
+
}
|
|
1197
|
+
}),
|
|
1198
|
+
endButton: new Button({
|
|
1199
|
+
text: oDefaultValues.cancelButtonText,
|
|
1200
|
+
visible: MassEditHelper.helpers.hasEditableFieldsBinding(oDataFieldModel.getObject("/"), true),
|
|
1201
|
+
press: function (oEvent) {
|
|
1202
|
+
const oInDialog = oEvent.getSource().getParent();
|
|
1203
|
+
MassEditHelper.closeDialog(oInDialog);
|
|
1204
|
+
}
|
|
1205
|
+
})
|
|
1206
|
+
});
|
|
1207
|
+
oDialog.setModel(oDialogDataModel, "fieldsInfo");
|
|
1208
|
+
oDialog.setModel(model);
|
|
1209
|
+
oDialog.setBindingContext(dialogContext);
|
|
1210
|
+
return oDialog;
|
|
1211
|
+
},
|
|
1212
|
+
helpers: {
|
|
1213
|
+
getBindingExpForHasEditableFields: (fields, editable) => {
|
|
1214
|
+
const totalExp = fields.reduce((expression, field) => or(expression, pathInModel("/values/" + field.dataProperty + "/visible", "fieldsInfo")), constant(false));
|
|
1215
|
+
return editable ? totalExp : not(totalExp);
|
|
1216
|
+
},
|
|
1217
|
+
getExpBindingForApplyButtonTxt: (defaultValues, fields) => {
|
|
1218
|
+
const editableExp = MassEditHelper.helpers.getBindingExpForHasEditableFields(fields, true);
|
|
1219
|
+
const totalExp = ifElse(editableExp, constant(defaultValues.applyButtonText), constant(defaultValues.okButtonText));
|
|
1220
|
+
return compileExpression(totalExp);
|
|
1221
|
+
},
|
|
1222
|
+
hasEditableFieldsBinding: (fields, editable) => {
|
|
1223
|
+
return compileExpression(MassEditHelper.helpers.getBindingExpForHasEditableFields(fields, editable));
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1226
|
+
};
|
|
1227
|
+
return MassEditHelper;
|
|
1228
|
+
}, false);
|
|
1229
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNYXNzRWRpdEhlbHBlciIsImluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aCIsInNQYXRoIiwiYVZhbHVlcyIsImFGaW5hbFBhdGgiLCJpbmRleCIsImFQYXRocyIsInNwbGl0Iiwic0Z1bGxQYXRoIiwiZm9yRWFjaCIsInNQcm9wZXJ0eVBhdGgiLCJnZXRVbmlxdWVWYWx1ZXMiLCJzVmFsdWUiLCJzZWxmIiwidW5kZWZpbmVkIiwiaW5kZXhPZiIsImdldFZhbHVlRm9yTXVsdGlMZXZlbFBhdGgiLCJzRGF0YVByb3BlcnR5UGF0aCIsIm9WYWx1ZXMiLCJyZXN1bHQiLCJhUHJvcGVydHlQYXRocyIsImdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3giLCJhQ29udGV4dHMiLCJsZW5ndGgiLCJvU2VsZWN0ZWRDb250ZXh0IiwiYVByb3BlcnR5VmFsdWVzIiwib0NvbnRleHQiLCJvRGF0YU9iamVjdCIsImdldE9iamVjdCIsInNNdWx0aUxldmVsUGF0aENvbmRpdGlvbiIsImhhc093blByb3BlcnR5IiwicHVzaCIsImFVbmlxdWVQcm9wZXJ0eVZhbHVlcyIsImZpbHRlciIsImdldEhpZGRlblZhbHVlRm9yQ29udGV4dHMiLCJoaWRkZW5WYWx1ZSIsIiRQYXRoIiwic29tZSIsImdldElucHV0VHlwZSIsInByb3BlcnR5SW5mbyIsImRhdGFGaWVsZENvbnZlcnRlZCIsIm9EYXRhTW9kZWxQYXRoIiwiZWRpdFN0eWxlUHJvcGVydGllcyIsImlucHV0VHlwZSIsInNldEVkaXRTdHlsZVByb3BlcnRpZXMiLCJlZGl0U3R5bGUiLCJpc1ZhbGlkRm9yTWFzc0VkaXQiLCJpc011bHRpVmFsdWVGaWVsZCIsImhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlcyIsImdldElzRmllbGRHcnAiLCIkVHlwZSIsIlRhcmdldCIsInZhbHVlIiwiZ2V0VGV4dFBhdGgiLCJwcm9wZXJ0eSIsInRleHRCaW5kaW5nIiwiZGlzcGxheU1vZGUiLCJkZXNjcmlwdGlvblBhdGgiLCJwYXRoIiwicGFyYW1ldGVycyIsInByb3BzIiwicHJlcGFyZURhdGFGb3JEaWFsb2ciLCJvVGFibGUiLCJhRGF0YUFycmF5Iiwib01ldGFNb2RlbCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic0N1cnJlbnRFbnRpdHlTZXROYW1lIiwiZGF0YSIsImFUYWJsZUZpZWxkcyIsImdldFRhYmxlRmllbGRzIiwib0VudGl0eVR5cGVDb250ZXh0IiwiZ2V0Q29udGV4dCIsIm9FbnRpdHlTZXRDb250ZXh0Iiwib0RhdGFNb2RlbE9iamVjdFBhdGgiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJvRGF0YUZpZWxkTW9kZWwiLCJKU09OTW9kZWwiLCJvUmVzdWx0Iiwic0xhYmVsVGV4dCIsImJWYWx1ZUhlbHBFbmFibGVkIiwic1VuaXRQcm9wZXJ0eVBhdGgiLCJiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQiLCJvVGV4dEJpbmRpbmciLCJvQ29sdW1uSW5mbyIsImRhdGFQcm9wZXJ0eSIsIm9Qcm9wZXJ0eUluZm8iLCJsYWJlbCIsInRhcmdldE9iamVjdCIsInRhcmdldEVudGl0eVR5cGUiLCJlbnRpdHlQcm9wZXJ0aWVzIiwib1Byb3BlcnR5IiwibmFtZSIsImdldFRleHRCaW5kaW5nIiwib0ZpZWxkQ29udGV4dCIsImFubm90YXRpb25QYXRoIiwib0RhdGFGaWVsZENvbnZlcnRlZCIsImNvbnZlcnRNZXRhTW9kZWxDb250ZXh0Iiwib1Byb3BlcnR5Q29udGV4dCIsIm9JbnRlcmZhY2UiLCJnZXRJbnRlcmZhY2UiLCJWYWx1ZSIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwiYkhpZGRlbkZpZWxkIiwiaXNJbWFnZSIsImNvbnRleHQiLCJnZXRQYXRoIiwiX3R5cGUiLCIkdGFyZ2V0IiwiY2hhcnRQcm9wZXJ0eSIsInRlcm0iLCJpc0FjdGlvbiIsIkFjdGlvbiIsImlzRmllbGRHcnAiLCJoYXNDdXJyZW5jeSIsImhhc1VuaXQiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aCIsInVuaXRQcm9wZXJ0eUluZm8iLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5IiwiaGFzVmFsdWVIZWxwIiwiaGFzQ29udGV4dERlcGVuZGVudFZIIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJWYWx1ZUxpc3RSZWxldmFudFF1YWxpZmllcnMiLCJwcm9wZXJ0eUZvckZpZWxkQ29udHJvbCIsImV4cEJpbmRpbmciLCJnZXRFZGl0TW9kZSIsImNvbnN0YW50IiwiZWRpdE1vZGVWYWx1ZXMiLCJPYmplY3QiLCJrZXlzIiwiRWRpdE1vZGUiLCJlZGl0TW9kZUlzU3RhdGljIiwiaW5jbHVkZXMiLCJlZGl0YWJsZSIsIkVkaXRhYmxlIiwibmF2UHJvcGVydHlXaXRoVmFsdWVIZWxwIiwicmVsYXRpdmVQYXRoIiwiZ2V0UmVsYXRpdmVQYXRocyIsImlzUmVhZE9ubHkiLCJpc1JlYWRPbmx5RXhwcmVzc2lvbiIsIkNvbW1vblV0aWxzIiwiY29tcHV0ZURpc3BsYXlNb2RlIiwiaXNWYWx1ZUhlbHBFbmFibGVkIiwiaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCIsInVuaXRQcm9wZXJ0eSIsImlzRmllbGRSZXF1aXJlZCIsImdldFJlcXVpcmVkRXhwcmVzc2lvbiIsImRlZmF1bHRTZWxlY3Rpb25QYXRoIiwiZGVmYXVsdFNlbGVjdGlvblVuaXRQYXRoIiwiZW50aXR5U2V0IiwiZGlzcGxheSIsIm51bGxhYmxlIiwiaXNQcm9wZXJ0eVJlYWRPbmx5IiwiZWRpdE1vZGUiLCJoYXNWSCIsInJ1bnRpbWVQYXRoIiwicHJvcGVydHlQYXRoRm9yVmFsdWVIZWxwIiwidW5pdEluZm8iLCJzZXREYXRhIiwiYUNvbHVtbnMiLCJnZXRDb2x1bW5zIiwiY29sdW1uc0RhdGEiLCJnZXRQYXJlbnQiLCJnZXRUYWJsZURlZmluaXRpb24iLCJjb2x1bW5zIiwibWFwIiwib0NvbHVtbiIsInNEYXRhUHJvcGVydHkiLCJnZXREYXRhUHJvcGVydHkiLCJhUmVhbHRlZENvbHVtbkluZm8iLCJ0eXBlIiwiZ2V0SGVhZGVyIiwiZ2V0RGVmYXVsdFRleHRzRm9yRGlhbG9nIiwib1Jlc291cmNlQnVuZGxlIiwiaVNlbGVjdGVkQ29udGV4dHMiLCJiRGlzcGxheU1vZGUiLCJrZWVwRXhpc3RpbmdQcmVmaXgiLCJsZWF2ZUJsYW5rVmFsdWUiLCJjbGVhckZpZWxkVmFsdWUiLCJtYXNzRWRpdFRpdGxlIiwiZ2V0VGV4dCIsInRvU3RyaW5nIiwiYXBwbHlCdXR0b25UZXh0IiwidXNlVmFsdWVIZWxwVmFsdWUiLCJjYW5jZWxCdXR0b25UZXh0Iiwibm9GaWVsZHMiLCJva0J1dHRvblRleHQiLCJzZXREZWZhdWx0VmFsdWVzVG9EaWFsb2ciLCJvRGVmYXVsdFZhbHVlcyIsImJVT01GaWVsZCIsInNJbnB1dFR5cGUiLCJiUHJvcGVydHlSZXF1aXJlZCIsInNTdWZmaXhGb3JLZWVwRXhpc3RpbmciLCJkZWZhdWx0T3B0aW9ucyIsInNlbGVjdE9wdGlvbnNFeGlzdCIsInNlbGVjdE9wdGlvbnMiLCJrZWVwRW50cnkiLCJ0ZXh0Iiwia2V5IiwiZmFsc2VFbnRyeSIsInRleHRJbmZvIiwidHJ1dGh5RW50cnkiLCJ1bnNoaWZ0IiwidmhkRW50cnkiLCJjbGVhckVudHJ5IiwiZW1wdHlFbnRyeSIsImdldFRleHRBcnJhbmdlbWVudEluZm8iLCJzZWxlY3RlZENvbnRleHQiLCJkZXNjcmlwdGlvblZhbHVlIiwiZnVsbFRleHQiLCJMb2ciLCJpbmZvIiwidGV4dEFycmFuZ2VtZW50IiwidmFsdWVQYXRoIiwiZGVzY3JpcHRpb24iLCJpc0VkaXRhYmxlIiwiYW55IiwiYmluZGluZyIsImdldEJpbmRpbmciLCJnZXRFeHRlcm5hbFZhbHVlIiwib25Db250ZXh0RWRpdGFibGVDaGFuZ2UiLCJvRGlhbG9nRGF0YU1vZGVsIiwib2JqZWN0c0ZvclZpc2liaWxpdHkiLCJnZXRQcm9wZXJ0eSIsInNldFByb3BlcnR5IiwidXBkYXRlT25Db250ZXh0Q2hhbmdlIiwibU9Ub1VzZSIsInZhbHVlcyIsImF0dGFjaENoYW5nZSIsImJpbmQiLCJnZXRCb3VuZE9iamVjdCIsIkFueSIsIm1vZGVsIiwic2V0TW9kZWwiLCJzZXRCaW5kaW5nQ29udGV4dCIsImdldEZpZWxkVmlzaWJsaXR5IiwiaXNDb250ZXh0RWRpdGFibGUiLCJzZXRSdW50aW1lTW9kZWxPbkRpYWxvZyIsImRpYWxvZ0NvbnRleHQiLCJhVW5pdERhdGEiLCJhUmVzdWx0cyIsInRleHRQYXRocyIsImFSZWFkT25seUZpZWxkSW5mbyIsIm9EYXRhIiwidW5pdERhdGEiLCJyZXN1bHRzIiwicmVhZGFibGVQcm9wZXJ0eURhdGEiLCJzZWxlY3RlZEtleSIsIm9JbkRhdGEiLCJvVGV4dEluZm8iLCJzUHJvcGVydHlLZXkiLCJzVW5pdFByb3BlcnR5TmFtZSIsIm9EaXN0aW5jdFZhbHVlTWFwIiwib0Rpc3RpbmN0VW5pdE1hcCIsInNNdWx0aUxldmVsUGF0aFZhbHVlIiwiZW50cnkiLCJ1bml0RW50cnkiLCJzTXVsdGlMZXZlbFByb3BQYXRoVmFsdWUiLCJiQ2xlYXJGaWVsZE9yQmxhbmtWYWx1ZUV4aXN0cyIsIm9iaiIsImJDbGVhckZpZWxkT3JCbGFua1VuaXRWYWx1ZUV4aXN0cyIsIm9wZXJhbmRzIiwib3BlcmFuZDEiLCJvcGVyYW5kMiIsInByb3BlcnR5UGF0aCIsInByb3BlcnR5VmFsdWUiLCJ2aXNpYmxlIiwiZ2V0RGlhbG9nQ29udGV4dCIsInRhYmxlIiwiZGlhbG9nIiwidHJhbnNDdHgiLCJnZXRCaW5kaW5nQ29udGV4dCIsImxpc3RCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsInRyYW5zaWVudExpc3RCaW5kaW5nIiwiYmluZExpc3QiLCIkJHVwZGF0ZUdyb3VwSWQiLCJyZWZyZXNoSW50ZXJuYWwiLCJjcmVhdGUiLCJvbkRpYWxvZ09wZW4iLCJldmVudCIsInNvdXJjZSIsImdldFNvdXJjZSIsImZpZWxkc0luZm9Nb2RlbCIsImNsb3NlRGlhbG9nIiwib0RpYWxvZyIsImNsb3NlIiwiZGVzdHJveSIsIm1lc3NhZ2VIYW5kbGluZ0Zvck1hc3NFZGl0Iiwib0NvbnRyb2xsZXIiLCJvSW5EaWFsb2ciLCJlcnJvckNvbnRleHRzIiwiRHJhZnRTdGF0dXMiLCJGRUxpYnJhcnkiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwiZ2V0VmlldyIsIl9lZGl0RmxvdyIsImdldE1lc3NhZ2VIYW5kbGVyIiwic2hvd01lc3NhZ2VzIiwib25CZWZvcmVTaG93TWVzc2FnZSIsIm1lc3NhZ2VzIiwic2hvd01lc3NhZ2VQYXJhbWV0ZXJzIiwiZm5HZXRNZXNzYWdlU3VidGl0bGUiLCJtZXNzYWdlSGFuZGxpbmciLCJzZXRNZXNzYWdlU3VidGl0bGUiLCJ1bmJvdW5kRXJyb3JzIiwibWVzc2FnZSIsImdldFRhcmdldCIsInNldERyYWZ0U3RhdHVzIiwiU2F2ZWQiLCJzdWNjZXNzVG9hc3QiLCJNZXNzYWdlVG9hc3QiLCJzaG93IiwiZ2V0U2VsZWN0ZWRDb250ZXh0cyIsIkNsZWFyIiwic2hvd01lc3NhZ2VCb3giLCJzaG93TWVzc2FnZURpYWxvZyIsImlzT3BlbiIsImdldFNpZGVFZmZlY3REYXRhRm9yS2V5IiwiYVNpZGVFZmZlY3RzIiwic093bmVyRW50aXR5VHlwZSIsImJhc2VTaWRlRWZmZWN0c01hcEFycmF5Iiwia2V5VmFsdWUiLCJzaWRlRWZmZWN0c0FycmF5IiwiRmllbGRIZWxwZXIiLCJnZXRTaWRlRWZmZWN0c09uRW50aXR5QW5kUHJvcGVydHkiLCJfc2lkZUVmZmVjdHMiLCJnZXRTaWRlRWZmZWN0c01hcEZvckZpZWxkR3JvdXBzIiwiZm5HZXRQYXRoRm9yU291cmNlUHJvcGVydHkiLCJzRW50aXR5VHlwZSIsInNOYXZpZ2F0aW9uUGF0aCIsInN1YnN0ciIsImxhc3RJbmRleE9mIiwicE93bmVyRW50aXR5IiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZXF1ZXN0T2JqZWN0IiwiZm5HZXRFbnRpdHlUeXBlT2ZPd25lciIsImJhc2VOYXZQYXRoIiwidGFyZ2V0RW50aXR5IiwiYVRhcmdldHMiLCJvd25lckVudGl0eVR5cGUiLCJwT3duZXIiLCIkUGFydG5lciIsIm93bmVyTmF2UGF0aCIsImVudGl0eU9iak9mT3duZXJQYXJ0bmVyIiwiZW50aXR5VHlwZU9mT3duZXJQYXJ0bmVyIiwiZm5HZXRUYXJnZXRzRm9yTWFzc0VkaXQiLCJzaWRlRWZmZWN0c0RhdGEiLCJUYXJnZXRQcm9wZXJ0aWVzIiwiYVRhcmdldFByb3BlcnRpZXMiLCJUYXJnZXRFbnRpdGllcyIsImFUYXJnZXRFbnRpdGllcyIsImFQcm9taXNlcyIsInRhcmdldFByb3AiLCJ0aGVuIiwicmVzdWx0RW50aXR5IiwiYWxsIiwiY2hlY2tJZkVudGl0eUV4aXN0c0FzVGFyZ2V0RW50aXR5Iiwic2lkZUVmZmVjdHNNYXAiLCJzaWRlRWZmZWN0c09uT3RoZXJFbnRpdHkiLCJlbnRpdHlTZXROYW1lIiwicG9wIiwic2lkZUVmZmVjdHNXaXRoQ3VycmVudEVudGl0eUFzVGFyZ2V0IiwidGFyZ2V0RW50aXRpZXNBcnJheSIsInNpZGVFZmZlY3RzIiwiaW5uZXJPYmoiLCJoYW5kbGVNYXNzRWRpdEZpZWxkVXBkYXRlQW5kUmVxdWVzdFNpZGVFZmZlY3RzIiwibVBhcmFtcyIsIm9GaWVsZFByb21pc2UiLCJncm91cElkIiwiZGVmZXJyZWRUYXJnZXRzRm9yQVF1YWxpZmllZE5hbWUiLCJpbW1lZGlhdGVTaWRlRWZmZWN0c1Byb21pc2VzIiwib0FwcENvbXBvbmVudCIsImdldEFwcENvbXBvbmVudCIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJpc1NpZGVFZmZlY3RzV2l0aEN1cnJlbnRFbnRpdHlBc1RhcmdldCIsImFsbEVudGl0eVR5cGVzV2l0aFF1YWxpZmllciIsInNpZGVFZmZlY3RzRGF0YUZvckZpZWxkIiwibVZpc2l0ZWRTaWRlRWZmZWN0cyIsImVudHJpZXMiLCJlbnRpdHlUeXBlV2l0aFF1YWxpZmllciIsImdldENvbnRleHRGb3JTaWRlRWZmZWN0cyIsImFsbEZhaWxlZFNpZGVFZmZlY3RzIiwiZ2V0UmVnaXN0ZXJlZEZhaWxlZFJlcXVlc3RzIiwiYUZhaWxlZFNpZGVFZmZlY3RzIiwidW5yZWdpc3RlckZhaWxlZFNpZGVFZmZlY3RzRm9yQUNvbnRleHQiLCJzaWRlRWZmZWN0c0ZvckN1cnJlbnRDb250ZXh0IiwiY29uY2F0IiwiYVNpZGVFZmZlY3QiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJhSW1tZWRpYXRlVGFyZ2V0cyIsImFsbFRhcmdldHMiLCJ0cmlnZ2VyQWN0aW9uTmFtZSIsImZuR2V0SW1tZWRpYXRlVGFyZ2V0c0FuZEFjdGlvbnMiLCJtU2lkZUVmZmVjdCIsInNpZGVFZmZlY3RFbnRpdHlUeXBlIiwidGFyZ2V0c0FycmF5Rm9yQWxsUHJvcGVydGllcyIsImFjdGlvbk5hbWUiLCJUcmlnZ2VyQWN0aW9uIiwiYURlZmVycmVkVGFyZ2V0cyIsInRhcmdldCIsImlzU3RhdGljQWN0aW9uIiwiVGFibGVIZWxwZXIiLCJfaXNTdGF0aWNBY3Rpb24iLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJhbGxTZXR0bGVkIiwiY3JlYXRlRGlhbG9nIiwic0ZyYWdtZW50TmFtZSIsIm1ldGFNb2RlbCIsIml0ZW1zTW9kZWwiLCJUZW1wbGF0ZU1vZGVsIiwiZ2V0RGF0YSIsIm9GcmFnbWVudCIsIlhNTFRlbXBsYXRlUHJvY2Vzc29yIiwibG9hZFRlbXBsYXRlIiwib0NyZWF0ZWRGcmFnbWVudCIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJiaW5kaW5nQ29udGV4dHMiLCJkYXRhRmllbGRNb2RlbCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiY29udGV4dFBhdGgiLCJnZXRNZXRhUGF0aCIsIm1vZGVscyIsIm9EaWFsb2dDb250ZW50IiwiRnJhZ21lbnQiLCJsb2FkIiwiZGVmaW5pdGlvbiIsIkRpYWxvZyIsInJlc2l6YWJsZSIsInRpdGxlIiwiY29udGVudCIsImFmdGVyT3BlbiIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwiaGVscGVycyIsImdldEV4cEJpbmRpbmdGb3JBcHBseUJ1dHRvblR4dCIsInByZXNzIiwib0V2ZW50IiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwib01vZGVsIiwiU2lkZUVmZmVjdHNIZWxwZXIiLCJnZW5lcmF0ZVNpZGVFZmZlY3RzTWFwRnJvbU1ldGFNb2RlbCIsImFQcm9wZXJ0eVJlYWRhYmxlSW5mbyIsImFsbFNpZGVFZmZlY3RzIiwibWFzc0VkaXRQcm9taXNlcyIsImZhaWxlZEZpZWxkc0RhdGEiLCJzZWxlY3RlZFJvd3NMZW5ndGgiLCJpZHgiLCJjYXRjaCIsIm9FcnJvciIsImVycm9yIiwicmVqZWN0IiwiaXNGaWVsZFVwZGF0ZUZhaWxlZCIsImRhdGFUb1VwZGF0ZUZpZWxkQW5kU2lkZUVmZmVjdHMiLCJkZWZlcnJlZFJlcXVlc3RzIiwic2lkZUVmZmVjdHNEYXRhRm9yQWxsS2V5cyIsImtleXNXaXRoU2lkZUVmZmVjdHMiLCJjdXJyZW50S2V5IiwiZGVmZXJyZWRTaWRlRWZmZWN0c0RhdGEiLCJyZXEiLCJmbkdldERlZmVycmVkVGFyZ2V0cyIsImZuR2V0RGVmZXJyZWRUYXJnZXRzQW5kQWN0aW9ucyIsImUiLCJlbmRCdXR0b24iLCJoYXNFZGl0YWJsZUZpZWxkc0JpbmRpbmciLCJnZXRCaW5kaW5nRXhwRm9ySGFzRWRpdGFibGVGaWVsZHMiLCJmaWVsZHMiLCJ0b3RhbEV4cCIsInJlZHVjZSIsImV4cHJlc3Npb24iLCJmaWVsZCIsIm9yIiwicGF0aEluTW9kZWwiLCJub3QiLCJkZWZhdWx0VmFsdWVzIiwiZWRpdGFibGVFeHAiLCJpZkVsc2UiLCJjb21waWxlRXhwcmVzc2lvbiJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiTWFzc0VkaXRIZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7XG5cdEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnksXG5cdE1hc3NFZGl0RmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSxcblx0TWFzc0VkaXRGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NpZGVFZmZlY3RzXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbiwgQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgY29tcGlsZUV4cHJlc3Npb24sIGNvbnN0YW50LCBpZkVsc2UsIG5vdCwgb3IsIHBhdGhJbk1vZGVsIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCBGRUxpYnJhcnkgZnJvbSBcInNhcC9mZS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBPRGF0YVNpZGVFZmZlY3RzVHlwZSwgU2lkZUVmZmVjdHNUYXJnZXRFbnRpdHlUeXBlLCBTaWRlRWZmZWN0c1R5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IFRlbXBsYXRlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IGVuaGFuY2VEYXRhTW9kZWxQYXRoLCBnZXRSZWxhdGl2ZVBhdGhzIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHtcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eVBhdGgsXG5cdGhhc0N1cnJlbmN5LFxuXHRoYXNVbml0LFxuXHRoYXNWYWx1ZUhlbHAsXG5cdGhhc1ZhbHVlSGVscFdpdGhGaXhlZFZhbHVlc1xufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IEZpZWxkSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRUZXh0QmluZGluZywgc2V0RWRpdFN0eWxlUHJvcGVydGllcyB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkVGVtcGxhdGluZ1wiO1xuaW1wb3J0IHR5cGUgeyBGaWVsZFByb3BlcnRpZXMgfSBmcm9tIFwic2FwL2ZlL21hY3Jvcy9pbnRlcm5hbC9JbnRlcm5hbEZpZWxkXCI7XG5pbXBvcnQgVGFibGVIZWxwZXIgZnJvbSBcInNhcC9mZS9tYWNyb3MvdGFibGUvVGFibGVIZWxwZXJcIjtcbmltcG9ydCBCdXR0b24gZnJvbSBcInNhcC9tL0J1dHRvblwiO1xuaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IEVkaXRNb2RlIGZyb20gXCJzYXAvdWkvbWRjL2VudW0vRWRpdE1vZGVcIjtcbmltcG9ydCB0eXBlIFRhYmxlIGZyb20gXCJzYXAvdWkvbWRjL1RhYmxlXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwiLi4vY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgdHlwZSB7IEFueVR5cGUgfSBmcm9tIFwiLi4vY29udHJvbHMvQW55XCI7XG5pbXBvcnQgQW55IGZyb20gXCIuLi9jb250cm9scy9BbnlcIjtcbmltcG9ydCB7IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0LCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwiLi4vY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGlzUmVhZE9ubHlFeHByZXNzaW9uIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRmllbGRDb250cm9sSGVscGVyXCI7XG5pbXBvcnQgeyBnZXRFZGl0TW9kZSwgZ2V0UmVxdWlyZWRFeHByZXNzaW9uLCBpc011bHRpVmFsdWVGaWVsZCB9IGZyb20gXCIuLi90ZW1wbGF0aW5nL1VJRm9ybWF0dGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCIuL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgU2lkZUVmZmVjdHNIZWxwZXIgZnJvbSBcIi4vU2lkZUVmZmVjdHNIZWxwZXJcIjtcblxuLyogVGhpcyBjbGFzcyBjb250YWlucyBoZWxwZXJzIHRvIGJlIHVzZWQgZm9yIG1hc3MgZWRpdCBmdW5jdGlvbmFsaXR5ICovXG50eXBlIFRleHRBcnJhbmdlbWVudEluZm8gPSB7XG5cdHRleHRBcnJhbmdlbWVudDogc3RyaW5nO1xuXHR2YWx1ZVBhdGg6IHN0cmluZztcblx0ZGVzY3JpcHRpb25QYXRoPzogc3RyaW5nO1xuXHR2YWx1ZTogc3RyaW5nO1xuXHRkZXNjcmlwdGlvbjogc3RyaW5nO1xuXHRmdWxsVGV4dDogc3RyaW5nO1xufTtcblxudHlwZSBCaW5kaW5nSW5mbyA9IHtcblx0cGF0aD86IHN0cmluZztcblx0bW9kZWw/OiBzdHJpbmcgfCBvYmplY3Q7XG5cdHBhcmFtZXRlcnM/OiBBcnJheTxCaW5kaW5nSW5mbz47XG59O1xuXG5leHBvcnQgdHlwZSBEYXRhVG9VcGRhdGVGaWVsZEFuZFNpZGVFZmZlY3RzVHlwZSA9IHtcblx0b0NvbnRyb2xsZXI6IFBhZ2VDb250cm9sbGVyO1xuXHRvRmllbGRQcm9taXNlOiBQcm9taXNlPGFueT47XG5cdHNpZGVFZmZlY3RzTWFwOiBNYXNzRWRpdEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgfCBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5O1xuXHR0ZXh0UGF0aHM6IGFueTtcblx0Z3JvdXBJZDogc3RyaW5nO1xuXHRrZXk6IHN0cmluZztcblx0b0VudGl0eVNldENvbnRleHQ6IENvbnRleHQ7XG5cdG9NZXRhTW9kZWw6IGFueTtcblx0b1NlbGVjdGVkQ29udGV4dDogYW55O1xuXHRkZWZlcnJlZFRhcmdldHNGb3JBUXVhbGlmaWVkTmFtZTogYW55O1xufTtcblxuY29uc3QgTWFzc0VkaXRIZWxwZXIgPSB7XG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyB0aGUgdmFsdWUgYXQgZmluYWwgb3IgZGVlcGVzdCBsZXZlbCBwYXRoIHdpdGggYSBibGFuayBhcnJheS5cblx0ICogUmV0dXJuIGFuIGVtcHR5IGFycmF5IHBvaW50aW5nIHRvIHRoZSBmaW5hbCBvciBkZWVwZXN0IGxldmVsIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzUGF0aCBQcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSBhVmFsdWVzIEFycmF5IGluc3RhbmNlIHdoZXJlIHRoZSBkZWZhdWx0IGRhdGEgbmVlZHMgdG8gYmUgYWRkZWRcblx0ICogQHJldHVybnMgVGhlIGZpbmFsIHBhdGhcblx0ICovXG5cdGluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aDogZnVuY3Rpb24gKHNQYXRoOiBzdHJpbmcsIGFWYWx1ZXM6IGFueSAvKiwgdHJhbnNDdHg6IENvbnRleHQgKi8pIHtcblx0XHRsZXQgYUZpbmFsUGF0aDogYW55O1xuXHRcdGxldCBpbmRleCA9IDA7XG5cdFx0Y29uc3QgYVBhdGhzID0gc1BhdGguc3BsaXQoXCIvXCIpO1xuXHRcdGxldCBzRnVsbFBhdGggPSBcIlwiO1xuXHRcdGFQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChzUHJvcGVydHlQYXRoOiBzdHJpbmcpIHtcblx0XHRcdGlmICghYVZhbHVlc1tzUHJvcGVydHlQYXRoXSAmJiBpbmRleCA9PT0gMCkge1xuXHRcdFx0XHRhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdID0ge307XG5cdFx0XHRcdGFGaW5hbFBhdGggPSBhVmFsdWVzW3NQcm9wZXJ0eVBhdGhdO1xuXHRcdFx0XHRzRnVsbFBhdGggPSBzRnVsbFBhdGggKyBzUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0fSBlbHNlIGlmICghYUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXSkge1xuXHRcdFx0XHRzRnVsbFBhdGggPSBgJHtzRnVsbFBhdGh9LyR7c1Byb3BlcnR5UGF0aH1gO1xuXHRcdFx0XHRpZiAoc0Z1bGxQYXRoICE9PSBzUGF0aCkge1xuXHRcdFx0XHRcdGFGaW5hbFBhdGhbc1Byb3BlcnR5UGF0aF0gPSB7fTtcblx0XHRcdFx0XHRhRmluYWxQYXRoID0gYUZpbmFsUGF0aFtzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhRmluYWxQYXRoW3NQcm9wZXJ0eVBhdGhdID0gW107XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gYUZpbmFsUGF0aDtcblx0fSxcblxuXHQvKipcblx0ICogTWV0aG9kIHRvIGdldCB1bmlxdWUgdmFsdWVzIGZvciBnaXZlbiBhcnJheSB2YWx1ZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBzVmFsdWUgUHJvcGVydHkgdmFsdWVcblx0ICogQHBhcmFtIGluZGV4IEluZGV4IG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuXHQgKiBAcGFyYW0gc2VsZiBJbnN0YW5jZSBvZiB0aGUgYXJyYXlcblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSB2YWx1ZVxuXHQgKi9cblx0Z2V0VW5pcXVlVmFsdWVzOiBmdW5jdGlvbiAoc1ZhbHVlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIsIHNlbGY6IGFueVtdKSB7XG5cdFx0cmV0dXJuIHNWYWx1ZSAhPSB1bmRlZmluZWQgJiYgc1ZhbHVlICE9IG51bGwgPyBzZWxmLmluZGV4T2Yoc1ZhbHVlKSA9PT0gaW5kZXggOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb3BlcnR5IHZhbHVlIGZvciBhIG11bHRpLWxldmVsIHBhdGggKGZvciBleGFtcGxlOiBfTWF0ZXJpYWxzL01hdGVyaWFsX0RldGFpbHMgZ2V0cyB0aGUgdmFsdWUgb2YgTWF0ZXJpYWxfRGV0YWlscyB1bmRlciBfTWF0ZXJpYWxzIE9iamVjdCkuXG5cdCAqIFJldHVybnMgdGhlIHByb3BlcnR5VmFsdWUsIHdoaWNoIGNhbiBiZSBvZiBhbnkgdHlwZSAoc3RyaW5nLCBudW1iZXIsIGV0Yy4uKS5cblx0ICpcblx0ICogQHBhcmFtIHNEYXRhUHJvcGVydHlQYXRoIFByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIG9WYWx1ZXMgT2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlc1xuXHQgKiBAcmV0dXJucyBUaGUgcHJvcGVydHkgdmFsdWVcblx0ICovXG5cdGdldFZhbHVlRm9yTXVsdGlMZXZlbFBhdGg6IGZ1bmN0aW9uIChzRGF0YVByb3BlcnR5UGF0aDogc3RyaW5nLCBvVmFsdWVzOiBhbnkpIHtcblx0XHRsZXQgcmVzdWx0OiBhbnk7XG5cdFx0aWYgKHNEYXRhUHJvcGVydHlQYXRoICYmIHNEYXRhUHJvcGVydHlQYXRoLmluZGV4T2YoXCIvXCIpID4gMCkge1xuXHRcdFx0Y29uc3QgYVByb3BlcnR5UGF0aHMgPSBzRGF0YVByb3BlcnR5UGF0aC5zcGxpdChcIi9cIik7XG5cdFx0XHRhUHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChzUGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdHJlc3VsdCA9IG9WYWx1ZXMgJiYgb1ZhbHVlc1tzUGF0aF0gPyBvVmFsdWVzW3NQYXRoXSA6IHJlc3VsdCAmJiByZXN1bHRbc1BhdGhdO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGtleSBwYXRoIGZvciB0aGUga2V5IG9mIGEgY29tYm8gYm94IHRoYXQgbXVzdCBiZSBzZWxlY3RlZCBpbml0aWFsbHkgd2hlbiB0aGUgZGlhbG9nIG9wZW5zOlxuXHQgKiA9PiBJZiBwcm9wZXJ0eVZhbHVlIGZvciBhbGwgc2VsZWN0ZWQgY29udGV4dHMgaXMgZGlmZmVyZW50LCB0aGVuIDwgS2VlcCBFeGlzdGluZyBWYWx1ZXMgPiBpcyBwcmVzZWxlY3RlZC5cblx0ICogPT4gSWYgcHJvcGVydHlWYWx1ZSBmb3IgYWxsIHNlbGVjdGVkIGNvbnRleHRzIGlzIHRoZSBzYW1lLCB0aGVuIHRoZSBwcm9wZXJ0eVZhbHVlIGlzIHByZXNlbGVjdGVkLlxuXHQgKiA9PiBJZiBwcm9wZXJ0eVZhbHVlIGZvciBhbGwgc2VsZWN0ZWQgY29udGV4dHMgaXMgZW1wdHksIHRoZW4gPCBMZWF2ZSBCbGFuayA+IGlzIHByZXNlbGVjdGVkLlxuXHQgKlxuXHQgKlxuXHQgKiBAcGFyYW0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHBhcmFtIHNEYXRhUHJvcGVydHlQYXRoIERhdGEgcHJvcGVydHkgcGF0aFxuXHQgKiBAcmV0dXJucyBUaGUga2V5IHBhdGhcblx0ICovXG5cdGdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3g6IGZ1bmN0aW9uIChhQ29udGV4dHM6IGFueVtdLCBzRGF0YVByb3BlcnR5UGF0aDogc3RyaW5nKSB7XG5cdFx0bGV0IHJlc3VsdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRcdGlmIChzRGF0YVByb3BlcnR5UGF0aCAmJiBhQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3Qgb1NlbGVjdGVkQ29udGV4dCA9IGFDb250ZXh0cyxcblx0XHRcdFx0YVByb3BlcnR5VmFsdWVzOiBhbnlbXSA9IFtdO1xuXHRcdFx0b1NlbGVjdGVkQ29udGV4dC5mb3JFYWNoKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdGNvbnN0IG9EYXRhT2JqZWN0ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGNvbnN0IHNNdWx0aUxldmVsUGF0aENvbmRpdGlvbiA9XG5cdFx0XHRcdFx0c0RhdGFQcm9wZXJ0eVBhdGguaW5kZXhPZihcIi9cIikgPiAtMSAmJiBvRGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eShzRGF0YVByb3BlcnR5UGF0aC5zcGxpdChcIi9cIilbMF0pO1xuXHRcdFx0XHRpZiAob0NvbnRleHQgJiYgKG9EYXRhT2JqZWN0Lmhhc093blByb3BlcnR5KHNEYXRhUHJvcGVydHlQYXRoKSB8fCBzTXVsdGlMZXZlbFBhdGhDb25kaXRpb24pKSB7XG5cdFx0XHRcdFx0YVByb3BlcnR5VmFsdWVzLnB1c2gob0NvbnRleHQuZ2V0T2JqZWN0KHNEYXRhUHJvcGVydHlQYXRoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgYVVuaXF1ZVByb3BlcnR5VmFsdWVzID0gYVByb3BlcnR5VmFsdWVzLmZpbHRlcihNYXNzRWRpdEhlbHBlci5nZXRVbmlxdWVWYWx1ZXMpO1xuXHRcdFx0aWYgKGFVbmlxdWVQcm9wZXJ0eVZhbHVlcy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdHJlc3VsdCA9IGBEZWZhdWx0LyR7c0RhdGFQcm9wZXJ0eVBhdGh9YDtcblx0XHRcdH0gZWxzZSBpZiAoYVVuaXF1ZVByb3BlcnR5VmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRyZXN1bHQgPSBgRW1wdHkvJHtzRGF0YVByb3BlcnR5UGF0aH1gO1xuXHRcdFx0fSBlbHNlIGlmIChhVW5pcXVlUHJvcGVydHlWYWx1ZXMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdHJlc3VsdCA9IGAke3NEYXRhUHJvcGVydHlQYXRofS8ke2FVbmlxdWVQcm9wZXJ0eVZhbHVlc1swXX1gO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaGlkZGVuIGFubm90YXRpb24gdmFsdWUgW2JvdGggc3RhdGljIGFuZCBwYXRoIGJhc2VkXSBmb3IgdGFibGUncyBzZWxlY3RlZCBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gaGlkZGVuVmFsdWUgSGlkZGVuIGFubm90YXRpb24gdmFsdWUgLyBwYXRoIGZvciBmaWVsZFxuXHQgKiBAcGFyYW0gYUNvbnRleHRzIENvbnRleHRzIGZvciBtYXNzIGVkaXRcblx0ICogQHJldHVybnMgVGhlIGhpZGRlbiBhbm5vdGF0aW9uIHZhbHVlXG5cdCAqL1xuXHRnZXRIaWRkZW5WYWx1ZUZvckNvbnRleHRzOiBmdW5jdGlvbiAoaGlkZGVuVmFsdWU6IGFueSwgYUNvbnRleHRzOiBhbnlbXSkge1xuXHRcdGlmIChoaWRkZW5WYWx1ZSAmJiBoaWRkZW5WYWx1ZS4kUGF0aCkge1xuXHRcdFx0cmV0dXJuICFhQ29udGV4dHMuc29tZShmdW5jdGlvbiAob1NlbGVjdGVkQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChoaWRkZW5WYWx1ZS4kUGF0aCkgPT09IGZhbHNlO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBoaWRkZW5WYWx1ZTtcblx0fSxcblxuXHRnZXRJbnB1dFR5cGU6IGZ1bmN0aW9uIChwcm9wZXJ0eUluZm86IGFueSwgZGF0YUZpZWxkQ29udmVydGVkOiBhbnksIG9EYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoKTogc3RyaW5nIHtcblx0XHRjb25zdCBlZGl0U3R5bGVQcm9wZXJ0aWVzID0ge30gYXMgRmllbGRQcm9wZXJ0aWVzO1xuXHRcdGxldCBpbnB1dFR5cGUhOiBzdHJpbmc7XG5cdFx0aWYgKHByb3BlcnR5SW5mbykge1xuXHRcdFx0c2V0RWRpdFN0eWxlUHJvcGVydGllcyhlZGl0U3R5bGVQcm9wZXJ0aWVzLCBkYXRhRmllbGRDb252ZXJ0ZWQsIG9EYXRhTW9kZWxQYXRoLCB0cnVlKTtcblx0XHRcdGlucHV0VHlwZSA9IGVkaXRTdHlsZVByb3BlcnRpZXM/LmVkaXRTdHlsZSB8fCBcIlwiO1xuXHRcdH1cblx0XHRjb25zdCBpc1ZhbGlkRm9yTWFzc0VkaXQgPVxuXHRcdFx0aW5wdXRUeXBlICYmXG5cdFx0XHRbXCJEYXRlUGlja2VyXCIsIFwiVGltZVBpY2tlclwiLCBcIkRhdGVUaW1lUGlja2VyXCIsIFwiUmF0aW5nSW5kaWNhdG9yXCJdLmluZGV4T2YoaW5wdXRUeXBlKSA9PT0gLTEgJiZcblx0XHRcdCFpc011bHRpVmFsdWVGaWVsZChvRGF0YU1vZGVsUGF0aCkgJiZcblx0XHRcdCFoYXNWYWx1ZUhlbHBXaXRoRml4ZWRWYWx1ZXMocHJvcGVydHlJbmZvKTtcblxuXHRcdHJldHVybiAoaXNWYWxpZEZvck1hc3NFZGl0IHx8IFwiXCIpICYmIGlucHV0VHlwZTtcblx0fSxcblxuXHRnZXRJc0ZpZWxkR3JwOiBmdW5jdGlvbiAoZGF0YUZpZWxkQ29udmVydGVkOiBhbnkpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0ZGF0YUZpZWxkQ29udmVydGVkICYmXG5cdFx0XHRkYXRhRmllbGRDb252ZXJ0ZWQuJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuRGF0YUZpZWxkRm9yQW5ub3RhdGlvblwiICYmXG5cdFx0XHRkYXRhRmllbGRDb252ZXJ0ZWQuVGFyZ2V0ICYmXG5cdFx0XHRkYXRhRmllbGRDb252ZXJ0ZWQuVGFyZ2V0LnZhbHVlICYmXG5cdFx0XHRkYXRhRmllbGRDb252ZXJ0ZWQuVGFyZ2V0LnZhbHVlLmluZGV4T2YoXCJGaWVsZEdyb3VwXCIpID4gLTFcblx0XHQpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgdGV4dCBwYXRoIGZvciB0aGUgbWFzcyBlZGl0IGZpZWxkLlxuXHQgKlxuXHQgKiBAcGFyYW0gcHJvcGVydHkgUHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0gdGV4dEJpbmRpbmcgVGV4dCBCaW5kaW5nIEluZm9cblx0ICogQHBhcmFtIGRpc3BsYXlNb2RlIERpc3BsYXkgbW9kZVxuXHQgKiBAcmV0dXJucyBUZXh0IFByb3BlcnR5IFBhdGggaWYgaXQgZXhpc3RzXG5cdCAqL1xuXHRnZXRUZXh0UGF0aDogZnVuY3Rpb24gKHByb3BlcnR5OiBzdHJpbmcsIHRleHRCaW5kaW5nOiBhbnksIGRpc3BsYXlNb2RlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGxldCBkZXNjcmlwdGlvblBhdGg7XG5cdFx0aWYgKHRleHRCaW5kaW5nICYmICh0ZXh0QmluZGluZy5wYXRoIHx8ICh0ZXh0QmluZGluZy5wYXJhbWV0ZXJzICYmIHRleHRCaW5kaW5nLnBhcmFtZXRlcnMubGVuZ3RoKSkgJiYgcHJvcGVydHkpIHtcblx0XHRcdGlmICh0ZXh0QmluZGluZy5wYXRoICYmIGRpc3BsYXlNb2RlID09PSBcIkRlc2NyaXB0aW9uXCIpIHtcblx0XHRcdFx0ZGVzY3JpcHRpb25QYXRoID0gdGV4dEJpbmRpbmcucGF0aDtcblx0XHRcdH0gZWxzZSBpZiAodGV4dEJpbmRpbmcucGFyYW1ldGVycykge1xuXHRcdFx0XHR0ZXh0QmluZGluZy5wYXJhbWV0ZXJzLmZvckVhY2goZnVuY3Rpb24gKHByb3BzOiBCaW5kaW5nSW5mbykge1xuXHRcdFx0XHRcdGlmIChwcm9wcy5wYXRoICYmIHByb3BzLnBhdGggIT09IHByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvblBhdGggPSBwcm9wcy5wYXRoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBkZXNjcmlwdGlvblBhdGg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIGEgSlNPTiBNb2RlbCBmb3IgcHJvcGVydGllcyBvZiBkaWFsb2cgZmllbGRzIFtsYWJlbCwgdmlzaWJsaXR5LCBkYXRhcHJvcGVydHksIGV0Yy5dLlxuXHQgKlxuXHQgKiBAcGFyYW0gb1RhYmxlIEluc3RhbmNlIG9mIFRhYmxlXG5cdCAqIEBwYXJhbSBhQ29udGV4dHMgQ29udGV4dHMgZm9yIG1hc3MgZWRpdFxuXHQgKiBAcGFyYW0gYURhdGFBcnJheSBBcnJheSBjb250YWluaW5nIGRhdGEgcmVsYXRlZCB0byB0aGUgZGlhbG9nIHVzZWQgYnkgYm90aCB0aGUgc3RhdGljIGFuZCB0aGUgcnVudGltZSBtb2RlbFxuXHQgKiBAcmV0dXJucyBUaGUgbW9kZWxcblx0ICovXG5cdHByZXBhcmVEYXRhRm9yRGlhbG9nOiBmdW5jdGlvbiAob1RhYmxlOiBUYWJsZSwgYUNvbnRleHRzOiBhbnlbXSwgYURhdGFBcnJheTogYW55W10pIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1RhYmxlICYmIChvVGFibGUuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBhbnkpLFxuXHRcdFx0c0N1cnJlbnRFbnRpdHlTZXROYW1lID0gb1RhYmxlLmRhdGEoXCJtZXRhUGF0aFwiKSxcblx0XHRcdGFUYWJsZUZpZWxkcyA9IE1hc3NFZGl0SGVscGVyLmdldFRhYmxlRmllbGRzKG9UYWJsZSksXG5cdFx0XHRvRW50aXR5VHlwZUNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoYCR7c0N1cnJlbnRFbnRpdHlTZXROYW1lfS9AYCksXG5cdFx0XHRvRW50aXR5U2V0Q29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChzQ3VycmVudEVudGl0eVNldE5hbWUpLFxuXHRcdFx0b0RhdGFNb2RlbE9iamVjdFBhdGggPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMob0VudGl0eVR5cGVDb250ZXh0KTtcblxuXHRcdGNvbnN0IG9EYXRhRmllbGRNb2RlbCA9IG5ldyBKU09OTW9kZWwoKTtcblx0XHRsZXQgb1Jlc3VsdDtcblx0XHRsZXQgc0xhYmVsVGV4dDtcblx0XHRsZXQgYlZhbHVlSGVscEVuYWJsZWQ7XG5cdFx0bGV0IHNVbml0UHJvcGVydHlQYXRoO1xuXHRcdGxldCBiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQ7XG5cdFx0bGV0IG9UZXh0QmluZGluZztcblxuXHRcdGFUYWJsZUZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChvQ29sdW1uSW5mbzogYW55KSB7XG5cdFx0XHRjb25zdCBzRGF0YVByb3BlcnR5UGF0aCA9IG9Db2x1bW5JbmZvLmRhdGFQcm9wZXJ0eTtcblx0XHRcdGlmIChzRGF0YVByb3BlcnR5UGF0aCkge1xuXHRcdFx0XHRsZXQgb1Byb3BlcnR5SW5mbyA9IHNEYXRhUHJvcGVydHlQYXRoICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NDdXJyZW50RW50aXR5U2V0TmFtZX0vJHtzRGF0YVByb3BlcnR5UGF0aH1AYCk7XG5cdFx0XHRcdHNMYWJlbFRleHQgPVxuXHRcdFx0XHRcdG9Db2x1bW5JbmZvLmxhYmVsIHx8IChvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm9bXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkxhYmVsXCJdKSB8fCBzRGF0YVByb3BlcnR5UGF0aDtcblxuXHRcdFx0XHRpZiAob0RhdGFNb2RlbE9iamVjdFBhdGgpIHtcblx0XHRcdFx0XHRvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QgPSBvRGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRFbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMuZmlsdGVyKGZ1bmN0aW9uIChcblx0XHRcdFx0XHRcdG9Qcm9wZXJ0eTogYW55XG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb1Byb3BlcnR5Lm5hbWUgPT09IHNEYXRhUHJvcGVydHlQYXRoO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdCA9IG9EYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdFswXSB8fCB7fTtcblx0XHRcdFx0b1RleHRCaW5kaW5nID0gZ2V0VGV4dEJpbmRpbmcob0RhdGFNb2RlbE9iamVjdFBhdGgsIHt9LCB0cnVlKSB8fCB7fTtcblx0XHRcdFx0Y29uc3Qgb0ZpZWxkQ29udGV4dCA9IG9NZXRhTW9kZWwuZ2V0Q29udGV4dChvQ29sdW1uSW5mby5hbm5vdGF0aW9uUGF0aCksXG5cdFx0XHRcdFx0b0RhdGFGaWVsZENvbnZlcnRlZCA9IGNvbnZlcnRNZXRhTW9kZWxDb250ZXh0KG9GaWVsZENvbnRleHQpLFxuXHRcdFx0XHRcdG9Qcm9wZXJ0eUNvbnRleHQgPSBvTWV0YU1vZGVsLmdldENvbnRleHQoYCR7c0N1cnJlbnRFbnRpdHlTZXROYW1lfS8ke3NEYXRhUHJvcGVydHlQYXRofUBgKSxcblx0XHRcdFx0XHRvSW50ZXJmYWNlID0gb1Byb3BlcnR5Q29udGV4dCAmJiBvUHJvcGVydHlDb250ZXh0LmdldEludGVyZmFjZSgpO1xuXG5cdFx0XHRcdGxldCBvRGF0YU1vZGVsUGF0aCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhvRmllbGRDb250ZXh0LCBvRW50aXR5U2V0Q29udGV4dCk7XG5cdFx0XHRcdGlmIChvRGF0YUZpZWxkQ29udmVydGVkPy5WYWx1ZT8ucGF0aD8ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9EYXRhTW9kZWxQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgob0RhdGFNb2RlbFBhdGgsIHNEYXRhUHJvcGVydHlQYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBiSGlkZGVuRmllbGQgPVxuXHRcdFx0XHRcdE1hc3NFZGl0SGVscGVyLmdldEhpZGRlblZhbHVlRm9yQ29udGV4dHMoXG5cdFx0XHRcdFx0XHRvRmllbGRDb250ZXh0ICYmIG9GaWVsZENvbnRleHQuZ2V0T2JqZWN0KClbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdLFxuXHRcdFx0XHRcdFx0YUNvbnRleHRzXG5cdFx0XHRcdFx0KSB8fCBmYWxzZTtcblx0XHRcdFx0Y29uc3QgaXNJbWFnZSA9IG9Qcm9wZXJ0eUluZm8gJiYgb1Byb3BlcnR5SW5mb1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Jc0ltYWdlVVJMXCJdO1xuXG5cdFx0XHRcdG9JbnRlcmZhY2UuY29udGV4dCA9IHtcblx0XHRcdFx0XHRnZXRNb2RlbDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9JbnRlcmZhY2UuZ2V0TW9kZWwoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdldFBhdGg6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBgJHtzQ3VycmVudEVudGl0eVNldE5hbWV9LyR7c0RhdGFQcm9wZXJ0eVBhdGh9YDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHRcdG9Qcm9wZXJ0eUluZm8gPVxuXHRcdFx0XHRcdG9EYXRhRmllbGRDb252ZXJ0ZWQuX3R5cGUgPT09IFwiUHJvcGVydHlcIlxuXHRcdFx0XHRcdFx0PyBvRGF0YUZpZWxkQ29udmVydGVkXG5cdFx0XHRcdFx0XHQ6IChvRGF0YUZpZWxkQ29udmVydGVkICYmIG9EYXRhRmllbGRDb252ZXJ0ZWQuVmFsdWUgJiYgb0RhdGFGaWVsZENvbnZlcnRlZC5WYWx1ZS4kdGFyZ2V0KSB8fFxuXHRcdFx0XHRcdFx0ICAob0RhdGFGaWVsZENvbnZlcnRlZCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlRhcmdldCAmJiBvRGF0YUZpZWxkQ29udmVydGVkLlRhcmdldC4kdGFyZ2V0KTtcblx0XHRcdFx0Ly8gRGF0YWZpZWxkIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgRmllbGRDb250cm9sIGNhbGN1bGF0aW9uLCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZFxuXG5cdFx0XHRcdGNvbnN0IGNoYXJ0UHJvcGVydHkgPSBvUHJvcGVydHlJbmZvICYmIG9Qcm9wZXJ0eUluZm8udGVybSAmJiBvUHJvcGVydHlJbmZvLnRlcm0gPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnRcIjtcblx0XHRcdFx0Y29uc3QgaXNBY3Rpb24gPSAhIW9EYXRhRmllbGRDb252ZXJ0ZWQuQWN0aW9uO1xuXHRcdFx0XHRjb25zdCBpc0ZpZWxkR3JwID0gTWFzc0VkaXRIZWxwZXIuZ2V0SXNGaWVsZEdycChvRGF0YUZpZWxkQ29udmVydGVkKTtcblx0XHRcdFx0aWYgKGlzSW1hZ2UgfHwgYkhpZGRlbkZpZWxkIHx8IGNoYXJ0UHJvcGVydHkgfHwgaXNBY3Rpb24gfHwgaXNGaWVsZEdycCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFZhbHVlSGVscCBwcm9wZXJ0aWVzXG5cdFx0XHRcdHNVbml0UHJvcGVydHlQYXRoID1cblx0XHRcdFx0XHQoKGhhc0N1cnJlbmN5KG9Qcm9wZXJ0eUluZm8pIHx8IGhhc1VuaXQob1Byb3BlcnR5SW5mbykpICYmIGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoKG9Qcm9wZXJ0eUluZm8pKSB8fCBcIlwiO1xuXHRcdFx0XHRjb25zdCB1bml0UHJvcGVydHlJbmZvID0gc1VuaXRQcm9wZXJ0eVBhdGggJiYgZ2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eShvUHJvcGVydHlJbmZvKTtcblx0XHRcdFx0YlZhbHVlSGVscEVuYWJsZWQgPSBoYXNWYWx1ZUhlbHAob1Byb3BlcnR5SW5mbyk7XG5cdFx0XHRcdGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCA9IHVuaXRQcm9wZXJ0eUluZm8gJiYgaGFzVmFsdWVIZWxwKHVuaXRQcm9wZXJ0eUluZm8pO1xuXG5cdFx0XHRcdGNvbnN0IGhhc0NvbnRleHREZXBlbmRlbnRWSCA9XG5cdFx0XHRcdFx0KGJWYWx1ZUhlbHBFbmFibGVkIHx8IGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCkgJiZcblx0XHRcdFx0XHQob1Byb3BlcnR5SW5mbz8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVmFsdWVMaXN0UmVsZXZhbnRRdWFsaWZpZXJzIHx8XG5cdFx0XHRcdFx0XHQodW5pdFByb3BlcnR5SW5mbyAmJiB1bml0UHJvcGVydHlJbmZvPy5hbm5vdGF0aW9ucz8uQ29tbW9uPy5WYWx1ZUxpc3RSZWxldmFudFF1YWxpZmllcnMpKTtcblx0XHRcdFx0aWYgKGhhc0NvbnRleHREZXBlbmRlbnRWSCkge1xuXHRcdFx0XHRcdC8vIGNvbnRleHQgZGVwZW5kZW50IFZIIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIE1hc3MgRWRpdC5cblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBFZGl0TW9kZSBhbmQgSW5wdXRUeXBlXG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5Rm9yRmllbGRDb250cm9sID0gb1Byb3BlcnR5SW5mbyAmJiBvUHJvcGVydHlJbmZvLlZhbHVlID8gb1Byb3BlcnR5SW5mby5WYWx1ZSA6IG9Qcm9wZXJ0eUluZm87XG5cdFx0XHRcdGNvbnN0IGV4cEJpbmRpbmcgPSBnZXRFZGl0TW9kZShwcm9wZXJ0eUZvckZpZWxkQ29udHJvbCwgb0RhdGFNb2RlbFBhdGgsIGZhbHNlLCBmYWxzZSwgb0RhdGFGaWVsZENvbnZlcnRlZCwgY29uc3RhbnQodHJ1ZSkpO1xuXHRcdFx0XHRjb25zdCBlZGl0TW9kZVZhbHVlcyA9IE9iamVjdC5rZXlzKEVkaXRNb2RlKTtcblx0XHRcdFx0Y29uc3QgZWRpdE1vZGVJc1N0YXRpYyA9ICEhZXhwQmluZGluZyAmJiBlZGl0TW9kZVZhbHVlcy5pbmNsdWRlcyhleHBCaW5kaW5nIGFzIEVkaXRNb2RlKTtcblx0XHRcdFx0Y29uc3QgZWRpdGFibGUgPSAhIWV4cEJpbmRpbmcgJiYgKChlZGl0TW9kZUlzU3RhdGljICYmIGV4cEJpbmRpbmcgPT09IEVkaXRNb2RlLkVkaXRhYmxlKSB8fCAhZWRpdE1vZGVJc1N0YXRpYyk7XG5cdFx0XHRcdGNvbnN0IG5hdlByb3BlcnR5V2l0aFZhbHVlSGVscCA9IHNEYXRhUHJvcGVydHlQYXRoLmluY2x1ZGVzKFwiL1wiKSAmJiBiVmFsdWVIZWxwRW5hYmxlZDtcblx0XHRcdFx0aWYgKCFlZGl0YWJsZSB8fCBuYXZQcm9wZXJ0eVdpdGhWYWx1ZUhlbHApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBpbnB1dFR5cGUgPSBNYXNzRWRpdEhlbHBlci5nZXRJbnB1dFR5cGUob1Byb3BlcnR5SW5mbywgb0RhdGFGaWVsZENvbnZlcnRlZCwgb0RhdGFNb2RlbFBhdGgpO1xuXG5cdFx0XHRcdGlmIChpbnB1dFR5cGUpIHtcblx0XHRcdFx0XHRjb25zdCByZWxhdGl2ZVBhdGggPSBnZXRSZWxhdGl2ZVBhdGhzKG9EYXRhTW9kZWxQYXRoKTtcblx0XHRcdFx0XHRjb25zdCBpc1JlYWRPbmx5ID0gaXNSZWFkT25seUV4cHJlc3Npb24ob1Byb3BlcnR5SW5mbywgcmVsYXRpdmVQYXRoKTtcblx0XHRcdFx0XHRjb25zdCBkaXNwbGF5TW9kZSA9IENvbW1vblV0aWxzLmNvbXB1dGVEaXNwbGF5TW9kZShvUHJvcGVydHlDb250ZXh0LmdldE9iamVjdCgpKTtcblx0XHRcdFx0XHRjb25zdCBpc1ZhbHVlSGVscEVuYWJsZWQgPSBiVmFsdWVIZWxwRW5hYmxlZCA/IGJWYWx1ZUhlbHBFbmFibGVkIDogZmFsc2U7XG5cdFx0XHRcdFx0Y29uc3QgaXNWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCA9XG5cdFx0XHRcdFx0XHRiVmFsdWVIZWxwRW5hYmxlZEZvclVuaXQgJiYgIXNVbml0UHJvcGVydHlQYXRoLmluY2x1ZGVzKFwiL1wiKSA/IGJWYWx1ZUhlbHBFbmFibGVkRm9yVW5pdCA6IGZhbHNlO1xuXHRcdFx0XHRcdGNvbnN0IHVuaXRQcm9wZXJ0eSA9IHNVbml0UHJvcGVydHlQYXRoICYmICFzRGF0YVByb3BlcnR5UGF0aC5pbmNsdWRlcyhcIi9cIikgPyBzVW5pdFByb3BlcnR5UGF0aCA6IGZhbHNlO1xuXG5cdFx0XHRcdFx0b1Jlc3VsdCA9IHtcblx0XHRcdFx0XHRcdGxhYmVsOiBzTGFiZWxUZXh0LFxuXHRcdFx0XHRcdFx0ZGF0YVByb3BlcnR5OiBzRGF0YVByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRcdGlzVmFsdWVIZWxwRW5hYmxlZDogYlZhbHVlSGVscEVuYWJsZWQgPyBiVmFsdWVIZWxwRW5hYmxlZCA6IGZhbHNlLFxuXHRcdFx0XHRcdFx0dW5pdFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0aXNGaWVsZFJlcXVpcmVkOiBnZXRSZXF1aXJlZEV4cHJlc3Npb24ob1Byb3BlcnR5SW5mbywgb0RhdGFGaWVsZENvbnZlcnRlZCwgdHJ1ZSwgZmFsc2UsIHt9LCBvRGF0YU1vZGVsUGF0aCksXG5cdFx0XHRcdFx0XHRkZWZhdWx0U2VsZWN0aW9uUGF0aDogc0RhdGFQcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0PyBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KGFDb250ZXh0cywgc0RhdGFQcm9wZXJ0eVBhdGgpXG5cdFx0XHRcdFx0XHRcdDogZmFsc2UsXG5cdFx0XHRcdFx0XHRkZWZhdWx0U2VsZWN0aW9uVW5pdFBhdGg6IHNVbml0UHJvcGVydHlQYXRoXG5cdFx0XHRcdFx0XHRcdD8gTWFzc0VkaXRIZWxwZXIuZ2V0RGVmYXVsdFNlbGVjdGlvblBhdGhDb21ib0JveChhQ29udGV4dHMsIHNVbml0UHJvcGVydHlQYXRoKVxuXHRcdFx0XHRcdFx0XHQ6IGZhbHNlLFxuXHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBzQ3VycmVudEVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0XHRkaXNwbGF5OiBkaXNwbGF5TW9kZSxcblx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aDogTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dFBhdGgoc0RhdGFQcm9wZXJ0eVBhdGgsIG9UZXh0QmluZGluZywgZGlzcGxheU1vZGUpLFxuXHRcdFx0XHRcdFx0bnVsbGFibGU6IG9Qcm9wZXJ0eUluZm8ubnVsbGFibGUgIT09IHVuZGVmaW5lZCA/IG9Qcm9wZXJ0eUluZm8ubnVsbGFibGUgOiB0cnVlLFxuXHRcdFx0XHRcdFx0aXNQcm9wZXJ0eVJlYWRPbmx5OiBpc1JlYWRPbmx5ICE9PSB1bmRlZmluZWQgPyBpc1JlYWRPbmx5IDogZmFsc2UsXG5cdFx0XHRcdFx0XHRpbnB1dFR5cGU6IGlucHV0VHlwZSxcblx0XHRcdFx0XHRcdGVkaXRNb2RlOiBlZGl0YWJsZSA/IGV4cEJpbmRpbmcgOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eUluZm86IHtcblx0XHRcdFx0XHRcdFx0aGFzVkg6IGlzVmFsdWVIZWxwRW5hYmxlZCxcblx0XHRcdFx0XHRcdFx0cnVudGltZVBhdGg6IFwiZmllbGRzSW5mbz4vdmFsdWVzL1wiLFxuXHRcdFx0XHRcdFx0XHRyZWxhdGl2ZVBhdGg6IHNEYXRhUHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVBhdGhGb3JWYWx1ZUhlbHA6IGAke3NDdXJyZW50RW50aXR5U2V0TmFtZX0vJHtzRGF0YVByb3BlcnR5UGF0aH1gXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0dW5pdEluZm86IHVuaXRQcm9wZXJ0eSAmJiB7XG5cdFx0XHRcdFx0XHRcdGhhc1ZIOiBpc1ZhbHVlSGVscEVuYWJsZWRGb3JVbml0LFxuXHRcdFx0XHRcdFx0XHRydW50aW1lUGF0aDogXCJmaWVsZHNJbmZvPi91bml0RGF0YS9cIixcblx0XHRcdFx0XHRcdFx0cmVsYXRpdmVQYXRoOiB1bml0UHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5UGF0aEZvclZhbHVlSGVscDogYCR7c0N1cnJlbnRFbnRpdHlTZXROYW1lfS8ke3VuaXRQcm9wZXJ0eX1gXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRhRGF0YUFycmF5LnB1c2gob1Jlc3VsdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRvRGF0YUZpZWxkTW9kZWwuc2V0RGF0YShhRGF0YUFycmF5KTtcblx0XHRyZXR1cm4gb0RhdGFGaWVsZE1vZGVsO1xuXHR9LFxuXG5cdGdldFRhYmxlRmllbGRzOiBmdW5jdGlvbiAob1RhYmxlOiBhbnkpIHtcblx0XHRjb25zdCBhQ29sdW1ucyA9IChvVGFibGUgJiYgb1RhYmxlLmdldENvbHVtbnMoKSkgfHwgW107XG5cdFx0Y29uc3QgY29sdW1uc0RhdGEgPSBvVGFibGUgJiYgb1RhYmxlLmdldFBhcmVudCgpLmdldFRhYmxlRGVmaW5pdGlvbigpLmNvbHVtbnM7XG5cdFx0cmV0dXJuIGFDb2x1bW5zLm1hcChmdW5jdGlvbiAob0NvbHVtbjogYW55KSB7XG5cdFx0XHRjb25zdCBzRGF0YVByb3BlcnR5ID0gb0NvbHVtbiAmJiBvQ29sdW1uLmdldERhdGFQcm9wZXJ0eSgpLFxuXHRcdFx0XHRhUmVhbHRlZENvbHVtbkluZm8gPVxuXHRcdFx0XHRcdGNvbHVtbnNEYXRhICYmXG5cdFx0XHRcdFx0Y29sdW1uc0RhdGEuZmlsdGVyKGZ1bmN0aW9uIChvQ29sdW1uSW5mbzogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbHVtbkluZm8ubmFtZSA9PT0gc0RhdGFQcm9wZXJ0eSAmJiBvQ29sdW1uSW5mby50eXBlID09PSBcIkFubm90YXRpb25cIjtcblx0XHRcdFx0XHR9KTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRhdGFQcm9wZXJ0eTogc0RhdGFQcm9wZXJ0eSxcblx0XHRcdFx0bGFiZWw6IG9Db2x1bW4uZ2V0SGVhZGVyKCksXG5cdFx0XHRcdGFubm90YXRpb25QYXRoOiBhUmVhbHRlZENvbHVtbkluZm8gJiYgYVJlYWx0ZWRDb2x1bW5JbmZvWzBdICYmIGFSZWFsdGVkQ29sdW1uSW5mb1swXS5hbm5vdGF0aW9uUGF0aFxuXHRcdFx0fTtcblx0XHR9KTtcblx0fSxcblxuXHRnZXREZWZhdWx0VGV4dHNGb3JEaWFsb2c6IGZ1bmN0aW9uIChvUmVzb3VyY2VCdW5kbGU6IGFueSwgaVNlbGVjdGVkQ29udGV4dHM6IGFueSwgb1RhYmxlOiBhbnkpIHtcblx0XHQvLyBUaGUgY29uZmlybSBidXR0b24gdGV4dCBpcyBcIlNhdmVcIiBmb3IgdGFibGUgaW4gRGlzcGxheSBtb2RlIGFuZCBcIkFwcGx5XCIgZm9yIHRhYmxlIGluIGVkaXQgbW9kZS4gVGhpcyBjYW4gYmUgbGF0ZXIgZXhwb3NlZCBpZiBuZWVkZWQuXG5cdFx0Y29uc3QgYkRpc3BsYXlNb2RlID0gb1RhYmxlLmRhdGEoXCJkaXNwbGF5TW9kZVByb3BlcnR5QmluZGluZ1wiKSA9PT0gXCJ0cnVlXCI7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0a2VlcEV4aXN0aW5nUHJlZml4OiBcIjwgS2VlcFwiLFxuXHRcdFx0bGVhdmVCbGFua1ZhbHVlOiBcIjwgTGVhdmUgQmxhbmsgPlwiLFxuXHRcdFx0Y2xlYXJGaWVsZFZhbHVlOiBcIjwgQ2xlYXIgVmFsdWVzID5cIixcblx0XHRcdG1hc3NFZGl0VGl0bGU6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfRElBTE9HX1RJVExFXCIsIGlTZWxlY3RlZENvbnRleHRzLnRvU3RyaW5nKCkpLFxuXHRcdFx0YXBwbHlCdXR0b25UZXh0OiBiRGlzcGxheU1vZGVcblx0XHRcdFx0PyBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX1NBVkVfQlVUVE9OX1RFWFRcIilcblx0XHRcdFx0OiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX0FQUExZX0JVVFRPTl9URVhUXCIpLFxuXHRcdFx0dXNlVmFsdWVIZWxwVmFsdWU6IFwiPCBVc2UgVmFsdWUgSGVscCA+XCIsXG5cdFx0XHRjYW5jZWxCdXR0b25UZXh0OiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0NBTkNFTFwiKSxcblx0XHRcdG5vRmllbGRzOiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUFTU19FRElUX05PX0VESVRBQkxFX0ZJRUxEU1wiKSxcblx0XHRcdG9rQnV0dG9uVGV4dDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9ESUFMT0dfT0tcIilcblx0XHR9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgc3VmZml4IHRvIHRoZSAna2VlcCBleGlzdGluZycgcHJvcGVydHkgb2YgdGhlIGNvbWJvQm94LlxuXHQgKlxuXHQgKiBAcGFyYW0gc0lucHV0VHlwZSBJbnB1dFR5cGUgb2YgdGhlIGZpZWxkXG5cdCAqIEByZXR1cm5zIFRoZSBtb2RpZmllZCBzdHJpbmdcblx0ICovXG5cdC8vIGdldFN1ZmZpeEZvcktlZXBFeGlzaXRpbmc6IGZ1bmN0aW9uIChzSW5wdXRUeXBlOiBzdHJpbmcpIHtcblx0Ly8gXHRsZXQgc1Jlc3VsdCA9IFwiVmFsdWVzXCI7XG5cblx0Ly8gXHRzd2l0Y2ggKHNJbnB1dFR5cGUpIHtcblx0Ly8gXHRcdC8vVE9ETyAtIEFkZCBmb3Igb3RoZXIgY29udHJvbCB0eXBlcyBhcyB3ZWxsIChSYWRpbyBCdXR0b24sIEVtYWlsLCBJbnB1dCwgTURDIEZpZWxkcywgSW1hZ2UgZXRjLilcblx0Ly8gXHRcdGNhc2UgXCJEYXRlUGlja2VyXCI6XG5cdC8vIFx0XHRcdHNSZXN1bHQgPSBcIkRhdGVzXCI7XG5cdC8vIFx0XHRcdGJyZWFrO1xuXHQvLyBcdFx0Y2FzZSBcIkNoZWNrQm94XCI6XG5cdC8vIFx0XHRcdHNSZXN1bHQgPSBcIlNldHRpbmdzXCI7XG5cdC8vIFx0XHRcdGJyZWFrO1xuXHQvLyBcdFx0ZGVmYXVsdDpcblx0Ly8gXHRcdFx0c1Jlc3VsdCA9IFwiVmFsdWVzXCI7XG5cdC8vIFx0fVxuXHQvLyBcdHJldHVybiBzUmVzdWx0O1xuXHQvLyB9LFxuXG5cdC8qKlxuXHQgKiBBZGRzIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBtb2RlbCBbS2VlcCBFeGlzdGluZyBWYWx1ZXMsIExlYXZlIEJsYW5rXS5cblx0ICpcblx0ICogQHBhcmFtIGFWYWx1ZXMgQXJyYXkgaW5zdGFuY2Ugd2hlcmUgdGhlIGRlZmF1bHQgZGF0YSBuZWVkcyB0byBiZSBhZGRlZFxuXHQgKiBAcGFyYW0gb0RlZmF1bHRWYWx1ZXMgRGVmYXVsdCB2YWx1ZXMgZnJvbSBBcHBsaWNhdGlvbiBNYW5pZmVzdFxuXHQgKiBAcGFyYW0gb1Byb3BlcnR5SW5mbyBQcm9wZXJ0eSBpbmZvcm1hdGlvblxuXHQgKiBAcGFyYW0gYlVPTUZpZWxkXG5cdCAqL1xuXHRzZXREZWZhdWx0VmFsdWVzVG9EaWFsb2c6IGZ1bmN0aW9uIChhVmFsdWVzOiBhbnksIG9EZWZhdWx0VmFsdWVzOiBhbnksIG9Qcm9wZXJ0eUluZm86IGFueSwgYlVPTUZpZWxkPzogYm9vbGVhbikge1xuXHRcdGNvbnN0IHNQcm9wZXJ0eVBhdGggPSBiVU9NRmllbGQgPyBvUHJvcGVydHlJbmZvLnVuaXRQcm9wZXJ0eSA6IG9Qcm9wZXJ0eUluZm8uZGF0YVByb3BlcnR5LFxuXHRcdFx0c0lucHV0VHlwZSA9IG9Qcm9wZXJ0eUluZm8uaW5wdXRUeXBlLFxuXHRcdFx0YlByb3BlcnR5UmVxdWlyZWQgPSBvUHJvcGVydHlJbmZvLmlzRmllbGRSZXF1aXJlZDtcblx0XHQvLyBjb25zdCBzU3VmZml4Rm9yS2VlcEV4aXN0aW5nID0gTWFzc0VkaXRIZWxwZXIuZ2V0U3VmZml4Rm9yS2VlcEV4aXNpdGluZyhzSW5wdXRUeXBlKTtcblx0XHRjb25zdCBzU3VmZml4Rm9yS2VlcEV4aXN0aW5nID0gXCJWYWx1ZXNcIjtcblx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zID0gYVZhbHVlcy5kZWZhdWx0T3B0aW9ucyB8fCBbXTtcblx0XHRjb25zdCBzZWxlY3RPcHRpb25zRXhpc3QgPSBhVmFsdWVzLnNlbGVjdE9wdGlvbnMgJiYgYVZhbHVlcy5zZWxlY3RPcHRpb25zLmxlbmd0aCA+IDA7XG5cdFx0Y29uc3Qga2VlcEVudHJ5ID0ge1xuXHRcdFx0dGV4dDogYCR7b0RlZmF1bHRWYWx1ZXMua2VlcEV4aXN0aW5nUHJlZml4fSAke3NTdWZmaXhGb3JLZWVwRXhpc3Rpbmd9ID5gLFxuXHRcdFx0a2V5OiBgRGVmYXVsdC8ke3NQcm9wZXJ0eVBhdGh9YFxuXHRcdH07XG5cblx0XHRpZiAoc0lucHV0VHlwZSA9PT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRjb25zdCBmYWxzZUVudHJ5ID0geyB0ZXh0OiBcIk5vXCIsIGtleTogYCR7c1Byb3BlcnR5UGF0aH0vZmFsc2VgLCB0ZXh0SW5mbzogeyB2YWx1ZTogZmFsc2UgfSB9O1xuXHRcdFx0Y29uc3QgdHJ1dGh5RW50cnkgPSB7IHRleHQ6IFwiWWVzXCIsIGtleTogYCR7c1Byb3BlcnR5UGF0aH0vdHJ1ZWAsIHRleHRJbmZvOiB7IHZhbHVlOiB0cnVlIH0gfTtcblx0XHRcdGFWYWx1ZXMudW5zaGlmdChmYWxzZUVudHJ5KTtcblx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChmYWxzZUVudHJ5KTtcblx0XHRcdGFWYWx1ZXMudW5zaGlmdCh0cnV0aHlFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQodHJ1dGh5RW50cnkpO1xuXHRcdFx0YVZhbHVlcy51bnNoaWZ0KGtlZXBFbnRyeSk7XG5cdFx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eUluZm8/LnByb3BlcnR5SW5mbz8uaGFzVkggfHwgKG9Qcm9wZXJ0eUluZm8/LnVuaXRJbmZvPy5oYXNWSCAmJiBiVU9NRmllbGQpKSB7XG5cdFx0XHRcdGNvbnN0IHZoZEVudHJ5ID0geyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy51c2VWYWx1ZUhlbHBWYWx1ZSwga2V5OiBgVXNlVmFsdWVIZWxwVmFsdWUvJHtzUHJvcGVydHlQYXRofWAgfTtcblx0XHRcdFx0YVZhbHVlcy51bnNoaWZ0KHZoZEVudHJ5KTtcblx0XHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KHZoZEVudHJ5KTtcblx0XHRcdH1cblx0XHRcdGlmIChzZWxlY3RPcHRpb25zRXhpc3QpIHtcblx0XHRcdFx0aWYgKGJQcm9wZXJ0eVJlcXVpcmVkICE9PSBcInRydWVcIiAmJiAhYlVPTUZpZWxkKSB7XG5cdFx0XHRcdFx0Y29uc3QgY2xlYXJFbnRyeSA9IHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMuY2xlYXJGaWVsZFZhbHVlLCBrZXk6IGBDbGVhckZpZWxkVmFsdWUvJHtzUHJvcGVydHlQYXRofWAgfTtcblx0XHRcdFx0XHRhVmFsdWVzLnVuc2hpZnQoY2xlYXJFbnRyeSk7XG5cdFx0XHRcdFx0YVZhbHVlcy5kZWZhdWx0T3B0aW9ucy51bnNoaWZ0KGNsZWFyRW50cnkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGFWYWx1ZXMudW5zaGlmdChrZWVwRW50cnkpO1xuXHRcdFx0XHRhVmFsdWVzLmRlZmF1bHRPcHRpb25zLnVuc2hpZnQoa2VlcEVudHJ5KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGVtcHR5RW50cnkgPSB7IHRleHQ6IG9EZWZhdWx0VmFsdWVzLmxlYXZlQmxhbmtWYWx1ZSwga2V5OiBgRGVmYXVsdC8ke3NQcm9wZXJ0eVBhdGh9YCB9O1xuXHRcdFx0XHRhVmFsdWVzLnVuc2hpZnQoZW1wdHlFbnRyeSk7XG5cdFx0XHRcdGFWYWx1ZXMuZGVmYXVsdE9wdGlvbnMudW5zaGlmdChlbXB0eUVudHJ5KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0ZXh0IGFycmFuZ2VtZW50IGluZm8gZm9yIGEgY29udGV4dCBwcm9wZXJ0eS5cblx0ICpcblx0ICogQHBhcmFtIHByb3BlcnR5IFByb3BlcnR5IFBhdGhcblx0ICogQHBhcmFtIGRlc2NyaXB0aW9uUGF0aCBQYXRoIHRvIHRleHQgYXNzb2NpYXRpb24gb2YgdGhlIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBkaXNwbGF5TW9kZSBEaXNwbGF5IG1vZGUgb2YgdGhlIHByb3BlcnR5IGFuZCB0ZXh0IGFzc29jaWF0aW9uXG5cdCAqIEBwYXJhbSBzZWxlY3RlZENvbnRleHQgQ29udGV4dCB0byBmaW5kIHRoZSBmdWxsIHRleHRcblx0ICogQHJldHVybnMgVGhlIHRleHQgYXJyYW5nZW1lbnRcblx0ICovXG5cdGdldFRleHRBcnJhbmdlbWVudEluZm86IGZ1bmN0aW9uIChcblx0XHRwcm9wZXJ0eTogc3RyaW5nLFxuXHRcdGRlc2NyaXB0aW9uUGF0aDogc3RyaW5nLFxuXHRcdGRpc3BsYXlNb2RlOiBzdHJpbmcsXG5cdFx0c2VsZWN0ZWRDb250ZXh0OiBDb250ZXh0XG5cdCk6IFRleHRBcnJhbmdlbWVudEluZm8ge1xuXHRcdGxldCB2YWx1ZSA9IHNlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QocHJvcGVydHkpLFxuXHRcdFx0ZGVzY3JpcHRpb25WYWx1ZSxcblx0XHRcdGZ1bGxUZXh0O1xuXHRcdGlmIChkZXNjcmlwdGlvblBhdGggJiYgcHJvcGVydHkpIHtcblx0XHRcdHN3aXRjaCAoZGlzcGxheU1vZGUpIHtcblx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25WYWx1ZSA9IHNlbGVjdGVkQ29udGV4dC5nZXRPYmplY3QoZGVzY3JpcHRpb25QYXRoKSB8fCBcIlwiO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gZGVzY3JpcHRpb25WYWx1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIlZhbHVlXCI6XG5cdFx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KSB8fCBcIlwiO1xuXHRcdFx0XHRcdGZ1bGxUZXh0ID0gdmFsdWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0dmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KHByb3BlcnR5KSB8fCBcIlwiO1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uVmFsdWUgPSBzZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KGRlc2NyaXB0aW9uUGF0aCkgfHwgXCJcIjtcblx0XHRcdFx0XHRmdWxsVGV4dCA9IGRlc2NyaXB0aW9uVmFsdWUgPyBgJHt2YWx1ZX0gKCR7ZGVzY3JpcHRpb25WYWx1ZX0pYCA6IHZhbHVlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlIFwiRGVzY3JpcHRpb25WYWx1ZVwiOlxuXHRcdFx0XHRcdHZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChwcm9wZXJ0eSkgfHwgXCJcIjtcblx0XHRcdFx0XHRkZXNjcmlwdGlvblZhbHVlID0gc2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdChkZXNjcmlwdGlvblBhdGgpIHx8IFwiXCI7XG5cdFx0XHRcdFx0ZnVsbFRleHQgPSBkZXNjcmlwdGlvblZhbHVlID8gYCR7ZGVzY3JpcHRpb25WYWx1ZX0gKCR7dmFsdWV9KWAgOiB2YWx1ZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRMb2cuaW5mbyhgRGlzcGxheSBQcm9wZXJ0eSBub3QgYXBwbGljYWJsZTogJHtwcm9wZXJ0eX1gKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGV4dEFycmFuZ2VtZW50OiBkaXNwbGF5TW9kZSxcblx0XHRcdHZhbHVlUGF0aDogcHJvcGVydHksXG5cdFx0XHRkZXNjcmlwdGlvblBhdGg6IGRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvblZhbHVlLFxuXHRcdFx0ZnVsbFRleHQ6IGZ1bGxUZXh0XG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJuIHRoZSB2aXNpYmlsaXR5IHZhbHV1ZSBmb3IgdGhlIE1hbmFnZWRPYmplY3QgQW55LlxuXHQgKlxuXHQgKiBAcGFyYW0gYW55IFRoZSBNYW5hZ2VkT2JqZWN0IEFueSB0byBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdmlzaWJsZSB2YWx1ZSBvZiB0aGUgYmluZGluZy5cblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBtYXNzIGVkaXQgZmllbGQgaXMgZWRpdGFibGUuXG5cdCAqL1xuXHRpc0VkaXRhYmxlOiBmdW5jdGlvbiAoYW55OiBBbnlUeXBlKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYmluZGluZyA9IGFueS5nZXRCaW5kaW5nKFwiYW55XCIpO1xuXHRcdGNvbnN0IHZhbHVlID0gKGJpbmRpbmcgYXMgYW55KS5nZXRFeHRlcm5hbFZhbHVlKCk7XG5cdFx0cmV0dXJuIHZhbHVlID09PSBFZGl0TW9kZS5FZGl0YWJsZTtcblx0fSxcblxuXHQvKipcblx0ICogQ2FsY3VsYXRlIGFuZCB1cGRhdGUgdGhlIHZpc2liaWxpdHkgb2YgbWFzcyBlZGl0IGZpZWxkIG9uIGNoYW5nZSBvZiB0aGUgTWFuYWdlZE9iamVjdCBBbnkgYmluZGluZy5cblx0ICpcblx0ICogQHBhcmFtIG9EaWFsb2dEYXRhTW9kZWwgTW9kZWwgdG8gYmUgdXNlZCBydW50aW1lLlxuXHQgKiBAcGFyYW0gZGF0YVByb3BlcnR5IEZpZWxkIG5hbWUuXG5cdCAqL1xuXHRvbkNvbnRleHRFZGl0YWJsZUNoYW5nZTogZnVuY3Rpb24gKG9EaWFsb2dEYXRhTW9kZWw6IEpTT05Nb2RlbCwgZGF0YVByb3BlcnR5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBvYmplY3RzRm9yVmlzaWJpbGl0eSA9IG9EaWFsb2dEYXRhTW9kZWwuZ2V0UHJvcGVydHkoYC92YWx1ZXMvJHtkYXRhUHJvcGVydHl9L29iamVjdHNGb3JWaXNpYmlsaXR5YCkgfHwgW107XG5cdFx0Y29uc3QgZWRpdGFibGUgPSBvYmplY3RzRm9yVmlzaWJpbGl0eS5zb21lKE1hc3NFZGl0SGVscGVyLmlzRWRpdGFibGUpO1xuXG5cdFx0aWYgKGVkaXRhYmxlKSB7XG5cdFx0XHRvRGlhbG9nRGF0YU1vZGVsLnNldFByb3BlcnR5KGAvdmFsdWVzLyR7ZGF0YVByb3BlcnR5fS92aXNpYmxlYCwgZWRpdGFibGUpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogVXBkYXRlIE1hbmFnZWQgT2JqZWN0IEFueSBmb3IgdmlzaWJpbGl0eSBvZiB0aGUgbWFzcyBlZGl0IGZpZWxkcy5cblx0ICpcblx0ICogQHBhcmFtIG1PVG9Vc2UgVGhlIE1hbmFnZWRPYmplY3QgQW55IHRvIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlIHZhbHVlIG9mIHRoZSBiaW5kaW5nLlxuXHQgKiBAcGFyYW0gb0RpYWxvZ0RhdGFNb2RlbCBNb2RlbCB0byBiZSB1c2VkIHJ1bnRpbWUuXG5cdCAqIEBwYXJhbSBkYXRhUHJvcGVydHkgRmllbGQgbmFtZS5cblx0ICogQHBhcmFtIHZhbHVlcyBWYWx1ZXMgb2YgdGhlIGZpZWxkLlxuXHQgKi9cblx0dXBkYXRlT25Db250ZXh0Q2hhbmdlOiBmdW5jdGlvbiAobU9Ub1VzZTogQW55VHlwZSwgb0RpYWxvZ0RhdGFNb2RlbDogSlNPTk1vZGVsLCBkYXRhUHJvcGVydHk6IHN0cmluZywgdmFsdWVzOiBhbnkpIHtcblx0XHRjb25zdCBiaW5kaW5nID0gbU9Ub1VzZS5nZXRCaW5kaW5nKFwiYW55XCIpO1xuXG5cdFx0dmFsdWVzLm9iamVjdHNGb3JWaXNpYmlsaXR5ID0gdmFsdWVzLm9iamVjdHNGb3JWaXNpYmlsaXR5IHx8IFtdO1xuXHRcdHZhbHVlcy5vYmplY3RzRm9yVmlzaWJpbGl0eS5wdXNoKG1PVG9Vc2UpO1xuXG5cdFx0YmluZGluZz8uYXR0YWNoQ2hhbmdlKE1hc3NFZGl0SGVscGVyLm9uQ29udGV4dEVkaXRhYmxlQ2hhbmdlLmJpbmQobnVsbCwgb0RpYWxvZ0RhdGFNb2RlbCwgZGF0YVByb3BlcnR5KSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCBib3VuZCBvYmplY3QgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmlsaXR5IG9mIGNvbnRleHRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gZXhwQmluZGluZyBCaW5kaW5nIFN0cmluZyBvYmplY3QuXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgdGhlIGJpbmRpbmcgdmFsdWUuXG5cdCAqIEByZXR1cm5zIFRoZSBNYW5hZ2VkT2JqZWN0IEFueSB0byBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgdmlzaWJsZSB2YWx1ZSBvZiB0aGUgYmluZGluZy5cblx0ICovXG5cdGdldEJvdW5kT2JqZWN0OiBmdW5jdGlvbiAoZXhwQmluZGluZzogQ29tcGlsZWRCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIGNvbnRleHQ6IENvbnRleHQpOiBBbnlUeXBlIHtcblx0XHRjb25zdCBtT1RvVXNlID0gbmV3IEFueSh7IGFueTogZXhwQmluZGluZyB9KTtcblx0XHRjb25zdCBtb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKTtcblx0XHRtT1RvVXNlLnNldE1vZGVsKG1vZGVsKTtcblx0XHRtT1RvVXNlLnNldEJpbmRpbmdDb250ZXh0KGNvbnRleHQpO1xuXG5cdFx0cmV0dXJuIG1PVG9Vc2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEdldCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSBleHBCaW5kaW5nIEJpbmRpbmcgU3RyaW5nIG9iamVjdC5cblx0ICogQHBhcmFtIG9EaWFsb2dEYXRhTW9kZWwgTW9kZWwgdG8gYmUgdXNlZCBydW50aW1lLlxuXHQgKiBAcGFyYW0gZGF0YVByb3BlcnR5IEZpZWxkIG5hbWUuXG5cdCAqIEBwYXJhbSB2YWx1ZXMgVmFsdWVzIG9mIHRoZSBmaWVsZC5cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0aGUgYmluZGluZyB2YWx1ZS5cblx0ICogQHJldHVybnMgUmV0dXJucyB0cnVlIGlmIHRoZSBtYXNzIGVkaXQgZmllbGQgaXMgZWRpdGFibGUuXG5cdCAqL1xuXHRnZXRGaWVsZFZpc2libGl0eTogZnVuY3Rpb24gKFxuXHRcdGV4cEJpbmRpbmc6IENvbXBpbGVkQmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLFxuXHRcdG9EaWFsb2dEYXRhTW9kZWw6IEpTT05Nb2RlbCxcblx0XHRkYXRhUHJvcGVydHk6IHN0cmluZyxcblx0XHR2YWx1ZXM6IGFueSxcblx0XHRjb250ZXh0OiBDb250ZXh0XG5cdCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IG1PVG9Vc2UgPSBNYXNzRWRpdEhlbHBlci5nZXRCb3VuZE9iamVjdChleHBCaW5kaW5nLCBjb250ZXh0KTtcblx0XHRjb25zdCBpc0NvbnRleHRFZGl0YWJsZSA9IE1hc3NFZGl0SGVscGVyLmlzRWRpdGFibGUobU9Ub1VzZSk7XG5cblx0XHRpZiAoIWlzQ29udGV4dEVkaXRhYmxlKSB7XG5cdFx0XHRNYXNzRWRpdEhlbHBlci51cGRhdGVPbkNvbnRleHRDaGFuZ2UobU9Ub1VzZSwgb0RpYWxvZ0RhdGFNb2RlbCwgZGF0YVByb3BlcnR5LCB2YWx1ZXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gaXNDb250ZXh0RWRpdGFibGU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIGEgcnVudGltZSBtb2RlbDpcblx0ICogPT4gVGhlIG1vZGVsIGNvbnNpc3RzIG9mIHZhbHVlcyBzaG93biBpbiB0aGUgY29tYm9Cb3ggb2YgdGhlIGRpYWxvZyAoTGVhdmUgQmxhbmssIEtlZXAgRXhpc3RpbmcgVmFsdWVzLCBvciBhbnkgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBzZWxlY3RlZCBjb250ZXh0LCBldGMuKVxuXHQgKiA9PiBUaGUgbW9kZWwgd2lsbCBjYXB0dXJlIHJ1bnRpbWUgY2hhbmdlcyBpbiB0aGUgcmVzdWx0cyBwcm9wZXJ0eSAodGhlIHZhbHVlIGVudGVyZWQgaW4gdGhlIGNvbWJvQm94KS5cblx0ICpcblx0ICogQHBhcmFtIGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSBhRGF0YUFycmF5IEFycmF5IGNvbnRhaW5pbmcgZGF0YSByZWxhdGVkIHRvIHRoZSBkaWFsb2cgdXNlZCBieSBib3RoIHRoZSBzdGF0aWMgYW5kIHRoZSBydW50aW1lIG1vZGVsXG5cdCAqIEBwYXJhbSBvRGVmYXVsdFZhbHVlcyBEZWZhdWx0IHZhbHVlcyBmcm9tIGkxOG5cblx0ICogQHBhcmFtIGRpYWxvZ0NvbnRleHQgVHJhbnNpZW50IGNvbnRleHQgZm9yIG1hc3MgZWRpdCBkaWFsb2cuXG5cdCAqIEByZXR1cm5zIFRoZSBydW50aW1lIG1vZGVsXG5cdCAqL1xuXHRzZXRSdW50aW1lTW9kZWxPbkRpYWxvZzogZnVuY3Rpb24gKGFDb250ZXh0czogYW55W10sIGFEYXRhQXJyYXk6IGFueVtdLCBvRGVmYXVsdFZhbHVlczogYW55LCBkaWFsb2dDb250ZXh0OiBDb250ZXh0KSB7XG5cdFx0Y29uc3QgYVZhbHVlczogYW55W10gPSBbXTtcblx0XHRjb25zdCBhVW5pdERhdGE6IGFueVtdID0gW107XG5cdFx0Y29uc3QgYVJlc3VsdHM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgdGV4dFBhdGhzOiBhbnlbXSA9IFtdO1xuXHRcdGNvbnN0IGFSZWFkT25seUZpZWxkSW5mbzogYW55W10gPSBbXTtcblxuXHRcdGNvbnN0IG9EYXRhID0ge1xuXHRcdFx0dmFsdWVzOiBhVmFsdWVzLFxuXHRcdFx0dW5pdERhdGE6IGFVbml0RGF0YSxcblx0XHRcdHJlc3VsdHM6IGFSZXN1bHRzLFxuXHRcdFx0cmVhZGFibGVQcm9wZXJ0eURhdGE6IGFSZWFkT25seUZpZWxkSW5mbyxcblx0XHRcdHNlbGVjdGVkS2V5OiB1bmRlZmluZWQsXG5cdFx0XHR0ZXh0UGF0aHM6IHRleHRQYXRocyxcblx0XHRcdG5vRmllbGRzOiBvRGVmYXVsdFZhbHVlcy5ub0ZpZWxkc1xuXHRcdH07XG5cdFx0Y29uc3Qgb0RpYWxvZ0RhdGFNb2RlbCA9IG5ldyBKU09OTW9kZWwob0RhdGEpO1xuXHRcdGFEYXRhQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAob0luRGF0YTogYW55KSB7XG5cdFx0XHRsZXQgb1RleHRJbmZvO1xuXHRcdFx0bGV0IHNQcm9wZXJ0eUtleTtcblx0XHRcdGxldCBzVW5pdFByb3BlcnR5TmFtZTtcblx0XHRcdGNvbnN0IG9EaXN0aW5jdFZhbHVlTWFwOiBhbnkgPSB7fTtcblx0XHRcdGNvbnN0IG9EaXN0aW5jdFVuaXRNYXA6IGFueSA9IHt9O1xuXHRcdFx0aWYgKG9JbkRhdGEuZGF0YVByb3BlcnR5ICYmIG9JbkRhdGEuZGF0YVByb3BlcnR5LmluZGV4T2YoXCIvXCIpID4gLTEpIHtcblx0XHRcdFx0Y29uc3QgYUZpbmFsUGF0aCA9IE1hc3NFZGl0SGVscGVyLmluaXRMYXN0TGV2ZWxPZlByb3BlcnR5UGF0aChvSW5EYXRhLmRhdGFQcm9wZXJ0eSwgYVZhbHVlcyAvKiwgZGlhbG9nQ29udGV4dCAqLyk7XG5cdFx0XHRcdGNvbnN0IGFQcm9wZXJ0eVBhdGhzID0gb0luRGF0YS5kYXRhUHJvcGVydHkuc3BsaXQoXCIvXCIpO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgY29udGV4dCBvZiBhQ29udGV4dHMpIHtcblx0XHRcdFx0XHRjb25zdCBzTXVsdGlMZXZlbFBhdGhWYWx1ZSA9IGNvbnRleHQuZ2V0T2JqZWN0KG9JbkRhdGEuZGF0YVByb3BlcnR5KTtcblx0XHRcdFx0XHRzUHJvcGVydHlLZXkgPSBgJHtvSW5EYXRhLmRhdGFQcm9wZXJ0eX0vJHtzTXVsdGlMZXZlbFBhdGhWYWx1ZX1gO1xuXHRcdFx0XHRcdGlmICghb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSAmJiBhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXSkge1xuXHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0b0luRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdG9JbkRhdGEuZGVzY3JpcHRpb25QYXRoLFxuXHRcdFx0XHRcdFx0XHRvSW5EYXRhLmRpc3BsYXksXG5cdFx0XHRcdFx0XHRcdGNvbnRleHRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRhRmluYWxQYXRoW2FQcm9wZXJ0eVBhdGhzW2FQcm9wZXJ0eVBhdGhzLmxlbmd0aCAtIDFdXS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0dGV4dDogKG9UZXh0SW5mbyAmJiBvVGV4dEluZm8uZnVsbFRleHQpIHx8IHNNdWx0aUxldmVsUGF0aFZhbHVlLFxuXHRcdFx0XHRcdFx0XHRrZXk6IHNQcm9wZXJ0eUtleSxcblx0XHRcdFx0XHRcdFx0dGV4dEluZm86IG9UZXh0SW5mb1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldID0gc011bHRpTGV2ZWxQYXRoVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGlmIChPYmplY3Qua2V5cyhvRGlzdGluY3RWYWx1ZU1hcCkubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdC8vIFx0ZGlhbG9nQ29udGV4dC5zZXRQcm9wZXJ0eShvRGF0YS5kYXRhUHJvcGVydHksIHNQcm9wZXJ0eUtleSAmJiBvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKTtcblx0XHRcdFx0Ly8gfVxuXG5cdFx0XHRcdGFGaW5hbFBhdGhbYVByb3BlcnR5UGF0aHNbYVByb3BlcnR5UGF0aHMubGVuZ3RoIC0gMV1dLnRleHRJbmZvID0ge1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uUGF0aDogb0luRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0dmFsdWVQYXRoOiBvSW5EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRkaXNwbGF5TW9kZTogb0luRGF0YS5kaXNwbGF5XG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XSA9IGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldIHx8IFtdO1xuXHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gPSBhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gfHwgW107XG5cdFx0XHRcdGlmIChvSW5EYXRhLnVuaXRQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0gPSBhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldIHx8IFtdO1xuXHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdID0gYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0gfHwgW107XG5cdFx0XHRcdH1cblx0XHRcdFx0Zm9yIChjb25zdCBjb250ZXh0IG9mIGFDb250ZXh0cykge1xuXHRcdFx0XHRcdGNvbnN0IG9EYXRhT2JqZWN0ID0gY29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRzUHJvcGVydHlLZXkgPSBgJHtvSW5EYXRhLmRhdGFQcm9wZXJ0eX0vJHtvRGF0YU9iamVjdFtvSW5EYXRhLmRhdGFQcm9wZXJ0eV19YDtcblx0XHRcdFx0XHRpZiAob0luRGF0YS5kYXRhUHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0luRGF0YS5kYXRhUHJvcGVydHldICYmICFvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldKSB7XG5cdFx0XHRcdFx0XHRpZiAob0luRGF0YS5pbnB1dFR5cGUgIT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRcdFx0XHRcdG9UZXh0SW5mbyA9IE1hc3NFZGl0SGVscGVyLmdldFRleHRBcnJhbmdlbWVudEluZm8oXG5cdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kYXRhUHJvcGVydHksXG5cdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kaXNwbGF5LFxuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHRcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZW50cnkgPSB7XG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogKG9UZXh0SW5mbyAmJiBvVGV4dEluZm8uZnVsbFRleHQpIHx8IG9EYXRhT2JqZWN0W29JbkRhdGEuZGF0YVByb3BlcnR5XSxcblx0XHRcdFx0XHRcdFx0XHRrZXk6IHNQcm9wZXJ0eUtleSxcblx0XHRcdFx0XHRcdFx0XHR0ZXh0SW5mbzogb1RleHRJbmZvXG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldLnB1c2goZW50cnkpO1xuXHRcdFx0XHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XVtcInNlbGVjdE9wdGlvbnNcIl0ucHVzaChlbnRyeSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvRGlzdGluY3RWYWx1ZU1hcFtzUHJvcGVydHlLZXldID0gb0RhdGFPYmplY3Rbb0luRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAob0luRGF0YS51bml0UHJvcGVydHkgJiYgb0RhdGFPYmplY3Rbb0luRGF0YS51bml0UHJvcGVydHldKSB7XG5cdFx0XHRcdFx0XHRzVW5pdFByb3BlcnR5TmFtZSA9IGAke29JbkRhdGEudW5pdFByb3BlcnR5fS8ke29EYXRhT2JqZWN0W29JbkRhdGEudW5pdFByb3BlcnR5XX1gO1xuXHRcdFx0XHRcdFx0aWYgKCFvRGlzdGluY3RVbml0TWFwW3NVbml0UHJvcGVydHlOYW1lXSkge1xuXHRcdFx0XHRcdFx0XHRpZiAob0luRGF0YS5pbnB1dFR5cGUgIT0gXCJDaGVja0JveFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0b1RleHRJbmZvID0gTWFzc0VkaXRIZWxwZXIuZ2V0VGV4dEFycmFuZ2VtZW50SW5mbyhcblx0XHRcdFx0XHRcdFx0XHRcdG9JbkRhdGEudW5pdFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XHRcdFx0b0luRGF0YS5kZXNjcmlwdGlvblBhdGgsXG5cdFx0XHRcdFx0XHRcdFx0XHRvSW5EYXRhLmRpc3BsYXksXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCB1bml0RW50cnkgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiAob1RleHRJbmZvICYmIG9UZXh0SW5mby5mdWxsVGV4dCkgfHwgb0RhdGFPYmplY3Rbb0luRGF0YS51bml0UHJvcGVydHldLFxuXHRcdFx0XHRcdFx0XHRcdFx0a2V5OiBzVW5pdFByb3BlcnR5TmFtZSxcblx0XHRcdFx0XHRcdFx0XHRcdHRleHRJbmZvOiBvVGV4dEluZm9cblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0ucHVzaCh1bml0RW50cnkpO1xuXHRcdFx0XHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV1bXCJzZWxlY3RPcHRpb25zXCJdLnB1c2godW5pdEVudHJ5KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRvRGlzdGluY3RVbml0TWFwW3NVbml0UHJvcGVydHlOYW1lXSA9IG9EYXRhT2JqZWN0W29JbkRhdGEudW5pdFByb3BlcnR5XTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0udGV4dEluZm8gPSB7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25QYXRoOiBvSW5EYXRhLmRlc2NyaXB0aW9uUGF0aCxcblx0XHRcdFx0XHR2YWx1ZVBhdGg6IG9JbkRhdGEuZGF0YVByb3BlcnR5LFxuXHRcdFx0XHRcdGRpc3BsYXlNb2RlOiBvSW5EYXRhLmRpc3BsYXlcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKG9EaXN0aW5jdFZhbHVlTWFwKS5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRkaWFsb2dDb250ZXh0LnNldFByb3BlcnR5KG9JbkRhdGEuZGF0YVByb3BlcnR5LCBzUHJvcGVydHlLZXkgJiYgb0Rpc3RpbmN0VmFsdWVNYXBbc1Byb3BlcnR5S2V5XSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKG9EaXN0aW5jdFVuaXRNYXApLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdGRpYWxvZ0NvbnRleHQuc2V0UHJvcGVydHkob0luRGF0YS51bml0UHJvcGVydHksIHNVbml0UHJvcGVydHlOYW1lICYmIG9EaXN0aW5jdFVuaXRNYXBbc1VuaXRQcm9wZXJ0eU5hbWVdKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGV4dFBhdGhzW29JbkRhdGEuZGF0YVByb3BlcnR5XSA9IG9JbkRhdGEuZGVzY3JpcHRpb25QYXRoID8gW29JbkRhdGEuZGVzY3JpcHRpb25QYXRoXSA6IFtdO1xuXHRcdH0pO1xuXHRcdGFEYXRhQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAob0luRGF0YTogYW55KSB7XG5cdFx0XHRsZXQgdmFsdWVzOiBhbnkgPSB7fTtcblx0XHRcdGlmIChvSW5EYXRhLmRhdGFQcm9wZXJ0eS5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRcdGNvbnN0IHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSA9IE1hc3NFZGl0SGVscGVyLmdldFZhbHVlRm9yTXVsdGlMZXZlbFBhdGgob0luRGF0YS5kYXRhUHJvcGVydHksIGFWYWx1ZXMpO1xuXHRcdFx0XHRpZiAoIXNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSkge1xuXHRcdFx0XHRcdHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZS5wdXNoKHsgdGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLCBrZXk6IGBFbXB0eS8ke29JbkRhdGEuZGF0YVByb3BlcnR5fWAgfSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuc2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nKHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZSwgb0RlZmF1bHRWYWx1ZXMsIG9JbkRhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhbHVlcyA9IHNNdWx0aUxldmVsUHJvcFBhdGhWYWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAoYVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0pIHtcblx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0gPSBhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XSB8fCBbXTtcblx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuc2V0RGVmYXVsdFZhbHVlc1RvRGlhbG9nKGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldLCBvRGVmYXVsdFZhbHVlcywgb0luRGF0YSk7XG5cdFx0XHRcdHZhbHVlcyA9IGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XSAmJiBhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLmxlbmd0aCkge1xuXHRcdFx0XHRNYXNzRWRpdEhlbHBlci5zZXREZWZhdWx0VmFsdWVzVG9EaWFsb2coYVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XSwgb0RlZmF1bHRWYWx1ZXMsIG9JbkRhdGEsIHRydWUpO1xuXHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLnRleHRJbmZvID0ge307XG5cdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0uc2VsZWN0ZWRLZXkgPSBNYXNzRWRpdEhlbHBlci5nZXREZWZhdWx0U2VsZWN0aW9uUGF0aENvbWJvQm94KFxuXHRcdFx0XHRcdGFDb250ZXh0cyxcblx0XHRcdFx0XHRvSW5EYXRhLnVuaXRQcm9wZXJ0eVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLmlucHV0VHlwZSA9IG9JbkRhdGEuaW5wdXRUeXBlO1xuXHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0KG9JbkRhdGEuZGF0YVByb3BlcnR5ICYmIGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldICYmICFhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XS5sZW5ndGgpIHx8XG5cdFx0XHRcdChvSW5EYXRhLnVuaXRQcm9wZXJ0eSAmJiBhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldICYmICFhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLmxlbmd0aClcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBiQ2xlYXJGaWVsZE9yQmxhbmtWYWx1ZUV4aXN0cyA9XG5cdFx0XHRcdFx0YVZhbHVlc1tvSW5EYXRhLmRhdGFQcm9wZXJ0eV0gJiZcblx0XHRcdFx0XHRhVmFsdWVzW29JbkRhdGEuZGF0YVByb3BlcnR5XS5zb21lKGZ1bmN0aW9uIChvYmo6IGFueSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9iai50ZXh0ID09PSBcIjwgQ2xlYXIgVmFsdWVzID5cIiB8fCBvYmoudGV4dCA9PT0gXCI8IExlYXZlIEJsYW5rID5cIjtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0aWYgKG9JbkRhdGEuZGF0YVByb3BlcnR5ICYmICFiQ2xlYXJGaWVsZE9yQmxhbmtWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdGFWYWx1ZXNbb0luRGF0YS5kYXRhUHJvcGVydHldLnB1c2goeyB0ZXh0OiBvRGVmYXVsdFZhbHVlcy5sZWF2ZUJsYW5rVmFsdWUsIGtleTogYEVtcHR5LyR7b0luRGF0YS5kYXRhUHJvcGVydHl9YCB9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBiQ2xlYXJGaWVsZE9yQmxhbmtVbml0VmFsdWVFeGlzdHMgPVxuXHRcdFx0XHRcdGFVbml0RGF0YVtvSW5EYXRhLnVuaXRQcm9wZXJ0eV0gJiZcblx0XHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLnNvbWUoZnVuY3Rpb24gKG9iajogYW55KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb2JqLnRleHQgPT09IFwiPCBDbGVhciBWYWx1ZXMgPlwiIHx8IG9iai50ZXh0ID09PSBcIjwgTGVhdmUgQmxhbmsgPlwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAob0luRGF0YS51bml0UHJvcGVydHkpIHtcblx0XHRcdFx0XHRpZiAoIWJDbGVhckZpZWxkT3JCbGFua1VuaXRWYWx1ZUV4aXN0cykge1xuXHRcdFx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5wdXNoKHtcblx0XHRcdFx0XHRcdFx0dGV4dDogb0RlZmF1bHRWYWx1ZXMubGVhdmVCbGFua1ZhbHVlLFxuXHRcdFx0XHRcdFx0XHRrZXk6IGBFbXB0eS8ke29JbkRhdGEudW5pdFByb3BlcnR5fWBcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhVW5pdERhdGFbb0luRGF0YS51bml0UHJvcGVydHldLnRleHRJbmZvID0ge307XG5cdFx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5zZWxlY3RlZEtleSA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goXG5cdFx0XHRcdFx0XHRhQ29udGV4dHMsXG5cdFx0XHRcdFx0XHRvSW5EYXRhLnVuaXRQcm9wZXJ0eVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YVVuaXREYXRhW29JbkRhdGEudW5pdFByb3BlcnR5XS5pbnB1dFR5cGUgPSBvSW5EYXRhLmlucHV0VHlwZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9JbkRhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5ICYmIHR5cGVvZiBvSW5EYXRhLmlzUHJvcGVydHlSZWFkT25seSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdFx0YVJlYWRPbmx5RmllbGRJbmZvLnB1c2goeyBwcm9wZXJ0eTogb0luRGF0YS5kYXRhUHJvcGVydHksIHZhbHVlOiBvSW5EYXRhLmlzUHJvcGVydHlSZWFkT25seSwgdHlwZTogXCJEZWZhdWx0XCIgfSk7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRvSW5EYXRhLmlzUHJvcGVydHlSZWFkT25seSAmJlxuXHRcdFx0XHRvSW5EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kcyAmJlxuXHRcdFx0XHRvSW5EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXSAmJlxuXHRcdFx0XHRvSW5EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMSAmJlxuXHRcdFx0XHRvSW5EYXRhLmlzUHJvcGVydHlSZWFkT25seS5vcGVyYW5kc1swXS5vcGVyYW5kMlxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFRoaXMgbmVlZHMgdG8gYmUgcmVmYWN0b3JlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFJlYWRPbmx5RXhwcmVzc2lvbiBjaGFuZ2Vcblx0XHRcdFx0YVJlYWRPbmx5RmllbGRJbmZvLnB1c2goe1xuXHRcdFx0XHRcdHByb3BlcnR5OiBvSW5EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRwcm9wZXJ0eVBhdGg6IG9JbkRhdGEuaXNQcm9wZXJ0eVJlYWRPbmx5Lm9wZXJhbmRzWzBdLm9wZXJhbmQxLnBhdGgsXG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZTogb0luRGF0YS5pc1Byb3BlcnR5UmVhZE9ubHkub3BlcmFuZHNbMF0ub3BlcmFuZDIudmFsdWUsXG5cdFx0XHRcdFx0dHlwZTogXCJQYXRoXCJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldHRpbmcgdmlzYmlsaXR5IG9mIHRoZSBtYXNzIGVkaXQgZmllbGQuXG5cdFx0XHRpZiAob0luRGF0YS5lZGl0TW9kZSkge1xuXHRcdFx0XHR2YWx1ZXMudmlzaWJsZSA9XG5cdFx0XHRcdFx0b0luRGF0YS5lZGl0TW9kZSA9PT0gRWRpdE1vZGUuRWRpdGFibGUgfHxcblx0XHRcdFx0XHRhQ29udGV4dHMuc29tZShcblx0XHRcdFx0XHRcdE1hc3NFZGl0SGVscGVyLmdldEZpZWxkVmlzaWJsaXR5LmJpbmQoXG5cdFx0XHRcdFx0XHRcdE1hc3NFZGl0SGVscGVyLFxuXHRcdFx0XHRcdFx0XHRvSW5EYXRhLmVkaXRNb2RlLFxuXHRcdFx0XHRcdFx0XHRvRGlhbG9nRGF0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRvSW5EYXRhLmRhdGFQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFx0dmFsdWVzXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbHVlcy52aXNpYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHZhbHVlcy5zZWxlY3RlZEtleSA9IE1hc3NFZGl0SGVscGVyLmdldERlZmF1bHRTZWxlY3Rpb25QYXRoQ29tYm9Cb3goYUNvbnRleHRzLCBvSW5EYXRhLmRhdGFQcm9wZXJ0eSk7XG5cdFx0XHR2YWx1ZXMuaW5wdXRUeXBlID0gb0luRGF0YS5pbnB1dFR5cGU7XG5cdFx0XHR2YWx1ZXMudW5pdFByb3BlcnR5ID0gb0luRGF0YS51bml0UHJvcGVydHk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gb0RpYWxvZ0RhdGFNb2RlbDtcblx0fSxcblx0LyoqXG5cdCAqIEdldHMgdHJhbnNpZW50IGNvbnRleHQgZm9yIGRpYWxvZy5cblx0ICpcblx0ICogQHBhcmFtIHRhYmxlIEluc3RhbmNlIG9mIFRhYmxlLlxuXHQgKiBAcGFyYW0gZGlhbG9nIE1hc3MgRWRpdCBEaWFsb2cuXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmV0dXJuaW5nIGluc3RhbmNlIG9mIGRpYWxvZy5cblx0ICovXG5cdGdldERpYWxvZ0NvbnRleHQ6IGZ1bmN0aW9uICh0YWJsZTogVGFibGUsIGRpYWxvZz86IERpYWxvZyk6IENvbnRleHQge1xuXHRcdGxldCB0cmFuc0N0eDogQ29udGV4dCA9IChkaWFsb2cgJiYgZGlhbG9nLmdldEJpbmRpbmdDb250ZXh0KCkpIGFzIENvbnRleHQ7XG5cblx0XHRpZiAoIXRyYW5zQ3R4KSB7XG5cdFx0XHRjb25zdCBtb2RlbCA9IHRhYmxlLmdldE1vZGVsKCk7XG5cdFx0XHRjb25zdCBsaXN0QmluZGluZyA9IHRhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdGNvbnN0IHRyYW5zaWVudExpc3RCaW5kaW5nID0gbW9kZWwuYmluZExpc3QobGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBsaXN0QmluZGluZy5nZXRDb250ZXh0KCksIFtdLCBbXSwge1xuXHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwic3VibWl0TGF0ZXJcIlxuXHRcdFx0fSkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRcdCh0cmFuc2llbnRMaXN0QmluZGluZyBhcyBhbnkpLnJlZnJlc2hJbnRlcm5hbCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0LyogKi9cblx0XHRcdH07XG5cdFx0XHR0cmFuc0N0eCA9IHRyYW5zaWVudExpc3RCaW5kaW5nLmNyZWF0ZSh7fSwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRyYW5zQ3R4O1xuXHR9LFxuXG5cdG9uRGlhbG9nT3BlbjogZnVuY3Rpb24gKGV2ZW50OiBhbnkpOiB2b2lkIHtcblx0XHRjb25zdCBzb3VyY2UgPSBldmVudC5nZXRTb3VyY2UoKTtcblx0XHRjb25zdCBmaWVsZHNJbmZvTW9kZWwgPSBzb3VyY2UuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpO1xuXHRcdGZpZWxkc0luZm9Nb2RlbC5zZXRQcm9wZXJ0eShcIi9pc09wZW5cIiwgdHJ1ZSk7XG5cdH0sXG5cblx0Y2xvc2VEaWFsb2c6IGZ1bmN0aW9uIChvRGlhbG9nOiBhbnkpIHtcblx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdH0sXG5cblx0bWVzc2FnZUhhbmRsaW5nRm9yTWFzc0VkaXQ6IGFzeW5jIGZ1bmN0aW9uIChcblx0XHRvVGFibGU6IFRhYmxlLFxuXHRcdGFDb250ZXh0czogYW55LFxuXHRcdG9Db250cm9sbGVyOiBQYWdlQ29udHJvbGxlcixcblx0XHRvSW5EaWFsb2c6IGFueSxcblx0XHRhUmVzdWx0czogYW55LFxuXHRcdGVycm9yQ29udGV4dHM6IGFueVxuXHQpIHtcblx0XHRjb25zdCBEcmFmdFN0YXR1cyA9IEZFTGlicmFyeS5EcmFmdFN0YXR1cztcblx0XHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdChvQ29udHJvbGxlci5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpPy5zZXRQcm9wZXJ0eShcImdldEJvdW5kTWVzc2FnZXNGb3JNYXNzRWRpdFwiLCB0cnVlKTtcblx0XHRvQ29udHJvbGxlci5fZWRpdEZsb3cuZ2V0TWVzc2FnZUhhbmRsZXIoKS5zaG93TWVzc2FnZXMoe1xuXHRcdFx0b25CZWZvcmVTaG93TWVzc2FnZTogZnVuY3Rpb24gKG1lc3NhZ2VzOiBhbnksIHNob3dNZXNzYWdlUGFyYW1ldGVyczogYW55KSB7XG5cdFx0XHRcdC8vbWVzc2FnZXMuY29uY2F0ZW5hdGUobWVzc2FnZUhhbmRsaW5nLmdldE1lc3NhZ2VzKHRydWUsIHRydWUpKTtcblx0XHRcdFx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzLmZuR2V0TWVzc2FnZVN1YnRpdGxlID0gbWVzc2FnZUhhbmRsaW5nLnNldE1lc3NhZ2VTdWJ0aXRsZS5iaW5kKHt9LCBvVGFibGUsIGFDb250ZXh0cyk7XG5cdFx0XHRcdGNvbnN0IHVuYm91bmRFcnJvcnM6IGFueVtdID0gW107XG5cdFx0XHRcdG1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG1lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdGlmICghbWVzc2FnZS5nZXRUYXJnZXQoKSkge1xuXHRcdFx0XHRcdFx0dW5ib3VuZEVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKGFSZXN1bHRzLmxlbmd0aCA+IDAgJiYgZXJyb3JDb250ZXh0cy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRvQ29udHJvbGxlci5fZWRpdEZsb3cuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHRcdGNvbnN0IHN1Y2Nlc3NUb2FzdCA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NQVNTX0VESVRfU1VDQ0VTU19UT0FTVFwiKTtcblx0XHRcdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhzdWNjZXNzVG9hc3QpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGVycm9yQ29udGV4dHMubGVuZ3RoIDwgKG9UYWJsZSBhcyBhbnkpLmdldFNlbGVjdGVkQ29udGV4dHMoKS5sZW5ndGgpIHtcblx0XHRcdFx0XHRvQ29udHJvbGxlci5fZWRpdEZsb3cuc2V0RHJhZnRTdGF0dXMoRHJhZnRTdGF0dXMuU2F2ZWQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGVycm9yQ29udGV4dHMubGVuZ3RoID09PSAob1RhYmxlIGFzIGFueSkuZ2V0U2VsZWN0ZWRDb250ZXh0cygpLmxlbmd0aCkge1xuXHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0Rmxvdy5zZXREcmFmdFN0YXR1cyhEcmFmdFN0YXR1cy5DbGVhcik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAob0NvbnRyb2xsZXIuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpICYmIHVuYm91bmRFcnJvcnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzLnNob3dNZXNzYWdlQm94ID0gZmFsc2U7XG5cdFx0XHRcdFx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzLnNob3dNZXNzYWdlRGlhbG9nID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNob3dNZXNzYWdlUGFyYW1ldGVycztcblx0XHRcdH1cblx0XHR9KTtcblx0XHRpZiAob0luRGlhbG9nLmlzT3BlbigpKSB7XG5cdFx0XHRNYXNzRWRpdEhlbHBlci5jbG9zZURpYWxvZyhvSW5EaWFsb2cpO1xuXHRcdFx0KG9Db250cm9sbGVyLmdldFZpZXcoKT8uZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dCk/LnNldFByb3BlcnR5KFwic2tpcFBhdGNoSGFuZGxlcnNcIiwgZmFsc2UpO1xuXHRcdH1cblx0XHQob0NvbnRyb2xsZXIuZ2V0VmlldygpPy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KT8uc2V0UHJvcGVydHkoXCJnZXRCb3VuZE1lc3NhZ2VzRm9yTWFzc0VkaXRcIiwgZmFsc2UpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBzaWRlIGVmZmVjdHMgbWFwIGZyb20gc2lkZSBlZmZlY3RzIGlkcyh3aGljaCBpcyBhIGNvbWJpbmF0aW9uIG9mIGVudGl0eSB0eXBlIGFuZCBxdWFsaWZpZXIpLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0VudGl0eVNldENvbnRleHRcblx0ICogQHBhcmFtIGFTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gb0NvbnRyb2xsZXJcblx0ICogQHBhcmFtIGFSZXN1bHRzXG5cdCAqIEByZXR1cm5zIFNpZGUgZWZmZWN0IG1hcCB3aXRoIGRhdGEuXG5cdCAqL1xuXHRnZXRTaWRlRWZmZWN0RGF0YUZvcktleTogZnVuY3Rpb24gKG9FbnRpdHlTZXRDb250ZXh0OiBhbnksIGFTaWRlRWZmZWN0czogYW55LCBvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIsIGFSZXN1bHRzOiBhbnkpIHtcblx0XHRjb25zdCBzT3duZXJFbnRpdHlUeXBlID0gb0VudGl0eVNldENvbnRleHQuZ2V0UHJvcGVydHkoXCIkVHlwZVwiKTtcblx0XHRjb25zdCBiYXNlU2lkZUVmZmVjdHNNYXBBcnJheTogYW55ID0ge307XG5cblx0XHRhUmVzdWx0cy5mb3JFYWNoKChyZXN1bHQ6IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgc1BhdGggPSByZXN1bHQua2V5VmFsdWU7XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0c0FycmF5ID0gRmllbGRIZWxwZXIuZ2V0U2lkZUVmZmVjdHNPbkVudGl0eUFuZFByb3BlcnR5KHNQYXRoLCBzT3duZXJFbnRpdHlUeXBlLCBhU2lkZUVmZmVjdHMpO1xuXHRcdFx0YmFzZVNpZGVFZmZlY3RzTWFwQXJyYXlbc1BhdGhdID0gb0NvbnRyb2xsZXIuX3NpZGVFZmZlY3RzLmdldFNpZGVFZmZlY3RzTWFwRm9yRmllbGRHcm91cHMoc2lkZUVmZmVjdHNBcnJheSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGJhc2VTaWRlRWZmZWN0c01hcEFycmF5O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHaXZlIHRoZSBlbnRpdHkgdHlwZSBmb3IgYSBnaXZlbiBzcGF0aCBmb3IgZS5nLlJlcXVlc3RlZFF1YW50aXR5LlxuXHQgKlxuXHQgKiBAcGFyYW0gc1BhdGhcblx0ICogQHBhcmFtIHNFbnRpdHlUeXBlXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsXG5cdCAqIEByZXR1cm5zIE9iamVjdCBoYXZpbmcgZW50aXR5LCBzcGF0aCBhbmQgbmF2aWdhdGlvbiBwYXRoLlxuXHQgKi9cblx0Zm5HZXRQYXRoRm9yU291cmNlUHJvcGVydHk6IGZ1bmN0aW9uIChzUGF0aDogYW55LCBzRW50aXR5VHlwZTogYW55LCBvTWV0YU1vZGVsOiBhbnkpIHtcblx0XHQvLyBpZiB0aGUgcHJvcGVydHkgcGF0aCBoYXMgYSBuYXZpZ2F0aW9uLCBnZXQgdGhlIHRhcmdldCBlbnRpdHkgdHlwZSBvZiB0aGUgbmF2aWdhdGlvblxuXHRcdGNvbnN0IHNOYXZpZ2F0aW9uUGF0aCA9XG5cdFx0XHRcdHNQYXRoLmluZGV4T2YoXCIvXCIpID4gMCA/IFwiL1wiICsgc0VudGl0eVR5cGUgKyBcIi9cIiArIHNQYXRoLnN1YnN0cigwLCBzUGF0aC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKSArIFwiQHNhcHVpLm5hbWVcIiA6IGZhbHNlLFxuXHRcdFx0cE93bmVyRW50aXR5ID0gIXNOYXZpZ2F0aW9uUGF0aCA/IFByb21pc2UucmVzb2x2ZShzRW50aXR5VHlwZSkgOiBvTWV0YU1vZGVsLnJlcXVlc3RPYmplY3Qoc05hdmlnYXRpb25QYXRoKTtcblx0XHRzUGF0aCA9IHNOYXZpZ2F0aW9uUGF0aCA/IHNQYXRoLnN1YnN0cihzUGF0aC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKSA6IHNQYXRoO1xuXHRcdHJldHVybiB7IHNQYXRoLCBwT3duZXJFbnRpdHksIHNOYXZpZ2F0aW9uUGF0aCB9O1xuXHR9LFxuXG5cdGZuR2V0RW50aXR5VHlwZU9mT3duZXI6IGZ1bmN0aW9uIChvTWV0YU1vZGVsOiBhbnksIGJhc2VOYXZQYXRoOiBzdHJpbmcsIG9FbnRpdHlTZXRDb250ZXh0OiBhbnksIHRhcmdldEVudGl0eTogc3RyaW5nLCBhVGFyZ2V0czogYW55KSB7XG5cdFx0Y29uc3Qgb3duZXJFbnRpdHlUeXBlID0gb0VudGl0eVNldENvbnRleHQuZ2V0UHJvcGVydHkoXCIkVHlwZVwiKTtcblx0XHRjb25zdCB7ICRUeXBlOiBwT3duZXIsICRQYXJ0bmVyOiBvd25lck5hdlBhdGggfSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke29FbnRpdHlTZXRDb250ZXh0fS8ke2Jhc2VOYXZQYXRofWApOyAvLyBuYXYgcGF0aFxuXHRcdGlmIChvd25lck5hdlBhdGgpIHtcblx0XHRcdGNvbnN0IGVudGl0eU9iak9mT3duZXJQYXJ0bmVyID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke3BPd25lcn0vJHtvd25lck5hdlBhdGh9YCk7XG5cdFx0XHRpZiAoZW50aXR5T2JqT2ZPd25lclBhcnRuZXIpIHtcblx0XHRcdFx0Y29uc3QgZW50aXR5VHlwZU9mT3duZXJQYXJ0bmVyID0gZW50aXR5T2JqT2ZPd25lclBhcnRuZXJbXCIkVHlwZVwiXTtcblx0XHRcdFx0Ly8gaWYgdGhlIGVudGl0eSB0eXBlcyBkZWZlciwgdGhlbiBiYXNlIG5hdiBwYXRoIGlzIG5vdCBmcm9tIG93bmVyXG5cdFx0XHRcdGlmIChlbnRpdHlUeXBlT2ZPd25lclBhcnRuZXIgIT09IG93bmVyRW50aXR5VHlwZSkge1xuXHRcdFx0XHRcdC8vIGlmIHRhcmdldCBQcm9wIGlzIG5vdCBmcm9tIG93bmVyLCB3ZSBhZGQgaXQgYXMgaW1tZWRpYXRlXG5cdFx0XHRcdFx0YVRhcmdldHMucHVzaCh0YXJnZXRFbnRpdHkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGlmIHRoZXJlIGlzIG5vICRQYXJ0bmVyIGF0dHJpYnV0ZSwgaXQgbWF5IG5vdCBiZSBmcm9tIG93bmVyXG5cdFx0XHRhVGFyZ2V0cy5wdXNoKHRhcmdldEVudGl0eSk7XG5cdFx0fVxuXHRcdHJldHVybiBhVGFyZ2V0cztcblx0fSxcblxuXHQvKipcblx0ICogR2l2ZSB0YXJnZXRzIHRoYXQgYXJlIGltbWVkaWF0ZSBvciBkZWZlcnJlZCBiYXNlZCBvbiB0aGUgZW50aXR5IHR5cGUgb2YgdGhhdCB0YXJnZXQuXG5cdCAqXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c0RhdGFcblx0ICogQHBhcmFtIG9FbnRpdHlTZXRDb250ZXh0XG5cdCAqIEBwYXJhbSBzRW50aXR5VHlwZVxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbFxuXHQgKiBAcmV0dXJucyBUYXJnZXRzIHRvIHJlcXVlc3Qgc2lkZSBlZmZlY3RzLlxuXHQgKi9cblx0Zm5HZXRUYXJnZXRzRm9yTWFzc0VkaXQ6IGZ1bmN0aW9uIChzaWRlRWZmZWN0c0RhdGE6IGFueSwgb0VudGl0eVNldENvbnRleHQ6IGFueSwgc0VudGl0eVR5cGU6IGFueSwgb01ldGFNb2RlbDogYW55KSB7XG5cdFx0Y29uc3QgeyBUYXJnZXRQcm9wZXJ0aWVzOiBhVGFyZ2V0UHJvcGVydGllcywgVGFyZ2V0RW50aXRpZXM6IGFUYXJnZXRFbnRpdGllcyB9ID0gc2lkZUVmZmVjdHNEYXRhO1xuXHRcdGNvbnN0IGFQcm9taXNlczogYW55ID0gW107XG5cdFx0bGV0IGFUYXJnZXRzOiBhbnkgPSBbXTtcblx0XHRjb25zdCBvd25lckVudGl0eVR5cGUgPSBvRW50aXR5U2V0Q29udGV4dC5nZXRQcm9wZXJ0eShcIiRUeXBlXCIpO1xuXG5cdFx0aWYgKHNFbnRpdHlUeXBlID09PSBvd25lckVudGl0eVR5cGUpIHtcblx0XHRcdC8vIGlmIFNhbGVzT3JkciBJdGVtXG5cdFx0XHRhVGFyZ2V0RW50aXRpZXM/LmZvckVhY2goKHRhcmdldEVudGl0eTogYW55KSA9PiB7XG5cdFx0XHRcdHRhcmdldEVudGl0eSA9IHRhcmdldEVudGl0eVtcIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoXCJdO1xuXHRcdFx0XHRsZXQgYmFzZU5hdlBhdGg6IHN0cmluZztcblx0XHRcdFx0aWYgKHRhcmdldEVudGl0eS5pbmNsdWRlcyhcIi9cIikpIHtcblx0XHRcdFx0XHRiYXNlTmF2UGF0aCA9IHRhcmdldEVudGl0eS5zcGxpdChcIi9cIilbMF07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YmFzZU5hdlBhdGggPSB0YXJnZXRFbnRpdHk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YVRhcmdldHMgPSBNYXNzRWRpdEhlbHBlci5mbkdldEVudGl0eVR5cGVPZk93bmVyKG9NZXRhTW9kZWwsIGJhc2VOYXZQYXRoLCBvRW50aXR5U2V0Q29udGV4dCwgdGFyZ2V0RW50aXR5LCBhVGFyZ2V0cyk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoYVRhcmdldFByb3BlcnRpZXMubGVuZ3RoKSB7XG5cdFx0XHRhVGFyZ2V0UHJvcGVydGllcy5mb3JFYWNoKCh0YXJnZXRQcm9wOiBhbnkpID0+IHtcblx0XHRcdFx0Y29uc3QgeyBwT3duZXJFbnRpdHkgfSA9IE1hc3NFZGl0SGVscGVyLmZuR2V0UGF0aEZvclNvdXJjZVByb3BlcnR5KHRhcmdldFByb3AsIHNFbnRpdHlUeXBlLCBvTWV0YU1vZGVsKTtcblx0XHRcdFx0YVByb21pc2VzLnB1c2goXG5cdFx0XHRcdFx0cE93bmVyRW50aXR5LnRoZW4oKHJlc3VsdEVudGl0eTogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHQvLyBpZiBlbnRpdHkgaXMgU2FsZXNPcmRlckl0ZW0sIFRhcmdldCBQcm9wZXJ0eSBpcyBmcm9tIEl0ZW1zIHRhYmxlXG5cdFx0XHRcdFx0XHRpZiAocmVzdWx0RW50aXR5ID09PSBvd25lckVudGl0eVR5cGUpIHtcblx0XHRcdFx0XHRcdFx0YVRhcmdldHMucHVzaCh0YXJnZXRQcm9wKTsgLy8gZ2V0IGltbWVkaWF0ZSB0YXJnZXRzXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHRhcmdldFByb3AuaW5jbHVkZXMoXCIvXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJhc2VOYXZQYXRoID0gdGFyZ2V0UHJvcC5zcGxpdChcIi9cIilbMF07XG5cdFx0XHRcdFx0XHRcdGFUYXJnZXRzID0gTWFzc0VkaXRIZWxwZXIuZm5HZXRFbnRpdHlUeXBlT2ZPd25lcihcblx0XHRcdFx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdGJhc2VOYXZQYXRoLFxuXHRcdFx0XHRcdFx0XHRcdG9FbnRpdHlTZXRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRcdHRhcmdldFByb3AsXG5cdFx0XHRcdFx0XHRcdFx0YVRhcmdldHNcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoYVRhcmdldHMpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YVByb21pc2VzLnB1c2goUHJvbWlzZS5yZXNvbHZlKGFUYXJnZXRzKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKGFQcm9taXNlcyk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGluIHRoZSBnaXZlbiBzaWRlIEVmZmVjdHMgT2JqLCBpZiBfSXRlbSBpcyBzZXQgYXMgVGFyZ2V0IEVudGl0eSBmb3IgYW55IHNpZGUgRWZmZWN0cyBvblxuXHQgKiBvdGhlciBlbnRpdHkgc2V0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNNYXBcblx0ICogQHBhcmFtIG9FbnRpdHlTZXRDb250ZXh0XG5cdCAqIEByZXR1cm5zIExlbmd0aCBvZiBzaWRlRWZmZWN0c0FycmF5IHdoZXJlIGN1cnJlbnQgRW50aXR5IGlzIHNldCBhcyBUYXJnZXQgRW50aXR5XG5cdCAqL1xuXHRjaGVja0lmRW50aXR5RXhpc3RzQXNUYXJnZXRFbnRpdHk6IChcblx0XHRzaWRlRWZmZWN0c01hcDogTWFzc0VkaXRGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5IHwgRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSxcblx0XHRvRW50aXR5U2V0Q29udGV4dDogQ29udGV4dFxuXHQpID0+IHtcblx0XHRjb25zdCBvd25lckVudGl0eVR5cGUgPSBvRW50aXR5U2V0Q29udGV4dC5nZXRQcm9wZXJ0eShcIiRUeXBlXCIpO1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzT25PdGhlckVudGl0eTogTWFzc0VkaXRGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSA9IE9iamVjdC52YWx1ZXMoc2lkZUVmZmVjdHNNYXApLmZpbHRlcihcblx0XHRcdChvYmo6IE1hc3NFZGl0RmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBvYmoubmFtZS5pbmRleE9mKG93bmVyRW50aXR5VHlwZSkgPT0gLTE7XG5cdFx0XHR9XG5cdFx0KTtcblxuXHRcdGNvbnN0IGVudGl0eVNldE5hbWUgPSBvRW50aXR5U2V0Q29udGV4dC5nZXRQYXRoKCkuc3BsaXQoXCIvXCIpLnBvcCgpO1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzV2l0aEN1cnJlbnRFbnRpdHlBc1RhcmdldCA9IHNpZGVFZmZlY3RzT25PdGhlckVudGl0eS5maWx0ZXIoKG9iajogTWFzc0VkaXRGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUpID0+IHtcblx0XHRcdGNvbnN0IHRhcmdldEVudGl0aWVzQXJyYXk6IFNpZGVFZmZlY3RzVGFyZ2V0RW50aXR5VHlwZVtdIHwgdW5kZWZpbmVkID0gb2JqLnNpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzO1xuXHRcdFx0cmV0dXJuIHRhcmdldEVudGl0aWVzQXJyYXk/LmZpbHRlcihcblx0XHRcdFx0KGlubmVyT2JqOiBTaWRlRWZmZWN0c1RhcmdldEVudGl0eVR5cGUpID0+IGlubmVyT2JqW1wiJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhcIl0gPT09IGVudGl0eVNldE5hbWVcblx0XHRcdCkubGVuZ3RoXG5cdFx0XHRcdD8gb2JqXG5cdFx0XHRcdDogZmFsc2U7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHNpZGVFZmZlY3RzV2l0aEN1cnJlbnRFbnRpdHlBc1RhcmdldC5sZW5ndGg7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwb24gdXBkYXRpbmcgdGhlIGZpZWxkLCBhcnJheSBvZiBpbW1lZGlhdGUgYW5kIGRlZmVycmVkIHNpZGUgZWZmZWN0cyBmb3IgdGhhdCBmaWVsZCBhcmUgY3JlYXRlZC5cblx0ICogSWYgdGhlcmUgYXJlIGFueSBmYWlsZWQgc2lkZSBlZmZlY3RzIGZvciB0aGF0IGNvbnRleHQsIHRoZXkgd2lsbCBhbHNvIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIG1hcC5cblx0ICogSWYgdGhlIGZpZWxkIGhhcyB0ZXh0IGFzc29jaWF0ZWQgd2l0aCBpdCwgdGhlbiBhZGQgaXQgdG8gcmVxdWVzdCBzaWRlIGVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBtUGFyYW1zXG5cdCAqIEBwYXJhbSBtUGFyYW1zLm9Db250cm9sbGVyIENvbnRyb2xsZXJcblx0ICogQHBhcmFtIG1QYXJhbXMub0ZpZWxkUHJvbWlzZSBQcm9taXNlIHRvIHVwZGF0ZSBmaWVsZFxuXHQgKiBAcGFyYW0gbVBhcmFtcy5zaWRlRWZmZWN0TWFwIFNpZGVFZmZlY3RzTWFwIGZvciB0aGUgZmllbGRcblx0ICogQHBhcmFtIG1QYXJhbXMudGV4dFBhdGhzIFRleHRQYXRocyBvZiB0aGUgZmllbGQgaWYgYW55XG5cdCAqIEBwYXJhbSBtUGFyYW1zLmdyb3VwSWQgR3JvdXAgSWQgdG8gdXNlZCB0byBncm91cCByZXF1ZXN0c1xuXHQgKiBAcGFyYW0gbVBhcmFtcy5rZXkgS2V5VmFsdWUgb2YgdGhlIGZpZWxkXG5cdCAqIEBwYXJhbSBtUGFyYW1zLm9FbnRpdHlTZXRDb250ZXh0IEVudGl0eVNldGNvbnRleHRcblx0ICogQHBhcmFtIG1QYXJhbXMub01ldGFNb2RlbCBNZXRhbW9kZWwgZGF0YVxuXHQgKiBAcGFyYW0gbVBhcmFtcy5zZWxlY3RlZENvbnRleHQgU2VsZWN0ZWQgcm93IGNvbnRleHRcblx0ICogQHBhcmFtIG1QYXJhbXMuZGVmZXJyZWRUYXJnZXRzRm9yQVF1YWxpZmllZE5hbWUgRGVmZXJyZWQgdGFyZ2V0cyBkYXRhXG5cdCAqIEByZXR1cm5zIFByb21pc2UgZm9yIGFsbCBpbW1lZGlhdGVseSByZXF1ZXN0ZWQgc2lkZSBlZmZlY3RzLlxuXHQgKi9cblx0aGFuZGxlTWFzc0VkaXRGaWVsZFVwZGF0ZUFuZFJlcXVlc3RTaWRlRWZmZWN0czogYXN5bmMgZnVuY3Rpb24gKG1QYXJhbXM6IERhdGFUb1VwZGF0ZUZpZWxkQW5kU2lkZUVmZmVjdHNUeXBlKSB7XG5cdFx0Y29uc3Qge1xuXHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRvRmllbGRQcm9taXNlLFxuXHRcdFx0c2lkZUVmZmVjdHNNYXAsXG5cdFx0XHR0ZXh0UGF0aHMsXG5cdFx0XHRncm91cElkLFxuXHRcdFx0a2V5LFxuXHRcdFx0b0VudGl0eVNldENvbnRleHQsXG5cdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0b1NlbGVjdGVkQ29udGV4dCxcblx0XHRcdGRlZmVycmVkVGFyZ2V0c0ZvckFRdWFsaWZpZWROYW1lXG5cdFx0fSA9IG1QYXJhbXM7XG5cdFx0Y29uc3QgaW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9taXNlcyA9IFtvRmllbGRQcm9taXNlXTtcblx0XHRjb25zdCBvd25lckVudGl0eVR5cGUgPSBvRW50aXR5U2V0Q29udGV4dC5nZXRQcm9wZXJ0eShcIiRUeXBlXCIpO1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob0NvbnRyb2xsZXIuZ2V0VmlldygpKTtcblx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblxuXHRcdGNvbnN0IGlzU2lkZUVmZmVjdHNXaXRoQ3VycmVudEVudGl0eUFzVGFyZ2V0ID0gTWFzc0VkaXRIZWxwZXIuY2hlY2tJZkVudGl0eUV4aXN0c0FzVGFyZ2V0RW50aXR5KHNpZGVFZmZlY3RzTWFwLCBvRW50aXR5U2V0Q29udGV4dCk7XG5cblx0XHRpZiAoc2lkZUVmZmVjdHNNYXApIHtcblx0XHRcdGNvbnN0IGFsbEVudGl0eVR5cGVzV2l0aFF1YWxpZmllciA9IE9iamVjdC5rZXlzKHNpZGVFZmZlY3RzTWFwKTtcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzRGF0YUZvckZpZWxkOiBhbnkgPSBPYmplY3QudmFsdWVzKHNpZGVFZmZlY3RzTWFwKTtcblxuXHRcdFx0Y29uc3QgbVZpc2l0ZWRTaWRlRWZmZWN0czogYW55ID0ge307XG5cdFx0XHRkZWZlcnJlZFRhcmdldHNGb3JBUXVhbGlmaWVkTmFtZVtrZXldID0ge307XG5cdFx0XHRmb3IgKGNvbnN0IFtpbmRleCwgZGF0YV0gb2Ygc2lkZUVmZmVjdHNEYXRhRm9yRmllbGQuZW50cmllcygpKSB7XG5cdFx0XHRcdGNvbnN0IGVudGl0eVR5cGVXaXRoUXVhbGlmaWVyID0gYWxsRW50aXR5VHlwZXNXaXRoUXVhbGlmaWVyW2luZGV4XTtcblx0XHRcdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSBlbnRpdHlUeXBlV2l0aFF1YWxpZmllci5zcGxpdChcIiNcIilbMF07XG5cdFx0XHRcdGNvbnN0IG9Db250ZXh0OiBhbnkgPSBvQ29udHJvbGxlci5fc2lkZUVmZmVjdHMuZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzKG9TZWxlY3RlZENvbnRleHQsIHNFbnRpdHlUeXBlKTtcblx0XHRcdFx0ZGF0YS5jb250ZXh0ID0gb0NvbnRleHQ7XG5cblx0XHRcdFx0Y29uc3QgYWxsRmFpbGVkU2lkZUVmZmVjdHMgPSBvQ29udHJvbGxlci5fc2lkZUVmZmVjdHMuZ2V0UmVnaXN0ZXJlZEZhaWxlZFJlcXVlc3RzKCk7XG5cdFx0XHRcdGNvbnN0IGFGYWlsZWRTaWRlRWZmZWN0cyA9IGFsbEZhaWxlZFNpZGVFZmZlY3RzW29Db250ZXh0LmdldFBhdGgoKV07XG5cdFx0XHRcdG9Db250cm9sbGVyLl9zaWRlRWZmZWN0cy51bnJlZ2lzdGVyRmFpbGVkU2lkZUVmZmVjdHNGb3JBQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRcdGxldCBzaWRlRWZmZWN0c0ZvckN1cnJlbnRDb250ZXh0ID0gW2RhdGEuc2lkZUVmZmVjdHNdO1xuXHRcdFx0XHRzaWRlRWZmZWN0c0ZvckN1cnJlbnRDb250ZXh0ID1cblx0XHRcdFx0XHRhRmFpbGVkU2lkZUVmZmVjdHMgJiYgYUZhaWxlZFNpZGVFZmZlY3RzLmxlbmd0aFxuXHRcdFx0XHRcdFx0PyBzaWRlRWZmZWN0c0ZvckN1cnJlbnRDb250ZXh0LmNvbmNhdChhRmFpbGVkU2lkZUVmZmVjdHMpXG5cdFx0XHRcdFx0XHQ6IHNpZGVFZmZlY3RzRm9yQ3VycmVudENvbnRleHQ7XG5cdFx0XHRcdG1WaXNpdGVkU2lkZUVmZmVjdHNbb0NvbnRleHRdID0ge307XG5cdFx0XHRcdGZvciAoY29uc3QgYVNpZGVFZmZlY3Qgb2Ygc2lkZUVmZmVjdHNGb3JDdXJyZW50Q29udGV4dCkge1xuXHRcdFx0XHRcdGlmICghbVZpc2l0ZWRTaWRlRWZmZWN0c1tvQ29udGV4dF0uaGFzT3duUHJvcGVydHkoYVNpZGVFZmZlY3QuZnVsbHlRdWFsaWZpZWROYW1lKSkge1xuXHRcdFx0XHRcdFx0bVZpc2l0ZWRTaWRlRWZmZWN0c1tvQ29udGV4dF1bYVNpZGVFZmZlY3QuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRydWU7XG5cdFx0XHRcdFx0XHRsZXQgYUltbWVkaWF0ZVRhcmdldHM6IGFueVtdID0gW10sXG5cdFx0XHRcdFx0XHRcdGFsbFRhcmdldHM6IGFueVtdID0gW10sXG5cdFx0XHRcdFx0XHRcdHRyaWdnZXJBY3Rpb25OYW1lOiBTdHJpbmcgfCB1bmRlZmluZWQ7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGZuR2V0SW1tZWRpYXRlVGFyZ2V0c0FuZEFjdGlvbnMgPSBhc3luYyBmdW5jdGlvbiAobVNpZGVFZmZlY3Q6IFNpZGVFZmZlY3RzVHlwZSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB7IFRhcmdldFByb3BlcnRpZXM6IGFUYXJnZXRQcm9wZXJ0aWVzLCBUYXJnZXRFbnRpdGllczogYVRhcmdldEVudGl0aWVzIH0gPSBtU2lkZUVmZmVjdDtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc2lkZUVmZmVjdEVudGl0eVR5cGUgPSBtU2lkZUVmZmVjdC5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoXCJAXCIpWzBdO1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0YXJnZXRzQXJyYXlGb3JBbGxQcm9wZXJ0aWVzID0gYXdhaXQgTWFzc0VkaXRIZWxwZXIuZm5HZXRUYXJnZXRzRm9yTWFzc0VkaXQoXG5cdFx0XHRcdFx0XHRcdFx0bVNpZGVFZmZlY3QsXG5cdFx0XHRcdFx0XHRcdFx0b0VudGl0eVNldENvbnRleHQsXG5cdFx0XHRcdFx0XHRcdFx0c2lkZUVmZmVjdEVudGl0eVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0b01ldGFNb2RlbFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRhSW1tZWRpYXRlVGFyZ2V0cyA9IHRhcmdldHNBcnJheUZvckFsbFByb3BlcnRpZXNbMF07XG5cdFx0XHRcdFx0XHRcdGFsbFRhcmdldHMgPSAoYVRhcmdldFByb3BlcnRpZXMgfHwgW10pLmNvbmNhdCgoYVRhcmdldEVudGl0aWVzIGFzIGFueVtdKSB8fCBbXSk7XG5cblx0XHRcdFx0XHRcdFx0Y29uc3QgYWN0aW9uTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gKG1TaWRlRWZmZWN0IGFzIE9EYXRhU2lkZUVmZmVjdHNUeXBlKS5UcmlnZ2VyQWN0aW9uO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhRGVmZXJyZWRUYXJnZXRzID0gYWxsVGFyZ2V0cy5maWx0ZXIoKHRhcmdldDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuICFhSW1tZWRpYXRlVGFyZ2V0cy5pbmNsdWRlcyh0YXJnZXQpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHRkZWZlcnJlZFRhcmdldHNGb3JBUXVhbGlmaWVkTmFtZVtrZXldW21TaWRlRWZmZWN0LmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRcdFx0YVRhcmdldHM6IGFEZWZlcnJlZFRhcmdldHMsXG5cdFx0XHRcdFx0XHRcdFx0b0NvbnRleHQ6IG9Db250ZXh0LFxuXHRcdFx0XHRcdFx0XHRcdG1TaWRlRWZmZWN0XG5cdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdFx0Ly8gaWYgZW50aXR5IGlzIG90aGVyIHRoYW4gaXRlbXMgdGFibGUgdGhlbiBhY3Rpb24gaXMgZGVmZXJlZFxuXHRcdFx0XHRcdFx0XHRpZiAoYWN0aW9uTmFtZSAmJiBzaWRlRWZmZWN0RW50aXR5VHlwZSA9PT0gb3duZXJFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gc3RhdGljIGFjdGlvbiBpcyBvbiBjb2xsZWN0aW9uLCBzbyB3ZSBkZWZlciBpdCwgZWxzZSBhZGQgdG8gaW1tZWRpYXRlIHJlcXVlc3RzIGFycmF5XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgaXNTdGF0aWNBY3Rpb24gPSBUYWJsZUhlbHBlci5faXNTdGF0aWNBY3Rpb24ob01ldGFNb2RlbC5nZXRPYmplY3QoYC8ke2FjdGlvbk5hbWV9YCksIGFjdGlvbk5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdGlmICghaXNTdGF0aWNBY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRyaWdnZXJBY3Rpb25OYW1lID0gYWN0aW9uTmFtZTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWRUYXJnZXRzRm9yQVF1YWxpZmllZE5hbWVba2V5XVttU2lkZUVmZmVjdC5mdWxseVF1YWxpZmllZE5hbWVdW1wiVHJpZ2dlckFjdGlvblwiXSA9IGFjdGlvbk5hbWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGRlZmVycmVkVGFyZ2V0c0ZvckFRdWFsaWZpZWROYW1lW2tleV1bbVNpZGVFZmZlY3QuZnVsbHlRdWFsaWZpZWROYW1lXVtcIlRyaWdnZXJBY3Rpb25cIl0gPSBhY3Rpb25OYW1lO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKGlzU2lkZUVmZmVjdHNXaXRoQ3VycmVudEVudGl0eUFzVGFyZ2V0KSB7XG5cdFx0XHRcdFx0XHRcdFx0YUltbWVkaWF0ZVRhcmdldHMgPSBbXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdGFUYXJnZXRzOiBhSW1tZWRpYXRlVGFyZ2V0cyxcblx0XHRcdFx0XHRcdFx0XHRUcmlnZ2VyQWN0aW9uOiB0cmlnZ2VyQWN0aW9uTmFtZVxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdGltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvbWlzZXMucHVzaChcblx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX3NpZGVFZmZlY3RzLnJlcXVlc3RTaWRlRWZmZWN0cyhhU2lkZUVmZmVjdCwgb0NvbnRleHQsIGdyb3VwSWQsIGZuR2V0SW1tZWRpYXRlVGFyZ2V0c0FuZEFjdGlvbnMpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAodGV4dFBhdGhzPy5ba2V5XSAmJiB0ZXh0UGF0aHNba2V5XS5sZW5ndGgpIHtcblx0XHRcdGltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvbWlzZXMucHVzaChvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyh0ZXh0UGF0aHNba2V5XSwgb1NlbGVjdGVkQ29udGV4dCwgZ3JvdXBJZCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gKFByb21pc2UgYXMgYW55KS5hbGxTZXR0bGVkKGltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvbWlzZXMpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIG1hc3MgZWRpdCBkaWFsb2cuXG5cdCAqXG5cdCAqIEBwYXJhbSBvVGFibGUgSW5zdGFuY2Ugb2YgVGFibGVcblx0ICogQHBhcmFtIGFDb250ZXh0cyBDb250ZXh0cyBmb3IgbWFzcyBlZGl0XG5cdCAqIEBwYXJhbSBvQ29udHJvbGxlciBDb250cm9sbGVyIGZvciB0aGUgdmlld1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJldHVybmluZyBpbnN0YW5jZSBvZiBkaWFsb2cuXG5cdCAqL1xuXHRjcmVhdGVEaWFsb2c6IGFzeW5jIGZ1bmN0aW9uIChvVGFibGU6IFRhYmxlLCBhQ29udGV4dHM6IGFueVtdLCBvQ29udHJvbGxlcjogUGFnZUNvbnRyb2xsZXIpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IHNGcmFnbWVudE5hbWUgPSBcInNhcC9mZS9jb3JlL2NvbnRyb2xzL21hc3NFZGl0L01hc3NFZGl0RGlhbG9nXCIsXG5cdFx0XHRhRGF0YUFycmF5OiBhbnlbXSA9IFtdLFxuXHRcdFx0b1Jlc291cmNlQnVuZGxlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSxcblx0XHRcdG9EZWZhdWx0VmFsdWVzID0gTWFzc0VkaXRIZWxwZXIuZ2V0RGVmYXVsdFRleHRzRm9yRGlhbG9nKG9SZXNvdXJjZUJ1bmRsZSwgYUNvbnRleHRzLmxlbmd0aCwgb1RhYmxlKSxcblx0XHRcdG9EYXRhRmllbGRNb2RlbCA9IE1hc3NFZGl0SGVscGVyLnByZXBhcmVEYXRhRm9yRGlhbG9nKG9UYWJsZSwgYUNvbnRleHRzLCBhRGF0YUFycmF5KSxcblx0XHRcdGRpYWxvZ0NvbnRleHQgPSBNYXNzRWRpdEhlbHBlci5nZXREaWFsb2dDb250ZXh0KG9UYWJsZSksXG5cdFx0XHRvRGlhbG9nRGF0YU1vZGVsID0gTWFzc0VkaXRIZWxwZXIuc2V0UnVudGltZU1vZGVsT25EaWFsb2coYUNvbnRleHRzLCBhRGF0YUFycmF5LCBvRGVmYXVsdFZhbHVlcywgZGlhbG9nQ29udGV4dCksXG5cdFx0XHRtb2RlbCA9IG9UYWJsZS5nZXRNb2RlbCgpLFxuXHRcdFx0bWV0YU1vZGVsID0gbW9kZWwuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwsXG5cdFx0XHRpdGVtc01vZGVsID0gbmV3IFRlbXBsYXRlTW9kZWwob0RhdGFGaWVsZE1vZGVsLmdldERhdGEoKSwgbWV0YU1vZGVsKTtcblxuXHRcdGNvbnN0IG9GcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpO1xuXG5cdFx0Y29uc3Qgb0NyZWF0ZWRGcmFnbWVudCA9IGF3YWl0IFByb21pc2UucmVzb2x2ZShcblx0XHRcdFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRvRnJhZ21lbnQsXG5cdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRkYXRhRmllbGRNb2RlbDogaXRlbXNNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIiksXG5cdFx0XHRcdFx0XHRtZXRhTW9kZWw6IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIiksXG5cdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KG1ldGFNb2RlbC5nZXRNZXRhUGF0aChkaWFsb2dDb250ZXh0LmdldFBhdGgoKSkpXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdGRhdGFGaWVsZE1vZGVsOiBpdGVtc01vZGVsLFxuXHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBtZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogbWV0YU1vZGVsXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHQpXG5cdFx0KTtcblx0XHRjb25zdCBvRGlhbG9nQ29udGVudCA9IGF3YWl0IEZyYWdtZW50LmxvYWQoeyBkZWZpbml0aW9uOiBvQ3JlYXRlZEZyYWdtZW50IH0pO1xuXHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdHJlc2l6YWJsZTogdHJ1ZSxcblx0XHRcdHRpdGxlOiBvRGVmYXVsdFZhbHVlcy5tYXNzRWRpdFRpdGxlLFxuXHRcdFx0Y29udGVudDogW29EaWFsb2dDb250ZW50IGFzIGFueV0sXG5cdFx0XHRhZnRlck9wZW46IE1hc3NFZGl0SGVscGVyLm9uRGlhbG9nT3Blbixcblx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0dGV4dDogTWFzc0VkaXRIZWxwZXIuaGVscGVycy5nZXRFeHBCaW5kaW5nRm9yQXBwbHlCdXR0b25UeHQob0RlZmF1bHRWYWx1ZXMsIG9EYXRhRmllbGRNb2RlbC5nZXRPYmplY3QoXCIvXCIpKSxcblx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdHByZXNzOiBhc3luYyBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdChvQ29udHJvbGxlci5nZXRWaWV3KCk/LmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpPy5zZXRQcm9wZXJ0eShcInNraXBQYXRjaEhhbmRsZXJzXCIsIHRydWUpO1xuXHRcdFx0XHRcdGNvbnN0IG9JbkRpYWxvZyA9IG9FdmVudC5nZXRTb3VyY2UoKS5nZXRQYXJlbnQoKTtcblx0XHRcdFx0XHRjb25zdCBvTW9kZWwgPSBvSW5EaWFsb2cuZ2V0TW9kZWwoXCJmaWVsZHNJbmZvXCIpO1xuXHRcdFx0XHRcdGNvbnN0IGFSZXN1bHRzID0gb01vZGVsLmdldFByb3BlcnR5KFwiL3Jlc3VsdHNcIik7XG5cblx0XHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1RhYmxlICYmIChvVGFibGUuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSBhcyBhbnkpLFxuXHRcdFx0XHRcdFx0c0N1cnJlbnRFbnRpdHlTZXROYW1lID0gb1RhYmxlLmRhdGEoXCJtZXRhUGF0aFwiKSxcblx0XHRcdFx0XHRcdG9FbnRpdHlTZXRDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRDb250ZXh0KHNDdXJyZW50RW50aXR5U2V0TmFtZSk7XG5cdFx0XHRcdFx0Y29uc3QgYVNpZGVFZmZlY3RzID0gYXdhaXQgU2lkZUVmZmVjdHNIZWxwZXIuZ2VuZXJhdGVTaWRlRWZmZWN0c01hcEZyb21NZXRhTW9kZWwob01ldGFNb2RlbCk7XG5cdFx0XHRcdFx0Y29uc3QgZXJyb3JDb250ZXh0czogYW55W10gPSBbXTtcblx0XHRcdFx0XHRjb25zdCB0ZXh0UGF0aHMgPSBvTW9kZWwuZ2V0UHJvcGVydHkoXCIvdGV4dFBhdGhzXCIpO1xuXHRcdFx0XHRcdGNvbnN0IGFQcm9wZXJ0eVJlYWRhYmxlSW5mbyA9IG9Nb2RlbC5nZXRQcm9wZXJ0eShcIi9yZWFkYWJsZVByb3BlcnR5RGF0YVwiKTtcblx0XHRcdFx0XHRsZXQgZ3JvdXBJZDogc3RyaW5nO1xuXHRcdFx0XHRcdGxldCBhbGxTaWRlRWZmZWN0czogYW55W107XG5cdFx0XHRcdFx0Y29uc3QgbWFzc0VkaXRQcm9taXNlczogYW55ID0gW107XG5cdFx0XHRcdFx0Y29uc3QgZmFpbGVkRmllbGRzRGF0YTogYW55ID0ge307XG5cdFx0XHRcdFx0Y29uc3Qgc2VsZWN0ZWRSb3dzTGVuZ3RoID0gYUNvbnRleHRzLmxlbmd0aDtcblx0XHRcdFx0XHRjb25zdCBkZWZlcnJlZFRhcmdldHNGb3JBUXVhbGlmaWVkTmFtZTogYW55ID0ge307XG5cdFx0XHRcdFx0Y29uc3QgYmFzZVNpZGVFZmZlY3RzTWFwQXJyYXkgPSBNYXNzRWRpdEhlbHBlci5nZXRTaWRlRWZmZWN0RGF0YUZvcktleShcblx0XHRcdFx0XHRcdG9FbnRpdHlTZXRDb250ZXh0LFxuXHRcdFx0XHRcdFx0YVNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRhUmVzdWx0c1xuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Ly9jb25zdCBjaGFuZ2VQcm9taXNlOiBhbnlbXSA9IFtdO1xuXHRcdFx0XHRcdC8vbGV0IGJSZWFkT25seUZpZWxkID0gZmFsc2U7XG5cdFx0XHRcdFx0Ly9jb25zdCBlcnJvckNvbnRleHRzOiBvYmplY3RbXSA9IFtdO1xuXG5cdFx0XHRcdFx0YUNvbnRleHRzLmZvckVhY2goZnVuY3Rpb24gKG9TZWxlY3RlZENvbnRleHQ6IGFueSwgaWR4OiBudW1iZXIpIHtcblx0XHRcdFx0XHRcdGFsbFNpZGVFZmZlY3RzID0gW107XG5cdFx0XHRcdFx0XHRhUmVzdWx0cy5mb3JFYWNoKGFzeW5jIGZ1bmN0aW9uIChvUmVzdWx0OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKCFmYWlsZWRGaWVsZHNEYXRhLmhhc093blByb3BlcnR5KG9SZXN1bHQua2V5VmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRcdFx0ZmFpbGVkRmllbGRzRGF0YVtvUmVzdWx0LmtleVZhbHVlXSA9IDA7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Ly9UT0RPIC0gQWRkIHNhdmUgaW1wbGVtZW50YXRpb24gZm9yIFZhbHVlIEhlbHAuXG5cdFx0XHRcdFx0XHRcdGlmIChiYXNlU2lkZUVmZmVjdHNNYXBBcnJheVtvUmVzdWx0LmtleVZhbHVlXSkge1xuXHRcdFx0XHRcdFx0XHRcdGFsbFNpZGVFZmZlY3RzW29SZXN1bHQua2V5VmFsdWVdID0gYmFzZVNpZGVFZmZlY3RzTWFwQXJyYXlbb1Jlc3VsdC5rZXlWYWx1ZV07XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoYVByb3BlcnR5UmVhZGFibGVJbmZvKSB7XG5cdFx0XHRcdFx0XHRcdFx0YVByb3BlcnR5UmVhZGFibGVJbmZvLnNvbWUoZnVuY3Rpb24gKG9Qcm9wZXJ0eUluZm86IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9SZXN1bHQua2V5VmFsdWUgPT09IG9Qcm9wZXJ0eUluZm8ucHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eUluZm8udHlwZSA9PT0gXCJEZWZhdWx0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1Byb3BlcnR5SW5mby52YWx1ZSA9PT0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUHJvcGVydHlJbmZvLnR5cGUgPT09IFwiUGF0aFwiICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mby5wcm9wZXJ0eVZhbHVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Byb3BlcnR5SW5mby5wcm9wZXJ0eVBhdGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9TZWxlY3RlZENvbnRleHQuZ2V0T2JqZWN0KG9Qcm9wZXJ0eUluZm8ucHJvcGVydHlQYXRoKSA9PT0gb1Byb3BlcnR5SW5mby5wcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Z3JvdXBJZCA9IGAkYXV0by4ke2lkeH1gO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvRmllbGRQcm9taXNlID0gb1NlbGVjdGVkQ29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdC5zZXRQcm9wZXJ0eShvUmVzdWx0LmtleVZhbHVlLCBvUmVzdWx0LnZhbHVlLCBncm91cElkKVxuXHRcdFx0XHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGVycm9yQ29udGV4dHMucHVzaChvU2VsZWN0ZWRDb250ZXh0LmdldE9iamVjdCgpKTtcblx0XHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIk1hc3MgRWRpdDogU29tZXRoaW5nIHdlbnQgd3JvbmcgaW4gdXBkYXRpbmcgZW50cmllcy5cIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0XHRcdGZhaWxlZEZpZWxkc0RhdGFbb1Jlc3VsdC5rZXlWYWx1ZV0gPSBmYWlsZWRGaWVsZHNEYXRhW29SZXN1bHQua2V5VmFsdWVdICsgMTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdCh7IGlzRmllbGRVcGRhdGVGYWlsZWQ6IHRydWUgfSk7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0Y29uc3QgZGF0YVRvVXBkYXRlRmllbGRBbmRTaWRlRWZmZWN0czogRGF0YVRvVXBkYXRlRmllbGRBbmRTaWRlRWZmZWN0c1R5cGUgPSB7XG5cdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIsXG5cdFx0XHRcdFx0XHRcdFx0b0ZpZWxkUHJvbWlzZSxcblx0XHRcdFx0XHRcdFx0XHRzaWRlRWZmZWN0c01hcDogYmFzZVNpZGVFZmZlY3RzTWFwQXJyYXlbb1Jlc3VsdC5rZXlWYWx1ZV0sXG5cdFx0XHRcdFx0XHRcdFx0dGV4dFBhdGhzLFxuXHRcdFx0XHRcdFx0XHRcdGdyb3VwSWQsXG5cdFx0XHRcdFx0XHRcdFx0a2V5OiBvUmVzdWx0LmtleVZhbHVlLFxuXHRcdFx0XHRcdFx0XHRcdG9FbnRpdHlTZXRDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHRcdG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFx0b1NlbGVjdGVkQ29udGV4dCxcblx0XHRcdFx0XHRcdFx0XHRkZWZlcnJlZFRhcmdldHNGb3JBUXVhbGlmaWVkTmFtZVxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRtYXNzRWRpdFByb21pc2VzLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuaGFuZGxlTWFzc0VkaXRGaWVsZFVwZGF0ZUFuZFJlcXVlc3RTaWRlRWZmZWN0cyhkYXRhVG9VcGRhdGVGaWVsZEFuZFNpZGVFZmZlY3RzKVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRhd2FpdCAoUHJvbWlzZSBhcyBhbnkpXG5cdFx0XHRcdFx0XHQuYWxsU2V0dGxlZChtYXNzRWRpdFByb21pc2VzKVxuXHRcdFx0XHRcdFx0LnRoZW4oYXN5bmMgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRncm91cElkID0gYCRhdXRvLm1hc3NFZGl0RGVmZXJyZWRgO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBkZWZlcnJlZFJlcXVlc3RzID0gW107XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzRGF0YUZvckFsbEtleXM6IGFueSA9IE9iamVjdC52YWx1ZXMoZGVmZXJyZWRUYXJnZXRzRm9yQVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBrZXlzV2l0aFNpZGVFZmZlY3RzOiBhbnlbXSA9IE9iamVjdC5rZXlzKGRlZmVycmVkVGFyZ2V0c0ZvckFRdWFsaWZpZWROYW1lKTtcblxuXHRcdFx0XHRcdFx0XHRzaWRlRWZmZWN0c0RhdGFGb3JBbGxLZXlzLmZvckVhY2goKGFTaWRlRWZmZWN0OiBhbnksIGluZGV4OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjdXJyZW50S2V5ID0ga2V5c1dpdGhTaWRlRWZmZWN0c1tpbmRleF07XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGZhaWxlZEZpZWxkc0RhdGFbY3VycmVudEtleV0gIT09IHNlbGVjdGVkUm93c0xlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZGVmZXJyZWRTaWRlRWZmZWN0c0RhdGEgPSBPYmplY3QudmFsdWVzKGFTaWRlRWZmZWN0KTtcblx0XHRcdFx0XHRcdFx0XHRcdGRlZmVycmVkU2lkZUVmZmVjdHNEYXRhLmZvckVhY2goKHJlcTogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHsgYVRhcmdldHMsIG9Db250ZXh0LCBUcmlnZ2VyQWN0aW9uLCBtU2lkZUVmZmVjdCB9ID0gcmVxO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBmbkdldERlZmVycmVkVGFyZ2V0cyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gYVRhcmdldHM7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGZuR2V0RGVmZXJyZWRUYXJnZXRzQW5kQWN0aW9ucyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YVRhcmdldHM6IGZuR2V0RGVmZXJyZWRUYXJnZXRzKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRUcmlnZ2VyQWN0aW9uOiBUcmlnZ2VyQWN0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZlcnJlZFJlcXVlc3RzLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaWYgc29tZSBkZWZlcnJlZCBpcyByZWplY3RlZCwgaXQgd2lsbCBiZSBhZGQgdG8gZmFpbGVkIHF1ZXVlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRyb2xsZXIuX3NpZGVFZmZlY3RzLnJlcXVlc3RTaWRlRWZmZWN0cyhcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1TaWRlRWZmZWN0LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRncm91cElkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm5HZXREZWZlcnJlZFRhcmdldHNBbmRBY3Rpb25zXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdE1hc3NFZGl0SGVscGVyLm1lc3NhZ2VIYW5kbGluZ0Zvck1hc3NFZGl0KG9UYWJsZSwgYUNvbnRleHRzLCBvQ29udHJvbGxlciwgb0luRGlhbG9nLCBhUmVzdWx0cywgZXJyb3JDb250ZXh0cyk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0LmNhdGNoKChlOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuY2xvc2VEaWFsb2cob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdHRleHQ6IG9EZWZhdWx0VmFsdWVzLmNhbmNlbEJ1dHRvblRleHQsXG5cdFx0XHRcdHZpc2libGU6IE1hc3NFZGl0SGVscGVyLmhlbHBlcnMuaGFzRWRpdGFibGVGaWVsZHNCaW5kaW5nKG9EYXRhRmllbGRNb2RlbC5nZXRPYmplY3QoXCIvXCIpLCB0cnVlKSBhcyBhbnksXG5cdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdFx0XHRjb25zdCBvSW5EaWFsb2cgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0UGFyZW50KCk7XG5cdFx0XHRcdFx0TWFzc0VkaXRIZWxwZXIuY2xvc2VEaWFsb2cob0luRGlhbG9nKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHR9KTtcblx0XHRvRGlhbG9nLnNldE1vZGVsKG9EaWFsb2dEYXRhTW9kZWwsIFwiZmllbGRzSW5mb1wiKTtcblx0XHRvRGlhbG9nLnNldE1vZGVsKG1vZGVsKTtcblx0XHRvRGlhbG9nLnNldEJpbmRpbmdDb250ZXh0KGRpYWxvZ0NvbnRleHQpO1xuXHRcdHJldHVybiBvRGlhbG9nO1xuXHR9LFxuXG5cdGhlbHBlcnM6IHtcblx0XHRnZXRCaW5kaW5nRXhwRm9ySGFzRWRpdGFibGVGaWVsZHM6IChmaWVsZHM6IGFueSwgZWRpdGFibGU6IGJvb2xlYW4pID0+IHtcblx0XHRcdGNvbnN0IHRvdGFsRXhwID0gZmllbGRzLnJlZHVjZShcblx0XHRcdFx0KGV4cHJlc3Npb246IGFueSwgZmllbGQ6IGFueSkgPT5cblx0XHRcdFx0XHRvcihcblx0XHRcdFx0XHRcdGV4cHJlc3Npb24sXG5cdFx0XHRcdFx0XHRwYXRoSW5Nb2RlbChcIi92YWx1ZXMvXCIgKyBmaWVsZC5kYXRhUHJvcGVydHkgKyBcIi92aXNpYmxlXCIsIFwiZmllbGRzSW5mb1wiKSBhcyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb248Ym9vbGVhbj5cblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRjb25zdGFudChmYWxzZSlcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gZWRpdGFibGUgPyB0b3RhbEV4cCA6IG5vdCh0b3RhbEV4cCk7XG5cdFx0fSxcblxuXHRcdGdldEV4cEJpbmRpbmdGb3JBcHBseUJ1dHRvblR4dDogKGRlZmF1bHRWYWx1ZXM6IGFueSwgZmllbGRzOiBib29sZWFuKSA9PiB7XG5cdFx0XHRjb25zdCBlZGl0YWJsZUV4cCA9IE1hc3NFZGl0SGVscGVyLmhlbHBlcnMuZ2V0QmluZGluZ0V4cEZvckhhc0VkaXRhYmxlRmllbGRzKGZpZWxkcywgdHJ1ZSk7XG5cdFx0XHRjb25zdCB0b3RhbEV4cCA9IGlmRWxzZShlZGl0YWJsZUV4cCwgY29uc3RhbnQoZGVmYXVsdFZhbHVlcy5hcHBseUJ1dHRvblRleHQpLCBjb25zdGFudChkZWZhdWx0VmFsdWVzLm9rQnV0dG9uVGV4dCkpO1xuXHRcdFx0cmV0dXJuIGNvbXBpbGVFeHByZXNzaW9uKHRvdGFsRXhwKTtcblx0XHR9LFxuXG5cdFx0aGFzRWRpdGFibGVGaWVsZHNCaW5kaW5nOiAoZmllbGRzOiBhbnksIGVkaXRhYmxlOiBib29sZWFuKSA9PiB7XG5cdFx0XHRyZXR1cm4gY29tcGlsZUV4cHJlc3Npb24oTWFzc0VkaXRIZWxwZXIuaGVscGVycy5nZXRCaW5kaW5nRXhwRm9ySGFzRWRpdGFibGVGaWVsZHMoZmllbGRzLCBlZGl0YWJsZSkpO1xuXHRcdH1cblx0fVxufTtcblxuZXhwb3J0IGRlZmF1bHQgTWFzc0VkaXRIZWxwZXI7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBOEVBLE1BQU1BLGNBQWMsR0FBRztJQUN0QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NDLDJCQUEyQixFQUFFLFVBQVVDLEtBQWEsRUFBRUMsT0FBWSxFQUEyQjtNQUM1RixJQUFJQyxVQUFlO01BQ25CLElBQUlDLEtBQUssR0FBRyxDQUFDO01BQ2IsTUFBTUMsTUFBTSxHQUFHSixLQUFLLENBQUNLLEtBQUssQ0FBQyxHQUFHLENBQUM7TUFDL0IsSUFBSUMsU0FBUyxHQUFHLEVBQUU7TUFDbEJGLE1BQU0sQ0FBQ0csT0FBTyxDQUFDLFVBQVVDLGFBQXFCLEVBQUU7UUFDL0MsSUFBSSxDQUFDUCxPQUFPLENBQUNPLGFBQWEsQ0FBQyxJQUFJTCxLQUFLLEtBQUssQ0FBQyxFQUFFO1VBQzNDRixPQUFPLENBQUNPLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztVQUMzQk4sVUFBVSxHQUFHRCxPQUFPLENBQUNPLGFBQWEsQ0FBQztVQUNuQ0YsU0FBUyxHQUFHQSxTQUFTLEdBQUdF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
|