@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
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define(["sap/ui/model/Filter", "sap/ui/model/FilterOperator", "./ModelHelper"], function (Filter, FilterOperator, ModelHelper) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var AppStartupHelper = {
|
|
9
|
+
/**
|
|
10
|
+
* Retrieves a set of key values from startup parameters.
|
|
11
|
+
*
|
|
12
|
+
* @param aKeyNames The array of key names
|
|
13
|
+
* @param oStartupParameters The startup parameters
|
|
14
|
+
* @returns {any[]} An array of pairs {name, value} if all key values could be found in the startup parameters, undefined otherwise
|
|
15
|
+
*/
|
|
16
|
+
_getKeysFromStartupParams: function (aKeyNames, oStartupParameters) {
|
|
17
|
+
var bAllFound = true;
|
|
18
|
+
var aKeys = aKeyNames.map(function (name) {
|
|
19
|
+
if (oStartupParameters[name] && oStartupParameters[name].length === 1) {
|
|
20
|
+
return {
|
|
21
|
+
name: name,
|
|
22
|
+
value: oStartupParameters[name][0]
|
|
23
|
+
};
|
|
24
|
+
} else {
|
|
25
|
+
// A unique key value couldn't be found in the startup parameters
|
|
26
|
+
bAllFound = false;
|
|
27
|
+
return {
|
|
28
|
+
name: name,
|
|
29
|
+
value: ""
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
return bAllFound ? aKeys : undefined;
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Creates a filter from a list of key values.
|
|
38
|
+
*
|
|
39
|
+
* @param aKeys Array of semantic keys or technical keys (with values)
|
|
40
|
+
* @param bDraftMode True if the entity supports draft mode
|
|
41
|
+
* @param oMetaModel The metamodel
|
|
42
|
+
* @returns The filter
|
|
43
|
+
*/
|
|
44
|
+
_createFilterFromKeys: function (aKeys, bDraftMode, oMetaModel) {
|
|
45
|
+
var bFilterCaseSensitive = ModelHelper.isFilteringCaseSensitive(oMetaModel);
|
|
46
|
+
var bFilterOnActiveEntity = false;
|
|
47
|
+
var aFilters = aKeys.map(function (key) {
|
|
48
|
+
if (key.name === "IsActiveEntity") {
|
|
49
|
+
bFilterOnActiveEntity = true;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return new Filter({
|
|
53
|
+
path: key.name,
|
|
54
|
+
operator: FilterOperator.EQ,
|
|
55
|
+
value1: key.value,
|
|
56
|
+
caseSensitive: bFilterCaseSensitive
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
if (bDraftMode && !bFilterOnActiveEntity) {
|
|
61
|
+
var oDraftFilter = new Filter({
|
|
62
|
+
filters: [new Filter("IsActiveEntity", "EQ", false), new Filter("SiblingEntity/IsActiveEntity", "EQ", null)],
|
|
63
|
+
and: false
|
|
64
|
+
});
|
|
65
|
+
aFilters.push(oDraftFilter);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return new Filter(aFilters, true);
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Loads all contexts for a list of page infos.
|
|
73
|
+
*
|
|
74
|
+
* @param aStartupPages The list of page infos
|
|
75
|
+
* @param oModel The model used to load the contexts
|
|
76
|
+
* @returns A Promise for all contexts
|
|
77
|
+
*/
|
|
78
|
+
_requestObjectsFromParameters: function (aStartupPages, oModel) {
|
|
79
|
+
var _this = this;
|
|
80
|
+
|
|
81
|
+
// Load the respective objects for all object pages found in aExternallyNavigablePages
|
|
82
|
+
var aContextPromises = aStartupPages.map(function (pageInfo) {
|
|
83
|
+
var aKeys = pageInfo.semanticKeys || pageInfo.technicalKeys || [];
|
|
84
|
+
|
|
85
|
+
var oFilter = _this._createFilterFromKeys(aKeys, pageInfo.draftMode, oModel.getMetaModel()); // only request a minimum of fields to boost backend performance since this is only used to check if an object exists
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
var oListBind = oModel.bindList(pageInfo.contextPath, undefined, undefined, oFilter, {
|
|
89
|
+
"$select": aKeys.map(function (key) {
|
|
90
|
+
return key.name;
|
|
91
|
+
}).join(",")
|
|
92
|
+
});
|
|
93
|
+
return oListBind.requestContexts(0, 2);
|
|
94
|
+
});
|
|
95
|
+
return Promise.all(aContextPromises);
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Creates a PageInfo from a route if ti's reachable from the startup parameters.
|
|
100
|
+
*
|
|
101
|
+
* @param oRoute The route
|
|
102
|
+
* @param oManifestRouting The app manifest routing section
|
|
103
|
+
* @param oStartupParameters The startup parameters
|
|
104
|
+
* @param oMetaModel The app metamodel
|
|
105
|
+
* @returns A page info if the page is reachable, undefined otherwise
|
|
106
|
+
*/
|
|
107
|
+
_getReachablePageInfoFromRoute: function (oRoute, oManifestRouting, oStartupParameters, oMetaModel) {
|
|
108
|
+
var _oTarget$options, _oTarget$options$sett;
|
|
109
|
+
|
|
110
|
+
// Remove trailing ':?query:' and '/'
|
|
111
|
+
var sPattern = oRoute.pattern.replace(":?query:", "");
|
|
112
|
+
sPattern = sPattern.replace(/\/$/, "");
|
|
113
|
+
|
|
114
|
+
if (!sPattern) {
|
|
115
|
+
return undefined; // Ignore level-0 routes (ListReport)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
sPattern = sPattern.replace(/\(\{[^\}]*\}\)/g, "(#)"); // Replace keys with #
|
|
119
|
+
// Get the rightmost target for this route
|
|
120
|
+
|
|
121
|
+
var sTargetName = Array.isArray(oRoute.target) ? oRoute.target[oRoute.target.length - 1] : oRoute.target;
|
|
122
|
+
var oTarget = oManifestRouting.targets[sTargetName];
|
|
123
|
+
var aPatternSegments = sPattern.split("/");
|
|
124
|
+
var pageLevel = aPatternSegments.length - 1;
|
|
125
|
+
|
|
126
|
+
if (pageLevel !== 0 && (oTarget === null || oTarget === void 0 ? void 0 : (_oTarget$options = oTarget.options) === null || _oTarget$options === void 0 ? void 0 : (_oTarget$options$sett = _oTarget$options.settings) === null || _oTarget$options$sett === void 0 ? void 0 : _oTarget$options$sett.allowDeepLinking) !== true) {
|
|
127
|
+
// The first level of object page allows deep linking by default.
|
|
128
|
+
// Otherwise, the target must allow deep linking explicitely in the manifest
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
var sContextPath = oTarget.options.settings.contextPath || oTarget.options.settings.entitySet && "/" + oTarget.options.settings.entitySet;
|
|
133
|
+
var oEntityType = sContextPath && oMetaModel.getObject("/$EntityContainer" + sContextPath + "/");
|
|
134
|
+
|
|
135
|
+
if (!oEntityType) {
|
|
136
|
+
return undefined;
|
|
137
|
+
} // Get the semantic key values for the entity
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
var aSemanticKeyNames = oMetaModel.getObject("/$EntityContainer" + sContextPath + "/@com.sap.vocabularies.Common.v1.SemanticKey");
|
|
141
|
+
var aSemantickKeys = aSemanticKeyNames ? this._getKeysFromStartupParams(aSemanticKeyNames.map(function (semKey) {
|
|
142
|
+
return semKey.$PropertyPath;
|
|
143
|
+
}), oStartupParameters) : undefined; // Get the technical keys only if we couldn't find the semantic key values, and on first level OP
|
|
144
|
+
|
|
145
|
+
var aTechnicalKeys = !aSemantickKeys && pageLevel === 0 ? this._getKeysFromStartupParams(oEntityType["$Key"], oStartupParameters) : undefined;
|
|
146
|
+
|
|
147
|
+
if (aSemantickKeys === undefined && aTechnicalKeys === undefined) {
|
|
148
|
+
// We couldn't find the semantic/technical keys in the startup parameters
|
|
149
|
+
return undefined;
|
|
150
|
+
} // The startup parameters contain values for all semantic keys (or technical keys) --> we can store the page info in the corresponding level
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
var draftMode = oMetaModel.getObject("/$EntityContainer" + sContextPath + "@com.sap.vocabularies.Common.v1.DraftRoot") || oMetaModel.getObject("/$EntityContainer" + sContextPath + "@com.sap.vocabularies.Common.v1.DraftNode") ? true : false;
|
|
154
|
+
return {
|
|
155
|
+
pattern: sPattern,
|
|
156
|
+
contextPath: sContextPath,
|
|
157
|
+
draftMode: draftMode,
|
|
158
|
+
technicalKeys: aTechnicalKeys,
|
|
159
|
+
semanticKeys: aSemantickKeys,
|
|
160
|
+
target: sTargetName,
|
|
161
|
+
pageLevel: pageLevel
|
|
162
|
+
};
|
|
163
|
+
},
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Returns the list of all pages that allow deeplink and that can be reached using the startup parameters.
|
|
167
|
+
*
|
|
168
|
+
* @param oManifestRouting The routing information from the app manifest
|
|
169
|
+
* @param oStartupParameters The startup parameters
|
|
170
|
+
* @param oMetaModel The metamodel
|
|
171
|
+
* @returns
|
|
172
|
+
*/
|
|
173
|
+
_getReachablePages: function (oManifestRouting, oStartupParameters, oMetaModel) {
|
|
174
|
+
var _this2 = this;
|
|
175
|
+
|
|
176
|
+
var aRoutes = oManifestRouting.routes;
|
|
177
|
+
var mPagesByLevel = {};
|
|
178
|
+
aRoutes.forEach(function (oRoute) {
|
|
179
|
+
var oPageInfo = _this2._getReachablePageInfoFromRoute(oRoute, oManifestRouting, oStartupParameters, oMetaModel);
|
|
180
|
+
|
|
181
|
+
if (oPageInfo) {
|
|
182
|
+
if (!mPagesByLevel[oPageInfo.pageLevel]) {
|
|
183
|
+
mPagesByLevel[oPageInfo.pageLevel] = [];
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
mPagesByLevel[oPageInfo.pageLevel].push(oPageInfo);
|
|
187
|
+
}
|
|
188
|
+
}); // A page is reachable only if all its parents are also reachable
|
|
189
|
+
// So if we couldn't find any pages for a given level, all pages with a higher level won't be reachable anyway
|
|
190
|
+
|
|
191
|
+
var aReachablePages = [];
|
|
192
|
+
var level = 0;
|
|
193
|
+
|
|
194
|
+
while (mPagesByLevel[level]) {
|
|
195
|
+
aReachablePages.push(mPagesByLevel[level]);
|
|
196
|
+
level++;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return aReachablePages;
|
|
200
|
+
},
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Get the list of startup pages.
|
|
204
|
+
*
|
|
205
|
+
* @param oManifestRouting The routing information from the app manifest
|
|
206
|
+
* @param oStartupParameters The startup parameters
|
|
207
|
+
* @param oMetaModel The metamodel
|
|
208
|
+
* @returns An array of startup page infos
|
|
209
|
+
*/
|
|
210
|
+
_getStartupPagesFromStartupParams: function (oManifestRouting, oStartupParameters, oMetaModel) {
|
|
211
|
+
// Find all pages that can be reached with the startup parameters
|
|
212
|
+
var aReachablePages = this._getReachablePages(oManifestRouting, oStartupParameters, oMetaModel);
|
|
213
|
+
|
|
214
|
+
if (aReachablePages.length === 0) {
|
|
215
|
+
return [];
|
|
216
|
+
} // Find the longest sequence of pages that can be reached (recursively)
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
var result = [];
|
|
220
|
+
var current = [];
|
|
221
|
+
|
|
222
|
+
function findRecursive(level) {
|
|
223
|
+
var aCurrentLevelPages = aReachablePages[level];
|
|
224
|
+
var lastPage = current.length ? current[current.length - 1] : undefined;
|
|
225
|
+
|
|
226
|
+
if (aCurrentLevelPages) {
|
|
227
|
+
aCurrentLevelPages.forEach(function (nextPage) {
|
|
228
|
+
if (!lastPage || nextPage.pattern.indexOf(lastPage.pattern) === 0) {
|
|
229
|
+
// We only consider pages that can be reached from the page at the previous level,
|
|
230
|
+
// --> their pattern must be the pattern of the previous page with another segment appended
|
|
231
|
+
current.push(nextPage);
|
|
232
|
+
findRecursive(level + 1);
|
|
233
|
+
current.pop();
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (current.length > result.length) {
|
|
239
|
+
result = current.slice(); // We have found a sequence longer than our previous best --> store it as the new longest
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
findRecursive(0);
|
|
244
|
+
return result;
|
|
245
|
+
},
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Creates the startup object from the list of pages and contexts.
|
|
249
|
+
*
|
|
250
|
+
* @param aStartupPages The pages
|
|
251
|
+
* @param aContexts The contexts
|
|
252
|
+
* @returns An object containing either a hash or a context to navigate to, or an empty object if no deep link was found
|
|
253
|
+
*/
|
|
254
|
+
_getDeepLinkObject: function (aStartupPages, aContexts) {
|
|
255
|
+
if (aContexts.length === 1) {
|
|
256
|
+
return {
|
|
257
|
+
context: aContexts[0]
|
|
258
|
+
};
|
|
259
|
+
} else if (aContexts.length > 1) {
|
|
260
|
+
// Navigation to a deeper level --> use the pattern of the deepest object page
|
|
261
|
+
// and replace the parameters by the ID from the contexts
|
|
262
|
+
var hash = aStartupPages[aStartupPages.length - 1].pattern;
|
|
263
|
+
aContexts.forEach(function (oContext) {
|
|
264
|
+
hash = hash.replace("(#)", "(" + oContext.getPath().split("(")[1]);
|
|
265
|
+
});
|
|
266
|
+
return {
|
|
267
|
+
hash: hash
|
|
268
|
+
};
|
|
269
|
+
} else {
|
|
270
|
+
return {};
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Calculates startup parameters for a deeplink case, from startup parameters and routing infoirmation.
|
|
276
|
+
*
|
|
277
|
+
* @param oManifestRouting The routing information from the app manifest
|
|
278
|
+
* @param oStartupParameters The startup parameters
|
|
279
|
+
* @param oModel The OData model
|
|
280
|
+
* @returns An object containing either a hash or a context to navigate to, or an empty object if no deep link was found
|
|
281
|
+
*/
|
|
282
|
+
getDeepLinkStartupHash: function (oManifestRouting, oStartupParameters, oModel) {
|
|
283
|
+
var _this3 = this;
|
|
284
|
+
|
|
285
|
+
var aStartupPages;
|
|
286
|
+
return oModel.getMetaModel().requestObject("/$EntityContainer/").then(function () {
|
|
287
|
+
// Check if semantic keys are present in url parameters for every object page at each level
|
|
288
|
+
aStartupPages = _this3._getStartupPagesFromStartupParams(oManifestRouting, oStartupParameters, oModel.getMetaModel());
|
|
289
|
+
return _this3._requestObjectsFromParameters(aStartupPages, oModel);
|
|
290
|
+
}).then(function (aValues) {
|
|
291
|
+
if (aValues.length) {
|
|
292
|
+
// Make sure we only get 1 context per promise, and flatten the array
|
|
293
|
+
var aContexts = [];
|
|
294
|
+
aValues.forEach(function (aFoundContexts) {
|
|
295
|
+
if (aFoundContexts.length === 1) {
|
|
296
|
+
aContexts.push(aFoundContexts[0]);
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
return aContexts.length === aValues.length ? _this3._getDeepLinkObject(aStartupPages, aContexts) : {};
|
|
300
|
+
} else {
|
|
301
|
+
return {};
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
},
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Calculates the new hash based on the startup parameters.
|
|
308
|
+
*
|
|
309
|
+
* @param oStartupParameters The startup parameter values (map parameter name -> array of values)
|
|
310
|
+
* @param sContextPath The context path for the startup of the app (generally the path to the main entity set)
|
|
311
|
+
* @param oRouter The router instance
|
|
312
|
+
* @param oMetaModel The meta model
|
|
313
|
+
* @returns A promise containing the hash to navigate to, or an empty string if there's no need to navigate
|
|
314
|
+
*/
|
|
315
|
+
getCreateStartupHash: function (oStartupParameters, sContextPath, oRouter, oMetaModel) {
|
|
316
|
+
var _this4 = this;
|
|
317
|
+
|
|
318
|
+
return oMetaModel.requestObject(sContextPath + "@").then(function (oEntitySetAnnotations) {
|
|
319
|
+
var sMetaPath = "";
|
|
320
|
+
var bCreatable = true;
|
|
321
|
+
|
|
322
|
+
if (oEntitySetAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"] && oEntitySetAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"]["NewAction"]) {
|
|
323
|
+
sMetaPath = sContextPath + "@com.sap.vocabularies.Common.v1.DraftRoot/NewAction@Org.OData.Core.V1.OperationAvailable";
|
|
324
|
+
} else if (oEntitySetAnnotations["@com.sap.vocabularies.Session.v1.StickySessionSupported"] && oEntitySetAnnotations["@com.sap.vocabularies.Session.v1.StickySessionSupported"]["NewAction"]) {
|
|
325
|
+
sMetaPath = sContextPath + "@com.sap.vocabularies.Session.v1.StickySessionSupported/NewAction@Org.OData.Core.V1.OperationAvailable";
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if (sMetaPath) {
|
|
329
|
+
var bNewActionOperationAvailable = oMetaModel.getObject(sMetaPath);
|
|
330
|
+
|
|
331
|
+
if (bNewActionOperationAvailable === false) {
|
|
332
|
+
bCreatable = false;
|
|
333
|
+
}
|
|
334
|
+
} else {
|
|
335
|
+
var oInsertRestrictions = oEntitySetAnnotations["@Org.OData.Capabilities.V1.InsertRestrictions"];
|
|
336
|
+
|
|
337
|
+
if (oInsertRestrictions && oInsertRestrictions.Insertable === false) {
|
|
338
|
+
bCreatable = false;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
if (bCreatable) {
|
|
343
|
+
return _this4.getDefaultCreateHash(oStartupParameters, sContextPath, oRouter);
|
|
344
|
+
} else {
|
|
345
|
+
return "";
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
},
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Calculates the hash to create a new object.
|
|
352
|
+
*
|
|
353
|
+
* @param oStartupParameters The startup parameter values (map parameter name -> array of values)
|
|
354
|
+
* @param sContextPath The context path of the entity set to be used for the creation
|
|
355
|
+
* @param oRouter The router instance
|
|
356
|
+
* @returns The hash
|
|
357
|
+
*/
|
|
358
|
+
getDefaultCreateHash: function (oStartupParameters, sContextPath, oRouter) {
|
|
359
|
+
var sDefaultCreateHash = oStartupParameters && oStartupParameters.preferredMode ? oStartupParameters.preferredMode[0] : "create";
|
|
360
|
+
var sHash = "";
|
|
361
|
+
sDefaultCreateHash = sDefaultCreateHash.indexOf(":") !== -1 && sDefaultCreateHash.length > sDefaultCreateHash.indexOf(":") + 1 ? sDefaultCreateHash.substr(0, sDefaultCreateHash.indexOf(":")) : "create";
|
|
362
|
+
sHash = sContextPath.substring(1) + "(...)?i-action=" + sDefaultCreateHash;
|
|
363
|
+
|
|
364
|
+
if (oRouter.getRouteInfoByHash(sHash)) {
|
|
365
|
+
return sHash;
|
|
366
|
+
} else {
|
|
367
|
+
throw new Error("No route match for creating a new " + sContextPath.substring(1));
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
return AppStartupHelper;
|
|
372
|
+
}, false);
|
|
373
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkFwcFN0YXJ0dXBIZWxwZXIudHMiXSwibmFtZXMiOlsiQXBwU3RhcnR1cEhlbHBlciIsIl9nZXRLZXlzRnJvbVN0YXJ0dXBQYXJhbXMiLCJhS2V5TmFtZXMiLCJvU3RhcnR1cFBhcmFtZXRlcnMiLCJiQWxsRm91bmQiLCJhS2V5cyIsIm1hcCIsIm5hbWUiLCJsZW5ndGgiLCJ2YWx1ZSIsInVuZGVmaW5lZCIsIl9jcmVhdGVGaWx0ZXJGcm9tS2V5cyIsImJEcmFmdE1vZGUiLCJvTWV0YU1vZGVsIiwiYkZpbHRlckNhc2VTZW5zaXRpdmUiLCJNb2RlbEhlbHBlciIsImlzRmlsdGVyaW5nQ2FzZVNlbnNpdGl2ZSIsImJGaWx0ZXJPbkFjdGl2ZUVudGl0eSIsImFGaWx0ZXJzIiwia2V5IiwiRmlsdGVyIiwicGF0aCIsIm9wZXJhdG9yIiwiRmlsdGVyT3BlcmF0b3IiLCJFUSIsInZhbHVlMSIsImNhc2VTZW5zaXRpdmUiLCJvRHJhZnRGaWx0ZXIiLCJmaWx0ZXJzIiwiYW5kIiwicHVzaCIsIl9yZXF1ZXN0T2JqZWN0c0Zyb21QYXJhbWV0ZXJzIiwiYVN0YXJ0dXBQYWdlcyIsIm9Nb2RlbCIsImFDb250ZXh0UHJvbWlzZXMiLCJwYWdlSW5mbyIsInNlbWFudGljS2V5cyIsInRlY2huaWNhbEtleXMiLCJvRmlsdGVyIiwiZHJhZnRNb2RlIiwiZ2V0TWV0YU1vZGVsIiwib0xpc3RCaW5kIiwiYmluZExpc3QiLCJjb250ZXh0UGF0aCIsImpvaW4iLCJyZXF1ZXN0Q29udGV4dHMiLCJQcm9taXNlIiwiYWxsIiwiX2dldFJlYWNoYWJsZVBhZ2VJbmZvRnJvbVJvdXRlIiwib1JvdXRlIiwib01hbmlmZXN0Um91dGluZyIsInNQYXR0ZXJuIiwicGF0dGVybiIsInJlcGxhY2UiLCJzVGFyZ2V0TmFtZSIsIkFycmF5IiwiaXNBcnJheSIsInRhcmdldCIsIm9UYXJnZXQiLCJ0YXJnZXRzIiwiYVBhdHRlcm5TZWdtZW50cyIsInNwbGl0IiwicGFnZUxldmVsIiwib3B0aW9ucyIsInNldHRpbmdzIiwiYWxsb3dEZWVwTGlua2luZyIsInNDb250ZXh0UGF0aCIsImVudGl0eVNldCIsIm9FbnRpdHlUeXBlIiwiZ2V0T2JqZWN0IiwiYVNlbWFudGljS2V5TmFtZXMiLCJhU2VtYW50aWNrS2V5cyIsInNlbUtleSIsIiRQcm9wZXJ0eVBhdGgiLCJhVGVjaG5pY2FsS2V5cyIsIl9nZXRSZWFjaGFibGVQYWdlcyIsImFSb3V0ZXMiLCJyb3V0ZXMiLCJtUGFnZXNCeUxldmVsIiwiZm9yRWFjaCIsIm9QYWdlSW5mbyIsImFSZWFjaGFibGVQYWdlcyIsImxldmVsIiwiX2dldFN0YXJ0dXBQYWdlc0Zyb21TdGFydHVwUGFyYW1zIiwicmVzdWx0IiwiY3VycmVudCIsImZpbmRSZWN1cnNpdmUiLCJhQ3VycmVudExldmVsUGFnZXMiLCJsYXN0UGFnZSIsIm5leHRQYWdlIiwiaW5kZXhPZiIsInBvcCIsInNsaWNlIiwiX2dldERlZXBMaW5rT2JqZWN0IiwiYUNvbnRleHRzIiwiY29udGV4dCIsImhhc2giLCJvQ29udGV4dCIsImdldFBhdGgiLCJnZXREZWVwTGlua1N0YXJ0dXBIYXNoIiwicmVxdWVzdE9iamVjdCIsInRoZW4iLCJhVmFsdWVzIiwiYUZvdW5kQ29udGV4dHMiLCJnZXRDcmVhdGVTdGFydHVwSGFzaCIsIm9Sb3V0ZXIiLCJvRW50aXR5U2V0QW5ub3RhdGlvbnMiLCJzTWV0YVBhdGgiLCJiQ3JlYXRhYmxlIiwiYk5ld0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZSIsIm9JbnNlcnRSZXN0cmljdGlvbnMiLCJJbnNlcnRhYmxlIiwiZ2V0RGVmYXVsdENyZWF0ZUhhc2giLCJzRGVmYXVsdENyZWF0ZUhhc2giLCJwcmVmZXJyZWRNb2RlIiwic0hhc2giLCJzdWJzdHIiLCJzdWJzdHJpbmciLCJnZXRSb3V0ZUluZm9CeUhhc2giLCJFcnJvciJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7OztBQXFCQSxNQUFNQSxnQkFBZ0IsR0FBRztBQUN4QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FB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QUFLLEdBQUcsRUFBWjtBQUVBRixNQUFBQSxrQkFBa0IsR0FDakJBLGtCQUFrQixDQUFDdkIsT0FBbkIsQ0FBMkIsR0FBM0IsTUFBb0MsQ0FBQyxDQUFyQyxJQUEwQ3VCLGtCQUFrQixDQUFDekcsTUFBbkIsR0FBNEJ5RyxrQkFBa0IsQ0FBQ3ZCLE9BQW5CLENBQTJCLEdBQTNCLElBQWtDLENBQXhHLEdBQ0d1QixrQkFBa0IsQ0FBQ0csTUFBbkIsQ0FBMEIsQ0FBMUIsRUFBNkJILGtCQUFrQixDQUFDdkIsT0FBbkIsQ0FBMkIsR0FBM0IsQ0FBN0IsQ0FESCxHQUVHLFFBSEo7QUFJQXlCLE1BQUFBLEtBQUssR0FBR2pELFlBQVksQ0FBQ21ELFNBQWIsQ0FBdUIsQ0FBdkIsSUFBNEIsaUJBQTVCLEdBQWdESixrQkFBeEQ7O0FBQ0EsVUFBSVIsT0FBTyxDQUFDYSxrQkFBUixDQUEyQkgsS0FBM0IsQ0FBSixFQUF1QztBQUN0QyxlQUFPQSxLQUFQO0FBQ0EsT0FGRCxNQUVPO0FBQ04sY0FBTSxJQUFJSSxLQUFKLENBQVUsdUNBQXVDckQsWUFBWSxDQUFDbUQsU0FBYixDQUF1QixDQUF2QixDQUFqRCxDQUFOO0FBQ0E7QUFDRDtBQXRZdUIsR0FBekI7U0F5WWVySCxnQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgRmlsdGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvRmlsdGVyXCI7XG5pbXBvcnQgRmlsdGVyT3BlcmF0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9GaWx0ZXJPcGVyYXRvclwiO1xuaW1wb3J0IFJvdXRlciBmcm9tIFwic2FwL3VpL2NvcmUvcm91dGluZy9Sb3V0ZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwiLi9Nb2RlbEhlbHBlclwiO1xuXG50eXBlIFZhbHVlZEtleSA9IHtcblx0bmFtZTogc3RyaW5nO1xuXHR2YWx1ZTogc3RyaW5nO1xufTtcblxudHlwZSBQYWdlSW5mbyA9IHtcblx0cGF0dGVybjogc3RyaW5nO1xuXHRjb250ZXh0UGF0aDogc3RyaW5nO1xuXHRkcmFmdE1vZGU6IEJvb2xlYW47XG5cdHRlY2huaWNhbEtleXM6IFZhbHVlZEtleVtdIHwgdW5kZWZpbmVkO1xuXHRzZW1hbnRpY0tleXM6IFZhbHVlZEtleVtdIHwgdW5kZWZpbmVkO1xuXHR0YXJnZXQ6IHN0cmluZztcblx0cGFnZUxldmVsOiBudW1iZXI7XG59O1xuXG5jb25zdCBBcHBTdGFydHVwSGVscGVyID0ge1xuXHQvKipcblx0ICogUmV0cmlldmVzIGEgc2V0IG9mIGtleSB2YWx1ZXMgZnJvbSBzdGFydHVwIHBhcmFtZXRlcnMuXG5cdCAqXG5cdCAqIEBwYXJhbSBhS2V5TmFtZXMgVGhlIGFycmF5IG9mIGtleSBuYW1lc1xuXHQgKiBAcGFyYW0gb1N0YXJ0dXBQYXJhbWV0ZXJzIFRoZSBzdGFydHVwIHBhcmFtZXRlcnNcblx0ICogQHJldHVybnMge2FueVtdfSBBbiBhcnJheSBvZiBwYWlycyB7bmFtZSwgdmFsdWV9IGlmIGFsbCBrZXkgdmFsdWVzIGNvdWxkIGJlIGZvdW5kIGluIHRoZSBzdGFydHVwIHBhcmFtZXRlcnMsIHVuZGVmaW5lZCBvdGhlcndpc2Vcblx0ICovXG5cdF9nZXRLZXlzRnJvbVN0YXJ0dXBQYXJhbXM6IGZ1bmN0aW9uKGFLZXlOYW1lczogc3RyaW5nW10sIG9TdGFydHVwUGFyYW1ldGVyczogYW55KTogVmFsdWVkS2V5W10gfCB1bmRlZmluZWQge1xuXHRcdGxldCBiQWxsRm91bmQgPSB0cnVlO1xuXHRcdGNvbnN0IGFLZXlzID0gYUtleU5hbWVzLm1hcChuYW1lID0+IHtcblx0XHRcdGlmIChvU3RhcnR1cFBhcmFtZXRlcnNbbmFtZV0gJiYgb1N0YXJ0dXBQYXJhbWV0ZXJzW25hbWVdLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRyZXR1cm4geyBuYW1lLCB2YWx1ZTogb1N0YXJ0dXBQYXJhbWV0ZXJzW25hbWVdWzBdIGFzIHN0cmluZyB9O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gQSB1bmlxdWUga2V5IHZhbHVlIGNvdWxkbid0IGJlIGZvdW5kIGluIHRoZSBzdGFydHVwIHBhcmFtZXRlcnNcblx0XHRcdFx0YkFsbEZvdW5kID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybiB7IG5hbWUsIHZhbHVlOiBcIlwiIH07XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gYkFsbEZvdW5kID8gYUtleXMgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBmaWx0ZXIgZnJvbSBhIGxpc3Qgb2Yga2V5IHZhbHVlcy5cblx0ICpcblx0ICogQHBhcmFtIGFLZXlzIEFycmF5IG9mIHNlbWFudGljIGtleXMgb3IgdGVjaG5pY2FsIGtleXMgKHdpdGggdmFsdWVzKVxuXHQgKiBAcGFyYW0gYkRyYWZ0TW9kZSBUcnVlIGlmIHRoZSBlbnRpdHkgc3VwcG9ydHMgZHJhZnQgbW9kZVxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgbWV0YW1vZGVsXG5cdCAqIEByZXR1cm5zIFRoZSBmaWx0ZXJcblx0ICovXG5cdF9jcmVhdGVGaWx0ZXJGcm9tS2V5czogZnVuY3Rpb24oYUtleXM6IFZhbHVlZEtleVtdLCBiRHJhZnRNb2RlOiBCb29sZWFuLCBvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IEZpbHRlciB7XG5cdFx0Y29uc3QgYkZpbHRlckNhc2VTZW5zaXRpdmUgPSBNb2RlbEhlbHBlci5pc0ZpbHRlcmluZ0Nhc2VTZW5zaXRpdmUob01ldGFNb2RlbCk7XG5cblx0XHRsZXQgYkZpbHRlck9uQWN0aXZlRW50aXR5ID0gZmFsc2U7XG5cdFx0Y29uc3QgYUZpbHRlcnMgPSBhS2V5cy5tYXAoa2V5ID0+IHtcblx0XHRcdGlmIChrZXkubmFtZSA9PT0gXCJJc0FjdGl2ZUVudGl0eVwiKSB7XG5cdFx0XHRcdGJGaWx0ZXJPbkFjdGl2ZUVudGl0eSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbmV3IEZpbHRlcih7XG5cdFx0XHRcdHBhdGg6IGtleS5uYW1lLFxuXHRcdFx0XHRvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3IuRVEsXG5cdFx0XHRcdHZhbHVlMToga2V5LnZhbHVlLFxuXHRcdFx0XHRjYXNlU2Vuc2l0aXZlOiBiRmlsdGVyQ2FzZVNlbnNpdGl2ZVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdFx0aWYgKGJEcmFmdE1vZGUgJiYgIWJGaWx0ZXJPbkFjdGl2ZUVudGl0eSkge1xuXHRcdFx0Y29uc3Qgb0RyYWZ0RmlsdGVyID0gbmV3IEZpbHRlcih7XG5cdFx0XHRcdGZpbHRlcnM6IFtuZXcgRmlsdGVyKFwiSXNBY3RpdmVFbnRpdHlcIiwgXCJFUVwiLCBmYWxzZSksIG5ldyBGaWx0ZXIoXCJTaWJsaW5nRW50aXR5L0lzQWN0aXZlRW50aXR5XCIsIFwiRVFcIiwgbnVsbCldLFxuXHRcdFx0XHRhbmQ6IGZhbHNlXG5cdFx0XHR9KTtcblx0XHRcdGFGaWx0ZXJzLnB1c2gob0RyYWZ0RmlsdGVyKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IEZpbHRlcihhRmlsdGVycywgdHJ1ZSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIExvYWRzIGFsbCBjb250ZXh0cyBmb3IgYSBsaXN0IG9mIHBhZ2UgaW5mb3MuXG5cdCAqXG5cdCAqIEBwYXJhbSBhU3RhcnR1cFBhZ2VzIFRoZSBsaXN0IG9mIHBhZ2UgaW5mb3Ncblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgbW9kZWwgdXNlZCB0byBsb2FkIHRoZSBjb250ZXh0c1xuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIGFsbCBjb250ZXh0c1xuXHQgKi9cblx0X3JlcXVlc3RPYmplY3RzRnJvbVBhcmFtZXRlcnM6IGZ1bmN0aW9uKGFTdGFydHVwUGFnZXM6IFBhZ2VJbmZvW10sIG9Nb2RlbDogT0RhdGFNb2RlbCk6IFByb21pc2U8Q29udGV4dFtdW10+IHtcblx0XHQvLyBMb2FkIHRoZSByZXNwZWN0aXZlIG9iamVjdHMgZm9yIGFsbCBvYmplY3QgcGFnZXMgZm91bmQgaW4gYUV4dGVybmFsbHlOYXZpZ2FibGVQYWdlc1xuXHRcdGNvbnN0IGFDb250ZXh0UHJvbWlzZXMgPSBhU3RhcnR1cFBhZ2VzLm1hcChwYWdlSW5mbyA9PiB7XG5cdFx0XHRjb25zdCBhS2V5cyA9IHBhZ2VJbmZvLnNlbWFudGljS2V5cyB8fCBwYWdlSW5mby50ZWNobmljYWxLZXlzIHx8IFtdO1xuXHRcdFx0Y29uc3Qgb0ZpbHRlciA9IHRoaXMuX2NyZWF0ZUZpbHRlckZyb21LZXlzKGFLZXlzLCBwYWdlSW5mby5kcmFmdE1vZGUsIG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSk7XG5cblx0XHRcdC8vIG9ubHkgcmVxdWVzdCBhIG1pbmltdW0gb2YgZmllbGRzIHRvIGJvb3N0IGJhY2tlbmQgcGVyZm9ybWFuY2Ugc2luY2UgdGhpcyBpcyBvbmx5IHVzZWQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGV4aXN0c1xuXHRcdFx0Y29uc3Qgb0xpc3RCaW5kID0gb01vZGVsLmJpbmRMaXN0KHBhZ2VJbmZvLmNvbnRleHRQYXRoLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgb0ZpbHRlciwge1xuXHRcdFx0XHRcIiRzZWxlY3RcIjogYUtleXNcblx0XHRcdFx0XHQubWFwKGtleSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ga2V5Lm5hbWU7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuam9pbihcIixcIilcblx0XHRcdH0gYXMgYW55KTtcblx0XHRcdHJldHVybiBvTGlzdEJpbmQucmVxdWVzdENvbnRleHRzKDAsIDIpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKGFDb250ZXh0UHJvbWlzZXMpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgUGFnZUluZm8gZnJvbSBhIHJvdXRlIGlmIHRpJ3MgcmVhY2hhYmxlIGZyb20gdGhlIHN0YXJ0dXAgcGFyYW1ldGVycy5cblx0ICpcblx0ICogQHBhcmFtIG9Sb3V0ZSBUaGUgcm91dGVcblx0ICogQHBhcmFtIG9NYW5pZmVzdFJvdXRpbmcgVGhlIGFwcCBtYW5pZmVzdCByb3V0aW5nIHNlY3Rpb25cblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBUaGUgc3RhcnR1cCBwYXJhbWV0ZXJzXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBhcHAgbWV0YW1vZGVsXG5cdCAqIEByZXR1cm5zIEEgcGFnZSBpbmZvIGlmIHRoZSBwYWdlIGlzIHJlYWNoYWJsZSwgdW5kZWZpbmVkIG90aGVyd2lzZVxuXHQgKi9cblx0X2dldFJlYWNoYWJsZVBhZ2VJbmZvRnJvbVJvdXRlOiBmdW5jdGlvbihcblx0XHRvUm91dGU6IGFueSxcblx0XHRvTWFuaWZlc3RSb3V0aW5nOiBhbnksXG5cdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzOiBhbnksXG5cdFx0b01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWxcblx0KTogUGFnZUluZm8gfCB1bmRlZmluZWQge1xuXHRcdC8vIFJlbW92ZSB0cmFpbGluZyAnOj9xdWVyeTonIGFuZCAnLydcblx0XHRsZXQgc1BhdHRlcm46IHN0cmluZyA9IG9Sb3V0ZS5wYXR0ZXJuLnJlcGxhY2UoXCI6P3F1ZXJ5OlwiLCBcIlwiKTtcblx0XHRzUGF0dGVybiA9IHNQYXR0ZXJuLnJlcGxhY2UoL1xcLyQvLCBcIlwiKTtcblxuXHRcdGlmICghc1BhdHRlcm4pIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7IC8vIElnbm9yZSBsZXZlbC0wIHJvdXRlcyAoTGlzdFJlcG9ydClcblx0XHR9XG5cblx0XHRzUGF0dGVybiA9IHNQYXR0ZXJuLnJlcGxhY2UoL1xcKFxce1teXFx9XSpcXH1cXCkvZywgXCIoIylcIik7IC8vIFJlcGxhY2Uga2V5cyB3aXRoICNcblxuXHRcdC8vIEdldCB0aGUgcmlnaHRtb3N0IHRhcmdldCBmb3IgdGhpcyByb3V0ZVxuXHRcdGNvbnN0IHNUYXJnZXROYW1lOiBzdHJpbmcgPSBBcnJheS5pc0FycmF5KG9Sb3V0ZS50YXJnZXQpID8gb1JvdXRlLnRhcmdldFtvUm91dGUudGFyZ2V0Lmxlbmd0aCAtIDFdIDogb1JvdXRlLnRhcmdldDtcblx0XHRjb25zdCBvVGFyZ2V0ID0gb01hbmlmZXN0Um91dGluZy50YXJnZXRzW3NUYXJnZXROYW1lXTtcblxuXHRcdGNvbnN0IGFQYXR0ZXJuU2VnbWVudHMgPSBzUGF0dGVybi5zcGxpdChcIi9cIik7XG5cdFx0Y29uc3QgcGFnZUxldmVsID0gYVBhdHRlcm5TZWdtZW50cy5sZW5ndGggLSAxO1xuXG5cdFx0aWYgKHBhZ2VMZXZlbCAhPT0gMCAmJiBvVGFyZ2V0Py5vcHRpb25zPy5zZXR0aW5ncz8uYWxsb3dEZWVwTGlua2luZyAhPT0gdHJ1ZSkge1xuXHRcdFx0Ly8gVGhlIGZpcnN0IGxldmVsIG9mIG9iamVjdCBwYWdlIGFsbG93cyBkZWVwIGxpbmtpbmcgYnkgZGVmYXVsdC5cblx0XHRcdC8vIE90aGVyd2lzZSwgdGhlIHRhcmdldCBtdXN0IGFsbG93IGRlZXAgbGlua2luZyBleHBsaWNpdGVseSBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc0NvbnRleHRQYXRoOiBzdHJpbmcgPVxuXHRcdFx0b1RhcmdldC5vcHRpb25zLnNldHRpbmdzLmNvbnRleHRQYXRoIHx8IChvVGFyZ2V0Lm9wdGlvbnMuc2V0dGluZ3MuZW50aXR5U2V0ICYmIFwiL1wiICsgb1RhcmdldC5vcHRpb25zLnNldHRpbmdzLmVudGl0eVNldCk7XG5cdFx0Y29uc3Qgb0VudGl0eVR5cGUgPSBzQ29udGV4dFBhdGggJiYgb01ldGFNb2RlbC5nZXRPYmplY3QoXCIvJEVudGl0eUNvbnRhaW5lclwiICsgc0NvbnRleHRQYXRoICsgXCIvXCIpO1xuXG5cdFx0aWYgKCFvRW50aXR5VHlwZSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBHZXQgdGhlIHNlbWFudGljIGtleSB2YWx1ZXMgZm9yIHRoZSBlbnRpdHlcblx0XHRjb25zdCBhU2VtYW50aWNLZXlOYW1lczogYW55ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoXG5cdFx0XHRcIi8kRW50aXR5Q29udGFpbmVyXCIgKyBzQ29udGV4dFBhdGggKyBcIi9AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNlbWFudGljS2V5XCJcblx0XHQpO1xuXG5cdFx0Y29uc3QgYVNlbWFudGlja0tleXMgPSBhU2VtYW50aWNLZXlOYW1lc1xuXHRcdFx0PyB0aGlzLl9nZXRLZXlzRnJvbVN0YXJ0dXBQYXJhbXMoXG5cdFx0XHRcdFx0YVNlbWFudGljS2V5TmFtZXMubWFwKChzZW1LZXk6IGFueSkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHNlbUtleS4kUHJvcGVydHlQYXRoIGFzIHN0cmluZztcblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnNcblx0XHRcdCAgKVxuXHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHQvLyBHZXQgdGhlIHRlY2huaWNhbCBrZXlzIG9ubHkgaWYgd2UgY291bGRuJ3QgZmluZCB0aGUgc2VtYW50aWMga2V5IHZhbHVlcywgYW5kIG9uIGZpcnN0IGxldmVsIE9QXG5cdFx0Y29uc3QgYVRlY2huaWNhbEtleXMgPVxuXHRcdFx0IWFTZW1hbnRpY2tLZXlzICYmIHBhZ2VMZXZlbCA9PT0gMCA/IHRoaXMuX2dldEtleXNGcm9tU3RhcnR1cFBhcmFtcyhvRW50aXR5VHlwZVtcIiRLZXlcIl0sIG9TdGFydHVwUGFyYW1ldGVycykgOiB1bmRlZmluZWQ7XG5cblx0XHRpZiAoYVNlbWFudGlja0tleXMgPT09IHVuZGVmaW5lZCAmJiBhVGVjaG5pY2FsS2V5cyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBXZSBjb3VsZG4ndCBmaW5kIHRoZSBzZW1hbnRpYy90ZWNobmljYWwga2V5cyBpbiB0aGUgc3RhcnR1cCBwYXJhbWV0ZXJzXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIFRoZSBzdGFydHVwIHBhcmFtZXRlcnMgY29udGFpbiB2YWx1ZXMgZm9yIGFsbCBzZW1hbnRpYyBrZXlzIChvciB0ZWNobmljYWwga2V5cykgLS0+IHdlIGNhbiBzdG9yZSB0aGUgcGFnZSBpbmZvIGluIHRoZSBjb3JyZXNwb25kaW5nIGxldmVsXG5cdFx0Y29uc3QgZHJhZnRNb2RlID1cblx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiLyRFbnRpdHlDb250YWluZXJcIiArIHNDb250ZXh0UGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIikgfHxcblx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFwiLyRFbnRpdHlDb250YWluZXJcIiArIHNDb250ZXh0UGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdE5vZGVcIilcblx0XHRcdFx0PyB0cnVlXG5cdFx0XHRcdDogZmFsc2U7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cGF0dGVybjogc1BhdHRlcm4sXG5cdFx0XHRjb250ZXh0UGF0aDogc0NvbnRleHRQYXRoLFxuXHRcdFx0ZHJhZnRNb2RlLFxuXHRcdFx0dGVjaG5pY2FsS2V5czogYVRlY2huaWNhbEtleXMsXG5cdFx0XHRzZW1hbnRpY0tleXM6IGFTZW1hbnRpY2tLZXlzLFxuXHRcdFx0dGFyZ2V0OiBzVGFyZ2V0TmFtZSxcblx0XHRcdHBhZ2VMZXZlbFxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIHBhZ2VzIHRoYXQgYWxsb3cgZGVlcGxpbmsgYW5kIHRoYXQgY2FuIGJlIHJlYWNoZWQgdXNpbmcgdGhlIHN0YXJ0dXAgcGFyYW1ldGVycy5cblx0ICpcblx0ICogQHBhcmFtIG9NYW5pZmVzdFJvdXRpbmcgVGhlIHJvdXRpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUgYXBwIG1hbmlmZXN0XG5cdCAqIEBwYXJhbSBvU3RhcnR1cFBhcmFtZXRlcnMgVGhlIHN0YXJ0dXAgcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgbWV0YW1vZGVsXG5cdCAqIEByZXR1cm5zXG5cdCAqL1xuXHRfZ2V0UmVhY2hhYmxlUGFnZXM6IGZ1bmN0aW9uKG9NYW5pZmVzdFJvdXRpbmc6IGFueSwgb1N0YXJ0dXBQYXJhbWV0ZXJzOiBhbnksIG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogUGFnZUluZm9bXVtdIHtcblx0XHRjb25zdCBhUm91dGVzOiBhbnlbXSA9IG9NYW5pZmVzdFJvdXRpbmcucm91dGVzO1xuXHRcdGNvbnN0IG1QYWdlc0J5TGV2ZWw6IFJlY29yZDxudW1iZXIsIFBhZ2VJbmZvW10+ID0ge307XG5cblx0XHRhUm91dGVzLmZvckVhY2gob1JvdXRlID0+IHtcblx0XHRcdGNvbnN0IG9QYWdlSW5mbyA9IHRoaXMuX2dldFJlYWNoYWJsZVBhZ2VJbmZvRnJvbVJvdXRlKG9Sb3V0ZSwgb01hbmlmZXN0Um91dGluZywgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBvTWV0YU1vZGVsKTtcblxuXHRcdFx0aWYgKG9QYWdlSW5mbykge1xuXHRcdFx0XHRpZiAoIW1QYWdlc0J5TGV2ZWxbb1BhZ2VJbmZvLnBhZ2VMZXZlbF0pIHtcblx0XHRcdFx0XHRtUGFnZXNCeUxldmVsW29QYWdlSW5mby5wYWdlTGV2ZWxdID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0bVBhZ2VzQnlMZXZlbFtvUGFnZUluZm8ucGFnZUxldmVsXS5wdXNoKG9QYWdlSW5mbyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBBIHBhZ2UgaXMgcmVhY2hhYmxlIG9ubHkgaWYgYWxsIGl0cyBwYXJlbnRzIGFyZSBhbHNvIHJlYWNoYWJsZVxuXHRcdC8vIFNvIGlmIHdlIGNvdWxkbid0IGZpbmQgYW55IHBhZ2VzIGZvciBhIGdpdmVuIGxldmVsLCBhbGwgcGFnZXMgd2l0aCBhIGhpZ2hlciBsZXZlbCB3b24ndCBiZSByZWFjaGFibGUgYW55d2F5XG5cdFx0Y29uc3QgYVJlYWNoYWJsZVBhZ2VzOiBQYWdlSW5mb1tdW10gPSBbXTtcblx0XHRsZXQgbGV2ZWwgPSAwO1xuXHRcdHdoaWxlIChtUGFnZXNCeUxldmVsW2xldmVsXSkge1xuXHRcdFx0YVJlYWNoYWJsZVBhZ2VzLnB1c2gobVBhZ2VzQnlMZXZlbFtsZXZlbF0pO1xuXHRcdFx0bGV2ZWwrKztcblx0XHR9XG5cblx0XHRyZXR1cm4gYVJlYWNoYWJsZVBhZ2VzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGxpc3Qgb2Ygc3RhcnR1cCBwYWdlcy5cblx0ICpcblx0ICogQHBhcmFtIG9NYW5pZmVzdFJvdXRpbmcgVGhlIHJvdXRpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUgYXBwIG1hbmlmZXN0XG5cdCAqIEBwYXJhbSBvU3RhcnR1cFBhcmFtZXRlcnMgVGhlIHN0YXJ0dXAgcGFyYW1ldGVyc1xuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgbWV0YW1vZGVsXG5cdCAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHN0YXJ0dXAgcGFnZSBpbmZvc1xuXHQgKi9cblx0X2dldFN0YXJ0dXBQYWdlc0Zyb21TdGFydHVwUGFyYW1zOiBmdW5jdGlvbihvTWFuaWZlc3RSb3V0aW5nOiBhbnksIG9TdGFydHVwUGFyYW1ldGVyczogYW55LCBvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IFBhZ2VJbmZvW10ge1xuXHRcdC8vIEZpbmQgYWxsIHBhZ2VzIHRoYXQgY2FuIGJlIHJlYWNoZWQgd2l0aCB0aGUgc3RhcnR1cCBwYXJhbWV0ZXJzXG5cdFx0Y29uc3QgYVJlYWNoYWJsZVBhZ2VzID0gdGhpcy5fZ2V0UmVhY2hhYmxlUGFnZXMob01hbmlmZXN0Um91dGluZywgb1N0YXJ0dXBQYXJhbWV0ZXJzLCBvTWV0YU1vZGVsKTtcblxuXHRcdGlmIChhUmVhY2hhYmxlUGFnZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0Ly8gRmluZCB0aGUgbG9uZ2VzdCBzZXF1ZW5jZSBvZiBwYWdlcyB0aGF0IGNhbiBiZSByZWFjaGVkIChyZWN1cnNpdmVseSlcblx0XHRsZXQgcmVzdWx0OiBQYWdlSW5mb1tdID0gW107XG5cdFx0Y29uc3QgY3VycmVudDogUGFnZUluZm9bXSA9IFtdO1xuXG5cdFx0ZnVuY3Rpb24gZmluZFJlY3Vyc2l2ZShsZXZlbDogbnVtYmVyKSB7XG5cdFx0XHRjb25zdCBhQ3VycmVudExldmVsUGFnZXMgPSBhUmVhY2hhYmxlUGFnZXNbbGV2ZWxdO1xuXHRcdFx0Y29uc3QgbGFzdFBhZ2UgPSBjdXJyZW50Lmxlbmd0aCA/IGN1cnJlbnRbY3VycmVudC5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKGFDdXJyZW50TGV2ZWxQYWdlcykge1xuXHRcdFx0XHRhQ3VycmVudExldmVsUGFnZXMuZm9yRWFjaChmdW5jdGlvbihuZXh0UGFnZSkge1xuXHRcdFx0XHRcdGlmICghbGFzdFBhZ2UgfHwgbmV4dFBhZ2UucGF0dGVybi5pbmRleE9mKGxhc3RQYWdlLnBhdHRlcm4pID09PSAwKSB7XG5cdFx0XHRcdFx0XHQvLyBXZSBvbmx5IGNvbnNpZGVyIHBhZ2VzIHRoYXQgY2FuIGJlIHJlYWNoZWQgZnJvbSB0aGUgcGFnZSBhdCB0aGUgcHJldmlvdXMgbGV2ZWwsXG5cdFx0XHRcdFx0XHQvLyAtLT4gdGhlaXIgcGF0dGVybiBtdXN0IGJlIHRoZSBwYXR0ZXJuIG9mIHRoZSBwcmV2aW91cyBwYWdlIHdpdGggYW5vdGhlciBzZWdtZW50IGFwcGVuZGVkXG5cdFx0XHRcdFx0XHRjdXJyZW50LnB1c2gobmV4dFBhZ2UpO1xuXHRcdFx0XHRcdFx0ZmluZFJlY3Vyc2l2ZShsZXZlbCArIDEpO1xuXHRcdFx0XHRcdFx0Y3VycmVudC5wb3AoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGN1cnJlbnQubGVuZ3RoID4gcmVzdWx0Lmxlbmd0aCkge1xuXHRcdFx0XHRyZXN1bHQgPSBjdXJyZW50LnNsaWNlKCk7IC8vIFdlIGhhdmUgZm91bmQgYSBzZXF1ZW5jZSBsb25nZXIgdGhhbiBvdXIgcHJldmlvdXMgYmVzdCAtLT4gc3RvcmUgaXQgYXMgdGhlIG5ldyBsb25nZXN0XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZmluZFJlY3Vyc2l2ZSgwKTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIHN0YXJ0dXAgb2JqZWN0IGZyb20gdGhlIGxpc3Qgb2YgcGFnZXMgYW5kIGNvbnRleHRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gYVN0YXJ0dXBQYWdlcyBUaGUgcGFnZXNcblx0ICogQHBhcmFtIGFDb250ZXh0cyBUaGUgY29udGV4dHNcblx0ICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgZWl0aGVyIGEgaGFzaCBvciBhIGNvbnRleHQgdG8gbmF2aWdhdGUgdG8sIG9yIGFuIGVtcHR5IG9iamVjdCBpZiBubyBkZWVwIGxpbmsgd2FzIGZvdW5kXG5cdCAqL1xuXHRfZ2V0RGVlcExpbmtPYmplY3Q6IGZ1bmN0aW9uKGFTdGFydHVwUGFnZXM6IFBhZ2VJbmZvW10sIGFDb250ZXh0czogQ29udGV4dFtdKTogeyBoYXNoPzogc3RyaW5nOyBjb250ZXh0PzogQ29udGV4dCB9IHtcblx0XHRpZiAoYUNvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0cmV0dXJuIHsgY29udGV4dDogYUNvbnRleHRzWzBdIH07XG5cdFx0fSBlbHNlIGlmIChhQ29udGV4dHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gTmF2aWdhdGlvbiB0byBhIGRlZXBlciBsZXZlbCAtLT4gdXNlIHRoZSBwYXR0ZXJuIG9mIHRoZSBkZWVwZXN0IG9iamVjdCBwYWdlXG5cdFx0XHQvLyBhbmQgcmVwbGFjZSB0aGUgcGFyYW1ldGVycyBieSB0aGUgSUQgZnJvbSB0aGUgY29udGV4dHNcblx0XHRcdGxldCBoYXNoID0gYVN0YXJ0dXBQYWdlc1thU3RhcnR1cFBhZ2VzLmxlbmd0aCAtIDFdLnBhdHRlcm47XG5cdFx0XHRhQ29udGV4dHMuZm9yRWFjaChmdW5jdGlvbihvQ29udGV4dCkge1xuXHRcdFx0XHRoYXNoID0gaGFzaC5yZXBsYWNlKFwiKCMpXCIsIFwiKFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpLnNwbGl0KFwiKFwiKVsxXSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIHsgaGFzaCB9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGVzIHN0YXJ0dXAgcGFyYW1ldGVycyBmb3IgYSBkZWVwbGluayBjYXNlLCBmcm9tIHN0YXJ0dXAgcGFyYW1ldGVycyBhbmQgcm91dGluZyBpbmZvaXJtYXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBvTWFuaWZlc3RSb3V0aW5nIFRoZSByb3V0aW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIGFwcCBtYW5pZmVzdFxuXHQgKiBAcGFyYW0gb1N0YXJ0dXBQYXJhbWV0ZXJzIFRoZSBzdGFydHVwIHBhcmFtZXRlcnNcblx0ICogQHBhcmFtIG9Nb2RlbCBUaGUgT0RhdGEgbW9kZWxcblx0ICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgZWl0aGVyIGEgaGFzaCBvciBhIGNvbnRleHQgdG8gbmF2aWdhdGUgdG8sIG9yIGFuIGVtcHR5IG9iamVjdCBpZiBubyBkZWVwIGxpbmsgd2FzIGZvdW5kXG5cdCAqL1xuXHRnZXREZWVwTGlua1N0YXJ0dXBIYXNoOiBmdW5jdGlvbihcblx0XHRvTWFuaWZlc3RSb3V0aW5nOiBhbnksXG5cdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzOiBhbnksXG5cdFx0b01vZGVsOiBPRGF0YU1vZGVsXG5cdCk6IFByb21pc2U8eyBoYXNoPzogc3RyaW5nOyBjb250ZXh0PzogQ29udGV4dCB9PiB7XG5cdFx0bGV0IGFTdGFydHVwUGFnZXM6IFBhZ2VJbmZvW107XG5cblx0XHRyZXR1cm4gb01vZGVsXG5cdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdC5yZXF1ZXN0T2JqZWN0KFwiLyRFbnRpdHlDb250YWluZXIvXCIpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdC8vIENoZWNrIGlmIHNlbWFudGljIGtleXMgYXJlIHByZXNlbnQgaW4gdXJsIHBhcmFtZXRlcnMgZm9yIGV2ZXJ5IG9iamVjdCBwYWdlIGF0IGVhY2ggbGV2ZWxcblx0XHRcdFx0YVN0YXJ0dXBQYWdlcyA9IHRoaXMuX2dldFN0YXJ0dXBQYWdlc0Zyb21TdGFydHVwUGFyYW1zKG9NYW5pZmVzdFJvdXRpbmcsIG9TdGFydHVwUGFyYW1ldGVycywgb01vZGVsLmdldE1ldGFNb2RlbCgpKTtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcy5fcmVxdWVzdE9iamVjdHNGcm9tUGFyYW1ldGVycyhhU3RhcnR1cFBhZ2VzLCBvTW9kZWwpO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKChhVmFsdWVzOiBDb250ZXh0W11bXSkgPT4ge1xuXHRcdFx0XHRpZiAoYVZhbHVlcy5sZW5ndGgpIHtcblx0XHRcdFx0XHQvLyBNYWtlIHN1cmUgd2Ugb25seSBnZXQgMSBjb250ZXh0IHBlciBwcm9taXNlLCBhbmQgZmxhdHRlbiB0aGUgYXJyYXlcblx0XHRcdFx0XHRjb25zdCBhQ29udGV4dHM6IENvbnRleHRbXSA9IFtdO1xuXHRcdFx0XHRcdGFWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbihhRm91bmRDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0aWYgKGFGb3VuZENvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdFx0XHRhQ29udGV4dHMucHVzaChhRm91bmRDb250ZXh0c1swXSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRyZXR1cm4gYUNvbnRleHRzLmxlbmd0aCA9PT0gYVZhbHVlcy5sZW5ndGggPyB0aGlzLl9nZXREZWVwTGlua09iamVjdChhU3RhcnR1cFBhZ2VzLCBhQ29udGV4dHMpIDoge307XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIHt9O1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fSxcblxuXHQvKipcblx0ICogQ2FsY3VsYXRlcyB0aGUgbmV3IGhhc2ggYmFzZWQgb24gdGhlIHN0YXJ0dXAgcGFyYW1ldGVycy5cblx0ICpcblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBUaGUgc3RhcnR1cCBwYXJhbWV0ZXIgdmFsdWVzIChtYXAgcGFyYW1ldGVyIG5hbWUgLT4gYXJyYXkgb2YgdmFsdWVzKVxuXHQgKiBAcGFyYW0gc0NvbnRleHRQYXRoIFRoZSBjb250ZXh0IHBhdGggZm9yIHRoZSBzdGFydHVwIG9mIHRoZSBhcHAgKGdlbmVyYWxseSB0aGUgcGF0aCB0byB0aGUgbWFpbiBlbnRpdHkgc2V0KVxuXHQgKiBAcGFyYW0gb1JvdXRlciBUaGUgcm91dGVyIGluc3RhbmNlXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBtZXRhIG1vZGVsXG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSBjb250YWluaW5nIHRoZSBoYXNoIHRvIG5hdmlnYXRlIHRvLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUncyBubyBuZWVkIHRvIG5hdmlnYXRlXG5cdCAqL1xuXHRnZXRDcmVhdGVTdGFydHVwSGFzaDogZnVuY3Rpb24oXG5cdFx0b1N0YXJ0dXBQYXJhbWV0ZXJzOiBhbnksXG5cdFx0c0NvbnRleHRQYXRoOiBzdHJpbmcsXG5cdFx0b1JvdXRlcjogUm91dGVyLFxuXHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsXG5cdCk6IFByb21pc2U8U3RyaW5nPiB7XG5cdFx0cmV0dXJuIG9NZXRhTW9kZWwucmVxdWVzdE9iamVjdChzQ29udGV4dFBhdGggKyBcIkBcIikudGhlbigob0VudGl0eVNldEFubm90YXRpb25zOiBhbnkpID0+IHtcblx0XHRcdGxldCBzTWV0YVBhdGggPSBcIlwiO1xuXHRcdFx0bGV0IGJDcmVhdGFibGUgPSB0cnVlO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdG9FbnRpdHlTZXRBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCJdICYmXG5cdFx0XHRcdG9FbnRpdHlTZXRBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCJdW1wiTmV3QWN0aW9uXCJdXG5cdFx0XHQpIHtcblx0XHRcdFx0c01ldGFQYXRoID0gc0NvbnRleHRQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9OZXdBY3Rpb25AT3JnLk9EYXRhLkNvcmUuVjEuT3BlcmF0aW9uQXZhaWxhYmxlXCI7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRvRW50aXR5U2V0QW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkXCJdICYmXG5cdFx0XHRcdG9FbnRpdHlTZXRBbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWRcIl1bXCJOZXdBY3Rpb25cIl1cblx0XHRcdCkge1xuXHRcdFx0XHRzTWV0YVBhdGggPVxuXHRcdFx0XHRcdHNDb250ZXh0UGF0aCArIFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZC9OZXdBY3Rpb25AT3JnLk9EYXRhLkNvcmUuVjEuT3BlcmF0aW9uQXZhaWxhYmxlXCI7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzTWV0YVBhdGgpIHtcblx0XHRcdFx0Y29uc3QgYk5ld0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNNZXRhUGF0aCk7XG5cdFx0XHRcdGlmIChiTmV3QWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdGJDcmVhdGFibGUgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb0luc2VydFJlc3RyaWN0aW9ucyA9IG9FbnRpdHlTZXRBbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ2FwYWJpbGl0aWVzLlYxLkluc2VydFJlc3RyaWN0aW9uc1wiXTtcblx0XHRcdFx0aWYgKG9JbnNlcnRSZXN0cmljdGlvbnMgJiYgb0luc2VydFJlc3RyaWN0aW9ucy5JbnNlcnRhYmxlID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdGJDcmVhdGFibGUgPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGJDcmVhdGFibGUpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0RGVmYXVsdENyZWF0ZUhhc2gob1N0YXJ0dXBQYXJhbWV0ZXJzLCBzQ29udGV4dFBhdGgsIG9Sb3V0ZXIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgdGhlIGhhc2ggdG8gY3JlYXRlIGEgbmV3IG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIG9TdGFydHVwUGFyYW1ldGVycyBUaGUgc3RhcnR1cCBwYXJhbWV0ZXIgdmFsdWVzIChtYXAgcGFyYW1ldGVyIG5hbWUgLT4gYXJyYXkgb2YgdmFsdWVzKVxuXHQgKiBAcGFyYW0gc0NvbnRleHRQYXRoIFRoZSBjb250ZXh0IHBhdGggb2YgdGhlIGVudGl0eSBzZXQgdG8gYmUgdXNlZCBmb3IgdGhlIGNyZWF0aW9uXG5cdCAqIEBwYXJhbSBvUm91dGVyIFRoZSByb3V0ZXIgaW5zdGFuY2Vcblx0ICogQHJldHVybnMgVGhlIGhhc2hcblx0ICovXG5cdGdldERlZmF1bHRDcmVhdGVIYXNoOiBmdW5jdGlvbihvU3RhcnR1cFBhcmFtZXRlcnM6IGFueSwgc0NvbnRleHRQYXRoOiBzdHJpbmcsIG9Sb3V0ZXI6IFJvdXRlcik6IHN0cmluZyB7XG5cdFx0bGV0IHNEZWZhdWx0Q3JlYXRlSGFzaCA9XG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgJiYgb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGUgPyAob1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGVbMF0gYXMgc3RyaW5nKSA6IFwiY3JlYXRlXCI7XG5cdFx0bGV0IHNIYXNoID0gXCJcIjtcblxuXHRcdHNEZWZhdWx0Q3JlYXRlSGFzaCA9XG5cdFx0XHRzRGVmYXVsdENyZWF0ZUhhc2guaW5kZXhPZihcIjpcIikgIT09IC0xICYmIHNEZWZhdWx0Q3JlYXRlSGFzaC5sZW5ndGggPiBzRGVmYXVsdENyZWF0ZUhhc2guaW5kZXhPZihcIjpcIikgKyAxXG5cdFx0XHRcdD8gc0RlZmF1bHRDcmVhdGVIYXNoLnN1YnN0cigwLCBzRGVmYXVsdENyZWF0ZUhhc2guaW5kZXhPZihcIjpcIikpXG5cdFx0XHRcdDogXCJjcmVhdGVcIjtcblx0XHRzSGFzaCA9IHNDb250ZXh0UGF0aC5zdWJzdHJpbmcoMSkgKyBcIiguLi4pP2ktYWN0aW9uPVwiICsgc0RlZmF1bHRDcmVhdGVIYXNoO1xuXHRcdGlmIChvUm91dGVyLmdldFJvdXRlSW5mb0J5SGFzaChzSGFzaCkpIHtcblx0XHRcdHJldHVybiBzSGFzaDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm8gcm91dGUgbWF0Y2ggZm9yIGNyZWF0aW5nIGEgbmV3IFwiICsgc0NvbnRleHRQYXRoLnN1YnN0cmluZygxKSk7XG5cdFx0fVxuXHR9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBcHBTdGFydHVwSGVscGVyO1xuIl19
|