@sapui5/sap.fe.core 1.103.0 → 1.106.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -5
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime.js +121 -0
- package/src/sap/fe/core/ActionRuntime.ts +122 -0
- package/src/sap/fe/core/AppComponent.js +24 -11
- package/src/sap/fe/core/AppComponent.ts +17 -5
- package/src/sap/fe/core/AppStateHandler.js +74 -62
- package/src/sap/fe/core/AppStateHandler.ts +24 -29
- package/src/sap/fe/core/BaseController.js +2 -2
- package/src/sap/fe/core/CommonUtils.js +147 -180
- package/src/sap/fe/core/CommonUtils.ts +166 -193
- package/src/sap/fe/core/ExtensionAPI.js +2 -2
- package/src/sap/fe/core/PageController.js +2 -2
- package/src/sap/fe/core/TemplateComponent.js +21 -10
- package/src/sap/fe/core/TemplateComponent.ts +3 -0
- package/src/sap/fe/core/TemplateModel.js +2 -2
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +11 -3
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +7 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +194 -43
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +162 -24
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +14 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.ts +5 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +609 -227
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +268 -119
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +111 -76
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +96 -76
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +723 -637
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +361 -398
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +2 -2
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +83 -55
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +42 -44
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +29 -27
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +35 -30
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +171 -74
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +167 -76
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +5 -21
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -17
- package/src/sap/fe/core/controllerextensions/MassEdit.js +3 -3
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +1 -1
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +2 -2
- package/src/sap/fe/core/controllerextensions/PageReady.js +3 -3
- package/src/sap/fe/core/controllerextensions/PageReady.ts +5 -1
- package/src/sap/fe/core/controllerextensions/Paginator.js +13 -13
- package/src/sap/fe/core/controllerextensions/Paginator.ts +11 -11
- package/src/sap/fe/core/controllerextensions/Placeholder.js +2 -2
- package/src/sap/fe/core/controllerextensions/Routing.js +2 -2
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +154 -123
- package/src/sap/fe/core/controllerextensions/Share.ts +93 -95
- package/src/sap/fe/core/controllerextensions/SideEffects.js +157 -97
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +151 -95
- package/src/sap/fe/core/controllerextensions/ViewState.js +151 -80
- package/src/sap/fe/core/controllerextensions/ViewState.ts +95 -93
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +1 -1
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +9 -9
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +6 -7
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +26 -11
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +30 -11
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +57 -40
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +55 -47
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +31 -32
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1376 -914
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +654 -714
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +372 -326
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +210 -276
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +309 -0
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +320 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +670 -521
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +537 -535
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +85 -65
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +16 -21
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +25 -13
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +53 -43
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +18 -27
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +9 -15
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +19 -3
- package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +35 -0
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +26 -16
- package/src/sap/fe/core/controls/Any.js +1 -1
- package/src/sap/fe/core/controls/CommandExecution.js +2 -2
- package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +5 -5
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +0 -3
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +2 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +1 -1
- package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
- package/src/sap/fe/core/controls/FileWrapper.js +8 -3
- package/src/sap/fe/core/controls/FileWrapper.ts +5 -1
- package/src/sap/fe/core/controls/FilterBar.js +2 -2
- package/src/sap/fe/core/controls/FormElementWrapper.js +2 -2
- package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +48 -17
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +2 -2
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +2 -2
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +2 -2
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -3
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +2 -2
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +2 -2
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +1 -1
- package/src/sap/fe/core/converters/ConverterContext.js +23 -2
- package/src/sap/fe/core/converters/ConverterContext.ts +34 -9
- package/src/sap/fe/core/converters/ManifestSettings.js +19 -18
- package/src/sap/fe/core/converters/ManifestSettings.ts +53 -47
- package/src/sap/fe/core/converters/ManifestWrapper.js +1 -1
- package/src/sap/fe/core/converters/MetaModelConverter.js +32 -10
- package/src/sap/fe/core/converters/MetaModelConverter.ts +42 -19
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/annotations/DataField.js +5 -2
- package/src/sap/fe/core/converters/annotations/DataField.ts +5 -1
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +69 -23
- package/src/sap/fe/core/converters/controls/Common/Action.js +98 -51
- package/src/sap/fe/core/converters/controls/Common/Action.ts +121 -44
- package/src/sap/fe/core/converters/controls/Common/Chart.js +31 -34
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +26 -34
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +43 -7
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +60 -33
- package/src/sap/fe/core/converters/controls/Common/Form.js +8 -6
- package/src/sap/fe/core/converters/controls/Common/Form.ts +11 -14
- package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +16 -15
- package/src/sap/fe/core/converters/controls/Common/Table.js +188 -157
- package/src/sap/fe/core/converters/controls/Common/Table.ts +279 -230
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +4 -4
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +57 -21
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +71 -18
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +30 -8
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +24 -7
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +43 -34
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +37 -25
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +85 -49
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +74 -50
- package/src/sap/fe/core/converters/helpers/Aggregation.js +54 -4
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +56 -8
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +6 -4
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +10 -2
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +182 -0
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +167 -0
- package/src/sap/fe/core/converters/helpers/ID.js +3 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +1 -0
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
- package/src/sap/fe/core/converters/helpers/Key.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +2 -3
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +8 -14
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +6 -9
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +31 -31
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +54 -47
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +44 -15
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +64 -30
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +1 -1
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
- package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
- package/src/sap/fe/core/formatters/StandardFormatter.js +13 -6
- package/src/sap/fe/core/formatters/StandardFormatter.ts +20 -14
- package/src/sap/fe/core/formatters/TableFormatter.js +1 -1
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
- package/src/sap/fe/core/fpm/Component.js +33 -7
- package/src/sap/fe/core/fpm/Component.ts +14 -0
- package/src/sap/fe/core/helpers/AnnotationEnum.js +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +5 -4
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +4 -3
- package/src/sap/fe/core/helpers/BindingToolkit.js +56 -24
- package/src/sap/fe/core/helpers/BindingToolkit.ts +67 -21
- package/src/sap/fe/core/helpers/ClassSupport.js +31 -3
- package/src/sap/fe/core/helpers/ClassSupport.ts +24 -1
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
- package/src/sap/fe/core/helpers/EditState.js +1 -1
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -1
- package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +1 -1
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
- package/src/sap/fe/core/helpers/LoaderUtils.js +39 -0
- package/src/sap/fe/core/helpers/LoaderUtils.ts +14 -0
- package/src/sap/fe/core/helpers/MassEditHelper.js +475 -99
- package/src/sap/fe/core/helpers/MassEditHelper.ts +468 -155
- package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
- package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +1 -1
- package/src/sap/fe/core/helpers/PasteHelper.js +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +82 -36
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +52 -36
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
- package/src/sap/fe/core/helpers/SideEffectsHelper.js +146 -0
- package/src/sap/fe/core/helpers/SideEffectsHelper.ts +128 -0
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
- package/src/sap/fe/core/helpers/Synchronization.js +1 -1
- package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
- package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +109 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +47 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +119 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +98 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
- package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
- package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
- package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +179 -0
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +150 -0
- package/src/sap/fe/core/library.js +2 -2
- package/src/sap/fe/core/library.support.js +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
- package/src/sap/fe/core/messagebundle.properties +4 -41
- package/src/sap/fe/core/messagebundle_ar.properties +22 -45
- package/src/sap/fe/core/messagebundle_bg.properties +22 -45
- package/src/sap/fe/core/messagebundle_ca.properties +22 -45
- package/src/sap/fe/core/messagebundle_cs.properties +22 -45
- package/src/sap/fe/core/messagebundle_cy.properties +21 -44
- package/src/sap/fe/core/messagebundle_da.properties +22 -45
- package/src/sap/fe/core/messagebundle_de.properties +22 -45
- package/src/sap/fe/core/messagebundle_el.properties +22 -45
- package/src/sap/fe/core/messagebundle_en.properties +21 -44
- package/src/sap/fe/core/messagebundle_en_GB.properties +21 -44
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +21 -42
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +20 -40
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +21 -42
- package/src/sap/fe/core/messagebundle_es.properties +22 -45
- package/src/sap/fe/core/messagebundle_es_MX.properties +22 -45
- package/src/sap/fe/core/messagebundle_et.properties +22 -45
- package/src/sap/fe/core/messagebundle_fi.properties +22 -45
- package/src/sap/fe/core/messagebundle_fr.properties +21 -44
- package/src/sap/fe/core/messagebundle_fr_CA.properties +20 -43
- package/src/sap/fe/core/messagebundle_hi.properties +22 -45
- package/src/sap/fe/core/messagebundle_hr.properties +22 -45
- package/src/sap/fe/core/messagebundle_hu.properties +22 -45
- package/src/sap/fe/core/messagebundle_id.properties +22 -45
- package/src/sap/fe/core/messagebundle_it.properties +22 -45
- package/src/sap/fe/core/messagebundle_iw.properties +22 -45
- package/src/sap/fe/core/messagebundle_ja.properties +22 -45
- package/src/sap/fe/core/messagebundle_kk.properties +22 -45
- package/src/sap/fe/core/messagebundle_ko.properties +27 -50
- package/src/sap/fe/core/messagebundle_lt.properties +22 -45
- package/src/sap/fe/core/messagebundle_lv.properties +22 -45
- package/src/sap/fe/core/messagebundle_ms.properties +22 -45
- package/src/sap/fe/core/messagebundle_nl.properties +24 -47
- package/src/sap/fe/core/messagebundle_no.properties +22 -45
- package/src/sap/fe/core/messagebundle_pl.properties +23 -46
- package/src/sap/fe/core/messagebundle_pt.properties +23 -46
- package/src/sap/fe/core/messagebundle_pt_PT.properties +22 -45
- package/src/sap/fe/core/messagebundle_ro.properties +22 -45
- package/src/sap/fe/core/messagebundle_ru.properties +22 -45
- package/src/sap/fe/core/messagebundle_sh.properties +22 -45
- package/src/sap/fe/core/messagebundle_sk.properties +22 -45
- package/src/sap/fe/core/messagebundle_sl.properties +22 -45
- package/src/sap/fe/core/messagebundle_sv.properties +22 -45
- package/src/sap/fe/core/messagebundle_th.properties +20 -43
- package/src/sap/fe/core/messagebundle_tr.properties +22 -45
- package/src/sap/fe/core/messagebundle_uk.properties +22 -45
- package/src/sap/fe/core/messagebundle_vi.properties +22 -45
- package/src/sap/fe/core/messagebundle_zh_CN.properties +22 -45
- package/src/sap/fe/core/messagebundle_zh_TW.properties +22 -45
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +102 -74
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +62 -63
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +2 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.js +11 -8
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +10 -7
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
- package/src/sap/fe/core/services/RoutingServiceFactory.js +2 -2
- package/src/sap/fe/core/services/ShellServicesFactory.js +22 -2
- package/src/sap/fe/core/services/ShellServicesFactory.ts +19 -0
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +4 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +2 -2
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +251 -200
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +160 -144
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
- package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.js +1 -1
- package/src/sap/fe/core/support/Diagnostics.js +1 -1
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.js +4 -3
- package/src/sap/fe/core/templating/CommonFormatters.ts +5 -1
- package/src/sap/fe/core/templating/CriticalityFormatters.js +1 -1
- package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.js +8 -1
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +5 -2
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper.js +4 -5
- package/src/sap/fe/core/templating/EntitySetHelper.ts +4 -3
- package/src/sap/fe/core/templating/FieldControlHelper.js +1 -1
- package/src/sap/fe/core/templating/FilterHelper.js +34 -15
- package/src/sap/fe/core/templating/FilterHelper.ts +28 -12
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/PropertyFormatters.js +1 -1
- package/src/sap/fe/core/templating/PropertyHelper.js +1 -1
- package/src/sap/fe/core/templating/UIFormatters.js +5 -3
- package/src/sap/fe/core/templating/UIFormatters.ts +7 -5
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
- package/src/sap/fe/core/type/Email.js +2 -2
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/Core", "sap/ui/core/mvc/ControllerExtension", "../CommonUtils", "../helpers/ClassSupport"], function (Log, FieldRuntime, Core, ControllerExtension, CommonUtils, ClassSupport) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _class, _class2;
|
|
8
|
+
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _dec25, _dec26, _class, _class2;
|
|
9
9
|
|
|
10
10
|
var publicExtension = ClassSupport.publicExtension;
|
|
11
11
|
var privateExtension = ClassSupport.privateExtension;
|
|
@@ -15,11 +15,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
|
|
|
15
15
|
|
|
16
16
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
17
17
|
|
|
18
|
-
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf
|
|
18
|
+
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
19
19
|
|
|
20
20
|
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
21
21
|
|
|
22
|
-
var SideEffectsControllerExtension = (_dec = defineUI5Class("sap.fe.core.controllerextensions.SideEffects"), _dec2 = methodOverride(), _dec3 = publicExtension(), _dec4 = finalExtension(), _dec5 = publicExtension(), _dec6 = finalExtension(), _dec7 = publicExtension(), _dec8 = finalExtension(), _dec9 = publicExtension(), _dec10 = finalExtension(), _dec11 = publicExtension(), _dec12 = finalExtension(), _dec13 = publicExtension(), _dec14 = finalExtension(), _dec15 = publicExtension(), _dec16 = finalExtension(), _dec17 = publicExtension(), _dec18 = finalExtension(), _dec19 =
|
|
22
|
+
var SideEffectsControllerExtension = (_dec = defineUI5Class("sap.fe.core.controllerextensions.SideEffects"), _dec2 = methodOverride(), _dec3 = publicExtension(), _dec4 = finalExtension(), _dec5 = publicExtension(), _dec6 = finalExtension(), _dec7 = publicExtension(), _dec8 = finalExtension(), _dec9 = publicExtension(), _dec10 = finalExtension(), _dec11 = publicExtension(), _dec12 = finalExtension(), _dec13 = publicExtension(), _dec14 = finalExtension(), _dec15 = publicExtension(), _dec16 = finalExtension(), _dec17 = publicExtension(), _dec18 = finalExtension(), _dec19 = publicExtension(), _dec20 = finalExtension(), _dec21 = privateExtension(), _dec22 = finalExtension(), _dec23 = publicExtension(), _dec24 = finalExtension(), _dec25 = publicExtension(), _dec26 = finalExtension(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
|
|
23
23
|
_inheritsLoose(SideEffectsControllerExtension, _ControllerExtension);
|
|
24
24
|
|
|
25
25
|
function SideEffectsControllerExtension() {
|
|
@@ -58,6 +58,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
|
|
|
58
58
|
|
|
59
59
|
_proto.getRegisteredFailedRequests = function getRegisteredFailedRequests() {
|
|
60
60
|
return this._mFailedSideEffects;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
_proto.deleteFailedRequestsForAContext = function deleteFailedRequestsForAContext(contextPath) {
|
|
64
|
+
delete this._mFailedSideEffects[contextPath];
|
|
61
65
|
}
|
|
62
66
|
/**
|
|
63
67
|
* Manages the workflow for SideEffects with related changes to a field
|
|
@@ -96,7 +100,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
|
|
|
96
100
|
aImmediateSideEffectsProperties.filter(function (mImmediateSideEffects) {
|
|
97
101
|
return mImmediateSideEffects.previouslyFailed === true;
|
|
98
102
|
}).forEach(function (mImmediateSideEffects) {
|
|
99
|
-
|
|
103
|
+
_this._addFailedSideEffects(mImmediateSideEffects.sideEffects, mImmediateSideEffects.context);
|
|
100
104
|
});
|
|
101
105
|
}
|
|
102
106
|
});
|
|
@@ -212,34 +216,46 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
|
|
|
212
216
|
* @name requestSideEffects
|
|
213
217
|
* @param oSideEffects SideEffects to be executed
|
|
214
218
|
* @param oContext Context where SideEffects need to be executed
|
|
219
|
+
* @param groupId
|
|
220
|
+
* @param fnGetTargets The callback function which will give us the targets and actions if it was coming through some specific handling.
|
|
215
221
|
* @returns SideEffects request on SAPUI5 context
|
|
216
222
|
*/
|
|
217
223
|
;
|
|
218
224
|
|
|
219
|
-
_proto.requestSideEffects = function requestSideEffects(oSideEffects, oContext) {
|
|
220
|
-
|
|
225
|
+
_proto.requestSideEffects = function requestSideEffects(oSideEffects, oContext, groupId, fnGetTargets) {
|
|
226
|
+
try {
|
|
227
|
+
var _this3 = this;
|
|
221
228
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
});
|
|
227
|
-
var aTargets = (oSideEffects.TargetEntities || []).concat(oSideEffects.TargetProperties || []),
|
|
228
|
-
sTriggerAction = oSideEffects.TriggerAction;
|
|
229
|
+
function _temp3() {
|
|
230
|
+
if (sTriggerAction) {
|
|
231
|
+
_this3._oSideEffectsService.executeAction(sTriggerAction, oContext, groupId);
|
|
232
|
+
}
|
|
229
233
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
}
|
|
234
|
+
return aTargets.length ? _this3._oSideEffectsService.requestSideEffects(aTargets, oContext, groupId).catch(function (oError) {
|
|
235
|
+
_this3._addFailedSideEffects(oSideEffects, oContext);
|
|
233
236
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
_this2._addFailedSideEffects(oSideEffects, oContext);
|
|
237
|
+
return Promise.reject(oError);
|
|
238
|
+
}) : Promise.resolve();
|
|
239
|
+
}
|
|
238
240
|
|
|
239
|
-
|
|
240
|
-
});
|
|
241
|
+
var aTargets, sTriggerAction;
|
|
241
242
|
|
|
242
|
-
|
|
243
|
+
var _temp4 = function () {
|
|
244
|
+
if (fnGetTargets) {
|
|
245
|
+
return Promise.resolve(fnGetTargets(oSideEffects)).then(function (targetsAndActionData) {
|
|
246
|
+
aTargets = targetsAndActionData["aTargets"];
|
|
247
|
+
sTriggerAction = targetsAndActionData["TriggerAction"];
|
|
248
|
+
});
|
|
249
|
+
} else {
|
|
250
|
+
aTargets = (oSideEffects.TargetEntities || []).concat(oSideEffects.TargetProperties || []);
|
|
251
|
+
sTriggerAction = oSideEffects.TriggerAction;
|
|
252
|
+
}
|
|
253
|
+
}();
|
|
254
|
+
|
|
255
|
+
return Promise.resolve(_temp4 && _temp4.then ? _temp4.then(_temp3) : _temp3(_temp4));
|
|
256
|
+
} catch (e) {
|
|
257
|
+
return Promise.reject(e);
|
|
258
|
+
}
|
|
243
259
|
}
|
|
244
260
|
/**
|
|
245
261
|
* Removes SideEffects created by a control.
|
|
@@ -372,19 +388,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
|
|
|
372
388
|
}
|
|
373
389
|
/**
|
|
374
390
|
* Gets the appropriate context on which SideEffects can be requested.
|
|
375
|
-
*
|
|
391
|
+
* The correct one must have the binding parameter $$patchWithoutSideEffects.
|
|
376
392
|
*
|
|
377
|
-
* @
|
|
378
|
-
* @
|
|
379
|
-
* @
|
|
380
|
-
* @param sSideEffectEntityType Target entity type of the SideEffects annotation
|
|
381
|
-
* @returns SAPUI5 Context
|
|
393
|
+
* @param oBindingContext
|
|
394
|
+
* @param sSideEffectEntityType
|
|
395
|
+
* @returns SAPUI5 Context or undefined
|
|
382
396
|
*/
|
|
383
397
|
;
|
|
384
398
|
|
|
385
|
-
_proto.
|
|
386
|
-
var oBindingContext = oSourceField.getBindingContext();
|
|
387
|
-
|
|
399
|
+
_proto.getContextForSideEffects = function getContextForSideEffects(oBindingContext, sSideEffectEntityType) {
|
|
388
400
|
var oContextForSideEffects = oBindingContext,
|
|
389
401
|
sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oBindingContext);
|
|
390
402
|
|
|
@@ -435,9 +447,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
|
|
|
435
447
|
|
|
436
448
|
_proto._getFieldPromise = function _getFieldPromise(oEvent) {
|
|
437
449
|
var promise = oEvent.getParameter("promise") || Promise.resolve();
|
|
450
|
+
var validity = FieldRuntime.getFieldStateOnChange(oEvent).state.validity;
|
|
438
451
|
return promise.then(function () {
|
|
439
452
|
return new Promise(function (resolve, reject) {
|
|
440
|
-
if (!
|
|
453
|
+
if (!validity) {
|
|
441
454
|
reject();
|
|
442
455
|
} else {
|
|
443
456
|
resolve(true);
|
|
@@ -477,43 +490,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
|
|
|
477
490
|
;
|
|
478
491
|
|
|
479
492
|
_proto._getFieldSideEffectsMap = function _getFieldSideEffectsMap(oField) {
|
|
480
|
-
var
|
|
493
|
+
var mSideEffectsMap = {};
|
|
481
494
|
|
|
482
|
-
var
|
|
483
|
-
aFieldGroupIds = oField.getFieldGroupIds(),
|
|
495
|
+
var aFieldGroupIds = oField.getFieldGroupIds(),
|
|
484
496
|
sViewEntitySetSetName = this._oView.getViewData().entitySet,
|
|
485
497
|
oViewEntitySet = this._oSideEffectsService.getConvertedMetaModel().entitySets.find(function (oEntitySet) {
|
|
486
498
|
return oEntitySet.name === sViewEntitySetSetName;
|
|
487
499
|
}); // SideEffects coming from an OData Service
|
|
488
500
|
|
|
489
501
|
|
|
490
|
-
|
|
491
|
-
var _this3$_oSideEffectsS;
|
|
492
|
-
|
|
493
|
-
var bIsImmediate = sFieldGroupId.indexOf("$$ImmediateRequest") !== -1,
|
|
494
|
-
sName = sFieldGroupId.replace("$$ImmediateRequest", ""),
|
|
495
|
-
aSideEffectParts = sName.split("#"),
|
|
496
|
-
sSideEffectEntityType = aSideEffectParts[0],
|
|
497
|
-
sSideEffectPath = "".concat(sSideEffectEntityType, "@com.sap.vocabularies.Common.v1.SideEffects").concat(aSideEffectParts.length === 2 ? "#".concat(aSideEffectParts[1]) : ""),
|
|
498
|
-
oSideEffect = (_this3$_oSideEffectsS = _this3._oSideEffectsService.getODataEntitySideEffects(sSideEffectEntityType)) === null || _this3$_oSideEffectsS === void 0 ? void 0 : _this3$_oSideEffectsS[sSideEffectPath],
|
|
499
|
-
oContext = _this3._getContextForSideEffects(oField, sSideEffectEntityType);
|
|
500
|
-
|
|
501
|
-
if (oSideEffect && oContext) {
|
|
502
|
-
mSideEffectsMap[sName] = {
|
|
503
|
-
name: sName,
|
|
504
|
-
immediate: bIsImmediate,
|
|
505
|
-
sideEffects: oSideEffect,
|
|
506
|
-
context: oContext
|
|
507
|
-
};
|
|
508
|
-
}
|
|
509
|
-
}); //SideEffects coming from control(s)
|
|
502
|
+
mSideEffectsMap = this.generateSideEffectsMapFromSideEffectId(aFieldGroupIds, oField); //SideEffects coming from control(s)
|
|
510
503
|
|
|
511
504
|
if (sViewEntitySetSetName && oViewEntitySet) {
|
|
512
505
|
var sViewEntityType = oViewEntitySet.entityType.fullyQualifiedName,
|
|
513
506
|
mFieldPath = oField.getAggregation("customData").find(function (oCustomData) {
|
|
514
507
|
return oCustomData.getKey() === "sourcePath";
|
|
515
508
|
}),
|
|
516
|
-
oContext = this.
|
|
509
|
+
oContext = this.getContextForSideEffects(oField.getBindingContext(), sViewEntityType);
|
|
517
510
|
|
|
518
511
|
if (mFieldPath && oContext) {
|
|
519
512
|
var sFieldPath = mFieldPath.getValue().replace("/".concat(sViewEntitySetSetName, "/"), ""),
|
|
@@ -537,6 +530,68 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
|
|
|
537
530
|
|
|
538
531
|
return mSideEffectsMap;
|
|
539
532
|
}
|
|
533
|
+
/**
|
|
534
|
+
* Get side effect Name, sideeffect obj and entity type from a given fieldGroupId.
|
|
535
|
+
*
|
|
536
|
+
* @param sFieldGroupId
|
|
537
|
+
* @returns Data about sideeffect name, entitytype, side effect object and if it is immediate.
|
|
538
|
+
*/
|
|
539
|
+
;
|
|
540
|
+
|
|
541
|
+
_proto._getDataToGenerateSideEffectsMapFromSideEffectId = function _getDataToGenerateSideEffectsMapFromSideEffectId(sFieldGroupId) {
|
|
542
|
+
var _this$_oSideEffectsSe;
|
|
543
|
+
|
|
544
|
+
var bIsImmediate = sFieldGroupId.indexOf("$$ImmediateRequest") !== -1,
|
|
545
|
+
sName = sFieldGroupId.replace("$$ImmediateRequest", ""),
|
|
546
|
+
aSideEffectParts = sName.split("#"),
|
|
547
|
+
sSideEffectEntityType = aSideEffectParts[0],
|
|
548
|
+
sSideEffectPath = "".concat(sSideEffectEntityType, "@com.sap.vocabularies.Common.v1.SideEffects").concat(aSideEffectParts.length === 2 ? "#".concat(aSideEffectParts[1]) : ""),
|
|
549
|
+
oSideEffect = (_this$_oSideEffectsSe = this._oSideEffectsService.getODataEntitySideEffects(sSideEffectEntityType)) === null || _this$_oSideEffectsSe === void 0 ? void 0 : _this$_oSideEffectsSe[sSideEffectPath];
|
|
550
|
+
return {
|
|
551
|
+
sName: sName,
|
|
552
|
+
bIsImmediate: bIsImmediate,
|
|
553
|
+
oSideEffect: oSideEffect,
|
|
554
|
+
sSideEffectEntityType: sSideEffectEntityType
|
|
555
|
+
};
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Generate the side effects map from id which is the entity and qualifier
|
|
559
|
+
* for the given entity.
|
|
560
|
+
*
|
|
561
|
+
* @function
|
|
562
|
+
* @param aFieldGroupIds
|
|
563
|
+
* @param oField
|
|
564
|
+
* @returns Side effect map with data
|
|
565
|
+
*/
|
|
566
|
+
;
|
|
567
|
+
|
|
568
|
+
_proto.generateSideEffectsMapFromSideEffectId = function generateSideEffectsMapFromSideEffectId(aFieldGroupIds, oField) {
|
|
569
|
+
var _this4 = this;
|
|
570
|
+
|
|
571
|
+
var mSideEffectsMap = {};
|
|
572
|
+
aFieldGroupIds.forEach(function (sFieldGroupId) {
|
|
573
|
+
var _this4$_getDataToGene = _this4._getDataToGenerateSideEffectsMapFromSideEffectId(sFieldGroupId),
|
|
574
|
+
sName = _this4$_getDataToGene.sName,
|
|
575
|
+
bIsImmediate = _this4$_getDataToGene.bIsImmediate,
|
|
576
|
+
oSideEffect = _this4$_getDataToGene.oSideEffect,
|
|
577
|
+
sSideEffectEntityType = _this4$_getDataToGene.sSideEffectEntityType;
|
|
578
|
+
|
|
579
|
+
var oContext = oField ? _this4.getContextForSideEffects(oField.getBindingContext(), sSideEffectEntityType) : undefined;
|
|
580
|
+
|
|
581
|
+
if (oSideEffect && (!oField || oField && oContext)) {
|
|
582
|
+
mSideEffectsMap[sName] = {
|
|
583
|
+
name: sName,
|
|
584
|
+
immediate: bIsImmediate,
|
|
585
|
+
sideEffects: oSideEffect
|
|
586
|
+
};
|
|
587
|
+
|
|
588
|
+
if (oField) {
|
|
589
|
+
mSideEffectsMap[sName].context = oContext;
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
});
|
|
593
|
+
return mSideEffectsMap;
|
|
594
|
+
}
|
|
540
595
|
/**
|
|
541
596
|
* Manages the SideEffects with related changes to a field
|
|
542
597
|
* List: gets immediate SideEffects requests
|
|
@@ -551,7 +606,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
|
|
|
551
606
|
;
|
|
552
607
|
|
|
553
608
|
_proto._initializeFieldSideEffects = function _initializeFieldSideEffects(mEventFieldProperties, oFieldGroupPreRequisite) {
|
|
554
|
-
var
|
|
609
|
+
var _this5 = this;
|
|
555
610
|
|
|
556
611
|
var mFieldSideEffectsMap = mEventFieldProperties.sideEffectsMap,
|
|
557
612
|
oFieldPromiseForFieldGroup = this._generateFieldGroupPromise(mEventFieldProperties),
|
|
@@ -561,45 +616,50 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
|
|
|
561
616
|
|
|
562
617
|
oFieldGroupPreRequisite = oFieldGroupPreRequisite || Promise.resolve();
|
|
563
618
|
Object.keys(mFieldSideEffectsMap).forEach(function (sSideEffectName) {
|
|
619
|
+
var _oSideEffectProperty$;
|
|
620
|
+
|
|
564
621
|
var oSideEffectProperty = mFieldSideEffectsMap[sSideEffectName],
|
|
565
|
-
sSideEffectContextPath = oSideEffectProperty.context
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
mFailedSideEffectsName[sSideEffectContextPath]
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
622
|
+
sSideEffectContextPath = (_oSideEffectProperty$ = oSideEffectProperty.context) === null || _oSideEffectProperty$ === void 0 ? void 0 : _oSideEffectProperty$.getPath();
|
|
623
|
+
|
|
624
|
+
if (sSideEffectContextPath) {
|
|
625
|
+
var aFailedSideEffects = _this5._mFailedSideEffects[sSideEffectContextPath];
|
|
626
|
+
|
|
627
|
+
if (aFailedSideEffects) {
|
|
628
|
+
delete _this5._mFailedSideEffects[sSideEffectContextPath];
|
|
629
|
+
mFailedSideEffectsName[sSideEffectContextPath] = {};
|
|
630
|
+
aFailedSideEffects.forEach(function (mFailedSideEffects) {
|
|
631
|
+
mFailedSideEffectsName[sSideEffectContextPath][mFailedSideEffects.fullyQualifiedName] = true;
|
|
632
|
+
aImmediateSideEffectsProperties.push({
|
|
633
|
+
name: sSideEffectName,
|
|
634
|
+
previouslyFailed: true,
|
|
635
|
+
sideEffects: mFailedSideEffects,
|
|
636
|
+
context: oSideEffectProperty.context
|
|
637
|
+
});
|
|
578
638
|
});
|
|
579
|
-
}
|
|
580
|
-
}
|
|
639
|
+
}
|
|
581
640
|
|
|
582
|
-
|
|
583
|
-
|
|
641
|
+
if (oSideEffectProperty.immediate) {
|
|
642
|
+
var _mFailedSideEffectsNa;
|
|
584
643
|
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
644
|
+
// SideEffects will be executed immediately after event promise validation
|
|
645
|
+
if (!((_mFailedSideEffectsNa = mFailedSideEffectsName[sSideEffectContextPath]) !== null && _mFailedSideEffectsNa !== void 0 && _mFailedSideEffectsNa[oSideEffectProperty.sideEffects.fullyQualifiedName])) {
|
|
646
|
+
aImmediateSideEffectsProperties.push({
|
|
647
|
+
name: sSideEffectName,
|
|
648
|
+
sideEffects: oSideEffectProperty.sideEffects,
|
|
649
|
+
context: oSideEffectProperty.context
|
|
650
|
+
});
|
|
651
|
+
}
|
|
652
|
+
} else {
|
|
653
|
+
// Add deferred SideEffects to the related dictionary
|
|
654
|
+
_this5._mFieldGroupQueue[sSideEffectName] = _this5._mFieldGroupQueue[sSideEffectName] || {};
|
|
655
|
+
var mSideEffectContextPath = _this5._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] || {
|
|
656
|
+
promises: [],
|
|
657
|
+
sideEffectProperty: oSideEffectProperty,
|
|
658
|
+
processStarted: false
|
|
659
|
+
};
|
|
660
|
+
mSideEffectContextPath.promises = mSideEffectContextPath.promises.concat([oFieldPromiseForFieldGroup, oFieldGroupPreRequisite]);
|
|
661
|
+
_this5._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] = mSideEffectContextPath;
|
|
592
662
|
}
|
|
593
|
-
} else {
|
|
594
|
-
// Add deferred SideEffects to the related dictionary
|
|
595
|
-
_this4._mFieldGroupQueue[sSideEffectName] = _this4._mFieldGroupQueue[sSideEffectName] || {};
|
|
596
|
-
var mSideEffectContextPath = _this4._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] || {
|
|
597
|
-
promises: [],
|
|
598
|
-
sideEffectProperty: oSideEffectProperty,
|
|
599
|
-
processStarted: false
|
|
600
|
-
};
|
|
601
|
-
mSideEffectContextPath.promises = mSideEffectContextPath.promises.concat([oFieldPromiseForFieldGroup, oFieldGroupPreRequisite]);
|
|
602
|
-
_this4._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] = mSideEffectContextPath;
|
|
603
663
|
}
|
|
604
664
|
});
|
|
605
665
|
return aImmediateSideEffectsProperties;
|
|
@@ -613,7 +673,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
|
|
|
613
673
|
;
|
|
614
674
|
|
|
615
675
|
_proto._saveFieldPropertiesStatus = function _saveFieldPropertiesStatus(oField, bSuccess) {
|
|
616
|
-
var
|
|
676
|
+
var _this6 = this;
|
|
617
677
|
|
|
618
678
|
var oBindingContext = oField.getBindingContext();
|
|
619
679
|
|
|
@@ -630,10 +690,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
|
|
|
630
690
|
}) : [oFieldBinding.getPath()]; // Stores status for all properties
|
|
631
691
|
|
|
632
692
|
aFieldPaths.forEach(function (sFieldPath) {
|
|
633
|
-
var sId =
|
|
693
|
+
var sId = _this6._generateStatusIndex(mEntityType, sFieldPath, oBindingContext);
|
|
634
694
|
|
|
635
695
|
if (sId) {
|
|
636
|
-
|
|
696
|
+
_this6._aSourcePropertiesFailure[bSuccess ? "delete" : "add"](sId);
|
|
637
697
|
}
|
|
638
698
|
});
|
|
639
699
|
}
|
|
@@ -659,7 +719,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/macros/field/FieldRuntime", "sap/ui/core/
|
|
|
659
719
|
};
|
|
660
720
|
|
|
661
721
|
return SideEffectsControllerExtension;
|
|
662
|
-
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "clearPropertiesStatus", [_dec3, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "clearPropertiesStatus"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRegisteredFailedRequests", [_dec5, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "getRegisteredFailedRequests"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "
|
|
722
|
+
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "clearPropertiesStatus", [_dec3, _dec4], Object.getOwnPropertyDescriptor(_class2.prototype, "clearPropertiesStatus"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRegisteredFailedRequests", [_dec5, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "getRegisteredFailedRequests"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "deleteFailedRequestsForAContext", [_dec7, _dec8], Object.getOwnPropertyDescriptor(_class2.prototype, "deleteFailedRequestsForAContext"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldChange", [_dec9, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldGroupChange", [_dec11, _dec12], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldGroupChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "addControlSideEffects", [_dec13, _dec14], Object.getOwnPropertyDescriptor(_class2.prototype, "addControlSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeFailedSideEffects", [_dec15, _dec16], Object.getOwnPropertyDescriptor(_class2.prototype, "removeFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "requestSideEffects", [_dec17, _dec18], Object.getOwnPropertyDescriptor(_class2.prototype, "requestSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeControlSideEffects", [_dec19, _dec20], Object.getOwnPropertyDescriptor(_class2.prototype, "removeControlSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_addFailedSideEffects", [_dec21, _dec22], Object.getOwnPropertyDescriptor(_class2.prototype, "_addFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getContextForSideEffects", [_dec23, _dec24], Object.getOwnPropertyDescriptor(_class2.prototype, "getContextForSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "generateSideEffectsMapFromSideEffectId", [_dec25, _dec26], Object.getOwnPropertyDescriptor(_class2.prototype, "generateSideEffectsMapFromSideEffectId"), _class2.prototype)), _class2)) || _class);
|
|
663
723
|
return SideEffectsControllerExtension;
|
|
664
724
|
}, false);
|
|
665
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzLnRzIl0sIm5hbWVzIjpbIlNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiIsImRlZmluZVVJNUNsYXNzIiwibWV0aG9kT3ZlcnJpZGUiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsInByaXZhdGVFeHRlbnNpb24iLCJvbkluaXQiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsIl9tRmllbGRHcm91cFF1ZXVlIiwiX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZSIsIlNldCIsIl9tRmFpbGVkU2lkZUVmZmVjdHMiLCJjbGVhclByb3BlcnRpZXNTdGF0dXMiLCJjbGVhciIsImdldFJlZ2lzdGVyZWRGYWlsZWRSZXF1ZXN0cyIsImhhbmRsZUZpZWxkQ2hhbmdlIiwib0V2ZW50Iiwib0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUiLCJtRXZlbnRGaWVsZFByb3BlcnRpZXMiLCJfZ2V0RmllbGRQcm9wZXJ0aWVzIiwiYUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcyIsIl9pbml0aWFsaXplRmllbGRTaWRlRWZmZWN0cyIsImJJc0ltbWVkaWF0ZVRyaWdnZXJlZCIsIl9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2UiLCJ0aGVuIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsIm1TaWRlRWZmZWN0c1Byb3BlcnR5IiwicmVxdWVzdFNpZGVFZmZlY3RzIiwic2lkZUVmZmVjdHMiLCJjb250ZXh0IiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJkZWJ1ZyIsImZpbHRlciIsIm1JbW1lZGlhdGVTaWRlRWZmZWN0cyIsInByZXZpb3VzbHlGYWlsZWQiLCJmb3JFYWNoIiwiX2FkZEZhaWxlZFNpZGVFZmZlY3RzIiwiaGFuZGxlRmllbGRHcm91cENoYW5nZSIsInRoYXQiLCJhRGVmZXJyZWRTaWRlRWZmZWN0cyIsImFGaWVsZEdyb3VwSWRzIiwiZ2V0UGFyYW1ldGVyIiwiZ2V0RmllbGRHcm91cFJlcXVlc3RQcm9taXNlIiwib0RlZmVycmVkU2lkZUVmZmVjdCIsImJJc1JlcXVlc3RzVHJpZ2dlcmVkIiwib1NpZGVFZmZlY3RQcm9wZXJ0eSIsInNpZGVFZmZlY3RQcm9wZXJ0eSIsIm9Db250ZXh0Iiwic0NvbnRleHRQYXRoIiwiZ2V0UGF0aCIsInNFbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwibUVudGl0eVR5cGUiLCJfZ2V0RW50aXR5VHlwZUZyb21GUU4iLCJwcm9taXNlcyIsIlNvdXJjZVByb3BlcnRpZXMiLCJldmVyeSIsInNvdXJjZVByb3BlcnR5IiwidHlwZSIsInNJZCIsIl9nZW5lcmF0ZVN0YXR1c0luZGV4IiwidmFsdWUiLCJoYXMiLCJmaW5hbGx5IiwibmFtZSIsInNGaWVsZEdyb3VwSWQiLCJzU2lkZUVmZmVjdE5hbWUiLCJyZXBsYWNlIiwibUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzIiwiT2JqZWN0Iiwia2V5cyIsInByb2Nlc3NTdGFydGVkIiwicHVzaCIsImFkZENvbnRyb2xTaWRlRWZmZWN0cyIsIm9TaWRlRWZmZWN0cyIsInJlbW92ZUZhaWxlZFNpZGVFZmZlY3RzIiwiZlJlc29sdmVyIiwiZlJlamVjdG9yIiwib1Byb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiYVRhcmdldHMiLCJUYXJnZXRFbnRpdGllcyIsImNvbmNhdCIsIlRhcmdldFByb3BlcnRpZXMiLCJzVHJpZ2dlckFjdGlvbiIsIlRyaWdnZXJBY3Rpb24iLCJleGVjdXRlQWN0aW9uIiwicmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzIiwib0NvbnRyb2wiLCJzQ29udHJvbElkIiwiaXNBIiwiZ2V0SWQiLCJiSXNOb3RBbHJlYWR5TGlzdGVkIiwibUZhaWxlZFNpZGVFZmZlY3RzIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2UiLCJiUHJvbWlzZVN1Y2Nlc3MiLCJwcm9taXNlIiwiX3NhdmVGaWVsZFByb3BlcnRpZXNTdGF0dXMiLCJmaWVsZCIsIm9GaWVsZCIsInNGaWVsZEhlbHBlcklkIiwiZ2V0RmllbGRIZWxwIiwib0ZpbHRlckhlbHAiLCJDb3JlIiwiYnlJZCIsImdldE91dFBhcmFtZXRlcnMiLCJvT3V0UGFyYW1ldGVyIiwib0JpbmRpbmciLCJnZXRCaW5kaW5nIiwicmVxdWVzdFZhbHVlIiwic1Byb3BlcnR5UGF0aCIsIm1Qcm9wZXJ0eSIsInJlc29sdmVQYXRoIiwiX3R5cGUiLCJqb2luIiwidW5kZWZpbmVkIiwiX2dldENvbnRleHRGb3JTaWRlRWZmZWN0cyIsIm9Tb3VyY2VGaWVsZCIsInNTaWRlRWZmZWN0RW50aXR5VHlwZSIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib0NvbnRleHRGb3JTaWRlRWZmZWN0cyIsImdldENvbnRleHQiLCJzRnVsbHlRdWFsaWZpZWROYW1lIiwiZ2V0Q29udmVydGVkTWV0YU1vZGVsIiwiZW50aXR5VHlwZXMiLCJmaW5kIiwib0VudGl0eVR5cGUiLCJfZ2V0RmllbGRQcm9taXNlIiwiRmllbGRSdW50aW1lIiwiZ2V0RmllbGRTdGF0ZU9uQ2hhbmdlIiwic3RhdGUiLCJ2YWxpZGl0eSIsImdldFNvdXJjZSIsInNpZGVFZmZlY3RzTWFwIiwiX2dldEZpZWxkU2lkZUVmZmVjdHNNYXAiLCJtU2lkZUVmZmVjdHNNYXAiLCJnZXRGaWVsZEdyb3VwSWRzIiwic1ZpZXdFbnRpdHlTZXRTZXROYW1lIiwiZ2V0Vmlld0RhdGEiLCJlbnRpdHlTZXQiLCJvVmlld0VudGl0eVNldCIsImVudGl0eVNldHMiLCJvRW50aXR5U2V0IiwiYklzSW1tZWRpYXRlIiwiaW5kZXhPZiIsInNOYW1lIiwiYVNpZGVFZmZlY3RQYXJ0cyIsInNwbGl0Iiwic1NpZGVFZmZlY3RQYXRoIiwibGVuZ3RoIiwib1NpZGVFZmZlY3QiLCJnZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzIiwiaW1tZWRpYXRlIiwic1ZpZXdFbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsIm1GaWVsZFBhdGgiLCJnZXRBZ2dyZWdhdGlvbiIsIm9DdXN0b21EYXRhIiwiZ2V0S2V5Iiwic0ZpZWxkUGF0aCIsImdldFZhbHVlIiwibUNvbnRyb2xFbnRpdHlUeXBlIiwiZ2V0Q29udHJvbEVudGl0eVNpZGVFZmZlY3RzIiwic0NvbnRyb2xOYW1lIiwib0NvbnRyb2xTaWRlRWZmZWN0cyIsImluY2x1ZGVzIiwibUZpZWxkU2lkZUVmZmVjdHNNYXAiLCJvRmllbGRQcm9taXNlRm9yRmllbGRHcm91cCIsIm1GYWlsZWRTaWRlRWZmZWN0c05hbWUiLCJzU2lkZUVmZmVjdENvbnRleHRQYXRoIiwiYUZhaWxlZFNpZGVFZmZlY3RzIiwibVNpZGVFZmZlY3RDb250ZXh0UGF0aCIsImJTdWNjZXNzIiwib0ZpZWxkQmluZGluZyIsIl9nZXRCaW5kaW5nRm9yRmllbGQiLCJhRmllbGRQYXRocyIsImdldEJpbmRpbmdzIiwic1BhdGgiLCJzQmluZGluZ05hbWUiLCJDb250cm9sbGVyRXh0ZW5zaW9uIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFxRE1BLDhCLFdBRExDLGNBQWMsQ0FBQyw4Q0FBRCxDLFVBU2JDLGNBQWMsRSxVQWdCZEMsZUFBZSxFLFVBQ2ZDLGNBQWMsRSxVQVlkRCxlQUFlLEUsVUFDZkMsY0FBYyxFLFVBaUJkRCxlQUFlLEUsVUFDZkMsY0FBYyxFLFVBNkNkRCxlQUFlLEUsV0FDZkMsY0FBYyxFLFdBaUZkRCxlQUFlLEUsV0FDZkMsY0FBYyxFLFdBV2RELGVBQWUsRSxXQUNmQyxjQUFjLEUsV0FjZEQsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQWdDZEQsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQWtCZEMsZ0JBQWdCLEUsV0FDaEJELGNBQWMsRSxXQThHZEMsZ0JBQWdCLEUsV0FDaEJELGNBQWMsRTs7Ozs7Ozs7O1dBN1dSRSxNLEdBRFAsa0JBQ2dCO0FBQ2YsV0FBS0MsTUFB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QzhHLFVBQXZDLEVBQW1EekMsZUFBbkQsQ0FBWjs7QUFDQSxjQUFJOUQsR0FBSixFQUFTO0FBQ1IsWUFBQSxNQUFJLENBQUN0RCx5QkFBTCxDQUErQjBLLFFBQVEsR0FBRyxRQUFILEdBQWMsS0FBckQsRUFBNERwSCxHQUE1RDtBQUNBO0FBQ0QsU0FMRDtBQU1BO0FBQ0Q7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNTc0gsbUIsR0FBUiw2QkFBNEI1RSxNQUE1QixFQUEyRDtBQUMxRCxVQUFJZ0YsWUFBWSxHQUFHLE9BQW5COztBQUNBLFVBQUloRixNQUFNLENBQUNWLEdBQVAsQ0FBVyxnQkFBWCxDQUFKLEVBQWtDO0FBQ2pDMEYsUUFBQUEsWUFBWSxHQUFHLFVBQWY7QUFDQSxPQUZELE1BRU8sSUFBSWhGLE1BQU0sQ0FBQ1YsR0FBUCxDQUFXLGtDQUFYLENBQUosRUFBb0Q7QUFDMUQwRixRQUFBQSxZQUFZLEdBQUcsV0FBZjtBQUNBOztBQUNELGFBQU9oRixNQUFNLENBQUNTLFVBQVAsQ0FBa0J1RSxZQUFsQixDQUFQO0FBQ0EsSzs7O0lBdm5CMkNDLG1CO1NBMG5COUJqTSw4QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDb252ZXJ0ZWRNZXRhZGF0YSwgRW50aXR5VHlwZSwgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7XG5cdENvbnRyb2xTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnksXG5cdENvbnRyb2xTaWRlRWZmZWN0c1R5cGUsXG5cdE9EYXRhU2lkZUVmZmVjdHNUeXBlLFxuXHRTaWRlRWZmZWN0c1R5cGVcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBGaWVsZFJ1bnRpbWUgZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGQvRmllbGRSdW50aW1lXCI7XG5pbXBvcnQgdHlwZSBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCB0eXBlIEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCIuLi9Db21tb25VdGlsc1wiO1xuaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIGZpbmFsRXh0ZW5zaW9uLCBtZXRob2RPdmVycmlkZSwgcHJpdmF0ZUV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uIH0gZnJvbSBcIi4uL2hlbHBlcnMvQ2xhc3NTdXBwb3J0XCI7XG5cbnR5cGUgRmllbGRDb250cm9sID0gQ29udHJvbCAmIHtcblx0Z2V0RmllbGRIZWxwKCk6IHN0cmluZztcblx0Z2V0RmllbGRHcm91cElkcygpOiBzdHJpbmdbXTtcbn07XG5cbnR5cGUgRmllbGRFdmVudFByb3BlcnR5VHlwZSA9IHtcblx0cHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuXHRmaWVsZDogRmllbGRDb250cm9sO1xuXHRzaWRlRWZmZWN0c01hcDogRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeTtcbn07XG5cbnR5cGUgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0ge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGltbWVkaWF0ZT86IGJvb2xlYW47XG5cdGNvbnRleHQ6IENvbnRleHQ7XG5cdHNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGU7XG5cdHByZXZpb3VzbHlGYWlsZWQ/OiBib29sZWFuO1xufTtcblxudHlwZSBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlPjtcblxudHlwZSBGYWlsZWRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RzVHlwZVtdPjtcblxudHlwZSBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGUgPSB7XG5cdHByb21pc2VzOiBQcm9taXNlPGFueT5bXTtcblx0c2lkZUVmZmVjdFByb3BlcnR5OiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU7XG5cdHByb2Nlc3NTdGFydGVkPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgRmllbGRHcm91cFF1ZXVlTWFwVHlwZSA9IHtcblx0W3NpZGVFZmZlY3ROYW1lOiBzdHJpbmddOiB7XG5cdFx0W2NvbnRleHRQYXRoOiBzdHJpbmddOiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGU7XG5cdH07XG59O1xuXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5TaWRlRWZmZWN0c1wiKVxuY2xhc3MgU2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgX29WaWV3OiBhbnk7XG5cdHByaXZhdGUgX29BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cdHByaXZhdGUgX21GaWVsZEdyb3VwUXVldWUhOiBGaWVsZEdyb3VwUXVldWVNYXBUeXBlO1xuXHRwcml2YXRlIF9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUhOiBTZXQ8c3RyaW5nPjtcblx0cHJpdmF0ZSBfb1NpZGVFZmZlY3RzU2VydmljZSE6IGFueTtcblx0cHJpdmF0ZSBfbUZhaWxlZFNpZGVFZmZlY3RzITogRmFpbGVkU2lkZUVmZmVjdERpY3Rpb25hcnk7XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0cHVibGljIG9uSW5pdCgpIHtcblx0XHR0aGlzLl9vVmlldyA9ICh0aGlzIGFzIGFueSkuYmFzZS5nZXRWaWV3KCk7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLl9vVmlldyk7XG5cdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZSA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0dGhpcy5fbUZpZWxkR3JvdXBRdWV1ZSA9IHt9O1xuXHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZSA9IG5ldyBTZXQoKTtcblx0XHR0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHMgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhciByZWNvcmRlZCB2YWxpZGF0aW9uIHN0YXR1cyBmb3IgYWxsIHByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBjbGVhclByb3BlcnRpZXNTdGF0dXNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwdWJsaWMgY2xlYXJQcm9wZXJ0aWVzU3RhdHVzKCk6IHZvaWQge1xuXHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZS5jbGVhcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgZmFpbGVkIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZ2V0UmVnaXN0ZXJlZEZhaWxlZFJlcXVlc3RzXG5cdCAqIEByZXR1cm5zIFJlZ2lzdGVyZWQgU2lkZUVmZmVjdHMgcmVxdWVzdHMgdGhhdCBoYXZlIGZhaWxlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyBnZXRSZWdpc3RlcmVkRmFpbGVkUmVxdWVzdHMoKTogRmFpbGVkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdHJldHVybiB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogTWFuYWdlcyB0aGUgd29ya2Zsb3cgZm9yIFNpZGVFZmZlY3RzIHdpdGggcmVsYXRlZCBjaGFuZ2VzIHRvIGEgZmllbGRcblx0ICogVGhlIGZvbGxvd2luZyBzY2VuYXJpb3MgYXJlIG1hbmFnZWQ6XG5cdCAqICAtIEV4ZWN1dGU6IHRyaWdnZXJzIGltbWVkaWF0ZSBTaWRlRWZmZWN0cyByZXF1ZXN0cyBpZiB0aGUgcHJvbWlzZSBmb3IgdGhlIGZpZWxkIGV2ZW50IGlzIGZ1bGZpbGxlZFxuXHQgKiAgLSBSZWdpc3RlcjogY2FjaGVzIGRlZmVycmVkIFNpZGVFZmZlY3RzIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBGaWVsZEdyb3VwIGlzIHVuZm9jdXNlZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGhhbmRsZUZpZWxkQ2hhbmdlXG5cdCAqIEBwYXJhbSBvRXZlbnQgU0FQVUk1IGV2ZW50IHRoYXQgY29tZXMgZnJvbSBhIGZpZWxkIGNoYW5nZVxuXHQgKiBAcGFyYW0gb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgYmVmb3JlIGV4ZWN1dGluZyBkZWZlcnJlZCBTaWRlRWZmZWN0c1xuXHQgKiBAcmV0dXJucyAgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0KHMpXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIGhhbmRsZUZpZWxkQ2hhbmdlKG9FdmVudDogRXZlbnQsIG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlPzogUHJvbWlzZTxhbnk+KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBtRXZlbnRGaWVsZFByb3BlcnRpZXMgPSB0aGlzLl9nZXRGaWVsZFByb3BlcnRpZXMob0V2ZW50KSxcblx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXM6IEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZVtdID0gdGhpcy5faW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHMoXG5cdFx0XHRcdG1FdmVudEZpZWxkUHJvcGVydGllcyxcblx0XHRcdFx0b0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGVcblx0XHRcdCk7XG5cblx0XHRsZXQgYklzSW1tZWRpYXRlVHJpZ2dlcmVkID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gdGhpcy5fZ2VuZXJhdGVJbW1lZGlhdGVQcm9taXNlKG1FdmVudEZpZWxkUHJvcGVydGllcylcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0YklzSW1tZWRpYXRlVHJpZ2dlcmVkID0gdHJ1ZTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMubWFwKChtU2lkZUVmZmVjdHNQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKG1TaWRlRWZmZWN0c1Byb3BlcnR5LnNpZGVFZmZlY3RzLCBtU2lkZUVmZmVjdHNQcm9wZXJ0eS5jb250ZXh0KTtcblx0XHRcdFx0XHR9KSB8fCBbXVxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaCgob0Vycm9yKSA9PiB7XG5cdFx0XHRcdGlmIChiSXNJbW1lZGlhdGVUcmlnZ2VyZWQpIHtcblx0XHRcdFx0XHRMb2cuZGVidWcoXCJFcnJvciB3aGlsZSBwcm9jZXNzaW5nIEZpZWxkIFNpZGVFZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogU2lkZUVmZmVjdHMgaGF2ZSBub3QgYmVlbiB0cmlnZ2VyZWQgc2luY2UgcHJlUmVxdWlzaXRlIHZhbGlkYXRpb24gZmFpbHMgc28gd2UgbmVlZFxuXHRcdFx0XHRcdCAqIHRvIGtlZXAgcHJldmlvdXNseSBmYWlsZWQgcmVxdWVzdCBhcyBGYWlsZWQgcmVxdWVzdCAodG8gYmUgcmV0cmlnZ2VyIG9uIG5leHQgY2hhbmdlKVxuXHRcdFx0XHRcdCAqL1xuXG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllc1xuXHRcdFx0XHRcdFx0LmZpbHRlcigobUltbWVkaWF0ZVNpZGVFZmZlY3RzKSA9PiBtSW1tZWRpYXRlU2lkZUVmZmVjdHMucHJldmlvdXNseUZhaWxlZCA9PT0gdHJ1ZSlcblx0XHRcdFx0XHRcdC5mb3JFYWNoKChtSW1tZWRpYXRlU2lkZUVmZmVjdHMpID0+XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FkZEZhaWxlZFNpZGVFZmZlY3RzKG1JbW1lZGlhdGVTaWRlRWZmZWN0cy5zaWRlRWZmZWN0cywgbUltbWVkaWF0ZVNpZGVFZmZlY3RzLmNvbnRleHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIFNpZGVFZmZlY3RzIHdpdGggYSByZWxhdGVkICdmb2N1cyBvdXQnIHRvIGEgZmllbGQgZ3JvdXAuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBoYW5kbGVGaWVsZEdyb3VwQ2hhbmdlXG5cdCAqIEBwYXJhbSBvRXZlbnQgU0FQVUk1IEV2ZW50XG5cdCAqIEByZXR1cm5zIFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdChzKVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyBoYW5kbGVGaWVsZEdyb3VwQ2hhbmdlKG9FdmVudDogRXZlbnQpOiBQcm9taXNlPGFueT4ge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzLFxuXHRcdFx0YURlZmVycmVkU2lkZUVmZmVjdHM6IEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZVtdID0gW10sXG5cdFx0XHRhRmllbGRHcm91cElkczogc3RyaW5nW10gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiZmllbGRHcm91cElkc1wiKTtcblxuXHRcdGNvbnN0IGdldEZpZWxkR3JvdXBSZXF1ZXN0UHJvbWlzZSA9IGZ1bmN0aW9uIChvRGVmZXJyZWRTaWRlRWZmZWN0OiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGUpIHtcblx0XHRcdGxldCBiSXNSZXF1ZXN0c1RyaWdnZXJlZCA9IGZhbHNlO1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RQcm9wZXJ0eSA9IG9EZWZlcnJlZFNpZGVFZmZlY3Quc2lkZUVmZmVjdFByb3BlcnR5O1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHQ7XG5cdFx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRjb25zdCBzRW50aXR5VHlwZSA9IHRoYXQuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IG1FbnRpdHlUeXBlID0gdGhhdC5fZ2V0RW50aXR5VHlwZUZyb21GUU4oc0VudGl0eVR5cGUpO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwob0RlZmVycmVkU2lkZUVmZmVjdC5wcm9taXNlcylcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGJJc1JlcXVlc3RzVHJpZ2dlcmVkID0gdHJ1ZTtcblxuXHRcdFx0XHRcdC8vRGVmZXJyZWQgU2lkZUVmZmVjdHMgYXJlIGV4ZWN1dGVkIG9ubHkgaWYgYWxsIHNvdXJjZVByb3BlcnRpZXMgaGF2ZSBubyByZWdpc3RlcmVkIGZhaWx1cmUuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0bUVudGl0eVR5cGUgJiZcblx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLlNvdXJjZVByb3BlcnRpZXMgYXMgUHJvcGVydHlQYXRoW10pLmV2ZXJ5KChzb3VyY2VQcm9wZXJ0eSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoc291cmNlUHJvcGVydHkudHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIikge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNJZCA9IHRoYXQuX2dlbmVyYXRlU3RhdHVzSW5kZXgobUVudGl0eVR5cGUsIHNvdXJjZVByb3BlcnR5LnZhbHVlLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNJZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuICF0aGF0Ll9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUuaGFzKHNJZCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGF0LnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLCBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKChvRXJyb3IpID0+IHtcblx0XHRcdFx0XHRpZiAoYklzUmVxdWVzdHNUcmlnZ2VyZWQpIHtcblx0XHRcdFx0XHRcdExvZy5kZWJ1ZyhgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBGaWVsZEdyb3VwIFNpZGVFZmZlY3RzIG9uIGNvbnRleHQgJHtzQ29udGV4dFBhdGh9YCwgb0Vycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhhdC5fbUZpZWxkR3JvdXBRdWV1ZVtvU2lkZUVmZmVjdFByb3BlcnR5Lm5hbWVdW3NDb250ZXh0UGF0aF07XG5cdFx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHRhRmllbGRHcm91cElkcy5mb3JFYWNoKChzRmllbGRHcm91cElkKSA9PiB7XG5cdFx0XHQvKipcblx0XHRcdCAqIHN0cmluZyBcIiQkSW1tZWRpYXRlUmVxdWVzdFwiIGlzIGFkZGVkIHRvIHRoZSBTaWRlRWZmZWN0cyBuYW1lIGR1cmluZyB0ZW1wbGF0aW5nIHRvIGtub3dcblx0XHRcdCAqIGlmIHRoaXMgU2lkZUVmZmVjdHMgbXVzdCBiZSBpbW1lZGlhdGVseSBleGVjdXRlZCByZXF1ZXN0ZWQgKG9uIGZpZWxkIGNoYW5nZSkgb3IgbXVzdFxuXHRcdFx0ICogYmUgZGVmZXJyZWQgKG9uIGZpZWxkIGdyb3VwIGZvY3VzIG91dClcblx0XHRcdCAqXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IHNTaWRlRWZmZWN0TmFtZTogc3RyaW5nID0gc0ZpZWxkR3JvdXBJZC5yZXBsYWNlKFwiJCRJbW1lZGlhdGVSZXF1ZXN0XCIsIFwiXCIpO1xuXHRcdFx0Y29uc3QgbUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzID0gdGhhdC5fbUZpZWxkR3JvdXBRdWV1ZT8uW3NTaWRlRWZmZWN0TmFtZV07XG5cdFx0XHRpZiAobUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdE9iamVjdC5rZXlzKG1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0cykuZm9yRWFjaCgoc0NvbnRleHRQYXRoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb0RlZmVycmVkU2lkZUVmZmVjdCA9IG1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdO1xuXHRcdFx0XHRcdGlmICghb0RlZmVycmVkU2lkZUVmZmVjdC5wcm9jZXNzU3RhcnRlZCkge1xuXHRcdFx0XHRcdFx0b0RlZmVycmVkU2lkZUVmZmVjdC5wcm9jZXNzU3RhcnRlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRhRGVmZXJyZWRTaWRlRWZmZWN0cy5wdXNoKG9EZWZlcnJlZFNpZGVFZmZlY3QpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRhRGVmZXJyZWRTaWRlRWZmZWN0cy5tYXAoKG9EZWZlcnJlZFNpZGVFZmZlY3QpID0+IHtcblx0XHRcdFx0cmV0dXJuIGdldEZpZWxkR3JvdXBSZXF1ZXN0UHJvbWlzZShvRGVmZXJyZWRTaWRlRWZmZWN0KTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgU2lkZUVmZmVjdHMgY29udHJvbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGFkZENvbnRyb2xTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gc0VudGl0eVR5cGUgTmFtZSBvZiB0aGUgZW50aXR5IHdoZXJlIHRoZSBTaWRlRWZmZWN0cyBjb250cm9sIHdpbGwgYmUgcmVnaXN0ZXJlZFxuXHQgKiBAcGFyYW0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRvIHJlZ2lzdGVyLiBFbnN1cmUgdGhlIHNvdXJjZUNvbnRyb2xJZCBtYXRjaGVzIHRoZSBhc3NvY2lhdGVkIFNBUFVJNSBjb250cm9sIElELlxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyBhZGRDb250cm9sU2lkZUVmZmVjdHMoc0VudGl0eVR5cGU6IHN0cmluZywgb1NpZGVFZmZlY3RzOiBPbWl0PENvbnRyb2xTaWRlRWZmZWN0c1R5cGUsIFwiZnVsbHlRdWFsaWZpZWROYW1lXCI+KTogdm9pZCB7XG5cdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5hZGRDb250cm9sU2lkZUVmZmVjdHMoc0VudGl0eVR5cGUsIG9TaWRlRWZmZWN0cyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgcXVldWUgY29udGFpbmluZyB0aGUgZmFpbGVkIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVtb3ZlRmFpbGVkU2lkZUVmZmVjdHNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwdWJsaWMgcmVtb3ZlRmFpbGVkU2lkZUVmZmVjdHMoKTogdm9pZCB7XG5cdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzID0ge307XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdCBTaWRlRWZmZWN0cyBvbiBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSByZXF1ZXN0U2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIG9TaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIHJlcXVlc3Qgb24gU0FQVUk1IGNvbnRleHRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwdWJsaWMgcmVxdWVzdFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlLCBvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8YW55PiB7XG5cdFx0bGV0IGZSZXNvbHZlcjogYW55LCBmUmVqZWN0b3I6IGFueTtcblx0XHRjb25zdCBvUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGZSZXNvbHZlciA9IHJlc29sdmU7XG5cdFx0XHRmUmVqZWN0b3IgPSByZWplY3Q7XG5cdFx0fSk7XG5cdFx0Y29uc3QgYVRhcmdldHM6IGFueVtdID0gKChvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMgYXMgYW55W10pIHx8IFtdKS5jb25jYXQoKG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSksXG5cdFx0XHRzVHJpZ2dlckFjdGlvbjogU3RyaW5nIHwgdW5kZWZpbmVkID0gKG9TaWRlRWZmZWN0cyBhcyBPRGF0YVNpZGVFZmZlY3RzVHlwZSkuVHJpZ2dlckFjdGlvbjtcblxuXHRcdGlmIChzVHJpZ2dlckFjdGlvbikge1xuXHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5leGVjdXRlQWN0aW9uKHNUcmlnZ2VyQWN0aW9uLCBvQ29udGV4dCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZVxuXHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0cywgb0NvbnRleHQpXG5cdFx0XHQudGhlbigoKSA9PiBmUmVzb2x2ZXIoKSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0dGhpcy5fYWRkRmFpbGVkU2lkZUVmZmVjdHMob1NpZGVFZmZlY3RzLCBvQ29udGV4dCk7XG5cdFx0XHRcdGZSZWplY3RvcihvRXJyb3IpO1xuXHRcdFx0fSk7XG5cblx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBTaWRlRWZmZWN0cyBjcmVhdGVkIGJ5IGEgY29udHJvbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gb0NvbnRyb2wgU0FQVUk1IENvbnRyb2xcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwdWJsaWMgcmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzKG9Db250cm9sOiBDb250cm9sKTogdm9pZCB7XG5cdFx0Y29uc3Qgc0NvbnRyb2xJZCA9IG9Db250cm9sICYmIG9Db250cm9sLmlzQSAmJiBvQ29udHJvbC5pc0EoXCJzYXAudWkuYmFzZS5NYW5hZ2VkT2JqZWN0XCIpICYmIG9Db250cm9sLmdldElkKCk7XG5cblx0XHRpZiAoc0NvbnRyb2xJZCkge1xuXHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5yZW1vdmVDb250cm9sU2lkZUVmZmVjdHMoc0NvbnRyb2xJZCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgU2lkZUVmZmVjdHMgdG8gdGhlIHF1ZXVlIG9mIHRoZSBmYWlsZWQgU2lkZUVmZmVjdHNcblx0ICogVGhlIFNpZGVFZmZlY3RzIHdpbGwgYmUgcmV0cmlnZ2VyZWQgb24gdGhlIG5leHQgY2hhbmdlIG9uIHRoZSBzYW1lIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfYWRkRmFpbGVkU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIG9TaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyB0aGF0IG5lZWQgdG8gYmUgcmV0cmlnZ2VyZWRcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgaGF2ZSBmYWlsZWRcblx0ICovXG5cdEBwcml2YXRlRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHJpdmF0ZSBfYWRkRmFpbGVkU2lkZUVmZmVjdHMob1NpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGUsIG9Db250ZXh0OiBDb250ZXh0KTogdm9pZCB7XG5cdFx0Y29uc3Qgc0NvbnRleHRQYXRoOiBzdHJpbmcgPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0gPSB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbc0NvbnRleHRQYXRoXSB8fCBbXTtcblx0XHRjb25zdCBiSXNOb3RBbHJlYWR5TGlzdGVkID0gdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0uZXZlcnkoXG5cdFx0XHQobUZhaWxlZFNpZGVFZmZlY3RzKSA9PiBvU2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lICE9PSBtRmFpbGVkU2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0KTtcblx0XHRpZiAoYklzTm90QWxyZWFkeUxpc3RlZCkge1xuXHRcdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0ucHVzaChvU2lkZUVmZmVjdHMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIHByb21pc2UgZm9yIHRoZSBmaWVsZCBncm91cCB0aGF0IGlzIHJlcXVpcmVkIGJlZm9yZSByZXF1ZXN0aW5nIFNpZGVFZmZlY3RzLlxuXHQgKiBJZiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCBhbmQgb25seSB0aGUgZmllbGQgcmVxdWlyZXMgdGhlIFNpZGVFZmZlY3RzIG9uIHRoaXMgY29udGV4dCwgdGhlIFNpZGVFZmZlY3RzIGFyZSByZW1vdmVkIGZyb20gdGhlXG5cdCAqIFNpZGVFZmZlY3RzIHF1ZXVlLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2Vcblx0ICogQHBhcmFtIG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdG8gYmUgdXNlZCBmb3IgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkXG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZUZpZWxkR3JvdXBQcm9taXNlKG1FdmVudEZpZWxkUHJvcGVydGllczogRmllbGRFdmVudFByb3BlcnR5VHlwZSk6IFByb21pc2U8YW55PiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cblx0XHRsZXQgYlByb21pc2VTdWNjZXNzID0gdHJ1ZTtcblx0XHRyZXR1cm4gbUV2ZW50RmllbGRQcm9wZXJ0aWVzLnByb21pc2Vcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIGJQcm9taXNlU3VjY2Vzcztcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRiUHJvbWlzZVN1Y2Nlc3MgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIGJQcm9taXNlU3VjY2Vzcztcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBOZWVkIHRvIHN0b3JlIHRoZSBzdGF0dXMgb2YgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoaXMgZmllbGQgZm9yIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdFx0XHRcdCAqIHNpbmNlIGFsbCBTb3VyY2VQcm9wZXJ0aWVzIGZvciB0aGlzIGtpbmQgb2YgU2lkZUVmZmVjdHMgbXVzdCBiZSB2YWxpZFxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGhhdC5fc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyhtRXZlbnRGaWVsZFByb3BlcnRpZXMuZmllbGQsIGJQcm9taXNlU3VjY2Vzcyk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIHByb21pc2UgZm9yIHRoZSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkIGJlZm9yZSByZXF1ZXN0aW5nIGltbWVkaWF0ZSBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2Vcblx0ICogQHBhcmFtIG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdG8gYmUgdXNlZCBmb3IgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkXG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvUHJvbWlzZSA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5wcm9taXNlO1xuXHRcdHJldHVybiBvUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogSWYgdGhlIGZpZWxkIGdldHMgYSBGaWVsZEhlbHBlciwgd2UgbmVlZCB0byB3YWl0IHVudGlsIGFsbCBmaWVsZHMgY2hhbmdlZCBieSB0aGlzIEZpZWxkSGVscGVyIGhhdmUgYmVlbiBzZXQuXG5cdFx0XHQgKiBUbyBhY2hpZXZlIHRoaXMsIHdlIGVuc3VyZSB0aGF0IGFsbCByZWxhdGVkIGJpbmRpbmdzIGhhdmUgYmVlbiByZXNvbHZlZC5cblx0XHRcdCAqXG5cdFx0XHQgKiBUaGlzIHJlc29sdXRpb24gcHJvY2VzcyBpcyBub3QgbWFuYWdlZCBieSB0aGUgRmllbGQgRXZlbnQgUHJvbWlzZSwgc28gZm9yIGZhc3QgdXNlciBhY3Rpb25zIChsaWtlIGF1dG9tYXRpb24pIGl0IGNhbiBsb2NrIHRoZSBtb2RlbFxuXHRcdFx0ICogYW5kIG5vIHJlcXVlc3QgY2FuIGJlIGV4ZWN1dGVkLlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBvRmllbGQgPSBtRXZlbnRGaWVsZFByb3BlcnRpZXMuZmllbGQ7XG5cdFx0XHRjb25zdCBzRmllbGRIZWxwZXJJZCA9IG9GaWVsZC5nZXRGaWVsZEhlbHAgJiYgb0ZpZWxkLmdldEZpZWxkSGVscCgpO1xuXHRcdFx0aWYgKHNGaWVsZEhlbHBlcklkKSB7XG5cdFx0XHRcdGNvbnN0IG9GaWx0ZXJIZWxwOiBhbnkgPSBDb3JlLmJ5SWQoc0ZpZWxkSGVscGVySWQpO1xuXHRcdFx0XHRpZiAob0ZpbHRlckhlbHAgJiYgb0ZpbHRlckhlbHAuZ2V0T3V0UGFyYW1ldGVycykge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdChvRmlsdGVySGVscC5nZXRPdXRQYXJhbWV0ZXJzKCkgYXMgYW55W10pLm1hcCgob091dFBhcmFtZXRlcikgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvQmluZGluZyA9IG9PdXRQYXJhbWV0ZXIuZ2V0QmluZGluZyhcInZhbHVlXCIpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb0JpbmRpbmcgPyBvQmluZGluZy5yZXF1ZXN0VmFsdWUoKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoW10pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyBhIHN0YXR1cyBpbmRleC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZVN0YXR1c0luZGV4XG5cdCAqIEBwYXJhbSBtRW50aXR5VHlwZSBUaGUgZW50aXR5IHR5cGVcblx0ICogQHBhcmFtIHNQcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIG9Db250ZXh0IFNBUFVJNSBDb250ZXh0XG5cdCAqIEByZXR1cm5zIEluZGV4XG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZVN0YXR1c0luZGV4KG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBzUHJvcGVydHlQYXRoOiBzdHJpbmcsIG9Db250ZXh0PzogQ29udGV4dCB8IG51bGwpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IG9Db250ZXh0Py5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgbVByb3BlcnR5ID0gbUVudGl0eVR5cGUucmVzb2x2ZVBhdGgoc1Byb3BlcnR5UGF0aCk7XG5cdFx0aWYgKG1Qcm9wZXJ0eSkge1xuXHRcdFx0aWYgKG1Qcm9wZXJ0eSAmJiBtUHJvcGVydHkuX3R5cGUgPT09IFwiUHJvcGVydHlcIikge1xuXHRcdFx0XHRyZXR1cm4gW21Qcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUsIHNDb250ZXh0UGF0aF0uam9pbihcIl9fXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIGNvbnRleHQgb24gd2hpY2ggU2lkZUVmZmVjdHMgY2FuIGJlIHJlcXVlc3RlZC5cblx0ICogVGhlIGNvcnJlY3Qgb25lIG11c3QgaGF2ZSB0aGUgYmluZGluZyBwYXJhbWV0ZXIgJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIG9Tb3VyY2VGaWVsZCBGaWVsZFxuXHQgKiBAcGFyYW0gc1NpZGVFZmZlY3RFbnRpdHlUeXBlIFRhcmdldCBlbnRpdHkgdHlwZSBvZiB0aGUgU2lkZUVmZmVjdHMgYW5ub3RhdGlvblxuXHQgKiBAcmV0dXJucyBTQVBVSTUgQ29udGV4dFxuXHQgKi9cblx0QHByaXZhdGVFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwcml2YXRlIF9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHMob1NvdXJjZUZpZWxkOiBGaWVsZENvbnRyb2wsIHNTaWRlRWZmZWN0RW50aXR5VHlwZTogc3RyaW5nKTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1NvdXJjZUZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0bGV0IG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgPSBvQmluZGluZ0NvbnRleHQsXG5cdFx0XHRzRW50aXR5VHlwZSA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9CaW5kaW5nQ29udGV4dCk7XG5cblx0XHRpZiAoc1NpZGVFZmZlY3RFbnRpdHlUeXBlICE9PSBzRW50aXR5VHlwZSkge1xuXHRcdFx0b0NvbnRleHRGb3JTaWRlRWZmZWN0cyA9IChvQmluZGluZ0NvbnRleHQgYXMgYW55KS5nZXRCaW5kaW5nKCkuZ2V0Q29udGV4dCgpO1xuXHRcdFx0aWYgKG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0c0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dEZvclNpZGVFZmZlY3RzKTtcblx0XHRcdFx0aWYgKHNTaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0XHRvQ29udGV4dEZvclNpZGVFZmZlY3RzID0gKG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgYXMgYW55KS5nZXRCaW5kaW5nKCkuZ2V0Q29udGV4dCgpO1xuXHRcdFx0XHRcdGlmIChvQ29udGV4dEZvclNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdFx0XHRzRW50aXR5VHlwZSA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMpO1xuXHRcdFx0XHRcdFx0aWYgKHNTaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb0NvbnRleHRGb3JTaWRlRWZmZWN0cyB8fCB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBFbnRpdHlUeXBlIGJhc2VkIG9uIGl0cyBmdWxseS1xdWFsaWZpZWQgbmFtZS5cblx0ICpcblx0ICogQHBhcmFtIHNGdWxseVF1YWxpZmllZE5hbWUgVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lXG5cdCAqIEByZXR1cm5zIFRoZSBlbnRpdHkgdHlwZVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RW50aXR5VHlwZUZyb21GUU4oc0Z1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nKTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuICh0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpIGFzIENvbnZlcnRlZE1ldGFkYXRhKS5lbnRpdHlUeXBlcy5maW5kKChvRW50aXR5VHlwZSkgPT4ge1xuXHRcdFx0cmV0dXJuIG9FbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSA9PT0gc0Z1bGx5UXVhbGlmaWVkTmFtZTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9taXNlIG9mIHRoZSBmaWVsZCB2YWxpZGF0aW9uIHRoYXQgaXMgcmVxdWlyZWQgZm9yIHRoZSBTaWRlRWZmZWN0cyBwcm9jZXNzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dldEZpZWxkUHJvbWlzZVxuXHQgKiBAcGFyYW0gb0V2ZW50IEZpZWxkIGNoYW5nZSBldmVudFxuXHQgKiBAcmV0dXJucyBGaWVsZCBwcm9taXNlXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRGaWVsZFByb21pc2Uob0V2ZW50OiBFdmVudCk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgcHJvbWlzZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJwcm9taXNlXCIpIHx8IFByb21pc2UucmVzb2x2ZSgpO1xuXG5cdFx0cmV0dXJuIHByb21pc2UudGhlbigoKSA9PiB7XG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0XHRpZiAoIUZpZWxkUnVudGltZS5nZXRGaWVsZFN0YXRlT25DaGFuZ2Uob0V2ZW50KS5zdGF0ZS52YWxpZGl0eSkge1xuXHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGZpZWxkIHRoYXQgYXJlIHJlcXVpcmVkIGZvciB0aGUgU2lkZUVmZmVjdHMgcHJvY2Vzcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRGaWVsZFByb3BlcnRpZXNcblx0ICogQHBhcmFtIG9FdmVudCBGaWVsZCBjaGFuZ2UgZXZlbnRcblx0ICogQHJldHVybnMgRmllbGQgcHJvcGVydGllcyAoZXZlbnQgY2hhbmdlIHByb21pc2UsIGZpZWxkLCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIHRoaXMgZmllbGQpXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRGaWVsZFByb3BlcnRpZXMob0V2ZW50OiBFdmVudCk6IEZpZWxkRXZlbnRQcm9wZXJ0eVR5cGUge1xuXHRcdGNvbnN0IG9GaWVsZDogRmllbGRDb250cm9sID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIEZpZWxkQ29udHJvbDtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRwcm9taXNlOiB0aGlzLl9nZXRGaWVsZFByb21pc2Uob0V2ZW50KSxcblx0XHRcdGZpZWxkOiBvRmllbGQsXG5cdFx0XHRzaWRlRWZmZWN0c01hcDogdGhpcy5fZ2V0RmllbGRTaWRlRWZmZWN0c01hcChvRmllbGQpXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyBtYXBcblx0ICogVGhlc2UgU2lkZUVmZmVjdHMgYXJlXG5cdCAqIC0gbGlzdGVkIGludG8gRmllbGRHcm91cElkcyAoY29taW5nIGZyb20gYW4gT0RhdGEgU2VydmljZSlcblx0ICogLSBnZW5lcmF0ZWQgYnkgYSBjb250cm9sIG9yIGNvbnRyb2xzIGFuZCB0aGF0IGNvbmZpZ3VyZSB0aGlzIGZpZWxkIGFzIFNvdXJjZVByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0RmllbGRTaWRlRWZmZWN0c01hcFxuXHQgKiBAcGFyYW0gb0ZpZWxkIEZpZWxkXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIG1hcFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RmllbGRTaWRlRWZmZWN0c01hcChvRmllbGQ6IEZpZWxkQ29udHJvbCk6IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdGNvbnN0IG1TaWRlRWZmZWN0c01hcDogRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IHt9LFxuXHRcdFx0YUZpZWxkR3JvdXBJZHM6IHN0cmluZ1tdID0gb0ZpZWxkLmdldEZpZWxkR3JvdXBJZHMoKSxcblx0XHRcdHNWaWV3RW50aXR5U2V0U2V0TmFtZSA9IHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCkuZW50aXR5U2V0LFxuXHRcdFx0b1ZpZXdFbnRpdHlTZXQgPSAodGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKSBhcyBDb252ZXJ0ZWRNZXRhZGF0YSkuZW50aXR5U2V0cy5maW5kKChvRW50aXR5U2V0KSA9PiB7XG5cdFx0XHRcdHJldHVybiBvRW50aXR5U2V0Lm5hbWUgPT09IHNWaWV3RW50aXR5U2V0U2V0TmFtZTtcblx0XHRcdH0pO1xuXG5cdFx0Ly8gU2lkZUVmZmVjdHMgY29taW5nIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHRcdGFGaWVsZEdyb3VwSWRzLmZvckVhY2goKHNGaWVsZEdyb3VwSWQpID0+IHtcblx0XHRcdGNvbnN0IGJJc0ltbWVkaWF0ZTogYm9vbGVhbiA9IHNGaWVsZEdyb3VwSWQuaW5kZXhPZihcIiQkSW1tZWRpYXRlUmVxdWVzdFwiKSAhPT0gLTEsXG5cdFx0XHRcdHNOYW1lOiBzdHJpbmcgPSBzRmllbGRHcm91cElkLnJlcGxhY2UoXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiwgXCJcIiksXG5cdFx0XHRcdGFTaWRlRWZmZWN0UGFydHM6IHN0cmluZ1tdID0gc05hbWUuc3BsaXQoXCIjXCIpLFxuXHRcdFx0XHRzU2lkZUVmZmVjdEVudGl0eVR5cGU6IHN0cmluZyA9IGFTaWRlRWZmZWN0UGFydHNbMF0sXG5cdFx0XHRcdHNTaWRlRWZmZWN0UGF0aDogc3RyaW5nID0gYCR7c1NpZGVFZmZlY3RFbnRpdHlUeXBlfUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2lkZUVmZmVjdHMke1xuXHRcdFx0XHRcdGFTaWRlRWZmZWN0UGFydHMubGVuZ3RoID09PSAyID8gYCMke2FTaWRlRWZmZWN0UGFydHNbMV19YCA6IFwiXCJcblx0XHRcdFx0fWAsXG5cdFx0XHRcdG9TaWRlRWZmZWN0OiBTaWRlRWZmZWN0c1R5cGUgfCB1bmRlZmluZWQgPVxuXHRcdFx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhzU2lkZUVmZmVjdEVudGl0eVR5cGUpPy5bc1NpZGVFZmZlY3RQYXRoXSxcblx0XHRcdFx0b0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSB0aGlzLl9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHMob0ZpZWxkLCBzU2lkZUVmZmVjdEVudGl0eVR5cGUpO1xuXHRcdFx0aWYgKG9TaWRlRWZmZWN0ICYmIG9Db250ZXh0KSB7XG5cdFx0XHRcdG1TaWRlRWZmZWN0c01hcFtzTmFtZV0gPSB7XG5cdFx0XHRcdFx0bmFtZTogc05hbWUsXG5cdFx0XHRcdFx0aW1tZWRpYXRlOiBiSXNJbW1lZGlhdGUsXG5cdFx0XHRcdFx0c2lkZUVmZmVjdHM6IG9TaWRlRWZmZWN0LFxuXHRcdFx0XHRcdGNvbnRleHQ6IG9Db250ZXh0XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvL1NpZGVFZmZlY3RzIGNvbWluZyBmcm9tIGNvbnRyb2wocylcblx0XHRpZiAoc1ZpZXdFbnRpdHlTZXRTZXROYW1lICYmIG9WaWV3RW50aXR5U2V0KSB7XG5cdFx0XHRjb25zdCBzVmlld0VudGl0eVR5cGUgPSBvVmlld0VudGl0eVNldC5lbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0bUZpZWxkUGF0aDogYW55ID0gKG9GaWVsZC5nZXRBZ2dyZWdhdGlvbihcImN1c3RvbURhdGFcIikgYXMgYW55W10pLmZpbmQoKG9DdXN0b21EYXRhKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIG9DdXN0b21EYXRhLmdldEtleSgpID09PSBcInNvdXJjZVBhdGhcIjtcblx0XHRcdFx0fSksXG5cdFx0XHRcdG9Db250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkID0gdGhpcy5fZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzKG9GaWVsZCwgc1ZpZXdFbnRpdHlUeXBlKTtcblxuXHRcdFx0aWYgKG1GaWVsZFBhdGggJiYgb0NvbnRleHQpIHtcblx0XHRcdFx0Y29uc3Qgc0ZpZWxkUGF0aCA9IG1GaWVsZFBhdGguZ2V0VmFsdWUoKS5yZXBsYWNlKGAvJHtzVmlld0VudGl0eVNldFNldE5hbWV9L2AsIFwiXCIpLFxuXHRcdFx0XHRcdG1Db250cm9sRW50aXR5VHlwZSA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0Q29udHJvbEVudGl0eVNpZGVFZmZlY3RzKFxuXHRcdFx0XHRcdFx0c1ZpZXdFbnRpdHlUeXBlXG5cdFx0XHRcdFx0KSBhcyBDb250cm9sU2lkZUVmZmVjdHNFbnRpdHlEaWN0aW9uYXJ5O1xuXHRcdFx0XHRPYmplY3Qua2V5cyhtQ29udHJvbEVudGl0eVR5cGUpLmZvckVhY2goKHNDb250cm9sTmFtZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9Db250cm9sU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSA9IG1Db250cm9sRW50aXR5VHlwZVtzQ29udHJvbE5hbWVdO1xuXHRcdFx0XHRcdGlmIChvQ29udHJvbFNpZGVFZmZlY3RzLlNvdXJjZVByb3BlcnRpZXMuaW5jbHVkZXMoc0ZpZWxkUGF0aCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNOYW1lID0gYCR7c0NvbnRyb2xOYW1lfTo6JHtzVmlld0VudGl0eVR5cGV9YDtcblx0XHRcdFx0XHRcdG1TaWRlRWZmZWN0c01hcFtzTmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRcdG5hbWU6IHNOYW1lLFxuXHRcdFx0XHRcdFx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvQ29udHJvbFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0OiBvQ29udGV4dFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbVNpZGVFZmZlY3RzTWFwO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgdGhlIFNpZGVFZmZlY3RzIHdpdGggcmVsYXRlZCBjaGFuZ2VzIHRvIGEgZmllbGRcblx0ICogTGlzdDogZ2V0cyBpbW1lZGlhdGUgU2lkZUVmZmVjdHMgcmVxdWVzdHNcblx0ICogUmVnaXN0ZXI6IGNhY2hlcyBkZWZlcnJlZCBTaWRlRWZmZWN0cyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgRmllbGRHcm91cCBpcyB1bmZvY3VzZWQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfaW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBldmVudCBwcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBvRmllbGRHcm91cFByZVJlcXVpc2l0ZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZCBiZWZvcmUgZXhlY3V0aW5nIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdCAqIEByZXR1cm5zICBBcnJheSBvZiBpbW1lZGlhdGUgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzKFxuXHRcdG1FdmVudEZpZWxkUHJvcGVydGllczogRmllbGRFdmVudFByb3BlcnR5VHlwZSxcblx0XHRvRmllbGRHcm91cFByZVJlcXVpc2l0ZT86IFByb21pc2U8YW55PlxuXHQpOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSB7XG5cdFx0Y29uc3QgbUZpZWxkU2lkZUVmZmVjdHNNYXAgPSBtRXZlbnRGaWVsZFByb3BlcnRpZXMuc2lkZUVmZmVjdHNNYXAsXG5cdFx0XHRvRmllbGRQcm9taXNlRm9yRmllbGRHcm91cCA9IHRoaXMuX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzKSwgLy8gUHJvbWlzZSBtYW5hZ2luZyBGaWVsZEdyb3VwIHJlcXVlc3RzIGlmIEZpZWxkIHByb21pc2UgZmFpbHNcblx0XHRcdG1GYWlsZWRTaWRlRWZmZWN0c05hbWU6IGFueSA9IHt9LFxuXHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllczogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlW10gPSBbXTtcblxuXHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlID0gb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0XHRPYmplY3Qua2V5cyhtRmllbGRTaWRlRWZmZWN0c01hcCkuZm9yRWFjaCgoc1NpZGVFZmZlY3ROYW1lKSA9PiB7XG5cdFx0XHRjb25zdCBvU2lkZUVmZmVjdFByb3BlcnR5OiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUgPSBtRmllbGRTaWRlRWZmZWN0c01hcFtzU2lkZUVmZmVjdE5hbWVdLFxuXHRcdFx0XHRzU2lkZUVmZmVjdENvbnRleHRQYXRoID0gb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0YUZhaWxlZFNpZGVFZmZlY3RzID0gdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdO1xuXG5cdFx0XHQvLyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgcHJldmlvdXNseSBmYWlsZWQgcmVxdWVzdCBmb3IgdGhpcyBjb250ZXh0XG5cdFx0XHRpZiAoYUZhaWxlZFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbc1NpZGVFZmZlY3RDb250ZXh0UGF0aF07XG5cdFx0XHRcdG1GYWlsZWRTaWRlRWZmZWN0c05hbWVbc1NpZGVFZmZlY3RDb250ZXh0UGF0aF0gPSB7fTtcblx0XHRcdFx0YUZhaWxlZFNpZGVFZmZlY3RzLmZvckVhY2goKG1GYWlsZWRTaWRlRWZmZWN0cykgPT4ge1xuXHRcdFx0XHRcdG1GYWlsZWRTaWRlRWZmZWN0c05hbWVbc1NpZGVFZmZlY3RDb250ZXh0UGF0aF1bbUZhaWxlZFNpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB0cnVlO1xuXHRcdFx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRuYW1lOiBzU2lkZUVmZmVjdE5hbWUsXG5cdFx0XHRcdFx0XHRwcmV2aW91c2x5RmFpbGVkOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2lkZUVmZmVjdHM6IG1GYWlsZWRTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdGNvbnRleHQ6IG9TaWRlRWZmZWN0UHJvcGVydHkuY29udGV4dFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmIChvU2lkZUVmZmVjdFByb3BlcnR5LmltbWVkaWF0ZSkge1xuXHRcdFx0XHQvLyBTaWRlRWZmZWN0cyB3aWxsIGJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGFmdGVyIGV2ZW50IHByb21pc2UgdmFsaWRhdGlvblxuXHRcdFx0XHRpZiAoIW1GYWlsZWRTaWRlRWZmZWN0c05hbWVbc1NpZGVFZmZlY3RDb250ZXh0UGF0aF0/LltvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZV0pIHtcblx0XHRcdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzLnB1c2goe1xuXHRcdFx0XHRcdFx0bmFtZTogc1NpZGVFZmZlY3ROYW1lLFxuXHRcdFx0XHRcdFx0c2lkZUVmZmVjdHM6IG9TaWRlRWZmZWN0UHJvcGVydHkuc2lkZUVmZmVjdHMsXG5cdFx0XHRcdFx0XHRjb250ZXh0OiBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHRcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gQWRkIGRlZmVycmVkIFNpZGVFZmZlY3RzIHRvIHRoZSByZWxhdGVkIGRpY3Rpb25hcnlcblx0XHRcdFx0dGhpcy5fbUZpZWxkR3JvdXBRdWV1ZVtzU2lkZUVmZmVjdE5hbWVdID0gdGhpcy5fbUZpZWxkR3JvdXBRdWV1ZVtzU2lkZUVmZmVjdE5hbWVdIHx8IHt9O1xuXHRcdFx0XHRjb25zdCBtU2lkZUVmZmVjdENvbnRleHRQYXRoID0gdGhpcy5fbUZpZWxkR3JvdXBRdWV1ZVtzU2lkZUVmZmVjdE5hbWVdW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdIHx8IHtcblx0XHRcdFx0XHRwcm9taXNlczogW10sXG5cdFx0XHRcdFx0c2lkZUVmZmVjdFByb3BlcnR5OiBvU2lkZUVmZmVjdFByb3BlcnR5LFxuXHRcdFx0XHRcdHByb2Nlc3NTdGFydGVkOiBmYWxzZVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRtU2lkZUVmZmVjdENvbnRleHRQYXRoLnByb21pc2VzID0gbVNpZGVFZmZlY3RDb250ZXh0UGF0aC5wcm9taXNlcy5jb25jYXQoW1xuXHRcdFx0XHRcdG9GaWVsZFByb21pc2VGb3JGaWVsZEdyb3VwLFxuXHRcdFx0XHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlIGFzIFByb21pc2U8YW55PlxuXHRcdFx0XHRdKTtcblx0XHRcdFx0dGhpcy5fbUZpZWxkR3JvdXBRdWV1ZVtzU2lkZUVmZmVjdE5hbWVdW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdID0gbVNpZGVFZmZlY3RDb250ZXh0UGF0aDtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gYUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlcyB0aGUgdmFsaWRhdGlvbiBzdGF0dXMgb2YgcHJvcGVydGllcyByZWxhdGVkIHRvIGEgZmllbGQgY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIG9GaWVsZCBGaWVsZFxuXHQgKiBAcGFyYW0gYlN1Y2Nlc3MgU3RhdHVzIG9mIHRoZSBmaWVsZCB2YWxpZGF0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9zYXZlRmllbGRQcm9wZXJ0aWVzU3RhdHVzKG9GaWVsZDogRmllbGRDb250cm9sLCBiU3VjY2VzczogYm9vbGVhbik6IHZvaWQge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9GaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IHNFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0JpbmRpbmdDb250ZXh0KTtcblx0XHRjb25zdCBtRW50aXR5VHlwZSA9IHRoaXMuX2dldEVudGl0eVR5cGVGcm9tRlFOKHNFbnRpdHlUeXBlKTtcblx0XHRpZiAobUVudGl0eVR5cGUpIHtcblx0XHRcdC8vIFJldHJpZXZlcyBhbGwgcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBmaWVsZFxuXHRcdFx0Y29uc3Qgb0ZpZWxkQmluZGluZzogYW55ID0gdGhpcy5fZ2V0QmluZGluZ0ZvckZpZWxkKG9GaWVsZCk7XG5cdFx0XHRjb25zdCBhRmllbGRQYXRocyA9IG9GaWVsZEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLkNvbXBvc2l0ZUJpbmRpbmdcIilcblx0XHRcdFx0PyAob0ZpZWxkQmluZGluZy5nZXRCaW5kaW5ncygpIHx8IFtdKS5tYXAoKG9CaW5kaW5nOiBhbnkpID0+IG9CaW5kaW5nLnNQYXRoKVxuXHRcdFx0XHQ6IFtvRmllbGRCaW5kaW5nLmdldFBhdGgoKV07XG5cblx0XHRcdC8vIFN0b3JlcyBzdGF0dXMgZm9yIGFsbCBwcm9wZXJ0aWVzXG5cdFx0XHRhRmllbGRQYXRocy5mb3JFYWNoKChzRmllbGRQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0Y29uc3Qgc0lkID0gdGhpcy5fZ2VuZXJhdGVTdGF0dXNJbmRleChtRW50aXR5VHlwZSwgc0ZpZWxkUGF0aCwgb0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0aWYgKHNJZCkge1xuXHRcdFx0XHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZVtiU3VjY2VzcyA/IFwiZGVsZXRlXCIgOiBcImFkZFwiXShzSWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBwcm9wZXJ0eSBiaW5kaW5nIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRmllbGQgRmllbGRcblx0ICogQHJldHVybnMgIEJpbmRpbmcgdG8gdGhlIHZhbHVlXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRCaW5kaW5nRm9yRmllbGQob0ZpZWxkOiBGaWVsZENvbnRyb2wpOiBCaW5kaW5nIHtcblx0XHRsZXQgc0JpbmRpbmdOYW1lID0gXCJ2YWx1ZVwiO1xuXHRcdGlmIChvRmllbGQuaXNBKFwic2FwLm0uQ2hlY2tCb3hcIikpIHtcblx0XHRcdHNCaW5kaW5nTmFtZSA9IFwic2VsZWN0ZWRcIjtcblx0XHR9IGVsc2UgaWYgKG9GaWVsZC5pc0EoXCJzYXAuZmUuY29yZS5jb250cm9scy5GaWxlV3JhcHBlclwiKSkge1xuXHRcdFx0c0JpbmRpbmdOYW1lID0gXCJ1cGxvYWRVcmxcIjtcblx0XHR9XG5cdFx0cmV0dXJuIG9GaWVsZC5nZXRCaW5kaW5nKHNCaW5kaW5nTmFtZSk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uO1xuIl19
|
|
725
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb24iLCJkZWZpbmVVSTVDbGFzcyIsIm1ldGhvZE92ZXJyaWRlIiwicHVibGljRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJwcml2YXRlRXh0ZW5zaW9uIiwib25Jbml0IiwiX29WaWV3IiwiYmFzZSIsImdldFZpZXciLCJfb0FwcENvbXBvbmVudCIsIkNvbW1vblV0aWxzIiwiZ2V0QXBwQ29tcG9uZW50IiwiX29TaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJfbUZpZWxkR3JvdXBRdWV1ZSIsIl9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUiLCJTZXQiLCJfbUZhaWxlZFNpZGVFZmZlY3RzIiwiY2xlYXJQcm9wZXJ0aWVzU3RhdHVzIiwiY2xlYXIiLCJnZXRSZWdpc3RlcmVkRmFpbGVkUmVxdWVzdHMiLCJkZWxldGVGYWlsZWRSZXF1ZXN0c0ZvckFDb250ZXh0IiwiY29udGV4dFBhdGgiLCJoYW5kbGVGaWVsZENoYW5nZSIsIm9FdmVudCIsIm9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlIiwibUV2ZW50RmllbGRQcm9wZXJ0aWVzIiwiX2dldEZpZWxkUHJvcGVydGllcyIsImFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMiLCJfaW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHMiLCJiSXNJbW1lZGlhdGVUcmlnZ2VyZWQiLCJfZ2VuZXJhdGVJbW1lZGlhdGVQcm9taXNlIiwidGhlbiIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJtU2lkZUVmZmVjdHNQcm9wZXJ0eSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInNpZGVFZmZlY3RzIiwiY29udGV4dCIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZGVidWciLCJmaWx0ZXIiLCJtSW1tZWRpYXRlU2lkZUVmZmVjdHMiLCJwcmV2aW91c2x5RmFpbGVkIiwiZm9yRWFjaCIsIl9hZGRGYWlsZWRTaWRlRWZmZWN0cyIsImhhbmRsZUZpZWxkR3JvdXBDaGFuZ2UiLCJ0aGF0IiwiYURlZmVycmVkU2lkZUVmZmVjdHMiLCJhRmllbGRHcm91cElkcyIsImdldFBhcmFtZXRlciIsImdldEZpZWxkR3JvdXBSZXF1ZXN0UHJvbWlzZSIsIm9EZWZlcnJlZFNpZGVFZmZlY3QiLCJiSXNSZXF1ZXN0c1RyaWdnZXJlZCIsIm9TaWRlRWZmZWN0UHJvcGVydHkiLCJzaWRlRWZmZWN0UHJvcGVydHkiLCJvQ29udGV4dCIsInNDb250ZXh0UGF0aCIsImdldFBhdGgiLCJzRW50aXR5VHlwZSIsImdldEVudGl0eVR5cGVGcm9tQ29udGV4dCIsIm1FbnRpdHlUeXBlIiwiX2dldEVudGl0eVR5cGVGcm9tRlFOIiwicHJvbWlzZXMiLCJTb3VyY2VQcm9wZXJ0aWVzIiwiZXZlcnkiLCJzb3VyY2VQcm9wZXJ0eSIsInR5cGUiLCJzSWQiLCJfZ2VuZXJhdGVTdGF0dXNJbmRleCIsInZhbHVlIiwiaGFzIiwiZmluYWxseSIsIm5hbWUiLCJzRmllbGRHcm91cElkIiwic1NpZGVFZmZlY3ROYW1lIiwicmVwbGFjZSIsIm1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0cyIsIk9iamVjdCIsImtleXMiLCJwcm9jZXNzU3RhcnRlZCIsInB1c2giLCJhZGRDb250cm9sU2lkZUVmZmVjdHMiLCJvU2lkZUVmZmVjdHMiLCJyZW1vdmVGYWlsZWRTaWRlRWZmZWN0cyIsImdyb3VwSWQiLCJmbkdldFRhcmdldHMiLCJzVHJpZ2dlckFjdGlvbiIsImV4ZWN1dGVBY3Rpb24iLCJhVGFyZ2V0cyIsImxlbmd0aCIsInJlamVjdCIsInJlc29sdmUiLCJ0YXJnZXRzQW5kQWN0aW9uRGF0YSIsIlRhcmdldEVudGl0aWVzIiwiY29uY2F0IiwiVGFyZ2V0UHJvcGVydGllcyIsIlRyaWdnZXJBY3Rpb24iLCJyZW1vdmVDb250cm9sU2lkZUVmZmVjdHMiLCJvQ29udHJvbCIsInNDb250cm9sSWQiLCJpc0EiLCJnZXRJZCIsImJJc05vdEFscmVhZHlMaXN0ZWQiLCJtRmFpbGVkU2lkZUVmZmVjdHMiLCJmdWxseVF1YWxpZmllZE5hbWUiLCJfZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZSIsImJQcm9taXNlU3VjY2VzcyIsInByb21pc2UiLCJfc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyIsImZpZWxkIiwib1Byb21pc2UiLCJvRmllbGQiLCJzRmllbGRIZWxwZXJJZCIsImdldEZpZWxkSGVscCIsIm9GaWx0ZXJIZWxwIiwiQ29yZSIsImJ5SWQiLCJnZXRPdXRQYXJhbWV0ZXJzIiwib091dFBhcmFtZXRlciIsIm9CaW5kaW5nIiwiZ2V0QmluZGluZyIsInJlcXVlc3RWYWx1ZSIsInNQcm9wZXJ0eVBhdGgiLCJtUHJvcGVydHkiLCJyZXNvbHZlUGF0aCIsIl90eXBlIiwiam9pbiIsInVuZGVmaW5lZCIsImdldENvbnRleHRGb3JTaWRlRWZmZWN0cyIsIm9CaW5kaW5nQ29udGV4dCIsInNTaWRlRWZmZWN0RW50aXR5VHlwZSIsIm9Db250ZXh0Rm9yU2lkZUVmZmVjdHMiLCJnZXRDb250ZXh0Iiwic0Z1bGx5UXVhbGlmaWVkTmFtZSIsImdldENvbnZlcnRlZE1ldGFNb2RlbCIsImVudGl0eVR5cGVzIiwiZmluZCIsIm9FbnRpdHlUeXBlIiwiX2dldEZpZWxkUHJvbWlzZSIsInZhbGlkaXR5IiwiRmllbGRSdW50aW1lIiwiZ2V0RmllbGRTdGF0ZU9uQ2hhbmdlIiwic3RhdGUiLCJnZXRTb3VyY2UiLCJzaWRlRWZmZWN0c01hcCIsIl9nZXRGaWVsZFNpZGVFZmZlY3RzTWFwIiwibVNpZGVFZmZlY3RzTWFwIiwiZ2V0RmllbGRHcm91cElkcyIsInNWaWV3RW50aXR5U2V0U2V0TmFtZSIsImdldFZpZXdEYXRhIiwiZW50aXR5U2V0Iiwib1ZpZXdFbnRpdHlTZXQiLCJlbnRpdHlTZXRzIiwib0VudGl0eVNldCIsImdlbmVyYXRlU2lkZUVmZmVjdHNNYXBGcm9tU2lkZUVmZmVjdElkIiwic1ZpZXdFbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsIm1GaWVsZFBhdGgiLCJnZXRBZ2dyZWdhdGlvbiIsIm9DdXN0b21EYXRhIiwiZ2V0S2V5IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJzRmllbGRQYXRoIiwiZ2V0VmFsdWUiLCJtQ29udHJvbEVudGl0eVR5cGUiLCJnZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHMiLCJzQ29udHJvbE5hbWUiLCJvQ29udHJvbFNpZGVFZmZlY3RzIiwiaW5jbHVkZXMiLCJzTmFtZSIsImltbWVkaWF0ZSIsIl9nZXREYXRhVG9HZW5lcmF0ZVNpZGVFZmZlY3RzTWFwRnJvbVNpZGVFZmZlY3RJZCIsImJJc0ltbWVkaWF0ZSIsImluZGV4T2YiLCJhU2lkZUVmZmVjdFBhcnRzIiwic3BsaXQiLCJzU2lkZUVmZmVjdFBhdGgiLCJvU2lkZUVmZmVjdCIsImdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJtRmllbGRTaWRlRWZmZWN0c01hcCIsIm9GaWVsZFByb21pc2VGb3JGaWVsZEdyb3VwIiwibUZhaWxlZFNpZGVFZmZlY3RzTmFtZSIsInNTaWRlRWZmZWN0Q29udGV4dFBhdGgiLCJhRmFpbGVkU2lkZUVmZmVjdHMiLCJtU2lkZUVmZmVjdENvbnRleHRQYXRoIiwiYlN1Y2Nlc3MiLCJvRmllbGRCaW5kaW5nIiwiX2dldEJpbmRpbmdGb3JGaWVsZCIsImFGaWVsZFBhdGhzIiwiZ2V0QmluZGluZ3MiLCJzUGF0aCIsInNCaW5kaW5nTmFtZSIsIkNvbnRyb2xsZXJFeHRlbnNpb24iXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29udmVydGVkTWV0YWRhdGEsIEVudGl0eVR5cGUsIFByb3BlcnR5UGF0aCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUge1xuXHRDb250cm9sU2lkZUVmZmVjdHNFbnRpdHlEaWN0aW9uYXJ5LFxuXHRDb250cm9sU2lkZUVmZmVjdHNUeXBlLFxuXHRPRGF0YVNpZGVFZmZlY3RzVHlwZSxcblx0U2lkZUVmZmVjdHNUeXBlXG59IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgRmllbGRSdW50aW1lIGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkUnVudGltZVwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwiLi4vQ29tbW9uVXRpbHNcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBmaW5hbEV4dGVuc2lvbiwgbWV0aG9kT3ZlcnJpZGUsIHByaXZhdGVFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiB9IGZyb20gXCIuLi9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuXG50eXBlIEZpZWxkQ29udHJvbCA9IENvbnRyb2wgJiB7XG5cdGdldEZpZWxkSGVscCgpOiBzdHJpbmc7XG5cdGdldEZpZWxkR3JvdXBJZHMoKTogc3RyaW5nW107XG59O1xuXG50eXBlIEZpZWxkRXZlbnRQcm9wZXJ0eVR5cGUgPSB7XG5cdHByb21pc2U6IFByb21pc2U8YW55Pjtcblx0ZmllbGQ6IEZpZWxkQ29udHJvbDtcblx0c2lkZUVmZmVjdHNNYXA6IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnk7XG59O1xuXG50eXBlIEJhc2VTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0ge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGltbWVkaWF0ZT86IGJvb2xlYW47XG5cdHNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGU7XG5cdHByZXZpb3VzbHlGYWlsZWQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgTWFzc0VkaXRGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUgPSBCYXNlU2lkZUVmZmVjdFByb3BlcnR5VHlwZTtcblxuZXhwb3J0IHR5cGUgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0gQmFzZVNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUgJiB7XG5cdGNvbnRleHQ6IENvbnRleHQ7XG59O1xuXG50eXBlIEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU+O1xuXG50eXBlIE1hc3NFZGl0RmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIE1hc3NFZGl0RmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlPjtcblxudHlwZSBGYWlsZWRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RzVHlwZVtdPjtcblxudHlwZSBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGUgPSB7XG5cdHByb21pc2VzOiBQcm9taXNlPGFueT5bXTtcblx0c2lkZUVmZmVjdFByb3BlcnR5OiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU7XG5cdHByb2Nlc3NTdGFydGVkPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgRmllbGRHcm91cFF1ZXVlTWFwVHlwZSA9IHtcblx0W3NpZGVFZmZlY3ROYW1lOiBzdHJpbmddOiB7XG5cdFx0W2NvbnRleHRQYXRoOiBzdHJpbmddOiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGU7XG5cdH07XG59O1xuXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5TaWRlRWZmZWN0c1wiKVxuY2xhc3MgU2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uIGV4dGVuZHMgQ29udHJvbGxlckV4dGVuc2lvbiB7XG5cdHByaXZhdGUgX29WaWV3OiBhbnk7XG5cdHByaXZhdGUgX29BcHBDb21wb25lbnQhOiBBcHBDb21wb25lbnQ7XG5cdHByaXZhdGUgX21GaWVsZEdyb3VwUXVldWUhOiBGaWVsZEdyb3VwUXVldWVNYXBUeXBlO1xuXHRwcml2YXRlIF9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUhOiBTZXQ8c3RyaW5nPjtcblx0cHJpdmF0ZSBfb1NpZGVFZmZlY3RzU2VydmljZSE6IGFueTtcblx0cHJpdmF0ZSBfbUZhaWxlZFNpZGVFZmZlY3RzITogRmFpbGVkU2lkZUVmZmVjdERpY3Rpb25hcnk7XG5cblx0QG1ldGhvZE92ZXJyaWRlKClcblx0cHVibGljIG9uSW5pdCgpIHtcblx0XHR0aGlzLl9vVmlldyA9ICh0aGlzIGFzIGFueSkuYmFzZS5nZXRWaWV3KCk7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudCh0aGlzLl9vVmlldyk7XG5cdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZSA9ICh0aGlzLl9vQXBwQ29tcG9uZW50IGFzIGFueSkuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0dGhpcy5fbUZpZWxkR3JvdXBRdWV1ZSA9IHt9O1xuXHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZSA9IG5ldyBTZXQoKTtcblx0XHR0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHMgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhciByZWNvcmRlZCB2YWxpZGF0aW9uIHN0YXR1cyBmb3IgYWxsIHByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBjbGVhclByb3BlcnRpZXNTdGF0dXNcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwdWJsaWMgY2xlYXJQcm9wZXJ0aWVzU3RhdHVzKCk6IHZvaWQge1xuXHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZS5jbGVhcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgZmFpbGVkIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZ2V0UmVnaXN0ZXJlZEZhaWxlZFJlcXVlc3RzXG5cdCAqIEByZXR1cm5zIFJlZ2lzdGVyZWQgU2lkZUVmZmVjdHMgcmVxdWVzdHMgdGhhdCBoYXZlIGZhaWxlZFxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyBnZXRSZWdpc3RlcmVkRmFpbGVkUmVxdWVzdHMoKTogRmFpbGVkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdHJldHVybiB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHM7XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIGRlbGV0ZUZhaWxlZFJlcXVlc3RzRm9yQUNvbnRleHQoY29udGV4dFBhdGg6IHN0cmluZykge1xuXHRcdGRlbGV0ZSB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbY29udGV4dFBhdGhdO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgdGhlIHdvcmtmbG93IGZvciBTaWRlRWZmZWN0cyB3aXRoIHJlbGF0ZWQgY2hhbmdlcyB0byBhIGZpZWxkXG5cdCAqIFRoZSBmb2xsb3dpbmcgc2NlbmFyaW9zIGFyZSBtYW5hZ2VkOlxuXHQgKiAgLSBFeGVjdXRlOiB0cmlnZ2VycyBpbW1lZGlhdGUgU2lkZUVmZmVjdHMgcmVxdWVzdHMgaWYgdGhlIHByb21pc2UgZm9yIHRoZSBmaWVsZCBldmVudCBpcyBmdWxmaWxsZWRcblx0ICogIC0gUmVnaXN0ZXI6IGNhY2hlcyBkZWZlcnJlZCBTaWRlRWZmZWN0cyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgRmllbGRHcm91cCBpcyB1bmZvY3VzZWQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBoYW5kbGVGaWVsZENoYW5nZVxuXHQgKiBAcGFyYW0gb0V2ZW50IFNBUFVJNSBldmVudCB0aGF0IGNvbWVzIGZyb20gYSBmaWVsZCBjaGFuZ2Vcblx0ICogQHBhcmFtIG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkIGJlZm9yZSBleGVjdXRpbmcgZGVmZXJyZWQgU2lkZUVmZmVjdHNcblx0ICogQHJldHVybnMgIFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdChzKVxuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyBoYW5kbGVGaWVsZENoYW5nZShvRXZlbnQ6IEV2ZW50LCBvRmllbGRHcm91cFByZVJlcXVpc2l0ZT86IFByb21pc2U8YW55Pik6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgbUV2ZW50RmllbGRQcm9wZXJ0aWVzID0gdGhpcy5fZ2V0RmllbGRQcm9wZXJ0aWVzKG9FdmVudCksXG5cdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSA9IHRoaXMuX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzKFxuXHRcdFx0XHRtRXZlbnRGaWVsZFByb3BlcnRpZXMsXG5cdFx0XHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlXG5cdFx0XHQpO1xuXG5cdFx0bGV0IGJJc0ltbWVkaWF0ZVRyaWdnZXJlZCA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2dlbmVyYXRlSW1tZWRpYXRlUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXMpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGJJc0ltbWVkaWF0ZVRyaWdnZXJlZCA9IHRydWU7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzLm1hcCgobVNpZGVFZmZlY3RzUHJvcGVydHkpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhtU2lkZUVmZmVjdHNQcm9wZXJ0eS5zaWRlRWZmZWN0cywgbVNpZGVFZmZlY3RzUHJvcGVydHkuY29udGV4dCk7XG5cdFx0XHRcdFx0fSkgfHwgW11cblx0XHRcdFx0KTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goKG9FcnJvcikgPT4ge1xuXHRcdFx0XHRpZiAoYklzSW1tZWRpYXRlVHJpZ2dlcmVkKSB7XG5cdFx0XHRcdFx0TG9nLmRlYnVnKFwiRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBGaWVsZCBTaWRlRWZmZWN0c1wiLCBvRXJyb3IpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFNpZGVFZmZlY3RzIGhhdmUgbm90IGJlZW4gdHJpZ2dlcmVkIHNpbmNlIHByZVJlcXVpc2l0ZSB2YWxpZGF0aW9uIGZhaWxzIHNvIHdlIG5lZWRcblx0XHRcdFx0XHQgKiB0byBrZWVwIHByZXZpb3VzbHkgZmFpbGVkIHJlcXVlc3QgYXMgRmFpbGVkIHJlcXVlc3QgKHRvIGJlIHJldHJpZ2dlciBvbiBuZXh0IGNoYW5nZSlcblx0XHRcdFx0XHQgKi9cblxuXHRcdFx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXNcblx0XHRcdFx0XHRcdC5maWx0ZXIoKG1JbW1lZGlhdGVTaWRlRWZmZWN0cykgPT4gbUltbWVkaWF0ZVNpZGVFZmZlY3RzLnByZXZpb3VzbHlGYWlsZWQgPT09IHRydWUpXG5cdFx0XHRcdFx0XHQuZm9yRWFjaCgobUltbWVkaWF0ZVNpZGVFZmZlY3RzKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FkZEZhaWxlZFNpZGVFZmZlY3RzKG1JbW1lZGlhdGVTaWRlRWZmZWN0cy5zaWRlRWZmZWN0cywgbUltbWVkaWF0ZVNpZGVFZmZlY3RzLmNvbnRleHQpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgU2lkZUVmZmVjdHMgd2l0aCBhIHJlbGF0ZWQgJ2ZvY3VzIG91dCcgdG8gYSBmaWVsZCBncm91cC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGhhbmRsZUZpZWxkR3JvdXBDaGFuZ2Vcblx0ICogQHBhcmFtIG9FdmVudCBTQVBVSTUgRXZlbnRcblx0ICogQHJldHVybnMgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0KHMpXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIGhhbmRsZUZpZWxkR3JvdXBDaGFuZ2Uob0V2ZW50OiBFdmVudCk6IFByb21pc2U8YW55PiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMsXG5cdFx0XHRhRGVmZXJyZWRTaWRlRWZmZWN0czogRmllbGRHcm91cFNpZGVFZmZlY3RUeXBlW10gPSBbXSxcblx0XHRcdGFGaWVsZEdyb3VwSWRzOiBzdHJpbmdbXSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJmaWVsZEdyb3VwSWRzXCIpO1xuXG5cdFx0Y29uc3QgZ2V0RmllbGRHcm91cFJlcXVlc3RQcm9taXNlID0gZnVuY3Rpb24gKG9EZWZlcnJlZFNpZGVFZmZlY3Q6IEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZSkge1xuXHRcdFx0bGV0IGJJc1JlcXVlc3RzVHJpZ2dlcmVkID0gZmFsc2U7XG5cdFx0XHRjb25zdCBvU2lkZUVmZmVjdFByb3BlcnR5ID0gb0RlZmVycmVkU2lkZUVmZmVjdC5zaWRlRWZmZWN0UHJvcGVydHk7XG5cdFx0XHRjb25zdCBvQ29udGV4dCA9IG9TaWRlRWZmZWN0UHJvcGVydHkuY29udGV4dDtcblx0XHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRcdGNvbnN0IHNFbnRpdHlUeXBlID0gdGhhdC5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0NvbnRleHQpO1xuXHRcdFx0Y29uc3QgbUVudGl0eVR5cGUgPSB0aGF0Ll9nZXRFbnRpdHlUeXBlRnJvbUZRTihzRW50aXR5VHlwZSk7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChvRGVmZXJyZWRTaWRlRWZmZWN0LnByb21pc2VzKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0YklzUmVxdWVzdHNUcmlnZ2VyZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Ly9EZWZlcnJlZCBTaWRlRWZmZWN0cyBhcmUgZXhlY3V0ZWQgb25seSBpZiBhbGwgc291cmNlUHJvcGVydGllcyBoYXZlIG5vIHJlZ2lzdGVyZWQgZmFpbHVyZS5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRtRW50aXR5VHlwZSAmJlxuXHRcdFx0XHRcdFx0KG9TaWRlRWZmZWN0UHJvcGVydHkuc2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyBhcyBQcm9wZXJ0eVBhdGhbXSkuZXZlcnkoKHNvdXJjZVByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChzb3VyY2VQcm9wZXJ0eS50eXBlID09PSBcIlByb3BlcnR5UGF0aFwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc0lkID0gdGhhdC5fZ2VuZXJhdGVTdGF0dXNJbmRleChtRW50aXR5VHlwZSwgc291cmNlUHJvcGVydHkudmFsdWUsIG9Db250ZXh0KTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc0lkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gIXRoYXQuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZS5oYXMoc0lkKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoYXQucmVxdWVzdFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0UHJvcGVydHkuc2lkZUVmZmVjdHMsIG9TaWRlRWZmZWN0UHJvcGVydHkuY29udGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goKG9FcnJvcikgPT4ge1xuXHRcdFx0XHRcdGlmIChiSXNSZXF1ZXN0c1RyaWdnZXJlZCkge1xuXHRcdFx0XHRcdFx0TG9nLmRlYnVnKGBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIEZpZWxkR3JvdXAgU2lkZUVmZmVjdHMgb24gY29udGV4dCAke3NDb250ZXh0UGF0aH1gLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSlcblx0XHRcdFx0LmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGF0Ll9tRmllbGRHcm91cFF1ZXVlW29TaWRlRWZmZWN0UHJvcGVydHkubmFtZV1bc0NvbnRleHRQYXRoXTtcblx0XHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdGFGaWVsZEdyb3VwSWRzLmZvckVhY2goKHNGaWVsZEdyb3VwSWQpID0+IHtcblx0XHRcdC8qKlxuXHRcdFx0ICogc3RyaW5nIFwiJCRJbW1lZGlhdGVSZXF1ZXN0XCIgaXMgYWRkZWQgdG8gdGhlIFNpZGVFZmZlY3RzIG5hbWUgZHVyaW5nIHRlbXBsYXRpbmcgdG8ga25vd1xuXHRcdFx0ICogaWYgdGhpcyBTaWRlRWZmZWN0cyBtdXN0IGJlIGltbWVkaWF0ZWx5IGV4ZWN1dGVkIHJlcXVlc3RlZCAob24gZmllbGQgY2hhbmdlKSBvciBtdXN0XG5cdFx0XHQgKiBiZSBkZWZlcnJlZCAob24gZmllbGQgZ3JvdXAgZm9jdXMgb3V0KVxuXHRcdFx0ICpcblx0XHRcdCAqL1xuXHRcdFx0Y29uc3Qgc1NpZGVFZmZlY3ROYW1lOiBzdHJpbmcgPSBzRmllbGRHcm91cElkLnJlcGxhY2UoXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiwgXCJcIik7XG5cdFx0XHRjb25zdCBtQ29udGV4dERlZmVycmVkU2lkZUVmZmVjdHMgPSB0aGF0Ll9tRmllbGRHcm91cFF1ZXVlPy5bc1NpZGVFZmZlY3ROYW1lXTtcblx0XHRcdGlmIChtQ29udGV4dERlZmVycmVkU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0T2JqZWN0LmtleXMobUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzKS5mb3JFYWNoKChzQ29udGV4dFBhdGgpID0+IHtcblx0XHRcdFx0XHRjb25zdCBvRGVmZXJyZWRTaWRlRWZmZWN0ID0gbUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF07XG5cdFx0XHRcdFx0aWYgKCFvRGVmZXJyZWRTaWRlRWZmZWN0LnByb2Nlc3NTdGFydGVkKSB7XG5cdFx0XHRcdFx0XHRvRGVmZXJyZWRTaWRlRWZmZWN0LnByb2Nlc3NTdGFydGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzLnB1c2gob0RlZmVycmVkU2lkZUVmZmVjdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzLm1hcCgob0RlZmVycmVkU2lkZUVmZmVjdCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gZ2V0RmllbGRHcm91cFJlcXVlc3RQcm9taXNlKG9EZWZlcnJlZFNpZGVFZmZlY3QpO1xuXHRcdFx0fSlcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBTaWRlRWZmZWN0cyBjb250cm9sLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgYWRkQ29udHJvbFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBzRW50aXR5VHlwZSBOYW1lIG9mIHRoZSBlbnRpdHkgd2hlcmUgdGhlIFNpZGVFZmZlY3RzIGNvbnRyb2wgd2lsbCBiZSByZWdpc3RlcmVkXG5cdCAqIEBwYXJhbSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgdG8gcmVnaXN0ZXIuIEVuc3VyZSB0aGUgc291cmNlQ29udHJvbElkIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgU0FQVUk1IGNvbnRyb2wgSUQuXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIGFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZTogc3RyaW5nLCBvU2lkZUVmZmVjdHM6IE9taXQ8Q29udHJvbFNpZGVFZmZlY3RzVHlwZSwgXCJmdWxseVF1YWxpZmllZE5hbWVcIj4pOiB2b2lkIHtcblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZSwgb1NpZGVFZmZlY3RzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSBxdWV1ZSBjb250YWluaW5nIHRoZSBmYWlsZWQgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSByZW1vdmVGYWlsZWRTaWRlRWZmZWN0c1xuXHQgKi9cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHB1YmxpYyByZW1vdmVGYWlsZWRTaWRlRWZmZWN0cygpOiB2b2lkIHtcblx0XHR0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHMgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0IFNpZGVFZmZlY3RzIG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlcXVlc3RTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIGdyb3VwSWRcblx0ICogQHBhcmFtIGZuR2V0VGFyZ2V0cyBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBnaXZlIHVzIHRoZSB0YXJnZXRzIGFuZCBhY3Rpb25zIGlmIGl0IHdhcyBjb21pbmcgdGhyb3VnaCBzb21lIHNwZWNpZmljIGhhbmRsaW5nLlxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyByZXF1ZXN0IG9uIFNBUFVJNSBjb250ZXh0XG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIGFzeW5jIHJlcXVlc3RTaWRlRWZmZWN0cyhcblx0XHRvU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSxcblx0XHRvQ29udGV4dDogQ29udGV4dCxcblx0XHRncm91cElkPzogc3RyaW5nLFxuXHRcdGZuR2V0VGFyZ2V0cz86IEZ1bmN0aW9uXG5cdCk6IFByb21pc2U8YW55PiB7XG5cdFx0bGV0IGFUYXJnZXRzOiBhbnlbXSwgc1RyaWdnZXJBY3Rpb247XG5cdFx0aWYgKGZuR2V0VGFyZ2V0cykge1xuXHRcdFx0Y29uc3QgdGFyZ2V0c0FuZEFjdGlvbkRhdGEgPSBhd2FpdCBmbkdldFRhcmdldHMob1NpZGVFZmZlY3RzKTtcblx0XHRcdGFUYXJnZXRzID0gdGFyZ2V0c0FuZEFjdGlvbkRhdGFbXCJhVGFyZ2V0c1wiXTtcblx0XHRcdHNUcmlnZ2VyQWN0aW9uID0gdGFyZ2V0c0FuZEFjdGlvbkRhdGFbXCJUcmlnZ2VyQWN0aW9uXCJdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhVGFyZ2V0cyA9ICgob1NpZGVFZmZlY3RzLlRhcmdldEVudGl0aWVzIGFzIGFueVtdKSB8fCBbXSkuY29uY2F0KChvU2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyBhcyBhbnlbXSkgfHwgW10pO1xuXHRcdFx0c1RyaWdnZXJBY3Rpb24gPSAob1NpZGVFZmZlY3RzIGFzIE9EYXRhU2lkZUVmZmVjdHNUeXBlKS5UcmlnZ2VyQWN0aW9uO1xuXHRcdH1cblx0XHRpZiAoc1RyaWdnZXJBY3Rpb24pIHtcblx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZXhlY3V0ZUFjdGlvbihzVHJpZ2dlckFjdGlvbiwgb0NvbnRleHQsIGdyb3VwSWQpO1xuXHRcdH1cblxuXHRcdGlmIChhVGFyZ2V0cy5sZW5ndGgpIHtcblx0XHRcdHJldHVybiB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0cywgb0NvbnRleHQsIGdyb3VwSWQpLmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9hZGRGYWlsZWRTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdHMsIG9Db250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG9FcnJvcik7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgU2lkZUVmZmVjdHMgY3JlYXRlZCBieSBhIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSByZW1vdmVDb250cm9sU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIG9Db250cm9sIFNBUFVJNSBDb250cm9sXG5cdCAqL1xuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIHJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyhvQ29udHJvbDogQ29udHJvbCk6IHZvaWQge1xuXHRcdGNvbnN0IHNDb250cm9sSWQgPSBvQ29udHJvbCAmJiBvQ29udHJvbC5pc0EgJiYgb0NvbnRyb2wuaXNBKFwic2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdFwiKSAmJiBvQ29udHJvbC5nZXRJZCgpO1xuXG5cdFx0aWYgKHNDb250cm9sSWQpIHtcblx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UucmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzKHNDb250cm9sSWQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIFNpZGVFZmZlY3RzIHRvIHRoZSBxdWV1ZSBvZiB0aGUgZmFpbGVkIFNpZGVFZmZlY3RzXG5cdCAqIFRoZSBTaWRlRWZmZWN0cyB3aWxsIGJlIHJldHJpZ2dlcmVkIG9uIHRoZSBuZXh0IGNoYW5nZSBvbiB0aGUgc2FtZSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2FkZEZhaWxlZFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgdGhhdCBuZWVkIHRvIGJlIHJldHJpZ2dlcmVkXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIGhhdmUgZmFpbGVkXG5cdCAqL1xuXHRAcHJpdmF0ZUV4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdHByaXZhdGUgX2FkZEZhaWxlZFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlLCBvQ29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aDogc3RyaW5nID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXG5cdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0gPSB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbc0NvbnRleHRQYXRoXSB8fCBbXTtcblx0XHRjb25zdCBiSXNOb3RBbHJlYWR5TGlzdGVkID0gdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0uZXZlcnkoXG5cdFx0XHQobUZhaWxlZFNpZGVFZmZlY3RzKSA9PiBvU2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lICE9PSBtRmFpbGVkU2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXG5cdFx0KTtcblx0XHRpZiAoYklzTm90QWxyZWFkeUxpc3RlZCkge1xuXHRcdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0ucHVzaChvU2lkZUVmZmVjdHMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIHByb21pc2UgZm9yIHRoZSBmaWVsZCBncm91cCB0aGF0IGlzIHJlcXVpcmVkIGJlZm9yZSByZXF1ZXN0aW5nIFNpZGVFZmZlY3RzLlxuXHQgKiBJZiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCBhbmQgb25seSB0aGUgZmllbGQgcmVxdWlyZXMgdGhlIFNpZGVFZmZlY3RzIG9uIHRoaXMgY29udGV4dCwgdGhlIFNpZGVFZmZlY3RzIGFyZSByZW1vdmVkIGZyb20gdGhlXG5cdCAqIFNpZGVFZmZlY3RzIHF1ZXVlLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2Vcblx0ICogQHBhcmFtIG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdG8gYmUgdXNlZCBmb3IgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkXG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZUZpZWxkR3JvdXBQcm9taXNlKG1FdmVudEZpZWxkUHJvcGVydGllczogRmllbGRFdmVudFByb3BlcnR5VHlwZSk6IFByb21pc2U8YW55PiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cblx0XHRsZXQgYlByb21pc2VTdWNjZXNzID0gdHJ1ZTtcblx0XHRyZXR1cm4gbUV2ZW50RmllbGRQcm9wZXJ0aWVzLnByb21pc2Vcblx0XHRcdC50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIGJQcm9taXNlU3VjY2Vzcztcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRiUHJvbWlzZVN1Y2Nlc3MgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIGJQcm9taXNlU3VjY2Vzcztcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBOZWVkIHRvIHN0b3JlIHRoZSBzdGF0dXMgb2YgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoaXMgZmllbGQgZm9yIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdFx0XHRcdCAqIHNpbmNlIGFsbCBTb3VyY2VQcm9wZXJ0aWVzIGZvciB0aGlzIGtpbmQgb2YgU2lkZUVmZmVjdHMgbXVzdCBiZSB2YWxpZFxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGhhdC5fc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyhtRXZlbnRGaWVsZFByb3BlcnRpZXMuZmllbGQsIGJQcm9taXNlU3VjY2Vzcyk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIHByb21pc2UgZm9yIHRoZSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkIGJlZm9yZSByZXF1ZXN0aW5nIGltbWVkaWF0ZSBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2Vcblx0ICogQHBhcmFtIG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIFByb21pc2UgdG8gYmUgdXNlZCBmb3IgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkXG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvUHJvbWlzZSA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5wcm9taXNlO1xuXHRcdHJldHVybiBvUHJvbWlzZS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogSWYgdGhlIGZpZWxkIGdldHMgYSBGaWVsZEhlbHBlciwgd2UgbmVlZCB0byB3YWl0IHVudGlsIGFsbCBmaWVsZHMgY2hhbmdlZCBieSB0aGlzIEZpZWxkSGVscGVyIGhhdmUgYmVlbiBzZXQuXG5cdFx0XHQgKiBUbyBhY2hpZXZlIHRoaXMsIHdlIGVuc3VyZSB0aGF0IGFsbCByZWxhdGVkIGJpbmRpbmdzIGhhdmUgYmVlbiByZXNvbHZlZC5cblx0XHRcdCAqXG5cdFx0XHQgKiBUaGlzIHJlc29sdXRpb24gcHJvY2VzcyBpcyBub3QgbWFuYWdlZCBieSB0aGUgRmllbGQgRXZlbnQgUHJvbWlzZSwgc28gZm9yIGZhc3QgdXNlciBhY3Rpb25zIChsaWtlIGF1dG9tYXRpb24pIGl0IGNhbiBsb2NrIHRoZSBtb2RlbFxuXHRcdFx0ICogYW5kIG5vIHJlcXVlc3QgY2FuIGJlIGV4ZWN1dGVkLlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBvRmllbGQgPSBtRXZlbnRGaWVsZFByb3BlcnRpZXMuZmllbGQ7XG5cdFx0XHRjb25zdCBzRmllbGRIZWxwZXJJZCA9IG9GaWVsZC5nZXRGaWVsZEhlbHAgJiYgb0ZpZWxkLmdldEZpZWxkSGVscCgpO1xuXHRcdFx0aWYgKHNGaWVsZEhlbHBlcklkKSB7XG5cdFx0XHRcdGNvbnN0IG9GaWx0ZXJIZWxwOiBhbnkgPSBDb3JlLmJ5SWQoc0ZpZWxkSGVscGVySWQpO1xuXHRcdFx0XHRpZiAob0ZpbHRlckhlbHAgJiYgb0ZpbHRlckhlbHAuZ2V0T3V0UGFyYW1ldGVycykge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdChvRmlsdGVySGVscC5nZXRPdXRQYXJhbWV0ZXJzKCkgYXMgYW55W10pLm1hcCgob091dFBhcmFtZXRlcikgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvQmluZGluZyA9IG9PdXRQYXJhbWV0ZXIuZ2V0QmluZGluZyhcInZhbHVlXCIpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb0JpbmRpbmcgPyBvQmluZGluZy5yZXF1ZXN0VmFsdWUoKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoW10pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyBhIHN0YXR1cyBpbmRleC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZVN0YXR1c0luZGV4XG5cdCAqIEBwYXJhbSBtRW50aXR5VHlwZSBUaGUgZW50aXR5IHR5cGVcblx0ICogQHBhcmFtIHNQcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIG9Db250ZXh0IFNBUFVJNSBDb250ZXh0XG5cdCAqIEByZXR1cm5zIEluZGV4XG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZVN0YXR1c0luZGV4KG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBzUHJvcGVydHlQYXRoOiBzdHJpbmcsIG9Db250ZXh0PzogQ29udGV4dCB8IG51bGwpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IG9Db250ZXh0Py5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgbVByb3BlcnR5ID0gbUVudGl0eVR5cGUucmVzb2x2ZVBhdGgoc1Byb3BlcnR5UGF0aCk7XG5cdFx0aWYgKG1Qcm9wZXJ0eSkge1xuXHRcdFx0aWYgKG1Qcm9wZXJ0eSAmJiBtUHJvcGVydHkuX3R5cGUgPT09IFwiUHJvcGVydHlcIikge1xuXHRcdFx0XHRyZXR1cm4gW21Qcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUsIHNDb250ZXh0UGF0aF0uam9pbihcIl9fXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIGNvbnRleHQgb24gd2hpY2ggU2lkZUVmZmVjdHMgY2FuIGJlIHJlcXVlc3RlZC5cblx0ICogIFRoZSBjb3JyZWN0IG9uZSBtdXN0IGhhdmUgdGhlIGJpbmRpbmcgcGFyYW1ldGVyICQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBvQmluZGluZ0NvbnRleHRcblx0ICogQHBhcmFtIHNTaWRlRWZmZWN0RW50aXR5VHlwZVxuXHQgKiBAcmV0dXJucyBTQVBVSTUgQ29udGV4dCBvciB1bmRlZmluZWRcblx0ICovXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZmluYWxFeHRlbnNpb24oKVxuXHRwdWJsaWMgZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzKG9CaW5kaW5nQ29udGV4dDogYW55LCBzU2lkZUVmZmVjdEVudGl0eVR5cGU6IHN0cmluZyk6IENvbnRleHQgfCB1bmRlZmluZWQge1xuXHRcdGxldCBvQ29udGV4dEZvclNpZGVFZmZlY3RzID0gb0JpbmRpbmdDb250ZXh0LFxuXHRcdFx0c0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQmluZGluZ0NvbnRleHQpO1xuXG5cdFx0aWYgKHNTaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gc0VudGl0eVR5cGUpIHtcblx0XHRcdG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgPSBvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLmdldENvbnRleHQoKTtcblx0XHRcdGlmIChvQ29udGV4dEZvclNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdHNFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0NvbnRleHRGb3JTaWRlRWZmZWN0cyk7XG5cdFx0XHRcdGlmIChzU2lkZUVmZmVjdEVudGl0eVR5cGUgIT09IHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdFx0b0NvbnRleHRGb3JTaWRlRWZmZWN0cyA9IG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMuZ2V0QmluZGluZygpLmdldENvbnRleHQoKTtcblx0XHRcdFx0XHRpZiAob0NvbnRleHRGb3JTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRcdFx0c0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dEZvclNpZGVFZmZlY3RzKTtcblx0XHRcdFx0XHRcdGlmIChzU2lkZUVmZmVjdEVudGl0eVR5cGUgIT09IHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgfHwgdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgRW50aXR5VHlwZSBiYXNlZCBvbiBpdHMgZnVsbHktcXVhbGlmaWVkIG5hbWUuXG5cdCAqXG5cdCAqIEBwYXJhbSBzRnVsbHlRdWFsaWZpZWROYW1lIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZVxuXHQgKiBAcmV0dXJucyBUaGUgZW50aXR5IHR5cGVcblx0ICovXG5cdHByaXZhdGUgX2dldEVudGl0eVR5cGVGcm9tRlFOKHNGdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZyk6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiAodGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKSBhcyBDb252ZXJ0ZWRNZXRhZGF0YSkuZW50aXR5VHlwZXMuZmluZCgob0VudGl0eVR5cGUpID0+IHtcblx0XHRcdHJldHVybiBvRW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUgPT09IHNGdWxseVF1YWxpZmllZE5hbWU7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvbWlzZSBvZiB0aGUgZmllbGQgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkIGZvciB0aGUgU2lkZUVmZmVjdHMgcHJvY2Vzcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRGaWVsZFByb21pc2Vcblx0ICogQHBhcmFtIG9FdmVudCBGaWVsZCBjaGFuZ2UgZXZlbnRcblx0ICogQHJldHVybnMgRmllbGQgcHJvbWlzZVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RmllbGRQcm9taXNlKG9FdmVudDogRXZlbnQpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IHByb21pc2UgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKSB8fCBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRjb25zdCB2YWxpZGl0eSA9IEZpZWxkUnVudGltZS5nZXRGaWVsZFN0YXRlT25DaGFuZ2Uob0V2ZW50KS5zdGF0ZS52YWxpZGl0eTtcblx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKCgpID0+IHtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHRcdGlmICghdmFsaWRpdHkpIHtcblx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBmaWVsZCB0aGF0IGFyZSByZXF1aXJlZCBmb3IgdGhlIFNpZGVFZmZlY3RzIHByb2Nlc3MuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0RmllbGRQcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBvRXZlbnQgRmllbGQgY2hhbmdlIGV2ZW50XG5cdCAqIEByZXR1cm5zIEZpZWxkIHByb3BlcnRpZXMgKGV2ZW50IGNoYW5nZSBwcm9taXNlLCBmaWVsZCwgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byB0aGlzIGZpZWxkKVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RmllbGRQcm9wZXJ0aWVzKG9FdmVudDogRXZlbnQpOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlIHtcblx0XHRjb25zdCBvRmllbGQ6IEZpZWxkQ29udHJvbCA9IG9FdmVudC5nZXRTb3VyY2UoKSBhcyBGaWVsZENvbnRyb2w7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cHJvbWlzZTogdGhpcy5fZ2V0RmllbGRQcm9taXNlKG9FdmVudCksXG5cdFx0XHRmaWVsZDogb0ZpZWxkLFxuXHRcdFx0c2lkZUVmZmVjdHNNYXA6IHRoaXMuX2dldEZpZWxkU2lkZUVmZmVjdHNNYXAob0ZpZWxkKVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgbWFwXG5cdCAqIFRoZXNlIFNpZGVFZmZlY3RzIGFyZVxuXHQgKiAtIGxpc3RlZCBpbnRvIEZpZWxkR3JvdXBJZHMgKGNvbWluZyBmcm9tIGFuIE9EYXRhIFNlcnZpY2UpXG5cdCAqIC0gZ2VuZXJhdGVkIGJ5IGEgY29udHJvbCBvciBjb250cm9scyBhbmQgdGhhdCBjb25maWd1cmUgdGhpcyBmaWVsZCBhcyBTb3VyY2VQcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dldEZpZWxkU2lkZUVmZmVjdHNNYXBcblx0ICogQHBhcmFtIG9GaWVsZCBGaWVsZFxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyBtYXBcblx0ICovXG5cdHByaXZhdGUgX2dldEZpZWxkU2lkZUVmZmVjdHNNYXAob0ZpZWxkOiBGaWVsZENvbnRyb2wpOiBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5IHtcblx0XHRsZXQgbVNpZGVFZmZlY3RzTWFwOiBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0ge307XG5cdFx0Y29uc3QgYUZpZWxkR3JvdXBJZHM6IHN0cmluZ1tdID0gb0ZpZWxkLmdldEZpZWxkR3JvdXBJZHMoKSxcblx0XHRcdHNWaWV3RW50aXR5U2V0U2V0TmFtZSA9IHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCkuZW50aXR5U2V0LFxuXHRcdFx0b1ZpZXdFbnRpdHlTZXQgPSAodGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKSBhcyBDb252ZXJ0ZWRNZXRhZGF0YSkuZW50aXR5U2V0cy5maW5kKChvRW50aXR5U2V0KSA9PiB7XG5cdFx0XHRcdHJldHVybiBvRW50aXR5U2V0Lm5hbWUgPT09IHNWaWV3RW50aXR5U2V0U2V0TmFtZTtcblx0XHRcdH0pO1xuXG5cdFx0Ly8gU2lkZUVmZmVjdHMgY29taW5nIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHRcdG1TaWRlRWZmZWN0c01hcCA9IHRoaXMuZ2VuZXJhdGVTaWRlRWZmZWN0c01hcEZyb21TaWRlRWZmZWN0SWQoYUZpZWxkR3JvdXBJZHMsIG9GaWVsZCkgYXMgRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeTtcblxuXHRcdC8vU2lkZUVmZmVjdHMgY29taW5nIGZyb20gY29udHJvbChzKVxuXHRcdGlmIChzVmlld0VudGl0eVNldFNldE5hbWUgJiYgb1ZpZXdFbnRpdHlTZXQpIHtcblx0XHRcdGNvbnN0IHNWaWV3RW50aXR5VHlwZSA9IG9WaWV3RW50aXR5U2V0LmVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRtRmllbGRQYXRoOiBhbnkgPSAob0ZpZWxkLmdldEFnZ3JlZ2F0aW9uKFwiY3VzdG9tRGF0YVwiKSBhcyBhbnlbXSkuZmluZCgob0N1c3RvbURhdGEpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1c3RvbURhdGEuZ2V0S2V5KCkgPT09IFwic291cmNlUGF0aFwiO1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0b0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSB0aGlzLmdldENvbnRleHRGb3JTaWRlRWZmZWN0cyhvRmllbGQuZ2V0QmluZGluZ0NvbnRleHQoKSwgc1ZpZXdFbnRpdHlUeXBlKTtcblxuXHRcdFx0aWYgKG1GaWVsZFBhdGggJiYgb0NvbnRleHQpIHtcblx0XHRcdFx0Y29uc3Qgc0ZpZWxkUGF0aCA9IG1GaWVsZFBhdGguZ2V0VmFsdWUoKS5yZXBsYWNlKGAvJHtzVmlld0VudGl0eVNldFNldE5hbWV9L2AsIFwiXCIpLFxuXHRcdFx0XHRcdG1Db250cm9sRW50aXR5VHlwZSA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0Q29udHJvbEVudGl0eVNpZGVFZmZlY3RzKFxuXHRcdFx0XHRcdFx0c1ZpZXdFbnRpdHlUeXBlXG5cdFx0XHRcdFx0KSBhcyBDb250cm9sU2lkZUVmZmVjdHNFbnRpdHlEaWN0aW9uYXJ5O1xuXHRcdFx0XHRPYmplY3Qua2V5cyhtQ29udHJvbEVudGl0eVR5cGUpLmZvckVhY2goKHNDb250cm9sTmFtZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9Db250cm9sU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSA9IG1Db250cm9sRW50aXR5VHlwZVtzQ29udHJvbE5hbWVdO1xuXHRcdFx0XHRcdGlmIChvQ29udHJvbFNpZGVFZmZlY3RzLlNvdXJjZVByb3BlcnRpZXMuaW5jbHVkZXMoc0ZpZWxkUGF0aCkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNOYW1lID0gYCR7c0NvbnRyb2xOYW1lfTo6JHtzVmlld0VudGl0eVR5cGV9YDtcblx0XHRcdFx0XHRcdG1TaWRlRWZmZWN0c01hcFtzTmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRcdG5hbWU6IHNOYW1lLFxuXHRcdFx0XHRcdFx0XHRpbW1lZGlhdGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvQ29udHJvbFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0OiBvQ29udGV4dFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbVNpZGVFZmZlY3RzTWFwO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBzaWRlIGVmZmVjdCBOYW1lLCBzaWRlZWZmZWN0IG9iaiBhbmQgZW50aXR5IHR5cGUgZnJvbSBhIGdpdmVuIGZpZWxkR3JvdXBJZC5cblx0ICpcblx0ICogQHBhcmFtIHNGaWVsZEdyb3VwSWRcblx0ICogQHJldHVybnMgRGF0YSBhYm91dCBzaWRlZWZmZWN0IG5hbWUsIGVudGl0eXR5cGUsIHNpZGUgZWZmZWN0IG9iamVjdCBhbmQgaWYgaXQgaXMgaW1tZWRpYXRlLlxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RGF0YVRvR2VuZXJhdGVTaWRlRWZmZWN0c01hcEZyb21TaWRlRWZmZWN0SWQoc0ZpZWxkR3JvdXBJZDogYW55KSB7XG5cdFx0Y29uc3QgYklzSW1tZWRpYXRlOiBib29sZWFuID0gc0ZpZWxkR3JvdXBJZC5pbmRleE9mKFwiJCRJbW1lZGlhdGVSZXF1ZXN0XCIpICE9PSAtMSxcblx0XHRcdHNOYW1lOiBzdHJpbmcgPSBzRmllbGRHcm91cElkLnJlcGxhY2UoXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiwgXCJcIiksXG5cdFx0XHRhU2lkZUVmZmVjdFBhcnRzOiBzdHJpbmdbXSA9IHNOYW1lLnNwbGl0KFwiI1wiKSxcblx0XHRcdHNTaWRlRWZmZWN0RW50aXR5VHlwZTogc3RyaW5nID0gYVNpZGVFZmZlY3RQYXJ0c1swXSxcblx0XHRcdHNTaWRlRWZmZWN0UGF0aDogc3RyaW5nID0gYCR7c1NpZGVFZmZlY3RFbnRpdHlUeXBlfUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2lkZUVmZmVjdHMke1xuXHRcdFx0XHRhU2lkZUVmZmVjdFBhcnRzLmxlbmd0aCA9PT0gMiA/IGAjJHthU2lkZUVmZmVjdFBhcnRzWzFdfWAgOiBcIlwiXG5cdFx0XHR9YCxcblx0XHRcdG9TaWRlRWZmZWN0OiBTaWRlRWZmZWN0c1R5cGUgfCB1bmRlZmluZWQgPVxuXHRcdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMoc1NpZGVFZmZlY3RFbnRpdHlUeXBlKT8uW3NTaWRlRWZmZWN0UGF0aF07XG5cdFx0cmV0dXJuIHsgc05hbWUsIGJJc0ltbWVkaWF0ZSwgb1NpZGVFZmZlY3QsIHNTaWRlRWZmZWN0RW50aXR5VHlwZSB9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlIHRoZSBzaWRlIGVmZmVjdHMgbWFwIGZyb20gaWQgd2hpY2ggaXMgdGhlIGVudGl0eSBhbmQgcXVhbGlmaWVyXG5cdCAqIGZvciB0aGUgZ2l2ZW4gZW50aXR5LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIGFGaWVsZEdyb3VwSWRzXG5cdCAqIEBwYXJhbSBvRmllbGRcblx0ICogQHJldHVybnMgU2lkZSBlZmZlY3QgbWFwIHdpdGggZGF0YVxuXHQgKi9cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0cHVibGljIGdlbmVyYXRlU2lkZUVmZmVjdHNNYXBGcm9tU2lkZUVmZmVjdElkKFxuXHRcdGFGaWVsZEdyb3VwSWRzOiBzdHJpbmdbXSxcblx0XHRvRmllbGQ/OiBGaWVsZENvbnRyb2xcblx0KTogTWFzc0VkaXRGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5IHwgRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSB7XG5cdFx0Y29uc3QgbVNpZGVFZmZlY3RzTWFwOiBNYXNzRWRpdEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgfCBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0ge307XG5cdFx0YUZpZWxkR3JvdXBJZHMuZm9yRWFjaCgoc0ZpZWxkR3JvdXBJZDogYW55KSA9PiB7XG5cdFx0XHRjb25zdCB7IHNOYW1lLCBiSXNJbW1lZGlhdGUsIG9TaWRlRWZmZWN0LCBzU2lkZUVmZmVjdEVudGl0eVR5cGUgfSA9XG5cdFx0XHRcdHRoaXMuX2dldERhdGFUb0dlbmVyYXRlU2lkZUVmZmVjdHNNYXBGcm9tU2lkZUVmZmVjdElkKHNGaWVsZEdyb3VwSWQpO1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSBvRmllbGRcblx0XHRcdFx0PyB0aGlzLmdldENvbnRleHRGb3JTaWRlRWZmZWN0cyhvRmllbGQuZ2V0QmluZGluZ0NvbnRleHQoKSwgc1NpZGVFZmZlY3RFbnRpdHlUeXBlKVxuXHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdGlmIChvU2lkZUVmZmVjdCAmJiAoIW9GaWVsZCB8fCAob0ZpZWxkICYmIG9Db250ZXh0KSkpIHtcblx0XHRcdFx0bVNpZGVFZmZlY3RzTWFwW3NOYW1lXSA9IHtcblx0XHRcdFx0XHRuYW1lOiBzTmFtZSxcblx0XHRcdFx0XHRpbW1lZGlhdGU6IGJJc0ltbWVkaWF0ZSxcblx0XHRcdFx0XHRzaWRlRWZmZWN0czogb1NpZGVFZmZlY3Rcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKG9GaWVsZCkge1xuXHRcdFx0XHRcdChtU2lkZUVmZmVjdHNNYXBbc05hbWVdIGFzIEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZSkuY29udGV4dCA9IG9Db250ZXh0ITtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBtU2lkZUVmZmVjdHNNYXA7XG5cdH1cblxuXHQvKipcblx0ICogTWFuYWdlcyB0aGUgU2lkZUVmZmVjdHMgd2l0aCByZWxhdGVkIGNoYW5nZXMgdG8gYSBmaWVsZFxuXHQgKiBMaXN0OiBnZXRzIGltbWVkaWF0ZSBTaWRlRWZmZWN0cyByZXF1ZXN0c1xuXHQgKiBSZWdpc3RlcjogY2FjaGVzIGRlZmVycmVkIFNpZGVFZmZlY3RzIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBGaWVsZEdyb3VwIGlzIHVuZm9jdXNlZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9pbml0aWFsaXplRmllbGRTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0gbUV2ZW50RmllbGRQcm9wZXJ0aWVzIEZpZWxkIGV2ZW50IHByb3BlcnRpZXNcblx0ICogQHBhcmFtIG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkIGJlZm9yZSBleGVjdXRpbmcgZGVmZXJyZWQgU2lkZUVmZmVjdHNcblx0ICogQHJldHVybnMgIEFycmF5IG9mIGltbWVkaWF0ZSBTaWRlRWZmZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBfaW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHMoXG5cdFx0bUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlLFxuXHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlPzogUHJvbWlzZTxhbnk+XG5cdCk6IEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZVtdIHtcblx0XHRjb25zdCBtRmllbGRTaWRlRWZmZWN0c01hcCA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5zaWRlRWZmZWN0c01hcCxcblx0XHRcdG9GaWVsZFByb21pc2VGb3JGaWVsZEdyb3VwID0gdGhpcy5fZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXMpLCAvLyBQcm9taXNlIG1hbmFnaW5nIEZpZWxkR3JvdXAgcmVxdWVzdHMgaWYgRmllbGQgcHJvbWlzZSBmYWlsc1xuXHRcdFx0bUZhaWxlZFNpZGVFZmZlY3RzTmFtZTogYW55ID0ge30sXG5cdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSA9IFtdO1xuXG5cdFx0b0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgPSBvRmllbGRHcm91cFByZVJlcXVpc2l0ZSB8fCBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdE9iamVjdC5rZXlzKG1GaWVsZFNpZGVFZmZlY3RzTWFwKS5mb3JFYWNoKChzU2lkZUVmZmVjdE5hbWUpID0+IHtcblx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0UHJvcGVydHk6IEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZSA9IG1GaWVsZFNpZGVFZmZlY3RzTWFwW3NTaWRlRWZmZWN0TmFtZV0sXG5cdFx0XHRcdHNTaWRlRWZmZWN0Q29udGV4dFBhdGggPSBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHQ/LmdldFBhdGgoKTtcblx0XHRcdGlmIChzU2lkZUVmZmVjdENvbnRleHRQYXRoKSB7XG5cdFx0XHRcdGNvbnN0IGFGYWlsZWRTaWRlRWZmZWN0cyA9IHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzU2lkZUVmZmVjdENvbnRleHRQYXRoXTtcblxuXHRcdFx0XHRpZiAoYUZhaWxlZFNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdFx0ZGVsZXRlIHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzU2lkZUVmZmVjdENvbnRleHRQYXRoXTtcblx0XHRcdFx0XHRtRmFpbGVkU2lkZUVmZmVjdHNOYW1lW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdID0ge307XG5cdFx0XHRcdFx0YUZhaWxlZFNpZGVFZmZlY3RzLmZvckVhY2goKG1GYWlsZWRTaWRlRWZmZWN0czogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRtRmFpbGVkU2lkZUVmZmVjdHNOYW1lW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdW21GYWlsZWRTaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdG5hbWU6IHNTaWRlRWZmZWN0TmFtZSxcblx0XHRcdFx0XHRcdFx0cHJldmlvdXNseUZhaWxlZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0c2lkZUVmZmVjdHM6IG1GYWlsZWRTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdFx0Y29udGV4dDogb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvU2lkZUVmZmVjdFByb3BlcnR5LmltbWVkaWF0ZSkge1xuXHRcdFx0XHRcdC8vIFNpZGVFZmZlY3RzIHdpbGwgYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZXZlbnQgcHJvbWlzZSB2YWxpZGF0aW9uXG5cdFx0XHRcdFx0aWYgKCFtRmFpbGVkU2lkZUVmZmVjdHNOYW1lW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdPy5bb1NpZGVFZmZlY3RQcm9wZXJ0eS5zaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdKSB7XG5cdFx0XHRcdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRuYW1lOiBzU2lkZUVmZmVjdE5hbWUsXG5cdFx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0OiBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHRcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBBZGQgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdG8gdGhlIHJlbGF0ZWQgZGljdGlvbmFyeVxuXHRcdFx0XHRcdHRoaXMuX21GaWVsZEdyb3VwUXVldWVbc1NpZGVFZmZlY3ROYW1lXSA9IHRoaXMuX21GaWVsZEdyb3VwUXVldWVbc1NpZGVFZmZlY3ROYW1lXSB8fCB7fTtcblx0XHRcdFx0XHRjb25zdCBtU2lkZUVmZmVjdENvbnRleHRQYXRoID0gdGhpcy5fbUZpZWxkR3JvdXBRdWV1ZVtzU2lkZUVmZmVjdE5hbWVdW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdIHx8IHtcblx0XHRcdFx0XHRcdHByb21pc2VzOiBbXSxcblx0XHRcdFx0XHRcdHNpZGVFZmZlY3RQcm9wZXJ0eTogb1NpZGVFZmZlY3RQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdHByb2Nlc3NTdGFydGVkOiBmYWxzZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0bVNpZGVFZmZlY3RDb250ZXh0UGF0aC5wcm9taXNlcyA9IG1TaWRlRWZmZWN0Q29udGV4dFBhdGgucHJvbWlzZXMuY29uY2F0KFtcblx0XHRcdFx0XHRcdG9GaWVsZFByb21pc2VGb3JGaWVsZEdyb3VwLFxuXHRcdFx0XHRcdFx0b0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgYXMgUHJvbWlzZTxhbnk+XG5cdFx0XHRcdFx0XSk7XG5cdFx0XHRcdFx0dGhpcy5fbUZpZWxkR3JvdXBRdWV1ZVtzU2lkZUVmZmVjdE5hbWVdW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdID0gbVNpZGVFZmZlY3RDb250ZXh0UGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSB2YWxpZGF0aW9uIHN0YXR1cyBvZiBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gYSBmaWVsZCBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0ZpZWxkIEZpZWxkXG5cdCAqIEBwYXJhbSBiU3VjY2VzcyBTdGF0dXMgb2YgdGhlIGZpZWxkIHZhbGlkYXRpb25cblx0ICovXG5cdHByaXZhdGUgX3NhdmVGaWVsZFByb3BlcnRpZXNTdGF0dXMob0ZpZWxkOiBGaWVsZENvbnRyb2wsIGJTdWNjZXNzOiBib29sZWFuKTogdm9pZCB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb0ZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQmluZGluZ0NvbnRleHQpO1xuXHRcdGNvbnN0IG1FbnRpdHlUeXBlID0gdGhpcy5fZ2V0RW50aXR5VHlwZUZyb21GUU4oc0VudGl0eVR5cGUpO1xuXHRcdGlmIChtRW50aXR5VHlwZSkge1xuXHRcdFx0Ly8gUmV0cmlldmVzIGFsbCBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIGZpZWxkXG5cdFx0XHRjb25zdCBvRmllbGRCaW5kaW5nOiBhbnkgPSB0aGlzLl9nZXRCaW5kaW5nRm9yRmllbGQob0ZpZWxkKTtcblx0XHRcdGNvbnN0IGFGaWVsZFBhdGhzID0gb0ZpZWxkQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwuQ29tcG9zaXRlQmluZGluZ1wiKVxuXHRcdFx0XHQ/IChvRmllbGRCaW5kaW5nLmdldEJpbmRpbmdzKCkgfHwgW10pLm1hcCgob0JpbmRpbmc6IGFueSkgPT4gb0JpbmRpbmcuc1BhdGgpXG5cdFx0XHRcdDogW29GaWVsZEJpbmRpbmcuZ2V0UGF0aCgpXTtcblxuXHRcdFx0Ly8gU3RvcmVzIHN0YXR1cyBmb3IgYWxsIHByb3BlcnRpZXNcblx0XHRcdGFGaWVsZFBhdGhzLmZvckVhY2goKHNGaWVsZFBhdGg6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRjb25zdCBzSWQgPSB0aGlzLl9nZW5lcmF0ZVN0YXR1c0luZGV4KG1FbnRpdHlUeXBlLCBzRmllbGRQYXRoLCBvQmluZGluZ0NvbnRleHQpO1xuXHRcdFx0XHRpZiAoc0lkKSB7XG5cdFx0XHRcdFx0dGhpcy5fYVNvdXJjZVByb3BlcnRpZXNGYWlsdXJlW2JTdWNjZXNzID8gXCJkZWxldGVcIiA6IFwiYWRkXCJdKHNJZCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHByb3BlcnR5IGJpbmRpbmcgdG8gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cblx0ICpcblx0ICogQHBhcmFtIG9GaWVsZCBGaWVsZFxuXHQgKiBAcmV0dXJucyAgQmluZGluZyB0byB0aGUgdmFsdWVcblx0ICovXG5cdHByaXZhdGUgX2dldEJpbmRpbmdGb3JGaWVsZChvRmllbGQ6IEZpZWxkQ29udHJvbCk6IEJpbmRpbmcge1xuXHRcdGxldCBzQmluZGluZ05hbWUgPSBcInZhbHVlXCI7XG5cdFx0aWYgKG9GaWVsZC5pc0EoXCJzYXAubS5DaGVja0JveFwiKSkge1xuXHRcdFx0c0JpbmRpbmdOYW1lID0gXCJzZWxlY3RlZFwiO1xuXHRcdH0gZWxzZSBpZiAob0ZpZWxkLmlzQShcInNhcC5mZS5jb3JlLmNvbnRyb2xzLkZpbGVXcmFwcGVyXCIpKSB7XG5cdFx0XHRzQmluZGluZ05hbWUgPSBcInVwbG9hZFVybFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gb0ZpZWxkLmdldEJpbmRpbmcoc0JpbmRpbmdOYW1lKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBTaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb247XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQThETUEsOEIsV0FETEMsY0FBYyxDQUFDLDhDQUFELEMsVUFTYkMsY0FBYyxFLFVBZ0JkQyxlQUFlLEUsVUFDZkMsY0FBYyxFLFVBWWRELGVBQWUsRSxVQUNmQyxjQUFjLEUsVUFLZEQsZUFBZSxFLFVBQ2ZDLGNBQWMsRSxVQWlCZEQsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQTZDZEQsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQWlGZEQsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQVdkRCxlQUFlLEUsV0FDZkMsY0FBYyxFLFdBZ0JkRCxlQUFlLEUsV0FDZkMsY0FBYyxFLFdBb0NkRCxlQUFlLEUsV0FDZkMsY0FBYyxFLFdBa0JkQyxnQkFBZ0IsRSxXQUNoQkQsY0FBYyxFLFdBNkdkRCxlQUFlLEUsV0FDZkMsY0FBYyxFLFdBNkpkRCxlQUFlLEUsV0FDZkMsY0FBYyxFOzs7Ozs7Ozs7V0F0aEJSRSxNLEdBRFAsa0JBQ2dCO01BQ2YsS0FBS0MsTUFBTCxHQUFlLElBQUQsQ0FBY0MsSUFBZCxDQUFtQkMsT0FBbkIsRUFBZDtNQUNBLEtBQUtDLGNBQUwsR0FBc0JDLFdBQVcsQ0FBQ0MsZUFBWixDQUE0QixLQUFLTCxNQUFqQyxDQUF0QjtNQUNBLEtBQUtNLG9CQUFMLEdBQTZCLEtBQUtILGNBQU4sQ0FBNkJJLHFCQUE3QixFQUE1QjtNQUNBLEtBQUtDLGlCQUFMLEdBQXlCLEVBQXpCO01BQ0EsS0FBS0MseUJBQUwsR0FBaUMsSUFBSUMsR0FBSixFQUFqQztNQUNBLEtBQUtDLG1CQUFMLEdBQTJCLEVBQTNCO0lBQ0E7SUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUdRQyxxQixHQUZQLGlDQUVxQztNQUNwQyxLQUFLSCx5QkFBTCxDQUErQkksS0FBL0I7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
|