@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
|
@@ -10,12 +10,6 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "sap/fe/core/templat
|
|
|
10
10
|
var enhanceDataModelPath = DataModelPathHelper.enhanceDataModelPath;
|
|
11
11
|
var convertTypes = MetaModelConverter.convertTypes;
|
|
12
12
|
|
|
13
|
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
14
|
-
|
|
15
|
-
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
16
|
-
|
|
17
|
-
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|
18
|
-
|
|
19
13
|
/**
|
|
20
14
|
* Checks whether an object is an annotation term.
|
|
21
15
|
*
|
|
@@ -30,7 +24,7 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "sap/fe/core/templat
|
|
|
30
24
|
return objectPart && objectPart.hasOwnProperty("_type");
|
|
31
25
|
}
|
|
32
26
|
|
|
33
|
-
var getDataModelPathForEntitySet = function (resolvedMetaPath) {
|
|
27
|
+
var getDataModelPathForEntitySet = function (resolvedMetaPath, convertedTypes) {
|
|
34
28
|
var rootEntitySet;
|
|
35
29
|
var currentEntitySet;
|
|
36
30
|
var previousEntitySet;
|
|
@@ -78,7 +72,8 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "sap/fe/core/templat
|
|
|
78
72
|
targetEntitySet: currentEntitySet,
|
|
79
73
|
navigationProperties: navigationProperties,
|
|
80
74
|
contextLocation: undefined,
|
|
81
|
-
targetObject: resolvedMetaPath.target
|
|
75
|
+
targetObject: resolvedMetaPath.target,
|
|
76
|
+
convertedTypes: convertedTypes
|
|
82
77
|
};
|
|
83
78
|
dataModelPath.contextLocation = dataModelPath;
|
|
84
79
|
return dataModelPath;
|
|
@@ -100,8 +95,6 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "sap/fe/core/templat
|
|
|
100
95
|
|
|
101
96
|
var ConverterContext = /*#__PURE__*/function () {
|
|
102
97
|
function ConverterContext(convertedTypes, manifestSettings, diagnostics, mergeFn, targetDataModelPath) {
|
|
103
|
-
_classCallCheck(this, ConverterContext);
|
|
104
|
-
|
|
105
98
|
this.convertedTypes = convertedTypes;
|
|
106
99
|
this.manifestSettings = manifestSettings;
|
|
107
100
|
this.diagnostics = diagnostics;
|
|
@@ -118,397 +111,385 @@ sap.ui.define(["sap/fe/core/converters/MetaModelConverter", "sap/fe/core/templat
|
|
|
118
111
|
*/
|
|
119
112
|
|
|
120
113
|
|
|
121
|
-
|
|
122
|
-
key: "_getEntityTypeFromFullyQualifiedName",
|
|
123
|
-
value: function _getEntityTypeFromFullyQualifiedName(fullyQualifiedName) {
|
|
124
|
-
var targetEntityType = this.convertedTypes.entityTypes.find(function (entityType) {
|
|
125
|
-
if (fullyQualifiedName.startsWith(entityType.fullyQualifiedName)) {
|
|
126
|
-
var replaceAnnotation = fullyQualifiedName.replace(entityType.fullyQualifiedName, "");
|
|
127
|
-
return replaceAnnotation.startsWith("/") || replaceAnnotation.startsWith("@");
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return false;
|
|
131
|
-
});
|
|
132
|
-
return targetEntityType;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Retrieve the entityType associated with an annotation object.
|
|
136
|
-
*
|
|
137
|
-
* @param annotation The annotation object for which we want to find the entityType
|
|
138
|
-
* @returns {EntityType} The EntityType the annotation refers to
|
|
139
|
-
*/
|
|
140
|
-
|
|
141
|
-
}, {
|
|
142
|
-
key: "getAnnotationEntityType",
|
|
143
|
-
value: function getAnnotationEntityType(annotation) {
|
|
144
|
-
if (annotation) {
|
|
145
|
-
var annotationPath = annotation.fullyQualifiedName;
|
|
146
|
-
|
|
147
|
-
var targetEntityType = this._getEntityTypeFromFullyQualifiedName(annotationPath);
|
|
148
|
-
|
|
149
|
-
if (!targetEntityType) {
|
|
150
|
-
throw new Error("Cannot find Entity Type for " + annotation.fullyQualifiedName);
|
|
151
|
-
}
|
|
114
|
+
var _proto = ConverterContext.prototype;
|
|
152
115
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Retrieve the manifest settings defined for a specific control within controlConfiguration.
|
|
160
|
-
*
|
|
161
|
-
* @param vAnnotationPath The annotation path or object to evaluate
|
|
162
|
-
* @returns The control configuration for that specific anntoation path if it exists
|
|
163
|
-
*/
|
|
164
|
-
|
|
165
|
-
}, {
|
|
166
|
-
key: "getManifestControlConfiguration",
|
|
167
|
-
value: function getManifestControlConfiguration(vAnnotationPath) {
|
|
168
|
-
if (isAnnotationTerm(vAnnotationPath)) {
|
|
169
|
-
return this.manifestWrapper.getControlConfiguration(vAnnotationPath.fullyQualifiedName.replace(this.targetDataModelPath.targetEntityType.fullyQualifiedName, ""));
|
|
116
|
+
_proto._getEntityTypeFromFullyQualifiedName = function _getEntityTypeFromFullyQualifiedName(fullyQualifiedName) {
|
|
117
|
+
var targetEntityType = this.convertedTypes.entityTypes.find(function (entityType) {
|
|
118
|
+
if (fullyQualifiedName.startsWith(entityType.fullyQualifiedName)) {
|
|
119
|
+
var replaceAnnotation = fullyQualifiedName.replace(entityType.fullyQualifiedName, "");
|
|
120
|
+
return replaceAnnotation.startsWith("/") || replaceAnnotation.startsWith("@");
|
|
170
121
|
}
|
|
171
122
|
|
|
172
|
-
return
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
123
|
+
return false;
|
|
124
|
+
});
|
|
125
|
+
return targetEntityType;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Retrieve the entityType associated with an annotation object.
|
|
129
|
+
*
|
|
130
|
+
* @param annotation The annotation object for which we want to find the entityType
|
|
131
|
+
* @returns {EntityType} The EntityType the annotation refers to
|
|
132
|
+
*/
|
|
133
|
+
;
|
|
134
|
+
|
|
135
|
+
_proto.getAnnotationEntityType = function getAnnotationEntityType(annotation) {
|
|
136
|
+
if (annotation) {
|
|
137
|
+
var annotationPath = annotation.fullyQualifiedName;
|
|
187
138
|
|
|
188
|
-
|
|
189
|
-
|
|
139
|
+
var targetEntityType = this._getEntityTypeFromFullyQualifiedName(annotationPath);
|
|
140
|
+
|
|
141
|
+
if (!targetEntityType) {
|
|
142
|
+
throw new Error("Cannot find Entity Type for " + annotation.fullyQualifiedName);
|
|
190
143
|
}
|
|
191
144
|
|
|
192
|
-
return
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* Retrieve the current entitySet.
|
|
196
|
-
*
|
|
197
|
-
* @returns The current EntitySet if it exists.
|
|
198
|
-
*/
|
|
199
|
-
|
|
200
|
-
}, {
|
|
201
|
-
key: "getEntitySet",
|
|
202
|
-
value: function getEntitySet() {
|
|
203
|
-
return this.targetDataModelPath.targetEntitySet;
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Retrieve the context path.
|
|
207
|
-
*
|
|
208
|
-
* @returns The context path of the converter.
|
|
209
|
-
*/
|
|
210
|
-
|
|
211
|
-
}, {
|
|
212
|
-
key: "getContextPath",
|
|
213
|
-
value: function getContextPath() {
|
|
214
|
-
return this.baseContextPath;
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Retrieve the current data model object path.
|
|
218
|
-
*
|
|
219
|
-
* @returns The current data model object path
|
|
220
|
-
*/
|
|
221
|
-
|
|
222
|
-
}, {
|
|
223
|
-
key: "getDataModelObjectPath",
|
|
224
|
-
value: function getDataModelObjectPath() {
|
|
225
|
-
return this.targetDataModelPath;
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Get the EntityContainer.
|
|
229
|
-
*
|
|
230
|
-
* @returns The current service EntityContainer
|
|
231
|
-
*/
|
|
232
|
-
|
|
233
|
-
}, {
|
|
234
|
-
key: "getEntityContainer",
|
|
235
|
-
value: function getEntityContainer() {
|
|
236
|
-
return this.convertedTypes.entityContainer;
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Get the EntityType based on the fully qualified name.
|
|
240
|
-
*
|
|
241
|
-
* @returns The current EntityType.
|
|
242
|
-
*/
|
|
243
|
-
|
|
244
|
-
}, {
|
|
245
|
-
key: "getEntityType",
|
|
246
|
-
value: function getEntityType() {
|
|
145
|
+
return targetEntityType;
|
|
146
|
+
} else {
|
|
247
147
|
return this.targetDataModelPath.targetEntityType;
|
|
248
148
|
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Retrieve the manifest settings defined for a specific control within controlConfiguration.
|
|
152
|
+
*
|
|
153
|
+
* @param vAnnotationPath The annotation path or object to evaluate
|
|
154
|
+
* @returns The control configuration for that specific anntoation path if it exists
|
|
155
|
+
*/
|
|
156
|
+
;
|
|
157
|
+
|
|
158
|
+
_proto.getManifestControlConfiguration = function getManifestControlConfiguration(vAnnotationPath) {
|
|
159
|
+
if (isAnnotationTerm(vAnnotationPath)) {
|
|
160
|
+
return this.manifestWrapper.getControlConfiguration(vAnnotationPath.fullyQualifiedName.replace(this.targetDataModelPath.targetEntityType.fullyQualifiedName, ""));
|
|
262
161
|
}
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
162
|
+
|
|
163
|
+
return this.manifestWrapper.getControlConfiguration(vAnnotationPath);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Create an absolute annotation path based on the current meta model context.
|
|
167
|
+
*
|
|
168
|
+
* @param sAnnotationPath The relative annotation path
|
|
169
|
+
* @returns The correct annotation path based on the current context
|
|
170
|
+
*/
|
|
171
|
+
;
|
|
172
|
+
|
|
173
|
+
_proto.getAbsoluteAnnotationPath = function getAbsoluteAnnotationPath(sAnnotationPath) {
|
|
174
|
+
if (!sAnnotationPath) {
|
|
175
|
+
return sAnnotationPath;
|
|
276
176
|
}
|
|
277
|
-
/**
|
|
278
|
-
* Retrieves an annotation from an entity type based on annotation path.
|
|
279
|
-
*
|
|
280
|
-
* @param annotationPath The annotation path to be evaluated
|
|
281
|
-
* @returns The target annotation path as well as a converter context to go with it
|
|
282
|
-
*/
|
|
283
|
-
|
|
284
|
-
}, {
|
|
285
|
-
key: "getEntityTypeAnnotation",
|
|
286
|
-
value: function getEntityTypeAnnotation(annotationPath) {
|
|
287
|
-
var _startingEntityType$a;
|
|
288
|
-
|
|
289
|
-
if (annotationPath.indexOf("@") === -1) {
|
|
290
|
-
annotationPath = "@" + annotationPath;
|
|
291
|
-
}
|
|
292
177
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
var startingEntityType = this.targetDataModelPath.startingEntitySet.entityType;
|
|
297
|
-
var navigationProperties = this.targetDataModelPath.navigationProperties.concat();
|
|
298
|
-
var i = 1;
|
|
299
|
-
var currentObject;
|
|
300
|
-
var navigatedPaths = [];
|
|
301
|
-
var visitedObjects = targetObject.visitedObjects; // In case of parameterized service
|
|
302
|
-
|
|
303
|
-
if (!rootEntitySet && (_startingEntityType$a = startingEntityType.annotations.Common) !== null && _startingEntityType$a !== void 0 && _startingEntityType$a.ResultContext) {
|
|
304
|
-
rootEntitySet = this.targetDataModelPath.startingEntitySet;
|
|
305
|
-
this.targetDataModelPath.navigationProperties.forEach(function (navObject) {
|
|
306
|
-
navigatedPaths.push(navObject.name);
|
|
307
|
-
});
|
|
308
|
-
}
|
|
178
|
+
if (sAnnotationPath[0] === "/") {
|
|
179
|
+
return sAnnotationPath;
|
|
180
|
+
}
|
|
309
181
|
|
|
310
|
-
|
|
311
|
-
|
|
182
|
+
return this.baseContextPath + "/" + sAnnotationPath;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Retrieve the current entitySet.
|
|
186
|
+
*
|
|
187
|
+
* @returns The current EntitySet if it exists.
|
|
188
|
+
*/
|
|
189
|
+
;
|
|
312
190
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
191
|
+
_proto.getEntitySet = function getEntitySet() {
|
|
192
|
+
return this.targetDataModelPath.targetEntitySet;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Retrieve the context path.
|
|
196
|
+
*
|
|
197
|
+
* @returns The context path of the converter.
|
|
198
|
+
*/
|
|
199
|
+
;
|
|
317
200
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
201
|
+
_proto.getContextPath = function getContextPath() {
|
|
202
|
+
return this.baseContextPath;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Retrieve the current data model object path.
|
|
206
|
+
*
|
|
207
|
+
* @returns The current data model object path
|
|
208
|
+
*/
|
|
209
|
+
;
|
|
326
210
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
211
|
+
_proto.getDataModelObjectPath = function getDataModelObjectPath() {
|
|
212
|
+
return this.targetDataModelPath;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get the EntityContainer.
|
|
216
|
+
*
|
|
217
|
+
* @returns The current service EntityContainer
|
|
218
|
+
*/
|
|
219
|
+
;
|
|
332
220
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
221
|
+
_proto.getEntityContainer = function getEntityContainer() {
|
|
222
|
+
return this.convertedTypes.entityContainer;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Get the EntityType based on the fully qualified name.
|
|
226
|
+
*
|
|
227
|
+
* @returns The current EntityType.
|
|
228
|
+
*/
|
|
229
|
+
;
|
|
230
|
+
|
|
231
|
+
_proto.getEntityType = function getEntityType() {
|
|
232
|
+
return this.targetDataModelPath.targetEntityType;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Gets the entity type of the parameter in case of a parameterized service.
|
|
236
|
+
* @returns {EntityType} The entity type of the parameter
|
|
237
|
+
*/
|
|
238
|
+
;
|
|
239
|
+
|
|
240
|
+
_proto.getParameterEntityType = function getParameterEntityType() {
|
|
241
|
+
var _parameterEntityType$, _parameterEntityType$2;
|
|
242
|
+
|
|
243
|
+
var parameterEntityType = this.targetDataModelPath.startingEntitySet.entityType;
|
|
244
|
+
var isParameterized = !!((_parameterEntityType$ = parameterEntityType.annotations) !== null && _parameterEntityType$ !== void 0 && (_parameterEntityType$2 = _parameterEntityType$.Common) !== null && _parameterEntityType$2 !== void 0 && _parameterEntityType$2.ResultContext);
|
|
245
|
+
return isParameterized && parameterEntityType;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Retrieves an annotation from an entity type based on annotation path.
|
|
249
|
+
*
|
|
250
|
+
* @param annotationPath The annotation path to be evaluated
|
|
251
|
+
* @returns The target annotation path as well as a converter context to go with it
|
|
252
|
+
*/
|
|
253
|
+
;
|
|
254
|
+
|
|
255
|
+
_proto.getEntityTypeAnnotation = function getEntityTypeAnnotation(annotationPath) {
|
|
256
|
+
var _startingEntityType$a;
|
|
257
|
+
|
|
258
|
+
if (annotationPath.indexOf("@") === -1) {
|
|
259
|
+
annotationPath = "@" + annotationPath;
|
|
356
260
|
}
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
261
|
+
|
|
262
|
+
var targetObject = this.targetDataModelPath.targetEntityType.resolvePath(annotationPath, true);
|
|
263
|
+
var rootEntitySet = this.targetDataModelPath.targetEntitySet;
|
|
264
|
+
var currentEntityType = this.targetDataModelPath.targetEntityType;
|
|
265
|
+
var startingEntityType = this.targetDataModelPath.startingEntitySet.entityType;
|
|
266
|
+
var navigationProperties = this.targetDataModelPath.navigationProperties.concat();
|
|
267
|
+
var i = 1;
|
|
268
|
+
var currentObject;
|
|
269
|
+
var navigatedPaths = [];
|
|
270
|
+
var visitedObjects = targetObject.visitedObjects; // In case of parameterized service
|
|
271
|
+
|
|
272
|
+
if (!rootEntitySet && (_startingEntityType$a = startingEntityType.annotations.Common) !== null && _startingEntityType$a !== void 0 && _startingEntityType$a.ResultContext) {
|
|
273
|
+
rootEntitySet = this.targetDataModelPath.startingEntitySet;
|
|
274
|
+
this.targetDataModelPath.navigationProperties.forEach(function (navObject) {
|
|
275
|
+
navigatedPaths.push(navObject.name);
|
|
276
|
+
});
|
|
369
277
|
}
|
|
370
|
-
/**
|
|
371
|
-
* Transform an entityType based path to an entitySet based one (ui5 templating generally expect an entitySetBasedPath).
|
|
372
|
-
*
|
|
373
|
-
* @param annotationPath
|
|
374
|
-
* @returns The EntitySet based annotation path
|
|
375
|
-
*/
|
|
376
|
-
|
|
377
|
-
}, {
|
|
378
|
-
key: "getEntitySetBasedAnnotationPath",
|
|
379
|
-
value: function getEntitySetBasedAnnotationPath(annotationPath) {
|
|
380
|
-
if (!annotationPath) {
|
|
381
|
-
return annotationPath;
|
|
382
|
-
}
|
|
383
278
|
|
|
384
|
-
|
|
279
|
+
while (i < visitedObjects.length) {
|
|
280
|
+
currentObject = visitedObjects[i++];
|
|
385
281
|
|
|
386
|
-
if (
|
|
387
|
-
|
|
282
|
+
if (currentObject._type === "NavigationProperty") {
|
|
283
|
+
navigatedPaths.push(currentObject.name);
|
|
284
|
+
navigationProperties.push(currentObject);
|
|
285
|
+
currentEntityType = currentObject.targetType;
|
|
388
286
|
|
|
389
|
-
if (
|
|
390
|
-
|
|
287
|
+
if (rootEntitySet && rootEntitySet.navigationPropertyBinding.hasOwnProperty(navigatedPaths.join("/"))) {
|
|
288
|
+
var navPath = navigatedPaths.join("/");
|
|
289
|
+
rootEntitySet = rootEntitySet.navigationPropertyBinding[currentObject.name] || rootEntitySet.navigationPropertyBinding[navPath];
|
|
290
|
+
navigatedPaths = [];
|
|
291
|
+
} else {
|
|
292
|
+
rootEntitySet = undefined;
|
|
391
293
|
}
|
|
294
|
+
}
|
|
392
295
|
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
296
|
+
if (currentObject._type === "EntitySet") {
|
|
297
|
+
rootEntitySet = currentObject;
|
|
298
|
+
currentEntityType = rootEntitySet.entityType;
|
|
396
299
|
}
|
|
397
300
|
}
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
301
|
+
|
|
302
|
+
var outDataModelPath = {
|
|
303
|
+
startingEntitySet: this.targetDataModelPath.startingEntitySet,
|
|
304
|
+
targetEntitySet: rootEntitySet,
|
|
305
|
+
targetEntityType: currentEntityType,
|
|
306
|
+
targetObject: navigationProperties[navigationProperties.length - 1],
|
|
307
|
+
navigationProperties: navigationProperties,
|
|
308
|
+
contextLocation: this.targetDataModelPath.contextLocation,
|
|
309
|
+
convertedTypes: this.convertedTypes
|
|
310
|
+
};
|
|
311
|
+
return {
|
|
312
|
+
annotation: targetObject.target,
|
|
313
|
+
converterContext: new ConverterContext(this.convertedTypes, this.manifestSettings, this.diagnostics, this.mergeFn, outDataModelPath)
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Retrieve the type of template we're working on (e.g. ListReport / ObjectPage / ...).
|
|
318
|
+
*
|
|
319
|
+
* @returns The current tenplate type
|
|
320
|
+
*/
|
|
321
|
+
;
|
|
322
|
+
|
|
323
|
+
_proto.getTemplateType = function getTemplateType() {
|
|
324
|
+
return this.manifestWrapper.getTemplateType();
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Retrieve the converted types.
|
|
328
|
+
* @returns The current converted types
|
|
329
|
+
*/
|
|
330
|
+
;
|
|
331
|
+
|
|
332
|
+
_proto.getConvertedTypes = function getConvertedTypes() {
|
|
333
|
+
return this.convertedTypes;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Retrieve a relative annotation path between an annotation path and an entity type.
|
|
337
|
+
*
|
|
338
|
+
* @param annotationPath
|
|
339
|
+
* @param entityType
|
|
340
|
+
* @returns The relative anntotation path.
|
|
341
|
+
*/
|
|
342
|
+
;
|
|
343
|
+
|
|
344
|
+
_proto.getRelativeAnnotationPath = function getRelativeAnnotationPath(annotationPath, entityType) {
|
|
345
|
+
return annotationPath.replace(entityType.fullyQualifiedName, "");
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Transform an entityType based path to an entitySet based one (ui5 templating generally expect an entitySetBasedPath).
|
|
349
|
+
*
|
|
350
|
+
* @param annotationPath
|
|
351
|
+
* @returns The EntitySet based annotation path
|
|
352
|
+
*/
|
|
353
|
+
;
|
|
354
|
+
|
|
355
|
+
_proto.getEntitySetBasedAnnotationPath = function getEntitySetBasedAnnotationPath(annotationPath) {
|
|
356
|
+
if (!annotationPath) {
|
|
357
|
+
return annotationPath;
|
|
413
358
|
}
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
return
|
|
359
|
+
|
|
360
|
+
var entityTypeFQN = this.targetDataModelPath.targetEntityType.fullyQualifiedName;
|
|
361
|
+
|
|
362
|
+
if (this.targetDataModelPath.targetEntitySet || (this.baseContextPath.startsWith("/") && this.baseContextPath.match(/\//g) || []).length > 1) {
|
|
363
|
+
var replacedAnnotationPath = annotationPath.replace(entityTypeFQN, "/");
|
|
364
|
+
|
|
365
|
+
if (replacedAnnotationPath.length > 2 && replacedAnnotationPath[0] === "/" && replacedAnnotationPath[1] === "/") {
|
|
366
|
+
replacedAnnotationPath = replacedAnnotationPath.substr(1);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
return this.baseContextPath + (replacedAnnotationPath.startsWith("/") ? replacedAnnotationPath : "/" + replacedAnnotationPath);
|
|
370
|
+
} else {
|
|
371
|
+
return "/" + annotationPath;
|
|
427
372
|
}
|
|
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
|
-
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Retrieve the manifest wrapper for the current context.
|
|
376
|
+
*
|
|
377
|
+
* @returns The current manifest wrapper
|
|
378
|
+
*/
|
|
379
|
+
;
|
|
380
|
+
|
|
381
|
+
_proto.getManifestWrapper = function getManifestWrapper() {
|
|
382
|
+
return this.manifestWrapper;
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
_proto.getDiagnostics = function getDiagnostics() {
|
|
386
|
+
return this.diagnostics;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Retrieve the target from an absolute path.
|
|
390
|
+
*
|
|
391
|
+
* @param {string} path The path we want to get the target
|
|
392
|
+
* @returns {ConverterContext}
|
|
393
|
+
*/
|
|
394
|
+
;
|
|
395
|
+
|
|
396
|
+
_proto.resolveAbsolutePath = function resolveAbsolutePath(path) {
|
|
397
|
+
return this.convertedTypes.resolvePath(path);
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Retrieve a new converter context, scoped for a different context path.
|
|
401
|
+
*
|
|
402
|
+
* @param {string} contextPath The path we want to orchestrate the converter context around
|
|
403
|
+
* @returns {ConverterContext}
|
|
404
|
+
*/
|
|
405
|
+
;
|
|
406
|
+
|
|
407
|
+
_proto.getConverterContextFor = function getConverterContextFor(contextPath) {
|
|
408
|
+
var resolvedMetaPath = this.convertedTypes.resolvePath(contextPath);
|
|
409
|
+
var targetPath = getDataModelPathForEntitySet(resolvedMetaPath, this.convertedTypes);
|
|
410
|
+
return new ConverterContext(this.convertedTypes, this.manifestSettings, this.diagnostics, this.mergeFn, targetPath);
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Get all annotations of a given term and vocabulary on an entity type
|
|
414
|
+
* (or on the current entity type if entityType isn't specified).
|
|
415
|
+
*
|
|
416
|
+
* @param vocabularyName
|
|
417
|
+
* @param annotationTerm
|
|
418
|
+
* @param [annotationSources]
|
|
419
|
+
* @returns All the annotation for a specific term and vocabulary from an entity type
|
|
420
|
+
*/
|
|
421
|
+
;
|
|
422
|
+
|
|
423
|
+
_proto.getAnnotationsByTerm = function getAnnotationsByTerm(vocabularyName, annotationTerm) {
|
|
424
|
+
var annotationSources = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [this.getEntityType()];
|
|
425
|
+
var outAnnotations = [];
|
|
426
|
+
annotationSources.forEach(function (annotationSource) {
|
|
427
|
+
if (annotationSource) {
|
|
428
|
+
var annotations = (annotationSource === null || annotationSource === void 0 ? void 0 : annotationSource.annotations[vocabularyName]) || {};
|
|
429
|
+
|
|
430
|
+
if (annotations) {
|
|
431
|
+
outAnnotations = Object.keys(annotations).filter(function (annotation) {
|
|
432
|
+
return annotations[annotation].term === annotationTerm;
|
|
433
|
+
}).reduce(function (previousValue, key) {
|
|
434
|
+
previousValue.push(annotations[key]);
|
|
435
|
+
return previousValue;
|
|
436
|
+
}, outAnnotations);
|
|
455
437
|
}
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
return outAnnotations;
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Retrieves the relative model path based on the current context path.
|
|
444
|
+
*
|
|
445
|
+
* @returns {string|undefined} The relative model path or undefined if the path is not resolveable
|
|
446
|
+
*/
|
|
447
|
+
;
|
|
448
|
+
|
|
449
|
+
_proto.getRelativeModelPathFunction = function getRelativeModelPathFunction() {
|
|
450
|
+
var targetDataModelPath = this.targetDataModelPath;
|
|
451
|
+
return function (sPath) {
|
|
452
|
+
var enhancedPath = enhanceDataModelPath(targetDataModelPath, sPath);
|
|
453
|
+
return getContextRelativeTargetObjectPath(enhancedPath, true);
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Create the converter context necessary for a macro based on a metamodel context.
|
|
458
|
+
* @param sEntitySetName
|
|
459
|
+
* @param oMetaModelContext
|
|
460
|
+
* @param diagnostics
|
|
461
|
+
* @param mergeFn
|
|
462
|
+
* @param targetDataModelPath
|
|
463
|
+
* @param manifestSettings
|
|
464
|
+
* @returns {ConverterContext} The current converter context
|
|
465
|
+
*/
|
|
466
|
+
;
|
|
467
|
+
|
|
468
|
+
ConverterContext.createConverterContextForMacro = function createConverterContextForMacro(sEntitySetName, oMetaModelContext, diagnostics, mergeFn, targetDataModelPath) {
|
|
469
|
+
var manifestSettings = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
|
|
470
|
+
var oMetaModel = oMetaModelContext.isA("sap.ui.model.odata.v4.ODataMetaModel") ? oMetaModelContext : oMetaModelContext.getModel();
|
|
471
|
+
var oConverterOutput = convertTypes(oMetaModel);
|
|
472
|
+
var targetEntitySet = oConverterOutput.entitySets.find(function (entitySet) {
|
|
473
|
+
return entitySet.name === sEntitySetName;
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
if (!targetDataModelPath) {
|
|
477
|
+
targetDataModelPath = {
|
|
478
|
+
startingEntitySet: targetEntitySet,
|
|
479
|
+
navigationProperties: [],
|
|
480
|
+
targetEntitySet: targetEntitySet,
|
|
481
|
+
targetEntityType: targetEntitySet.entityType,
|
|
482
|
+
targetObject: targetEntitySet,
|
|
483
|
+
convertedTypes: oConverterOutput
|
|
472
484
|
};
|
|
473
485
|
}
|
|
474
|
-
/**
|
|
475
|
-
* Create the converter context necessary for a macro based on a metamodel context.
|
|
476
|
-
* @param sEntitySetName
|
|
477
|
-
* @param oMetaModelContext
|
|
478
|
-
* @param diagnostics
|
|
479
|
-
* @param mergeFn
|
|
480
|
-
* @param targetDataModelPath
|
|
481
|
-
* @param manifestSettings
|
|
482
|
-
* @returns {ConverterContext} The current converter context
|
|
483
|
-
*/
|
|
484
|
-
|
|
485
|
-
}], [{
|
|
486
|
-
key: "createConverterContextForMacro",
|
|
487
|
-
value: function createConverterContextForMacro(sEntitySetName, oMetaModelContext, diagnostics, mergeFn, targetDataModelPath) {
|
|
488
|
-
var manifestSettings = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
|
|
489
|
-
var oMetaModel = oMetaModelContext.isA("sap.ui.model.odata.v4.ODataMetaModel") ? oMetaModelContext : oMetaModelContext.getModel();
|
|
490
|
-
var oConverterOutput = convertTypes(oMetaModel);
|
|
491
|
-
var targetEntitySet = oConverterOutput.entitySets.find(function (entitySet) {
|
|
492
|
-
return entitySet.name === sEntitySetName;
|
|
493
|
-
});
|
|
494
486
|
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
startingEntitySet: targetEntitySet,
|
|
498
|
-
navigationProperties: [],
|
|
499
|
-
targetEntitySet: targetEntitySet,
|
|
500
|
-
targetEntityType: targetEntitySet.entityType,
|
|
501
|
-
targetObject: targetEntitySet
|
|
502
|
-
};
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
return new ConverterContext(oConverterOutput, manifestSettings, diagnostics, mergeFn, targetDataModelPath);
|
|
506
|
-
}
|
|
507
|
-
}]);
|
|
487
|
+
return new ConverterContext(oConverterOutput, manifestSettings, diagnostics, mergeFn, targetDataModelPath);
|
|
488
|
+
};
|
|
508
489
|
|
|
509
490
|
return ConverterContext;
|
|
510
491
|
}();
|
|
511
492
|
|
|
512
493
|
return ConverterContext;
|
|
513
494
|
}, false);
|
|
514
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbnZlcnRlckNvbnRleHQudHMiXSwibmFtZXMiOlsiaXNBbm5vdGF0aW9uVGVybSIsInZBbm5vdGF0aW9uUGF0aCIsImlzU2VydmljZU9iamVjdCIsIm9iamVjdFBhcnQiLCJoYXNPd25Qcm9wZXJ0eSIsImdldERhdGFNb2RlbFBhdGhGb3JFbnRpdHlTZXQiLCJyZXNvbHZlZE1ldGFQYXRoIiwicm9vdEVudGl0eVNldCIsImN1cnJlbnRFbnRpdHlTZXQiLCJwcmV2aW91c0VudGl0eVNldCIsImN1cnJlbnRFbnRpdHlUeXBlIiwibmF2aWdhdGVkUGF0aHMiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsIm9iamVjdFBhdGgiLCJmb3JFYWNoIiwiX3R5cGUiLCJwdXNoIiwibmFtZSIsInRhcmdldFR5cGUiLCJuYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nIiwiam9pbiIsInVuZGVmaW5lZCIsImVudGl0eVR5cGUiLCJkYXRhTW9kZWxQYXRoIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwidGFyZ2V0RW50aXR5U2V0IiwiY29udGV4dExvY2F0aW9uIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0IiwiQ29udmVydGVyQ29udGV4dCIsImNvbnZlcnRlZFR5cGVzIiwibWFuaWZlc3RTZXR0aW5ncyIsImRpYWdub3N0aWNzIiwibWVyZ2VGbiIsInRhcmdldERhdGFNb2RlbFBhdGgiLCJtYW5pZmVzdFdyYXBwZXIiLCJNYW5pZmVzdFdyYXBwZXIiLCJiYXNlQ29udGV4dFBhdGgiLCJnZXRUYXJnZXRPYmplY3RQYXRoIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiZW50aXR5VHlwZXMiLCJmaW5kIiwic3RhcnRzV2l0aCIsInJlcGxhY2VBbm5vdGF0aW9uIiwicmVwbGFjZSIsImFubm90YXRpb24iLCJhbm5vdGF0aW9uUGF0aCIsIl9nZXRFbnRpdHlUeXBlRnJvbUZ1bGx5UXVhbGlmaWVkTmFtZSIsIkVycm9yIiwiZ2V0Q29udHJvbENvbmZpZ3VyYXRpb24iLCJzQW5ub3RhdGlvblBhdGgiLCJlbnRpdHlDb250YWluZXIiLCJzaW5nbGV0b25zIiwic2luZ2xldG9uIiwicGFyYW1ldGVyRW50aXR5VHlwZSIsImlzUGFyYW1ldGVyaXplZCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiUmVzdWx0Q29udGV4dCIsImluZGV4T2YiLCJyZXNvbHZlUGF0aCIsInN0YXJ0aW5nRW50aXR5VHlwZSIsImNvbmNhdCIsImkiLCJjdXJyZW50T2JqZWN0IiwidmlzaXRlZE9iamVjdHMiLCJuYXZPYmplY3QiLCJsZW5ndGgiLCJuYXZQYXRoIiwib3V0RGF0YU1vZGVsUGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJnZXRUZW1wbGF0ZVR5cGUiLCJlbnRpdHlUeXBlRlFOIiwibWF0Y2giLCJyZXBsYWNlZEFubm90YXRpb25QYXRoIiwic3Vic3RyIiwiY29udGV4dFBhdGgiLCJ0YXJnZXRQYXRoIiwidm9jYWJ1bGFyeU5hbWUiLCJhbm5vdGF0aW9uVGVybSIsImFubm90YXRpb25Tb3VyY2VzIiwiZ2V0RW50aXR5VHlwZSIsIm91dEFubm90YXRpb25zIiwiYW5ub3RhdGlvblNvdXJjZSIsIk9iamVjdCIsImtleXMiLCJmaWx0ZXIiLCJ0ZXJtIiwicmVkdWNlIiwicHJldmlvdXNWYWx1ZSIsImtleSIsInNQYXRoIiwiZW5oYW5jZWRQYXRoIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoIiwic0VudGl0eVNldE5hbWUiLCJvTWV0YU1vZGVsQ29udGV4dCIsIm9NZXRhTW9kZWwiLCJpc0EiLCJnZXRNb2RlbCIsIm9Db252ZXJ0ZXJPdXRwdXQiLCJjb252ZXJ0VHlwZXMiLCJlbnRpdHlTZXRzIiwiZW50aXR5U2V0Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUE2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUEsZ0JBQWdCLEdBQUcsVUFBU0MsZUFBVCxFQUFnRztBQUN4SCxXQUFPLE9BQU9BLGVBQVAsS0FBMkIsUUFBbEM7QUFDQSxHQUZEOztBQUlBLFdBQVNDLGVBQVQsQ0FBeUJDLFVBQXpCLEVBQThGO0FBQzdGLFdBQU9BLFVBQVUsSUFBSUEsVUFBVSxDQUFDQyxjQUFYLENBQTBCLE9BQTFCLENBQXJCO0FBQ0E7O0FBRUQsTUFBTUMsNEJBQTRCLEdBQUcsVUFBU0MsZ0JBQVQsRUFBdUU7QUFDM0csUUFBSUMsYUFBSjtBQUNBLFFBQUlDLGdCQUFKO0FBQ0EsUUFBSUMsaUJBQUo7QUFDQSxRQUFJQyxpQkFBSjtBQUNBLFFBQUlDLGNBQXdCLEdBQUcsRUFBL0I7QUFDQSxRQUFNQyxvQkFBMEMsR0FBRyxFQUFuRDtBQUNBTixJQUFBQSxnQkFBZ0IsQ0FBQ08sVUFBakIsQ0FBNEJDLE9BQTVCLENBQW9DLFVBQUNYLFVBQUQsRUFBNEM7QUFBQTs7QUFDL0UsVUFBSUQsZUFBZSxDQUFDQyxVQUFELENBQW5CLEVBQWlDO0FBQ2hDLGdCQUFRQSxVQUFVLENBQUNZLEtBQW5CO0FBQ0MsZUFBSyxvQkFBTDtBQUNDSixZQUFBQSxjQUFjLENBQUNLLElBQWYsQ0FBb0JiLFVBQVUsQ0FBQ2MsSUFBL0I7QUFDQUwsWUFBQUEsb0JBQW9CLENBQUNJLElBQXJCLENBQTBCYixVQUExQjtBQUNBTyxZQUFBQSxpQkFBaUIsR0FBR1AsVUFBVSxDQUFDZSxVQUEvQjs7QUFDQSxnQkFBSVQsaUJBQWlCLElBQUlBLGlCQUFpQixDQUFDVSx5QkFBbEIsQ0FBNENmLGNBQTVDLENBQTJETyxjQUFjLENBQUNTLElBQWYsQ0FBb0IsR0FBcEIsQ0FBM0QsQ0FBekIsRUFBK0c7QUFDOUdaLGNBQUFBLGdCQUFnQixHQUFHQyxpQkFBaUIsQ0FBQ1UseUJBQWxCLENBQTRDUixjQUFjLENBQUNTLElBQWYsQ0FBb0IsR0FBcEIsQ0FBNUMsQ0FBbkI7QUFDQVgsY0FBQUEsaUJBQWlCLEdBQUdELGdCQUFwQjtBQUNBRyxjQUFBQSxjQUFjLEdBQUcsRUFBakI7QUFDQSxhQUpELE1BSU87QUFDTkgsY0FBQUEsZ0JBQWdCLEdBQUdhLFNBQW5CO0FBQ0E7O0FBQ0Q7O0FBQ0QsZUFBSyxXQUFMO0FBQ0MsZ0JBQUlkLGFBQWEsS0FBS2MsU0FBdEIsRUFBaUM7QUFDaENkLGNBQUFBLGFBQWEsR0FBR0osVUFBaEI7QUFDQTs7QUFDREssWUFBQUEsZ0JBQWdCLEdBQUdMLFVBQW5CO0FBQ0FNLFlBQUFBLGlCQUFpQixHQUFHRCxnQkFBcEI7QUFDQUUsWUFBQUEsaUJBQWlCLHdCQUFHRixnQkFBSCxzREFBRyxrQkFBa0JjLFVBQXRDO0FBQ0E7O0FBQ0Q7QUFDQztBQXRCRjtBQXdCQTtBQUNELEtBM0JEO0FBNEJBLFFBQU1DLGFBQWtDLEdBQUc7QUFDMUNDLE1BQUFBLGlCQUFpQixFQUFFakIsYUFEdUI7QUFFMUNrQixNQUFBQSxnQkFBZ0IsRUFBRWYsaUJBRndCO0FBRzFDZ0IsTUFBQUEsZUFBZSxFQUFFbEIsZ0JBSHlCO0FBSTFDSSxNQUFBQSxvQkFBb0IsRUFBRUEsb0JBSm9CO0FBSzFDZSxNQUFBQSxlQUFlLEVBQUVOLFNBTHlCO0FBTTFDTyxNQUFBQSxZQUFZLEVBQUV0QixnQkFBZ0IsQ0FBQ3VCO0FBTlcsS0FBM0M7QUFRQU4sSUFBQUEsYUFBYSxDQUFDSSxlQUFkLEdBQWdDSixhQUFoQztBQUNBLFdBQU9BLGFBQVA7QUFDQSxHQTdDRDtBQStDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O01BQ01PLGdCO0FBSUwsOEJBQ1NDLGNBRFQsRUFFU0MsZ0JBRlQsRUFHU0MsV0FIVCxFQUlTQyxPQUpULEVBS1NDLG1CQUxULEVBTUU7QUFBQTs7QUFBQSxXQUxPSixjQUtQLEdBTE9BLGNBS1A7QUFBQSxXQUpPQyxnQkFJUCxHQUpPQSxnQkFJUDtBQUFBLFdBSE9DLFdBR1AsR0FIT0EsV0FHUDtBQUFBLFdBRk9DLE9BRVAsR0FGT0EsT0FFUDtBQUFBLFdBRE9DLG1CQUNQLEdBRE9BLG1CQUNQO0FBQ0QsV0FBS0MsZUFBTCxHQUF1QixJQUFJQyxlQUFKLENBQW9CLEtBQUtMLGdCQUF6QixFQUEyQ0UsT0FBM0MsQ0FBdkI7QUFDQSxXQUFLSSxlQUFMLEdBQXVCQyxtQkFBbUIsQ0FBQyxLQUFLSixtQkFBTixDQUExQztBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OzthQUNDLDhDQUE2Q0ssa0JBQTdDLEVBQWlHO0FBQ2hHLFlBQU1mLGdCQUFnQixHQUFHLEtBQUtNLGNBQUwsQ0FBb0JVLFdBQXBCLENBQWdDQyxJQUFoQyxDQUFxQyxVQUFBcEIsVUFBVSxFQUFJO0FBQzNFLGNBQUlrQixrQkFBa0IsQ0FBQ0csVUFBbkIsQ0FBOEJyQixVQUFVLENBQUNrQixrQkFBekMsQ0FBSixFQUFrRTtBQUNqRSxnQkFBTUksaUJBQWlCLEdBQUdKLGtCQUFrQixDQUFDSyxPQUFuQixDQUEyQnZCLFVBQVUsQ0FBQ2tCLGtCQUF0QyxFQUEwRCxFQUExRCxDQUExQjtBQUNBLG1CQUFPSSxpQkFBaUIsQ0FBQ0QsVUFBbEIsQ0FBNkIsR0FBN0IsS0FBcUNDLGlCQUFpQixDQUFDRCxVQUFsQixDQUE2QixHQUE3QixDQUE1QztBQUNBOztBQUNELGlCQUFPLEtBQVA7QUFDQSxTQU53QixDQUF6QjtBQU9BLGVBQU9sQixnQkFBUDtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O2FBQ0MsaUNBQXdCcUIsVUFBeEIsRUFBc0U7QUFDckUsWUFBSUEsVUFBSixFQUFnQjtBQUNmLGNBQU1DLGNBQWMsR0FBR0QsVUFBVSxDQUFDTixrQkFBbEM7O0FBQ0EsY0FBTWYsZ0JBQWdCLEdBQUcsS0FBS3VCLG9DQUFMLENBQTBDRCxjQUExQyxDQUF6Qjs7QUFDQSxjQUFJLENBQUN0QixnQkFBTCxFQUF1QjtBQUN0QixrQkFBTSxJQUFJd0IsS0FBSixDQUFVLGlDQUFpQ0gsVUFBVSxDQUFDTixrQkFBdEQsQ0FBTjtBQUNBOztBQUNELGlCQUFPZixnQkFBUDtBQUNBLFNBUEQsTUFPTztBQUNOLGlCQUFPLEtBQUtVLG1CQUFMLENBQXlCVixnQkFBaEM7QUFDQTtBQUNEO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O2FBQ0MseUNBQWdDeEIsZUFBaEMsRUFBb0Y7QUFDbkYsWUFBSUQsZ0JBQWdCLENBQUNDLGVBQUQsQ0FBcEIsRUFBdUM7QUFDdEMsaUJBQU8sS0FBS21DLGVBQUwsQ0FBcUJjLHVCQUFyQixDQUNOakQsZUFBZSxDQUFDdUMsa0JBQWhCLENBQW1DSyxPQUFuQyxDQUEyQyxLQUFLVixtQkFBTCxDQUF5QlYsZ0JBQXpCLENBQTBDZSxrQkFBckYsRUFBeUcsRUFBekcsQ0FETSxDQUFQO0FBR0E7O0FBQ0QsZUFBTyxLQUFLSixlQUFMLENBQXFCYyx1QkFBckIsQ0FBNkNqRCxlQUE3QyxDQUFQO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7YUFDQyxtQ0FBMEJrRCxlQUExQixFQUEyRDtBQUMxRCxZQUFJLENBQUNBLGVBQUwsRUFBc0I7QUFDckIsaUJBQU9BLGVBQVA7QUFDQTs7QUFDRCxZQUFJQSxlQUFlLENBQUMsQ0FBRCxDQUFmLEtBQXVCLEdBQTNCLEVBQWdDO0FBQy9CLGlCQUFPQSxlQUFQO0FBQ0E7O0FBQ0QsZUFBTyxLQUFLYixlQUFMLEdBQXVCLEdBQXZCLEdBQTZCYSxlQUFwQztBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLHdCQUFzQztBQUNyQyxlQUFPLEtBQUtoQixtQkFBTCxDQUF5QlQsZUFBaEM7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7Ozs7YUFDQywwQkFBeUI7QUFDeEIsZUFBTyxLQUFLWSxlQUFaO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBOzs7O2FBQ0Msa0NBQThDO0FBQzdDLGVBQU8sS0FBS0gsbUJBQVo7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7Ozs7YUFDQyw4QkFBc0M7QUFDckMsZUFBTyxLQUFLSixjQUFMLENBQW9CcUIsZUFBM0I7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7Ozs7YUFDQyx5QkFBNEI7QUFDM0IsZUFBTyxLQUFLakIsbUJBQUwsQ0FBeUJWLGdCQUFoQztBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O2FBQ0Msc0JBQWFlLGtCQUFiLEVBQWdFO0FBQy9ELGVBQU8sS0FBS1QsY0FBTCxDQUFvQnNCLFVBQXBCLENBQStCWCxJQUEvQixDQUFvQyxVQUFBWSxTQUFTO0FBQUEsaUJBQUlBLFNBQVMsQ0FBQ2Qsa0JBQVYsS0FBaUNBLGtCQUFyQztBQUFBLFNBQTdDLENBQVA7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBOzs7O2FBQ0Msa0NBQXFDO0FBQUE7O0FBQ3BDLFlBQU1lLG1CQUFtQixHQUFHLEtBQUtwQixtQkFBTCxDQUF5QlgsaUJBQXpCLENBQTJDRixVQUF2RTtBQUNBLFlBQU1rQyxlQUFlLEdBQUcsQ0FBQywyQkFBQ0QsbUJBQW1CLENBQUNFLFdBQXJCLDRFQUFDLHNCQUFpQ0MsTUFBbEMsbURBQUMsdUJBQXlDQyxhQUExQyxDQUF6QjtBQUNBLGVBQVFILGVBQWUsSUFBSUQsbUJBQTNCO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7YUFDQyxpQ0FBd0JSLGNBQXhCLEVBQTJFO0FBQUE7O0FBQzFFLFlBQUlBLGNBQWMsQ0FBQ2EsT0FBZixDQUF1QixHQUF2QixNQUFnQyxDQUFDLENBQXJDLEVBQXdDO0FBQ3ZDYixVQUFBQSxjQUFjLEdBQUcsTUFBTUEsY0FBdkI7QUFDQTs7QUFDRCxZQUFNbkIsWUFBNEIsR0FBRyxLQUFLTyxtQkFBTCxDQUF5QlYsZ0JBQXpCLENBQTBDb0MsV0FBMUMsQ0FBc0RkLGNBQXRELEVBQXNFLElBQXRFLENBQXJDO0FBRUEsWUFBSXhDLGFBQWEsR0FBRyxLQUFLNEIsbUJBQUwsQ0FBeUJULGVBQTdDO0FBQ0EsWUFBSWhCLGlCQUFpQixHQUFHLEtBQUt5QixtQkFBTCxDQUF5QlYsZ0JBQWpEO0FBQ0EsWUFBTXFDLGtCQUFrQixHQUFHLEtBQUszQixtQkFBTCxDQUF5QlgsaUJBQXpCLENBQTJDRixVQUF0RTtBQUNBLFlBQU1WLG9CQUFvQixHQUFHLEtBQUt1QixtQkFBTCxDQUF5QnZCLG9CQUF6QixDQUE4Q21ELE1BQTlDLEVBQTdCO0FBQ0EsWUFBSUMsQ0FBQyxHQUFHLENBQVI7QUFDQSxZQUFJQyxhQUFKO0FBQ0EsWUFBSXRELGNBQWMsR0FBRyxFQUFyQjtBQUNBLFlBQU11RCxjQUFjLEdBQUd0QyxZQUFZLENBQUNzQyxjQUFwQyxDQWIwRSxDQWMxRTs7QUFDQSxZQUFJLENBQUMzRCxhQUFELDZCQUFrQnVELGtCQUFrQixDQUFDTCxXQUFuQixDQUErQkMsTUFBakQsa0RBQWtCLHNCQUF1Q0MsYUFBN0QsRUFBNEU7QUFDM0VwRCxVQUFBQSxhQUFhLEdBQUcsS0FBSzRCLG1CQUFMLENBQXlCWCxpQkFBekM7QUFDQSxlQUFLVyxtQkFBTCxDQUF5QnZCLG9CQUF6QixDQUE4Q0UsT0FBOUMsQ0FBc0QsVUFBU3FELFNBQVQsRUFBb0I7QUFDekV4RCxZQUFBQSxjQUFjLENBQUNLLElBQWYsQ0FBb0JtRCxTQUFTLENBQUNsRCxJQUE5QjtBQUNBLFdBRkQ7QUFHQTs7QUFDRCxlQUFPK0MsQ0FBQyxHQUFHRSxjQUFjLENBQUNFLE1BQTFCLEVBQWtDO0FBQ2pDSCxVQUFBQSxhQUFhLEdBQUdDLGNBQWMsQ0FBQ0YsQ0FBQyxFQUFGLENBQTlCOztBQUNBLGNBQUlDLGFBQWEsQ0FBQ2xELEtBQWQsS0FBd0Isb0JBQTVCLEVBQWtEO0FBQ2pESixZQUFBQSxjQUFjLENBQUNLLElBQWYsQ0FBb0JpRCxhQUFhLENBQUNoRCxJQUFsQztBQUNBTCxZQUFBQSxvQkFBb0IsQ0FBQ0ksSUFBckIsQ0FBMEJpRCxhQUExQjtBQUNBdkQsWUFBQUEsaUJBQWlCLEdBQUl1RCxhQUFELENBQXNDL0MsVUFBMUQ7O0FBQ0EsZ0JBQUlYLGFBQWEsSUFBSUEsYUFBYSxDQUFDWSx5QkFBZCxDQUF3Q2YsY0FBeEMsQ0FBdURPLGNBQWMsQ0FBQ1MsSUFBZixDQUFvQixHQUFwQixDQUF2RCxDQUFyQixFQUF1RztBQUN0RyxrQkFBTWlELE9BQU8sR0FBRzFELGNBQWMsQ0FBQ1MsSUFBZixDQUFvQixHQUFwQixDQUFoQjtBQUNBYixjQUFBQSxhQUFhLEdBQ1pBLGFBQWEsQ0FBQ1kseUJBQWQsQ0FBd0M4QyxhQUFhLENBQUNoRCxJQUF0RCxLQUErRFYsYUFBYSxDQUFDWSx5QkFBZCxDQUF3Q2tELE9BQXhDLENBRGhFO0FBRUExRCxjQUFBQSxjQUFjLEdBQUcsRUFBakI7QUFDQSxhQUxELE1BS087QUFDTkosY0FBQUEsYUFBYSxHQUFHYyxTQUFoQjtBQUNBO0FBQ0Q7O0FBQ0QsY0FBSTRDLGFBQWEsQ0FBQ2xELEtBQWQsS0FBd0IsV0FBNUIsRUFBeUM7QUFDeENSLFlBQUFBLGFBQWEsR0FBRzBELGFBQWhCO0FBQ0F2RCxZQUFBQSxpQkFBaUIsR0FBR0gsYUFBYSxDQUFDZSxVQUFsQztBQUNBO0FBQ0Q7O0FBQ0QsWUFBTWdELGdCQUFnQixHQUFHO0FBQ3hCOUMsVUFBQUEsaUJBQWlCLEVBQUUsS0FBS1csbUJBQUwsQ0FBeUJYLGlCQURwQjtBQUV4QkUsVUFBQUEsZUFBZSxFQUFFbkIsYUFGTztBQUd4QmtCLFVBQUFBLGdCQUFnQixFQUFFZixpQkFITTtBQUl4QmtCLFVBQUFBLFlBQVksRUFBRWhCLG9CQUFvQixDQUFDQSxvQkFBb0IsQ0FBQ3dELE1BQXJCLEdBQThCLENBQS9CLENBSlY7QUFLeEJ4RCxVQUFBQSxvQkFBb0IsRUFBcEJBLG9CQUx3QjtBQU14QmUsVUFBQUEsZUFBZSxFQUFFLEtBQUtRLG1CQUFMLENBQXlCUjtBQU5sQixTQUF6QjtBQVFBLGVBQU87QUFDTm1CLFVBQUFBLFVBQVUsRUFBRWxCLFlBQVksQ0FBQ0MsTUFEbkI7QUFFTjBDLFVBQUFBLGdCQUFnQixFQUFFLElBQUl6QyxnQkFBSixDQUNqQixLQUFLQyxjQURZLEVBRWpCLEtBQUtDLGdCQUZZLEVBR2pCLEtBQUtDLFdBSFksRUFJakIsS0FBS0MsT0FKWSxFQUtqQm9DLGdCQUxpQjtBQUZaLFNBQVA7QUFVQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7Ozs7YUFDQywyQkFBZ0M7QUFDL0IsZUFBTyxLQUFLbEMsZUFBTCxDQUFxQm9DLGVBQXJCLEVBQVA7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O2FBQ0MsbUNBQTBCekIsY0FBMUIsRUFBa0R6QixVQUFsRCxFQUFrRjtBQUNqRixlQUFPeUIsY0FBYyxDQUFDRixPQUFmLENBQXVCdkIsVUFBVSxDQUFDa0Isa0JBQWxDLEVBQXNELEVBQXRELENBQVA7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLHlDQUFnQ08sY0FBaEMsRUFBZ0U7QUFDL0QsWUFBSSxDQUFDQSxjQUFMLEVBQXFCO0FBQ3BCLGlCQUFPQSxjQUFQO0FBQ0E7O0FBQ0QsWUFBTTBCLGFBQWEsR0FBRyxLQUFLdEMsbUJBQUwsQ0FBeUJWLGdCQUF6QixDQUEwQ2Usa0JBQWhFOztBQUNBLFlBQ0MsS0FBS0wsbUJBQUwsQ0FBeUJULGVBQXpCLElBQ0EsQ0FBRSxLQUFLWSxlQUFMLENBQXFCSyxVQUFyQixDQUFnQyxHQUFoQyxLQUF3QyxLQUFLTCxlQUFMLENBQXFCb0MsS0FBckIsQ0FBMkIsS0FBM0IsQ0FBekMsSUFBK0UsRUFBaEYsRUFBb0ZOLE1BQXBGLEdBQTZGLENBRjlGLEVBR0U7QUFDRCxjQUFJTyxzQkFBc0IsR0FBRzVCLGNBQWMsQ0FBQ0YsT0FBZixDQUF1QjRCLGFBQXZCLEVBQXNDLEdBQXRDLENBQTdCOztBQUNBLGNBQUlFLHNCQUFzQixDQUFDUCxNQUF2QixHQUFnQyxDQUFoQyxJQUFxQ08sc0JBQXNCLENBQUMsQ0FBRCxDQUF0QixLQUE4QixHQUFuRSxJQUEwRUEsc0JBQXNCLENBQUMsQ0FBRCxDQUF0QixLQUE4QixHQUE1RyxFQUFpSDtBQUNoSEEsWUFBQUEsc0JBQXNCLEdBQUdBLHNCQUFzQixDQUFDQyxNQUF2QixDQUE4QixDQUE5QixDQUF6QjtBQUNBOztBQUNELGlCQUFPLEtBQUt0QyxlQUFMLEdBQXVCcUMsc0JBQTlCO0FBQ0EsU0FURCxNQVNPO0FBQ04saUJBQU8sTUFBTTVCLGNBQWI7QUFDQTtBQUNEO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLDhCQUFzQztBQUNyQyxlQUFPLEtBQUtYLGVBQVo7QUFDQTs7O2FBRUQsMEJBQStCO0FBQzlCLGVBQU8sS0FBS0gsV0FBWjtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O2FBQ0MsZ0NBQTBCNEMsV0FBMUIsRUFBaUU7QUFDaEUsWUFBTXZFLGdCQUFxQyxHQUFHLEtBQUt5QixjQUFMLENBQW9COEIsV0FBcEIsQ0FBZ0NnQixXQUFoQyxDQUE5QztBQUNBLFlBQU1DLFVBQVUsR0FBR3pFLDRCQUE0QixDQUFDQyxnQkFBRCxDQUEvQztBQUNBLGVBQU8sSUFBSXdCLGdCQUFKLENBQXFCLEtBQUtDLGNBQTFCLEVBQTBDLEtBQUtDLGdCQUEvQyxFQUFpRSxLQUFLQyxXQUF0RSxFQUFtRixLQUFLQyxPQUF4RixFQUFpRzRDLFVBQWpHLENBQVA7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLDhCQUNDQyxjQURELEVBRUNDLGNBRkQsRUFJeUI7QUFBQSxZQUR4QkMsaUJBQ3dCLHVFQUQyQixDQUFDLEtBQUtDLGFBQUwsRUFBRCxDQUMzQjtBQUN4QixZQUFJQyxjQUFxQyxHQUFHLEVBQTVDO0FBQ0FGLFFBQUFBLGlCQUFpQixDQUFDbkUsT0FBbEIsQ0FBMEIsVUFBQXNFLGdCQUFnQixFQUFJO0FBQzdDLGNBQUlBLGdCQUFKLEVBQXNCO0FBQ3JCLGdCQUFNM0IsV0FBZ0QsR0FBRyxDQUFBMkIsZ0JBQWdCLFNBQWhCLElBQUFBLGdCQUFnQixXQUFoQixZQUFBQSxnQkFBZ0IsQ0FBRTNCLFdBQWxCLENBQThCc0IsY0FBOUIsTUFBaUQsRUFBMUc7O0FBQ0EsZ0JBQUl0QixXQUFKLEVBQWlCO0FBQ2hCMEIsY0FBQUEsY0FBYyxHQUFHRSxNQUFNLENBQUNDLElBQVAsQ0FBWTdCLFdBQVosRUFDZjhCLE1BRGUsQ0FDUixVQUFBekMsVUFBVTtBQUFBLHVCQUFJVyxXQUFXLENBQUNYLFVBQUQsQ0FBWCxDQUF3QjBDLElBQXhCLEtBQWlDUixjQUFyQztBQUFBLGVBREYsRUFFZlMsTUFGZSxDQUVSLFVBQUNDLGFBQUQsRUFBdUNDLEdBQXZDLEVBQXVEO0FBQzlERCxnQkFBQUEsYUFBYSxDQUFDMUUsSUFBZCxDQUFtQnlDLFdBQVcsQ0FBQ2tDLEdBQUQsQ0FBOUI7QUFDQSx1QkFBT0QsYUFBUDtBQUNBLGVBTGUsRUFLYlAsY0FMYSxDQUFqQjtBQU1BO0FBQ0Q7QUFDRCxTQVpEO0FBYUEsZUFBT0EsY0FBUDtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLHdDQUF5QztBQUN4QyxZQUFNaEQsbUJBQW1CLEdBQUcsS0FBS0EsbUJBQWpDO0FBQ0EsZUFBTyxVQUFTeUQsS0FBVCxFQUF3QjtBQUM5QixjQUFNQyxZQUFZLEdBQUdDLG9CQUFvQixDQUFDM0QsbUJBQUQsRUFBc0J5RCxLQUF0QixDQUF6QztBQUNBLGlCQUFPRyxrQ0FBa0MsQ0FBQ0YsWUFBRCxFQUFlLElBQWYsQ0FBekM7QUFDQSxTQUhEO0FBSUE7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OzthQUNDLHdDQUNDRyxjQURELEVBRUNDLGlCQUZELEVBR0NoRSxXQUhELEVBSUNDLE9BSkQsRUFLQ0MsbUJBTEQsRUFPb0I7QUFBQSxZQURuQkgsZ0JBQ21CLHVFQURzQixFQUN0QjtBQUNuQixZQUFNa0UsVUFBMEIsR0FBR0QsaUJBQWlCLENBQUNFLEdBQWxCLENBQXNCLHNDQUF0QixJQUMvQkYsaUJBRCtCLEdBRTdCQSxpQkFBRCxDQUErQkcsUUFBL0IsRUFGTDtBQUdBLFlBQU1DLGdCQUFnQixHQUFHQyxZQUFZLENBQUNKLFVBQUQsQ0FBckM7QUFDQSxZQUFNeEUsZUFBZSxHQUFHMkUsZ0JBQWdCLENBQUNFLFVBQWpCLENBQTRCN0QsSUFBNUIsQ0FBaUMsVUFBQThELFNBQVM7QUFBQSxpQkFBSUEsU0FBUyxDQUFDdkYsSUFBVixLQUFtQitFLGNBQXZCO0FBQUEsU0FBMUMsQ0FBeEI7O0FBQ0EsWUFBSSxDQUFDN0QsbUJBQUwsRUFBMEI7QUFDekJBLFVBQUFBLG1CQUFtQixHQUFHO0FBQ3JCWCxZQUFBQSxpQkFBaUIsRUFBRUUsZUFERTtBQUVyQmQsWUFBQUEsb0JBQW9CLEVBQUUsRUFGRDtBQUdyQmMsWUFBQUEsZUFBZSxFQUFFQSxlQUhJO0FBSXJCRCxZQUFBQSxnQkFBZ0IsRUFBRUMsZUFBZSxDQUFDSixVQUpiO0FBS3JCTSxZQUFBQSxZQUFZLEVBQUVGO0FBTE8sV0FBdEI7QUFPQTs7QUFDRCxlQUFPLElBQUlJLGdCQUFKLENBQXFCdUUsZ0JBQXJCLEVBQXVDckUsZ0JBQXZDLEVBQXlEQyxXQUF6RCxFQUFzRUMsT0FBdEUsRUFBK0VDLG1CQUEvRSxDQUFQO0FBQ0E7Ozs7OztTQUdhTCxnQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvblRlcm0gfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB7XG5cdEFueUFubm90YXRpb24sXG5cdENvbnZlcnRlck91dHB1dCxcblx0RW50aXR5U2V0LFxuXHRFbnRpdHlUeXBlLFxuXHRFbnRpdHlDb250YWluZXIsXG5cdE5hdmlnYXRpb25Qcm9wZXJ0eSxcblx0U2VydmljZU9iamVjdCxcblx0U2luZ2xldG9uLFxuXHRSZXNvbHV0aW9uVGFyZ2V0LFxuXHRTZXJ2aWNlT2JqZWN0QW5kQW5ub3RhdGlvblxufSBmcm9tIFwiQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlclwiO1xuaW1wb3J0IHsgQmFzZU1hbmlmZXN0U2V0dGluZ3MsIFRlbXBsYXRlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IENvbnRleHQsIE9EYXRhTWV0YU1vZGVsIH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NFwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBSZXNvbHZlZFRhcmdldCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgSURpYWdub3N0aWNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB7XG5cdERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGVuaGFuY2VEYXRhTW9kZWxQYXRoLFxuXHRnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoLFxuXHRnZXRUYXJnZXRPYmplY3RQYXRoXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IEVudGl0eVR5cGVBbm5vdGF0aW9ucyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy90eXBlcy9nZW5lcmF0ZWQvRWRtX1R5cGVzXCI7XG5pbXBvcnQgTWFuaWZlc3RXcmFwcGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0V3JhcHBlclwiO1xuXG5leHBvcnQgdHlwZSBSZXNvbHZlZEFubm90YXRpb25Db250ZXh0ID0ge1xuXHRhbm5vdGF0aW9uOiBBbnlBbm5vdGF0aW9uO1xuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0O1xufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbiBvYmplY3QgaXMgYW4gYW5ub3RhdGlvbiB0ZXJtLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfEFubm90YXRpb25UZXJtPG9iamVjdD59IHZBbm5vdGF0aW9uUGF0aFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzQW5ub3RhdGlvblRlcm0gPSBmdW5jdGlvbih2QW5ub3RhdGlvblBhdGg6IHN0cmluZyB8IEFubm90YXRpb25UZXJtPGFueT4pOiB2QW5ub3RhdGlvblBhdGggaXMgQW5ub3RhdGlvblRlcm08YW55PiB7XG5cdHJldHVybiB0eXBlb2YgdkFubm90YXRpb25QYXRoID09PSBcIm9iamVjdFwiO1xufTtcblxuZnVuY3Rpb24gaXNTZXJ2aWNlT2JqZWN0KG9iamVjdFBhcnQ6IFNlcnZpY2VPYmplY3RBbmRBbm5vdGF0aW9uKTogb2JqZWN0UGFydCBpcyBTZXJ2aWNlT2JqZWN0IHtcblx0cmV0dXJuIG9iamVjdFBhcnQgJiYgb2JqZWN0UGFydC5oYXNPd25Qcm9wZXJ0eShcIl90eXBlXCIpO1xufVxuXG5jb25zdCBnZXREYXRhTW9kZWxQYXRoRm9yRW50aXR5U2V0ID0gZnVuY3Rpb24ocmVzb2x2ZWRNZXRhUGF0aDogUmVzb2x1dGlvblRhcmdldDxhbnk+KTogRGF0YU1vZGVsT2JqZWN0UGF0aCB7XG5cdGxldCByb290RW50aXR5U2V0OiBFbnRpdHlTZXQgfCB1bmRlZmluZWQ7XG5cdGxldCBjdXJyZW50RW50aXR5U2V0OiBFbnRpdHlTZXQgfCB1bmRlZmluZWQ7XG5cdGxldCBwcmV2aW91c0VudGl0eVNldDogRW50aXR5U2V0IHwgdW5kZWZpbmVkO1xuXHRsZXQgY3VycmVudEVudGl0eVR5cGU6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQ7XG5cdGxldCBuYXZpZ2F0ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgbmF2aWdhdGlvblByb3BlcnRpZXM6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdID0gW107XG5cdHJlc29sdmVkTWV0YVBhdGgub2JqZWN0UGF0aC5mb3JFYWNoKChvYmplY3RQYXJ0OiBTZXJ2aWNlT2JqZWN0QW5kQW5ub3RhdGlvbikgPT4ge1xuXHRcdGlmIChpc1NlcnZpY2VPYmplY3Qob2JqZWN0UGFydCkpIHtcblx0XHRcdHN3aXRjaCAob2JqZWN0UGFydC5fdHlwZSkge1xuXHRcdFx0XHRjYXNlIFwiTmF2aWdhdGlvblByb3BlcnR5XCI6XG5cdFx0XHRcdFx0bmF2aWdhdGVkUGF0aHMucHVzaChvYmplY3RQYXJ0Lm5hbWUpO1xuXHRcdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzLnB1c2gob2JqZWN0UGFydCk7XG5cdFx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPSBvYmplY3RQYXJ0LnRhcmdldFR5cGU7XG5cdFx0XHRcdFx0aWYgKHByZXZpb3VzRW50aXR5U2V0ICYmIHByZXZpb3VzRW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcuaGFzT3duUHJvcGVydHkobmF2aWdhdGVkUGF0aHMuam9pbihcIi9cIikpKSB7XG5cdFx0XHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gcHJldmlvdXNFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKV07XG5cdFx0XHRcdFx0XHRwcmV2aW91c0VudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQ7XG5cdFx0XHRcdFx0XHRuYXZpZ2F0ZWRQYXRocyA9IFtdO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIkVudGl0eVNldFwiOlxuXHRcdFx0XHRcdGlmIChyb290RW50aXR5U2V0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHJvb3RFbnRpdHlTZXQgPSBvYmplY3RQYXJ0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gb2JqZWN0UGFydDtcblx0XHRcdFx0XHRwcmV2aW91c0VudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQ7XG5cdFx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPSBjdXJyZW50RW50aXR5U2V0Py5lbnRpdHlUeXBlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdGNvbnN0IGRhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGggPSB7XG5cdFx0c3RhcnRpbmdFbnRpdHlTZXQ6IHJvb3RFbnRpdHlTZXQgYXMgRW50aXR5U2V0LFxuXHRcdHRhcmdldEVudGl0eVR5cGU6IGN1cnJlbnRFbnRpdHlUeXBlIGFzIEVudGl0eVR5cGUsXG5cdFx0dGFyZ2V0RW50aXR5U2V0OiBjdXJyZW50RW50aXR5U2V0LFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBuYXZpZ2F0aW9uUHJvcGVydGllcyxcblx0XHRjb250ZXh0TG9jYXRpb246IHVuZGVmaW5lZCxcblx0XHR0YXJnZXRPYmplY3Q6IHJlc29sdmVkTWV0YVBhdGgudGFyZ2V0XG5cdH07XG5cdGRhdGFNb2RlbFBhdGguY29udGV4dExvY2F0aW9uID0gZGF0YU1vZGVsUGF0aDtcblx0cmV0dXJuIGRhdGFNb2RlbFBhdGg7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIENvbnZlcnRlckNvbnRleHQgb2JqZWN0IHRoYXQgd2lsbCBiZSB1c2VkIHdpdGhpbiB0aGUgY29udmVydGVycy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlck91dHB1dH0gb0NvbnZlcnRlZFR5cGVzIFRoZSBjb252ZXJ0ZWQgYW5ub3RhdGlvbiBhbmQgc2VydmljZSB0eXBlc1xuICogQHBhcmFtIHtCYXNlTWFuaWZlc3RTZXR0aW5nc30gb01hbmlmZXN0U2V0dGluZ3MgVGhlIG1hbmlmZXN0U2V0dGluZ3MgdGhhdCBhcHBsaWVzIHRvIHRoaXMgcGFnZVxuICogQHBhcmFtIHtUZW1wbGF0ZVR5cGV9IHRlbXBsYXRlVHlwZSBUaGUgdHlwZSBvZiB0ZW1wbGF0ZSB3ZSdyZSBsb29raW5nIGF0IHJpZ2h0IG5vd1xuICogQHBhcmFtIHtJU2hlbGxTZXJ2aWNlc1Byb3h5fSBzaGVsbFNlcnZpY2VzIFRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSBzaGVsbHNlcnZpY2VcbiAqIEBwYXJhbSB7SURpYWdub3N0aWNzfSBkaWFnbm9zdGljcyBUaGUgZGlhZ25vc3RpY3Mgc2hpbVxuICogQHBhcmFtIHtGdW5jdGlvbn0gbWVyZ2VGbiBUaGUgZnVuY3Rpb24gdG8gYmUgdXNlZCB0byBwZXJmb20gc29tZSBkZWVwIG1lcmdlcyBiZXR3ZWVuIG9iamVjdFxuICogQHBhcmFtIHtEYXRhTW9kZWxPYmplY3RQYXRofSB0YXJnZXREYXRhTW9kZWxQYXRoIFRoZSBnbG9iYWwgcGF0aCB0byByZWFjaCB0aGUgZW50aXR5U2V0XG4gKlxuICogQHJldHVybnMge0NvbnZlcnRlckNvbnRleHR9IEEgY29udmVydGVyIGNvbnRleHQgZm9yIHRoZSBjb252ZXJ0ZXJzXG4gKi9cbmNsYXNzIENvbnZlcnRlckNvbnRleHQge1xuXHRwcml2YXRlIG1hbmlmZXN0V3JhcHBlcjogTWFuaWZlc3RXcmFwcGVyO1xuXHRwcml2YXRlIGJhc2VDb250ZXh0UGF0aDogc3RyaW5nO1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgY29udmVydGVkVHlwZXM6IENvbnZlcnRlck91dHB1dCxcblx0XHRwcml2YXRlIG1hbmlmZXN0U2V0dGluZ3M6IEJhc2VNYW5pZmVzdFNldHRpbmdzLFxuXHRcdHByaXZhdGUgZGlhZ25vc3RpY3M6IElEaWFnbm9zdGljcyxcblx0XHRwcml2YXRlIG1lcmdlRm46IEZ1bmN0aW9uLFxuXHRcdHByaXZhdGUgdGFyZ2V0RGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aFxuXHQpIHtcblx0XHR0aGlzLm1hbmlmZXN0V3JhcHBlciA9IG5ldyBNYW5pZmVzdFdyYXBwZXIodGhpcy5tYW5pZmVzdFNldHRpbmdzLCBtZXJnZUZuKTtcblx0XHR0aGlzLmJhc2VDb250ZXh0UGF0aCA9IGdldFRhcmdldE9iamVjdFBhdGgodGhpcy50YXJnZXREYXRhTW9kZWxQYXRoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgcHJvcGVydHkgYmFzZWQgb24gdGhlIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBmdWxseVF1YWxpZmllZE5hbWUgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lXG5cdCAqIEByZXR1cm5zIHtQcm9wZXJ0eX0gVGhlIHByb3BlcnR5IEVudGl0eVR5cGUgYmFzZWRcblx0ICovXG5cdHByaXZhdGUgX2dldEVudGl0eVR5cGVGcm9tRnVsbHlRdWFsaWZpZWROYW1lKGZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nKTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IHRoaXMuY29udmVydGVkVHlwZXMuZW50aXR5VHlwZXMuZmluZChlbnRpdHlUeXBlID0+IHtcblx0XHRcdGlmIChmdWxseVF1YWxpZmllZE5hbWUuc3RhcnRzV2l0aChlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSkpIHtcblx0XHRcdFx0Y29uc3QgcmVwbGFjZUFubm90YXRpb24gPSBmdWxseVF1YWxpZmllZE5hbWUucmVwbGFjZShlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgXCJcIik7XG5cdFx0XHRcdHJldHVybiByZXBsYWNlQW5ub3RhdGlvbi5zdGFydHNXaXRoKFwiL1wiKSB8fCByZXBsYWNlQW5ub3RhdGlvbi5zdGFydHNXaXRoKFwiQFwiKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9KTtcblx0XHRyZXR1cm4gdGFyZ2V0RW50aXR5VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgZW50aXR5VHlwZSBhc3NvY2lhdGVkIHdpdGggYW4gYW5ub3RhdGlvbiBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uIG9iamVjdCBmb3Igd2hpY2ggd2Ugd2FudCB0byBmaW5kIHRoZSBlbnRpdHlUeXBlXG5cdCAqIEByZXR1cm5zIHtFbnRpdHlUeXBlfSBUaGUgRW50aXR5VHlwZSB0aGUgYW5ub3RhdGlvbiByZWZlcnMgdG9cblx0ICovXG5cdGdldEFubm90YXRpb25FbnRpdHlUeXBlKGFubm90YXRpb24/OiBBbm5vdGF0aW9uVGVybTxhbnk+KTogRW50aXR5VHlwZSB7XG5cdFx0aWYgKGFubm90YXRpb24pIHtcblx0XHRcdGNvbnN0IGFubm90YXRpb25QYXRoID0gYW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWU7XG5cdFx0XHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlID0gdGhpcy5fZ2V0RW50aXR5VHlwZUZyb21GdWxseVF1YWxpZmllZE5hbWUoYW5ub3RhdGlvblBhdGgpO1xuXHRcdFx0aWYgKCF0YXJnZXRFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIEVudGl0eSBUeXBlIGZvciBcIiArIGFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0YXJnZXRFbnRpdHlUeXBlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVR5cGU7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSBtYW5pZmVzdCBzZXR0aW5ncyBkZWZpbmVkIGZvciBhIHNwZWNpZmljIGNvbnRyb2wgd2l0aGluIGNvbnRyb2xDb25maWd1cmF0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gdkFubm90YXRpb25QYXRoIFRoZSBhbm5vdGF0aW9uIHBhdGggb3Igb2JqZWN0IHRvIGV2YWx1YXRlXG5cdCAqIEByZXR1cm5zIFRoZSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZm9yIHRoYXQgc3BlY2lmaWMgYW5udG9hdGlvbiBwYXRoIGlmIGl0IGV4aXN0c1xuXHQgKi9cblx0Z2V0TWFuaWZlc3RDb250cm9sQ29uZmlndXJhdGlvbih2QW5ub3RhdGlvblBhdGg6IHN0cmluZyB8IEFubm90YXRpb25UZXJtPGFueT4pOiBhbnkge1xuXHRcdGlmIChpc0Fubm90YXRpb25UZXJtKHZBbm5vdGF0aW9uUGF0aCkpIHtcblx0XHRcdHJldHVybiB0aGlzLm1hbmlmZXN0V3JhcHBlci5nZXRDb250cm9sQ29uZmlndXJhdGlvbihcblx0XHRcdFx0dkFubm90YXRpb25QYXRoLmZ1bGx5UXVhbGlmaWVkTmFtZS5yZXBsYWNlKHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgXCJcIilcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLm1hbmlmZXN0V3JhcHBlci5nZXRDb250cm9sQ29uZmlndXJhdGlvbih2QW5ub3RhdGlvblBhdGgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhbiBhYnNvbHV0ZSBhbm5vdGF0aW9uIHBhdGggYmFzZWQgb24gdGhlIGN1cnJlbnQgbWV0YSBtb2RlbCBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc0Fubm90YXRpb25QYXRoIFRoZSByZWxhdGl2ZSBhbm5vdGF0aW9uIHBhdGhcblx0ICogQHJldHVybnMgVGhlIGNvcnJlY3QgYW5ub3RhdGlvbiBwYXRoIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbnRleHRcblx0ICovXG5cdGdldEFic29sdXRlQW5ub3RhdGlvblBhdGgoc0Fubm90YXRpb25QYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGlmICghc0Fubm90YXRpb25QYXRoKSB7XG5cdFx0XHRyZXR1cm4gc0Fubm90YXRpb25QYXRoO1xuXHRcdH1cblx0XHRpZiAoc0Fubm90YXRpb25QYXRoWzBdID09PSBcIi9cIikge1xuXHRcdFx0cmV0dXJuIHNBbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuYmFzZUNvbnRleHRQYXRoICsgXCIvXCIgKyBzQW5ub3RhdGlvblBhdGg7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIGN1cnJlbnQgZW50aXR5U2V0LlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBFbnRpdHlTZXQgaWYgaXQgZXhpc3RzLlxuXHQgKi9cblx0Z2V0RW50aXR5U2V0KCk6IEVudGl0eVNldCB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlTZXQ7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIGNvbnRleHQgcGF0aC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGNvbnRleHQgcGF0aCBvZiB0aGUgY29udmVydGVyLlxuXHQgKi9cblx0Z2V0Q29udGV4dFBhdGgoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5iYXNlQ29udGV4dFBhdGg7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIGN1cnJlbnQgZGF0YSBtb2RlbCBvYmplY3QgcGF0aC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgZGF0YSBtb2RlbCBvYmplY3QgcGF0aFxuXHQgKi9cblx0Z2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpOiBEYXRhTW9kZWxPYmplY3RQYXRoIHtcblx0XHRyZXR1cm4gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgRW50aXR5Q29udGFpbmVyLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBzZXJ2aWNlIEVudGl0eUNvbnRhaW5lclxuXHQgKi9cblx0Z2V0RW50aXR5Q29udGFpbmVyKCk6IEVudGl0eUNvbnRhaW5lciB7XG5cdFx0cmV0dXJuIHRoaXMuY29udmVydGVkVHlwZXMuZW50aXR5Q29udGFpbmVyO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgRW50aXR5VHlwZSBiYXNlZCBvbiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IEVudGl0eVR5cGUuXG5cdCAqL1xuXHRnZXRFbnRpdHlUeXBlKCk6IEVudGl0eVR5cGUge1xuXHRcdHJldHVybiB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGEgc2luZ2xldG9uIGJhc2VkIG9uIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGZ1bGx5UXVhbGlmaWVkTmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHNpbmdsZXRvblxuXHQgKiBAcmV0dXJucyB7U2luZ2xldG9uIHwgdW5kZWZpbmVkfSBUaGUgc2luZ2xldG9uIGluc3RhbmNlLlxuXHQgKi9cblx0Z2V0U2luZ2xldG9uKGZ1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nKTogU2luZ2xldG9uIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy5jb252ZXJ0ZWRUeXBlcy5zaW5nbGV0b25zLmZpbmQoc2luZ2xldG9uID0+IHNpbmdsZXRvbi5mdWxseVF1YWxpZmllZE5hbWUgPT09IGZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZW50aXR5IHR5cGUgb2YgdGhlIHBhcmFtZXRlciBpbiBjYXNlIG9mIGEgcGFyYW1ldGVyaXplZCBzZXJ2aWNlLlxuXHQgKiBAcmV0dXJucyB7RW50aXR5VHlwZX0gVGhlIGVudGl0eSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXJcblx0ICovXG5cdGdldFBhcmFtZXRlckVudGl0eVR5cGUoKTogRW50aXR5VHlwZSB7XG5cdFx0Y29uc3QgcGFyYW1ldGVyRW50aXR5VHlwZSA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5zdGFydGluZ0VudGl0eVNldC5lbnRpdHlUeXBlO1xuXHRcdGNvbnN0IGlzUGFyYW1ldGVyaXplZCA9ICEhcGFyYW1ldGVyRW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5SZXN1bHRDb250ZXh0O1xuXHRcdHJldHVybiAoaXNQYXJhbWV0ZXJpemVkICYmIHBhcmFtZXRlckVudGl0eVR5cGUpIGFzIEVudGl0eVR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIGFuIGFubm90YXRpb24gZnJvbSBhbiBlbnRpdHkgdHlwZSBiYXNlZCBvbiBhbm5vdGF0aW9uIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBhbm5vdGF0aW9uUGF0aCBUaGUgYW5ub3RhdGlvbiBwYXRoIHRvIGJlIGV2YWx1YXRlZFxuXHQgKiBAcmV0dXJucyBUaGUgdGFyZ2V0IGFubm90YXRpb24gcGF0aCBhcyB3ZWxsIGFzIGEgY29udmVydGVyIGNvbnRleHQgdG8gZ28gd2l0aCBpdFxuXHQgKi9cblx0Z2V0RW50aXR5VHlwZUFubm90YXRpb24oYW5ub3RhdGlvblBhdGg6IHN0cmluZyk6IFJlc29sdmVkQW5ub3RhdGlvbkNvbnRleHQge1xuXHRcdGlmIChhbm5vdGF0aW9uUGF0aC5pbmRleE9mKFwiQFwiKSA9PT0gLTEpIHtcblx0XHRcdGFubm90YXRpb25QYXRoID0gXCJAXCIgKyBhbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdFx0Y29uc3QgdGFyZ2V0T2JqZWN0OiBSZXNvbHZlZFRhcmdldCA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlUeXBlLnJlc29sdmVQYXRoKGFubm90YXRpb25QYXRoLCB0cnVlKTtcblxuXHRcdGxldCByb290RW50aXR5U2V0ID0gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVNldDtcblx0XHRsZXQgY3VycmVudEVudGl0eVR5cGUgPSB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5VHlwZTtcblx0XHRjb25zdCBzdGFydGluZ0VudGl0eVR5cGUgPSB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGguc3RhcnRpbmdFbnRpdHlTZXQuZW50aXR5VHlwZTtcblx0XHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5jb25jYXQoKTtcblx0XHRsZXQgaSA9IDE7XG5cdFx0bGV0IGN1cnJlbnRPYmplY3Q7XG5cdFx0bGV0IG5hdmlnYXRlZFBhdGhzID0gW107XG5cdFx0Y29uc3QgdmlzaXRlZE9iamVjdHMgPSB0YXJnZXRPYmplY3QudmlzaXRlZE9iamVjdHM7XG5cdFx0Ly8gSW4gY2FzZSBvZiBwYXJhbWV0ZXJpemVkIHNlcnZpY2Vcblx0XHRpZiAoIXJvb3RFbnRpdHlTZXQgJiYgc3RhcnRpbmdFbnRpdHlUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uUmVzdWx0Q29udGV4dCkge1xuXHRcdFx0cm9vdEVudGl0eVNldCA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5zdGFydGluZ0VudGl0eVNldDtcblx0XHRcdHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKG5hdk9iamVjdCkge1xuXHRcdFx0XHRuYXZpZ2F0ZWRQYXRocy5wdXNoKG5hdk9iamVjdC5uYW1lKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHR3aGlsZSAoaSA8IHZpc2l0ZWRPYmplY3RzLmxlbmd0aCkge1xuXHRcdFx0Y3VycmVudE9iamVjdCA9IHZpc2l0ZWRPYmplY3RzW2krK107XG5cdFx0XHRpZiAoY3VycmVudE9iamVjdC5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHRuYXZpZ2F0ZWRQYXRocy5wdXNoKGN1cnJlbnRPYmplY3QubmFtZSk7XG5cdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzLnB1c2goY3VycmVudE9iamVjdCBhcyBOYXZpZ2F0aW9uUHJvcGVydHkpO1xuXHRcdFx0XHRjdXJyZW50RW50aXR5VHlwZSA9IChjdXJyZW50T2JqZWN0IGFzIE5hdmlnYXRpb25Qcm9wZXJ0eSkudGFyZ2V0VHlwZTtcblx0XHRcdFx0aWYgKHJvb3RFbnRpdHlTZXQgJiYgcm9vdEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLmhhc093blByb3BlcnR5KG5hdmlnYXRlZFBhdGhzLmpvaW4oXCIvXCIpKSkge1xuXHRcdFx0XHRcdGNvbnN0IG5hdlBhdGggPSBuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKTtcblx0XHRcdFx0XHRyb290RW50aXR5U2V0ID1cblx0XHRcdFx0XHRcdHJvb3RFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tjdXJyZW50T2JqZWN0Lm5hbWVdIHx8IHJvb3RFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tuYXZQYXRoXTtcblx0XHRcdFx0XHRuYXZpZ2F0ZWRQYXRocyA9IFtdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJvb3RFbnRpdHlTZXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChjdXJyZW50T2JqZWN0Ll90eXBlID09PSBcIkVudGl0eVNldFwiKSB7XG5cdFx0XHRcdHJvb3RFbnRpdHlTZXQgPSBjdXJyZW50T2JqZWN0IGFzIEVudGl0eVNldDtcblx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPSByb290RW50aXR5U2V0LmVudGl0eVR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IG91dERhdGFNb2RlbFBhdGggPSB7XG5cdFx0XHRzdGFydGluZ0VudGl0eVNldDogdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnN0YXJ0aW5nRW50aXR5U2V0LFxuXHRcdFx0dGFyZ2V0RW50aXR5U2V0OiByb290RW50aXR5U2V0LFxuXHRcdFx0dGFyZ2V0RW50aXR5VHlwZTogY3VycmVudEVudGl0eVR5cGUsXG5cdFx0XHR0YXJnZXRPYmplY3Q6IG5hdmlnYXRpb25Qcm9wZXJ0aWVzW25hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCAtIDFdLFxuXHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXMsXG5cdFx0XHRjb250ZXh0TG9jYXRpb246IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5jb250ZXh0TG9jYXRpb25cblx0XHR9O1xuXHRcdHJldHVybiB7XG5cdFx0XHRhbm5vdGF0aW9uOiB0YXJnZXRPYmplY3QudGFyZ2V0IGFzIEFueUFubm90YXRpb24sXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0OiBuZXcgQ29udmVydGVyQ29udGV4dChcblx0XHRcdFx0dGhpcy5jb252ZXJ0ZWRUeXBlcyxcblx0XHRcdFx0dGhpcy5tYW5pZmVzdFNldHRpbmdzLFxuXHRcdFx0XHR0aGlzLmRpYWdub3N0aWNzLFxuXHRcdFx0XHR0aGlzLm1lcmdlRm4sXG5cdFx0XHRcdG91dERhdGFNb2RlbFBhdGhcblx0XHRcdClcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSB0eXBlIG9mIHRlbXBsYXRlIHdlJ3JlIHdvcmtpbmcgb24gKGUuZy4gTGlzdFJlcG9ydCAvIE9iamVjdFBhZ2UgLyAuLi4pLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCB0ZW5wbGF0ZSB0eXBlXG5cdCAqL1xuXHRnZXRUZW1wbGF0ZVR5cGUoKTogVGVtcGxhdGVUeXBlIHtcblx0XHRyZXR1cm4gdGhpcy5tYW5pZmVzdFdyYXBwZXIuZ2V0VGVtcGxhdGVUeXBlKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgYSByZWxhdGl2ZSBhbm5vdGF0aW9uIHBhdGggYmV0d2VlbiBhbiBhbm5vdGF0aW9uIHBhdGggYW5kIGFuIGVudGl0eSB0eXBlLlxuXHQgKlxuXHQgKiBAcGFyYW0gYW5ub3RhdGlvblBhdGhcblx0ICogQHBhcmFtIGVudGl0eVR5cGVcblx0ICogQHJldHVybnMgVGhlIHJlbGF0aXZlIGFubnRvdGF0aW9uIHBhdGguXG5cdCAqL1xuXHRnZXRSZWxhdGl2ZUFubm90YXRpb25QYXRoKGFubm90YXRpb25QYXRoOiBzdHJpbmcsIGVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBzdHJpbmcge1xuXHRcdHJldHVybiBhbm5vdGF0aW9uUGF0aC5yZXBsYWNlKGVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLCBcIlwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmFuc2Zvcm0gYW4gZW50aXR5VHlwZSBiYXNlZCBwYXRoIHRvIGFuIGVudGl0eVNldCBiYXNlZCBvbmUgKHVpNSB0ZW1wbGF0aW5nIGdlbmVyYWxseSBleHBlY3QgYW4gZW50aXR5U2V0QmFzZWRQYXRoKS5cblx0ICpcblx0ICogQHBhcmFtIGFubm90YXRpb25QYXRoXG5cdCAqIEByZXR1cm5zIFRoZSBFbnRpdHlTZXQgYmFzZWQgYW5ub3RhdGlvbiBwYXRoXG5cdCAqL1xuXHRnZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGFubm90YXRpb25QYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGlmICghYW5ub3RhdGlvblBhdGgpIHtcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdFx0Y29uc3QgZW50aXR5VHlwZUZRTiA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZTtcblx0XHRpZiAoXG5cdFx0XHR0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0IHx8XG5cdFx0XHQoKHRoaXMuYmFzZUNvbnRleHRQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpICYmIHRoaXMuYmFzZUNvbnRleHRQYXRoLm1hdGNoKC9cXC8vZykpIHx8IFtdKS5sZW5ndGggPiAxXG5cdFx0KSB7XG5cdFx0XHRsZXQgcmVwbGFjZWRBbm5vdGF0aW9uUGF0aCA9IGFubm90YXRpb25QYXRoLnJlcGxhY2UoZW50aXR5VHlwZUZRTiwgXCIvXCIpO1xuXHRcdFx0aWYgKHJlcGxhY2VkQW5ub3RhdGlvblBhdGgubGVuZ3RoID4gMiAmJiByZXBsYWNlZEFubm90YXRpb25QYXRoWzBdID09PSBcIi9cIiAmJiByZXBsYWNlZEFubm90YXRpb25QYXRoWzFdID09PSBcIi9cIikge1xuXHRcdFx0XHRyZXBsYWNlZEFubm90YXRpb25QYXRoID0gcmVwbGFjZWRBbm5vdGF0aW9uUGF0aC5zdWJzdHIoMSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlQ29udGV4dFBhdGggKyByZXBsYWNlZEFubm90YXRpb25QYXRoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gXCIvXCIgKyBhbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIG1hbmlmZXN0IHdyYXBwZXIgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IG1hbmlmZXN0IHdyYXBwZXJcblx0ICovXG5cdGdldE1hbmlmZXN0V3JhcHBlcigpOiBNYW5pZmVzdFdyYXBwZXIge1xuXHRcdHJldHVybiB0aGlzLm1hbmlmZXN0V3JhcHBlcjtcblx0fVxuXG5cdGdldERpYWdub3N0aWNzKCk6IElEaWFnbm9zdGljcyB7XG5cdFx0cmV0dXJuIHRoaXMuZGlhZ25vc3RpY3M7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgYSBuZXcgY29udmVydGVyIGNvbnRleHQsIHNjb3BlZCBmb3IgYSBkaWZmZXJlbnQgY29udGV4dCBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gY29udGV4dFBhdGggVGhlIHBhdGggd2Ugd2FudCB0byBvcmNoZXN0cmF0ZSB0aGUgY29udmVydGVyIGNvbnRleHQgYXJvdW5kXG5cdCAqIEByZXR1cm5zIHtDb252ZXJ0ZXJDb250ZXh0fVxuXHQgKi9cblx0Z2V0Q29udmVydGVyQ29udGV4dEZvcjxUPihjb250ZXh0UGF0aDogc3RyaW5nKTogQ29udmVydGVyQ29udGV4dCB7XG5cdFx0Y29uc3QgcmVzb2x2ZWRNZXRhUGF0aDogUmVzb2x1dGlvblRhcmdldDxUPiA9IHRoaXMuY29udmVydGVkVHlwZXMucmVzb2x2ZVBhdGgoY29udGV4dFBhdGgpO1xuXHRcdGNvbnN0IHRhcmdldFBhdGggPSBnZXREYXRhTW9kZWxQYXRoRm9yRW50aXR5U2V0KHJlc29sdmVkTWV0YVBhdGgpO1xuXHRcdHJldHVybiBuZXcgQ29udmVydGVyQ29udGV4dCh0aGlzLmNvbnZlcnRlZFR5cGVzLCB0aGlzLm1hbmlmZXN0U2V0dGluZ3MsIHRoaXMuZGlhZ25vc3RpY3MsIHRoaXMubWVyZ2VGbiwgdGFyZ2V0UGF0aCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IGFsbCBhbm5vdGF0aW9ucyBvZiBhIGdpdmVuIHRlcm0gYW5kIHZvY2FidWxhcnkgb24gYW4gZW50aXR5IHR5cGVcblx0ICogKG9yIG9uIHRoZSBjdXJyZW50IGVudGl0eSB0eXBlIGlmIGVudGl0eVR5cGUgaXNuJ3Qgc3BlY2lmaWVkKS5cblx0ICpcblx0ICogQHBhcmFtIHZvY2FidWxhcnlOYW1lXG5cdCAqIEBwYXJhbSBhbm5vdGF0aW9uVGVybVxuXHQgKiBAcGFyYW0gW2Fubm90YXRpb25Tb3VyY2VzXVxuXHQgKiBAcmV0dXJucyBBbGwgdGhlIGFubm90YXRpb24gZm9yIGEgc3BlY2lmaWMgdGVybSBhbmQgdm9jYWJ1bGFyeSBmcm9tIGFuIGVudGl0eSB0eXBlXG5cdCAqL1xuXHRnZXRBbm5vdGF0aW9uc0J5VGVybShcblx0XHR2b2NhYnVsYXJ5TmFtZToga2V5b2YgRW50aXR5VHlwZUFubm90YXRpb25zLFxuXHRcdGFubm90YXRpb25UZXJtOiBzdHJpbmcsXG5cdFx0YW5ub3RhdGlvblNvdXJjZXM6IChTZXJ2aWNlT2JqZWN0IHwgdW5kZWZpbmVkKVtdID0gW3RoaXMuZ2V0RW50aXR5VHlwZSgpXVxuXHQpOiBBbm5vdGF0aW9uVGVybTxhbnk+W10ge1xuXHRcdGxldCBvdXRBbm5vdGF0aW9uczogQW5ub3RhdGlvblRlcm08YW55PltdID0gW107XG5cdFx0YW5ub3RhdGlvblNvdXJjZXMuZm9yRWFjaChhbm5vdGF0aW9uU291cmNlID0+IHtcblx0XHRcdGlmIChhbm5vdGF0aW9uU291cmNlKSB7XG5cdFx0XHRcdGNvbnN0IGFubm90YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBBbm5vdGF0aW9uVGVybTxhbnk+PiA9IGFubm90YXRpb25Tb3VyY2U/LmFubm90YXRpb25zW3ZvY2FidWxhcnlOYW1lXSB8fCB7fTtcblx0XHRcdFx0aWYgKGFubm90YXRpb25zKSB7XG5cdFx0XHRcdFx0b3V0QW5ub3RhdGlvbnMgPSBPYmplY3Qua2V5cyhhbm5vdGF0aW9ucylcblx0XHRcdFx0XHRcdC5maWx0ZXIoYW5ub3RhdGlvbiA9PiBhbm5vdGF0aW9uc1thbm5vdGF0aW9uXS50ZXJtID09PSBhbm5vdGF0aW9uVGVybSlcblx0XHRcdFx0XHRcdC5yZWR1Y2UoKHByZXZpb3VzVmFsdWU6IEFubm90YXRpb25UZXJtPGFueT5bXSwga2V5OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdFx0cHJldmlvdXNWYWx1ZS5wdXNoKGFubm90YXRpb25zW2tleV0pO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcHJldmlvdXNWYWx1ZTtcblx0XHRcdFx0XHRcdH0sIG91dEFubm90YXRpb25zKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBvdXRBbm5vdGF0aW9ucztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHJlbGF0aXZlIG1vZGVsIHBhdGggYmFzZWQgb24gdGhlIGN1cnJlbnQgY29udGV4dCBwYXRoLlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gVGhlIHJlbGF0aXZlIG1vZGVsIHBhdGggb3IgdW5kZWZpbmVkIGlmIHRoZSBwYXRoIGlzIG5vdCByZXNvbHZlYWJsZVxuXHQgKi9cblx0Z2V0UmVsYXRpdmVNb2RlbFBhdGhGdW5jdGlvbigpOiBGdW5jdGlvbiB7XG5cdFx0Y29uc3QgdGFyZ2V0RGF0YU1vZGVsUGF0aCA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aDtcblx0XHRyZXR1cm4gZnVuY3Rpb24oc1BhdGg6IHN0cmluZykge1xuXHRcdFx0Y29uc3QgZW5oYW5jZWRQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgodGFyZ2V0RGF0YU1vZGVsUGF0aCwgc1BhdGgpO1xuXHRcdFx0cmV0dXJuIGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgoZW5oYW5jZWRQYXRoLCB0cnVlKTtcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSB0aGUgY29udmVydGVyIGNvbnRleHQgbmVjZXNzYXJ5IGZvciBhIG1hY3JvIGJhc2VkIG9uIGEgbWV0YW1vZGVsIGNvbnRleHQuXG5cdCAqIEBwYXJhbSBzRW50aXR5U2V0TmFtZVxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbENvbnRleHRcblx0ICogQHBhcmFtIGRpYWdub3N0aWNzXG5cdCAqIEBwYXJhbSBtZXJnZUZuXG5cdCAqIEBwYXJhbSB0YXJnZXREYXRhTW9kZWxQYXRoXG5cdCAqIEBwYXJhbSBtYW5pZmVzdFNldHRpbmdzXG5cdCAqIEByZXR1cm5zIHtDb252ZXJ0ZXJDb250ZXh0fSBUaGUgY3VycmVudCBjb252ZXJ0ZXIgY29udGV4dFxuXHQgKi9cblx0c3RhdGljIGNyZWF0ZUNvbnZlcnRlckNvbnRleHRGb3JNYWNybyhcblx0XHRzRW50aXR5U2V0TmFtZTogc3RyaW5nLFxuXHRcdG9NZXRhTW9kZWxDb250ZXh0OiBDb250ZXh0IHwgT0RhdGFNZXRhTW9kZWwsXG5cdFx0ZGlhZ25vc3RpY3M6IElEaWFnbm9zdGljcyxcblx0XHRtZXJnZUZuOiBGdW5jdGlvbixcblx0XHR0YXJnZXREYXRhTW9kZWxQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoIHwgdW5kZWZpbmVkLFxuXHRcdG1hbmlmZXN0U2V0dGluZ3M6IEJhc2VNYW5pZmVzdFNldHRpbmdzID0ge30gYXMgQmFzZU1hbmlmZXN0U2V0dGluZ3Ncblx0KTogQ29udmVydGVyQ29udGV4dCB7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgPSBvTWV0YU1vZGVsQ29udGV4dC5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcIilcblx0XHRcdD8gKG9NZXRhTW9kZWxDb250ZXh0IGFzIE9EYXRhTWV0YU1vZGVsKVxuXHRcdFx0OiAoKChvTWV0YU1vZGVsQ29udGV4dCBhcyBDb250ZXh0KS5nZXRNb2RlbCgpIGFzIHVua25vd24pIGFzIE9EYXRhTWV0YU1vZGVsKTtcblx0XHRjb25zdCBvQ29udmVydGVyT3V0cHV0ID0gY29udmVydFR5cGVzKG9NZXRhTW9kZWwpO1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVNldCA9IG9Db252ZXJ0ZXJPdXRwdXQuZW50aXR5U2V0cy5maW5kKGVudGl0eVNldCA9PiBlbnRpdHlTZXQubmFtZSA9PT0gc0VudGl0eVNldE5hbWUpIGFzIEVudGl0eVNldDtcblx0XHRpZiAoIXRhcmdldERhdGFNb2RlbFBhdGgpIHtcblx0XHRcdHRhcmdldERhdGFNb2RlbFBhdGggPSB7XG5cdFx0XHRcdHN0YXJ0aW5nRW50aXR5U2V0OiB0YXJnZXRFbnRpdHlTZXQsXG5cdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBbXSxcblx0XHRcdFx0dGFyZ2V0RW50aXR5U2V0OiB0YXJnZXRFbnRpdHlTZXQsXG5cdFx0XHRcdHRhcmdldEVudGl0eVR5cGU6IHRhcmdldEVudGl0eVNldC5lbnRpdHlUeXBlLFxuXHRcdFx0XHR0YXJnZXRPYmplY3Q6IHRhcmdldEVudGl0eVNldFxuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIG5ldyBDb252ZXJ0ZXJDb250ZXh0KG9Db252ZXJ0ZXJPdXRwdXQsIG1hbmlmZXN0U2V0dGluZ3MsIGRpYWdub3N0aWNzLCBtZXJnZUZuLCB0YXJnZXREYXRhTW9kZWxQYXRoKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb252ZXJ0ZXJDb250ZXh0O1xuIl19
|
|
495
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvbnZlcnRlckNvbnRleHQudHMiXSwibmFtZXMiOlsiaXNBbm5vdGF0aW9uVGVybSIsInZBbm5vdGF0aW9uUGF0aCIsImlzU2VydmljZU9iamVjdCIsIm9iamVjdFBhcnQiLCJoYXNPd25Qcm9wZXJ0eSIsImdldERhdGFNb2RlbFBhdGhGb3JFbnRpdHlTZXQiLCJyZXNvbHZlZE1ldGFQYXRoIiwiY29udmVydGVkVHlwZXMiLCJyb290RW50aXR5U2V0IiwiY3VycmVudEVudGl0eVNldCIsInByZXZpb3VzRW50aXR5U2V0IiwiY3VycmVudEVudGl0eVR5cGUiLCJuYXZpZ2F0ZWRQYXRocyIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwib2JqZWN0UGF0aCIsImZvckVhY2giLCJfdHlwZSIsInB1c2giLCJuYW1lIiwidGFyZ2V0VHlwZSIsIm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmciLCJqb2luIiwidW5kZWZpbmVkIiwiZW50aXR5VHlwZSIsImRhdGFNb2RlbFBhdGgiLCJzdGFydGluZ0VudGl0eVNldCIsInRhcmdldEVudGl0eVR5cGUiLCJ0YXJnZXRFbnRpdHlTZXQiLCJjb250ZXh0TG9jYXRpb24iLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXQiLCJDb252ZXJ0ZXJDb250ZXh0IiwibWFuaWZlc3RTZXR0aW5ncyIsImRpYWdub3N0aWNzIiwibWVyZ2VGbiIsInRhcmdldERhdGFNb2RlbFBhdGgiLCJtYW5pZmVzdFdyYXBwZXIiLCJNYW5pZmVzdFdyYXBwZXIiLCJiYXNlQ29udGV4dFBhdGgiLCJnZXRUYXJnZXRPYmplY3RQYXRoIiwiX2dldEVudGl0eVR5cGVGcm9tRnVsbHlRdWFsaWZpZWROYW1lIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiZW50aXR5VHlwZXMiLCJmaW5kIiwic3RhcnRzV2l0aCIsInJlcGxhY2VBbm5vdGF0aW9uIiwicmVwbGFjZSIsImdldEFubm90YXRpb25FbnRpdHlUeXBlIiwiYW5ub3RhdGlvbiIsImFubm90YXRpb25QYXRoIiwiRXJyb3IiLCJnZXRNYW5pZmVzdENvbnRyb2xDb25maWd1cmF0aW9uIiwiZ2V0Q29udHJvbENvbmZpZ3VyYXRpb24iLCJnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoIiwic0Fubm90YXRpb25QYXRoIiwiZ2V0RW50aXR5U2V0IiwiZ2V0Q29udGV4dFBhdGgiLCJnZXREYXRhTW9kZWxPYmplY3RQYXRoIiwiZ2V0RW50aXR5Q29udGFpbmVyIiwiZW50aXR5Q29udGFpbmVyIiwiZ2V0RW50aXR5VHlwZSIsImdldFBhcmFtZXRlckVudGl0eVR5cGUiLCJwYXJhbWV0ZXJFbnRpdHlUeXBlIiwiaXNQYXJhbWV0ZXJpemVkIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJSZXN1bHRDb250ZXh0IiwiZ2V0RW50aXR5VHlwZUFubm90YXRpb24iLCJpbmRleE9mIiwicmVzb2x2ZVBhdGgiLCJzdGFydGluZ0VudGl0eVR5cGUiLCJjb25jYXQiLCJpIiwiY3VycmVudE9iamVjdCIsInZpc2l0ZWRPYmplY3RzIiwibmF2T2JqZWN0IiwibGVuZ3RoIiwibmF2UGF0aCIsIm91dERhdGFNb2RlbFBhdGgiLCJjb252ZXJ0ZXJDb250ZXh0IiwiZ2V0VGVtcGxhdGVUeXBlIiwiZ2V0Q29udmVydGVkVHlwZXMiLCJnZXRSZWxhdGl2ZUFubm90YXRpb25QYXRoIiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsImVudGl0eVR5cGVGUU4iLCJtYXRjaCIsInJlcGxhY2VkQW5ub3RhdGlvblBhdGgiLCJzdWJzdHIiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXREaWFnbm9zdGljcyIsInJlc29sdmVBYnNvbHV0ZVBhdGgiLCJwYXRoIiwiZ2V0Q29udmVydGVyQ29udGV4dEZvciIsImNvbnRleHRQYXRoIiwidGFyZ2V0UGF0aCIsImdldEFubm90YXRpb25zQnlUZXJtIiwidm9jYWJ1bGFyeU5hbWUiLCJhbm5vdGF0aW9uVGVybSIsImFubm90YXRpb25Tb3VyY2VzIiwib3V0QW5ub3RhdGlvbnMiLCJhbm5vdGF0aW9uU291cmNlIiwiT2JqZWN0Iiwia2V5cyIsImZpbHRlciIsInRlcm0iLCJyZWR1Y2UiLCJwcmV2aW91c1ZhbHVlIiwia2V5IiwiZ2V0UmVsYXRpdmVNb2RlbFBhdGhGdW5jdGlvbiIsInNQYXRoIiwiZW5oYW5jZWRQYXRoIiwiZW5oYW5jZURhdGFNb2RlbFBhdGgiLCJnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoIiwiY3JlYXRlQ29udmVydGVyQ29udGV4dEZvck1hY3JvIiwic0VudGl0eVNldE5hbWUiLCJvTWV0YU1vZGVsQ29udGV4dCIsIm9NZXRhTW9kZWwiLCJpc0EiLCJnZXRNb2RlbCIsIm9Db252ZXJ0ZXJPdXRwdXQiLCJjb252ZXJ0VHlwZXMiLCJlbnRpdHlTZXRzIiwiZW50aXR5U2V0Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7QUE2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUEsZ0JBQWdCLEdBQUcsVUFBU0MsZUFBVCxFQUFnRztBQUN4SCxXQUFPLE9BQU9BLGVBQVAsS0FBMkIsUUFBbEM7QUFDQSxHQUZEOztBQUlBLFdBQVNDLGVBQVQsQ0FBeUJDLFVBQXpCLEVBQThGO0FBQzdGLFdBQU9BLFVBQVUsSUFBSUEsVUFBVSxDQUFDQyxjQUFYLENBQTBCLE9BQTFCLENBQXJCO0FBQ0E7O0FBRUQsTUFBTUMsNEJBQTRCLEdBQUcsVUFDcENDLGdCQURvQyxFQUVwQ0MsY0FGb0MsRUFHZDtBQUN0QixRQUFJQyxhQUFKO0FBQ0EsUUFBSUMsZ0JBQUo7QUFDQSxRQUFJQyxpQkFBSjtBQUNBLFFBQUlDLGlCQUFKO0FBQ0EsUUFBSUMsY0FBd0IsR0FBRyxFQUEvQjtBQUNBLFFBQU1DLG9CQUEwQyxHQUFHLEVBQW5EO0FBQ0FQLElBQUFBLGdCQUFnQixDQUFDUSxVQUFqQixDQUE0QkMsT0FBNUIsQ0FBb0MsVUFBQ1osVUFBRCxFQUE0QztBQUFBOztBQUMvRSxVQUFJRCxlQUFlLENBQUNDLFVBQUQsQ0FBbkIsRUFBaUM7QUFDaEMsZ0JBQVFBLFVBQVUs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ckJjLFVBQUFBLGVBQWUsRUFBRUEsZUFISTtBQUlyQkQsVUFBQUEsZ0JBQWdCLEVBQUVDLGVBQWUsQ0FBQ0osVUFKYjtBQUtyQk0sVUFBQUEsWUFBWSxFQUFFRixlQUxPO0FBTXJCcEIsVUFBQUEsY0FBYyxFQUFFZ0g7QUFOSyxTQUF0QjtBQVFBOztBQUNELGFBQU8sSUFBSXhGLGdCQUFKLENBQXFCd0YsZ0JBQXJCLEVBQXVDdkYsZ0JBQXZDLEVBQXlEQyxXQUF6RCxFQUFzRUMsT0FBdEUsRUFBK0VDLG1CQUEvRSxDQUFQO0FBQ0EsSzs7Ozs7U0FHYUosZ0IiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25UZXJtIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQge1xuXHRBbnlBbm5vdGF0aW9uLFxuXHRDb252ZXJ0ZXJPdXRwdXQsXG5cdEVudGl0eVNldCxcblx0RW50aXR5VHlwZSxcblx0RW50aXR5Q29udGFpbmVyLFxuXHROYXZpZ2F0aW9uUHJvcGVydHksXG5cdFNlcnZpY2VPYmplY3QsXG5cdFJlc29sdXRpb25UYXJnZXQsXG5cdFNlcnZpY2VPYmplY3RBbmRBbm5vdGF0aW9uXG59IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgeyBCYXNlTWFuaWZlc3RTZXR0aW5ncywgVGVtcGxhdGVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBSZXNvbHZlZFRhcmdldCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgSURpYWdub3N0aWNzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB7XG5cdERhdGFNb2RlbE9iamVjdFBhdGgsXG5cdGVuaGFuY2VEYXRhTW9kZWxQYXRoLFxuXHRnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoLFxuXHRnZXRUYXJnZXRPYmplY3RQYXRoXG59IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IEVudGl0eVR5cGVBbm5vdGF0aW9ucyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy90eXBlcy9nZW5lcmF0ZWQvRWRtX1R5cGVzXCI7XG5pbXBvcnQgTWFuaWZlc3RXcmFwcGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0V3JhcHBlclwiO1xuXG5leHBvcnQgdHlwZSBSZXNvbHZlZEFubm90YXRpb25Db250ZXh0ID0ge1xuXHRhbm5vdGF0aW9uOiBBbnlBbm5vdGF0aW9uO1xuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0O1xufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbiBvYmplY3QgaXMgYW4gYW5ub3RhdGlvbiB0ZXJtLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfEFubm90YXRpb25UZXJtPG9iamVjdD59IHZBbm5vdGF0aW9uUGF0aFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzQW5ub3RhdGlvblRlcm0gPSBmdW5jdGlvbih2QW5ub3RhdGlvblBhdGg6IHN0cmluZyB8IEFubm90YXRpb25UZXJtPGFueT4pOiB2QW5ub3RhdGlvblBhdGggaXMgQW5ub3RhdGlvblRlcm08YW55PiB7XG5cdHJldHVybiB0eXBlb2YgdkFubm90YXRpb25QYXRoID09PSBcIm9iamVjdFwiO1xufTtcblxuZnVuY3Rpb24gaXNTZXJ2aWNlT2JqZWN0KG9iamVjdFBhcnQ6IFNlcnZpY2VPYmplY3RBbmRBbm5vdGF0aW9uKTogb2JqZWN0UGFydCBpcyBTZXJ2aWNlT2JqZWN0IHtcblx0cmV0dXJuIG9iamVjdFBhcnQgJiYgb2JqZWN0UGFydC5oYXNPd25Qcm9wZXJ0eShcIl90eXBlXCIpO1xufVxuXG5jb25zdCBnZXREYXRhTW9kZWxQYXRoRm9yRW50aXR5U2V0ID0gZnVuY3Rpb24oXG5cdHJlc29sdmVkTWV0YVBhdGg6IFJlc29sdXRpb25UYXJnZXQ8YW55Pixcblx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlck91dHB1dFxuKTogRGF0YU1vZGVsT2JqZWN0UGF0aCB7XG5cdGxldCByb290RW50aXR5U2V0OiBFbnRpdHlTZXQgfCB1bmRlZmluZWQ7XG5cdGxldCBjdXJyZW50RW50aXR5U2V0OiBFbnRpdHlTZXQgfCB1bmRlZmluZWQ7XG5cdGxldCBwcmV2aW91c0VudGl0eVNldDogRW50aXR5U2V0IHwgdW5kZWZpbmVkO1xuXHRsZXQgY3VycmVudEVudGl0eVR5cGU6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQ7XG5cdGxldCBuYXZpZ2F0ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcblx0Y29uc3QgbmF2aWdhdGlvblByb3BlcnRpZXM6IE5hdmlnYXRpb25Qcm9wZXJ0eVtdID0gW107XG5cdHJlc29sdmVkTWV0YVBhdGgub2JqZWN0UGF0aC5mb3JFYWNoKChvYmplY3RQYXJ0OiBTZXJ2aWNlT2JqZWN0QW5kQW5ub3RhdGlvbikgPT4ge1xuXHRcdGlmIChpc1NlcnZpY2VPYmplY3Qob2JqZWN0UGFydCkpIHtcblx0XHRcdHN3aXRjaCAob2JqZWN0UGFydC5fdHlwZSkge1xuXHRcdFx0XHRjYXNlIFwiTmF2aWdhdGlvblByb3BlcnR5XCI6XG5cdFx0XHRcdFx0bmF2aWdhdGVkUGF0aHMucHVzaChvYmplY3RQYXJ0Lm5hbWUpO1xuXHRcdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzLnB1c2gob2JqZWN0UGFydCk7XG5cdFx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPSBvYmplY3RQYXJ0LnRhcmdldFR5cGU7XG5cdFx0XHRcdFx0aWYgKHByZXZpb3VzRW50aXR5U2V0ICYmIHByZXZpb3VzRW50aXR5U2V0Lm5hdmlnYXRpb25Qcm9wZXJ0eUJpbmRpbmcuaGFzT3duUHJvcGVydHkobmF2aWdhdGVkUGF0aHMuam9pbihcIi9cIikpKSB7XG5cdFx0XHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gcHJldmlvdXNFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKV07XG5cdFx0XHRcdFx0XHRwcmV2aW91c0VudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQ7XG5cdFx0XHRcdFx0XHRuYXZpZ2F0ZWRQYXRocyA9IFtdO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSBcIkVudGl0eVNldFwiOlxuXHRcdFx0XHRcdGlmIChyb290RW50aXR5U2V0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHJvb3RFbnRpdHlTZXQgPSBvYmplY3RQYXJ0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjdXJyZW50RW50aXR5U2V0ID0gb2JqZWN0UGFydDtcblx0XHRcdFx0XHRwcmV2aW91c0VudGl0eVNldCA9IGN1cnJlbnRFbnRpdHlTZXQ7XG5cdFx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPSBjdXJyZW50RW50aXR5U2V0Py5lbnRpdHlUeXBlO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdGNvbnN0IGRhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGggPSB7XG5cdFx0c3RhcnRpbmdFbnRpdHlTZXQ6IHJvb3RFbnRpdHlTZXQgYXMgRW50aXR5U2V0LFxuXHRcdHRhcmdldEVudGl0eVR5cGU6IGN1cnJlbnRFbnRpdHlUeXBlIGFzIEVudGl0eVR5cGUsXG5cdFx0dGFyZ2V0RW50aXR5U2V0OiBjdXJyZW50RW50aXR5U2V0LFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBuYXZpZ2F0aW9uUHJvcGVydGllcyxcblx0XHRjb250ZXh0TG9jYXRpb246IHVuZGVmaW5lZCxcblx0XHR0YXJnZXRPYmplY3Q6IHJlc29sdmVkTWV0YVBhdGgudGFyZ2V0LFxuXHRcdGNvbnZlcnRlZFR5cGVzOiBjb252ZXJ0ZWRUeXBlc1xuXHR9O1xuXHRkYXRhTW9kZWxQYXRoLmNvbnRleHRMb2NhdGlvbiA9IGRhdGFNb2RlbFBhdGg7XG5cdHJldHVybiBkYXRhTW9kZWxQYXRoO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBDb252ZXJ0ZXJDb250ZXh0IG9iamVjdCB0aGF0IHdpbGwgYmUgdXNlZCB3aXRoaW4gdGhlIGNvbnZlcnRlcnMuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJPdXRwdXR9IG9Db252ZXJ0ZWRUeXBlcyBUaGUgY29udmVydGVkIGFubm90YXRpb24gYW5kIHNlcnZpY2UgdHlwZXNcbiAqIEBwYXJhbSB7QmFzZU1hbmlmZXN0U2V0dGluZ3N9IG9NYW5pZmVzdFNldHRpbmdzIFRoZSBtYW5pZmVzdFNldHRpbmdzIHRoYXQgYXBwbGllcyB0byB0aGlzIHBhZ2VcbiAqIEBwYXJhbSB7VGVtcGxhdGVUeXBlfSB0ZW1wbGF0ZVR5cGUgVGhlIHR5cGUgb2YgdGVtcGxhdGUgd2UncmUgbG9va2luZyBhdCByaWdodCBub3dcbiAqIEBwYXJhbSB7SVNoZWxsU2VydmljZXNQcm94eX0gc2hlbGxTZXJ2aWNlcyBUaGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgc2hlbGxzZXJ2aWNlXG4gKiBAcGFyYW0ge0lEaWFnbm9zdGljc30gZGlhZ25vc3RpY3MgVGhlIGRpYWdub3N0aWNzIHNoaW1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG1lcmdlRm4gVGhlIGZ1bmN0aW9uIHRvIGJlIHVzZWQgdG8gcGVyZm9tIHNvbWUgZGVlcCBtZXJnZXMgYmV0d2VlbiBvYmplY3RcbiAqIEBwYXJhbSB7RGF0YU1vZGVsT2JqZWN0UGF0aH0gdGFyZ2V0RGF0YU1vZGVsUGF0aCBUaGUgZ2xvYmFsIHBhdGggdG8gcmVhY2ggdGhlIGVudGl0eVNldFxuICpcbiAqIEByZXR1cm5zIHtDb252ZXJ0ZXJDb250ZXh0fSBBIGNvbnZlcnRlciBjb250ZXh0IGZvciB0aGUgY29udmVydGVyc1xuICovXG5jbGFzcyBDb252ZXJ0ZXJDb250ZXh0IHtcblx0cHJpdmF0ZSBtYW5pZmVzdFdyYXBwZXI6IE1hbmlmZXN0V3JhcHBlcjtcblx0cHJpdmF0ZSBiYXNlQ29udGV4dFBhdGg6IHN0cmluZztcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIGNvbnZlcnRlZFR5cGVzOiBDb252ZXJ0ZXJPdXRwdXQsXG5cdFx0cHJpdmF0ZSBtYW5pZmVzdFNldHRpbmdzOiBCYXNlTWFuaWZlc3RTZXR0aW5ncyxcblx0XHRwcml2YXRlIGRpYWdub3N0aWNzOiBJRGlhZ25vc3RpY3MsXG5cdFx0cHJpdmF0ZSBtZXJnZUZuOiBGdW5jdGlvbixcblx0XHRwcml2YXRlIHRhcmdldERhdGFNb2RlbFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGhcblx0KSB7XG5cdFx0dGhpcy5tYW5pZmVzdFdyYXBwZXIgPSBuZXcgTWFuaWZlc3RXcmFwcGVyKHRoaXMubWFuaWZlc3RTZXR0aW5ncywgbWVyZ2VGbik7XG5cdFx0dGhpcy5iYXNlQ29udGV4dFBhdGggPSBnZXRUYXJnZXRPYmplY3RQYXRoKHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIHByb3BlcnR5IGJhc2VkIG9uIHRoZSBwYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gZnVsbHlRdWFsaWZpZWROYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZVxuXHQgKiBAcmV0dXJucyB7UHJvcGVydHl9IFRoZSBwcm9wZXJ0eSBFbnRpdHlUeXBlIGJhc2VkXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRFbnRpdHlUeXBlRnJvbUZ1bGx5UXVhbGlmaWVkTmFtZShmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZyk6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVR5cGUgPSB0aGlzLmNvbnZlcnRlZFR5cGVzLmVudGl0eVR5cGVzLmZpbmQoZW50aXR5VHlwZSA9PiB7XG5cdFx0XHRpZiAoZnVsbHlRdWFsaWZpZWROYW1lLnN0YXJ0c1dpdGgoZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUpKSB7XG5cdFx0XHRcdGNvbnN0IHJlcGxhY2VBbm5vdGF0aW9uID0gZnVsbHlRdWFsaWZpZWROYW1lLnJlcGxhY2UoZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsIFwiXCIpO1xuXHRcdFx0XHRyZXR1cm4gcmVwbGFjZUFubm90YXRpb24uc3RhcnRzV2l0aChcIi9cIikgfHwgcmVwbGFjZUFubm90YXRpb24uc3RhcnRzV2l0aChcIkBcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIHRhcmdldEVudGl0eVR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIGVudGl0eVR5cGUgYXNzb2NpYXRlZCB3aXRoIGFuIGFubm90YXRpb24gb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbiBvYmplY3QgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZmluZCB0aGUgZW50aXR5VHlwZVxuXHQgKiBAcmV0dXJucyB7RW50aXR5VHlwZX0gVGhlIEVudGl0eVR5cGUgdGhlIGFubm90YXRpb24gcmVmZXJzIHRvXG5cdCAqL1xuXHRnZXRBbm5vdGF0aW9uRW50aXR5VHlwZShhbm5vdGF0aW9uPzogQW5ub3RhdGlvblRlcm08YW55Pik6IEVudGl0eVR5cGUge1xuXHRcdGlmIChhbm5vdGF0aW9uKSB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uUGF0aCA9IGFubm90YXRpb24uZnVsbHlRdWFsaWZpZWROYW1lO1xuXHRcdFx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IHRoaXMuX2dldEVudGl0eVR5cGVGcm9tRnVsbHlRdWFsaWZpZWROYW1lKGFubm90YXRpb25QYXRoKTtcblx0XHRcdGlmICghdGFyZ2V0RW50aXR5VHlwZSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBFbnRpdHkgVHlwZSBmb3IgXCIgKyBhbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGFyZ2V0RW50aXR5VHlwZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlUeXBlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgbWFuaWZlc3Qgc2V0dGluZ3MgZGVmaW5lZCBmb3IgYSBzcGVjaWZpYyBjb250cm9sIHdpdGhpbiBjb250cm9sQ29uZmlndXJhdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHZBbm5vdGF0aW9uUGF0aCBUaGUgYW5ub3RhdGlvbiBwYXRoIG9yIG9iamVjdCB0byBldmFsdWF0ZVxuXHQgKiBAcmV0dXJucyBUaGUgY29udHJvbCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHNwZWNpZmljIGFubnRvYXRpb24gcGF0aCBpZiBpdCBleGlzdHNcblx0ICovXG5cdGdldE1hbmlmZXN0Q29udHJvbENvbmZpZ3VyYXRpb24odkFubm90YXRpb25QYXRoOiBzdHJpbmcgfCBBbm5vdGF0aW9uVGVybTxhbnk+KTogYW55IHtcblx0XHRpZiAoaXNBbm5vdGF0aW9uVGVybSh2QW5ub3RhdGlvblBhdGgpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5tYW5pZmVzdFdyYXBwZXIuZ2V0Q29udHJvbENvbmZpZ3VyYXRpb24oXG5cdFx0XHRcdHZBbm5vdGF0aW9uUGF0aC5mdWxseVF1YWxpZmllZE5hbWUucmVwbGFjZSh0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsIFwiXCIpXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5tYW5pZmVzdFdyYXBwZXIuZ2V0Q29udHJvbENvbmZpZ3VyYXRpb24odkFubm90YXRpb25QYXRoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYW4gYWJzb2x1dGUgYW5ub3RhdGlvbiBwYXRoIGJhc2VkIG9uIHRoZSBjdXJyZW50IG1ldGEgbW9kZWwgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHNBbm5vdGF0aW9uUGF0aCBUaGUgcmVsYXRpdmUgYW5ub3RhdGlvbiBwYXRoXG5cdCAqIEByZXR1cm5zIFRoZSBjb3JyZWN0IGFubm90YXRpb24gcGF0aCBiYXNlZCBvbiB0aGUgY3VycmVudCBjb250ZXh0XG5cdCAqL1xuXHRnZXRBYnNvbHV0ZUFubm90YXRpb25QYXRoKHNBbm5vdGF0aW9uUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRpZiAoIXNBbm5vdGF0aW9uUGF0aCkge1xuXHRcdFx0cmV0dXJuIHNBbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdFx0aWYgKHNBbm5vdGF0aW9uUGF0aFswXSA9PT0gXCIvXCIpIHtcblx0XHRcdHJldHVybiBzQW5ub3RhdGlvblBhdGg7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmJhc2VDb250ZXh0UGF0aCArIFwiL1wiICsgc0Fubm90YXRpb25QYXRoO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSBjdXJyZW50IGVudGl0eVNldC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgRW50aXR5U2V0IGlmIGl0IGV4aXN0cy5cblx0ICovXG5cdGdldEVudGl0eVNldCgpOiBFbnRpdHlTZXQgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSBjb250ZXh0IHBhdGguXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjb250ZXh0IHBhdGggb2YgdGhlIGNvbnZlcnRlci5cblx0ICovXG5cdGdldENvbnRleHRQYXRoKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuYmFzZUNvbnRleHRQYXRoO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIHRoZSBjdXJyZW50IGRhdGEgbW9kZWwgb2JqZWN0IHBhdGguXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IGRhdGEgbW9kZWwgb2JqZWN0IHBhdGhcblx0ICovXG5cdGdldERhdGFNb2RlbE9iamVjdFBhdGgoKTogRGF0YU1vZGVsT2JqZWN0UGF0aCB7XG5cdFx0cmV0dXJuIHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIEVudGl0eUNvbnRhaW5lci5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgc2VydmljZSBFbnRpdHlDb250YWluZXJcblx0ICovXG5cdGdldEVudGl0eUNvbnRhaW5lcigpOiBFbnRpdHlDb250YWluZXIge1xuXHRcdHJldHVybiB0aGlzLmNvbnZlcnRlZFR5cGVzLmVudGl0eUNvbnRhaW5lcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIEVudGl0eVR5cGUgYmFzZWQgb24gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBFbnRpdHlUeXBlLlxuXHQgKi9cblx0Z2V0RW50aXR5VHlwZSgpOiBFbnRpdHlUeXBlIHtcblx0XHRyZXR1cm4gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZW50aXR5IHR5cGUgb2YgdGhlIHBhcmFtZXRlciBpbiBjYXNlIG9mIGEgcGFyYW1ldGVyaXplZCBzZXJ2aWNlLlxuXHQgKiBAcmV0dXJucyB7RW50aXR5VHlwZX0gVGhlIGVudGl0eSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXJcblx0ICovXG5cdGdldFBhcmFtZXRlckVudGl0eVR5cGUoKTogRW50aXR5VHlwZSB7XG5cdFx0Y29uc3QgcGFyYW1ldGVyRW50aXR5VHlwZSA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5zdGFydGluZ0VudGl0eVNldC5lbnRpdHlUeXBlO1xuXHRcdGNvbnN0IGlzUGFyYW1ldGVyaXplZCA9ICEhcGFyYW1ldGVyRW50aXR5VHlwZS5hbm5vdGF0aW9ucz8uQ29tbW9uPy5SZXN1bHRDb250ZXh0O1xuXHRcdHJldHVybiAoaXNQYXJhbWV0ZXJpemVkICYmIHBhcmFtZXRlckVudGl0eVR5cGUpIGFzIEVudGl0eVR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIGFuIGFubm90YXRpb24gZnJvbSBhbiBlbnRpdHkgdHlwZSBiYXNlZCBvbiBhbm5vdGF0aW9uIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBhbm5vdGF0aW9uUGF0aCBUaGUgYW5ub3RhdGlvbiBwYXRoIHRvIGJlIGV2YWx1YXRlZFxuXHQgKiBAcmV0dXJucyBUaGUgdGFyZ2V0IGFubm90YXRpb24gcGF0aCBhcyB3ZWxsIGFzIGEgY29udmVydGVyIGNvbnRleHQgdG8gZ28gd2l0aCBpdFxuXHQgKi9cblx0Z2V0RW50aXR5VHlwZUFubm90YXRpb24oYW5ub3RhdGlvblBhdGg6IHN0cmluZyk6IFJlc29sdmVkQW5ub3RhdGlvbkNvbnRleHQge1xuXHRcdGlmIChhbm5vdGF0aW9uUGF0aC5pbmRleE9mKFwiQFwiKSA9PT0gLTEpIHtcblx0XHRcdGFubm90YXRpb25QYXRoID0gXCJAXCIgKyBhbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdFx0Y29uc3QgdGFyZ2V0T2JqZWN0OiBSZXNvbHZlZFRhcmdldCA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlUeXBlLnJlc29sdmVQYXRoKGFubm90YXRpb25QYXRoLCB0cnVlKTtcblxuXHRcdGxldCByb290RW50aXR5U2V0ID0gdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnRhcmdldEVudGl0eVNldDtcblx0XHRsZXQgY3VycmVudEVudGl0eVR5cGUgPSB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5VHlwZTtcblx0XHRjb25zdCBzdGFydGluZ0VudGl0eVR5cGUgPSB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGguc3RhcnRpbmdFbnRpdHlTZXQuZW50aXR5VHlwZTtcblx0XHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydGllcyA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5jb25jYXQoKTtcblx0XHRsZXQgaSA9IDE7XG5cdFx0bGV0IGN1cnJlbnRPYmplY3Q7XG5cdFx0bGV0IG5hdmlnYXRlZFBhdGhzID0gW107XG5cdFx0Y29uc3QgdmlzaXRlZE9iamVjdHMgPSB0YXJnZXRPYmplY3QudmlzaXRlZE9iamVjdHM7XG5cdFx0Ly8gSW4gY2FzZSBvZiBwYXJhbWV0ZXJpemVkIHNlcnZpY2Vcblx0XHRpZiAoIXJvb3RFbnRpdHlTZXQgJiYgc3RhcnRpbmdFbnRpdHlUeXBlLmFubm90YXRpb25zLkNvbW1vbj8uUmVzdWx0Q29udGV4dCkge1xuXHRcdFx0cm9vdEVudGl0eVNldCA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5zdGFydGluZ0VudGl0eVNldDtcblx0XHRcdHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKG5hdk9iamVjdCkge1xuXHRcdFx0XHRuYXZpZ2F0ZWRQYXRocy5wdXNoKG5hdk9iamVjdC5uYW1lKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHR3aGlsZSAoaSA8IHZpc2l0ZWRPYmplY3RzLmxlbmd0aCkge1xuXHRcdFx0Y3VycmVudE9iamVjdCA9IHZpc2l0ZWRPYmplY3RzW2krK107XG5cdFx0XHRpZiAoY3VycmVudE9iamVjdC5fdHlwZSA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHRuYXZpZ2F0ZWRQYXRocy5wdXNoKGN1cnJlbnRPYmplY3QubmFtZSk7XG5cdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzLnB1c2goY3VycmVudE9iamVjdCBhcyBOYXZpZ2F0aW9uUHJvcGVydHkpO1xuXHRcdFx0XHRjdXJyZW50RW50aXR5VHlwZSA9IChjdXJyZW50T2JqZWN0IGFzIE5hdmlnYXRpb25Qcm9wZXJ0eSkudGFyZ2V0VHlwZTtcblx0XHRcdFx0aWYgKHJvb3RFbnRpdHlTZXQgJiYgcm9vdEVudGl0eVNldC5uYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nLmhhc093blByb3BlcnR5KG5hdmlnYXRlZFBhdGhzLmpvaW4oXCIvXCIpKSkge1xuXHRcdFx0XHRcdGNvbnN0IG5hdlBhdGggPSBuYXZpZ2F0ZWRQYXRocy5qb2luKFwiL1wiKTtcblx0XHRcdFx0XHRyb290RW50aXR5U2V0ID1cblx0XHRcdFx0XHRcdHJvb3RFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tjdXJyZW50T2JqZWN0Lm5hbWVdIHx8IHJvb3RFbnRpdHlTZXQubmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1tuYXZQYXRoXTtcblx0XHRcdFx0XHRuYXZpZ2F0ZWRQYXRocyA9IFtdO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJvb3RFbnRpdHlTZXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChjdXJyZW50T2JqZWN0Ll90eXBlID09PSBcIkVudGl0eVNldFwiKSB7XG5cdFx0XHRcdHJvb3RFbnRpdHlTZXQgPSBjdXJyZW50T2JqZWN0IGFzIEVudGl0eVNldDtcblx0XHRcdFx0Y3VycmVudEVudGl0eVR5cGUgPSByb290RW50aXR5U2V0LmVudGl0eVR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGNvbnN0IG91dERhdGFNb2RlbFBhdGggPSB7XG5cdFx0XHRzdGFydGluZ0VudGl0eVNldDogdGhpcy50YXJnZXREYXRhTW9kZWxQYXRoLnN0YXJ0aW5nRW50aXR5U2V0LFxuXHRcdFx0dGFyZ2V0RW50aXR5U2V0OiByb290RW50aXR5U2V0LFxuXHRcdFx0dGFyZ2V0RW50aXR5VHlwZTogY3VycmVudEVudGl0eVR5cGUsXG5cdFx0XHR0YXJnZXRPYmplY3Q6IG5hdmlnYXRpb25Qcm9wZXJ0aWVzW25hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCAtIDFdLFxuXHRcdFx0bmF2aWdhdGlvblByb3BlcnRpZXMsXG5cdFx0XHRjb250ZXh0TG9jYXRpb246IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC5jb250ZXh0TG9jYXRpb24sXG5cdFx0XHRjb252ZXJ0ZWRUeXBlczogdGhpcy5jb252ZXJ0ZWRUeXBlc1xuXHRcdH07XG5cdFx0cmV0dXJuIHtcblx0XHRcdGFubm90YXRpb246IHRhcmdldE9iamVjdC50YXJnZXQgYXMgQW55QW5ub3RhdGlvbixcblx0XHRcdGNvbnZlcnRlckNvbnRleHQ6IG5ldyBDb252ZXJ0ZXJDb250ZXh0KFxuXHRcdFx0XHR0aGlzLmNvbnZlcnRlZFR5cGVzLFxuXHRcdFx0XHR0aGlzLm1hbmlmZXN0U2V0dGluZ3MsXG5cdFx0XHRcdHRoaXMuZGlhZ25vc3RpY3MsXG5cdFx0XHRcdHRoaXMubWVyZ2VGbixcblx0XHRcdFx0b3V0RGF0YU1vZGVsUGF0aFxuXHRcdFx0KVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIHR5cGUgb2YgdGVtcGxhdGUgd2UncmUgd29ya2luZyBvbiAoZS5nLiBMaXN0UmVwb3J0IC8gT2JqZWN0UGFnZSAvIC4uLikuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHRlbnBsYXRlIHR5cGVcblx0ICovXG5cdGdldFRlbXBsYXRlVHlwZSgpOiBUZW1wbGF0ZVR5cGUge1xuXHRcdHJldHVybiB0aGlzLm1hbmlmZXN0V3JhcHBlci5nZXRUZW1wbGF0ZVR5cGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZSB0aGUgY29udmVydGVkIHR5cGVzLlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBjb252ZXJ0ZWQgdHlwZXNcblx0ICovXG5cdGdldENvbnZlcnRlZFR5cGVzKCk6IENvbnZlcnRlck91dHB1dCB7XG5cdFx0cmV0dXJuIHRoaXMuY29udmVydGVkVHlwZXM7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgYSByZWxhdGl2ZSBhbm5vdGF0aW9uIHBhdGggYmV0d2VlbiBhbiBhbm5vdGF0aW9uIHBhdGggYW5kIGFuIGVudGl0eSB0eXBlLlxuXHQgKlxuXHQgKiBAcGFyYW0gYW5ub3RhdGlvblBhdGhcblx0ICogQHBhcmFtIGVudGl0eVR5cGVcblx0ICogQHJldHVybnMgVGhlIHJlbGF0aXZlIGFubnRvdGF0aW9uIHBhdGguXG5cdCAqL1xuXHRnZXRSZWxhdGl2ZUFubm90YXRpb25QYXRoKGFubm90YXRpb25QYXRoOiBzdHJpbmcsIGVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBzdHJpbmcge1xuXHRcdHJldHVybiBhbm5vdGF0aW9uUGF0aC5yZXBsYWNlKGVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLCBcIlwiKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcmFuc2Zvcm0gYW4gZW50aXR5VHlwZSBiYXNlZCBwYXRoIHRvIGFuIGVudGl0eVNldCBiYXNlZCBvbmUgKHVpNSB0ZW1wbGF0aW5nIGdlbmVyYWxseSBleHBlY3QgYW4gZW50aXR5U2V0QmFzZWRQYXRoKS5cblx0ICpcblx0ICogQHBhcmFtIGFubm90YXRpb25QYXRoXG5cdCAqIEByZXR1cm5zIFRoZSBFbnRpdHlTZXQgYmFzZWQgYW5ub3RhdGlvbiBwYXRoXG5cdCAqL1xuXHRnZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKGFubm90YXRpb25QYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGlmICghYW5ub3RhdGlvblBhdGgpIHtcblx0XHRcdHJldHVybiBhbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdFx0Y29uc3QgZW50aXR5VHlwZUZRTiA9IHRoaXMudGFyZ2V0RGF0YU1vZGVsUGF0aC50YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZTtcblx0XHRpZiAoXG5cdFx0XHR0aGlzLnRhcmdldERhdGFNb2RlbFBhdGgudGFyZ2V0RW50aXR5U2V0IHx8XG5cdFx0XHQoKHRoaXMuYmFzZUNvbnRleHRQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpICYmIHRoaXMuYmFzZUNvbnRleHRQYXRoLm1hdGNoKC9cXC8vZykpIHx8IFtdKS5sZW5ndGggPiAxXG5cdFx0KSB7XG5cdFx0XHRsZXQgcmVwbGFjZWRBbm5vdGF0aW9uUGF0aCA9IGFubm90YXRpb25QYXRoLnJlcGxhY2UoZW50aXR5VHlwZUZRTiwgXCIvXCIpO1xuXHRcdFx0aWYgKHJlcGxhY2VkQW5ub3RhdGlvblBhdGgubGVuZ3RoID4gMiAmJiByZXBsYWNlZEFubm90YXRpb25QYXRoWzBdID09PSBcIi9cIiAmJiByZXBsYWNlZEFubm90YXRpb25QYXRoWzFdID09PSBcIi9cIikge1xuXHRcdFx0XHRyZXBsYWNlZEFubm90YXRpb25QYXRoID0gcmVwbGFjZWRBbm5vdGF0aW9uUGF0aC5zdWJzdHIoMSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5iYXNlQ29udGV4dFBhdGggKyAocmVwbGFjZWRBbm5vdGF0aW9uUGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHJlcGxhY2VkQW5ub3RhdGlvblBhdGggOiBcIi9cIiArIHJlcGxhY2VkQW5ub3RhdGlvblBhdGgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gXCIvXCIgKyBhbm5vdGF0aW9uUGF0aDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIG1hbmlmZXN0IHdyYXBwZXIgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQuXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IG1hbmlmZXN0IHdyYXBwZXJcblx0ICovXG5cdGdldE1hbmlmZXN0V3JhcHBlcigpOiBNYW5pZmVzdFdyYXBwZXIge1xuXHRcdHJldHVybiB0aGlzLm1hbmlmZXN0V3JhcHBlcjtcblx0fVxuXG5cdGdldERpYWdub3N0aWNzKCk6IElEaWFnbm9zdGljcyB7XG5cdFx0cmV0dXJuIHRoaXMuZGlhZ25vc3RpY3M7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmUgdGhlIHRhcmdldCBmcm9tIGFuIGFic29sdXRlIHBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHdlIHdhbnQgdG8gZ2V0IHRoZSB0YXJnZXRcblx0ICogQHJldHVybnMge0NvbnZlcnRlckNvbnRleHR9XG5cdCAqL1xuXHRyZXNvbHZlQWJzb2x1dGVQYXRoPFQ+KHBhdGg6IHN0cmluZyk6IFJlc29sdXRpb25UYXJnZXQ8VD4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnZlcnRlZFR5cGVzLnJlc29sdmVQYXRoKHBhdGgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlIGEgbmV3IGNvbnZlcnRlciBjb250ZXh0LCBzY29wZWQgZm9yIGEgZGlmZmVyZW50IGNvbnRleHQgcGF0aC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNvbnRleHRQYXRoIFRoZSBwYXRoIHdlIHdhbnQgdG8gb3JjaGVzdHJhdGUgdGhlIGNvbnZlcnRlciBjb250ZXh0IGFyb3VuZFxuXHQgKiBAcmV0dXJucyB7Q29udmVydGVyQ29udGV4dH1cblx0ICovXG5cdGdldENvbnZlcnRlckNvbnRleHRGb3I8VD4oY29udGV4dFBhdGg6IHN0cmluZyk6IENvbnZlcnRlckNvbnRleHQge1xuXHRcdGNvbnN0IHJlc29sdmVkTWV0YVBhdGg6IFJlc29sdXRpb25UYXJnZXQ8VD4gPSB0aGlzLmNvbnZlcnRlZFR5cGVzLnJlc29sdmVQYXRoKGNvbnRleHRQYXRoKTtcblx0XHRjb25zdCB0YXJnZXRQYXRoID0gZ2V0RGF0YU1vZGVsUGF0aEZvckVudGl0eVNldChyZXNvbHZlZE1ldGFQYXRoLCB0aGlzLmNvbnZlcnRlZFR5cGVzKTtcblx0XHRyZXR1cm4gbmV3IENvbnZlcnRlckNvbnRleHQodGhpcy5jb252ZXJ0ZWRUeXBlcywgdGhpcy5tYW5pZmVzdFNldHRpbmdzLCB0aGlzLmRpYWdub3N0aWNzLCB0aGlzLm1lcmdlRm4sIHRhcmdldFBhdGgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCBhbGwgYW5ub3RhdGlvbnMgb2YgYSBnaXZlbiB0ZXJtIGFuZCB2b2NhYnVsYXJ5IG9uIGFuIGVudGl0eSB0eXBlXG5cdCAqIChvciBvbiB0aGUgY3VycmVudCBlbnRpdHkgdHlwZSBpZiBlbnRpdHlUeXBlIGlzbid0IHNwZWNpZmllZCkuXG5cdCAqXG5cdCAqIEBwYXJhbSB2b2NhYnVsYXJ5TmFtZVxuXHQgKiBAcGFyYW0gYW5ub3RhdGlvblRlcm1cblx0ICogQHBhcmFtIFthbm5vdGF0aW9uU291cmNlc11cblx0ICogQHJldHVybnMgQWxsIHRoZSBhbm5vdGF0aW9uIGZvciBhIHNwZWNpZmljIHRlcm0gYW5kIHZvY2FidWxhcnkgZnJvbSBhbiBlbnRpdHkgdHlwZVxuXHQgKi9cblx0Z2V0QW5ub3RhdGlvbnNCeVRlcm0oXG5cdFx0dm9jYWJ1bGFyeU5hbWU6IGtleW9mIEVudGl0eVR5cGVBbm5vdGF0aW9ucyxcblx0XHRhbm5vdGF0aW9uVGVybTogc3RyaW5nLFxuXHRcdGFubm90YXRpb25Tb3VyY2VzOiAoU2VydmljZU9iamVjdCB8IHVuZGVmaW5lZClbXSA9IFt0aGlzLmdldEVudGl0eVR5cGUoKV1cblx0KTogQW5ub3RhdGlvblRlcm08YW55PltdIHtcblx0XHRsZXQgb3V0QW5ub3RhdGlvbnM6IEFubm90YXRpb25UZXJtPGFueT5bXSA9IFtdO1xuXHRcdGFubm90YXRpb25Tb3VyY2VzLmZvckVhY2goYW5ub3RhdGlvblNvdXJjZSA9PiB7XG5cdFx0XHRpZiAoYW5ub3RhdGlvblNvdXJjZSkge1xuXHRcdFx0XHRjb25zdCBhbm5vdGF0aW9uczogUmVjb3JkPHN0cmluZywgQW5ub3RhdGlvblRlcm08YW55Pj4gPSBhbm5vdGF0aW9uU291cmNlPy5hbm5vdGF0aW9uc1t2b2NhYnVsYXJ5TmFtZV0gfHwge307XG5cdFx0XHRcdGlmIChhbm5vdGF0aW9ucykge1xuXHRcdFx0XHRcdG91dEFubm90YXRpb25zID0gT2JqZWN0LmtleXMoYW5ub3RhdGlvbnMpXG5cdFx0XHRcdFx0XHQuZmlsdGVyKGFubm90YXRpb24gPT4gYW5ub3RhdGlvbnNbYW5ub3RhdGlvbl0udGVybSA9PT0gYW5ub3RhdGlvblRlcm0pXG5cdFx0XHRcdFx0XHQucmVkdWNlKChwcmV2aW91c1ZhbHVlOiBBbm5vdGF0aW9uVGVybTxhbnk+W10sIGtleTogc3RyaW5nKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHByZXZpb3VzVmFsdWUucHVzaChhbm5vdGF0aW9uc1trZXldKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHByZXZpb3VzVmFsdWU7XG5cdFx0XHRcdFx0XHR9LCBvdXRBbm5vdGF0aW9ucyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRyZXR1cm4gb3V0QW5ub3RhdGlvbnM7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSByZWxhdGl2ZSBtb2RlbCBwYXRoIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbnRleHQgcGF0aC5cblx0ICpcblx0ICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9IFRoZSByZWxhdGl2ZSBtb2RlbCBwYXRoIG9yIHVuZGVmaW5lZCBpZiB0aGUgcGF0aCBpcyBub3QgcmVzb2x2ZWFibGVcblx0ICovXG5cdGdldFJlbGF0aXZlTW9kZWxQYXRoRnVuY3Rpb24oKTogRnVuY3Rpb24ge1xuXHRcdGNvbnN0IHRhcmdldERhdGFNb2RlbFBhdGggPSB0aGlzLnRhcmdldERhdGFNb2RlbFBhdGg7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKHNQYXRoOiBzdHJpbmcpIHtcblx0XHRcdGNvbnN0IGVuaGFuY2VkUGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoKHRhcmdldERhdGFNb2RlbFBhdGgsIHNQYXRoKTtcblx0XHRcdHJldHVybiBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoKGVuaGFuY2VkUGF0aCwgdHJ1ZSk7XG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgdGhlIGNvbnZlcnRlciBjb250ZXh0IG5lY2Vzc2FyeSBmb3IgYSBtYWNybyBiYXNlZCBvbiBhIG1ldGFtb2RlbCBjb250ZXh0LlxuXHQgKiBAcGFyYW0gc0VudGl0eVNldE5hbWVcblx0ICogQHBhcmFtIG9NZXRhTW9kZWxDb250ZXh0XG5cdCAqIEBwYXJhbSBkaWFnbm9zdGljc1xuXHQgKiBAcGFyYW0gbWVyZ2VGblxuXHQgKiBAcGFyYW0gdGFyZ2V0RGF0YU1vZGVsUGF0aFxuXHQgKiBAcGFyYW0gbWFuaWZlc3RTZXR0aW5nc1xuXHQgKiBAcmV0dXJucyB7Q29udmVydGVyQ29udGV4dH0gVGhlIGN1cnJlbnQgY29udmVydGVyIGNvbnRleHRcblx0ICovXG5cdHN0YXRpYyBjcmVhdGVDb252ZXJ0ZXJDb250ZXh0Rm9yTWFjcm8oXG5cdFx0c0VudGl0eVNldE5hbWU6IHN0cmluZyxcblx0XHRvTWV0YU1vZGVsQ29udGV4dDogQ29udGV4dCB8IE9EYXRhTWV0YU1vZGVsLFxuXHRcdGRpYWdub3N0aWNzOiBJRGlhZ25vc3RpY3MsXG5cdFx0bWVyZ2VGbjogRnVuY3Rpb24sXG5cdFx0dGFyZ2V0RGF0YU1vZGVsUGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCB8IHVuZGVmaW5lZCxcblx0XHRtYW5pZmVzdFNldHRpbmdzOiBCYXNlTWFuaWZlc3RTZXR0aW5ncyA9IHt9IGFzIEJhc2VNYW5pZmVzdFNldHRpbmdzXG5cdCk6IENvbnZlcnRlckNvbnRleHQge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsID0gb01ldGFNb2RlbENvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTWV0YU1vZGVsXCIpXG5cdFx0XHQ/IChvTWV0YU1vZGVsQ29udGV4dCBhcyBPRGF0YU1ldGFNb2RlbClcblx0XHRcdDogKChvTWV0YU1vZGVsQ29udGV4dCBhcyBDb250ZXh0KS5nZXRNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKTtcblx0XHRjb25zdCBvQ29udmVydGVyT3V0cHV0ID0gY29udmVydFR5cGVzKG9NZXRhTW9kZWwpO1xuXHRcdGNvbnN0IHRhcmdldEVudGl0eVNldCA9IG9Db252ZXJ0ZXJPdXRwdXQuZW50aXR5U2V0cy5maW5kKGVudGl0eVNldCA9PiBlbnRpdHlTZXQubmFtZSA9PT0gc0VudGl0eVNldE5hbWUpIGFzIEVudGl0eVNldDtcblx0XHRpZiAoIXRhcmdldERhdGFNb2RlbFBhdGgpIHtcblx0XHRcdHRhcmdldERhdGFNb2RlbFBhdGggPSB7XG5cdFx0XHRcdHN0YXJ0aW5nRW50aXR5U2V0OiB0YXJnZXRFbnRpdHlTZXQsXG5cdFx0XHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBbXSxcblx0XHRcdFx0dGFyZ2V0RW50aXR5U2V0OiB0YXJnZXRFbnRpdHlTZXQsXG5cdFx0XHRcdHRhcmdldEVudGl0eVR5cGU6IHRhcmdldEVudGl0eVNldC5lbnRpdHlUeXBlLFxuXHRcdFx0XHR0YXJnZXRPYmplY3Q6IHRhcmdldEVudGl0eVNldCxcblx0XHRcdFx0Y29udmVydGVkVHlwZXM6IG9Db252ZXJ0ZXJPdXRwdXRcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiBuZXcgQ29udmVydGVyQ29udGV4dChvQ29udmVydGVyT3V0cHV0LCBtYW5pZmVzdFNldHRpbmdzLCBkaWFnbm9zdGljcywgbWVyZ2VGbiwgdGFyZ2V0RGF0YU1vZGVsUGF0aCk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29udmVydGVyQ29udGV4dDtcbiJdfQ==
|