@sapui5/sap.fe.core 1.101.0 → 1.103.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 +5 -5
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AppComponent.js +66 -30
- package/src/sap/fe/core/AppComponent.ts +68 -51
- package/src/sap/fe/core/AppStateHandler.js +13 -13
- package/src/sap/fe/core/AppStateHandler.ts +18 -18
- package/src/sap/fe/core/BaseController.js +11 -9
- package/src/sap/fe/core/BaseController.ts +15 -13
- package/src/sap/fe/core/CommonUtils.js +279 -188
- package/src/sap/fe/core/CommonUtils.ts +306 -215
- package/src/sap/fe/core/ExtensionAPI.js +25 -30
- package/src/sap/fe/core/ExtensionAPI.ts +37 -41
- package/src/sap/fe/core/PageController.js +12 -7
- package/src/sap/fe/core/PageController.ts +10 -5
- package/src/sap/fe/core/TemplateComponent.js +6 -6
- package/src/sap/fe/core/TemplateComponent.ts +11 -11
- package/src/sap/fe/core/TemplateModel.js +2 -2
- package/src/sap/fe/core/TemplateModel.ts +3 -3
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +1 -1
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +306 -78
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +280 -70
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +27 -27
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +28 -26
- package/src/sap/fe/core/{BusyLocker.js → controllerextensions/BusyLocker.js} +1 -1
- package/src/sap/fe/core/{BusyLocker.ts → controllerextensions/BusyLocker.ts} +7 -7
- package/src/sap/fe/core/controllerextensions/EditFlow.js +351 -229
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +321 -246
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +9 -9
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +10 -10
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +59 -34
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +71 -45
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +72 -72
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +82 -80
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +152 -131
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +171 -152
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +66 -68
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +106 -123
- package/src/sap/fe/core/controllerextensions/MassEdit.js +11 -10
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +31 -37
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +21 -13
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +30 -15
- package/src/sap/fe/core/controllerextensions/PageReady.js +97 -25
- package/src/sap/fe/core/controllerextensions/PageReady.ts +94 -34
- package/src/sap/fe/core/controllerextensions/Paginator.js +19 -11
- package/src/sap/fe/core/controllerextensions/Paginator.ts +22 -14
- package/src/sap/fe/core/controllerextensions/Placeholder.js +4 -6
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +12 -14
- package/src/sap/fe/core/controllerextensions/Routing.js +10 -11
- package/src/sap/fe/core/controllerextensions/Routing.ts +12 -13
- package/src/sap/fe/core/controllerextensions/Share.js +39 -21
- package/src/sap/fe/core/controllerextensions/Share.ts +45 -26
- package/src/sap/fe/core/controllerextensions/SideEffects.js +47 -51
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +58 -62
- package/src/sap/fe/core/controllerextensions/ViewState.js +75 -62
- package/src/sap/fe/core/controllerextensions/ViewState.ts +78 -63
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +105 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +99 -0
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +360 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ActivitySync.ts +58 -112
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.js +2 -2
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/CollaborationCommon.ts +7 -7
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +262 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/Manage.ts +20 -21
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/ManageDialog.fragment.xml +0 -0
- package/src/sap/fe/core/{actions → controllerextensions}/collaboration/UserDetails.fragment.xml +5 -7
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +1631 -0
- package/src/sap/fe/core/{TransactionHelper.ts → controllerextensions/editFlow/TransactionHelper.ts} +270 -211
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +772 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/draft.ts +240 -100
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +1199 -0
- package/src/sap/fe/core/{actions → controllerextensions/editFlow}/operations.ts +364 -229
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +188 -0
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +185 -0
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +626 -0
- package/src/sap/fe/core/{actions → controllerextensions/messageHandler}/messageHandling.ts +112 -69
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +937 -0
- package/src/sap/fe/core/{RouterProxy.ts → controllerextensions/routing/RouterProxy.ts} +72 -73
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +21 -18
- 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 +21 -24
- package/src/sap/fe/core/controls/CommandExecution.ts +19 -24
- package/src/sap/fe/core/controls/ConditionalWrapper.js +2 -2
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +3 -3
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +48 -43
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +51 -46
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -2
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +3 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +11 -3
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +19 -9
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +14 -8
- package/src/sap/fe/core/controls/FieldWrapper.js +2 -2
- package/src/sap/fe/core/controls/FieldWrapper.ts +3 -3
- package/src/sap/fe/core/controls/FileWrapper.js +50 -3
- package/src/sap/fe/core/controls/FileWrapper.ts +45 -12
- package/src/sap/fe/core/controls/FilterBar.js +6 -2
- package/src/sap/fe/core/controls/FilterBar.ts +13 -9
- package/src/sap/fe/core/controls/FormElementWrapper.js +12 -2
- package/src/sap/fe/core/controls/FormElementWrapper.ts +14 -3
- package/src/sap/fe/core/controls/MassEditSelect.js +33 -0
- package/src/sap/fe/core/controls/MassEditSelect.ts +41 -0
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +3 -3
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +16 -12
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -22
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -3
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +8 -8
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +48 -48
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +71 -76
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +36 -65
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +107 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +551 -36
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +605 -36
- package/src/sap/fe/core/converters/ConverterContext.js +26 -33
- package/src/sap/fe/core/converters/ConverterContext.ts +51 -60
- package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +17 -14
- 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 +56 -67
- package/src/sap/fe/core/converters/MetaModelConverter.ts +183 -193
- 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 +73 -37
- package/src/sap/fe/core/converters/annotations/DataField.ts +121 -77
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +1911 -1495
- package/src/sap/fe/core/converters/controls/Common/Action.js +51 -49
- package/src/sap/fe/core/converters/controls/Common/Action.ts +58 -54
- package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -15
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +29 -27
- 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 +28 -28
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +40 -36
- package/src/sap/fe/core/converters/controls/Common/Form.js +30 -34
- package/src/sap/fe/core/converters/controls/Common/Form.ts +48 -58
- package/src/sap/fe/core/converters/controls/Common/KPI.js +11 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +35 -39
- package/src/sap/fe/core/converters/controls/Common/Table.js +318 -244
- package/src/sap/fe/core/converters/controls/Common/Table.ts +368 -297
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +135 -125
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +162 -148
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +51 -45
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +79 -67
- 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 +67 -64
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +69 -66
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +92 -89
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +124 -120
- package/src/sap/fe/core/converters/helpers/Aggregation.js +11 -5
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +25 -23
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +31 -30
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +31 -29
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -4
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +9 -9
- package/src/sap/fe/core/converters/helpers/ID.js +46 -46
- package/src/sap/fe/core/converters/helpers/ID.ts +25 -25
- 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 -4
- 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 +46 -62
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +54 -82
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +30 -29
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +40 -40
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +56 -55
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +65 -77
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +6 -6
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +10 -8
- 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 +89 -0
- package/src/sap/fe/core/formatters/StandardFormatter.ts +64 -0
- package/src/sap/fe/core/formatters/TableFormatter.js +83 -22
- package/src/sap/fe/core/formatters/TableFormatter.ts +80 -25
- 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 +2 -2
- package/src/sap/fe/core/fpm/Component.ts +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +15 -15
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +37 -40
- package/src/sap/fe/core/helpers/BindingToolkit.js +1809 -0
- package/src/sap/fe/core/helpers/{BindingExpression.ts → BindingToolkit.ts} +388 -285
- package/src/sap/fe/core/helpers/ClassSupport.js +20 -11
- package/src/sap/fe/core/helpers/ClassSupport.ts +15 -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 +3 -2
- package/src/sap/fe/core/helpers/FPMHelper.ts +10 -9
- 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/MassEditHelper.js +532 -264
- package/src/sap/fe/core/helpers/MassEditHelper.ts +560 -289
- package/src/sap/fe/core/helpers/ModelHelper.js +25 -25
- package/src/sap/fe/core/helpers/ModelHelper.ts +50 -58
- 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 +16 -12
- package/src/sap/fe/core/helpers/StableIdHelper.ts +20 -16
- package/src/sap/fe/core/{Synchronization.js → helpers/Synchronization.js} +1 -1
- package/src/sap/fe/core/{Synchronization.ts → helpers/Synchronization.ts} +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.ts +8 -8
- package/src/sap/fe/core/library.js +51 -3
- package/src/sap/fe/core/library.ts +47 -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 +151 -197
- package/src/sap/fe/core/messagebundle_ar.properties +36 -63
- package/src/sap/fe/core/messagebundle_bg.properties +36 -63
- package/src/sap/fe/core/messagebundle_ca.properties +36 -63
- package/src/sap/fe/core/messagebundle_cs.properties +36 -63
- package/src/sap/fe/core/messagebundle_cy.properties +36 -63
- package/src/sap/fe/core/messagebundle_da.properties +37 -64
- package/src/sap/fe/core/messagebundle_de.properties +36 -63
- package/src/sap/fe/core/messagebundle_el.properties +38 -65
- package/src/sap/fe/core/messagebundle_en.properties +37 -64
- package/src/sap/fe/core/messagebundle_en_GB.properties +37 -64
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +44 -73
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +37 -64
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +52 -81
- package/src/sap/fe/core/messagebundle_es.properties +36 -63
- package/src/sap/fe/core/messagebundle_es_MX.properties +36 -63
- package/src/sap/fe/core/messagebundle_et.properties +36 -63
- package/src/sap/fe/core/messagebundle_fi.properties +36 -63
- package/src/sap/fe/core/messagebundle_fr.properties +39 -66
- package/src/sap/fe/core/messagebundle_fr_CA.properties +36 -63
- package/src/sap/fe/core/messagebundle_hi.properties +36 -63
- package/src/sap/fe/core/messagebundle_hr.properties +36 -63
- package/src/sap/fe/core/messagebundle_hu.properties +35 -62
- package/src/sap/fe/core/messagebundle_id.properties +37 -64
- package/src/sap/fe/core/messagebundle_it.properties +54 -81
- package/src/sap/fe/core/messagebundle_iw.properties +36 -63
- package/src/sap/fe/core/messagebundle_ja.properties +36 -63
- package/src/sap/fe/core/messagebundle_kk.properties +36 -63
- package/src/sap/fe/core/messagebundle_ko.properties +36 -63
- package/src/sap/fe/core/messagebundle_lt.properties +36 -63
- package/src/sap/fe/core/messagebundle_lv.properties +36 -63
- package/src/sap/fe/core/messagebundle_ms.properties +37 -64
- package/src/sap/fe/core/messagebundle_nl.properties +37 -64
- package/src/sap/fe/core/messagebundle_no.properties +36 -63
- package/src/sap/fe/core/messagebundle_pl.properties +37 -64
- package/src/sap/fe/core/messagebundle_pt.properties +37 -64
- package/src/sap/fe/core/messagebundle_pt_PT.properties +36 -63
- package/src/sap/fe/core/messagebundle_ro.properties +36 -63
- package/src/sap/fe/core/messagebundle_ru.properties +36 -63
- package/src/sap/fe/core/messagebundle_sh.properties +36 -63
- package/src/sap/fe/core/messagebundle_sk.properties +36 -63
- package/src/sap/fe/core/messagebundle_sl.properties +38 -65
- package/src/sap/fe/core/messagebundle_sv.properties +36 -63
- package/src/sap/fe/core/messagebundle_th.properties +36 -63
- package/src/sap/fe/core/messagebundle_tr.properties +36 -63
- package/src/sap/fe/core/messagebundle_uk.properties +37 -64
- package/src/sap/fe/core/messagebundle_vi.properties +37 -64
- package/src/sap/fe/core/messagebundle_zh_CN.properties +36 -63
- package/src/sap/fe/core/messagebundle_zh_TW.properties +37 -64
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +5 -5
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +2 -2
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +14 -14
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +6 -3
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +12 -10
- package/src/sap/fe/core/services/NavigationServiceFactory.js +54 -45
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +61 -49
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +2 -2
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +4 -4
- package/src/sap/fe/core/services/RoutingServiceFactory.js +63 -60
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +76 -73
- package/src/sap/fe/core/services/ShellServicesFactory.js +102 -71
- package/src/sap/fe/core/services/ShellServicesFactory.ts +109 -78
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +61 -61
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +102 -92
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +24 -18
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +53 -50
- 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/templating/CommonFormatters.js +84 -0
- package/src/sap/fe/core/templating/CommonFormatters.ts +86 -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 +16 -15
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +42 -32
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +3 -4
- package/src/sap/fe/core/templating/EntitySetHelper.js +7 -15
- package/src/sap/fe/core/templating/EntitySetHelper.ts +14 -18
- 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 +12 -11
- package/src/sap/fe/core/templating/FilterHelper.ts +17 -16
- 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 +79 -56
- package/src/sap/fe/core/templating/PropertyHelper.ts +41 -27
- package/src/sap/fe/core/templating/UIFormatters.js +163 -97
- package/src/sap/fe/core/templating/UIFormatters.ts +210 -129
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +47 -0
- package/src/sap/fe/core/type/DateTimeWithTimezone.ts +23 -0
- package/src/sap/fe/core/type/Email.js +2 -2
- package/src/sap/fe/core/type/Email.ts +2 -2
- package/src/sap/fe/core/AnnotationHelper.js +0 -331
- package/src/sap/fe/core/AnnotationHelper.ts +0 -321
- package/src/sap/fe/core/RouterProxy.js +0 -938
- package/src/sap/fe/core/TransactionHelper.js +0 -1577
- package/src/sap/fe/core/actions/collaboration/ActivitySync.js +0 -406
- package/src/sap/fe/core/actions/collaboration/Manage.js +0 -264
- package/src/sap/fe/core/actions/draft.js +0 -665
- package/src/sap/fe/core/actions/messageHandling.js +0 -579
- package/src/sap/fe/core/actions/nonDraft.js +0 -20
- package/src/sap/fe/core/actions/nonDraft.ts +0 -12
- package/src/sap/fe/core/actions/operations.js +0 -1096
- package/src/sap/fe/core/actions/sticky.js +0 -130
- package/src/sap/fe/core/actions/sticky.ts +0 -119
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +0 -77
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +0 -58
- package/src/sap/fe/core/helpers/BindingExpression.js +0 -1729
|
@@ -117,10 +117,15 @@ function _forTo(array, body, check) {
|
|
|
117
117
|
return pact;
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
-
sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap/fe/macros/ResourceModel", "sap/ui/base/BindingParser", "sap/ui/core/util/XMLPreprocessor", "./TraceInfo"], function (Log, AttributeModel, ResourceModel, BindingParser, XMLPreprocessor, TraceInfo) {
|
|
120
|
+
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) {
|
|
121
121
|
"use strict";
|
|
122
122
|
|
|
123
|
+
var _templateObject, _templateObject2, _templateObject3;
|
|
124
|
+
|
|
123
125
|
var _exports = {};
|
|
126
|
+
var compileExpression = BindingToolkit.compileExpression;
|
|
127
|
+
|
|
128
|
+
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; } } }; }
|
|
124
129
|
|
|
125
130
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
126
131
|
|
|
@@ -148,37 +153,50 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
148
153
|
return result;
|
|
149
154
|
}
|
|
150
155
|
|
|
156
|
+
function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
|
|
157
|
+
|
|
151
158
|
var processBuildingBlock = function (buildingBLockDefinition, oNode, oVisitor) {
|
|
152
159
|
var isPublic = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
153
160
|
|
|
154
161
|
try {
|
|
155
|
-
var
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
var oSettings = oVisitor.getSettings(); // TODO Move this elsewhere this is weird :)
|
|
161
|
-
|
|
162
|
-
if (oSettings.models["sap.fe.i18n"]) {
|
|
163
|
-
oSettings.models["sap.fe.i18n"].getResourceBundle().then(function (oResourceBundle) {
|
|
164
|
-
ResourceModel.setApplicationI18nBundle(oResourceBundle);
|
|
165
|
-
}).catch(function (error) {
|
|
166
|
-
Log.error(error);
|
|
167
|
-
});
|
|
168
|
-
}
|
|
162
|
+
var sFragmentName = buildingBLockDefinition.fragment || "".concat(buildingBLockDefinition.namespace, ".").concat(buildingBLockDefinition.name);
|
|
163
|
+
var sName = "this";
|
|
164
|
+
var mContexts = {};
|
|
165
|
+
var oMetadataContexts = {};
|
|
166
|
+
var oSettings = oVisitor.getSettings(); // TODO 0001 Move this elsewhere this is weird :)
|
|
169
167
|
|
|
170
|
-
|
|
168
|
+
if (oSettings.models["sap.fe.i18n"]) {
|
|
169
|
+
oSettings.models["sap.fe.i18n"].getResourceBundle().then(function (oResourceBundle) {
|
|
170
|
+
ResourceModel.setApplicationI18nBundle(oResourceBundle);
|
|
171
|
+
}).catch(function (error) {
|
|
172
|
+
Log.error(error);
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
var oMetadata = prepareMetadata(buildingBLockDefinition.metadata, buildingBLockDefinition.isOpen); //Inject storage for macros
|
|
177
|
+
|
|
178
|
+
if (!oSettings[sFragmentName]) {
|
|
179
|
+
oSettings[sFragmentName] = {};
|
|
180
|
+
} // First of all we need to visit the attributes
|
|
171
181
|
|
|
172
|
-
if (!oSettings[sFragmentName]) {
|
|
173
|
-
oSettings[sFragmentName] = {};
|
|
174
|
-
} // First of all we need to visit the attributes
|
|
175
182
|
|
|
183
|
+
return Promise.resolve(processProperties(oMetadata, oSettings, oNode, isPublic, oVisitor, mContexts, oMetadataContexts)).then(function (_ref) {
|
|
184
|
+
var mMissingContext = _ref.mMissingContext,
|
|
185
|
+
propertyValues = _ref.propertyValues;
|
|
186
|
+
var initialKeys = Object.keys(propertyValues);
|
|
176
187
|
|
|
177
|
-
|
|
178
|
-
var mMissingContext = _ref.mMissingContext,
|
|
179
|
-
propertyValues = _ref.propertyValues;
|
|
188
|
+
var _temp5 = _catch(function () {
|
|
180
189
|
// Aggregation and complex type support
|
|
181
190
|
return Promise.resolve(processChildren(oNode, oVisitor, oMetadata, isPublic, propertyValues)).then(function (oAggregations) {
|
|
191
|
+
function _temp4() {
|
|
192
|
+
if (oPreviousMacroInfo) {
|
|
193
|
+
//restore macro info if available
|
|
194
|
+
oSettings["_macroInfo"] = oPreviousMacroInfo;
|
|
195
|
+
} else {
|
|
196
|
+
delete oSettings["_macroInfo"];
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
182
200
|
var oInstance;
|
|
183
201
|
var oControlConfig = {};
|
|
184
202
|
|
|
@@ -187,16 +205,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
187
205
|
oControlConfig = oSettings.models.viewData.getProperty("/controlConfiguration");
|
|
188
206
|
}
|
|
189
207
|
|
|
208
|
+
var processedPropertyValues = propertyValues;
|
|
209
|
+
|
|
190
210
|
if (isV1MacroDef(buildingBLockDefinition) && buildingBLockDefinition.create) {
|
|
191
|
-
|
|
211
|
+
processedPropertyValues = buildingBLockDefinition.create.call(buildingBLockDefinition, propertyValues, oControlConfig, oSettings, oAggregations, isPublic);
|
|
192
212
|
Object.keys(oMetadata.metadataContexts).forEach(function (sMetadataName) {
|
|
193
213
|
if (oMetadata.metadataContexts[sMetadataName].computed) {
|
|
194
|
-
mContexts[sMetadataName] =
|
|
214
|
+
mContexts[sMetadataName] = processedPropertyValues[sMetadataName];
|
|
195
215
|
}
|
|
196
216
|
});
|
|
197
217
|
Object.keys(mMissingContext).forEach(function (sContextName) {
|
|
198
|
-
if (
|
|
199
|
-
mContexts[sContextName] =
|
|
218
|
+
if (processedPropertyValues.hasOwnProperty(sContextName)) {
|
|
219
|
+
mContexts[sContextName] = processedPropertyValues[sContextName];
|
|
200
220
|
}
|
|
201
221
|
});
|
|
202
222
|
} else if (buildingBLockDefinition.apiVersion === 2) {
|
|
@@ -213,7 +233,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
213
233
|
);
|
|
214
234
|
}
|
|
215
235
|
|
|
216
|
-
var oAttributesModel = new AttributeModel(oNode,
|
|
236
|
+
var oAttributesModel = new AttributeModel(oNode, processedPropertyValues, buildingBLockDefinition);
|
|
217
237
|
mContexts[sName] = oAttributesModel.createBindingContext("/");
|
|
218
238
|
var oPreviousMacroInfo; // Keep track
|
|
219
239
|
|
|
@@ -238,19 +258,55 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
238
258
|
|
|
239
259
|
if (isV1MacroDef(buildingBLockDefinition) && buildingBLockDefinition.getTemplate || buildingBLockDefinition.apiVersion === 2) {
|
|
240
260
|
var oTemplate;
|
|
261
|
+
var addDefaultNamespace = false;
|
|
241
262
|
|
|
242
263
|
if (buildingBLockDefinition.apiVersion === 2) {
|
|
243
264
|
oTemplate = oInstance.getTemplate();
|
|
265
|
+
addDefaultNamespace = true;
|
|
244
266
|
} else if (buildingBLockDefinition.getTemplate) {
|
|
245
|
-
oTemplate = buildingBLockDefinition.getTemplate(
|
|
267
|
+
oTemplate = buildingBLockDefinition.getTemplate(processedPropertyValues);
|
|
246
268
|
}
|
|
247
269
|
|
|
270
|
+
var hasError = "";
|
|
271
|
+
|
|
248
272
|
if (oTemplate) {
|
|
249
273
|
if (!oTemplate.firstElementChild) {
|
|
250
|
-
oTemplate =
|
|
274
|
+
oTemplate = parseXMLString(oTemplate, addDefaultNamespace); // For safety purpose we try to detect trailing text in between XML Tags
|
|
275
|
+
|
|
276
|
+
var iter = document.createNodeIterator(oTemplate, NodeFilter.SHOW_TEXT);
|
|
277
|
+
var textnode = iter.nextNode();
|
|
278
|
+
|
|
279
|
+
while (textnode) {
|
|
280
|
+
if (textnode.textContent && textnode.textContent.trim().length > 0) {
|
|
281
|
+
hasError = textnode.textContent;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
textnode = iter.nextNode();
|
|
285
|
+
}
|
|
251
286
|
}
|
|
252
287
|
|
|
253
|
-
|
|
288
|
+
if (oTemplate.localName === "parsererror") {
|
|
289
|
+
// 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 and if an error is found it's returned instead of the normal fragment
|
|
291
|
+
Log.error("Error while processing building block ".concat(buildingBLockDefinition.name));
|
|
292
|
+
|
|
293
|
+
try {
|
|
294
|
+
var _oInstance;
|
|
295
|
+
|
|
296
|
+
isTraceMode = true;
|
|
297
|
+
oTemplate = (_oInstance = oInstance) !== null && _oInstance !== void 0 && _oInstance.getTemplate ? oInstance.getTemplate() : buildingBLockDefinition.getTemplate(processedPropertyValues);
|
|
298
|
+
oTemplate = parseXMLString(oTemplate, true);
|
|
299
|
+
} finally {
|
|
300
|
+
isTraceMode = false;
|
|
301
|
+
}
|
|
302
|
+
} else if (hasError.length > 0) {
|
|
303
|
+
// If there is trailing text we create a standard error and display it.
|
|
304
|
+
Log.error("Error while processing building block ".concat(buildingBLockDefinition.name));
|
|
305
|
+
var oErrorText = createErrorXML(["Error while processing building block ".concat(buildingBLockDefinition.name), "Trailing text was found in the XML: ".concat(hasError)], oTemplate.outerHTML);
|
|
306
|
+
oTemplate = parseXMLString(oErrorText, true);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
oNode.replaceWith(oTemplate);
|
|
254
310
|
oNode = oParent.children[iChildIndex];
|
|
255
311
|
oPromise = oContextVisitor.visitNode(oNode);
|
|
256
312
|
} else {
|
|
@@ -280,7 +336,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
280
336
|
|
|
281
337
|
if (sAggregationName !== "customData" && sAggregationName !== "dependents") {
|
|
282
338
|
var sSlotName = oMetadata.aggregations[sAggregationName] && oMetadata.aggregations[sAggregationName].slot || sAggregationName;
|
|
283
|
-
var oTargetElement = oMacroElement.querySelector("slot[name='"
|
|
339
|
+
var oTargetElement = oMacroElement.querySelector("slot[name='".concat(sSlotName, "']"));
|
|
284
340
|
|
|
285
341
|
if (oTargetElement) {
|
|
286
342
|
oTargetElement.replaceWith.apply(oTargetElement, _toConsumableArray(oNewChild.children));
|
|
@@ -298,25 +354,67 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
298
354
|
oSlotElement.remove();
|
|
299
355
|
});
|
|
300
356
|
}
|
|
301
|
-
|
|
302
|
-
if (oPreviousMacroInfo) {
|
|
303
|
-
//restore macro info if available
|
|
304
|
-
oSettings["_macroInfo"] = oPreviousMacroInfo;
|
|
305
|
-
} else {
|
|
306
|
-
delete oSettings["_macroInfo"];
|
|
307
|
-
}
|
|
308
357
|
});
|
|
309
358
|
}
|
|
310
359
|
}();
|
|
311
360
|
|
|
312
|
-
|
|
361
|
+
return _temp3 && _temp3.then ? _temp3.then(_temp4) : _temp4(_temp3);
|
|
313
362
|
});
|
|
363
|
+
}, function (e) {
|
|
364
|
+
// In case there is a generic error (usually code error), we retrieve the current context information and create a dedicated error message
|
|
365
|
+
var traceDetails = {
|
|
366
|
+
initialProperties: {},
|
|
367
|
+
resolvedProperties: {},
|
|
368
|
+
missingContexts: mMissingContext
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
var _iterator = _createForOfIteratorHelper(initialKeys),
|
|
372
|
+
_step;
|
|
373
|
+
|
|
374
|
+
try {
|
|
375
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
376
|
+
var _propertyName = _step.value;
|
|
377
|
+
var _propertyValue = propertyValues[_propertyName];
|
|
378
|
+
|
|
379
|
+
if (_propertyValue && _propertyValue.isA && _propertyValue.isA("sap.ui.model.Context")) {
|
|
380
|
+
traceDetails.initialProperties[_propertyName] = {
|
|
381
|
+
path: _propertyValue.getPath(),
|
|
382
|
+
value: _propertyValue.getObject()
|
|
383
|
+
};
|
|
384
|
+
} else {
|
|
385
|
+
traceDetails.initialProperties[_propertyName] = _propertyValue;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
} catch (err) {
|
|
389
|
+
_iterator.e(err);
|
|
390
|
+
} finally {
|
|
391
|
+
_iterator.f();
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
for (var propertyName in propertyValues) {
|
|
395
|
+
var propertyValue = propertyValues[propertyName];
|
|
396
|
+
|
|
397
|
+
if (!initialKeys.includes(propertyName)) {
|
|
398
|
+
if (propertyValue && propertyValue.isA && propertyValue.isA("sap.ui.model.Context")) {
|
|
399
|
+
traceDetails.resolvedProperties[propertyName] = {
|
|
400
|
+
path: propertyValue.getPath(),
|
|
401
|
+
value: propertyValue.getObject()
|
|
402
|
+
};
|
|
403
|
+
} else {
|
|
404
|
+
traceDetails.resolvedProperties[propertyName] = propertyValue;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
var errorAny = e;
|
|
410
|
+
Log.error(errorAny, errorAny);
|
|
411
|
+
var oError = createErrorXML(["Error while processing building block ".concat(buildingBLockDefinition.name), errorAny.stack], oNode.outerHTML, traceDetails);
|
|
412
|
+
var oTemplate = parseXMLString(oError, true);
|
|
413
|
+
oNode.replaceWith(oTemplate);
|
|
314
414
|
});
|
|
315
|
-
}, function (e) {
|
|
316
|
-
Log.error(e);
|
|
317
|
-
});
|
|
318
415
|
|
|
319
|
-
|
|
416
|
+
if (_temp5 && _temp5.then) return _temp5.then(function () {});
|
|
417
|
+
});
|
|
320
418
|
} catch (e) {
|
|
321
419
|
return Promise.reject(e);
|
|
322
420
|
}
|
|
@@ -369,28 +467,37 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
369
467
|
return a > b ? 1 : -1;
|
|
370
468
|
});
|
|
371
469
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
var bDoNotResolve = isPublic && !oDefinitionContexts[sAttributeName].isPublic && oNode.hasAttribute(sAttributeName);
|
|
470
|
+
var _iterator2 = _createForOfIteratorHelper(aDefinitionContextsKeys),
|
|
471
|
+
_step2;
|
|
375
472
|
|
|
376
|
-
|
|
473
|
+
try {
|
|
474
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
475
|
+
var sAttributeName = _step2.value;
|
|
476
|
+
var bDoNotResolve = isPublic && !oDefinitionContexts[sAttributeName].isPublic && oNode.hasAttribute(sAttributeName);
|
|
377
477
|
|
|
378
|
-
|
|
379
|
-
oMetadataContext.name = sAttributeName;
|
|
380
|
-
addSingleContext(mContexts, oVisitor, oMetadataContext, oMetadataContexts);
|
|
478
|
+
var oMetadataContext = _getMetadataContext(oSettings, oNode, sAttributeName, oVisitor, bDoNotResolve, oMetadata.isOpen);
|
|
381
479
|
|
|
382
|
-
if (
|
|
383
|
-
|
|
384
|
-
|
|
480
|
+
if (oMetadataContext) {
|
|
481
|
+
oMetadataContext.name = sAttributeName;
|
|
482
|
+
addSingleContext(mContexts, oVisitor, oMetadataContext, oMetadataContexts);
|
|
385
483
|
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
484
|
+
if (sAttributeName === "entitySet" && !oSettings.bindingContexts.hasOwnProperty(sAttributeName) || sAttributeName === "contextPath" && !oSettings.bindingContexts.hasOwnProperty(sAttributeName)) {
|
|
485
|
+
oSettings.bindingContexts[sAttributeName] = mContexts[sAttributeName];
|
|
486
|
+
}
|
|
389
487
|
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
488
|
+
if (sAttributeName === "contextPath") {
|
|
489
|
+
oSettings.currentContextPath = mContexts[sAttributeName];
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
propertyValues[sAttributeName] = mContexts[sAttributeName];
|
|
493
|
+
} else {
|
|
494
|
+
mMissingContext[sAttributeName] = true;
|
|
495
|
+
}
|
|
393
496
|
}
|
|
497
|
+
} catch (err) {
|
|
498
|
+
_iterator2.e(err);
|
|
499
|
+
} finally {
|
|
500
|
+
_iterator2.f();
|
|
394
501
|
}
|
|
395
502
|
|
|
396
503
|
return {
|
|
@@ -448,6 +555,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
448
555
|
|
|
449
556
|
var LOGGER_SCOPE = "sap.fe.core.buildingBlocks.BuildingBlockRuntime";
|
|
450
557
|
var DOMParserInstance = new DOMParser();
|
|
558
|
+
var isTraceMode = false;
|
|
451
559
|
|
|
452
560
|
/**
|
|
453
561
|
* Typeguard for checking if a building block use API 1.
|
|
@@ -503,7 +611,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
503
611
|
|
|
504
612
|
if (!oNode.hasAttribute(sKey)) {
|
|
505
613
|
if (oPropertySettings.required && !oPropertySettings.hasOwnProperty("defaultValue")) {
|
|
506
|
-
throw new Error(sName
|
|
614
|
+
throw new Error("".concat(sName, ": ") + "Required property '".concat(sKey, "' is missing"));
|
|
507
615
|
}
|
|
508
616
|
} else {
|
|
509
617
|
delete oAttributeNames[sKey];
|
|
@@ -521,6 +629,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
521
629
|
* Ensures that the metadata for the building block are properly defined.
|
|
522
630
|
*
|
|
523
631
|
* @param buildingBlockMetadata The metadata received from the input
|
|
632
|
+
* @param isOpen Whether the building block is open or not
|
|
524
633
|
* @returns A set of completed metadata for further processing
|
|
525
634
|
*/
|
|
526
635
|
|
|
@@ -528,6 +637,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
528
637
|
_exports.validateMacroSignature = validateMacroSignature;
|
|
529
638
|
|
|
530
639
|
function prepareMetadata(buildingBlockMetadata) {
|
|
640
|
+
var isOpen = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
641
|
+
|
|
531
642
|
if (buildingBlockMetadata) {
|
|
532
643
|
var oProperties = {};
|
|
533
644
|
var oAggregations = {
|
|
@@ -562,7 +673,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
562
673
|
return {
|
|
563
674
|
properties: oProperties,
|
|
564
675
|
aggregations: oAggregations,
|
|
565
|
-
metadataContexts: oMetadataContexts
|
|
676
|
+
metadataContexts: oMetadataContexts,
|
|
677
|
+
isOpen: isOpen
|
|
566
678
|
};
|
|
567
679
|
} else {
|
|
568
680
|
return {
|
|
@@ -575,12 +687,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
575
687
|
type: "sap.ui.core.Element"
|
|
576
688
|
}
|
|
577
689
|
},
|
|
578
|
-
properties: {}
|
|
690
|
+
properties: {},
|
|
691
|
+
isOpen: isOpen
|
|
579
692
|
};
|
|
580
693
|
}
|
|
581
694
|
}
|
|
582
695
|
|
|
583
|
-
function _getMetadataContext(oSettings, oNode, sAttributeName, oVisitor, bDoNotResolve) {
|
|
696
|
+
function _getMetadataContext(oSettings, oNode, sAttributeName, oVisitor, bDoNotResolve, isOpen) {
|
|
584
697
|
var oMetadataContext;
|
|
585
698
|
|
|
586
699
|
if (!bDoNotResolve && oNode.hasAttribute(sAttributeName)) {
|
|
@@ -590,18 +703,26 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
590
703
|
oMetadataContext = BindingParser.complexParser(sAttributeValue);
|
|
591
704
|
|
|
592
705
|
if (!oMetadataContext) {
|
|
593
|
-
if (
|
|
706
|
+
if (sAttributeValue.startsWith("uid--")) {
|
|
707
|
+
var oData = myStore[sAttributeValue];
|
|
708
|
+
var sContextPath = "/".concat(sAttributeValue);
|
|
709
|
+
oSettings.models.converterContext.setProperty(sContextPath, oData);
|
|
710
|
+
oMetadataContext = {
|
|
711
|
+
model: "converterContext",
|
|
712
|
+
path: sContextPath
|
|
713
|
+
};
|
|
714
|
+
} else if (sAttributeName === "metaPath" && oSettings.currentContextPath || sAttributeName === "contextPath") {
|
|
594
715
|
if (sAttributeValue && sAttributeValue.startsWith("/")) {
|
|
595
716
|
// absolute path - we just use this one
|
|
596
717
|
sMetaPath = sAttributeValue;
|
|
597
718
|
} else {
|
|
598
|
-
var
|
|
719
|
+
var _sContextPath = oSettings.currentContextPath.getPath();
|
|
599
720
|
|
|
600
|
-
if (!
|
|
601
|
-
|
|
721
|
+
if (!_sContextPath.endsWith("/")) {
|
|
722
|
+
_sContextPath += "/";
|
|
602
723
|
}
|
|
603
724
|
|
|
604
|
-
sMetaPath =
|
|
725
|
+
sMetaPath = _sContextPath + sAttributeValue;
|
|
605
726
|
}
|
|
606
727
|
|
|
607
728
|
oMetadataContext = {
|
|
@@ -620,6 +741,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
620
741
|
model: sAttributeName,
|
|
621
742
|
path: ""
|
|
622
743
|
};
|
|
744
|
+
} else if (isOpen) {
|
|
745
|
+
try {
|
|
746
|
+
if (oVisitor.getContext("".concat(sAttributeName, ">"))) {
|
|
747
|
+
oMetadataContext = {
|
|
748
|
+
model: sAttributeName,
|
|
749
|
+
path: ""
|
|
750
|
+
};
|
|
751
|
+
}
|
|
752
|
+
} catch (e) {
|
|
753
|
+
oMetadataContext = undefined;
|
|
754
|
+
}
|
|
623
755
|
}
|
|
624
756
|
|
|
625
757
|
return oMetadataContext;
|
|
@@ -636,7 +768,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
636
768
|
var sContextPath = oCtx.path;
|
|
637
769
|
|
|
638
770
|
if (oCtx.model != null) {
|
|
639
|
-
sContextPath = oCtx.model
|
|
771
|
+
sContextPath = "".concat(oCtx.model, ">").concat(sContextPath);
|
|
640
772
|
}
|
|
641
773
|
|
|
642
774
|
var mSetting = oVisitor.getSettings();
|
|
@@ -651,7 +783,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
651
783
|
} catch (ex) {//console.error(ex);
|
|
652
784
|
// ignore the context as this can only be the case if the model is not ready, i.e. not a preprocessing model but maybe a model for
|
|
653
785
|
// providing afterwards
|
|
654
|
-
// TODO not yet implemented
|
|
786
|
+
// TODO 0002 not yet implemented
|
|
655
787
|
//mContexts["_$error"].oModel.setProperty("/" + sKey, ex);
|
|
656
788
|
}
|
|
657
789
|
}
|
|
@@ -673,17 +805,87 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
673
805
|
}, buildingBlockDefinition.publicNamespace, buildingBlockDefinition.xmlTag || buildingBlockDefinition.name);
|
|
674
806
|
}
|
|
675
807
|
}
|
|
808
|
+
|
|
809
|
+
_exports.registerBuildingBlock = registerBuildingBlock;
|
|
810
|
+
|
|
811
|
+
function createErrorXML(errorMessages, xmlFragment, additionalData) {
|
|
812
|
+
var errorLabels = errorMessages.map(function (errorMessage) {
|
|
813
|
+
return xml(_templateObject || (_templateObject = _taggedTemplateLiteral(["<m:Label text=\"", "\"/>"])), escapeXML(errorMessage));
|
|
814
|
+
});
|
|
815
|
+
var additionalText = "";
|
|
816
|
+
|
|
817
|
+
if (additionalData) {
|
|
818
|
+
additionalText = xml(_templateObject2 || (_templateObject2 = _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\" width=\"100vh\"/>\n\t\t\t\t\t</m:VBox>"])), escapeXML(JSON.stringify(additionalData, null, 4)));
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
return xml(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["<m:VBox xmlns:m=\"sap.m\" xmlns:code=\"sap.ui.codeeditor\">\n\t\t\t\t", "\n\t\t\t\t<m:HBox>\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\" width=\"100vh\"/>\n\t\t\t\t\t</m:VBox>\n\t\t\t\t\t", "\n\t\t\t\t</m:HBox>\n\t\t\t</m:VBox>"])), errorLabels, escapeXML(xmlFragment), additionalText);
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
var myStore = {};
|
|
825
|
+
|
|
826
|
+
function storeValue(values) {
|
|
827
|
+
var propertyUID = "uid--".concat(uid());
|
|
828
|
+
myStore[propertyUID] = values;
|
|
829
|
+
return propertyUID;
|
|
830
|
+
}
|
|
676
831
|
/**
|
|
677
|
-
*
|
|
832
|
+
* Parse an XML string and return the associated document.
|
|
833
|
+
*
|
|
834
|
+
* @param xmlString The xml string
|
|
835
|
+
* @param addDefaultNamespaces Whether or not we should add default namespace
|
|
836
|
+
* @returns The XML document.
|
|
837
|
+
*/
|
|
838
|
+
|
|
839
|
+
|
|
840
|
+
function parseXMLString(xmlString) {
|
|
841
|
+
var addDefaultNamespaces = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
842
|
+
|
|
843
|
+
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>");
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
var xmlDocument = DOMParserInstance.parseFromString(xmlString, "text/xml");
|
|
848
|
+
var output = xmlDocument.firstElementChild;
|
|
849
|
+
|
|
850
|
+
while (((_output = output) === null || _output === void 0 ? void 0 : _output.localName) === "template") {
|
|
851
|
+
var _output;
|
|
852
|
+
|
|
853
|
+
output = output.firstElementChild;
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
return output;
|
|
857
|
+
}
|
|
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
|
+
/**
|
|
870
|
+
* Escape an XML attribute value.
|
|
871
|
+
*
|
|
872
|
+
* @param val The attribute value to escape.
|
|
873
|
+
* @returns The escaped string.
|
|
874
|
+
*/
|
|
875
|
+
|
|
876
|
+
|
|
877
|
+
function escapeXMLAttributeValue(val) {
|
|
878
|
+
return val.replace(/&/g, "&").replace(/</g, "<");
|
|
879
|
+
}
|
|
880
|
+
/**
|
|
881
|
+
* Create a string representation of the template literal while handling special object case.
|
|
678
882
|
*
|
|
679
883
|
* @param strings The string parts of the template literal
|
|
680
884
|
* @param values The values part of the template literal
|
|
681
|
-
* @returns The XML document representing the string that was used.
|
|
885
|
+
* @returns The XML string document representing the string that was used.
|
|
682
886
|
*/
|
|
683
887
|
|
|
684
888
|
|
|
685
|
-
_exports.registerBuildingBlock = registerBuildingBlock;
|
|
686
|
-
|
|
687
889
|
var xml = function (strings) {
|
|
688
890
|
var outStr = "";
|
|
689
891
|
var i;
|
|
@@ -693,15 +895,41 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/buildingBlocks/AttributeModel", "sap
|
|
|
693
895
|
}
|
|
694
896
|
|
|
695
897
|
for (i = 0; i < values.length; i++) {
|
|
696
|
-
|
|
697
|
-
|
|
898
|
+
var _values$i, _values$i2;
|
|
899
|
+
|
|
900
|
+
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
|
+
|
|
902
|
+
if (Array.isArray(values[i])) {
|
|
903
|
+
outStr += values[i].flat(5).join("").trim();
|
|
904
|
+
} else if ((_values$i = values[i]) !== null && _values$i !== void 0 && _values$i._type) {
|
|
905
|
+
var compiledExpression = compileExpression(values[i]);
|
|
906
|
+
outStr += compiledExpression !== undefined ? escapeXMLAttributeValue(compiledExpression) : undefined;
|
|
907
|
+
} else if ((_values$i2 = values[i]) !== null && _values$i2 !== void 0 && _values$i2.getTemplate) {
|
|
908
|
+
outStr += values[i].getTemplate();
|
|
909
|
+
} else if (typeof values[i] === "object") {
|
|
910
|
+
var propertyUId = storeValue(values[i]);
|
|
911
|
+
outStr += "".concat(propertyUId);
|
|
912
|
+
} else {
|
|
913
|
+
outStr += values[i];
|
|
914
|
+
}
|
|
698
915
|
}
|
|
699
916
|
|
|
700
917
|
outStr += strings[i];
|
|
701
|
-
|
|
918
|
+
outStr = outStr.trim();
|
|
919
|
+
|
|
920
|
+
if (isTraceMode) {
|
|
921
|
+
var xmlResult = parseXMLString(outStr, true);
|
|
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
|
+
}
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
return outStr;
|
|
702
930
|
};
|
|
703
931
|
|
|
704
932
|
_exports.xml = xml;
|
|
705
933
|
return _exports;
|
|
706
934
|
}, false);
|
|
707
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJ1aWxkaW5nQmxvY2tSdW50aW1lLnRzIl0sIm5hbWVzIjpbInBhY3QiLCJzdGF0ZSIsInZhbHVlIiwicyIsInYiLCJvIiwiYmluZCIsInRoZW4iLCJvYnNlcnZlciIsInByb3RvdHlwZSIsIm9uRnVsZmlsbGVkIiwib25SZWplY3RlZCIsInJlc3VsdCIsImNhbGxiYWNrIiwiZSIsIl90aGlzIiwidGhlbmFibGUiLCJhcnJheSIsImJvZHkiLCJjaGVjayIsImkiLCJyZWplY3QiLCJfY3ljbGUiLCJsZW5ndGgiLCJyZWNvdmVyIiwicHJvY2Vzc0J1aWxkaW5nQmxvY2siLCJidWlsZGluZ0JMb2NrRGVmaW5pdGlvbiIsIm9Ob2RlIiwib1Zpc2l0b3IiLCJpc1B1YmxpYyIsInNGcmFnbWVudE5hbWUiLCJmcmFnbWVudCIsIm5hbWVzcGFjZSIsIm5hbWUiLCJzTmFtZSIsIm1Db250ZXh0cyIsIm9NZXRhZGF0YUNvbnRleHRzIiwib1NldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJtb2RlbHMiLCJnZXRSZXNvdXJjZUJ1bmRsZSIsIm9SZXNvdXJjZUJ1bmRsZSIsIlJlc291cmNlTW9kZWwiLCJzZXRBcHBsaWNhdGlvbkkxOG5CdW5kbGUiLCJjYXRjaCIsImVycm9yIiwiTG9nIiwib01ldGFkYXRhIiwicHJlcGFyZU1ldGFkYXRhIiwibWV0YWRhdGEiLCJwcm9jZXNzUHJvcGVydGllcyIsIm1NaXNzaW5nQ29udGV4dCIsInByb3BlcnR5VmFsdWVzIiwicHJvY2Vzc0NoaWxkcmVuIiwib0FnZ3JlZ2F0aW9ucyIsIm9JbnN0YW5jZSIsIm9Db250cm9sQ29uZmlnIiwidmlld0RhdGEiLCJnZXRQcm9wZXJ0eSIsImlzVjFNYWNyb0RlZiIsImNyZWF0ZSIsImNhbGwiLCJPYmplY3QiLCJrZXlzIiwibWV0YWRhdGFDb250ZXh0cyIsImZvckVhY2giLCJzTWV0YWRhdGFOYW1lIiwiY29tcHV0ZWQiLCJzQ29udGV4dE5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsImFwaVZlcnNpb24iLCJwcm9wTmFtZSIsIm9EYXRhIiwiaXNBIiwiZ2V0TW9kZWwiLCJnZXRPYmplY3QiLCJCdWlsZGluZ0Jsb2NrQ2xhc3MiLCJvQXR0cmlidXRlc01vZGVsIiwiQXR0cmlidXRlTW9kZWwiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIm9QcmV2aW91c01hY3JvSW5mbyIsIlRyYWNlSW5mbyIsImlzVHJhY2VJbmZvQWN0aXZlIiwib1RyYWNlSW5mbyIsInRyYWNlTWFjcm9DYWxscyIsIm1hY3JvSW5mbyIsInZhbGlkYXRlTWFjcm9TaWduYXR1cmUiLCJvQ29udGV4dFZpc2l0b3IiLCJ3aXRoIiwiaXNPcGVuIiwidW5kZWZpbmVkIiwib1BhcmVudCIsInBhcmVudE5vZGUiLCJpQ2hpbGRJbmRleCIsIm9Qcm9taXNlIiwiQXJyYXkiLCJmcm9tIiwiY2hpbGRyZW4iLCJpbmRleE9mIiwiZ2V0VGVtcGxhdGUiLCJvVGVtcGxhdGUiLCJmaXJzdEVsZW1lbnRDaGlsZCIsIkRPTVBhcnNlckluc3RhbmNlIiwicGFyc2VGcm9tU3RyaW5nIiwicmVwbGFjZVdpdGgiLCJ2aXNpdE5vZGUiLCJyZW1vdmUiLCJQcm9taXNlIiwicmVzb2x2ZSIsImluc2VydEZyYWdtZW50Iiwib01hY3JvRWxlbWVudCIsInNBZ2dyZWdhdGlvbk5hbWUiLCJvQWdncmVnYXRpb25FbGVtZW50Iiwib05ld0NoaWxkIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50TlMiLCJuYW1lc3BhY2VVUkkiLCJvRWxlbWVudENoaWxkIiwib05leHRDaGlsZCIsIm5leHRFbGVtZW50U2libGluZyIsImFwcGVuZENoaWxkIiwic1Nsb3ROYW1lIiwiYWdncmVnYXRpb25zIiwic2xvdCIsIm9UYXJnZXRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsIm9SZW1haW5pbmdTbG90cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvU2xvdEVsZW1lbnQiLCJ2aXNpdENoaWxkTm9kZXMiLCJvRmlyc3RFbGVtZW50Q2hpbGQiLCJzQ2hpbGROYW1lIiwibG9jYWxOYW1lIiwicHJvcGVydGllcyIsImF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVJbmRleCIsImFEZWZpbml0aW9uQ29udGV4dHNLZXlzIiwic29ydCIsImEiLCJiIiwiaiIsInNBdHRyaWJ1dGVOYW1lIiwiYkRvTm90UmVzb2x2ZSIsIm9EZWZpbml0aW9uQ29udGV4dHMiLCJoYXNBdHRyaWJ1dGUiLCJvTWV0YWRhdGFDb250ZXh0IiwiX2dldE1ldGFkYXRhQ29udGV4dCIsImFkZFNpbmdsZUNvbnRleHQiLCJiaW5kaW5nQ29udGV4dHMiLCJjdXJyZW50Q29udGV4dFBhdGgiLCJvRGVmaW5pdGlvblByb3BlcnRpZXMiLCJjb250ZXh0UGF0aCIsImFEZWZpbml0aW9uUHJvcGVydGllc0tleXMiLCJzS2V5VmFsdWUiLCJ0eXBlIiwiZGVmYXVsdFZhbHVlIiwidmlzaXRBdHRyaWJ1dGUiLCJnZXROYW1lZEl0ZW0iLCJ2VmFsdWUiLCJnZXRBdHRyaWJ1dGUiLCJMT0dHRVJfU0NPUEUiLCJET01QYXJzZXIiLCJidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiIsInZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQiLCJvQ29udGV4dFNldHRpbmdzIiwic0tleSIsIm9Db250ZXh0Iiwib0NvbnRleHRPYmplY3QiLCJyZXF1aXJlZCIsIkVycm9yIiwiJGtpbmQiLCJnZXRQYXRoIiwiJFR5cGUiLCJhTWV0YWRhdGFDb250ZXh0S2V5cyIsImFQcm9wZXJ0aWVzIiwib0F0dHJpYnV0ZU5hbWVzIiwiaUtleSIsIm9Qcm9wZXJ0eVNldHRpbmdzIiwic3RhcnRzV2l0aCIsIndhcm5pbmciLCJidWlsZGluZ0Jsb2NrTWV0YWRhdGEiLCJvUHJvcGVydGllcyIsInNQcm9wZXJ0eU5hbWUiLCJldmVudHMiLCJzRXZlbnROYW1lIiwic0F0dHJpYnV0ZVZhbHVlIiwic01ldGFQYXRoIiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJzQ29udGV4dFBhdGgiLCJlbmRzV2l0aCIsIm1vZGVsIiwicGF0aCIsImVudGl0eVNldCIsIm9DdHgiLCJtU2V0dGluZyIsImdldENvbnRleHQiLCJleCIsInJlZ2lzdGVyQnVpbGRpbmdCbG9jayIsIlhNTFByZXByb2Nlc3NvciIsInBsdWdJbiIsInhtbFRhZyIsInB1YmxpY05hbWVzcGFjZSIsInhtbCIsInN0cmluZ3MiLCJvdXRTdHIiLCJ2YWx1ZXMiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7O0FBcUNPLGlCQUFpQkEsSUFBakIsRUFBdUJDLEtBQXZCLEVBQThCQyxLQUE5QixFQUFxQztBQUMzQyxNQUFJLENBQUNGLElBQUksQ0FBQ0csQ0FBVixFQUFhO0FBQ1osUUFBSUQsS0FBSyxpQkFBVCxFQUE0QjtBQUMzQixVQUFJQSxLQUFLLENBQUNDLENBQVYsRUFBYTtBQUNaLFlBQUlGLEtBQUssR0FBRyxDQUFaLEVBQWU7QUFDZEEsVUFBQUEsS0FBSyxHQUFHQyxLQUFLLENBQUNDLENBQWQ7QUFDQTs7QUFDREQsUUFBQUEsS0FBSyxHQUFHQSxLQUFLLENBQUNFLENBQWQ7QUFDQSxPQUxELE1BS087QUFDTkYsUUFBQUEsS0FBSyxDQUFDRyxDQUFOLEdBQVUsUUFBUUMsSUFBUixDQUFhLElBQWIsRUFBbUJOLElBQW5CLEVBQXlCQyxLQUF6QixDQUFWO0FBQ0E7QUFDQTtBQUNEOztBQUNELFFBQUlDLEtBQUssSUFBSUEsS0FBSyxDQUFDSyxJQUFuQixFQUF5QjtBQUN4QkwsTUFBQUEsS0FBSyxDQUFDSyxJQUFOLENBQVcsUUFBUUQsSUFBUixDQUFhLElBQWIsRUFBbUJOLElBQW5CLEVBQXlCQyxLQUF6QixDQUFYLEVBQTRDLFFBQVFLLElBQVIsQ0FBYSxJQUFiLEVBQW1CTixJQUFuQixFQUF5QixDQUF6QixDQUE1QztBQUNBO0FBQ0E7O0FBQ0RBLElBQUFBLElBQUksQ0FBQ0csQ0FBTCxHQUFTRixLQUFUO0FBQ0FELElBQUFBLElBQUksQ0FBQ0ksQ0FBTCxHQUFTRixLQUFUO0FBQ0EsUUFBTU0sUUFBUSxHQUFHUixJQUFJLENBQUNLLENBQXRCOztBQUNBLFFBQUlHLFFBQUosRUFBYztBQUNiQSxNQUFBQSxR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LE1BQXZCLEVBQStCSCxDQUFDLEVBQWhDLEVBQW9DO0FBQ25DeUwsTUFBQUEsTUFBTSxJQUFJRCxPQUFPLENBQUN4TCxDQUFELENBQWpCO0FBQ0F5TCxNQUFBQSxNQUFNLElBQUlDLE1BQU0sQ0FBQzFMLENBQUQsQ0FBaEI7QUFDQTs7QUFDRHlMLElBQUFBLE1BQU0sSUFBSUQsT0FBTyxDQUFDeEwsQ0FBRCxDQUFqQjtBQUNBLFdBQU9rRixpQkFBaUIsQ0FBQ0MsZUFBbEIsQ0FBa0NzRyxNQUFsQyxFQUEwQyxVQUExQyxDQUFQO0FBQ0EsR0FUTSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQXR0cmlidXRlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0F0dHJpYnV0ZU1vZGVsXCI7XG5pbXBvcnQge1xuXHRCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrQmFzZSxcblx0QnVpbGRpbmdCbG9ja0RlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjEsXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0QnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tcIjtcbmltcG9ydCBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvbWFjcm9zL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCaW5kaW5nUGFyc2VyIGZyb20gXCJzYXAvdWkvYmFzZS9CaW5kaW5nUGFyc2VyXCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgVHJhY2VJbmZvIGZyb20gXCIuL1RyYWNlSW5mb1wiO1xuXG5jb25zdCBMT0dHRVJfU0NPUEUgPSBcInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzLkJ1aWxkaW5nQmxvY2tSdW50aW1lXCI7XG5jb25zdCBET01QYXJzZXJJbnN0YW5jZSA9IG5ldyBET01QYXJzZXIoKTtcblxudHlwZSBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSA9IHtcblx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja1Byb3BlcnR5RGVmaW5pdGlvbj47XG5cdGFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja0FnZ3JlZ2F0aW9uRGVmaW5pdGlvbj47XG5cdG1ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tNZXRhZGF0YUNvbnRleHREZWZpbml0aW9uPjtcbn07XG5cbnR5cGUgSUNhbGxiYWNrID0ge1xuXHRnZXRTZXR0aW5ncygpOiBhbnk7XG5cdC8qKlxuXHQgKiBWaXNpdHMgdGhlIGdpdmVuIG5vZGUgYW5kIGVpdGhlciBwcm9jZXNzZXMgYSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbiwgY2FsbHNcblx0ICogYSB2aXNpdG9yLCBvciBzaW1wbHkgY2FsbHMgYm90aCB7QGxpbmtcblx0ICogc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0QXR0cmlidXRlcyB2aXNpdEF0dHJpYnV0ZXN9XG5cdCAqIGFuZCB7QGxpbmsgc2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3IuSUNhbGxiYWNrLnZpc2l0Q2hpbGROb2Rlc1xuXHQgKiB2aXNpdENoaWxkTm9kZXN9LlxuXHQgKlxuXHQgKiBAcGFyYW0ge05vZGV9IG9Ob2RlXG5cdCAqICAgVGhlIFhNTCBET00gbm9kZVxuXHQgKiBAcmV0dXJucyB7c2FwLnVpLmJhc2UuU3luY1Byb21pc2V9XG5cdCAqICAgQSB0aGVuYWJsZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB2aXNpdGluZ1xuXHQgKiAgIGlzIGRvbmUsIG9yIGlzIHJlamVjdGVkIHdpdGggYSBjb3JyZXNwb25kaW5nIGVycm9yIGlmIHZpc2l0aW5nIGZhaWxzXG5cdCAqKi9cblx0dmlzaXROb2RlKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogSW5zZXJ0cyB0aGUgZnJhZ21lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiBwbGFjZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4gTG9hZHMgdGhlXG5cdCAqIGZyYWdtZW50LCB0YWtlcyBjYXJlIG9mIGNhY2hpbmcgKGZvciB0aGUgY3VycmVudCBwcmUtcHJvY2Vzc29yIHJ1bikgYW5kIHZpc2l0cyB0aGVcblx0ICogZnJhZ21lbnQncyBjb250ZW50IG9uY2UgaXQgaGFzIGJlZW4gaW1wb3J0ZWQgaW50byB0aGUgZWxlbWVudCdzIG93bmVyIGRvY3VtZW50IGFuZFxuXHQgKiBwdXQgaW50byBwbGFjZS4gTG9hZGluZyBvZiBmcmFnbWVudHMgaXMgYXN5bmNocm9ub3VzIGlmIHRoZSB0ZW1wbGF0ZSB2aWV3IGlzXG5cdCAqIGFzeW5jaHJvbm91cy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNGcmFnbWVudE5hbWVcblx0ICogICB0aGUgZnJhZ21lbnQncyByZXNvbHZlZCBuYW1lXG5cdCAqIEBwYXJhbSB7RWxlbWVudH0gb0VsZW1lbnRcblx0ICogICB0aGUgWE1MIERPTSBlbGVtZW50LCBlLmcuIDxzYXAudWkuY29yZTpGcmFnbWVudD4gb3IgPGNvcmU6RXh0ZW5zaW9uUG9pbnQ+XG5cdCAqIEBwYXJhbSB7c2FwLnVpLmNvcmUudXRpbC5fd2l0aH0gb1dpdGhDb250cm9sXG5cdCAqICAgdGhlIHBhcmVudCdzIFwid2l0aFwiIGNvbnRyb2xcblx0ICogQHJldHVybnMge3NhcC51aS5iYXNlLlN5bmNQcm9taXNlfVxuXHQgKiBBIHN5bmMgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB0aGUgZnJhZ21lbnRcblx0ICogICBoYXMgYmVlbiBpbnNlcnRlZCwgb3IgaXMgcmVqZWN0ZWQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgZXJyb3IgaWYgbG9hZGluZyBvciB2aXNpdGluZ1xuXHQgKiAgIGZhaWxzLlxuXHQgKi9cblx0aW5zZXJ0RnJhZ21lbnQoc0ZyYWdtZW50OiBzdHJpbmcsIG9FbGVtZW50OiBFbGVtZW50LCBvV2l0aD86IGFueSk6IFByb21pc2U8dm9pZD47XG5cdHZpc2l0QXR0cmlidXRlKG9Ob2RlOiBFbGVtZW50LCBvQXR0cmlidXRlOiBBdHRyKTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRDaGlsZE5vZGVzKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEludGVycHJldHMgdGhlIGdpdmVuIFhNTCBET00gYXR0cmlidXRlIHZhbHVlIGFzIGEgYmluZGluZyBhbmQgcmV0dXJucyB0aGVcblx0ICogcmVzdWx0aW5nIHZhbHVlLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1ZhbHVlXG5cdCAqICAgQW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWVcblx0ICogQHBhcmFtIHtFbGVtZW50fSBbb0VsZW1lbnRdXG5cdCAqICAgVGhlIFhNTCBET00gZWxlbWVudCB0aGUgYXR0cmlidXRlIHZhbHVlIGJlbG9uZ3MgdG8gKG5lZWRlZCBvbmx5IGZvclxuXHQgKiAgIHdhcm5pbmdzIHdoaWNoIGFyZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUpXG5cdCAqIEByZXR1cm5zIHtzYXAudWkuYmFzZS5TeW5jUHJvbWlzZXxudWxsfVxuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0aW5nIHZhbHVlLCBvciBpcyByZWplY3RlZCB3aXRoIGFcblx0ICogICBjb3JyZXNwb25kaW5nIGVycm9yIChmb3IgZXhhbXBsZSwgYW4gZXJyb3IgdGhyb3duIGJ5IGEgZm9ybWF0dGVyKSBvclxuXHQgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2UgdGhlIGJpbmRpbmcgaXMgbm90IHJlYWR5IChiZWNhdXNlIGl0IHJlZmVycyB0byBhXG5cdCAqICAgbW9kZWwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSkgKHNpbmNlIDEuNTcuMClcblx0ICovXG5cdGdldFJlc3VsdChzVmFsdWU6IHN0cmluZywgZWxlbWVudD86IEVsZW1lbnQpOiBQcm9taXNlPGFueT4gfCBudWxsO1xuXHQvKipcblx0ICogUmV0dXJucyBhIGNhbGxiYWNrIGludGVyZmFjZSBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIG1hcCBvZiB2YXJpYWJsZXMgd2hpY2hcblx0ICogb3ZlcnJpZGUgY3VycmVudGx5IGtub3duIHZhcmlhYmxlcyBvZiB0aGUgc2FtZSBuYW1lIGluIDxjb2RlPnRoaXM8L2NvZGU+XG5cdCAqIHBhcmVudCBpbnRlcmZhY2Ugb3IgcmVwbGFjZSB0aGVtIGFsdG9nZXRoZXIuIEVhY2ggdmFyaWFibGUgbmFtZSBiZWNvbWVzIGFcblx0ICogbmFtZWQgbW9kZWwgd2l0aCBhIGNvcnJlc3BvbmRpbmcgb2JqZWN0IGJpbmRpbmcgYW5kIGNhbiBiZSB1c2VkIGluc2lkZSB0aGVcblx0ICogWE1MIHRlbXBsYXRlIGluIHRoZSB1c3VhbCB3YXksIHRoYXQgaXMsIHdpdGggYSBiaW5kaW5nIGV4cHJlc3Npb24gbGlrZVxuXHQgKiA8Y29kZT5cInt2YXI+c29tZS9yZWxhdGl2ZS9wYXRofVwiPC9jb2RlPiAoc2VlIGV4YW1wbGUpLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW21WYXJpYWJsZXM9e31dXG5cdCAqICAgTWFwIGZyb20gdmFyaWFibGUgbmFtZSAoc3RyaW5nKSB0byB2YWx1ZSAoe0BsaW5rIHNhcC51aS5tb2RlbC5Db250ZXh0fSlcblx0ICogQHBhcmFtIHtib29sZWFufSBbYlJlcGxhY2VdXG5cdCAqICAgV2hldGhlciBvbmx5IHRoZSBnaXZlbiB2YXJpYWJsZXMgYXJlIGtub3duIGluIHRoZSBuZXcgY2FsbGJhY2sgaW50ZXJmYWNlXG5cdCAqICAgaW5zdGFuY2UsIG5vIGluaGVyaXRlZCBvbmVzXG5cdCAqIEByZXR1cm5zIHtzYXAudWkuY29yZS51dGlsLlhNTFByZXByb2Nlc3Nvci5JQ2FsbGJhY2t9XG5cdCAqICAgQSBjYWxsYmFjayBpbnRlcmZhY2UgaW5zdGFuY2Vcblx0ICogQHBhcmFtIG1WYXJpYWJsZXNcblx0ICogQHBhcmFtIGJSZXBsYWNlXG5cdCAqL1xuXHRcIndpdGhcIihtVmFyaWFibGVzPzogYW55LCBiUmVwbGFjZT86IGJvb2xlYW4pOiBJQ2FsbGJhY2s7XG59O1xuXG4vKipcbiAqIFR5cGVndWFyZCBmb3IgY2hlY2tpbmcgaWYgYSBidWlsZGluZyBibG9jayB1c2UgQVBJIDEuXG4gKlxuICogQHBhcmFtIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIHVzaW5nIEFQSSAxLlxuICovXG5mdW5jdGlvbiBpc1YxTWFjcm9EZWYoYnVpbGRpbmdCbG9ja0RlZmluaXRpb246IEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKTogYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gaXMgQnVpbGRpbmdCbG9ja0RlZmluaXRpb25WMSB7XG5cdHJldHVybiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSB1bmRlZmluZWQgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gMTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQoXG5cdHNOYW1lOiBzdHJpbmcsXG5cdG1Db250ZXh0czogYW55LFxuXHRvQ29udGV4dFNldHRpbmdzOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbixcblx0c0tleTogc3RyaW5nXG4pIHtcblx0Y29uc3Qgb0NvbnRleHQgPSBtQ29udGV4dHNbc0tleV07XG5cdGNvbnN0IG9Db250ZXh0T2JqZWN0ID0gb0NvbnRleHQ/LmdldE9iamVjdCgpO1xuXG5cdGlmIChvQ29udGV4dFNldHRpbmdzLnJlcXVpcmVkICYmICghb0NvbnRleHQgfHwgb0NvbnRleHRPYmplY3QgPT09IG51bGwpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGAke3NOYW1lfTogUmVxdWlyZWQgbWV0YWRhdGFDb250ZXh0ICcke3NLZXl9JyBpcyBtaXNzaW5nYCk7XG5cdH0gZWxzZSBpZiAob0NvbnRleHRPYmplY3QpIHtcblx0XHQvLyBJZiBjb250ZXh0IG9iamVjdCBoYXMgJGtpbmQgcHJvcGVydHksICRUeXBlIHNob3VsZCBub3QgYmUgY2hlY2tlZFxuXHRcdC8vIFRoZXJlZm9yZSByZW1vdmUgZnJvbSBjb250ZXh0IHNldHRpbmdzXG5cdFx0aWYgKG9Db250ZXh0T2JqZWN0Lmhhc093blByb3BlcnR5KFwiJGtpbmRcIikgJiYgb0NvbnRleHRTZXR0aW5ncy4ka2luZCkge1xuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlICRraW5kIGlzIHBhcnQgb2YgdGhlIGFsbG93ZWQgb25lc1xuXHRcdFx0aWYgKG9Db250ZXh0U2V0dGluZ3MuJGtpbmQuaW5kZXhPZihvQ29udGV4dE9iamVjdFtcIiRraW5kXCJdKSA9PT0gLTEpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcdGAke3NOYW1lfTogJyR7c0tleX0nIG11c3QgYmUgJyRraW5kJyAnJHtvQ29udGV4dFNldHRpbmdzW1wiJGtpbmRcIl19JyBidXQgaXMgJyR7XG5cdFx0XHRcdFx0XHRvQ29udGV4dE9iamVjdC4ka2luZFxuXHRcdFx0XHRcdH0nOiAke29Db250ZXh0LmdldFBhdGgoKX1gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRUeXBlXCIpICYmIG9Db250ZXh0U2V0dGluZ3MuJFR5cGUpIHtcblx0XHRcdC8vIENoZWNrIG9ubHkgJFR5cGVcblx0XHRcdGlmIChvQ29udGV4dFNldHRpbmdzLiRUeXBlLmluZGV4T2Yob0NvbnRleHRPYmplY3RbXCIkVHlwZVwiXSkgPT09IC0xKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRgJHtzTmFtZX06ICcke3NLZXl9JyBtdXN0IGJlICckVHlwZScgJyR7b0NvbnRleHRTZXR0aW5nc1tcIiRUeXBlXCJdfScgYnV0IGlzICcke1xuXHRcdFx0XHRcdFx0b0NvbnRleHRPYmplY3QuJFR5cGVcblx0XHRcdFx0XHR9JzogJHtvQ29udGV4dC5nZXRQYXRoKCl9YFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWFjcm9TaWduYXR1cmUoc05hbWU6IGFueSwgb01ldGFkYXRhOiBhbnksIG1Db250ZXh0czogYW55LCBvTm9kZTogYW55KSB7XG5cdGNvbnN0IGFNZXRhZGF0YUNvbnRleHRLZXlzID0gKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKSkgfHwgW10sXG5cdFx0YVByb3BlcnRpZXMgPSAob01ldGFkYXRhLnByb3BlcnRpZXMgJiYgT2JqZWN0LmtleXMob01ldGFkYXRhLnByb3BlcnRpZXMpKSB8fCBbXSxcblx0XHRvQXR0cmlidXRlTmFtZXM6IGFueSA9IHt9O1xuXG5cdC8vIGNvbGxlY3QgYWxsIGF0dHJpYnV0ZXMgdG8gZmluZCB1bmNoZWNrZWQgcHJvcGVydGllc1xuXHRPYmplY3Qua2V5cyhvTm9kZS5hdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChpS2V5OiBzdHJpbmcpIHtcblx0XHRjb25zdCBzS2V5ID0gb05vZGUuYXR0cmlidXRlc1tpS2V5XS5uYW1lO1xuXHRcdG9BdHRyaWJ1dGVOYW1lc1tzS2V5XSA9IHRydWU7XG5cdH0pO1xuXG5cdC8vQ2hlY2sgbWV0YWRhdGFDb250ZXh0c1xuXHRhTWV0YWRhdGFDb250ZXh0S2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRjb25zdCBvQ29udGV4dFNldHRpbmdzID0gb01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc0tleV07XG5cblx0XHR2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0KHNOYW1lLCBtQ29udGV4dHMsIG9Db250ZXh0U2V0dGluZ3MsIHNLZXkpO1xuXHRcdGRlbGV0ZSBvQXR0cmlidXRlTmFtZXNbc0tleV07XG5cdH0pO1xuXHQvL0NoZWNrIHByb3BlcnRpZXNcblx0YVByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0Y29uc3Qgb1Byb3BlcnR5U2V0dGluZ3MgPSBvTWV0YWRhdGEucHJvcGVydGllc1tzS2V5XTtcblx0XHRpZiAoIW9Ob2RlLmhhc0F0dHJpYnV0ZShzS2V5KSkge1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eVNldHRpbmdzLnJlcXVpcmVkICYmICFvUHJvcGVydHlTZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRWYWx1ZVwiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3Ioc05hbWUgKyBcIjogXCIgKyBcIlJlcXVpcmVkIHByb3BlcnR5ICdcIiArIHNLZXkgKyBcIicgaXMgbWlzc2luZ1wiKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVsZXRlIG9BdHRyaWJ1dGVOYW1lc1tzS2V5XTtcblx0XHR9XG5cdH0pO1xuXG5cdC8vIFVuY2hlY2tlZCBwcm9wZXJ0aWVzXG5cdE9iamVjdC5rZXlzKG9BdHRyaWJ1dGVOYW1lcykuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0Ly8gbm8gY2hlY2sgZm9yIHByb3BlcnRpZXMgd2hpY2ggc3RhcnQgd2l0aCB1bmRlcnNjb3JlIFwiX1wiIG9yIGNvbnRhaW4gYSBjb2xvbiBcIjpcIiAoZGlmZmVyZW50IG5hbWVzcGFjZSksIGUuZy4geG1sbnM6dHJhY2UsIHRyYWNlOm1hY3JvSUQsIHVuaXR0ZXN0OmlkXG5cdFx0aWYgKHNLZXkuaW5kZXhPZihcIjpcIikgPCAwICYmICFzS2V5LnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSkge1xuXHRcdFx0TG9nLndhcm5pbmcoYFVuY2hlY2tlZCBwYXJhbWV0ZXI6ICR7c05hbWV9OiAke3NLZXl9YCwgdW5kZWZpbmVkLCBMT0dHRVJfU0NPUEUpO1xuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHRoZSBtZXRhZGF0YSBmb3IgdGhlIGJ1aWxkaW5nIGJsb2NrIGFyZSBwcm9wZXJseSBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEgVGhlIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGlucHV0XG4gKiBAcmV0dXJucyBBIHNldCBvZiBjb21wbGV0ZWQgbWV0YWRhdGEgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICovXG5mdW5jdGlvbiBwcmVwYXJlTWV0YWRhdGEoYnVpbGRpbmdCbG9ja01ldGFkYXRhPzogQnVpbGRpbmdCbG9ja01ldGFkYXRhKTogUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEge1xuXHRpZiAoYnVpbGRpbmdCbG9ja01ldGFkYXRhKSB7XG5cdFx0Y29uc3Qgb1Byb3BlcnRpZXM6IGFueSA9IHt9O1xuXHRcdGNvbnN0IG9BZ2dyZWdhdGlvbnM6IGFueSA9IHtcblx0XHRcdFwiZGVwZW5kZW50c1wiOiB7XG5cdFx0XHRcdHR5cGU6IFwic2FwLnVpLmNvcmUuRWxlbWVudFwiXG5cdFx0XHR9LFxuXHRcdFx0XCJjdXN0b21EYXRhXCI6IHtcblx0XHRcdFx0dHlwZTogXCJzYXAudWkuY29yZS5FbGVtZW50XCJcblx0XHRcdH1cblx0XHR9O1xuXHRcdGNvbnN0IG9NZXRhZGF0YUNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uPiA9IHt9O1xuXG5cdFx0T2JqZWN0LmtleXMoYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXMpLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eU5hbWU6IHN0cmluZykge1xuXHRcdFx0aWYgKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdLnR5cGUgIT09IFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIikge1xuXHRcdFx0XHRvUHJvcGVydGllc1tzUHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dHNbc1Byb3BlcnR5TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllc1tzUHJvcGVydHlOYW1lXTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHQvLyBNZXJnZSBldmVudHMgaW50byBwcm9wZXJ0aWVzIGFzIHRoZXkgYXJlIGhhbmRsZWQgaWRlbnRpY2FsbHlcblx0XHRpZiAoYnVpbGRpbmdCbG9ja01ldGFkYXRhLmV2ZW50cykge1xuXHRcdFx0T2JqZWN0LmtleXMoYnVpbGRpbmdCbG9ja01ldGFkYXRhLmV2ZW50cykuZm9yRWFjaChmdW5jdGlvbiAoc0V2ZW50TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdG9Qcm9wZXJ0aWVzW3NFdmVudE5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLmV2ZW50c1tzRXZlbnROYW1lXTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAoYnVpbGRpbmdCbG9ja01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykge1xuXHRcdFx0T2JqZWN0LmtleXMoYnVpbGRpbmdCbG9ja01ldGFkYXRhLmFnZ3JlZ2F0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdG9BZ2dyZWdhdGlvbnNbc1Byb3BlcnR5TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRwcm9wZXJ0aWVzOiBvUHJvcGVydGllcyxcblx0XHRcdGFnZ3JlZ2F0aW9uczogb0FnZ3JlZ2F0aW9ucyxcblx0XHRcdG1ldGFkYXRhQ29udGV4dHM6IG9NZXRhZGF0YUNvbnRleHRzXG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWV0YWRhdGFDb250ZXh0czoge30sXG5cdFx0XHRhZ2dyZWdhdGlvbnM6IHtcblx0XHRcdFx0XCJkZXBlbmRlbnRzXCI6IHtcblx0XHRcdFx0XHR0eXBlOiBcInNhcC51aS5jb3JlLkVsZW1lbnRcIlxuXHRcdFx0XHR9LFxuXHRcdFx0XHRcImN1c3RvbURhdGFcIjoge1xuXHRcdFx0XHRcdHR5cGU6IFwic2FwLnVpLmNvcmUuRWxlbWVudFwiXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRwcm9wZXJ0aWVzOiB7fVxuXHRcdH07XG5cdH1cbn1cblxuZnVuY3Rpb24gX2dldE1ldGFkYXRhQ29udGV4dChvU2V0dGluZ3M6IGFueSwgb05vZGU6IEVsZW1lbnQsIHNBdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIG9WaXNpdG9yOiBJQ2FsbGJhY2ssIGJEb05vdFJlc29sdmU6IGJvb2xlYW4pIHtcblx0bGV0IG9NZXRhZGF0YUNvbnRleHQ7XG5cdGlmICghYkRvTm90UmVzb2x2ZSAmJiBvTm9kZS5oYXNBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpKSB7XG5cdFx0Y29uc3Qgc0F0dHJpYnV0ZVZhbHVlID0gb05vZGUuZ2V0QXR0cmlidXRlKHNBdHRyaWJ1dGVOYW1lKSBhcyBzdHJpbmc7XG5cdFx0bGV0IHNNZXRhUGF0aDtcblx0XHQvLyBvVmlzaXRvci5nZXRSZXN1bHQoc0F0dHJpYnV0ZVZhbHVlLCBvTm9kZSk7XG5cdFx0b01ldGFkYXRhQ29udGV4dCA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihzQXR0cmlidXRlVmFsdWUpO1xuXHRcdGlmICghb01ldGFkYXRhQ29udGV4dCkge1xuXHRcdFx0aWYgKChzQXR0cmlidXRlTmFtZSA9PT0gXCJtZXRhUGF0aFwiICYmIG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGgpIHx8IHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIpIHtcblx0XHRcdFx0aWYgKHNBdHRyaWJ1dGVWYWx1ZSAmJiBzQXR0cmlidXRlVmFsdWUuc3RhcnRzV2l0aChcIi9cIikpIHtcblx0XHRcdFx0XHQvLyBhYnNvbHV0ZSBwYXRoIC0gd2UganVzdCB1c2UgdGhpcyBvbmVcblx0XHRcdFx0XHRzTWV0YVBhdGggPSBzQXR0cmlidXRlVmFsdWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGV0IHNDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGguZ2V0UGF0aCgpO1xuXHRcdFx0XHRcdGlmICghc0NvbnRleHRQYXRoLmVuZHNXaXRoKFwiL1wiKSkge1xuXHRcdFx0XHRcdFx0c0NvbnRleHRQYXRoICs9IFwiL1wiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzTWV0YVBhdGggPSBzQ29udGV4dFBhdGggKyBzQXR0cmlidXRlVmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0b01ldGFkYXRhQ29udGV4dCA9IHtcblx0XHRcdFx0XHRtb2RlbDogXCJtZXRhTW9kZWxcIixcblx0XHRcdFx0XHRwYXRoOiBzTWV0YVBhdGhcblx0XHRcdFx0fTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IFwibWV0YU1vZGVsXCIsXG5cdFx0XHRcdFx0cGF0aDogb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXRcblx0XHRcdFx0XHRcdD8gb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5lbnRpdHlTZXQuZ2V0UGF0aChzQXR0cmlidXRlVmFsdWUpXG5cdFx0XHRcdFx0XHQ6IHNBdHRyaWJ1dGVWYWx1ZVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmIChvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSkge1xuXHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRtb2RlbDogc0F0dHJpYnV0ZU5hbWUsXG5cdFx0XHRwYXRoOiBcIlwiXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gb01ldGFkYXRhQ29udGV4dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMoXG5cdG9NZXRhZGF0YTogUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdG9TZXR0aW5nczogYW55LFxuXHRvTm9kZTogRWxlbWVudCxcblx0aXNQdWJsaWM6IGJvb2xlYW4sXG5cdG9WaXNpdG9yOiBJQ2FsbGJhY2ssXG5cdG1Db250ZXh0czogYW55LFxuXHRvTWV0YWRhdGFDb250ZXh0czogYW55XG4pIHtcblx0Y29uc3QgbU1pc3NpbmdDb250ZXh0OiBhbnkgPSB7fTtcblx0Y29uc3Qgb0RlZmluaXRpb25Qcm9wZXJ0aWVzID0gb01ldGFkYXRhLnByb3BlcnRpZXM7XG5cdGNvbnN0IG9EZWZpbml0aW9uQ29udGV4dHMgPSBvTWV0YWRhdGEubWV0YWRhdGFDb250ZXh0cztcblx0b1NldHRpbmdzLmN1cnJlbnRDb250ZXh0UGF0aCA9IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuY29udGV4dFBhdGg7XG5cblx0Ly8gUmV0cmlldmUgcHJvcGVydGllcyB2YWx1ZXNcblx0Y29uc3QgYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uUHJvcGVydGllcyk7XG5cdGxldCBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IE9iamVjdC5rZXlzKG9EZWZpbml0aW9uQ29udGV4dHMpO1xuXHRjb25zdCBwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXHRmb3IgKGxldCBqID0gMDsgaiA8IGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMubGVuZ3RoOyBqKyspIHtcblx0XHRjb25zdCBzS2V5VmFsdWUgPSBhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzW2pdO1xuXHRcdGlmIChvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS50eXBlID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0ge307IC8vIFRvIGF2b2lkIHZhbGVzIGJlaW5nIHJldXNlZCBhY2Nyb3NzIG1hY3Jvc1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlc1tzS2V5VmFsdWVdID0gb0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0XHRpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkgJiYgaXNQdWJsaWMgJiYgIW9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmlzUHVibGljKSB7XG5cdFx0XHRMb2cuZXJyb3IoYFByb3BlcnR5ICR7c0tleVZhbHVlfSB3YXMgaWdub3JlZCBhcyBpdCBpcyBub3QgaW50ZW5kZWQgZm9yIHB1YmxpYyB1c2FnZWApO1xuXHRcdH0gZWxzZSBpZiAob05vZGUuaGFzQXR0cmlidXRlKHNLZXlWYWx1ZSkpIHtcblx0XHRcdGF3YWl0IG9WaXNpdG9yLnZpc2l0QXR0cmlidXRlKG9Ob2RlLCBvTm9kZS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShzS2V5VmFsdWUpIGFzIEF0dHIpO1xuXHRcdFx0Y29uc3QgdlZhbHVlID0gb05vZGUuZ2V0QXR0cmlidXRlKHNLZXlWYWx1ZSk7XG5cdFx0XHRpZiAodlZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9IHZWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Ly8gU29ydCBrZXlzIHRvIGJlIHN1cmUgY29udGV4dFBhdGggaXMgYmVmb3JlIG1ldGFQYXRoICggeWVzIEknbSBkZXNwZXJhdGUgKVxuXHRhRGVmaW5pdGlvbkNvbnRleHRzS2V5cyA9IGFEZWZpbml0aW9uQ29udGV4dHNLZXlzLnNvcnQoZnVuY3Rpb24gKGE6IHN0cmluZywgYjogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGEgPiBiID8gMSA6IC0xO1xuXHR9KTtcblx0Zm9yIChsZXQgaiA9IDA7IGogPCBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cy5sZW5ndGg7IGorKykge1xuXHRcdGNvbnN0IHNBdHRyaWJ1dGVOYW1lID0gYURlZmluaXRpb25Db250ZXh0c0tleXNbal07XG5cdFx0Y29uc3QgYkRvTm90UmVzb2x2ZSA9IGlzUHVibGljICYmICFvRGVmaW5pdGlvbkNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXS5pc1B1YmxpYyAmJiBvTm9kZS5oYXNBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpO1xuXHRcdGNvbnN0IG9NZXRhZGF0YUNvbnRleHQgPSBfZ2V0TWV0YWRhdGFDb250ZXh0KG9TZXR0aW5ncywgb05vZGUsIHNBdHRyaWJ1dGVOYW1lLCBvVmlzaXRvciwgYkRvTm90UmVzb2x2ZSk7XG5cdFx0aWYgKG9NZXRhZGF0YUNvbnRleHQpIHtcblx0XHRcdG9NZXRhZGF0YUNvbnRleHQubmFtZSA9IHNBdHRyaWJ1dGVOYW1lO1xuXHRcdFx0YWRkU2luZ2xlQ29udGV4dChtQ29udGV4dHMsIG9WaXNpdG9yLCBvTWV0YWRhdGFDb250ZXh0LCBvTWV0YWRhdGFDb250ZXh0cyk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChzQXR0cmlidXRlTmFtZSA9PT0gXCJlbnRpdHlTZXRcIiAmJiAhb1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQXR0cmlidXRlTmFtZSkpIHx8XG5cdFx0XHRcdChzQXR0cmlidXRlTmFtZSA9PT0gXCJjb250ZXh0UGF0aFwiICYmICFvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSlcblx0XHRcdCkge1xuXHRcdFx0XHRvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXSA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0XHR9XG5cdFx0XHRpZiAoc0F0dHJpYnV0ZU5hbWUgPT09IFwiY29udGV4dFBhdGhcIikge1xuXHRcdFx0XHRvU2V0dGluZ3MuY3VycmVudENvbnRleHRQYXRoID0gbUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdH1cblx0XHRcdHByb3BlcnR5VmFsdWVzW3NBdHRyaWJ1dGVOYW1lXSA9IG1Db250ZXh0c1tzQXR0cmlidXRlTmFtZV07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1NaXNzaW5nQ29udGV4dFtzQXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4geyBtTWlzc2luZ0NvbnRleHQsIHByb3BlcnR5VmFsdWVzIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NDaGlsZHJlbihcblx0b05vZGU6IEVsZW1lbnQsXG5cdG9WaXNpdG9yOiBJQ2FsbGJhY2ssXG5cdG9NZXRhZGF0YTogUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PlxuKSB7XG5cdGNvbnN0IG9BZ2dyZWdhdGlvbnM6IGFueSA9IHt9O1xuXHRpZiAob05vZGUuZmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcblx0XHQvLyBJZiB0aGVyZSBhcmUgYWdncmVnYXRpb24gd2UgbmVlZCB0byB2aXNpdCB0aGUgY2hpbGROb2RlcyBmaXJzdCBhbmQgZm9yZW1vc3Rcblx0XHRhd2FpdCBvVmlzaXRvci52aXNpdENoaWxkTm9kZXMob05vZGUpO1xuXHRcdGxldCBvRmlyc3RFbGVtZW50Q2hpbGQ6IEVsZW1lbnQgfCBudWxsID0gb05vZGUuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0d2hpbGUgKG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3Qgc0NoaWxkTmFtZSA9IG9GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWU7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdE9iamVjdC5rZXlzKG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnMpLmluZGV4T2Yoc0NoaWxkTmFtZSkgIT09IC0xICYmXG5cdFx0XHRcdCghaXNQdWJsaWMgfHwgb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQ2hpbGROYW1lXS5pc1B1YmxpYylcblx0XHRcdCkge1xuXHRcdFx0XHRvQWdncmVnYXRpb25zW29GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWVdID0gb0ZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0fSBlbHNlIGlmIChPYmplY3Qua2V5cyhvTWV0YWRhdGEucHJvcGVydGllcykuaW5kZXhPZihzQ2hpbGROYW1lKSAhPT0gLTEpIHtcblx0XHRcdFx0Ly8gT2JqZWN0IFR5cGUgcHJvcGVydGllc1xuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQ2hpbGROYW1lXSA9IHt9O1xuXHRcdFx0XHRmb3IgKGNvbnN0IGF0dHJpYnV0ZUluZGV4IG9mIE9iamVjdC5rZXlzKG9GaXJzdEVsZW1lbnRDaGlsZC5hdHRyaWJ1dGVzKSkge1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NDaGlsZE5hbWVdW29GaXJzdEVsZW1lbnRDaGlsZC5hdHRyaWJ1dGVzW2F0dHJpYnV0ZUluZGV4IGFzIGFueV0ubG9jYWxOYW1lXSA9XG5cdFx0XHRcdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQuYXR0cmlidXRlc1thdHRyaWJ1dGVJbmRleCBhcyBhbnldLnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvQWdncmVnYXRpb25zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzQnVpbGRpbmdCbG9jayhcblx0YnVpbGRpbmdCTG9ja0RlZmluaXRpb246IEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElDYWxsYmFjayxcblx0aXNQdWJsaWMgPSBmYWxzZVxuKSB7XG5cdHRyeSB7XG5cdFx0Y29uc3Qgc0ZyYWdtZW50TmFtZSA9IGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmZyYWdtZW50IHx8IGAke2J1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm5hbWVzcGFjZX0uJHtidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5uYW1lfWA7XG5cblx0XHRjb25zdCBzTmFtZSA9IFwidGhpc1wiO1xuXG5cdFx0Y29uc3QgbUNvbnRleHRzOiBhbnkgPSB7fTtcblx0XHRjb25zdCBvTWV0YWRhdGFDb250ZXh0czogYW55ID0ge307XG5cdFx0Y29uc3Qgb1NldHRpbmdzID0gb1Zpc2l0b3IuZ2V0U2V0dGluZ3MoKTtcblx0XHQvLyBUT0RPIE1vdmUgdGhpcyBlbHNld2hlcmUgdGhpcyBpcyB3ZWlyZCA6KVxuXHRcdGlmIChvU2V0dGluZ3MubW9kZWxzW1wic2FwLmZlLmkxOG5cIl0pIHtcblx0XHRcdG9TZXR0aW5ncy5tb2RlbHNbXCJzYXAuZmUuaTE4blwiXVxuXHRcdFx0XHQuZ2V0UmVzb3VyY2VCdW5kbGUoKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc291cmNlQnVuZGxlOiBhbnkpIHtcblx0XHRcdFx0XHRSZXNvdXJjZU1vZGVsLnNldEFwcGxpY2F0aW9uSTE4bkJ1bmRsZShvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0Y29uc3Qgb01ldGFkYXRhID0gcHJlcGFyZU1ldGFkYXRhKGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm1ldGFkYXRhKTtcblxuXHRcdC8vSW5qZWN0IHN0b3JhZ2UgZm9yIG1hY3Jvc1xuXHRcdGlmICghb1NldHRpbmdzW3NGcmFnbWVudE5hbWVdKSB7XG5cdFx0XHRvU2V0dGluZ3Nbc0ZyYWdtZW50TmFtZV0gPSB7fTtcblx0XHR9XG5cblx0XHQvLyBGaXJzdCBvZiBhbGwgd2UgbmVlZCB0byB2aXNpdCB0aGUgYXR0cmlidXRlc1xuXHRcdGxldCB7IG1NaXNzaW5nQ29udGV4dCwgcHJvcGVydHlWYWx1ZXMgfSA9IGF3YWl0IHByb2Nlc3NQcm9wZXJ0aWVzKFxuXHRcdFx0b01ldGFkYXRhLFxuXHRcdFx0b1NldHRpbmdzLFxuXHRcdFx0b05vZGUsXG5cdFx0XHRpc1B1YmxpYyxcblx0XHRcdG9WaXNpdG9yLFxuXHRcdFx0bUNvbnRleHRzLFxuXHRcdFx0b01ldGFkYXRhQ29udGV4dHNcblx0XHQpO1xuXG5cdFx0Ly8gQWdncmVnYXRpb24gYW5kIGNvbXBsZXggdHlwZSBzdXBwb3J0XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9ucyA9IGF3YWl0IHByb2Nlc3NDaGlsZHJlbihvTm9kZSwgb1Zpc2l0b3IsIG9NZXRhZGF0YSwgaXNQdWJsaWMsIHByb3BlcnR5VmFsdWVzKTtcblx0XHRsZXQgb0luc3RhbmNlOiBhbnk7XG5cdFx0bGV0IG9Db250cm9sQ29uZmlnID0ge307XG5cblx0XHRpZiAob1NldHRpbmdzLm1vZGVscy52aWV3RGF0YSkge1xuXHRcdFx0Ly8gT25seSB1c2VkIGluIHRoZSBGaWVsZCBtYWNybyBhbmQgZXZlbiB0aGVuIG1heWJlIG5vdCByZWFsbHkgdXNlZnVsXG5cdFx0XHRvQ29udHJvbENvbmZpZyA9IG9TZXR0aW5ncy5tb2RlbHMudmlld0RhdGEuZ2V0UHJvcGVydHkoXCIvY29udHJvbENvbmZpZ3VyYXRpb25cIik7XG5cdFx0fVxuXG5cdFx0aWYgKGlzVjFNYWNyb0RlZihidWlsZGluZ0JMb2NrRGVmaW5pdGlvbikgJiYgYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uY3JlYXRlKSB7XG5cdFx0XHRwcm9wZXJ0eVZhbHVlcyA9IGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmNyZWF0ZS5jYWxsKFxuXHRcdFx0XHRidWlsZGluZ0JMb2NrRGVmaW5pdGlvbixcblx0XHRcdFx0cHJvcGVydHlWYWx1ZXMsXG5cdFx0XHRcdG9Db250cm9sQ29uZmlnLFxuXHRcdFx0XHRvU2V0dGluZ3MsXG5cdFx0XHRcdG9BZ2dyZWdhdGlvbnMsXG5cdFx0XHRcdGlzUHVibGljXG5cdFx0XHQpO1xuXHRcdFx0T2JqZWN0LmtleXMob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNNZXRhZGF0YU5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRpZiAob01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc01ldGFkYXRhTmFtZV0uY29tcHV0ZWQpIHtcblx0XHRcdFx0XHRtQ29udGV4dHNbc01ldGFkYXRhTmFtZV0gPSBwcm9wZXJ0eVZhbHVlc1tzTWV0YWRhdGFOYW1lXTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRPYmplY3Qua2V5cyhtTWlzc2luZ0NvbnRleHQpLmZvckVhY2goZnVuY3Rpb24gKHNDb250ZXh0TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShzQ29udGV4dE5hbWUpKSB7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NDb250ZXh0TmFtZV0gPSBwcm9wZXJ0eVZhbHVlc1tzQ29udGV4dE5hbWVdO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDIpIHtcblx0XHRcdE9iamVjdC5rZXlzKHByb3BlcnR5VmFsdWVzKS5mb3JFYWNoKChwcm9wTmFtZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBvRGF0YSA9IHByb3BlcnR5VmFsdWVzW3Byb3BOYW1lXTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdG9EYXRhICYmXG5cdFx0XHRcdFx0b0RhdGEuaXNBICYmXG5cdFx0XHRcdFx0b0RhdGEuaXNBKFwic2FwLnVpLm1vZGVsLkNvbnRleHRcIikgJiZcblx0XHRcdFx0XHQhb0RhdGEuZ2V0TW9kZWwoKS5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNZXRhTW9kZWxcIilcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZXNbcHJvcE5hbWVdID0gb0RhdGEuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgQnVpbGRpbmdCbG9ja0NsYXNzID0gYnVpbGRpbmdCTG9ja0RlZmluaXRpb24gYXMgdHlwZW9mIEJ1aWxkaW5nQmxvY2tCYXNlO1xuXHRcdFx0b0luc3RhbmNlID0gbmV3IEJ1aWxkaW5nQmxvY2tDbGFzcyhwcm9wZXJ0eVZhbHVlcyAvKiwgb0NvbnRyb2xDb25maWcsIG9TZXR0aW5ncywgb0FnZ3JlZ2F0aW9ucywgaXNQdWJsaWMqLyk7XG5cdFx0fVxuXHRcdGNvbnN0IG9BdHRyaWJ1dGVzTW9kZWw6IEpTT05Nb2RlbCA9IG5ldyBBdHRyaWJ1dGVNb2RlbChvTm9kZSwgcHJvcGVydHlWYWx1ZXMsIGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uKTtcblx0XHRtQ29udGV4dHNbc05hbWVdID0gb0F0dHJpYnV0ZXNNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cblx0XHRsZXQgb1ByZXZpb3VzTWFjcm9JbmZvOiBhbnk7XG5cblx0XHQvLyBLZWVwIHRyYWNrXG5cdFx0aWYgKFRyYWNlSW5mby5pc1RyYWNlSW5mb0FjdGl2ZSgpKSB7XG5cdFx0XHRjb25zdCBvVHJhY2VJbmZvID0gVHJhY2VJbmZvLnRyYWNlTWFjcm9DYWxscyhzRnJhZ21lbnROYW1lLCBvTWV0YWRhdGEsIG1Db250ZXh0cywgb05vZGUsIG9WaXNpdG9yKTtcblx0XHRcdGlmIChvVHJhY2VJbmZvKSB7XG5cdFx0XHRcdG9QcmV2aW91c01hY3JvSW5mbyA9IG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl07XG5cdFx0XHRcdG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl0gPSBvVHJhY2VJbmZvLm1hY3JvSW5mbztcblx0XHRcdH1cblx0XHR9XG5cdFx0dmFsaWRhdGVNYWNyb1NpZ25hdHVyZShzRnJhZ21lbnROYW1lLCBvTWV0YWRhdGEsIG1Db250ZXh0cywgb05vZGUpO1xuXG5cdFx0Y29uc3Qgb0NvbnRleHRWaXNpdG9yID0gb1Zpc2l0b3Iud2l0aChcblx0XHRcdG1Db250ZXh0cyxcblx0XHRcdGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmlzT3BlbiAhPT0gdW5kZWZpbmVkID8gIWJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmlzT3BlbiA6IHRydWVcblx0XHQpO1xuXHRcdGNvbnN0IG9QYXJlbnQgPSBvTm9kZS5wYXJlbnROb2RlO1xuXG5cdFx0bGV0IGlDaGlsZEluZGV4OiBudW1iZXI7XG5cdFx0bGV0IG9Qcm9taXNlO1xuXHRcdGlmIChvUGFyZW50KSB7XG5cdFx0XHRpQ2hpbGRJbmRleCA9IEFycmF5LmZyb20ob1BhcmVudC5jaGlsZHJlbikuaW5kZXhPZihvTm9kZSk7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0KGlzVjFNYWNyb0RlZihidWlsZGluZ0JMb2NrRGVmaW5pdGlvbikgJiYgYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uZ2V0VGVtcGxhdGUpIHx8XG5cdFx0XHRcdGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDJcblx0XHRcdCkge1xuXHRcdFx0XHRsZXQgb1RlbXBsYXRlO1xuXHRcdFx0XHRpZiAoYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gMikge1xuXHRcdFx0XHRcdG9UZW1wbGF0ZSA9IG9JbnN0YW5jZS5nZXRUZW1wbGF0ZSgpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmdldFRlbXBsYXRlKSB7XG5cdFx0XHRcdFx0b1RlbXBsYXRlID0gYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uZ2V0VGVtcGxhdGUocHJvcGVydHlWYWx1ZXMpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKG9UZW1wbGF0ZSkge1xuXHRcdFx0XHRcdGlmICghb1RlbXBsYXRlLmZpcnN0RWxlbWVudENoaWxkKSB7XG5cdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBET01QYXJzZXJJbnN0YW5jZS5wYXJzZUZyb21TdHJpbmcob1RlbXBsYXRlLCBcInRleHQveG1sXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRvTm9kZS5yZXBsYWNlV2l0aChvVGVtcGxhdGUuZmlyc3RFbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdG9Ob2RlID0gb1BhcmVudC5jaGlsZHJlbltpQ2hpbGRJbmRleF07XG5cdFx0XHRcdFx0b1Byb21pc2UgPSBvQ29udGV4dFZpc2l0b3IudmlzaXROb2RlKG9Ob2RlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvTm9kZS5yZW1vdmUoKTtcblx0XHRcdFx0XHRvUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvUHJvbWlzZSA9IG9Db250ZXh0VmlzaXRvci5pbnNlcnRGcmFnbWVudChzRnJhZ21lbnROYW1lLCBvTm9kZSk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IG9Qcm9taXNlO1xuXHRcdFx0Y29uc3Qgb01hY3JvRWxlbWVudCA9IG9QYXJlbnQuY2hpbGRyZW5baUNoaWxkSW5kZXhdO1xuXG5cdFx0XHRpZiAoT2JqZWN0LmtleXMob0FnZ3JlZ2F0aW9ucykubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRPYmplY3Qua2V5cyhvQWdncmVnYXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRjb25zdCBvQWdncmVnYXRpb25FbGVtZW50ID0gb0FnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXTtcblx0XHRcdFx0XHRpZiAob01hY3JvRWxlbWVudCAhPT0gbnVsbCAmJiBvTWFjcm9FbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9OZXdDaGlsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvTWFjcm9FbGVtZW50Lm5hbWVzcGFjZVVSSSwgc0FnZ3JlZ2F0aW9uTmFtZSk7XG5cdFx0XHRcdFx0XHRsZXQgb0VsZW1lbnRDaGlsZCA9IG9BZ2dyZWdhdGlvbkVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdFx0XHR3aGlsZSAob0VsZW1lbnRDaGlsZCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTmV4dENoaWxkID0gb0VsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0XHRcdFx0XHRcdG9OZXdDaGlsZC5hcHBlbmRDaGlsZChvRWxlbWVudENoaWxkKTtcblx0XHRcdFx0XHRcdFx0b0VsZW1lbnRDaGlsZCA9IG9OZXh0Q2hpbGQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoc0FnZ3JlZ2F0aW9uTmFtZSAhPT0gXCJjdXN0b21EYXRhXCIgJiYgc0FnZ3JlZ2F0aW9uTmFtZSAhPT0gXCJkZXBlbmRlbnRzXCIpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc1Nsb3ROYW1lID1cblx0XHRcdFx0XHRcdFx0XHQob01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQWdncmVnYXRpb25OYW1lXSAmJiBvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdLnNsb3QpIHx8XG5cdFx0XHRcdFx0XHRcdFx0c0FnZ3JlZ2F0aW9uTmFtZTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb1RhcmdldEVsZW1lbnQgPSBvTWFjcm9FbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJzbG90W25hbWU9J1wiICsgc1Nsb3ROYW1lICsgXCInXVwiKSBhcyBFbGVtZW50O1xuXHRcdFx0XHRcdFx0XHRpZiAob1RhcmdldEVsZW1lbnQpIHtcblx0XHRcdFx0XHRcdFx0XHRvVGFyZ2V0RWxlbWVudC5yZXBsYWNlV2l0aCguLi4ob05ld0NoaWxkLmNoaWxkcmVuIGFzIGFueSkpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvTWFjcm9FbGVtZW50LmFwcGVuZENoaWxkKG9OZXdDaGlsZCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGlmIChvTWFjcm9FbGVtZW50KSB7XG5cdFx0XHRcdGNvbnN0IG9SZW1haW5pbmdTbG90cyA9IG9NYWNyb0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcInNsb3RcIik7XG5cdFx0XHRcdG9SZW1haW5pbmdTbG90cy5mb3JFYWNoKGZ1bmN0aW9uIChvU2xvdEVsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdG9TbG90RWxlbWVudC5yZW1vdmUoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob1ByZXZpb3VzTWFjcm9JbmZvKSB7XG5cdFx0XHRcdC8vcmVzdG9yZSBtYWNybyBpbmZvIGlmIGF2YWlsYWJsZVxuXHRcdFx0XHRvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdID0gb1ByZXZpb3VzTWFjcm9JbmZvO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRlIG9TZXR0aW5nc1tcIl9tYWNyb0luZm9cIl07XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGNhdGNoIChlKSB7XG5cdFx0TG9nLmVycm9yKGUgYXMgYW55KTtcblx0fVxufVxuZnVuY3Rpb24gYWRkU2luZ2xlQ29udGV4dChtQ29udGV4dHM6IGFueSwgb1Zpc2l0b3I6IGFueSwgb0N0eDogYW55LCBvTWV0YWRhdGFDb250ZXh0czogYW55KSB7XG5cdGNvbnN0IHNLZXkgPSBvQ3R4Lm5hbWUgfHwgb0N0eC5tb2RlbCB8fCB1bmRlZmluZWQ7XG5cblx0aWYgKG9NZXRhZGF0YUNvbnRleHRzW3NLZXldKSB7XG5cdFx0cmV0dXJuOyAvLyBkbyBub3QgYWRkIHR3aWNlXG5cdH1cblx0dHJ5IHtcblx0XHRsZXQgc0NvbnRleHRQYXRoID0gb0N0eC5wYXRoO1xuXHRcdGlmIChvQ3R4Lm1vZGVsICE9IG51bGwpIHtcblx0XHRcdHNDb250ZXh0UGF0aCA9IG9DdHgubW9kZWwgKyBcIj5cIiArIHNDb250ZXh0UGF0aDtcblx0XHR9XG5cdFx0Y29uc3QgbVNldHRpbmcgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHRcdGlmICghbVNldHRpbmcuYmluZGluZ0NvbnRleHRzW29DdHgubW9kZWxdICYmIG1TZXR0aW5nLm1vZGVsc1tvQ3R4Lm1vZGVsXSkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWxdLmdldENvbnRleHQob0N0eC5wYXRoKTsgLy8gYWRkIHRoZSBjb250ZXh0IHRvIHRoZSB2aXNpdG9yXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1Db250ZXh0c1tzS2V5XSA9IG9WaXNpdG9yLmdldENvbnRleHQoc0NvbnRleHRQYXRoKTsgLy8gYWRkIHRoZSBjb250ZXh0IHRvIHRoZSB2aXNpdG9yXG5cdFx0fVxuXG5cdFx0b01ldGFkYXRhQ29udGV4dHNbc0tleV0gPSBtQ29udGV4dHNbc0tleV07IC8vIG1ha2UgaXQgYXZhaWxhYmxlIGluc2lkZSBtZXRhZGF0YUNvbnRleHRzIEpTT04gb2JqZWN0XG5cdH0gY2F0Y2ggKGV4KSB7XG5cdFx0Ly9jb25zb2xlLmVycm9yKGV4KTtcblx0XHQvLyBpZ25vcmUgdGhlIGNvbnRleHQgYXMgdGhpcyBjYW4gb25seSBiZSB0aGUgY2FzZSBpZiB0aGUgbW9kZWwgaXMgbm90IHJlYWR5LCBpLmUuIG5vdCBhIHByZXByb2Nlc3NpbmcgbW9kZWwgYnV0IG1heWJlIGEgbW9kZWwgZm9yXG5cdFx0Ly8gcHJvdmlkaW5nIGFmdGVyd2FyZHNcblx0XHQvLyBUT0RPIG5vdCB5ZXQgaW1wbGVtZW50ZWRcblx0XHQvL21Db250ZXh0c1tcIl8kZXJyb3JcIl0ub01vZGVsLnNldFByb3BlcnR5KFwiL1wiICsgc0tleSwgZXgpO1xuXHR9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uIHRvIGJlIHVzZWQgaW5zaWRlIHRoZSB4bWwgdGVtcGxhdGUgcHJvY2Vzc29yLlxuICpcbiAqIEBwYXJhbSBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiBUaGUgYnVpbGRpbmcgYmxvY2sgZGVmaW5pdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCdWlsZGluZ0Jsb2NrKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uOiBCdWlsZGluZ0Jsb2NrRGVmaW5pdGlvbik6IHZvaWQge1xuXHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdChvTm9kZTogRWxlbWVudCwgb1Zpc2l0b3I6IElDYWxsYmFjaykgPT4gcHJvY2Vzc0J1aWxkaW5nQmxvY2soYnVpbGRpbmdCbG9ja0RlZmluaXRpb24sIG9Ob2RlLCBvVmlzaXRvciksXG5cdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ubmFtZXNwYWNlLFxuXHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnhtbFRhZyB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lXG5cdCk7XG5cdGlmIChidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5wdWJsaWNOYW1lc3BhY2UpIHtcblx0XHRYTUxQcmVwcm9jZXNzb3IucGx1Z0luKFxuXHRcdFx0KG9Ob2RlOiBFbGVtZW50LCBvVmlzaXRvcjogSUNhbGxiYWNrKSA9PiBwcm9jZXNzQnVpbGRpbmdCbG9jayhidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiwgb05vZGUsIG9WaXNpdG9yLCB0cnVlKSxcblx0XHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnB1YmxpY05hbWVzcGFjZSxcblx0XHRcdGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnhtbFRhZyB8fCBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lXG5cdFx0KTtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBYTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0cmluZyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsLlxuICpcbiAqIEBwYXJhbSBzdHJpbmdzIFRoZSBzdHJpbmcgcGFydHMgb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBwYXJ0IG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsXG4gKiBAcmV0dXJucyBUaGUgWE1MIGRvY3VtZW50IHJlcHJlc2VudGluZyB0aGUgc3RyaW5nIHRoYXQgd2FzIHVzZWQuXG4gKi9cbmV4cG9ydCBjb25zdCB4bWwgPSAoc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksIC4uLnZhbHVlczogYW55W10pID0+IHtcblx0bGV0IG91dFN0ciA9IFwiXCI7XG5cdGxldCBpO1xuXHRmb3IgKGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0b3V0U3RyICs9IHN0cmluZ3NbaV07XG5cdFx0b3V0U3RyICs9IHZhbHVlc1tpXTtcblx0fVxuXHRvdXRTdHIgKz0gc3RyaW5nc1tpXTtcblx0cmV0dXJuIERPTVBhcnNlckluc3RhbmNlLnBhcnNlRnJvbVN0cmluZyhvdXRTdHIsIFwidGV4dC94bWxcIik7XG59O1xuIl19
|
|
935
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkJ1aWxkaW5nQmxvY2tSdW50aW1lLnRzIl0sIm5hbWVzIjpbInBhY3QiLCJzdGF0ZSIsInZhbHVlIiwicyIsInYiLCJvIiwiYmluZCIsInRoZW4iLCJvYnNlcnZlciIsInByb3RvdHlwZSIsIm9uRnVsZmlsbGVkIiwib25SZWplY3RlZCIsInJlc3VsdCIsImNhbGxiYWNrIiwiZSIsIl90aGlzIiwidGhlbmFibGUiLCJhcnJheSIsImJvZHkiLCJjaGVjayIsImkiLCJyZWplY3QiLCJfY3ljbGUiLCJsZW5ndGgiLCJyZWNvdmVyIiwicHJvY2Vzc0J1aWxkaW5nQmxvY2siLCJidWlsZGluZ0JMb2NrRGVmaW5pdGlvbiIsIm9Ob2RlIiwib1Zpc2l0b3IiLCJpc1B1YmxpYyIsInNGcmFnbWVudE5hbWUiLCJmcmFnbWVudCIsIm5hbWVzcGFjZSIsIm5hbWUiLCJzTmFtZSIsIm1Db250ZXh0cyIsIm9NZXRhZGF0YUNvbnRleHRzIiwib1NldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJtb2RlbHMiLCJnZXRSZXNvdXJjZUJ1bmRsZSIsIm9SZXNvdXJjZUJ1bmRsZSIsIlJlc291cmNlTW9kZWwiLCJzZXRBcHBsaWNhdGlvbkkxOG5CdW5kbGUiLCJjYXRjaCIsImVycm9yIiwiTG9nIiwib01ldGFkYXRhIiwicHJlcGFyZU1ldGFkYXRhIiwibWV0YWRhdGEiLCJpc09wZW4iLCJwcm9jZXNzUHJvcGVydGllcyIsIm1NaXNzaW5nQ29udGV4dCIsInByb3BlcnR5VmFsdWVzIiwiaW5pdGlhbEtleXMiLCJPYmplY3QiLCJrZXlzIiwicHJvY2Vzc0NoaWxkcmVuIiwib0FnZ3JlZ2F0aW9ucyIsIm9QcmV2aW91c01hY3JvSW5mbyIsIm9JbnN0YW5jZSIsIm9Db250cm9sQ29uZmlnIiwidmlld0RhdGEiLCJnZXRQcm9wZXJ0eSIsInByb2Nlc3NlZFByb3BlcnR5VmFsdWVzIiwiaXNWMU1hY3JvRGVmIiwiY3JlYXRlIiwiY2FsbCIsIm1ldGFkYXRhQ29udGV4dHMiLCJmb3JFYWNoIiwic01ldGFkYXRhTmFtZSIsImNvbXB1dGVkIiwic0NvbnRleHROYW1lIiwiaGFzT3duUHJvcGVydHkiLCJhcGlWZXJzaW9uIiwicHJvcE5hbWUiLCJvRGF0YSIsImlzQSIsImdldE1vZGVsIiwiZ2V0T2JqZWN0IiwiQnVpbGRpbmdCbG9ja0NsYXNzIiwib0F0dHJpYnV0ZXNNb2RlbCIsIkF0dHJpYnV0ZU1vZGVsIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJUcmFjZUluZm8iLCJpc1RyYWNlSW5mb0FjdGl2ZSIsIm9UcmFjZUluZm8iLCJ0cmFjZU1hY3JvQ2FsbHMiLCJtYWNyb0luZm8iLCJ2YWxpZGF0ZU1hY3JvU2lnbmF0dXJlIiwib0NvbnRleHRWaXNpdG9yIiwid2l0aCIsInVuZGVmaW5lZCIsIm9QYXJlbnQiLCJwYXJlbnROb2RlIiwiaUNoaWxkSW5kZXgiLCJvUHJvbWlzZSIsIkFycmF5IiwiZnJvbSIsImNoaWxkcmVuIiwiaW5kZXhPZiIsImdldFRlbXBsYXRlIiwib1RlbXBsYXRlIiwiYWRkRGVmYXVsdE5hbWVzcGFjZSIsImhhc0Vycm9yIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJwYXJzZVhNTFN0cmluZyIsIml0ZXIiLCJkb2N1bWVudCIsImNyZWF0ZU5vZGVJdGVyYXRvciIsIk5vZGVGaWx0ZXIiLCJTSE9XX1RFWFQiLCJ0ZXh0bm9kZSIsIm5leHROb2RlIiwidGV4dENvbnRlbnQiLCJ0cmltIiwibG9jYWxOYW1lIiwiaXNUcmFjZU1vZGUiLCJvRXJyb3JUZXh0IiwiY3JlYXRlRXJyb3JYTUwiLCJvdXRlckhUTUwiLCJyZXBsYWNlV2l0aCIsInZpc2l0Tm9kZSIsInJlbW92ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiaW5zZXJ0RnJhZ21lbnQiLCJvTWFjcm9FbGVtZW50Iiwic0FnZ3JlZ2F0aW9uTmFtZSIsIm9BZ2dyZWdhdGlvbkVsZW1lbnQiLCJvTmV3Q2hpbGQiLCJjcmVhdGVFbGVtZW50TlMiLCJuYW1lc3BhY2VVUkkiLCJvRWxlbWVudENoaWxkIiwib05leHRDaGlsZCIsIm5leHRFbGVtZW50U2libGluZyIsImFwcGVuZENoaWxkIiwic1Nsb3ROYW1lIiwiYWdncmVnYXRpb25zIiwic2xvdCIsIm9UYXJnZXRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsIm9SZW1haW5pbmdTbG90cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJvU2xvdEVsZW1lbnQiLCJ0cmFjZURldGFpbHMiLCJpbml0aWFsUHJvcGVydGllcyIsInJlc29sdmVkUHJvcGVydGllcyIsIm1pc3NpbmdDb250ZXh0cyIsInByb3BlcnR5TmFtZSIsInByb3BlcnR5VmFsdWUiLCJwYXRoIiwiZ2V0UGF0aCIsImluY2x1ZGVzIiwiZXJyb3JBbnkiLCJvRXJyb3IiLCJzdGFjayIsInZpc2l0Q2hpbGROb2RlcyIsIm9GaXJzdEVsZW1lbnRDaGlsZCIsInNDaGlsZE5hbWUiLCJwcm9wZXJ0aWVzIiwiYXR0cmlidXRlcyIsImF0dHJpYnV0ZUluZGV4IiwiYURlZmluaXRpb25Db250ZXh0c0tleXMiLCJzb3J0IiwiYSIsImIiLCJzQXR0cmlidXRlTmFtZSIsImJEb05vdFJlc29sdmUiLCJvRGVmaW5pdGlvbkNvbnRleHRzIiwiaGFzQXR0cmlidXRlIiwib01ldGFkYXRhQ29udGV4dCIsIl9nZXRNZXRhZGF0YUNvbnRleHQiLCJhZGRTaW5nbGVDb250ZXh0IiwiYmluZGluZ0NvbnRleHRzIiwiY3VycmVudENvbnRleHRQYXRoIiwib0RlZmluaXRpb25Qcm9wZXJ0aWVzIiwiY29udGV4dFBhdGgiLCJhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzIiwiaiIsInNLZXlWYWx1ZSIsInR5cGUiLCJkZWZhdWx0VmFsdWUiLCJ2aXNpdEF0dHJpYnV0ZSIsImdldE5hbWVkSXRlbSIsInZWYWx1ZSIsImdldEF0dHJpYnV0ZSIsIkxPR0dFUl9TQ09QRSIsIkRPTVBhcnNlckluc3RhbmNlIiwiRE9NUGFyc2VyIiwiYnVpbGRpbmdCbG9ja0RlZmluaXRpb24iLCJ2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0Iiwib0NvbnRleHRTZXR0aW5ncyIsInNLZXkiLCJvQ29udGV4dCIsIm9Db250ZXh0T2JqZWN0IiwicmVxdWlyZWQiLCJFcnJvciIsIiRraW5kIiwiJFR5cGUiLCJhTWV0YWRhdGFDb250ZXh0S2V5cyIsImFQcm9wZXJ0aWVzIiwib0F0dHJpYnV0ZU5hbWVzIiwiaUtleSIsIm9Qcm9wZXJ0eVNldHRpbmdzIiwic3RhcnRzV2l0aCIsIndhcm5pbmciLCJidWlsZGluZ0Jsb2NrTWV0YWRhdGEiLCJvUHJvcGVydGllcyIsInNQcm9wZXJ0eU5hbWUiLCJldmVudHMiLCJzRXZlbnROYW1lIiwic0F0dHJpYnV0ZVZhbHVlIiwic01ldGFQYXRoIiwiQmluZGluZ1BhcnNlciIsImNvbXBsZXhQYXJzZXIiLCJteVN0b3JlIiwic0NvbnRleHRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsInNldFByb3BlcnR5IiwibW9kZWwiLCJlbmRzV2l0aCIsImVudGl0eVNldCIsImdldENvbnRleHQiLCJvQ3R4IiwibVNldHRpbmciLCJleCIsInJlZ2lzdGVyQnVpbGRpbmdCbG9jayIsIlhNTFByZXByb2Nlc3NvciIsInBsdWdJbiIsInhtbFRhZyIsInB1YmxpY05hbWVzcGFjZSIsImVycm9yTWVzc2FnZXMiLCJ4bWxGcmFnbWVudCIsImFkZGl0aW9uYWxEYXRhIiwiZXJyb3JMYWJlbHMiLCJtYXAiLCJlcnJvck1lc3NhZ2UiLCJ4bWwiLCJlc2NhcGVYTUwiLCJhZGRpdGlvbmFsVGV4dCIsIkpTT04iLCJzdHJpbmdpZnkiLCJzdG9yZVZhbHVlIiwidmFsdWVzIiwicHJvcGVydHlVSUQiLCJ1aWQiLCJ4bWxTdHJpbmciLCJhZGREZWZhdWx0TmFtZXNwYWNlcyIsInhtbERvY3VtZW50IiwicGFyc2VGcm9tU3RyaW5nIiwib3V0cHV0Iiwic3RyIiwicmVwbGFjZSIsImVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlIiwidmFsIiwic3RyaW5ncyIsIm91dFN0ciIsImlzQXJyYXkiLCJmbGF0Iiwiam9pbiIsIl90eXBlIiwiY29tcGlsZWRFeHByZXNzaW9uIiwiY29tcGlsZUV4cHJlc3Npb24iLCJwcm9wZXJ0eVVJZCIsInhtbFJlc3VsdCIsImlubmVyVGV4dCIsImlubmVySFRNTCIsInNwbGl0Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOztBQXFDTyxpQkFBaUJBLElBQWpCLEVBQXVCQyxLQUF2QixFQUE4QkMsS0FBOUIsRUFBcUM7QUFDM0MsTUFBSSxDQUFDRixJQUFJLENBQUNHLENBQVYsRUFBYTtBQUNaLFFBQUlELEtBQUssaUJBQVQsRUFBNEI7QUFDM0IsVUFBSUEsS0FBSyxDQUFDQyxDQUFWLEVBQWE7QUFDWixZQUFJRixLQUFLLEdBQUcsQ0FBWixFQUFlO0FBQ2RBLFVBQUFBLEtBQUssR0FBR0MsS0FBSyxDQUFDQyxDQUFkO0FBQ0E7O0FBQ0RELFFBQUFBLEtBQUssR0FBR0EsS0FBSyxDQUFDRSxDQUFkO0FBQ0EsT0FMRCxNQUtPO0FBQ05GLFFBQUFBLEtBQUssQ0FBQ0csQ0FBTixHQUFVLFFBQVFDLElBQVIsQ0FBYSxJQUFiLEVBQW1CTixJQUFuQixFQUF5QkMsS0FBekIsQ0FBVjtBQUNBO0FBQ0E7QUFDRDs7QUFDRCxRQUFJQyxLQUFLLElBQUlBLEtBQUssQ0FBQ0ssSUFBbkIsRUFBeUI7QUFDeEJMLE1BQUFBLEtBQUssQ0FBQ0ssSUFBTixDQUFXLFFBQVFELElBQVIsQ0FBYSxJQUFiLEVBQW1CTixJQUFuQixFQUF5QkMsS0FBekIsQ0FBWCxFQUE0QyxRQUFRSyxJQUFSLENBQWEsSUFBYixFQUFtQk4sSUFBbkIsRUFBeUIsQ0FBekIsQ0FBNUM7QUFDQTtBQUNBOztBQUNEQSxJQUFBQSxJQUFJLENBQUNHLENBQUwsR0FBU0YsS0FBVDtBQUNBRCxJQUFBQSxJQUFJLENBQUNJLENBQUwsR0FBU0YsS0FBVDtBQUNBLFFBQU1NLFFBQVEsR0FBR1IsSUFBSSxDQUFDSyxDQUF0Qjs7QUFDQSxRQUFJRyxRQUFKLEVBQWM7QUFDYkEsTUFBQUEsUUFBUSxDQUFDUixJQUFELENBQVI7QUFDQTtBQUNEO0FBQ0Q7O0FBOURNLElBQU0sUUFBUSxhQUFjLFlBQVc7QUFDN0MsbUJB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QUFELENBQWIsS0FBcUIsUUFBekIsRUFBbUM7QUFDekMsWUFBTW9QLFdBQVcsR0FBR3JCLFVBQVUsQ0FBQ0MsTUFBTSxDQUFDaE8sQ0FBRCxDQUFQLENBQTlCO0FBQ0E2TyxRQUFBQSxNQUFNLGNBQU9PLFdBQVAsQ0FBTjtBQUNBLE9BSE0sTUFHQTtBQUNOUCxRQUFBQSxNQUFNLElBQUliLE1BQU0sQ0FBQ2hPLENBQUQsQ0FBaEI7QUFDQTtBQUNEOztBQUNENk8sSUFBQUEsTUFBTSxJQUFJRCxPQUFPLENBQUM1TyxDQUFELENBQWpCO0FBQ0E2TyxJQUFBQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQzlJLElBQVAsRUFBVDs7QUFDQSxRQUFJRSxXQUFKLEVBQWlCO0FBQ2hCLFVBQU1vSixTQUFTLEdBQUcvSixjQUFjLENBQUN1SixNQUFELEVBQVMsSUFBVCxDQUFoQzs7QUFDQSxVQUFJUSxTQUFTLElBQUksQ0FBQUEsU0FBUyxTQUFULElBQUFBLFNBQVMsV0FBVCxZQUFBQSxTQUFTLENBQUVySixTQUFYLE1BQXlCLGFBQTFDLEVBQXlEO0FBQ3hELFlBQU15SCxZQUFZLEdBQUk0QixTQUFELENBQW1CQyxTQUFuQixJQUFpQ0QsU0FBRCxDQUFtQkUsU0FBeEU7QUFDQSxlQUFPcEosY0FBYyxDQUFDLENBQUNzSCxZQUFZLENBQUMrQixLQUFiLENBQW1CLElBQW5CLEVBQXlCLENBQXpCLENBQUQsQ0FBRCxFQUFnQ1gsTUFBaEMsQ0FBckI7QUFDQTtBQUNEOztBQUNELFdBQU9BLE1BQVA7QUFDQSxHQTlCTSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdWlkIGZyb20gXCJzYXAvYmFzZS91dGlsL3VpZFwiO1xuaW1wb3J0IEF0dHJpYnV0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy9BdHRyaWJ1dGVNb2RlbFwiO1xuaW1wb3J0IHR5cGUge1xuXHRCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uLFxuXHRCdWlsZGluZ0Jsb2NrQmFzZSxcblx0QnVpbGRpbmdCbG9ja0RlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uVjEsXG5cdEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSxcblx0QnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24sXG5cdEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL0J1aWxkaW5nQmxvY2tcIjtcbmltcG9ydCB7IGNvbXBpbGVFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ1Rvb2xraXRcIjtcbmltcG9ydCBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvZmUvbWFjcm9zL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBCaW5kaW5nUGFyc2VyIGZyb20gXCJzYXAvdWkvYmFzZS9CaW5kaW5nUGFyc2VyXCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgVHJhY2VJbmZvIGZyb20gXCIuL1RyYWNlSW5mb1wiO1xuXG5jb25zdCBMT0dHRVJfU0NPUEUgPSBcInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzLkJ1aWxkaW5nQmxvY2tSdW50aW1lXCI7XG5jb25zdCBET01QYXJzZXJJbnN0YW5jZSA9IG5ldyBET01QYXJzZXIoKTtcbmxldCBpc1RyYWNlTW9kZSA9IGZhbHNlO1xuXG50eXBlIFJlc29sdmVkQnVpbGRpbmdCbG9ja01ldGFkYXRhID0ge1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrUHJvcGVydHlEZWZpbml0aW9uPjtcblx0YWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBCdWlsZGluZ0Jsb2NrQWdncmVnYXRpb25EZWZpbml0aW9uPjtcblx0bWV0YWRhdGFDb250ZXh0czogUmVjb3JkPHN0cmluZywgQnVpbGRpbmdCbG9ja01ldGFkYXRhQ29udGV4dERlZmluaXRpb24+O1xuXHRpc09wZW46IGJvb2xlYW47XG59O1xuXG50eXBlIElDYWxsYmFjayA9IHtcblx0Z2V0U2V0dGluZ3MoKTogYW55O1xuXHQvKipcblx0ICogVmlzaXRzIHRoZSBnaXZlbiBub2RlIGFuZCBlaXRoZXIgcHJvY2Vzc2VzIGEgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24sIGNhbGxzXG5cdCAqIGEgdmlzaXRvciwgb3Igc2ltcGx5IGNhbGxzIGJvdGgge0BsaW5rXG5cdCAqIHNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yLklDYWxsYmFjay52aXNpdEF0dHJpYnV0ZXMgdmlzaXRBdHRyaWJ1dGVzfVxuXHQgKiBhbmQge0BsaW5rIHNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yLklDYWxsYmFjay52aXNpdENoaWxkTm9kZXNcblx0ICogdmlzaXRDaGlsZE5vZGVzfS5cblx0ICpcblx0ICogQHBhcmFtIHtOb2RlfSBvTm9kZVxuXHQgKiAgIFRoZSBYTUwgRE9NIG5vZGVcblx0ICogQHJldHVybnMge3NhcC51aS5iYXNlLlN5bmNQcm9taXNlfVxuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGFzIHNvb24gYXMgdmlzaXRpbmdcblx0ICogICBpcyBkb25lLCBvciBpcyByZWplY3RlZCB3aXRoIGEgY29ycmVzcG9uZGluZyBlcnJvciBpZiB2aXNpdGluZyBmYWlsc1xuXHQgKi9cblx0dmlzaXROb2RlKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblxuXHQvKipcblx0ICogSW5zZXJ0cyB0aGUgZnJhZ21lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiBwbGFjZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4gTG9hZHMgdGhlXG5cdCAqIGZyYWdtZW50LCB0YWtlcyBjYXJlIG9mIGNhY2hpbmcgKGZvciB0aGUgY3VycmVudCBwcmUtcHJvY2Vzc29yIHJ1bikgYW5kIHZpc2l0cyB0aGVcblx0ICogZnJhZ21lbnQncyBjb250ZW50IG9uY2UgaXQgaGFzIGJlZW4gaW1wb3J0ZWQgaW50byB0aGUgZWxlbWVudCdzIG93bmVyIGRvY3VtZW50IGFuZFxuXHQgKiBwdXQgaW50byBwbGFjZS4gTG9hZGluZyBvZiBmcmFnbWVudHMgaXMgYXN5bmNocm9ub3VzIGlmIHRoZSB0ZW1wbGF0ZSB2aWV3IGlzXG5cdCAqIGFzeW5jaHJvbm91cy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNGcmFnbWVudE5hbWVcblx0ICogICB0aGUgZnJhZ21lbnQncyByZXNvbHZlZCBuYW1lXG5cdCAqIEBwYXJhbSB7RWxlbWVudH0gb0VsZW1lbnRcblx0ICogICB0aGUgWE1MIERPTSBlbGVtZW50LCBlLmcuIDxzYXAudWkuY29yZTpGcmFnbWVudD4gb3IgPGNvcmU6RXh0ZW5zaW9uUG9pbnQ+XG5cdCAqIEBwYXJhbSB7c2FwLnVpLmNvcmUudXRpbC5fd2l0aH0gb1dpdGhDb250cm9sXG5cdCAqICAgdGhlIHBhcmVudCdzIFwid2l0aFwiIGNvbnRyb2xcblx0ICogQHJldHVybnMge3NhcC51aS5iYXNlLlN5bmNQcm9taXNlfVxuXHQgKiBBIHN5bmMgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aXRoIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gYXMgc29vbiBhcyB0aGUgZnJhZ21lbnRcblx0ICogICBoYXMgYmVlbiBpbnNlcnRlZCwgb3IgaXMgcmVqZWN0ZWQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgZXJyb3IgaWYgbG9hZGluZyBvciB2aXNpdGluZ1xuXHQgKiAgIGZhaWxzLlxuXHQgKi9cblx0aW5zZXJ0RnJhZ21lbnQoc0ZyYWdtZW50OiBzdHJpbmcsIG9FbGVtZW50OiBFbGVtZW50LCBvV2l0aD86IGFueSk6IFByb21pc2U8dm9pZD47XG5cdHZpc2l0QXR0cmlidXRlKG9Ob2RlOiBFbGVtZW50LCBvQXR0cmlidXRlOiBBdHRyKTogUHJvbWlzZTx2b2lkPjtcblx0dmlzaXRDaGlsZE5vZGVzKG9Ob2RlOiBOb2RlKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqXG5cdCAqIEludGVycHJldHMgdGhlIGdpdmVuIFhNTCBET00gYXR0cmlidXRlIHZhbHVlIGFzIGEgYmluZGluZyBhbmQgcmV0dXJucyB0aGVcblx0ICogcmVzdWx0aW5nIHZhbHVlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1ZhbHVlXG5cdCAqICAgQW4gWE1MIERPTSBhdHRyaWJ1dGUgdmFsdWVcblx0ICogQHBhcmFtIHtFbGVtZW50fSBbb0VsZW1lbnRdXG5cdCAqICAgVGhlIFhNTCBET00gZWxlbWVudCB0aGUgYXR0cmlidXRlIHZhbHVlIGJlbG9uZ3MgdG8gKG5lZWRlZCBvbmx5IGZvclxuXHQgKiAgIHdhcm5pbmdzIHdoaWNoIGFyZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUpXG5cdCAqIEByZXR1cm5zIHtzYXAudWkuYmFzZS5TeW5jUHJvbWlzZXxudWxsfVxuXHQgKiAgIEEgdGhlbmFibGUgd2hpY2ggcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0aW5nIHZhbHVlLCBvciBpcyByZWplY3RlZCB3aXRoIGFcblx0ICogICBjb3JyZXNwb25kaW5nIGVycm9yIChmb3IgZXhhbXBsZSwgYW4gZXJyb3IgdGhyb3duIGJ5IGEgZm9ybWF0dGVyKSBvclxuXHQgKiAgIDxjb2RlPm51bGw8L2NvZGU+IGluIGNhc2UgdGhlIGJpbmRpbmcgaXMgbm90IHJlYWR5IChiZWNhdXNlIGl0IHJlZmVycyB0byBhXG5cdCAqICAgbW9kZWwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSkgKHNpbmNlIDEuNTcuMClcblx0ICovXG5cdGdldFJlc3VsdChzVmFsdWU6IHN0cmluZywgZWxlbWVudD86IEVsZW1lbnQpOiBQcm9taXNlPGFueT4gfCBudWxsO1xuXHRnZXRDb250ZXh0KHNQYXRoOiBzdHJpbmcpOiBDb250ZXh0O1xuXHQvKipcblx0ICogUmV0dXJucyBhIGNhbGxiYWNrIGludGVyZmFjZSBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIG1hcCBvZiB2YXJpYWJsZXMgd2hpY2hcblx0ICogb3ZlcnJpZGUgY3VycmVudGx5IGtub3duIHZhcmlhYmxlcyBvZiB0aGUgc2FtZSBuYW1lIGluIDxjb2RlPnRoaXM8L2NvZGU+XG5cdCAqIHBhcmVudCBpbnRlcmZhY2Ugb3IgcmVwbGFjZSB0aGVtIGFsdG9nZXRoZXIuIEVhY2ggdmFyaWFibGUgbmFtZSBiZWNvbWVzIGFcblx0ICogbmFtZWQgbW9kZWwgd2l0aCBhIGNvcnJlc3BvbmRpbmcgb2JqZWN0IGJpbmRpbmcgYW5kIGNhbiBiZSB1c2VkIGluc2lkZSB0aGVcblx0ICogWE1MIHRlbXBsYXRlIGluIHRoZSB1c3VhbCB3YXksIHRoYXQgaXMsIHdpdGggYSBiaW5kaW5nIGV4cHJlc3Npb24gbGlrZVxuXHQgKiA8Y29kZT5cInt2YXI+c29tZS9yZWxhdGl2ZS9wYXRofVwiPC9jb2RlPiAoc2VlIGV4YW1wbGUpLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW21WYXJpYWJsZXM9e31dXG5cdCAqICAgTWFwIGZyb20gdmFyaWFibGUgbmFtZSAoc3RyaW5nKSB0byB2YWx1ZSAoe0BsaW5rIHNhcC51aS5tb2RlbC5Db250ZXh0fSlcblx0ICogQHBhcmFtIHtib29sZWFufSBbYlJlcGxhY2VdXG5cdCAqICAgV2hldGhlciBvbmx5IHRoZSBnaXZlbiB2YXJpYWJsZXMgYXJlIGtub3duIGluIHRoZSBuZXcgY2FsbGJhY2sgaW50ZXJmYWNlXG5cdCAqICAgaW5zdGFuY2UsIG5vIGluaGVyaXRlZCBvbmVzXG5cdCAqIEByZXR1cm5zIHtzYXAudWkuY29yZS51dGlsLlhNTFByZXByb2Nlc3Nvci5JQ2FsbGJhY2t9XG5cdCAqICAgQSBjYWxsYmFjayBpbnRlcmZhY2UgaW5zdGFuY2Vcblx0ICogQHBhcmFtIG1WYXJpYWJsZXNcblx0ICogQHBhcmFtIGJSZXBsYWNlXG5cdCAqL1xuXHRcIndpdGhcIihtVmFyaWFibGVzPzogYW55LCBiUmVwbGFjZT86IGJvb2xlYW4pOiBJQ2FsbGJhY2s7XG59O1xuXG4vKipcbiAqIFR5cGVndWFyZCBmb3IgY2hlY2tpbmcgaWYgYSBidWlsZGluZyBibG9jayB1c2UgQVBJIDEuXG4gKlxuICogQHBhcmFtIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGJ1aWxkaW5nIGJsb2NrIGlzIHVzaW5nIEFQSSAxLlxuICovXG5mdW5jdGlvbiBpc1YxTWFjcm9EZWYoYnVpbGRpbmdCbG9ja0RlZmluaXRpb246IEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKTogYnVpbGRpbmdCbG9ja0RlZmluaXRpb24gaXMgQnVpbGRpbmdCbG9ja0RlZmluaXRpb25WMSB7XG5cdHJldHVybiBidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSB1bmRlZmluZWQgfHwgYnVpbGRpbmdCbG9ja0RlZmluaXRpb24uYXBpVmVyc2lvbiA9PT0gMTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlTWFjcm9NZXRhZGF0YUNvbnRleHQoXG5cdHNOYW1lOiBzdHJpbmcsXG5cdG1Db250ZXh0czogYW55LFxuXHRvQ29udGV4dFNldHRpbmdzOiBCdWlsZGluZ0Jsb2NrTWV0YWRhdGFDb250ZXh0RGVmaW5pdGlvbixcblx0c0tleTogc3RyaW5nXG4pIHtcblx0Y29uc3Qgb0NvbnRleHQgPSBtQ29udGV4dHNbc0tleV07XG5cdGNvbnN0IG9Db250ZXh0T2JqZWN0ID0gb0NvbnRleHQ/LmdldE9iamVjdCgpO1xuXG5cdGlmIChvQ29udGV4dFNldHRpbmdzLnJlcXVpcmVkICYmICghb0NvbnRleHQgfHwgb0NvbnRleHRPYmplY3QgPT09IG51bGwpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGAke3NOYW1lfTogUmVxdWlyZWQgbWV0YWRhdGFDb250ZXh0ICcke3NLZXl9JyBpcyBtaXNzaW5nYCk7XG5cdH0gZWxzZSBpZiAob0NvbnRleHRPYmplY3QpIHtcblx0XHQvLyBJZiBjb250ZXh0IG9iamVjdCBoYXMgJGtpbmQgcHJvcGVydHksICRUeXBlIHNob3VsZCBub3QgYmUgY2hlY2tlZFxuXHRcdC8vIFRoZXJlZm9yZSByZW1vdmUgZnJvbSBjb250ZXh0IHNldHRpbmdzXG5cdFx0aWYgKG9Db250ZXh0T2JqZWN0Lmhhc093blByb3BlcnR5KFwiJGtpbmRcIikgJiYgb0NvbnRleHRTZXR0aW5ncy4ka2luZCkge1xuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlICRraW5kIGlzIHBhcnQgb2YgdGhlIGFsbG93ZWQgb25lc1xuXHRcdFx0aWYgKG9Db250ZXh0U2V0dGluZ3MuJGtpbmQuaW5kZXhPZihvQ29udGV4dE9iamVjdFtcIiRraW5kXCJdKSA9PT0gLTEpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRcdGAke3NOYW1lfTogJyR7c0tleX0nIG11c3QgYmUgJyRraW5kJyAnJHtvQ29udGV4dFNldHRpbmdzW1wiJGtpbmRcIl19JyBidXQgaXMgJyR7XG5cdFx0XHRcdFx0XHRvQ29udGV4dE9iamVjdC4ka2luZFxuXHRcdFx0XHRcdH0nOiAke29Db250ZXh0LmdldFBhdGgoKX1gXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChvQ29udGV4dE9iamVjdC5oYXNPd25Qcm9wZXJ0eShcIiRUeXBlXCIpICYmIG9Db250ZXh0U2V0dGluZ3MuJFR5cGUpIHtcblx0XHRcdC8vIENoZWNrIG9ubHkgJFR5cGVcblx0XHRcdGlmIChvQ29udGV4dFNldHRpbmdzLiRUeXBlLmluZGV4T2Yob0NvbnRleHRPYmplY3RbXCIkVHlwZVwiXSkgPT09IC0xKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0XHRgJHtzTmFtZX06ICcke3NLZXl9JyBtdXN0IGJlICckVHlwZScgJyR7b0NvbnRleHRTZXR0aW5nc1tcIiRUeXBlXCJdfScgYnV0IGlzICcke1xuXHRcdFx0XHRcdFx0b0NvbnRleHRPYmplY3QuJFR5cGVcblx0XHRcdFx0XHR9JzogJHtvQ29udGV4dC5nZXRQYXRoKCl9YFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlTWFjcm9TaWduYXR1cmUoc05hbWU6IGFueSwgb01ldGFkYXRhOiBhbnksIG1Db250ZXh0czogYW55LCBvTm9kZTogYW55KSB7XG5cdGNvbnN0IGFNZXRhZGF0YUNvbnRleHRLZXlzID0gKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzICYmIE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKSkgfHwgW10sXG5cdFx0YVByb3BlcnRpZXMgPSAob01ldGFkYXRhLnByb3BlcnRpZXMgJiYgT2JqZWN0LmtleXMob01ldGFkYXRhLnByb3BlcnRpZXMpKSB8fCBbXSxcblx0XHRvQXR0cmlidXRlTmFtZXM6IGFueSA9IHt9O1xuXG5cdC8vIGNvbGxlY3QgYWxsIGF0dHJpYnV0ZXMgdG8gZmluZCB1bmNoZWNrZWQgcHJvcGVydGllc1xuXHRPYmplY3Qua2V5cyhvTm9kZS5hdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChpS2V5OiBzdHJpbmcpIHtcblx0XHRjb25zdCBzS2V5ID0gb05vZGUuYXR0cmlidXRlc1tpS2V5XS5uYW1lO1xuXHRcdG9BdHRyaWJ1dGVOYW1lc1tzS2V5XSA9IHRydWU7XG5cdH0pO1xuXG5cdC8vQ2hlY2sgbWV0YWRhdGFDb250ZXh0c1xuXHRhTWV0YWRhdGFDb250ZXh0S2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRjb25zdCBvQ29udGV4dFNldHRpbmdzID0gb01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHNbc0tleV07XG5cblx0XHR2YWxpZGF0ZU1hY3JvTWV0YWRhdGFDb250ZXh0KHNOYW1lLCBtQ29udGV4dHMsIG9Db250ZXh0U2V0dGluZ3MsIHNLZXkpO1xuXHRcdGRlbGV0ZSBvQXR0cmlidXRlTmFtZXNbc0tleV07XG5cdH0pO1xuXHQvL0NoZWNrIHByb3BlcnRpZXNcblx0YVByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0Y29uc3Qgb1Byb3BlcnR5U2V0dGluZ3MgPSBvTWV0YWRhdGEucHJvcGVydGllc1tzS2V5XTtcblx0XHRpZiAoIW9Ob2RlLmhhc0F0dHJpYnV0ZShzS2V5KSkge1xuXHRcdFx0aWYgKG9Qcm9wZXJ0eVNldHRpbmdzLnJlcXVpcmVkICYmICFvUHJvcGVydHlTZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRWYWx1ZVwiKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYCR7c05hbWV9OiBgICsgYFJlcXVpcmVkIHByb3BlcnR5ICcke3NLZXl9JyBpcyBtaXNzaW5nYCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSBvQXR0cmlidXRlTmFtZXNbc0tleV07XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBVbmNoZWNrZWQgcHJvcGVydGllc1xuXHRPYmplY3Qua2V5cyhvQXR0cmlidXRlTmFtZXMpLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdC8vIG5vIGNoZWNrIGZvciBwcm9wZXJ0aWVzIHdoaWNoIHN0YXJ0IHdpdGggdW5kZXJzY29yZSBcIl9cIiBvciBjb250YWluIGEgY29sb24gXCI6XCIgKGRpZmZlcmVudCBuYW1lc3BhY2UpLCBlLmcuIHhtbG5zOnRyYWNlLCB0cmFjZTptYWNyb0lELCB1bml0dGVzdDppZFxuXHRcdGlmIChzS2V5LmluZGV4T2YoXCI6XCIpIDwgMCAmJiAhc0tleS5zdGFydHNXaXRoKFwieG1sbnNcIikpIHtcblx0XHRcdExvZy53YXJuaW5nKGBVbmNoZWNrZWQgcGFyYW1ldGVyOiAke3NOYW1lfTogJHtzS2V5fWAsIHVuZGVmaW5lZCwgTE9HR0VSX1NDT1BFKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCB0aGUgbWV0YWRhdGEgZm9yIHRoZSBidWlsZGluZyBibG9jayBhcmUgcHJvcGVybHkgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gYnVpbGRpbmdCbG9ja01ldGFkYXRhIFRoZSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBpbnB1dFxuICogQHBhcmFtIGlzT3BlbiBXaGV0aGVyIHRoZSBidWlsZGluZyBibG9jayBpcyBvcGVuIG9yIG5vdFxuICogQHJldHVybnMgQSBzZXQgb2YgY29tcGxldGVkIG1ldGFkYXRhIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZU1ldGFkYXRhKGJ1aWxkaW5nQmxvY2tNZXRhZGF0YT86IEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSwgaXNPcGVuID0gZmFsc2UpOiBSZXNvbHZlZEJ1aWxkaW5nQmxvY2tNZXRhZGF0YSB7XG5cdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEpIHtcblx0XHRjb25zdCBvUHJvcGVydGllczogYW55ID0ge307XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9uczogYW55ID0ge1xuXHRcdFx0XCJkZXBlbmRlbnRzXCI6IHtcblx0XHRcdFx0dHlwZTogXCJzYXAudWkuY29yZS5FbGVtZW50XCJcblx0XHRcdH0sXG5cdFx0XHRcImN1c3RvbURhdGFcIjoge1xuXHRcdFx0XHR0eXBlOiBcInNhcC51aS5jb3JlLkVsZW1lbnRcIlxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIEJ1aWxkaW5nQmxvY2tQcm9wZXJ0eURlZmluaXRpb24+ID0ge307XG5cblx0XHRPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEucHJvcGVydGllcykuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XG5cdFx0XHRpZiAoYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV0udHlwZSAhPT0gXCJzYXAudWkubW9kZWwuQ29udGV4dFwiKSB7XG5cdFx0XHRcdG9Qcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdID0gYnVpbGRpbmdCbG9ja01ldGFkYXRhLnByb3BlcnRpZXNbc1Byb3BlcnR5TmFtZV07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvTWV0YWRhdGFDb250ZXh0c1tzUHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5wcm9wZXJ0aWVzW3NQcm9wZXJ0eU5hbWVdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdC8vIE1lcmdlIGV2ZW50cyBpbnRvIHByb3BlcnRpZXMgYXMgdGhleSBhcmUgaGFuZGxlZCBpZGVudGljYWxseVxuXHRcdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzRXZlbnROYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0b1Byb3BlcnRpZXNbc0V2ZW50TmFtZV0gPSBidWlsZGluZ0Jsb2NrTWV0YWRhdGEuZXZlbnRzW3NFdmVudE5hbWVdO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChidWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhidWlsZGluZ0Jsb2NrTWV0YWRhdGEuYWdncmVnYXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChzUHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0b0FnZ3JlZ2F0aW9uc1tzUHJvcGVydHlOYW1lXSA9IGJ1aWxkaW5nQmxvY2tNZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc1Byb3BlcnR5TmFtZV07XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHByb3BlcnRpZXM6IG9Qcm9wZXJ0aWVzLFxuXHRcdFx0YWdncmVnYXRpb25zOiBvQWdncmVnYXRpb25zLFxuXHRcdFx0bWV0YWRhdGFDb250ZXh0czogb01ldGFkYXRhQ29udGV4dHMsXG5cdFx0XHRpc09wZW46IGlzT3BlblxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1ldGFkYXRhQ29udGV4dHM6IHt9LFxuXHRcdFx0YWdncmVnYXRpb25zOiB7XG5cdFx0XHRcdFwiZGVwZW5kZW50c1wiOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJzYXAudWkuY29yZS5FbGVtZW50XCJcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJjdXN0b21EYXRhXCI6IHtcblx0XHRcdFx0XHR0eXBlOiBcInNhcC51aS5jb3JlLkVsZW1lbnRcIlxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0cHJvcGVydGllczoge30sXG5cdFx0XHRpc09wZW46IGlzT3BlblxuXHRcdH07XG5cdH1cbn1cblxuZnVuY3Rpb24gX2dldE1ldGFkYXRhQ29udGV4dChcblx0b1NldHRpbmdzOiBhbnksXG5cdG9Ob2RlOiBFbGVtZW50LFxuXHRzQXR0cmlidXRlTmFtZTogc3RyaW5nLFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRiRG9Ob3RSZXNvbHZlOiBib29sZWFuLFxuXHRpc09wZW46IGJvb2xlYW5cbikge1xuXHRsZXQgb01ldGFkYXRhQ29udGV4dDtcblx0aWYgKCFiRG9Ob3RSZXNvbHZlICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSkpIHtcblx0XHRjb25zdCBzQXR0cmlidXRlVmFsdWUgPSBvTm9kZS5nZXRBdHRyaWJ1dGUoc0F0dHJpYnV0ZU5hbWUpIGFzIHN0cmluZztcblx0XHRsZXQgc01ldGFQYXRoO1xuXHRcdC8vIG9WaXNpdG9yLmdldFJlc3VsdChzQXR0cmlidXRlVmFsdWUsIG9Ob2RlKTtcblx0XHRvTWV0YWRhdGFDb250ZXh0ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKHNBdHRyaWJ1dGVWYWx1ZSk7XG5cdFx0aWYgKCFvTWV0YWRhdGFDb250ZXh0KSB7XG5cdFx0XHRpZiAoc0F0dHJpYnV0ZVZhbHVlLnN0YXJ0c1dpdGgoXCJ1aWQtLVwiKSkge1xuXHRcdFx0XHRjb25zdCBvRGF0YSA9IG15U3RvcmVbc0F0dHJpYnV0ZVZhbHVlXTtcblx0XHRcdFx0Y29uc3Qgc0NvbnRleHRQYXRoID0gYC8ke3NBdHRyaWJ1dGVWYWx1ZX1gO1xuXHRcdFx0XHRvU2V0dGluZ3MubW9kZWxzLmNvbnZlcnRlckNvbnRleHQuc2V0UHJvcGVydHkoc0NvbnRleHRQYXRoLCBvRGF0YSk7XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IFwiY29udmVydGVyQ29udGV4dFwiLFxuXHRcdFx0XHRcdHBhdGg6IHNDb250ZXh0UGF0aFxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIGlmICgoc0F0dHJpYnV0ZU5hbWUgPT09IFwibWV0YVBhdGhcIiAmJiBvU2V0dGluZ3MuY3VycmVudENvbnRleHRQYXRoKSB8fCBzQXR0cmlidXRlTmFtZSA9PT0gXCJjb250ZXh0UGF0aFwiKSB7XG5cdFx0XHRcdGlmIChzQXR0cmlidXRlVmFsdWUgJiYgc0F0dHJpYnV0ZVZhbHVlLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG5cdFx0XHRcdFx0Ly8gYWJzb2x1dGUgcGF0aCAtIHdlIGp1c3QgdXNlIHRoaXMgb25lXG5cdFx0XHRcdFx0c01ldGFQYXRoID0gc0F0dHJpYnV0ZVZhbHVlO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGxldCBzQ29udGV4dFBhdGggPSBvU2V0dGluZ3MuY3VycmVudENvbnRleHRQYXRoLmdldFBhdGgoKTtcblx0XHRcdFx0XHRpZiAoIXNDb250ZXh0UGF0aC5lbmRzV2l0aChcIi9cIikpIHtcblx0XHRcdFx0XHRcdHNDb250ZXh0UGF0aCArPSBcIi9cIjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c01ldGFQYXRoID0gc0NvbnRleHRQYXRoICsgc0F0dHJpYnV0ZVZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9NZXRhZGF0YUNvbnRleHQgPSB7XG5cdFx0XHRcdFx0bW9kZWw6IFwibWV0YU1vZGVsXCIsXG5cdFx0XHRcdFx0cGF0aDogc01ldGFQYXRoXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0ge1xuXHRcdFx0XHRcdG1vZGVsOiBcIm1ldGFNb2RlbFwiLFxuXHRcdFx0XHRcdHBhdGg6IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuZW50aXR5U2V0XG5cdFx0XHRcdFx0XHQ/IG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuZW50aXR5U2V0LmdldFBhdGgoc0F0dHJpYnV0ZVZhbHVlKVxuXHRcdFx0XHRcdFx0OiBzQXR0cmlidXRlVmFsdWVcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAob1NldHRpbmdzLmJpbmRpbmdDb250ZXh0cy5oYXNPd25Qcm9wZXJ0eShzQXR0cmlidXRlTmFtZSkpIHtcblx0XHRvTWV0YWRhdGFDb250ZXh0ID0ge1xuXHRcdFx0bW9kZWw6IHNBdHRyaWJ1dGVOYW1lLFxuXHRcdFx0cGF0aDogXCJcIlxuXHRcdH07XG5cdH0gZWxzZSBpZiAoaXNPcGVuKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChvVmlzaXRvci5nZXRDb250ZXh0KGAke3NBdHRyaWJ1dGVOYW1lfT5gKSkge1xuXHRcdFx0XHRvTWV0YWRhdGFDb250ZXh0ID0ge1xuXHRcdFx0XHRcdG1vZGVsOiBzQXR0cmlidXRlTmFtZSxcblx0XHRcdFx0XHRwYXRoOiBcIlwiXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b01ldGFkYXRhQ29udGV4dCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG9NZXRhZGF0YUNvbnRleHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NQcm9wZXJ0aWVzKFxuXHRvTWV0YWRhdGE6IFJlc29sdmVkQnVpbGRpbmdCbG9ja01ldGFkYXRhLFxuXHRvU2V0dGluZ3M6IGFueSxcblx0b05vZGU6IEVsZW1lbnQsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRvVmlzaXRvcjogSUNhbGxiYWNrLFxuXHRtQ29udGV4dHM6IGFueSxcblx0b01ldGFkYXRhQ29udGV4dHM6IGFueVxuKSB7XG5cdGNvbnN0IG1NaXNzaW5nQ29udGV4dDogYW55ID0ge307XG5cdGNvbnN0IG9EZWZpbml0aW9uUHJvcGVydGllcyA9IG9NZXRhZGF0YS5wcm9wZXJ0aWVzO1xuXHRjb25zdCBvRGVmaW5pdGlvbkNvbnRleHRzID0gb01ldGFkYXRhLm1ldGFkYXRhQ29udGV4dHM7XG5cdG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGggPSBvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmNvbnRleHRQYXRoO1xuXG5cdC8vIFJldHJpZXZlIHByb3BlcnRpZXMgdmFsdWVzXG5cdGNvbnN0IGFEZWZpbml0aW9uUHJvcGVydGllc0tleXMgPSBPYmplY3Qua2V5cyhvRGVmaW5pdGlvblByb3BlcnRpZXMpO1xuXHRsZXQgYURlZmluaXRpb25Db250ZXh0c0tleXMgPSBPYmplY3Qua2V5cyhvRGVmaW5pdGlvbkNvbnRleHRzKTtcblx0Y29uc3QgcHJvcGVydHlWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblx0Zm9yIChsZXQgaiA9IDA7IGogPCBhRGVmaW5pdGlvblByb3BlcnRpZXNLZXlzLmxlbmd0aDsgaisrKSB7XG5cdFx0Y29uc3Qgc0tleVZhbHVlID0gYURlZmluaXRpb25Qcm9wZXJ0aWVzS2V5c1tqXTtcblx0XHRpZiAob0RlZmluaXRpb25Qcm9wZXJ0aWVzW3NLZXlWYWx1ZV0udHlwZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9IHt9OyAvLyBUbyBhdm9pZCB2YWxlcyBiZWluZyByZXVzZWQgYWNjcm9zcyBtYWNyb3Ncblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcGVydHlWYWx1ZXNbc0tleVZhbHVlXSA9IG9EZWZpbml0aW9uUHJvcGVydGllc1tzS2V5VmFsdWVdLmRlZmF1bHRWYWx1ZTtcblx0XHR9XG5cdFx0aWYgKG9Ob2RlLmhhc0F0dHJpYnV0ZShzS2V5VmFsdWUpICYmIGlzUHVibGljICYmICFvRGVmaW5pdGlvblByb3BlcnRpZXNbc0tleVZhbHVlXS5pc1B1YmxpYykge1xuXHRcdFx0TG9nLmVycm9yKGBQcm9wZXJ0eSAke3NLZXlWYWx1ZX0gd2FzIGlnbm9yZWQgYXMgaXQgaXMgbm90IGludGVuZGVkIGZvciBwdWJsaWMgdXNhZ2VgKTtcblx0XHR9IGVsc2UgaWYgKG9Ob2RlLmhhc0F0dHJpYnV0ZShzS2V5VmFsdWUpKSB7XG5cdFx0XHRhd2FpdCBvVmlzaXRvci52aXNpdEF0dHJpYnV0ZShvTm9kZSwgb05vZGUuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oc0tleVZhbHVlKSBhcyBBdHRyKTtcblx0XHRcdGNvbnN0IHZWYWx1ZSA9IG9Ob2RlLmdldEF0dHJpYnV0ZShzS2V5VmFsdWUpO1xuXHRcdFx0aWYgKHZWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NLZXlWYWx1ZV0gPSB2VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdC8vIFNvcnQga2V5cyB0byBiZSBzdXJlIGNvbnRleHRQYXRoIGlzIGJlZm9yZSBtZXRhUGF0aCAoIHllcyBJJ20gZGVzcGVyYXRlIClcblx0YURlZmluaXRpb25Db250ZXh0c0tleXMgPSBhRGVmaW5pdGlvbkNvbnRleHRzS2V5cy5zb3J0KGZ1bmN0aW9uIChhOiBzdHJpbmcsIGI6IHN0cmluZykge1xuXHRcdHJldHVybiBhID4gYiA/IDEgOiAtMTtcblx0fSk7XG5cdGZvciAoY29uc3Qgc0F0dHJpYnV0ZU5hbWUgb2YgYURlZmluaXRpb25Db250ZXh0c0tleXMpIHtcblx0XHRjb25zdCBiRG9Ob3RSZXNvbHZlID0gaXNQdWJsaWMgJiYgIW9EZWZpbml0aW9uQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdLmlzUHVibGljICYmIG9Ob2RlLmhhc0F0dHJpYnV0ZShzQXR0cmlidXRlTmFtZSk7XG5cdFx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dCA9IF9nZXRNZXRhZGF0YUNvbnRleHQob1NldHRpbmdzLCBvTm9kZSwgc0F0dHJpYnV0ZU5hbWUsIG9WaXNpdG9yLCBiRG9Ob3RSZXNvbHZlLCBvTWV0YWRhdGEuaXNPcGVuKTtcblx0XHRpZiAob01ldGFkYXRhQ29udGV4dCkge1xuXHRcdFx0b01ldGFkYXRhQ29udGV4dC5uYW1lID0gc0F0dHJpYnV0ZU5hbWU7XG5cdFx0XHRhZGRTaW5nbGVDb250ZXh0KG1Db250ZXh0cywgb1Zpc2l0b3IsIG9NZXRhZGF0YUNvbnRleHQsIG9NZXRhZGF0YUNvbnRleHRzKTtcblx0XHRcdGlmIChcblx0XHRcdFx0KHNBdHRyaWJ1dGVOYW1lID09PSBcImVudGl0eVNldFwiICYmICFvU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzLmhhc093blByb3BlcnR5KHNBdHRyaWJ1dGVOYW1lKSkgfHxcblx0XHRcdFx0KHNBdHRyaWJ1dGVOYW1lID09PSBcImNvbnRleHRQYXRoXCIgJiYgIW9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHMuaGFzT3duUHJvcGVydHkoc0F0dHJpYnV0ZU5hbWUpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdG9TZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdID0gbUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHRcdH1cblx0XHRcdGlmIChzQXR0cmlidXRlTmFtZSA9PT0gXCJjb250ZXh0UGF0aFwiKSB7XG5cdFx0XHRcdG9TZXR0aW5ncy5jdXJyZW50Q29udGV4dFBhdGggPSBtQ29udGV4dHNbc0F0dHJpYnV0ZU5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0cHJvcGVydHlWYWx1ZXNbc0F0dHJpYnV0ZU5hbWVdID0gbUNvbnRleHRzW3NBdHRyaWJ1dGVOYW1lXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bU1pc3NpbmdDb250ZXh0W3NBdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7IG1NaXNzaW5nQ29udGV4dCwgcHJvcGVydHlWYWx1ZXM6IHByb3BlcnR5VmFsdWVzIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NDaGlsZHJlbihcblx0b05vZGU6IEVsZW1lbnQsXG5cdG9WaXNpdG9yOiBJQ2FsbGJhY2ssXG5cdG9NZXRhZGF0YTogUmVzb2x2ZWRCdWlsZGluZ0Jsb2NrTWV0YWRhdGEsXG5cdGlzUHVibGljOiBib29sZWFuLFxuXHRwcm9wZXJ0eVZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PlxuKSB7XG5cdGNvbnN0IG9BZ2dyZWdhdGlvbnM6IGFueSA9IHt9O1xuXHRpZiAob05vZGUuZmlyc3RFbGVtZW50Q2hpbGQgIT09IG51bGwpIHtcblx0XHQvLyBJZiB0aGVyZSBhcmUgYWdncmVnYXRpb24gd2UgbmVlZCB0byB2aXNpdCB0aGUgY2hpbGROb2RlcyBmaXJzdCBhbmQgZm9yZW1vc3Rcblx0XHRhd2FpdCBvVmlzaXRvci52aXNpdENoaWxkTm9kZXMob05vZGUpO1xuXHRcdGxldCBvRmlyc3RFbGVtZW50Q2hpbGQ6IEVsZW1lbnQgfCBudWxsID0gb05vZGUuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0d2hpbGUgKG9GaXJzdEVsZW1lbnRDaGlsZCAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3Qgc0NoaWxkTmFtZSA9IG9GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWU7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdE9iamVjdC5rZXlzKG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnMpLmluZGV4T2Yoc0NoaWxkTmFtZSkgIT09IC0xICYmXG5cdFx0XHRcdCghaXNQdWJsaWMgfHwgb01ldGFkYXRhLmFnZ3JlZ2F0aW9uc1tzQ2hpbGROYW1lXS5pc1B1YmxpYylcblx0XHRcdCkge1xuXHRcdFx0XHRvQWdncmVnYXRpb25zW29GaXJzdEVsZW1lbnRDaGlsZC5sb2NhbE5hbWVdID0gb0ZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0fSBlbHNlIGlmIChPYmplY3Qua2V5cyhvTWV0YWRhdGEucHJvcGVydGllcykuaW5kZXhPZihzQ2hpbGROYW1lKSAhPT0gLTEpIHtcblx0XHRcdFx0Ly8gT2JqZWN0IFR5cGUgcHJvcGVydGllc1xuXHRcdFx0XHRwcm9wZXJ0eVZhbHVlc1tzQ2hpbGROYW1lXSA9IHt9O1xuXHRcdFx0XHRmb3IgKGNvbnN0IGF0dHJpYnV0ZUluZGV4IG9mIE9iamVjdC5rZXlzKG9GaXJzdEVsZW1lbnRDaGlsZC5hdHRyaWJ1dGVzKSkge1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3NDaGlsZE5hbWVdW29GaXJzdEVsZW1lbnRDaGlsZC5hdHRyaWJ1dGVzW2F0dHJpYnV0ZUluZGV4IGFzIGFueV0ubG9jYWxOYW1lXSA9XG5cdFx0XHRcdFx0XHRvRmlyc3RFbGVtZW50Q2hpbGQuYXR0cmlidXRlc1thdHRyaWJ1dGVJbmRleCBhcyBhbnldLnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG9GaXJzdEVsZW1lbnRDaGlsZCA9IG9GaXJzdEVsZW1lbnRDaGlsZC5uZXh0RWxlbWVudFNpYmxpbmc7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBvQWdncmVnYXRpb25zO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzQnVpbGRpbmdCbG9jayhcblx0YnVpbGRpbmdCTG9ja0RlZmluaXRpb246IEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLFxuXHRvTm9kZTogRWxlbWVudCxcblx0b1Zpc2l0b3I6IElDYWxsYmFjayxcblx0aXNQdWJsaWMgPSBmYWxzZVxuKSB7XG5cdGNvbnN0IHNGcmFnbWVudE5hbWUgPSBidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5mcmFnbWVudCB8fCBgJHtidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5uYW1lc3BhY2V9LiR7YnVpbGRpbmdCTG9ja0RlZmluaXRpb24ubmFtZX1gO1xuXG5cdGNvbnN0IHNOYW1lID0gXCJ0aGlzXCI7XG5cblx0Y29uc3QgbUNvbnRleHRzOiBhbnkgPSB7fTtcblx0Y29uc3Qgb01ldGFkYXRhQ29udGV4dHM6IGFueSA9IHt9O1xuXHRjb25zdCBvU2V0dGluZ3MgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHQvLyBUT0RPIDAwMDEgTW92ZSB0aGlzIGVsc2V3aGVyZSB0aGlzIGlzIHdlaXJkIDopXG5cdGlmIChvU2V0dGluZ3MubW9kZWxzW1wic2FwLmZlLmkxOG5cIl0pIHtcblx0XHRvU2V0dGluZ3MubW9kZWxzW1wic2FwLmZlLmkxOG5cIl1cblx0XHRcdC5nZXRSZXNvdXJjZUJ1bmRsZSgpXG5cdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc291cmNlQnVuZGxlOiBhbnkpIHtcblx0XHRcdFx0UmVzb3VyY2VNb2RlbC5zZXRBcHBsaWNhdGlvbkkxOG5CdW5kbGUob1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0TG9nLmVycm9yKGVycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cdGNvbnN0IG9NZXRhZGF0YSA9IHByZXBhcmVNZXRhZGF0YShidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5tZXRhZGF0YSwgYnVpbGRpbmdCTG9ja0RlZmluaXRpb24uaXNPcGVuKTtcblxuXHQvL0luamVjdCBzdG9yYWdlIGZvciBtYWNyb3Ncblx0aWYgKCFvU2V0dGluZ3Nbc0ZyYWdtZW50TmFtZV0pIHtcblx0XHRvU2V0dGluZ3Nbc0ZyYWdtZW50TmFtZV0gPSB7fTtcblx0fVxuXG5cdC8vIEZpcnN0IG9mIGFsbCB3ZSBuZWVkIHRvIHZpc2l0IHRoZSBhdHRyaWJ1dGVzXG5cdGNvbnN0IHsgbU1pc3NpbmdDb250ZXh0LCBwcm9wZXJ0eVZhbHVlcyB9ID0gYXdhaXQgcHJvY2Vzc1Byb3BlcnRpZXMoXG5cdFx0b01ldGFkYXRhLFxuXHRcdG9TZXR0aW5ncyxcblx0XHRvTm9kZSxcblx0XHRpc1B1YmxpYyxcblx0XHRvVmlzaXRvcixcblx0XHRtQ29udGV4dHMsXG5cdFx0b01ldGFkYXRhQ29udGV4dHNcblx0KTtcblx0Y29uc3QgaW5pdGlhbEtleXMgPSBPYmplY3Qua2V5cyhwcm9wZXJ0eVZhbHVlcyk7XG5cdHRyeSB7XG5cdFx0Ly8gQWdncmVnYXRpb24gYW5kIGNvbXBsZXggdHlwZSBzdXBwb3J0XG5cdFx0Y29uc3Qgb0FnZ3JlZ2F0aW9ucyA9IGF3YWl0IHByb2Nlc3NDaGlsZHJlbihvTm9kZSwgb1Zpc2l0b3IsIG9NZXRhZGF0YSwgaXNQdWJsaWMsIHByb3BlcnR5VmFsdWVzKTtcblx0XHRsZXQgb0luc3RhbmNlOiBhbnk7XG5cdFx0bGV0IG9Db250cm9sQ29uZmlnID0ge307XG5cblx0XHRpZiAob1NldHRpbmdzLm1vZGVscy52aWV3RGF0YSkge1xuXHRcdFx0Ly8gT25seSB1c2VkIGluIHRoZSBGaWVsZCBtYWNybyBhbmQgZXZlbiB0aGVuIG1heWJlIG5vdCByZWFsbHkgdXNlZnVsXG5cdFx0XHRvQ29udHJvbENvbmZpZyA9IG9TZXR0aW5ncy5tb2RlbHMudmlld0RhdGEuZ2V0UHJvcGVydHkoXCIvY29udHJvbENvbmZpZ3VyYXRpb25cIik7XG5cdFx0fVxuXHRcdGxldCBwcm9jZXNzZWRQcm9wZXJ0eVZhbHVlcyA9IHByb3BlcnR5VmFsdWVzO1xuXHRcdGlmIChpc1YxTWFjcm9EZWYoYnVpbGRpbmdCTG9ja0RlZmluaXRpb24pICYmIGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmNyZWF0ZSkge1xuXHRcdFx0cHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMgPSBidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5jcmVhdGUuY2FsbChcblx0XHRcdFx0YnVpbGRpbmdCTG9ja0RlZmluaXRpb24sXG5cdFx0XHRcdHByb3BlcnR5VmFsdWVzLFxuXHRcdFx0XHRvQ29udHJvbENvbmZpZyxcblx0XHRcdFx0b1NldHRpbmdzLFxuXHRcdFx0XHRvQWdncmVnYXRpb25zLFxuXHRcdFx0XHRpc1B1YmxpY1xuXHRcdFx0KTtcblx0XHRcdE9iamVjdC5rZXlzKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzTWV0YWRhdGFOYW1lOiBzdHJpbmcpIHtcblx0XHRcdFx0aWYgKG9NZXRhZGF0YS5tZXRhZGF0YUNvbnRleHRzW3NNZXRhZGF0YU5hbWVdLmNvbXB1dGVkKSB7XG5cdFx0XHRcdFx0bUNvbnRleHRzW3NNZXRhZGF0YU5hbWVdID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc01ldGFkYXRhTmFtZV07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0T2JqZWN0LmtleXMobU1pc3NpbmdDb250ZXh0KS5mb3JFYWNoKGZ1bmN0aW9uIChzQ29udGV4dE5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRpZiAocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMuaGFzT3duUHJvcGVydHkoc0NvbnRleHROYW1lKSkge1xuXHRcdFx0XHRcdG1Db250ZXh0c1tzQ29udGV4dE5hbWVdID0gcHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXNbc0NvbnRleHROYW1lXTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmIChidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSAyKSB7XG5cdFx0XHRPYmplY3Qua2V5cyhwcm9wZXJ0eVZhbHVlcykuZm9yRWFjaCgocHJvcE5hbWUpID0+IHtcblx0XHRcdFx0Y29uc3Qgb0RhdGEgPSBwcm9wZXJ0eVZhbHVlc1twcm9wTmFtZV07XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvRGF0YSAmJlxuXHRcdFx0XHRcdG9EYXRhLmlzQSAmJlxuXHRcdFx0XHRcdG9EYXRhLmlzQShcInNhcC51aS5tb2RlbC5Db250ZXh0XCIpICYmXG5cdFx0XHRcdFx0IW9EYXRhLmdldE1vZGVsKCkuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTWV0YU1vZGVsXCIpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWVzW3Byb3BOYW1lXSA9IG9EYXRhLmdldE9iamVjdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IEJ1aWxkaW5nQmxvY2tDbGFzcyA9IGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uIGFzIHR5cGVvZiBCdWlsZGluZ0Jsb2NrQmFzZTtcblx0XHRcdG9JbnN0YW5jZSA9IG5ldyBCdWlsZGluZ0Jsb2NrQ2xhc3MocHJvcGVydHlWYWx1ZXMgLyosIG9Db250cm9sQ29uZmlnLCBvU2V0dGluZ3MsIG9BZ2dyZWdhdGlvbnMsIGlzUHVibGljKi8pO1xuXHRcdH1cblx0XHRjb25zdCBvQXR0cmlidXRlc01vZGVsOiBKU09OTW9kZWwgPSBuZXcgQXR0cmlidXRlTW9kZWwob05vZGUsIHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzLCBidWlsZGluZ0JMb2NrRGVmaW5pdGlvbik7XG5cdFx0bUNvbnRleHRzW3NOYW1lXSA9IG9BdHRyaWJ1dGVzTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpO1xuXG5cdFx0bGV0IG9QcmV2aW91c01hY3JvSW5mbzogYW55O1xuXG5cdFx0Ly8gS2VlcCB0cmFja1xuXHRcdGlmIChUcmFjZUluZm8uaXNUcmFjZUluZm9BY3RpdmUoKSkge1xuXHRcdFx0Y29uc3Qgb1RyYWNlSW5mbyA9IFRyYWNlSW5mby50cmFjZU1hY3JvQ2FsbHMoc0ZyYWdtZW50TmFtZSwgb01ldGFkYXRhLCBtQ29udGV4dHMsIG9Ob2RlLCBvVmlzaXRvcik7XG5cdFx0XHRpZiAob1RyYWNlSW5mbykge1xuXHRcdFx0XHRvUHJldmlvdXNNYWNyb0luZm8gPSBvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdO1xuXHRcdFx0XHRvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdID0gb1RyYWNlSW5mby5tYWNyb0luZm87XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHZhbGlkYXRlTWFjcm9TaWduYXR1cmUoc0ZyYWdtZW50TmFtZSwgb01ldGFkYXRhLCBtQ29udGV4dHMsIG9Ob2RlKTtcblxuXHRcdGNvbnN0IG9Db250ZXh0VmlzaXRvciA9IG9WaXNpdG9yLndpdGgoXG5cdFx0XHRtQ29udGV4dHMsXG5cdFx0XHRidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5pc09wZW4gIT09IHVuZGVmaW5lZCA/ICFidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5pc09wZW4gOiB0cnVlXG5cdFx0KTtcblx0XHRjb25zdCBvUGFyZW50ID0gb05vZGUucGFyZW50Tm9kZTtcblxuXHRcdGxldCBpQ2hpbGRJbmRleDogbnVtYmVyO1xuXHRcdGxldCBvUHJvbWlzZTtcblx0XHRpZiAob1BhcmVudCkge1xuXHRcdFx0aUNoaWxkSW5kZXggPSBBcnJheS5mcm9tKG9QYXJlbnQuY2hpbGRyZW4pLmluZGV4T2Yob05vZGUpO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdChpc1YxTWFjcm9EZWYoYnVpbGRpbmdCTG9ja0RlZmluaXRpb24pICYmIGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmdldFRlbXBsYXRlKSB8fFxuXHRcdFx0XHRidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5hcGlWZXJzaW9uID09PSAyXG5cdFx0XHQpIHtcblx0XHRcdFx0bGV0IG9UZW1wbGF0ZTtcblx0XHRcdFx0bGV0IGFkZERlZmF1bHROYW1lc3BhY2UgPSBmYWxzZTtcblx0XHRcdFx0aWYgKGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmFwaVZlcnNpb24gPT09IDIpIHtcblx0XHRcdFx0XHRvVGVtcGxhdGUgPSBvSW5zdGFuY2UuZ2V0VGVtcGxhdGUoKTtcblx0XHRcdFx0XHRhZGREZWZhdWx0TmFtZXNwYWNlID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIGlmIChidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5nZXRUZW1wbGF0ZSkge1xuXHRcdFx0XHRcdG9UZW1wbGF0ZSA9IGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uLmdldFRlbXBsYXRlKHByb2Nlc3NlZFByb3BlcnR5VmFsdWVzKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBoYXNFcnJvciA9IFwiXCI7XG5cdFx0XHRcdGlmIChvVGVtcGxhdGUpIHtcblx0XHRcdFx0XHRpZiAoIW9UZW1wbGF0ZS5maXJzdEVsZW1lbnRDaGlsZCkge1xuXHRcdFx0XHRcdFx0b1RlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcob1RlbXBsYXRlLCBhZGREZWZhdWx0TmFtZXNwYWNlKTtcblx0XHRcdFx0XHRcdC8vIEZvciBzYWZldHkgcHVycG9zZSB3ZSB0cnkgdG8gZGV0ZWN0IHRyYWlsaW5nIHRleHQgaW4gYmV0d2VlbiBYTUwgVGFnc1xuXHRcdFx0XHRcdFx0Y29uc3QgaXRlciA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcihvVGVtcGxhdGUsIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcblx0XHRcdFx0XHRcdGxldCB0ZXh0bm9kZSA9IGl0ZXIubmV4dE5vZGUoKTtcblx0XHRcdFx0XHRcdHdoaWxlICh0ZXh0bm9kZSkge1xuXHRcdFx0XHRcdFx0XHRpZiAodGV4dG5vZGUudGV4dENvbnRlbnQgJiYgdGV4dG5vZGUudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRoYXNFcnJvciA9IHRleHRub2RlLnRleHRDb250ZW50O1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRleHRub2RlID0gaXRlci5uZXh0Tm9kZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChvVGVtcGxhdGUubG9jYWxOYW1lID09PSBcInBhcnNlcmVycm9yXCIpIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIGEgcGFyc2VlcnJvciB3aGlsZSBwcm9jZXNzaW5nIHRoZSBYTUwgaXQgbWVhbnMgdGhlIFhNTCBpdHNlbGYgaXMgbWFsZm9ybWVkLCBhcyBzdWNoIHdlIHJlcnVuIHRoZSB0ZW1wbGF0ZSBwcm9jZXNzXG5cdFx0XHRcdFx0XHQvLyBTZXR0aW5nIGlzVHJhY2VNb2RlIHRydWUgd2lsbCBtYWtlIGl0IHNvIHRoYXQgZWFjaCB4bWxgIGV4cHJlc3Npb24gaXMgY2hlY2tlZCBmb3IgdmFsaWRpdHkgZnJvbSBYTUwgcGVyc3BlY3RpdmUgYW5kIGlmIGFuIGVycm9yIGlzIGZvdW5kIGl0J3MgcmV0dXJuZWQgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIGZyYWdtZW50XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5uYW1lfWApO1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0aXNUcmFjZU1vZGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBvSW5zdGFuY2U/LmdldFRlbXBsYXRlXG5cdFx0XHRcdFx0XHRcdFx0PyBvSW5zdGFuY2UuZ2V0VGVtcGxhdGUoKVxuXHRcdFx0XHRcdFx0XHRcdDogKGJ1aWxkaW5nQkxvY2tEZWZpbml0aW9uIGFzIGFueSkuZ2V0VGVtcGxhdGUocHJvY2Vzc2VkUHJvcGVydHlWYWx1ZXMpO1xuXHRcdFx0XHRcdFx0XHRvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvVGVtcGxhdGUsIHRydWUpO1xuXHRcdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdFx0aXNUcmFjZU1vZGUgPSBmYWxzZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKGhhc0Vycm9yLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIHRyYWlsaW5nIHRleHQgd2UgY3JlYXRlIGEgc3RhbmRhcmQgZXJyb3IgYW5kIGRpc3BsYXkgaXQuXG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoYEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5uYW1lfWApO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0Vycm9yVGV4dCA9IGNyZWF0ZUVycm9yWE1MKFxuXHRcdFx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRcdFx0YEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgYnVpbGRpbmcgYmxvY2sgJHtidWlsZGluZ0JMb2NrRGVmaW5pdGlvbi5uYW1lfWAsXG5cdFx0XHRcdFx0XHRcdFx0YFRyYWlsaW5nIHRleHQgd2FzIGZvdW5kIGluIHRoZSBYTUw6ICR7aGFzRXJyb3J9YFxuXHRcdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0XHRvVGVtcGxhdGUub3V0ZXJIVE1MXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0b1RlbXBsYXRlID0gcGFyc2VYTUxTdHJpbmcob0Vycm9yVGV4dCwgdHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG9Ob2RlLnJlcGxhY2VXaXRoKG9UZW1wbGF0ZSk7XG5cdFx0XHRcdFx0b05vZGUgPSBvUGFyZW50LmNoaWxkcmVuW2lDaGlsZEluZGV4XTtcblx0XHRcdFx0XHRvUHJvbWlzZSA9IG9Db250ZXh0VmlzaXRvci52aXNpdE5vZGUob05vZGUpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9Ob2RlLnJlbW92ZSgpO1xuXHRcdFx0XHRcdG9Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9Qcm9taXNlID0gb0NvbnRleHRWaXNpdG9yLmluc2VydEZyYWdtZW50KHNGcmFnbWVudE5hbWUsIG9Ob2RlKTtcblx0XHRcdH1cblxuXHRcdFx0YXdhaXQgb1Byb21pc2U7XG5cdFx0XHRjb25zdCBvTWFjcm9FbGVtZW50ID0gb1BhcmVudC5jaGlsZHJlbltpQ2hpbGRJbmRleF07XG5cblx0XHRcdGlmIChPYmplY3Qua2V5cyhvQWdncmVnYXRpb25zKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdE9iamVjdC5rZXlzKG9BZ2dyZWdhdGlvbnMpLmZvckVhY2goZnVuY3Rpb24gKHNBZ2dyZWdhdGlvbk5hbWU6IHN0cmluZykge1xuXHRcdFx0XHRcdGNvbnN0IG9BZ2dyZWdhdGlvbkVsZW1lbnQgPSBvQWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0XHRcdGlmIChvTWFjcm9FbGVtZW50ICE9PSBudWxsICYmIG9NYWNyb0VsZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb05ld0NoaWxkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG9NYWNyb0VsZW1lbnQubmFtZXNwYWNlVVJJLCBzQWdncmVnYXRpb25OYW1lKTtcblx0XHRcdFx0XHRcdGxldCBvRWxlbWVudENoaWxkID0gb0FnZ3JlZ2F0aW9uRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0XHRcdHdoaWxlIChvRWxlbWVudENoaWxkKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXh0Q2hpbGQgPSBvRWxlbWVudENoaWxkLm5leHRFbGVtZW50U2libGluZztcblx0XHRcdFx0XHRcdFx0b05ld0NoaWxkLmFwcGVuZENoaWxkKG9FbGVtZW50Q2hpbGQpO1xuXHRcdFx0XHRcdFx0XHRvRWxlbWVudENoaWxkID0gb05leHRDaGlsZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lICE9PSBcImN1c3RvbURhdGFcIiAmJiBzQWdncmVnYXRpb25OYW1lICE9PSBcImRlcGVuZGVudHNcIikge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzU2xvdE5hbWUgPVxuXHRcdFx0XHRcdFx0XHRcdChvTWV0YWRhdGEuYWdncmVnYXRpb25zW3NBZ2dyZWdhdGlvbk5hbWVdICYmIG9NZXRhZGF0YS5hZ2dyZWdhdGlvbnNbc0FnZ3JlZ2F0aW9uTmFtZV0uc2xvdCkgfHxcblx0XHRcdFx0XHRcdFx0XHRzQWdncmVnYXRpb25OYW1lO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvVGFyZ2V0RWxlbWVudCA9IG9NYWNyb0VsZW1lbnQucXVlcnlTZWxlY3Rvcihgc2xvdFtuYW1lPScke3NTbG90TmFtZX0nXWApIGFzIEVsZW1lbnQ7XG5cdFx0XHRcdFx0XHRcdGlmIChvVGFyZ2V0RWxlbWVudCkge1xuXHRcdFx0XHRcdFx0XHRcdG9UYXJnZXRFbGVtZW50LnJlcGxhY2VXaXRoKC4uLihvTmV3Q2hpbGQuY2hpbGRyZW4gYXMgYW55KSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG9NYWNyb0VsZW1lbnQuYXBwZW5kQ2hpbGQob05ld0NoaWxkKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9NYWNyb0VsZW1lbnQpIHtcblx0XHRcdFx0Y29uc3Qgb1JlbWFpbmluZ1Nsb3RzID0gb01hY3JvRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic2xvdFwiKTtcblx0XHRcdFx0b1JlbWFpbmluZ1Nsb3RzLmZvckVhY2goZnVuY3Rpb24gKG9TbG90RWxlbWVudDogYW55KSB7XG5cdFx0XHRcdFx0b1Nsb3RFbGVtZW50LnJlbW92ZSgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKG9QcmV2aW91c01hY3JvSW5mbykge1xuXHRcdFx0Ly9yZXN0b3JlIG1hY3JvIGluZm8gaWYgYXZhaWxhYmxlXG5cdFx0XHRvU2V0dGluZ3NbXCJfbWFjcm9JbmZvXCJdID0gb1ByZXZpb3VzTWFjcm9JbmZvO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkZWxldGUgb1NldHRpbmdzW1wiX21hY3JvSW5mb1wiXTtcblx0XHR9XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBJbiBjYXNlIHRoZXJlIGlzIGEgZ2VuZXJpYyBlcnJvciAodXN1YWxseSBjb2RlIGVycm9yKSwgd2UgcmV0cmlldmUgdGhlIGN1cnJlbnQgY29udGV4dCBpbmZvcm1hdGlvbiBhbmQgY3JlYXRlIGEgZGVkaWNhdGVkIGVycm9yIG1lc3NhZ2Vcblx0XHRjb25zdCB0cmFjZURldGFpbHMgPSB7XG5cdFx0XHRpbml0aWFsUHJvcGVydGllczoge30gYXMgYW55LFxuXHRcdFx0cmVzb2x2ZWRQcm9wZXJ0aWVzOiB7fSBhcyBhbnksXG5cdFx0XHRtaXNzaW5nQ29udGV4dHM6IG1NaXNzaW5nQ29udGV4dFxuXHRcdH07XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgaW5pdGlhbEtleXMpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlc1twcm9wZXJ0eU5hbWVdO1xuXHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgcHJvcGVydHlWYWx1ZS5pc0EgJiYgcHJvcGVydHlWYWx1ZS5pc0EoXCJzYXAudWkubW9kZWwuQ29udGV4dFwiKSkge1xuXHRcdFx0XHR0cmFjZURldGFpbHMuaW5pdGlhbFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHtcblx0XHRcdFx0XHRwYXRoOiBwcm9wZXJ0eVZhbHVlLmdldFBhdGgoKSxcblx0XHRcdFx0XHR2YWx1ZTogcHJvcGVydHlWYWx1ZS5nZXRPYmplY3QoKVxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHJhY2VEZXRhaWxzLmluaXRpYWxQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBpbiBwcm9wZXJ0eVZhbHVlcykge1xuXHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRpZiAoIWluaXRpYWxLZXlzLmluY2x1ZGVzKHByb3BlcnR5TmFtZSkpIHtcblx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgcHJvcGVydHlWYWx1ZS5pc0EgJiYgcHJvcGVydHlWYWx1ZS5pc0EoXCJzYXAudWkubW9kZWwuQ29udGV4dFwiKSkge1xuXHRcdFx0XHRcdHRyYWNlRGV0YWlscy5yZXNvbHZlZFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHtcblx0XHRcdFx0XHRcdHBhdGg6IHByb3BlcnR5VmFsdWUuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0dmFsdWU6IHByb3BlcnR5VmFsdWUuZ2V0T2JqZWN0KClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRyYWNlRGV0YWlscy5yZXNvbHZlZFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0Y29uc3QgZXJyb3JBbnkgPSBlIGFzIGFueTtcblx0XHRMb2cuZXJyb3IoZXJyb3JBbnksIGVycm9yQW55KTtcblx0XHRjb25zdCBvRXJyb3IgPSBjcmVhdGVFcnJvclhNTChcblx0XHRcdFtgRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBidWlsZGluZyBibG9jayAke2J1aWxkaW5nQkxvY2tEZWZpbml0aW9uLm5hbWV9YCwgZXJyb3JBbnkuc3RhY2tdLFxuXHRcdFx0b05vZGUub3V0ZXJIVE1MLFxuXHRcdFx0dHJhY2VEZXRhaWxzXG5cdFx0KTtcblx0XHRjb25zdCBvVGVtcGxhdGUgPSBwYXJzZVhNTFN0cmluZyhvRXJyb3IsIHRydWUpO1xuXHRcdG9Ob2RlLnJlcGxhY2VXaXRoKG9UZW1wbGF0ZSBhcyBhbnkpO1xuXHR9XG59XG5mdW5jdGlvbiBhZGRTaW5nbGVDb250ZXh0KG1Db250ZXh0czogYW55LCBvVmlzaXRvcjogYW55LCBvQ3R4OiBhbnksIG9NZXRhZGF0YUNvbnRleHRzOiBhbnkpIHtcblx0Y29uc3Qgc0tleSA9IG9DdHgubmFtZSB8fCBvQ3R4Lm1vZGVsIHx8IHVuZGVmaW5lZDtcblxuXHRpZiAob01ldGFkYXRhQ29udGV4dHNbc0tleV0pIHtcblx0XHRyZXR1cm47IC8vIGRvIG5vdCBhZGQgdHdpY2Vcblx0fVxuXHR0cnkge1xuXHRcdGxldCBzQ29udGV4dFBhdGggPSBvQ3R4LnBhdGg7XG5cdFx0aWYgKG9DdHgubW9kZWwgIT0gbnVsbCkge1xuXHRcdFx0c0NvbnRleHRQYXRoID0gYCR7b0N0eC5tb2RlbH0+JHtzQ29udGV4dFBhdGh9YDtcblx0XHR9XG5cdFx0Y29uc3QgbVNldHRpbmcgPSBvVmlzaXRvci5nZXRTZXR0aW5ncygpO1xuXHRcdGlmICghbVNldHRpbmcuYmluZGluZ0NvbnRleHRzW29DdHgubW9kZWxdICYmIG1TZXR0aW5nLm1vZGVsc1tvQ3R4Lm1vZGVsXSkge1xuXHRcdFx0bUNvbnRleHRzW3NLZXldID0gbVNldHRpbmcubW9kZWxzW29DdHgubW9kZWxdLmdldENvbnRleHQob0N0eC5wYXRoKTsgLy8gYWRkIHRoZSBjb250ZXh0IHRvIHRoZSB2aXNpdG9yXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1Db250ZXh0c1tzS2V5XSA9IG9WaXNpdG9yLmdldENvbnRleHQoc0NvbnRleHRQYXRoKTsgLy8gYWRkIHRoZSBjb250ZXh0IHRvIHRoZSB2aXNpdG9yXG5cdFx0fVxuXG5cdFx0b01ldGFkYXRhQ29udGV4dHNbc0tleV0gPSBtQ29udGV4dHNbc0tleV07IC8vIG1ha2UgaXQgYXZhaWxhYmxlIGluc2lkZSBtZXRhZGF0YUNvbnRleHRzIEpTT04gb2JqZWN0XG5cdH0gY2F0Y2ggKGV4KSB7XG5cdFx0Ly9jb25zb2xlLmVycm9yKGV4KTtcblx0XHQvLyBpZ25vcmUgdGhlIGNvbnRleHQgYXMgdGhpcyBjYW4gb25seSBiZSB0aGUgY2FzZSBpZiB0aGUgbW9kZWwgaXMgbm90IHJlYWR5LCBpLmUuIG5vdCBhIHByZXByb2Nlc3NpbmcgbW9kZWwgYnV0IG1heWJlIGEgbW9kZWwgZm9yXG5cdFx0Ly8gcHJvdmlkaW5nIGFmdGVyd2FyZHNcblx0XHQvLyBUT0RPIDAwMDIgbm90IHlldCBpbXBsZW1lbnRlZFxuXHRcdC8vbUNvbnRleHRzW1wiXyRlcnJvclwiXS5vTW9kZWwuc2V0UHJvcGVydHkoXCIvXCIgKyBzS2V5LCBleCk7XG5cdH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGJ1aWxkaW5nIGJsb2NrIGRlZmluaXRpb24gdG8gYmUgdXNlZCBpbnNpZGUgdGhlIHhtbCB0ZW1wbGF0ZSBwcm9jZXNzb3IuXG4gKlxuICogQHBhcmFtIGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uIFRoZSBidWlsZGluZyBibG9jayBkZWZpbml0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckJ1aWxkaW5nQmxvY2soYnVpbGRpbmdCbG9ja0RlZmluaXRpb246IEJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uKTogdm9pZCB7XG5cdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4oXG5cdFx0KG9Ob2RlOiBFbGVtZW50LCBvVmlzaXRvcjogSUNhbGxiYWNrKSA9PiBwcm9jZXNzQnVpbGRpbmdCbG9jayhidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbiwgb05vZGUsIG9WaXNpdG9yKSxcblx0XHRidWlsZGluZ0Jsb2NrRGVmaW5pdGlvbi5uYW1lc3BhY2UsXG5cdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ueG1sVGFnIHx8IGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWVcblx0KTtcblx0aWYgKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLnB1YmxpY05hbWVzcGFjZSkge1xuXHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4oXG5cdFx0XHQob05vZGU6IEVsZW1lbnQsIG9WaXNpdG9yOiBJQ2FsbGJhY2spID0+IHByb2Nlc3NCdWlsZGluZ0Jsb2NrKGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLCBvTm9kZSwgb1Zpc2l0b3IsIHRydWUpLFxuXHRcdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ucHVibGljTmFtZXNwYWNlLFxuXHRcdFx0YnVpbGRpbmdCbG9ja0RlZmluaXRpb24ueG1sVGFnIHx8IGJ1aWxkaW5nQmxvY2tEZWZpbml0aW9uLm5hbWVcblx0XHQpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVycm9yWE1MKGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdLCB4bWxGcmFnbWVudDogc3RyaW5nLCBhZGRpdGlvbmFsRGF0YT86IG9iamVjdCk6IHN0cmluZyB7XG5cdGNvbnN0IGVycm9yTGFiZWxzID0gZXJyb3JNZXNzYWdlcy5tYXAoKGVycm9yTWVzc2FnZSkgPT4geG1sYDxtOkxhYmVsIHRleHQ9XCIke2VzY2FwZVhNTChlcnJvck1lc3NhZ2UpfVwiLz5gKTtcblx0bGV0IGFkZGl0aW9uYWxUZXh0ID0gXCJcIjtcblx0aWYgKGFkZGl0aW9uYWxEYXRhKSB7XG5cdFx0YWRkaXRpb25hbFRleHQgPSB4bWxgPG06VkJveD5cblx0XHRcdFx0XHRcdDxtOkxhYmVsIHRleHQ9XCJUcmFjZSBJbmZvXCIvPlxuXHRcdFx0XHRcdFx0PGNvZGU6Q29kZUVkaXRvciB0eXBlPVwianNvblwiIHZhbHVlPVwiJHtlc2NhcGVYTUwoSlNPTi5zdHJpbmdpZnkoYWRkaXRpb25hbERhdGEsIG51bGwsIDQpKX1cIiBoZWlnaHQ9XCIzMDBweFwiIHdpZHRoPVwiMTAwdmhcIi8+XG5cdFx0XHRcdFx0PC9tOlZCb3g+YDtcblx0fVxuXHRyZXR1cm4geG1sYDxtOlZCb3ggeG1sbnM6bT1cInNhcC5tXCIgeG1sbnM6Y29kZT1cInNhcC51aS5jb2RlZWRpdG9yXCI+XG5cdFx0XHRcdCR7ZXJyb3JMYWJlbHN9XG5cdFx0XHRcdDxtOkhCb3g+XG5cdFx0XHRcdFx0PG06VkJveD5cblx0XHRcdFx0XHRcdDxtOkxhYmVsIHRleHQ9XCJIb3cgdGhlIGJ1aWxkaW5nIGJsb2NrIHdhcyBjYWxsZWRcIi8+XG5cdFx0XHRcdFx0XHQ8Y29kZTpDb2RlRWRpdG9yIHR5cGU9XCJ4bWxcIiB2YWx1ZT1cIiR7ZXNjYXBlWE1MKHhtbEZyYWdtZW50KX1cIiBoZWlnaHQ9XCIzMDBweFwiIHdpZHRoPVwiMTAwdmhcIi8+XG5cdFx0XHRcdFx0PC9tOlZCb3g+XG5cdFx0XHRcdFx0JHthZGRpdGlvbmFsVGV4dH1cblx0XHRcdFx0PC9tOkhCb3g+XG5cdFx0XHQ8L206VkJveD5gO1xufVxuXG5jb25zdCBteVN0b3JlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5mdW5jdGlvbiBzdG9yZVZhbHVlKHZhbHVlczogYW55KSB7XG5cdGNvbnN0IHByb3BlcnR5VUlEID0gYHVpZC0tJHt1aWQoKX1gO1xuXHRteVN0b3JlW3Byb3BlcnR5VUlEXSA9IHZhbHVlcztcblx0cmV0dXJuIHByb3BlcnR5VUlEO1xufVxuXG4vKipcbiAqIFBhcnNlIGFuIFhNTCBzdHJpbmcgYW5kIHJldHVybiB0aGUgYXNzb2NpYXRlZCBkb2N1bWVudC5cbiAqXG4gKiBAcGFyYW0geG1sU3RyaW5nIFRoZSB4bWwgc3RyaW5nXG4gKiBAcGFyYW0gYWRkRGVmYXVsdE5hbWVzcGFjZXMgV2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIGFkZCBkZWZhdWx0IG5hbWVzcGFjZVxuICogQHJldHVybnMgVGhlIFhNTCBkb2N1bWVudC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VYTUxTdHJpbmcoeG1sU3RyaW5nOiBzdHJpbmcsIGFkZERlZmF1bHROYW1lc3BhY2VzID0gZmFsc2UpOiBFbGVtZW50IHtcblx0aWYgKGFkZERlZmF1bHROYW1lc3BhY2VzKSB7XG5cdFx0eG1sU3RyaW5nID0gYDx0ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0eG1sbnM6dGVtcGxhdGU9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUudGVtcGxhdGUvMVwiXG5cdFx0XHRcdFx0XHR4bWxuczptPVwic2FwLm1cIlxuXHRcdFx0XHRcdFx0eG1sbnM6Y29yZT1cInNhcC51aS5jb3JlXCJcblx0XHRcdFx0XHRcdHhtbG5zOmN1c3RvbURhdGE9XCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCI+JHt4bWxTdHJpbmd9PC90ZW1wbGF0ZT5gO1xuXHR9XG5cdGNvbnN0IHhtbERvY3VtZW50ID0gRE9NUGFyc2VySW5zdGFuY2UucGFyc2VGcm9tU3RyaW5nKHhtbFN0cmluZywgXCJ0ZXh0L3htbFwiKTtcblx0bGV0IG91dHB1dCA9IHhtbERvY3VtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXHR3aGlsZSAob3V0cHV0Py5sb2NhbE5hbWUgPT09IFwidGVtcGxhdGVcIikge1xuXHRcdG91dHB1dCA9IG91dHB1dC5maXJzdEVsZW1lbnRDaGlsZDtcblx0fVxuXHRyZXR1cm4gb3V0cHV0IGFzIEVsZW1lbnQ7XG59XG5cbi8qKlxuICogRXNjYXBlIGFuIFhNTCBzdHJpbmcgdG8gaW5jbHVkZSBpdCBpbiBhbiBYTUwgZnJhZ21lbnQuXG4gKlxuICogQHBhcmFtIHN0ciBUaGUgc3RyaW5nIHRvIGVzY2FwZVxuICogQHJldHVybnMgVGhlIGVzY2FwZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlc2NhcGVYTUwoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gc3RyXG5cdFx0LnJlcGxhY2UoLyYvZywgXCImYW1wO1wiKVxuXHRcdC5yZXBsYWNlKC88L2csIFwiJmx0O1wiKVxuXHRcdC5yZXBsYWNlKC9cXG4vZywgXCImIzEwO1wiKVxuXHRcdC5yZXBsYWNlKC9cXHsvZywgXCJcXFxce1wiKVxuXHRcdC5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKVxuXHRcdC5yZXBsYWNlKC9cIi9nLCBcIiZxdW90O1wiKVxuXHRcdC5yZXBsYWNlKC8nL2csIFwiJmFwb3M7XCIpO1xufVxuXG4vKipcbiAqIEVzY2FwZSBhbiBYTUwgYXR0cmlidXRlIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB2YWwgVGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHZhbC5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIikucmVwbGFjZSgvPC9nLCBcIiZsdDtcIik7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBsaXRlcmFsIHdoaWxlIGhhbmRsaW5nIHNwZWNpYWwgb2JqZWN0IGNhc2UuXG4gKlxuICogQHBhcmFtIHN0cmluZ3MgVGhlIHN0cmluZyBwYXJ0cyBvZiB0aGUgdGVtcGxhdGUgbGl0ZXJhbFxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHBhcnQgb2YgdGhlIHRlbXBsYXRlIGxpdGVyYWxcbiAqIEByZXR1cm5zIFRoZSBYTUwgc3RyaW5nIGRvY3VtZW50IHJlcHJlc2VudGluZyB0aGUgc3RyaW5nIHRoYXQgd2FzIHVzZWQuXG4gKi9cbmV4cG9ydCBjb25zdCB4bWwgPSAoc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksIC4uLnZhbHVlczogYW55W10pID0+IHtcblx0bGV0IG91dFN0ciA9IFwiXCI7XG5cdGxldCBpO1xuXHRmb3IgKGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0b3V0U3RyICs9IHN0cmluZ3NbaV07XG5cdFx0Ly8gSGFuZGxlIHRoZSBkaWZmZXJlbnQgY2FzZSBvZiBvYmplY3QsIGlmIGl0J3MgYW4gYXJyYXkgd2Ugam9pbiB0aGVtLCBpZiBpdCdzIGEgYmluZGluZyBleHByZXNzaW9uIChkZXRlcm1pbmVkIGJ5IF90eXBlKSB0aGVuIHdlIGNvbXBpbGUgaXQuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWVzW2ldKSkge1xuXHRcdFx0b3V0U3RyICs9IHZhbHVlc1tpXS5mbGF0KDUpLmpvaW4oXCJcIikudHJpbSgpO1xuXHRcdH0gZWxzZSBpZiAodmFsdWVzW2ldPy5fdHlwZSkge1xuXHRcdFx0Y29uc3QgY29tcGlsZWRFeHByZXNzaW9uID0gY29tcGlsZUV4cHJlc3Npb24odmFsdWVzW2ldKTtcblx0XHRcdG91dFN0ciArPSBjb21waWxlZEV4cHJlc3Npb24gIT09IHVuZGVmaW5lZCA/IGVzY2FwZVhNTEF0dHJpYnV0ZVZhbHVlKGNvbXBpbGVkRXhwcmVzc2lvbikgOiB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIGlmICh2YWx1ZXNbaV0/LmdldFRlbXBsYXRlKSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWVzW2ldLmdldFRlbXBsYXRlKCk7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWVzW2ldID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eVVJZCA9IHN0b3JlVmFsdWUodmFsdWVzW2ldKTtcblx0XHRcdG91dFN0ciArPSBgJHtwcm9wZXJ0eVVJZH1gO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRvdXRTdHIgKz0gdmFsdWVzW2ldO1xuXHRcdH1cblx0fVxuXHRvdXRTdHIgKz0gc3RyaW5nc1tpXTtcblx0b3V0U3RyID0gb3V0U3RyLnRyaW0oKTtcblx0aWYgKGlzVHJhY2VNb2RlKSB7XG5cdFx0Y29uc3QgeG1sUmVzdWx0ID0gcGFyc2VYTUxTdHJpbmcob3V0U3RyLCB0cnVlKTtcblx0XHRpZiAoeG1sUmVzdWx0ICYmIHhtbFJlc3VsdD8ubG9jYWxOYW1lID09PSBcInBhcnNlcmVycm9yXCIpIHtcblx0XHRcdGNvbnN0IGVycm9yTWVzc2FnZSA9ICh4bWxSZXN1bHQgYXMgYW55KS5pbm5lclRleHQgfHwgKHhtbFJlc3VsdCBhcyBhbnkpLmlubmVySFRNTDtcblx0XHRcdHJldHVybiBjcmVhdGVFcnJvclhNTChbZXJyb3JNZXNzYWdlLnNwbGl0KFwiXFxuXCIpWzBdXSwgb3V0U3RyKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG91dFN0cjtcbn07XG4iXX0=
|