@sapui5/sap.fe.core 1.108.2 → 1.110.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/package.json +11 -9
- package/src/.eslintrc +7 -0
- package/src/sap/fe/core/.library +39 -37
- package/src/sap/fe/core/.supportrc +3 -3
- package/src/sap/fe/core/ActionRuntime.js +72 -27
- package/src/sap/fe/core/ActionRuntime.ts +104 -21
- package/src/sap/fe/core/AppComponent.js +102 -120
- package/src/sap/fe/core/AppComponent.ts +148 -45
- package/src/sap/fe/core/AppStateHandler.js +105 -91
- package/src/sap/fe/core/AppStateHandler.ts +85 -23
- package/src/sap/fe/core/BaseController.js +5 -20
- package/src/sap/fe/core/BaseController.ts +11 -2
- package/src/sap/fe/core/CommonUtils.js +770 -1079
- package/src/sap/fe/core/CommonUtils.ts +750 -491
- package/src/sap/fe/core/ExtensionAPI.js +69 -96
- package/src/sap/fe/core/ExtensionAPI.ts +15 -17
- package/src/sap/fe/core/PageController.js +21 -46
- package/src/sap/fe/core/PageController.ts +11 -2
- package/src/sap/fe/core/TemplateComponent.js +6 -51
- package/src/sap/fe/core/TemplateComponent.ts +27 -16
- package/src/sap/fe/core/TemplateModel.js +18 -24
- package/src/sap/fe/core/TemplateModel.ts +25 -6
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +8 -23
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +5 -4
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +146 -180
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +144 -57
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +43 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +11 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +436 -556
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +288 -157
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +215 -202
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +93 -51
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +11 -26
- package/src/sap/fe/core/controllerextensions/EditFlow.js +407 -596
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +163 -56
- package/src/sap/fe/core/controllerextensions/Feedback.js +70 -0
- package/src/sap/fe/core/controllerextensions/Feedback.ts +64 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +12 -23
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -1
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +127 -182
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +65 -32
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +96 -198
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +4 -5
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +134 -291
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +21 -12
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +111 -214
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +44 -44
- package/src/sap/fe/core/controllerextensions/MassEdit.js +24 -44
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +3 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +39 -52
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +26 -7
- package/src/sap/fe/core/controllerextensions/PageReady.js +81 -119
- package/src/sap/fe/core/controllerextensions/PageReady.ts +36 -15
- package/src/sap/fe/core/controllerextensions/Paginator.js +16 -51
- package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -3
- package/src/sap/fe/core/controllerextensions/Placeholder.js +7 -33
- package/src/sap/fe/core/controllerextensions/Routing.js +24 -32
- package/src/sap/fe/core/controllerextensions/Routing.ts +6 -1
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +53 -98
- package/src/sap/fe/core/controllerextensions/Share.ts +6 -3
- package/src/sap/fe/core/controllerextensions/SideEffects.js +103 -174
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +37 -22
- package/src/sap/fe/core/controllerextensions/ViewState.js +341 -276
- package/src/sap/fe/core/controllerextensions/ViewState.ts +236 -84
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +6 -22
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -2
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +66 -88
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +64 -17
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +28 -34
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +22 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +69 -65
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +31 -12
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +15 -13
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +273 -906
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +142 -420
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +49 -115
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +12 -7
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +70 -89
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +313 -320
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +582 -683
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +507 -386
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +111 -102
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +102 -79
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +689 -154
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +866 -31
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +24 -101
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +5 -5
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +91 -217
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +3 -20
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +1 -0
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +46 -46
- package/src/sap/fe/core/controls/Any.js +1 -1
- package/src/sap/fe/core/controls/AnyElement.js +1 -1
- package/src/sap/fe/core/controls/CommandExecution.js +4 -26
- package/src/sap/fe/core/controls/ConditionalWrapper.js +16 -33
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +16 -2
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +41 -94
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +1 -1
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +5 -34
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +5 -7
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +7 -7
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +56 -58
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +53 -33
- package/src/sap/fe/core/controls/FieldWrapper.js +6 -49
- package/src/sap/fe/core/controls/FileWrapper.js +51 -136
- package/src/sap/fe/core/controls/FileWrapper.ts +25 -29
- package/src/sap/fe/core/controls/FilterBar.js +19 -54
- package/src/sap/fe/core/controls/FormElementWrapper.js +1 -22
- package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -5
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +2 -2
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +24 -46
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +14 -41
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +4 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +26 -67
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -20
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +12 -48
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +17 -46
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -3
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +1 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +6 -78
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +4 -4
- package/src/sap/fe/core/converters/ConverterContext.js +44 -98
- package/src/sap/fe/core/converters/ConverterContext.ts +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -20
- package/src/sap/fe/core/converters/ManifestSettings.ts +16 -9
- package/src/sap/fe/core/converters/ManifestWrapper.js +97 -158
- package/src/sap/fe/core/converters/ManifestWrapper.ts +4 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +28 -167
- package/src/sap/fe/core/converters/MetaModelConverter.ts +9 -3
- package/src/sap/fe/core/converters/TemplateConverter.js +10 -22
- package/src/sap/fe/core/converters/TemplateConverter.ts +10 -7
- package/src/sap/fe/core/converters/annotations/DataField.js +88 -132
- package/src/sap/fe/core/converters/annotations/DataField.ts +90 -38
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +57 -379
- package/src/sap/fe/core/converters/controls/Common/Action.js +45 -115
- package/src/sap/fe/core/converters/controls/Common/Action.ts +17 -5
- package/src/sap/fe/core/converters/controls/Common/Chart.js +20 -73
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +21 -14
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -9
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +40 -94
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +44 -31
- package/src/sap/fe/core/converters/controls/Common/Form.js +26 -63
- package/src/sap/fe/core/converters/controls/Common/Form.ts +24 -10
- package/src/sap/fe/core/converters/controls/Common/KPI.js +13 -63
- package/src/sap/fe/core/converters/controls/Common/Table.js +368 -707
- package/src/sap/fe/core/converters/controls/Common/Table.ts +308 -197
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +54 -109
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +15 -9
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +69 -210
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +23 -16
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +12 -80
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +3 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -19
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +45 -136
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +10 -10
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +82 -173
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +48 -22
- package/src/sap/fe/core/converters/helpers/Aggregation.js +24 -66
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +3 -7
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +9 -19
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +0 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +20 -48
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +5 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +12 -51
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +13 -11
- package/src/sap/fe/core/converters/helpers/ID.js +3 -17
- package/src/sap/fe/core/converters/helpers/ID.ts +2 -3
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -6
- package/src/sap/fe/core/converters/helpers/Key.js +10 -19
- package/src/sap/fe/core/converters/helpers/Key.ts +3 -3
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +2 -20
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +2 -37
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +126 -131
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +112 -31
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +67 -131
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +58 -27
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +106 -183
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +73 -104
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +74 -67
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +77 -69
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +20 -29
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +21 -0
- package/src/sap/fe/core/formatters/FPMFormatter.js +3 -7
- package/src/sap/fe/core/formatters/KPIFormatter.js +5 -13
- package/src/sap/fe/core/formatters/StandardFormatter.js +3 -18
- package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -2
- package/src/sap/fe/core/formatters/TableFormatter.js +87 -53
- package/src/sap/fe/core/formatters/TableFormatter.ts +96 -9
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -4
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -37
- package/src/sap/fe/core/fpm/Component.js +2 -17
- package/src/sap/fe/core/helpers/AnnotationEnum.js +10 -20
- package/src/sap/fe/core/helpers/AnnotationEnum.ts +6 -6
- package/src/sap/fe/core/helpers/AppStartupHelper.js +16 -52
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.js +106 -364
- package/src/sap/fe/core/helpers/BindingToolkit.ts +30 -7
- package/src/sap/fe/core/helpers/ClassSupport.js +16 -97
- package/src/sap/fe/core/helpers/ClassSupport.ts +7 -4
- package/src/sap/fe/core/helpers/DeleteHelper.js +621 -0
- package/src/sap/fe/core/helpers/DeleteHelper.ts +796 -0
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -12
- package/src/sap/fe/core/helpers/EditState.js +2 -5
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -10
- package/src/sap/fe/core/helpers/FPMHelper.js +3 -8
- package/src/sap/fe/core/helpers/FPMHelper.ts +2 -1
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +8 -38
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -5
- package/src/sap/fe/core/helpers/LoaderUtils.js +1 -7
- package/src/sap/fe/core/helpers/MassEditHelper.js +177 -289
- package/src/sap/fe/core/helpers/MassEditHelper.ts +124 -91
- package/src/sap/fe/core/helpers/MessageStrip.js +12 -28
- package/src/sap/fe/core/helpers/MessageStrip.ts +7 -7
- package/src/sap/fe/core/helpers/ModelHelper.js +62 -103
- package/src/sap/fe/core/helpers/ModelHelper.ts +58 -20
- package/src/sap/fe/core/helpers/PasteHelper.js +28 -51
- package/src/sap/fe/core/helpers/PasteHelper.ts +10 -9
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +112 -136
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +111 -111
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +5 -11
- package/src/sap/fe/core/helpers/SideEffectsHelper.js +26 -32
- package/src/sap/fe/core/helpers/StableIdHelper.js +166 -218
- package/src/sap/fe/core/helpers/StableIdHelper.ts +175 -191
- package/src/sap/fe/core/helpers/Synchronization.js +1 -8
- package/src/sap/fe/core/helpers/ToES6Promise.js +1 -4
- package/src/sap/fe/core/helpers/TypeGuards.js +22 -0
- package/src/sap/fe/core/helpers/TypeGuards.ts +9 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +1 -3
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +3 -23
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +3 -23
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +2 -1
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +4 -16
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.js +2 -5
- package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +4 -27
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
- package/src/sap/fe/core/library.js +9 -48
- package/src/sap/fe/core/library.support.js +3 -2
- package/src/sap/fe/core/library.support.ts +3 -1
- package/src/sap/fe/core/library.ts +3 -8
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +74 -39
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +71 -26
- package/src/sap/fe/core/messagebundle.properties +113 -67
- package/src/sap/fe/core/messagebundle_ar.properties +20 -3
- package/src/sap/fe/core/messagebundle_bg.properties +22 -5
- package/src/sap/fe/core/messagebundle_ca.properties +21 -4
- package/src/sap/fe/core/messagebundle_cs.properties +21 -4
- package/src/sap/fe/core/messagebundle_cy.properties +22 -5
- package/src/sap/fe/core/messagebundle_da.properties +20 -3
- package/src/sap/fe/core/messagebundle_de.properties +38 -21
- package/src/sap/fe/core/messagebundle_el.properties +20 -3
- package/src/sap/fe/core/messagebundle_en.properties +38 -21
- package/src/sap/fe/core/messagebundle_en_GB.properties +20 -3
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -28
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +41 -24
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +42 -29
- package/src/sap/fe/core/messagebundle_es.properties +40 -23
- package/src/sap/fe/core/messagebundle_es_MX.properties +20 -3
- package/src/sap/fe/core/messagebundle_et.properties +20 -3
- package/src/sap/fe/core/messagebundle_fi.properties +20 -3
- package/src/sap/fe/core/messagebundle_fr.properties +21 -4
- package/src/sap/fe/core/messagebundle_fr_CA.properties +22 -5
- package/src/sap/fe/core/messagebundle_hi.properties +20 -3
- package/src/sap/fe/core/messagebundle_hr.properties +22 -5
- package/src/sap/fe/core/messagebundle_hu.properties +20 -3
- package/src/sap/fe/core/messagebundle_id.properties +20 -3
- package/src/sap/fe/core/messagebundle_it.properties +23 -6
- package/src/sap/fe/core/messagebundle_iw.properties +20 -3
- package/src/sap/fe/core/messagebundle_ja.properties +22 -5
- package/src/sap/fe/core/messagebundle_kk.properties +21 -4
- package/src/sap/fe/core/messagebundle_ko.properties +20 -3
- package/src/sap/fe/core/messagebundle_lt.properties +20 -3
- package/src/sap/fe/core/messagebundle_lv.properties +20 -3
- package/src/sap/fe/core/messagebundle_ms.properties +20 -3
- package/src/sap/fe/core/messagebundle_nl.properties +20 -3
- package/src/sap/fe/core/messagebundle_no.properties +20 -3
- package/src/sap/fe/core/messagebundle_pl.properties +21 -4
- package/src/sap/fe/core/messagebundle_pt.properties +20 -3
- package/src/sap/fe/core/messagebundle_pt_PT.properties +20 -3
- package/src/sap/fe/core/messagebundle_ro.properties +20 -3
- package/src/sap/fe/core/messagebundle_ru.properties +20 -3
- package/src/sap/fe/core/messagebundle_sh.properties +20 -3
- package/src/sap/fe/core/messagebundle_sk.properties +20 -3
- package/src/sap/fe/core/messagebundle_sl.properties +26 -9
- package/src/sap/fe/core/messagebundle_sv.properties +20 -3
- package/src/sap/fe/core/messagebundle_th.properties +21 -4
- package/src/sap/fe/core/messagebundle_tr.properties +20 -3
- package/src/sap/fe/core/messagebundle_uk.properties +23 -6
- package/src/sap/fe/core/messagebundle_vi.properties +20 -3
- package/src/sap/fe/core/messagebundle_zh_CN.properties +20 -3
- package/src/sap/fe/core/messagebundle_zh_TW.properties +20 -3
- package/src/sap/fe/core/operationsHelper.js +74 -101
- package/src/sap/fe/core/operationsHelper.ts +113 -44
- package/src/sap/fe/core/rootView/Fcl.controller.js +151 -228
- package/src/sap/fe/core/rootView/Fcl.controller.ts +90 -15
- package/src/sap/fe/core/rootView/Fcl.view.xml +1 -8
- package/src/sap/fe/core/rootView/NavContainer.controller.js +41 -78
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +32 -38
- package/src/sap/fe/core/rootView/RootViewBaseController.js +110 -181
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +37 -17
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -18
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +13 -52
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -22
- package/src/sap/fe/core/services/NavigationServiceFactory.js +45 -87
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +17 -10
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -28
- package/src/sap/fe/core/services/RoutingServiceFactory.js +92 -250
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +8 -12
- package/src/sap/fe/core/services/ShellServicesFactory.js +122 -251
- package/src/sap/fe/core/services/ShellServicesFactory.ts +19 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +188 -273
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +143 -154
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +37 -135
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +59 -94
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -16
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
- package/src/sap/fe/core/support/AnnotationIssue.support.js +6 -9
- package/src/sap/fe/core/support/AnnotationIssue.support.ts +4 -4
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +6 -9
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.ts +3 -3
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +6 -9
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +3 -3
- package/src/sap/fe/core/support/CommonHelper.js +7 -16
- package/src/sap/fe/core/support/Diagnostics.js +1 -10
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +6 -9
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +3 -3
- package/src/sap/fe/core/templating/CommonFormatters.js +1 -15
- package/src/sap/fe/core/templating/CriticalityFormatters.js +4 -20
- package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -20
- package/src/sap/fe/core/templating/DataModelPathHelper.js +49 -121
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +41 -31
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +8 -15
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +7 -7
- package/src/sap/fe/core/templating/EntitySetHelper.js +6 -31
- package/src/sap/fe/core/templating/FieldControlHelper.js +4 -21
- package/src/sap/fe/core/templating/FieldControlHelper.ts +1 -1
- package/src/sap/fe/core/templating/FilterHelper.js +40 -111
- package/src/sap/fe/core/templating/FilterHelper.ts +20 -16
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -19
- package/src/sap/fe/core/templating/FilterTemplating.ts +1 -1
- package/src/sap/fe/core/templating/PropertyFormatters.js +1 -34
- package/src/sap/fe/core/templating/PropertyHelper.js +120 -163
- package/src/sap/fe/core/templating/PropertyHelper.ts +69 -33
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +46 -0
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +34 -0
- package/src/sap/fe/core/templating/UIFormatters.js +40 -180
- package/src/sap/fe/core/templating/UIFormatters.ts +37 -43
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -14
- package/src/sap/fe/core/type/Email.js +1 -10
- package/src/sap/fe/core/type/TypeUtil.js +1 -11
- package/ui5.yaml +0 -1
- package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +0 -35
- package/src/sap/fe/core/helpers/LRMessageStrip.js +0 -234
- package/src/sap/fe/core/helpers/LRMessageStrip.ts +0 -216
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText", "sap/m/MessageBox", "sap/m/MessageItem", "sap/m/MessageToast", "sap/m/MessageView", "sap/m/Text", "sap/ui/core/Core", "sap/ui/core/format/DateFormat", "sap/ui/core/IconPool", "sap/ui/core/library", "sap/ui/core/message/Message", "sap/ui/model/Filter", "sap/ui/model/FilterOperator", "sap/ui/model/json/JSONModel"], function (Bar, Button, Dialog, FormattedText, MessageBox, MessageItem, MessageToast, MessageView, Text, Core, DateFormat, IconPool, CoreLib, Message, Filter, FilterOperator, JSONModel) {
|
|
5
|
+
sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText", "sap/m/MessageBox", "sap/m/MessageItem", "sap/m/MessageToast", "sap/m/MessageView", "sap/m/Text", "sap/ui/core/Core", "sap/ui/core/format/DateFormat", "sap/ui/core/IconPool", "sap/ui/core/library", "sap/ui/core/message/Message", "sap/ui/model/Filter", "sap/ui/model/FilterOperator", "sap/ui/model/json/JSONModel", "sap/ui/model/Sorter", "../../CommonUtils"], function (Bar, Button, Dialog, FormattedText, MessageBox, MessageItem, MessageToast, MessageView, Text, Core, DateFormat, IconPool, CoreLib, Message, Filter, FilterOperator, JSONModel, Sorter, CommonUtils) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var MessageType = CoreLib.MessageType;
|
|
@@ -12,82 +12,76 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
12
12
|
var oDialog;
|
|
13
13
|
var oBackButton;
|
|
14
14
|
var oMessageView;
|
|
15
|
-
|
|
16
15
|
function fnFormatTechnicalDetails() {
|
|
17
|
-
var sPreviousGroupName;
|
|
16
|
+
var sPreviousGroupName;
|
|
18
17
|
|
|
18
|
+
// Insert technical detail if it exists
|
|
19
19
|
function insertDetail(oProperty) {
|
|
20
20
|
return oProperty.property ? "( ${" + oProperty.property + '} ? ("<p>' + oProperty.property.substr(Math.max(oProperty.property.lastIndexOf("/"), oProperty.property.lastIndexOf(".")) + 1) + ' : " + ' + "${" + oProperty.property + '} + "</p>") : "" )' : "";
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
}
|
|
22
|
+
// Insert groupname if it exists
|
|
24
23
|
function insertGroupName(oProperty) {
|
|
25
24
|
var sHTML = "";
|
|
26
|
-
|
|
27
25
|
if (oProperty.groupName && oProperty.property && oProperty.groupName !== sPreviousGroupName) {
|
|
28
26
|
sHTML += "( ${" + oProperty.property + '} ? "<br><h3>' + oProperty.groupName + '</h3>" : "" ) + ';
|
|
29
27
|
sPreviousGroupName = oProperty.groupName;
|
|
30
28
|
}
|
|
31
|
-
|
|
32
29
|
return sHTML;
|
|
33
|
-
}
|
|
34
|
-
|
|
30
|
+
}
|
|
35
31
|
|
|
32
|
+
// List of technical details to be shown
|
|
36
33
|
function getPaths() {
|
|
37
34
|
var sTD = "technicalDetails"; // name of property in message model data for technical details
|
|
38
|
-
|
|
39
35
|
return [{
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
groupName: "",
|
|
37
|
+
property: "".concat(sTD, "/status")
|
|
42
38
|
}, {
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
groupName: "",
|
|
40
|
+
property: "".concat(sTD, "/statusText")
|
|
45
41
|
}, {
|
|
46
|
-
|
|
47
|
-
|
|
42
|
+
groupName: "Application",
|
|
43
|
+
property: "".concat(sTD, "/error/@SAP__common.Application/ComponentId")
|
|
48
44
|
}, {
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
groupName: "Application",
|
|
46
|
+
property: "".concat(sTD, "/error/@SAP__common.Application/ServiceId")
|
|
51
47
|
}, {
|
|
52
|
-
|
|
53
|
-
|
|
48
|
+
groupName: "Application",
|
|
49
|
+
property: "".concat(sTD, "/error/@SAP__common.Application/ServiceRepository")
|
|
54
50
|
}, {
|
|
55
|
-
|
|
56
|
-
|
|
51
|
+
groupName: "Application",
|
|
52
|
+
property: "".concat(sTD, "/error/@SAP__common.Application/ServiceVersion")
|
|
57
53
|
}, {
|
|
58
|
-
|
|
59
|
-
|
|
54
|
+
groupName: "ErrorResolution",
|
|
55
|
+
property: "".concat(sTD, "/error/@SAP__common.ErrorResolution/Analysis")
|
|
60
56
|
}, {
|
|
61
|
-
|
|
62
|
-
|
|
57
|
+
groupName: "ErrorResolution",
|
|
58
|
+
property: "".concat(sTD, "/error/@SAP__common.ErrorResolution/Note")
|
|
63
59
|
}, {
|
|
64
|
-
|
|
65
|
-
|
|
60
|
+
groupName: "ErrorResolution",
|
|
61
|
+
property: "".concat(sTD, "/error/@SAP__common.ErrorResolution/DetailedNote")
|
|
66
62
|
}, {
|
|
67
|
-
|
|
68
|
-
|
|
63
|
+
groupName: "ErrorResolution",
|
|
64
|
+
property: "".concat(sTD, "/error/@SAP__common.ExceptionCategory")
|
|
69
65
|
}, {
|
|
70
|
-
|
|
71
|
-
|
|
66
|
+
groupName: "ErrorResolution",
|
|
67
|
+
property: "".concat(sTD, "/error/@SAP__common.TimeStamp")
|
|
72
68
|
}, {
|
|
73
|
-
|
|
74
|
-
|
|
69
|
+
groupName: "ErrorResolution",
|
|
70
|
+
property: "".concat(sTD, "/error/@SAP__common.TransactionId")
|
|
75
71
|
}, {
|
|
76
|
-
|
|
77
|
-
|
|
72
|
+
groupName: "Messages",
|
|
73
|
+
property: "".concat(sTD, "/error/code")
|
|
78
74
|
}, {
|
|
79
|
-
|
|
80
|
-
|
|
75
|
+
groupName: "Messages",
|
|
76
|
+
property: "".concat(sTD, "/error/message")
|
|
81
77
|
}];
|
|
82
78
|
}
|
|
83
|
-
|
|
84
79
|
var sHTML = "Object.keys(" + "${technicalDetails}" + ').length > 0 ? "<h2>Technical Details</h2>" : "" ';
|
|
85
80
|
getPaths().forEach(function (oProperty) {
|
|
86
81
|
sHTML = "".concat(sHTML + insertGroupName(oProperty)).concat(insertDetail(oProperty), " + ");
|
|
87
82
|
});
|
|
88
83
|
return sHTML;
|
|
89
84
|
}
|
|
90
|
-
|
|
91
85
|
function fnFormatDescription() {
|
|
92
86
|
return "(${" + 'description} ? ("<h2>Description</h2>" + ${' + 'description}) : "")';
|
|
93
87
|
}
|
|
@@ -102,8 +96,6 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
102
96
|
* @private
|
|
103
97
|
* @ui5-restricted
|
|
104
98
|
*/
|
|
105
|
-
|
|
106
|
-
|
|
107
99
|
function fnGetHighestMessagePriority(aMessages) {
|
|
108
100
|
var sMessagePriority = MessageType.None;
|
|
109
101
|
var iLength = aMessages.length;
|
|
@@ -113,11 +105,9 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
113
105
|
Success: 0,
|
|
114
106
|
Information: 0
|
|
115
107
|
};
|
|
116
|
-
|
|
117
108
|
for (var i = 0; i < iLength; i++) {
|
|
118
109
|
++oMessageCount[aMessages[i].getType()];
|
|
119
110
|
}
|
|
120
|
-
|
|
121
111
|
if (oMessageCount[MessageType.Error] > 0) {
|
|
122
112
|
sMessagePriority = MessageType.Error;
|
|
123
113
|
} else if (oMessageCount[MessageType.Warning] > 0) {
|
|
@@ -127,26 +117,22 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
127
117
|
} else if (oMessageCount[MessageType.Information] > 0) {
|
|
128
118
|
sMessagePriority = MessageType.Information;
|
|
129
119
|
}
|
|
130
|
-
|
|
131
120
|
return sMessagePriority;
|
|
132
|
-
}
|
|
121
|
+
}
|
|
122
|
+
// function which modify e-Tag messages only.
|
|
133
123
|
// returns : true, if any e-Tag message is modified, otherwise false.
|
|
134
|
-
|
|
135
|
-
|
|
136
124
|
function fnModifyETagMessagesOnly(oMessageManager, oResourceBundle, concurrentEditFlag) {
|
|
137
125
|
var aMessages = oMessageManager.getMessageModel().getObject("/");
|
|
138
126
|
var bMessagesModified = false;
|
|
139
127
|
var sEtagMessage = "";
|
|
140
128
|
aMessages.forEach(function (oMessage, i) {
|
|
141
129
|
var oTechnicalDetails = oMessage.getTechnicalDetails && oMessage.getTechnicalDetails();
|
|
142
|
-
|
|
143
130
|
if (oTechnicalDetails && oTechnicalDetails.httpStatus === 412) {
|
|
144
131
|
if (oTechnicalDetails.isConcurrentModification && concurrentEditFlag) {
|
|
145
132
|
sEtagMessage = sEtagMessage || oResourceBundle.getText("C_APP_COMPONENT_SAPFE_ETAG_TECHNICAL_ISSUES_CONCURRENT_MODIFICATION");
|
|
146
133
|
} else {
|
|
147
134
|
sEtagMessage = sEtagMessage || oResourceBundle.getText("C_APP_COMPONENT_SAPFE_ETAG_TECHNICAL_ISSUES");
|
|
148
135
|
}
|
|
149
|
-
|
|
150
136
|
oMessageManager.removeMessages(aMessages[i]);
|
|
151
137
|
oMessage.setMessage(sEtagMessage);
|
|
152
138
|
oMessage.target = "";
|
|
@@ -155,32 +141,26 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
155
141
|
}
|
|
156
142
|
});
|
|
157
143
|
return bMessagesModified;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
|
|
144
|
+
}
|
|
145
|
+
// Dialog close Handling
|
|
161
146
|
function dialogCloseHandler() {
|
|
162
147
|
oDialog.close();
|
|
163
148
|
oBackButton.setVisible(false);
|
|
164
149
|
aMessageList = [];
|
|
165
150
|
var oMessageDialogModel = oMessageView.getModel();
|
|
166
|
-
|
|
167
151
|
if (oMessageDialogModel) {
|
|
168
152
|
oMessageDialogModel.setData({});
|
|
169
153
|
}
|
|
170
|
-
|
|
171
154
|
removeUnboundTransitionMessages();
|
|
172
155
|
}
|
|
173
|
-
|
|
174
156
|
function getRetryAfterMessage(oMessage, bMessageDialog) {
|
|
175
157
|
var dNow = new Date();
|
|
176
158
|
var oTechnicalDetails = oMessage.getTechnicalDetails();
|
|
177
159
|
var oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
|
|
178
160
|
var sRetryAfterMessage;
|
|
179
|
-
|
|
180
161
|
if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && oTechnicalDetails.retryAfter) {
|
|
181
162
|
var dRetryAfter = oTechnicalDetails.retryAfter;
|
|
182
163
|
var oDateFormat;
|
|
183
|
-
|
|
184
164
|
if (dNow.getFullYear() !== dRetryAfter.getFullYear()) {
|
|
185
165
|
//different years
|
|
186
166
|
oDateFormat = DateFormat.getDateTimeInstance({
|
|
@@ -196,7 +176,6 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
196
176
|
oDateFormat = DateFormat.getDateTimeInstance({
|
|
197
177
|
pattern: "MMMM dd 'at' hh:mm a"
|
|
198
178
|
}); //different months or different days of same month
|
|
199
|
-
|
|
200
179
|
sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR", [oDateFormat.format(dRetryAfter)]);
|
|
201
180
|
} else {
|
|
202
181
|
//same day
|
|
@@ -207,17 +186,13 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
207
186
|
}
|
|
208
187
|
}
|
|
209
188
|
}
|
|
210
|
-
|
|
211
189
|
if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && !oTechnicalDetails.retryAfter) {
|
|
212
190
|
sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR_NO_RETRY_AFTER");
|
|
213
191
|
}
|
|
214
|
-
|
|
215
192
|
return sRetryAfterMessage;
|
|
216
193
|
}
|
|
217
|
-
|
|
218
194
|
function prepareMessageViewForDialog(oMessageDialogModel, bStrictHandlingFlow, multi412) {
|
|
219
195
|
var oMessageTemplate;
|
|
220
|
-
|
|
221
196
|
if (!bStrictHandlingFlow) {
|
|
222
197
|
oMessageTemplate = new MessageItem(undefined, {
|
|
223
198
|
counter: {
|
|
@@ -229,6 +204,7 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
229
204
|
type: {
|
|
230
205
|
path: "type"
|
|
231
206
|
},
|
|
207
|
+
groupName: "{headerName}",
|
|
232
208
|
description: "{= ${" + "description} || ${technicalDetails} ? " + '"<html><body>" + ' + fnFormatDescription() + " + " + fnFormatTechnicalDetails() + '"</body></html>"' + ' : "" }',
|
|
233
209
|
markupDescription: true
|
|
234
210
|
});
|
|
@@ -255,7 +231,6 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
255
231
|
longtextUrl: "{descriptionUrl}"
|
|
256
232
|
});
|
|
257
233
|
}
|
|
258
|
-
|
|
259
234
|
oMessageView = new MessageView({
|
|
260
235
|
showDetailsPageHeader: false,
|
|
261
236
|
itemSelect: function () {
|
|
@@ -266,6 +241,7 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
266
241
|
template: oMessageTemplate
|
|
267
242
|
}
|
|
268
243
|
});
|
|
244
|
+
oMessageView.setGroupItems(true);
|
|
269
245
|
oBackButton = oBackButton || new Button({
|
|
270
246
|
icon: IconPool.getIconURI("nav-back"),
|
|
271
247
|
visible: false,
|
|
@@ -273,16 +249,15 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
273
249
|
oMessageView.navigateBack();
|
|
274
250
|
this.setVisible(false);
|
|
275
251
|
}
|
|
276
|
-
});
|
|
277
|
-
|
|
252
|
+
});
|
|
253
|
+
// Update proper ETag Mismatch error
|
|
278
254
|
oMessageView.setModel(oMessageDialogModel);
|
|
279
255
|
return {
|
|
280
256
|
oMessageView: oMessageView,
|
|
281
257
|
oBackButton: oBackButton
|
|
282
258
|
};
|
|
283
259
|
}
|
|
284
|
-
|
|
285
|
-
function showUnboundMessages(aCustomMessages, oContext, bShowBoundTransition, concurrentEditFlag, bOnlyForTest, onBeforeShowMessage) {
|
|
260
|
+
function showUnboundMessages(aCustomMessages, oContext, bShowBoundTransition, concurrentEditFlag, control, sActionName, bOnlyForTest, onBeforeShowMessage, viewType) {
|
|
286
261
|
var aTransitionMessages = this.getMessages();
|
|
287
262
|
var oMessageManager = Core.getMessageManager();
|
|
288
263
|
var sHighestPriority;
|
|
@@ -293,42 +268,34 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
293
268
|
value1: false
|
|
294
269
|
})];
|
|
295
270
|
var showMessageDialog = false,
|
|
296
|
-
|
|
297
|
-
|
|
271
|
+
showMessageBox = false;
|
|
298
272
|
if (bShowBoundTransition) {
|
|
299
|
-
aTransitionMessages = aTransitionMessages.concat(getMessages(true, true));
|
|
300
|
-
|
|
273
|
+
aTransitionMessages = aTransitionMessages.concat(getMessages(true, true));
|
|
274
|
+
// we only want to show bound transition messages not bound state messages hence add a filter for the same
|
|
301
275
|
aFilters.push(new Filter({
|
|
302
276
|
path: "persistent",
|
|
303
277
|
operator: FilterOperator.EQ,
|
|
304
278
|
value1: true
|
|
305
279
|
}));
|
|
306
|
-
|
|
307
280
|
var fnCheckControlIdInDialog = function (aControlIds) {
|
|
308
281
|
var index = Infinity,
|
|
309
|
-
|
|
282
|
+
oControl = Core.byId(aControlIds[0]);
|
|
310
283
|
var errorFieldControl = Core.byId(aControlIds[0]);
|
|
311
|
-
|
|
312
284
|
while (oControl) {
|
|
313
285
|
var fieldRankinDialog = oControl instanceof Dialog ? errorFieldControl.getParent().findElements(true).indexOf(errorFieldControl) : Infinity;
|
|
314
|
-
|
|
315
286
|
if (oControl instanceof Dialog) {
|
|
316
287
|
if (index > fieldRankinDialog) {
|
|
317
|
-
index = fieldRankinDialog;
|
|
318
|
-
|
|
288
|
+
index = fieldRankinDialog;
|
|
289
|
+
// Set the focus to the dialog's control
|
|
319
290
|
errorFieldControl.focus();
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
|
|
291
|
+
}
|
|
292
|
+
// messages with target inside sap.m.Dialog should not bring up the message dialog
|
|
323
293
|
return false;
|
|
324
294
|
}
|
|
325
|
-
|
|
326
295
|
oControl = oControl.getParent();
|
|
327
296
|
}
|
|
328
|
-
|
|
329
297
|
return true;
|
|
330
298
|
};
|
|
331
|
-
|
|
332
299
|
aFilters.push(new Filter({
|
|
333
300
|
path: "controlIds",
|
|
334
301
|
test: fnCheckControlIdInDialog,
|
|
@@ -342,7 +309,6 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
342
309
|
value1: ""
|
|
343
310
|
}));
|
|
344
311
|
}
|
|
345
|
-
|
|
346
312
|
if (aCustomMessages && aCustomMessages.length) {
|
|
347
313
|
aCustomMessages.forEach(function (oMessage) {
|
|
348
314
|
var messageCode = oMessage.code ? oMessage.code : "";
|
|
@@ -352,56 +318,49 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
352
318
|
target: "",
|
|
353
319
|
persistent: true,
|
|
354
320
|
code: messageCode
|
|
355
|
-
}));
|
|
321
|
+
}));
|
|
322
|
+
//The target and persistent properties of the message are hardcoded as "" and true because the function deals with only unbound messages.
|
|
356
323
|
});
|
|
357
324
|
}
|
|
358
325
|
|
|
359
326
|
var oMessageDialogModel = oMessageView && oMessageView.getModel() || new JSONModel();
|
|
360
327
|
var bHasEtagMessage = this.modifyETagMessagesOnly(oMessageManager, Core.getLibraryResourceBundle("sap.fe.core"), concurrentEditFlag);
|
|
361
|
-
|
|
362
328
|
if (aTransitionMessages.length === 1 && aTransitionMessages[0].getCode() === "503") {
|
|
363
329
|
showMessageBox = true;
|
|
364
330
|
} else if (aTransitionMessages.length !== 0) {
|
|
365
331
|
showMessageDialog = true;
|
|
366
332
|
}
|
|
367
|
-
|
|
368
333
|
var showMessageParameters;
|
|
369
334
|
var aModelDataArray = [];
|
|
370
|
-
|
|
371
335
|
if (showMessageDialog || !showMessageBox && !onBeforeShowMessage) {
|
|
372
336
|
var oListBinding = oMessageManager.getMessageModel().bindList("/", undefined, undefined, aFilters),
|
|
373
|
-
|
|
374
|
-
|
|
337
|
+
aCurrentContexts = oListBinding.getCurrentContexts();
|
|
375
338
|
if (aCurrentContexts && aCurrentContexts.length > 0) {
|
|
376
|
-
showMessageDialog = true;
|
|
339
|
+
showMessageDialog = true;
|
|
340
|
+
// Don't show dialog incase there are no errors to show
|
|
341
|
+
|
|
377
342
|
// if false, show messages in dialog
|
|
378
343
|
// As fitering has already happened here hence
|
|
379
344
|
// using the message model again for the message dialog view and then filtering on that binding again is unnecessary.
|
|
380
345
|
// So we create new json model to use for the message dialog view.
|
|
381
|
-
|
|
382
346
|
var aMessages = [];
|
|
383
347
|
aCurrentContexts.forEach(function (currentContext) {
|
|
384
348
|
var oMessage = currentContext.getObject();
|
|
385
349
|
aMessages.push(oMessage);
|
|
386
350
|
aMessageDataList = aMessages;
|
|
387
|
-
});
|
|
388
|
-
// oMessageDialogModel.setData(aMessages);
|
|
389
|
-
// }
|
|
390
|
-
|
|
351
|
+
});
|
|
391
352
|
var existingMessages = [];
|
|
392
|
-
|
|
393
353
|
if (Array.isArray(oMessageDialogModel.getData())) {
|
|
394
354
|
existingMessages = oMessageDialogModel.getData();
|
|
395
355
|
}
|
|
396
|
-
|
|
397
356
|
var oUniqueObj = {};
|
|
398
357
|
aModelDataArray = aMessageDataList.concat(existingMessages).filter(function (obj) {
|
|
399
358
|
// remove entries having duplicate message ids
|
|
400
359
|
return !oUniqueObj[obj.id] && (oUniqueObj[obj.id] = true);
|
|
401
360
|
});
|
|
361
|
+
oMessageDialogModel.setData(aModelDataArray);
|
|
402
362
|
}
|
|
403
363
|
}
|
|
404
|
-
|
|
405
364
|
if (onBeforeShowMessage) {
|
|
406
365
|
showMessageParameters = {
|
|
407
366
|
showMessageBox: showMessageBox,
|
|
@@ -410,48 +369,54 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
410
369
|
showMessageParameters = onBeforeShowMessage(aTransitionMessages, showMessageParameters);
|
|
411
370
|
showMessageBox = showMessageParameters.showMessageBox;
|
|
412
371
|
showMessageDialog = showMessageParameters.showMessageDialog;
|
|
413
|
-
|
|
414
372
|
if (showMessageDialog) {
|
|
415
373
|
aModelDataArray = showMessageParameters.filteredMessages ? showMessageParameters.filteredMessages : aModelDataArray;
|
|
416
374
|
}
|
|
417
375
|
}
|
|
418
|
-
|
|
419
376
|
if (aTransitionMessages.length === 0 && !aCustomMessages && !bHasEtagMessage) {
|
|
420
377
|
// Don't show the popup if there are no transient messages
|
|
421
378
|
return Promise.resolve(true);
|
|
422
379
|
} else if (aTransitionMessages.length === 1 && aTransitionMessages[0].getType() === MessageType.Success && !aCustomMessages) {
|
|
423
380
|
return new Promise(function (resolve) {
|
|
424
381
|
MessageToast.show(aTransitionMessages[0].message);
|
|
425
|
-
|
|
426
382
|
if (oMessageDialogModel) {
|
|
427
383
|
oMessageDialogModel.setData({});
|
|
428
384
|
}
|
|
429
|
-
|
|
430
385
|
oMessageManager.removeMessages(aTransitionMessages);
|
|
431
386
|
resolve();
|
|
432
387
|
});
|
|
433
388
|
} else if (showMessageDialog) {
|
|
389
|
+
messageHandling.updateMessageObjectGroupName(aModelDataArray, control, sActionName, viewType);
|
|
434
390
|
oMessageDialogModel.setData(aModelDataArray); // set the messages here so that if any of them are filtered for APD, they are filtered here as well.
|
|
435
|
-
|
|
436
391
|
aResolveFunctions = aResolveFunctions || [];
|
|
437
392
|
return new Promise(function (resolve, reject) {
|
|
438
393
|
aResolveFunctions.push(resolve);
|
|
439
394
|
Core.getLibraryResourceBundle("sap.fe.core", true).then(function (oResourceBundle) {
|
|
440
395
|
var bStrictHandlingFlow = false;
|
|
441
|
-
|
|
442
396
|
if (showMessageParameters && showMessageParameters.fnGetMessageSubtitle) {
|
|
443
397
|
oMessageDialogModel.getData().forEach(function (oMessage) {
|
|
444
398
|
showMessageParameters.fnGetMessageSubtitle(oMessage);
|
|
445
399
|
});
|
|
446
400
|
}
|
|
447
|
-
|
|
448
401
|
var oMessageObject = prepareMessageViewForDialog(oMessageDialogModel, bStrictHandlingFlow);
|
|
402
|
+
var oSorter = new Sorter("", undefined, undefined, function (obj1, obj2) {
|
|
403
|
+
var rankA = getMessageRank(obj1);
|
|
404
|
+
var rankB = getMessageRank(obj2);
|
|
405
|
+
if (rankA < rankB) {
|
|
406
|
+
return -1;
|
|
407
|
+
}
|
|
408
|
+
if (rankA > rankB) {
|
|
409
|
+
return 1;
|
|
410
|
+
}
|
|
411
|
+
return 0;
|
|
412
|
+
});
|
|
413
|
+
oMessageObject.oMessageView.getBinding("items").sort(oSorter);
|
|
449
414
|
oDialog = oDialog && oDialog.isOpen() ? oDialog : new Dialog({
|
|
450
415
|
resizable: true,
|
|
451
416
|
endButton: new Button({
|
|
452
417
|
press: function () {
|
|
453
|
-
dialogCloseHandler();
|
|
454
|
-
|
|
418
|
+
dialogCloseHandler();
|
|
419
|
+
// also remove bound transition messages if we were showing them
|
|
455
420
|
oMessageManager.removeMessages(aModelDataArray);
|
|
456
421
|
},
|
|
457
422
|
text: oResourceBundle.getText("C_COMMON_SAPFE_CLOSE")
|
|
@@ -469,23 +434,19 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
469
434
|
for (var i = 0; i < aResolveFunctions.length; i++) {
|
|
470
435
|
aResolveFunctions[i].call();
|
|
471
436
|
}
|
|
472
|
-
|
|
473
437
|
aResolveFunctions = [];
|
|
474
438
|
}
|
|
475
439
|
});
|
|
476
440
|
oDialog.removeAllContent();
|
|
477
441
|
oDialog.addContent(oMessageObject.oMessageView);
|
|
478
|
-
|
|
479
442
|
if (bHasEtagMessage) {
|
|
480
443
|
sap.ui.require(["sap/m/ButtonType"], function (ButtonType) {
|
|
481
444
|
oDialog.setBeginButton(new Button({
|
|
482
445
|
press: function () {
|
|
483
446
|
dialogCloseHandler();
|
|
484
|
-
|
|
485
447
|
if (oContext.hasPendingChanges()) {
|
|
486
448
|
oContext.getBinding().resetChanges();
|
|
487
449
|
}
|
|
488
|
-
|
|
489
450
|
oContext.refresh();
|
|
490
451
|
},
|
|
491
452
|
text: oResourceBundle.getText("C_COMMON_SAPFE_REFRESH"),
|
|
@@ -495,14 +456,12 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
495
456
|
} else {
|
|
496
457
|
oDialog.destroyBeginButton();
|
|
497
458
|
}
|
|
498
|
-
|
|
499
459
|
sHighestPriority = fnGetHighestMessagePriority(oMessageView.getItems());
|
|
500
460
|
sHighestPriorityText = getTranslatedTextForMessageDialog(sHighestPriority);
|
|
501
461
|
oDialog.setState(sHighestPriority);
|
|
502
462
|
oDialog.getCustomHeader().getContentMiddle()[0].setText(sHighestPriorityText);
|
|
503
463
|
oMessageView.navigateBack();
|
|
504
464
|
oDialog.open();
|
|
505
|
-
|
|
506
465
|
if (bOnlyForTest) {
|
|
507
466
|
resolve(oDialog);
|
|
508
467
|
}
|
|
@@ -511,37 +470,30 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
511
470
|
} else if (showMessageBox) {
|
|
512
471
|
return new Promise(function (resolve) {
|
|
513
472
|
var oMessage = aTransitionMessages[0];
|
|
514
|
-
|
|
515
473
|
if (oMessage.technicalDetails && aMessageList.indexOf(oMessage.technicalDetails.originalMessage.message) === -1) {
|
|
516
474
|
aMessageList.push(oMessage.technicalDetails.originalMessage.message);
|
|
517
475
|
var formattedTextString = "<html><body>";
|
|
518
476
|
var retryAfterMessage = getRetryAfterMessage(oMessage, true);
|
|
519
|
-
|
|
520
477
|
if (retryAfterMessage) {
|
|
521
478
|
formattedTextString = "<h6>".concat(retryAfterMessage, "</h6><br>");
|
|
522
479
|
}
|
|
523
|
-
|
|
524
480
|
if (showMessageParameters && showMessageParameters.fnGetMessageSubtitle) {
|
|
525
481
|
showMessageParameters.fnGetMessageSubtitle(oMessage);
|
|
526
482
|
}
|
|
527
|
-
|
|
528
483
|
if (oMessage.getCode() !== "503" && oMessage.getAdditionalText() !== undefined) {
|
|
529
484
|
formattedTextString = "".concat(formattedTextString + oMessage.getAdditionalText(), ": ").concat(oMessage.getMessage(), "</html></body>");
|
|
530
485
|
} else {
|
|
531
486
|
formattedTextString = "".concat(formattedTextString + oMessage.getMessage(), "</html></body>");
|
|
532
487
|
}
|
|
533
|
-
|
|
534
488
|
var formattedText = new FormattedText({
|
|
535
489
|
htmlText: formattedTextString
|
|
536
490
|
});
|
|
537
491
|
MessageBox.error(formattedText, {
|
|
538
492
|
onClose: function () {
|
|
539
493
|
aMessageList = [];
|
|
540
|
-
|
|
541
494
|
if (bShowBoundTransition) {
|
|
542
495
|
removeBoundTransitionMessages();
|
|
543
496
|
}
|
|
544
|
-
|
|
545
497
|
removeUnboundTransitionMessages();
|
|
546
498
|
resolve(true);
|
|
547
499
|
}
|
|
@@ -553,40 +505,446 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
553
505
|
}
|
|
554
506
|
}
|
|
555
507
|
|
|
556
|
-
|
|
508
|
+
/**
|
|
509
|
+
* This function sets the group name for all messages in a dialog.
|
|
510
|
+
*
|
|
511
|
+
* @param aModelDataArray Messages array
|
|
512
|
+
* @param control
|
|
513
|
+
* @param sActionName
|
|
514
|
+
* @param viewType
|
|
515
|
+
*/
|
|
516
|
+
function updateMessageObjectGroupName(aModelDataArray, control, sActionName, viewType) {
|
|
517
|
+
aModelDataArray.forEach(function (aModelData) {
|
|
518
|
+
var _aModelData$target;
|
|
519
|
+
aModelData["headerName"] = "";
|
|
520
|
+
if (!((_aModelData$target = aModelData.target) !== null && _aModelData$target !== void 0 && _aModelData$target.length)) {
|
|
521
|
+
// unbound transiiton messages
|
|
522
|
+
aModelData["headerName"] = "General";
|
|
523
|
+
} else if (aModelData.target.length) {
|
|
524
|
+
// LR flow
|
|
525
|
+
if (viewType === "ListReport") {
|
|
526
|
+
messageHandling.setGroupNameLRTable(control, aModelData, sActionName);
|
|
527
|
+
} else if (viewType === "ObjectPage") {
|
|
528
|
+
// OP Display mode
|
|
529
|
+
messageHandling.setGroupNameOPDisplayMode(aModelData, sActionName, control);
|
|
530
|
+
} else {
|
|
531
|
+
aModelData["headerName"] = messageHandling.getLastActionTextAndActionName(sActionName);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/**
|
|
538
|
+
* This function will set the group name of Message Object for LR table.
|
|
539
|
+
*
|
|
540
|
+
* @param oElem
|
|
541
|
+
* @param aModelData
|
|
542
|
+
* @param sActionName
|
|
543
|
+
*/
|
|
544
|
+
function setGroupNameLRTable(oElem, aModelData, sActionName) {
|
|
545
|
+
var oRowBinding = oElem && oElem.getRowBinding();
|
|
546
|
+
if (oRowBinding) {
|
|
547
|
+
var _aModelData$target2;
|
|
548
|
+
var sElemeBindingPath = "".concat(oElem.getRowBinding().getPath());
|
|
549
|
+
if (((_aModelData$target2 = aModelData.target) === null || _aModelData$target2 === void 0 ? void 0 : _aModelData$target2.indexOf(sElemeBindingPath)) === 0) {
|
|
550
|
+
var allRowContexts = oElem.getRowBinding().getContexts();
|
|
551
|
+
allRowContexts.forEach(function (rowContext) {
|
|
552
|
+
var _aModelData$target3;
|
|
553
|
+
if ((_aModelData$target3 = aModelData.target) !== null && _aModelData$target3 !== void 0 && _aModelData$target3.includes(rowContext.getPath())) {
|
|
554
|
+
var contextPath = "".concat(rowContext.getPath(), "/");
|
|
555
|
+
var identifierColumn = oElem.getParent().getIdentifierColumn();
|
|
556
|
+
var rowIdentifier = identifierColumn && rowContext.getObject()[identifierColumn];
|
|
557
|
+
var columnPropertyName = messageHandling.getTableColProperty(oElem, aModelData, contextPath);
|
|
558
|
+
var _messageHandling$getT = messageHandling.getTableColInfo(oElem, columnPropertyName),
|
|
559
|
+
_sTableTargetColName = _messageHandling$getT.sTableTargetColName;
|
|
560
|
+
|
|
561
|
+
// if target has some column name and column is visible in UI
|
|
562
|
+
if (columnPropertyName && _sTableTargetColName) {
|
|
563
|
+
// header will be row Identifier, if found from above code otherwise it should be table name
|
|
564
|
+
aModelData["headerName"] = rowIdentifier ? " ".concat(rowIdentifier) : oElem.getHeader();
|
|
565
|
+
} else {
|
|
566
|
+
// if column data not found (may be the column is hidden), add grouping as Last Action
|
|
567
|
+
aModelData["headerName"] = messageHandling.getLastActionTextAndActionName(sActionName);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
/**
|
|
576
|
+
* This function will set the group name of Message Object in OP Display mode.
|
|
577
|
+
*
|
|
578
|
+
* @param aModelData Message Object
|
|
579
|
+
* @param sActionName Action name
|
|
580
|
+
* @param control
|
|
581
|
+
*/
|
|
582
|
+
function setGroupNameOPDisplayMode(aModelData, sActionName, control) {
|
|
583
|
+
var oViewContext = control === null || control === void 0 ? void 0 : control.getBindingContext();
|
|
584
|
+
var opLayout = (control === null || control === void 0 ? void 0 : control.getContent) && (control === null || control === void 0 ? void 0 : control.getContent()[0]);
|
|
585
|
+
var bIsGeneralGroupName = true;
|
|
586
|
+
if (opLayout) {
|
|
587
|
+
messageHandling.getVisibleSectionsFromObjectPageLayout(opLayout).forEach(function (oSection) {
|
|
588
|
+
var subSections = oSection.getSubSections();
|
|
589
|
+
subSections.forEach(function (oSubSection) {
|
|
590
|
+
oSubSection.findElements(true).forEach(function (oElem) {
|
|
591
|
+
if (oElem.isA("sap.ui.mdc.Table")) {
|
|
592
|
+
var _oRowBinding = oElem.getRowBinding(),
|
|
593
|
+
_setSectionNameInGroup = true;
|
|
594
|
+
var childTableElement;
|
|
595
|
+
oElem.findElements(true).forEach(function (oElement) {
|
|
596
|
+
if (oElement.isA("sap.m.Table") || oElement.isA("sap.ui.table.Table")) {
|
|
597
|
+
childTableElement = oElement;
|
|
598
|
+
}
|
|
599
|
+
});
|
|
600
|
+
if (_oRowBinding) {
|
|
601
|
+
var _oElem$getRowBinding, _aModelData$target4;
|
|
602
|
+
var sElemeBindingPath = "".concat(oViewContext === null || oViewContext === void 0 ? void 0 : oViewContext.getPath(), "/").concat((_oElem$getRowBinding = oElem.getRowBinding()) === null || _oElem$getRowBinding === void 0 ? void 0 : _oElem$getRowBinding.getPath());
|
|
603
|
+
if (((_aModelData$target4 = aModelData.target) === null || _aModelData$target4 === void 0 ? void 0 : _aModelData$target4.indexOf(sElemeBindingPath)) === 0) {
|
|
604
|
+
var _obj = messageHandling.getTableColumnDataAndSetSubtile(aModelData, oElem, childTableElement, _oRowBinding, sActionName, _setSectionNameInGroup, fnCallbackSetGroupName);
|
|
605
|
+
var _oTargetTableInfo = _obj.oTargetTableInfo;
|
|
606
|
+
if (_setSectionNameInGroup) {
|
|
607
|
+
var identifierColumn = oElem.getParent().getIdentifierColumn();
|
|
608
|
+
if (identifierColumn) {
|
|
609
|
+
var allRowContexts = oElem.getRowBinding().getContexts();
|
|
610
|
+
allRowContexts.forEach(function (rowContext) {
|
|
611
|
+
var _aModelData$target5;
|
|
612
|
+
if ((_aModelData$target5 = aModelData.target) !== null && _aModelData$target5 !== void 0 && _aModelData$target5.includes(rowContext.getPath())) {
|
|
613
|
+
var rowIdentifier = identifierColumn ? rowContext.getObject()[identifierColumn] : undefined;
|
|
614
|
+
aModelData["additionalText"] = "".concat(rowIdentifier, ", ").concat(_oTargetTableInfo.sTableTargetColName);
|
|
615
|
+
}
|
|
616
|
+
});
|
|
617
|
+
} else {
|
|
618
|
+
aModelData["additionalText"] = "".concat(_oTargetTableInfo.sTableTargetColName);
|
|
619
|
+
}
|
|
620
|
+
var headerName = oElem.getHeaderVisible() && _oTargetTableInfo.tableHeader;
|
|
621
|
+
if (!headerName) {
|
|
622
|
+
headerName = oSubSection.getTitle();
|
|
623
|
+
} else {
|
|
624
|
+
var _oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
|
|
625
|
+
headerName = "".concat(_oResourceBundle.getText("T_MESSAGE_GROUP_TITLE_TABLE_DENOMINATOR"), ": ").concat(headerName);
|
|
626
|
+
}
|
|
627
|
+
aModelData["headerName"] = headerName;
|
|
628
|
+
bIsGeneralGroupName = false;
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
});
|
|
634
|
+
});
|
|
635
|
+
});
|
|
636
|
+
}
|
|
637
|
+
if (bIsGeneralGroupName) {
|
|
638
|
+
var _aModelData$target6;
|
|
639
|
+
var sElemeBindingPath = "".concat(oViewContext === null || oViewContext === void 0 ? void 0 : oViewContext.getPath());
|
|
640
|
+
if (((_aModelData$target6 = aModelData.target) === null || _aModelData$target6 === void 0 ? void 0 : _aModelData$target6.indexOf(sElemeBindingPath)) === 0) {
|
|
641
|
+
// check if OP context path is part of target, set Last Action as group name
|
|
642
|
+
var headerName = messageHandling.getLastActionTextAndActionName(sActionName);
|
|
643
|
+
aModelData["headerName"] = headerName;
|
|
644
|
+
} else {
|
|
645
|
+
aModelData["headerName"] = "General";
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
function getLastActionTextAndActionName(sActionName) {
|
|
650
|
+
var sLastActionText = Core.getLibraryResourceBundle("sap.fe.core").getText("T_MESSAGE_BUTTON_SAPFE_MESSAGE_GROUP_LAST_ACTION");
|
|
651
|
+
return sActionName ? "".concat(sLastActionText, ": ").concat(sActionName) : "";
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
/**
|
|
655
|
+
* This function will give rank based on Message Group/Header name, which will be used for Sorting messages in Message dialog
|
|
656
|
+
* Last Action should be shown at top, next Row Id and last General.
|
|
657
|
+
*
|
|
658
|
+
* @param obj
|
|
659
|
+
* @returns Rank of message
|
|
660
|
+
*/
|
|
661
|
+
function getMessageRank(obj) {
|
|
662
|
+
var _obj$headerName, _obj$headerName2;
|
|
663
|
+
if ((_obj$headerName = obj.headerName) !== null && _obj$headerName !== void 0 && _obj$headerName.toString().includes("Last Action")) {
|
|
664
|
+
return 1;
|
|
665
|
+
} else if ((_obj$headerName2 = obj.headerName) !== null && _obj$headerName2 !== void 0 && _obj$headerName2.toString().includes("General")) {
|
|
666
|
+
return 3;
|
|
667
|
+
} else {
|
|
668
|
+
return 2;
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
/**
|
|
673
|
+
* This function will set the group name which can either General or Last Action.
|
|
674
|
+
*
|
|
675
|
+
* @param aMessage
|
|
676
|
+
* @param sActionName
|
|
677
|
+
* @param bIsGeneralGroupName
|
|
678
|
+
*/
|
|
679
|
+
var fnCallbackSetGroupName = function (aMessage, sActionName, bIsGeneralGroupName) {
|
|
680
|
+
if (bIsGeneralGroupName) {
|
|
681
|
+
var sGeneralGroupText = Core.getLibraryResourceBundle("sap.fe.core").getText("T_MESSAGE_BUTTON_SAPFE_MESSAGE_GROUP_GENERAL");
|
|
682
|
+
aMessage["headerName"] = sGeneralGroupText;
|
|
683
|
+
} else {
|
|
684
|
+
aMessage["headerName"] = messageHandling.getLastActionTextAndActionName(sActionName);
|
|
685
|
+
}
|
|
686
|
+
};
|
|
687
|
+
|
|
688
|
+
/**
|
|
689
|
+
* This function will get the table row/column info and set subtitle.
|
|
690
|
+
*
|
|
691
|
+
* @param aMessage
|
|
692
|
+
* @param oTable
|
|
693
|
+
* @param oElement
|
|
694
|
+
* @param oRowBinding
|
|
695
|
+
* @param sActionName
|
|
696
|
+
* @param setSectionNameInGroup
|
|
697
|
+
* @param fnSetGroupName
|
|
698
|
+
* @returns Table info and Subtitle.
|
|
699
|
+
*/
|
|
700
|
+
function getTableColumnDataAndSetSubtile(aMessage, oTable, oElement, oRowBinding, sActionName, setSectionNameInGroup, fnSetGroupName) {
|
|
701
|
+
var oTargetTableInfo = messageHandling.getTableAndTargetInfo(oTable, aMessage, oElement, oRowBinding);
|
|
557
702
|
var oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
|
|
703
|
+
oTargetTableInfo.tableHeader = oTable.getHeader();
|
|
704
|
+
var sControlId, bIsCreationRow;
|
|
705
|
+
if (!oTargetTableInfo.oTableRowContext) {
|
|
706
|
+
sControlId = aMessage.getControlIds().find(function (sId) {
|
|
707
|
+
return messageHandling.isControlInTable(oTable, sId);
|
|
708
|
+
});
|
|
709
|
+
}
|
|
710
|
+
if (sControlId) {
|
|
711
|
+
var _oControl = Core.byId(sControlId);
|
|
712
|
+
bIsCreationRow = messageHandling.isControlPartOfCreationRow(_oControl);
|
|
713
|
+
}
|
|
714
|
+
if (!oTargetTableInfo.sTableTargetColName) {
|
|
715
|
+
// if the column is not present on UI or the target does not have a table field in it, use Last Action for grouping
|
|
716
|
+
if (aMessage.persistent && sActionName) {
|
|
717
|
+
fnSetGroupName(aMessage, sActionName);
|
|
718
|
+
setSectionNameInGroup = false;
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
var subTitle = messageHandling.getMessageSubtitle(aMessage, oTargetTableInfo.oTableRowBindingContexts, oTargetTableInfo.oTableRowContext, oTargetTableInfo.sTableTargetColName, oResourceBundle, oTable, bIsCreationRow);
|
|
722
|
+
return {
|
|
723
|
+
oTargetTableInfo: oTargetTableInfo,
|
|
724
|
+
subTitle: subTitle
|
|
725
|
+
};
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
/**
|
|
729
|
+
* This function will create the subtitle based on Table Row/Column data.
|
|
730
|
+
*
|
|
731
|
+
* @param message
|
|
732
|
+
* @param oTableRowBindingContexts
|
|
733
|
+
* @param oTableRowContext
|
|
734
|
+
* @param sTableTargetColName
|
|
735
|
+
* @param oResourceBundle
|
|
736
|
+
* @param oTable
|
|
737
|
+
* @param bIsCreationRow
|
|
738
|
+
* @param oTargetedControl
|
|
739
|
+
* @returns Message subtitle.
|
|
740
|
+
*/
|
|
741
|
+
function getMessageSubtitle(message, oTableRowBindingContexts, oTableRowContext, sTableTargetColName, oResourceBundle, oTable, bIsCreationRow, oTargetedControl) {
|
|
742
|
+
var sMessageSubtitle;
|
|
743
|
+
var sRowSubtitleValue;
|
|
744
|
+
var sTableFirstColProperty = oTable.getParent().getIdentifierColumn();
|
|
745
|
+
var oColFromTableSettings = messageHandling.fetchColumnInfo(message, oTable);
|
|
746
|
+
if (bIsCreationRow) {
|
|
747
|
+
sMessageSubtitle = CommonUtils.getTranslatedText("T_MESSAGE_ITEM_SUBTITLE", oResourceBundle, [oResourceBundle.getText("T_MESSAGE_ITEM_SUBTITLE_CREATION_ROW_INDICATOR"), sTableTargetColName ? sTableTargetColName : oColFromTableSettings.label]);
|
|
748
|
+
} else {
|
|
749
|
+
var oTableFirstColBindingContextTextAnnotation = messageHandling.getTableFirstColBindingContextForTextAnnotation(oTable, oTableRowContext, sTableFirstColProperty);
|
|
750
|
+
var sTableFirstColTextAnnotationPath = oTableFirstColBindingContextTextAnnotation ? oTableFirstColBindingContextTextAnnotation.getObject("$Path") : undefined;
|
|
751
|
+
var sTableFirstColTextArrangement = sTableFirstColTextAnnotationPath && oTableFirstColBindingContextTextAnnotation ? oTableFirstColBindingContextTextAnnotation.getObject("@com.sap.vocabularies.UI.v1.TextArrangement/$EnumMember") : undefined;
|
|
752
|
+
if (oTableRowBindingContexts.length > 0) {
|
|
753
|
+
// set Row subtitle text
|
|
754
|
+
if (oTargetedControl) {
|
|
755
|
+
// The UI error is on the first column, we then get the control input as the row indicator:
|
|
756
|
+
sRowSubtitleValue = oTargetedControl.getValue();
|
|
757
|
+
} else if (oTableRowContext && sTableFirstColProperty) {
|
|
758
|
+
sRowSubtitleValue = messageHandling.getTableFirstColValue(sTableFirstColProperty, oTableRowContext, sTableFirstColTextAnnotationPath, sTableFirstColTextArrangement);
|
|
759
|
+
} else {
|
|
760
|
+
sRowSubtitleValue = undefined;
|
|
761
|
+
}
|
|
762
|
+
// set the message subtitle
|
|
763
|
+
var oColumnInfo = messageHandling.determineColumnInfo(oColFromTableSettings, oResourceBundle);
|
|
764
|
+
if (sRowSubtitleValue && sTableTargetColName) {
|
|
765
|
+
sMessageSubtitle = CommonUtils.getTranslatedText("T_MESSAGE_ITEM_SUBTITLE", oResourceBundle, [sRowSubtitleValue, sTableTargetColName]);
|
|
766
|
+
} else if (sRowSubtitleValue && oColumnInfo.sColumnIndicator === "Hidden") {
|
|
767
|
+
sMessageSubtitle = "".concat(oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_ROW"), ": ").concat(sRowSubtitleValue, ", ").concat(oColumnInfo.sColumnValue);
|
|
768
|
+
} else if (sRowSubtitleValue && oColumnInfo.sColumnIndicator === "Unknown") {
|
|
769
|
+
sMessageSubtitle = CommonUtils.getTranslatedText("T_MESSAGE_ITEM_SUBTITLE", oResourceBundle, [sRowSubtitleValue, oColumnInfo.sColumnValue]);
|
|
770
|
+
} else if (sRowSubtitleValue && oColumnInfo.sColumnIndicator === "undefined") {
|
|
771
|
+
sMessageSubtitle = "".concat(oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_ROW"), ": ").concat(sRowSubtitleValue);
|
|
772
|
+
} else if (!sRowSubtitleValue && sTableTargetColName) {
|
|
773
|
+
sMessageSubtitle = oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_COLUMN") + ": " + sTableTargetColName;
|
|
774
|
+
} else if (!sRowSubtitleValue && oColumnInfo.sColumnIndicator === "Hidden") {
|
|
775
|
+
sMessageSubtitle = oColumnInfo.sColumnValue;
|
|
776
|
+
} else {
|
|
777
|
+
sMessageSubtitle = null;
|
|
778
|
+
}
|
|
779
|
+
} else {
|
|
780
|
+
sMessageSubtitle = null;
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
return sMessageSubtitle;
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
/**
|
|
787
|
+
* This function will get the first column for text Annotation, this is needed to set subtitle of Message.
|
|
788
|
+
*
|
|
789
|
+
* @param oTable
|
|
790
|
+
* @param oTableRowContext
|
|
791
|
+
* @param sTableFirstColProperty
|
|
792
|
+
* @returns Binding context.
|
|
793
|
+
*/
|
|
794
|
+
function getTableFirstColBindingContextForTextAnnotation(oTable, oTableRowContext, sTableFirstColProperty) {
|
|
795
|
+
var oBindingContext;
|
|
796
|
+
if (oTableRowContext && sTableFirstColProperty) {
|
|
797
|
+
var oModel = oTable === null || oTable === void 0 ? void 0 : oTable.getModel();
|
|
798
|
+
var oMetaModel = oModel === null || oModel === void 0 ? void 0 : oModel.getMetaModel();
|
|
799
|
+
var sMetaPath = oMetaModel === null || oMetaModel === void 0 ? void 0 : oMetaModel.getMetaPath(oTableRowContext.getPath());
|
|
800
|
+
if (oMetaModel !== null && oMetaModel !== void 0 && oMetaModel.getObject("".concat(sMetaPath, "/").concat(sTableFirstColProperty, "@com.sap.vocabularies.Common.v1.Text/$Path"))) {
|
|
801
|
+
oBindingContext = oMetaModel.createBindingContext("".concat(sMetaPath, "/").concat(sTableFirstColProperty, "@com.sap.vocabularies.Common.v1.Text"));
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
return oBindingContext;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
/**
|
|
808
|
+
* This function will get the value of first Column of Table, with its text Arrangement.
|
|
809
|
+
*
|
|
810
|
+
* @param sTableFirstColProperty
|
|
811
|
+
* @param oTableRowContext
|
|
812
|
+
* @param sTextAnnotationPath
|
|
813
|
+
* @param sTextArrangement
|
|
814
|
+
* @returns Column Value.
|
|
815
|
+
*/
|
|
816
|
+
function getTableFirstColValue(sTableFirstColProperty, oTableRowContext, sTextAnnotationPath, sTextArrangement) {
|
|
817
|
+
var sCodeValue = oTableRowContext.getValue(sTableFirstColProperty);
|
|
818
|
+
var sTextValue;
|
|
819
|
+
var sComputedValue = sCodeValue;
|
|
820
|
+
if (sTextAnnotationPath) {
|
|
821
|
+
if (sTableFirstColProperty.lastIndexOf("/") > 0) {
|
|
822
|
+
// the target property is replaced with the text annotation path
|
|
823
|
+
sTableFirstColProperty = sTableFirstColProperty.slice(0, sTableFirstColProperty.lastIndexOf("/") + 1);
|
|
824
|
+
sTableFirstColProperty = sTableFirstColProperty.concat(sTextAnnotationPath);
|
|
825
|
+
} else {
|
|
826
|
+
sTableFirstColProperty = sTextAnnotationPath;
|
|
827
|
+
}
|
|
828
|
+
sTextValue = oTableRowContext.getValue(sTableFirstColProperty);
|
|
829
|
+
if (sTextValue) {
|
|
830
|
+
if (sTextArrangement) {
|
|
831
|
+
var sEnumNumber = sTextArrangement.slice(sTextArrangement.indexOf("/") + 1);
|
|
832
|
+
switch (sEnumNumber) {
|
|
833
|
+
case "TextOnly":
|
|
834
|
+
sComputedValue = sTextValue;
|
|
835
|
+
break;
|
|
836
|
+
case "TextFirst":
|
|
837
|
+
sComputedValue = "".concat(sTextValue, " (").concat(sCodeValue, ")");
|
|
838
|
+
break;
|
|
839
|
+
case "TextLast":
|
|
840
|
+
sComputedValue = "".concat(sCodeValue, " (").concat(sTextValue, ")");
|
|
841
|
+
break;
|
|
842
|
+
case "TextSeparate":
|
|
843
|
+
sComputedValue = sCodeValue;
|
|
844
|
+
break;
|
|
845
|
+
default:
|
|
846
|
+
}
|
|
847
|
+
} else {
|
|
848
|
+
sComputedValue = "".concat(sTextValue, " (").concat(sCodeValue, ")");
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
return sComputedValue;
|
|
853
|
+
}
|
|
558
854
|
|
|
855
|
+
/**
|
|
856
|
+
* The method that is called to retrieve the column info from the associated message of the message popover.
|
|
857
|
+
*
|
|
858
|
+
* @private
|
|
859
|
+
* @param oMessage Message object
|
|
860
|
+
* @param oTable MdcTable
|
|
861
|
+
* @returns Returns the column info.
|
|
862
|
+
*/
|
|
863
|
+
function fetchColumnInfo(oMessage, oTable) {
|
|
864
|
+
var sColNameFromMessageObj = oMessage === null || oMessage === void 0 ? void 0 : oMessage.getTargets()[0].split("/").pop();
|
|
865
|
+
return oTable.getParent().getTableDefinition().columns.find(function (oColumn) {
|
|
866
|
+
return oColumn.key.split("::").pop() === sColNameFromMessageObj;
|
|
867
|
+
});
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
/**
|
|
871
|
+
* This function get the Column data depending on its availability in Table, this is needed for setting subtitle of Message.
|
|
872
|
+
*
|
|
873
|
+
* @param oColFromTableSettings
|
|
874
|
+
* @param oResourceBundle
|
|
875
|
+
* @returns Column data.
|
|
876
|
+
*/
|
|
877
|
+
function determineColumnInfo(oColFromTableSettings, oResourceBundle) {
|
|
878
|
+
var oColumnInfo = {
|
|
879
|
+
sColumnIndicator: String,
|
|
880
|
+
sColumnValue: String
|
|
881
|
+
};
|
|
882
|
+
if (oColFromTableSettings) {
|
|
883
|
+
// if column is neither in table definition nor personalization, show only row subtitle text
|
|
884
|
+
if (oColFromTableSettings.availability === "Hidden") {
|
|
885
|
+
oColumnInfo.sColumnValue = undefined;
|
|
886
|
+
oColumnInfo.sColumnIndicator = "undefined";
|
|
887
|
+
} else {
|
|
888
|
+
//if column is in table personalization but not in table definition, show Column (Hidden) : <colName>
|
|
889
|
+
oColumnInfo.sColumnValue = "".concat(oResourceBundle.getText("T_MESSAGE_GROUP_DESCRIPTION_TABLE_COLUMN"), " (").concat(oResourceBundle.getText("T_COLUMN_INDICATOR_IN_TABLE_DEFINITION"), "): ").concat(oColFromTableSettings.label);
|
|
890
|
+
oColumnInfo.sColumnIndicator = "Hidden";
|
|
891
|
+
}
|
|
892
|
+
} else {
|
|
893
|
+
oColumnInfo.sColumnValue = oResourceBundle.getText("T_MESSAGE_ITEM_SUBTITLE_INDICATOR_UNKNOWN");
|
|
894
|
+
oColumnInfo.sColumnIndicator = "Unknown";
|
|
895
|
+
}
|
|
896
|
+
return oColumnInfo;
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
/**
|
|
900
|
+
* This function check if a given control id is a part of Table.
|
|
901
|
+
*
|
|
902
|
+
* @param oTable
|
|
903
|
+
* @param sControlId
|
|
904
|
+
* @returns True if control is part of table.
|
|
905
|
+
*/
|
|
906
|
+
function isControlInTable(oTable, sControlId) {
|
|
907
|
+
var oControl = Core.byId(sControlId);
|
|
908
|
+
if (oControl && !oControl.isA("sap.ui.table.Table") && !oControl.isA("sap.m.Table")) {
|
|
909
|
+
return oTable.findElements(true, function (oElem) {
|
|
910
|
+
return oElem.getId() === oControl;
|
|
911
|
+
});
|
|
912
|
+
}
|
|
913
|
+
return false;
|
|
914
|
+
}
|
|
915
|
+
function isControlPartOfCreationRow(oControl) {
|
|
916
|
+
var oParentControl = oControl === null || oControl === void 0 ? void 0 : oControl.getParent();
|
|
917
|
+
while (oParentControl && !((_oParentControl = oParentControl) !== null && _oParentControl !== void 0 && _oParentControl.isA("sap.ui.table.Row")) && !((_oParentControl2 = oParentControl) !== null && _oParentControl2 !== void 0 && _oParentControl2.isA("sap.ui.table.CreationRow")) && !((_oParentControl3 = oParentControl) !== null && _oParentControl3 !== void 0 && _oParentControl3.isA("sap.m.ColumnListItem"))) {
|
|
918
|
+
var _oParentControl, _oParentControl2, _oParentControl3;
|
|
919
|
+
oParentControl = oParentControl.getParent();
|
|
920
|
+
}
|
|
921
|
+
return !!oParentControl && oParentControl.isA("sap.ui.table.CreationRow");
|
|
922
|
+
}
|
|
923
|
+
function getTranslatedTextForMessageDialog(sHighestPriority) {
|
|
924
|
+
var oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core");
|
|
559
925
|
switch (sHighestPriority) {
|
|
560
926
|
case "Error":
|
|
561
927
|
return oResourceBundle.getText("C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_TITLE_ERROR");
|
|
562
|
-
|
|
563
928
|
case "Information":
|
|
564
929
|
return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_INFO");
|
|
565
|
-
|
|
566
930
|
case "Success":
|
|
567
931
|
return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_SUCCESS");
|
|
568
|
-
|
|
569
932
|
case "Warning":
|
|
570
933
|
return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_WARNING");
|
|
571
|
-
|
|
572
934
|
default:
|
|
573
935
|
return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE");
|
|
574
936
|
}
|
|
575
937
|
}
|
|
576
|
-
|
|
577
938
|
function removeUnboundTransitionMessages() {
|
|
578
939
|
removeTransitionMessages(false);
|
|
579
940
|
}
|
|
580
|
-
|
|
581
941
|
function removeBoundTransitionMessages(sPathToBeRemoved) {
|
|
582
942
|
removeTransitionMessages(true, sPathToBeRemoved);
|
|
583
943
|
}
|
|
584
|
-
|
|
585
944
|
function getMessagesFromMessageModel(oMessageModel, sPathToBeRemoved) {
|
|
586
945
|
if (sPathToBeRemoved === undefined) {
|
|
587
946
|
return oMessageModel.getObject("/");
|
|
588
947
|
}
|
|
589
|
-
|
|
590
948
|
var listBinding = oMessageModel.bindList("/");
|
|
591
949
|
listBinding.filter(new Filter({
|
|
592
950
|
path: "target",
|
|
@@ -597,64 +955,221 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
597
955
|
return oContext.getObject();
|
|
598
956
|
});
|
|
599
957
|
}
|
|
600
|
-
|
|
601
958
|
function getMessages() {
|
|
602
959
|
var bBoundMessages = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
603
960
|
var bTransitionOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
604
961
|
var sPathToBeRemoved = arguments.length > 2 ? arguments[2] : undefined;
|
|
605
962
|
var i;
|
|
606
963
|
var oMessageManager = Core.getMessageManager(),
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
964
|
+
oMessageModel = oMessageManager.getMessageModel(),
|
|
965
|
+
oResourceBundle = Core.getLibraryResourceBundle("sap.fe.core"),
|
|
966
|
+
aTransitionMessages = [];
|
|
610
967
|
var aMessages = [];
|
|
611
|
-
|
|
612
968
|
if (bBoundMessages && bTransitionOnly && sPathToBeRemoved) {
|
|
613
969
|
aMessages = getMessagesFromMessageModel(oMessageModel, sPathToBeRemoved);
|
|
614
970
|
} else {
|
|
615
971
|
aMessages = oMessageModel.getObject("/");
|
|
616
972
|
}
|
|
617
|
-
|
|
618
973
|
for (i = 0; i < aMessages.length; i++) {
|
|
619
974
|
if ((!bTransitionOnly || aMessages[i].persistent) && (bBoundMessages && aMessages[i].target !== "" || !bBoundMessages && (!aMessages[i].target || aMessages[i].target === ""))) {
|
|
620
975
|
aTransitionMessages.push(aMessages[i]);
|
|
621
976
|
}
|
|
622
977
|
}
|
|
623
|
-
|
|
624
978
|
for (i = 0; i < aTransitionMessages.length; i++) {
|
|
625
979
|
if (aTransitionMessages[i].code === "503" && aTransitionMessages[i].message !== "" && aTransitionMessages[i].message.indexOf(oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_BACKEND_PREFIX")) === -1) {
|
|
626
980
|
aTransitionMessages[i].message = "\n".concat(oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_BACKEND_PREFIX")).concat(aTransitionMessages[i].message);
|
|
627
981
|
}
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
|
|
982
|
+
}
|
|
983
|
+
//Filtering messages again here to avoid showing pure technical messages raised by the model
|
|
631
984
|
var backendMessages = [];
|
|
632
|
-
|
|
633
985
|
for (i = 0; i < aTransitionMessages.length; i++) {
|
|
634
986
|
if (aTransitionMessages[i].technicalDetails && (aTransitionMessages[i].technicalDetails.originalMessage !== undefined && aTransitionMessages[i].technicalDetails.originalMessage !== null || aTransitionMessages[i].technicalDetails.httpStatus !== undefined && aTransitionMessages[i].technicalDetails.httpStatus !== null) || aTransitionMessages[i].code) {
|
|
635
987
|
backendMessages.push(aTransitionMessages[i]);
|
|
636
988
|
}
|
|
637
989
|
}
|
|
638
|
-
|
|
639
990
|
return backendMessages;
|
|
640
991
|
}
|
|
641
|
-
|
|
642
992
|
function removeTransitionMessages(bBoundMessages, sPathToBeRemoved) {
|
|
643
993
|
var aMessagesToBeDeleted = getMessages(bBoundMessages, true, sPathToBeRemoved);
|
|
644
|
-
|
|
645
994
|
if (aMessagesToBeDeleted.length > 0) {
|
|
646
995
|
Core.getMessageManager().removeMessages(aMessagesToBeDeleted);
|
|
647
996
|
}
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
|
|
997
|
+
}
|
|
998
|
+
//TODO: This must be moved out of message handling
|
|
651
999
|
function setMessageSubtitle(oTable, aContexts, message) {
|
|
652
1000
|
var subtitleColumn = oTable.getParent().getIdentifierColumn();
|
|
653
1001
|
var errorContext = aContexts.find(function (oContext) {
|
|
654
|
-
return message.
|
|
1002
|
+
return message.getTargets()[0].indexOf(oContext.getPath()) !== -1;
|
|
655
1003
|
});
|
|
656
1004
|
message.additionalText = errorContext ? errorContext.getObject()[subtitleColumn] : undefined;
|
|
657
1005
|
}
|
|
1006
|
+
|
|
1007
|
+
/**
|
|
1008
|
+
* The method retrieves the visible sections from an object page.
|
|
1009
|
+
*
|
|
1010
|
+
* @param oObjectPageLayout The objectPageLayout object for which we want to retrieve the visible sections.
|
|
1011
|
+
* @returns Array of visible sections.
|
|
1012
|
+
* @private
|
|
1013
|
+
*/
|
|
1014
|
+
function getVisibleSectionsFromObjectPageLayout(oObjectPageLayout) {
|
|
1015
|
+
return oObjectPageLayout.getSections().filter(function (oSection) {
|
|
1016
|
+
return oSection.getVisible();
|
|
1017
|
+
});
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
/**
|
|
1021
|
+
* This function checks if control ids from message are a part of a given subsection.
|
|
1022
|
+
*
|
|
1023
|
+
* @param subSection
|
|
1024
|
+
* @param oMessageObject
|
|
1025
|
+
* @returns SubSection matching control ids.
|
|
1026
|
+
*/
|
|
1027
|
+
function getControlFromMessageRelatingToSubSection(subSection, oMessageObject) {
|
|
1028
|
+
return subSection.findElements(true, function (oElem) {
|
|
1029
|
+
return fnFilterUponIds(oMessageObject.getControlIds(), oElem);
|
|
1030
|
+
}).sort(function (a, b) {
|
|
1031
|
+
// controls are sorted in order to have the table on top of the array
|
|
1032
|
+
// it will help to compute the subtitle of the message based on the type of related controls
|
|
1033
|
+
if (a.isA("sap.ui.mdc.Table") && !b.isA("sap.ui.mdc.Table")) {
|
|
1034
|
+
return -1;
|
|
1035
|
+
}
|
|
1036
|
+
return 1;
|
|
1037
|
+
});
|
|
1038
|
+
}
|
|
1039
|
+
function getTableColProperty(oTable, oMessageObject, oContextPath) {
|
|
1040
|
+
//this function escapes a string to use it as a regex
|
|
1041
|
+
var fnRegExpescape = function (s) {
|
|
1042
|
+
return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&");
|
|
1043
|
+
};
|
|
1044
|
+
// based on the target path of the message we retrieve the property name.
|
|
1045
|
+
// to achieve it we remove the bindingContext path and the row binding path from the target
|
|
1046
|
+
if (!oContextPath) {
|
|
1047
|
+
var _oTable$getBindingCon;
|
|
1048
|
+
oContextPath = new RegExp("".concat(fnRegExpescape("".concat((_oTable$getBindingCon = oTable.getBindingContext()) === null || _oTable$getBindingCon === void 0 ? void 0 : _oTable$getBindingCon.getPath(), "/").concat(oTable.getRowBinding().getPath())), "\\(.*\\)/"));
|
|
1049
|
+
}
|
|
1050
|
+
return oMessageObject.getTargets()[0].replace(oContextPath, "");
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
/**
|
|
1054
|
+
* This function gives the column information if it matches with the property name from target of message.
|
|
1055
|
+
*
|
|
1056
|
+
* @param oTable
|
|
1057
|
+
* @param sTableTargetColProperty
|
|
1058
|
+
* @returns Column name and property.
|
|
1059
|
+
*/
|
|
1060
|
+
function getTableColInfo(oTable, sTableTargetColProperty) {
|
|
1061
|
+
var sTableTargetColName;
|
|
1062
|
+
var oTableTargetCol = oTable.getColumns().find(function (column) {
|
|
1063
|
+
return column.getDataProperty() == sTableTargetColProperty;
|
|
1064
|
+
});
|
|
1065
|
+
if (!oTableTargetCol) {
|
|
1066
|
+
/* If the target column is not found, we check for a custom column */
|
|
1067
|
+
var oCustomColumn = oTable.getControlDelegate().getColumnsFor(oTable).find(function (oColumn) {
|
|
1068
|
+
if (!!oColumn.template && oColumn.propertyInfos) {
|
|
1069
|
+
return oColumn.propertyInfos[0] === sTableTargetColProperty || oColumn.propertyInfos[0].replace("Property::", "") === sTableTargetColProperty;
|
|
1070
|
+
} else {
|
|
1071
|
+
return false;
|
|
1072
|
+
}
|
|
1073
|
+
});
|
|
1074
|
+
if (oCustomColumn) {
|
|
1075
|
+
var _oTableTargetCol;
|
|
1076
|
+
oTableTargetCol = oCustomColumn;
|
|
1077
|
+
sTableTargetColProperty = (_oTableTargetCol = oTableTargetCol) === null || _oTableTargetCol === void 0 ? void 0 : _oTableTargetCol.name;
|
|
1078
|
+
sTableTargetColName = oTable.getColumns().find(function (oColumn) {
|
|
1079
|
+
return sTableTargetColProperty === oColumn.getDataProperty();
|
|
1080
|
+
}).getHeader();
|
|
1081
|
+
} else {
|
|
1082
|
+
/* If the target column is not found, we check for a field group */
|
|
1083
|
+
var aColumns = oTable.getControlDelegate().getColumnsFor(oTable);
|
|
1084
|
+
oTableTargetCol = aColumns.find(function (oColumn) {
|
|
1085
|
+
if (oColumn.key.indexOf("::FieldGroup::") !== -1) {
|
|
1086
|
+
var _oColumn$propertyInfo;
|
|
1087
|
+
return (_oColumn$propertyInfo = oColumn.propertyInfos) === null || _oColumn$propertyInfo === void 0 ? void 0 : _oColumn$propertyInfo.find(function () {
|
|
1088
|
+
return aColumns.find(function (tableColumn) {
|
|
1089
|
+
return tableColumn.relativePath === sTableTargetColProperty;
|
|
1090
|
+
});
|
|
1091
|
+
});
|
|
1092
|
+
}
|
|
1093
|
+
});
|
|
1094
|
+
/* check if the column with the field group is visible in the table: */
|
|
1095
|
+
var bIsTableTargetColVisible = false;
|
|
1096
|
+
if (oTableTargetCol && oTableTargetCol.label) {
|
|
1097
|
+
bIsTableTargetColVisible = oTable.getColumns().some(function (column) {
|
|
1098
|
+
return column.getHeader() === oTableTargetCol.label;
|
|
1099
|
+
});
|
|
1100
|
+
}
|
|
1101
|
+
sTableTargetColName = bIsTableTargetColVisible && oTableTargetCol.label;
|
|
1102
|
+
sTableTargetColProperty = bIsTableTargetColVisible && oTableTargetCol.key;
|
|
1103
|
+
}
|
|
1104
|
+
} else {
|
|
1105
|
+
sTableTargetColName = oTableTargetCol && oTableTargetCol.getHeader();
|
|
1106
|
+
}
|
|
1107
|
+
return {
|
|
1108
|
+
sTableTargetColName: sTableTargetColName,
|
|
1109
|
+
sTableTargetColProperty: sTableTargetColProperty
|
|
1110
|
+
};
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
/**
|
|
1114
|
+
* This function gives Table and column info if any of it matches the target from Message.
|
|
1115
|
+
*
|
|
1116
|
+
* @param oTable
|
|
1117
|
+
* @param oMessageObject
|
|
1118
|
+
* @param oElement
|
|
1119
|
+
* @param oRowBinding
|
|
1120
|
+
* @returns Table info matching the message target.
|
|
1121
|
+
*/
|
|
1122
|
+
function getTableAndTargetInfo(oTable, oMessageObject, oElement, oRowBinding) {
|
|
1123
|
+
var oTargetTableInfo = {};
|
|
1124
|
+
oTargetTableInfo.sTableTargetColProperty = getTableColProperty(oTable, oMessageObject);
|
|
1125
|
+
var oTableColInfo = getTableColInfo(oTable, oTargetTableInfo.sTableTargetColProperty);
|
|
1126
|
+
oTargetTableInfo.oTableRowBindingContexts = oElement.isA("sap.ui.table.Table") ? oRowBinding.getContexts() : oRowBinding.getCurrentContexts();
|
|
1127
|
+
oTargetTableInfo.sTableTargetColName = oTableColInfo.sTableTargetColName;
|
|
1128
|
+
oTargetTableInfo.sTableTargetColProperty = oTableColInfo.sTableTargetColProperty;
|
|
1129
|
+
oTargetTableInfo.oTableRowContext = oTargetTableInfo.oTableRowBindingContexts.find(function (rowContext) {
|
|
1130
|
+
return rowContext && oMessageObject.getTargets()[0].indexOf(rowContext.getPath()) === 0;
|
|
1131
|
+
});
|
|
1132
|
+
return oTargetTableInfo;
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
/**
|
|
1136
|
+
*
|
|
1137
|
+
* @param aControlIds
|
|
1138
|
+
* @param oItem
|
|
1139
|
+
* @returns True if the item matches one of the controls
|
|
1140
|
+
*/
|
|
1141
|
+
function fnFilterUponIds(aControlIds, oItem) {
|
|
1142
|
+
return aControlIds.some(function (sControlId) {
|
|
1143
|
+
if (sControlId === oItem.getId()) {
|
|
1144
|
+
return true;
|
|
1145
|
+
}
|
|
1146
|
+
return false;
|
|
1147
|
+
});
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
/**
|
|
1151
|
+
* This function gives the group name having section and subsection data.
|
|
1152
|
+
*
|
|
1153
|
+
* @param section
|
|
1154
|
+
* @param subSection
|
|
1155
|
+
* @param bMultipleSubSections
|
|
1156
|
+
* @param oTargetTableInfo
|
|
1157
|
+
* @param oResourceBundle
|
|
1158
|
+
* @returns Group name.
|
|
1159
|
+
*/
|
|
1160
|
+
function createSectionGroupName(section, subSection, bMultipleSubSections, oTargetTableInfo, oResourceBundle) {
|
|
1161
|
+
return section.getTitle() + (subSection.getTitle() && bMultipleSubSections ? ", ".concat(subSection.getTitle()) : "") + (oTargetTableInfo ? ", ".concat(oResourceBundle.getText("T_MESSAGE_GROUP_TITLE_TABLE_DENOMINATOR"), ": ").concat(oTargetTableInfo.tableHeader) : "");
|
|
1162
|
+
}
|
|
1163
|
+
function bIsOrphanElement(oElement, aElements) {
|
|
1164
|
+
return !aElements.some(function (oElem) {
|
|
1165
|
+
var oParentElement = oElement.getParent();
|
|
1166
|
+
while (oParentElement && oParentElement !== oElem) {
|
|
1167
|
+
oParentElement = oParentElement.getParent();
|
|
1168
|
+
}
|
|
1169
|
+
return oParentElement ? true : false;
|
|
1170
|
+
});
|
|
1171
|
+
}
|
|
1172
|
+
|
|
658
1173
|
/**
|
|
659
1174
|
* Static functions for Fiori Message Handling
|
|
660
1175
|
*
|
|
@@ -664,8 +1179,6 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
664
1179
|
* @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
|
|
665
1180
|
* @since 1.56.0
|
|
666
1181
|
*/
|
|
667
|
-
|
|
668
|
-
|
|
669
1182
|
var messageHandling = {
|
|
670
1183
|
getMessages: getMessages,
|
|
671
1184
|
showUnboundMessages: showUnboundMessages,
|
|
@@ -674,8 +1187,30 @@ sap.ui.define(["sap/m/Bar", "sap/m/Button", "sap/m/Dialog", "sap/m/FormattedText
|
|
|
674
1187
|
modifyETagMessagesOnly: fnModifyETagMessagesOnly,
|
|
675
1188
|
getRetryAfterMessage: getRetryAfterMessage,
|
|
676
1189
|
prepareMessageViewForDialog: prepareMessageViewForDialog,
|
|
677
|
-
setMessageSubtitle: setMessageSubtitle
|
|
1190
|
+
setMessageSubtitle: setMessageSubtitle,
|
|
1191
|
+
getVisibleSectionsFromObjectPageLayout: getVisibleSectionsFromObjectPageLayout,
|
|
1192
|
+
getControlFromMessageRelatingToSubSection: getControlFromMessageRelatingToSubSection,
|
|
1193
|
+
fnFilterUponIds: fnFilterUponIds,
|
|
1194
|
+
getTableAndTargetInfo: getTableAndTargetInfo,
|
|
1195
|
+
createSectionGroupName: createSectionGroupName,
|
|
1196
|
+
bIsOrphanElement: bIsOrphanElement,
|
|
1197
|
+
getLastActionTextAndActionName: getLastActionTextAndActionName,
|
|
1198
|
+
getTableColumnDataAndSetSubtile: getTableColumnDataAndSetSubtile,
|
|
1199
|
+
getTableColInfo: getTableColInfo,
|
|
1200
|
+
getTableColProperty: getTableColProperty,
|
|
1201
|
+
getMessageSubtitle: getMessageSubtitle,
|
|
1202
|
+
determineColumnInfo: determineColumnInfo,
|
|
1203
|
+
fetchColumnInfo: fetchColumnInfo,
|
|
1204
|
+
getTableFirstColBindingContextForTextAnnotation: getTableFirstColBindingContextForTextAnnotation,
|
|
1205
|
+
getMessageRank: getMessageRank,
|
|
1206
|
+
fnCallbackSetGroupName: fnCallbackSetGroupName,
|
|
1207
|
+
getTableFirstColValue: getTableFirstColValue,
|
|
1208
|
+
setGroupNameOPDisplayMode: setGroupNameOPDisplayMode,
|
|
1209
|
+
updateMessageObjectGroupName: updateMessageObjectGroupName,
|
|
1210
|
+
setGroupNameLRTable: setGroupNameLRTable,
|
|
1211
|
+
isControlInTable: isControlInTable,
|
|
1212
|
+
isControlPartOfCreationRow: isControlPartOfCreationRow
|
|
678
1213
|
};
|
|
679
1214
|
return messageHandling;
|
|
680
1215
|
}, false);
|
|
681
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNZXNzYWdlVHlwZSIsIkNvcmVMaWIiLCJhTWVzc2FnZUxpc3QiLCJhTWVzc2FnZURhdGFMaXN0IiwiYVJlc29sdmVGdW5jdGlvbnMiLCJvRGlhbG9nIiwib0JhY2tCdXR0b24iLCJvTWVzc2FnZVZpZXciLCJmbkZvcm1hdFRlY2huaWNhbERldGFpbHMiLCJzUHJldmlvdXNHcm91cE5hbWUiLCJpbnNlcnREZXRhaWwiLCJvUHJvcGVydHkiLCJwcm9wZXJ0eSIsInN1YnN0ciIsIk1hdGgiLCJtYXgiLCJsYXN0SW5kZXhPZiIsImluc2VydEdyb3VwTmFtZSIsInNIVE1MIiwiZ3JvdXBOYW1lIiwiZ2V0UGF0aHMiLCJzVEQiLCJmb3JFYWNoIiwiZm5Gb3JtYXREZXNjcmlwdGlvbiIsImZuR2V0SGlnaGVzdE1lc3NhZ2VQcmlvcml0eSIsImFNZXNzYWdlcyIsInNNZXNzYWdlUHJpb3JpdHkiLCJOb25lIiwiaUxlbmd0aCIsImxlbmd0aCIsIm9NZXNzYWdlQ291bnQiLCJFcnJvciIsIldhcm5pbmciLCJTdWNjZXNzIiwiSW5mb3JtYXRpb24iLCJpIiwiZ2V0VHlwZSIsImZuTW9kaWZ5RVRhZ01lc3NhZ2VzT25seSIsIm9NZXNzYWdlTWFuYWdlciIsIm9SZXNvdXJjZUJ1bmRsZSIsImNvbmN1cnJlbnRFZGl0RmxhZyIsImdldE1lc3NhZ2VNb2RlbCIsImdldE9iamVjdCIsImJNZXNzYWdlc01vZGlmaWVkIiwic0V0YWdNZXNzYWdlIiwib01lc3NhZ2UiLCJvVGVjaG5pY2FsRGV0YWlscyIsImdldFRlY2huaWNhbERldGFpbHMiLCJodHRwU3RhdHVzIiwiaXNDb25jdXJyZW50TW9kaWZpY2F0aW9uIiwiZ2V0VGV4dCIsInJlbW92ZU1lc3NhZ2VzIiwic2V0TWVzc2FnZSIsInRhcmdldCIsImFkZE1lc3NhZ2VzIiwiZGlhbG9nQ2xvc2VIYW5kbGVyIiwiY2xvc2UiLCJzZXRWaXNpYmxlIiwib01lc3NhZ2VEaWFsb2dNb2RlbCIsImdldE1vZGVsIiwic2V0RGF0YSIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJnZXRSZXRyeUFmdGVyTWVzc2FnZSIsImJNZXNzYWdlRGlhbG9nIiwiZE5vdyIsIkRhdGUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwic1JldHJ5QWZ0ZXJNZXNzYWdlIiwicmV0cnlBZnRlciIsImRSZXRyeUFmdGVyIiwib0RhdGVGb3JtYXQiLCJnZXRGdWxsWWVhciIsIkRhdGVGb3JtYXQiLCJnZXREYXRlVGltZUluc3RhbmNlIiwicGF0dGVybiIsImZvcm1hdCIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsInByZXBhcmVNZXNzYWdlVmlld0ZvckRpYWxvZyIsImJTdHJpY3RIYW5kbGluZ0Zsb3ciLCJtdWx0aTQxMiIsIm9NZXNzYWdlVGVtcGxhdGUiLCJNZXNzYWdlSXRlbSIsInVuZGVmaW5lZCIsImNvdW50ZXIiLCJwYXRoIiwidGl0bGUiLCJzdWJ0aXRsZSIsImxvbmd0ZXh0VXJsIiwidHlwZSIsImRlc2NyaXB0aW9uIiwibWFya3VwRGVzY3JpcHRpb24iLCJNZXNzYWdlVmlldyIsInNob3dEZXRhaWxzUGFnZUhlYWRlciIsIml0ZW1TZWxlY3QiLCJpdGVtcyIsInRlbXBsYXRlIiwiQnV0dG9uIiwiaWNvbiIsIkljb25Qb29sIiwiZ2V0SWNvblVSSSIsInZpc2libGUiLCJwcmVzcyIsIm5hdmlnYXRlQmFjayIsInNldE1vZGVsIiwic2hvd1VuYm91bmRNZXNzYWdlcyIsImFDdXN0b21NZXNzYWdlcyIsIm9Db250ZXh0IiwiYlNob3dCb3VuZFRyYW5zaXRpb24iLCJiT25seUZvclRlc3QiLCJvbkJlZm9yZVNob3dNZXNzYWdlIiwiYVRyYW5zaXRpb25NZXNzYWdlcyIsImdldE1lc3NhZ2VzIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJzSGlnaGVzdFByaW9yaXR5Iiwic0hpZ2hlc3RQcmlvcml0eVRleHQiLCJhRmlsdGVycyIsIkZpbHRlciIsIm9wZXJhdG9yIiwiRmlsdGVyT3BlcmF0b3IiLCJORSIsInZhbHVlMSIsInNob3dNZXNzYWdlRGlhbG9nIiwic2hvd01lc3NhZ2VCb3giLCJjb25jYXQiLCJwdXNoIiwiRVEiLCJmbkNoZWNrQ29udHJvbElkSW5EaWFsb2ciLCJhQ29udHJvbElkcyIsImluZGV4IiwiSW5maW5pdHkiLCJvQ29udHJvbCIsImJ5SWQiLCJlcnJvckZpZWxkQ29udHJvbCIsImZpZWxkUmFua2luRGlhbG9nIiwiRGlhbG9nIiwiZ2V0UGFyZW50IiwiZmluZEVsZW1lbnRzIiwiaW5kZXhPZiIsImZvY3VzIiwidGVzdCIsImNhc2VTZW5zaXRpdmUiLCJtZXNzYWdlQ29kZSIsImNvZGUiLCJNZXNzYWdlIiwibWVzc2FnZSIsInRleHQiLCJwZXJzaXN0ZW50IiwiSlNPTk1vZGVsIiwiYkhhc0V0YWdNZXNzYWdlIiwibW9kaWZ5RVRhZ01lc3NhZ2VzT25seSIsImdldENvZGUiLCJzaG93TWVzc2FnZVBhcmFtZXRlcnMiLCJhTW9kZWxEYXRhQXJyYXkiLCJvTGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsImFDdXJyZW50Q29udGV4dHMiLCJnZXRDdXJyZW50Q29udGV4dHMiLCJjdXJyZW50Q29udGV4dCIsImV4aXN0aW5nTWVzc2FnZXMiLCJBcnJheSIsImlzQXJyYXkiLCJnZXREYXRhIiwib1VuaXF1ZU9iaiIsImZpbHRlciIsIm9iaiIsImlkIiwiZmlsdGVyZWRNZXNzYWdlcyIsIlByb21pc2UiLCJyZXNvbHZlIiwiTWVzc2FnZVRvYXN0Iiwic2hvdyIsInJlamVjdCIsInRoZW4iLCJmbkdldE1lc3NhZ2VTdWJ0aXRsZSIsIm9NZXNzYWdlT2JqZWN0IiwiaXNPcGVuIiwicmVzaXphYmxlIiwiZW5kQnV0dG9uIiwiY3VzdG9tSGVhZGVyIiwiQmFyIiwiY29udGVudE1pZGRsZSIsIlRleHQiLCJjb250ZW50TGVmdCIsImNvbnRlbnRXaWR0aCIsImNvbnRlbnRIZWlnaHQiLCJ2ZXJ0aWNhbFNjcm9sbGluZyIsImFmdGVyQ2xvc2UiLCJjYWxsIiwicmVtb3ZlQWxsQ29udGVudCIsImFkZENvbnRlbnQiLCJzYXAiLCJ1aSIsInJlcXVpcmUiLCJCdXR0b25UeXBlIiwic2V0QmVnaW5CdXR0b24iLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJyZWZyZXNoIiwiRW1waGFzaXplZCIsImRlc3Ryb3lCZWdpbkJ1dHRvbiIsImdldEl0ZW1zIiwiZ2V0VHJhbnNsYXRlZFRleHRGb3JNZXNzYWdlRGlhbG9nIiwic2V0U3RhdGUiLCJnZXRDdXN0b21IZWFkZXIiLCJnZXRDb250ZW50TWlkZGxlIiwic2V0VGV4dCIsIm9wZW4iLCJjYXRjaCIsInRlY2huaWNhbERldGFpbHMiLCJvcmlnaW5hbE1lc3NhZ2UiLCJmb3JtYXR0ZWRUZXh0U3RyaW5nIiwicmV0cnlBZnRlck1lc3NhZ2UiLCJnZXRBZGRpdGlvbmFsVGV4dCIsImdldE1lc3NhZ2UiLCJmb3JtYXR0ZWRUZXh0IiwiRm9ybWF0dGVkVGV4dCIsImh0bWxUZXh0IiwiTWVzc2FnZUJveCIsImVycm9yIiwib25DbG9zZSIsInJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwic1BhdGhUb0JlUmVtb3ZlZCIsImdldE1lc3NhZ2VzRnJvbU1lc3NhZ2VNb2RlbCIsIm9NZXNzYWdlTW9kZWwiLCJsaXN0QmluZGluZyIsIlN0YXJ0c1dpdGgiLCJtYXAiLCJiQm91bmRNZXNzYWdlcyIsImJUcmFuc2l0aW9uT25seSIsImJhY2tlbmRNZXNzYWdlcyIsImFNZXNzYWdlc1RvQmVEZWxldGVkIiwic2V0TWVzc2FnZVN1YnRpdGxlIiwib1RhYmxlIiwiYUNvbnRleHRzIiwic3VidGl0bGVDb2x1bW4iLCJnZXRJZGVudGlmaWVyQ29sdW1uIiwiZXJyb3JDb250ZXh0IiwiZmluZCIsImdldFRhcmdldCIsImdldFBhdGgiLCJhZGRpdGlvbmFsVGV4dCIsIm1lc3NhZ2VIYW5kbGluZyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsibWVzc2FnZUhhbmRsaW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXIgZnJvbSBcInNhcC9tL0JhclwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBGb3JtYXR0ZWRUZXh0IGZyb20gXCJzYXAvbS9Gb3JtYXR0ZWRUZXh0XCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IE1lc3NhZ2VJdGVtIGZyb20gXCJzYXAvbS9NZXNzYWdlSXRlbVwiO1xuaW1wb3J0IE1lc3NhZ2VUb2FzdCBmcm9tIFwic2FwL20vTWVzc2FnZVRvYXN0XCI7XG5pbXBvcnQgTWVzc2FnZVZpZXcgZnJvbSBcInNhcC9tL01lc3NhZ2VWaWV3XCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBEYXRlRm9ybWF0IGZyb20gXCJzYXAvdWkvY29yZS9mb3JtYXQvRGF0ZUZvcm1hdFwiO1xuaW1wb3J0IEljb25Qb29sIGZyb20gXCJzYXAvdWkvY29yZS9JY29uUG9vbFwiO1xuaW1wb3J0IENvcmVMaWIgZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9tZGMvQ29udHJvbFwiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IEZpbHRlck9wZXJhdG9yIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyT3BlcmF0b3JcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuXG5jb25zdCBNZXNzYWdlVHlwZSA9IENvcmVMaWIuTWVzc2FnZVR5cGU7XG5sZXQgYU1lc3NhZ2VMaXN0OiBhbnlbXSA9IFtdO1xubGV0IGFNZXNzYWdlRGF0YUxpc3Q6IGFueVtdID0gW107XG5sZXQgYVJlc29sdmVGdW5jdGlvbnM6IGFueVtdID0gW107XG5sZXQgb0RpYWxvZzogRGlhbG9nO1xubGV0IG9CYWNrQnV0dG9uOiBCdXR0b247XG5sZXQgb01lc3NhZ2VWaWV3OiBNZXNzYWdlVmlldztcblxuZXhwb3J0IHR5cGUgbWVzc2FnZUhhbmRsaW5nVHlwZSA9IHtcblx0Z2V0TWVzc2FnZXM6IChiQm91bmRNZXNzYWdlcz86IGFueSwgYlRyYW5zaXRpb25Pbmx5PzogYW55KSA9PiBhbnlbXTtcblx0c2hvd1VuYm91bmRNZXNzYWdlczogKFxuXHRcdGFDdXN0b21NZXNzYWdlcz86IGFueVtdLFxuXHRcdG9Db250ZXh0PzogYW55LFxuXHRcdGJTaG93Qm91bmRUcmFuc2l0aW9uPzogYm9vbGVhbixcblx0XHRjb25jdXJyZW50RWRpdEZsYWc/OiBib29sZWFuLFxuXHRcdGJPbmx5Rm9yVGVzdD86IGJvb2xlYW4sXG5cdFx0b25CZWZvcmVTaG93TWVzc2FnZT86IChtZXNzYWdlczogYW55LCBzaG93TWVzc2FnZVBhcmFtZXRlcnM6IGFueSkgPT4gYW55XG5cdCkgPT4gUHJvbWlzZTxhbnk+O1xuXHRyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzOiAoKSA9PiB2b2lkO1xuXHRtb2RpZnlFVGFnTWVzc2FnZXNPbmx5OiAob01lc3NhZ2VNYW5hZ2VyOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55LCBjb25jdXJyZW50RWRpdEZsYWc6IGJvb2xlYW4gfCB1bmRlZmluZWQpID0+IGJvb2xlYW47XG5cdHJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzOiAoc1BhdGhUb0JlUmVtb3ZlZD86IHN0cmluZykgPT4gdm9pZDtcblx0Z2V0UmV0cnlBZnRlck1lc3NhZ2U6IChvTWVzc2FnZTogYW55LCBiTWVzc2FnZURpYWxvZz86IGFueSkgPT4gYW55O1xuXHRwcmVwYXJlTWVzc2FnZVZpZXdGb3JEaWFsb2c6IChvTWVzc2FnZURpYWxvZ01vZGVsOiBKU09OTW9kZWwsIGJTdHJpY3RIYW5kbGluZ0Zsb3c6IGJvb2xlYW4sIGlzTXVsdGk0MTI/OiBib29sZWFuKSA9PiBhbnk7XG5cdHNldE1lc3NhZ2VTdWJ0aXRsZTogKG9UYWJsZTogYW55LCBhQ29udGV4dHM6IGFueVtdLCBtZXNzYWdlOiBhbnkpID0+IGFueTtcbn07XG5cbmZ1bmN0aW9uIGZuRm9ybWF0VGVjaG5pY2FsRGV0YWlscygpIHtcblx0bGV0IHNQcmV2aW91c0dyb3VwTmFtZTogc3RyaW5nO1xuXG5cdC8vIEluc2VydCB0ZWNobmljYWwgZGV0YWlsIGlmIGl0IGV4aXN0c1xuXHRmdW5jdGlvbiBpbnNlcnREZXRhaWwob1Byb3BlcnR5OiBhbnkpIHtcblx0XHRyZXR1cm4gb1Byb3BlcnR5LnByb3BlcnR5XG5cdFx0XHQ/IFwiKCAke1wiICtcblx0XHRcdFx0XHRvUHJvcGVydHkucHJvcGVydHkgK1xuXHRcdFx0XHRcdCd9ID8gKFwiPHA+JyArXG5cdFx0XHRcdFx0b1Byb3BlcnR5LnByb3BlcnR5LnN1YnN0cihNYXRoLm1heChvUHJvcGVydHkucHJvcGVydHkubGFzdEluZGV4T2YoXCIvXCIpLCBvUHJvcGVydHkucHJvcGVydHkubGFzdEluZGV4T2YoXCIuXCIpKSArIDEpICtcblx0XHRcdFx0XHQnIDogXCIgKyAnICtcblx0XHRcdFx0XHRcIiR7XCIgK1xuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5wcm9wZXJ0eSArXG5cdFx0XHRcdFx0J30gKyBcIjwvcD5cIikgOiBcIlwiICknXG5cdFx0XHQ6IFwiXCI7XG5cdH1cblx0Ly8gSW5zZXJ0IGdyb3VwbmFtZSBpZiBpdCBleGlzdHNcblx0ZnVuY3Rpb24gaW5zZXJ0R3JvdXBOYW1lKG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0bGV0IHNIVE1MID0gXCJcIjtcblx0XHRpZiAob1Byb3BlcnR5Lmdyb3VwTmFtZSAmJiBvUHJvcGVydHkucHJvcGVydHkgJiYgb1Byb3BlcnR5Lmdyb3VwTmFtZSAhPT0gc1ByZXZpb3VzR3JvdXBOYW1lKSB7XG5cdFx0XHRzSFRNTCArPSBcIiggJHtcIiArIG9Qcm9wZXJ0eS5wcm9wZXJ0eSArICd9ID8gXCI8YnI+PGgzPicgKyBvUHJvcGVydHkuZ3JvdXBOYW1lICsgJzwvaDM+XCIgOiBcIlwiICkgKyAnO1xuXHRcdFx0c1ByZXZpb3VzR3JvdXBOYW1lID0gb1Byb3BlcnR5Lmdyb3VwTmFtZTtcblx0XHR9XG5cdFx0cmV0dXJuIHNIVE1MO1xuXHR9XG5cblx0Ly8gTGlzdCBvZiB0ZWNobmljYWwgZGV0YWlscyB0byBiZSBzaG93blxuXHRmdW5jdGlvbiBnZXRQYXRocygpIHtcblx0XHRjb25zdCBzVEQgPSBcInRlY2huaWNhbERldGFpbHNcIjsgLy8gbmFtZSBvZiBwcm9wZXJ0eSBpbiBtZXNzYWdlIG1vZGVsIGRhdGEgZm9yIHRlY2huaWNhbCBkZXRhaWxzXG5cdFx0cmV0dXJuIFtcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJcIiwgXCJwcm9wZXJ0eVwiOiBgJHtzVER9L3N0YXR1c2AgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJcIiwgXCJwcm9wZXJ0eVwiOiBgJHtzVER9L3N0YXR1c1RleHRgIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiQXBwbGljYXRpb25cIiwgXCJwcm9wZXJ0eVwiOiBgJHtzVER9L2Vycm9yL0BTQVBfX2NvbW1vbi5BcHBsaWNhdGlvbi9Db21wb25lbnRJZGAgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJBcHBsaWNhdGlvblwiLCBcInByb3BlcnR5XCI6IGAke3NURH0vZXJyb3IvQFNBUF9fY29tbW9uLkFwcGxpY2F0aW9uL1NlcnZpY2VJZGAgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJBcHBsaWNhdGlvblwiLCBcInByb3BlcnR5XCI6IGAke3NURH0vZXJyb3IvQFNBUF9fY29tbW9uLkFwcGxpY2F0aW9uL1NlcnZpY2VSZXBvc2l0b3J5YCB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIkFwcGxpY2F0aW9uXCIsIFwicHJvcGVydHlcIjogYCR7c1REfS9lcnJvci9AU0FQX19jb21tb24uQXBwbGljYXRpb24vU2VydmljZVZlcnNpb25gIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiRXJyb3JSZXNvbHV0aW9uXCIsIFwicHJvcGVydHlcIjogYCR7c1REfS9lcnJvci9AU0FQX19jb21tb24uRXJyb3JSZXNvbHV0aW9uL0FuYWx5c2lzYCB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIkVycm9yUmVzb2x1dGlvblwiLCBcInByb3BlcnR5XCI6IGAke3NURH0vZXJyb3IvQFNBUF9fY29tbW9uLkVycm9yUmVzb2x1dGlvbi9Ob3RlYCB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIkVycm9yUmVzb2x1dGlvblwiLCBcInByb3BlcnR5XCI6IGAke3NURH0vZXJyb3IvQFNBUF9fY29tbW9uLkVycm9yUmVzb2x1dGlvbi9EZXRhaWxlZE5vdGVgIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiRXJyb3JSZXNvbHV0aW9uXCIsIFwicHJvcGVydHlcIjogYCR7c1REfS9lcnJvci9AU0FQX19jb21tb24uRXhjZXB0aW9uQ2F0ZWdvcnlgIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiRXJyb3JSZXNvbHV0aW9uXCIsIFwicHJvcGVydHlcIjogYCR7c1REfS9lcnJvci9AU0FQX19jb21tb24uVGltZVN0YW1wYCB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIkVycm9yUmVzb2x1dGlvblwiLCBcInByb3BlcnR5XCI6IGAke3NURH0vZXJyb3IvQFNBUF9fY29tbW9uLlRyYW5zYWN0aW9uSWRgIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiTWVzc2FnZXNcIiwgXCJwcm9wZXJ0eVwiOiBgJHtzVER9L2Vycm9yL2NvZGVgIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiTWVzc2FnZXNcIiwgXCJwcm9wZXJ0eVwiOiBgJHtzVER9L2Vycm9yL21lc3NhZ2VgIH1cblx0XHRdO1xuXHR9XG5cblx0bGV0IHNIVE1MID0gXCJPYmplY3Qua2V5cyhcIiArIFwiJHt0ZWNobmljYWxEZXRhaWxzfVwiICsgJykubGVuZ3RoID4gMCA/IFwiPGgyPlRlY2huaWNhbCBEZXRhaWxzPC9oMj5cIiA6IFwiXCIgJztcblx0Z2V0UGF0aHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvUHJvcGVydHk6IHsgZ3JvdXBOYW1lOiBzdHJpbmc7IHByb3BlcnR5OiBzdHJpbmcgfSkge1xuXHRcdHNIVE1MID0gYCR7c0hUTUwgKyBpbnNlcnRHcm91cE5hbWUob1Byb3BlcnR5KX0ke2luc2VydERldGFpbChvUHJvcGVydHkpfSArIGA7XG5cdH0pO1xuXHRyZXR1cm4gc0hUTUw7XG59XG5mdW5jdGlvbiBmbkZvcm1hdERlc2NyaXB0aW9uKCkge1xuXHRyZXR1cm4gXCIoJHtcIiArICdkZXNjcmlwdGlvbn0gPyAoXCI8aDI+RGVzY3JpcHRpb248L2gyPlwiICsgJHsnICsgJ2Rlc2NyaXB0aW9ufSkgOiBcIlwiKSc7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgbWVzc2FnZSB0eXBlKEVycm9yL1dhcm5pbmcvU3VjY2Vzcy9JbmZvcm1hdGlvbikgZnJvbSB0aGUgYXZhaWxhYmxlIG1lc3NhZ2VzLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5tZXNzYWdlSGFuZGxpbmcuZm5HZXRIaWdoZXN0TWVzc2FnZVByaW9yaXR5XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5tZXNzYWdlSGFuZGxpbmdcbiAqIEBwYXJhbSBbYU1lc3NhZ2VzXSBNZXNzYWdlcyBsaXN0XG4gKiBAcmV0dXJucyBIaWdoZXN0IHByaW9yaXR5IG1lc3NhZ2UgZnJvbSB0aGUgYXZhaWxhYmxlIG1lc3NhZ2VzXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGZuR2V0SGlnaGVzdE1lc3NhZ2VQcmlvcml0eShhTWVzc2FnZXM6IGFueVtdKSB7XG5cdGxldCBzTWVzc2FnZVByaW9yaXR5ID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0Y29uc3QgaUxlbmd0aCA9IGFNZXNzYWdlcy5sZW5ndGg7XG5cdGNvbnN0IG9NZXNzYWdlQ291bnQ6IGFueSA9IHsgRXJyb3I6IDAsIFdhcm5pbmc6IDAsIFN1Y2Nlc3M6IDAsIEluZm9ybWF0aW9uOiAwIH07XG5cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpKyspIHtcblx0XHQrK29NZXNzYWdlQ291bnRbYU1lc3NhZ2VzW2ldLmdldFR5cGUoKV07XG5cdH1cblx0aWYgKG9NZXNzYWdlQ291bnRbTWVzc2FnZVR5cGUuRXJyb3JdID4gMCkge1xuXHRcdHNNZXNzYWdlUHJpb3JpdHkgPSBNZXNzYWdlVHlwZS5FcnJvcjtcblx0fSBlbHNlIGlmIChvTWVzc2FnZUNvdW50W01lc3NhZ2VUeXBlLldhcm5pbmddID4gMCkge1xuXHRcdHNNZXNzYWdlUHJpb3JpdHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKG9NZXNzYWdlQ291bnRbTWVzc2FnZVR5cGUuU3VjY2Vzc10gPiAwKSB7XG5cdFx0c01lc3NhZ2VQcmlvcml0eSA9IE1lc3NhZ2VUeXBlLlN1Y2Nlc3M7XG5cdH0gZWxzZSBpZiAob01lc3NhZ2VDb3VudFtNZXNzYWdlVHlwZS5JbmZvcm1hdGlvbl0gPiAwKSB7XG5cdFx0c01lc3NhZ2VQcmlvcml0eSA9IE1lc3NhZ2VUeXBlLkluZm9ybWF0aW9uO1xuXHR9XG5cdHJldHVybiBzTWVzc2FnZVByaW9yaXR5O1xufVxuLy8gZnVuY3Rpb24gd2hpY2ggbW9kaWZ5IGUtVGFnIG1lc3NhZ2VzIG9ubHkuXG4vLyByZXR1cm5zIDogdHJ1ZSwgaWYgYW55IGUtVGFnIG1lc3NhZ2UgaXMgbW9kaWZpZWQsIG90aGVyd2lzZSBmYWxzZS5cbmZ1bmN0aW9uIGZuTW9kaWZ5RVRhZ01lc3NhZ2VzT25seShvTWVzc2FnZU1hbmFnZXI6IGFueSwgb1Jlc291cmNlQnVuZGxlOiBhbnksIGNvbmN1cnJlbnRFZGl0RmxhZzogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuXHRjb25zdCBhTWVzc2FnZXMgPSBvTWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZU1vZGVsKCkuZ2V0T2JqZWN0KFwiL1wiKTtcblx0bGV0IGJNZXNzYWdlc01vZGlmaWVkID0gZmFsc2U7XG5cdGxldCBzRXRhZ01lc3NhZ2UgPSBcIlwiO1xuXHRhTWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAob01lc3NhZ2U6IGFueSwgaTogYW55KSB7XG5cdFx0Y29uc3Qgb1RlY2huaWNhbERldGFpbHMgPSBvTWVzc2FnZS5nZXRUZWNobmljYWxEZXRhaWxzICYmIG9NZXNzYWdlLmdldFRlY2huaWNhbERldGFpbHMoKTtcblx0XHRpZiAob1RlY2huaWNhbERldGFpbHMgJiYgb1RlY2huaWNhbERldGFpbHMuaHR0cFN0YXR1cyA9PT0gNDEyKSB7XG5cdFx0XHRpZiAob1RlY2huaWNhbERldGFpbHMuaXNDb25jdXJyZW50TW9kaWZpY2F0aW9uICYmIGNvbmN1cnJlbnRFZGl0RmxhZykge1xuXHRcdFx0XHRzRXRhZ01lc3NhZ2UgPVxuXHRcdFx0XHRcdHNFdGFnTWVzc2FnZSB8fCBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQVBQX0NPTVBPTkVOVF9TQVBGRV9FVEFHX1RFQ0hOSUNBTF9JU1NVRVNfQ09OQ1VSUkVOVF9NT0RJRklDQVRJT05cIik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzRXRhZ01lc3NhZ2UgPSBzRXRhZ01lc3NhZ2UgfHwgb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0FQUF9DT01QT05FTlRfU0FQRkVfRVRBR19URUNITklDQUxfSVNTVUVTXCIpO1xuXHRcdFx0fVxuXHRcdFx0b01lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKGFNZXNzYWdlc1tpXSk7XG5cdFx0XHRvTWVzc2FnZS5zZXRNZXNzYWdlKHNFdGFnTWVzc2FnZSk7XG5cdFx0XHRvTWVzc2FnZS50YXJnZXQgPSBcIlwiO1xuXHRcdFx0b01lc3NhZ2VNYW5hZ2VyLmFkZE1lc3NhZ2VzKG9NZXNzYWdlKTtcblx0XHRcdGJNZXNzYWdlc01vZGlmaWVkID0gdHJ1ZTtcblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gYk1lc3NhZ2VzTW9kaWZpZWQ7XG59XG4vLyBEaWFsb2cgY2xvc2UgSGFuZGxpbmdcbmZ1bmN0aW9uIGRpYWxvZ0Nsb3NlSGFuZGxlcigpIHtcblx0b0RpYWxvZy5jbG9zZSgpO1xuXHRvQmFja0J1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTtcblx0YU1lc3NhZ2VMaXN0ID0gW107XG5cdGNvbnN0IG9NZXNzYWdlRGlhbG9nTW9kZWw6IGFueSA9IG9NZXNzYWdlVmlldy5nZXRNb2RlbCgpO1xuXHRpZiAob01lc3NhZ2VEaWFsb2dNb2RlbCkge1xuXHRcdG9NZXNzYWdlRGlhbG9nTW9kZWwuc2V0RGF0YSh7fSk7XG5cdH1cblx0cmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xufVxuZnVuY3Rpb24gZ2V0UmV0cnlBZnRlck1lc3NhZ2Uob01lc3NhZ2U6IGFueSwgYk1lc3NhZ2VEaWFsb2c/OiBhbnkpIHtcblx0Y29uc3QgZE5vdyA9IG5ldyBEYXRlKCk7XG5cdGNvbnN0IG9UZWNobmljYWxEZXRhaWxzID0gb01lc3NhZ2UuZ2V0VGVjaG5pY2FsRGV0YWlscygpO1xuXHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRsZXQgc1JldHJ5QWZ0ZXJNZXNzYWdlO1xuXHRpZiAob1RlY2huaWNhbERldGFpbHMgJiYgb1RlY2huaWNhbERldGFpbHMuaHR0cFN0YXR1cyA9PT0gNTAzICYmIG9UZWNobmljYWxEZXRhaWxzLnJldHJ5QWZ0ZXIpIHtcblx0XHRjb25zdCBkUmV0cnlBZnRlciA9IG9UZWNobmljYWxEZXRhaWxzLnJldHJ5QWZ0ZXI7XG5cdFx0bGV0IG9EYXRlRm9ybWF0O1xuXHRcdGlmIChkTm93LmdldEZ1bGxZZWFyKCkgIT09IGRSZXRyeUFmdGVyLmdldEZ1bGxZZWFyKCkpIHtcblx0XHRcdC8vZGlmZmVyZW50IHllYXJzXG5cdFx0XHRvRGF0ZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZSh7XG5cdFx0XHRcdHBhdHRlcm46IFwiTU1NTSBkZCwgeXl5eSAnYXQnIGhoOm1tIGFcIlxuXHRcdFx0fSk7XG5cdFx0XHRzUmV0cnlBZnRlck1lc3NhZ2UgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfRVJST1JcIiwgW29EYXRlRm9ybWF0LmZvcm1hdChkUmV0cnlBZnRlcildKTtcblx0XHR9IGVsc2UgaWYgKGROb3cuZ2V0RnVsbFllYXIoKSA9PSBkUmV0cnlBZnRlci5nZXRGdWxsWWVhcigpKSB7XG5cdFx0XHQvL3NhbWUgeWVhclxuXHRcdFx0aWYgKGJNZXNzYWdlRGlhbG9nKSB7XG5cdFx0XHRcdC8vbGVzcyB0aGFuIDIgbWluXG5cdFx0XHRcdHNSZXRyeUFmdGVyTWVzc2FnZSA9IGAke29SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFXzUwM19USVRMRVwiKX0gJHtvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcblx0XHRcdFx0XHRcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfREVTQ1wiXG5cdFx0XHRcdCl9YDtcblx0XHRcdH0gZWxzZSBpZiAoZE5vdy5nZXRNb250aCgpICE9PSBkUmV0cnlBZnRlci5nZXRNb250aCgpIHx8IGROb3cuZ2V0RGF0ZSgpICE9PSBkUmV0cnlBZnRlci5nZXREYXRlKCkpIHtcblx0XHRcdFx0b0RhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2Uoe1xuXHRcdFx0XHRcdHBhdHRlcm46IFwiTU1NTSBkZCAnYXQnIGhoOm1tIGFcIlxuXHRcdFx0XHR9KTsgLy9kaWZmZXJlbnQgbW9udGhzIG9yIGRpZmZlcmVudCBkYXlzIG9mIHNhbWUgbW9udGhcblx0XHRcdFx0c1JldHJ5QWZ0ZXJNZXNzYWdlID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0VSUk9SXCIsIFtvRGF0ZUZvcm1hdC5mb3JtYXQoZFJldHJ5QWZ0ZXIpXSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvL3NhbWUgZGF5XG5cdFx0XHRcdG9EYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBcImhoOm1tIGFcIlxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c1JldHJ5QWZ0ZXJNZXNzYWdlID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0VSUk9SX0RBWVwiLCBbb0RhdGVGb3JtYXQuZm9ybWF0KGRSZXRyeUFmdGVyKV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmIChvVGVjaG5pY2FsRGV0YWlscyAmJiBvVGVjaG5pY2FsRGV0YWlscy5odHRwU3RhdHVzID09PSA1MDMgJiYgIW9UZWNobmljYWxEZXRhaWxzLnJldHJ5QWZ0ZXIpIHtcblx0XHRzUmV0cnlBZnRlck1lc3NhZ2UgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfRVJST1JfTk9fUkVUUllfQUZURVJcIik7XG5cdH1cblx0cmV0dXJuIHNSZXRyeUFmdGVyTWVzc2FnZTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZU1lc3NhZ2VWaWV3Rm9yRGlhbG9nKG9NZXNzYWdlRGlhbG9nTW9kZWw6IEpTT05Nb2RlbCwgYlN0cmljdEhhbmRsaW5nRmxvdzogYm9vbGVhbiwgbXVsdGk0MTI/OiBib29sZWFuKSB7XG5cdGxldCBvTWVzc2FnZVRlbXBsYXRlOiBNZXNzYWdlSXRlbTtcblx0aWYgKCFiU3RyaWN0SGFuZGxpbmdGbG93KSB7XG5cdFx0b01lc3NhZ2VUZW1wbGF0ZSA9IG5ldyBNZXNzYWdlSXRlbSh1bmRlZmluZWQsIHtcblx0XHRcdGNvdW50ZXI6IHsgcGF0aDogXCJjb3VudGVyXCIgfSxcblx0XHRcdHRpdGxlOiBcInttZXNzYWdlfVwiLFxuXHRcdFx0c3VidGl0bGU6IFwie2FkZGl0aW9uYWxUZXh0fVwiLFxuXHRcdFx0bG9uZ3RleHRVcmw6IFwie2Rlc2NyaXB0aW9uVXJsfVwiLFxuXHRcdFx0dHlwZTogeyBwYXRoOiBcInR5cGVcIiB9LFxuXHRcdFx0ZGVzY3JpcHRpb246XG5cdFx0XHRcdFwiez0gJHtcIiArXG5cdFx0XHRcdFwiZGVzY3JpcHRpb259IHx8ICR7dGVjaG5pY2FsRGV0YWlsc30gPyBcIiArXG5cdFx0XHRcdCdcIjxodG1sPjxib2R5PlwiICsgJyArXG5cdFx0XHRcdGZuRm9ybWF0RGVzY3JpcHRpb24oKSArXG5cdFx0XHRcdFwiICsgXCIgK1xuXHRcdFx0XHRmbkZvcm1hdFRlY2huaWNhbERldGFpbHMoKSArXG5cdFx0XHRcdCdcIjwvYm9keT48L2h0bWw+XCInICtcblx0XHRcdFx0JyA6IFwiXCIgfScsXG5cdFx0XHRtYXJrdXBEZXNjcmlwdGlvbjogdHJ1ZVxuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKG11bHRpNDEyKSB7XG5cdFx0b01lc3NhZ2VUZW1wbGF0ZSA9IG5ldyBNZXNzYWdlSXRlbSh1bmRlZmluZWQsIHtcblx0XHRcdGNvdW50ZXI6IHsgcGF0aDogXCJjb3VudGVyXCIgfSxcblx0XHRcdHRpdGxlOiBcInttZXNzYWdlfVwiLFxuXHRcdFx0c3VidGl0bGU6IFwie2FkZGl0aW9uYWxUZXh0fVwiLFxuXHRcdFx0bG9uZ3RleHRVcmw6IFwie2Rlc2NyaXB0aW9uVXJsfVwiLFxuXHRcdFx0dHlwZTogeyBwYXRoOiBcInR5cGVcIiB9LFxuXHRcdFx0ZGVzY3JpcHRpb246IFwie2Rlc2NyaXB0aW9ufVwiLFxuXHRcdFx0bWFya3VwRGVzY3JpcHRpb246IHRydWVcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRvTWVzc2FnZVRlbXBsYXRlID0gbmV3IE1lc3NhZ2VJdGVtKHtcblx0XHRcdHRpdGxlOiBcInttZXNzYWdlfVwiLFxuXHRcdFx0dHlwZTogeyBwYXRoOiBcInR5cGVcIiB9LFxuXHRcdFx0bG9uZ3RleHRVcmw6IFwie2Rlc2NyaXB0aW9uVXJsfVwiXG5cdFx0fSk7XG5cdH1cblx0b01lc3NhZ2VWaWV3ID0gbmV3IE1lc3NhZ2VWaWV3KHtcblx0XHRzaG93RGV0YWlsc1BhZ2VIZWFkZXI6IGZhbHNlLFxuXHRcdGl0ZW1TZWxlY3Q6IGZ1bmN0aW9uICgpIHtcblx0XHRcdG9CYWNrQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7XG5cdFx0fSxcblx0XHRpdGVtczoge1xuXHRcdFx0cGF0aDogXCIvXCIsXG5cdFx0XHR0ZW1wbGF0ZTogb01lc3NhZ2VUZW1wbGF0ZVxuXHRcdH1cblx0fSk7XG5cdG9CYWNrQnV0dG9uID1cblx0XHRvQmFja0J1dHRvbiB8fFxuXHRcdG5ldyBCdXR0b24oe1xuXHRcdFx0aWNvbjogSWNvblBvb2wuZ2V0SWNvblVSSShcIm5hdi1iYWNrXCIpLFxuXHRcdFx0dmlzaWJsZTogZmFsc2UsXG5cdFx0XHRwcmVzczogZnVuY3Rpb24gKHRoaXM6IEJ1dHRvbikge1xuXHRcdFx0XHRvTWVzc2FnZVZpZXcubmF2aWdhdGVCYWNrKCk7XG5cdFx0XHRcdHRoaXMuc2V0VmlzaWJsZShmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdC8vIFVwZGF0ZSBwcm9wZXIgRVRhZyBNaXNtYXRjaCBlcnJvclxuXHRvTWVzc2FnZVZpZXcuc2V0TW9kZWwob01lc3NhZ2VEaWFsb2dNb2RlbCk7XG5cdHJldHVybiB7XG5cdFx0b01lc3NhZ2VWaWV3LFxuXHRcdG9CYWNrQnV0dG9uXG5cdH07XG59XG5cbmZ1bmN0aW9uIHNob3dVbmJvdW5kTWVzc2FnZXMoXG5cdHRoaXM6IG1lc3NhZ2VIYW5kbGluZ1R5cGUsXG5cdGFDdXN0b21NZXNzYWdlcz86IGFueVtdLFxuXHRvQ29udGV4dD86IGFueSxcblx0YlNob3dCb3VuZFRyYW5zaXRpb24/OiBib29sZWFuLFxuXHRjb25jdXJyZW50RWRpdEZsYWc/OiBib29sZWFuLFxuXHRiT25seUZvclRlc3Q/OiBib29sZWFuLFxuXHRvbkJlZm9yZVNob3dNZXNzYWdlPzogKG1lc3NhZ2VzOiBhbnksIHNob3dNZXNzYWdlUGFyYW1ldGVyczogYW55KSA9PiBhbnlcbik6IFByb21pc2U8YW55PiB7XG5cdGxldCBhVHJhbnNpdGlvbk1lc3NhZ2VzID0gdGhpcy5nZXRNZXNzYWdlcygpO1xuXHRjb25zdCBvTWVzc2FnZU1hbmFnZXIgPSBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCk7XG5cdGxldCBzSGlnaGVzdFByaW9yaXR5O1xuXHRsZXQgc0hpZ2hlc3RQcmlvcml0eVRleHQ7XG5cdGNvbnN0IGFGaWx0ZXJzID0gW25ldyBGaWx0ZXIoeyBwYXRoOiBcInBlcnNpc3RlbnRcIiwgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLk5FLCB2YWx1ZTE6IGZhbHNlIH0pXTtcblx0bGV0IHNob3dNZXNzYWdlRGlhbG9nOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2UsXG5cdFx0c2hvd01lc3NhZ2VCb3g6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZTtcblxuXHRpZiAoYlNob3dCb3VuZFRyYW5zaXRpb24pIHtcblx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzID0gYVRyYW5zaXRpb25NZXNzYWdlcy5jb25jYXQoZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSkpO1xuXHRcdC8vIHdlIG9ubHkgd2FudCB0byBzaG93IGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgbm90IGJvdW5kIHN0YXRlIG1lc3NhZ2VzIGhlbmNlIGFkZCBhIGZpbHRlciBmb3IgdGhlIHNhbWVcblx0XHRhRmlsdGVycy5wdXNoKG5ldyBGaWx0ZXIoeyBwYXRoOiBcInBlcnNpc3RlbnRcIiwgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLkVRLCB2YWx1ZTE6IHRydWUgfSkpO1xuXHRcdGNvbnN0IGZuQ2hlY2tDb250cm9sSWRJbkRpYWxvZyA9IGZ1bmN0aW9uIChhQ29udHJvbElkczogYW55KSB7XG5cdFx0XHRsZXQgaW5kZXggPSBJbmZpbml0eSxcblx0XHRcdFx0b0NvbnRyb2wgPSBDb3JlLmJ5SWQoYUNvbnRyb2xJZHNbMF0pIGFzIE1hbmFnZWRPYmplY3Q7XG5cdFx0XHRjb25zdCBlcnJvckZpZWxkQ29udHJvbCA9IENvcmUuYnlJZChhQ29udHJvbElkc1swXSkgYXMgQ29udHJvbDtcblx0XHRcdHdoaWxlIChvQ29udHJvbCkge1xuXHRcdFx0XHRjb25zdCBmaWVsZFJhbmtpbkRpYWxvZyA9XG5cdFx0XHRcdFx0b0NvbnRyb2wgaW5zdGFuY2VvZiBEaWFsb2dcblx0XHRcdFx0XHRcdD8gKGVycm9yRmllbGRDb250cm9sLmdldFBhcmVudCgpIGFzIGFueSkuZmluZEVsZW1lbnRzKHRydWUpLmluZGV4T2YoZXJyb3JGaWVsZENvbnRyb2wpXG5cdFx0XHRcdFx0XHQ6IEluZmluaXR5O1xuXHRcdFx0XHRpZiAob0NvbnRyb2wgaW5zdGFuY2VvZiBEaWFsb2cpIHtcblx0XHRcdFx0XHRpZiAoaW5kZXggPiBmaWVsZFJhbmtpbkRpYWxvZykge1xuXHRcdFx0XHRcdFx0aW5kZXggPSBmaWVsZFJhbmtpbkRpYWxvZztcblx0XHRcdFx0XHRcdC8vIFNldCB0aGUgZm9jdXMgdG8gdGhlIGRpYWxvZydzIGNvbnRyb2xcblx0XHRcdFx0XHRcdGVycm9yRmllbGRDb250cm9sLmZvY3VzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIG1lc3NhZ2VzIHdpdGggdGFyZ2V0IGluc2lkZSBzYXAubS5EaWFsb2cgc2hvdWxkIG5vdCBicmluZyB1cCB0aGUgbWVzc2FnZSBkaWFsb2dcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0b0NvbnRyb2wgPSBvQ29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cdFx0YUZpbHRlcnMucHVzaChcblx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRwYXRoOiBcImNvbnRyb2xJZHNcIixcblx0XHRcdFx0dGVzdDogZm5DaGVja0NvbnRyb2xJZEluRGlhbG9nLFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiB0cnVlXG5cdFx0XHR9KVxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gb25seSB1bmJvdW5kIG1lc3NhZ2VzIGhhdmUgdG8gYmUgc2hvd24gc28gYWRkIGZpbHRlciBhY2NvcmRpbmdseVxuXHRcdGFGaWx0ZXJzLnB1c2gobmV3IEZpbHRlcih7IHBhdGg6IFwidGFyZ2V0XCIsIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5FUSwgdmFsdWUxOiBcIlwiIH0pKTtcblx0fVxuXHRpZiAoYUN1c3RvbU1lc3NhZ2VzICYmIGFDdXN0b21NZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRhQ3VzdG9tTWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0Y29uc3QgbWVzc2FnZUNvZGUgPSBvTWVzc2FnZS5jb2RlID8gb01lc3NhZ2UuY29kZSA6IFwiXCI7XG5cdFx0XHRvTWVzc2FnZU1hbmFnZXIuYWRkTWVzc2FnZXMoXG5cdFx0XHRcdG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRtZXNzYWdlOiBvTWVzc2FnZS50ZXh0LFxuXHRcdFx0XHRcdHR5cGU6IG9NZXNzYWdlLnR5cGUsXG5cdFx0XHRcdFx0dGFyZ2V0OiBcIlwiLFxuXHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0Y29kZTogbWVzc2FnZUNvZGVcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XHQvL1RoZSB0YXJnZXQgYW5kIHBlcnNpc3RlbnQgcHJvcGVydGllcyBvZiB0aGUgbWVzc2FnZSBhcmUgaGFyZGNvZGVkIGFzIFwiXCIgYW5kIHRydWUgYmVjYXVzZSB0aGUgZnVuY3Rpb24gZGVhbHMgd2l0aCBvbmx5IHVuYm91bmQgbWVzc2FnZXMuXG5cdFx0fSk7XG5cdH1cblx0Y29uc3Qgb01lc3NhZ2VEaWFsb2dNb2RlbCA9IChvTWVzc2FnZVZpZXcgJiYgKG9NZXNzYWdlVmlldy5nZXRNb2RlbCgpIGFzIEpTT05Nb2RlbCkpIHx8IG5ldyBKU09OTW9kZWwoKTtcblx0Y29uc3QgYkhhc0V0YWdNZXNzYWdlID0gdGhpcy5tb2RpZnlFVGFnTWVzc2FnZXNPbmx5KG9NZXNzYWdlTWFuYWdlciwgQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSwgY29uY3VycmVudEVkaXRGbGFnKTtcblxuXHRpZiAoYVRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGggPT09IDEgJiYgYVRyYW5zaXRpb25NZXNzYWdlc1swXS5nZXRDb2RlKCkgPT09IFwiNTAzXCIpIHtcblx0XHRzaG93TWVzc2FnZUJveCA9IHRydWU7XG5cdH0gZWxzZSBpZiAoYVRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGggIT09IDApIHtcblx0XHRzaG93TWVzc2FnZURpYWxvZyA9IHRydWU7XG5cdH1cblx0bGV0IHNob3dNZXNzYWdlUGFyYW1ldGVyczogYW55O1xuXHRsZXQgYU1vZGVsRGF0YUFycmF5OiBhbnlbXSA9IFtdO1xuXHRpZiAoc2hvd01lc3NhZ2VEaWFsb2cgfHwgKCFzaG93TWVzc2FnZUJveCAmJiAhb25CZWZvcmVTaG93TWVzc2FnZSkpIHtcblx0XHRjb25zdCBvTGlzdEJpbmRpbmcgPSBvTWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZU1vZGVsKCkuYmluZExpc3QoXCIvXCIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhRmlsdGVycyksXG5cdFx0XHRhQ3VycmVudENvbnRleHRzID0gb0xpc3RCaW5kaW5nLmdldEN1cnJlbnRDb250ZXh0cygpO1xuXHRcdGlmIChhQ3VycmVudENvbnRleHRzICYmIGFDdXJyZW50Q29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0c2hvd01lc3NhZ2VEaWFsb2cgPSB0cnVlO1xuXHRcdFx0Ly8gRG9uJ3Qgc2hvdyBkaWFsb2cgaW5jYXNlIHRoZXJlIGFyZSBubyBlcnJvcnMgdG8gc2hvd1xuXG5cdFx0XHQvLyBpZiBmYWxzZSwgc2hvdyBtZXNzYWdlcyBpbiBkaWFsb2dcblx0XHRcdC8vIEFzIGZpdGVyaW5nIGhhcyBhbHJlYWR5IGhhcHBlbmVkIGhlcmUgaGVuY2Vcblx0XHRcdC8vIHVzaW5nIHRoZSBtZXNzYWdlIG1vZGVsIGFnYWluIGZvciB0aGUgbWVzc2FnZSBkaWFsb2cgdmlldyBhbmQgdGhlbiBmaWx0ZXJpbmcgb24gdGhhdCBiaW5kaW5nIGFnYWluIGlzIHVubmVjZXNzYXJ5LlxuXHRcdFx0Ly8gU28gd2UgY3JlYXRlIG5ldyBqc29uIG1vZGVsIHRvIHVzZSBmb3IgdGhlIG1lc3NhZ2UgZGlhbG9nIHZpZXcuXG5cdFx0XHRjb25zdCBhTWVzc2FnZXM6IGFueVtdID0gW107XG5cdFx0XHRhQ3VycmVudENvbnRleHRzLmZvckVhY2goZnVuY3Rpb24gKGN1cnJlbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgb01lc3NhZ2UgPSBjdXJyZW50Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0YU1lc3NhZ2VzLnB1c2gob01lc3NhZ2UpO1xuXHRcdFx0XHRhTWVzc2FnZURhdGFMaXN0ID0gYU1lc3NhZ2VzO1xuXHRcdFx0fSk7XG5cdFx0XHQvLyBpZihhTWVzc2FnZXMubGVuZ3RoID09PSAwICYmIGFNZXNzYWdlTGlzdC5sZW5ndGgpIHtcblx0XHRcdC8vIFx0b01lc3NhZ2VEaWFsb2dNb2RlbC5zZXREYXRhKGFNZXNzYWdlcyk7XG5cdFx0XHQvLyB9XG5cdFx0XHRsZXQgZXhpc3RpbmdNZXNzYWdlczogYW55W10gPSBbXTtcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KG9NZXNzYWdlRGlhbG9nTW9kZWwuZ2V0RGF0YSgpKSkge1xuXHRcdFx0XHRleGlzdGluZ01lc3NhZ2VzID0gb01lc3NhZ2VEaWFsb2dNb2RlbC5nZXREYXRhKCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvVW5pcXVlT2JqOiBhbnkgPSB7fTtcblxuXHRcdFx0YU1vZGVsRGF0YUFycmF5ID0gYU1lc3NhZ2VEYXRhTGlzdC5jb25jYXQoZXhpc3RpbmdNZXNzYWdlcykuZmlsdGVyKGZ1bmN0aW9uIChvYmopIHtcblx0XHRcdFx0Ly8gcmVtb3ZlIGVudHJpZXMgaGF2aW5nIGR1cGxpY2F0ZSBtZXNzYWdlIGlkc1xuXHRcdFx0XHRyZXR1cm4gIW9VbmlxdWVPYmpbb2JqLmlkXSAmJiAob1VuaXF1ZU9ialtvYmouaWRdID0gdHJ1ZSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRpZiAob25CZWZvcmVTaG93TWVzc2FnZSkge1xuXHRcdHNob3dNZXNzYWdlUGFyYW1ldGVycyA9IHsgc2hvd01lc3NhZ2VCb3gsIHNob3dNZXNzYWdlRGlhbG9nIH07XG5cdFx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzID0gb25CZWZvcmVTaG93TWVzc2FnZShhVHJhbnNpdGlvbk1lc3NhZ2VzLCBzaG93TWVzc2FnZVBhcmFtZXRlcnMpO1xuXHRcdHNob3dNZXNzYWdlQm94ID0gc2hvd01lc3NhZ2VQYXJhbWV0ZXJzLnNob3dNZXNzYWdlQm94O1xuXHRcdHNob3dNZXNzYWdlRGlhbG9nID0gc2hvd01lc3NhZ2VQYXJhbWV0ZXJzLnNob3dNZXNzYWdlRGlhbG9nO1xuXHRcdGlmIChzaG93TWVzc2FnZURpYWxvZykge1xuXHRcdFx0YU1vZGVsRGF0YUFycmF5ID0gc2hvd01lc3NhZ2VQYXJhbWV0ZXJzLmZpbHRlcmVkTWVzc2FnZXMgPyBzaG93TWVzc2FnZVBhcmFtZXRlcnMuZmlsdGVyZWRNZXNzYWdlcyA6IGFNb2RlbERhdGFBcnJheTtcblx0XHR9XG5cdH1cblx0aWYgKGFUcmFuc2l0aW9uTWVzc2FnZXMubGVuZ3RoID09PSAwICYmICFhQ3VzdG9tTWVzc2FnZXMgJiYgIWJIYXNFdGFnTWVzc2FnZSkge1xuXHRcdC8vIERvbid0IHNob3cgdGhlIHBvcHVwIGlmIHRoZXJlIGFyZSBubyB0cmFuc2llbnQgbWVzc2FnZXNcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHR9IGVsc2UgaWYgKGFUcmFuc2l0aW9uTWVzc2FnZXMubGVuZ3RoID09PSAxICYmIGFUcmFuc2l0aW9uTWVzc2FnZXNbMF0uZ2V0VHlwZSgpID09PSBNZXNzYWdlVHlwZS5TdWNjZXNzICYmICFhQ3VzdG9tTWVzc2FnZXMpIHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KGFUcmFuc2l0aW9uTWVzc2FnZXNbMF0ubWVzc2FnZSk7XG5cdFx0XHRpZiAob01lc3NhZ2VEaWFsb2dNb2RlbCkge1xuXHRcdFx0XHRvTWVzc2FnZURpYWxvZ01vZGVsLnNldERhdGEoe30pO1xuXHRcdFx0fVxuXHRcdFx0b01lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKGFUcmFuc2l0aW9uTWVzc2FnZXMpO1xuXHRcdFx0cmVzb2x2ZSgpO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKHNob3dNZXNzYWdlRGlhbG9nKSB7XG5cdFx0b01lc3NhZ2VEaWFsb2dNb2RlbC5zZXREYXRhKGFNb2RlbERhdGFBcnJheSk7IC8vIHNldCB0aGUgbWVzc2FnZXMgaGVyZSBzbyB0aGF0IGlmIGFueSBvZiB0aGVtIGFyZSBmaWx0ZXJlZCBmb3IgQVBELCB0aGV5IGFyZSBmaWx0ZXJlZCBoZXJlIGFzIHdlbGwuXG5cdFx0YVJlc29sdmVGdW5jdGlvbnMgPSBhUmVzb2x2ZUZ1bmN0aW9ucyB8fCBbXTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGFSZXNvbHZlRnVuY3Rpb25zLnB1c2gocmVzb2x2ZSk7XG5cdFx0XHRDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIsIHRydWUpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdFx0XHRcdGNvbnN0IGJTdHJpY3RIYW5kbGluZ0Zsb3cgPSBmYWxzZTtcblx0XHRcdFx0XHRpZiAoc2hvd01lc3NhZ2VQYXJhbWV0ZXJzICYmIHNob3dNZXNzYWdlUGFyYW1ldGVycy5mbkdldE1lc3NhZ2VTdWJ0aXRsZSkge1xuXHRcdFx0XHRcdFx0b01lc3NhZ2VEaWFsb2dNb2RlbC5nZXREYXRhKCkuZm9yRWFjaChmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRzaG93TWVzc2FnZVBhcmFtZXRlcnMuZm5HZXRNZXNzYWdlU3VidGl0bGUob01lc3NhZ2UpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IG9NZXNzYWdlT2JqZWN0ID0gcHJlcGFyZU1lc3NhZ2VWaWV3Rm9yRGlhbG9nKG9NZXNzYWdlRGlhbG9nTW9kZWwsIGJTdHJpY3RIYW5kbGluZ0Zsb3cpO1xuXHRcdFx0XHRcdG9EaWFsb2cgPVxuXHRcdFx0XHRcdFx0b0RpYWxvZyAmJiBvRGlhbG9nLmlzT3BlbigpXG5cdFx0XHRcdFx0XHRcdD8gb0RpYWxvZ1xuXHRcdFx0XHRcdFx0XHQ6IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVzaXphYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkaWFsb2dDbG9zZUhhbmRsZXIoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBhbHNvIHJlbW92ZSBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzIGlmIHdlIHdlcmUgc2hvd2luZyB0aGVtXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b01lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKGFNb2RlbERhdGFBcnJheSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRleHQ6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfQ0xPU0VcIilcblx0XHRcdFx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0XHRcdFx0Y3VzdG9tSGVhZGVyOiBuZXcgQmFyKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGVudE1pZGRsZTogW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG5ldyBUZXh0KHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRleHQ6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVcIilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb250ZW50TGVmdDogW29CYWNrQnV0dG9uXVxuXHRcdFx0XHRcdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZW50V2lkdGg6IFwiMzcuNWVtXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250ZW50SGVpZ2h0OiBcIjIxLjVlbVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0dmVydGljYWxTY3JvbGxpbmc6IGZhbHNlLFxuXHRcdFx0XHRcdFx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFSZXNvbHZlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YVJlc29sdmVGdW5jdGlvbnNbaV0uY2FsbCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFSZXNvbHZlRnVuY3Rpb25zID0gW107XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdCAgfSk7XG5cdFx0XHRcdFx0b0RpYWxvZy5yZW1vdmVBbGxDb250ZW50KCk7XG5cdFx0XHRcdFx0b0RpYWxvZy5hZGRDb250ZW50KG9NZXNzYWdlT2JqZWN0Lm9NZXNzYWdlVmlldyk7XG5cblx0XHRcdFx0XHRpZiAoYkhhc0V0YWdNZXNzYWdlKSB7XG5cdFx0XHRcdFx0XHRzYXAudWkucmVxdWlyZShbXCJzYXAvbS9CdXR0b25UeXBlXCJdLCBmdW5jdGlvbiAoQnV0dG9uVHlwZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0QmVnaW5CdXR0b24oXG5cdFx0XHRcdFx0XHRcdFx0bmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRkaWFsb2dDbG9zZUhhbmRsZXIoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9Db250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHQucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdHRleHQ6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfUkVGUkVTSFwiKSxcblx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6IEJ1dHRvblR5cGUuRW1waGFzaXplZFxuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95QmVnaW5CdXR0b24oKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c0hpZ2hlc3RQcmlvcml0eSA9IGZuR2V0SGlnaGVzdE1lc3NhZ2VQcmlvcml0eShvTWVzc2FnZVZpZXcuZ2V0SXRlbXMoKSk7XG5cdFx0XHRcdFx0c0hpZ2hlc3RQcmlvcml0eVRleHQgPSBnZXRUcmFuc2xhdGVkVGV4dEZvck1lc3NhZ2VEaWFsb2coc0hpZ2hlc3RQcmlvcml0eSk7XG5cdFx0XHRcdFx0b0RpYWxvZy5zZXRTdGF0ZShzSGlnaGVzdFByaW9yaXR5KTtcblx0XHRcdFx0XHQob0RpYWxvZy5nZXRDdXN0b21IZWFkZXIoKSBhcyBhbnkpLmdldENvbnRlbnRNaWRkbGUoKVswXS5zZXRUZXh0KHNIaWdoZXN0UHJpb3JpdHlUZXh0KTtcblx0XHRcdFx0XHRvTWVzc2FnZVZpZXcubmF2aWdhdGVCYWNrKCk7XG5cdFx0XHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0XHRcdFx0aWYgKGJPbmx5Rm9yVGVzdCkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShvRGlhbG9nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChyZWplY3QpO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKHNob3dNZXNzYWdlQm94KSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG5cdFx0XHRjb25zdCBvTWVzc2FnZSA9IGFUcmFuc2l0aW9uTWVzc2FnZXNbMF07XG5cdFx0XHRpZiAob01lc3NhZ2UudGVjaG5pY2FsRGV0YWlscyAmJiBhTWVzc2FnZUxpc3QuaW5kZXhPZihvTWVzc2FnZS50ZWNobmljYWxEZXRhaWxzLm9yaWdpbmFsTWVzc2FnZS5tZXNzYWdlKSA9PT0gLTEpIHtcblx0XHRcdFx0YU1lc3NhZ2VMaXN0LnB1c2gob01lc3NhZ2UudGVjaG5pY2FsRGV0YWlscy5vcmlnaW5hbE1lc3NhZ2UubWVzc2FnZSk7XG5cdFx0XHRcdGxldCBmb3JtYXR0ZWRUZXh0U3RyaW5nID0gXCI8aHRtbD48Ym9keT5cIjtcblx0XHRcdFx0Y29uc3QgcmV0cnlBZnRlck1lc3NhZ2UgPSBnZXRSZXRyeUFmdGVyTWVzc2FnZShvTWVzc2FnZSwgdHJ1ZSk7XG5cdFx0XHRcdGlmIChyZXRyeUFmdGVyTWVzc2FnZSkge1xuXHRcdFx0XHRcdGZvcm1hdHRlZFRleHRTdHJpbmcgPSBgPGg2PiR7cmV0cnlBZnRlck1lc3NhZ2V9PC9oNj48YnI+YDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoc2hvd01lc3NhZ2VQYXJhbWV0ZXJzICYmIHNob3dNZXNzYWdlUGFyYW1ldGVycy5mbkdldE1lc3NhZ2VTdWJ0aXRsZSkge1xuXHRcdFx0XHRcdHNob3dNZXNzYWdlUGFyYW1ldGVycy5mbkdldE1lc3NhZ2VTdWJ0aXRsZShvTWVzc2FnZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG9NZXNzYWdlLmdldENvZGUoKSAhPT0gXCI1MDNcIiAmJiBvTWVzc2FnZS5nZXRBZGRpdGlvbmFsVGV4dCgpICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRmb3JtYXR0ZWRUZXh0U3RyaW5nID0gYCR7Zm9ybWF0dGVkVGV4dFN0cmluZyArIG9NZXNzYWdlLmdldEFkZGl0aW9uYWxUZXh0KCl9OiAke29NZXNzYWdlLmdldE1lc3NhZ2UoKX08L2h0bWw+PC9ib2R5PmA7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Zm9ybWF0dGVkVGV4dFN0cmluZyA9IGAke2Zvcm1hdHRlZFRleHRTdHJpbmcgKyBvTWVzc2FnZS5nZXRNZXNzYWdlKCl9PC9odG1sPjwvYm9keT5gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGZvcm1hdHRlZFRleHQ6IGFueSA9IG5ldyBGb3JtYXR0ZWRUZXh0KHtcblx0XHRcdFx0XHRodG1sVGV4dDogZm9ybWF0dGVkVGV4dFN0cmluZ1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0TWVzc2FnZUJveC5lcnJvcihmb3JtYXR0ZWRUZXh0LCB7XG5cdFx0XHRcdFx0b25DbG9zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0YU1lc3NhZ2VMaXN0ID0gW107XG5cdFx0XHRcdFx0XHRpZiAoYlNob3dCb3VuZFRyYW5zaXRpb24pIHtcblx0XHRcdFx0XHRcdFx0cmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuXHR9XG59XG5mdW5jdGlvbiBnZXRUcmFuc2xhdGVkVGV4dEZvck1lc3NhZ2VEaWFsb2coc0hpZ2hlc3RQcmlvcml0eTogYW55KSB7XG5cdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdHN3aXRjaCAoc0hpZ2hlc3RQcmlvcml0eSkge1xuXHRcdGNhc2UgXCJFcnJvclwiOlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19DT01NT05fU0FQRkVfRVJST1JfTUVTU0FHRVNfUEFHRV9USVRMRV9FUlJPUlwiKTtcblx0XHRjYXNlIFwiSW5mb3JtYXRpb25cIjpcblx0XHRcdHJldHVybiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX0lORk9cIik7XG5cdFx0Y2FzZSBcIlN1Y2Nlc3NcIjpcblx0XHRcdHJldHVybiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX1NVQ0NFU1NcIik7XG5cdFx0Y2FzZSBcIldhcm5pbmdcIjpcblx0XHRcdHJldHVybiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX1dBUk5JTkdcIik7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFXCIpO1xuXHR9XG59XG5mdW5jdGlvbiByZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCkge1xuXHRyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoZmFsc2UpO1xufVxuZnVuY3Rpb24gcmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoc1BhdGhUb0JlUmVtb3ZlZD86IHN0cmluZykge1xuXHRyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXModHJ1ZSwgc1BhdGhUb0JlUmVtb3ZlZCk7XG59XG5cbmZ1bmN0aW9uIGdldE1lc3NhZ2VzRnJvbU1lc3NhZ2VNb2RlbChvTWVzc2FnZU1vZGVsOiBhbnksIHNQYXRoVG9CZVJlbW92ZWQ/OiBzdHJpbmcpIHtcblx0aWYgKHNQYXRoVG9CZVJlbW92ZWQgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBvTWVzc2FnZU1vZGVsLmdldE9iamVjdChcIi9cIik7XG5cdH1cblx0Y29uc3QgbGlzdEJpbmRpbmcgPSBvTWVzc2FnZU1vZGVsLmJpbmRMaXN0KFwiL1wiKTtcblxuXHRsaXN0QmluZGluZy5maWx0ZXIoXG5cdFx0bmV3IEZpbHRlcih7XG5cdFx0XHRwYXRoOiBcInRhcmdldFwiLFxuXHRcdFx0b3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yLlN0YXJ0c1dpdGgsXG5cdFx0XHR2YWx1ZTE6IHNQYXRoVG9CZVJlbW92ZWRcblx0XHR9KVxuXHQpO1xuXG5cdHJldHVybiBsaXN0QmluZGluZy5nZXRDdXJyZW50Q29udGV4dHMoKS5tYXAoZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRyZXR1cm4gb0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdH0pO1xufVxuZnVuY3Rpb24gZ2V0TWVzc2FnZXMoYkJvdW5kTWVzc2FnZXM6IGJvb2xlYW4gPSBmYWxzZSwgYlRyYW5zaXRpb25Pbmx5OiBib29sZWFuID0gZmFsc2UsIHNQYXRoVG9CZVJlbW92ZWQ/OiBzdHJpbmcpIHtcblx0bGV0IGk7XG5cdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKSxcblx0XHRvTWVzc2FnZU1vZGVsID0gb01lc3NhZ2VNYW5hZ2VyLmdldE1lc3NhZ2VNb2RlbCgpLFxuXHRcdG9SZXNvdXJjZUJ1bmRsZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIiksXG5cdFx0YVRyYW5zaXRpb25NZXNzYWdlcyA9IFtdO1xuXHRsZXQgYU1lc3NhZ2VzOiBhbnlbXSA9IFtdO1xuXHRpZiAoYkJvdW5kTWVzc2FnZXMgJiYgYlRyYW5zaXRpb25Pbmx5ICYmIHNQYXRoVG9CZVJlbW92ZWQpIHtcblx0XHRhTWVzc2FnZXMgPSBnZXRNZXNzYWdlc0Zyb21NZXNzYWdlTW9kZWwob01lc3NhZ2VNb2RlbCwgc1BhdGhUb0JlUmVtb3ZlZCk7XG5cdH0gZWxzZSB7XG5cdFx0YU1lc3NhZ2VzID0gb01lc3NhZ2VNb2RlbC5nZXRPYmplY3QoXCIvXCIpO1xuXHR9XG5cdGZvciAoaSA9IDA7IGkgPCBhTWVzc2FnZXMubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAoXG5cdFx0XHQoIWJUcmFuc2l0aW9uT25seSB8fCBhTWVzc2FnZXNbaV0ucGVyc2lzdGVudCkgJiZcblx0XHRcdCgoYkJvdW5kTWVzc2FnZXMgJiYgYU1lc3NhZ2VzW2ldLnRhcmdldCAhPT0gXCJcIikgfHwgKCFiQm91bmRNZXNzYWdlcyAmJiAoIWFNZXNzYWdlc1tpXS50YXJnZXQgfHwgYU1lc3NhZ2VzW2ldLnRhcmdldCA9PT0gXCJcIikpKVxuXHRcdCkge1xuXHRcdFx0YVRyYW5zaXRpb25NZXNzYWdlcy5wdXNoKGFNZXNzYWdlc1tpXSk7XG5cdFx0fVxuXHR9XG5cblx0Zm9yIChpID0gMDsgaSA8IGFUcmFuc2l0aW9uTWVzc2FnZXMubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAoXG5cdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldLmNvZGUgPT09IFwiNTAzXCIgJiZcblx0XHRcdGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0ubWVzc2FnZSAhPT0gXCJcIiAmJlxuXHRcdFx0YVRyYW5zaXRpb25NZXNzYWdlc1tpXS5tZXNzYWdlLmluZGV4T2Yob1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0JBQ0tFTkRfUFJFRklYXCIpKSA9PT0gLTFcblx0XHQpIHtcblx0XHRcdGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0ubWVzc2FnZSA9IGBcXG4ke29SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFXzUwM19CQUNLRU5EX1BSRUZJWFwiKX0ke1xuXHRcdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldLm1lc3NhZ2Vcblx0XHRcdH1gO1xuXHRcdH1cblx0fVxuXHQvL0ZpbHRlcmluZyBtZXNzYWdlcyBhZ2FpbiBoZXJlIHRvIGF2b2lkIHNob3dpbmcgcHVyZSB0ZWNobmljYWwgbWVzc2FnZXMgcmFpc2VkIGJ5IHRoZSBtb2RlbFxuXHRjb25zdCBiYWNrZW5kTWVzc2FnZXM6IGFueSA9IFtdO1xuXHRmb3IgKGkgPSAwOyBpIDwgYVRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChcblx0XHRcdChhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldLnRlY2huaWNhbERldGFpbHMgJiZcblx0XHRcdFx0KChhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldLnRlY2huaWNhbERldGFpbHMub3JpZ2luYWxNZXNzYWdlICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldLnRlY2huaWNhbERldGFpbHMub3JpZ2luYWxNZXNzYWdlICE9PSBudWxsKSB8fFxuXHRcdFx0XHRcdChhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldLnRlY2huaWNhbERldGFpbHMuaHR0cFN0YXR1cyAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldLnRlY2huaWNhbERldGFpbHMuaHR0cFN0YXR1cyAhPT0gbnVsbCkpKSB8fFxuXHRcdFx0YVRyYW5zaXRpb25NZXNzYWdlc1tpXS5jb2RlXG5cdFx0KSB7XG5cdFx0XHRiYWNrZW5kTWVzc2FnZXMucHVzaChhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGJhY2tlbmRNZXNzYWdlcztcbn1cbmZ1bmN0aW9uIHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyhiQm91bmRNZXNzYWdlczogYW55LCBzUGF0aFRvQmVSZW1vdmVkPzogc3RyaW5nKSB7XG5cdGNvbnN0IGFNZXNzYWdlc1RvQmVEZWxldGVkID0gZ2V0TWVzc2FnZXMoYkJvdW5kTWVzc2FnZXMsIHRydWUsIHNQYXRoVG9CZVJlbW92ZWQpO1xuXG5cdGlmIChhTWVzc2FnZXNUb0JlRGVsZXRlZC5sZW5ndGggPiAwKSB7XG5cdFx0Q29yZS5nZXRNZXNzYWdlTWFuYWdlcigpLnJlbW92ZU1lc3NhZ2VzKGFNZXNzYWdlc1RvQmVEZWxldGVkKTtcblx0fVxufVxuLy9UT0RPOiBUaGlzIG11c3QgYmUgbW92ZWQgb3V0IG9mIG1lc3NhZ2UgaGFuZGxpbmdcbmZ1bmN0aW9uIHNldE1lc3NhZ2VTdWJ0aXRsZShvVGFibGU6IGFueSwgYUNvbnRleHRzOiBhbnlbXSwgbWVzc2FnZTogYW55KSB7XG5cdGNvbnN0IHN1YnRpdGxlQ29sdW1uID0gb1RhYmxlLmdldFBhcmVudCgpLmdldElkZW50aWZpZXJDb2x1bW4oKTtcblx0Y29uc3QgZXJyb3JDb250ZXh0ID0gYUNvbnRleHRzLmZpbmQoZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRyZXR1cm4gbWVzc2FnZS5nZXRUYXJnZXQoKS5pbmRleE9mKG9Db250ZXh0LmdldFBhdGgoKSkgIT09IC0xO1xuXHR9KTtcblx0bWVzc2FnZS5hZGRpdGlvbmFsVGV4dCA9IGVycm9yQ29udGV4dCA/IGVycm9yQ29udGV4dC5nZXRPYmplY3QoKVtzdWJ0aXRsZUNvbHVtbl0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU3RhdGljIGZ1bmN0aW9ucyBmb3IgRmlvcmkgTWVzc2FnZSBIYW5kbGluZ1xuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBhbGlhcyBzYXAuZmUuY29yZS5hY3Rpb25zLm1lc3NhZ2VIYW5kbGluZ1xuICogQHByaXZhdGVcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41Ni4wXG4gKi9cbmNvbnN0IG1lc3NhZ2VIYW5kbGluZzogbWVzc2FnZUhhbmRsaW5nVHlwZSA9IHtcblx0Z2V0TWVzc2FnZXM6IGdldE1lc3NhZ2VzLFxuXHRzaG93VW5ib3VuZE1lc3NhZ2VzOiBzaG93VW5ib3VuZE1lc3NhZ2VzLFxuXHRyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzOiByZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzLFxuXHRyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlczogcmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMsXG5cdG1vZGlmeUVUYWdNZXNzYWdlc09ubHk6IGZuTW9kaWZ5RVRhZ01lc3NhZ2VzT25seSxcblx0Z2V0UmV0cnlBZnRlck1lc3NhZ2U6IGdldFJldHJ5QWZ0ZXJNZXNzYWdlLFxuXHRwcmVwYXJlTWVzc2FnZVZpZXdGb3JEaWFsb2c6IHByZXBhcmVNZXNzYWdlVmlld0ZvckRpYWxvZyxcblx0c2V0TWVzc2FnZVN1YnRpdGxlOiBzZXRNZXNzYWdlU3VidGl0bGVcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1lc3NhZ2VIYW5kbGluZztcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7OztFQW9CQSxJQUFNQSxXQUFXLEdBQUdDLE9BQU8sQ0FBQ0QsV0FBNUI7RUFDQSxJQUFJRSxZQUFtQixHQUFHLEVBQTFCO0VBQ0EsSUFBSUMsZ0JBQXVCLEdBQUcsRUFBOUI7RUFDQSxJQUFJQyxpQkFBd0IsR0FBRyxFQUEvQjtFQUNB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
|
|
1216
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNZXNzYWdlVHlwZSIsIkNvcmVMaWIiLCJhTWVzc2FnZUxpc3QiLCJhTWVzc2FnZURhdGFMaXN0IiwiYVJlc29sdmVGdW5jdGlvbnMiLCJvRGlhbG9nIiwib0JhY2tCdXR0b24iLCJvTWVzc2FnZVZpZXciLCJmbkZvcm1hdFRlY2huaWNhbERldGFpbHMiLCJzUHJldmlvdXNHcm91cE5hbWUiLCJpbnNlcnREZXRhaWwiLCJvUHJvcGVydHkiLCJwcm9wZXJ0eSIsInN1YnN0ciIsIk1hdGgiLCJtYXgiLCJsYXN0SW5kZXhPZiIsImluc2VydEdyb3VwTmFtZSIsInNIVE1MIiwiZ3JvdXBOYW1lIiwiZ2V0UGF0aHMiLCJzVEQiLCJmb3JFYWNoIiwiZm5Gb3JtYXREZXNjcmlwdGlvbiIsImZuR2V0SGlnaGVzdE1lc3NhZ2VQcmlvcml0eSIsImFNZXNzYWdlcyIsInNNZXNzYWdlUHJpb3JpdHkiLCJOb25lIiwiaUxlbmd0aCIsImxlbmd0aCIsIm9NZXNzYWdlQ291bnQiLCJFcnJvciIsIldhcm5pbmciLCJTdWNjZXNzIiwiSW5mb3JtYXRpb24iLCJpIiwiZ2V0VHlwZSIsImZuTW9kaWZ5RVRhZ01lc3NhZ2VzT25seSIsIm9NZXNzYWdlTWFuYWdlciIsIm9SZXNvdXJjZUJ1bmRsZSIsImNvbmN1cnJlbnRFZGl0RmxhZyIsImdldE1lc3NhZ2VNb2RlbCIsImdldE9iamVjdCIsImJNZXNzYWdlc01vZGlmaWVkIiwic0V0YWdNZXNzYWdlIiwib01lc3NhZ2UiLCJvVGVjaG5pY2FsRGV0YWlscyIsImdldFRlY2huaWNhbERldGFpbHMiLCJodHRwU3RhdHVzIiwiaXNDb25jdXJyZW50TW9kaWZpY2F0aW9uIiwiZ2V0VGV4dCIsInJlbW92ZU1lc3NhZ2VzIiwic2V0TWVzc2FnZSIsInRhcmdldCIsImFkZE1lc3NhZ2VzIiwiZGlhbG9nQ2xvc2VIYW5kbGVyIiwiY2xvc2UiLCJzZXRWaXNpYmxlIiwib01lc3NhZ2VEaWFsb2dNb2RlbCIsImdldE1vZGVsIiwic2V0RGF0YSIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJnZXRSZXRyeUFmdGVyTWVzc2FnZSIsImJNZXNzYWdlRGlhbG9nIiwiZE5vdyIsIkRhdGUiLCJDb3JlIiwiZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlIiwic1JldHJ5QWZ0ZXJNZXNzYWdlIiwicmV0cnlBZnRlciIsImRSZXRyeUFmdGVyIiwib0RhdGVGb3JtYXQiLCJnZXRGdWxsWWVhciIsIkRhdGVGb3JtYXQiLCJnZXREYXRlVGltZUluc3RhbmNlIiwicGF0dGVybiIsImZvcm1hdCIsImdldE1vbnRoIiwiZ2V0RGF0ZSIsInByZXBhcmVNZXNzYWdlVmlld0ZvckRpYWxvZyIsImJTdHJpY3RIYW5kbGluZ0Zsb3ciLCJtdWx0aTQxMiIsIm9NZXNzYWdlVGVtcGxhdGUiLCJNZXNzYWdlSXRlbSIsInVuZGVmaW5lZCIsImNvdW50ZXIiLCJwYXRoIiwidGl0bGUiLCJzdWJ0aXRsZSIsImxvbmd0ZXh0VXJsIiwidHlwZSIsImRlc2NyaXB0aW9uIiwibWFya3VwRGVzY3JpcHRpb24iLCJNZXNzYWdlVmlldyIsInNob3dEZXRhaWxzUGFnZUhlYWRlciIsIml0ZW1TZWxlY3QiLCJpdGVtcyIsInRlbXBsYXRlIiwic2V0R3JvdXBJdGVtcyIsIkJ1dHRvbiIsImljb24iLCJJY29uUG9vbCIsImdldEljb25VUkkiLCJ2aXNpYmxlIiwicHJlc3MiLCJuYXZpZ2F0ZUJhY2siLCJzZXRNb2RlbCIsInNob3dVbmJvdW5kTWVzc2FnZXMiLCJhQ3VzdG9tTWVzc2FnZXMiLCJvQ29udGV4dCIsImJTaG93Qm91bmRUcmFuc2l0aW9uIiwiY29udHJvbCIsInNBY3Rpb25OYW1lIiwiYk9ubHlGb3JUZXN0Iiwib25CZWZvcmVTaG93TWVzc2FnZSIsInZpZXdUeXBlIiwiYVRyYW5zaXRpb25NZXNzYWdlcyIsImdldE1lc3NhZ2VzIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJzSGlnaGVzdFByaW9yaXR5Iiwic0hpZ2hlc3RQcmlvcml0eVRleHQiLCJhRmlsdGVycyIsIkZpbHRlciIsIm9wZXJhdG9yIiwiRmlsdGVyT3BlcmF0b3IiLCJORSIsInZhbHVlMSIsInNob3dNZXNzYWdlRGlhbG9nIiwic2hvd01lc3NhZ2VCb3giLCJjb25jYXQiLCJwdXNoIiwiRVEiLCJmbkNoZWNrQ29udHJvbElkSW5EaWFsb2ciLCJhQ29udHJvbElkcyIsImluZGV4IiwiSW5maW5pdHkiLCJvQ29udHJvbCIsImJ5SWQiLCJlcnJvckZpZWxkQ29udHJvbCIsImZpZWxkUmFua2luRGlhbG9nIiwiRGlhbG9nIiwiZ2V0UGFyZW50IiwiZmluZEVsZW1lbnRzIiwiaW5kZXhPZiIsImZvY3VzIiwidGVzdCIsImNhc2VTZW5zaXRpdmUiLCJtZXNzYWdlQ29kZSIsImNvZGUiLCJNZXNzYWdlIiwibWVzc2FnZSIsInRleHQiLCJwZXJzaXN0ZW50IiwiSlNPTk1vZGVsIiwiYkhhc0V0YWdNZXNzYWdlIiwibW9kaWZ5RVRhZ01lc3NhZ2VzT25seSIsImdldENvZGUiLCJzaG93TWVzc2FnZVBhcmFtZXRlcnMiLCJhTW9kZWxEYXRhQXJyYXkiLCJvTGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsImFDdXJyZW50Q29udGV4dHMiLCJnZXRDdXJyZW50Q29udGV4dHMiLCJjdXJyZW50Q29udGV4dCIsImV4aXN0aW5nTWVzc2FnZXMiLCJBcnJheSIsImlzQXJyYXkiLCJnZXREYXRhIiwib1VuaXF1ZU9iaiIsImZpbHRlciIsIm9iaiIsImlkIiwiZmlsdGVyZWRNZXNzYWdlcyIsIlByb21pc2UiLCJyZXNvbHZlIiwiTWVzc2FnZVRvYXN0Iiwic2hvdyIsIm1lc3NhZ2VIYW5kbGluZyIsInVwZGF0ZU1lc3NhZ2VPYmplY3RHcm91cE5hbWUiLCJyZWplY3QiLCJ0aGVuIiwiZm5HZXRNZXNzYWdlU3VidGl0bGUiLCJvTWVzc2FnZU9iamVjdCIsIm9Tb3J0ZXIiLCJTb3J0ZXIiLCJvYmoxIiwib2JqMiIsInJhbmtBIiwiZ2V0TWVzc2FnZVJhbmsiLCJyYW5rQiIsImdldEJpbmRpbmciLCJzb3J0IiwiaXNPcGVuIiwicmVzaXphYmxlIiwiZW5kQnV0dG9uIiwiY3VzdG9tSGVhZGVyIiwiQmFyIiwiY29udGVudE1pZGRsZSIsIlRleHQiLCJjb250ZW50TGVmdCIsImNvbnRlbnRXaWR0aCIsImNvbnRlbnRIZWlnaHQiLCJ2ZXJ0aWNhbFNjcm9sbGluZyIsImFmdGVyQ2xvc2UiLCJjYWxsIiwicmVtb3ZlQWxsQ29udGVudCIsImFkZENvbnRlbnQiLCJzYXAiLCJ1aSIsInJlcXVpcmUiLCJCdXR0b25UeXBlIiwic2V0QmVnaW5CdXR0b24iLCJoYXNQZW5kaW5nQ2hhbmdlcyIsInJlc2V0Q2hhbmdlcyIsInJlZnJlc2giLCJFbXBoYXNpemVkIiwiZGVzdHJveUJlZ2luQnV0dG9uIiwiZ2V0SXRlbXMiLCJnZXRUcmFuc2xhdGVkVGV4dEZvck1lc3NhZ2VEaWFsb2ciLCJzZXRTdGF0ZSIsImdldEN1c3RvbUhlYWRlciIsImdldENvbnRlbnRNaWRkbGUiLCJzZXRUZXh0Iiwib3BlbiIsImNhdGNoIiwidGVjaG5pY2FsRGV0YWlscyIsIm9yaWdpbmFsTWVzc2FnZSIsImZvcm1hdHRlZFRleHRTdHJpbmciLCJyZXRyeUFmdGVyTWVzc2FnZSIsImdldEFkZGl0aW9uYWxUZXh0IiwiZ2V0TWVzc2FnZSIsImZvcm1hdHRlZFRleHQiLCJGb3JtYXR0ZWRUZXh0IiwiaHRtbFRleHQiLCJNZXNzYWdlQm94IiwiZXJyb3IiLCJvbkNsb3NlIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJhTW9kZWxEYXRhIiwic2V0R3JvdXBOYW1lTFJUYWJsZSIsInNldEdyb3VwTmFtZU9QRGlzcGxheU1vZGUiLCJnZXRMYXN0QWN0aW9uVGV4dEFuZEFjdGlvbk5hbWUiLCJvRWxlbSIsIm9Sb3dCaW5kaW5nIiwiZ2V0Um93QmluZGluZyIsInNFbGVtZUJpbmRpbmdQYXRoIiwiZ2V0UGF0aCIsImFsbFJvd0NvbnRleHRzIiwiZ2V0Q29udGV4dHMiLCJyb3dDb250ZXh0IiwiaW5jbHVkZXMiLCJjb250ZXh0UGF0aCIsImlkZW50aWZpZXJDb2x1bW4iLCJnZXRJZGVudGlmaWVyQ29sdW1uIiwicm93SWRlbnRpZmllciIsImNvbHVtblByb3BlcnR5TmFtZSIsImdldFRhYmxlQ29sUHJvcGVydHkiLCJnZXRUYWJsZUNvbEluZm8iLCJzVGFibGVUYXJnZXRDb2xOYW1lIiwiZ2V0SGVhZGVyIiwib1ZpZXdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJvcExheW91dCIsImdldENvbnRlbnQiLCJiSXNHZW5lcmFsR3JvdXBOYW1lIiwiZ2V0VmlzaWJsZVNlY3Rpb25zRnJvbU9iamVjdFBhZ2VMYXlvdXQiLCJvU2VjdGlvbiIsInN1YlNlY3Rpb25zIiwiZ2V0U3ViU2VjdGlvbnMiLCJvU3ViU2VjdGlvbiIsImlzQSIsInNldFNlY3Rpb25OYW1lSW5Hcm91cCIsImNoaWxkVGFibGVFbGVtZW50Iiwib0VsZW1lbnQiLCJnZXRUYWJsZUNvbHVtbkRhdGFBbmRTZXRTdWJ0aWxlIiwiZm5DYWxsYmFja1NldEdyb3VwTmFtZSIsIm9UYXJnZXRUYWJsZUluZm8iLCJoZWFkZXJOYW1lIiwiZ2V0SGVhZGVyVmlzaWJsZSIsInRhYmxlSGVhZGVyIiwiZ2V0VGl0bGUiLCJzTGFzdEFjdGlvblRleHQiLCJ0b1N0cmluZyIsImFNZXNzYWdlIiwic0dlbmVyYWxHcm91cFRleHQiLCJvVGFibGUiLCJmblNldEdyb3VwTmFtZSIsImdldFRhYmxlQW5kVGFyZ2V0SW5mbyIsInNDb250cm9sSWQiLCJiSXNDcmVhdGlvblJvdyIsIm9UYWJsZVJvd0NvbnRleHQiLCJnZXRDb250cm9sSWRzIiwiZmluZCIsInNJZCIsImlzQ29udHJvbEluVGFibGUiLCJpc0NvbnRyb2xQYXJ0T2ZDcmVhdGlvblJvdyIsInN1YlRpdGxlIiwiZ2V0TWVzc2FnZVN1YnRpdGxlIiwib1RhYmxlUm93QmluZGluZ0NvbnRleHRzIiwib1RhcmdldGVkQ29udHJvbCIsInNNZXNzYWdlU3VidGl0bGUiLCJzUm93U3VidGl0bGVWYWx1ZSIsInNUYWJsZUZpcnN0Q29sUHJvcGVydHkiLCJvQ29sRnJvbVRhYmxlU2V0dGluZ3MiLCJmZXRjaENvbHVtbkluZm8iLCJDb21tb25VdGlscyIsImdldFRyYW5zbGF0ZWRUZXh0IiwibGFiZWwiLCJvVGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0VGV4dEFubm90YXRpb24iLCJnZXRUYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRGb3JUZXh0QW5ub3RhdGlvbiIsInNUYWJsZUZpcnN0Q29sVGV4dEFubm90YXRpb25QYXRoIiwic1RhYmxlRmlyc3RDb2xUZXh0QXJyYW5nZW1lbnQiLCJnZXRWYWx1ZSIsImdldFRhYmxlRmlyc3RDb2xWYWx1ZSIsIm9Db2x1bW5JbmZvIiwiZGV0ZXJtaW5lQ29sdW1uSW5mbyIsInNDb2x1bW5JbmRpY2F0b3IiLCJzQ29sdW1uVmFsdWUiLCJvQmluZGluZ0NvbnRleHQiLCJvTW9kZWwiLCJvTWV0YU1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsInNUZXh0QW5ub3RhdGlvblBhdGgiLCJzVGV4dEFycmFuZ2VtZW50Iiwic0NvZGVWYWx1ZSIsInNUZXh0VmFsdWUiLCJzQ29tcHV0ZWRWYWx1ZSIsInNsaWNlIiwic0VudW1OdW1iZXIiLCJzQ29sTmFtZUZyb21NZXNzYWdlT2JqIiwiZ2V0VGFyZ2V0cyIsInNwbGl0IiwicG9wIiwiZ2V0VGFibGVEZWZpbml0aW9uIiwiY29sdW1ucyIsIm9Db2x1bW4iLCJrZXkiLCJTdHJpbmciLCJhdmFpbGFiaWxpdHkiLCJnZXRJZCIsIm9QYXJlbnRDb250cm9sIiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwic1BhdGhUb0JlUmVtb3ZlZCIsImdldE1lc3NhZ2VzRnJvbU1lc3NhZ2VNb2RlbCIsIm9NZXNzYWdlTW9kZWwiLCJsaXN0QmluZGluZyIsIlN0YXJ0c1dpdGgiLCJtYXAiLCJiQm91bmRNZXNzYWdlcyIsImJUcmFuc2l0aW9uT25seSIsImJhY2tlbmRNZXNzYWdlcyIsImFNZXNzYWdlc1RvQmVEZWxldGVkIiwic2V0TWVzc2FnZVN1YnRpdGxlIiwiYUNvbnRleHRzIiwic3VidGl0bGVDb2x1bW4iLCJlcnJvckNvbnRleHQiLCJhZGRpdGlvbmFsVGV4dCIsIm9PYmplY3RQYWdlTGF5b3V0IiwiZ2V0U2VjdGlvbnMiLCJnZXRWaXNpYmxlIiwiZ2V0Q29udHJvbEZyb21NZXNzYWdlUmVsYXRpbmdUb1N1YlNlY3Rpb24iLCJzdWJTZWN0aW9uIiwiZm5GaWx0ZXJVcG9uSWRzIiwiYSIsImIiLCJvQ29udGV4dFBhdGgiLCJmblJlZ0V4cGVzY2FwZSIsInMiLCJyZXBsYWNlIiwiUmVnRXhwIiwic1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkiLCJvVGFibGVUYXJnZXRDb2wiLCJnZXRDb2x1bW5zIiwiY29sdW1uIiwiZ2V0RGF0YVByb3BlcnR5Iiwib0N1c3RvbUNvbHVtbiIsImdldENvbnRyb2xEZWxlZ2F0ZSIsImdldENvbHVtbnNGb3IiLCJwcm9wZXJ0eUluZm9zIiwibmFtZSIsImFDb2x1bW5zIiwidGFibGVDb2x1bW4iLCJyZWxhdGl2ZVBhdGgiLCJiSXNUYWJsZVRhcmdldENvbFZpc2libGUiLCJzb21lIiwib1RhYmxlQ29sSW5mbyIsIm9JdGVtIiwiY3JlYXRlU2VjdGlvbkdyb3VwTmFtZSIsInNlY3Rpb24iLCJiTXVsdGlwbGVTdWJTZWN0aW9ucyIsImJJc09ycGhhbkVsZW1lbnQiLCJhRWxlbWVudHMiLCJvUGFyZW50RWxlbWVudCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsibWVzc2FnZUhhbmRsaW5nLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IEJhciBmcm9tIFwic2FwL20vQmFyXCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IEZvcm1hdHRlZFRleHQgZnJvbSBcInNhcC9tL0Zvcm1hdHRlZFRleHRcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgTWVzc2FnZUl0ZW0gZnJvbSBcInNhcC9tL01lc3NhZ2VJdGVtXCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBNZXNzYWdlVmlldyBmcm9tIFwic2FwL20vTWVzc2FnZVZpZXdcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBEYXRlRm9ybWF0IGZyb20gXCJzYXAvdWkvY29yZS9mb3JtYXQvRGF0ZUZvcm1hdFwiO1xuaW1wb3J0IEljb25Qb29sIGZyb20gXCJzYXAvdWkvY29yZS9JY29uUG9vbFwiO1xuaW1wb3J0IENvcmVMaWIgZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBUYWJsZSBmcm9tIFwic2FwL3VpL21kYy9UYWJsZVwiO1xuaW1wb3J0IHR5cGUgQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0JpbmRpbmdcIjtcbmltcG9ydCBGaWx0ZXIgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJcIjtcbmltcG9ydCBGaWx0ZXJPcGVyYXRvciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlck9wZXJhdG9yXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgU29ydGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvU29ydGVyXCI7XG5pbXBvcnQgQ29sdW1uIGZyb20gXCJzYXAvdWkvdGFibGUvQ29sdW1uXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlTGF5b3V0IGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlTGF5b3V0XCI7XG5pbXBvcnQgT2JqZWN0UGFnZVNlY3Rpb24gZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VTZWN0aW9uXCI7XG5pbXBvcnQgT2JqZWN0UGFnZVN1YlNlY3Rpb24gZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VTdWJTZWN0aW9uXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcIi4uLy4uL0NvbW1vblV0aWxzXCI7XG5cbmNvbnN0IE1lc3NhZ2VUeXBlID0gQ29yZUxpYi5NZXNzYWdlVHlwZTtcbmxldCBhTWVzc2FnZUxpc3Q6IGFueVtdID0gW107XG5sZXQgYU1lc3NhZ2VEYXRhTGlzdDogYW55W10gPSBbXTtcbmxldCBhUmVzb2x2ZUZ1bmN0aW9uczogYW55W10gPSBbXTtcbmxldCBvRGlhbG9nOiBEaWFsb2c7XG5sZXQgb0JhY2tCdXR0b246IEJ1dHRvbjtcbmxldCBvTWVzc2FnZVZpZXc6IE1lc3NhZ2VWaWV3O1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlV2l0aEhlYWRlciA9IE1lc3NhZ2UgJiB7XG5cdGhlYWRlck5hbWU/OiBzdHJpbmc7XG5cdHRhcmdldD86IHN0cmluZztcblx0YWRkaXRpb25hbFRleHQ/OiBzdHJpbmc7XG59O1xuXG50eXBlIFRhcmdldFRhYmxlSW5mb1R5cGUgPSB7XG5cdG9UYWJsZVJvd0JpbmRpbmdDb250ZXh0czogQ29udGV4dFtdO1xuXHRvVGFibGVSb3dDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHRzVGFibGVUYXJnZXRDb2xOYW1lOiBzdHJpbmcgfCBib29sZWFuO1xuXHRzVGFibGVUYXJnZXRDb2xQcm9wZXJ0eTogc3RyaW5nO1xuXHR0YWJsZUhlYWRlcjogc3RyaW5nO1xufTtcblxudHlwZSBDb2xJbmZvQW5kU3VidGl0bGVUeXBlID0ge1xuXHRvVGFyZ2V0VGFibGVJbmZvOiBUYXJnZXRUYWJsZUluZm9UeXBlO1xuXHRzdWJUaXRsZT86IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIENvbHVtbkluZm9UeXBlID0ge1xuXHRzQ29sdW1uVmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0c0NvbHVtbkluZGljYXRvcjogc3RyaW5nO1xufTtcblxudHlwZSBDb2x1bW5XaXRoTGFiZWxUeXBlID0gQ29sdW1uICYge1xuXHRsYWJlbD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIG1lc3NhZ2VIYW5kbGluZ1R5cGUgPSB7XG5cdGdldE1lc3NhZ2VzOiAoYkJvdW5kTWVzc2FnZXM/OiBhbnksIGJUcmFuc2l0aW9uT25seT86IGFueSkgPT4gYW55W107XG5cdHNob3dVbmJvdW5kTWVzc2FnZXM6IChcblx0XHRhQ3VzdG9tTWVzc2FnZXM/OiBhbnlbXSxcblx0XHRvQ29udGV4dD86IGFueSxcblx0XHRiU2hvd0JvdW5kVHJhbnNpdGlvbj86IGJvb2xlYW4sXG5cdFx0Y29uY3VycmVudEVkaXRGbGFnPzogYm9vbGVhbixcblx0XHRvQ29udHJvbD86IENvbnRyb2wsXG5cdFx0c0FjdGlvbk5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0Yk9ubHlGb3JUZXN0PzogYm9vbGVhbixcblx0XHRvbkJlZm9yZVNob3dNZXNzYWdlPzogKG1lc3NhZ2VzOiBhbnksIHNob3dNZXNzYWdlUGFyYW1ldGVyczogYW55KSA9PiBhbnksXG5cdFx0dmlld1R5cGU/OiBzdHJpbmdcblx0KSA9PiBQcm9taXNlPGFueT47XG5cdHJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXM6ICgpID0+IHZvaWQ7XG5cdG1vZGlmeUVUYWdNZXNzYWdlc09ubHk6IChvTWVzc2FnZU1hbmFnZXI6IGFueSwgb1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZSwgY29uY3VycmVudEVkaXRGbGFnOiBib29sZWFuIHwgdW5kZWZpbmVkKSA9PiBib29sZWFuO1xuXHRyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlczogKHNQYXRoVG9CZVJlbW92ZWQ/OiBzdHJpbmcpID0+IHZvaWQ7XG5cdGdldFJldHJ5QWZ0ZXJNZXNzYWdlOiAob01lc3NhZ2U6IGFueSwgYk1lc3NhZ2VEaWFsb2c/OiBhbnkpID0+IGFueTtcblx0cHJlcGFyZU1lc3NhZ2VWaWV3Rm9yRGlhbG9nOiAob01lc3NhZ2VEaWFsb2dNb2RlbDogSlNPTk1vZGVsLCBiU3RyaWN0SGFuZGxpbmdGbG93OiBib29sZWFuLCBpc011bHRpNDEyPzogYm9vbGVhbikgPT4gYW55O1xuXHRzZXRNZXNzYWdlU3VidGl0bGU6IChvVGFibGU6IFRhYmxlLCBhQ29udGV4dHM6IENvbnRleHRbXSwgbWVzc2FnZTogTWVzc2FnZVdpdGhIZWFkZXIpID0+IHZvaWQ7XG5cdGdldFZpc2libGVTZWN0aW9uc0Zyb21PYmplY3RQYWdlTGF5b3V0OiAob09iamVjdFBhZ2VMYXlvdXQ6IENvbnRyb2wpID0+IGFueTtcblx0Z2V0Q29udHJvbEZyb21NZXNzYWdlUmVsYXRpbmdUb1N1YlNlY3Rpb246IChzdWJTZWN0aW9uOiBPYmplY3RQYWdlU3ViU2VjdGlvbiwgb01lc3NhZ2VPYmplY3Q6IE1lc3NhZ2VXaXRoSGVhZGVyKSA9PiBVSTVFbGVtZW50W107XG5cdGZuRmlsdGVyVXBvbklkczogKGFDb250cm9sSWRzOiBzdHJpbmdbXSwgb0l0ZW06IFVJNUVsZW1lbnQpID0+IGJvb2xlYW47XG5cdGdldFRhYmxlQW5kVGFyZ2V0SW5mbzogKFxuXHRcdG9UYWJsZTogVGFibGUsXG5cdFx0b01lc3NhZ2VPYmplY3Q6IE1lc3NhZ2VXaXRoSGVhZGVyLFxuXHRcdG9FbGVtZW50OiBVSTVFbGVtZW50IHwgdW5kZWZpbmVkLFxuXHRcdG9Sb3dCaW5kaW5nOiBCaW5kaW5nXG5cdCkgPT4gVGFyZ2V0VGFibGVJbmZvVHlwZTtcblx0Y3JlYXRlU2VjdGlvbkdyb3VwTmFtZTogKFxuXHRcdHNlY3Rpb246IE9iamVjdFBhZ2VTZWN0aW9uLFxuXHRcdHN1YlNlY3Rpb246IE9iamVjdFBhZ2VTdWJTZWN0aW9uLFxuXHRcdGJNdWx0aXBsZVN1YlNlY3Rpb25zOiBib29sZWFuLFxuXHRcdG9UYXJnZXRUYWJsZUluZm86IFRhcmdldFRhYmxlSW5mb1R5cGUsXG5cdFx0b1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZVxuXHQpID0+IHN0cmluZztcblx0YklzT3JwaGFuRWxlbWVudDogKG9FbGVtZW50OiBVSTVFbGVtZW50LCBhRWxlbWVudHM6IFVJNUVsZW1lbnRbXSkgPT4gYm9vbGVhbjtcblx0Z2V0TGFzdEFjdGlvblRleHRBbmRBY3Rpb25OYW1lOiAoc0FjdGlvbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gc3RyaW5nO1xuXHRnZXRUYWJsZUNvbHVtbkRhdGFBbmRTZXRTdWJ0aWxlOiAoXG5cdFx0YU1lc3NhZ2U6IE1lc3NhZ2VXaXRoSGVhZGVyLFxuXHRcdG9UYWJsZTogVGFibGUsXG5cdFx0b0VsZW1lbnQ6IFVJNUVsZW1lbnQgfCB1bmRlZmluZWQsXG5cdFx0b1Jvd0JpbmRpbmc6IEJpbmRpbmcsXG5cdFx0c0FjdGlvbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0XHRzZXRTZWN0aW9uTmFtZUluR3JvdXA6IEJvb2xlYW4sXG5cdFx0Zm5DYWxsYmFja1NldEdyb3VwTmFtZTogYW55XG5cdCkgPT4gQ29sSW5mb0FuZFN1YnRpdGxlVHlwZTtcblx0Z2V0VGFibGVDb2xJbmZvOiAob1RhYmxlOiBDb250cm9sLCBzVGFibGVUYXJnZXRDb2xQcm9wZXJ0eTogc3RyaW5nKSA9PiBhbnk7XG5cdGdldFRhYmxlQ29sUHJvcGVydHk6IChvVGFibGU6IENvbnRyb2wsIG9NZXNzYWdlT2JqZWN0OiBNZXNzYWdlV2l0aEhlYWRlciwgb0NvbnRleHRQYXRoPzogYW55KSA9PiBhbnk7XG5cdGdldE1lc3NhZ2VTdWJ0aXRsZTogKFxuXHRcdG1lc3NhZ2U6IE1lc3NhZ2VXaXRoSGVhZGVyLFxuXHRcdG9UYWJsZVJvd0JpbmRpbmdDb250ZXh0czogQ29udGV4dFtdLFxuXHRcdG9UYWJsZVJvd0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQsXG5cdFx0c1RhYmxlVGFyZ2V0Q29sTmFtZTogc3RyaW5nIHwgYm9vbGVhbixcblx0XHRvUmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlLFxuXHRcdG9UYWJsZTogVGFibGUsXG5cdFx0YklzQ3JlYXRpb25Sb3c6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG5cdFx0b1RhcmdldGVkQ29udHJvbD86IENvbnRyb2xcblx0KSA9PiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuXHRkZXRlcm1pbmVDb2x1bW5JbmZvOiAob0NvbEZyb21UYWJsZVNldHRpbmdzOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogUmVzb3VyY2VCdW5kbGUpID0+IENvbHVtbkluZm9UeXBlO1xuXHRmZXRjaENvbHVtbkluZm86IChvTWVzc2FnZTogTWVzc2FnZVdpdGhIZWFkZXIsIG9UYWJsZTogVGFibGUpID0+IENvbHVtbjtcblx0Z2V0VGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0Rm9yVGV4dEFubm90YXRpb246IChcblx0XHRvVGFibGU6IFRhYmxlLFxuXHRcdG9UYWJsZVJvd0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQsXG5cdFx0c1RhYmxlRmlyc3RDb2xQcm9wZXJ0eTogc3RyaW5nXG5cdCkgPT4gQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQ7XG5cdGdldE1lc3NhZ2VSYW5rOiAob2JqOiBNZXNzYWdlV2l0aEhlYWRlcikgPT4gbnVtYmVyO1xuXHRmbkNhbGxiYWNrU2V0R3JvdXBOYW1lOiAoYU1lc3NhZ2U6IE1lc3NhZ2VXaXRoSGVhZGVyLCBzQWN0aW9uTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBiSXNHZW5lcmFsR3JvdXBOYW1lPzogQm9vbGVhbikgPT4gYW55O1xuXHRnZXRUYWJsZUZpcnN0Q29sVmFsdWU6IChcblx0XHRzVGFibGVGaXJzdENvbFByb3BlcnR5OiBzdHJpbmcsXG5cdFx0b1RhYmxlUm93Q29udGV4dDogQ29udGV4dCxcblx0XHRzVGV4dEFubm90YXRpb25QYXRoOiBzdHJpbmcsXG5cdFx0c1RleHRBcnJhbmdlbWVudDogc3RyaW5nXG5cdCkgPT4gc3RyaW5nO1xuXHRzZXRHcm91cE5hbWVPUERpc3BsYXlNb2RlOiAoYU1vZGVsRGF0YTogTWVzc2FnZVdpdGhIZWFkZXIsIHNBY3Rpb25OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsIGNvbnRyb2w6IGFueSkgPT4gdm9pZDtcblx0dXBkYXRlTWVzc2FnZU9iamVjdEdyb3VwTmFtZTogKFxuXHRcdGFNb2RlbERhdGFBcnJheTogTWVzc2FnZVdpdGhIZWFkZXJbXSxcblx0XHRjb250cm9sOiBDb250cm9sIHwgdW5kZWZpbmVkLFxuXHRcdHNBY3Rpb25OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0dmlld1R5cGU6IHN0cmluZyB8IHVuZGVmaW5lZFxuXHQpID0+IHZvaWQ7XG5cdHNldEdyb3VwTmFtZUxSVGFibGU6IChjb250cm9sOiBDb250cm9sIHwgdW5kZWZpbmVkLCBhTW9kZWxEYXRhOiBNZXNzYWdlV2l0aEhlYWRlciwgc0FjdGlvbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcblx0aXNDb250cm9sSW5UYWJsZTogKG9UYWJsZTogVGFibGUsIHNDb250cm9sSWQ6IHN0cmluZykgPT4gVUk1RWxlbWVudFtdIHwgYm9vbGVhbjtcblx0aXNDb250cm9sUGFydE9mQ3JlYXRpb25Sb3c6IChvQ29udHJvbDogVUk1RWxlbWVudCB8IHVuZGVmaW5lZCkgPT4gYm9vbGVhbjtcbn07XG5cbmZ1bmN0aW9uIGZuRm9ybWF0VGVjaG5pY2FsRGV0YWlscygpIHtcblx0bGV0IHNQcmV2aW91c0dyb3VwTmFtZTogc3RyaW5nO1xuXG5cdC8vIEluc2VydCB0ZWNobmljYWwgZGV0YWlsIGlmIGl0IGV4aXN0c1xuXHRmdW5jdGlvbiBpbnNlcnREZXRhaWwob1Byb3BlcnR5OiBhbnkpIHtcblx0XHRyZXR1cm4gb1Byb3BlcnR5LnByb3BlcnR5XG5cdFx0XHQ/IFwiKCAke1wiICtcblx0XHRcdFx0XHRvUHJvcGVydHkucHJvcGVydHkgK1xuXHRcdFx0XHRcdCd9ID8gKFwiPHA+JyArXG5cdFx0XHRcdFx0b1Byb3BlcnR5LnByb3BlcnR5LnN1YnN0cihNYXRoLm1heChvUHJvcGVydHkucHJvcGVydHkubGFzdEluZGV4T2YoXCIvXCIpLCBvUHJvcGVydHkucHJvcGVydHkubGFzdEluZGV4T2YoXCIuXCIpKSArIDEpICtcblx0XHRcdFx0XHQnIDogXCIgKyAnICtcblx0XHRcdFx0XHRcIiR7XCIgK1xuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5wcm9wZXJ0eSArXG5cdFx0XHRcdFx0J30gKyBcIjwvcD5cIikgOiBcIlwiICknXG5cdFx0XHQ6IFwiXCI7XG5cdH1cblx0Ly8gSW5zZXJ0IGdyb3VwbmFtZSBpZiBpdCBleGlzdHNcblx0ZnVuY3Rpb24gaW5zZXJ0R3JvdXBOYW1lKG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0bGV0IHNIVE1MID0gXCJcIjtcblx0XHRpZiAob1Byb3BlcnR5Lmdyb3VwTmFtZSAmJiBvUHJvcGVydHkucHJvcGVydHkgJiYgb1Byb3BlcnR5Lmdyb3VwTmFtZSAhPT0gc1ByZXZpb3VzR3JvdXBOYW1lKSB7XG5cdFx0XHRzSFRNTCArPSBcIiggJHtcIiArIG9Qcm9wZXJ0eS5wcm9wZXJ0eSArICd9ID8gXCI8YnI+PGgzPicgKyBvUHJvcGVydHkuZ3JvdXBOYW1lICsgJzwvaDM+XCIgOiBcIlwiICkgKyAnO1xuXHRcdFx0c1ByZXZpb3VzR3JvdXBOYW1lID0gb1Byb3BlcnR5Lmdyb3VwTmFtZTtcblx0XHR9XG5cdFx0cmV0dXJuIHNIVE1MO1xuXHR9XG5cblx0Ly8gTGlzdCBvZiB0ZWNobmljYWwgZGV0YWlscyB0byBiZSBzaG93blxuXHRmdW5jdGlvbiBnZXRQYXRocygpIHtcblx0XHRjb25zdCBzVEQgPSBcInRlY2huaWNhbERldGFpbHNcIjsgLy8gbmFtZSBvZiBwcm9wZXJ0eSBpbiBtZXNzYWdlIG1vZGVsIGRhdGEgZm9yIHRlY2huaWNhbCBkZXRhaWxzXG5cdFx0cmV0dXJuIFtcblx0XHRcdHsgZ3JvdXBOYW1lOiBcIlwiLCBwcm9wZXJ0eTogYCR7c1REfS9zdGF0dXNgIH0sXG5cdFx0XHR7IGdyb3VwTmFtZTogXCJcIiwgcHJvcGVydHk6IGAke3NURH0vc3RhdHVzVGV4dGAgfSxcblx0XHRcdHsgZ3JvdXBOYW1lOiBcIkFwcGxpY2F0aW9uXCIsIHByb3BlcnR5OiBgJHtzVER9L2Vycm9yL0BTQVBfX2NvbW1vbi5BcHBsaWNhdGlvbi9Db21wb25lbnRJZGAgfSxcblx0XHRcdHsgZ3JvdXBOYW1lOiBcIkFwcGxpY2F0aW9uXCIsIHByb3BlcnR5OiBgJHtzVER9L2Vycm9yL0BTQVBfX2NvbW1vbi5BcHBsaWNhdGlvbi9TZXJ2aWNlSWRgIH0sXG5cdFx0XHR7IGdyb3VwTmFtZTogXCJBcHBsaWNhdGlvblwiLCBwcm9wZXJ0eTogYCR7c1REfS9lcnJvci9AU0FQX19jb21tb24uQXBwbGljYXRpb24vU2VydmljZVJlcG9zaXRvcnlgIH0sXG5cdFx0XHR7IGdyb3VwTmFtZTogXCJBcHBsaWNhdGlvblwiLCBwcm9wZXJ0eTogYCR7c1REfS9lcnJvci9AU0FQX19jb21tb24uQXBwbGljYXRpb24vU2VydmljZVZlcnNpb25gIH0sXG5cdFx0XHR7IGdyb3VwTmFtZTogXCJFcnJvclJlc29sdXRpb25cIiwgcHJvcGVydHk6IGAke3NURH0vZXJyb3IvQFNBUF9fY29tbW9uLkVycm9yUmVzb2x1dGlvbi9BbmFseXNpc2AgfSxcblx0XHRcdHsgZ3JvdXBOYW1lOiBcIkVycm9yUmVzb2x1dGlvblwiLCBwcm9wZXJ0eTogYCR7c1REfS9lcnJvci9AU0FQX19jb21tb24uRXJyb3JSZXNvbHV0aW9uL05vdGVgIH0sXG5cdFx0XHR7IGdyb3VwTmFtZTogXCJFcnJvclJlc29sdXRpb25cIiwgcHJvcGVydHk6IGAke3NURH0vZXJyb3IvQFNBUF9fY29tbW9uLkVycm9yUmVzb2x1dGlvbi9EZXRhaWxlZE5vdGVgIH0sXG5cdFx0XHR7IGdyb3VwTmFtZTogXCJFcnJvclJlc29sdXRpb25cIiwgcHJvcGVydHk6IGAke3NURH0vZXJyb3IvQFNBUF9fY29tbW9uLkV4Y2VwdGlvbkNhdGVnb3J5YCB9LFxuXHRcdFx0eyBncm91cE5hbWU6IFwiRXJyb3JSZXNvbHV0aW9uXCIsIHByb3BlcnR5OiBgJHtzVER9L2Vycm9yL0BTQVBfX2NvbW1vbi5UaW1lU3RhbXBgIH0sXG5cdFx0XHR7IGdyb3VwTmFtZTogXCJFcnJvclJlc29sdXRpb25cIiwgcHJvcGVydHk6IGAke3NURH0vZXJyb3IvQFNBUF9fY29tbW9uLlRyYW5zYWN0aW9uSWRgIH0sXG5cdFx0XHR7IGdyb3VwTmFtZTogXCJNZXNzYWdlc1wiLCBwcm9wZXJ0eTogYCR7c1REfS9lcnJvci9jb2RlYCB9LFxuXHRcdFx0eyBncm91cE5hbWU6IFwiTWVzc2FnZXNcIiwgcHJvcGVydHk6IGAke3NURH0vZXJyb3IvbWVzc2FnZWAgfVxuXHRcdF07XG5cdH1cblxuXHRsZXQgc0hUTUwgPSBcIk9iamVjdC5rZXlzKFwiICsgXCIke3RlY2huaWNhbERldGFpbHN9XCIgKyAnKS5sZW5ndGggPiAwID8gXCI8aDI+VGVjaG5pY2FsIERldGFpbHM8L2gyPlwiIDogXCJcIiAnO1xuXHRnZXRQYXRocygpLmZvckVhY2goZnVuY3Rpb24gKG9Qcm9wZXJ0eTogeyBncm91cE5hbWU6IHN0cmluZzsgcHJvcGVydHk6IHN0cmluZyB9KSB7XG5cdFx0c0hUTUwgPSBgJHtzSFRNTCArIGluc2VydEdyb3VwTmFtZShvUHJvcGVydHkpfSR7aW5zZXJ0RGV0YWlsKG9Qcm9wZXJ0eSl9ICsgYDtcblx0fSk7XG5cdHJldHVybiBzSFRNTDtcbn1cbmZ1bmN0aW9uIGZuRm9ybWF0RGVzY3JpcHRpb24oKSB7XG5cdHJldHVybiBcIigke1wiICsgJ2Rlc2NyaXB0aW9ufSA/IChcIjxoMj5EZXNjcmlwdGlvbjwvaDI+XCIgKyAkeycgKyAnZGVzY3JpcHRpb259KSA6IFwiXCIpJztcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaGlnaGVzdCBwcmlvcml0eSBtZXNzYWdlIHR5cGUoRXJyb3IvV2FybmluZy9TdWNjZXNzL0luZm9ybWF0aW9uKSBmcm9tIHRoZSBhdmFpbGFibGUgbWVzc2FnZXMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBzYXAuZmUuY29yZS5hY3Rpb25zLm1lc3NhZ2VIYW5kbGluZy5mbkdldEhpZ2hlc3RNZXNzYWdlUHJpb3JpdHlcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLm1lc3NhZ2VIYW5kbGluZ1xuICogQHBhcmFtIFthTWVzc2FnZXNdIE1lc3NhZ2VzIGxpc3RcbiAqIEByZXR1cm5zIEhpZ2hlc3QgcHJpb3JpdHkgbWVzc2FnZSBmcm9tIHRoZSBhdmFpbGFibGUgbWVzc2FnZXNcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gZm5HZXRIaWdoZXN0TWVzc2FnZVByaW9yaXR5KGFNZXNzYWdlczogYW55W10pIHtcblx0bGV0IHNNZXNzYWdlUHJpb3JpdHkgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHRjb25zdCBpTGVuZ3RoID0gYU1lc3NhZ2VzLmxlbmd0aDtcblx0Y29uc3Qgb01lc3NhZ2VDb3VudDogYW55ID0geyBFcnJvcjogMCwgV2FybmluZzogMCwgU3VjY2VzczogMCwgSW5mb3JtYXRpb246IDAgfTtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGlMZW5ndGg7IGkrKykge1xuXHRcdCsrb01lc3NhZ2VDb3VudFthTWVzc2FnZXNbaV0uZ2V0VHlwZSgpXTtcblx0fVxuXHRpZiAob01lc3NhZ2VDb3VudFtNZXNzYWdlVHlwZS5FcnJvcl0gPiAwKSB7XG5cdFx0c01lc3NhZ2VQcmlvcml0eSA9IE1lc3NhZ2VUeXBlLkVycm9yO1xuXHR9IGVsc2UgaWYgKG9NZXNzYWdlQ291bnRbTWVzc2FnZVR5cGUuV2FybmluZ10gPiAwKSB7XG5cdFx0c01lc3NhZ2VQcmlvcml0eSA9IE1lc3NhZ2VUeXBlLldhcm5pbmc7XG5cdH0gZWxzZSBpZiAob01lc3NhZ2VDb3VudFtNZXNzYWdlVHlwZS5TdWNjZXNzXSA+IDApIHtcblx0XHRzTWVzc2FnZVByaW9yaXR5ID0gTWVzc2FnZVR5cGUuU3VjY2Vzcztcblx0fSBlbHNlIGlmIChvTWVzc2FnZUNvdW50W01lc3NhZ2VUeXBlLkluZm9ybWF0aW9uXSA+IDApIHtcblx0XHRzTWVzc2FnZVByaW9yaXR5ID0gTWVzc2FnZVR5cGUuSW5mb3JtYXRpb247XG5cdH1cblx0cmV0dXJuIHNNZXNzYWdlUHJpb3JpdHk7XG59XG4vLyBmdW5jdGlvbiB3aGljaCBtb2RpZnkgZS1UYWcgbWVzc2FnZXMgb25seS5cbi8vIHJldHVybnMgOiB0cnVlLCBpZiBhbnkgZS1UYWcgbWVzc2FnZSBpcyBtb2RpZmllZCwgb3RoZXJ3aXNlIGZhbHNlLlxuZnVuY3Rpb24gZm5Nb2RpZnlFVGFnTWVzc2FnZXNPbmx5KG9NZXNzYWdlTWFuYWdlcjogYW55LCBvUmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlLCBjb25jdXJyZW50RWRpdEZsYWc6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcblx0Y29uc3QgYU1lc3NhZ2VzID0gb01lc3NhZ2VNYW5hZ2VyLmdldE1lc3NhZ2VNb2RlbCgpLmdldE9iamVjdChcIi9cIik7XG5cdGxldCBiTWVzc2FnZXNNb2RpZmllZCA9IGZhbHNlO1xuXHRsZXQgc0V0YWdNZXNzYWdlID0gXCJcIjtcblx0YU1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnksIGk6IGFueSkge1xuXHRcdGNvbnN0IG9UZWNobmljYWxEZXRhaWxzID0gb01lc3NhZ2UuZ2V0VGVjaG5pY2FsRGV0YWlscyAmJiBvTWVzc2FnZS5nZXRUZWNobmljYWxEZXRhaWxzKCk7XG5cdFx0aWYgKG9UZWNobmljYWxEZXRhaWxzICYmIG9UZWNobmljYWxEZXRhaWxzLmh0dHBTdGF0dXMgPT09IDQxMikge1xuXHRcdFx0aWYgKG9UZWNobmljYWxEZXRhaWxzLmlzQ29uY3VycmVudE1vZGlmaWNhdGlvbiAmJiBjb25jdXJyZW50RWRpdEZsYWcpIHtcblx0XHRcdFx0c0V0YWdNZXNzYWdlID1cblx0XHRcdFx0XHRzRXRhZ01lc3NhZ2UgfHwgb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0FQUF9DT01QT05FTlRfU0FQRkVfRVRBR19URUNITklDQUxfSVNTVUVTX0NPTkNVUlJFTlRfTU9ESUZJQ0FUSU9OXCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0V0YWdNZXNzYWdlID0gc0V0YWdNZXNzYWdlIHx8IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19BUFBfQ09NUE9ORU5UX1NBUEZFX0VUQUdfVEVDSE5JQ0FMX0lTU1VFU1wiKTtcblx0XHRcdH1cblx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhhTWVzc2FnZXNbaV0pO1xuXHRcdFx0b01lc3NhZ2Uuc2V0TWVzc2FnZShzRXRhZ01lc3NhZ2UpO1xuXHRcdFx0b01lc3NhZ2UudGFyZ2V0ID0gXCJcIjtcblx0XHRcdG9NZXNzYWdlTWFuYWdlci5hZGRNZXNzYWdlcyhvTWVzc2FnZSk7XG5cdFx0XHRiTWVzc2FnZXNNb2RpZmllZCA9IHRydWU7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGJNZXNzYWdlc01vZGlmaWVkO1xufVxuLy8gRGlhbG9nIGNsb3NlIEhhbmRsaW5nXG5mdW5jdGlvbiBkaWFsb2dDbG9zZUhhbmRsZXIoKSB7XG5cdG9EaWFsb2cuY2xvc2UoKTtcblx0b0JhY2tCdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7XG5cdGFNZXNzYWdlTGlzdCA9IFtdO1xuXHRjb25zdCBvTWVzc2FnZURpYWxvZ01vZGVsOiBhbnkgPSBvTWVzc2FnZVZpZXcuZ2V0TW9kZWwoKTtcblx0aWYgKG9NZXNzYWdlRGlhbG9nTW9kZWwpIHtcblx0XHRvTWVzc2FnZURpYWxvZ01vZGVsLnNldERhdGEoe30pO1xuXHR9XG5cdHJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcbn1cbmZ1bmN0aW9uIGdldFJldHJ5QWZ0ZXJNZXNzYWdlKG9NZXNzYWdlOiBhbnksIGJNZXNzYWdlRGlhbG9nPzogYW55KSB7XG5cdGNvbnN0IGROb3cgPSBuZXcgRGF0ZSgpO1xuXHRjb25zdCBvVGVjaG5pY2FsRGV0YWlscyA9IG9NZXNzYWdlLmdldFRlY2huaWNhbERldGFpbHMoKTtcblx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0bGV0IHNSZXRyeUFmdGVyTWVzc2FnZTtcblx0aWYgKG9UZWNobmljYWxEZXRhaWxzICYmIG9UZWNobmljYWxEZXRhaWxzLmh0dHBTdGF0dXMgPT09IDUwMyAmJiBvVGVjaG5pY2FsRGV0YWlscy5yZXRyeUFmdGVyKSB7XG5cdFx0Y29uc3QgZFJldHJ5QWZ0ZXIgPSBvVGVjaG5pY2FsRGV0YWlscy5yZXRyeUFmdGVyO1xuXHRcdGxldCBvRGF0ZUZvcm1hdDtcblx0XHRpZiAoZE5vdy5nZXRGdWxsWWVhcigpICE9PSBkUmV0cnlBZnRlci5nZXRGdWxsWWVhcigpKSB7XG5cdFx0XHQvL2RpZmZlcmVudCB5ZWFyc1xuXHRcdFx0b0RhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2Uoe1xuXHRcdFx0XHRwYXR0ZXJuOiBcIk1NTU0gZGQsIHl5eXkgJ2F0JyBoaDptbSBhXCJcblx0XHRcdH0pO1xuXHRcdFx0c1JldHJ5QWZ0ZXJNZXNzYWdlID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0VSUk9SXCIsIFtvRGF0ZUZvcm1hdC5mb3JtYXQoZFJldHJ5QWZ0ZXIpXSk7XG5cdFx0fSBlbHNlIGlmIChkTm93LmdldEZ1bGxZZWFyKCkgPT0gZFJldHJ5QWZ0ZXIuZ2V0RnVsbFllYXIoKSkge1xuXHRcdFx0Ly9zYW1lIHllYXJcblx0XHRcdGlmIChiTWVzc2FnZURpYWxvZykge1xuXHRcdFx0XHQvL2xlc3MgdGhhbiAyIG1pblxuXHRcdFx0XHRzUmV0cnlBZnRlck1lc3NhZ2UgPSBgJHtvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfVElUTEVcIil9ICR7b1Jlc291cmNlQnVuZGxlLmdldFRleHQoXG5cdFx0XHRcdFx0XCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0RFU0NcIlxuXHRcdFx0XHQpfWA7XG5cdFx0XHR9IGVsc2UgaWYgKGROb3cuZ2V0TW9udGgoKSAhPT0gZFJldHJ5QWZ0ZXIuZ2V0TW9udGgoKSB8fCBkTm93LmdldERhdGUoKSAhPT0gZFJldHJ5QWZ0ZXIuZ2V0RGF0ZSgpKSB7XG5cdFx0XHRcdG9EYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBcIk1NTU0gZGQgJ2F0JyBoaDptbSBhXCJcblx0XHRcdFx0fSk7IC8vZGlmZmVyZW50IG1vbnRocyBvciBkaWZmZXJlbnQgZGF5cyBvZiBzYW1lIG1vbnRoXG5cdFx0XHRcdHNSZXRyeUFmdGVyTWVzc2FnZSA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFXzUwM19FUlJPUlwiLCBbb0RhdGVGb3JtYXQuZm9ybWF0KGRSZXRyeUFmdGVyKV0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly9zYW1lIGRheVxuXHRcdFx0XHRvRGF0ZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZSh7XG5cdFx0XHRcdFx0cGF0dGVybjogXCJoaDptbSBhXCJcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNSZXRyeUFmdGVyTWVzc2FnZSA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFXzUwM19FUlJPUl9EQVlcIiwgW29EYXRlRm9ybWF0LmZvcm1hdChkUmV0cnlBZnRlcildKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAob1RlY2huaWNhbERldGFpbHMgJiYgb1RlY2huaWNhbERldGFpbHMuaHR0cFN0YXR1cyA9PT0gNTAzICYmICFvVGVjaG5pY2FsRGV0YWlscy5yZXRyeUFmdGVyKSB7XG5cdFx0c1JldHJ5QWZ0ZXJNZXNzYWdlID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0VSUk9SX05PX1JFVFJZX0FGVEVSXCIpO1xuXHR9XG5cdHJldHVybiBzUmV0cnlBZnRlck1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVNZXNzYWdlVmlld0ZvckRpYWxvZyhvTWVzc2FnZURpYWxvZ01vZGVsOiBKU09OTW9kZWwsIGJTdHJpY3RIYW5kbGluZ0Zsb3c6IGJvb2xlYW4sIG11bHRpNDEyPzogYm9vbGVhbikge1xuXHRsZXQgb01lc3NhZ2VUZW1wbGF0ZTogTWVzc2FnZUl0ZW07XG5cdGlmICghYlN0cmljdEhhbmRsaW5nRmxvdykge1xuXHRcdG9NZXNzYWdlVGVtcGxhdGUgPSBuZXcgTWVzc2FnZUl0ZW0odW5kZWZpbmVkLCB7XG5cdFx0XHRjb3VudGVyOiB7IHBhdGg6IFwiY291bnRlclwiIH0sXG5cdFx0XHR0aXRsZTogXCJ7bWVzc2FnZX1cIixcblx0XHRcdHN1YnRpdGxlOiBcInthZGRpdGlvbmFsVGV4dH1cIixcblx0XHRcdGxvbmd0ZXh0VXJsOiBcIntkZXNjcmlwdGlvblVybH1cIixcblx0XHRcdHR5cGU6IHsgcGF0aDogXCJ0eXBlXCIgfSxcblx0XHRcdGdyb3VwTmFtZTogXCJ7aGVhZGVyTmFtZX1cIixcblx0XHRcdGRlc2NyaXB0aW9uOlxuXHRcdFx0XHRcIns9ICR7XCIgK1xuXHRcdFx0XHRcImRlc2NyaXB0aW9ufSB8fCAke3RlY2huaWNhbERldGFpbHN9ID8gXCIgK1xuXHRcdFx0XHQnXCI8aHRtbD48Ym9keT5cIiArICcgK1xuXHRcdFx0XHRmbkZvcm1hdERlc2NyaXB0aW9uKCkgK1xuXHRcdFx0XHRcIiArIFwiICtcblx0XHRcdFx0Zm5Gb3JtYXRUZWNobmljYWxEZXRhaWxzKCkgK1xuXHRcdFx0XHQnXCI8L2JvZHk+PC9odG1sPlwiJyArXG5cdFx0XHRcdCcgOiBcIlwiIH0nLFxuXHRcdFx0bWFya3VwRGVzY3JpcHRpb246IHRydWVcblx0XHR9KTtcblx0fSBlbHNlIGlmIChtdWx0aTQxMikge1xuXHRcdG9NZXNzYWdlVGVtcGxhdGUgPSBuZXcgTWVzc2FnZUl0ZW0odW5kZWZpbmVkLCB7XG5cdFx0XHRjb3VudGVyOiB7IHBhdGg6IFwiY291bnRlclwiIH0sXG5cdFx0XHR0aXRsZTogXCJ7bWVzc2FnZX1cIixcblx0XHRcdHN1YnRpdGxlOiBcInthZGRpdGlvbmFsVGV4dH1cIixcblx0XHRcdGxvbmd0ZXh0VXJsOiBcIntkZXNjcmlwdGlvblVybH1cIixcblx0XHRcdHR5cGU6IHsgcGF0aDogXCJ0eXBlXCIgfSxcblx0XHRcdGRlc2NyaXB0aW9uOiBcIntkZXNjcmlwdGlvbn1cIixcblx0XHRcdG1hcmt1cERlc2NyaXB0aW9uOiB0cnVlXG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0b01lc3NhZ2VUZW1wbGF0ZSA9IG5ldyBNZXNzYWdlSXRlbSh7XG5cdFx0XHR0aXRsZTogXCJ7bWVzc2FnZX1cIixcblx0XHRcdHR5cGU6IHsgcGF0aDogXCJ0eXBlXCIgfSxcblx0XHRcdGxvbmd0ZXh0VXJsOiBcIntkZXNjcmlwdGlvblVybH1cIlxuXHRcdH0pO1xuXHR9XG5cdG9NZXNzYWdlVmlldyA9IG5ldyBNZXNzYWdlVmlldyh7XG5cdFx0c2hvd0RldGFpbHNQYWdlSGVhZGVyOiBmYWxzZSxcblx0XHRpdGVtU2VsZWN0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRvQmFja0J1dHRvbi5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdH0sXG5cdFx0aXRlbXM6IHtcblx0XHRcdHBhdGg6IFwiL1wiLFxuXHRcdFx0dGVtcGxhdGU6IG9NZXNzYWdlVGVtcGxhdGVcblx0XHR9XG5cdH0pO1xuXHRvTWVzc2FnZVZpZXcuc2V0R3JvdXBJdGVtcyh0cnVlKTtcblx0b0JhY2tCdXR0b24gPVxuXHRcdG9CYWNrQnV0dG9uIHx8XG5cdFx0bmV3IEJ1dHRvbih7XG5cdFx0XHRpY29uOiBJY29uUG9vbC5nZXRJY29uVVJJKFwibmF2LWJhY2tcIiksXG5cdFx0XHR2aXNpYmxlOiBmYWxzZSxcblx0XHRcdHByZXNzOiBmdW5jdGlvbiAodGhpczogQnV0dG9uKSB7XG5cdFx0XHRcdG9NZXNzYWdlVmlldy5uYXZpZ2F0ZUJhY2soKTtcblx0XHRcdFx0dGhpcy5zZXRWaXNpYmxlKGZhbHNlKTtcblx0XHRcdH1cblx0XHR9KTtcblx0Ly8gVXBkYXRlIHByb3BlciBFVGFnIE1pc21hdGNoIGVycm9yXG5cdG9NZXNzYWdlVmlldy5zZXRNb2RlbChvTWVzc2FnZURpYWxvZ01vZGVsKTtcblx0cmV0dXJuIHtcblx0XHRvTWVzc2FnZVZpZXcsXG5cdFx0b0JhY2tCdXR0b25cblx0fTtcbn1cblxuZnVuY3Rpb24gc2hvd1VuYm91bmRNZXNzYWdlcyhcblx0dGhpczogbWVzc2FnZUhhbmRsaW5nVHlwZSxcblx0YUN1c3RvbU1lc3NhZ2VzPzogYW55W10sXG5cdG9Db250ZXh0PzogYW55LFxuXHRiU2hvd0JvdW5kVHJhbnNpdGlvbj86IGJvb2xlYW4sXG5cdGNvbmN1cnJlbnRFZGl0RmxhZz86IGJvb2xlYW4sXG5cdGNvbnRyb2w/OiBDb250cm9sLFxuXHRzQWN0aW9uTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0Yk9ubHlGb3JUZXN0PzogYm9vbGVhbixcblx0b25CZWZvcmVTaG93TWVzc2FnZT86IChtZXNzYWdlczogYW55LCBzaG93TWVzc2FnZVBhcmFtZXRlcnM6IGFueSkgPT4gYW55LFxuXHR2aWV3VHlwZT86IHN0cmluZ1xuKTogUHJvbWlzZTxhbnk+IHtcblx0bGV0IGFUcmFuc2l0aW9uTWVzc2FnZXMgPSB0aGlzLmdldE1lc3NhZ2VzKCk7XG5cdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0bGV0IHNIaWdoZXN0UHJpb3JpdHk7XG5cdGxldCBzSGlnaGVzdFByaW9yaXR5VGV4dDtcblx0Y29uc3QgYUZpbHRlcnMgPSBbbmV3IEZpbHRlcih7IHBhdGg6IFwicGVyc2lzdGVudFwiLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuTkUsIHZhbHVlMTogZmFsc2UgfSldO1xuXHRsZXQgc2hvd01lc3NhZ2VEaWFsb2c6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZSxcblx0XHRzaG93TWVzc2FnZUJveDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGZhbHNlO1xuXG5cdGlmIChiU2hvd0JvdW5kVHJhbnNpdGlvbikge1xuXHRcdGFUcmFuc2l0aW9uTWVzc2FnZXMgPSBhVHJhbnNpdGlvbk1lc3NhZ2VzLmNvbmNhdChnZXRNZXNzYWdlcyh0cnVlLCB0cnVlKSk7XG5cdFx0Ly8gd2Ugb25seSB3YW50IHRvIHNob3cgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBub3QgYm91bmQgc3RhdGUgbWVzc2FnZXMgaGVuY2UgYWRkIGEgZmlsdGVyIGZvciB0aGUgc2FtZVxuXHRcdGFGaWx0ZXJzLnB1c2gobmV3IEZpbHRlcih7IHBhdGg6IFwicGVyc2lzdGVudFwiLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsIHZhbHVlMTogdHJ1ZSB9KSk7XG5cdFx0Y29uc3QgZm5DaGVja0NvbnRyb2xJZEluRGlhbG9nID0gZnVuY3Rpb24gKGFDb250cm9sSWRzOiBhbnkpIHtcblx0XHRcdGxldCBpbmRleCA9IEluZmluaXR5LFxuXHRcdFx0XHRvQ29udHJvbCA9IENvcmUuYnlJZChhQ29udHJvbElkc1swXSkgYXMgTWFuYWdlZE9iamVjdCB8IG51bGw7XG5cdFx0XHRjb25zdCBlcnJvckZpZWxkQ29udHJvbCA9IENvcmUuYnlJZChhQ29udHJvbElkc1swXSkgYXMgQ29udHJvbDtcblx0XHRcdHdoaWxlIChvQ29udHJvbCkge1xuXHRcdFx0XHRjb25zdCBmaWVsZFJhbmtpbkRpYWxvZyA9XG5cdFx0XHRcdFx0b0NvbnRyb2wgaW5zdGFuY2VvZiBEaWFsb2dcblx0XHRcdFx0XHRcdD8gKGVycm9yRmllbGRDb250cm9sLmdldFBhcmVudCgpIGFzIGFueSkuZmluZEVsZW1lbnRzKHRydWUpLmluZGV4T2YoZXJyb3JGaWVsZENvbnRyb2wpXG5cdFx0XHRcdFx0XHQ6IEluZmluaXR5O1xuXHRcdFx0XHRpZiAob0NvbnRyb2wgaW5zdGFuY2VvZiBEaWFsb2cpIHtcblx0XHRcdFx0XHRpZiAoaW5kZXggPiBmaWVsZFJhbmtpbkRpYWxvZykge1xuXHRcdFx0XHRcdFx0aW5kZXggPSBmaWVsZFJhbmtpbkRpYWxvZztcblx0XHRcdFx0XHRcdC8vIFNldCB0aGUgZm9jdXMgdG8gdGhlIGRpYWxvZydzIGNvbnRyb2xcblx0XHRcdFx0XHRcdGVycm9yRmllbGRDb250cm9sLmZvY3VzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIG1lc3NhZ2VzIHdpdGggdGFyZ2V0IGluc2lkZSBzYXAubS5EaWFsb2cgc2hvdWxkIG5vdCBicmluZyB1cCB0aGUgbWVzc2FnZSBkaWFsb2dcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0b0NvbnRyb2wgPSBvQ29udHJvbC5nZXRQYXJlbnQoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH07XG5cdFx0YUZpbHRlcnMucHVzaChcblx0XHRcdG5ldyBGaWx0ZXIoe1xuXHRcdFx0XHRwYXRoOiBcImNvbnRyb2xJZHNcIixcblx0XHRcdFx0dGVzdDogZm5DaGVja0NvbnRyb2xJZEluRGlhbG9nLFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiB0cnVlXG5cdFx0XHR9KVxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gb25seSB1bmJvdW5kIG1lc3NhZ2VzIGhhdmUgdG8gYmUgc2hvd24gc28gYWRkIGZpbHRlciBhY2NvcmRpbmdseVxuXHRcdGFGaWx0ZXJzLnB1c2gobmV3IEZpbHRlcih7IHBhdGg6IFwidGFyZ2V0XCIsIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5FUSwgdmFsdWUxOiBcIlwiIH0pKTtcblx0fVxuXHRpZiAoYUN1c3RvbU1lc3NhZ2VzICYmIGFDdXN0b21NZXNzYWdlcy5sZW5ndGgpIHtcblx0XHRhQ3VzdG9tTWVzc2FnZXMuZm9yRWFjaChmdW5jdGlvbiAob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0Y29uc3QgbWVzc2FnZUNvZGUgPSBvTWVzc2FnZS5jb2RlID8gb01lc3NhZ2UuY29kZSA6IFwiXCI7XG5cdFx0XHRvTWVzc2FnZU1hbmFnZXIuYWRkTWVzc2FnZXMoXG5cdFx0XHRcdG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRtZXNzYWdlOiBvTWVzc2FnZS50ZXh0LFxuXHRcdFx0XHRcdHR5cGU6IG9NZXNzYWdlLnR5cGUsXG5cdFx0XHRcdFx0dGFyZ2V0OiBcIlwiLFxuXHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0Y29kZTogbWVzc2FnZUNvZGVcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XHQvL1RoZSB0YXJnZXQgYW5kIHBlcnNpc3RlbnQgcHJvcGVydGllcyBvZiB0aGUgbWVzc2FnZSBhcmUgaGFyZGNvZGVkIGFzIFwiXCIgYW5kIHRydWUgYmVjYXVzZSB0aGUgZnVuY3Rpb24gZGVhbHMgd2l0aCBvbmx5IHVuYm91bmQgbWVzc2FnZXMuXG5cdFx0fSk7XG5cdH1cblx0Y29uc3Qgb01lc3NhZ2VEaWFsb2dNb2RlbCA9IChvTWVzc2FnZVZpZXcgJiYgKG9NZXNzYWdlVmlldy5nZXRNb2RlbCgpIGFzIEpTT05Nb2RlbCkpIHx8IG5ldyBKU09OTW9kZWwoKTtcblx0Y29uc3QgYkhhc0V0YWdNZXNzYWdlID0gdGhpcy5tb2RpZnlFVGFnTWVzc2FnZXNPbmx5KG9NZXNzYWdlTWFuYWdlciwgQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSwgY29uY3VycmVudEVkaXRGbGFnKTtcblxuXHRpZiAoYVRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGggPT09IDEgJiYgYVRyYW5zaXRpb25NZXNzYWdlc1swXS5nZXRDb2RlKCkgPT09IFwiNTAzXCIpIHtcblx0XHRzaG93TWVzc2FnZUJveCA9IHRydWU7XG5cdH0gZWxzZSBpZiAoYVRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGggIT09IDApIHtcblx0XHRzaG93TWVzc2FnZURpYWxvZyA9IHRydWU7XG5cdH1cblx0bGV0IHNob3dNZXNzYWdlUGFyYW1ldGVyczogYW55O1xuXHRsZXQgYU1vZGVsRGF0YUFycmF5OiBNZXNzYWdlV2l0aEhlYWRlcltdID0gW107XG5cdGlmIChzaG93TWVzc2FnZURpYWxvZyB8fCAoIXNob3dNZXNzYWdlQm94ICYmICFvbkJlZm9yZVNob3dNZXNzYWdlKSkge1xuXHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9NZXNzYWdlTWFuYWdlci5nZXRNZXNzYWdlTW9kZWwoKS5iaW5kTGlzdChcIi9cIiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFGaWx0ZXJzKSxcblx0XHRcdGFDdXJyZW50Q29udGV4dHMgPSBvTGlzdEJpbmRpbmcuZ2V0Q3VycmVudENvbnRleHRzKCk7XG5cdFx0aWYgKGFDdXJyZW50Q29udGV4dHMgJiYgYUN1cnJlbnRDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IHRydWU7XG5cdFx0XHQvLyBEb24ndCBzaG93IGRpYWxvZyBpbmNhc2UgdGhlcmUgYXJlIG5vIGVycm9ycyB0byBzaG93XG5cblx0XHRcdC8vIGlmIGZhbHNlLCBzaG93IG1lc3NhZ2VzIGluIGRpYWxvZ1xuXHRcdFx0Ly8gQXMgZml0ZXJpbmcgaGFzIGFscmVhZHkgaGFwcGVuZWQgaGVyZSBoZW5jZVxuXHRcdFx0Ly8gdXNpbmcgdGhlIG1lc3NhZ2UgbW9kZWwgYWdhaW4gZm9yIHRoZSBtZXNzYWdlIGRpYWxvZyB2aWV3IGFuZCB0aGVuIGZpbHRlcmluZyBvbiB0aGF0IGJpbmRpbmcgYWdhaW4gaXMgdW5uZWNlc3NhcnkuXG5cdFx0XHQvLyBTbyB3ZSBjcmVhdGUgbmV3IGpzb24gbW9kZWwgdG8gdXNlIGZvciB0aGUgbWVzc2FnZSBkaWFsb2cgdmlldy5cblx0XHRcdGNvbnN0IGFNZXNzYWdlczogYW55W10gPSBbXTtcblx0XHRcdGFDdXJyZW50Q29udGV4dHMuZm9yRWFjaChmdW5jdGlvbiAoY3VycmVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRjb25zdCBvTWVzc2FnZSA9IGN1cnJlbnRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRhTWVzc2FnZXMucHVzaChvTWVzc2FnZSk7XG5cdFx0XHRcdGFNZXNzYWdlRGF0YUxpc3QgPSBhTWVzc2FnZXM7XG5cdFx0XHR9KTtcblx0XHRcdGxldCBleGlzdGluZ01lc3NhZ2VzOiBhbnlbXSA9IFtdO1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkob01lc3NhZ2VEaWFsb2dNb2RlbC5nZXREYXRhKCkpKSB7XG5cdFx0XHRcdGV4aXN0aW5nTWVzc2FnZXMgPSBvTWVzc2FnZURpYWxvZ01vZGVsLmdldERhdGEoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IG9VbmlxdWVPYmo6IGFueSA9IHt9O1xuXG5cdFx0XHRhTW9kZWxEYXRhQXJyYXkgPSBhTWVzc2FnZURhdGFMaXN0LmNvbmNhdChleGlzdGluZ01lc3NhZ2VzKS5maWx0ZXIoZnVuY3Rpb24gKG9iaikge1xuXHRcdFx0XHQvLyByZW1vdmUgZW50cmllcyBoYXZpbmcgZHVwbGljYXRlIG1lc3NhZ2UgaWRzXG5cdFx0XHRcdHJldHVybiAhb1VuaXF1ZU9ialtvYmouaWRdICYmIChvVW5pcXVlT2JqW29iai5pZF0gPSB0cnVlKTtcblx0XHRcdH0pO1xuXHRcdFx0b01lc3NhZ2VEaWFsb2dNb2RlbC5zZXREYXRhKGFNb2RlbERhdGFBcnJheSk7XG5cdFx0fVxuXHR9XG5cdGlmIChvbkJlZm9yZVNob3dNZXNzYWdlKSB7XG5cdFx0c2hvd01lc3NhZ2VQYXJhbWV0ZXJzID0geyBzaG93TWVzc2FnZUJveCwgc2hvd01lc3NhZ2VEaWFsb2cgfTtcblx0XHRzaG93TWVzc2FnZVBhcmFtZXRlcnMgPSBvbkJlZm9yZVNob3dNZXNzYWdlKGFUcmFuc2l0aW9uTWVzc2FnZXMsIHNob3dNZXNzYWdlUGFyYW1ldGVycyk7XG5cdFx0c2hvd01lc3NhZ2VCb3ggPSBzaG93TWVzc2FnZVBhcmFtZXRlcnMuc2hvd01lc3NhZ2VCb3g7XG5cdFx0c2hvd01lc3NhZ2VEaWFsb2cgPSBzaG93TWVzc2FnZVBhcmFtZXRlcnMuc2hvd01lc3NhZ2VEaWFsb2c7XG5cdFx0aWYgKHNob3dNZXNzYWdlRGlhbG9nKSB7XG5cdFx0XHRhTW9kZWxEYXRhQXJyYXkgPSBzaG93TWVzc2FnZVBhcmFtZXRlcnMuZmlsdGVyZWRNZXNzYWdlcyA/IHNob3dNZXNzYWdlUGFyYW1ldGVycy5maWx0ZXJlZE1lc3NhZ2VzIDogYU1vZGVsRGF0YUFycmF5O1xuXHRcdH1cblx0fVxuXHRpZiAoYVRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGggPT09IDAgJiYgIWFDdXN0b21NZXNzYWdlcyAmJiAhYkhhc0V0YWdNZXNzYWdlKSB7XG5cdFx0Ly8gRG9uJ3Qgc2hvdyB0aGUgcG9wdXAgaWYgdGhlcmUgYXJlIG5vIHRyYW5zaWVudCBtZXNzYWdlc1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG5cdH0gZWxzZSBpZiAoYVRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGggPT09IDEgJiYgYVRyYW5zaXRpb25NZXNzYWdlc1swXS5nZXRUeXBlKCkgPT09IE1lc3NhZ2VUeXBlLlN1Y2Nlc3MgJiYgIWFDdXN0b21NZXNzYWdlcykge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuXHRcdFx0TWVzc2FnZVRvYXN0LnNob3coYVRyYW5zaXRpb25NZXNzYWdlc1swXS5tZXNzYWdlKTtcblx0XHRcdGlmIChvTWVzc2FnZURpYWxvZ01vZGVsKSB7XG5cdFx0XHRcdG9NZXNzYWdlRGlhbG9nTW9kZWwuc2V0RGF0YSh7fSk7XG5cdFx0XHR9XG5cdFx0XHRvTWVzc2FnZU1hbmFnZXIucmVtb3ZlTWVzc2FnZXMoYVRyYW5zaXRpb25NZXNzYWdlcyk7XG5cdFx0XHRyZXNvbHZlKCk7XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAoc2hvd01lc3NhZ2VEaWFsb2cpIHtcblx0XHRtZXNzYWdlSGFuZGxpbmcudXBkYXRlTWVzc2FnZU9iamVjdEdyb3VwTmFtZShhTW9kZWxEYXRhQXJyYXksIGNvbnRyb2wsIHNBY3Rpb25OYW1lLCB2aWV3VHlwZSk7XG5cdFx0b01lc3NhZ2VEaWFsb2dNb2RlbC5zZXREYXRhKGFNb2RlbERhdGFBcnJheSk7IC8vIHNldCB0aGUgbWVzc2FnZXMgaGVyZSBzbyB0aGF0IGlmIGFueSBvZiB0aGVtIGFyZSBmaWx0ZXJlZCBmb3IgQVBELCB0aGV5IGFyZSBmaWx0ZXJlZCBoZXJlIGFzIHdlbGwuXG5cdFx0YVJlc29sdmVGdW5jdGlvbnMgPSBhUmVzb2x2ZUZ1bmN0aW9ucyB8fCBbXTtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGFSZXNvbHZlRnVuY3Rpb25zLnB1c2gocmVzb2x2ZSk7XG5cdFx0XHRDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIsIHRydWUpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvUmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlKSB7XG5cdFx0XHRcdFx0Y29uc3QgYlN0cmljdEhhbmRsaW5nRmxvdyA9IGZhbHNlO1xuXHRcdFx0XHRcdGlmIChzaG93TWVzc2FnZVBhcmFtZXRlcnMgJiYgc2hvd01lc3NhZ2VQYXJhbWV0ZXJzLmZuR2V0TWVzc2FnZVN1YnRpdGxlKSB7XG5cdFx0XHRcdFx0XHRvTWVzc2FnZURpYWxvZ01vZGVsLmdldERhdGEoKS5mb3JFYWNoKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHNob3dNZXNzYWdlUGFyYW1ldGVycy5mbkdldE1lc3NhZ2VTdWJ0aXRsZShvTWVzc2FnZSk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBvTWVzc2FnZU9iamVjdCA9IHByZXBhcmVNZXNzYWdlVmlld0ZvckRpYWxvZyhvTWVzc2FnZURpYWxvZ01vZGVsLCBiU3RyaWN0SGFuZGxpbmdGbG93KTtcblx0XHRcdFx0XHRjb25zdCBvU29ydGVyID0gbmV3IFNvcnRlcihcIlwiLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgKG9iajE6IGFueSwgb2JqMjogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCByYW5rQSA9IGdldE1lc3NhZ2VSYW5rKG9iajEpO1xuXHRcdFx0XHRcdFx0Y29uc3QgcmFua0IgPSBnZXRNZXNzYWdlUmFuayhvYmoyKTtcblxuXHRcdFx0XHRcdFx0aWYgKHJhbmtBIDwgcmFua0IpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHJhbmtBID4gcmFua0IpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdChvTWVzc2FnZU9iamVjdC5vTWVzc2FnZVZpZXcuZ2V0QmluZGluZyhcIml0ZW1zXCIpIGFzIE9EYXRhTGlzdEJpbmRpbmcpLnNvcnQob1NvcnRlcik7XG5cblx0XHRcdFx0XHRvRGlhbG9nID1cblx0XHRcdFx0XHRcdG9EaWFsb2cgJiYgb0RpYWxvZy5pc09wZW4oKVxuXHRcdFx0XHRcdFx0XHQ/IG9EaWFsb2dcblx0XHRcdFx0XHRcdFx0OiBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHRcdFx0XHRcdHJlc2l6YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGlhbG9nQ2xvc2VIYW5kbGVyKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYWxzbyByZW1vdmUgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBpZiB3ZSB3ZXJlIHNob3dpbmcgdGhlbVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhhTW9kZWxEYXRhQXJyYXkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0NMT1NFXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdFx0XHRcdGN1c3RvbUhlYWRlcjogbmV3IEJhcih7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRlbnRNaWRkbGU6IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRuZXcgVGV4dCh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFXCIpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGVudExlZnQ6IFtvQmFja0J1dHRvbl1cblx0XHRcdFx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGVudFdpZHRoOiBcIjM3LjVlbVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGVudEhlaWdodDogXCIyMS41ZW1cIixcblx0XHRcdFx0XHRcdFx0XHRcdHZlcnRpY2FsU2Nyb2xsaW5nOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhUmVzb2x2ZUZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFSZXNvbHZlRnVuY3Rpb25zW2ldLmNhbGwoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhUmVzb2x2ZUZ1bmN0aW9ucyA9IFtdO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHQgIH0pO1xuXHRcdFx0XHRcdG9EaWFsb2cucmVtb3ZlQWxsQ29udGVudCgpO1xuXHRcdFx0XHRcdG9EaWFsb2cuYWRkQ29udGVudChvTWVzc2FnZU9iamVjdC5vTWVzc2FnZVZpZXcpO1xuXG5cdFx0XHRcdFx0aWYgKGJIYXNFdGFnTWVzc2FnZSkge1xuXHRcdFx0XHRcdFx0c2FwLnVpLnJlcXVpcmUoW1wic2FwL20vQnV0dG9uVHlwZVwiXSwgZnVuY3Rpb24gKEJ1dHRvblR5cGU6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLnNldEJlZ2luQnV0dG9uKFxuXHRcdFx0XHRcdFx0XHRcdG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGlhbG9nQ2xvc2VIYW5kbGVyKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0LnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX1JFRlJFU0hcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBCdXR0b25UeXBlLkVtcGhhc2l6ZWRcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveUJlZ2luQnV0dG9uKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNIaWdoZXN0UHJpb3JpdHkgPSBmbkdldEhpZ2hlc3RNZXNzYWdlUHJpb3JpdHkob01lc3NhZ2VWaWV3LmdldEl0ZW1zKCkpO1xuXHRcdFx0XHRcdHNIaWdoZXN0UHJpb3JpdHlUZXh0ID0gZ2V0VHJhbnNsYXRlZFRleHRGb3JNZXNzYWdlRGlhbG9nKHNIaWdoZXN0UHJpb3JpdHkpO1xuXHRcdFx0XHRcdG9EaWFsb2cuc2V0U3RhdGUoc0hpZ2hlc3RQcmlvcml0eSk7XG5cdFx0XHRcdFx0KG9EaWFsb2cuZ2V0Q3VzdG9tSGVhZGVyKCkgYXMgYW55KS5nZXRDb250ZW50TWlkZGxlKClbMF0uc2V0VGV4dChzSGlnaGVzdFByaW9yaXR5VGV4dCk7XG5cdFx0XHRcdFx0b01lc3NhZ2VWaWV3Lm5hdmlnYXRlQmFjaygpO1xuXHRcdFx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdFx0XHRcdGlmIChiT25seUZvclRlc3QpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUob0RpYWxvZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2gocmVqZWN0KTtcblx0XHR9KTtcblx0fSBlbHNlIGlmIChzaG93TWVzc2FnZUJveCkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuXHRcdFx0Y29uc3Qgb01lc3NhZ2UgPSBhVHJhbnNpdGlvbk1lc3NhZ2VzWzBdO1xuXHRcdFx0aWYgKG9NZXNzYWdlLnRlY2huaWNhbERldGFpbHMgJiYgYU1lc3NhZ2VMaXN0LmluZGV4T2Yob01lc3NhZ2UudGVjaG5pY2FsRGV0YWlscy5vcmlnaW5hbE1lc3NhZ2UubWVzc2FnZSkgPT09IC0xKSB7XG5cdFx0XHRcdGFNZXNzYWdlTGlzdC5wdXNoKG9NZXNzYWdlLnRlY2huaWNhbERldGFpbHMub3JpZ2luYWxNZXNzYWdlLm1lc3NhZ2UpO1xuXHRcdFx0XHRsZXQgZm9ybWF0dGVkVGV4dFN0cmluZyA9IFwiPGh0bWw+PGJvZHk+XCI7XG5cdFx0XHRcdGNvbnN0IHJldHJ5QWZ0ZXJNZXNzYWdlID0gZ2V0UmV0cnlBZnRlck1lc3NhZ2Uob01lc3NhZ2UsIHRydWUpO1xuXHRcdFx0XHRpZiAocmV0cnlBZnRlck1lc3NhZ2UpIHtcblx0XHRcdFx0XHRmb3JtYXR0ZWRUZXh0U3RyaW5nID0gYDxoNj4ke3JldHJ5QWZ0ZXJNZXNzYWdlfTwvaDY+PGJyPmA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHNob3dNZXNzYWdlUGFyYW1ldGVycyAmJiBzaG93TWVzc2FnZVBhcmFtZXRlcnMuZm5HZXRNZXNzYWdlU3VidGl0bGUpIHtcblx0XHRcdFx0XHRzaG93TWVzc2FnZVBhcmFtZXRlcnMuZm5HZXRNZXNzYWdlU3VidGl0bGUob01lc3NhZ2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChvTWVzc2FnZS5nZXRDb2RlKCkgIT09IFwiNTAzXCIgJiYgb01lc3NhZ2UuZ2V0QWRkaXRpb25hbFRleHQoKSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Zm9ybWF0dGVkVGV4dFN0cmluZyA9IGAke2Zvcm1hdHRlZFRleHRTdHJpbmcgKyBvTWVzc2FnZS5nZXRBZGRpdGlvbmFsVGV4dCgpfTogJHtvTWVzc2FnZS5nZXRNZXNzYWdlKCl9PC9odG1sPjwvYm9keT5gO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZvcm1hdHRlZFRleHRTdHJpbmcgPSBgJHtmb3JtYXR0ZWRUZXh0U3RyaW5nICsgb01lc3NhZ2UuZ2V0TWVzc2FnZSgpfTwvaHRtbD48L2JvZHk+YDtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBmb3JtYXR0ZWRUZXh0OiBhbnkgPSBuZXcgRm9ybWF0dGVkVGV4dCh7XG5cdFx0XHRcdFx0aHRtbFRleHQ6IGZvcm1hdHRlZFRleHRTdHJpbmdcblx0XHRcdFx0fSk7XG5cdFx0XHRcdE1lc3NhZ2VCb3guZXJyb3IoZm9ybWF0dGVkVGV4dCwge1xuXHRcdFx0XHRcdG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGFNZXNzYWdlTGlzdCA9IFtdO1xuXHRcdFx0XHRcdFx0aWYgKGJTaG93Qm91bmRUcmFuc2l0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdHJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0fVxufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZ3JvdXAgbmFtZSBmb3IgYWxsIG1lc3NhZ2VzIGluIGEgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBhTW9kZWxEYXRhQXJyYXkgTWVzc2FnZXMgYXJyYXlcbiAqIEBwYXJhbSBjb250cm9sXG4gKiBAcGFyYW0gc0FjdGlvbk5hbWVcbiAqIEBwYXJhbSB2aWV3VHlwZVxuICovXG5mdW5jdGlvbiB1cGRhdGVNZXNzYWdlT2JqZWN0R3JvdXBOYW1lKFxuXHRhTW9kZWxEYXRhQXJyYXk6IE1lc3NhZ2VXaXRoSGVhZGVyW10sXG5cdGNvbnRyb2w6IENvbnRyb2wgfCB1bmRlZmluZWQsXG5cdHNBY3Rpb25OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdHZpZXdUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWRcbikge1xuXHRhTW9kZWxEYXRhQXJyYXkuZm9yRWFjaCgoYU1vZGVsRGF0YTogTWVzc2FnZVdpdGhIZWFkZXIpID0+IHtcblx0XHRhTW9kZWxEYXRhW1wiaGVhZGVyTmFtZVwiXSA9IFwiXCI7XG5cdFx0aWYgKCFhTW9kZWxEYXRhLnRhcmdldD8ubGVuZ3RoKSB7XG5cdFx0XHQvLyB1bmJvdW5kIHRyYW5zaWl0b24gbWVzc2FnZXNcblx0XHRcdGFNb2RlbERhdGFbXCJoZWFkZXJOYW1lXCJdID0gXCJHZW5lcmFsXCI7XG5cdFx0fSBlbHNlIGlmIChhTW9kZWxEYXRhLnRhcmdldC5sZW5ndGgpIHtcblx0XHRcdC8vIExSIGZsb3dcblx0XHRcdGlmICh2aWV3VHlwZSA9PT0gXCJMaXN0UmVwb3J0XCIpIHtcblx0XHRcdFx0bWVzc2FnZUhhbmRsaW5nLnNldEdyb3VwTmFtZUxSVGFibGUoY29udHJvbCwgYU1vZGVsRGF0YSwgc0FjdGlvbk5hbWUpO1xuXHRcdFx0fSBlbHNlIGlmICh2aWV3VHlwZSA9PT0gXCJPYmplY3RQYWdlXCIpIHtcblx0XHRcdFx0Ly8gT1AgRGlzcGxheSBtb2RlXG5cdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5zZXRHcm91cE5hbWVPUERpc3BsYXlNb2RlKGFNb2RlbERhdGEsIHNBY3Rpb25OYW1lLCBjb250cm9sKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFNb2RlbERhdGFbXCJoZWFkZXJOYW1lXCJdID0gbWVzc2FnZUhhbmRsaW5nLmdldExhc3RBY3Rpb25UZXh0QW5kQWN0aW9uTmFtZShzQWN0aW9uTmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2V0IHRoZSBncm91cCBuYW1lIG9mIE1lc3NhZ2UgT2JqZWN0IGZvciBMUiB0YWJsZS5cbiAqXG4gKiBAcGFyYW0gb0VsZW1cbiAqIEBwYXJhbSBhTW9kZWxEYXRhXG4gKiBAcGFyYW0gc0FjdGlvbk5hbWVcbiAqL1xuZnVuY3Rpb24gc2V0R3JvdXBOYW1lTFJUYWJsZShvRWxlbTogQ29udHJvbCB8IHVuZGVmaW5lZCwgYU1vZGVsRGF0YTogTWVzc2FnZVdpdGhIZWFkZXIsIHNBY3Rpb25OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcblx0Y29uc3Qgb1Jvd0JpbmRpbmcgPSBvRWxlbSAmJiAob0VsZW0gYXMgVGFibGUpLmdldFJvd0JpbmRpbmcoKTtcblx0aWYgKG9Sb3dCaW5kaW5nKSB7XG5cdFx0Y29uc3Qgc0VsZW1lQmluZGluZ1BhdGggPSBgJHsob0VsZW0gYXMgVGFibGUpLmdldFJvd0JpbmRpbmcoKS5nZXRQYXRoKCl9YDtcblx0XHRpZiAoYU1vZGVsRGF0YS50YXJnZXQ/LmluZGV4T2Yoc0VsZW1lQmluZGluZ1BhdGgpID09PSAwKSB7XG5cdFx0XHRjb25zdCBhbGxSb3dDb250ZXh0cyA9ICgob0VsZW0gYXMgVGFibGUpLmdldFJvd0JpbmRpbmcoKSBhcyBPRGF0YUxpc3RCaW5kaW5nKS5nZXRDb250ZXh0cygpO1xuXHRcdFx0YWxsUm93Q29udGV4dHMuZm9yRWFjaCgocm93Q29udGV4dDogQ29udGV4dCkgPT4ge1xuXHRcdFx0XHRpZiAoYU1vZGVsRGF0YS50YXJnZXQ/LmluY2x1ZGVzKHJvd0NvbnRleHQuZ2V0UGF0aCgpKSkge1xuXHRcdFx0XHRcdGNvbnN0IGNvbnRleHRQYXRoID0gYCR7cm93Q29udGV4dC5nZXRQYXRoKCl9L2A7XG5cdFx0XHRcdFx0Y29uc3QgaWRlbnRpZmllckNvbHVtbiA9IChvRWxlbS5nZXRQYXJlbnQoKSBhcyBhbnkpLmdldElkZW50aWZpZXJDb2x1bW4oKTtcblx0XHRcdFx0XHRjb25zdCByb3dJZGVudGlmaWVyID0gaWRlbnRpZmllckNvbHVtbiAmJiByb3dDb250ZXh0LmdldE9iamVjdCgpW2lkZW50aWZpZXJDb2x1bW5dO1xuXHRcdFx0XHRcdGNvbnN0IGNvbHVtblByb3BlcnR5TmFtZSA9IG1lc3NhZ2VIYW5kbGluZy5nZXRUYWJsZUNvbFByb3BlcnR5KG9FbGVtLCBhTW9kZWxEYXRhLCBjb250ZXh0UGF0aCk7XG5cdFx0XHRcdFx0Y29uc3QgeyBzVGFibGVUYXJnZXRDb2xOYW1lIH0gPSBtZXNzYWdlSGFuZGxpbmcuZ2V0VGFibGVDb2xJbmZvKG9FbGVtLCBjb2x1bW5Qcm9wZXJ0eU5hbWUpO1xuXG5cdFx0XHRcdFx0Ly8gaWYgdGFyZ2V0IGhhcyBzb21lIGNvbHVtbiBuYW1lIGFuZCBjb2x1bW4gaXMgdmlzaWJsZSBpbiBVSVxuXHRcdFx0XHRcdGlmIChjb2x1bW5Qcm9wZXJ0eU5hbWUgJiYgc1RhYmxlVGFyZ2V0Q29sTmFtZSkge1xuXHRcdFx0XHRcdFx0Ly8gaGVhZGVyIHdpbGwgYmUgcm93IElkZW50aWZpZXIsIGlmIGZvdW5kIGZyb20gYWJvdmUgY29kZSBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIHRhYmxlIG5hbWVcblx0XHRcdFx0XHRcdGFNb2RlbERhdGFbXCJoZWFkZXJOYW1lXCJdID0gcm93SWRlbnRpZmllciA/IGAgJHtyb3dJZGVudGlmaWVyfWAgOiAob0VsZW0gYXMgVGFibGUpLmdldEhlYWRlcigpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBpZiBjb2x1bW4gZGF0YSBub3QgZm91bmQgKG1heSBiZSB0aGUgY29sdW1uIGlzIGhpZGRlbiksIGFkZCBncm91cGluZyBhcyBMYXN0IEFjdGlvblxuXHRcdFx0XHRcdFx0YU1vZGVsRGF0YVtcImhlYWRlck5hbWVcIl0gPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TGFzdEFjdGlvblRleHRBbmRBY3Rpb25OYW1lKHNBY3Rpb25OYW1lKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgdGhlIGdyb3VwIG5hbWUgb2YgTWVzc2FnZSBPYmplY3QgaW4gT1AgRGlzcGxheSBtb2RlLlxuICpcbiAqIEBwYXJhbSBhTW9kZWxEYXRhIE1lc3NhZ2UgT2JqZWN0XG4gKiBAcGFyYW0gc0FjdGlvbk5hbWUgIEFjdGlvbiBuYW1lXG4gKiBAcGFyYW0gY29udHJvbFxuICovXG5mdW5jdGlvbiBzZXRHcm91cE5hbWVPUERpc3BsYXlNb2RlKGFNb2RlbERhdGE6IE1lc3NhZ2VXaXRoSGVhZGVyLCBzQWN0aW9uTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBjb250cm9sOiBhbnkpIHtcblx0Y29uc3Qgb1ZpZXdDb250ZXh0ID0gY29udHJvbD8uZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0Y29uc3Qgb3BMYXlvdXQ6IENvbnRyb2wgPSBjb250cm9sPy5nZXRDb250ZW50ICYmIGNvbnRyb2w/LmdldENvbnRlbnQoKVswXTtcblx0bGV0IGJJc0dlbmVyYWxHcm91cE5hbWUgPSB0cnVlO1xuXHRpZiAob3BMYXlvdXQpIHtcblx0XHRtZXNzYWdlSGFuZGxpbmcuZ2V0VmlzaWJsZVNlY3Rpb25zRnJvbU9iamVjdFBhZ2VMYXlvdXQob3BMYXlvdXQpLmZvckVhY2goZnVuY3Rpb24gKG9TZWN0aW9uOiBPYmplY3RQYWdlU2VjdGlvbikge1xuXHRcdFx0Y29uc3Qgc3ViU2VjdGlvbnMgPSBvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpO1xuXHRcdFx0c3ViU2VjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob1N1YlNlY3Rpb246IE9iamVjdFBhZ2VTdWJTZWN0aW9uKSB7XG5cdFx0XHRcdG9TdWJTZWN0aW9uLmZpbmRFbGVtZW50cyh0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChvRWxlbTogYW55KSB7XG5cdFx0XHRcdFx0aWYgKG9FbGVtLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9Sb3dCaW5kaW5nID0gb0VsZW0uZ2V0Um93QmluZGluZygpLFxuXHRcdFx0XHRcdFx0XHRzZXRTZWN0aW9uTmFtZUluR3JvdXAgPSB0cnVlO1xuXHRcdFx0XHRcdFx0bGV0IGNoaWxkVGFibGVFbGVtZW50OiBVSTVFbGVtZW50IHwgdW5kZWZpbmVkO1xuXG5cdFx0XHRcdFx0XHRvRWxlbS5maW5kRWxlbWVudHModHJ1ZSkuZm9yRWFjaCgob0VsZW1lbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAob0VsZW1lbnQuaXNBKFwic2FwLm0uVGFibGVcIikgfHwgb0VsZW1lbnQuaXNBKFwic2FwLnVpLnRhYmxlLlRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hpbGRUYWJsZUVsZW1lbnQgPSBvRWxlbWVudDtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRpZiAob1Jvd0JpbmRpbmcpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc0VsZW1lQmluZGluZ1BhdGggPSBgJHtvVmlld0NvbnRleHQ/LmdldFBhdGgoKX0vJHtvRWxlbS5nZXRSb3dCaW5kaW5nKCk/LmdldFBhdGgoKX1gO1xuXHRcdFx0XHRcdFx0XHRpZiAoYU1vZGVsRGF0YS50YXJnZXQ/LmluZGV4T2Yoc0VsZW1lQmluZGluZ1BhdGgpID09PSAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb2JqID0gbWVzc2FnZUhhbmRsaW5nLmdldFRhYmxlQ29sdW1uRGF0YUFuZFNldFN1YnRpbGUoXG5cdFx0XHRcdFx0XHRcdFx0XHRhTW9kZWxEYXRhLFxuXHRcdFx0XHRcdFx0XHRcdFx0b0VsZW0sXG5cdFx0XHRcdFx0XHRcdFx0XHRjaGlsZFRhYmxlRWxlbWVudCxcblx0XHRcdFx0XHRcdFx0XHRcdG9Sb3dCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHRcdFx0c0FjdGlvbk5hbWUsXG5cdFx0XHRcdFx0XHRcdFx0XHRzZXRTZWN0aW9uTmFtZUluR3JvdXAsXG5cdFx0XHRcdFx0XHRcdFx0XHRmbkNhbGxiYWNrU2V0R3JvdXBOYW1lXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCB7IG9UYXJnZXRUYWJsZUluZm8gfSA9IG9iajtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChzZXRTZWN0aW9uTmFtZUluR3JvdXApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGlkZW50aWZpZXJDb2x1bW4gPSBvRWxlbS5nZXRQYXJlbnQoKS5nZXRJZGVudGlmaWVyQ29sdW1uKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoaWRlbnRpZmllckNvbHVtbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhbGxSb3dDb250ZXh0cyA9IG9FbGVtLmdldFJvd0JpbmRpbmcoKS5nZXRDb250ZXh0cygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhbGxSb3dDb250ZXh0cy5mb3JFYWNoKChyb3dDb250ZXh0OiBDb250ZXh0KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFNb2RlbERhdGEudGFyZ2V0Py5pbmNsdWRlcyhyb3dDb250ZXh0LmdldFBhdGgoKSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHJvd0lkZW50aWZpZXIgPSBpZGVudGlmaWVyQ29sdW1uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdD8gcm93Q29udGV4dC5nZXRPYmplY3QoKVtpZGVudGlmaWVyQ29sdW1uXVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFNb2RlbERhdGFbXCJhZGRpdGlvbmFsVGV4dFwiXSA9IGAke3Jvd0lkZW50aWZpZXJ9LCAke29UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0Q29sTmFtZX1gO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhTW9kZWxEYXRhW1wiYWRkaXRpb25hbFRleHRcIl0gPSBgJHtvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbE5hbWV9YDtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGhlYWRlck5hbWUgPSBvRWxlbS5nZXRIZWFkZXJWaXNpYmxlKCkgJiYgb1RhcmdldFRhYmxlSW5mby50YWJsZUhlYWRlcjtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICghaGVhZGVyTmFtZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRoZWFkZXJOYW1lID0gb1N1YlNlY3Rpb24uZ2V0VGl0bGUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGhlYWRlck5hbWUgPSBgJHtvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlRfTUVTU0FHRV9HUk9VUF9USVRMRV9UQUJMRV9ERU5PTUlOQVRPUlwiKX06ICR7aGVhZGVyTmFtZX1gO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0YU1vZGVsRGF0YVtcImhlYWRlck5hbWVcIl0gPSBoZWFkZXJOYW1lO1xuXHRcdFx0XHRcdFx0XHRcdFx0YklzR2VuZXJhbEdyb3VwTmFtZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdGlmIChiSXNHZW5lcmFsR3JvdXBOYW1lKSB7XG5cdFx0Y29uc3Qgc0VsZW1lQmluZGluZ1BhdGggPSBgJHtvVmlld0NvbnRleHQ/LmdldFBhdGgoKX1gO1xuXHRcdGlmIChhTW9kZWxEYXRhLnRhcmdldD8uaW5kZXhPZihzRWxlbWVCaW5kaW5nUGF0aCkgPT09IDApIHtcblx0XHRcdC8vIGNoZWNrIGlmIE9QIGNvbnRleHQgcGF0aCBpcyBwYXJ0IG9mIHRhcmdldCwgc2V0IExhc3QgQWN0aW9uIGFzIGdyb3VwIG5hbWVcblx0XHRcdGNvbnN0IGhlYWRlck5hbWUgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TGFzdEFjdGlvblRleHRBbmRBY3Rpb25OYW1lKHNBY3Rpb25OYW1lKTtcblx0XHRcdGFNb2RlbERhdGFbXCJoZWFkZXJOYW1lXCJdID0gaGVhZGVyTmFtZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YU1vZGVsRGF0YVtcImhlYWRlck5hbWVcIl0gPSBcIkdlbmVyYWxcIjtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0TGFzdEFjdGlvblRleHRBbmRBY3Rpb25OYW1lKHNBY3Rpb25OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuXHRjb25zdCBzTGFzdEFjdGlvblRleHQgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpLmdldFRleHQoXCJUX01FU1NBR0VfQlVUVE9OX1NBUEZFX01FU1NBR0VfR1JPVVBfTEFTVF9BQ1RJT05cIik7XG5cdHJldHVybiBzQWN0aW9uTmFtZSA/IGAke3NMYXN0QWN0aW9uVGV4dH06ICR7c0FjdGlvbk5hbWV9YCA6IFwiXCI7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGdpdmUgcmFuayBiYXNlZCBvbiBNZXNzYWdlIEdyb3VwL0hlYWRlciBuYW1lLCB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIFNvcnRpbmcgbWVzc2FnZXMgaW4gTWVzc2FnZSBkaWFsb2dcbiAqIExhc3QgQWN0aW9uIHNob3VsZCBiZSBzaG93biBhdCB0b3AsIG5leHQgUm93IElkIGFuZCBsYXN0IEdlbmVyYWwuXG4gKlxuICogQHBhcmFtIG9ialxuICogQHJldHVybnMgUmFuayBvZiBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VSYW5rKG9iajogTWVzc2FnZVdpdGhIZWFkZXIpOiBudW1iZXIge1xuXHRpZiAob2JqLmhlYWRlck5hbWU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJMYXN0IEFjdGlvblwiKSkge1xuXHRcdHJldHVybiAxO1xuXHR9IGVsc2UgaWYgKG9iai5oZWFkZXJOYW1lPy50b1N0cmluZygpLmluY2x1ZGVzKFwiR2VuZXJhbFwiKSkge1xuXHRcdHJldHVybiAzO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiAyO1xuXHR9XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIHNldCB0aGUgZ3JvdXAgbmFtZSB3aGljaCBjYW4gZWl0aGVyIEdlbmVyYWwgb3IgTGFzdCBBY3Rpb24uXG4gKlxuICogQHBhcmFtIGFNZXNzYWdlXG4gKiBAcGFyYW0gc0FjdGlvbk5hbWVcbiAqIEBwYXJhbSBiSXNHZW5lcmFsR3JvdXBOYW1lXG4gKi9cbmNvbnN0IGZuQ2FsbGJhY2tTZXRHcm91cE5hbWUgPSAoYU1lc3NhZ2U6IE1lc3NhZ2VXaXRoSGVhZGVyLCBzQWN0aW9uTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBiSXNHZW5lcmFsR3JvdXBOYW1lPzogQm9vbGVhbikgPT4ge1xuXHRpZiAoYklzR2VuZXJhbEdyb3VwTmFtZSkge1xuXHRcdGNvbnN0IHNHZW5lcmFsR3JvdXBUZXh0ID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKS5nZXRUZXh0KFwiVF9NRVNTQUdFX0JVVFRPTl9TQVBGRV9NRVNTQUdFX0dST1VQX0dFTkVSQUxcIik7XG5cdFx0YU1lc3NhZ2VbXCJoZWFkZXJOYW1lXCJdID0gc0dlbmVyYWxHcm91cFRleHQ7XG5cdH0gZWxzZSB7XG5cdFx0YU1lc3NhZ2VbXCJoZWFkZXJOYW1lXCJdID0gbWVzc2FnZUhhbmRsaW5nLmdldExhc3RBY3Rpb25UZXh0QW5kQWN0aW9uTmFtZShzQWN0aW9uTmFtZSk7XG5cdH1cbn07XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGdldCB0aGUgdGFibGUgcm93L2NvbHVtbiBpbmZvIGFuZCBzZXQgc3VidGl0bGUuXG4gKlxuICogQHBhcmFtIGFNZXNzYWdlXG4gKiBAcGFyYW0gb1RhYmxlXG4gKiBAcGFyYW0gb0VsZW1lbnRcbiAqIEBwYXJhbSBvUm93QmluZGluZ1xuICogQHBhcmFtIHNBY3Rpb25OYW1lXG4gKiBAcGFyYW0gc2V0U2VjdGlvbk5hbWVJbkdyb3VwXG4gKiBAcGFyYW0gZm5TZXRHcm91cE5hbWVcbiAqIEByZXR1cm5zIFRhYmxlIGluZm8gYW5kIFN1YnRpdGxlLlxuICovXG5mdW5jdGlvbiBnZXRUYWJsZUNvbHVtbkRhdGFBbmRTZXRTdWJ0aWxlKFxuXHRhTWVzc2FnZTogTWVzc2FnZVdpdGhIZWFkZXIsXG5cdG9UYWJsZTogVGFibGUsXG5cdG9FbGVtZW50OiBVSTVFbGVtZW50IHwgdW5kZWZpbmVkLFxuXHRvUm93QmluZGluZzogQmluZGluZyxcblx0c0FjdGlvbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0c2V0U2VjdGlvbk5hbWVJbkdyb3VwOiBCb29sZWFuLFxuXHRmblNldEdyb3VwTmFtZTogYW55XG4pIHtcblx0Y29uc3Qgb1RhcmdldFRhYmxlSW5mbyA9IG1lc3NhZ2VIYW5kbGluZy5nZXRUYWJsZUFuZFRhcmdldEluZm8ob1RhYmxlLCBhTWVzc2FnZSwgb0VsZW1lbnQsIG9Sb3dCaW5kaW5nKTtcblx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSBhcyBhbnk7XG5cdG9UYXJnZXRUYWJsZUluZm8udGFibGVIZWFkZXIgPSBvVGFibGUuZ2V0SGVhZGVyKCk7XG5cblx0bGV0IHNDb250cm9sSWQsIGJJc0NyZWF0aW9uUm93O1xuXHRpZiAoIW9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93Q29udGV4dCkge1xuXHRcdHNDb250cm9sSWQgPSBhTWVzc2FnZS5nZXRDb250cm9sSWRzKCkuZmluZChmdW5jdGlvbiAoc0lkOiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiBtZXNzYWdlSGFuZGxpbmcuaXNDb250cm9sSW5UYWJsZShvVGFibGUsIHNJZCk7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoc0NvbnRyb2xJZCkge1xuXHRcdGNvbnN0IG9Db250cm9sID0gQ29yZS5ieUlkKHNDb250cm9sSWQpO1xuXHRcdGJJc0NyZWF0aW9uUm93ID0gbWVzc2FnZUhhbmRsaW5nLmlzQ29udHJvbFBhcnRPZkNyZWF0aW9uUm93KG9Db250cm9sKTtcblx0fVxuXG5cdGlmICghb1RhcmdldFRhYmxlSW5mby5zVGFibGVUYXJnZXRDb2xOYW1lKSB7XG5cdFx0Ly8gaWYgdGhlIGNvbHVtbiBpcyBub3QgcHJlc2VudCBvbiBVSSBvciB0aGUgdGFyZ2V0IGRvZXMgbm90IGhhdmUgYSB0YWJsZSBmaWVsZCBpbiBpdCwgdXNlIExhc3QgQWN0aW9uIGZvciBncm91cGluZ1xuXHRcdGlmICgoYU1lc3NhZ2UgYXMgYW55KS5wZXJzaXN0ZW50ICYmIHNBY3Rpb25OYW1lKSB7XG5cdFx0XHRmblNldEdyb3VwTmFtZShhTWVzc2FnZSwgc0FjdGlvbk5hbWUpO1xuXHRcdFx0c2V0U2VjdGlvbk5hbWVJbkdyb3VwID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3Qgc3ViVGl0bGUgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZVN1YnRpdGxlKFxuXHRcdGFNZXNzYWdlLFxuXHRcdG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93QmluZGluZ0NvbnRleHRzLFxuXHRcdG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93Q29udGV4dCxcblx0XHRvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbE5hbWUsXG5cdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdG9UYWJsZSxcblx0XHRiSXNDcmVhdGlvblJvd1xuXHQpO1xuXG5cdHJldHVybiB7IG9UYXJnZXRUYWJsZUluZm8sIHN1YlRpdGxlIH07XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGNyZWF0ZSB0aGUgc3VidGl0bGUgYmFzZWQgb24gVGFibGUgUm93L0NvbHVtbiBkYXRhLlxuICpcbiAqIEBwYXJhbSBtZXNzYWdlXG4gKiBAcGFyYW0gb1RhYmxlUm93QmluZGluZ0NvbnRleHRzXG4gKiBAcGFyYW0gb1RhYmxlUm93Q29udGV4dFxuICogQHBhcmFtIHNUYWJsZVRhcmdldENvbE5hbWVcbiAqIEBwYXJhbSBvUmVzb3VyY2VCdW5kbGVcbiAqIEBwYXJhbSBvVGFibGVcbiAqIEBwYXJhbSBiSXNDcmVhdGlvblJvd1xuICogQHBhcmFtIG9UYXJnZXRlZENvbnRyb2xcbiAqIEByZXR1cm5zIE1lc3NhZ2Ugc3VidGl0bGUuXG4gKi9cbmZ1bmN0aW9uIGdldE1lc3NhZ2VTdWJ0aXRsZShcblx0bWVzc2FnZTogTWVzc2FnZVdpdGhIZWFkZXIsXG5cdG9UYWJsZVJvd0JpbmRpbmdDb250ZXh0czogQ29udGV4dFtdLFxuXHRvVGFibGVSb3dDb250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkLFxuXHRzVGFibGVUYXJnZXRDb2xOYW1lOiBzdHJpbmcgfCBib29sZWFuLFxuXHRvUmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlLFxuXHRvVGFibGU6IFRhYmxlLFxuXHRiSXNDcmVhdGlvblJvdzogYm9vbGVhbiB8IHVuZGVmaW5lZCxcblx0b1RhcmdldGVkQ29udHJvbD86IENvbnRyb2xcbik6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQge1xuXHRsZXQgc01lc3NhZ2VTdWJ0aXRsZTtcblx0bGV0IHNSb3dTdWJ0aXRsZVZhbHVlO1xuXHRjb25zdCBzVGFibGVGaXJzdENvbFByb3BlcnR5ID0gKG9UYWJsZSBhcyBhbnkpLmdldFBhcmVudCgpLmdldElkZW50aWZpZXJDb2x1bW4oKTtcblx0Y29uc3Qgb0NvbEZyb21UYWJsZVNldHRpbmdzID0gbWVzc2FnZUhhbmRsaW5nLmZldGNoQ29sdW1uSW5mbyhtZXNzYWdlLCBvVGFibGUpO1xuXHRpZiAoYklzQ3JlYXRpb25Sb3cpIHtcblx0XHRzTWVzc2FnZVN1YnRpdGxlID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJUX01FU1NBR0VfSVRFTV9TVUJUSVRMRVwiLCBvUmVzb3VyY2VCdW5kbGUsIFtcblx0XHRcdG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0lURU1fU1VCVElUTEVfQ1JFQVRJT05fUk9XX0lORElDQVRPUlwiKSxcblx0XHRcdHNUYWJsZVRhcmdldENvbE5hbWUgPyBzVGFibGVUYXJnZXRDb2xOYW1lIDogKG9Db2xGcm9tVGFibGVTZXR0aW5ncyBhcyBDb2x1bW5XaXRoTGFiZWxUeXBlKS5sYWJlbFxuXHRcdF0pO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IG9UYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRUZXh0QW5ub3RhdGlvbiA9IG1lc3NhZ2VIYW5kbGluZy5nZXRUYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRGb3JUZXh0QW5ub3RhdGlvbihcblx0XHRcdG9UYWJsZSxcblx0XHRcdG9UYWJsZVJvd0NvbnRleHQsXG5cdFx0XHRzVGFibGVGaXJzdENvbFByb3BlcnR5XG5cdFx0KTtcblx0XHRjb25zdCBzVGFibGVGaXJzdENvbFRleHRBbm5vdGF0aW9uUGF0aCA9IG9UYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRUZXh0QW5ub3RhdGlvblxuXHRcdFx0PyBvVGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0VGV4dEFubm90YXRpb24uZ2V0T2JqZWN0KFwiJFBhdGhcIilcblx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHNUYWJsZUZpcnN0Q29sVGV4dEFycmFuZ2VtZW50ID1cblx0XHRcdHNUYWJsZUZpcnN0Q29sVGV4dEFubm90YXRpb25QYXRoICYmIG9UYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRUZXh0QW5ub3RhdGlvblxuXHRcdFx0XHQ/IG9UYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRUZXh0QW5ub3RhdGlvbi5nZXRPYmplY3QoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuVGV4dEFycmFuZ2VtZW50LyRFbnVtTWVtYmVyXCIpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdGlmIChvVGFibGVSb3dCaW5kaW5nQ29udGV4dHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly8gc2V0IFJvdyBzdWJ0aXRsZSB0ZXh0XG5cdFx0XHRpZiAob1RhcmdldGVkQ29udHJvbCkge1xuXHRcdFx0XHQvLyBUaGUgVUkgZXJyb3IgaXMgb24gdGhlIGZpcnN0IGNvbHVtbiwgd2UgdGhlbiBnZXQgdGhlIGNvbnRyb2wgaW5wdXQgYXMgdGhlIHJvdyBpbmRpY2F0b3I6XG5cdFx0XHRcdHNSb3dTdWJ0aXRsZVZhbHVlID0gKG9UYXJnZXRlZENvbnRyb2wgYXMgYW55KS5nZXRWYWx1ZSgpO1xuXHRcdFx0fSBlbHNlIGlmIChvVGFibGVSb3dDb250ZXh0ICYmIHNUYWJsZUZpcnN0Q29sUHJvcGVydHkpIHtcblx0XHRcdFx0c1Jvd1N1YnRpdGxlVmFsdWUgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0VGFibGVGaXJzdENvbFZhbHVlKFxuXHRcdFx0XHRcdHNUYWJsZUZpcnN0Q29sUHJvcGVydHksXG5cdFx0XHRcdFx0b1RhYmxlUm93Q29udGV4dCxcblx0XHRcdFx0XHRzVGFibGVGaXJzdENvbFRleHRBbm5vdGF0aW9uUGF0aCxcblx0XHRcdFx0XHRzVGFibGVGaXJzdENvbFRleHRBcnJhbmdlbWVudFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c1Jvd1N1YnRpdGxlVmFsdWUgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0XHQvLyBzZXQgdGhlIG1lc3NhZ2Ugc3VidGl0bGVcblx0XHRcdGNvbnN0IG9Db2x1bW5JbmZvOiBDb2x1bW5JbmZvVHlwZSA9IG1lc3NhZ2VIYW5kbGluZy5kZXRlcm1pbmVDb2x1bW5JbmZvKG9Db2xGcm9tVGFibGVTZXR0aW5ncywgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdGlmIChzUm93U3VidGl0bGVWYWx1ZSAmJiBzVGFibGVUYXJnZXRDb2xOYW1lKSB7XG5cdFx0XHRcdHNNZXNzYWdlU3VidGl0bGUgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIlRfTUVTU0FHRV9JVEVNX1NVQlRJVExFXCIsIG9SZXNvdXJjZUJ1bmRsZSwgW1xuXHRcdFx0XHRcdHNSb3dTdWJ0aXRsZVZhbHVlLFxuXHRcdFx0XHRcdHNUYWJsZVRhcmdldENvbE5hbWVcblx0XHRcdFx0XSk7XG5cdFx0XHR9IGVsc2UgaWYgKHNSb3dTdWJ0aXRsZVZhbHVlICYmIG9Db2x1bW5JbmZvLnNDb2x1bW5JbmRpY2F0b3IgPT09IFwiSGlkZGVuXCIpIHtcblx0XHRcdFx0c01lc3NhZ2VTdWJ0aXRsZSA9IGAke29SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiVF9NRVNTQUdFX0dST1VQX0RFU0NSSVBUSU9OX1RBQkxFX1JPV1wiKX06ICR7c1Jvd1N1YnRpdGxlVmFsdWV9LCAke1xuXHRcdFx0XHRcdG9Db2x1bW5JbmZvLnNDb2x1bW5WYWx1ZVxuXHRcdFx0XHR9YDtcblx0XHRcdH0gZWxzZSBpZiAoc1Jvd1N1YnRpdGxlVmFsdWUgJiYgb0NvbHVtbkluZm8uc0NvbHVtbkluZGljYXRvciA9PT0gXCJVbmtub3duXCIpIHtcblx0XHRcdFx0c01lc3NhZ2VTdWJ0aXRsZSA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9NRVNTQUdFX0lURU1fU1VCVElUTEVcIiwgb1Jlc291cmNlQnVuZGxlLCBbXG5cdFx0XHRcdFx0c1Jvd1N1YnRpdGxlVmFsdWUsXG5cdFx0XHRcdFx0b0NvbHVtbkluZm8uc0NvbHVtblZhbHVlXG5cdFx0XHRcdF0pO1xuXHRcdFx0fSBlbHNlIGlmIChzUm93U3VidGl0bGVWYWx1ZSAmJiBvQ29sdW1uSW5mby5zQ29sdW1uSW5kaWNhdG9yID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHRcdHNNZXNzYWdlU3VidGl0bGUgPSBgJHtvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlRfTUVTU0FHRV9HUk9VUF9ERVNDUklQVElPTl9UQUJMRV9ST1dcIil9OiAke3NSb3dTdWJ0aXRsZVZhbHVlfWA7XG5cdFx0XHR9IGVsc2UgaWYgKCFzUm93U3VidGl0bGVWYWx1ZSAmJiBzVGFibGVUYXJnZXRDb2xOYW1lKSB7XG5cdFx0XHRcdHNNZXNzYWdlU3VidGl0bGUgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlRfTUVTU0FHRV9HUk9VUF9ERVNDUklQVElPTl9UQUJMRV9DT0xVTU5cIikgKyBcIjogXCIgKyBzVGFibGVUYXJnZXRDb2xOYW1lO1xuXHRcdFx0fSBlbHNlIGlmICghc1Jvd1N1YnRpdGxlVmFsdWUgJiYgb0NvbHVtbkluZm8uc0NvbHVtbkluZGljYXRvciA9PT0gXCJIaWRkZW5cIikge1xuXHRcdFx0XHRzTWVzc2FnZVN1YnRpdGxlID0gb0NvbHVtbkluZm8uc0NvbHVtblZhbHVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c01lc3NhZ2VTdWJ0aXRsZSA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNNZXNzYWdlU3VidGl0bGUgPSBudWxsO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBzTWVzc2FnZVN1YnRpdGxlO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBnZXQgdGhlIGZpcnN0IGNvbHVtbiBmb3IgdGV4dCBBbm5vdGF0aW9uLCB0aGlzIGlzIG5lZWRlZCB0byBzZXQgc3VidGl0bGUgb2YgTWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0gb1RhYmxlXG4gKiBAcGFyYW0gb1RhYmxlUm93Q29udGV4dFxuICogQHBhcmFtIHNUYWJsZUZpcnN0Q29sUHJvcGVydHlcbiAqIEByZXR1cm5zIEJpbmRpbmcgY29udGV4dC5cbiAqL1xuZnVuY3Rpb24gZ2V0VGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0Rm9yVGV4dEFubm90YXRpb24oXG5cdG9UYWJsZTogVGFibGUsXG5cdG9UYWJsZVJvd0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQsXG5cdHNUYWJsZUZpcnN0Q29sUHJvcGVydHk6IHN0cmluZ1xuKTogQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQge1xuXHRsZXQgb0JpbmRpbmdDb250ZXh0O1xuXHRpZiAob1RhYmxlUm93Q29udGV4dCAmJiBzVGFibGVGaXJzdENvbFByb3BlcnR5KSB7XG5cdFx0Y29uc3Qgb01vZGVsID0gb1RhYmxlPy5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvTW9kZWw/LmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IHNNZXRhUGF0aCA9IChvTWV0YU1vZGVsIGFzIGFueSk/LmdldE1ldGFQYXRoKG9UYWJsZVJvd0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRpZiAob01ldGFNb2RlbD8uZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzVGFibGVGaXJzdENvbFByb3BlcnR5fUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dC8kUGF0aGApKSB7XG5cdFx0XHRvQmluZGluZ0NvbnRleHQgPSBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAke3NNZXRhUGF0aH0vJHtzVGFibGVGaXJzdENvbFByb3BlcnR5fUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuVGV4dGApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb0JpbmRpbmdDb250ZXh0O1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBnZXQgdGhlIHZhbHVlIG9mIGZpcnN0IENvbHVtbiBvZiBUYWJsZSwgd2l0aCBpdHMgdGV4dCBBcnJhbmdlbWVudC5cbiAqXG4gKiBAcGFyYW0gc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eVxuICogQHBhcmFtIG9UYWJsZVJvd0NvbnRleHRcbiAqIEBwYXJhbSBzVGV4dEFubm90YXRpb25QYXRoXG4gKiBAcGFyYW0gc1RleHRBcnJhbmdlbWVudFxuICogQHJldHVybnMgQ29sdW1uIFZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRUYWJsZUZpcnN0Q29sVmFsdWUoXG5cdHNUYWJsZUZpcnN0Q29sUHJvcGVydHk6IHN0cmluZyxcblx0b1RhYmxlUm93Q29udGV4dDogQ29udGV4dCxcblx0c1RleHRBbm5vdGF0aW9uUGF0aDogc3RyaW5nLFxuXHRzVGV4dEFycmFuZ2VtZW50OiBzdHJpbmdcbik6IHN0cmluZyB7XG5cdGNvbnN0IHNDb2RlVmFsdWUgPSAob1RhYmxlUm93Q29udGV4dCBhcyBhbnkpLmdldFZhbHVlKHNUYWJsZUZpcnN0Q29sUHJvcGVydHkpO1xuXHRsZXQgc1RleHRWYWx1ZTtcblx0bGV0IHNDb21wdXRlZFZhbHVlID0gc0NvZGVWYWx1ZTtcblx0aWYgKHNUZXh0QW5ub3RhdGlvblBhdGgpIHtcblx0XHRpZiAoc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eS5sYXN0SW5kZXhPZihcIi9cIikgPiAwKSB7XG5cdFx0XHQvLyB0aGUgdGFyZ2V0IHByb3BlcnR5IGlzIHJlcGxhY2VkIHdpdGggdGhlIHRleHQgYW5ub3RhdGlvbiBwYXRoXG5cdFx0XHRzVGFibGVGaXJzdENvbFByb3BlcnR5ID0gc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eS5zbGljZSgwLCBzVGFibGVGaXJzdENvbFByb3BlcnR5Lmxhc3RJbmRleE9mKFwiL1wiKSArIDEpO1xuXHRcdFx0c1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSA9IHNUYWJsZUZpcnN0Q29sUHJvcGVydHkuY29uY2F0KHNUZXh0QW5ub3RhdGlvblBhdGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzVGFibGVGaXJzdENvbFByb3BlcnR5ID0gc1RleHRBbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdFx0c1RleHRWYWx1ZSA9IChvVGFibGVSb3dDb250ZXh0IGFzIGFueSkuZ2V0VmFsdWUoc1RhYmxlRmlyc3RDb2xQcm9wZXJ0eSk7XG5cdFx0aWYgKHNUZXh0VmFsdWUpIHtcblx0XHRcdGlmIChzVGV4dEFycmFuZ2VtZW50KSB7XG5cdFx0XHRcdGNvbnN0IHNFbnVtTnVtYmVyID0gc1RleHRBcnJhbmdlbWVudC5zbGljZShzVGV4dEFycmFuZ2VtZW50LmluZGV4T2YoXCIvXCIpICsgMSk7XG5cdFx0XHRcdHN3aXRjaCAoc0VudW1OdW1iZXIpIHtcblx0XHRcdFx0XHRjYXNlIFwiVGV4dE9ubHlcIjpcblx0XHRcdFx0XHRcdHNDb21wdXRlZFZhbHVlID0gc1RleHRWYWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJUZXh0Rmlyc3RcIjpcblx0XHRcdFx0XHRcdHNDb21wdXRlZFZhbHVlID0gYCR7c1RleHRWYWx1ZX0gKCR7c0NvZGVWYWx1ZX0pYDtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgXCJUZXh0TGFzdFwiOlxuXHRcdFx0XHRcdFx0c0NvbXB1dGVkVmFsdWUgPSBgJHtzQ29kZVZhbHVlfSAoJHtzVGV4dFZhbHVlfSlgO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSBcIlRleHRTZXBhcmF0ZVwiOlxuXHRcdFx0XHRcdFx0c0NvbXB1dGVkVmFsdWUgPSBzQ29kZVZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0NvbXB1dGVkVmFsdWUgPSBgJHtzVGV4dFZhbHVlfSAoJHtzQ29kZVZhbHVlfSlgO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gc0NvbXB1dGVkVmFsdWU7XG59XG5cbi8qKlxuICogVGhlIG1ldGhvZCB0aGF0IGlzIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUgY29sdW1uIGluZm8gZnJvbSB0aGUgYXNzb2NpYXRlZCBtZXNzYWdlIG9mIHRoZSBtZXNzYWdlIHBvcG92ZXIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBvTWVzc2FnZSBNZXNzYWdlIG9iamVjdFxuICogQHBhcmFtIG9UYWJsZSBNZGNUYWJsZVxuICogQHJldHVybnMgUmV0dXJucyB0aGUgY29sdW1uIGluZm8uXG4gKi9cbmZ1bmN0aW9uIGZldGNoQ29sdW1uSW5mbyhvTWVzc2FnZTogTWVzc2FnZVdpdGhIZWFkZXIsIG9UYWJsZTogVGFibGUpOiBDb2x1bW4ge1xuXHRjb25zdCBzQ29sTmFtZUZyb21NZXNzYWdlT2JqID0gb01lc3NhZ2U/LmdldFRhcmdldHMoKVswXS5zcGxpdChcIi9cIikucG9wKCk7XG5cdHJldHVybiAob1RhYmxlIGFzIGFueSlcblx0XHQuZ2V0UGFyZW50KClcblx0XHQuZ2V0VGFibGVEZWZpbml0aW9uKClcblx0XHQuY29sdW1ucy5maW5kKGZ1bmN0aW9uIChvQ29sdW1uOiBhbnkpIHtcblx0XHRcdHJldHVybiBvQ29sdW1uLmtleS5zcGxpdChcIjo6XCIpLnBvcCgpID09PSBzQ29sTmFtZUZyb21NZXNzYWdlT2JqO1xuXHRcdH0pO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gZ2V0IHRoZSBDb2x1bW4gZGF0YSBkZXBlbmRpbmcgb24gaXRzIGF2YWlsYWJpbGl0eSBpbiBUYWJsZSwgdGhpcyBpcyBuZWVkZWQgZm9yIHNldHRpbmcgc3VidGl0bGUgb2YgTWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0gb0NvbEZyb21UYWJsZVNldHRpbmdzXG4gKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG4gKiBAcmV0dXJucyBDb2x1bW4gZGF0YS5cbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5lQ29sdW1uSW5mbyhvQ29sRnJvbVRhYmxlU2V0dGluZ3M6IGFueSwgb1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZSk6IENvbHVtbkluZm9UeXBlIHtcblx0Y29uc3Qgb0NvbHVtbkluZm86IGFueSA9IHsgc0NvbHVtbkluZGljYXRvcjogU3RyaW5nLCBzQ29sdW1uVmFsdWU6IFN0cmluZyB9O1xuXHRpZiAob0NvbEZyb21UYWJsZVNldHRpbmdzKSB7XG5cdFx0Ly8gaWYgY29sdW1uIGlzIG5laXRoZXIgaW4gdGFibGUgZGVmaW5pdGlvbiBub3IgcGVyc29uYWxpemF0aW9uLCBzaG93IG9ubHkgcm93IHN1YnRpdGxlIHRleHRcblx0XHRpZiAob0NvbEZyb21UYWJsZVNldHRpbmdzLmF2YWlsYWJpbGl0eSA9PT0gXCJIaWRkZW5cIikge1xuXHRcdFx0b0NvbHVtbkluZm8uc0NvbHVtblZhbHVlID0gdW5kZWZpbmVkO1xuXHRcdFx0b0NvbHVtbkluZm8uc0NvbHVtbkluZGljYXRvciA9IFwidW5kZWZpbmVkXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vaWYgY29sdW1uIGlzIGluIHRhYmxlIHBlcnNvbmFsaXphdGlvbiBidXQgbm90IGluIHRhYmxlIGRlZmluaXRpb24sIHNob3cgQ29sdW1uIChIaWRkZW4pIDogPGNvbE5hbWU+XG5cdFx0XHRvQ29sdW1uSW5mby5zQ29sdW1uVmFsdWUgPSBgJHtvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlRfTUVTU0FHRV9HUk9VUF9ERVNDUklQVElPTl9UQUJMRV9DT0xVTU5cIil9ICgke29SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFxuXHRcdFx0XHRcIlRfQ09MVU1OX0lORElDQVRPUl9JTl9UQUJMRV9ERUZJTklUSU9OXCJcblx0XHRcdCl9KTogJHtvQ29sRnJvbVRhYmxlU2V0dGluZ3MubGFiZWx9YDtcblx0XHRcdG9Db2x1bW5JbmZvLnNDb2x1bW5JbmRpY2F0b3IgPSBcIkhpZGRlblwiO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRvQ29sdW1uSW5mby5zQ29sdW1uVmFsdWUgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlRfTUVTU0FHRV9JVEVNX1NVQlRJVExFX0lORElDQVRPUl9VTktOT1dOXCIpO1xuXHRcdG9Db2x1bW5JbmZvLnNDb2x1bW5JbmRpY2F0b3IgPSBcIlVua25vd25cIjtcblx0fVxuXHRyZXR1cm4gb0NvbHVtbkluZm87XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjaGVjayBpZiBhIGdpdmVuIGNvbnRyb2wgaWQgaXMgYSBwYXJ0IG9mIFRhYmxlLlxuICpcbiAqIEBwYXJhbSBvVGFibGVcbiAqIEBwYXJhbSBzQ29udHJvbElkXG4gKiBAcmV0dXJucyBUcnVlIGlmIGNvbnRyb2wgaXMgcGFydCBvZiB0YWJsZS5cbiAqL1xuZnVuY3Rpb24gaXNDb250cm9sSW5UYWJsZShvVGFibGU6IFRhYmxlLCBzQ29udHJvbElkOiBzdHJpbmcpOiBVSTVFbGVtZW50W10gfCBib29sZWFuIHtcblx0Y29uc3Qgb0NvbnRyb2w6IGFueSA9IENvcmUuYnlJZChzQ29udHJvbElkKTtcblx0aWYgKG9Db250cm9sICYmICFvQ29udHJvbC5pc0EoXCJzYXAudWkudGFibGUuVGFibGVcIikgJiYgIW9Db250cm9sLmlzQShcInNhcC5tLlRhYmxlXCIpKSB7XG5cdFx0cmV0dXJuIG9UYWJsZS5maW5kRWxlbWVudHModHJ1ZSwgZnVuY3Rpb24gKG9FbGVtOiBhbnkpIHtcblx0XHRcdHJldHVybiBvRWxlbS5nZXRJZCgpID09PSBvQ29udHJvbDtcblx0XHR9KTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzQ29udHJvbFBhcnRPZkNyZWF0aW9uUm93KG9Db250cm9sOiBVSTVFbGVtZW50IHwgdW5kZWZpbmVkKSB7XG5cdGxldCBvUGFyZW50Q29udHJvbCA9IG9Db250cm9sPy5nZXRQYXJlbnQoKTtcblx0d2hpbGUgKFxuXHRcdG9QYXJlbnRDb250cm9sICYmXG5cdFx0IW9QYXJlbnRDb250cm9sPy5pc0EoXCJzYXAudWkudGFibGUuUm93XCIpICYmXG5cdFx0IW9QYXJlbnRDb250cm9sPy5pc0EoXCJzYXAudWkudGFibGUuQ3JlYXRpb25Sb3dcIikgJiZcblx0XHQhb1BhcmVudENvbnRyb2w/LmlzQShcInNhcC5tLkNvbHVtbkxpc3RJdGVtXCIpXG5cdCkge1xuXHRcdG9QYXJlbnRDb250cm9sID0gb1BhcmVudENvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdH1cblxuXHRyZXR1cm4gISFvUGFyZW50Q29udHJvbCAmJiBvUGFyZW50Q29udHJvbC5pc0EoXCJzYXAudWkudGFibGUuQ3JlYXRpb25Sb3dcIik7XG59XG5cbmZ1bmN0aW9uIGdldFRyYW5zbGF0ZWRUZXh0Rm9yTWVzc2FnZURpYWxvZyhzSGlnaGVzdFByaW9yaXR5OiBhbnkpIHtcblx0Y29uc3Qgb1Jlc291cmNlQnVuZGxlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0c3dpdGNoIChzSGlnaGVzdFByaW9yaXR5KSB7XG5cdFx0Y2FzZSBcIkVycm9yXCI6XG5cdFx0XHRyZXR1cm4gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9FUlJPUl9NRVNTQUdFU19QQUdFX1RJVExFX0VSUk9SXCIpO1xuXHRcdGNhc2UgXCJJbmZvcm1hdGlvblwiOlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVfSU5GT1wiKTtcblx0XHRjYXNlIFwiU3VjY2Vzc1wiOlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVfU1VDQ0VTU1wiKTtcblx0XHRjYXNlIFwiV2FybmluZ1wiOlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVfV0FSTklOR1wiKTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVcIik7XG5cdH1cbn1cbmZ1bmN0aW9uIHJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKSB7XG5cdHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyhmYWxzZSk7XG59XG5mdW5jdGlvbiByZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcyhzUGF0aFRvQmVSZW1vdmVkPzogc3RyaW5nKSB7XG5cdHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyh0cnVlLCBzUGF0aFRvQmVSZW1vdmVkKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWVzc2FnZXNGcm9tTWVzc2FnZU1vZGVsKG9NZXNzYWdlTW9kZWw6IGFueSwgc1BhdGhUb0JlUmVtb3ZlZD86IHN0cmluZykge1xuXHRpZiAoc1BhdGhUb0JlUmVtb3ZlZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIG9NZXNzYWdlTW9kZWwuZ2V0T2JqZWN0KFwiL1wiKTtcblx0fVxuXHRjb25zdCBsaXN0QmluZGluZyA9IG9NZXNzYWdlTW9kZWwuYmluZExpc3QoXCIvXCIpO1xuXG5cdGxpc3RCaW5kaW5nLmZpbHRlcihcblx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdHBhdGg6IFwidGFyZ2V0XCIsXG5cdFx0XHRvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuU3RhcnRzV2l0aCxcblx0XHRcdHZhbHVlMTogc1BhdGhUb0JlUmVtb3ZlZFxuXHRcdH0pXG5cdCk7XG5cblx0cmV0dXJuIGxpc3RCaW5kaW5nLmdldEN1cnJlbnRDb250ZXh0cygpLm1hcChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdHJldHVybiBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0fSk7XG59XG5mdW5jdGlvbiBnZXRNZXNzYWdlcyhiQm91bmRNZXNzYWdlczogYm9vbGVhbiA9IGZhbHNlLCBiVHJhbnNpdGlvbk9ubHk6IGJvb2xlYW4gPSBmYWxzZSwgc1BhdGhUb0JlUmVtb3ZlZD86IHN0cmluZykge1xuXHRsZXQgaTtcblx0Y29uc3Qgb01lc3NhZ2VNYW5hZ2VyID0gQ29yZS5nZXRNZXNzYWdlTWFuYWdlcigpLFxuXHRcdG9NZXNzYWdlTW9kZWwgPSBvTWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZU1vZGVsKCksXG5cdFx0b1Jlc291cmNlQnVuZGxlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKSxcblx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzID0gW107XG5cdGxldCBhTWVzc2FnZXM6IGFueVtdID0gW107XG5cdGlmIChiQm91bmRNZXNzYWdlcyAmJiBiVHJhbnNpdGlvbk9ubHkgJiYgc1BhdGhUb0JlUmVtb3ZlZCkge1xuXHRcdGFNZXNzYWdlcyA9IGdldE1lc3NhZ2VzRnJvbU1lc3NhZ2VNb2RlbChvTWVzc2FnZU1vZGVsLCBzUGF0aFRvQmVSZW1vdmVkKTtcblx0fSBlbHNlIHtcblx0XHRhTWVzc2FnZXMgPSBvTWVzc2FnZU1vZGVsLmdldE9iamVjdChcIi9cIik7XG5cdH1cblx0Zm9yIChpID0gMDsgaSA8IGFNZXNzYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChcblx0XHRcdCghYlRyYW5zaXRpb25Pbmx5IHx8IGFNZXNzYWdlc1tpXS5wZXJzaXN0ZW50KSAmJlxuXHRcdFx0KChiQm91bmRNZXNzYWdlcyAmJiBhTWVzc2FnZXNbaV0udGFyZ2V0ICE9PSBcIlwiKSB8fCAoIWJCb3VuZE1lc3NhZ2VzICYmICghYU1lc3NhZ2VzW2ldLnRhcmdldCB8fCBhTWVzc2FnZXNbaV0udGFyZ2V0ID09PSBcIlwiKSkpXG5cdFx0KSB7XG5cdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzLnB1c2goYU1lc3NhZ2VzW2ldKTtcblx0XHR9XG5cdH1cblxuXHRmb3IgKGkgPSAwOyBpIDwgYVRyYW5zaXRpb25NZXNzYWdlcy5sZW5ndGg7IGkrKykge1xuXHRcdGlmIChcblx0XHRcdGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0uY29kZSA9PT0gXCI1MDNcIiAmJlxuXHRcdFx0YVRyYW5zaXRpb25NZXNzYWdlc1tpXS5tZXNzYWdlICE9PSBcIlwiICYmXG5cdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldLm1lc3NhZ2UuaW5kZXhPZihvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfQkFDS0VORF9QUkVGSVhcIikpID09PSAtMVxuXHRcdCkge1xuXHRcdFx0YVRyYW5zaXRpb25NZXNzYWdlc1tpXS5tZXNzYWdlID0gYFxcbiR7b1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0JBQ0tFTkRfUFJFRklYXCIpfSR7XG5cdFx0XHRcdGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0ubWVzc2FnZVxuXHRcdFx0fWA7XG5cdFx0fVxuXHR9XG5cdC8vRmlsdGVyaW5nIG1lc3NhZ2VzIGFnYWluIGhlcmUgdG8gYXZvaWQgc2hvd2luZyBwdXJlIHRlY2huaWNhbCBtZXNzYWdlcyByYWlzZWQgYnkgdGhlIG1vZGVsXG5cdGNvbnN0IGJhY2tlbmRNZXNzYWdlczogYW55ID0gW107XG5cdGZvciAoaSA9IDA7IGkgPCBhVHJhbnNpdGlvbk1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKFxuXHRcdFx0KGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0udGVjaG5pY2FsRGV0YWlscyAmJlxuXHRcdFx0XHQoKGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0udGVjaG5pY2FsRGV0YWlscy5vcmlnaW5hbE1lc3NhZ2UgIT09IHVuZGVmaW5lZCAmJlxuXHRcdFx0XHRcdGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0udGVjaG5pY2FsRGV0YWlscy5vcmlnaW5hbE1lc3NhZ2UgIT09IG51bGwpIHx8XG5cdFx0XHRcdFx0KGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0udGVjaG5pY2FsRGV0YWlscy5odHRwU3RhdHVzICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0XHRcdGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0udGVjaG5pY2FsRGV0YWlscy5odHRwU3RhdHVzICE9PSBudWxsKSkpIHx8XG5cdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldLmNvZGVcblx0XHQpIHtcblx0XHRcdGJhY2tlbmRNZXNzYWdlcy5wdXNoKGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0pO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYmFja2VuZE1lc3NhZ2VzO1xufVxuZnVuY3Rpb24gcmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKGJCb3VuZE1lc3NhZ2VzOiBhbnksIHNQYXRoVG9CZVJlbW92ZWQ/OiBzdHJpbmcpIHtcblx0Y29uc3QgYU1lc3NhZ2VzVG9CZURlbGV0ZWQgPSBnZXRNZXNzYWdlcyhiQm91bmRNZXNzYWdlcywgdHJ1ZSwgc1BhdGhUb0JlUmVtb3ZlZCk7XG5cblx0aWYgKGFNZXNzYWdlc1RvQmVEZWxldGVkLmxlbmd0aCA+IDApIHtcblx0XHRDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCkucmVtb3ZlTWVzc2FnZXMoYU1lc3NhZ2VzVG9CZURlbGV0ZWQpO1xuXHR9XG59XG4vL1RPRE86IFRoaXMgbXVzdCBiZSBtb3ZlZCBvdXQgb2YgbWVzc2FnZSBoYW5kbGluZ1xuZnVuY3Rpb24gc2V0TWVzc2FnZVN1YnRpdGxlKG9UYWJsZTogVGFibGUsIGFDb250ZXh0czogQ29udGV4dFtdLCBtZXNzYWdlOiBNZXNzYWdlV2l0aEhlYWRlcikge1xuXHRjb25zdCBzdWJ0aXRsZUNvbHVtbiA9IChvVGFibGUuZ2V0UGFyZW50KCkgYXMgYW55KS5nZXRJZGVudGlmaWVyQ29sdW1uKCk7XG5cdGNvbnN0IGVycm9yQ29udGV4dCA9IGFDb250ZXh0cy5maW5kKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpWzBdLmluZGV4T2Yob0NvbnRleHQuZ2V0UGF0aCgpKSAhPT0gLTE7XG5cdH0pO1xuXHRtZXNzYWdlLmFkZGl0aW9uYWxUZXh0ID0gZXJyb3JDb250ZXh0ID8gZXJyb3JDb250ZXh0LmdldE9iamVjdCgpW3N1YnRpdGxlQ29sdW1uXSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUaGUgbWV0aG9kIHJldHJpZXZlcyB0aGUgdmlzaWJsZSBzZWN0aW9ucyBmcm9tIGFuIG9iamVjdCBwYWdlLlxuICpcbiAqIEBwYXJhbSBvT2JqZWN0UGFnZUxheW91dCBUaGUgb2JqZWN0UGFnZUxheW91dCBvYmplY3QgZm9yIHdoaWNoIHdlIHdhbnQgdG8gcmV0cmlldmUgdGhlIHZpc2libGUgc2VjdGlvbnMuXG4gKiBAcmV0dXJucyBBcnJheSBvZiB2aXNpYmxlIHNlY3Rpb25zLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0VmlzaWJsZVNlY3Rpb25zRnJvbU9iamVjdFBhZ2VMYXlvdXQob09iamVjdFBhZ2VMYXlvdXQ6IENvbnRyb2wgfCBPYmplY3RQYWdlTGF5b3V0KSB7XG5cdHJldHVybiAob09iamVjdFBhZ2VMYXlvdXQgYXMgT2JqZWN0UGFnZUxheW91dCkuZ2V0U2VjdGlvbnMoKS5maWx0ZXIoZnVuY3Rpb24gKG9TZWN0aW9uOiBPYmplY3RQYWdlU2VjdGlvbikge1xuXHRcdHJldHVybiBvU2VjdGlvbi5nZXRWaXNpYmxlKCk7XG5cdH0pO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGNvbnRyb2wgaWRzIGZyb20gbWVzc2FnZSBhcmUgYSBwYXJ0IG9mIGEgZ2l2ZW4gc3Vic2VjdGlvbi5cbiAqXG4gKiBAcGFyYW0gc3ViU2VjdGlvblxuICogQHBhcmFtIG9NZXNzYWdlT2JqZWN0XG4gKiBAcmV0dXJucyBTdWJTZWN0aW9uIG1hdGNoaW5nIGNvbnRyb2wgaWRzLlxuICovXG5mdW5jdGlvbiBnZXRDb250cm9sRnJvbU1lc3NhZ2VSZWxhdGluZ1RvU3ViU2VjdGlvbihzdWJTZWN0aW9uOiBPYmplY3RQYWdlU3ViU2VjdGlvbiwgb01lc3NhZ2VPYmplY3Q6IE1lc3NhZ2VXaXRoSGVhZGVyKTogVUk1RWxlbWVudFtdIHtcblx0cmV0dXJuIHN1YlNlY3Rpb25cblx0XHQuZmluZEVsZW1lbnRzKHRydWUsIChvRWxlbTogYW55KSA9PiB7XG5cdFx0XHRyZXR1cm4gZm5GaWx0ZXJVcG9uSWRzKG9NZXNzYWdlT2JqZWN0LmdldENvbnRyb2xJZHMoKSwgb0VsZW0pO1xuXHRcdH0pXG5cdFx0LnNvcnQoZnVuY3Rpb24gKGE6IGFueSwgYjogYW55KSB7XG5cdFx0XHQvLyBjb250cm9scyBhcmUgc29ydGVkIGluIG9yZGVyIHRvIGhhdmUgdGhlIHRhYmxlIG9uIHRvcCBvZiB0aGUgYXJyYXlcblx0XHRcdC8vIGl0IHdpbGwgaGVscCB0byBjb21wdXRlIHRoZSBzdWJ0aXRsZSBvZiB0aGUgbWVzc2FnZSBiYXNlZCBvbiB0aGUgdHlwZSBvZiByZWxhdGVkIGNvbnRyb2xzXG5cdFx0XHRpZiAoYS5pc0EoXCJzYXAudWkubWRjLlRhYmxlXCIpICYmICFiLmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fSk7XG59XG5cbmZ1bmN0aW9uIGdldFRhYmxlQ29sUHJvcGVydHkob1RhYmxlOiBDb250cm9sLCBvTWVzc2FnZU9iamVjdDogTWVzc2FnZVdpdGhIZWFkZXIsIG9Db250ZXh0UGF0aD86IGFueSkge1xuXHQvL3RoaXMgZnVuY3Rpb24gZXNjYXBlcyBhIHN0cmluZyB0byB1c2UgaXQgYXMgYSByZWdleFxuXHRjb25zdCBmblJlZ0V4cGVzY2FwZSA9IGZ1bmN0aW9uIChzOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gcy5yZXBsYWNlKC9bLVxcL1xcXFxeJCorPy4oKXxbXFxde31dL2csIFwiXFxcXCQmXCIpO1xuXHR9O1xuXHQvLyBiYXNlZCBvbiB0aGUgdGFyZ2V0IHBhdGggb2YgdGhlIG1lc3NhZ2Ugd2UgcmV0cmlldmUgdGhlIHByb3BlcnR5IG5hbWUuXG5cdC8vIHRvIGFjaGlldmUgaXQgd2UgcmVtb3ZlIHRoZSBiaW5kaW5nQ29udGV4dCBwYXRoIGFuZCB0aGUgcm93IGJpbmRpbmcgcGF0aCBmcm9tIHRoZSB0YXJnZXRcblx0aWYgKCFvQ29udGV4dFBhdGgpIHtcblx0XHRvQ29udGV4dFBhdGggPSBuZXcgUmVnRXhwKFxuXHRcdFx0YCR7Zm5SZWdFeHBlc2NhcGUoYCR7b1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKX0vJHsob1RhYmxlIGFzIFRhYmxlKS5nZXRSb3dCaW5kaW5nKCkuZ2V0UGF0aCgpfWApfVxcXFwoLipcXFxcKS9gXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gb01lc3NhZ2VPYmplY3QuZ2V0VGFyZ2V0cygpWzBdLnJlcGxhY2Uob0NvbnRleHRQYXRoLCBcIlwiKTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGdpdmVzIHRoZSBjb2x1bW4gaW5mb3JtYXRpb24gaWYgaXQgbWF0Y2hlcyB3aXRoIHRoZSBwcm9wZXJ0eSBuYW1lIGZyb20gdGFyZ2V0IG9mIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIG9UYWJsZVxuICogQHBhcmFtIHNUYWJsZVRhcmdldENvbFByb3BlcnR5XG4gKiBAcmV0dXJucyBDb2x1bW4gbmFtZSBhbmQgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGdldFRhYmxlQ29sSW5mbyhvVGFibGU6IENvbnRyb2wsIHNUYWJsZVRhcmdldENvbFByb3BlcnR5OiBzdHJpbmcpIHtcblx0bGV0IHNUYWJsZVRhcmdldENvbE5hbWU6IHN0cmluZztcblx0bGV0IG9UYWJsZVRhcmdldENvbCA9IChvVGFibGUgYXMgVGFibGUpLmdldENvbHVtbnMoKS5maW5kKGZ1bmN0aW9uIChjb2x1bW46IGFueSkge1xuXHRcdHJldHVybiBjb2x1bW4uZ2V0RGF0YVByb3BlcnR5KCkgPT0gc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHk7XG5cdH0pO1xuXHRpZiAoIW9UYWJsZVRhcmdldENvbCkge1xuXHRcdC8qIElmIHRoZSB0YXJnZXQgY29sdW1uIGlzIG5vdCBmb3VuZCwgd2UgY2hlY2sgZm9yIGEgY3VzdG9tIGNvbHVtbiAqL1xuXHRcdGNvbnN0IG9DdXN0b21Db2x1bW4gPSAob1RhYmxlIGFzIFRhYmxlKVxuXHRcdFx0LmdldENvbnRyb2xEZWxlZ2F0ZSgpXG5cdFx0XHQuZ2V0Q29sdW1uc0ZvcihvVGFibGUpXG5cdFx0XHQuZmluZChmdW5jdGlvbiAob0NvbHVtbjogYW55KSB7XG5cdFx0XHRcdGlmICghIW9Db2x1bW4udGVtcGxhdGUgJiYgb0NvbHVtbi5wcm9wZXJ0eUluZm9zKSB7XG5cdFx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcdG9Db2x1bW4ucHJvcGVydHlJbmZvc1swXSA9PT0gc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgfHxcblx0XHRcdFx0XHRcdG9Db2x1bW4ucHJvcGVydHlJbmZvc1swXS5yZXBsYWNlKFwiUHJvcGVydHk6OlwiLCBcIlwiKSA9PT0gc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0aWYgKG9DdXN0b21Db2x1bW4pIHtcblx0XHRcdG9UYWJsZVRhcmdldENvbCA9IG9DdXN0b21Db2x1bW47XG5cdFx0XHRzVGFibGVUYXJnZXRDb2xQcm9wZXJ0eSA9IChvVGFibGVUYXJnZXRDb2wgYXMgYW55KT8ubmFtZTtcblxuXHRcdFx0c1RhYmxlVGFyZ2V0Q29sTmFtZSA9IChvVGFibGUgYXMgYW55KVxuXHRcdFx0XHQuZ2V0Q29sdW1ucygpXG5cdFx0XHRcdC5maW5kKGZ1bmN0aW9uIChvQ29sdW1uOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHkgPT09IG9Db2x1bW4uZ2V0RGF0YVByb3BlcnR5KCk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5nZXRIZWFkZXIoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0LyogSWYgdGhlIHRhcmdldCBjb2x1bW4gaXMgbm90IGZvdW5kLCB3ZSBjaGVjayBmb3IgYSBmaWVsZCBncm91cCAqL1xuXHRcdFx0Y29uc3QgYUNvbHVtbnMgPSAob1RhYmxlIGFzIFRhYmxlKS5nZXRDb250cm9sRGVsZWdhdGUoKS5nZXRDb2x1bW5zRm9yKG9UYWJsZSk7XG5cdFx0XHRvVGFibGVUYXJnZXRDb2wgPSBhQ29sdW1ucy5maW5kKGZ1bmN0aW9uIChvQ29sdW1uOiBhbnkpIHtcblx0XHRcdFx0aWYgKG9Db2x1bW4ua2V5LmluZGV4T2YoXCI6OkZpZWxkR3JvdXA6OlwiKSAhPT0gLTEpIHtcblx0XHRcdFx0XHRyZXR1cm4gb0NvbHVtbi5wcm9wZXJ0eUluZm9zPy5maW5kKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBhQ29sdW1ucy5maW5kKGZ1bmN0aW9uICh0YWJsZUNvbHVtbjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0YWJsZUNvbHVtbi5yZWxhdGl2ZVBhdGggPT09IHNUYWJsZVRhcmdldENvbFByb3BlcnR5O1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0LyogY2hlY2sgaWYgdGhlIGNvbHVtbiB3aXRoIHRoZSBmaWVsZCBncm91cCBpcyB2aXNpYmxlIGluIHRoZSB0YWJsZTogKi9cblx0XHRcdGxldCBiSXNUYWJsZVRhcmdldENvbFZpc2libGUgPSBmYWxzZTtcblx0XHRcdGlmIChvVGFibGVUYXJnZXRDb2wgJiYgKG9UYWJsZVRhcmdldENvbCBhcyBhbnkpLmxhYmVsKSB7XG5cdFx0XHRcdGJJc1RhYmxlVGFyZ2V0Q29sVmlzaWJsZSA9IChvVGFibGUgYXMgVGFibGUpLmdldENvbHVtbnMoKS5zb21lKGZ1bmN0aW9uIChjb2x1bW46IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBjb2x1bW4uZ2V0SGVhZGVyKCkgPT09IChvVGFibGVUYXJnZXRDb2wgYXMgYW55KS5sYWJlbDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRzVGFibGVUYXJnZXRDb2xOYW1lID0gYklzVGFibGVUYXJnZXRDb2xWaXNpYmxlICYmIChvVGFibGVUYXJnZXRDb2wgYXMgYW55KS5sYWJlbDtcblx0XHRcdHNUYWJsZVRhcmdldENvbFByb3BlcnR5ID0gYklzVGFibGVUYXJnZXRDb2xWaXNpYmxlICYmIChvVGFibGVUYXJnZXRDb2wgYXMgYW55KS5rZXk7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHNUYWJsZVRhcmdldENvbE5hbWUgPSBvVGFibGVUYXJnZXRDb2wgJiYgb1RhYmxlVGFyZ2V0Q29sLmdldEhlYWRlcigpO1xuXHR9XG5cdHJldHVybiB7IHNUYWJsZVRhcmdldENvbE5hbWU6IHNUYWJsZVRhcmdldENvbE5hbWUsIHNUYWJsZVRhcmdldENvbFByb3BlcnR5OiBzVGFibGVUYXJnZXRDb2xQcm9wZXJ0eSB9O1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgVGFibGUgYW5kIGNvbHVtbiBpbmZvIGlmIGFueSBvZiBpdCBtYXRjaGVzIHRoZSB0YXJnZXQgZnJvbSBNZXNzYWdlLlxuICpcbiAqIEBwYXJhbSBvVGFibGVcbiAqIEBwYXJhbSBvTWVzc2FnZU9iamVjdFxuICogQHBhcmFtIG9FbGVtZW50XG4gKiBAcGFyYW0gb1Jvd0JpbmRpbmdcbiAqIEByZXR1cm5zIFRhYmxlIGluZm8gbWF0Y2hpbmcgdGhlIG1lc3NhZ2UgdGFyZ2V0LlxuICovXG5mdW5jdGlvbiBnZXRUYWJsZUFuZFRhcmdldEluZm8ob1RhYmxlOiBUYWJsZSwgb01lc3NhZ2VPYmplY3Q6IE1lc3NhZ2VXaXRoSGVhZGVyLCBvRWxlbWVudDogYW55LCBvUm93QmluZGluZzogQmluZGluZyk6IFRhcmdldFRhYmxlSW5mb1R5cGUge1xuXHRjb25zdCBvVGFyZ2V0VGFibGVJbmZvOiBhbnkgPSB7fTtcblx0b1RhcmdldFRhYmxlSW5mby5zVGFibGVUYXJnZXRDb2xQcm9wZXJ0eSA9IGdldFRhYmxlQ29sUHJvcGVydHkob1RhYmxlLCBvTWVzc2FnZU9iamVjdCk7XG5cdGNvbnN0IG9UYWJsZUNvbEluZm8gPSBnZXRUYWJsZUNvbEluZm8ob1RhYmxlLCBvVGFyZ2V0VGFibGVJbmZvLnNUYWJsZVRhcmdldENvbFByb3BlcnR5KTtcblx0b1RhcmdldFRhYmxlSW5mby5vVGFibGVSb3dCaW5kaW5nQ29udGV4dHMgPSBvRWxlbWVudC5pc0EoXCJzYXAudWkudGFibGUuVGFibGVcIilcblx0XHQ/IChvUm93QmluZGluZyBhcyBPRGF0YUxpc3RCaW5kaW5nKS5nZXRDb250ZXh0cygpXG5cdFx0OiAob1Jvd0JpbmRpbmcgYXMgT0RhdGFMaXN0QmluZGluZykuZ2V0Q3VycmVudENvbnRleHRzKCk7XG5cdG9UYXJnZXRUYWJsZUluZm8uc1RhYmxlVGFyZ2V0Q29sTmFtZSA9IG9UYWJsZUNvbEluZm8uc1RhYmxlVGFyZ2V0Q29sTmFtZTtcblx0b1RhcmdldFRhYmxlSW5mby5zVGFibGVUYXJnZXRDb2xQcm9wZXJ0eSA9IG9UYWJsZUNvbEluZm8uc1RhYmxlVGFyZ2V0Q29sUHJvcGVydHk7XG5cdG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93Q29udGV4dCA9IG9UYXJnZXRUYWJsZUluZm8ub1RhYmxlUm93QmluZGluZ0NvbnRleHRzLmZpbmQoZnVuY3Rpb24gKHJvd0NvbnRleHQ6IGFueSkge1xuXHRcdHJldHVybiByb3dDb250ZXh0ICYmIG9NZXNzYWdlT2JqZWN0LmdldFRhcmdldHMoKVswXS5pbmRleE9mKHJvd0NvbnRleHQuZ2V0UGF0aCgpKSA9PT0gMDtcblx0fSk7XG5cdHJldHVybiBvVGFyZ2V0VGFibGVJbmZvO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gYUNvbnRyb2xJZHNcbiAqIEBwYXJhbSBvSXRlbVxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgaXRlbSBtYXRjaGVzIG9uZSBvZiB0aGUgY29udHJvbHNcbiAqL1xuZnVuY3Rpb24gZm5GaWx0ZXJVcG9uSWRzKGFDb250cm9sSWRzOiBzdHJpbmdbXSwgb0l0ZW06IFVJNUVsZW1lbnQpOiBib29sZWFuIHtcblx0cmV0dXJuIGFDb250cm9sSWRzLnNvbWUoZnVuY3Rpb24gKHNDb250cm9sSWQpIHtcblx0XHRpZiAoc0NvbnRyb2xJZCA9PT0gb0l0ZW0uZ2V0SWQoKSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBnaXZlcyB0aGUgZ3JvdXAgbmFtZSBoYXZpbmcgc2VjdGlvbiBhbmQgc3Vic2VjdGlvbiBkYXRhLlxuICpcbiAqIEBwYXJhbSBzZWN0aW9uXG4gKiBAcGFyYW0gc3ViU2VjdGlvblxuICogQHBhcmFtIGJNdWx0aXBsZVN1YlNlY3Rpb25zXG4gKiBAcGFyYW0gb1RhcmdldFRhYmxlSW5mb1xuICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZVxuICogQHJldHVybnMgR3JvdXAgbmFtZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlU2VjdGlvbkdyb3VwTmFtZShcblx0c2VjdGlvbjogT2JqZWN0UGFnZVNlY3Rpb24sXG5cdHN1YlNlY3Rpb246IE9iamVjdFBhZ2VTdWJTZWN0aW9uLFxuXHRiTXVsdGlwbGVTdWJTZWN0aW9uczogYm9vbGVhbixcblx0b1RhcmdldFRhYmxlSW5mbzogVGFyZ2V0VGFibGVJbmZvVHlwZSxcblx0b1Jlc291cmNlQnVuZGxlOiBSZXNvdXJjZUJ1bmRsZVxuKTogc3RyaW5nIHtcblx0cmV0dXJuIChcblx0XHRzZWN0aW9uLmdldFRpdGxlKCkgK1xuXHRcdChzdWJTZWN0aW9uLmdldFRpdGxlKCkgJiYgYk11bHRpcGxlU3ViU2VjdGlvbnMgPyBgLCAke3N1YlNlY3Rpb24uZ2V0VGl0bGUoKX1gIDogXCJcIikgK1xuXHRcdChvVGFyZ2V0VGFibGVJbmZvID8gYCwgJHtvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIlRfTUVTU0FHRV9HUk9VUF9USVRMRV9UQUJMRV9ERU5PTUlOQVRPUlwiKX06ICR7b1RhcmdldFRhYmxlSW5mby50YWJsZUhlYWRlcn1gIDogXCJcIilcblx0KTtcbn1cblxuZnVuY3Rpb24gYklzT3JwaGFuRWxlbWVudChvRWxlbWVudDogVUk1RWxlbWVudCwgYUVsZW1lbnRzOiBVSTVFbGVtZW50W10pOiBib29sZWFuIHtcblx0cmV0dXJuICFhRWxlbWVudHMuc29tZShmdW5jdGlvbiAob0VsZW06IGFueSkge1xuXHRcdGxldCBvUGFyZW50RWxlbWVudCA9IG9FbGVtZW50LmdldFBhcmVudCgpO1xuXHRcdHdoaWxlIChvUGFyZW50RWxlbWVudCAmJiBvUGFyZW50RWxlbWVudCAhPT0gb0VsZW0pIHtcblx0XHRcdG9QYXJlbnRFbGVtZW50ID0gb1BhcmVudEVsZW1lbnQuZ2V0UGFyZW50KCk7XG5cdFx0fVxuXHRcdHJldHVybiBvUGFyZW50RWxlbWVudCA/IHRydWUgOiBmYWxzZTtcblx0fSk7XG59XG5cbi8qKlxuICogU3RhdGljIGZ1bmN0aW9ucyBmb3IgRmlvcmkgTWVzc2FnZSBIYW5kbGluZ1xuICpcbiAqIEBuYW1lc3BhY2VcbiAqIEBhbGlhcyBzYXAuZmUuY29yZS5hY3Rpb25zLm1lc3NhZ2VIYW5kbGluZ1xuICogQHByaXZhdGVcbiAqIEBleHBlcmltZW50YWwgVGhpcyBtb2R1bGUgaXMgb25seSBmb3IgZXhwZXJpbWVudGFsIHVzZSEgPGJyLz48Yj5UaGlzIGlzIG9ubHkgYSBQT0MgYW5kIG1heWJlIGRlbGV0ZWQ8L2I+XG4gKiBAc2luY2UgMS41Ni4wXG4gKi9cbmNvbnN0IG1lc3NhZ2VIYW5kbGluZzogbWVzc2FnZUhhbmRsaW5nVHlwZSA9IHtcblx0Z2V0TWVzc2FnZXM6IGdldE1lc3NhZ2VzLFxuXHRzaG93VW5ib3VuZE1lc3NhZ2VzOiBzaG93VW5ib3VuZE1lc3NhZ2VzLFxuXHRyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzOiByZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzLFxuXHRyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlczogcmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMsXG5cdG1vZGlmeUVUYWdNZXNzYWdlc09ubHk6IGZuTW9kaWZ5RVRhZ01lc3NhZ2VzT25seSxcblx0Z2V0UmV0cnlBZnRlck1lc3NhZ2U6IGdldFJldHJ5QWZ0ZXJNZXNzYWdlLFxuXHRwcmVwYXJlTWVzc2FnZVZpZXdGb3JEaWFsb2c6IHByZXBhcmVNZXNzYWdlVmlld0ZvckRpYWxvZyxcblx0c2V0TWVzc2FnZVN1YnRpdGxlOiBzZXRNZXNzYWdlU3VidGl0bGUsXG5cdGdldFZpc2libGVTZWN0aW9uc0Zyb21PYmplY3RQYWdlTGF5b3V0OiBnZXRWaXNpYmxlU2VjdGlvbnNGcm9tT2JqZWN0UGFnZUxheW91dCxcblx0Z2V0Q29udHJvbEZyb21NZXNzYWdlUmVsYXRpbmdUb1N1YlNlY3Rpb246IGdldENvbnRyb2xGcm9tTWVzc2FnZVJlbGF0aW5nVG9TdWJTZWN0aW9uLFxuXHRmbkZpbHRlclVwb25JZHM6IGZuRmlsdGVyVXBvbklkcyxcblx0Z2V0VGFibGVBbmRUYXJnZXRJbmZvOiBnZXRUYWJsZUFuZFRhcmdldEluZm8sXG5cdGNyZWF0ZVNlY3Rpb25Hcm91cE5hbWU6IGNyZWF0ZVNlY3Rpb25Hcm91cE5hbWUsXG5cdGJJc09ycGhhbkVsZW1lbnQ6IGJJc09ycGhhbkVsZW1lbnQsXG5cdGdldExhc3RBY3Rpb25UZXh0QW5kQWN0aW9uTmFtZTogZ2V0TGFzdEFjdGlvblRleHRBbmRBY3Rpb25OYW1lLFxuXHRnZXRUYWJsZUNvbHVtbkRhdGFBbmRTZXRTdWJ0aWxlOiBnZXRUYWJsZUNvbHVtbkRhdGFBbmRTZXRTdWJ0aWxlLFxuXHRnZXRUYWJsZUNvbEluZm86IGdldFRhYmxlQ29sSW5mbyxcblx0Z2V0VGFibGVDb2xQcm9wZXJ0eTogZ2V0VGFibGVDb2xQcm9wZXJ0eSxcblx0Z2V0TWVzc2FnZVN1YnRpdGxlOiBnZXRNZXNzYWdlU3VidGl0bGUsXG5cdGRldGVybWluZUNvbHVtbkluZm86IGRldGVybWluZUNvbHVtbkluZm8sXG5cdGZldGNoQ29sdW1uSW5mbzogZmV0Y2hDb2x1bW5JbmZvLFxuXHRnZXRUYWJsZUZpcnN0Q29sQmluZGluZ0NvbnRleHRGb3JUZXh0QW5ub3RhdGlvbjogZ2V0VGFibGVGaXJzdENvbEJpbmRpbmdDb250ZXh0Rm9yVGV4dEFubm90YXRpb24sXG5cdGdldE1lc3NhZ2VSYW5rOiBnZXRNZXNzYWdlUmFuayxcblx0Zm5DYWxsYmFja1NldEdyb3VwTmFtZTogZm5DYWxsYmFja1NldEdyb3VwTmFtZSxcblx0Z2V0VGFibGVGaXJzdENvbFZhbHVlOiBnZXRUYWJsZUZpcnN0Q29sVmFsdWUsXG5cdHNldEdyb3VwTmFtZU9QRGlzcGxheU1vZGU6IHNldEdyb3VwTmFtZU9QRGlzcGxheU1vZGUsXG5cdHVwZGF0ZU1lc3NhZ2VPYmplY3RHcm91cE5hbWU6IHVwZGF0ZU1lc3NhZ2VPYmplY3RHcm91cE5hbWUsXG5cdHNldEdyb3VwTmFtZUxSVGFibGU6IHNldEdyb3VwTmFtZUxSVGFibGUsXG5cdGlzQ29udHJvbEluVGFibGU6IGlzQ29udHJvbEluVGFibGUsXG5cdGlzQ29udHJvbFBhcnRPZkNyZWF0aW9uUm93OiBpc0NvbnRyb2xQYXJ0T2ZDcmVhdGlvblJvd1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbWVzc2FnZUhhbmRsaW5nO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7O0VBZ0NBLElBQU1BLFdBQVcsR0FBR0MsT0FBTyxDQUFDRCxXQUFXO0VBQ3ZDLElBQUlF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
|