@sapui5/sap.fe.core 1.97.0 → 1.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +7 -4
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AnnotationHelper.js +309 -405
- package/src/sap/fe/core/AnnotationHelper.ts +315 -0
- package/src/sap/fe/core/AppComponent.js +389 -397
- package/src/sap/fe/core/AppComponent.ts +403 -0
- package/src/sap/fe/core/AppStateHandler.js +198 -181
- package/src/sap/fe/core/AppStateHandler.ts +171 -0
- package/src/sap/fe/core/BaseController.js +83 -58
- package/src/sap/fe/core/BaseController.ts +68 -0
- package/src/sap/fe/core/BusyLocker.js +105 -121
- package/src/sap/fe/core/BusyLocker.ts +98 -0
- package/src/sap/fe/core/CommonUtils.js +2164 -2379
- package/src/sap/fe/core/CommonUtils.ts +2177 -0
- package/src/sap/fe/core/ExtensionAPI.js +279 -266
- package/src/sap/fe/core/ExtensionAPI.ts +250 -0
- package/src/sap/fe/core/PageController.js +218 -125
- package/src/sap/fe/core/PageController.ts +129 -0
- package/src/sap/fe/core/RouterProxy.js +924 -807
- package/src/sap/fe/core/RouterProxy.ts +840 -0
- package/src/sap/fe/core/Synchronization.js +41 -35
- package/src/sap/fe/core/Synchronization.ts +29 -0
- package/src/sap/fe/core/TemplateComponent.js +173 -155
- package/src/sap/fe/core/TemplateComponent.ts +173 -0
- package/src/sap/fe/core/TemplateModel.js +79 -54
- package/src/sap/fe/core/TemplateModel.ts +63 -0
- package/src/sap/fe/core/TransactionHelper.js +1560 -1579
- package/src/sap/fe/core/TransactionHelper.ts +1717 -0
- package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
- package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
- package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
- package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
- package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
- package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
- package/src/sap/fe/core/actions/draft.js +521 -581
- package/src/sap/fe/core/actions/draft.ts +566 -0
- package/src/sap/fe/core/actions/messageHandling.js +564 -511
- package/src/sap/fe/core/actions/messageHandling.ts +552 -0
- package/src/sap/fe/core/actions/nonDraft.js +17 -19
- package/src/sap/fe/core/actions/nonDraft.ts +12 -0
- package/src/sap/fe/core/actions/operations.js +1093 -1211
- package/src/sap/fe/core/actions/operations.ts +1192 -0
- package/src/sap/fe/core/actions/sticky.js +114 -104
- package/src/sap/fe/core/actions/sticky.ts +119 -0
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +70 -66
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
- package/src/sap/fe/core/controllerextensions/EditFlow.js +1594 -1701
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +80 -54
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +719 -505
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +797 -813
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +1005 -973
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +530 -476
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +137 -46
- package/src/sap/fe/core/controllerextensions/MassEdit.js +144 -0
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +234 -232
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
- package/src/sap/fe/core/controllerextensions/PageReady.js +302 -337
- package/src/sap/fe/core/controllerextensions/PageReady.ts +23 -17
- package/src/sap/fe/core/controllerextensions/Paginator.js +189 -148
- package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
- package/src/sap/fe/core/controllerextensions/Placeholder.js +158 -146
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
- package/src/sap/fe/core/controllerextensions/Routing.js +145 -106
- package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +8 -6
- package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
- package/src/sap/fe/core/controllerextensions/Share.js +220 -244
- package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
- package/src/sap/fe/core/controllerextensions/SideEffects.js +593 -634
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +29 -27
- package/src/sap/fe/core/controllerextensions/ViewState.js +789 -806
- package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +4 -3
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
- package/src/sap/fe/core/controls/CommandExecution.js +68 -66
- package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
- package/src/sap/fe/core/controls/ConditionalWrapper.js +91 -75
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +131 -125
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +105 -110
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
- package/src/sap/fe/core/controls/FieldWrapper.js +122 -140
- package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
- package/src/sap/fe/core/controls/FilterBar.js +163 -159
- package/src/sap/fe/core/controls/FilterBar.ts +143 -0
- package/src/sap/fe/core/controls/FormElementWrapper.js +46 -44
- package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +38 -42
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +127 -116
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +242 -255
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +151 -141
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +336 -322
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
- package/src/sap/fe/core/converters/ConverterContext.js +348 -367
- package/src/sap/fe/core/converters/ConverterContext.ts +33 -19
- package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +16 -1
- package/src/sap/fe/core/converters/ManifestWrapper.js +354 -354
- package/src/sap/fe/core/converters/ManifestWrapper.ts +34 -6
- package/src/sap/fe/core/converters/MetaModelConverter.js +72 -9
- package/src/sap/fe/core/converters/MetaModelConverter.ts +75 -16
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +4 -3
- package/src/sap/fe/core/converters/annotations/DataField.js +28 -14
- package/src/sap/fe/core/converters/annotations/DataField.ts +38 -14
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +33 -21
- package/src/sap/fe/core/converters/controls/Common/Action.js +11 -2
- package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -2
- package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
- package/src/sap/fe/core/converters/controls/Common/Form.js +21 -11
- package/src/sap/fe/core/converters/controls/Common/Form.ts +28 -6
- package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +75 -2
- package/src/sap/fe/core/converters/controls/Common/Table.js +507 -408
- package/src/sap/fe/core/converters/controls/Common/Table.ts +618 -500
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +592 -0
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +718 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +465 -59
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +462 -72
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +24 -9
- package/src/sap/fe/core/converters/helpers/Aggregation.js +118 -121
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
- package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
- package/src/sap/fe/core/converters/helpers/Key.js +42 -57
- package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +28 -7
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +23 -6
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +20 -7
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -14
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +93 -90
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
- package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
- package/src/sap/fe/core/formatters/TableFormatter.js +91 -29
- package/src/sap/fe/core/formatters/TableFormatter.ts +94 -28
- package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
- package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
- package/src/sap/fe/core/fpm/Component.js +51 -54
- package/src/sap/fe/core/fpm/Component.ts +48 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.js +373 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +417 -0
- package/src/sap/fe/core/helpers/BindingExpression.js +489 -442
- package/src/sap/fe/core/helpers/BindingExpression.ts +486 -469
- package/src/sap/fe/core/helpers/ClassSupport.js +212 -76
- package/src/sap/fe/core/helpers/ClassSupport.ts +198 -71
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +64 -59
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +52 -0
- package/src/sap/fe/core/helpers/EditState.js +81 -84
- package/src/sap/fe/core/helpers/EditState.ts +81 -0
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
- package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
- package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +4 -5
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +10 -10
- package/src/sap/fe/core/helpers/MassEditHelper.js +604 -0
- package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +253 -225
- package/src/sap/fe/core/helpers/ModelHelper.ts +250 -0
- package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
- package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +336 -313
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +334 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
- package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
- package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
- package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
- package/src/sap/fe/core/library.js +427 -425
- package/src/sap/fe/core/library.support.js +23 -27
- package/src/sap/fe/core/library.support.ts +23 -0
- package/src/sap/fe/core/library.ts +420 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +64 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +69 -0
- package/src/sap/fe/core/messagebundle.properties +78 -13
- package/src/sap/fe/core/messagebundle_ar.properties +58 -7
- package/src/sap/fe/core/messagebundle_bg.properties +58 -7
- package/src/sap/fe/core/messagebundle_ca.properties +58 -7
- package/src/sap/fe/core/messagebundle_cs.properties +59 -8
- package/src/sap/fe/core/messagebundle_cy.properties +58 -7
- package/src/sap/fe/core/messagebundle_da.properties +58 -7
- package/src/sap/fe/core/messagebundle_de.properties +58 -7
- package/src/sap/fe/core/messagebundle_el.properties +58 -7
- package/src/sap/fe/core/messagebundle_en.properties +57 -6
- package/src/sap/fe/core/messagebundle_en_GB.properties +57 -6
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +61 -6
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +58 -7
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +58 -7
- package/src/sap/fe/core/messagebundle_es.properties +58 -7
- package/src/sap/fe/core/messagebundle_es_MX.properties +58 -7
- package/src/sap/fe/core/messagebundle_et.properties +58 -7
- package/src/sap/fe/core/messagebundle_fi.properties +60 -9
- package/src/sap/fe/core/messagebundle_fr.properties +64 -13
- package/src/sap/fe/core/messagebundle_fr_CA.properties +59 -8
- package/src/sap/fe/core/messagebundle_hi.properties +58 -7
- package/src/sap/fe/core/messagebundle_hr.properties +58 -7
- package/src/sap/fe/core/messagebundle_hu.properties +59 -8
- package/src/sap/fe/core/messagebundle_id.properties +61 -10
- package/src/sap/fe/core/messagebundle_it.properties +58 -7
- package/src/sap/fe/core/messagebundle_iw.properties +58 -7
- package/src/sap/fe/core/messagebundle_ja.properties +58 -7
- package/src/sap/fe/core/messagebundle_kk.properties +58 -7
- package/src/sap/fe/core/messagebundle_ko.properties +58 -7
- package/src/sap/fe/core/messagebundle_lt.properties +58 -7
- package/src/sap/fe/core/messagebundle_lv.properties +59 -8
- package/src/sap/fe/core/messagebundle_ms.properties +58 -7
- package/src/sap/fe/core/messagebundle_nl.properties +58 -7
- package/src/sap/fe/core/messagebundle_no.properties +58 -7
- package/src/sap/fe/core/messagebundle_pl.properties +58 -7
- package/src/sap/fe/core/messagebundle_pt.properties +59 -8
- package/src/sap/fe/core/messagebundle_pt_PT.properties +58 -7
- package/src/sap/fe/core/messagebundle_ro.properties +58 -7
- package/src/sap/fe/core/messagebundle_ru.properties +58 -7
- package/src/sap/fe/core/messagebundle_sh.properties +58 -7
- package/src/sap/fe/core/messagebundle_sk.properties +58 -7
- package/src/sap/fe/core/messagebundle_sl.properties +58 -7
- package/src/sap/fe/core/messagebundle_sv.properties +59 -8
- package/src/sap/fe/core/messagebundle_th.properties +58 -7
- package/src/sap/fe/core/messagebundle_tr.properties +60 -9
- package/src/sap/fe/core/messagebundle_uk.properties +58 -7
- package/src/sap/fe/core/messagebundle_vi.properties +58 -7
- package/src/sap/fe/core/messagebundle_zh_CN.properties +58 -7
- package/src/sap/fe/core/messagebundle_zh_TW.properties +58 -7
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +231 -202
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +67 -92
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +10 -6
- package/src/sap/fe/core/services/NavigationServiceFactory.js +351 -300
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +313 -0
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +114 -81
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +83 -0
- package/src/sap/fe/core/services/RoutingServiceFactory.js +927 -1152
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
- package/src/sap/fe/core/services/ShellServicesFactory.js +649 -707
- package/src/sap/fe/core/services/ShellServicesFactory.ts +52 -15
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +569 -637
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +78 -102
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +429 -478
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +460 -0
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
- package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
- package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
- package/src/sap/fe/core/support/CommonHelper.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.ts +1 -1
- package/src/sap/fe/core/support/Diagnostics.js +36 -48
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
- package/src/sap/fe/core/templating/DataModelPathHelper.js +97 -127
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +112 -135
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
- package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
- package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
- package/src/sap/fe/core/templating/FilterHelper.js +140 -78
- package/src/sap/fe/core/templating/FilterHelper.ts +149 -78
- package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
- package/src/sap/fe/core/templating/PropertyHelper.ts +2 -2
- package/src/sap/fe/core/templating/UIFormatters.js +76 -135
- package/src/sap/fe/core/templating/UIFormatters.ts +76 -99
- package/src/sap/fe/core/type/Email.js +1 -1
- package/src/sap/fe/core/type/Email.ts +4 -6
- package/ui5.yaml +0 -3
- package/src/sap/fe/core/controls/filterbar.d.js +0 -8
- package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
|
@@ -1,514 +1,567 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* SAPUI5
|
|
3
|
-
*
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
+
sap.ui.define(["sap/m/MessageToast", "sap/m/MessageItem", "sap/m/MessageView", "sap/m/Button", "sap/m/Dialog", "sap/m/Text", "sap/ui/core/library", "sap/ui/model/Filter", "sap/ui/model/FilterOperator", "sap/ui/core/message/Message", "sap/ui/core/IconPool", "sap/ui/model/json/JSONModel", "sap/ui/core/format/DateFormat", "sap/m/Bar", "sap/m/MessageBox", "sap/m/FormattedText"], function (MessageToast, MessageItem, MessageView, Button, Dialog, Text, CoreLib, Filter, FilterOperator, Message, IconPool, JSONModel, DateFormat, Bar, MessageBox, FormattedText) {
|
|
6
|
+
"use strict";
|
|
5
7
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
8
|
+
var MessageType = CoreLib.MessageType;
|
|
9
|
+
var aMessageList = [];
|
|
10
|
+
var aMessageDataList = [];
|
|
11
|
+
var aResolveFunctions = [];
|
|
12
|
+
var oDialog;
|
|
13
|
+
var oBackButton;
|
|
14
|
+
var oMessageTemplate;
|
|
15
|
+
var oMessageView;
|
|
16
|
+
|
|
17
|
+
function fnFormatTechnicalDetails() {
|
|
18
|
+
var sPreviousGroupName; // Insert technical detail if it exists
|
|
19
|
+
|
|
20
|
+
function insertDetail(oProperty) {
|
|
21
|
+
return oProperty.property ? "( ${" + oProperty.property + '} ? ("<p>' + oProperty.property.substr(Math.max(oProperty.property.lastIndexOf("/"), oProperty.property.lastIndexOf(".")) + 1) + ' : " + ' + "${" + oProperty.property + '} + "</p>") : "" )' : "";
|
|
22
|
+
} // Insert groupname if it exists
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
function insertGroupName(oProperty) {
|
|
26
|
+
var sHTML = "";
|
|
27
|
+
|
|
28
|
+
if (oProperty.groupName && oProperty.property && oProperty.groupName !== sPreviousGroupName) {
|
|
29
|
+
sHTML += "( ${" + oProperty.property + '} ? "<br><h3>' + oProperty.groupName + '</h3>" : "" ) + ';
|
|
30
|
+
sPreviousGroupName = oProperty.groupName;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return sHTML;
|
|
34
|
+
} // List of technical details to be shown
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
function getPaths() {
|
|
38
|
+
var sTD = "technicalDetails"; // name of property in message model data for technical details
|
|
39
|
+
|
|
40
|
+
return [{
|
|
41
|
+
"groupName": "",
|
|
42
|
+
"property": sTD + "/status"
|
|
43
|
+
}, {
|
|
44
|
+
"groupName": "",
|
|
45
|
+
"property": sTD + "/statusText"
|
|
46
|
+
}, {
|
|
47
|
+
"groupName": "Application",
|
|
48
|
+
"property": sTD + "/error/@SAP__common.Application/ComponentId"
|
|
49
|
+
}, {
|
|
50
|
+
"groupName": "Application",
|
|
51
|
+
"property": sTD + "/error/@SAP__common.Application/ServiceId"
|
|
52
|
+
}, {
|
|
53
|
+
"groupName": "Application",
|
|
54
|
+
"property": sTD + "/error/@SAP__common.Application/ServiceRepository"
|
|
55
|
+
}, {
|
|
56
|
+
"groupName": "Application",
|
|
57
|
+
"property": sTD + "/error/@SAP__common.Application/ServiceVersion"
|
|
58
|
+
}, {
|
|
59
|
+
"groupName": "ErrorResolution",
|
|
60
|
+
"property": sTD + "/error/@SAP__common.ErrorResolution/Analysis"
|
|
61
|
+
}, {
|
|
62
|
+
"groupName": "ErrorResolution",
|
|
63
|
+
"property": sTD + "/error/@SAP__common.ErrorResolution/Note"
|
|
64
|
+
}, {
|
|
65
|
+
"groupName": "ErrorResolution",
|
|
66
|
+
"property": sTD + "/error/@SAP__common.ErrorResolution/DetailedNote"
|
|
67
|
+
}, {
|
|
68
|
+
"groupName": "ErrorResolution",
|
|
69
|
+
"property": sTD + "/error/@SAP__common.ExceptionCategory"
|
|
70
|
+
}, {
|
|
71
|
+
"groupName": "ErrorResolution",
|
|
72
|
+
"property": sTD + "/error/@SAP__common.TimeStamp"
|
|
73
|
+
}, {
|
|
74
|
+
"groupName": "ErrorResolution",
|
|
75
|
+
"property": sTD + "/error/@SAP__common.TransactionId"
|
|
76
|
+
}, {
|
|
77
|
+
"groupName": "Messages",
|
|
78
|
+
"property": sTD + "/error/code"
|
|
79
|
+
}, {
|
|
80
|
+
"groupName": "Messages",
|
|
81
|
+
"property": sTD + "/error/message"
|
|
82
|
+
}];
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
var sHTML = "Object.keys(" + "${technicalDetails}" + ').length > 0 ? "<h2>Technical Details</h2>" : "" ';
|
|
86
|
+
getPaths().forEach(function (oProperty) {
|
|
87
|
+
sHTML = sHTML + insertGroupName(oProperty) + "" + insertDetail(oProperty) + " + ";
|
|
88
|
+
});
|
|
89
|
+
return sHTML;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function fnFormatDescription() {
|
|
93
|
+
var sHTML = "(${" + 'description} ? ("<h2>Description</h2>" + ${' + 'description}) : "")';
|
|
94
|
+
return sHTML;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Calculates the highest priority message type(Error/Warning/Success/Information) from the available messages.
|
|
98
|
+
|
|
99
|
+
* @function
|
|
100
|
+
* @name sap.fe.core.actions.messageHandling.fnGetHighestMessagePriority
|
|
101
|
+
* @memberof sap.fe.core.actions.messageHandling
|
|
102
|
+
* @param {Array} [aMessages] Messages list
|
|
103
|
+
* @returns {string} Highest priority message from the available messages
|
|
104
|
+
* @private
|
|
105
|
+
* @ui5-restricted
|
|
106
|
+
*/
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
function fnGetHighestMessagePriority(aMessages) {
|
|
110
|
+
var sMessagePriority = MessageType.None;
|
|
111
|
+
var iLength = aMessages.length;
|
|
112
|
+
var oMessageCount = {
|
|
113
|
+
Error: 0,
|
|
114
|
+
Warning: 0,
|
|
115
|
+
Success: 0,
|
|
116
|
+
Information: 0
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
for (var i = 0; i < iLength; i++) {
|
|
120
|
+
++oMessageCount[aMessages[i].getType()];
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (oMessageCount[MessageType.Error] > 0) {
|
|
124
|
+
sMessagePriority = MessageType.Error;
|
|
125
|
+
} else if (oMessageCount[MessageType.Warning] > 0) {
|
|
126
|
+
sMessagePriority = MessageType.Warning;
|
|
127
|
+
} else if (oMessageCount[MessageType.Success] > 0) {
|
|
128
|
+
sMessagePriority = MessageType.Success;
|
|
129
|
+
} else if (oMessageCount[MessageType.Information] > 0) {
|
|
130
|
+
sMessagePriority = MessageType.Information;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return sMessagePriority;
|
|
134
|
+
} // function which modify e-Tag messages only.
|
|
135
|
+
// returns : true, if any e-Tag message is modified, otherwise false.
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
function fnModifyETagMessagesOnly(oMessageManager, oResourceBundle) {
|
|
139
|
+
var aMessages = oMessageManager.getMessageModel().getObject("/");
|
|
140
|
+
var bMessagesModified = false;
|
|
141
|
+
var sEtagMessage = "";
|
|
142
|
+
aMessages.forEach(function (oMessage, i) {
|
|
143
|
+
var oTechnicalDetails = oMessage.getTechnicalDetails();
|
|
144
|
+
|
|
145
|
+
if (oTechnicalDetails && oTechnicalDetails.httpStatus === 412) {
|
|
146
|
+
sEtagMessage = sEtagMessage || oResourceBundle.getText("C_APP_COMPONENT_SAPFE_ETAG_TECHNICAL_ISSUES");
|
|
147
|
+
oMessageManager.removeMessages(aMessages[i]);
|
|
148
|
+
oMessage.setMessage(sEtagMessage);
|
|
149
|
+
oMessage.target = "";
|
|
150
|
+
oMessageManager.addMessages(oMessage);
|
|
151
|
+
bMessagesModified = true;
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
return bMessagesModified;
|
|
155
|
+
} // Dialog close Handling
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
function dialogCloseHandler() {
|
|
159
|
+
oDialog.close();
|
|
160
|
+
oBackButton.setVisible(false);
|
|
161
|
+
aMessageList = [];
|
|
162
|
+
removeUnboundTransitionMessages();
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function getRetryAfterMessage(oMessage, bMessageDialog) {
|
|
166
|
+
var dNow = new Date();
|
|
167
|
+
var oTechnicalDetails = oMessage.getTechnicalDetails();
|
|
168
|
+
var oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
|
|
169
|
+
var sRetryAfterMessage;
|
|
170
|
+
|
|
171
|
+
if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && oTechnicalDetails.retryAfter) {
|
|
172
|
+
var dRetryAfter = oTechnicalDetails.retryAfter;
|
|
173
|
+
var oDateFormat;
|
|
174
|
+
|
|
175
|
+
if (dNow.getFullYear() !== dRetryAfter.getFullYear()) {
|
|
176
|
+
//different years
|
|
177
|
+
oDateFormat = DateFormat.getDateTimeInstance({
|
|
178
|
+
pattern: "MMMM dd, yyyy 'at' hh:mm a"
|
|
179
|
+
});
|
|
180
|
+
sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR", [oDateFormat.format(dRetryAfter)]);
|
|
181
|
+
} else if (dNow.getFullYear() == dRetryAfter.getFullYear()) {
|
|
182
|
+
//same year
|
|
183
|
+
if (bMessageDialog) {
|
|
184
|
+
//less than 2 min
|
|
185
|
+
sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_TITLE") + " " + oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_DESC");
|
|
186
|
+
} else if (dNow.getMonth() !== dRetryAfter.getMonth() || dNow.getDate() !== dRetryAfter.getDate()) {
|
|
187
|
+
oDateFormat = DateFormat.getDateTimeInstance({
|
|
188
|
+
pattern: "MMMM dd 'at' hh:mm a"
|
|
189
|
+
}); //different months or different days of same month
|
|
190
|
+
|
|
191
|
+
sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR", [oDateFormat.format(dRetryAfter)]);
|
|
192
|
+
} else {
|
|
193
|
+
//same day
|
|
194
|
+
oDateFormat = DateFormat.getDateTimeInstance({
|
|
195
|
+
pattern: "hh:mm a"
|
|
196
|
+
});
|
|
197
|
+
sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR_DAY", [oDateFormat.format(dRetryAfter)]);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if (oTechnicalDetails && oTechnicalDetails.httpStatus === 503 && !oTechnicalDetails.retryAfter) {
|
|
203
|
+
sRetryAfterMessage = oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_ERROR_NO_RETRY_AFTER");
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return sRetryAfterMessage;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function prepareMessageViewForDialog(oMessageDialogModel, bStrictHandlingFlow) {
|
|
210
|
+
if (!bStrictHandlingFlow) {
|
|
211
|
+
oMessageTemplate = oMessageTemplate || new MessageItem(undefined, {
|
|
212
|
+
counter: {
|
|
213
|
+
path: "counter"
|
|
214
|
+
},
|
|
215
|
+
title: "{message}",
|
|
216
|
+
subtitle: "{additionalText}",
|
|
217
|
+
longtextUrl: "{descriptionUrl}",
|
|
218
|
+
type: {
|
|
219
|
+
path: "type"
|
|
220
|
+
},
|
|
221
|
+
description: "{= ${" + "description} || ${technicalDetails} ? " + '"<html><body>" + ' + fnFormatDescription() + " + " + fnFormatTechnicalDetails() + '"</body></html>"' + ' : "" }',
|
|
222
|
+
markupDescription: true
|
|
223
|
+
});
|
|
224
|
+
} else {
|
|
225
|
+
oMessageTemplate = new MessageItem({
|
|
226
|
+
title: "{message}",
|
|
227
|
+
type: "Warning",
|
|
228
|
+
longtextUrl: "{descriptionUrl}"
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
oMessageView = oMessageView || new MessageView({
|
|
233
|
+
showDetailsPageHeader: false,
|
|
234
|
+
itemSelect: function () {
|
|
235
|
+
oBackButton.setVisible(true);
|
|
236
|
+
},
|
|
237
|
+
items: {
|
|
238
|
+
path: "/",
|
|
239
|
+
template: oMessageTemplate
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
oBackButton = oBackButton || new Button({
|
|
243
|
+
icon: IconPool.getIconURI("nav-back"),
|
|
244
|
+
visible: false,
|
|
245
|
+
press: function () {
|
|
246
|
+
oMessageView.navigateBack();
|
|
247
|
+
this.setVisible(false);
|
|
248
|
+
}
|
|
249
|
+
}); // Update proper ETag Mismatch error
|
|
250
|
+
|
|
251
|
+
oMessageView.setModel(oMessageDialogModel);
|
|
252
|
+
return {
|
|
253
|
+
oMessageView: oMessageView,
|
|
254
|
+
oBackButton: oBackButton
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function showUnboundMessages(aCustomMessages, oContext, bHasEtagMessage, bShowBoundTransition) {
|
|
259
|
+
var aUnboundMessages = this.getMessages();
|
|
260
|
+
var oMessageManager = sap.ui.getCore().getMessageManager();
|
|
261
|
+
var sHighestPriority;
|
|
262
|
+
var sHighestPriorityText;
|
|
263
|
+
var aFilters = [new Filter({
|
|
264
|
+
path: "code",
|
|
265
|
+
operator: FilterOperator.NE,
|
|
266
|
+
value1: null
|
|
267
|
+
}), new Filter({
|
|
268
|
+
path: "persistent",
|
|
269
|
+
operator: FilterOperator.NE,
|
|
270
|
+
value1: false
|
|
271
|
+
})];
|
|
272
|
+
var showMessageDialog = false,
|
|
273
|
+
showMessageBox = false;
|
|
274
|
+
|
|
275
|
+
if (bShowBoundTransition) {
|
|
276
|
+
aUnboundMessages = aUnboundMessages.concat(getMessages(true, true)); // we only want to show bound transition messages not bound state messages hence add a filter for the same
|
|
277
|
+
|
|
278
|
+
aFilters.push(new Filter({
|
|
279
|
+
path: "persistent",
|
|
280
|
+
operator: FilterOperator.EQ,
|
|
281
|
+
value1: true
|
|
282
|
+
}));
|
|
283
|
+
|
|
284
|
+
var fnCheckControlIdInDialog = function (aControlIds) {
|
|
285
|
+
var index = Infinity,
|
|
286
|
+
oControl = sap.ui.getCore().byId(aControlIds[0]);
|
|
287
|
+
var errorFieldControl = sap.ui.getCore().byId(aControlIds[0]);
|
|
288
|
+
|
|
289
|
+
while (oControl) {
|
|
290
|
+
var fieldRankinDialog = oControl instanceof Dialog ? errorFieldControl.getParent().findElements(true).indexOf(errorFieldControl) : Infinity;
|
|
291
|
+
|
|
292
|
+
if (oControl instanceof Dialog) {
|
|
293
|
+
if (index > fieldRankinDialog) {
|
|
294
|
+
index = fieldRankinDialog; // Set the focus to the dialog's control
|
|
295
|
+
|
|
296
|
+
errorFieldControl.focus();
|
|
297
|
+
} // messages with target inside sap.m.Dialog should not bring up the message dialog
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
oControl = oControl.getParent();
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
return true;
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
aFilters.push(new Filter({
|
|
310
|
+
path: "controlIds",
|
|
311
|
+
test: fnCheckControlIdInDialog,
|
|
312
|
+
caseSensitive: true
|
|
313
|
+
}));
|
|
314
|
+
} else {
|
|
315
|
+
// only unbound messages have to be shown so add filter accordingly
|
|
316
|
+
aFilters.push(new Filter({
|
|
317
|
+
path: "target",
|
|
318
|
+
operator: FilterOperator.EQ,
|
|
319
|
+
value1: ""
|
|
320
|
+
}));
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
if (aCustomMessages && aCustomMessages.length) {
|
|
324
|
+
aCustomMessages.forEach(function (oMessage) {
|
|
325
|
+
var messageCode = oMessage.code ? oMessage.code : "";
|
|
326
|
+
oMessageManager.addMessages(new Message({
|
|
327
|
+
message: oMessage.text,
|
|
328
|
+
type: oMessage.type,
|
|
329
|
+
target: "",
|
|
330
|
+
persistent: true,
|
|
331
|
+
code: messageCode
|
|
332
|
+
})); //The target and persistent properties of the message are hardcoded as "" and true because the function deals with only unbound messages.
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
var oMessageDialogModel = new JSONModel();
|
|
337
|
+
|
|
338
|
+
if (aUnboundMessages.length === 1 && aUnboundMessages[0].getCode() === "503") {
|
|
339
|
+
showMessageBox = true;
|
|
340
|
+
} else {
|
|
341
|
+
var oListBinding = oMessageManager.getMessageModel().bindList("/", undefined, undefined, aFilters),
|
|
342
|
+
aCurrentContexts = oListBinding.getCurrentContexts();
|
|
343
|
+
|
|
344
|
+
if (aCurrentContexts && aCurrentContexts.length > 0) {
|
|
345
|
+
// Don't show dialog incase there are no errors to show
|
|
346
|
+
showMessageDialog = true; // As fitering has already happened here hence
|
|
347
|
+
// using the message model again for the message dialog view and then filtering on that binding again is unnecessary.
|
|
348
|
+
// So we create new json model to use for the message dialog view.
|
|
349
|
+
|
|
350
|
+
var aMessages = [];
|
|
351
|
+
aCurrentContexts.forEach(function (oContext) {
|
|
352
|
+
var oMessage;
|
|
353
|
+
|
|
354
|
+
if (oContext.getObject().technicalDetails && aMessageList.indexOf(oContext.getObject().technicalDetails.originalMessage.message) === -1) {
|
|
355
|
+
aMessageList.push(oContext.getObject().technicalDetails.originalMessage.message);
|
|
356
|
+
oMessage = oContext.getObject();
|
|
357
|
+
aMessages.push(oMessage);
|
|
358
|
+
aMessageDataList = aMessages;
|
|
359
|
+
} else if (!oContext.getObject().technicalDetails) {
|
|
360
|
+
oMessage = oContext.getObject();
|
|
361
|
+
aMessages.push(oMessage);
|
|
362
|
+
aMessageDataList = aMessages;
|
|
363
|
+
}
|
|
364
|
+
}); // if(aMessages.length === 0 && aMessageList.length) {
|
|
365
|
+
// oMessageDialogModel.setData(aMessages);
|
|
366
|
+
// }
|
|
367
|
+
|
|
368
|
+
oMessageDialogModel.setData(aMessageDataList);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
if (aUnboundMessages.length === 0 && !aCustomMessages && !bHasEtagMessage) {
|
|
373
|
+
// Don't show the popup if there are no transient messages
|
|
374
|
+
return Promise.resolve(true);
|
|
375
|
+
} else if (aUnboundMessages.length === 1 && aUnboundMessages[0].getType() === MessageType.Success && !aCustomMessages) {
|
|
376
|
+
return new Promise(function (resolve) {
|
|
377
|
+
MessageToast.show(aUnboundMessages[0].message);
|
|
378
|
+
oMessageManager.removeMessages(aUnboundMessages);
|
|
379
|
+
resolve();
|
|
380
|
+
});
|
|
381
|
+
} else if (showMessageDialog) {
|
|
382
|
+
aResolveFunctions = aResolveFunctions || [];
|
|
383
|
+
return new Promise(function (resolve, reject) {
|
|
384
|
+
aResolveFunctions.push(resolve);
|
|
385
|
+
sap.ui.getCore().getLibraryResourceBundle("sap.fe.core", true).then(function (oResourceBundle) {
|
|
386
|
+
var bStrictHandlingFlow = false;
|
|
387
|
+
var bHasEtagMessage = fnModifyETagMessagesOnly(oMessageManager, oResourceBundle);
|
|
388
|
+
var oMessageObject = prepareMessageViewForDialog(oMessageDialogModel, bStrictHandlingFlow);
|
|
389
|
+
oDialog = oDialog || new Dialog({
|
|
390
|
+
resizable: true,
|
|
391
|
+
content: oMessageObject.oMessageView,
|
|
392
|
+
endButton: new Button({
|
|
393
|
+
press: function () {
|
|
394
|
+
dialogCloseHandler(); // also remove bound transition messages if we were showing them
|
|
395
|
+
|
|
396
|
+
if (bShowBoundTransition) {
|
|
397
|
+
removeBoundTransitionMessages();
|
|
398
|
+
}
|
|
399
|
+
},
|
|
400
|
+
text: oResourceBundle.getText("C_COMMON_SAPFE_CLOSE")
|
|
401
|
+
}),
|
|
402
|
+
customHeader: new Bar({
|
|
403
|
+
contentMiddle: [new Text({
|
|
404
|
+
text: oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE")
|
|
405
|
+
})],
|
|
406
|
+
contentLeft: [oBackButton]
|
|
407
|
+
}),
|
|
408
|
+
contentWidth: "37.5em",
|
|
409
|
+
contentHeight: "21.5em",
|
|
410
|
+
verticalScrolling: false,
|
|
411
|
+
afterClose: function () {
|
|
412
|
+
for (var i = 0; i < aResolveFunctions.length; i++) {
|
|
413
|
+
aResolveFunctions[i].call();
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
aResolveFunctions = [];
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
if (bHasEtagMessage) {
|
|
421
|
+
sap.ui.require(["sap/m/ButtonType"], function (ButtonType) {
|
|
422
|
+
oDialog.setBeginButton(new Button({
|
|
423
|
+
press: function () {
|
|
424
|
+
dialogCloseHandler();
|
|
425
|
+
|
|
426
|
+
if (oContext.hasPendingChanges()) {
|
|
427
|
+
oContext.getBinding().resetChanges();
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
oContext.refresh();
|
|
431
|
+
},
|
|
432
|
+
text: oResourceBundle.getText("C_COMMON_SAPFE_REFRESH"),
|
|
433
|
+
type: ButtonType.Emphasized
|
|
434
|
+
}));
|
|
435
|
+
});
|
|
436
|
+
} else {
|
|
437
|
+
oDialog.destroyBeginButton();
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
sHighestPriority = fnGetHighestMessagePriority(oMessageView.getItems());
|
|
441
|
+
sHighestPriorityText = getTranslatedTextForMessageDialog(sHighestPriority);
|
|
442
|
+
oDialog.setState(sHighestPriority);
|
|
443
|
+
oDialog.getCustomHeader().getContentMiddle()[0].setText(sHighestPriorityText);
|
|
444
|
+
oMessageView.navigateBack();
|
|
445
|
+
oDialog.open();
|
|
446
|
+
}).catch(reject);
|
|
447
|
+
});
|
|
448
|
+
} else if (showMessageBox) {
|
|
449
|
+
return new Promise(function (resolve) {
|
|
450
|
+
var oMessage = aUnboundMessages[0];
|
|
451
|
+
|
|
452
|
+
if (oMessage.technicalDetails && aMessageList.indexOf(oMessage.technicalDetails.originalMessage.message) === -1) {
|
|
453
|
+
aMessageList.push(oMessage.technicalDetails.originalMessage.message);
|
|
454
|
+
var formattedTextString = "<html><body>";
|
|
455
|
+
var retryAfterMessage = getRetryAfterMessage(oMessage, true);
|
|
456
|
+
|
|
457
|
+
if (retryAfterMessage) {
|
|
458
|
+
formattedTextString = "<h6>" + retryAfterMessage + "</h6><br>";
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
formattedTextString = formattedTextString + oMessage.getMessage() + "</html></body>";
|
|
462
|
+
var formattedText = new FormattedText({
|
|
463
|
+
htmlText: formattedTextString
|
|
464
|
+
});
|
|
465
|
+
MessageBox.error(formattedText, {
|
|
466
|
+
onClose: function () {
|
|
467
|
+
aMessageList = [];
|
|
468
|
+
|
|
469
|
+
if (bShowBoundTransition) {
|
|
470
|
+
removeBoundTransitionMessages();
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
removeUnboundTransitionMessages();
|
|
474
|
+
resolve(true);
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
} else {
|
|
480
|
+
return Promise.resolve(true);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
function getTranslatedTextForMessageDialog(sHighestPriority) {
|
|
485
|
+
var oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core");
|
|
486
|
+
|
|
487
|
+
switch (sHighestPriority) {
|
|
488
|
+
case "Error":
|
|
489
|
+
return oResourceBundle.getText("C_COMMON_SAPFE_ERROR_MESSAGES_PAGE_TITLE_ERROR");
|
|
490
|
+
|
|
491
|
+
case "Information":
|
|
492
|
+
return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_INFO");
|
|
493
|
+
|
|
494
|
+
case "Success":
|
|
495
|
+
return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_SUCCESS");
|
|
496
|
+
|
|
497
|
+
case "Warning":
|
|
498
|
+
return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE_WARNING");
|
|
499
|
+
|
|
500
|
+
default:
|
|
501
|
+
return oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_ERROR_MESSAGES_PAGE_TITLE");
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
function removeUnboundTransitionMessages() {
|
|
506
|
+
removeTransitionMessages(false);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
function removeBoundTransitionMessages() {
|
|
510
|
+
removeTransitionMessages(true);
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
function getMessages() {
|
|
514
|
+
var bBoundMessages = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
515
|
+
var bTransitionOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
516
|
+
var i;
|
|
517
|
+
var oMessageManager = sap.ui.getCore().getMessageManager(),
|
|
518
|
+
oMessageModel = oMessageManager.getMessageModel(),
|
|
519
|
+
aMessages = oMessageModel.getObject("/"),
|
|
520
|
+
oResourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
|
|
521
|
+
aTransitionMessages = [];
|
|
522
|
+
|
|
523
|
+
for (i = 0; i < aMessages.length; i++) {
|
|
524
|
+
if ((!bTransitionOnly || aMessages[i].persistent) && (bBoundMessages && aMessages[i].target !== "" || !bBoundMessages && (!aMessages[i].target || aMessages[i].target === "")) && aMessages[i].code) {
|
|
525
|
+
aTransitionMessages.push(aMessages[i]);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
for (i = 0; i < aTransitionMessages.length; i++) {
|
|
530
|
+
if (aTransitionMessages[i].code === "503" && aTransitionMessages[i].message !== "" && aTransitionMessages[i].message.indexOf(oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_BACKEND_PREFIX")) === -1) {
|
|
531
|
+
aTransitionMessages[i].message = "\n" + oResourceBundle.getText("C_MESSAGE_HANDLING_SAPFE_503_BACKEND_PREFIX") + aTransitionMessages[i].message;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
return aTransitionMessages;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
function removeTransitionMessages(bBoundMessages) {
|
|
539
|
+
var aMessagesToBeDeleted = getMessages(bBoundMessages, true);
|
|
540
|
+
|
|
541
|
+
if (aMessagesToBeDeleted.length > 0) {
|
|
542
|
+
sap.ui.getCore().getMessageManager().removeMessages(aMessagesToBeDeleted);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* Static functions for Fiori Message Handling
|
|
547
|
+
*
|
|
548
|
+
* @namespace
|
|
549
|
+
* @alias sap.fe.core.actions.messageHandling
|
|
550
|
+
* @private
|
|
551
|
+
* @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
|
|
552
|
+
* @since 1.56.0
|
|
553
|
+
*/
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
var messageHandling = {
|
|
557
|
+
getMessages: getMessages,
|
|
558
|
+
showUnboundMessages: showUnboundMessages,
|
|
559
|
+
removeUnboundTransitionMessages: removeUnboundTransitionMessages,
|
|
560
|
+
removeBoundTransitionMessages: removeBoundTransitionMessages,
|
|
561
|
+
modifyETagMessagesOnly: fnModifyETagMessagesOnly,
|
|
562
|
+
getRetryAfterMessage: getRetryAfterMessage,
|
|
563
|
+
prepareMessageViewForDialog: prepareMessageViewForDialog
|
|
564
|
+
};
|
|
565
|
+
return messageHandling;
|
|
566
|
+
}, false);
|
|
567
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1lc3NhZ2VIYW5kbGluZy50cyJdLCJuYW1lcyI6WyJNZXNzYWdlVHlwZSIsIkNvcmVMaWIiLCJhTWVzc2FnZUxpc3QiLCJhTWVzc2FnZURhdGFMaXN0IiwiYVJlc29sdmVGdW5jdGlvbnMiLCJvRGlhbG9nIiwib0JhY2tCdXR0b24iLCJvTWVzc2FnZVRlbXBsYXRlIiwib01lc3NhZ2VWaWV3IiwiZm5Gb3JtYXRUZWNobmljYWxEZXRhaWxzIiwic1ByZXZpb3VzR3JvdXBOYW1lIiwiaW5zZXJ0RGV0YWlsIiwib1Byb3BlcnR5IiwicHJvcGVydHkiLCJzdWJzdHIiLCJNYXRoIiwibWF4IiwibGFzdEluZGV4T2YiLCJpbnNlcnRHcm91cE5hbWUiLCJzSFRNTCIsImdyb3VwTmFtZSIsImdldFBhdGhzIiwic1REIiwiZm9yRWFjaCIsImZuRm9ybWF0RGVzY3JpcHRpb24iLCJmbkdldEhpZ2hlc3RNZXNzYWdlUHJpb3JpdHkiLCJhTWVzc2FnZXMiLCJzTWVzc2FnZVByaW9yaXR5IiwiTm9uZSIsImlMZW5ndGgiLCJsZW5ndGgiLCJvTWVzc2FnZUNvdW50IiwiRXJyb3IiLCJXYXJuaW5nIiwiU3VjY2VzcyIsIkluZm9ybWF0aW9uIiwiaSIsImdldFR5cGUiLCJmbk1vZGlmeUVUYWdNZXNzYWdlc09ubHkiLCJvTWVzc2FnZU1hbmFnZXIiLCJvUmVzb3VyY2VCdW5kbGUiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXRPYmplY3QiLCJiTWVzc2FnZXNNb2RpZmllZCIsInNFdGFnTWVzc2FnZSIsIm9NZXNzYWdlIiwib1RlY2huaWNhbERldGFpbHMiLCJnZXRUZWNobmljYWxEZXRhaWxzIiwiaHR0cFN0YXR1cyIsImdldFRleHQiLCJyZW1vdmVNZXNzYWdlcyIsInNldE1lc3NhZ2UiLCJ0YXJnZXQiLCJhZGRNZXNzYWdlcyIsImRpYWxvZ0Nsb3NlSGFuZGxlciIsImNsb3NlIiwic2V0VmlzaWJsZSIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJnZXRSZXRyeUFmdGVyTWVzc2FnZSIsImJNZXNzYWdlRGlhbG9nIiwiZE5vdyIsIkRhdGUiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJzUmV0cnlBZnRlck1lc3NhZ2UiLCJyZXRyeUFmdGVyIiwiZFJldHJ5QWZ0ZXIiLCJvRGF0ZUZvcm1hdCIsImdldEZ1bGxZZWFyIiwiRGF0ZUZvcm1hdCIsImdldERhdGVUaW1lSW5zdGFuY2UiLCJwYXR0ZXJuIiwiZm9ybWF0IiwiZ2V0TW9udGgiLCJnZXREYXRlIiwicHJlcGFyZU1lc3NhZ2VWaWV3Rm9yRGlhbG9nIiwib01lc3NhZ2VEaWFsb2dNb2RlbCIsImJTdHJpY3RIYW5kbGluZ0Zsb3ciLCJNZXNzYWdlSXRlbSIsInVuZGVmaW5lZCIsImNvdW50ZXIiLCJwYXRoIiwidGl0bGUiLCJzdWJ0aXRsZSIsImxvbmd0ZXh0VXJsIiwidHlwZSIsImRlc2NyaXB0aW9uIiwibWFya3VwRGVzY3JpcHRpb24iLCJNZXNzYWdlVmlldyIsInNob3dEZXRhaWxzUGFnZUhlYWRlciIsIml0ZW1TZWxlY3QiLCJpdGVtcyIsInRlbXBsYXRlIiwiQnV0dG9uIiwiaWNvbiIsIkljb25Qb29sIiwiZ2V0SWNvblVSSSIsInZpc2libGUiLCJwcmVzcyIsIm5hdmlnYXRlQmFjayIsInNldE1vZGVsIiwic2hvd1VuYm91bmRNZXNzYWdlcyIsImFDdXN0b21NZXNzYWdlcyIsIm9Db250ZXh0IiwiYkhhc0V0YWdNZXNzYWdlIiwiYlNob3dCb3VuZFRyYW5zaXRpb24iLCJhVW5ib3VuZE1lc3NhZ2VzIiwiZ2V0TWVzc2FnZXMiLCJnZXRNZXNzYWdlTWFuYWdlciIsInNIaWdoZXN0UHJpb3JpdHkiLCJzSGlnaGVzdFByaW9yaXR5VGV4dCIsImFGaWx0ZXJzIiwiRmlsdGVyIiwib3BlcmF0b3IiLCJGaWx0ZXJPcGVyYXRvciIsIk5FIiwidmFsdWUxIiwic2hvd01lc3NhZ2VEaWFsb2ciLCJzaG93TWVzc2FnZUJveCIsImNvbmNhdCIsInB1c2giLCJFUSIsImZuQ2hlY2tDb250cm9sSWRJbkRpYWxvZyIsImFDb250cm9sSWRzIiwiaW5kZXgiLCJJbmZpbml0eSIsIm9Db250cm9sIiwiYnlJZCIsImVycm9yRmllbGRDb250cm9sIiwiZmllbGRSYW5raW5EaWFsb2ciLCJEaWFsb2ciLCJnZXRQYXJlbnQiLCJmaW5kRWxlbWVudHMiLCJpbmRleE9mIiwiZm9jdXMiLCJ0ZXN0IiwiY2FzZVNlbnNpdGl2ZSIsIm1lc3NhZ2VDb2RlIiwiY29kZSIsIk1lc3NhZ2UiLCJtZXNzYWdlIiwidGV4dCIsInBlcnNpc3RlbnQiLCJKU09OTW9kZWwiLCJnZXRDb2RlIiwib0xpc3RCaW5kaW5nIiwiYmluZExpc3QiLCJhQ3VycmVudENvbnRleHRzIiwiZ2V0Q3VycmVudENvbnRleHRzIiwidGVjaG5pY2FsRGV0YWlscyIsIm9yaWdpbmFsTWVzc2FnZSIsInNldERhdGEiLCJQcm9taXNlIiwicmVzb2x2ZSIsIk1lc3NhZ2VUb2FzdCIsInNob3ciLCJyZWplY3QiLCJ0aGVuIiwib01lc3NhZ2VPYmplY3QiLCJyZXNpemFibGUiLCJjb250ZW50IiwiZW5kQnV0dG9uIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJjdXN0b21IZWFkZXIiLCJCYXIiLCJjb250ZW50TWlkZGxlIiwiVGV4dCIsImNvbnRlbnRMZWZ0IiwiY29udGVudFdpZHRoIiwiY29udGVudEhlaWdodCIsInZlcnRpY2FsU2Nyb2xsaW5nIiwiYWZ0ZXJDbG9zZSIsImNhbGwiLCJyZXF1aXJlIiwiQnV0dG9uVHlwZSIsInNldEJlZ2luQnV0dG9uIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwicmVmcmVzaCIsIkVtcGhhc2l6ZWQiLCJkZXN0cm95QmVnaW5CdXR0b24iLCJnZXRJdGVtcyIsImdldFRyYW5zbGF0ZWRUZXh0Rm9yTWVzc2FnZURpYWxvZyIsInNldFN0YXRlIiwiZ2V0Q3VzdG9tSGVhZGVyIiwiZ2V0Q29udGVudE1pZGRsZSIsInNldFRleHQiLCJvcGVuIiwiY2F0Y2giLCJmb3JtYXR0ZWRUZXh0U3RyaW5nIiwicmV0cnlBZnRlck1lc3NhZ2UiLCJnZXRNZXNzYWdlIiwiZm9ybWF0dGVkVGV4dCIsIkZvcm1hdHRlZFRleHQiLCJodG1sVGV4dCIsIk1lc3NhZ2VCb3giLCJlcnJvciIsIm9uQ2xvc2UiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJiQm91bmRNZXNzYWdlcyIsImJUcmFuc2l0aW9uT25seSIsIm9NZXNzYWdlTW9kZWwiLCJhVHJhbnNpdGlvbk1lc3NhZ2VzIiwiYU1lc3NhZ2VzVG9CZURlbGV0ZWQiLCJtZXNzYWdlSGFuZGxpbmciLCJtb2RpZnlFVGFnTWVzc2FnZXNPbmx5Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7O0FBa0JBLE1BQU1BLFdBQVcsR0FBR0MsT0FBTyxDQUFDRCxXQUE1QjtBQUNBLE1BQUlFLFlBQW1CLEdBQUcsRUFBMUI7QUFDQSxNQUFJQyxnQkFBdUIsR0FBRyxFQUE5QjtBQUNBLE1BQUlDLGlCQUF3QixHQUFHLEVBQS9CO0FBQ0EsTUFBSUMsT0FBSjtBQUNBLE1BQUlDLFdBQUo7QUFDQSxNQUFJQyxnQkFBSjtBQUNBLE1BQUlDLFlBQUo7O0FBaUJBLFdBQVNDLHdCQUFULEdBQW9DO0FBQ25DLFFBQUlDLGtCQUFKLENBRG1DLENBR25DOztBQUNBLGFBQVNDLFlBQVQsQ0FBc0JDLFNBQXRCLEVBQXNDO0FBQ3JDLGFBQU9BLFNBQVMsQ0FBQ0MsUUFBVixHQUNKLFNBQ0FELFNBQVMsQ0FBQ0MsUUFEVixHQUVBLFdBRkEsR0FHQUQsU0FBUyxDQUFDQyxRQUFWLENBQW1CQyxNQUFuQixDQUEwQkMsSUFBSSxDQUFDQyxHQUFMLENBQVNKLFNBQVMsQ0FBQ0MsUUFBVixDQUFtQkksV0FBbkIsQ0FBK0IsR0FBL0IsQ0FBVCxFQUE4Q0wsU0FBUyxDQUFDQyxRQUFWLENBQW1CSSxXQUFuQixDQUErQixHQUEvQixDQUE5QyxJQUFxRixDQUEvRyxDQUhBLEdBSUEsU0FKQSxHQUtBLElBTEEsR0FNQUwsU0FBUyxDQUFD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c3NhZ2VUb2FzdFwiO1xuaW1wb3J0IE1lc3NhZ2VJdGVtIGZyb20gXCJzYXAvbS9NZXNzYWdlSXRlbVwiO1xuaW1wb3J0IE1lc3NhZ2VWaWV3IGZyb20gXCJzYXAvbS9NZXNzYWdlVmlld1wiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgQ29yZUxpYiBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IEZpbHRlciBmcm9tIFwic2FwL3VpL21vZGVsL0ZpbHRlclwiO1xuaW1wb3J0IEZpbHRlck9wZXJhdG9yIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyT3BlcmF0b3JcIjtcbmltcG9ydCBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBJY29uUG9vbCBmcm9tIFwic2FwL3VpL2NvcmUvSWNvblBvb2xcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IERhdGVGb3JtYXQgZnJvbSBcInNhcC91aS9jb3JlL2Zvcm1hdC9EYXRlRm9ybWF0XCI7XG5pbXBvcnQgUmVzb3VyY2VCdW5kbGUgZnJvbSBcInNhcC9iYXNlL2kxOG4vUmVzb3VyY2VCdW5kbGVcIjtcbmltcG9ydCBDb250cm9sIGZyb20gXCJzYXAvdWkvbWRjL0NvbnRyb2xcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgQmFyIGZyb20gXCJzYXAvbS9CYXJcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgRm9ybWF0dGVkVGV4dCBmcm9tIFwic2FwL20vRm9ybWF0dGVkVGV4dFwiO1xuXG5jb25zdCBNZXNzYWdlVHlwZSA9IENvcmVMaWIuTWVzc2FnZVR5cGU7XG5sZXQgYU1lc3NhZ2VMaXN0OiBhbnlbXSA9IFtdO1xubGV0IGFNZXNzYWdlRGF0YUxpc3Q6IGFueVtdID0gW107XG5sZXQgYVJlc29sdmVGdW5jdGlvbnM6IGFueVtdID0gW107XG5sZXQgb0RpYWxvZzogRGlhbG9nO1xubGV0IG9CYWNrQnV0dG9uOiBCdXR0b247XG5sZXQgb01lc3NhZ2VUZW1wbGF0ZTogTWVzc2FnZUl0ZW07XG5sZXQgb01lc3NhZ2VWaWV3OiBNZXNzYWdlVmlldztcblxuZXhwb3J0IHR5cGUgbWVzc2FnZUhhbmRsaW5nVHlwZSA9IHtcblx0Z2V0TWVzc2FnZXM6IChiQm91bmRNZXNzYWdlcz86IGFueSwgYlRyYW5zaXRpb25Pbmx5PzogYW55KSA9PiBhbnlbXTtcblx0c2hvd1VuYm91bmRNZXNzYWdlczogKFxuXHRcdGFDdXN0b21NZXNzYWdlcz86IGFueVtdLFxuXHRcdG9Db250ZXh0PzogYW55LFxuXHRcdGJIYXNFdGFnTWVzc2FnZT86IGJvb2xlYW4sXG5cdFx0YlNob3dCb3VuZFRyYW5zaXRpb24/OiBib29sZWFuXG5cdCkgPT4gUHJvbWlzZTxhbnk+O1xuXHRyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzOiAoKSA9PiB2b2lkO1xuXHRyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlczogKCkgPT4gdm9pZDtcblx0bW9kaWZ5RVRhZ01lc3NhZ2VzT25seTogKG9NZXNzYWdlTWFuYWdlcjogYW55LCBvUmVzb3VyY2VCdW5kbGU6IGFueSkgPT4gYm9vbGVhbjtcblx0Z2V0UmV0cnlBZnRlck1lc3NhZ2U6IChvTWVzc2FnZTogYW55LCBiTWVzc2FnZURpYWxvZz86IGFueSkgPT4gYW55O1xuXHRwcmVwYXJlTWVzc2FnZVZpZXdGb3JEaWFsb2c6IChvTWVzc2FnZURpYWxvZ01vZGVsOiBKU09OTW9kZWwsIGJTdHJpY3RIYW5kbGluZ0Zsb3c6IGJvb2xlYW4pID0+IGFueTtcbn07XG5cbmZ1bmN0aW9uIGZuRm9ybWF0VGVjaG5pY2FsRGV0YWlscygpIHtcblx0bGV0IHNQcmV2aW91c0dyb3VwTmFtZTogc3RyaW5nO1xuXG5cdC8vIEluc2VydCB0ZWNobmljYWwgZGV0YWlsIGlmIGl0IGV4aXN0c1xuXHRmdW5jdGlvbiBpbnNlcnREZXRhaWwob1Byb3BlcnR5OiBhbnkpIHtcblx0XHRyZXR1cm4gb1Byb3BlcnR5LnByb3BlcnR5XG5cdFx0XHQ/IFwiKCAke1wiICtcblx0XHRcdFx0XHRvUHJvcGVydHkucHJvcGVydHkgK1xuXHRcdFx0XHRcdCd9ID8gKFwiPHA+JyArXG5cdFx0XHRcdFx0b1Byb3BlcnR5LnByb3BlcnR5LnN1YnN0cihNYXRoLm1heChvUHJvcGVydHkucHJvcGVydHkubGFzdEluZGV4T2YoXCIvXCIpLCBvUHJvcGVydHkucHJvcGVydHkubGFzdEluZGV4T2YoXCIuXCIpKSArIDEpICtcblx0XHRcdFx0XHQnIDogXCIgKyAnICtcblx0XHRcdFx0XHRcIiR7XCIgK1xuXHRcdFx0XHRcdG9Qcm9wZXJ0eS5wcm9wZXJ0eSArXG5cdFx0XHRcdFx0J30gKyBcIjwvcD5cIikgOiBcIlwiICknXG5cdFx0XHQ6IFwiXCI7XG5cdH1cblx0Ly8gSW5zZXJ0IGdyb3VwbmFtZSBpZiBpdCBleGlzdHNcblx0ZnVuY3Rpb24gaW5zZXJ0R3JvdXBOYW1lKG9Qcm9wZXJ0eTogYW55KSB7XG5cdFx0bGV0IHNIVE1MID0gXCJcIjtcblx0XHRpZiAob1Byb3BlcnR5Lmdyb3VwTmFtZSAmJiBvUHJvcGVydHkucHJvcGVydHkgJiYgb1Byb3BlcnR5Lmdyb3VwTmFtZSAhPT0gc1ByZXZpb3VzR3JvdXBOYW1lKSB7XG5cdFx0XHRzSFRNTCArPSBcIiggJHtcIiArIG9Qcm9wZXJ0eS5wcm9wZXJ0eSArICd9ID8gXCI8YnI+PGgzPicgKyBvUHJvcGVydHkuZ3JvdXBOYW1lICsgJzwvaDM+XCIgOiBcIlwiICkgKyAnO1xuXHRcdFx0c1ByZXZpb3VzR3JvdXBOYW1lID0gb1Byb3BlcnR5Lmdyb3VwTmFtZTtcblx0XHR9XG5cdFx0cmV0dXJuIHNIVE1MO1xuXHR9XG5cblx0Ly8gTGlzdCBvZiB0ZWNobmljYWwgZGV0YWlscyB0byBiZSBzaG93blxuXHRmdW5jdGlvbiBnZXRQYXRocygpIHtcblx0XHRjb25zdCBzVEQgPSBcInRlY2huaWNhbERldGFpbHNcIjsgLy8gbmFtZSBvZiBwcm9wZXJ0eSBpbiBtZXNzYWdlIG1vZGVsIGRhdGEgZm9yIHRlY2huaWNhbCBkZXRhaWxzXG5cdFx0cmV0dXJuIFtcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJcIiwgXCJwcm9wZXJ0eVwiOiBzVEQgKyBcIi9zdGF0dXNcIiB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIlwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL3N0YXR1c1RleHRcIiB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIkFwcGxpY2F0aW9uXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvZXJyb3IvQFNBUF9fY29tbW9uLkFwcGxpY2F0aW9uL0NvbXBvbmVudElkXCIgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJBcHBsaWNhdGlvblwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL0BTQVBfX2NvbW1vbi5BcHBsaWNhdGlvbi9TZXJ2aWNlSWRcIiB9LFxuXHRcdFx0eyBcImdyb3VwTmFtZVwiOiBcIkFwcGxpY2F0aW9uXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvZXJyb3IvQFNBUF9fY29tbW9uLkFwcGxpY2F0aW9uL1NlcnZpY2VSZXBvc2l0b3J5XCIgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJBcHBsaWNhdGlvblwiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL0BTQVBfX2NvbW1vbi5BcHBsaWNhdGlvbi9TZXJ2aWNlVmVyc2lvblwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiRXJyb3JSZXNvbHV0aW9uXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvZXJyb3IvQFNBUF9fY29tbW9uLkVycm9yUmVzb2x1dGlvbi9BbmFseXNpc1wiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiRXJyb3JSZXNvbHV0aW9uXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvZXJyb3IvQFNBUF9fY29tbW9uLkVycm9yUmVzb2x1dGlvbi9Ob3RlXCIgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJFcnJvclJlc29sdXRpb25cIiwgXCJwcm9wZXJ0eVwiOiBzVEQgKyBcIi9lcnJvci9AU0FQX19jb21tb24uRXJyb3JSZXNvbHV0aW9uL0RldGFpbGVkTm90ZVwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiRXJyb3JSZXNvbHV0aW9uXCIsIFwicHJvcGVydHlcIjogc1REICsgXCIvZXJyb3IvQFNBUF9fY29tbW9uLkV4Y2VwdGlvbkNhdGVnb3J5XCIgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJFcnJvclJlc29sdXRpb25cIiwgXCJwcm9wZXJ0eVwiOiBzVEQgKyBcIi9lcnJvci9AU0FQX19jb21tb24uVGltZVN0YW1wXCIgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJFcnJvclJlc29sdXRpb25cIiwgXCJwcm9wZXJ0eVwiOiBzVEQgKyBcIi9lcnJvci9AU0FQX19jb21tb24uVHJhbnNhY3Rpb25JZFwiIH0sXG5cdFx0XHR7IFwiZ3JvdXBOYW1lXCI6IFwiTWVzc2FnZXNcIiwgXCJwcm9wZXJ0eVwiOiBzVEQgKyBcIi9lcnJvci9jb2RlXCIgfSxcblx0XHRcdHsgXCJncm91cE5hbWVcIjogXCJNZXNzYWdlc1wiLCBcInByb3BlcnR5XCI6IHNURCArIFwiL2Vycm9yL21lc3NhZ2VcIiB9XG5cdFx0XTtcblx0fVxuXG5cdGxldCBzSFRNTCA9IFwiT2JqZWN0LmtleXMoXCIgKyBcIiR7dGVjaG5pY2FsRGV0YWlsc31cIiArICcpLmxlbmd0aCA+IDAgPyBcIjxoMj5UZWNobmljYWwgRGV0YWlsczwvaDI+XCIgOiBcIlwiICc7XG5cdGdldFBhdGhzKCkuZm9yRWFjaChmdW5jdGlvbihvUHJvcGVydHk6IHsgZ3JvdXBOYW1lOiBzdHJpbmc7IHByb3BlcnR5OiBzdHJpbmcgfSkge1xuXHRcdHNIVE1MID0gc0hUTUwgKyBpbnNlcnRHcm91cE5hbWUob1Byb3BlcnR5KSArIFwiXCIgKyBpbnNlcnREZXRhaWwob1Byb3BlcnR5KSArIFwiICsgXCI7XG5cdH0pO1xuXHRyZXR1cm4gc0hUTUw7XG59XG5mdW5jdGlvbiBmbkZvcm1hdERlc2NyaXB0aW9uKCkge1xuXHRjb25zdCBzSFRNTCA9IFwiKCR7XCIgKyAnZGVzY3JpcHRpb259ID8gKFwiPGgyPkRlc2NyaXB0aW9uPC9oMj5cIiArICR7JyArICdkZXNjcmlwdGlvbn0pIDogXCJcIiknO1xuXHRyZXR1cm4gc0hUTUw7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgbWVzc2FnZSB0eXBlKEVycm9yL1dhcm5pbmcvU3VjY2Vzcy9JbmZvcm1hdGlvbikgZnJvbSB0aGUgYXZhaWxhYmxlIG1lc3NhZ2VzLlxuXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMubWVzc2FnZUhhbmRsaW5nLmZuR2V0SGlnaGVzdE1lc3NhZ2VQcmlvcml0eVxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMubWVzc2FnZUhhbmRsaW5nXG4gKiBAcGFyYW0ge0FycmF5fSBbYU1lc3NhZ2VzXSBNZXNzYWdlcyBsaXN0XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBIaWdoZXN0IHByaW9yaXR5IG1lc3NhZ2UgZnJvbSB0aGUgYXZhaWxhYmxlIG1lc3NhZ2VzXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGZuR2V0SGlnaGVzdE1lc3NhZ2VQcmlvcml0eShhTWVzc2FnZXM6IGFueVtdKSB7XG5cdGxldCBzTWVzc2FnZVByaW9yaXR5ID0gTWVzc2FnZVR5cGUuTm9uZTtcblx0Y29uc3QgaUxlbmd0aCA9IGFNZXNzYWdlcy5sZW5ndGg7XG5cdGNvbnN0IG9NZXNzYWdlQ291bnQ6IGFueSA9IHsgRXJyb3I6IDAsIFdhcm5pbmc6IDAsIFN1Y2Nlc3M6IDAsIEluZm9ybWF0aW9uOiAwIH07XG5cblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpKyspIHtcblx0XHQrK29NZXNzYWdlQ291bnRbYU1lc3NhZ2VzW2ldLmdldFR5cGUoKV07XG5cdH1cblx0aWYgKG9NZXNzYWdlQ291bnRbTWVzc2FnZVR5cGUuRXJyb3JdID4gMCkge1xuXHRcdHNNZXNzYWdlUHJpb3JpdHkgPSBNZXNzYWdlVHlwZS5FcnJvcjtcblx0fSBlbHNlIGlmIChvTWVzc2FnZUNvdW50W01lc3NhZ2VUeXBlLldhcm5pbmddID4gMCkge1xuXHRcdHNNZXNzYWdlUHJpb3JpdHkgPSBNZXNzYWdlVHlwZS5XYXJuaW5nO1xuXHR9IGVsc2UgaWYgKG9NZXNzYWdlQ291bnRbTWVzc2FnZVR5cGUuU3VjY2Vzc10gPiAwKSB7XG5cdFx0c01lc3NhZ2VQcmlvcml0eSA9IE1lc3NhZ2VUeXBlLlN1Y2Nlc3M7XG5cdH0gZWxzZSBpZiAob01lc3NhZ2VDb3VudFtNZXNzYWdlVHlwZS5JbmZvcm1hdGlvbl0gPiAwKSB7XG5cdFx0c01lc3NhZ2VQcmlvcml0eSA9IE1lc3NhZ2VUeXBlLkluZm9ybWF0aW9uO1xuXHR9XG5cdHJldHVybiBzTWVzc2FnZVByaW9yaXR5O1xufVxuLy8gZnVuY3Rpb24gd2hpY2ggbW9kaWZ5IGUtVGFnIG1lc3NhZ2VzIG9ubHkuXG4vLyByZXR1cm5zIDogdHJ1ZSwgaWYgYW55IGUtVGFnIG1lc3NhZ2UgaXMgbW9kaWZpZWQsIG90aGVyd2lzZSBmYWxzZS5cbmZ1bmN0aW9uIGZuTW9kaWZ5RVRhZ01lc3NhZ2VzT25seShvTWVzc2FnZU1hbmFnZXI6IGFueSwgb1Jlc291cmNlQnVuZGxlOiBhbnkpIHtcblx0Y29uc3QgYU1lc3NhZ2VzID0gb01lc3NhZ2VNYW5hZ2VyLmdldE1lc3NhZ2VNb2RlbCgpLmdldE9iamVjdChcIi9cIik7XG5cdGxldCBiTWVzc2FnZXNNb2RpZmllZCA9IGZhbHNlO1xuXHRsZXQgc0V0YWdNZXNzYWdlID0gXCJcIjtcblx0YU1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24ob01lc3NhZ2U6IGFueSwgaTogYW55KSB7XG5cdFx0Y29uc3Qgb1RlY2huaWNhbERldGFpbHMgPSBvTWVzc2FnZS5nZXRUZWNobmljYWxEZXRhaWxzKCk7XG5cdFx0aWYgKG9UZWNobmljYWxEZXRhaWxzICYmIG9UZWNobmljYWxEZXRhaWxzLmh0dHBTdGF0dXMgPT09IDQxMikge1xuXHRcdFx0c0V0YWdNZXNzYWdlID0gc0V0YWdNZXNzYWdlIHx8IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19BUFBfQ09NUE9ORU5UX1NBUEZFX0VUQUdfVEVDSE5JQ0FMX0lTU1VFU1wiKTtcblx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhhTWVzc2FnZXNbaV0pO1xuXHRcdFx0b01lc3NhZ2Uuc2V0TWVzc2FnZShzRXRhZ01lc3NhZ2UpO1xuXHRcdFx0b01lc3NhZ2UudGFyZ2V0ID0gXCJcIjtcblx0XHRcdG9NZXNzYWdlTWFuYWdlci5hZGRNZXNzYWdlcyhvTWVzc2FnZSk7XG5cdFx0XHRiTWVzc2FnZXNNb2RpZmllZCA9IHRydWU7XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIGJNZXNzYWdlc01vZGlmaWVkO1xufVxuLy8gRGlhbG9nIGNsb3NlIEhhbmRsaW5nXG5mdW5jdGlvbiBkaWFsb2dDbG9zZUhhbmRsZXIoKSB7XG5cdG9EaWFsb2cuY2xvc2UoKTtcblx0b0JhY2tCdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7XG5cdGFNZXNzYWdlTGlzdCA9IFtdO1xuXHRyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG59XG5mdW5jdGlvbiBnZXRSZXRyeUFmdGVyTWVzc2FnZShvTWVzc2FnZTogYW55LCBiTWVzc2FnZURpYWxvZz86IGFueSkge1xuXHRjb25zdCBkTm93ID0gbmV3IERhdGUoKTtcblx0Y29uc3Qgb1RlY2huaWNhbERldGFpbHMgPSBvTWVzc2FnZS5nZXRUZWNobmljYWxEZXRhaWxzKCk7XG5cdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZSA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIikgYXMgUmVzb3VyY2VCdW5kbGU7XG5cdGxldCBzUmV0cnlBZnRlck1lc3NhZ2U7XG5cdGlmIChvVGVjaG5pY2FsRGV0YWlscyAmJiBvVGVjaG5pY2FsRGV0YWlscy5odHRwU3RhdHVzID09PSA1MDMgJiYgb1RlY2huaWNhbERldGFpbHMucmV0cnlBZnRlcikge1xuXHRcdGNvbnN0IGRSZXRyeUFmdGVyID0gb1RlY2huaWNhbERldGFpbHMucmV0cnlBZnRlcjtcblx0XHRsZXQgb0RhdGVGb3JtYXQ7XG5cdFx0aWYgKGROb3cuZ2V0RnVsbFllYXIoKSAhPT0gZFJldHJ5QWZ0ZXIuZ2V0RnVsbFllYXIoKSkge1xuXHRcdFx0Ly9kaWZmZXJlbnQgeWVhcnNcblx0XHRcdG9EYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKHtcblx0XHRcdFx0cGF0dGVybjogXCJNTU1NIGRkLCB5eXl5ICdhdCcgaGg6bW0gYVwiXG5cdFx0XHR9KTtcblx0XHRcdHNSZXRyeUFmdGVyTWVzc2FnZSA9IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFXzUwM19FUlJPUlwiLCBbb0RhdGVGb3JtYXQuZm9ybWF0KGRSZXRyeUFmdGVyKV0pO1xuXHRcdH0gZWxzZSBpZiAoZE5vdy5nZXRGdWxsWWVhcigpID09IGRSZXRyeUFmdGVyLmdldEZ1bGxZZWFyKCkpIHtcblx0XHRcdC8vc2FtZSB5ZWFyXG5cdFx0XHRpZiAoYk1lc3NhZ2VEaWFsb2cpIHtcblx0XHRcdFx0Ly9sZXNzIHRoYW4gMiBtaW5cblx0XHRcdFx0c1JldHJ5QWZ0ZXJNZXNzYWdlID1cblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfVElUTEVcIikgK1xuXHRcdFx0XHRcdFwiIFwiICtcblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfREVTQ1wiKTtcblx0XHRcdH0gZWxzZSBpZiAoZE5vdy5nZXRNb250aCgpICE9PSBkUmV0cnlBZnRlci5nZXRNb250aCgpIHx8IGROb3cuZ2V0RGF0ZSgpICE9PSBkUmV0cnlBZnRlci5nZXREYXRlKCkpIHtcblx0XHRcdFx0b0RhdGVGb3JtYXQgPSBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2Uoe1xuXHRcdFx0XHRcdHBhdHRlcm46IFwiTU1NTSBkZCAnYXQnIGhoOm1tIGFcIlxuXHRcdFx0XHR9KTsgLy9kaWZmZXJlbnQgbW9udGhzIG9yIGRpZmZlcmVudCBkYXlzIG9mIHNhbWUgbW9udGhcblx0XHRcdFx0c1JldHJ5QWZ0ZXJNZXNzYWdlID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0VSUk9SXCIsIFtvRGF0ZUZvcm1hdC5mb3JtYXQoZFJldHJ5QWZ0ZXIpXSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvL3NhbWUgZGF5XG5cdFx0XHRcdG9EYXRlRm9ybWF0ID0gRGF0ZUZvcm1hdC5nZXREYXRlVGltZUluc3RhbmNlKHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBcImhoOm1tIGFcIlxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c1JldHJ5QWZ0ZXJNZXNzYWdlID0gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0VSUk9SX0RBWVwiLCBbb0RhdGVGb3JtYXQuZm9ybWF0KGRSZXRyeUFmdGVyKV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmIChvVGVjaG5pY2FsRGV0YWlscyAmJiBvVGVjaG5pY2FsRGV0YWlscy5odHRwU3RhdHVzID09PSA1MDMgJiYgIW9UZWNobmljYWxEZXRhaWxzLnJldHJ5QWZ0ZXIpIHtcblx0XHRzUmV0cnlBZnRlck1lc3NhZ2UgPSBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfTUVTU0FHRV9IQU5ETElOR19TQVBGRV81MDNfRVJST1JfTk9fUkVUUllfQUZURVJcIik7XG5cdH1cblx0cmV0dXJuIHNSZXRyeUFmdGVyTWVzc2FnZTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZU1lc3NhZ2VWaWV3Rm9yRGlhbG9nKG9NZXNzYWdlRGlhbG9nTW9kZWw6IEpTT05Nb2RlbCwgYlN0cmljdEhhbmRsaW5nRmxvdzogYm9vbGVhbikge1xuXHRpZiAoIWJTdHJpY3RIYW5kbGluZ0Zsb3cpIHtcblx0XHRvTWVzc2FnZVRlbXBsYXRlID1cblx0XHRcdG9NZXNzYWdlVGVtcGxhdGUgfHxcblx0XHRcdG5ldyBNZXNzYWdlSXRlbSh1bmRlZmluZWQsIHtcblx0XHRcdFx0Y291bnRlcjogeyBwYXRoOiBcImNvdW50ZXJcIiB9LFxuXHRcdFx0XHR0aXRsZTogXCJ7bWVzc2FnZX1cIixcblx0XHRcdFx0c3VidGl0bGU6IFwie2FkZGl0aW9uYWxUZXh0fVwiLFxuXHRcdFx0XHRsb25ndGV4dFVybDogXCJ7ZGVzY3JpcHRpb25Vcmx9XCIsXG5cdFx0XHRcdHR5cGU6IHsgcGF0aDogXCJ0eXBlXCIgfSxcblx0XHRcdFx0ZGVzY3JpcHRpb246XG5cdFx0XHRcdFx0XCJ7PSAke1wiICtcblx0XHRcdFx0XHRcImRlc2NyaXB0aW9ufSB8fCAke3RlY2huaWNhbERldGFpbHN9ID8gXCIgK1xuXHRcdFx0XHRcdCdcIjxodG1sPjxib2R5PlwiICsgJyArXG5cdFx0XHRcdFx0Zm5Gb3JtYXREZXNjcmlwdGlvbigpICtcblx0XHRcdFx0XHRcIiArIFwiICtcblx0XHRcdFx0XHRmbkZvcm1hdFRlY2huaWNhbERldGFpbHMoKSArXG5cdFx0XHRcdFx0J1wiPC9ib2R5PjwvaHRtbD5cIicgK1xuXHRcdFx0XHRcdCcgOiBcIlwiIH0nLFxuXHRcdFx0XHRtYXJrdXBEZXNjcmlwdGlvbjogdHJ1ZVxuXHRcdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0b01lc3NhZ2VUZW1wbGF0ZSA9IG5ldyBNZXNzYWdlSXRlbSh7XG5cdFx0XHR0aXRsZTogXCJ7bWVzc2FnZX1cIixcblx0XHRcdHR5cGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0bG9uZ3RleHRVcmw6IFwie2Rlc2NyaXB0aW9uVXJsfVwiXG5cdFx0fSk7XG5cdH1cblx0b01lc3NhZ2VWaWV3ID1cblx0XHRvTWVzc2FnZVZpZXcgfHxcblx0XHRuZXcgTWVzc2FnZVZpZXcoe1xuXHRcdFx0c2hvd0RldGFpbHNQYWdlSGVhZGVyOiBmYWxzZSxcblx0XHRcdGl0ZW1TZWxlY3Q6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRvQmFja0J1dHRvbi5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdFx0fSxcblx0XHRcdGl0ZW1zOiB7XG5cdFx0XHRcdHBhdGg6IFwiL1wiLFxuXHRcdFx0XHR0ZW1wbGF0ZTogb01lc3NhZ2VUZW1wbGF0ZVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRvQmFja0J1dHRvbiA9XG5cdFx0b0JhY2tCdXR0b24gfHxcblx0XHRuZXcgQnV0dG9uKHtcblx0XHRcdGljb246IEljb25Qb29sLmdldEljb25VUkkoXCJuYXYtYmFja1wiKSxcblx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0cHJlc3M6IGZ1bmN0aW9uKHRoaXM6IEJ1dHRvbikge1xuXHRcdFx0XHRvTWVzc2FnZVZpZXcubmF2aWdhdGVCYWNrKCk7XG5cdFx0XHRcdHRoaXMuc2V0VmlzaWJsZShmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdC8vIFVwZGF0ZSBwcm9wZXIgRVRhZyBNaXNtYXRjaCBlcnJvclxuXHRvTWVzc2FnZVZpZXcuc2V0TW9kZWwob01lc3NhZ2VEaWFsb2dNb2RlbCk7XG5cdHJldHVybiB7XG5cdFx0b01lc3NhZ2VWaWV3LFxuXHRcdG9CYWNrQnV0dG9uXG5cdH07XG59XG5cbmZ1bmN0aW9uIHNob3dVbmJvdW5kTWVzc2FnZXMoXG5cdHRoaXM6IG1lc3NhZ2VIYW5kbGluZ1R5cGUsXG5cdGFDdXN0b21NZXNzYWdlcz86IGFueVtdLFxuXHRvQ29udGV4dD86IGFueSxcblx0Ykhhc0V0YWdNZXNzYWdlPzogYm9vbGVhbixcblx0YlNob3dCb3VuZFRyYW5zaXRpb24/OiBib29sZWFuXG4pIHtcblx0bGV0IGFVbmJvdW5kTWVzc2FnZXMgPSB0aGlzLmdldE1lc3NhZ2VzKCk7XG5cdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IChzYXAudWkuZ2V0Q29yZSgpIGFzIGFueSkuZ2V0TWVzc2FnZU1hbmFnZXIoKTtcblx0bGV0IHNIaWdoZXN0UHJpb3JpdHk7XG5cdGxldCBzSGlnaGVzdFByaW9yaXR5VGV4dDtcblx0Y29uc3QgYUZpbHRlcnMgPSBbXG5cdFx0bmV3IEZpbHRlcih7IHBhdGg6IFwiY29kZVwiLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuTkUsIHZhbHVlMTogbnVsbCB9KSxcblx0XHRuZXcgRmlsdGVyKHsgcGF0aDogXCJwZXJzaXN0ZW50XCIsIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvci5ORSwgdmFsdWUxOiBmYWxzZSB9KVxuXHRdO1xuXHRsZXQgc2hvd01lc3NhZ2VEaWFsb2cgPSBmYWxzZSxcblx0XHRzaG93TWVzc2FnZUJveCA9IGZhbHNlO1xuXG5cdGlmIChiU2hvd0JvdW5kVHJhbnNpdGlvbikge1xuXHRcdGFVbmJvdW5kTWVzc2FnZXMgPSBhVW5ib3VuZE1lc3NhZ2VzLmNvbmNhdChnZXRNZXNzYWdlcyh0cnVlLCB0cnVlKSk7XG5cdFx0Ly8gd2Ugb25seSB3YW50IHRvIHNob3cgYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBub3QgYm91bmQgc3RhdGUgbWVzc2FnZXMgaGVuY2UgYWRkIGEgZmlsdGVyIGZvciB0aGUgc2FtZVxuXHRcdGFGaWx0ZXJzLnB1c2gobmV3IEZpbHRlcih7IHBhdGg6IFwicGVyc2lzdGVudFwiLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsIHZhbHVlMTogdHJ1ZSB9KSk7XG5cdFx0Y29uc3QgZm5DaGVja0NvbnRyb2xJZEluRGlhbG9nID0gZnVuY3Rpb24oYUNvbnRyb2xJZHM6IGFueSkge1xuXHRcdFx0bGV0IGluZGV4ID0gSW5maW5pdHksXG5cdFx0XHRcdG9Db250cm9sID0gc2FwLnVpLmdldENvcmUoKS5ieUlkKGFDb250cm9sSWRzWzBdKSBhcyBNYW5hZ2VkT2JqZWN0O1xuXHRcdFx0Y29uc3QgZXJyb3JGaWVsZENvbnRyb2wgPSBzYXAudWkuZ2V0Q29yZSgpLmJ5SWQoYUNvbnRyb2xJZHNbMF0pIGFzIENvbnRyb2w7XG5cdFx0XHR3aGlsZSAob0NvbnRyb2wpIHtcblx0XHRcdFx0Y29uc3QgZmllbGRSYW5raW5EaWFsb2cgPVxuXHRcdFx0XHRcdG9Db250cm9sIGluc3RhbmNlb2YgRGlhbG9nXG5cdFx0XHRcdFx0XHQ/IChlcnJvckZpZWxkQ29udHJvbC5nZXRQYXJlbnQoKSBhcyBhbnkpLmZpbmRFbGVtZW50cyh0cnVlKS5pbmRleE9mKGVycm9yRmllbGRDb250cm9sKVxuXHRcdFx0XHRcdFx0OiBJbmZpbml0eTtcblx0XHRcdFx0aWYgKG9Db250cm9sIGluc3RhbmNlb2YgRGlhbG9nKSB7XG5cdFx0XHRcdFx0aWYgKGluZGV4ID4gZmllbGRSYW5raW5EaWFsb2cpIHtcblx0XHRcdFx0XHRcdGluZGV4ID0gZmllbGRSYW5raW5EaWFsb2c7XG5cdFx0XHRcdFx0XHQvLyBTZXQgdGhlIGZvY3VzIHRvIHRoZSBkaWFsb2cncyBjb250cm9sXG5cdFx0XHRcdFx0XHRlcnJvckZpZWxkQ29udHJvbC5mb2N1cygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQvLyBtZXNzYWdlcyB3aXRoIHRhcmdldCBpbnNpZGUgc2FwLm0uRGlhbG9nIHNob3VsZCBub3QgYnJpbmcgdXAgdGhlIG1lc3NhZ2UgZGlhbG9nXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9Db250cm9sID0gb0NvbnRyb2wuZ2V0UGFyZW50KCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9O1xuXHRcdGFGaWx0ZXJzLnB1c2goXG5cdFx0XHRuZXcgRmlsdGVyKHtcblx0XHRcdFx0cGF0aDogXCJjb250cm9sSWRzXCIsXG5cdFx0XHRcdHRlc3Q6IGZuQ2hlY2tDb250cm9sSWRJbkRpYWxvZyxcblx0XHRcdFx0Y2FzZVNlbnNpdGl2ZTogdHJ1ZVxuXHRcdFx0fSlcblx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdC8vIG9ubHkgdW5ib3VuZCBtZXNzYWdlcyBoYXZlIHRvIGJlIHNob3duIHNvIGFkZCBmaWx0ZXIgYWNjb3JkaW5nbHlcblx0XHRhRmlsdGVycy5wdXNoKG5ldyBGaWx0ZXIoeyBwYXRoOiBcInRhcmdldFwiLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsIHZhbHVlMTogXCJcIiB9KSk7XG5cdH1cblx0aWYgKGFDdXN0b21NZXNzYWdlcyAmJiBhQ3VzdG9tTWVzc2FnZXMubGVuZ3RoKSB7XG5cdFx0YUN1c3RvbU1lc3NhZ2VzLmZvckVhY2goZnVuY3Rpb24ob01lc3NhZ2U6IGFueSkge1xuXHRcdFx0Y29uc3QgbWVzc2FnZUNvZGUgPSBvTWVzc2FnZS5jb2RlID8gb01lc3NhZ2UuY29kZSA6IFwiXCI7XG5cdFx0XHRvTWVzc2FnZU1hbmFnZXIuYWRkTWVzc2FnZXMoXG5cdFx0XHRcdG5ldyBNZXNzYWdlKHtcblx0XHRcdFx0XHRtZXNzYWdlOiBvTWVzc2FnZS50ZXh0LFxuXHRcdFx0XHRcdHR5cGU6IG9NZXNzYWdlLnR5cGUsXG5cdFx0XHRcdFx0dGFyZ2V0OiBcIlwiLFxuXHRcdFx0XHRcdHBlcnNpc3RlbnQ6IHRydWUsXG5cdFx0XHRcdFx0Y29kZTogbWVzc2FnZUNvZGVcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XHQvL1RoZSB0YXJnZXQgYW5kIHBlcnNpc3RlbnQgcHJvcGVydGllcyBvZiB0aGUgbWVzc2FnZSBhcmUgaGFyZGNvZGVkIGFzIFwiXCIgYW5kIHRydWUgYmVjYXVzZSB0aGUgZnVuY3Rpb24gZGVhbHMgd2l0aCBvbmx5IHVuYm91bmQgbWVzc2FnZXMuXG5cdFx0fSk7XG5cdH1cblx0Y29uc3Qgb01lc3NhZ2VEaWFsb2dNb2RlbCA9IG5ldyBKU09OTW9kZWwoKTtcblx0aWYgKGFVbmJvdW5kTWVzc2FnZXMubGVuZ3RoID09PSAxICYmIGFVbmJvdW5kTWVzc2FnZXNbMF0uZ2V0Q29kZSgpID09PSBcIjUwM1wiKSB7XG5cdFx0c2hvd01lc3NhZ2VCb3ggPSB0cnVlO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IG9MaXN0QmluZGluZyA9IG9NZXNzYWdlTWFuYWdlci5nZXRNZXNzYWdlTW9kZWwoKS5iaW5kTGlzdChcIi9cIiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGFGaWx0ZXJzKSxcblx0XHRcdGFDdXJyZW50Q29udGV4dHMgPSBvTGlzdEJpbmRpbmcuZ2V0Q3VycmVudENvbnRleHRzKCk7XG5cdFx0aWYgKGFDdXJyZW50Q29udGV4dHMgJiYgYUN1cnJlbnRDb250ZXh0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyBEb24ndCBzaG93IGRpYWxvZyBpbmNhc2UgdGhlcmUgYXJlIG5vIGVycm9ycyB0byBzaG93XG5cdFx0XHRzaG93TWVzc2FnZURpYWxvZyA9IHRydWU7XG5cdFx0XHQvLyBBcyBmaXRlcmluZyBoYXMgYWxyZWFkeSBoYXBwZW5lZCBoZXJlIGhlbmNlXG5cdFx0XHQvLyB1c2luZyB0aGUgbWVzc2FnZSBtb2RlbCBhZ2FpbiBmb3IgdGhlIG1lc3NhZ2UgZGlhbG9nIHZpZXcgYW5kIHRoZW4gZmlsdGVyaW5nIG9uIHRoYXQgYmluZGluZyBhZ2FpbiBpcyB1bm5lY2Vzc2FyeS5cblx0XHRcdC8vIFNvIHdlIGNyZWF0ZSBuZXcganNvbiBtb2RlbCB0byB1c2UgZm9yIHRoZSBtZXNzYWdlIGRpYWxvZyB2aWV3LlxuXHRcdFx0Y29uc3QgYU1lc3NhZ2VzOiBhbnlbXSA9IFtdO1xuXHRcdFx0YUN1cnJlbnRDb250ZXh0cy5mb3JFYWNoKGZ1bmN0aW9uKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0bGV0IG9NZXNzYWdlO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b0NvbnRleHQuZ2V0T2JqZWN0KCkudGVjaG5pY2FsRGV0YWlscyAmJlxuXHRcdFx0XHRcdGFNZXNzYWdlTGlzdC5pbmRleE9mKG9Db250ZXh0LmdldE9iamVjdCgpLnRlY2huaWNhbERldGFpbHMub3JpZ2luYWxNZXNzYWdlLm1lc3NhZ2UpID09PSAtMVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRhTWVzc2FnZUxpc3QucHVzaChvQ29udGV4dC5nZXRPYmplY3QoKS50ZWNobmljYWxEZXRhaWxzLm9yaWdpbmFsTWVzc2FnZS5tZXNzYWdlKTtcblx0XHRcdFx0XHRvTWVzc2FnZSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdGFNZXNzYWdlcy5wdXNoKG9NZXNzYWdlKTtcblx0XHRcdFx0XHRhTWVzc2FnZURhdGFMaXN0ID0gYU1lc3NhZ2VzO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCFvQ29udGV4dC5nZXRPYmplY3QoKS50ZWNobmljYWxEZXRhaWxzKSB7XG5cdFx0XHRcdFx0b01lc3NhZ2UgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRhTWVzc2FnZXMucHVzaChvTWVzc2FnZSk7XG5cdFx0XHRcdFx0YU1lc3NhZ2VEYXRhTGlzdCA9IGFNZXNzYWdlcztcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHQvLyBpZihhTWVzc2FnZXMubGVuZ3RoID09PSAwICYmIGFNZXNzYWdlTGlzdC5sZW5ndGgpIHtcblx0XHRcdC8vIFx0b01lc3NhZ2VEaWFsb2dNb2RlbC5zZXREYXRhKGFNZXNzYWdlcyk7XG5cdFx0XHQvLyB9XG5cdFx0XHRvTWVzc2FnZURpYWxvZ01vZGVsLnNldERhdGEoYU1lc3NhZ2VEYXRhTGlzdCk7XG5cdFx0fVxuXHR9XG5cdGlmIChhVW5ib3VuZE1lc3NhZ2VzLmxlbmd0aCA9PT0gMCAmJiAhYUN1c3RvbU1lc3NhZ2VzICYmICFiSGFzRXRhZ01lc3NhZ2UpIHtcblx0XHQvLyBEb24ndCBzaG93IHRoZSBwb3B1cCBpZiB0aGVyZSBhcmUgbm8gdHJhbnNpZW50IG1lc3NhZ2VzXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0fSBlbHNlIGlmIChhVW5ib3VuZE1lc3NhZ2VzLmxlbmd0aCA9PT0gMSAmJiBhVW5ib3VuZE1lc3NhZ2VzWzBdLmdldFR5cGUoKSA9PT0gTWVzc2FnZVR5cGUuU3VjY2VzcyAmJiAhYUN1c3RvbU1lc3NhZ2VzKSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuXHRcdFx0TWVzc2FnZVRvYXN0LnNob3coYVVuYm91bmRNZXNzYWdlc1swXS5tZXNzYWdlKTtcblx0XHRcdG9NZXNzYWdlTWFuYWdlci5yZW1vdmVNZXNzYWdlcyhhVW5ib3VuZE1lc3NhZ2VzKTtcblx0XHRcdHJlc29sdmUoKTtcblx0XHR9KTtcblx0fSBlbHNlIGlmIChzaG93TWVzc2FnZURpYWxvZykge1xuXHRcdGFSZXNvbHZlRnVuY3Rpb25zID0gYVJlc29sdmVGdW5jdGlvbnMgfHwgW107XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGFSZXNvbHZlRnVuY3Rpb25zLnB1c2gocmVzb2x2ZSk7XG5cdFx0XHQoc2FwLnVpLmdldENvcmUoKS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiLCB0cnVlKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24ob1Jlc291cmNlQnVuZGxlOiBhbnkpIHtcblx0XHRcdFx0XHRjb25zdCBiU3RyaWN0SGFuZGxpbmdGbG93ID0gZmFsc2U7XG5cdFx0XHRcdFx0Y29uc3QgYkhhc0V0YWdNZXNzYWdlID0gZm5Nb2RpZnlFVGFnTWVzc2FnZXNPbmx5KG9NZXNzYWdlTWFuYWdlciwgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0XHRjb25zdCBvTWVzc2FnZU9iamVjdCA9IHByZXBhcmVNZXNzYWdlVmlld0ZvckRpYWxvZyhvTWVzc2FnZURpYWxvZ01vZGVsLCBiU3RyaWN0SGFuZGxpbmdGbG93KTtcblx0XHRcdFx0XHRvRGlhbG9nID1cblx0XHRcdFx0XHRcdG9EaWFsb2cgfHxcblx0XHRcdFx0XHRcdG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdFx0XHRyZXNpemFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IG9NZXNzYWdlT2JqZWN0Lm9NZXNzYWdlVmlldyxcblx0XHRcdFx0XHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRkaWFsb2dDbG9zZUhhbmRsZXIoKTtcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGFsc28gcmVtb3ZlIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgaWYgd2Ugd2VyZSBzaG93aW5nIHRoZW1cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChiU2hvd0JvdW5kVHJhbnNpdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0dGV4dDogb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX0NPTU1PTl9TQVBGRV9DTE9TRVwiKVxuXHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdFx0Y3VzdG9tSGVhZGVyOiBuZXcgQmFyKHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZW50TWlkZGxlOiBbXG5cdFx0XHRcdFx0XHRcdFx0XHRuZXcgVGV4dCh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRleHQ6IG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVcIilcblx0XHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdFx0XHRjb250ZW50TGVmdDogW29CYWNrQnV0dG9uXVxuXHRcdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdFx0Y29udGVudFdpZHRoOiBcIjM3LjVlbVwiLFxuXHRcdFx0XHRcdFx0XHRjb250ZW50SGVpZ2h0OiBcIjIxLjVlbVwiLFxuXHRcdFx0XHRcdFx0XHR2ZXJ0aWNhbFNjcm9sbGluZzogZmFsc2UsXG5cdFx0XHRcdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYVJlc29sdmVGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFSZXNvbHZlRnVuY3Rpb25zW2ldLmNhbGwoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YVJlc29sdmVGdW5jdGlvbnMgPSBbXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRpZiAoYkhhc0V0YWdNZXNzYWdlKSB7XG5cdFx0XHRcdFx0XHRzYXAudWkucmVxdWlyZShbXCJzYXAvbS9CdXR0b25UeXBlXCJdLCBmdW5jdGlvbihCdXR0b25UeXBlOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRCZWdpbkJ1dHRvbihcblx0XHRcdFx0XHRcdFx0XHRuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGlhbG9nQ2xvc2VIYW5kbGVyKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0LnJlZnJlc2goKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHR0ZXh0OiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX1JFRlJFU0hcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBCdXR0b25UeXBlLkVtcGhhc2l6ZWRcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveUJlZ2luQnV0dG9uKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHNIaWdoZXN0UHJpb3JpdHkgPSBmbkdldEhpZ2hlc3RNZXNzYWdlUHJpb3JpdHkob01lc3NhZ2VWaWV3LmdldEl0ZW1zKCkpO1xuXHRcdFx0XHRcdHNIaWdoZXN0UHJpb3JpdHlUZXh0ID0gZ2V0VHJhbnNsYXRlZFRleHRGb3JNZXNzYWdlRGlhbG9nKHNIaWdoZXN0UHJpb3JpdHkpO1xuXHRcdFx0XHRcdG9EaWFsb2cuc2V0U3RhdGUoc0hpZ2hlc3RQcmlvcml0eSk7XG5cdFx0XHRcdFx0KG9EaWFsb2cuZ2V0Q3VzdG9tSGVhZGVyKCkgYXMgYW55KS5nZXRDb250ZW50TWlkZGxlKClbMF0uc2V0VGV4dChzSGlnaGVzdFByaW9yaXR5VGV4dCk7XG5cdFx0XHRcdFx0b01lc3NhZ2VWaWV3Lm5hdmlnYXRlQmFjaygpO1xuXHRcdFx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2gocmVqZWN0KTtcblx0XHR9KTtcblx0fSBlbHNlIGlmIChzaG93TWVzc2FnZUJveCkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XG5cdFx0XHRjb25zdCBvTWVzc2FnZSA9IGFVbmJvdW5kTWVzc2FnZXNbMF07XG5cdFx0XHRpZiAob01lc3NhZ2UudGVjaG5pY2FsRGV0YWlscyAmJiBhTWVzc2FnZUxpc3QuaW5kZXhPZihvTWVzc2FnZS50ZWNobmljYWxEZXRhaWxzLm9yaWdpbmFsTWVzc2FnZS5tZXNzYWdlKSA9PT0gLTEpIHtcblx0XHRcdFx0YU1lc3NhZ2VMaXN0LnB1c2gob01lc3NhZ2UudGVjaG5pY2FsRGV0YWlscy5vcmlnaW5hbE1lc3NhZ2UubWVzc2FnZSk7XG5cdFx0XHRcdGxldCBmb3JtYXR0ZWRUZXh0U3RyaW5nID0gXCI8aHRtbD48Ym9keT5cIjtcblx0XHRcdFx0Y29uc3QgcmV0cnlBZnRlck1lc3NhZ2UgPSBnZXRSZXRyeUFmdGVyTWVzc2FnZShvTWVzc2FnZSwgdHJ1ZSk7XG5cdFx0XHRcdGlmIChyZXRyeUFmdGVyTWVzc2FnZSkge1xuXHRcdFx0XHRcdGZvcm1hdHRlZFRleHRTdHJpbmcgPSBcIjxoNj5cIiArIHJldHJ5QWZ0ZXJNZXNzYWdlICsgXCI8L2g2Pjxicj5cIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3JtYXR0ZWRUZXh0U3RyaW5nID0gZm9ybWF0dGVkVGV4dFN0cmluZyArIG9NZXNzYWdlLmdldE1lc3NhZ2UoKSArIFwiPC9odG1sPjwvYm9keT5cIjtcblx0XHRcdFx0Y29uc3QgZm9ybWF0dGVkVGV4dDogYW55ID0gbmV3IEZvcm1hdHRlZFRleHQoe1xuXHRcdFx0XHRcdGh0bWxUZXh0OiBmb3JtYXR0ZWRUZXh0U3RyaW5nXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRNZXNzYWdlQm94LmVycm9yKGZvcm1hdHRlZFRleHQsIHtcblx0XHRcdFx0XHRvbkNsb3NlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGFNZXNzYWdlTGlzdCA9IFtdO1xuXHRcdFx0XHRcdFx0aWYgKGJTaG93Qm91bmRUcmFuc2l0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdHJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcblx0fVxufVxuZnVuY3Rpb24gZ2V0VHJhbnNsYXRlZFRleHRGb3JNZXNzYWdlRGlhbG9nKHNIaWdoZXN0UHJpb3JpdHk6IGFueSkge1xuXHRjb25zdCBvUmVzb3VyY2VCdW5kbGUgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIFJlc291cmNlQnVuZGxlO1xuXHRzd2l0Y2ggKHNIaWdoZXN0UHJpb3JpdHkpIHtcblx0XHRjYXNlIFwiRXJyb3JcIjpcblx0XHRcdHJldHVybiBvUmVzb3VyY2VCdW5kbGUuZ2V0VGV4dChcIkNfQ09NTU9OX1NBUEZFX0VSUk9SX01FU1NBR0VTX1BBR0VfVElUTEVfRVJST1JcIik7XG5cdFx0Y2FzZSBcIkluZm9ybWF0aW9uXCI6XG5cdFx0XHRyZXR1cm4gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfRVJST1JfTUVTU0FHRVNfUEFHRV9USVRMRV9JTkZPXCIpO1xuXHRcdGNhc2UgXCJTdWNjZXNzXCI6XG5cdFx0XHRyZXR1cm4gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfRVJST1JfTUVTU0FHRVNfUEFHRV9USVRMRV9TVUNDRVNTXCIpO1xuXHRcdGNhc2UgXCJXYXJuaW5nXCI6XG5cdFx0XHRyZXR1cm4gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfRVJST1JfTUVTU0FHRVNfUEFHRV9USVRMRV9XQVJOSU5HXCIpO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfRVJST1JfTUVTU0FHRVNfUEFHRV9USVRMRVwiKTtcblx0fVxufVxuZnVuY3Rpb24gcmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcygpIHtcblx0cmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKGZhbHNlKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCkge1xuXHRyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXModHJ1ZSk7XG59XG5mdW5jdGlvbiBnZXRNZXNzYWdlcyhiQm91bmRNZXNzYWdlczogYm9vbGVhbiA9IGZhbHNlLCBiVHJhbnNpdGlvbk9ubHk6IGJvb2xlYW4gPSBmYWxzZSkge1xuXHRsZXQgaTtcblx0Y29uc3Qgb01lc3NhZ2VNYW5hZ2VyID0gKHNhcC51aS5nZXRDb3JlKCkgYXMgYW55KS5nZXRNZXNzYWdlTWFuYWdlcigpLFxuXHRcdG9NZXNzYWdlTW9kZWwgPSBvTWVzc2FnZU1hbmFnZXIuZ2V0TWVzc2FnZU1vZGVsKCksXG5cdFx0YU1lc3NhZ2VzID0gb01lc3NhZ2VNb2RlbC5nZXRPYmplY3QoXCIvXCIpLFxuXHRcdG9SZXNvdXJjZUJ1bmRsZSA9IHNhcC51aS5nZXRDb3JlKCkuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIikgYXMgUmVzb3VyY2VCdW5kbGUsXG5cdFx0YVRyYW5zaXRpb25NZXNzYWdlcyA9IFtdO1xuXG5cdGZvciAoaSA9IDA7IGkgPCBhTWVzc2FnZXMubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAoXG5cdFx0XHQoIWJUcmFuc2l0aW9uT25seSB8fCBhTWVzc2FnZXNbaV0ucGVyc2lzdGVudCkgJiZcblx0XHRcdCgoYkJvdW5kTWVzc2FnZXMgJiYgYU1lc3NhZ2VzW2ldLnRhcmdldCAhPT0gXCJcIikgfHwgKCFiQm91bmRNZXNzYWdlcyAmJiAoIWFNZXNzYWdlc1tpXS50YXJnZXQgfHwgYU1lc3NhZ2VzW2ldLnRhcmdldCA9PT0gXCJcIikpKSAmJlxuXHRcdFx0YU1lc3NhZ2VzW2ldLmNvZGVcblx0XHQpIHtcblx0XHRcdGFUcmFuc2l0aW9uTWVzc2FnZXMucHVzaChhTWVzc2FnZXNbaV0pO1xuXHRcdH1cblx0fVxuXG5cdGZvciAoaSA9IDA7IGkgPCBhVHJhbnNpdGlvbk1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKFxuXHRcdFx0YVRyYW5zaXRpb25NZXNzYWdlc1tpXS5jb2RlID09PSBcIjUwM1wiICYmXG5cdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldLm1lc3NhZ2UgIT09IFwiXCIgJiZcblx0XHRcdGFUcmFuc2l0aW9uTWVzc2FnZXNbaV0ubWVzc2FnZS5pbmRleE9mKG9SZXNvdXJjZUJ1bmRsZS5nZXRUZXh0KFwiQ19NRVNTQUdFX0hBTkRMSU5HX1NBUEZFXzUwM19CQUNLRU5EX1BSRUZJWFwiKSkgPT09IC0xXG5cdFx0KSB7XG5cdFx0XHRhVHJhbnNpdGlvbk1lc3NhZ2VzW2ldLm1lc3NhZ2UgPVxuXHRcdFx0XHRcIlxcblwiICsgb1Jlc291cmNlQnVuZGxlLmdldFRleHQoXCJDX01FU1NBR0VfSEFORExJTkdfU0FQRkVfNTAzX0JBQ0tFTkRfUFJFRklYXCIpICsgYVRyYW5zaXRpb25NZXNzYWdlc1tpXS5tZXNzYWdlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYVRyYW5zaXRpb25NZXNzYWdlcztcbn1cbmZ1bmN0aW9uIHJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyhiQm91bmRNZXNzYWdlczogYW55KSB7XG5cdGNvbnN0IGFNZXNzYWdlc1RvQmVEZWxldGVkID0gZ2V0TWVzc2FnZXMoYkJvdW5kTWVzc2FnZXMsIHRydWUpO1xuXG5cdGlmIChhTWVzc2FnZXNUb0JlRGVsZXRlZC5sZW5ndGggPiAwKSB7XG5cdFx0KHNhcC51aS5nZXRDb3JlKCkgYXMgYW55KS5nZXRNZXNzYWdlTWFuYWdlcigpLnJlbW92ZU1lc3NhZ2VzKGFNZXNzYWdlc1RvQmVEZWxldGVkKTtcblx0fVxufVxuXG4vKipcbiAqIFN0YXRpYyBmdW5jdGlvbnMgZm9yIEZpb3JpIE1lc3NhZ2UgSGFuZGxpbmdcbiAqXG4gKiBAbmFtZXNwYWNlXG4gKiBAYWxpYXMgc2FwLmZlLmNvcmUuYWN0aW9ucy5tZXNzYWdlSGFuZGxpbmdcbiAqIEBwcml2YXRlXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgbW9kdWxlIGlzIG9ubHkgZm9yIGV4cGVyaW1lbnRhbCB1c2UhIDxici8+PGI+VGhpcyBpcyBvbmx5IGEgUE9DIGFuZCBtYXliZSBkZWxldGVkPC9iPlxuICogQHNpbmNlIDEuNTYuMFxuICovXG5jb25zdCBtZXNzYWdlSGFuZGxpbmc6IG1lc3NhZ2VIYW5kbGluZ1R5cGUgPSB7XG5cdGdldE1lc3NhZ2VzOiBnZXRNZXNzYWdlcyxcblx0c2hvd1VuYm91bmRNZXNzYWdlczogc2hvd1VuYm91bmRNZXNzYWdlcyxcblx0cmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlczogcmVtb3ZlVW5ib3VuZFRyYW5zaXRpb25NZXNzYWdlcyxcblx0cmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXM6IHJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzLFxuXHRtb2RpZnlFVGFnTWVzc2FnZXNPbmx5OiBmbk1vZGlmeUVUYWdNZXNzYWdlc09ubHksXG5cdGdldFJldHJ5QWZ0ZXJNZXNzYWdlOiBnZXRSZXRyeUFmdGVyTWVzc2FnZSxcblx0cHJlcGFyZU1lc3NhZ2VWaWV3Rm9yRGlhbG9nOiBwcmVwYXJlTWVzc2FnZVZpZXdGb3JEaWFsb2dcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1lc3NhZ2VIYW5kbGluZztcbiJdfQ==
|