@sapui5/sap.fe.core 1.102.3 → 1.105.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 +6 -6
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime.js +120 -0
- package/src/sap/fe/core/ActionRuntime.ts +108 -0
- package/src/sap/fe/core/AppComponent.js +81 -35
- package/src/sap/fe/core/AppComponent.ts +68 -44
- package/src/sap/fe/core/AppStateHandler.js +82 -70
- package/src/sap/fe/core/AppStateHandler.ts +32 -37
- package/src/sap/fe/core/BaseController.js +12 -10
- package/src/sap/fe/core/BaseController.ts +15 -13
- package/src/sap/fe/core/CommonUtils.js +291 -218
- package/src/sap/fe/core/CommonUtils.ts +315 -251
- package/src/sap/fe/core/ExtensionAPI.js +25 -28
- package/src/sap/fe/core/ExtensionAPI.ts +36 -38
- package/src/sap/fe/core/PageController.js +5 -5
- package/src/sap/fe/core/PageController.ts +4 -5
- package/src/sap/fe/core/TemplateComponent.js +21 -10
- package/src/sap/fe/core/TemplateComponent.ts +9 -6
- package/src/sap/fe/core/TemplateModel.js +2 -2
- package/src/sap/fe/core/TemplateModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +11 -3
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +8 -2
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +197 -43
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +164 -24
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +14 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.ts +5 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +609 -230
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +275 -128
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +30 -30
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +32 -29
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +761 -700
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +478 -514
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +10 -10
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +104 -75
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +71 -79
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +68 -68
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +76 -76
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +162 -102
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +177 -121
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +67 -69
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
- package/src/sap/fe/core/controllerextensions/MassEdit.js +10 -10
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +20 -27
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -13
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +21 -14
- package/src/sap/fe/core/controllerextensions/PageReady.js +98 -26
- package/src/sap/fe/core/controllerextensions/PageReady.ts +98 -34
- package/src/sap/fe/core/controllerextensions/Paginator.js +31 -32
- package/src/sap/fe/core/controllerextensions/Paginator.ts +33 -34
- package/src/sap/fe/core/controllerextensions/Placeholder.js +5 -7
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
- package/src/sap/fe/core/controllerextensions/Routing.js +11 -12
- package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +171 -140
- package/src/sap/fe/core/controllerextensions/Share.ts +117 -118
- package/src/sap/fe/core/controllerextensions/SideEffects.js +47 -51
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -60
- package/src/sap/fe/core/controllerextensions/ViewState.js +201 -132
- package/src/sap/fe/core/controllerextensions/ViewState.ts +141 -148
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +5 -5
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -7
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +13 -12
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +17 -20
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +13 -12
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +15 -15
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +57 -18
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +60 -28
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +29 -21
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1424 -940
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +799 -836
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +410 -377
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +275 -358
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +309 -0
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +320 -0
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +752 -579
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +631 -599
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +92 -74
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +49 -52
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +78 -41
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +110 -84
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +69 -81
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.ts +64 -73
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +18 -2
- package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +35 -0
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +25 -24
- package/src/sap/fe/core/controls/Any.js +9 -5
- package/src/sap/fe/core/controls/Any.ts +10 -4
- package/src/sap/fe/core/controls/CommandExecution.js +12 -26
- package/src/sap/fe/core/controls/CommandExecution.ts +11 -25
- package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -3
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +26 -26
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +25 -24
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -3
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +2 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +5 -5
- package/src/sap/fe/core/controls/FieldWrapper.js +3 -3
- package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
- package/src/sap/fe/core/controls/FileWrapper.js +9 -4
- package/src/sap/fe/core/controls/FileWrapper.ts +16 -12
- package/src/sap/fe/core/controls/FilterBar.js +7 -3
- package/src/sap/fe/core/controls/FilterBar.ts +13 -9
- package/src/sap/fe/core/controls/FormElementWrapper.js +2 -2
- package/src/sap/fe/core/controls/FormElementWrapper.ts +2 -2
- package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
- package/src/sap/fe/core/controls/MassEditSelect.ts +0 -4
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -1
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +44 -19
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +2 -2
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +17 -13
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +4 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +49 -49
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +54 -54
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +8 -2
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +22 -35
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +89 -88
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +107 -106
- package/src/sap/fe/core/converters/ConverterContext.js +48 -34
- package/src/sap/fe/core/converters/ConverterContext.ts +81 -67
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +18 -15
- package/src/sap/fe/core/converters/ManifestWrapper.js +59 -45
- package/src/sap/fe/core/converters/ManifestWrapper.ts +55 -45
- package/src/sap/fe/core/converters/MetaModelConverter.js +74 -40
- package/src/sap/fe/core/converters/MetaModelConverter.ts +176 -140
- package/src/sap/fe/core/converters/TemplateConverter.js +21 -20
- package/src/sap/fe/core/converters/TemplateConverter.ts +27 -24
- package/src/sap/fe/core/converters/annotations/DataField.js +58 -35
- package/src/sap/fe/core/converters/annotations/DataField.ts +102 -76
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1956 -1494
- package/src/sap/fe/core/converters/controls/Common/Action.js +78 -51
- package/src/sap/fe/core/converters/controls/Common/Action.ts +87 -52
- package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -16
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +42 -43
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/Criticality.ts +4 -4
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +65 -29
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +93 -62
- package/src/sap/fe/core/converters/controls/Common/Form.js +31 -31
- package/src/sap/fe/core/converters/controls/Common/Form.ts +46 -57
- package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +49 -52
- package/src/sap/fe/core/converters/controls/Common/Table.js +251 -264
- package/src/sap/fe/core/converters/controls/Common/Table.ts +344 -370
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +119 -119
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +147 -144
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +89 -59
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +118 -71
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +28 -26
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +46 -43
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +9 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +14 -13
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +131 -95
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +123 -87
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +98 -87
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +121 -117
- package/src/sap/fe/core/converters/helpers/Aggregation.js +2 -4
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +12 -15
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -31
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +30 -29
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +8 -6
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +18 -10
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +136 -0
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +139 -0
- package/src/sap/fe/core/converters/helpers/ID.js +48 -46
- package/src/sap/fe/core/converters/helpers/ID.ts +26 -25
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -1
- package/src/sap/fe/core/converters/helpers/Key.js +7 -7
- package/src/sap/fe/core/converters/helpers/Key.ts +7 -7
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +4 -5
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +6 -6
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +10 -10
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +53 -75
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +59 -90
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +58 -57
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +93 -86
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +58 -44
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +87 -80
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +4 -4
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +4 -4
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +2 -2
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/FPMFormatter.js +5 -5
- package/src/sap/fe/core/formatters/FPMFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +7 -7
- package/src/sap/fe/core/formatters/KPIFormatter.ts +10 -10
- package/src/sap/fe/core/formatters/StandardFormatter.js +96 -0
- package/src/sap/fe/core/formatters/StandardFormatter.ts +70 -0
- package/src/sap/fe/core/formatters/TableFormatter.js +11 -11
- package/src/sap/fe/core/formatters/TableFormatter.ts +12 -12
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.js +8 -8
- package/src/sap/fe/core/formatters/ValueFormatter.ts +9 -9
- package/src/sap/fe/core/fpm/Component.js +33 -7
- package/src/sap/fe/core/fpm/Component.ts +14 -0
- package/src/sap/fe/core/helpers/AnnotationEnum.js +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +19 -18
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +41 -43
- package/src/sap/fe/core/helpers/BindingToolkit.js +1836 -0
- package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +397 -270
- package/src/sap/fe/core/helpers/ClassSupport.js +49 -12
- package/src/sap/fe/core/helpers/ClassSupport.ts +37 -10
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +2 -2
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -1
- package/src/sap/fe/core/helpers/EditState.js +1 -6
- package/src/sap/fe/core/helpers/EditState.ts +5 -10
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +2 -2
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +4 -4
- package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
- package/src/sap/fe/core/helpers/FPMHelper.ts +2 -2
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +31 -31
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +52 -56
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.js +306 -280
- package/src/sap/fe/core/helpers/MassEditHelper.ts +380 -360
- package/src/sap/fe/core/helpers/MessageStrip.js +81 -0
- package/src/sap/fe/core/helpers/MessageStrip.ts +79 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
- package/src/sap/fe/core/helpers/ModelHelper.ts +34 -32
- package/src/sap/fe/core/helpers/PasteHelper.js +3 -10
- package/src/sap/fe/core/helpers/PasteHelper.ts +20 -25
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +11 -11
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +3 -3
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +8 -8
- package/src/sap/fe/core/helpers/StableIdHelper.js +12 -12
- package/src/sap/fe/core/helpers/StableIdHelper.ts +12 -12
- package/src/sap/fe/core/helpers/Synchronization.js +1 -1
- package/src/sap/fe/core/helpers/ToES6Promise.js +32 -0
- package/src/sap/fe/core/helpers/ToES6Promise.ts +19 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +16 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.ts +3 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +109 -0
- package/src/sap/fe/core/jsx-runtime/ViewLoader.tsx +47 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +110 -0
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +92 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +105 -0
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +89 -0
- package/src/sap/fe/core/jsx-runtime/jsx.js +12 -90
- package/src/sap/fe/core/jsx-runtime/jsx.ts +24 -85
- package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +179 -0
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +150 -0
- package/src/sap/fe/core/library.js +42 -3
- package/src/sap/fe/core/library.support.js +1 -1
- package/src/sap/fe/core/library.ts +38 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +3 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +2 -2
- package/src/sap/fe/core/messagebundle.properties +39 -67
- package/src/sap/fe/core/messagebundle_ar.properties +27 -44
- package/src/sap/fe/core/messagebundle_bg.properties +27 -44
- package/src/sap/fe/core/messagebundle_ca.properties +27 -44
- package/src/sap/fe/core/messagebundle_cs.properties +27 -44
- package/src/sap/fe/core/messagebundle_cy.properties +26 -43
- package/src/sap/fe/core/messagebundle_da.properties +27 -44
- package/src/sap/fe/core/messagebundle_de.properties +25 -42
- package/src/sap/fe/core/messagebundle_el.properties +28 -45
- package/src/sap/fe/core/messagebundle_en.properties +27 -44
- package/src/sap/fe/core/messagebundle_en_GB.properties +27 -44
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +25 -42
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +26 -40
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +25 -42
- package/src/sap/fe/core/messagebundle_es.properties +27 -44
- package/src/sap/fe/core/messagebundle_es_MX.properties +27 -44
- package/src/sap/fe/core/messagebundle_et.properties +27 -44
- package/src/sap/fe/core/messagebundle_fi.properties +27 -44
- package/src/sap/fe/core/messagebundle_fr.properties +26 -43
- package/src/sap/fe/core/messagebundle_fr_CA.properties +25 -42
- package/src/sap/fe/core/messagebundle_hi.properties +27 -44
- package/src/sap/fe/core/messagebundle_hr.properties +27 -44
- package/src/sap/fe/core/messagebundle_hu.properties +27 -44
- package/src/sap/fe/core/messagebundle_id.properties +27 -44
- package/src/sap/fe/core/messagebundle_it.properties +43 -60
- package/src/sap/fe/core/messagebundle_iw.properties +27 -44
- package/src/sap/fe/core/messagebundle_ja.properties +27 -44
- package/src/sap/fe/core/messagebundle_kk.properties +27 -44
- package/src/sap/fe/core/messagebundle_ko.properties +30 -47
- package/src/sap/fe/core/messagebundle_lt.properties +27 -44
- package/src/sap/fe/core/messagebundle_lv.properties +27 -44
- package/src/sap/fe/core/messagebundle_ms.properties +27 -44
- package/src/sap/fe/core/messagebundle_nl.properties +29 -46
- package/src/sap/fe/core/messagebundle_no.properties +27 -44
- package/src/sap/fe/core/messagebundle_pl.properties +28 -45
- package/src/sap/fe/core/messagebundle_pt.properties +28 -45
- package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -44
- package/src/sap/fe/core/messagebundle_ro.properties +27 -44
- package/src/sap/fe/core/messagebundle_ru.properties +27 -44
- package/src/sap/fe/core/messagebundle_sh.properties +27 -44
- package/src/sap/fe/core/messagebundle_sk.properties +27 -44
- package/src/sap/fe/core/messagebundle_sl.properties +27 -44
- package/src/sap/fe/core/messagebundle_sv.properties +27 -44
- package/src/sap/fe/core/messagebundle_th.properties +25 -42
- package/src/sap/fe/core/messagebundle_tr.properties +27 -44
- package/src/sap/fe/core/messagebundle_uk.properties +27 -44
- package/src/sap/fe/core/messagebundle_vi.properties +27 -44
- package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -44
- package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -44
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +3 -3
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +103 -75
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +72 -73
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +2 -2
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.js +62 -50
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +63 -52
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +3 -3
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
- package/src/sap/fe/core/services/RoutingServiceFactory.js +56 -56
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +67 -65
- package/src/sap/fe/core/services/ShellServicesFactory.js +93 -77
- package/src/sap/fe/core/services/ShellServicesFactory.ts +95 -82
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +64 -64
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +232 -200
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +145 -142
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -2
- package/src/sap/fe/core/support/AnnotationIssue.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +1 -1
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.js +3 -2
- package/src/sap/fe/core/support/CommonHelper.ts +9 -13
- package/src/sap/fe/core/support/Diagnostics.js +1 -1
- package/src/sap/fe/core/support/Diagnostics.ts +5 -5
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.js +85 -0
- package/src/sap/fe/core/templating/CommonFormatters.ts +90 -0
- package/src/sap/fe/core/templating/CriticalityFormatters.js +31 -31
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +42 -40
- package/src/sap/fe/core/templating/DataFieldFormatters.js +8 -8
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +13 -10
- package/src/sap/fe/core/templating/DataModelPathHelper.js +23 -15
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +47 -34
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +2 -3
- package/src/sap/fe/core/templating/EntitySetHelper.js +7 -7
- package/src/sap/fe/core/templating/EntitySetHelper.ts +6 -8
- package/src/sap/fe/core/templating/FieldControlHelper.js +35 -34
- package/src/sap/fe/core/templating/FieldControlHelper.ts +29 -46
- package/src/sap/fe/core/templating/FilterHelper.js +18 -17
- package/src/sap/fe/core/templating/FilterHelper.ts +18 -18
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.ts +3 -3
- package/src/sap/fe/core/templating/PropertyFormatters.js +7 -7
- package/src/sap/fe/core/templating/PropertyFormatters.ts +21 -19
- package/src/sap/fe/core/templating/PropertyHelper.js +25 -25
- package/src/sap/fe/core/templating/PropertyHelper.ts +25 -26
- package/src/sap/fe/core/templating/UIFormatters.js +152 -95
- package/src/sap/fe/core/templating/UIFormatters.ts +202 -128
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +2 -2
- package/src/sap/fe/core/type/Email.js +3 -3
- package/src/sap/fe/core/type/Email.ts +2 -2
- package/src/sap/fe/core/helpers/BindingExpression.js +0 -1732
|
@@ -2,142 +2,321 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/AttributeModel", "sap/fe/core/helpers/BindingToolkit", "sap/fe/macros/ResourceModel", "sap/ui/base/BindingParser", "sap/ui/core/util/XMLPreprocessor", "./TraceInfo"], function (Log, uid, AttributeModel, BindingToolkit, ResourceModel, BindingParser, XMLPreprocessor, TraceInfo) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
function _forOf(target, body, check) {
|
|
9
|
+
if (typeof target[_iteratorSymbol] === "function") {
|
|
10
|
+
var iterator = target[_iteratorSymbol](),
|
|
11
|
+
step,
|
|
12
|
+
pact,
|
|
13
|
+
reject;
|
|
14
|
+
|
|
15
|
+
function _cycle(result) {
|
|
16
|
+
try {
|
|
17
|
+
while (!(step = iterator.next()).done && (!check || !check())) {
|
|
18
|
+
result = body(step.value);
|
|
19
|
+
|
|
20
|
+
if (result && result.then) {
|
|
21
|
+
if (_isSettledPact(result)) {
|
|
22
|
+
result = result.v;
|
|
23
|
+
} else {
|
|
24
|
+
result.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
5
29
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
30
|
+
if (pact) {
|
|
31
|
+
_settle(pact, 1, result);
|
|
32
|
+
} else {
|
|
33
|
+
pact = result;
|
|
34
|
+
}
|
|
35
|
+
} catch (e) {
|
|
36
|
+
_settle(pact || (pact = new _Pact()), 2, e);
|
|
12
37
|
}
|
|
38
|
+
}
|
|
13
39
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
40
|
+
_cycle();
|
|
41
|
+
|
|
42
|
+
if (iterator.return) {
|
|
43
|
+
var _fixup = function (value) {
|
|
44
|
+
try {
|
|
45
|
+
if (!step.done) {
|
|
46
|
+
iterator.return();
|
|
47
|
+
}
|
|
48
|
+
} catch (e) {}
|
|
49
|
+
|
|
50
|
+
return value;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
if (pact && pact.then) {
|
|
54
|
+
return pact.then(_fixup, function (e) {
|
|
55
|
+
throw _fixup(e);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
_fixup();
|
|
18
60
|
}
|
|
19
|
-
}
|
|
20
61
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
62
|
+
return pact;
|
|
63
|
+
} // No support for Symbol.iterator
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
if (!("length" in target)) {
|
|
67
|
+
throw new TypeError("Object is not iterable");
|
|
68
|
+
} // Handle live collections properly
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
var values = [];
|
|
72
|
+
|
|
73
|
+
for (var i = 0; i < target.length; i++) {
|
|
74
|
+
values.push(target[i]);
|
|
24
75
|
}
|
|
25
76
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
77
|
+
return _forTo(values, function (i) {
|
|
78
|
+
return body(values[i]);
|
|
79
|
+
}, check);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function _forTo(array, body, check) {
|
|
83
|
+
var i = -1,
|
|
84
|
+
pact,
|
|
85
|
+
reject;
|
|
29
86
|
|
|
30
|
-
|
|
31
|
-
|
|
87
|
+
function _cycle(result) {
|
|
88
|
+
try {
|
|
89
|
+
while (++i < array.length && (!check || !check())) {
|
|
90
|
+
result = body(i);
|
|
91
|
+
|
|
92
|
+
if (result && result.then) {
|
|
93
|
+
if (_isSettledPact(result)) {
|
|
94
|
+
result = result.v;
|
|
95
|
+
} else {
|
|
96
|
+
result.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (pact) {
|
|
103
|
+
_settle(pact, 1, result);
|
|
104
|
+
} else {
|
|
105
|
+
pact = result;
|
|
106
|
+
}
|
|
107
|
+
} catch (e) {
|
|
108
|
+
_settle(pact || (pact = new _Pact()), 2, e);
|
|
109
|
+
}
|
|
32
110
|
}
|
|
111
|
+
|
|
112
|
+
_cycle();
|
|
113
|
+
|
|
114
|
+
return pact;
|
|
33
115
|
}
|
|
34
|
-
}
|
|
35
116
|
|
|
36
|
-
var
|
|
37
|
-
function _Pact() {}
|
|
117
|
+
var _iteratorSymbol = /*#__PURE__*/typeof Symbol !== "undefined" ? Symbol.iterator || (Symbol.iterator = Symbol("Symbol.iterator")) : "@@iterator";
|
|
38
118
|
|
|
39
|
-
|
|
40
|
-
var result = new _Pact();
|
|
41
|
-
var state = this.s;
|
|
119
|
+
var _templateObject, _templateObject2, _templateObject3, _templateObject4;
|
|
42
120
|
|
|
43
|
-
|
|
44
|
-
|
|
121
|
+
var _exports = {};
|
|
122
|
+
var compileExpression = BindingToolkit.compileExpression;
|
|
45
123
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
124
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
125
|
+
|
|
126
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
127
|
+
|
|
128
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
129
|
+
|
|
130
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
131
|
+
|
|
132
|
+
function _settle(pact, state, value) {
|
|
133
|
+
if (!pact.s) {
|
|
134
|
+
if (value instanceof _Pact) {
|
|
135
|
+
if (value.s) {
|
|
136
|
+
if (state & 1) {
|
|
137
|
+
state = value.s;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
value = value.v;
|
|
141
|
+
} else {
|
|
142
|
+
value.o = _settle.bind(null, pact, state);
|
|
143
|
+
return;
|
|
51
144
|
}
|
|
145
|
+
}
|
|
52
146
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return
|
|
147
|
+
if (value && value.then) {
|
|
148
|
+
value.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
pact.s = state;
|
|
153
|
+
pact.v = value;
|
|
154
|
+
var observer = pact.o;
|
|
155
|
+
|
|
156
|
+
if (observer) {
|
|
157
|
+
observer(pact);
|
|
56
158
|
}
|
|
57
159
|
}
|
|
160
|
+
}
|
|
58
161
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
162
|
+
var _Pact = /*#__PURE__*/function () {
|
|
163
|
+
function _Pact() {}
|
|
164
|
+
|
|
165
|
+
_Pact.prototype.then = function (onFulfilled, onRejected) {
|
|
166
|
+
var result = new _Pact();
|
|
167
|
+
var state = this.s;
|
|
168
|
+
|
|
169
|
+
if (state) {
|
|
170
|
+
var callback = state & 1 ? onFulfilled : onRejected;
|
|
171
|
+
|
|
172
|
+
if (callback) {
|
|
173
|
+
try {
|
|
174
|
+
_settle(result, 1, callback(this.v));
|
|
175
|
+
} catch (e) {
|
|
176
|
+
_settle(result, 2, e);
|
|
177
|
+
}
|
|
62
178
|
|
|
63
|
-
|
|
64
|
-
_settle(result, 1, onFulfilled ? onFulfilled(value) : value);
|
|
65
|
-
} else if (onRejected) {
|
|
66
|
-
_settle(result, 1, onRejected(value));
|
|
179
|
+
return result;
|
|
67
180
|
} else {
|
|
68
|
-
|
|
181
|
+
return this;
|
|
69
182
|
}
|
|
70
|
-
} catch (e) {
|
|
71
|
-
_settle(result, 2, e);
|
|
72
183
|
}
|
|
184
|
+
|
|
185
|
+
this.o = function (_this) {
|
|
186
|
+
try {
|
|
187
|
+
var value = _this.v;
|
|
188
|
+
|
|
189
|
+
if (_this.s & 1) {
|
|
190
|
+
_settle(result, 1, onFulfilled ? onFulfilled(value) : value);
|
|
191
|
+
} else if (onRejected) {
|
|
192
|
+
_settle(result, 1, onRejected(value));
|
|
193
|
+
} else {
|
|
194
|
+
_settle(result, 2, value);
|
|
195
|
+
}
|
|
196
|
+
} catch (e) {
|
|
197
|
+
_settle(result, 2, e);
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
return result;
|
|
73
202
|
};
|
|
74
203
|
|
|
75
|
-
return
|
|
76
|
-
};
|
|
204
|
+
return _Pact;
|
|
205
|
+
}();
|
|
77
206
|
|
|
78
|
-
|
|
79
|
-
|
|
207
|
+
function _isSettledPact(thenable) {
|
|
208
|
+
return thenable instanceof _Pact && thenable.s & 1;
|
|
209
|
+
}
|
|
80
210
|
|
|
81
|
-
function
|
|
82
|
-
|
|
83
|
-
}
|
|
211
|
+
function _for(test, update, body) {
|
|
212
|
+
var stage;
|
|
84
213
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
pact,
|
|
88
|
-
reject;
|
|
214
|
+
for (;;) {
|
|
215
|
+
var shouldContinue = test();
|
|
89
216
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
result = body(i);
|
|
217
|
+
if (_isSettledPact(shouldContinue)) {
|
|
218
|
+
shouldContinue = shouldContinue.v;
|
|
219
|
+
}
|
|
94
220
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
221
|
+
if (!shouldContinue) {
|
|
222
|
+
return result;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (shouldContinue.then) {
|
|
226
|
+
stage = 0;
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
var result = body();
|
|
231
|
+
|
|
232
|
+
if (result && result.then) {
|
|
233
|
+
if (_isSettledPact(result)) {
|
|
234
|
+
result = result.s;
|
|
235
|
+
} else {
|
|
236
|
+
stage = 1;
|
|
237
|
+
break;
|
|
102
238
|
}
|
|
103
239
|
}
|
|
104
240
|
|
|
105
|
-
if (
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
241
|
+
if (update) {
|
|
242
|
+
var updateValue = update();
|
|
243
|
+
|
|
244
|
+
if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {
|
|
245
|
+
stage = 2;
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
109
248
|
}
|
|
110
|
-
} catch (e) {
|
|
111
|
-
_settle(pact || (pact = new _Pact()), 2, e);
|
|
112
249
|
}
|
|
113
|
-
}
|
|
114
250
|
|
|
115
|
-
|
|
251
|
+
var pact = new _Pact();
|
|
116
252
|
|
|
117
|
-
|
|
118
|
-
}
|
|
253
|
+
var reject = _settle.bind(null, pact, 2);
|
|
119
254
|
|
|
120
|
-
|
|
121
|
-
|
|
255
|
+
(stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);
|
|
256
|
+
return pact;
|
|
122
257
|
|
|
123
|
-
|
|
258
|
+
function _resumeAfterBody(value) {
|
|
259
|
+
result = value;
|
|
124
260
|
|
|
125
|
-
|
|
126
|
-
|
|
261
|
+
do {
|
|
262
|
+
if (update) {
|
|
263
|
+
updateValue = update();
|
|
127
264
|
|
|
128
|
-
|
|
265
|
+
if (updateValue && updateValue.then && !_isSettledPact(updateValue)) {
|
|
266
|
+
updateValue.then(_resumeAfterUpdate).then(void 0, reject);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
129
270
|
|
|
130
|
-
|
|
271
|
+
shouldContinue = test();
|
|
131
272
|
|
|
132
|
-
|
|
273
|
+
if (!shouldContinue || _isSettledPact(shouldContinue) && !shouldContinue.v) {
|
|
274
|
+
_settle(pact, 1, result);
|
|
133
275
|
|
|
134
|
-
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
135
278
|
|
|
136
|
-
|
|
279
|
+
if (shouldContinue.then) {
|
|
280
|
+
shouldContinue.then(_resumeAfterTest).then(void 0, reject);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
137
283
|
|
|
138
|
-
|
|
284
|
+
result = body();
|
|
139
285
|
|
|
140
|
-
|
|
286
|
+
if (_isSettledPact(result)) {
|
|
287
|
+
result = result.v;
|
|
288
|
+
}
|
|
289
|
+
} while (!result || !result.then);
|
|
290
|
+
|
|
291
|
+
result.then(_resumeAfterBody).then(void 0, reject);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
function _resumeAfterTest(shouldContinue) {
|
|
295
|
+
if (shouldContinue) {
|
|
296
|
+
result = body();
|
|
297
|
+
|
|
298
|
+
if (result && result.then) {
|
|
299
|
+
result.then(_resumeAfterBody).then(void 0, reject);
|
|
300
|
+
} else {
|
|
301
|
+
_resumeAfterBody(result);
|
|
302
|
+
}
|
|
303
|
+
} else {
|
|
304
|
+
_settle(pact, 1, result);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function _resumeAfterUpdate() {
|
|
309
|
+
if (shouldContinue = test()) {
|
|
310
|
+
if (shouldContinue.then) {
|
|
311
|
+
shouldContinue.then(_resumeAfterTest).then(void 0, reject);
|
|
312
|
+
} else {
|
|
313
|
+
_resumeAfterTest(shouldContinue);
|
|
314
|
+
}
|
|
315
|
+
} else {
|
|
316
|
+
_settle(pact, 1, result);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
141
320
|
|
|
142
321
|
function _catch(body, recover) {
|
|
143
322
|
try {
|
|
@@ -155,11 +334,23 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
155
334
|
|
|
156
335
|
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
|
157
336
|
|
|
158
|
-
|
|
337
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
338
|
+
|
|
339
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
340
|
+
|
|
341
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
342
|
+
|
|
343
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
344
|
+
|
|
345
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
346
|
+
|
|
347
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
348
|
+
|
|
349
|
+
var processBuildingBlock = function (buildingBlockDefinition, oNode, oVisitor) {
|
|
159
350
|
var isPublic = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
160
351
|
|
|
161
352
|
try {
|
|
162
|
-
var sFragmentName =
|
|
353
|
+
var sFragmentName = buildingBlockDefinition.fragment || "".concat(buildingBlockDefinition.namespace, ".").concat(buildingBlockDefinition.name);
|
|
163
354
|
var sName = "this";
|
|
164
355
|
var mContexts = {};
|
|
165
356
|
var oMetadataContexts = {};
|
|
@@ -173,22 +364,22 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
173
364
|
});
|
|
174
365
|
}
|
|
175
366
|
|
|
176
|
-
var oMetadata = prepareMetadata(
|
|
367
|
+
var oMetadata = prepareMetadata(buildingBlockDefinition.metadata, buildingBlockDefinition.isOpen); //Inject storage for macros
|
|
177
368
|
|
|
178
369
|
if (!oSettings[sFragmentName]) {
|
|
179
370
|
oSettings[sFragmentName] = {};
|
|
180
371
|
} // First of all we need to visit the attributes
|
|
181
372
|
|
|
182
373
|
|
|
183
|
-
return Promise.resolve(processProperties(oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts)).then(function (_ref) {
|
|
374
|
+
return Promise.resolve(processProperties(oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts, buildingBlockDefinition.apiVersion)).then(function (_ref) {
|
|
184
375
|
var mMissingContext = _ref.mMissingContext,
|
|
185
376
|
propertyValues = _ref.propertyValues;
|
|
186
377
|
var initialKeys = Object.keys(propertyValues);
|
|
187
378
|
|
|
188
|
-
var
|
|
379
|
+
var _temp18 = _catch(function () {
|
|
189
380
|
// Aggregation and complex type support
|
|
190
|
-
return Promise.resolve(processChildren(oNode, oVisitor, oMetadata, isPublic, propertyValues)).then(function (oAggregations) {
|
|
191
|
-
function
|
|
381
|
+
return Promise.resolve(processChildren(oNode, oVisitor, oMetadata, isPublic, propertyValues, buildingBlockDefinition.apiVersion)).then(function (oAggregations) {
|
|
382
|
+
function _temp17() {
|
|
192
383
|
if (oPreviousMacroInfo) {
|
|
193
384
|
//restore macro info if available
|
|
194
385
|
oSettings["_macroInfo"] = oPreviousMacroInfo;
|
|
@@ -207,8 +398,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
207
398
|
|
|
208
399
|
var processedPropertyValues = propertyValues;
|
|
209
400
|
|
|
210
|
-
if (isV1MacroDef(
|
|
211
|
-
processedPropertyValues =
|
|
401
|
+
if (isV1MacroDef(buildingBlockDefinition) && buildingBlockDefinition.create) {
|
|
402
|
+
processedPropertyValues = buildingBlockDefinition.create.call(buildingBlockDefinition, propertyValues, oControlConfig, oSettings, oAggregations, isPublic);
|
|
212
403
|
Object.keys(oMetadata.metadataContexts).forEach(function (sMetadataName) {
|
|
213
404
|
if (oMetadata.metadataContexts[sMetadataName].computed) {
|
|
214
405
|
mContexts[sMetadataName] = processedPropertyValues[sMetadataName];
|
|
@@ -219,21 +410,39 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
219
410
|
mContexts[sContextName] = processedPropertyValues[sContextName];
|
|
220
411
|
}
|
|
221
412
|
});
|
|
222
|
-
} else if (
|
|
413
|
+
} else if (buildingBlockDefinition.apiVersion === 2) {
|
|
223
414
|
Object.keys(propertyValues).forEach(function (propName) {
|
|
224
415
|
var oData = propertyValues[propName];
|
|
225
416
|
|
|
226
|
-
if (oData && oData.isA && oData.isA(
|
|
417
|
+
if (oData && oData.isA && oData.isA(SAP_UI_MODEL_CONTEXT) && !oData.getModel().isA("sap.ui.model.odata.v4.ODataMetaModel")) {
|
|
227
418
|
propertyValues[propName] = oData.getObject();
|
|
228
419
|
}
|
|
229
420
|
});
|
|
230
|
-
var BuildingBlockClass =
|
|
231
|
-
|
|
421
|
+
var BuildingBlockClass = buildingBlockDefinition;
|
|
422
|
+
propertyValues.isPublic = isPublic;
|
|
423
|
+
oInstance = new BuildingBlockClass(_objectSpread(_objectSpread({}, propertyValues), oAggregations), oControlConfig, oSettings
|
|
232
424
|
/*, oControlConfig, oSettings, oAggregations, isPublic*/
|
|
233
425
|
);
|
|
426
|
+
processedPropertyValues = oInstance.getProperties();
|
|
427
|
+
Object.keys(oMetadata.metadataContexts).forEach(function (sContextName) {
|
|
428
|
+
if (processedPropertyValues.hasOwnProperty(sContextName)) {
|
|
429
|
+
var targetObject = processedPropertyValues[sContextName];
|
|
430
|
+
|
|
431
|
+
if (typeof targetObject === "object" && !targetObject.getObject) {
|
|
432
|
+
var sAttributeValue = storeValue(targetObject);
|
|
433
|
+
var sContextPath = "".concat(sAttributeValue);
|
|
434
|
+
oSettings.models.converterContext.setProperty(sContextPath, targetObject);
|
|
435
|
+
targetObject = oSettings.models.converterContext.createBindingContext(sContextPath);
|
|
436
|
+
delete myStore[sAttributeValue];
|
|
437
|
+
mContexts[sContextName] = targetObject;
|
|
438
|
+
} else if (!mContexts.hasOwnProperty(sContextName) && targetObject !== undefined) {
|
|
439
|
+
mContexts[sContextName] = targetObject;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
});
|
|
234
443
|
}
|
|
235
444
|
|
|
236
|
-
var oAttributesModel = new AttributeModel(oNode, processedPropertyValues,
|
|
445
|
+
var oAttributesModel = new AttributeModel(oNode, processedPropertyValues, buildingBlockDefinition);
|
|
237
446
|
mContexts[sName] = oAttributesModel.createBindingContext("/");
|
|
238
447
|
var oPreviousMacroInfo; // Keep track
|
|
239
448
|
|
|
@@ -247,24 +456,35 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
247
456
|
}
|
|
248
457
|
|
|
249
458
|
validateMacroSignature(sFragmentName, oMetadata, mContexts, oNode);
|
|
250
|
-
var oContextVisitor = oVisitor.with(mContexts,
|
|
459
|
+
var oContextVisitor = oVisitor.with(mContexts, buildingBlockDefinition.isOpen !== undefined ? !buildingBlockDefinition.isOpen : true);
|
|
251
460
|
var oParent = oNode.parentNode;
|
|
252
461
|
var iChildIndex;
|
|
253
462
|
var oPromise;
|
|
463
|
+
var processCustomData = true;
|
|
254
464
|
|
|
255
|
-
var
|
|
465
|
+
var _temp16 = function () {
|
|
256
466
|
if (oParent) {
|
|
257
467
|
iChildIndex = Array.from(oParent.children).indexOf(oNode);
|
|
258
468
|
|
|
259
|
-
if (isV1MacroDef(
|
|
469
|
+
if (isV1MacroDef(buildingBlockDefinition) && buildingBlockDefinition.getTemplate || buildingBlockDefinition.apiVersion === 2 && !buildingBlockDefinition.fragment) {
|
|
260
470
|
var oTemplate;
|
|
261
471
|
var addDefaultNamespace = false;
|
|
262
472
|
|
|
263
|
-
if (
|
|
473
|
+
if (buildingBlockDefinition.apiVersion === 2) {
|
|
264
474
|
oTemplate = oInstance.getTemplate();
|
|
475
|
+
|
|
476
|
+
if (buildingBlockDefinition.isRuntime) {
|
|
477
|
+
for (var myStoreKey in myStore) {
|
|
478
|
+
var oData = myStore[myStoreKey];
|
|
479
|
+
var sContextPath = "".concat(myStoreKey);
|
|
480
|
+
oSettings.models.converterContext.setProperty(sContextPath, oData);
|
|
481
|
+
delete myStore[myStoreKey];
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
265
485
|
addDefaultNamespace = true;
|
|
266
|
-
} else if (
|
|
267
|
-
oTemplate =
|
|
486
|
+
} else if (buildingBlockDefinition.getTemplate) {
|
|
487
|
+
oTemplate = buildingBlockDefinition.getTemplate(processedPropertyValues);
|
|
268
488
|
}
|
|
269
489
|
|
|
270
490
|
var hasError = "";
|
|
@@ -287,27 +507,30 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
287
507
|
|
|
288
508
|
if (oTemplate.localName === "parsererror") {
|
|
289
509
|
// If there is a parseerror while processing the XML it means the XML itself is malformed, as such we rerun the template process
|
|
290
|
-
// Setting isTraceMode true will make it so that each xml` expression is checked for validity from XML perspective
|
|
291
|
-
|
|
510
|
+
// Setting isTraceMode true will make it so that each xml` expression is checked for validity from XML perspective
|
|
511
|
+
// If an error is found it's returned instead of the normal fragment
|
|
512
|
+
Log.error("Error while processing building block ".concat(buildingBlockDefinition.name));
|
|
292
513
|
|
|
293
514
|
try {
|
|
294
515
|
var _oInstance;
|
|
295
516
|
|
|
296
517
|
isTraceMode = true;
|
|
297
|
-
oTemplate = (_oInstance = oInstance) !== null && _oInstance !== void 0 && _oInstance.getTemplate ? oInstance.getTemplate() :
|
|
518
|
+
oTemplate = (_oInstance = oInstance) !== null && _oInstance !== void 0 && _oInstance.getTemplate ? oInstance.getTemplate() : buildingBlockDefinition.getTemplate(processedPropertyValues);
|
|
298
519
|
oTemplate = parseXMLString(oTemplate, true);
|
|
299
520
|
} finally {
|
|
300
521
|
isTraceMode = false;
|
|
301
522
|
}
|
|
302
523
|
} else if (hasError.length > 0) {
|
|
303
524
|
// If there is trailing text we create a standard error and display it.
|
|
304
|
-
Log.error("Error while processing building block ".concat(
|
|
305
|
-
var oErrorText = createErrorXML(["Error while processing building block ".concat(
|
|
525
|
+
Log.error("Error while processing building block ".concat(buildingBlockDefinition.name));
|
|
526
|
+
var oErrorText = createErrorXML(["Error while processing building block ".concat(buildingBlockDefinition.name), "Trailing text was found in the XML: ".concat(hasError)], oTemplate.outerHTML);
|
|
306
527
|
oTemplate = parseXMLString(oErrorText, true);
|
|
307
528
|
}
|
|
308
529
|
|
|
309
530
|
oNode.replaceWith(oTemplate);
|
|
310
531
|
oNode = oParent.children[iChildIndex];
|
|
532
|
+
processSlots(oAggregations, oMetadata.aggregations, oNode, processCustomData);
|
|
533
|
+
processCustomData = false;
|
|
311
534
|
oPromise = oContextVisitor.visitNode(oNode);
|
|
312
535
|
} else {
|
|
313
536
|
oNode.remove();
|
|
@@ -319,34 +542,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
319
542
|
|
|
320
543
|
return Promise.resolve(oPromise).then(function () {
|
|
321
544
|
var oMacroElement = oParent.children[iChildIndex];
|
|
322
|
-
|
|
323
|
-
if (Object.keys(oAggregations).length > 0) {
|
|
324
|
-
Object.keys(oAggregations).forEach(function (sAggregationName) {
|
|
325
|
-
var oAggregationElement = oAggregations[sAggregationName];
|
|
326
|
-
|
|
327
|
-
if (oMacroElement !== null && oMacroElement !== undefined) {
|
|
328
|
-
var oNewChild = document.createElementNS(oMacroElement.namespaceURI, sAggregationName);
|
|
329
|
-
var oElementChild = oAggregationElement.firstElementChild;
|
|
330
|
-
|
|
331
|
-
while (oElementChild) {
|
|
332
|
-
var oNextChild = oElementChild.nextElementSibling;
|
|
333
|
-
oNewChild.appendChild(oElementChild);
|
|
334
|
-
oElementChild = oNextChild;
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
if (sAggregationName !== "customData" && sAggregationName !== "dependents") {
|
|
338
|
-
var sSlotName = oMetadata.aggregations[sAggregationName] && oMetadata.aggregations[sAggregationName].slot || sAggregationName;
|
|
339
|
-
var oTargetElement = oMacroElement.querySelector("slot[name='" + sSlotName + "']");
|
|
340
|
-
|
|
341
|
-
if (oTargetElement) {
|
|
342
|
-
oTargetElement.replaceWith.apply(oTargetElement, _toConsumableArray(oNewChild.children));
|
|
343
|
-
}
|
|
344
|
-
} else {
|
|
345
|
-
oMacroElement.appendChild(oNewChild);
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
}
|
|
545
|
+
processSlots(oAggregations, oMetadata.aggregations, oMacroElement, processCustomData);
|
|
350
546
|
|
|
351
547
|
if (oMacroElement) {
|
|
352
548
|
var oRemainingSlots = oMacroElement.querySelectorAll("slot");
|
|
@@ -358,7 +554,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
358
554
|
}
|
|
359
555
|
}();
|
|
360
556
|
|
|
361
|
-
return
|
|
557
|
+
return _temp16 && _temp16.then ? _temp16.then(_temp17) : _temp17(_temp16);
|
|
362
558
|
});
|
|
363
559
|
}, function (e) {
|
|
364
560
|
// In case there is a generic error (usually code error), we retrieve the current context information and create a dedicated error message
|
|
@@ -376,7 +572,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
376
572
|
var _propertyName = _step.value;
|
|
377
573
|
var _propertyValue = propertyValues[_propertyName];
|
|
378
574
|
|
|
379
|
-
if (_propertyValue && _propertyValue.isA && _propertyValue.isA(
|
|
575
|
+
if (_propertyValue && _propertyValue.isA && _propertyValue.isA(SAP_UI_MODEL_CONTEXT)) {
|
|
380
576
|
traceDetails.initialProperties[_propertyName] = {
|
|
381
577
|
path: _propertyValue.getPath(),
|
|
382
578
|
value: _propertyValue.getObject()
|
|
@@ -395,7 +591,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
395
591
|
var propertyValue = propertyValues[propertyName];
|
|
396
592
|
|
|
397
593
|
if (!initialKeys.includes(propertyName)) {
|
|
398
|
-
if (propertyValue && propertyValue.isA && propertyValue.isA(
|
|
594
|
+
if (propertyValue && propertyValue.isA && propertyValue.isA(SAP_UI_MODEL_CONTEXT)) {
|
|
399
595
|
traceDetails.resolvedProperties[propertyName] = {
|
|
400
596
|
path: propertyValue.getPath(),
|
|
401
597
|
value: propertyValue.getObject()
|
|
@@ -408,50 +604,150 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
408
604
|
|
|
409
605
|
var errorAny = e;
|
|
410
606
|
Log.error(errorAny, errorAny);
|
|
411
|
-
var oError = createErrorXML(["Error while processing building block ".concat(
|
|
607
|
+
var oError = createErrorXML(["Error while processing building block ".concat(buildingBlockDefinition.name)], oNode.outerHTML, traceDetails, errorAny.stack);
|
|
412
608
|
var oTemplate = parseXMLString(oError, true);
|
|
413
609
|
oNode.replaceWith(oTemplate);
|
|
414
610
|
});
|
|
415
611
|
|
|
416
|
-
if (
|
|
612
|
+
if (_temp18 && _temp18.then) return _temp18.then(function () {});
|
|
417
613
|
});
|
|
418
614
|
} catch (e) {
|
|
419
615
|
return Promise.reject(e);
|
|
420
616
|
}
|
|
421
617
|
};
|
|
422
618
|
|
|
423
|
-
var processChildren = function (oNode, oVisitor, oMetadata, isPublic, propertyValues) {
|
|
619
|
+
var processChildren = function (oNode, oVisitor, oMetadata, isPublic, propertyValues, apiVersion) {
|
|
424
620
|
try {
|
|
425
621
|
var oAggregations = {};
|
|
426
622
|
|
|
427
|
-
var
|
|
623
|
+
var _temp10 = function () {
|
|
428
624
|
if (oNode.firstElementChild !== null) {
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
625
|
+
function _temp11() {
|
|
626
|
+
_oFirstElementChild = oNode.firstElementChild;
|
|
627
|
+
|
|
628
|
+
var _temp6 = _for(function () {
|
|
629
|
+
return _oFirstElementChild !== null;
|
|
630
|
+
}, void 0, function () {
|
|
631
|
+
function _temp5() {
|
|
632
|
+
_oFirstElementChild = oNextChild;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
var oNextChild = _oFirstElementChild.nextElementSibling;
|
|
636
|
+
var sChildName = _oFirstElementChild.localName;
|
|
637
|
+
var sAggregationName = sChildName;
|
|
638
|
+
|
|
639
|
+
if (sAggregationName[0].toUpperCase() === sAggregationName[0]) {
|
|
640
|
+
// not a sub aggregation, go back to default Aggregation
|
|
641
|
+
sAggregationName = oMetadata.defaultAggregation || "";
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
var _temp4 = function () {
|
|
645
|
+
if (Object.keys(oMetadata.aggregations).indexOf(sAggregationName) !== -1 && (!isPublic || oMetadata.aggregations[sAggregationName].isPublic)) {
|
|
646
|
+
var _temp13 = function () {
|
|
647
|
+
if (apiVersion === 2) {
|
|
648
|
+
var aggregationDefinition = oMetadata.aggregations[sAggregationName];
|
|
649
|
+
|
|
650
|
+
var _temp14 = function () {
|
|
651
|
+
if (!aggregationDefinition.slot && _oFirstElementChild && _oFirstElementChild.children.length > 0) {
|
|
652
|
+
return Promise.resolve(oVisitor.visitNode(_oFirstElementChild)).then(function () {
|
|
653
|
+
var childDefinition = _oFirstElementChild.firstElementChild;
|
|
654
|
+
|
|
655
|
+
while (childDefinition) {
|
|
656
|
+
var oNewChild = document.createElementNS(oNode.namespaceURI, childDefinition.getAttribute("key"));
|
|
657
|
+
var nextChild = childDefinition.nextElementSibling;
|
|
658
|
+
oNewChild.appendChild(childDefinition);
|
|
659
|
+
oAggregations[childDefinition.getAttribute("key")] = oNewChild;
|
|
660
|
+
childDefinition.removeAttribute("key");
|
|
661
|
+
childDefinition = nextChild;
|
|
662
|
+
}
|
|
663
|
+
});
|
|
664
|
+
} else if (aggregationDefinition.slot) {
|
|
665
|
+
if (sAggregationName !== sChildName) {
|
|
666
|
+
if (!oAggregations[sAggregationName]) {
|
|
667
|
+
var oNewChild = document.createElementNS(oNode.namespaceURI, sAggregationName);
|
|
668
|
+
oAggregations[sAggregationName] = oNewChild;
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
oAggregations[sAggregationName].appendChild(_oFirstElementChild);
|
|
672
|
+
} else {
|
|
673
|
+
oAggregations[sAggregationName] = _oFirstElementChild;
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
}();
|
|
677
|
+
|
|
678
|
+
if (_temp14 && _temp14.then) return _temp14.then(function () {});
|
|
679
|
+
} else {
|
|
680
|
+
return Promise.resolve(oVisitor.visitNode(_oFirstElementChild)).then(function () {
|
|
681
|
+
oAggregations[_oFirstElementChild.localName] = _oFirstElementChild;
|
|
682
|
+
});
|
|
683
|
+
}
|
|
684
|
+
}();
|
|
685
|
+
|
|
686
|
+
if (_temp13 && _temp13.then) return _temp13.then(function () {});
|
|
687
|
+
} else {
|
|
688
|
+
var _temp15 = function () {
|
|
689
|
+
if (Object.keys(oMetadata.properties).indexOf(sAggregationName) !== -1) {
|
|
690
|
+
return Promise.resolve(oVisitor.visitNode(_oFirstElementChild)).then(function () {
|
|
691
|
+
// Object Type properties
|
|
692
|
+
propertyValues[sAggregationName] = {};
|
|
693
|
+
|
|
694
|
+
for (var _i = 0, _Object$keys = Object.keys(_oFirstElementChild.attributes); _i < _Object$keys.length; _i++) {
|
|
695
|
+
var attributeIndex = _Object$keys[_i];
|
|
696
|
+
propertyValues[sAggregationName][_oFirstElementChild.attributes[attributeIndex].localName] = _oFirstElementChild.attributes[attributeIndex].value;
|
|
697
|
+
}
|
|
698
|
+
});
|
|
699
|
+
}
|
|
700
|
+
}();
|
|
701
|
+
|
|
702
|
+
if (_temp15 && _temp15.then) return _temp15.then(function () {});
|
|
703
|
+
}
|
|
704
|
+
}();
|
|
705
|
+
|
|
706
|
+
return _temp4 && _temp4.then ? _temp4.then(_temp5) : _temp5(_temp4);
|
|
707
|
+
});
|
|
708
|
+
|
|
709
|
+
if (_temp6 && _temp6.then) return _temp6.then(function () {});
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
var _oFirstElementChild = oNode.firstElementChild;
|
|
713
|
+
|
|
714
|
+
if (apiVersion === 2) {
|
|
715
|
+
while (_oFirstElementChild !== null) {
|
|
716
|
+
var sChildName = _oFirstElementChild.localName;
|
|
717
|
+
var sAggregationName = sChildName;
|
|
718
|
+
|
|
719
|
+
if (sAggregationName[0].toUpperCase() === sAggregationName[0]) {
|
|
720
|
+
// not a sub aggregation, go back to default Aggregation
|
|
721
|
+
sAggregationName = oMetadata.defaultAggregation || "";
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
var aggregationDefinition = oMetadata.aggregations[sAggregationName];
|
|
725
|
+
|
|
726
|
+
if (aggregationDefinition && !aggregationDefinition.slot) {
|
|
727
|
+
var parsedAggregation = parseAggregation(_oFirstElementChild);
|
|
728
|
+
oAggregations[sAggregationName] = parsedAggregation;
|
|
729
|
+
|
|
730
|
+
for (var parsedAggregationKey in parsedAggregation) {
|
|
731
|
+
oMetadata.aggregations[parsedAggregationKey] = parsedAggregation[parsedAggregationKey];
|
|
445
732
|
}
|
|
446
733
|
}
|
|
447
734
|
|
|
448
|
-
|
|
735
|
+
_oFirstElementChild = _oFirstElementChild.nextElementSibling;
|
|
449
736
|
}
|
|
450
|
-
}
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
var _temp12 = function () {
|
|
740
|
+
if (apiVersion !== 2) {
|
|
741
|
+
// If there are aggregation we need to visit the childNodes to resolve templating instructions
|
|
742
|
+
return Promise.resolve(oVisitor.visitChildNodes(oNode)).then(function () {});
|
|
743
|
+
}
|
|
744
|
+
}();
|
|
745
|
+
|
|
746
|
+
return _temp12 && _temp12.then ? _temp12.then(_temp11) : _temp11(_temp12);
|
|
451
747
|
}
|
|
452
748
|
}();
|
|
453
749
|
|
|
454
|
-
return Promise.resolve(
|
|
750
|
+
return Promise.resolve(_temp10 && _temp10.then ? _temp10.then(function () {
|
|
455
751
|
return oAggregations;
|
|
456
752
|
}) : oAggregations);
|
|
457
753
|
} catch (e) {
|
|
@@ -459,9 +755,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
459
755
|
}
|
|
460
756
|
};
|
|
461
757
|
|
|
462
|
-
var processProperties = function (oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts) {
|
|
758
|
+
var processProperties = function (oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts, apiVersion) {
|
|
463
759
|
try {
|
|
464
|
-
function
|
|
760
|
+
function _temp23() {
|
|
465
761
|
// Sort keys to be sure contextPath is before metaPath ( yes I'm desperate )
|
|
466
762
|
aDefinitionContextsKeys = aDefinitionContextsKeys.sort(function (a, b) {
|
|
467
763
|
return a > b ? 1 : -1;
|
|
@@ -515,39 +811,41 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
515
811
|
var aDefinitionContextsKeys = Object.keys(oDefinitionContexts);
|
|
516
812
|
var propertyValues = {};
|
|
517
813
|
|
|
518
|
-
var
|
|
519
|
-
var sKeyValue = aDefinitionPropertiesKeys[j];
|
|
520
|
-
|
|
814
|
+
var _temp24 = _forOf(aDefinitionPropertiesKeys, function (sKeyValue) {
|
|
521
815
|
if (oDefinitionProperties[sKeyValue].type === "object") {
|
|
522
|
-
propertyValues[sKeyValue] = {}; // To avoid
|
|
816
|
+
propertyValues[sKeyValue] = {}; // To avoid values being reused accross macros
|
|
523
817
|
} else {
|
|
524
818
|
propertyValues[sKeyValue] = oDefinitionProperties[sKeyValue].defaultValue;
|
|
525
819
|
}
|
|
526
820
|
|
|
527
|
-
var
|
|
821
|
+
var _temp20 = function () {
|
|
528
822
|
if (oNode.hasAttribute(sKeyValue) && isPublic && !oDefinitionProperties[sKeyValue].isPublic) {
|
|
529
823
|
Log.error("Property ".concat(sKeyValue, " was ignored as it is not intended for public usage"));
|
|
530
824
|
} else {
|
|
531
|
-
var
|
|
825
|
+
var _temp25 = function () {
|
|
532
826
|
if (oNode.hasAttribute(sKeyValue)) {
|
|
533
827
|
return Promise.resolve(oVisitor.visitAttribute(oNode, oNode.attributes.getNamedItem(sKeyValue))).then(function () {
|
|
534
828
|
var vValue = oNode.getAttribute(sKeyValue);
|
|
535
829
|
|
|
536
830
|
if (vValue !== undefined) {
|
|
831
|
+
if (apiVersion === 2 && typeof vValue === "string" && oDefinitionProperties[sKeyValue].type === "boolean") {
|
|
832
|
+
vValue = vValue === "true";
|
|
833
|
+
}
|
|
834
|
+
|
|
537
835
|
propertyValues[sKeyValue] = vValue;
|
|
538
836
|
}
|
|
539
837
|
});
|
|
540
838
|
}
|
|
541
839
|
}();
|
|
542
840
|
|
|
543
|
-
if (
|
|
841
|
+
if (_temp25 && _temp25.then) return _temp25.then(function () {});
|
|
544
842
|
}
|
|
545
843
|
}();
|
|
546
844
|
|
|
547
|
-
if (
|
|
845
|
+
if (_temp20 && _temp20.then) return _temp20.then(function () {});
|
|
548
846
|
});
|
|
549
847
|
|
|
550
|
-
return Promise.resolve(
|
|
848
|
+
return Promise.resolve(_temp24 && _temp24.then ? _temp24.then(_temp23) : _temp23(_temp24));
|
|
551
849
|
} catch (e) {
|
|
552
850
|
return Promise.reject(e);
|
|
553
851
|
}
|
|
@@ -611,7 +909,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
611
909
|
|
|
612
910
|
if (!oNode.hasAttribute(sKey)) {
|
|
613
911
|
if (oPropertySettings.required && !oPropertySettings.hasOwnProperty("defaultValue")) {
|
|
614
|
-
throw new Error(sName
|
|
912
|
+
throw new Error("".concat(sName, ": ") + "Required property '".concat(sKey, "' is missing"));
|
|
615
913
|
}
|
|
616
914
|
} else {
|
|
617
915
|
delete oAttributeNames[sKey];
|
|
@@ -625,6 +923,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
625
923
|
}
|
|
626
924
|
});
|
|
627
925
|
}
|
|
926
|
+
|
|
927
|
+
_exports.validateMacroSignature = validateMacroSignature;
|
|
928
|
+
var SAP_UI_CORE_ELEMENT = "sap.ui.core.Element";
|
|
929
|
+
var SAP_UI_MODEL_CONTEXT = "sap.ui.model.Context";
|
|
628
930
|
/**
|
|
629
931
|
* Ensures that the metadata for the building block are properly defined.
|
|
630
932
|
*
|
|
@@ -633,9 +935,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
633
935
|
* @returns A set of completed metadata for further processing
|
|
634
936
|
*/
|
|
635
937
|
|
|
636
|
-
|
|
637
|
-
_exports.validateMacroSignature = validateMacroSignature;
|
|
638
|
-
|
|
639
938
|
function prepareMetadata(buildingBlockMetadata) {
|
|
640
939
|
var isOpen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
641
940
|
|
|
@@ -643,15 +942,16 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
643
942
|
var oProperties = {};
|
|
644
943
|
var oAggregations = {
|
|
645
944
|
"dependents": {
|
|
646
|
-
type:
|
|
945
|
+
type: SAP_UI_CORE_ELEMENT
|
|
647
946
|
},
|
|
648
947
|
"customData": {
|
|
649
|
-
type:
|
|
948
|
+
type: SAP_UI_CORE_ELEMENT
|
|
650
949
|
}
|
|
651
950
|
};
|
|
652
951
|
var oMetadataContexts = {};
|
|
952
|
+
var foundDefaultAggregation;
|
|
653
953
|
Object.keys(buildingBlockMetadata.properties).forEach(function (sPropertyName) {
|
|
654
|
-
if (buildingBlockMetadata.properties[sPropertyName].type !==
|
|
954
|
+
if (buildingBlockMetadata.properties[sPropertyName].type !== SAP_UI_MODEL_CONTEXT) {
|
|
655
955
|
oProperties[sPropertyName] = buildingBlockMetadata.properties[sPropertyName];
|
|
656
956
|
} else {
|
|
657
957
|
oMetadataContexts[sPropertyName] = buildingBlockMetadata.properties[sPropertyName];
|
|
@@ -667,12 +967,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
667
967
|
if (buildingBlockMetadata.aggregations) {
|
|
668
968
|
Object.keys(buildingBlockMetadata.aggregations).forEach(function (sPropertyName) {
|
|
669
969
|
oAggregations[sPropertyName] = buildingBlockMetadata.aggregations[sPropertyName];
|
|
970
|
+
|
|
971
|
+
if (oAggregations[sPropertyName].isDefault) {
|
|
972
|
+
foundDefaultAggregation = sPropertyName;
|
|
973
|
+
}
|
|
670
974
|
});
|
|
671
975
|
}
|
|
672
976
|
|
|
673
977
|
return {
|
|
674
978
|
properties: oProperties,
|
|
675
979
|
aggregations: oAggregations,
|
|
980
|
+
defaultAggregation: foundDefaultAggregation,
|
|
676
981
|
metadataContexts: oMetadataContexts,
|
|
677
982
|
isOpen: isOpen
|
|
678
983
|
};
|
|
@@ -681,10 +986,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
681
986
|
metadataContexts: {},
|
|
682
987
|
aggregations: {
|
|
683
988
|
"dependents": {
|
|
684
|
-
type:
|
|
989
|
+
type: SAP_UI_CORE_ELEMENT
|
|
685
990
|
},
|
|
686
991
|
"customData": {
|
|
687
|
-
type:
|
|
992
|
+
type: SAP_UI_CORE_ELEMENT
|
|
688
993
|
}
|
|
689
994
|
},
|
|
690
995
|
properties: {},
|
|
@@ -698,31 +1003,29 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
698
1003
|
|
|
699
1004
|
if (!bDoNotResolve && oNode.hasAttribute(sAttributeName)) {
|
|
700
1005
|
var sAttributeValue = oNode.getAttribute(sAttributeName);
|
|
701
|
-
var sMetaPath;
|
|
702
|
-
|
|
1006
|
+
var sMetaPath;
|
|
703
1007
|
oMetadataContext = BindingParser.complexParser(sAttributeValue);
|
|
704
1008
|
|
|
705
1009
|
if (!oMetadataContext) {
|
|
706
|
-
if (sAttributeValue.startsWith("uid--")) {
|
|
1010
|
+
if (sAttributeValue.startsWith("/uid--")) {
|
|
707
1011
|
var oData = myStore[sAttributeValue];
|
|
708
|
-
|
|
709
|
-
oSettings.models.converterContext.setProperty(sContextPath, oData);
|
|
1012
|
+
oSettings.models.converterContext.setProperty(sAttributeValue, oData);
|
|
710
1013
|
oMetadataContext = {
|
|
711
1014
|
model: "converterContext",
|
|
712
|
-
path:
|
|
1015
|
+
path: sAttributeValue
|
|
713
1016
|
};
|
|
714
1017
|
} else if (sAttributeName === "metaPath" && oSettings.currentContextPath || sAttributeName === "contextPath") {
|
|
715
1018
|
if (sAttributeValue && sAttributeValue.startsWith("/")) {
|
|
716
1019
|
// absolute path - we just use this one
|
|
717
1020
|
sMetaPath = sAttributeValue;
|
|
718
1021
|
} else {
|
|
719
|
-
var
|
|
1022
|
+
var sContextPath = oSettings.currentContextPath.getPath();
|
|
720
1023
|
|
|
721
|
-
if (!
|
|
722
|
-
|
|
1024
|
+
if (!sContextPath.endsWith("/")) {
|
|
1025
|
+
sContextPath += "/";
|
|
723
1026
|
}
|
|
724
1027
|
|
|
725
|
-
sMetaPath =
|
|
1028
|
+
sMetaPath = sContextPath + sAttributeValue;
|
|
726
1029
|
}
|
|
727
1030
|
|
|
728
1031
|
oMetadataContext = {
|
|
@@ -757,6 +1060,66 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
757
1060
|
return oMetadataContext;
|
|
758
1061
|
}
|
|
759
1062
|
|
|
1063
|
+
function parseAggregation(oAggregation) {
|
|
1064
|
+
var oOutObjects = {};
|
|
1065
|
+
|
|
1066
|
+
if (oAggregation && oAggregation.children.length > 0) {
|
|
1067
|
+
var children = oAggregation.children;
|
|
1068
|
+
|
|
1069
|
+
for (var childIdx = 0; childIdx < children.length; childIdx++) {
|
|
1070
|
+
var childDefinition = children[childIdx];
|
|
1071
|
+
var childKey = childDefinition.getAttribute("key") || childDefinition.getAttribute("id");
|
|
1072
|
+
|
|
1073
|
+
if (childKey) {
|
|
1074
|
+
childKey = "InlineXML_".concat(childKey);
|
|
1075
|
+
childDefinition.setAttribute("key", childKey);
|
|
1076
|
+
oOutObjects[childKey] = {
|
|
1077
|
+
key: childKey,
|
|
1078
|
+
position: {
|
|
1079
|
+
placement: childDefinition.getAttribute("placement"),
|
|
1080
|
+
anchor: childDefinition.getAttribute("anchor")
|
|
1081
|
+
},
|
|
1082
|
+
type: "Slot"
|
|
1083
|
+
};
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
return oOutObjects;
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
function processSlots(oAggregations, oMetadataAggregations, oNode) {
|
|
1092
|
+
var processCustomData = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
1093
|
+
|
|
1094
|
+
if (Object.keys(oAggregations).length > 0) {
|
|
1095
|
+
Object.keys(oAggregations).forEach(function (sAggregationName) {
|
|
1096
|
+
var oAggregationElement = oAggregations[sAggregationName];
|
|
1097
|
+
|
|
1098
|
+
if (oNode !== null && oNode !== undefined && oAggregationElement) {
|
|
1099
|
+
var oNewChild = document.createElementNS(oNode.namespaceURI, sAggregationName);
|
|
1100
|
+
var oElementChild = oAggregationElement.firstElementChild;
|
|
1101
|
+
|
|
1102
|
+
while (oElementChild) {
|
|
1103
|
+
var oNextChild = oElementChild.nextElementSibling;
|
|
1104
|
+
oNewChild.appendChild(oElementChild);
|
|
1105
|
+
oElementChild = oNextChild;
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
if (sAggregationName !== "customData" && sAggregationName !== "dependents") {
|
|
1109
|
+
var sSlotName = oMetadataAggregations[sAggregationName] && oMetadataAggregations[sAggregationName].slot || sAggregationName;
|
|
1110
|
+
var oTargetElement = oNode.querySelector("slot[name='".concat(sSlotName, "']"));
|
|
1111
|
+
|
|
1112
|
+
if (oTargetElement) {
|
|
1113
|
+
oTargetElement.replaceWith.apply(oTargetElement, _toConsumableArray(oNewChild.children));
|
|
1114
|
+
}
|
|
1115
|
+
} else if (processCustomData && oNewChild.children.length > 0) {
|
|
1116
|
+
oNode.appendChild(oNewChild);
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
});
|
|
1120
|
+
}
|
|
1121
|
+
}
|
|
1122
|
+
|
|
760
1123
|
function addSingleContext(mContexts, oVisitor, oCtx, oMetadataContexts) {
|
|
761
1124
|
var sKey = oCtx.name || oCtx.model || undefined;
|
|
762
1125
|
|
|
@@ -768,12 +1131,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
768
1131
|
var sContextPath = oCtx.path;
|
|
769
1132
|
|
|
770
1133
|
if (oCtx.model != null) {
|
|
771
|
-
sContextPath = oCtx.model
|
|
1134
|
+
sContextPath = "".concat(oCtx.model, ">").concat(sContextPath);
|
|
772
1135
|
}
|
|
773
1136
|
|
|
774
1137
|
var mSetting = oVisitor.getSettings();
|
|
775
1138
|
|
|
776
|
-
if (
|
|
1139
|
+
if (oCtx.model === "converterContext" && oCtx.path.length > 0) {
|
|
1140
|
+
mContexts[sKey] = mSetting.models[oCtx.model].getContext(oCtx.path, mSetting.bindingContexts[oCtx.model]); // add the context to the visitor
|
|
1141
|
+
} else if (!mSetting.bindingContexts[oCtx.model] && mSetting.models[oCtx.model]) {
|
|
777
1142
|
mContexts[sKey] = mSetting.models[oCtx.model].getContext(oCtx.path); // add the context to the visitor
|
|
778
1143
|
} else {
|
|
779
1144
|
mContexts[sKey] = oVisitor.getContext(sContextPath); // add the context to the visitor
|
|
@@ -808,23 +1173,30 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
808
1173
|
|
|
809
1174
|
_exports.registerBuildingBlock = registerBuildingBlock;
|
|
810
1175
|
|
|
811
|
-
function createErrorXML(errorMessages, xmlFragment, additionalData) {
|
|
1176
|
+
function createErrorXML(errorMessages, xmlFragment, additionalData, stack) {
|
|
812
1177
|
var errorLabels = errorMessages.map(function (errorMessage) {
|
|
813
|
-
return xml(_templateObject || (_templateObject = _taggedTemplateLiteral(["<m:Label text=\"", "\"/>"])),
|
|
1178
|
+
return xml(_templateObject || (_templateObject = _taggedTemplateLiteral(["<m:Label text=\"", "\"/>"])), escapeXMLAttributeValue(errorMessage));
|
|
814
1179
|
});
|
|
1180
|
+
var errorStack = "";
|
|
1181
|
+
|
|
1182
|
+
if (stack) {
|
|
1183
|
+
var stackFormatted = btoa("<pre>".concat(stack, "</pre>"));
|
|
1184
|
+
errorStack = xml(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["<m:FormattedText htmlText=\"", "\" />"])), "{= BBF.base64Decode('".concat(stackFormatted, "') }"));
|
|
1185
|
+
}
|
|
1186
|
+
|
|
815
1187
|
var additionalText = "";
|
|
816
1188
|
|
|
817
1189
|
if (additionalData) {
|
|
818
|
-
additionalText = xml(
|
|
1190
|
+
additionalText = xml(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["<m:VBox>\n\t\t\t\t\t\t<m:Label text=\"Trace Info\"/>\n\t\t\t\t\t\t<code:CodeEditor type=\"json\" value=\"", "\" height=\"300px\" />\n\t\t\t\t\t</m:VBox>"])), "{= BBF.base64Decode('".concat(btoa(JSON.stringify(additionalData, null, 4)), "') }"));
|
|
819
1191
|
}
|
|
820
1192
|
|
|
821
|
-
return xml(
|
|
1193
|
+
return xml(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["<m:VBox xmlns:m=\"sap.m\" xmlns:code=\"sap.ui.codeeditor\" core:require=\"{BBF:'sap/fe/core/buildingBlocks/BuildingBlockFormatter'}\">\n\t\t\t\t", "\t\t\t\n\t\t\t\t", "\n\t\t\t\t<grid:CSSGrid gridTemplateRows=\"fr\" gridTemplateColumns=\"repeat(2,1fr)\" gridGap=\"1rem\" xmlns:grid=\"sap.ui.layout.cssgrid\" >\n\t\t\t\t\t<m:VBox>\n\t\t\t\t\t\t<m:Label text=\"How the building block was called\"/>\n\t\t\t\t\t\t<code:CodeEditor type=\"xml\" value=\"", "\" height=\"300px\" />\n\t\t\t\t\t</m:VBox>\n\t\t\t\t\t", "\n\t\t\t\t</grid:CSSGrid>\n\t\t\t</m:VBox>"])), errorLabels, errorStack, "{= BBF.base64Decode('".concat(btoa(xmlFragment.replaceAll(">", ">")), "') }"), additionalText);
|
|
822
1194
|
}
|
|
823
1195
|
|
|
824
1196
|
var myStore = {};
|
|
825
1197
|
|
|
826
1198
|
function storeValue(values) {
|
|
827
|
-
var propertyUID = "uid--".concat(uid());
|
|
1199
|
+
var propertyUID = "/uid--".concat(uid());
|
|
828
1200
|
myStore[propertyUID] = values;
|
|
829
1201
|
return propertyUID;
|
|
830
1202
|
}
|
|
@@ -841,7 +1213,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
841
1213
|
var addDefaultNamespaces = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
842
1214
|
|
|
843
1215
|
if (addDefaultNamespaces) {
|
|
844
|
-
xmlString = "<template\n\t\t\t\t\t\txmlns:template=\"http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1\"\n\t\t\t\t\t\txmlns:m=\"sap.m\"\n\t\t\t\t\t\txmlns:core=\"sap.ui.core\"\n\t\t\t\t\t\txmlns:customData=\"http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1\">".concat(xmlString, "</template>");
|
|
1216
|
+
xmlString = "<template\n\t\t\t\t\t\txmlns:template=\"http://schemas.sap.com/sapui5/extension/sap.ui.core.template/1\"\n\t\t\t\t\t\txmlns:m=\"sap.m\"\n\t\t\t\t\t\txmlns:macros=\"sap.fe.macros\"\n\t\t\t\t\t\txmlns:core=\"sap.ui.core\"\n\t\t\t\t\t\txmlns:mdc=\"sap.ui.mdc\"\n\t\t\t\t\t\txmlns:customData=\"http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1\">".concat(xmlString, "</template>");
|
|
845
1217
|
}
|
|
846
1218
|
|
|
847
1219
|
var xmlDocument = DOMParserInstance.parseFromString(xmlString, "text/xml");
|
|
@@ -855,17 +1227,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
855
1227
|
|
|
856
1228
|
return output;
|
|
857
1229
|
}
|
|
858
|
-
/**
|
|
859
|
-
* Escape an XML string to include it in an XML fragment.
|
|
860
|
-
*
|
|
861
|
-
* @param str The string to escape
|
|
862
|
-
* @returns The escaped string.
|
|
863
|
-
*/
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
function escapeXML(str) {
|
|
867
|
-
return str.replace(/&/g, "&").replace(/</g, "<").replace(/\n/g, " ").replace(/\{/g, "\\{").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
868
|
-
}
|
|
869
1230
|
/**
|
|
870
1231
|
* Escape an XML attribute value.
|
|
871
1232
|
*
|
|
@@ -874,8 +1235,21 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
874
1235
|
*/
|
|
875
1236
|
|
|
876
1237
|
|
|
1238
|
+
_exports.parseXMLString = parseXMLString;
|
|
1239
|
+
|
|
877
1240
|
function escapeXMLAttributeValue(val) {
|
|
878
|
-
return val.replace(/&/g, "&").replace(/</g, "<");
|
|
1241
|
+
return val && val.replace(/&/g, "&").replace(/</g, "<");
|
|
1242
|
+
}
|
|
1243
|
+
|
|
1244
|
+
function renderInTraceMode(outStr) {
|
|
1245
|
+
var xmlResult = parseXMLString(outStr, true);
|
|
1246
|
+
|
|
1247
|
+
if (xmlResult && (xmlResult === null || xmlResult === void 0 ? void 0 : xmlResult.localName) === "parsererror") {
|
|
1248
|
+
var errorMessage = xmlResult.innerText || xmlResult.innerHTML;
|
|
1249
|
+
return createErrorXML([errorMessage.split("\n")[0]], outStr);
|
|
1250
|
+
} else {
|
|
1251
|
+
return outStr;
|
|
1252
|
+
}
|
|
879
1253
|
}
|
|
880
1254
|
/**
|
|
881
1255
|
* Create a string representation of the template literal while handling special object case.
|
|
@@ -899,16 +1273,26 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
899
1273
|
|
|
900
1274
|
outStr += strings[i]; // Handle the different case of object, if it's an array we join them, if it's a binding expression (determined by _type) then we compile it.
|
|
901
1275
|
|
|
902
|
-
if (Array.isArray(values[i])) {
|
|
903
|
-
outStr += values[i].flat(5).join("").trim();
|
|
1276
|
+
if (Array.isArray(values[i]) && values[i].length > 0 && typeof values[i][0] === "string") {
|
|
1277
|
+
outStr += values[i].flat(5).join("\n").trim();
|
|
904
1278
|
} else if ((_values$i = values[i]) !== null && _values$i !== void 0 && _values$i._type) {
|
|
905
|
-
var compiledExpression =
|
|
1279
|
+
var compiledExpression = compileExpression(values[i]);
|
|
906
1280
|
outStr += compiledExpression !== undefined ? escapeXMLAttributeValue(compiledExpression) : undefined;
|
|
907
1281
|
} else if ((_values$i2 = values[i]) !== null && _values$i2 !== void 0 && _values$i2.getTemplate) {
|
|
908
1282
|
outStr += values[i].getTemplate();
|
|
1283
|
+
} else if (typeof values[i] === "undefined") {
|
|
1284
|
+
outStr += "{this>undefinedValue}";
|
|
909
1285
|
} else if (typeof values[i] === "object") {
|
|
910
|
-
var
|
|
911
|
-
|
|
1286
|
+
var _values$i$isA, _values$i3;
|
|
1287
|
+
|
|
1288
|
+
if ((_values$i$isA = (_values$i3 = values[i]).isA) !== null && _values$i$isA !== void 0 && _values$i$isA.call(_values$i3, "sap.ui.model.Context")) {
|
|
1289
|
+
outStr += values[i].getPath();
|
|
1290
|
+
} else {
|
|
1291
|
+
var propertyUId = storeValue(values[i]);
|
|
1292
|
+
outStr += "".concat(propertyUId);
|
|
1293
|
+
}
|
|
1294
|
+
} else if (values[i] && typeof values[i] === "string" && !values[i].startsWith("<") && !values[i].startsWith("<")) {
|
|
1295
|
+
outStr += escapeXMLAttributeValue(values[i]);
|
|
912
1296
|
} else {
|
|
913
1297
|
outStr += values[i];
|
|
914
1298
|
}
|
|
@@ -918,12 +1302,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
918
1302
|
outStr = outStr.trim();
|
|
919
1303
|
|
|
920
1304
|
if (isTraceMode) {
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
if (xmlResult && (xmlResult === null || xmlResult === void 0 ? void 0 : xmlResult.localName) === "parsererror") {
|
|
924
|
-
var errorMessage = xmlResult.innerText || xmlResult.innerHTML;
|
|
925
|
-
return createErrorXML([errorMessage.split("\n")[0]], outStr);
|
|
926
|
-
}
|
|
1305
|
+
return renderInTraceMode(outStr);
|
|
927
1306
|
}
|
|
928
1307
|
|
|
929
1308
|
return outStr;
|
|
@@ -932,4 +1311,4 @@ sap.ui.define(["sap/base/Log", "sap/base/util/uid", "sap/fe/core/buildingBlocks/
|
|
|
932
1311
|
_exports.xml = xml;
|
|
933
1312
|
return _exports;
|
|
934
1313
|
}, false);
|
|
935
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJ1aWxkaW5nQmxvY2tSdW50aW1lLnRzIl0sIm5hbWVzIjpbInBhY3QiLCJzdGF0ZSIsInZhbHVlIiwicyIsInYiLCJvIiwiYmluZCIsInRoZW4iLCJvYnNlcnZlciIsInByb3RvdHlwZSIsIm9uRnVsZmlsbGVkIiwib25SZWplY3RlZCIsInJlc3VsdCIsImNhbGxiYWNrIiwiZSIsIl90aGlzIiwidGhlbmFibGUiLCJhcnJheSIsImJvZHkiLCJjaGVjayIsImkiLCJyZWplY3QiLCJfY3ljbGUiLCJsZW5ndGgiLCJyZWNvdmVyIiwicHJvY2Vzc0J1aWxkaW5nQmxvY2siLCJidWlsZGluZ0JMb2NrRGVmaW5pdGlvbiIsIm9Ob2RlIiwib1Zpc2l0b3IiLCJpc1B1YmxpYyIsInNGcmFnbWVudE5hbWUiLCJmcmFnbWVudCIsIm5hbWVzcGFjZSIsIm5hbWUiLCJzTmFtZSIsIm1Db250ZXh0cyIsIm9NZXRhZGF0YUNvbnRleHRzIiwib1NldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJtb2RlbHMiLCJnZXRSZXNvdXJjZUJ1bmRsZSIsIm9SZXNvdXJjZUJ1bmRsZSIsIlJlc291cmNlTW9kZWwiLCJzZXRBcHBsaWNhdGlvbkkxOG5CdW5kbGUiLCJjYXRjaCIsImVycm9yIiwiTG9nIiwib01ldGFkYXRhIiwicHJlcGFyZU1ldGFkYXRhIiwibWV0YWRhdGEiLCJpc09wZW4iLCJwcm9jZXNzUHJvcGVydGllcyIsIm1NaXNzaW5nQ29udGV4dCIsInByb3BlcnR5VmFsdWVzIiwiaW5pdGlhbEtleXMiLCJPYmplY3QiLCJrZXlzIiwicHJvY2Vzc0NoaWxkcmVuIiwib0FnZ3JlZ2F0aW9ucyIsIm9QcmV2aW91c01hY3JvSW5mbyIsIm9JbnN0YW5jZSIsIm9Db250cm9sQ29uZmlnIiwidmlld0RhdGEiLCJnZXRQcm9wZXJ0eSIsInByb2Nlc3NlZFByb3BlcnR5VmFsdWVzIiwiaXNWMU1hY3JvRGVmIiwiY3JlYXRlIiwiY2FsbCIsIm1ldGFkYXRhQ29udGV4dHMiLCJmb3JFYWNoIiwic01ldGFkYXRhTmFtZSIsImNvbXB1dGVkIiwic0NvbnRleHROYW1lIiwiaGFzT3duUHJvcGVydHkiLCJhcGlWZXJzaW9uIiwicHJvcE5hbWUiLCJvRGF0YSIsImlzQSIsImdldE1vZGVsIiwiZ2V0T2JqZWN0IiwiQnVpbGRpbmdCbG9ja0NsYXNzIiwib0F0dHJpYnV0ZXNNb2RlbCIsIkF0dHJpYnV0ZU1vZGVsIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJUcmFjZUluZm8iLCJpc1RyYWNlSW5mb0FjdGl2ZSIsIm9UcmFjZUluZm8iLCJ0cmFjZU1hY3JvQ2FsbHMiLCJtYWNyb0luZm8iLCJ2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlIiwib0NvbnRleHRWaXNpdG9yIiwid2l0aCIsInVuZGVmaW5lZCIsIm9QYXJlbnQiLCJwYXJlbnROb2RlIiwiaUNoaWxkSW5kZXgiLCJvUHJvbWlzZSIsIkFycmF5IiwiZnJvbSIsImNoaWxkcmVuIiwiaW5kZXhPZiIsImdldFRlbXBsYXRlIiwib1RlbXBsYXRlIiwiYWRkRGVmYXVsdE5hbWVzcGFjZSIsImhhc0Vycm9yIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJwYXJzZVhNTFN0cmluZyIsIml0ZXIiLCJkb2N1bWVudCIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIk5vZGVGaWx0ZXIiLCJTSE9XX1RFWFQiLCJ0ZXh0bm9kZSIsIm5leHROb2RlIiwidGV4dENvbnRlbnQiLCJ0cmltIiwibG9jYWxOYW1lIiwiaXNUcmFjZU1vZGUiLCJvRXJyb3JUZXh0IiwiY3JlYXRlRXJyb3JYTUwiLCJvdXRlckhUTUwiLCJyZXBsYWNlV2l0aCIsInZpc2l0Tm9kZSIsInJlbW92ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiaW5zZXJ0RnJhZ21lbnQiLCJvTWFjcm9FbGVtZW50Iiwic0FnZ3JlZ2F0aW9uTmFtZSIsIm9BZ2dyZWdhdGlvbkVsZW1lbnQiLCJvTmV3Q2hpbGQiLCJjcmVhdGVFbGVtZW50TlMiLCJuYW1lc3BhY2VVUkkiLCJvRWxlbWVudENoaWxkIiwib05leHRDaGlsZCIsIm5leHRFbGVtZW50U2libGluZyIsImFwcGVuZENoaWxkIiwic1Nsb3ROYW1lIiwiYWdncmVnYXRpb25zIiwic2xvdCIsIm9UYXJnZXRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsIm9SZW1haW5pbmdTbG90cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvU2xvdEVsZW1lbnQiLCJ0cmFjZURldGFpbHMiLCJpbml0aWFsUHJvcGVydGllcyIsInJlc29sdmVkUHJvcGVydGllcyIsIm1pc3NpbmdDb250ZXh0cyIsInByb3BlcnR5TmFtZSIsInByb3BlcnR5VmFsdWUiLCJwYXRoIiwiZ2V0UGF0aCIsImluY2x1ZGVzIiwiZXJyb3JBbnkiLCJvRXJyb3IiLCJzdGFjayIsInZpc2l0Q2hpbGROb2RlcyIsIm9GaXJzdEVsZW1lbnRDaGlsZCIsInNDaGlsZE5hbWUiLCJwcm9wZXJ0aWVzIiwiYXR0cmlidXRlcyIsImF0dHJpYnV0ZUluZGV4IiwiYURlZmluaXRpb25Db250ZXh0c0tleXMiLCJzb3J0IiwiYSIsImIiLCJzQXR0cmlidXRlTmFtZSIsImJEb05vdFJlc29sdmUiLCJvRGVmaW5pdGlvbkNvbnRleHRzIiwiaGFzQXR0cmlidXRlIiwib01ldGFkYXRhQ29udGV4dCIsIl9nZXRNZXRhZGF0YUNvbnRleHQiLCJhZGRTaW5nbGVDb250ZXh0IiwiYmluZGluZ0NvbnRleHRzIiwiY3VycmVudENvbnRleHRQYXRoIiwib0RlZmluaXRpb25Qcm9wZXJ0aWVzIiwiY29udGV4dFBhdGgiLCJhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzIiwiaiIsInNLZXlWYWx1ZSIsInR5cGUiLCJkZWZhdWx0VmFsdWUiLCJ2aXNpdEF0dHJpYnV0ZSIsImdldE5hbWVkSXRlbSIsInZWYWx1ZSIsImdldEF0dHJpYnV0ZSIsIkxPR0dFUl9TQ09QRSIsIkRPTVBhcnNlckluc3RhbmNlIiwiRE9NUGFyc2VyIiwiYnVpbGRpbmdCbG9ja0RlZmluaXRpb24iLCJ2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0Iiwib0NvbnRleHRTZXR0aW5ncyIsInNLZXkiLCJvQ29udGV4dCIsIm9Db250ZXh0T2JqZWN0IiwicmVxdWlyZWQiLCJFcnJvciIsIiRraW5kIiwiJFR5cGUiLCJhTWV0YWRhdGFDb250ZXh0S2V5cyIsImFQcm9wZXJ0aWVzIiwib0F0dHJpYnV0ZU5hbWVzIiwiaUtleSIsIm9Qcm9wZXJ0eVNldHRpbmdzIiwic3RhcnRzV2l0aCIsIndhcm5pbmciLCJidWlsZGluZ0Jsb2NrTWV0YWRhdGEiLCJvUHJvcGVydGllcyIsInNQcm9wZXJ0eU5hbWUiLCJldmVudHMiLCJzRXZlbnROYW1lIiwic0F0dHJpYnV0ZVZhbHVlIiwic01ldGFQYXRoIiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJteVN0b3JlIiwic0NvbnRleHRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsInNldFByb3BlcnR5IiwibW9kZWwiLCJlbmRzV2l0aCIsImVudGl0eVNldCIsImdldENvbnRleHQiLCJvQ3R4IiwibVNldHRpbmciLCJleCIsInJlZ2lzdGVyQnVpbGRpbmdCbG9jayIsIlhNTFByZXByb2Nlc3NvciIsInBsdWdJbiIsInhtbFRhZyIsInB1YmxpY05hbWVzcGFjZSIsImVycm9yTWVzc2FnZXMiLCJ4bWxGcmFnbWVudCIsImFkZGl0aW9uYWxEYXRhIiwiZXJyb3JMYWJlbHMiLCJtYXAiLCJlcnJvck1lc3NhZ2UiLCJ4bWwiLCJlc2NhcGVYTUwiLCJhZGRpdGlvbmFsVGV4dCIsIkpTT04iLCJzdHJpbmdpZnkiLCJzdG9yZVZhbHVlIiwidmFsdWVzIiwicHJvcGVydHlVSUQiLCJ1aWQiLCJ4bWxTdHJpbmciLCJhZGREZWZhdWx0TmFtZXNwYWNlcyIsInhtbERvY3VtZW50IiwicGFyc2VGcm9tU3RyaW5nIiwib3V0cHV0Iiwic3RyIiwicmVwbGFjZSIsImVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlIiwidmFsIiwic3RyaW5ncyIsIm91dFN0ciIsImlzQXJyYXkiLCJmbGF0Iiwiam9pbiIsIl90eXBlIiwiY29tcGlsZWRFeHByZXNzaW9uIiwiY29tcGlsZUJpbmRp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QUNBLE9BRk0sTUFFQSxJQUFJLE9BQU8rSSxNQUFNLENBQUNoTyxDQUFELENBQWIsS0FBcUIsUUFBekIsRUFBbUM7QUFDekMsWUFBTW9QLFdBQVcsR0FBR3JCLFVBQVUsQ0FBQ0MsTUFBTSxDQUFDaE8sQ0FBRCxDQUFQLENBQTlCO0FBQ0E2TyxRQUFBQSxNQUFNLGNBQU9PLFdBQVAsQ0FBTjtBQUNBLE9BSE0sTUFHQTtBQUNOUCxRQUFBQSxNQUFNLElBQUliLE1BQU0sQ0FBQ2hPLENBQUQsQ0FBaEI7QUFDQTtBQUNEOztBQUNENk8sSUFBQUEsTUFBTSxJQUFJRCxPQUFPLENBQUM1TyxDQUFELENBQWpCO0FBQ0E2TyxJQUFBQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQzlJLElBQVAsRUFBVDs7QUFDQSxRQUFJRSxXQUFKLEVBQWlCO0FBQ2hCLFVBQU1vSixTQUFTLEdBQUcvSixjQUFjLENBQUN1SixNQUFELEVBQVMsSUFBVCxDQUFoQzs7QUFDQSxVQUFJUSxTQUFTLElBQUksQ0FBQUEsU0FBUyxTQUFULElBQUFBLFNBQVMsV0FBVCxZQUFBQSxTQUFTLENBQUVySixTQUFYLE1BQXlCLGFBQTFDLEVBQXlEO0FBQ3hELFlBQU15SCxZQUFZLEdBQUk0QixTQUFELENBQW1CQyxTQUFuQixJQUFpQ0QsU0FBRCxDQUFtQkUsU0FBeEU7QUFDQSxlQUFPcEosY0FBYyxDQUFDLENBQUNzSCxZQUFZLENBQUMrQixLQUFiLENBQW1CLElBQW5CLEVBQXlCLENBQXpCLENBQUQsQ0FBRCxFQUFnQ1gsTUFBaEMsQ0FBckI7QUFDQTtBQUNEOztBQUNELFdBQU9BLE1BQVA7QUFDQSxHQTlCTSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdWlkIGZyb20gXCJzYXAvYmFzZS91dGlsL3VpZFwiO1xuaW1wb3J0IEF0dHJpYnV0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9BdHRyaWJ1dGVNb2RlbFwiO1xuaW1wb3J0IHtcblx0QnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbixcblx0QnVpbGRpbmdCbG9ja0Jhc2UsXG5cdEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYxLFxuXHRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9CdWlsZGluZ0Jsb2NrXCI7XG5pbXBvcnQgeyBjb21waWxlQmluZGluZyB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdFeHByZXNzaW9uXCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL21hY3Jvcy9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgVHJhY2VJbmZvIGZyb20gXCIuL1RyYWNlSW5mb1wiO1xuXG5jb25zdCBMT0dHRVJfU0NPUEUgPSBcInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzLkJ1aWxkaW5nQmxvY2tSdW50aW1lXCI7XG5jb25zdCBET01QYXJzZXJJbnN0YW5jZSA9IG5ldyBET01QYXJzZXIoKTtcbmxldCBpc1RyYWNlTW9kZSA9IGZhbHNlO1xuXG50eXBlIFJlc29sdmVkQnVpbGRpbmdCbG9ja01ldGFkYXRhID0ge1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uPjtcblx0YWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uPjtcblx0bWV0YWRhdGFDb250ZXh0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24+O1xuXHRpc09wZW46IGJvb2xlYW47XG59O1xuXG50eXBlIElDYWxsYmFjayA9IHtcblx0Z2V0U2V0dGluZ3MoKTogYW55O1xuXHQvKipcblx0ICogVmlzaXRzIHRoZSBnaXZlbiBub2RlIGFuZCBlaXRoZXIgcHJvY2Vzc2VzIGEgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24sIGNhbGxzXG5cdCAqIGEgdmlzaXRvciwgb3Igc2ltcGx5IGNhbGxzIGJvdGgge0BsaW5rXG5cdCAqIHNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yLklDYWxsYmFjay52aXNpdEF0dHJpYnV0ZXMgdmlzaXRBdHRyaWJ1dGVzfVxuXHQgKiBhbmQge0BsaW5rIHNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yLklDYWxsYmFjay52aXNpdENoaWxkTm9kZXNcblx0ICogdmlzaXRDaGlsZE5vZGVzfS5cblx0ICpcblx0ICogQHBhcmFtIHtOb2RlfSBvTm9kZVxuXHQgKiAgIFRoZSBYTUwgRE9NIG5vZGVcblx0ICogQHJldHVybnMge3NhcC51aS5iYXNlLlN5bmNQcm9taXNlfVxuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGFzIHNvb24gYXMgdmlzaXRpbmdcblx0ICogICBpcyBkb25lLCBvciBpcyByZWplY3RlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBlcnJvciBpZiB2aXNpdGluZyBmYWlsc1xuXHQgKiovXG5cdHZpc2l0Tm9kZShvTm9kZTogTm9kZSk6IFByb21pc2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEluc2VydHMgdGhlIGZyYWdtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gcGxhY2Ugb2YgdGhlIGdpdmVuIGVsZW1lbnQuIExvYWRzIHRoZVxuXHQgKiBmcmFnbWVudCwgdGFrZXMgY2FyZSBvZiBjYWNoaW5nIChmb3IgdGhlIGN1cnJlbnQgcHJlLXByb2Nlc3NvciBydW4pIGFuZCB2aXNpdHMgdGhlXG5cdCAqIGZyYWdtZW50J3MgY29udGVudCBvbmNlIGl0IGhhcyBiZWVuIGltcG9ydGVkIGludG8gdGhlIGVsZW1lbnQncyBvd25lciBkb2N1bWVudCBhbmRcblx0ICogcHV0IGludG8gcGxhY2UuIExvYWRpbmcgb2YgZnJhZ21lbnRzIGlzIGFzeW5jaHJvbm91cyBpZiB0aGUgdGVtcGxhdGUgdmlldyBpc1xuXHQgKiBhc3luY2hyb25vdXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzRnJhZ21lbnROYW1lXG5cdCAqICAgdGhlIGZyYWdtZW50J3MgcmVzb2x2ZWQgbmFtZVxuXHQgKiBAcGFyYW0ge0VsZW1lbnR9IG9FbGVtZW50XG5cdCAqICAgdGhlIFhNTCBET00gZWxlbWVudCwgZS5nLiA8c2FwLnVpLmNvcmU6RnJhZ21lbnQ+IG9yIDxjb3JlOkV4dGVuc2lvblBvaW50PlxuXHQgKiBAcGFyYW0ge3NhcC51aS5jb3JlLnV0aWwuX3dpdGh9IG9XaXRoQ29udHJvbFxuXHQgKiAgIHRoZSBwYXJlbnQncyBcIndpdGhcIiBjb250cm9sXG5cdCAqIEByZXR1cm5zIHtzYXAudWkuYmFzZS5TeW5jUHJvbWlzZX1cblx0ICogQSBzeW5jIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2l0aCA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGFzIHNvb24gYXMgdGhlIGZyYWdtZW50XG5cdCAqICAgaGFzIGJlZW4gaW5zZXJ0ZWQsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIGxvYWRpbmcgb3IgdmlzaXRpbmdcblx0ICogICBmYWlscy5cblx0ICovXG5cdGluc2VydEZyYWdtZW50KHNGcmFnbWVudDogc3RyaW5nLCBvRWxlbWVudDogRWxlbWVudCwgb1dpdGg/OiBhbnkpOiBQcm9taXNlPHZvaWQ+O1xuXHR2aXNpdEF0dHJpYnV0ZShvTm9kZTogRWxlbWVudCwgb0F0dHJpYnV0ZTogQXR0cik6IFByb21pc2U8dm9pZD47XG5cdHZpc2l0Q2hpbGROb2RlcyhvTm9kZTogTm9kZSk6IFByb21pc2U8dm9pZD47XG5cdC8qKlxuXHQgKiBJbnRlcnByZXRzIHRoZSBnaXZlbiBYTUwgRE9NIGF0dHJpYnV0ZSB2YWx1ZSBhcyBhIGJpbmRpbmcgYW5kIHJldHVybnMgdGhlXG5cdCAqIHJlc3VsdGluZyB2YWx1ZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNWYWx1ZVxuXHQgKiAgIEFuIFhNTCBET00gYXR0cmlidXRlIHZhbHVlXG5cdCAqIEBwYXJhbSB7RWxlbWVudH0gW29FbGVtZW50XVxuXHQgKiAgIFRoZSBYTUwgRE9NIGVsZW1lbnQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBiZWxvbmdzIHRvIChuZWVkZWQgb25seSBmb3Jcblx0ICogICB3YXJuaW5ncyB3aGljaCBhcmUgbG9nZ2VkIHRvIHRoZSBjb25zb2xlKVxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmJhc2UuU3luY1Byb21pc2V8bnVsbH1cblx0ICogICBBIHRoZW5hYmxlIHdoaWNoIHJlc29sdmVzIHdpdGggdGhlIHJlc3VsdGluZyB2YWx1ZSwgb3IgaXMgcmVqZWN0ZWQgd2l0aCBhXG5cdCAqICAgY29ycmVzcG9uZGluZyBlcnJvciAoZm9yIGV4YW1wbGUsIGFuIGVycm9yIHRocm93biBieSBhIGZvcm1hdHRlcikgb3Jcblx0ICogICA8Y29kZT5udWxsPC9jb2RlPiBpbiBjYXNlIHRoZSBiaW5kaW5nIGlzIG5vdCByZWFkeSAoYmVjYXVzZSBpdCByZWZlcnMgdG8gYVxuXHQgKiAgIG1vZGVsIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUpIChzaW5jZSAxLjU3LjApXG5cdCAqL1xuXHRnZXRSZXN1bHQoc1ZhbHVlOiBzdHJpbmcsIGVsZW1lbnQ/OiBFbGVtZW50KTogUHJvbWlzZTxhbnk+IHwgbnVsbDtcblx0Z2V0Q29udGV4dChzUGF0aDogc3RyaW5nKTogQ29udGV4dDtcblx0LyoqXG5cdCAqIFJldHVybnMgYSBjYWxsYmFjayBpbnRlcmZhY2UgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBtYXAgb2YgdmFyaWFibGVzIHdoaWNoXG5cdCAqIG92ZXJyaWRlIGN1cnJlbnRseSBrbm93biB2YXJpYWJsZXMgb2YgdGhlIHNhbWUgbmFtZSBpbiA8Y29kZT50aGlzPC9jb2RlPlxuXHQgKiBwYXJlbnQgaW50ZXJmYWNlIG9yIHJlcGxhY2UgdGhlbSBhbHRvZ2V0aGVyLiBFYWNoIHZhcmlhYmxlIG5hbWUgYmVjb21lcyBhXG5cdCAqIG5hbWVkIG1vZGVsIHdpdGggYSBjb3JyZXNwb25kaW5nIG9iamVjdCBiaW5kaW5nIGFuZCBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlXG5cdCAqIFhNTCB0ZW1wbGF0ZSBpbiB0aGUgdXN1YWwgd2F5LCB0aGF0IGlzLCB3aXRoIGEgYmluZGluZyBleHByZXNzaW9uIGxpa2Vcblx0ICogPGNvZGU+XCJ7dmFyPnNvbWUvcmVsYXRpdmUvcGF0aH1cIjwvY29kZT4gKHNlZSBleGFtcGxlKS5cblx0ICpcblx0ICogQHBhcmFtIHtvYmplY3R9IFttVmFyaWFibGVzPXt9XVxuXHQgKiAgIE1hcCBmcm9tIHZhcmlhYmxlIG5hbWUgKHN0cmluZykgdG8gdmFsdWUgKHtAbGluayBzYXAudWkubW9kZWwuQ29udGV4dH0pXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2JSZXBsYWNlXVxuXHQgKiAgIFdoZXRoZXIgb25seSB0aGUgZ2l2ZW4gdmFyaWFibGVzIGFyZSBrbm93biBpbiB0aGUgbmV3IGNhbGxiYWNrIGludGVyZmFjZVxuXHQgKiAgIGluc3RhbmNlLCBubyBpbmhlcml0ZWQgb25lc1xuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrfVxuXHQgKiAgIEEgY2FsbGJhY2sgaW50ZXJmYWNlIGluc3RhbmNlXG5cdCAqIEBwYXJhbSBtVmFyaWFibGVzXG5cdCAqIEBwYXJhbSBiUmVwbGFjZVxuXHQgKi9cblx0XCJ3aXRoXCIobVZhcmlhYmxlcz86IGFueSwgYlJlcGxhY2U/OiBib29sZWFuKTogSUNhbGxiYWNrO1xufTtcblxuLyoqXG4gKiBUeXBlZ3VhcmQgZm9yIGNoZWNraW5nIGlmIGEgYnVpbGRpbmcgYmxvY2sgdXNlIEFQSSAxLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvblxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBidWlsZGluZyBibG9jayBpcyB1c2luZyBBUEkgMS5cbiAqL1xuZnVuY3Rpb24gaXNWMU1hY3JvRGVmKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbik6IGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uIGlzIEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjEge1xuXHRyZXR1cm4gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gdW5kZWZpbmVkIHx8IGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDE7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0KFxuXHRzTmFtZTogc3RyaW5nLFxuXHRtQ29udGV4dHM6IGFueSxcblx0b0NvbnRleHRTZXR0aW5nczogQnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24sXG5cdHNLZXk6IHN0cmluZ1xuKSB7XG5cdGNvbnN0IG9Db250ZXh0ID0gbUNvbnRleHRzW3NLZXldO1xuXHRjb25zdCBvQ29udGV4dE9iamVjdCA9IG9Db250ZXh0Py5nZXRPYmplY3QoKTtcblxuXHRpZiAob0NvbnRleHRTZXR0aW5ncy5yZXF1aXJlZCAmJiAoIW9Db250ZXh0IHx8IG9Db250ZXh0T2JqZWN0ID09PSBudWxsKSkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgJHtzTmFtZX06IFJlcXVpcmVkIG1ldGFkYXRhQ29udGV4dCAnJHtzS2V5fScgaXMgbWlzc2luZ2ApO1xuXHR9IGVsc2UgaWYgKG9Db250ZXh0T2JqZWN0KSB7XG5cdFx0Ly8gSWYgY29udGV4dCBvYmplY3QgaGFzICRraW5kIHByb3BlcnR5LCAkVHlwZSBzaG91bGQgbm90IGJlIGNoZWNrZWRcblx0XHQvLyBUaGVyZWZvcmUgcmVtb3ZlIGZyb20gY29udGV4dCBzZXR0aW5nc1xuXHRcdGlmIChvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRraW5kXCIpICYmIG9Db250ZXh0U2V0dGluZ3MuJGtpbmQpIHtcblx0XHRcdC8vIENoZWNrIGlmIHRoZSAka2luZCBpcyBwYXJ0IG9mIHRoZSBhbGxvd2VkIG9uZXNcblx0XHRcdGlmIChvQ29udGV4dFNldHRpbmdzLiRraW5kLmluZGV4T2Yob0NvbnRleHRPYmplY3RbXCIka2luZFwiXSkgPT09IC0xKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRgJHtzTmFtZX06ICcke3NLZXl9JyBtdXN0IGJlICcka2luZCcgJyR7b0NvbnRleHRTZXR0aW5nc1tcIiRraW5kXCJdfScgYnV0IGlzICcke1xuXHRcdFx0XHRcdFx0b0NvbnRleHRPYmplY3QuJGtpbmRcblx0XHRcdFx0XHR9JzogJHtvQ29udGV4dC5nZXRQYXRoKCl9YFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAob0NvbnRleHRPYmplY3QuaGFzT3duUHJvcGVydHkoXCIkVHlwZVwiKSAmJiBvQ29udGV4dFNldHRpbmdzLiRUeXBlKSB7XG5cdFx0XHQvLyBDaGVjayBvbmx5ICRUeXBlXG5cdFx0XHRpZiAob0NvbnRleHRTZXR0aW5ncy4kVHlwZS5pbmRleE9mKG9Db250ZXh0T2JqZWN0W1wiJFR5cGVcIl0pID09PSAtMSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdFx0YCR7c05hbWV9OiAnJHtzS2V5fScgbXVzdCBiZSAnJFR5cGUnICcke29Db250ZXh0U2V0dGluZ3NbXCIkVHlwZVwiXX0nIGJ1dCBpcyAnJHtcblx0XHRcdFx0XHRcdG9Db250ZXh0T2JqZWN0LiRUeXBlXG5cdFx0XHRcdFx0fSc6ICR7b0NvbnRleHQuZ2V0UGF0aCgpfWBcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlKHNOYW1lOiBhbnksIG9NZXRhZGF0YTogYW55LCBtQ29udGV4dHM6IGFueSwgb05vZGU6IGFueSkge1xuXHRjb25zdCBhTWV0YWRhdGFDb250ZXh0S2V5cyA9IChvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cyAmJiBPYmplY3Qua2V5cyhvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cykpIHx8IFtdLFxuXHRcdGFQcm9wZXJ0aWVzID0gKG9NZXRhZGF0YS5wcm9wZXJ0aWVzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5wcm9wZXJ0aWVzKSkgfHwgW10sXG5cdFx0b0F0dHJpYnV0ZU5hbWVzOiBhbnkgPSB7fTtcblxuXHQvLyBjb2xsZWN0IGFsbCBhdHRyaWJ1dGVzIHRvIGZpbmQgdW5jaGVja2VkIHByb3BlcnRpZXNcblx0T2JqZWN0LmtleXMob05vZGUuYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAoaUtleTogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgc0tleSA9IG9Ob2RlLmF0dHJpYnV0ZXNbaUtleV0ubmFtZTtcblx0XHRvQXR0cmlidXRlTmFtZXNbc0tleV0gPSB0cnVlO1xuXHR9KTtcblxuXHQvL0NoZWNrIG1ldGFkYXRhQ29udGV4dHNcblx0YU1ldGFkYXRhQ29udGV4dEtleXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0Y29uc3Qgb0NvbnRleHRTZXR0aW5ncyA9IG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NLZXldO1xuXG5cdFx0dmFsaWRhdGVNYWNyb01ldGFkYXRhQ29udGV4dChzTmFtZSwgbUNvbnRleHRzLCBvQ29udGV4dFNldHRpbmdzLCBzS2V5KTtcblx0XHRkZWxldGUgb0F0dHJpYnV0ZU5hbWVzW3NLZXldO1xuXHR9KTtcblx0Ly9DaGVjayBwcm9wZXJ0aWVzXG5cdGFQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdGNvbnN0IG9Qcm9wZXJ0eVNldHRpbmdzID0gb01ldGFkYXRhLnByb3BlcnRpZXNbc0tleV07XG5cdFx0aWYgKCFvTm9kZS5oYXNBdHRyaWJ1dGUoc0tleSkpIHtcblx0XHRcdGlmIChvUHJvcGVydHlTZXR0aW5ncy5yZXF1aXJlZCAmJiAhb1Byb3BlcnR5U2V0dGluZ3MuaGFzT3duUHJvcGVydHkoXCJkZWZhdWx0VmFsdWVcIikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKHNOYW1lICsgXCI6IFwiICsgXCJSZXF1aXJlZCBwcm9wZXJ0eSAnXCIgKyBzS2V5ICsgXCInIGlzIG1pc3NpbmdcIik7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlTmFtZXNbc0tleV07XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBVbmNoZWNrZWQgcHJvcGVydGllc1xuXHRPYmplY3Qua2V5cyhvQXR0cmlidXRlTmFtZXMpLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdC8vIG5vIGNoZWNrIGZvciBwcm9wZXJ0aWVzIHdoaWNoIHN0YXJ0IHdpdGggdW5kZXJzY29yZSBcIl9cIiBvciBjb250YWluIGEgY29sb24gXCI6XCIgKGRpZmZlcmVudCBuYW1lc3BhY2UpLCBlLmcuIHhtbG5zOnRyYWNlLCB0cmFjZTptYWNyb0lELCB1bml0dGVzdDppZFxuXHRcdGlmIChzS2V5LmluZGV4T2YoXCI6XCIpIDwgMCAmJiAhc0tleS5zdGFydHNXaXRoKFwieG1sbnNcIikpIHtcblx0XHRcdExvZy53YXJuaW5nKGBVbmNoZWNrZWQgcGFyYW1ldGVyOiAke3NOYW1lfTogJHtzS2V5fWAsIHVuZGVmaW5lZCwgTE9HR0VSX1NDT1BFKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCB0aGUgbWV0YWRhdGEgZm9yIHRoZSBidWlsZGluZyBibG9jayBhcmUgcHJvcGVybHkgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja01ldGFkYXRhIFRoZSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBpbnB1dFxuICogQHBhcmFtIGlzT3BlbiBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyBvcGVuIG9yIG5vdFxuICogQHJldHVybnMgQSBzZXQgb2YgY29tcGxldGVkIG1ldGFkYXRhIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZU1ldGFkYXRhKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YT86IEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSwgaXNPcGVuID0gZmFsc2UpOiBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSB7XG5cdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEpIHtcblx0XHRjb25zdCBvUHJvcGVydGllczogYW55ID0ge307XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9uczogYW55ID0ge1xuXHRcdFx0XCJkZXBlbmRlbnRzXCI6IHtcblx0XHRcdFx0dHlwZTogXCJzYXAudWkuY29yZS5FbGVtZW50XCJcblx0XHRcdH0sXG5cdFx0XHRcImN1c3RvbURhdGFcIjoge1xuXHRcdFx0XHR0eXBlOiBcInNhcC51aS5jb3JlLkVsZW1lbnRcIlxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24+ID0ge307XG5cblx0XHRPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllcykuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRpZiAoYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV0udHlwZSAhPT0gXCJzYXAudWkubW9kZWwuQ29udGV4dFwiKSB7XG5cdFx0XHRcdG9Qcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvTWV0YWRhdGFDb250ZXh0c1tzUHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdC8vIE1lcmdlIGV2ZW50cyBpbnRvIHByb3BlcnRpZXMgYXMgdGhleSBhcmUgaGFuZGxlZCBpZGVudGljYWxseVxuXHRcdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzRXZlbnROYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0b1Byb3BlcnRpZXNbc0V2ZW50TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzW3NFdmVudE5hbWVdO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChzUHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzUHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc1Byb3BlcnR5TmFtZV07XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHByb3BlcnRpZXM6IG9Qcm9wZXJ0aWVzLFxuXHRcdFx0YWdncmVnYXRpb25zOiBvQWdncmVnYXRpb25zLFxuXHRcdFx0bWV0YWRhdGFDb250ZXh0czogb01ldGFkYXRhQ29udGV4dHMsXG5cdFx0XHRpc09wZW46IGlzT3BlblxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1ldGFkYXRhQ29udGV4dHM6IHt9LFxuXHRcdFx0YWdncmVnYXRpb25zOiB7XG5cdFx0XHRcdFwiZGVwZW5kZW50c1wiOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJzYXAudWkuY29yZS5FbGVtZW50XCJcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJjdXN0b21EYXRhXCI6IHtcblx0XHRcdFx0XHR0eXBlOiBcInNhcC51aS5jb3JlLkVsZW1lbnRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0cHJvcGVydGllczoge30sXG5cdFx0XHRpc09wZW46IGlzT3BlblxuXHRcdH07XG5cdH1cbn1cblxuZnVuY3Rpb24gX2dldE1ldGFkYXRhQ29udGV4dChcblx0b1NldHRpbmdzOiBhbnksXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRiRG9Ob3RSZXNvbHZlOiBib29sZWFuLFxuXHRpc09wZW46IGJvb2xlYW5cbikge1xuXHRsZXQgb01ldGFkYXRhQ29udGV4dDtcblx0aWYgKCFiRG9Ob3RSZXNvbHZlICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSkpIHtcblx0XHRjb25zdCBzQXR0cmlidXRlVmFsdWUgPSBvTm9kZS5nZXRBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpIGFzIHN0cmluZztcblx0XHRsZXQgc01ldGFQYXRoO1xuXHRcdC8vIG9WaXNpdG9yLmdldFJlc3VsdChzQXR0cmlidXRlVmFsdWUsIG9Ob2RlKTtcblx0XHRvTWV0YWRhdGFDb250ZXh0ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0aWYgKCFvTWV0YWRhdGFDb250ZXh0KSB7XG5cdFx0XHRpZiAoc0F0dHJpYnV0ZVZhbHVlLnN0YXJ0c1dpdGgoXCJ1aWQtLVwiKSkge1xuXHRcdFx0XHRjb25zdCBvRGF0YSA9IG15U3RvcmVbc0F0dHJpYnV0ZVZhbHVlXTtcblx0XHRcdFx0Y29uc3Qgc0NvbnRleHRQYXRoID0gXCIvXCIgKyBzQXR0cmlidXRlVmFsdWU7XG5cdFx0XHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShzQ29udGV4dFBhdGgsIG9EYXRhKTtcblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dCA9IHtcblx0XHRcdFx0XHRtb2RlbDogXCJjb252ZXJ0ZXJDb250ZXh0XCIsXG5cdFx0XHRcdFx0cGF0aDogc0NvbnRleHRQYXRoXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2UgaWYgKChzQXR0cmlidXRlTmFtZSA9PT0gXCJtZXRhUGF0aFwiICYmIG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGgpIHx8IHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0aWYgKHNBdHRyaWJ1dGVWYWx1ZSAmJiBzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRcdFx0XHQvLyBhYnNvbHV0ZSBwYXRoIC0gd2UganVzdCB1c2UgdGhpcyBvbmVcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBzQXR0cmlidXRlVmFsdWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGguZ2V0UGF0aCgpO1xuXHRcdFx0XHRcdGlmICghc0NvbnRleHRQYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0XHRcdFx0c0NvbnRleHRQYXRoICs9IFwiL1wiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzTWV0YVBhdGggPSBzQ29udGV4dFBhdGggKyBzQXR0cmlidXRlVmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dCA9IHtcblx0XHRcdFx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRcdFx0XHRwYXRoOiBzTWV0YVBhdGhcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IFwibWV0YU1vZGVsXCIsXG5cdFx0XHRcdFx0cGF0aDogb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXRcblx0XHRcdFx0XHRcdD8gb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXQuZ2V0UGF0aChzQXR0cmlidXRlVmFsdWUpXG5cdFx0XHRcdFx0XHQ6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogc0F0dHJpYnV0ZU5hbWUsXG5cdFx0XHRwYXRoOiBcIlwiXG5cdFx0fTtcblx0fSBlbHNlIGlmIChpc09wZW4pIHtcblx0XHR0cnkge1xuXHRcdFx0aWYgKG9WaXNpdG9yLmdldENvbnRleHQoYCR7c0F0dHJpYnV0ZU5hbWV9PmApKSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0XHRcdHBhdGg6IFwiXCJcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb01ldGFkYXRhQ29udGV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMoXG5cdG9NZXRhZGF0YTogUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG9TZXR0aW5nczogYW55LFxuXHRvTm9kZTogRWxlbWVudCxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdG9WaXNpdG9yOiBJQ2FsbGJhY2ssXG5cdG1Db250ZXh0czogYW55LFxuXHRvTWV0YWRhdGFDb250ZXh0czogYW55XG4pIHtcblx0Y29uc3QgbU1pc3NpbmdDb250ZXh0OiBhbnkgPSB7fTtcblx0Y29uc3Qgb0RlZmluaXRpb25Qcm9wZXJ0aWVzID0gb01ldGFkYXRhLnByb3BlcnRpZXM7XG5cdGNvbnN0IG9EZWZpbml0aW9uQ29udGV4dHMgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cztcblx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuY29udGV4dFBhdGg7XG5cblx0Ly8gUmV0cmlldmUgcHJvcGVydGllcyB2YWx1ZXNcblx0Y29uc3QgYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uUHJvcGVydGllcyk7XG5cdGxldCBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uQ29udGV4dHMpO1xuXHRjb25zdCBwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXHRmb3IgKGxldCBqID0gMDsgaiA8IGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMubGVuZ3RoOyBqKyspIHtcblx0XHRjb25zdCBzS2V5VmFsdWUgPSBhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzW2pdO1xuXHRcdGlmIChvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0ge307IC8vIFRvIGF2b2lkIHZhbGVzIGJlaW5nIHJldXNlZCBhY2Nyb3NzIG1hY3Jvc1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gb0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0XHRpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkgJiYgaXNQdWJsaWMgJiYgIW9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmlzUHVibGljKSB7XG5cdFx0XHRMb2cuZXJyb3IoYFByb3BlcnR5ICR7c0tleVZhbHVlfSB3YXMgaWdub3JlZCBhcyBpdCBpcyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyB1c2FnZWApO1xuXHRcdH0gZWxzZSBpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkpIHtcblx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0QXR0cmlidXRlKG9Ob2RlLCBvTm9kZS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShzS2V5VmFsdWUpIGFzIEF0dHIpO1xuXHRcdFx0Y29uc3QgdlZhbHVlID0gb05vZGUuZ2V0QXR0cmlidXRlKHNLZXlWYWx1ZSk7XG5cdFx0XHRpZiAodlZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9IHZWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Ly8gU29ydCBrZXlzIHRvIGJlIHN1cmUgY29udGV4dFBhdGggaXMgYmVmb3JlIG1ldGFQYXRoICggeWVzIEknbSBkZXNwZXJhdGUgKVxuXHRhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IGFEZWZpbml0aW9uQ29udGV4dHNLZXlzLnNvcnQoZnVuY3Rpb24gKGE6IHN0cmluZywgYjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGEgPiBiID8gMSA6IC0xO1xuXHR9KTtcblx0Zm9yIChjb25zdCBzQXR0cmlidXRlTmFtZSBvZiBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cykge1xuXHRcdGNvbnN0IGJEb05vdFJlc29sdmUgPSBpc1B1YmxpYyAmJiAhb0RlZmluaXRpb25Db250ZXh0c1tzQXR0cmlidXRlTmFtZV0uaXNQdWJsaWMgJiYgb05vZGUuaGFzQXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKTtcblx0XHRjb25zdCBvTWV0YWRhdGFDb250ZXh0ID0gX2dldE1ldGFkYXRhQ29udGV4dChvU2V0dGluZ3MsIG9Ob2RlLCBzQXR0cmlidXRlTmFtZSwgb1Zpc2l0b3IsIGJEb05vdFJlc29sdmUsIG9NZXRhZGF0YS5pc09wZW4pO1xuXHRcdGlmIChvTWV0YWRhdGFDb250ZXh0KSB7XG5cdFx0XHRvTWV0YWRhdGFDb250ZXh0Lm5hbWUgPSBzQXR0cmlidXRlTmFtZTtcblx0XHRcdGFkZFNpbmdsZUNvbnRleHQobUNvbnRleHRzLCBvVmlzaXRvciwgb01ldGFkYXRhQ29udGV4dCwgb01ldGFkYXRhQ29udGV4dHMpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoc0F0dHJpYnV0ZU5hbWUgPT09IFwiZW50aXR5U2V0XCIgJiYgIW9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuaGFzT3duUHJvcGVydHkoc0F0dHJpYnV0ZU5hbWUpKSB8fFxuXHRcdFx0XHQoc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIiAmJiAhb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQXR0cmlidXRlTmFtZSkpXG5cdFx0XHQpIHtcblx0XHRcdFx0b1NldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQXR0cmlidXRlTmFtZV0gPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtTWlzc2luZ0NvbnRleHRbc0F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHsgbU1pc3NpbmdDb250ZXh0LCBwcm9wZXJ0eVZhbHVlczogcHJvcGVydHlWYWx1ZXMgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0NoaWxkcmVuKFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElDYWxsYmFjayxcblx0b01ldGFkYXRhOiBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdHByb3BlcnR5VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pIHtcblx0Y29uc3Qgb0FnZ3JlZ2F0aW9uczogYW55ID0ge307XG5cdGlmIChvTm9kZS5maXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdC8vIElmIHRoZXJlIGFyZSBhZ2dyZWdhdGlvbiB3ZSBuZWVkIHRvIHZpc2l0IHRoZSBjaGlsZE5vZGVzIGZpcnN0IGFuZCBmb3JlbW9zdFxuXHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0Q2hpbGROb2RlcyhvTm9kZSk7XG5cdFx0bGV0IG9GaXJzdEVsZW1lbnRDaGlsZDogRWxlbWVudCB8IG51bGwgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHR3aGlsZSAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBzQ2hpbGROYW1lID0gb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZTtcblx0XHRcdGlmIChcblx0XHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykuaW5kZXhPZihzQ2hpbGROYW1lKSAhPT0gLTEgJiZcblx0XHRcdFx0KCFpc1B1YmxpYyB8fCBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NDaGlsZE5hbWVdLmlzUHVibGljKVxuXHRcdFx0KSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGlvbnNbb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZV0gPSBvRmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHR9IGVsc2UgaWYgKE9iamVjdC5rZXlzKG9NZXRhZGF0YS5wcm9wZXJ0aWVzKS5pbmRleE9mKHNDaGlsZE5hbWUpICE9PSAtMSkge1xuXHRcdFx0XHQvLyBPYmplY3QgVHlwZSBwcm9wZXJ0aWVzXG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NDaGlsZE5hbWVdID0ge307XG5cdFx0XHRcdGZvciAoY29uc3QgYXR0cmlidXRlSW5kZXggb2YgT2JqZWN0LmtleXMob0ZpcnN0RWxlbWVudENoaWxkLmF0dHJpYnV0ZXMpKSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0NoaWxkTmFtZV1bb0ZpcnN0RWxlbWVudENoaWxkLmF0dHJpYnV0ZXNbYXR0cmlidXRlSW5kZXggYXMgYW55XS5sb2NhbE5hbWVdID1cblx0XHRcdFx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZC5hdHRyaWJ1dGVzW2F0dHJpYnV0ZUluZGV4IGFzIGFueV0udmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkID0gb0ZpcnN0RWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9BZ2dyZWdhdGlvbnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NCdWlsZGluZ0Jsb2NrKFxuXHRidWlsZGluZ0JMb2NrRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0RlZmluaXRpb24sXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRpc1B1YmxpYyA9IGZhbHNlXG4pIHtcblx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmZyYWdtZW50IHx8IGAke2J1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm5hbWVzcGFjZX0uJHtidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5uYW1lfWA7XG5cblx0Y29uc3Qgc05hbWUgPSBcInRoaXNcIjtcblxuXHRjb25zdCBtQ29udGV4dHM6IGFueSA9IHt9O1xuXHRjb25zdCBvTWV0YWRhdGFDb250ZXh0czogYW55ID0ge307XG5cdGNvbnN0IG9TZXR0aW5ncyA9IG9WaXNpdG9yLmdldFNldHRpbmdzKCk7XG5cdC8vIFRPRE8gMDAwMSBNb3ZlIHRoaXMgZWxzZXdoZXJlIHRoaXMgaXMgd2VpcmQgOilcblx0aWYgKG9TZXR0aW5ncy5tb2RlbHNbXCJzYXAuZmUuaTE4blwiXSkge1xuXHRcdG9TZXR0aW5ncy5tb2RlbHNbXCJzYXAuZmUuaTE4blwiXVxuXHRcdFx0LmdldFJlc291cmNlQnVuZGxlKClcblx0XHRcdC50aGVuKGZ1bmN0aW9uIChvUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdFx0XHRSZXNvdXJjZU1vZGVsLnNldEFwcGxpY2F0aW9uSTE4bkJ1bmRsZShvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHRMb2cuZXJyb3IoZXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblx0Y29uc3Qgb01ldGFkYXRhID0gcHJlcGFyZU1ldGFkYXRhKGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm1ldGFkYXRhLCBidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5pc09wZW4pO1xuXG5cdC8vSW5qZWN0IHN0b3JhZ2UgZm9yIG1hY3Jvc1xuXHRpZiAoIW9TZXR0aW5nc1tzRnJhZ21lbnROYW1lXSkge1xuXHRcdG9TZXR0aW5nc1tzRnJhZ21lbnROYW1lXSA9IHt9O1xuXHR9XG5cblx0Ly8gRmlyc3Qgb2YgYWxsIHdlIG5lZWQgdG8gdmlzaXQgdGhlIGF0dHJpYnV0ZXNcblx0Y29uc3QgeyBtTWlzc2luZ0NvbnRleHQsIHByb3BlcnR5VmFsdWVzIH0gPSBhd2FpdCBwcm9jZXNzUHJvcGVydGllcyhcblx0XHRvTWV0YWRhdGEsXG5cdFx0b1NldHRpbmdzLFxuXHRcdG9Ob2RlLFxuXHRcdGlzUHVibGljLFxuXHRcdG9WaXNpdG9yLFxuXHRcdG1Db250ZXh0cyxcblx0XHRvTWV0YWRhdGFDb250ZXh0c1xuXHQpO1xuXHRjb25zdCBpbml0aWFsS2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKTtcblx0dHJ5IHtcblx0XHQvLyBBZ2dyZWdhdGlvbiBhbmQgY29tcGxleCB0eXBlIHN1cHBvcnRcblx0XHRjb25zdCBvQWdncmVnYXRpb25zID0gYXdhaXQgcHJvY2Vzc0NoaWxkcmVuKG9Ob2RlLCBvVmlzaXRvciwgb01ldGFkYXRhLCBpc1B1YmxpYywgcHJvcGVydHlWYWx1ZXMpO1xuXHRcdGxldCBvSW5zdGFuY2U6IGFueTtcblx0XHRsZXQgb0NvbnRyb2xDb25maWcgPSB7fTtcblxuXHRcdGlmIChvU2V0dGluZ3MubW9kZWxzLnZpZXdEYXRhKSB7XG5cdFx0XHQvLyBPbmx5IHVzZWQgaW4gdGhlIEZpZWxkIG1hY3JvIGFuZCBldmVuIHRoZW4gbWF5YmUgbm90IHJlYWxseSB1c2VmdWxcblx0XHRcdG9Db250cm9sQ29uZmlnID0gb1NldHRpbmdzLm1vZGVscy52aWV3RGF0YS5nZXRQcm9wZXJ0eShcIi9jb250cm9sQ29uZmlndXJhdGlvblwiKTtcblx0XHR9XG5cdFx0bGV0IHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzID0gcHJvcGVydHlWYWx1ZXM7XG5cdFx0aWYgKGlzVjFNYWNyb0RlZihidWlsZGluZ0JMb2NrRGVmaW5pdGlvbikgJiYgYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uY3JlYXRlKSB7XG5cdFx0XHRwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmNyZWF0ZS5jYWxsKFxuXHRcdFx0XHRidWlsZGluZ0JMb2NrRGVmaW5pdGlvbixcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXMsXG5cdFx0XHRcdG9Db250cm9sQ29uZmlnLFxuXHRcdFx0XHRvU2V0dGluZ3MsXG5cdFx0XHRcdG9BZ2dyZWdhdGlvbnMsXG5cdFx0XHRcdGlzUHVibGljXG5cdFx0XHQpO1xuXHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNNZXRhZGF0YU5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRpZiAob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc01ldGFkYXRhTmFtZV0uY29tcHV0ZWQpIHtcblx0XHRcdFx0XHRtQ29udGV4dHNbc01ldGFkYXRhTmFtZV0gPSBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlc1tzTWV0YWRhdGFOYW1lXTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRPYmplY3Qua2V5cyhtTWlzc2luZ0NvbnRleHQpLmZvckVhY2goZnVuY3Rpb24gKHNDb250ZXh0TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdGlmIChwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpKSB7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NDb250ZXh0TmFtZV0gPSBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlc1tzQ29udGV4dE5hbWVdO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDIpIHtcblx0XHRcdE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvRGF0YSA9IHByb3BlcnR5VmFsdWVzW3Byb3BOYW1lXTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9EYXRhICYmXG5cdFx0XHRcdFx0b0RhdGEuaXNBICYmXG5cdFx0XHRcdFx0b0RhdGEuaXNBKFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIikgJiZcblx0XHRcdFx0XHQhb0RhdGEuZ2V0TW9kZWwoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcE5hbWVdID0gb0RhdGEuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgQnVpbGRpbmdCbG9ja0NsYXNzID0gYnVpbGRpbmdCTG9ja0RlZmluaXRpb24gYXMgdHlwZW9mIEJ1aWxkaW5nQmxvY2tCYXNlO1xuXHRcdFx0b0luc3RhbmNlID0gbmV3IEJ1aWxkaW5nQmxvY2tDbGFzcyhwcm9wZXJ0eVZhbHVlcyAvKiwgb0NvbnRyb2xDb25maWcsIG9TZXR0aW5ncywgb0FnZ3JlZ2F0aW9ucywgaXNQdWJsaWMqLyk7XG5cdFx0fVxuXHRcdGNvbnN0IG9BdHRyaWJ1dGVzTW9kZWw6IEpTT05Nb2RlbCA9IG5ldyBBdHRyaWJ1dGVNb2RlbChvTm9kZSwgcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMsIGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uKTtcblx0XHRtQ29udGV4dHNbc05hbWVdID0gb0F0dHJpYnV0ZXNNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cblx0XHRsZXQgb1ByZXZpb3VzTWFjcm9JbmZvOiBhbnk7XG5cblx0XHQvLyBLZWVwIHRyYWNrXG5cdFx0aWYgKFRyYWNlSW5mby5pc1RyYWNlSW5mb0FjdGl2ZSgpKSB7XG5cdFx0XHRjb25zdCBvVHJhY2VJbmZvID0gVHJhY2VJbmZvLnRyYWNlTWFjcm9DYWxscyhzRnJhZ21lbnROYW1lLCBvTWV0YWRhdGEsIG1Db250ZXh0cywgb05vZGUsIG9WaXNpdG9yKTtcblx0XHRcdGlmIChvVHJhY2VJbmZvKSB7XG5cdFx0XHRcdG9QcmV2aW91c01hY3JvSW5mbyA9IG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl07XG5cdFx0XHRcdG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl0gPSBvVHJhY2VJbmZvLm1hY3JvSW5mbztcblx0XHRcdH1cblx0XHR9XG5cdFx0dmFsaWRhdGVNYWNyb1NpZ25hdHVyZShzRnJhZ21lbnROYW1lLCBvTWV0YWRhdGEsIG1Db250ZXh0cywgb05vZGUpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHRWaXNpdG9yID0gb1Zpc2l0b3Iud2l0aChcblx0XHRcdG1Db250ZXh0cyxcblx0XHRcdGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmlzT3BlbiAhPT0gdW5kZWZpbmVkID8gIWJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmlzT3BlbiA6IHRydWVcblx0XHQpO1xuXHRcdGNvbnN0IG9QYXJlbnQgPSBvTm9kZS5wYXJlbnROb2RlO1xuXG5cdFx0bGV0IGlDaGlsZEluZGV4OiBudW1iZXI7XG5cdFx0bGV0IG9Qcm9taXNlO1xuXHRcdGlmIChvUGFyZW50KSB7XG5cdFx0XHRpQ2hpbGRJbmRleCA9IEFycmF5LmZyb20ob1BhcmVudC5jaGlsZHJlbikuaW5kZXhPZihvTm9kZSk7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0KGlzVjFNYWNyb0RlZihidWlsZGluZ0JMb2NrRGVmaW5pdGlvbikgJiYgYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uZ2V0VGVtcGxhdGUpIHx8XG5cdFx0XHRcdGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDJcblx0XHRcdCkge1xuXHRcdFx0XHRsZXQgb1RlbXBsYXRlO1xuXHRcdFx0XHRsZXQgYWRkRGVmYXVsdE5hbWVzcGFjZSA9IGZhbHNlO1xuXHRcdFx0XHRpZiAoYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gMikge1xuXHRcdFx0XHRcdG9UZW1wbGF0ZSA9IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZSgpO1xuXHRcdFx0XHRcdGFkZERlZmF1bHROYW1lc3BhY2UgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmdldFRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0b1RlbXBsYXRlID0gYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uZ2V0VGVtcGxhdGUocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGhhc0Vycm9yID0gXCJcIjtcblx0XHRcdFx0aWYgKG9UZW1wbGF0ZSkge1xuXHRcdFx0XHRcdGlmICghb1RlbXBsYXRlLmZpcnN0RWxlbWVudENoaWxkKSB7XG5cdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvVGVtcGxhdGUsIGFkZERlZmF1bHROYW1lc3BhY2UpO1xuXHRcdFx0XHRcdFx0Ly8gRm9yIHNhZmV0eSBwdXJwb3NlIHdlIHRyeSB0byBkZXRlY3QgdHJhaWxpbmcgdGV4dCBpbiBiZXR3ZWVuIFhNTCBUYWdzXG5cdFx0XHRcdFx0XHRjb25zdCBpdGVyID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKG9UZW1wbGF0ZSwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuXHRcdFx0XHRcdFx0bGV0IHRleHRub2RlID0gaXRlci5uZXh0Tm9kZSgpO1xuXHRcdFx0XHRcdFx0d2hpbGUgKHRleHRub2RlKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0ZXh0bm9kZS50ZXh0Q29udGVudCAmJiB0ZXh0bm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGhhc0Vycm9yID0gdGV4dG5vZGUudGV4dENvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGV4dG5vZGUgPSBpdGVyLm5leHROb2RlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG9UZW1wbGF0ZS5sb2NhbE5hbWUgPT09IFwicGFyc2VyZXJyb3JcIikge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYSBwYXJzZWVycm9yIHdoaWxlIHByb2Nlc3NpbmcgdGhlIFhNTCBpdCBtZWFucyB0aGUgWE1MIGl0c2VsZiBpcyBtYWxmb3JtZWQsIGFzIHN1Y2ggd2UgcmVydW4gdGhlIHRlbXBsYXRlIHByb2Nlc3Ncblx0XHRcdFx0XHRcdC8vIFNldHRpbmcgaXNUcmFjZU1vZGUgdHJ1ZSB3aWxsIG1ha2UgaXQgc28gdGhhdCBlYWNoIHhtbGAgZXhwcmVzc2lvbiBpcyBjaGVja2VkIGZvciB2YWxpZGl0eSBmcm9tIFhNTCBwZXJzcGVjdGl2ZSBhbmQgaWYgYW4gZXJyb3IgaXMgZm91bmQgaXQncyByZXR1cm5lZCBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgZnJhZ21lbnRcblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRpc1RyYWNlTW9kZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZSA9IG9JbnN0YW5jZT8uZ2V0VGVtcGxhdGVcblx0XHRcdFx0XHRcdFx0XHQ/IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZSgpXG5cdFx0XHRcdFx0XHRcdFx0OiAoYnVpbGRpbmdCTG9ja0RlZmluaXRpb24gYXMgYW55KS5nZXRUZW1wbGF0ZShwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyk7XG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKG9UZW1wbGF0ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0XHRpc1RyYWNlTW9kZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaGFzRXJyb3IubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgdHJhaWxpbmcgdGV4dCB3ZSBjcmVhdGUgYSBzdGFuZGFyZCBlcnJvciBhbmQgZGlzcGxheSBpdC5cblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3JUZXh0ID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHRgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm5hbWV9YCxcblx0XHRcdFx0XHRcdFx0XHRgVHJhaWxpbmcgdGV4dCB3YXMgZm91bmQgaW4gdGhlIFhNTDogJHtoYXNFcnJvcn1gXG5cdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZS5vdXRlckhUTUxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvRXJyb3JUZXh0LCB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b05vZGUucmVwbGFjZVdpdGgob1RlbXBsYXRlKTtcblx0XHRcdFx0XHRvTm9kZSA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXHRcdFx0XHRcdG9Qcm9taXNlID0gb0NvbnRleHRWaXNpdG9yLnZpc2l0Tm9kZShvTm9kZSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b05vZGUucmVtb3ZlKCk7XG5cdFx0XHRcdFx0b1Byb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b1Byb21pc2UgPSBvQ29udGV4dFZpc2l0b3IuaW5zZXJ0RnJhZ21lbnQoc0ZyYWdtZW50TmFtZSwgb05vZGUpO1xuXHRcdFx0fVxuXG5cdFx0XHRhd2FpdCBvUHJvbWlzZTtcblx0XHRcdGNvbnN0IG9NYWNyb0VsZW1lbnQgPSBvUGFyZW50LmNoaWxkcmVuW2lDaGlsZEluZGV4XTtcblxuXHRcdFx0aWYgKE9iamVjdC5rZXlzKG9BZ2dyZWdhdGlvbnMpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0T2JqZWN0LmtleXMob0FnZ3JlZ2F0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoc0FnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9uRWxlbWVudCA9IG9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRcdFx0aWYgKG9NYWNyb0VsZW1lbnQgIT09IG51bGwgJiYgb01hY3JvRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob01hY3JvRWxlbWVudC5uYW1lc3BhY2VVUkksIHNBZ2dyZWdhdGlvbk5hbWUpO1xuXHRcdFx0XHRcdFx0bGV0IG9FbGVtZW50Q2hpbGQgPSBvQWdncmVnYXRpb25FbGVtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHRcdFx0d2hpbGUgKG9FbGVtZW50Q2hpbGQpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb05leHRDaGlsZCA9IG9FbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0XHRcdFx0XHRvTmV3Q2hpbGQuYXBwZW5kQ2hpbGQob0VsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0XHRcdG9FbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKHNBZ2dyZWdhdGlvbk5hbWUgIT09IFwiY3VzdG9tRGF0YVwiICYmIHNBZ2dyZWdhdGlvbk5hbWUgIT09IFwiZGVwZW5kZW50c1wiKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNTbG90TmFtZSA9XG5cdFx0XHRcdFx0XHRcdFx0KG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gJiYgb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXS5zbG90KSB8fFxuXHRcdFx0XHRcdFx0XHRcdHNBZ2dyZWdhdGlvbk5hbWU7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRFbGVtZW50ID0gb01hY3JvRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwic2xvdFtuYW1lPSdcIiArIHNTbG90TmFtZSArIFwiJ11cIikgYXMgRWxlbWVudDtcblx0XHRcdFx0XHRcdFx0aWYgKG9UYXJnZXRFbGVtZW50KSB7XG5cdFx0XHRcdFx0XHRcdFx0b1RhcmdldEVsZW1lbnQucmVwbGFjZVdpdGgoLi4uKG9OZXdDaGlsZC5jaGlsZHJlbiBhcyBhbnkpKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b01hY3JvRWxlbWVudC5hcHBlbmRDaGlsZChvTmV3Q2hpbGQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob01hY3JvRWxlbWVudCkge1xuXHRcdFx0XHRjb25zdCBvUmVtYWluaW5nU2xvdHMgPSBvTWFjcm9FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzbG90XCIpO1xuXHRcdFx0XHRvUmVtYWluaW5nU2xvdHMuZm9yRWFjaChmdW5jdGlvbiAob1Nsb3RFbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRvU2xvdEVsZW1lbnQucmVtb3ZlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAob1ByZXZpb3VzTWFjcm9JbmZvKSB7XG5cdFx0XHQvL3Jlc3RvcmUgbWFjcm8gaW5mbyBpZiBhdmFpbGFibGVcblx0XHRcdG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl0gPSBvUHJldmlvdXNNYWNyb0luZm87XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSBvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdO1xuXHRcdH1cblx0fSBjYXRjaCAoZSkge1xuXHRcdC8vIEluIGNhc2UgdGhlcmUgaXMgYSBnZW5lcmljIGVycm9yICh1c3VhbGx5IGNvZGUgZXJyb3IpLCB3ZSByZXRyaWV2ZSB0aGUgY3VycmVudCBjb250ZXh0IGluZm9ybWF0aW9uIGFuZCBjcmVhdGUgYSBkZWRpY2F0ZWQgZXJyb3IgbWVzc2FnZVxuXHRcdGNvbnN0IHRyYWNlRGV0YWlscyA9IHtcblx0XHRcdGluaXRpYWxQcm9wZXJ0aWVzOiB7fSBhcyBhbnksXG5cdFx0XHRyZXNvbHZlZFByb3BlcnRpZXM6IHt9IGFzIGFueSxcblx0XHRcdG1pc3NpbmdDb250ZXh0czogbU1pc3NpbmdDb250ZXh0XG5cdFx0fTtcblx0XHRmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBpbml0aWFsS2V5cykge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRpZiAocHJvcGVydHlWYWx1ZSAmJiBwcm9wZXJ0eVZhbHVlLmlzQSAmJiBwcm9wZXJ0eVZhbHVlLmlzQShcInNhcC51aS5tb2RlbC5Db250ZXh0XCIpKSB7XG5cdFx0XHRcdHRyYWNlRGV0YWlscy5pbml0aWFsUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0XHRcdHBhdGg6IHByb3BlcnR5VmFsdWUuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdHZhbHVlOiBwcm9wZXJ0eVZhbHVlLmdldE9iamVjdCgpXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0cmFjZURldGFpbHMuaW5pdGlhbFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIGluIHByb3BlcnR5VmFsdWVzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmICghaW5pdGlhbEtleXMuaW5jbHVkZXMocHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRpZiAocHJvcGVydHlWYWx1ZSAmJiBwcm9wZXJ0eVZhbHVlLmlzQSAmJiBwcm9wZXJ0eVZhbHVlLmlzQShcInNhcC51aS5tb2RlbC5Db250ZXh0XCIpKSB7XG5cdFx0XHRcdFx0dHJhY2VEZXRhaWxzLnJlc29sdmVkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0XHRcdFx0cGF0aDogcHJvcGVydHlWYWx1ZS5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHR2YWx1ZTogcHJvcGVydHlWYWx1ZS5nZXRPYmplY3QoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dHJhY2VEZXRhaWxzLnJlc29sdmVkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBlcnJvckFueSA9IGUgYXMgYW55O1xuXHRcdExvZy5lcnJvcihlcnJvckFueSwgZXJyb3JBbnkpO1xuXHRcdGNvbnN0IG9FcnJvciA9IGNyZWF0ZUVycm9yWE1MKFxuXHRcdFx0W2BFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7YnVpbGRpbmdCTG9ja0RlZmluaXRpb24ubmFtZX1gLCBlcnJvckFueS5zdGFja10sXG5cdFx0XHRvTm9kZS5vdXRlckhUTUwsXG5cdFx0XHR0cmFjZURldGFpbHNcblx0XHQpO1xuXHRcdGNvbnN0IG9UZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKG9FcnJvciwgdHJ1ZSk7XG5cdFx0b05vZGUucmVwbGFjZVdpdGgob1RlbXBsYXRlIGFzIGFueSk7XG5cdH1cbn1cbmZ1bmN0aW9uIGFkZFNpbmdsZUNvbnRleHQobUNvbnRleHRzOiBhbnksIG9WaXNpdG9yOiBhbnksIG9DdHg6IGFueSwgb01ldGFkYXRhQ29udGV4dHM6IGFueSkge1xuXHRjb25zdCBzS2V5ID0gb0N0eC5uYW1lIHx8IG9DdHgubW9kZWwgfHwgdW5kZWZpbmVkO1xuXG5cdGlmIChvTWV0YWRhdGFDb250ZXh0c1tzS2V5XSkge1xuXHRcdHJldHVybjsgLy8gZG8gbm90IGFkZCB0d2ljZVxuXHR9XG5cdHRyeSB7XG5cdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9DdHgucGF0aDtcblx0XHRpZiAob0N0eC5tb2RlbCAhPSBudWxsKSB7XG5cdFx0XHRzQ29udGV4dFBhdGggPSBvQ3R4Lm1vZGVsICsgXCI+XCIgKyBzQ29udGV4dFBhdGg7XG5cdFx0fVxuXHRcdGNvbnN0IG1TZXR0aW5nID0gb1Zpc2l0b3IuZ2V0U2V0dGluZ3MoKTtcblx0XHRpZiAoIW1TZXR0aW5nLmJpbmRpbmdDb250ZXh0c1tvQ3R4Lm1vZGVsXSAmJiBtU2V0dGluZy5tb2RlbHNbb0N0eC5tb2RlbF0pIHtcblx0XHRcdG1Db250ZXh0c1tzS2V5XSA9IG1TZXR0aW5nLm1vZGVsc1tvQ3R4Lm1vZGVsXS5nZXRDb250ZXh0KG9DdHgucGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBvVmlzaXRvci5nZXRDb250ZXh0KHNDb250ZXh0UGF0aCk7IC8vIGFkZCB0aGUgY29udGV4dCB0byB0aGUgdmlzaXRvclxuXHRcdH1cblxuXHRcdG9NZXRhZGF0YUNvbnRleHRzW3NLZXldID0gbUNvbnRleHRzW3NLZXldOyAvLyBtYWtlIGl0IGF2YWlsYWJsZSBpbnNpZGUgbWV0YWRhdGFDb250ZXh0cyBKU09OIG9iamVjdFxuXHR9IGNhdGNoIChleCkge1xuXHRcdC8vY29uc29sZS5lcnJvcihleCk7XG5cdFx0Ly8gaWdub3JlIHRoZSBjb250ZXh0IGFzIHRoaXMgY2FuIG9ubHkgYmUgdGhlIGNhc2UgaWYgdGhlIG1vZGVsIGlzIG5vdCByZWFkeSwgaS5lLiBub3QgYSBwcmVwcm9jZXNzaW5nIG1vZGVsIGJ1dCBtYXliZSBhIG1vZGVsIGZvclxuXHRcdC8vIHByb3ZpZGluZyBhZnRlcndhcmRzXG5cdFx0Ly8gVE9ETyAwMDAyIG5vdCB5ZXQgaW1wbGVtZW50ZWRcblx0XHQvL21Db250ZXh0c1tcIl8kZXJyb3JcIl0ub01vZGVsLnNldFByb3BlcnR5KFwiL1wiICsgc0tleSwgZXgpO1xuXHR9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uIHRvIGJlIHVzZWQgaW5zaWRlIHRoZSB4bWwgdGVtcGxhdGUgcHJvY2Vzc29yLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiBUaGUgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbik6IHZvaWQge1xuXHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElDYWxsYmFjaykgPT4gcHJvY2Vzc0J1aWxkaW5nQmxvY2soYnVpbGRpbmdCbG9ja0RlZmluaXRpb24sIG9Ob2RlLCBvVmlzaXRvciksXG5cdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZXNwYWNlLFxuXHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnhtbFRhZyB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lXG5cdCk7XG5cdGlmIChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5wdWJsaWNOYW1lc3BhY2UpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0KG9Ob2RlOiBFbGVtZW50LCBvVmlzaXRvcjogSUNhbGxiYWNrKSA9PiBwcm9jZXNzQnVpbGRpbmdCbG9jayhidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiwgb05vZGUsIG9WaXNpdG9yLCB0cnVlKSxcblx0XHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnB1YmxpY05hbWVzcGFjZSxcblx0XHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnhtbFRhZyB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lXG5cdFx0KTtcblx0fVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFcnJvclhNTChlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSwgeG1sRnJhZ21lbnQ6IHN0cmluZywgYWRkaXRpb25hbERhdGE/OiBvYmplY3QpOiBzdHJpbmcge1xuXHRjb25zdCBlcnJvckxhYmVscyA9IGVycm9yTWVzc2FnZXMubWFwKChlcnJvck1lc3NhZ2UpID0+IHhtbGA8bTpMYWJlbCB0ZXh0PVwiJHtlc2NhcGVYTUwoZXJyb3JNZXNzYWdlKX1cIi8+YCk7XG5cdGxldCBhZGRpdGlvbmFsVGV4dCA9IFwiXCI7XG5cdGlmIChhZGRpdGlvbmFsRGF0YSkge1xuXHRcdGFkZGl0aW9uYWxUZXh0ID0geG1sYDxtOlZCb3g+XG5cdFx0XHRcdFx0XHQ8bTpMYWJlbCB0ZXh0PVwiVHJhY2UgSW5mb1wiLz5cblx0XHRcdFx0XHRcdDxjb2RlOkNvZGVFZGl0b3IgdHlwZT1cImpzb25cIiB2YWx1ZT1cIiR7ZXNjYXBlWE1MKEpTT04uc3RyaW5naWZ5KGFkZGl0aW9uYWxEYXRhLCBudWxsLCA0KSl9XCIgaGVpZ2h0PVwiMzAwcHhcIiB3aWR0aD1cIjEwMHZoXCIvPlxuXHRcdFx0XHRcdDwvbTpWQm94PmA7XG5cdH1cblx0cmV0dXJuIHhtbGA8bTpWQm94IHhtbG5zOm09XCJzYXAubVwiIHhtbG5zOmNvZGU9XCJzYXAudWkuY29kZWVkaXRvclwiPlxuXHRcdFx0XHQke2Vycm9yTGFiZWxzfVxuXHRcdFx0XHQ8bTpIQm94PlxuXHRcdFx0XHRcdDxtOlZCb3g+XG5cdFx0XHRcdFx0XHQ8bTpMYWJlbCB0ZXh0PVwiSG93IHRoZSBidWlsZGluZyBibG9jayB3YXMgY2FsbGVkXCIvPlxuXHRcdFx0XHRcdFx0PGNvZGU6Q29kZUVkaXRvciB0eXBlPVwieG1sXCIgdmFsdWU9XCIke2VzY2FwZVhNTCh4bWxGcmFnbWVudCl9XCIgaGVpZ2h0PVwiMzAwcHhcIiB3aWR0aD1cIjEwMHZoXCIvPlxuXHRcdFx0XHRcdDwvbTpWQm94PlxuXHRcdFx0XHRcdCR7YWRkaXRpb25hbFRleHR9XG5cdFx0XHRcdDwvbTpIQm94PlxuXHRcdFx0PC9tOlZCb3g+YDtcbn1cblxuY29uc3QgbXlTdG9yZTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuZnVuY3Rpb24gc3RvcmVWYWx1ZSh2YWx1ZXM6IGFueSkge1xuXHRjb25zdCBwcm9wZXJ0eVVJRCA9IGB1aWQtLSR7dWlkKCl9YDtcblx0bXlTdG9yZVtwcm9wZXJ0eVVJRF0gPSB2YWx1ZXM7XG5cdHJldHVybiBwcm9wZXJ0eVVJRDtcbn1cblxuLyoqXG4gKiBQYXJzZSBhbiBYTUwgc3RyaW5nIGFuZCByZXR1cm4gdGhlIGFzc29jaWF0ZWQgZG9jdW1lbnQuXG4gKlxuICogQHBhcmFtIHhtbFN0cmluZyBUaGUgeG1sIHN0cmluZ1xuICogQHBhcmFtIGFkZERlZmF1bHROYW1lc3BhY2VzIFdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBhZGQgZGVmYXVsdCBuYW1lc3BhY2VcbiAqIEByZXR1cm5zIFRoZSBYTUwgZG9jdW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlWE1MU3RyaW5nKHhtbFN0cmluZzogc3RyaW5nLCBhZGREZWZhdWx0TmFtZXNwYWNlcyA9IGZhbHNlKTogRWxlbWVudCB7XG5cdGlmIChhZGREZWZhdWx0TmFtZXNwYWNlcykge1xuXHRcdHhtbFN0cmluZyA9IGA8dGVtcGxhdGVcblx0XHRcdFx0XHRcdHhtbG5zOnRlbXBsYXRlPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLnRlbXBsYXRlLzFcIlxuXHRcdFx0XHRcdFx0eG1sbnM6bT1cInNhcC5tXCJcblx0XHRcdFx0XHRcdHhtbG5zOmNvcmU9XCJzYXAudWkuY29yZVwiXG5cdFx0XHRcdFx0XHR4bWxuczpjdXN0b21EYXRhPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiPiR7eG1sU3RyaW5nfTwvdGVtcGxhdGU+YDtcblx0fVxuXHRjb25zdCB4bWxEb2N1bWVudCA9IERPTVBhcnNlckluc3RhbmNlLnBhcnNlRnJvbVN0cmluZyh4bWxTdHJpbmcsIFwidGV4dC94bWxcIik7XG5cdGxldCBvdXRwdXQgPSB4bWxEb2N1bWVudC5maXJzdEVsZW1lbnRDaGlsZDtcblx0d2hpbGUgKG91dHB1dD8ubG9jYWxOYW1lID09PSBcInRlbXBsYXRlXCIpIHtcblx0XHRvdXRwdXQgPSBvdXRwdXQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdH1cblx0cmV0dXJuIG91dHB1dCBhcyBFbGVtZW50O1xufVxuXG4vKipcbiAqIEVzY2FwZSBhbiBYTUwgc3RyaW5nIHRvIGluY2x1ZGUgaXQgaW4gYW4gWE1MIGZyYWdtZW50LlxuICpcbiAqIEBwYXJhbSBzdHIgVGhlIHN0cmluZyB0byBlc2NhcGVcbiAqIEByZXR1cm5zIFRoZSBlc2NhcGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlWE1MKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHN0clxuXHRcdC5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIilcblx0XHQucmVwbGFjZSgvPC9nLCBcIiZsdDtcIilcblx0XHQucmVwbGFjZSgvXFxuL2csIFwiJiMxMDtcIilcblx0XHQucmVwbGFjZSgvXFx7L2csIFwiXFxcXHtcIilcblx0XHQucmVwbGFjZSgvPi9nLCBcIiZndDtcIilcblx0XHQucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIilcblx0XHQucmVwbGFjZSgvJy9nLCBcIiZhcG9zO1wiKTtcbn1cblxuLyoqXG4gKiBFc2NhcGUgYW4gWE1MIGF0dHJpYnV0ZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gdmFsIFRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gZXNjYXBlLlxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZSh2YWw6IHN0cmluZyk6IHN0cmluZyB7XG5cdHJldHVybiB2YWwucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbCB3aGlsZSBoYW5kbGluZyBzcGVjaWFsIG9iamVjdCBjYXNlLlxuICpcbiAqIEBwYXJhbSBzdHJpbmdzIFRoZSBzdHJpbmcgcGFydHMgb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBwYXJ0IG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcmV0dXJucyBUaGUgWE1MIHN0cmluZyBkb2N1bWVudCByZXByZXNlbnRpbmcgdGhlIHN0cmluZyB0aGF0IHdhcyB1c2VkLlxuICovXG5leHBvcnQgY29uc3QgeG1sID0gKHN0cmluZ3M6IFRlbXBsYXRlU3RyaW5nc0FycmF5LCAuLi52YWx1ZXM6IGFueVtdKSA9PiB7XG5cdGxldCBvdXRTdHIgPSBcIlwiO1xuXHRsZXQgaTtcblx0Zm9yIChpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuXHRcdG91dFN0ciArPSBzdHJpbmdzW2ldO1xuXHRcdC8vIEhhbmRsZSB0aGUgZGlmZmVyZW50IGNhc2Ugb2Ygb2JqZWN0LCBpZiBpdCdzIGFuIGFycmF5IHdlIGpvaW4gdGhlbSwgaWYgaXQncyBhIGJpbmRpbmcgZXhwcmVzc2lvbiAoZGV0ZXJtaW5lZCBieSBfdHlwZSkgdGhlbiB3ZSBjb21waWxlIGl0LlxuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlc1tpXSkpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZXNbaV0uZmxhdCg1KS5qb2luKFwiXCIpLnRyaW0oKTtcblx0XHR9IGVsc2UgaWYgKHZhbHVlc1tpXT8uX3R5cGUpIHtcblx0XHRcdGNvbnN0IGNvbXBpbGVkRXhwcmVzc2lvbiA9IGNvbXBpbGVCaW5kaW5nKHZhbHVlc1tpXSk7XG5cdFx0XHRvdXRTdHIgKz0gY29tcGlsZWRFeHByZXNzaW9uICE9PSB1bmRlZmluZWQgPyBlc2NhcGVYTUxBdHRyaWJ1dGVWYWx1ZShjb21waWxlZEV4cHJlc3Npb24pIDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAodmFsdWVzW2ldPy5nZXRUZW1wbGF0ZSkge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlc1tpXS5nZXRUZW1wbGF0ZSgpO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlc1tpXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlVSWQgPSBzdG9yZVZhbHVlKHZhbHVlc1tpXSk7XG5cdFx0XHRvdXRTdHIgKz0gYCR7cHJvcGVydHlVSWR9YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlc1tpXTtcblx0XHR9XG5cdH1cblx0b3V0U3RyICs9IHN0cmluZ3NbaV07XG5cdG91dFN0ciA9IG91dFN0ci50cmltKCk7XG5cdGlmIChpc1RyYWNlTW9kZSkge1xuXHRcdGNvbnN0IHhtbFJlc3VsdCA9IHBhcnNlWE1MU3RyaW5nKG91dFN0ciwgdHJ1ZSk7XG5cdFx0aWYgKHhtbFJlc3VsdCAmJiB4bWxSZXN1bHQ/LmxvY2FsTmFtZSA9PT0gXCJwYXJzZXJlcnJvclwiKSB7XG5cdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoeG1sUmVzdWx0IGFzIGFueSkuaW5uZXJUZXh0IHx8ICh4bWxSZXN1bHQgYXMgYW55KS5pbm5lckhUTUw7XG5cdFx0XHRyZXR1cm4gY3JlYXRlRXJyb3JYTUwoW2Vycm9yTWVzc2FnZS5zcGxpdChcIlxcblwiKVswXV0sIG91dFN0cik7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvdXRTdHI7XG59O1xuIl19
|
|
1314
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0YXJnZXQiLCJib2R5IiwiY2hlY2siLCJpdGVyYXRvciIsInN0ZXAiLCJwYWN0IiwicmVqZWN0IiwiX2N5Y2xlIiwicmVzdWx0IiwibmV4dCIsImRvbmUiLCJ2YWx1ZSIsInRoZW4iLCJ2IiwiYmluZCIsImUiLCJyZXR1cm4iLCJfZml4dXAiLCJUeXBlRXJyb3IiLCJ2YWx1ZXMiLCJpIiwibGVuZ3RoIiwicHVzaCIsImFycmF5IiwiU3ltYm9sIiwic3RhdGUiLCJzIiwibyIsIm9ic2VydmVyIiwicHJvdG90eXBlIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwiY2FsbGJhY2siLCJfdGhpcyIsInRoZW5hYmxlIiwidGVzdCIsInVwZGF0ZSIsInN0YWdlIiwic2hvdWxkQ29udGludWUiLCJ1cGRhdGVWYWx1ZSIsIl9yZXN1bWVBZnRlclRlc3QiLCJfcmVzdW1lQWZ0ZXJCb2R5IiwiX3Jlc3VtZUFmdGVyVXBkYXRlIiwicmVjb3ZlciIsInByb2Nlc3NCdWlsZGluZ0Jsb2NrIiwiYnVpbGRpbmdCbG9ja0RlZmluaXRpb24iLCJvTm9kZSIsIm9WaXNpdG9yIiwiaXNQdWJsaWMiLCJzRnJhZ21lbnROYW1lIiwiZnJhZ21lbnQiLCJuYW1lc3BhY2UiLCJuYW1lIiwic05hbWUiLCJtQ29udGV4dHMiLCJvTWV0YWRhdGFDb250ZXh0cyIsIm9TZXR0aW5ncyIsImdldFNldHRpbmdzIiwibW9kZWxzIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJvUmVzb3VyY2VCdW5kbGUiLCJSZXNvdXJjZU1vZGVsIiwic2V0QXBwbGljYXRpb25JMThuQnVuZGxlIiwiY2F0Y2giLCJlcnJvciIsIkxvZyIsIm9NZXRhZGF0YSIsInByZXBhcmVNZXRhZGF0YSIsIm1ldGFkYXRhIiwiaXNPcGVuIiwicHJvY2Vzc1Byb3BlcnRpZXMiLCJhcGlWZXJzaW9uIiwibU1pc3NpbmdDb250ZXh0IiwicHJvcGVydHlWYWx1ZXMiLCJpbml0aWFsS2V5cyIsIk9iamVjdCIsImtleXMiLCJwcm9jZXNzQ2hpbGRyZW4iLCJvQWdncmVnYXRpb25zIiwib1ByZXZpb3VzTWFjcm9JbmZvIiwib0luc3RhbmNlIiwib0NvbnRyb2xDb25maWciLCJ2aWV3RGF0YSIsImdldFByb3BlcnR5IiwicHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMiLCJpc1YxTWFjcm9EZWYiLCJjcmVhdGUiLCJjYWxsIiwibWV0YWRhdGFDb250ZXh0cyIsImZvckVhY2giLCJzTWV0YWRhdGFOYW1lIiwiY29tcHV0ZWQiLCJzQ29udGV4dE5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsInByb3BOYW1lIiwib0RhdGEiLCJpc0EiLCJTQVBfVUlfTU9ERUxfQ09OVEVYVCIsImdldE1vZGVsIiwiZ2V0T2JqZWN0IiwiQnVpbGRpbmdCbG9ja0NsYXNzIiwiZ2V0UHJvcGVydGllcyIsInRhcmdldE9iamVjdCIsInNBdHRyaWJ1dGVWYWx1ZSIsInN0b3JlVmFsdWUiLCJzQ29udGV4dFBhdGgiLCJjb252ZXJ0ZXJDb250ZXh0Iiwic2V0UHJvcGVydHkiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIm15U3RvcmUiLCJ1bmRlZmluZWQiLCJvQXR0cmlidXRlc01vZGVsIiwiQXR0cmlidXRlTW9kZWwiLCJUcmFjZUluZm8iLCJpc1RyYWNlSW5mb0FjdGl2ZSIsIm9UcmFjZUluZm8iLCJ0cmFjZU1hY3JvQ2FsbHMiLCJtYWNyb0luZm8iLCJ2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlIiwib0NvbnRleHRWaXNpdG9yIiwid2l0aCIsIm9QYXJlbnQiLCJwYXJlbnROb2RlIiwiaUNoaWxkSW5kZXgiLCJvUHJvbWlzZSIsInByb2Nlc3NDdXN0b21EYXRhIiwiQXJyYXkiLCJmcm9tIiwiY2hpbGRyZW4iLCJpbmRleE9mIiwiZ2V0VGVtcGxhdGUiLCJvVGVtcGxhdGUiLCJhZGREZWZhdWx0TmFtZXNwYWNlIiwiaXNSdW50aW1lIiwibXlTdG9yZUtleSIsImhhc0Vycm9yIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJwYXJzZVhNTFN0cmluZyIsIml0ZXIiLCJkb2N1bWVudCIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIk5vZGVGaWx0ZXIiLCJTSE9XX1RFWFQiLCJ0ZXh0bm9kZSIsIm5leHROb2RlIiwidGV4dENvbnRlbnQiLCJ0cmltIiwibG9jYWxOYW1lIiwiaXNUcmFjZU1vZGUiLCJvRXJyb3JUZXh0IiwiY3JlYXRlRXJyb3JYTUwiLCJvdXRlckhUTUwiLCJyZXBsYWNlV2l0aCIsInByb2Nlc3NTbG90cyIsImFnZ3JlZ2F0aW9ucyIsInZpc2l0Tm9kZSIsInJlbW92ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiaW5zZXJ0RnJhZ21lbnQiLCJvTWFjcm9FbGVtZW50Iiwib1JlbWFpbmluZ1Nsb3RzIiwicXVlcnlTZWxlY3RvckFsbCIsIm9TbG90RWxlbWVudCIsInRyYWNlRGV0YWlscyIsImluaXRpYWxQcm9wZXJ0aWVzIiwicmVzb2x2ZWRQcm9wZXJ0aWVzIiwibWlzc2luZ0NvbnRleHRzIiwicHJvcGVydHlOYW1lIiwicHJvcGVydHlWYWx1ZSIsInBhdGgiLCJnZXRQYXRoIiwiaW5jbHVkZXMiLCJlcnJvckFueSIsIm9FcnJvciIsInN0YWNrIiwib0ZpcnN0RWxlbWVudENoaWxkIiwib05leHRDaGlsZCIsIm5leHRFbGVtZW50U2libGluZyIsInNDaGlsZE5hbWUiLCJzQWdncmVnYXRpb25OYW1lIiwidG9VcHBlckNhc2UiLCJkZWZhdWx0QWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbkRlZmluaXRpb24iLCJzbG90IiwiY2hpbGREZWZpbml0aW9uIiwib05ld0NoaWxkIiwiY3JlYXRlRWxlbWVudE5TIiwibmFtZXNwYWNlVVJJIiwiZ2V0QXR0cmlidXRlIiwibmV4dENoaWxkIiwiYXBwZW5kQ2hpbGQiLCJyZW1vdmVBdHRyaWJ1dGUiLCJwcm9wZXJ0aWVzIiwiYXR0cmlidXRlcyIsImF0dHJpYnV0ZUluZGV4IiwicGFyc2VkQWdncmVnYXRpb24iLCJwYXJzZUFnZ3JlZ2F0aW9uIiwicGFyc2VkQWdncmVnYXRpb25LZXkiLCJ2aXNpdENoaWxkTm9kZXMiLCJhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyIsInNvcnQiLCJhIiwiYiIsInNBdHRyaWJ1dGVOYW1lIiwiYkRvTm90UmVzb2x2ZSIsIm9EZWZpbml0aW9uQ29udGV4dHMiLCJoYXNBdHRyaWJ1dGUiLCJvTWV0YWRhdGFDb250ZXh0IiwiX2dldE1ldGFkYXRhQ29udGV4dCIsImFkZFNpbmdsZUNvbnRleHQiLCJiaW5kaW5nQ29udGV4dHMiLCJjdXJyZW50Q29udGV4dFBhdGgiLCJvRGVmaW5pdGlvblByb3BlcnRpZXMiLCJjb250ZXh0UGF0aCIsImFEZWZpbml0aW9uUHJvcGVydGllc0tleXMiLCJzS2V5VmFsdWUiLCJ0eXBlIiwiZGVmYXVsdFZhbHVlIiwidmlzaXRBdHRyaWJ1dGUiLCJnZXROYW1lZEl0ZW0iLCJ2VmFsdWUiLCJMT0dHRVJfU0NPUEUiLCJET01QYXJzZXJJbnN0YW5jZSIsIkRPTVBhcnNlciIsInZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQiLCJvQ29udGV4dFNldHRpbmdzIiwic0tleSIsIm9Db250ZXh0Iiwib0NvbnRleHRPYmplY3QiLCJyZXF1aXJlZCIsIkVycm9yIiwiJGtpbmQiLCIkVHlwZSIsImFNZXRhZGF0YUNvbnRleHRLZXlzIiwiYVByb3BlcnRpZXMiLCJvQXR0cmlidXRlTmFtZXMiLCJpS2V5Iiwib1Byb3BlcnR5U2V0dGluZ3MiLCJzdGFydHNXaXRoIiwid2FybmluZyIsIlNBUF9VSV9DT1JFX0VMRU1FTlQiLCJidWlsZGluZ0Jsb2NrTWV0YWRhdGEiLCJvUHJvcGVydGllcyIsImZvdW5kRGVmYXVsdEFnZ3JlZ2F0aW9uIiwic1Byb3BlcnR5TmFtZSIsImV2ZW50cyIsInNFdmVudE5hbWUiLCJpc0RlZmF1bHQiLCJzTWV0YVBhdGgiLCJCaW5kaW5nUGFyc2VyIiwiY29tcGxleFBhcnNlciIsIm1vZGVsIiwiZW5kc1dpdGgiLCJlbnRpdHlTZXQiLCJnZXRDb250ZXh0Iiwib0FnZ3JlZ2F0aW9uIiwib091dE9iamVjdHMiLCJjaGlsZElkeCIsImNoaWxkS2V5Iiwic2V0QXR0cmlidXRlIiwia2V5IiwicG9zaXRpb24iLCJwbGFjZW1lbnQiLCJhbmNob3IiLCJvTWV0YWRhdGFBZ2dyZWdhdGlvbnMiLCJvQWdncmVnYXRpb25FbGVtZW50Iiwib0VsZW1lbnRDaGlsZCIsInNTbG90TmFtZSIsIm9UYXJnZXRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsIm9DdHgiLCJtU2V0dGluZyIsImV4IiwicmVnaXN0ZXJCdWlsZGluZ0Jsb2NrIiwiWE1MUHJlcHJvY2Vzc29yIiwicGx1Z0luIiwieG1sVGFnIiwicHVibGljTmFtZXNwYWNlIiwiZXJyb3JNZXNzYWdlcyIsInhtbEZyYWdtZW50IiwiYWRkaXRpb25hbERhdGEiLCJlcnJvckxhYmVscyIsIm1hcCIsImVycm9yTWVzc2FnZSIsInhtbCIsImVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlIiwiZXJyb3JTdGFjayIsInN0YWNrRm9ybWF0dGVkIiwiYnRvYSIsImFkZGl0aW9uYWxUZXh0IiwiSlNPTiIsInN0cmluZ2lmeSIsInJlcGxhY2VBbGwiLCJwcm9wZXJ0eVVJRCIsInVpZCIsInhtbFN0cmluZyIsImFkZERlZmF1bHROYW1lc3BhY2VzIiwieG1sRG9jdW1lbnQiLCJwYXJzZUZyb21TdHJpbmciLCJvdXRwdXQiLCJ2YWwiLCJyZXBsYWNlIiwicmVuZGVySW5UcmFjZU1vZGUiLCJvdXRTdHIiLCJ4bWxSZXN1bHQiLCJpbm5lclRleHQiLCJpbm5lckhUTUwiLCJzcGxpdCIsInN0cmluZ3MiLCJpc0FycmF5IiwiZmxhdCIsImpvaW4iLCJfdHlwZSIsImNvbXBpbGVkRXhwcmVzc2lvbiIsImNvbXBpbGVFeHByZXNzaW9uIiwicHJvcGVydHlVSWQiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkJ1aWxkaW5nQmxvY2tSdW50aW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHVpZCBmcm9tIFwic2FwL2Jhc2UvdXRpbC91aWRcIjtcbmltcG9ydCBBdHRyaWJ1dGVNb2RlbCBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvQXR0cmlidXRlTW9kZWxcIjtcbmltcG9ydCB0eXBlIHtcblx0QnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbixcblx0QnVpbGRpbmdCbG9ja0Jhc2UsXG5cdEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvblYxLFxuXHRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uXG59IGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9CdWlsZGluZ0Jsb2NrXCI7XG5pbXBvcnQgeyBjb21waWxlRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0JpbmRpbmdUb29sa2l0XCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL2ZlL21hY3Jvcy9SZXNvdXJjZU1vZGVsXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IFRyYWNlSW5mbyBmcm9tIFwiLi9UcmFjZUluZm9cIjtcblxuY29uc3QgTE9HR0VSX1NDT1BFID0gXCJzYXAuZmUuY29yZS5idWlsZGluZ0Jsb2Nrcy5CdWlsZGluZ0Jsb2NrUnVudGltZVwiO1xuY29uc3QgRE9NUGFyc2VySW5zdGFuY2UgPSBuZXcgRE9NUGFyc2VyKCk7XG5sZXQgaXNUcmFjZU1vZGUgPSBmYWxzZTtcblxudHlwZSBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSA9IHtcblx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbj47XG5cdGFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbj47XG5cdG1ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uPjtcblx0aXNPcGVuOiBib29sZWFuO1xuXHRkZWZhdWx0QWdncmVnYXRpb24/OiBzdHJpbmc7XG59O1xuXG50eXBlIElDYWxsYmFjayA9IHtcblx0Z2V0U2V0dGluZ3MoKTogYW55O1xuXHQvKipcblx0ICogVmlzaXRzIHRoZSBnaXZlbiBub2RlIGFuZCBlaXRoZXIgcHJvY2Vzc2VzIGEgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24sIGNhbGxzXG5cdCAqIGEgdmlzaXRvciwgb3Igc2ltcGx5IGNhbGxzIGJvdGgge0BsaW5rXG5cdCAqIHNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yLklDYWxsYmFjay52aXNpdEF0dHJpYnV0ZXMgdmlzaXRBdHRyaWJ1dGVzfVxuXHQgKiBhbmQge0BsaW5rIHNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yLklDYWxsYmFjay52aXNpdENoaWxkTm9kZXNcblx0ICogdmlzaXRDaGlsZE5vZGVzfS5cblx0ICpcblx0ICogQHBhcmFtIHtOb2RlfSBvTm9kZVxuXHQgKiAgIFRoZSBYTUwgRE9NIG5vZGVcblx0ICogQHJldHVybnMge3NhcC51aS5iYXNlLlN5bmNQcm9taXNlfVxuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGFzIHNvb24gYXMgdmlzaXRpbmdcblx0ICogICBpcyBkb25lLCBvciBpcyByZWplY3RlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBlcnJvciBpZiB2aXNpdGluZyBmYWlsc1xuXHQgKi9cblx0dmlzaXROb2RlKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogSW5zZXJ0cyB0aGUgZnJhZ21lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiBwbGFjZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4gTG9hZHMgdGhlXG5cdCAqIGZyYWdtZW50LCB0YWtlcyBjYXJlIG9mIGNhY2hpbmcgKGZvciB0aGUgY3VycmVudCBwcmUtcHJvY2Vzc29yIHJ1bikgYW5kIHZpc2l0cyB0aGVcblx0ICogZnJhZ21lbnQncyBjb250ZW50IG9uY2UgaXQgaGFzIGJlZW4gaW1wb3J0ZWQgaW50byB0aGUgZWxlbWVudCdzIG93bmVyIGRvY3VtZW50IGFuZFxuXHQgKiBwdXQgaW50byBwbGFjZS4gTG9hZGluZyBvZiBmcmFnbWVudHMgaXMgYXN5bmNocm9ub3VzIGlmIHRoZSB0ZW1wbGF0ZSB2aWV3IGlzXG5cdCAqIGFzeW5jaHJvbm91cy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNGcmFnbWVudE5hbWVcblx0ICogICB0aGUgZnJhZ21lbnQncyByZXNvbHZlZCBuYW1lXG5cdCAqIEBwYXJhbSB7RWxlbWVudH0gb0VsZW1lbnRcblx0ICogICB0aGUgWE1MIERPTSBlbGVtZW50LCBlLmcuIDxzYXAudWkuY29yZTpGcmFnbWVudD4gb3IgPGNvcmU6RXh0ZW5zaW9uUG9pbnQ+XG5cdCAqIEBwYXJhbSB7c2FwLnVpLmNvcmUudXRpbC5fd2l0aH0gb1dpdGhDb250cm9sXG5cdCAqICAgdGhlIHBhcmVudCdzIFwid2l0aFwiIGNvbnRyb2xcblx0ICogQHJldHVybnMge3NhcC51aS5iYXNlLlN5bmNQcm9taXNlfVxuXHQgKiBBIHN5bmMgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB0aGUgZnJhZ21lbnRcblx0ICogICBoYXMgYmVlbiBpbnNlcnRlZCwgb3IgaXMgcmVqZWN0ZWQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgZXJyb3IgaWYgbG9hZGluZyBvciB2aXNpdGluZ1xuXHQgKiAgIGZhaWxzLlxuXHQgKi9cblx0aW5zZXJ0RnJhZ21lbnQoc0ZyYWdtZW50OiBzdHJpbmcsIG9FbGVtZW50OiBFbGVtZW50LCBvV2l0aD86IGFueSk6IFByb21pc2U8dm9pZD47XG5cdHZpc2l0QXR0cmlidXRlKG9Ob2RlOiBFbGVtZW50LCBvQXR0cmlidXRlOiBBdHRyKTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRDaGlsZE5vZGVzKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEludGVycHJldHMgdGhlIGdpdmVuIFhNTCBET00gYXR0cmlidXRlIHZhbHVlIGFzIGEgYmluZGluZyBhbmQgcmV0dXJucyB0aGVcblx0ICogcmVzdWx0aW5nIHZhbHVlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1ZhbHVlXG5cdCAqICAgQW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWVcblx0ICogQHBhcmFtIHtFbGVtZW50fSBbb0VsZW1lbnRdXG5cdCAqICAgVGhlIFhNTCBET00gZWxlbWVudCB0aGUgYXR0cmlidXRlIHZhbHVlIGJlbG9uZ3MgdG8gKG5lZWRlZCBvbmx5IGZvclxuXHQgKiAgIHdhcm5pbmdzIHdoaWNoIGFyZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUpXG5cdCAqIEByZXR1cm5zIHtzYXAudWkuYmFzZS5TeW5jUHJvbWlzZXxudWxsfVxuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0aW5nIHZhbHVlLCBvciBpcyByZWplY3RlZCB3aXRoIGFcblx0ICogICBjb3JyZXNwb25kaW5nIGVycm9yIChmb3IgZXhhbXBsZSwgYW4gZXJyb3IgdGhyb3duIGJ5IGEgZm9ybWF0dGVyKSBvclxuXHQgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2UgdGhlIGJpbmRpbmcgaXMgbm90IHJlYWR5IChiZWNhdXNlIGl0IHJlZmVycyB0byBhXG5cdCAqICAgbW9kZWwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSkgKHNpbmNlIDEuNTcuMClcblx0ICovXG5cdGdldFJlc3VsdChzVmFsdWU6IHN0cmluZywgZWxlbWVudD86IEVsZW1lbnQpOiBQcm9taXNlPGFueT4gfCBudWxsO1xuXHRnZXRDb250ZXh0KHNQYXRoOiBzdHJpbmcpOiBDb250ZXh0O1xuXHQvKipcblx0ICogUmV0dXJucyBhIGNhbGxiYWNrIGludGVyZmFjZSBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIG1hcCBvZiB2YXJpYWJsZXMgd2hpY2hcblx0ICogb3ZlcnJpZGUgY3VycmVudGx5IGtub3duIHZhcmlhYmxlcyBvZiB0aGUgc2FtZSBuYW1lIGluIDxjb2RlPnRoaXM8L2NvZGU+XG5cdCAqIHBhcmVudCBpbnRlcmZhY2Ugb3IgcmVwbGFjZSB0aGVtIGFsdG9nZXRoZXIuIEVhY2ggdmFyaWFibGUgbmFtZSBiZWNvbWVzIGFcblx0ICogbmFtZWQgbW9kZWwgd2l0aCBhIGNvcnJlc3BvbmRpbmcgb2JqZWN0IGJpbmRpbmcgYW5kIGNhbiBiZSB1c2VkIGluc2lkZSB0aGVcblx0ICogWE1MIHRlbXBsYXRlIGluIHRoZSB1c3VhbCB3YXksIHRoYXQgaXMsIHdpdGggYSBiaW5kaW5nIGV4cHJlc3Npb24gbGlrZVxuXHQgKiA8Y29kZT5cInt2YXI+c29tZS9yZWxhdGl2ZS9wYXRofVwiPC9jb2RlPiAoc2VlIGV4YW1wbGUpLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW21WYXJpYWJsZXM9e31dXG5cdCAqICAgTWFwIGZyb20gdmFyaWFibGUgbmFtZSAoc3RyaW5nKSB0byB2YWx1ZSAoe0BsaW5rIHNhcC51aS5tb2RlbC5Db250ZXh0fSlcblx0ICogQHBhcmFtIHtib29sZWFufSBbYlJlcGxhY2VdXG5cdCAqICAgV2hldGhlciBvbmx5IHRoZSBnaXZlbiB2YXJpYWJsZXMgYXJlIGtub3duIGluIHRoZSBuZXcgY2FsbGJhY2sgaW50ZXJmYWNlXG5cdCAqICAgaW5zdGFuY2UsIG5vIGluaGVyaXRlZCBvbmVzXG5cdCAqIEByZXR1cm5zIHtzYXAudWkuY29yZS51dGlsLlhNTFByZXByb2Nlc3Nvci5JQ2FsbGJhY2t9XG5cdCAqICAgQSBjYWxsYmFjayBpbnRlcmZhY2UgaW5zdGFuY2Vcblx0ICogQHBhcmFtIG1WYXJpYWJsZXNcblx0ICogQHBhcmFtIGJSZXBsYWNlXG5cdCAqL1xuXHRcIndpdGhcIihtVmFyaWFibGVzPzogYW55LCBiUmVwbGFjZT86IGJvb2xlYW4pOiBJQ2FsbGJhY2s7XG59O1xuXG4vKipcbiAqIFR5cGVndWFyZCBmb3IgY2hlY2tpbmcgaWYgYSBidWlsZGluZyBibG9jayB1c2UgQVBJIDEuXG4gKlxuICogQHBhcmFtIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIHVzaW5nIEFQSSAxLlxuICovXG5mdW5jdGlvbiBpc1YxTWFjcm9EZWYoYnVpbGRpbmdCbG9ja0RlZmluaXRpb246IEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKTogYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gaXMgQnVpbGRpbmdCbG9ja0RlZmluaXRpb25WMSB7XG5cdHJldHVybiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSB1bmRlZmluZWQgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gMTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQoXG5cdHNOYW1lOiBzdHJpbmcsXG5cdG1Db250ZXh0czogYW55LFxuXHRvQ29udGV4dFNldHRpbmdzOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbixcblx0c0tleTogc3RyaW5nXG4pIHtcblx0Y29uc3Qgb0NvbnRleHQgPSBtQ29udGV4dHNbc0tleV07XG5cdGNvbnN0IG9Db250ZXh0T2JqZWN0ID0gb0NvbnRleHQ/LmdldE9iamVjdCgpO1xuXG5cdGlmIChvQ29udGV4dFNldHRpbmdzLnJlcXVpcmVkICYmICghb0NvbnRleHQgfHwgb0NvbnRleHRPYmplY3QgPT09IG51bGwpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGAke3NOYW1lfTogUmVxdWlyZWQgbWV0YWRhdGFDb250ZXh0ICcke3NLZXl9JyBpcyBtaXNzaW5nYCk7XG5cdH0gZWxzZSBpZiAob0NvbnRleHRPYmplY3QpIHtcblx0XHQvLyBJZiBjb250ZXh0IG9iamVjdCBoYXMgJGtpbmQgcHJvcGVydHksICRUeXBlIHNob3VsZCBub3QgYmUgY2hlY2tlZFxuXHRcdC8vIFRoZXJlZm9yZSByZW1vdmUgZnJvbSBjb250ZXh0IHNldHRpbmdzXG5cdFx0aWYgKG9Db250ZXh0T2JqZWN0Lmhhc093blByb3BlcnR5KFwiJGtpbmRcIikgJiYgb0NvbnRleHRTZXR0aW5ncy4ka2luZCkge1xuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlICRraW5kIGlzIHBhcnQgb2YgdGhlIGFsbG93ZWQgb25lc1xuXHRcdFx0aWYgKG9Db250ZXh0U2V0dGluZ3MuJGtpbmQuaW5kZXhPZihvQ29udGV4dE9iamVjdFtcIiRraW5kXCJdKSA9PT0gLTEpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcdGAke3NOYW1lfTogJyR7c0tleX0nIG11c3QgYmUgJyRraW5kJyAnJHtvQ29udGV4dFNldHRpbmdzW1wiJGtpbmRcIl19JyBidXQgaXMgJyR7XG5cdFx0XHRcdFx0XHRvQ29udGV4dE9iamVjdC4ka2luZFxuXHRcdFx0XHRcdH0nOiAke29Db250ZXh0LmdldFBhdGgoKX1gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRUeXBlXCIpICYmIG9Db250ZXh0U2V0dGluZ3MuJFR5cGUpIHtcblx0XHRcdC8vIENoZWNrIG9ubHkgJFR5cGVcblx0XHRcdGlmIChvQ29udGV4dFNldHRpbmdzLiRUeXBlLmluZGV4T2Yob0NvbnRleHRPYmplY3RbXCIkVHlwZVwiXSkgPT09IC0xKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRgJHtzTmFtZX06ICcke3NLZXl9JyBtdXN0IGJlICckVHlwZScgJyR7b0NvbnRleHRTZXR0aW5nc1tcIiRUeXBlXCJdfScgYnV0IGlzICcke1xuXHRcdFx0XHRcdFx0b0NvbnRleHRPYmplY3QuJFR5cGVcblx0XHRcdFx0XHR9JzogJHtvQ29udGV4dC5nZXRQYXRoKCl9YFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWFjcm9TaWduYXR1cmUoc05hbWU6IGFueSwgb01ldGFkYXRhOiBhbnksIG1Db250ZXh0czogYW55LCBvTm9kZTogYW55KSB7XG5cdGNvbnN0IGFNZXRhZGF0YUNvbnRleHRLZXlzID0gKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKSkgfHwgW10sXG5cdFx0YVByb3BlcnRpZXMgPSAob01ldGFkYXRhLnByb3BlcnRpZXMgJiYgT2JqZWN0LmtleXMob01ldGFkYXRhLnByb3BlcnRpZXMpKSB8fCBbXSxcblx0XHRvQXR0cmlidXRlTmFtZXM6IGFueSA9IHt9O1xuXG5cdC8vIGNvbGxlY3QgYWxsIGF0dHJpYnV0ZXMgdG8gZmluZCB1bmNoZWNrZWQgcHJvcGVydGllc1xuXHRPYmplY3Qua2V5cyhvTm9kZS5hdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChpS2V5OiBzdHJpbmcpIHtcblx0XHRjb25zdCBzS2V5ID0gb05vZGUuYXR0cmlidXRlc1tpS2V5XS5uYW1lO1xuXHRcdG9BdHRyaWJ1dGVOYW1lc1tzS2V5XSA9IHRydWU7XG5cdH0pO1xuXG5cdC8vQ2hlY2sgbWV0YWRhdGFDb250ZXh0c1xuXHRhTWV0YWRhdGFDb250ZXh0S2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRjb25zdCBvQ29udGV4dFNldHRpbmdzID0gb01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc0tleV07XG5cblx0XHR2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0KHNOYW1lLCBtQ29udGV4dHMsIG9Db250ZXh0U2V0dGluZ3MsIHNLZXkpO1xuXHRcdGRlbGV0ZSBvQXR0cmlidXRlTmFtZXNbc0tleV07XG5cdH0pO1xuXHQvL0NoZWNrIHByb3BlcnRpZXNcblx0YVByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0Y29uc3Qgb1Byb3BlcnR5U2V0dGluZ3MgPSBvTWV0YWRhdGEucHJvcGVydGllc1tzS2V5XTtcblx0XHRpZiAoIW9Ob2RlLmhhc0F0dHJpYnV0ZShzS2V5KSkge1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eVNldHRpbmdzLnJlcXVpcmVkICYmICFvUHJvcGVydHlTZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRWYWx1ZVwiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYCR7c05hbWV9OiBgICsgYFJlcXVpcmVkIHByb3BlcnR5ICcke3NLZXl9JyBpcyBtaXNzaW5nYCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlTmFtZXNbc0tleV07XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBVbmNoZWNrZWQgcHJvcGVydGllc1xuXHRPYmplY3Qua2V5cyhvQXR0cmlidXRlTmFtZXMpLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdC8vIG5vIGNoZWNrIGZvciBwcm9wZXJ0aWVzIHdoaWNoIHN0YXJ0IHdpdGggdW5kZXJzY29yZSBcIl9cIiBvciBjb250YWluIGEgY29sb24gXCI6XCIgKGRpZmZlcmVudCBuYW1lc3BhY2UpLCBlLmcuIHhtbG5zOnRyYWNlLCB0cmFjZTptYWNyb0lELCB1bml0dGVzdDppZFxuXHRcdGlmIChzS2V5LmluZGV4T2YoXCI6XCIpIDwgMCAmJiAhc0tleS5zdGFydHNXaXRoKFwieG1sbnNcIikpIHtcblx0XHRcdExvZy53YXJuaW5nKGBVbmNoZWNrZWQgcGFyYW1ldGVyOiAke3NOYW1lfTogJHtzS2V5fWAsIHVuZGVmaW5lZCwgTE9HR0VSX1NDT1BFKTtcblx0XHR9XG5cdH0pO1xufVxuXG5jb25zdCBTQVBfVUlfQ09SRV9FTEVNRU5UID0gXCJzYXAudWkuY29yZS5FbGVtZW50XCI7XG5cbmNvbnN0IFNBUF9VSV9NT0RFTF9DT05URVhUID0gXCJzYXAudWkubW9kZWwuQ29udGV4dFwiO1xuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCB0aGUgbWV0YWRhdGEgZm9yIHRoZSBidWlsZGluZyBibG9jayBhcmUgcHJvcGVybHkgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja01ldGFkYXRhIFRoZSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBpbnB1dFxuICogQHBhcmFtIGlzT3BlbiBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyBvcGVuIG9yIG5vdFxuICogQHJldHVybnMgQSBzZXQgb2YgY29tcGxldGVkIG1ldGFkYXRhIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZU1ldGFkYXRhKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YT86IEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSwgaXNPcGVuID0gZmFsc2UpOiBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSB7XG5cdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEpIHtcblx0XHRjb25zdCBvUHJvcGVydGllczogYW55ID0ge307XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9uczogYW55ID0ge1xuXHRcdFx0XCJkZXBlbmRlbnRzXCI6IHtcblx0XHRcdFx0dHlwZTogU0FQX1VJX0NPUkVfRUxFTUVOVFxuXHRcdFx0fSxcblx0XHRcdFwiY3VzdG9tRGF0YVwiOiB7XG5cdFx0XHRcdHR5cGU6IFNBUF9VSV9DT1JFX0VMRU1FTlRcblx0XHRcdH1cblx0XHR9O1xuXHRcdGNvbnN0IG9NZXRhZGF0YUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uPiA9IHt9O1xuXHRcdGxldCBmb3VuZERlZmF1bHRBZ2dyZWdhdGlvbjtcblx0XHRPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllcykuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRpZiAoYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV0udHlwZSAhPT0gU0FQX1VJX01PREVMX0NPTlRFWFQpIHtcblx0XHRcdFx0b1Byb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1tzUHJvcGVydHlOYW1lXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHRzW3NQcm9wZXJ0eU5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV07XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Ly8gTWVyZ2UgZXZlbnRzIGludG8gcHJvcGVydGllcyBhcyB0aGV5IGFyZSBoYW5kbGVkIGlkZW50aWNhbGx5XG5cdFx0aWYgKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5ldmVudHMpIHtcblx0XHRcdE9iamVjdC5rZXlzKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5ldmVudHMpLmZvckVhY2goZnVuY3Rpb24gKHNFdmVudE5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRvUHJvcGVydGllc1tzRXZlbnROYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5ldmVudHNbc0V2ZW50TmFtZV07XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5hZ2dyZWdhdGlvbnMpIHtcblx0XHRcdE9iamVjdC5rZXlzKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5hZ2dyZWdhdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRvQWdncmVnYXRpb25zW3NQcm9wZXJ0eU5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzUHJvcGVydHlOYW1lXTtcblx0XHRcdFx0aWYgKG9BZ2dyZWdhdGlvbnNbc1Byb3BlcnR5TmFtZV0uaXNEZWZhdWx0KSB7XG5cdFx0XHRcdFx0Zm91bmREZWZhdWx0QWdncmVnYXRpb24gPSBzUHJvcGVydHlOYW1lO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHByb3BlcnRpZXM6IG9Qcm9wZXJ0aWVzLFxuXHRcdFx0YWdncmVnYXRpb25zOiBvQWdncmVnYXRpb25zLFxuXHRcdFx0ZGVmYXVsdEFnZ3JlZ2F0aW9uOiBmb3VuZERlZmF1bHRBZ2dyZWdhdGlvbixcblx0XHRcdG1ldGFkYXRhQ29udGV4dHM6IG9NZXRhZGF0YUNvbnRleHRzLFxuXHRcdFx0aXNPcGVuOiBpc09wZW5cblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXRhZGF0YUNvbnRleHRzOiB7fSxcblx0XHRcdGFnZ3JlZ2F0aW9uczoge1xuXHRcdFx0XHRcImRlcGVuZGVudHNcIjoge1xuXHRcdFx0XHRcdHR5cGU6IFNBUF9VSV9DT1JFX0VMRU1FTlRcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJjdXN0b21EYXRhXCI6IHtcblx0XHRcdFx0XHR0eXBlOiBTQVBfVUlfQ09SRV9FTEVNRU5UXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRcdGlzT3BlbjogaXNPcGVuXG5cdFx0fTtcblx0fVxufVxuXG5mdW5jdGlvbiBfZ2V0TWV0YWRhdGFDb250ZXh0KFxuXHRvU2V0dGluZ3M6IGFueSxcblx0b05vZGU6IEVsZW1lbnQsXG5cdHNBdHRyaWJ1dGVOYW1lOiBzdHJpbmcsXG5cdG9WaXNpdG9yOiBJQ2FsbGJhY2ssXG5cdGJEb05vdFJlc29sdmU6IGJvb2xlYW4sXG5cdGlzT3BlbjogYm9vbGVhblxuKSB7XG5cdGxldCBvTWV0YWRhdGFDb250ZXh0O1xuXHRpZiAoIWJEb05vdFJlc29sdmUgJiYgb05vZGUuaGFzQXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdGNvbnN0IHNBdHRyaWJ1dGVWYWx1ZSA9IG9Ob2RlLmdldEF0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSkgYXMgc3RyaW5nO1xuXHRcdGxldCBzTWV0YVBhdGg7XG5cdFx0b01ldGFkYXRhQ29udGV4dCA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihzQXR0cmlidXRlVmFsdWUpO1xuXHRcdGlmICghb01ldGFkYXRhQ29udGV4dCkge1xuXHRcdFx0aWYgKHNBdHRyaWJ1dGVWYWx1ZS5zdGFydHNXaXRoKFwiL3VpZC0tXCIpKSB7XG5cdFx0XHRcdGNvbnN0IG9EYXRhID0gbXlTdG9yZVtzQXR0cmlidXRlVmFsdWVdO1xuXHRcdFx0XHRvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuc2V0UHJvcGVydHkoc0F0dHJpYnV0ZVZhbHVlLCBvRGF0YSk7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IFwiY29udmVydGVyQ29udGV4dFwiLFxuXHRcdFx0XHRcdHBhdGg6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIGlmICgoc0F0dHJpYnV0ZU5hbWUgPT09IFwibWV0YVBhdGhcIiAmJiBvU2V0dGluZ3MuY3VycmVudENvbnRleHRQYXRoKSB8fCBzQXR0cmlidXRlTmFtZSA9PT0gXCJjb250ZXh0UGF0aFwiKSB7XG5cdFx0XHRcdGlmIChzQXR0cmlidXRlVmFsdWUgJiYgc0F0dHJpYnV0ZVZhbHVlLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRcdFx0Ly8gYWJzb2x1dGUgcGF0aCAtIHdlIGp1c3QgdXNlIHRoaXMgb25lXG5cdFx0XHRcdFx0c01ldGFQYXRoID0gc0F0dHJpYnV0ZVZhbHVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGxldCBzQ29udGV4dFBhdGggPSBvU2V0dGluZ3MuY3VycmVudENvbnRleHRQYXRoLmdldFBhdGgoKTtcblx0XHRcdFx0XHRpZiAoIXNDb250ZXh0UGF0aC5lbmRzV2l0aChcIi9cIikpIHtcblx0XHRcdFx0XHRcdHNDb250ZXh0UGF0aCArPSBcIi9cIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gc0NvbnRleHRQYXRoICsgc0F0dHJpYnV0ZVZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IFwibWV0YU1vZGVsXCIsXG5cdFx0XHRcdFx0cGF0aDogc01ldGFQYXRoXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0ge1xuXHRcdFx0XHRcdG1vZGVsOiBcIm1ldGFNb2RlbFwiLFxuXHRcdFx0XHRcdHBhdGg6IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuZW50aXR5U2V0XG5cdFx0XHRcdFx0XHQ/IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuZW50aXR5U2V0LmdldFBhdGgoc0F0dHJpYnV0ZVZhbHVlKVxuXHRcdFx0XHRcdFx0OiBzQXR0cmlidXRlVmFsdWVcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAob1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQXR0cmlidXRlTmFtZSkpIHtcblx0XHRvTWV0YWRhdGFDb250ZXh0ID0ge1xuXHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0cGF0aDogXCJcIlxuXHRcdH07XG5cdH0gZWxzZSBpZiAoaXNPcGVuKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvVmlzaXRvci5nZXRDb250ZXh0KGAke3NBdHRyaWJ1dGVOYW1lfT5gKSkge1xuXHRcdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0ge1xuXHRcdFx0XHRcdG1vZGVsOiBzQXR0cmlidXRlTmFtZSxcblx0XHRcdFx0XHRwYXRoOiBcIlwiXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b01ldGFkYXRhQ29udGV4dCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9NZXRhZGF0YUNvbnRleHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NQcm9wZXJ0aWVzKFxuXHRvTWV0YWRhdGE6IFJlc29sdmVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRvU2V0dGluZ3M6IGFueSxcblx0b05vZGU6IEVsZW1lbnQsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRtQ29udGV4dHM6IGFueSxcblx0b01ldGFkYXRhQ29udGV4dHM6IGFueSxcblx0YXBpVmVyc2lvbj86IG51bWJlclxuKSB7XG5cdGNvbnN0IG1NaXNzaW5nQ29udGV4dDogYW55ID0ge307XG5cdGNvbnN0IG9EZWZpbml0aW9uUHJvcGVydGllcyA9IG9NZXRhZGF0YS5wcm9wZXJ0aWVzO1xuXHRjb25zdCBvRGVmaW5pdGlvbkNvbnRleHRzID0gb01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHM7XG5cdG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGggPSBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmNvbnRleHRQYXRoO1xuXG5cdC8vIFJldHJpZXZlIHByb3BlcnRpZXMgdmFsdWVzXG5cdGNvbnN0IGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMgPSBPYmplY3Qua2V5cyhvRGVmaW5pdGlvblByb3BlcnRpZXMpO1xuXHRsZXQgYURlZmluaXRpb25Db250ZXh0c0tleXMgPSBPYmplY3Qua2V5cyhvRGVmaW5pdGlvbkNvbnRleHRzKTtcblx0Y29uc3QgcHJvcGVydHlWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblx0Zm9yIChjb25zdCBzS2V5VmFsdWUgb2YgYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cykge1xuXHRcdGlmIChvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0ge307IC8vIFRvIGF2b2lkIHZhbHVlcyBiZWluZyByZXVzZWQgYWNjcm9zcyBtYWNyb3Ncblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9IG9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmRlZmF1bHRWYWx1ZTtcblx0XHR9XG5cdFx0aWYgKG9Ob2RlLmhhc0F0dHJpYnV0ZShzS2V5VmFsdWUpICYmIGlzUHVibGljICYmICFvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS5pc1B1YmxpYykge1xuXHRcdFx0TG9nLmVycm9yKGBQcm9wZXJ0eSAke3NLZXlWYWx1ZX0gd2FzIGlnbm9yZWQgYXMgaXQgaXMgbm90IGludGVuZGVkIGZvciBwdWJsaWMgdXNhZ2VgKTtcblx0XHR9IGVsc2UgaWYgKG9Ob2RlLmhhc0F0dHJpYnV0ZShzS2V5VmFsdWUpKSB7XG5cdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdEF0dHJpYnV0ZShvTm9kZSwgb05vZGUuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oc0tleVZhbHVlKSBhcyBBdHRyKTtcblx0XHRcdGxldCB2VmFsdWU6IGFueSA9IG9Ob2RlLmdldEF0dHJpYnV0ZShzS2V5VmFsdWUpO1xuXHRcdFx0aWYgKHZWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmIChhcGlWZXJzaW9uID09PSAyICYmIHR5cGVvZiB2VmFsdWUgPT09IFwic3RyaW5nXCIgJiYgb0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0udHlwZSA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRcdFx0XHR2VmFsdWUgPSB2VmFsdWUgPT09IFwidHJ1ZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NLZXlWYWx1ZV0gPSB2VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdC8vIFNvcnQga2V5cyB0byBiZSBzdXJlIGNvbnRleHRQYXRoIGlzIGJlZm9yZSBtZXRhUGF0aCAoIHllcyBJJ20gZGVzcGVyYXRlIClcblx0YURlZmluaXRpb25Db250ZXh0c0tleXMgPSBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cy5zb3J0KGZ1bmN0aW9uIChhOiBzdHJpbmcsIGI6IHN0cmluZykge1xuXHRcdHJldHVybiBhID4gYiA/IDEgOiAtMTtcblx0fSk7XG5cdGZvciAoY29uc3Qgc0F0dHJpYnV0ZU5hbWUgb2YgYURlZmluaXRpb25Db250ZXh0c0tleXMpIHtcblx0XHRjb25zdCBiRG9Ob3RSZXNvbHZlID0gaXNQdWJsaWMgJiYgIW9EZWZpbml0aW9uQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdLmlzUHVibGljICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSk7XG5cdFx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dCA9IF9nZXRNZXRhZGF0YUNvbnRleHQob1NldHRpbmdzLCBvTm9kZSwgc0F0dHJpYnV0ZU5hbWUsIG9WaXNpdG9yLCBiRG9Ob3RSZXNvbHZlLCBvTWV0YWRhdGEuaXNPcGVuKTtcblx0XHRpZiAob01ldGFkYXRhQ29udGV4dCkge1xuXHRcdFx0b01ldGFkYXRhQ29udGV4dC5uYW1lID0gc0F0dHJpYnV0ZU5hbWU7XG5cdFx0XHRhZGRTaW5nbGVDb250ZXh0KG1Db250ZXh0cywgb1Zpc2l0b3IsIG9NZXRhZGF0YUNvbnRleHQsIG9NZXRhZGF0YUNvbnRleHRzKTtcblx0XHRcdGlmIChcblx0XHRcdFx0KHNBdHRyaWJ1dGVOYW1lID09PSBcImVudGl0eVNldFwiICYmICFvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSkgfHxcblx0XHRcdFx0KHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIgJiYgIW9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuaGFzT3duUHJvcGVydHkoc0F0dHJpYnV0ZU5hbWUpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdID0gbUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdH1cblx0XHRcdGlmIChzQXR0cmlidXRlTmFtZSA9PT0gXCJjb250ZXh0UGF0aFwiKSB7XG5cdFx0XHRcdG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGggPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0cHJvcGVydHlWYWx1ZXNbc0F0dHJpYnV0ZU5hbWVdID0gbUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bU1pc3NpbmdDb250ZXh0W3NBdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7IG1NaXNzaW5nQ29udGV4dCwgcHJvcGVydHlWYWx1ZXM6IHByb3BlcnR5VmFsdWVzIH07XG59XG5mdW5jdGlvbiBwYXJzZUFnZ3JlZ2F0aW9uKG9BZ2dyZWdhdGlvbjogRWxlbWVudCkge1xuXHRjb25zdCBvT3V0T2JqZWN0czogYW55ID0ge307XG5cdGlmIChvQWdncmVnYXRpb24gJiYgb0FnZ3JlZ2F0aW9uLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRjb25zdCBjaGlsZHJlbiA9IG9BZ2dyZWdhdGlvbi5jaGlsZHJlbjtcblx0XHRmb3IgKGxldCBjaGlsZElkeCA9IDA7IGNoaWxkSWR4IDwgY2hpbGRyZW4ubGVuZ3RoOyBjaGlsZElkeCsrKSB7XG5cdFx0XHRjb25zdCBjaGlsZERlZmluaXRpb24gPSBjaGlsZHJlbltjaGlsZElkeF07XG5cdFx0XHRsZXQgY2hpbGRLZXkgPSBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpIHx8IGNoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcblx0XHRcdGlmIChjaGlsZEtleSkge1xuXHRcdFx0XHRjaGlsZEtleSA9IGBJbmxpbmVYTUxfJHtjaGlsZEtleX1gO1xuXHRcdFx0XHRjaGlsZERlZmluaXRpb24uc2V0QXR0cmlidXRlKFwia2V5XCIsIGNoaWxkS2V5KTtcblx0XHRcdFx0b091dE9iamVjdHNbY2hpbGRLZXldID0ge1xuXHRcdFx0XHRcdGtleTogY2hpbGRLZXksXG5cdFx0XHRcdFx0cG9zaXRpb246IHtcblx0XHRcdFx0XHRcdHBsYWNlbWVudDogY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcInBsYWNlbWVudFwiKSxcblx0XHRcdFx0XHRcdGFuY2hvcjogY2hpbGREZWZpbml0aW9uLmdldEF0dHJpYnV0ZShcImFuY2hvclwiKVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dHlwZTogXCJTbG90XCJcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIG9PdXRPYmplY3RzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzQ2hpbGRyZW4oXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRvTWV0YWRhdGE6IFJlc29sdmVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRpc1B1YmxpYzogYm9vbGVhbixcblx0cHJvcGVydHlWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG5cdGFwaVZlcnNpb24/OiBudW1iZXJcbikge1xuXHRjb25zdCBvQWdncmVnYXRpb25zOiBhbnkgPSB7fTtcblx0aWYgKG9Ob2RlLmZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0bGV0IG9GaXJzdEVsZW1lbnRDaGlsZDogRWxlbWVudCB8IG51bGwgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRpZiAoYXBpVmVyc2lvbiA9PT0gMikge1xuXHRcdFx0d2hpbGUgKG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdFx0XHRjb25zdCBzQ2hpbGROYW1lID0gb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZTtcblx0XHRcdFx0bGV0IHNBZ2dyZWdhdGlvbk5hbWUgPSBzQ2hpbGROYW1lO1xuXHRcdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZVswXS50b1VwcGVyQ2FzZSgpID09PSBzQWdncmVnYXRpb25OYW1lWzBdKSB7XG5cdFx0XHRcdFx0Ly8gbm90IGEgc3ViIGFnZ3JlZ2F0aW9uLCBnbyBiYWNrIHRvIGRlZmF1bHQgQWdncmVnYXRpb25cblx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lID0gb01ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbiB8fCBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiA9IG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV07XG5cdFx0XHRcdGlmIChhZ2dyZWdhdGlvbkRlZmluaXRpb24gJiYgIWFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5zbG90KSB7XG5cdFx0XHRcdFx0Y29uc3QgcGFyc2VkQWdncmVnYXRpb24gPSBwYXJzZUFnZ3JlZ2F0aW9uKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSA9IHBhcnNlZEFnZ3JlZ2F0aW9uO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgcGFyc2VkQWdncmVnYXRpb25LZXkgaW4gcGFyc2VkQWdncmVnYXRpb24pIHtcblx0XHRcdFx0XHRcdG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcGFyc2VkQWdncmVnYXRpb25LZXldID0gcGFyc2VkQWdncmVnYXRpb25bcGFyc2VkQWdncmVnYXRpb25LZXldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvRmlyc3RFbGVtZW50Q2hpbGQubmV4dEVsZW1lbnRTaWJsaW5nO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChhcGlWZXJzaW9uICE9PSAyKSB7XG5cdFx0XHQvLyBJZiB0aGVyZSBhcmUgYWdncmVnYXRpb24gd2UgbmVlZCB0byB2aXNpdCB0aGUgY2hpbGROb2RlcyB0byByZXNvbHZlIHRlbXBsYXRpbmcgaW5zdHJ1Y3Rpb25zXG5cdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdENoaWxkTm9kZXMob05vZGUpO1xuXHRcdH1cblx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvTm9kZS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHR3aGlsZSAob0ZpcnN0RWxlbWVudENoaWxkICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBvTmV4dENoaWxkOiBFbGVtZW50IHwgbnVsbCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRjb25zdCBzQ2hpbGROYW1lID0gb0ZpcnN0RWxlbWVudENoaWxkLmxvY2FsTmFtZTtcblx0XHRcdGxldCBzQWdncmVnYXRpb25OYW1lID0gc0NoaWxkTmFtZTtcblx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lWzBdLnRvVXBwZXJDYXNlKCkgPT09IHNBZ2dyZWdhdGlvbk5hbWVbMF0pIHtcblx0XHRcdFx0Ly8gbm90IGEgc3ViIGFnZ3JlZ2F0aW9uLCBnbyBiYWNrIHRvIGRlZmF1bHQgQWdncmVnYXRpb25cblx0XHRcdFx0c0FnZ3JlZ2F0aW9uTmFtZSA9IG9NZXRhZGF0YS5kZWZhdWx0QWdncmVnYXRpb24gfHwgXCJcIjtcblx0XHRcdH1cblx0XHRcdGlmIChcblx0XHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykuaW5kZXhPZihzQWdncmVnYXRpb25OYW1lKSAhPT0gLTEgJiZcblx0XHRcdFx0KCFpc1B1YmxpYyB8fCBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLmlzUHVibGljKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGlmIChhcGlWZXJzaW9uID09PSAyKSB7XG5cdFx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EZWZpbml0aW9uID0gb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXTtcblx0XHRcdFx0XHRpZiAoIWFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5zbG90ICYmIG9GaXJzdEVsZW1lbnRDaGlsZCAmJiBvRmlyc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0XHRsZXQgY2hpbGREZWZpbml0aW9uID0gb0ZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHRcdFx0d2hpbGUgKGNoaWxkRGVmaW5pdGlvbikge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTmV3Q2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMob05vZGUubmFtZXNwYWNlVVJJLCBjaGlsZERlZmluaXRpb24uZ2V0QXR0cmlidXRlKFwia2V5XCIpISk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5leHRDaGlsZCA9IGNoaWxkRGVmaW5pdGlvbi5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRcdFx0XHRcdG9OZXdDaGlsZC5hcHBlbmRDaGlsZChjaGlsZERlZmluaXRpb24pO1xuXHRcdFx0XHRcdFx0XHRvQWdncmVnYXRpb25zW2NoaWxkRGVmaW5pdGlvbi5nZXRBdHRyaWJ1dGUoXCJrZXlcIikhXSA9IG9OZXdDaGlsZDtcblx0XHRcdFx0XHRcdFx0Y2hpbGREZWZpbml0aW9uLnJlbW92ZUF0dHJpYnV0ZShcImtleVwiKTtcblx0XHRcdFx0XHRcdFx0Y2hpbGREZWZpbml0aW9uID0gbmV4dENoaWxkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLnNsb3QpIHtcblx0XHRcdFx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lICE9PSBzQ2hpbGROYW1lKSB7XG5cdFx0XHRcdFx0XHRcdGlmICghb0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvTm9kZS5uYW1lc3BhY2VVUkksIHNBZ2dyZWdhdGlvbk5hbWUpO1xuXHRcdFx0XHRcdFx0XHRcdG9BZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSBvTmV3Q2hpbGQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXS5hcHBlbmRDaGlsZChvRmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSA9IG9GaXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tvRmlyc3RFbGVtZW50Q2hpbGQubG9jYWxOYW1lXSA9IG9GaXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChPYmplY3Qua2V5cyhvTWV0YWRhdGEucHJvcGVydGllcykuaW5kZXhPZihzQWdncmVnYXRpb25OYW1lKSAhPT0gLTEpIHtcblx0XHRcdFx0YXdhaXQgb1Zpc2l0b3IudmlzaXROb2RlKG9GaXJzdEVsZW1lbnRDaGlsZCk7XG5cdFx0XHRcdC8vIE9iamVjdCBUeXBlIHByb3BlcnRpZXNcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0FnZ3JlZ2F0aW9uTmFtZV0gPSB7fTtcblx0XHRcdFx0Zm9yIChjb25zdCBhdHRyaWJ1dGVJbmRleCBvZiBPYmplY3Qua2V5cyhvRmlyc3RFbGVtZW50Q2hpbGQuYXR0cmlidXRlcykpIHtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQWdncmVnYXRpb25OYW1lXVtvRmlyc3RFbGVtZW50Q2hpbGQuYXR0cmlidXRlc1thdHRyaWJ1dGVJbmRleCBhcyBhbnldLmxvY2FsTmFtZV0gPVxuXHRcdFx0XHRcdFx0b0ZpcnN0RWxlbWVudENoaWxkLmF0dHJpYnV0ZXNbYXR0cmlidXRlSW5kZXggYXMgYW55XS52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gb0FnZ3JlZ2F0aW9ucztcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc1Nsb3RzKFxuXHRvQWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuXHRvTWV0YWRhdGFBZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tBZ2dyZWdhdGlvbkRlZmluaXRpb24+LFxuXHRvTm9kZTogRWxlbWVudCxcblx0cHJvY2Vzc0N1c3RvbURhdGE6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG5cdGlmIChPYmplY3Qua2V5cyhvQWdncmVnYXRpb25zKS5sZW5ndGggPiAwKSB7XG5cdFx0T2JqZWN0LmtleXMob0FnZ3JlZ2F0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoc0FnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nKSB7XG5cdFx0XHRjb25zdCBvQWdncmVnYXRpb25FbGVtZW50ID0gb0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXTtcblx0XHRcdGlmIChvTm9kZSAhPT0gbnVsbCAmJiBvTm9kZSAhPT0gdW5kZWZpbmVkICYmIG9BZ2dyZWdhdGlvbkVsZW1lbnQpIHtcblx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG9Ob2RlLm5hbWVzcGFjZVVSSSwgc0FnZ3JlZ2F0aW9uTmFtZSk7XG5cdFx0XHRcdGxldCBvRWxlbWVudENoaWxkID0gb0FnZ3JlZ2F0aW9uRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0d2hpbGUgKG9FbGVtZW50Q2hpbGQpIHtcblx0XHRcdFx0XHRjb25zdCBvTmV4dENoaWxkID0gb0VsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRcdFx0b05ld0NoaWxkLmFwcGVuZENoaWxkKG9FbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdG9FbGVtZW50Q2hpbGQgPSBvTmV4dENoaWxkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lICE9PSBcImN1c3RvbURhdGFcIiAmJiBzQWdncmVnYXRpb25OYW1lICE9PSBcImRlcGVuZGVudHNcIikge1xuXHRcdFx0XHRcdGNvbnN0IHNTbG90TmFtZSA9XG5cdFx0XHRcdFx0XHQob01ldGFkYXRhQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdICYmIG9NZXRhZGF0YUFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXS5zbG90KSB8fCBzQWdncmVnYXRpb25OYW1lO1xuXHRcdFx0XHRcdGNvbnN0IG9UYXJnZXRFbGVtZW50ID0gb05vZGUucXVlcnlTZWxlY3Rvcihgc2xvdFtuYW1lPScke3NTbG90TmFtZX0nXWApIGFzIEVsZW1lbnQ7XG5cdFx0XHRcdFx0aWYgKG9UYXJnZXRFbGVtZW50KSB7XG5cdFx0XHRcdFx0XHRvVGFyZ2V0RWxlbWVudC5yZXBsYWNlV2l0aCguLi4ob05ld0NoaWxkLmNoaWxkcmVuIGFzIGFueSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChwcm9jZXNzQ3VzdG9tRGF0YSAmJiBvTmV3Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9Ob2RlLmFwcGVuZENoaWxkKG9OZXdDaGlsZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzQnVpbGRpbmdCbG9jayhcblx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb246IEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElDYWxsYmFjayxcblx0aXNQdWJsaWMgPSBmYWxzZVxuKSB7XG5cdGNvbnN0IHNGcmFnbWVudE5hbWUgPSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5mcmFnbWVudCB8fCBgJHtidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lc3BhY2V9LiR7YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZX1gO1xuXG5cdGNvbnN0IHNOYW1lID0gXCJ0aGlzXCI7XG5cblx0Y29uc3QgbUNvbnRleHRzOiBhbnkgPSB7fTtcblx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dHM6IGFueSA9IHt9O1xuXHRjb25zdCBvU2V0dGluZ3MgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHQvLyBUT0RPIDAwMDEgTW92ZSB0aGlzIGVsc2V3aGVyZSB0aGlzIGlzIHdlaXJkIDopXG5cdGlmIChvU2V0dGluZ3MubW9kZWxzW1wic2FwLmZlLmkxOG5cIl0pIHtcblx0XHRvU2V0dGluZ3MubW9kZWxzW1wic2FwLmZlLmkxOG5cIl1cblx0XHRcdC5nZXRSZXNvdXJjZUJ1bmRsZSgpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc291cmNlQnVuZGxlOiBhbnkpIHtcblx0XHRcdFx0UmVzb3VyY2VNb2RlbC5zZXRBcHBsaWNhdGlvbkkxOG5CdW5kbGUob1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKGVycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cdGNvbnN0IG9NZXRhZGF0YSA9IHByZXBhcmVNZXRhZGF0YShidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5tZXRhZGF0YSwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNPcGVuKTtcblxuXHQvL0luamVjdCBzdG9yYWdlIGZvciBtYWNyb3Ncblx0aWYgKCFvU2V0dGluZ3Nbc0ZyYWdtZW50TmFtZV0pIHtcblx0XHRvU2V0dGluZ3Nbc0ZyYWdtZW50TmFtZV0gPSB7fTtcblx0fVxuXG5cdC8vIEZpcnN0IG9mIGFsbCB3ZSBuZWVkIHRvIHZpc2l0IHRoZSBhdHRyaWJ1dGVzXG5cdGNvbnN0IHsgbU1pc3NpbmdDb250ZXh0LCBwcm9wZXJ0eVZhbHVlcyB9ID0gYXdhaXQgcHJvY2Vzc1Byb3BlcnRpZXMoXG5cdFx0b01ldGFkYXRhLFxuXHRcdG9TZXR0aW5ncyxcblx0XHRvTm9kZSxcblx0XHRpc1B1YmxpYyxcblx0XHRvVmlzaXRvcixcblx0XHRtQ29udGV4dHMsXG5cdFx0b01ldGFkYXRhQ29udGV4dHMsXG5cdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24uYXBpVmVyc2lvblxuXHQpO1xuXHRjb25zdCBpbml0aWFsS2V5cyA9IE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKTtcblx0dHJ5IHtcblx0XHQvLyBBZ2dyZWdhdGlvbiBhbmQgY29tcGxleCB0eXBlIHN1cHBvcnRcblx0XHRjb25zdCBvQWdncmVnYXRpb25zID0gYXdhaXQgcHJvY2Vzc0NoaWxkcmVuKFxuXHRcdFx0b05vZGUsXG5cdFx0XHRvVmlzaXRvcixcblx0XHRcdG9NZXRhZGF0YSxcblx0XHRcdGlzUHVibGljLFxuXHRcdFx0cHJvcGVydHlWYWx1ZXMsXG5cdFx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uXG5cdFx0KTtcblx0XHRsZXQgb0luc3RhbmNlOiBhbnk7XG5cdFx0bGV0IG9Db250cm9sQ29uZmlnID0ge307XG5cblx0XHRpZiAob1NldHRpbmdzLm1vZGVscy52aWV3RGF0YSkge1xuXHRcdFx0Ly8gT25seSB1c2VkIGluIHRoZSBGaWVsZCBtYWNybyBhbmQgZXZlbiB0aGVuIG1heWJlIG5vdCByZWFsbHkgdXNlZnVsXG5cdFx0XHRvQ29udHJvbENvbmZpZyA9IG9TZXR0aW5ncy5tb2RlbHMudmlld0RhdGEuZ2V0UHJvcGVydHkoXCIvY29udHJvbENvbmZpZ3VyYXRpb25cIik7XG5cdFx0fVxuXHRcdGxldCBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IHByb3BlcnR5VmFsdWVzO1xuXHRcdGlmIChpc1YxTWFjcm9EZWYoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24pICYmIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmNyZWF0ZSkge1xuXHRcdFx0cHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMgPSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5jcmVhdGUuY2FsbChcblx0XHRcdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24sXG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzLFxuXHRcdFx0XHRvQ29udHJvbENvbmZpZyxcblx0XHRcdFx0b1NldHRpbmdzLFxuXHRcdFx0XHRvQWdncmVnYXRpb25zLFxuXHRcdFx0XHRpc1B1YmxpY1xuXHRcdFx0KTtcblx0XHRcdE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzTWV0YWRhdGFOYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0aWYgKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NNZXRhZGF0YU5hbWVdLmNvbXB1dGVkKSB7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NNZXRhZGF0YU5hbWVdID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc01ldGFkYXRhTmFtZV07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0T2JqZWN0LmtleXMobU1pc3NpbmdDb250ZXh0KS5mb3JFYWNoKGZ1bmN0aW9uIChzQ29udGV4dE5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRpZiAocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMuaGFzT3duUHJvcGVydHkoc0NvbnRleHROYW1lKSkge1xuXHRcdFx0XHRcdG1Db250ZXh0c1tzQ29udGV4dE5hbWVdID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc0NvbnRleHROYW1lXTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmIChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSAyKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhwcm9wZXJ0eVZhbHVlcykuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0RhdGEgPSBwcm9wZXJ0eVZhbHVlc1twcm9wTmFtZV07XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvRGF0YSAmJlxuXHRcdFx0XHRcdG9EYXRhLmlzQSAmJlxuXHRcdFx0XHRcdG9EYXRhLmlzQShTQVBfVUlfTU9ERUxfQ09OVEVYVCkgJiZcblx0XHRcdFx0XHQhb0RhdGEuZ2V0TW9kZWwoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcE5hbWVdID0gb0RhdGEuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgQnVpbGRpbmdCbG9ja0NsYXNzID0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gYXMgdHlwZW9mIEJ1aWxkaW5nQmxvY2tCYXNlO1xuXHRcdFx0cHJvcGVydHlWYWx1ZXMuaXNQdWJsaWMgPSBpc1B1YmxpYztcblxuXHRcdFx0b0luc3RhbmNlID0gbmV3IEJ1aWxkaW5nQmxvY2tDbGFzcyhcblx0XHRcdFx0eyAuLi5wcm9wZXJ0eVZhbHVlcywgLi4ub0FnZ3JlZ2F0aW9ucyB9LFxuXHRcdFx0XHRvQ29udHJvbENvbmZpZyxcblx0XHRcdFx0b1NldHRpbmdzXG5cdFx0XHRcdC8qLCBvQ29udHJvbENvbmZpZywgb1NldHRpbmdzLCBvQWdncmVnYXRpb25zLCBpc1B1YmxpYyovXG5cdFx0XHQpO1xuXHRcdFx0cHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMgPSBvSW5zdGFuY2UuZ2V0UHJvcGVydGllcygpO1xuXHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNDb250ZXh0TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdGlmIChwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpKSB7XG5cdFx0XHRcdFx0bGV0IHRhcmdldE9iamVjdCA9IHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzW3NDb250ZXh0TmFtZV07XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiB0YXJnZXRPYmplY3QgPT09IFwib2JqZWN0XCIgJiYgIXRhcmdldE9iamVjdC5nZXRPYmplY3QpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNBdHRyaWJ1dGVWYWx1ZSA9IHN0b3JlVmFsdWUodGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0XHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IGAke3NBdHRyaWJ1dGVWYWx1ZX1gO1xuXHRcdFx0XHRcdFx0b1NldHRpbmdzLm1vZGVscy5jb252ZXJ0ZXJDb250ZXh0LnNldFByb3BlcnR5KHNDb250ZXh0UGF0aCwgdGFyZ2V0T2JqZWN0KTtcblx0XHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5jcmVhdGVCaW5kaW5nQ29udGV4dChzQ29udGV4dFBhdGgpO1xuXHRcdFx0XHRcdFx0ZGVsZXRlIG15U3RvcmVbc0F0dHJpYnV0ZVZhbHVlXTtcblx0XHRcdFx0XHRcdG1Db250ZXh0c1tzQ29udGV4dE5hbWVdID0gdGFyZ2V0T2JqZWN0O1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIW1Db250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpICYmIHRhcmdldE9iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRtQ29udGV4dHNbc0NvbnRleHROYW1lXSA9IHRhcmdldE9iamVjdDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRjb25zdCBvQXR0cmlidXRlc01vZGVsOiBKU09OTW9kZWwgPSBuZXcgQXR0cmlidXRlTW9kZWwob05vZGUsIHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzLCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbik7XG5cdFx0bUNvbnRleHRzW3NOYW1lXSA9IG9BdHRyaWJ1dGVzTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpO1xuXHRcdGxldCBvUHJldmlvdXNNYWNyb0luZm86IGFueTtcblxuXHRcdC8vIEtlZXAgdHJhY2tcblx0XHRpZiAoVHJhY2VJbmZvLmlzVHJhY2VJbmZvQWN0aXZlKCkpIHtcblx0XHRcdGNvbnN0IG9UcmFjZUluZm8gPSBUcmFjZUluZm8udHJhY2VNYWNyb0NhbGxzKHNGcmFnbWVudE5hbWUsIG9NZXRhZGF0YSwgbUNvbnRleHRzLCBvTm9kZSwgb1Zpc2l0b3IpO1xuXHRcdFx0aWYgKG9UcmFjZUluZm8pIHtcblx0XHRcdFx0b1ByZXZpb3VzTWFjcm9JbmZvID0gb1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXTtcblx0XHRcdFx0b1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXSA9IG9UcmFjZUluZm8ubWFjcm9JbmZvO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlKHNGcmFnbWVudE5hbWUsIG9NZXRhZGF0YSwgbUNvbnRleHRzLCBvTm9kZSk7XG5cblx0XHRjb25zdCBvQ29udGV4dFZpc2l0b3IgPSBvVmlzaXRvci53aXRoKFxuXHRcdFx0bUNvbnRleHRzLFxuXHRcdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNPcGVuICE9PSB1bmRlZmluZWQgPyAhYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uaXNPcGVuIDogdHJ1ZVxuXHRcdCk7XG5cdFx0Y29uc3Qgb1BhcmVudCA9IG9Ob2RlLnBhcmVudE5vZGU7XG5cblx0XHRsZXQgaUNoaWxkSW5kZXg6IG51bWJlcjtcblx0XHRsZXQgb1Byb21pc2U7XG5cdFx0bGV0IHByb2Nlc3NDdXN0b21EYXRhID0gdHJ1ZTtcblx0XHRpZiAob1BhcmVudCkge1xuXHRcdFx0aUNoaWxkSW5kZXggPSBBcnJheS5mcm9tKG9QYXJlbnQuY2hpbGRyZW4pLmluZGV4T2Yob05vZGUpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoaXNWMU1hY3JvRGVmKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKSAmJiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5nZXRUZW1wbGF0ZSkgfHxcblx0XHRcdFx0KGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDIgJiYgIWJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmZyYWdtZW50KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGxldCBvVGVtcGxhdGU7XG5cdFx0XHRcdGxldCBhZGREZWZhdWx0TmFtZXNwYWNlID0gZmFsc2U7XG5cdFx0XHRcdGlmIChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSAyKSB7XG5cdFx0XHRcdFx0b1RlbXBsYXRlID0gb0luc3RhbmNlLmdldFRlbXBsYXRlKCk7XG5cdFx0XHRcdFx0aWYgKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmlzUnVudGltZSkge1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBteVN0b3JlS2V5IGluIG15U3RvcmUpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RhdGEgPSBteVN0b3JlW215U3RvcmVLZXldO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBgJHtteVN0b3JlS2V5fWA7XG5cdFx0XHRcdFx0XHRcdG9TZXR0aW5ncy5tb2RlbHMuY29udmVydGVyQ29udGV4dC5zZXRQcm9wZXJ0eShzQ29udGV4dFBhdGgsIG9EYXRhKTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIG15U3RvcmVbbXlTdG9yZUtleV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFkZERlZmF1bHROYW1lc3BhY2UgPSB0cnVlO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLmdldFRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0b1RlbXBsYXRlID0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uZ2V0VGVtcGxhdGUocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IGhhc0Vycm9yID0gXCJcIjtcblx0XHRcdFx0aWYgKG9UZW1wbGF0ZSkge1xuXHRcdFx0XHRcdGlmICghb1RlbXBsYXRlLmZpcnN0RWxlbWVudENoaWxkKSB7XG5cdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvVGVtcGxhdGUsIGFkZERlZmF1bHROYW1lc3BhY2UpO1xuXHRcdFx0XHRcdFx0Ly8gRm9yIHNhZmV0eSBwdXJwb3NlIHdlIHRyeSB0byBkZXRlY3QgdHJhaWxpbmcgdGV4dCBpbiBiZXR3ZWVuIFhNTCBUYWdzXG5cdFx0XHRcdFx0XHRjb25zdCBpdGVyID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKG9UZW1wbGF0ZSwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xuXHRcdFx0XHRcdFx0bGV0IHRleHRub2RlID0gaXRlci5uZXh0Tm9kZSgpO1xuXHRcdFx0XHRcdFx0d2hpbGUgKHRleHRub2RlKSB7XG5cdFx0XHRcdFx0XHRcdGlmICh0ZXh0bm9kZS50ZXh0Q29udGVudCAmJiB0ZXh0bm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRcdGhhc0Vycm9yID0gdGV4dG5vZGUudGV4dENvbnRlbnQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGV4dG5vZGUgPSBpdGVyLm5leHROb2RlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG9UZW1wbGF0ZS5sb2NhbE5hbWUgPT09IFwicGFyc2VyZXJyb3JcIikge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYSBwYXJzZWVycm9yIHdoaWxlIHByb2Nlc3NpbmcgdGhlIFhNTCBpdCBtZWFucyB0aGUgWE1MIGl0c2VsZiBpcyBtYWxmb3JtZWQsIGFzIHN1Y2ggd2UgcmVydW4gdGhlIHRlbXBsYXRlIHByb2Nlc3Ncblx0XHRcdFx0XHRcdC8vIFNldHRpbmcgaXNUcmFjZU1vZGUgdHJ1ZSB3aWxsIG1ha2UgaXQgc28gdGhhdCBlYWNoIHhtbGAgZXhwcmVzc2lvbiBpcyBjaGVja2VkIGZvciB2YWxpZGl0eSBmcm9tIFhNTCBwZXJzcGVjdGl2ZVxuXHRcdFx0XHRcdFx0Ly8gSWYgYW4gZXJyb3IgaXMgZm91bmQgaXQncyByZXR1cm5lZCBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgZnJhZ21lbnRcblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRpc1RyYWNlTW9kZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZSA9IG9JbnN0YW5jZT8uZ2V0VGVtcGxhdGVcblx0XHRcdFx0XHRcdFx0XHQ/IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZSgpXG5cdFx0XHRcdFx0XHRcdFx0OiAoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gYXMgYW55KS5nZXRUZW1wbGF0ZShwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyk7XG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZSA9IHBhcnNlWE1MU3RyaW5nKG9UZW1wbGF0ZSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0XHRpc1RyYWNlTW9kZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoaGFzRXJyb3IubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgdHJhaWxpbmcgdGV4dCB3ZSBjcmVhdGUgYSBzdGFuZGFyZCBlcnJvciBhbmQgZGlzcGxheSBpdC5cblx0XHRcdFx0XHRcdExvZy5lcnJvcihgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YCk7XG5cdFx0XHRcdFx0XHRjb25zdCBvRXJyb3JUZXh0ID0gY3JlYXRlRXJyb3JYTUwoXG5cdFx0XHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdFx0XHRgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWV9YCxcblx0XHRcdFx0XHRcdFx0XHRgVHJhaWxpbmcgdGV4dCB3YXMgZm91bmQgaW4gdGhlIFhNTDogJHtoYXNFcnJvcn1gXG5cdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdG9UZW1wbGF0ZS5vdXRlckhUTUxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvRXJyb3JUZXh0LCB0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b05vZGUucmVwbGFjZVdpdGgob1RlbXBsYXRlKTtcblx0XHRcdFx0XHRvTm9kZSA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXHRcdFx0XHRcdHByb2Nlc3NTbG90cyhvQWdncmVnYXRpb25zLCBvTWV0YWRhdGEuYWdncmVnYXRpb25zLCBvTm9kZSwgcHJvY2Vzc0N1c3RvbURhdGEpO1xuXHRcdFx0XHRcdHByb2Nlc3NDdXN0b21EYXRhID0gZmFsc2U7XG5cdFx0XHRcdFx0b1Byb21pc2UgPSBvQ29udGV4dFZpc2l0b3IudmlzaXROb2RlKG9Ob2RlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvTm9kZS5yZW1vdmUoKTtcblx0XHRcdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvUHJvbWlzZSA9IG9Db250ZXh0VmlzaXRvci5pbnNlcnRGcmFnbWVudChzRnJhZ21lbnROYW1lLCBvTm9kZSk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IG9Qcm9taXNlO1xuXHRcdFx0Y29uc3Qgb01hY3JvRWxlbWVudCA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXHRcdFx0cHJvY2Vzc1Nsb3RzKG9BZ2dyZWdhdGlvbnMsIG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnMsIG9NYWNyb0VsZW1lbnQsIHByb2Nlc3NDdXN0b21EYXRhKTtcblx0XHRcdGlmIChvTWFjcm9FbGVtZW50KSB7XG5cdFx0XHRcdGNvbnN0IG9SZW1haW5pbmdTbG90cyA9IG9NYWNyb0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcInNsb3RcIik7XG5cdFx0XHRcdG9SZW1haW5pbmdTbG90cy5mb3JFYWNoKGZ1bmN0aW9uIChvU2xvdEVsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdG9TbG90RWxlbWVudC5yZW1vdmUoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChvUHJldmlvdXNNYWNyb0luZm8pIHtcblx0XHRcdC8vcmVzdG9yZSBtYWNybyBpbmZvIGlmIGF2YWlsYWJsZVxuXHRcdFx0b1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXSA9IG9QcmV2aW91c01hY3JvSW5mbztcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVsZXRlIG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl07XG5cdFx0fVxuXHR9IGNhdGNoIChlKSB7XG5cdFx0Ly8gSW4gY2FzZSB0aGVyZSBpcyBhIGdlbmVyaWMgZXJyb3IgKHVzdWFsbHkgY29kZSBlcnJvciksIHdlIHJldHJpZXZlIHRoZSBjdXJyZW50IGNvbnRleHQgaW5mb3JtYXRpb24gYW5kIGNyZWF0ZSBhIGRlZGljYXRlZCBlcnJvciBtZXNzYWdlXG5cdFx0Y29uc3QgdHJhY2VEZXRhaWxzID0ge1xuXHRcdFx0aW5pdGlhbFByb3BlcnRpZXM6IHt9IGFzIGFueSxcblx0XHRcdHJlc29sdmVkUHJvcGVydGllczoge30gYXMgYW55LFxuXHRcdFx0bWlzc2luZ0NvbnRleHRzOiBtTWlzc2luZ0NvbnRleHRcblx0XHR9O1xuXHRcdGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIGluaXRpYWxLZXlzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlICYmIHByb3BlcnR5VmFsdWUuaXNBICYmIHByb3BlcnR5VmFsdWUuaXNBKFNBUF9VSV9NT0RFTF9DT05URVhUKSkge1xuXHRcdFx0XHR0cmFjZURldGFpbHMuaW5pdGlhbFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHtcblx0XHRcdFx0XHRwYXRoOiBwcm9wZXJ0eVZhbHVlLmdldFBhdGgoKSxcblx0XHRcdFx0XHR2YWx1ZTogcHJvcGVydHlWYWx1ZS5nZXRPYmplY3QoKVxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHJhY2VEZXRhaWxzLmluaXRpYWxQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBpbiBwcm9wZXJ0eVZhbHVlcykge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRpZiAoIWluaXRpYWxLZXlzLmluY2x1ZGVzKHByb3BlcnR5TmFtZSkpIHtcblx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgcHJvcGVydHlWYWx1ZS5pc0EgJiYgcHJvcGVydHlWYWx1ZS5pc0EoU0FQX1VJX01PREVMX0NPTlRFWFQpKSB7XG5cdFx0XHRcdFx0dHJhY2VEZXRhaWxzLnJlc29sdmVkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0ge1xuXHRcdFx0XHRcdFx0cGF0aDogcHJvcGVydHlWYWx1ZS5nZXRQYXRoKCksXG5cdFx0XHRcdFx0XHR2YWx1ZTogcHJvcGVydHlWYWx1ZS5nZXRPYmplY3QoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dHJhY2VEZXRhaWxzLnJlc29sdmVkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gcHJvcGVydHlWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCBlcnJvckFueSA9IGUgYXMgYW55O1xuXHRcdExvZy5lcnJvcihlcnJvckFueSwgZXJyb3JBbnkpO1xuXHRcdGNvbnN0IG9FcnJvciA9IGNyZWF0ZUVycm9yWE1MKFxuXHRcdFx0W2BFcnJvciB3aGlsZSBwcm9jZXNzaW5nIGJ1aWxkaW5nIGJsb2NrICR7YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZX1gXSxcblx0XHRcdG9Ob2RlLm91dGVySFRNTCxcblx0XHRcdHRyYWNlRGV0YWlscyxcblx0XHRcdGVycm9yQW55LnN0YWNrXG5cdFx0KTtcblx0XHRjb25zdCBvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvRXJyb3IsIHRydWUpO1xuXHRcdG9Ob2RlLnJlcGxhY2VXaXRoKG9UZW1wbGF0ZSBhcyBhbnkpO1xuXHR9XG59XG5mdW5jdGlvbiBhZGRTaW5nbGVDb250ZXh0KG1Db250ZXh0czogYW55LCBvVmlzaXRvcjogYW55LCBvQ3R4OiBhbnksIG9NZXRhZGF0YUNvbnRleHRzOiBhbnkpIHtcblx0Y29uc3Qgc0tleSA9IG9DdHgubmFtZSB8fCBvQ3R4Lm1vZGVsIHx8IHVuZGVmaW5lZDtcblxuXHRpZiAob01ldGFkYXRhQ29udGV4dHNbc0tleV0pIHtcblx0XHRyZXR1cm47IC8vIGRvIG5vdCBhZGQgdHdpY2Vcblx0fVxuXHR0cnkge1xuXHRcdGxldCBzQ29udGV4dFBhdGggPSBvQ3R4LnBhdGg7XG5cdFx0aWYgKG9DdHgubW9kZWwgIT0gbnVsbCkge1xuXHRcdFx0c0NvbnRleHRQYXRoID0gYCR7b0N0eC5tb2RlbH0+JHtzQ29udGV4dFBhdGh9YDtcblx0XHR9XG5cdFx0Y29uc3QgbVNldHRpbmcgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHRcdGlmIChvQ3R4Lm1vZGVsID09PSBcImNvbnZlcnRlckNvbnRleHRcIiAmJiBvQ3R4LnBhdGgubGVuZ3RoID4gMCkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWxdLmdldENvbnRleHQob0N0eC5wYXRoLCBtU2V0dGluZy5iaW5kaW5nQ29udGV4dHNbb0N0eC5tb2RlbF0pOyAvLyBhZGQgdGhlIGNvbnRleHQgdG8gdGhlIHZpc2l0b3Jcblx0XHR9IGVsc2UgaWYgKCFtU2V0dGluZy5iaW5kaW5nQ29udGV4dHNbb0N0eC5tb2RlbF0gJiYgbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWxdKSB7XG5cdFx0XHRtQ29udGV4dHNbc0tleV0gPSBtU2V0dGluZy5tb2RlbHNbb0N0eC5tb2RlbF0uZ2V0Q29udGV4dChvQ3R4LnBhdGgpOyAvLyBhZGQgdGhlIGNvbnRleHQgdG8gdGhlIHZpc2l0b3Jcblx0XHR9IGVsc2Uge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gb1Zpc2l0b3IuZ2V0Q29udGV4dChzQ29udGV4dFBhdGgpOyAvLyBhZGQgdGhlIGNvbnRleHQgdG8gdGhlIHZpc2l0b3Jcblx0XHR9XG5cblx0XHRvTWV0YWRhdGFDb250ZXh0c1tzS2V5XSA9IG1Db250ZXh0c1tzS2V5XTsgLy8gbWFrZSBpdCBhdmFpbGFibGUgaW5zaWRlIG1ldGFkYXRhQ29udGV4dHMgSlNPTiBvYmplY3Rcblx0fSBjYXRjaCAoZXgpIHtcblx0XHQvL2NvbnNvbGUuZXJyb3IoZXgpO1xuXHRcdC8vIGlnbm9yZSB0aGUgY29udGV4dCBhcyB0aGlzIGNhbiBvbmx5IGJlIHRoZSBjYXNlIGlmIHRoZSBtb2RlbCBpcyBub3QgcmVhZHksIGkuZS4gbm90IGEgcHJlcHJvY2Vzc2luZyBtb2RlbCBidXQgbWF5YmUgYSBtb2RlbCBmb3Jcblx0XHQvLyBwcm92aWRpbmcgYWZ0ZXJ3YXJkc1xuXHRcdC8vIFRPRE8gMDAwMiBub3QgeWV0IGltcGxlbWVudGVkXG5cdFx0Ly9tQ29udGV4dHNbXCJfJGVycm9yXCJdLm9Nb2RlbC5zZXRQcm9wZXJ0eShcIi9cIiArIHNLZXksIGV4KTtcblx0fVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvbiB0byBiZSB1c2VkIGluc2lkZSB0aGUgeG1sIHRlbXBsYXRlIHByb2Nlc3Nvci5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gVGhlIGJ1aWxkaW5nIGJsb2NrIGRlZmluaXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQnVpbGRpbmdCbG9jayhidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbjogQnVpbGRpbmdCbG9ja0RlZmluaXRpb24pOiB2b2lkIHtcblx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHQob05vZGU6IEVsZW1lbnQsIG9WaXNpdG9yOiBJQ2FsbGJhY2spID0+IHByb2Nlc3NCdWlsZGluZ0Jsb2NrKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLCBvTm9kZSwgb1Zpc2l0b3IpLFxuXHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWVzcGFjZSxcblx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi54bWxUYWcgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZVxuXHQpO1xuXHRpZiAoYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ucHVibGljTmFtZXNwYWNlKSB7XG5cdFx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihcblx0XHRcdChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElDYWxsYmFjaykgPT4gcHJvY2Vzc0J1aWxkaW5nQmxvY2soYnVpbGRpbmdCbG9ja0RlZmluaXRpb24sIG9Ob2RlLCBvVmlzaXRvciwgdHJ1ZSksXG5cdFx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5wdWJsaWNOYW1lc3BhY2UsXG5cdFx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi54bWxUYWcgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZVxuXHRcdCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JYTUwoZXJyb3JNZXNzYWdlczogc3RyaW5nW10sIHhtbEZyYWdtZW50OiBzdHJpbmcsIGFkZGl0aW9uYWxEYXRhPzogb2JqZWN0LCBzdGFjaz86IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IGVycm9yTGFiZWxzID0gZXJyb3JNZXNzYWdlcy5tYXAoKGVycm9yTWVzc2FnZSkgPT4geG1sYDxtOkxhYmVsIHRleHQ9XCIke2VzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKGVycm9yTWVzc2FnZSl9XCIvPmApO1xuXHRsZXQgZXJyb3JTdGFjayA9IFwiXCI7XG5cdGlmIChzdGFjaykge1xuXHRcdGNvbnN0IHN0YWNrRm9ybWF0dGVkID0gYnRvYShgPHByZT4ke3N0YWNrfTwvcHJlPmApO1xuXHRcdGVycm9yU3RhY2sgPSB4bWxgPG06Rm9ybWF0dGVkVGV4dCBodG1sVGV4dD1cIiR7YHs9IEJCRi5iYXNlNjREZWNvZGUoJyR7c3RhY2tGb3JtYXR0ZWR9JykgfWB9XCIgLz5gO1xuXHR9XG5cdGxldCBhZGRpdGlvbmFsVGV4dCA9IFwiXCI7XG5cdGlmIChhZGRpdGlvbmFsRGF0YSkge1xuXHRcdGFkZGl0aW9uYWxUZXh0ID0geG1sYDxtOlZCb3g+XG5cdFx0XHRcdFx0XHQ8bTpMYWJlbCB0ZXh0PVwiVHJhY2UgSW5mb1wiLz5cblx0XHRcdFx0XHRcdDxjb2RlOkNvZGVFZGl0b3IgdHlwZT1cImpzb25cIiAgdmFsdWU9XCIke2B7PSBCQkYuYmFzZTY0RGVjb2RlKCcke2J0b2EoSlNPTi5zdHJpbmdpZnkoYWRkaXRpb25hbERhdGEsIG51bGwsIDQpKX0nKSB9YH1cIiBoZWlnaHQ9XCIzMDBweFwiIC8+XG5cdFx0XHRcdFx0PC9tOlZCb3g+YDtcblx0fVxuXHRyZXR1cm4geG1sYDxtOlZCb3ggeG1sbnM6bT1cInNhcC5tXCIgeG1sbnM6Y29kZT1cInNhcC51aS5jb2RlZWRpdG9yXCIgY29yZTpyZXF1aXJlPVwie0JCRjonc2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvQnVpbGRpbmdCbG9ja0Zvcm1hdHRlcid9XCI+XG5cdFx0XHRcdCR7ZXJyb3JMYWJlbHN9XHRcdFx0XG5cdFx0XHRcdCR7ZXJyb3JTdGFja31cblx0XHRcdFx0PGdyaWQ6Q1NTR3JpZCBncmlkVGVtcGxhdGVSb3dzPVwiZnJcIiBncmlkVGVtcGxhdGVDb2x1bW5zPVwicmVwZWF0KDIsMWZyKVwiIGdyaWRHYXA9XCIxcmVtXCIgeG1sbnM6Z3JpZD1cInNhcC51aS5sYXlvdXQuY3NzZ3JpZFwiID5cblx0XHRcdFx0XHQ8bTpWQm94PlxuXHRcdFx0XHRcdFx0PG06TGFiZWwgdGV4dD1cIkhvdyB0aGUgYnVpbGRpbmcgYmxvY2sgd2FzIGNhbGxlZFwiLz5cblx0XHRcdFx0XHRcdDxjb2RlOkNvZGVFZGl0b3IgdHlwZT1cInhtbFwiIHZhbHVlPVwiJHtgez0gQkJGLmJhc2U2NERlY29kZSgnJHtidG9hKHhtbEZyYWdtZW50LnJlcGxhY2VBbGwoXCImZ3Q7XCIsIFwiPlwiKSl9JykgfWB9XCIgaGVpZ2h0PVwiMzAwcHhcIiAvPlxuXHRcdFx0XHRcdDwvbTpWQm94PlxuXHRcdFx0XHRcdCR7YWRkaXRpb25hbFRleHR9XG5cdFx0XHRcdDwvZ3JpZDpDU1NHcmlkPlxuXHRcdFx0PC9tOlZCb3g+YDtcbn1cblxuY29uc3QgbXlTdG9yZTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuZnVuY3Rpb24gc3RvcmVWYWx1ZSh2YWx1ZXM6IGFueSkge1xuXHRjb25zdCBwcm9wZXJ0eVVJRCA9IGAvdWlkLS0ke3VpZCgpfWA7XG5cdG15U3RvcmVbcHJvcGVydHlVSURdID0gdmFsdWVzO1xuXHRyZXR1cm4gcHJvcGVydHlVSUQ7XG59XG5cbi8qKlxuICogUGFyc2UgYW4gWE1MIHN0cmluZyBhbmQgcmV0dXJuIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50LlxuICpcbiAqIEBwYXJhbSB4bWxTdHJpbmcgVGhlIHhtbCBzdHJpbmdcbiAqIEBwYXJhbSBhZGREZWZhdWx0TmFtZXNwYWNlcyBXaGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgYWRkIGRlZmF1bHQgbmFtZXNwYWNlXG4gKiBAcmV0dXJucyBUaGUgWE1MIGRvY3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VYTUxTdHJpbmcoeG1sU3RyaW5nOiBzdHJpbmcsIGFkZERlZmF1bHROYW1lc3BhY2VzID0gZmFsc2UpOiBFbGVtZW50IHtcblx0aWYgKGFkZERlZmF1bHROYW1lc3BhY2VzKSB7XG5cdFx0eG1sU3RyaW5nID0gYDx0ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0eG1sbnM6dGVtcGxhdGU9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUudGVtcGxhdGUvMVwiXG5cdFx0XHRcdFx0XHR4bWxuczptPVwic2FwLm1cIlxuXHRcdFx0XHRcdFx0eG1sbnM6bWFjcm9zPVwic2FwLmZlLm1hY3Jvc1wiXG5cdFx0XHRcdFx0XHR4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcIlxuXHRcdFx0XHRcdFx0eG1sbnM6bWRjPVwic2FwLnVpLm1kY1wiXG5cdFx0XHRcdFx0XHR4bWxuczpjdXN0b21EYXRhPVwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiPiR7eG1sU3RyaW5nfTwvdGVtcGxhdGU+YDtcblx0fVxuXHRjb25zdCB4bWxEb2N1bWVudCA9IERPTVBhcnNlckluc3RhbmNlLnBhcnNlRnJvbVN0cmluZyh4bWxTdHJpbmcsIFwidGV4dC94bWxcIik7XG5cdGxldCBvdXRwdXQgPSB4bWxEb2N1bWVudC5maXJzdEVsZW1lbnRDaGlsZDtcblx0d2hpbGUgKG91dHB1dD8ubG9jYWxOYW1lID09PSBcInRlbXBsYXRlXCIpIHtcblx0XHRvdXRwdXQgPSBvdXRwdXQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdH1cblx0cmV0dXJuIG91dHB1dCBhcyBFbGVtZW50O1xufVxuXG4vKipcbiAqIEVzY2FwZSBhbiBYTUwgYXR0cmlidXRlIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB2YWwgVGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHZhbCAmJiB2YWwucmVwbGFjZSgvJi9nLCBcIiZhbXA7XCIpLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJJblRyYWNlTW9kZShvdXRTdHI6IHN0cmluZykge1xuXHRjb25zdCB4bWxSZXN1bHQgPSBwYXJzZVhNTFN0cmluZyhvdXRTdHIsIHRydWUpO1xuXHRpZiAoeG1sUmVzdWx0ICYmIHhtbFJlc3VsdD8ubG9jYWxOYW1lID09PSBcInBhcnNlcmVycm9yXCIpIHtcblx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSAoeG1sUmVzdWx0IGFzIGFueSkuaW5uZXJUZXh0IHx8ICh4bWxSZXN1bHQgYXMgYW55KS5pbm5lckhUTUw7XG5cdFx0cmV0dXJuIGNyZWF0ZUVycm9yWE1MKFtlcnJvck1lc3NhZ2Uuc3BsaXQoXCJcXG5cIilbMF1dLCBvdXRTdHIpO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBvdXRTdHI7XG5cdH1cbn1cbi8qKlxuICogQ3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsIHdoaWxlIGhhbmRsaW5nIHNwZWNpYWwgb2JqZWN0IGNhc2UuXG4gKlxuICogQHBhcmFtIHN0cmluZ3MgVGhlIHN0cmluZyBwYXJ0cyBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbFxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHBhcnQgb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEByZXR1cm5zIFRoZSBYTUwgc3RyaW5nIGRvY3VtZW50IHJlcHJlc2VudGluZyB0aGUgc3RyaW5nIHRoYXQgd2FzIHVzZWQuXG4gKi9cbmV4cG9ydCBjb25zdCB4bWwgPSAoc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksIC4uLnZhbHVlczogYW55W10pID0+IHtcblx0bGV0IG91dFN0ciA9IFwiXCI7XG5cdGxldCBpO1xuXHRmb3IgKGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0b3V0U3RyICs9IHN0cmluZ3NbaV07XG5cdFx0Ly8gSGFuZGxlIHRoZSBkaWZmZXJlbnQgY2FzZSBvZiBvYmplY3QsIGlmIGl0J3MgYW4gYXJyYXkgd2Ugam9pbiB0aGVtLCBpZiBpdCdzIGEgYmluZGluZyBleHByZXNzaW9uIChkZXRlcm1pbmVkIGJ5IF90eXBlKSB0aGVuIHdlIGNvbXBpbGUgaXQuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWVzW2ldKSAmJiB2YWx1ZXNbaV0ubGVuZ3RoID4gMCAmJiB0eXBlb2YgdmFsdWVzW2ldWzBdID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWVzW2ldLmZsYXQoNSkuam9pbihcIlxcblwiKS50cmltKCk7XG5cdFx0fSBlbHNlIGlmICh2YWx1ZXNbaV0/Ll90eXBlKSB7XG5cdFx0XHRjb25zdCBjb21waWxlZEV4cHJlc3Npb24gPSBjb21waWxlRXhwcmVzc2lvbih2YWx1ZXNbaV0pO1xuXHRcdFx0b3V0U3RyICs9IGNvbXBpbGVkRXhwcmVzc2lvbiAhPT0gdW5kZWZpbmVkID8gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUoY29tcGlsZWRFeHByZXNzaW9uKSA6IHVuZGVmaW5lZDtcblx0XHR9IGVsc2UgaWYgKHZhbHVlc1tpXT8uZ2V0VGVtcGxhdGUpIHtcblx0XHRcdG91dFN0ciArPSB2YWx1ZXNbaV0uZ2V0VGVtcGxhdGUoKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZXNbaV0gPT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdG91dFN0ciArPSBcInt0aGlzPnVuZGVmaW5lZFZhbHVlfVwiO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlc1tpXSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0aWYgKHZhbHVlc1tpXS5pc0E/LihcInNhcC51aS5tb2RlbC5Db250ZXh0XCIpKSB7XG5cdFx0XHRcdG91dFN0ciArPSB2YWx1ZXNbaV0uZ2V0UGF0aCgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlVSWQgPSBzdG9yZVZhbHVlKHZhbHVlc1tpXSk7XG5cdFx0XHRcdG91dFN0ciArPSBgJHtwcm9wZXJ0eVVJZH1gO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodmFsdWVzW2ldICYmIHR5cGVvZiB2YWx1ZXNbaV0gPT09IFwic3RyaW5nXCIgJiYgIXZhbHVlc1tpXS5zdGFydHNXaXRoKFwiPFwiKSAmJiAhdmFsdWVzW2ldLnN0YXJ0c1dpdGgoXCImbHQ7XCIpKSB7XG5cdFx0XHRvdXRTdHIgKz0gZXNjYXBlWE1MQXR0cmlidXRlVmFsdWUodmFsdWVzW2ldKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlc1tpXTtcblx0XHR9XG5cdH1cblx0b3V0U3RyICs9IHN0cmluZ3NbaV07XG5cdG91dFN0ciA9IG91dFN0ci50cmltKCk7XG5cdGlmIChpc1RyYWNlTW9kZSkge1xuXHRcdHJldHVybiByZW5kZXJJblRyYWNlTW9kZShvdXRTdHIpO1xuXHR9XG5cdHJldHVybiBvdXRTdHI7XG59O1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7O0VBd0tPLGdCQUFnQkEsTUFBaEIsRUFBd0JDLElBQXhCLEVBQThCQyxLQUE5QixFQUFxQztJQUMzQyxJQUFJLE9BQU9GLE1BQU0saUJBQWIsS0FBbUMsVUFBdkMsRUFBbUQ7TUFDbEQsSUFBSUcsUUFBUSxHQUFHSCxNQUFNLGlCQUFOLEVBQWY7TUFBQSxJQUEwQ0ksSUFBMUM7TUFBQSxJQUFnREMsSUFBaEQ7TUFBQSxJQUFzREMsTUFBdEQ7O01BQ0EsU0FBU0MsTUFBVCxDQUFnQkMsTUFBaEIsRUFBd0I7UUFDdkIsSUFBSTtVQUNILE9BQU8sQ0FBQyxDQUFDSixJQUFJLEdBQUdELFFBQVEsQ0FBQ00sSUFBVCxFQUFSLEVBQXlCQyxJQUExQixLQUFtQyxDQUFDUixLQUFELElBQVUsQ0FBQ0EsS0FBSyxFQUFuRCxDQUFQLEVBQStEO1lBQzlETSxNQUFNLEdBQUdQLElBQUksQ0FBQ0csSUFBSSxDQUFDTyxLQUFOLENBQWI7O1lBQ0EsSUFBSUgsTUFBTSxJQUFJQSxNQUFNLENBQUNJLElBQXJCLEVBQTJC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
|