@sapui5/sap.fe.core 1.108.2 → 1.110.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/README.md +5 -1
- package/package.json +11 -9
- package/src/.eslintrc +7 -0
- package/src/sap/fe/core/.library +39 -37
- package/src/sap/fe/core/.supportrc +3 -3
- package/src/sap/fe/core/ActionRuntime.js +72 -27
- package/src/sap/fe/core/ActionRuntime.ts +104 -21
- package/src/sap/fe/core/AppComponent.js +102 -120
- package/src/sap/fe/core/AppComponent.ts +148 -45
- package/src/sap/fe/core/AppStateHandler.js +105 -91
- package/src/sap/fe/core/AppStateHandler.ts +85 -23
- package/src/sap/fe/core/BaseController.js +5 -20
- package/src/sap/fe/core/BaseController.ts +11 -2
- package/src/sap/fe/core/CommonUtils.js +770 -1079
- package/src/sap/fe/core/CommonUtils.ts +750 -491
- package/src/sap/fe/core/ExtensionAPI.js +69 -96
- package/src/sap/fe/core/ExtensionAPI.ts +15 -17
- package/src/sap/fe/core/PageController.js +21 -46
- package/src/sap/fe/core/PageController.ts +11 -2
- package/src/sap/fe/core/TemplateComponent.js +6 -51
- package/src/sap/fe/core/TemplateComponent.ts +27 -16
- package/src/sap/fe/core/TemplateModel.js +18 -24
- package/src/sap/fe/core/TemplateModel.ts +25 -6
- package/src/sap/fe/core/buildingBlocks/AttributeModel.js +8 -23
- package/src/sap/fe/core/buildingBlocks/AttributeModel.ts +5 -4
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +146 -180
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +144 -57
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFormatter.js +1 -1
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.js +43 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockFragment.ts +11 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.js +436 -556
- package/src/sap/fe/core/buildingBlocks/BuildingBlockRuntime.ts +288 -157
- package/src/sap/fe/core/buildingBlocks/TraceInfo.js +215 -202
- package/src/sap/fe/core/buildingBlocks/TraceInfo.ts +93 -51
- package/src/sap/fe/core/controllerextensions/BusyLocker.js +11 -26
- package/src/sap/fe/core/controllerextensions/EditFlow.js +407 -596
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +163 -56
- package/src/sap/fe/core/controllerextensions/Feedback.js +70 -0
- package/src/sap/fe/core/controllerextensions/Feedback.ts +64 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +12 -23
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +1 -1
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +127 -182
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +65 -32
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +96 -198
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +4 -5
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +134 -291
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +21 -12
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +111 -214
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +44 -44
- package/src/sap/fe/core/controllerextensions/MassEdit.js +24 -44
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +3 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +39 -52
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +26 -7
- package/src/sap/fe/core/controllerextensions/PageReady.js +81 -119
- package/src/sap/fe/core/controllerextensions/PageReady.ts +36 -15
- package/src/sap/fe/core/controllerextensions/Paginator.js +16 -51
- package/src/sap/fe/core/controllerextensions/Paginator.ts +1 -3
- package/src/sap/fe/core/controllerextensions/Placeholder.js +7 -33
- package/src/sap/fe/core/controllerextensions/Routing.js +24 -32
- package/src/sap/fe/core/controllerextensions/Routing.ts +6 -1
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +53 -98
- package/src/sap/fe/core/controllerextensions/Share.ts +6 -3
- package/src/sap/fe/core/controllerextensions/SideEffects.js +103 -174
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +37 -22
- package/src/sap/fe/core/controllerextensions/ViewState.js +341 -276
- package/src/sap/fe/core/controllerextensions/ViewState.ts +236 -84
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +6 -22
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +8 -2
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.js +66 -88
- package/src/sap/fe/core/controllerextensions/collaboration/ActivitySync.ts +64 -17
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +28 -34
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +22 -1
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.js +69 -65
- package/src/sap/fe/core/controllerextensions/collaboration/Manage.ts +31 -12
- package/src/sap/fe/core/controllerextensions/collaboration/ManageDialog.fragment.xml +15 -13
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +273 -906
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +142 -420
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +49 -115
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +12 -7
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +70 -89
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +313 -320
- package/src/sap/fe/core/controllerextensions/editFlow/operations.js +582 -683
- package/src/sap/fe/core/controllerextensions/editFlow/operations.ts +507 -386
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +111 -102
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +102 -79
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +689 -154
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +866 -31
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.js +24 -101
- package/src/sap/fe/core/controllerextensions/pageReady/DataQueryWatcher.ts +5 -5
- package/src/sap/fe/core/controllerextensions/routing/RouterProxy.js +91 -217
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +3 -20
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +1 -0
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +46 -46
- package/src/sap/fe/core/controls/Any.js +1 -1
- package/src/sap/fe/core/controls/AnyElement.js +1 -1
- package/src/sap/fe/core/controls/CommandExecution.js +4 -26
- package/src/sap/fe/core/controls/ConditionalWrapper.js +16 -33
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +16 -2
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.js +41 -94
- package/src/sap/fe/core/controls/CustomFilterFieldContentWrapper.ts +1 -1
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +5 -34
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +5 -7
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossDraft.fragment.xml +7 -7
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +56 -58
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +53 -33
- package/src/sap/fe/core/controls/FieldWrapper.js +6 -49
- package/src/sap/fe/core/controls/FileWrapper.js +51 -136
- package/src/sap/fe/core/controls/FileWrapper.ts +25 -29
- package/src/sap/fe/core/controls/FilterBar.js +19 -54
- package/src/sap/fe/core/controls/FormElementWrapper.js +1 -22
- package/src/sap/fe/core/controls/MassEditSelect.js +1 -1
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +1 -5
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +2 -2
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +24 -46
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +14 -41
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +4 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +26 -67
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +20 -20
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +12 -48
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +17 -46
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +3 -3
- package/src/sap/fe/core/controls/massEdit/MassEditField.fragment.xml +1 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +6 -78
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +4 -4
- package/src/sap/fe/core/converters/ConverterContext.js +44 -98
- package/src/sap/fe/core/converters/ConverterContext.ts +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -20
- package/src/sap/fe/core/converters/ManifestSettings.ts +16 -9
- package/src/sap/fe/core/converters/ManifestWrapper.js +97 -158
- package/src/sap/fe/core/converters/ManifestWrapper.ts +4 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +28 -167
- package/src/sap/fe/core/converters/MetaModelConverter.ts +9 -3
- package/src/sap/fe/core/converters/TemplateConverter.js +10 -22
- package/src/sap/fe/core/converters/TemplateConverter.ts +10 -7
- package/src/sap/fe/core/converters/annotations/DataField.js +88 -132
- package/src/sap/fe/core/converters/annotations/DataField.ts +90 -38
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +57 -379
- package/src/sap/fe/core/converters/controls/Common/Action.js +45 -115
- package/src/sap/fe/core/converters/controls/Common/Action.ts +17 -5
- package/src/sap/fe/core/converters/controls/Common/Chart.js +20 -73
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +21 -14
- package/src/sap/fe/core/converters/controls/Common/Criticality.js +1 -9
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +40 -94
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +44 -31
- package/src/sap/fe/core/converters/controls/Common/Form.js +26 -63
- package/src/sap/fe/core/converters/controls/Common/Form.ts +24 -10
- package/src/sap/fe/core/converters/controls/Common/KPI.js +13 -63
- package/src/sap/fe/core/converters/controls/Common/Table.js +368 -707
- package/src/sap/fe/core/converters/controls/Common/Table.ts +308 -197
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +54 -109
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +15 -9
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +69 -210
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +23 -16
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +12 -80
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +3 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -19
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +45 -136
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +10 -10
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +82 -173
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +48 -22
- package/src/sap/fe/core/converters/helpers/Aggregation.js +24 -66
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +3 -7
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +9 -19
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +0 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +20 -48
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +5 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +12 -51
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +13 -11
- package/src/sap/fe/core/converters/helpers/ID.js +3 -17
- package/src/sap/fe/core/converters/helpers/ID.ts +2 -3
- package/src/sap/fe/core/converters/helpers/IssueManager.js +1 -6
- package/src/sap/fe/core/converters/helpers/Key.js +10 -19
- package/src/sap/fe/core/converters/helpers/Key.ts +3 -3
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +2 -20
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +2 -37
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +126 -131
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +112 -31
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +67 -131
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +58 -27
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +106 -183
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +73 -104
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +74 -67
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +77 -69
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +20 -29
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +21 -0
- package/src/sap/fe/core/formatters/FPMFormatter.js +3 -7
- package/src/sap/fe/core/formatters/KPIFormatter.js +5 -13
- package/src/sap/fe/core/formatters/StandardFormatter.js +3 -18
- package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -2
- package/src/sap/fe/core/formatters/TableFormatter.js +87 -53
- package/src/sap/fe/core/formatters/TableFormatter.ts +96 -9
- package/src/sap/fe/core/formatters/TableFormatterTypes.js +1 -4
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -37
- package/src/sap/fe/core/fpm/Component.js +2 -17
- package/src/sap/fe/core/helpers/AnnotationEnum.js +10 -20
- package/src/sap/fe/core/helpers/AnnotationEnum.ts +6 -6
- package/src/sap/fe/core/helpers/AppStartupHelper.js +16 -52
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +1 -1
- package/src/sap/fe/core/helpers/BindingToolkit.js +106 -364
- package/src/sap/fe/core/helpers/BindingToolkit.ts +30 -7
- package/src/sap/fe/core/helpers/ClassSupport.js +16 -97
- package/src/sap/fe/core/helpers/ClassSupport.ts +7 -4
- package/src/sap/fe/core/helpers/DeleteHelper.js +621 -0
- package/src/sap/fe/core/helpers/DeleteHelper.ts +796 -0
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -12
- package/src/sap/fe/core/helpers/EditState.js +2 -5
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -10
- package/src/sap/fe/core/helpers/FPMHelper.js +3 -8
- package/src/sap/fe/core/helpers/FPMHelper.ts +2 -1
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +8 -38
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +1 -5
- package/src/sap/fe/core/helpers/LoaderUtils.js +1 -7
- package/src/sap/fe/core/helpers/MassEditHelper.js +177 -289
- package/src/sap/fe/core/helpers/MassEditHelper.ts +124 -91
- package/src/sap/fe/core/helpers/MessageStrip.js +12 -28
- package/src/sap/fe/core/helpers/MessageStrip.ts +7 -7
- package/src/sap/fe/core/helpers/ModelHelper.js +62 -103
- package/src/sap/fe/core/helpers/ModelHelper.ts +58 -20
- package/src/sap/fe/core/helpers/PasteHelper.js +28 -51
- package/src/sap/fe/core/helpers/PasteHelper.ts +10 -9
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +112 -136
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +111 -111
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +5 -11
- package/src/sap/fe/core/helpers/SideEffectsHelper.js +26 -32
- package/src/sap/fe/core/helpers/StableIdHelper.js +166 -218
- package/src/sap/fe/core/helpers/StableIdHelper.ts +175 -191
- package/src/sap/fe/core/helpers/Synchronization.js +1 -8
- package/src/sap/fe/core/helpers/ToES6Promise.js +1 -4
- package/src/sap/fe/core/helpers/TypeGuards.js +22 -0
- package/src/sap/fe/core/helpers/TypeGuards.ts +9 -0
- package/src/sap/fe/core/jsx-runtime/Fragment.js +1 -3
- package/src/sap/fe/core/jsx-runtime/ViewLoader.js +3 -23
- package/src/sap/fe/core/jsx-runtime/jsx-control.js +3 -23
- package/src/sap/fe/core/jsx-runtime/jsx-control.ts +2 -1
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +4 -16
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.js +2 -5
- package/src/sap/fe/core/jsx-runtime/jsxs.js +1 -1
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.js +4 -27
- package/src/sap/fe/core/jsx-runtime/useMDXComponents.tsx +1 -1
- package/src/sap/fe/core/library.js +9 -48
- package/src/sap/fe/core/library.support.js +3 -2
- package/src/sap/fe/core/library.support.ts +3 -1
- package/src/sap/fe/core/library.ts +3 -8
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +74 -39
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +71 -26
- package/src/sap/fe/core/messagebundle.properties +113 -67
- package/src/sap/fe/core/messagebundle_ar.properties +20 -3
- package/src/sap/fe/core/messagebundle_bg.properties +22 -5
- package/src/sap/fe/core/messagebundle_ca.properties +21 -4
- package/src/sap/fe/core/messagebundle_cs.properties +21 -4
- package/src/sap/fe/core/messagebundle_cy.properties +22 -5
- package/src/sap/fe/core/messagebundle_da.properties +20 -3
- package/src/sap/fe/core/messagebundle_de.properties +38 -21
- package/src/sap/fe/core/messagebundle_el.properties +20 -3
- package/src/sap/fe/core/messagebundle_en.properties +38 -21
- package/src/sap/fe/core/messagebundle_en_GB.properties +20 -3
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -28
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +41 -24
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +42 -29
- package/src/sap/fe/core/messagebundle_es.properties +40 -23
- package/src/sap/fe/core/messagebundle_es_MX.properties +20 -3
- package/src/sap/fe/core/messagebundle_et.properties +20 -3
- package/src/sap/fe/core/messagebundle_fi.properties +20 -3
- package/src/sap/fe/core/messagebundle_fr.properties +21 -4
- package/src/sap/fe/core/messagebundle_fr_CA.properties +22 -5
- package/src/sap/fe/core/messagebundle_hi.properties +20 -3
- package/src/sap/fe/core/messagebundle_hr.properties +22 -5
- package/src/sap/fe/core/messagebundle_hu.properties +20 -3
- package/src/sap/fe/core/messagebundle_id.properties +20 -3
- package/src/sap/fe/core/messagebundle_it.properties +23 -6
- package/src/sap/fe/core/messagebundle_iw.properties +20 -3
- package/src/sap/fe/core/messagebundle_ja.properties +22 -5
- package/src/sap/fe/core/messagebundle_kk.properties +21 -4
- package/src/sap/fe/core/messagebundle_ko.properties +20 -3
- package/src/sap/fe/core/messagebundle_lt.properties +20 -3
- package/src/sap/fe/core/messagebundle_lv.properties +20 -3
- package/src/sap/fe/core/messagebundle_ms.properties +20 -3
- package/src/sap/fe/core/messagebundle_nl.properties +20 -3
- package/src/sap/fe/core/messagebundle_no.properties +20 -3
- package/src/sap/fe/core/messagebundle_pl.properties +21 -4
- package/src/sap/fe/core/messagebundle_pt.properties +20 -3
- package/src/sap/fe/core/messagebundle_pt_PT.properties +20 -3
- package/src/sap/fe/core/messagebundle_ro.properties +20 -3
- package/src/sap/fe/core/messagebundle_ru.properties +20 -3
- package/src/sap/fe/core/messagebundle_sh.properties +20 -3
- package/src/sap/fe/core/messagebundle_sk.properties +20 -3
- package/src/sap/fe/core/messagebundle_sl.properties +26 -9
- package/src/sap/fe/core/messagebundle_sv.properties +20 -3
- package/src/sap/fe/core/messagebundle_th.properties +21 -4
- package/src/sap/fe/core/messagebundle_tr.properties +20 -3
- package/src/sap/fe/core/messagebundle_uk.properties +23 -6
- package/src/sap/fe/core/messagebundle_vi.properties +20 -3
- package/src/sap/fe/core/messagebundle_zh_CN.properties +20 -3
- package/src/sap/fe/core/messagebundle_zh_TW.properties +20 -3
- package/src/sap/fe/core/operationsHelper.js +74 -101
- package/src/sap/fe/core/operationsHelper.ts +113 -44
- package/src/sap/fe/core/rootView/Fcl.controller.js +151 -228
- package/src/sap/fe/core/rootView/Fcl.controller.ts +90 -15
- package/src/sap/fe/core/rootView/Fcl.view.xml +1 -8
- package/src/sap/fe/core/rootView/NavContainer.controller.js +41 -78
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +32 -38
- package/src/sap/fe/core/rootView/RootViewBaseController.js +110 -181
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +37 -17
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -18
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +13 -52
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +1 -22
- package/src/sap/fe/core/services/NavigationServiceFactory.js +45 -87
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +17 -10
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +4 -28
- package/src/sap/fe/core/services/RoutingServiceFactory.js +92 -250
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +8 -12
- package/src/sap/fe/core/services/ShellServicesFactory.js +122 -251
- package/src/sap/fe/core/services/ShellServicesFactory.ts +19 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +188 -273
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +143 -154
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +37 -135
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +59 -94
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +2 -16
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
- package/src/sap/fe/core/support/AnnotationIssue.support.js +6 -9
- package/src/sap/fe/core/support/AnnotationIssue.support.ts +4 -4
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.js +6 -9
- package/src/sap/fe/core/support/CollectionFacetMissingID.support.ts +3 -3
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +6 -9
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +3 -3
- package/src/sap/fe/core/support/CommonHelper.js +7 -16
- package/src/sap/fe/core/support/Diagnostics.js +1 -10
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +6 -9
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +3 -3
- package/src/sap/fe/core/templating/CommonFormatters.js +1 -15
- package/src/sap/fe/core/templating/CriticalityFormatters.js +4 -20
- package/src/sap/fe/core/templating/DataFieldFormatters.js +1 -20
- package/src/sap/fe/core/templating/DataModelPathHelper.js +49 -121
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +41 -31
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +8 -15
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +7 -7
- package/src/sap/fe/core/templating/EntitySetHelper.js +6 -31
- package/src/sap/fe/core/templating/FieldControlHelper.js +4 -21
- package/src/sap/fe/core/templating/FieldControlHelper.ts +1 -1
- package/src/sap/fe/core/templating/FilterHelper.js +40 -111
- package/src/sap/fe/core/templating/FilterHelper.ts +20 -16
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -19
- package/src/sap/fe/core/templating/FilterTemplating.ts +1 -1
- package/src/sap/fe/core/templating/PropertyFormatters.js +1 -34
- package/src/sap/fe/core/templating/PropertyHelper.js +120 -163
- package/src/sap/fe/core/templating/PropertyHelper.ts +69 -33
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +46 -0
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +34 -0
- package/src/sap/fe/core/templating/UIFormatters.js +40 -180
- package/src/sap/fe/core/templating/UIFormatters.ts +37 -43
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +3 -14
- package/src/sap/fe/core/type/Email.js +1 -10
- package/src/sap/fe/core/type/TypeUtil.js +1 -11
- package/ui5.yaml +0 -1
- package/src/sap/fe/core/controls/ActionParameterDialogFieldValueHelp.fragment.xml +0 -35
- package/src/sap/fe/core/helpers/LRMessageStrip.js +0 -234
- package/src/sap/fe/core/helpers/LRMessageStrip.ts +0 -216
|
@@ -2,283 +2,56 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/operations", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/editFlow/operations", "sap/fe/core/controllerextensions/editFlow/sticky", "sap/fe/core/controllerextensions/messageHandler/messageHandling", "sap/fe/core/helpers/DeleteHelper", "sap/fe/core/helpers/FPMHelper", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/helpers/StableIdHelper", "sap/fe/core/library", "sap/m/Button", "sap/m/Dialog", "sap/m/MessageBox", "sap/m/MessageToast", "sap/m/Popover", "sap/m/Text", "sap/m/VBox", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/library", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model/json/JSONModel", "../../helpers/ToES6Promise"], function (Log, CommonUtils, BusyLocker, draft, operations, sticky, messageHandling, deleteHelper, FPMHelper, ModelHelper, StableIdHelper, FELibrary, Button, Dialog, MessageBox, MessageToast, Popover, Text, VBox, Core, Fragment, coreLibrary, XMLPreprocessor, XMLTemplateProcessor, JSONModel, toES6Promise) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
+
var generate = StableIdHelper.generate;
|
|
8
9
|
function _catch(body, recover) {
|
|
9
10
|
try {
|
|
10
11
|
var result = body();
|
|
11
12
|
} catch (e) {
|
|
12
13
|
return recover(e);
|
|
13
14
|
}
|
|
14
|
-
|
|
15
15
|
if (result && result.then) {
|
|
16
16
|
return result.then(void 0, recover);
|
|
17
17
|
}
|
|
18
|
-
|
|
19
18
|
return result;
|
|
20
19
|
}
|
|
21
|
-
|
|
22
20
|
function _finallyRethrows(body, finalizer) {
|
|
23
21
|
try {
|
|
24
22
|
var result = body();
|
|
25
23
|
} catch (e) {
|
|
26
24
|
return finalizer(true, e);
|
|
27
25
|
}
|
|
28
|
-
|
|
29
26
|
if (result && result.then) {
|
|
30
27
|
return result.then(finalizer.bind(null, false), finalizer.bind(null, true));
|
|
31
28
|
}
|
|
32
|
-
|
|
33
29
|
return finalizer(false, result);
|
|
34
30
|
}
|
|
35
|
-
|
|
36
|
-
function _settle(pact, state, value) {
|
|
37
|
-
if (!pact.s) {
|
|
38
|
-
if (value instanceof _Pact) {
|
|
39
|
-
if (value.s) {
|
|
40
|
-
if (state & 1) {
|
|
41
|
-
state = value.s;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
value = value.v;
|
|
45
|
-
} else {
|
|
46
|
-
value.o = _settle.bind(null, pact, state);
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (value && value.then) {
|
|
52
|
-
value.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
pact.s = state;
|
|
57
|
-
pact.v = value;
|
|
58
|
-
var observer = pact.o;
|
|
59
|
-
|
|
60
|
-
if (observer) {
|
|
61
|
-
observer(pact);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
var _Pact = /*#__PURE__*/function () {
|
|
67
|
-
function _Pact() {}
|
|
68
|
-
|
|
69
|
-
_Pact.prototype.then = function (onFulfilled, onRejected) {
|
|
70
|
-
var result = new _Pact();
|
|
71
|
-
var state = this.s;
|
|
72
|
-
|
|
73
|
-
if (state) {
|
|
74
|
-
var callback = state & 1 ? onFulfilled : onRejected;
|
|
75
|
-
|
|
76
|
-
if (callback) {
|
|
77
|
-
try {
|
|
78
|
-
_settle(result, 1, callback(this.v));
|
|
79
|
-
} catch (e) {
|
|
80
|
-
_settle(result, 2, e);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
return result;
|
|
84
|
-
} else {
|
|
85
|
-
return this;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
this.o = function (_this) {
|
|
90
|
-
try {
|
|
91
|
-
var value = _this.v;
|
|
92
|
-
|
|
93
|
-
if (_this.s & 1) {
|
|
94
|
-
_settle(result, 1, onFulfilled ? onFulfilled(value) : value);
|
|
95
|
-
} else if (onRejected) {
|
|
96
|
-
_settle(result, 1, onRejected(value));
|
|
97
|
-
} else {
|
|
98
|
-
_settle(result, 2, value);
|
|
99
|
-
}
|
|
100
|
-
} catch (e) {
|
|
101
|
-
_settle(result, 2, e);
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
return result;
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
return _Pact;
|
|
109
|
-
}();
|
|
110
|
-
|
|
111
|
-
function _switch(discriminant, cases) {
|
|
112
|
-
var dispatchIndex = -1;
|
|
113
|
-
var awaitBody;
|
|
114
|
-
|
|
115
|
-
outer: {
|
|
116
|
-
for (var i = 0; i < cases.length; i++) {
|
|
117
|
-
var test = cases[i][0];
|
|
118
|
-
|
|
119
|
-
if (test) {
|
|
120
|
-
var testValue = test();
|
|
121
|
-
|
|
122
|
-
if (testValue && testValue.then) {
|
|
123
|
-
break outer;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
if (testValue === discriminant) {
|
|
127
|
-
dispatchIndex = i;
|
|
128
|
-
break;
|
|
129
|
-
}
|
|
130
|
-
} else {
|
|
131
|
-
// Found the default case, set it as the pending dispatch case
|
|
132
|
-
dispatchIndex = i;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
if (dispatchIndex !== -1) {
|
|
137
|
-
do {
|
|
138
|
-
var body = cases[dispatchIndex][1];
|
|
139
|
-
|
|
140
|
-
while (!body) {
|
|
141
|
-
dispatchIndex++;
|
|
142
|
-
body = cases[dispatchIndex][1];
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
var result = body();
|
|
146
|
-
|
|
147
|
-
if (result && result.then) {
|
|
148
|
-
awaitBody = true;
|
|
149
|
-
break outer;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
var fallthroughCheck = cases[dispatchIndex][2];
|
|
153
|
-
dispatchIndex++;
|
|
154
|
-
} while (fallthroughCheck && !fallthroughCheck());
|
|
155
|
-
|
|
156
|
-
return result;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
var pact = new _Pact();
|
|
161
|
-
|
|
162
|
-
var reject = _settle.bind(null, pact, 2);
|
|
163
|
-
|
|
164
|
-
(awaitBody ? result.then(_resumeAfterBody) : testValue.then(_resumeAfterTest)).then(void 0, reject);
|
|
165
|
-
return pact;
|
|
166
|
-
|
|
167
|
-
function _resumeAfterTest(value) {
|
|
168
|
-
for (;;) {
|
|
169
|
-
if (value === discriminant) {
|
|
170
|
-
dispatchIndex = i;
|
|
171
|
-
break;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
if (++i === cases.length) {
|
|
175
|
-
if (dispatchIndex !== -1) {
|
|
176
|
-
break;
|
|
177
|
-
} else {
|
|
178
|
-
_settle(pact, 1, result);
|
|
179
|
-
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
test = cases[i][0];
|
|
185
|
-
|
|
186
|
-
if (test) {
|
|
187
|
-
value = test();
|
|
188
|
-
|
|
189
|
-
if (value && value.then) {
|
|
190
|
-
value.then(_resumeAfterTest).then(void 0, reject);
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
} else {
|
|
194
|
-
dispatchIndex = i;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
do {
|
|
199
|
-
var body = cases[dispatchIndex][1];
|
|
200
|
-
|
|
201
|
-
while (!body) {
|
|
202
|
-
dispatchIndex++;
|
|
203
|
-
body = cases[dispatchIndex][1];
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
var result = body();
|
|
207
|
-
|
|
208
|
-
if (result && result.then) {
|
|
209
|
-
result.then(_resumeAfterBody).then(void 0, reject);
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
var fallthroughCheck = cases[dispatchIndex][2];
|
|
214
|
-
dispatchIndex++;
|
|
215
|
-
} while (fallthroughCheck && !fallthroughCheck());
|
|
216
|
-
|
|
217
|
-
_settle(pact, 1, result);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
function _resumeAfterBody(result) {
|
|
221
|
-
for (;;) {
|
|
222
|
-
var fallthroughCheck = cases[dispatchIndex][2];
|
|
223
|
-
|
|
224
|
-
if (!fallthroughCheck || fallthroughCheck()) {
|
|
225
|
-
break;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
dispatchIndex++;
|
|
229
|
-
var body = cases[dispatchIndex][1];
|
|
230
|
-
|
|
231
|
-
while (!body) {
|
|
232
|
-
dispatchIndex++;
|
|
233
|
-
body = cases[dispatchIndex][1];
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
result = body();
|
|
237
|
-
|
|
238
|
-
if (result && result.then) {
|
|
239
|
-
result.then(_resumeAfterBody).then(void 0, reject);
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
_settle(pact, 1, result);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
|
|
248
31
|
var CreationMode = FELibrary.CreationMode;
|
|
249
32
|
var ProgrammingModel = FELibrary.ProgrammingModel;
|
|
250
33
|
var ValueState = coreLibrary.ValueState;
|
|
251
34
|
/* Make sure that the mParameters is not the oEvent */
|
|
252
|
-
|
|
253
35
|
function getParameters(mParameters) {
|
|
254
36
|
if (mParameters && mParameters.getMetadata && mParameters.getMetadata().getName() === "sap.ui.base.Event") {
|
|
255
37
|
mParameters = {};
|
|
256
38
|
}
|
|
257
|
-
|
|
258
39
|
return mParameters || {};
|
|
259
40
|
}
|
|
260
|
-
|
|
261
41
|
var TransactionHelper = /*#__PURE__*/function () {
|
|
262
42
|
function TransactionHelper(oAppComponent, oLockObject) {
|
|
263
|
-
this._bIsModified = false;
|
|
264
|
-
this._bCreateMode = false;
|
|
265
|
-
this._bContinueDiscard = false;
|
|
266
43
|
this._oAppComponent = oAppComponent;
|
|
267
44
|
this.oLockObject = oLockObject;
|
|
268
45
|
}
|
|
269
|
-
|
|
270
46
|
var _proto = TransactionHelper.prototype;
|
|
271
|
-
|
|
272
47
|
_proto.getProgrammingModel = function getProgrammingModel(oContext) {
|
|
273
48
|
if (!this.sProgrammingModel && oContext) {
|
|
274
49
|
var sPath;
|
|
275
|
-
|
|
276
50
|
if (oContext.isA("sap.ui.model.odata.v4.Context")) {
|
|
277
51
|
sPath = oContext.getPath();
|
|
278
52
|
} else {
|
|
279
53
|
sPath = oContext.isRelative() ? oContext.getResolvedPath() : oContext.getPath();
|
|
280
54
|
}
|
|
281
|
-
|
|
282
55
|
if (ModelHelper.isDraftSupported(oContext.getModel().getMetaModel(), sPath)) {
|
|
283
56
|
this.sProgrammingModel = ProgrammingModel.Draft;
|
|
284
57
|
} else if (ModelHelper.isStickySessionSupported(oContext.getModel().getMetaModel())) {
|
|
@@ -289,9 +62,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
289
62
|
return ProgrammingModel.NonDraft;
|
|
290
63
|
}
|
|
291
64
|
}
|
|
292
|
-
|
|
293
65
|
return this.sProgrammingModel;
|
|
294
66
|
}
|
|
67
|
+
|
|
295
68
|
/**
|
|
296
69
|
* Validates a document.
|
|
297
70
|
*
|
|
@@ -305,22 +78,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
305
78
|
* @returns Promise resolves with result of the custom validation function
|
|
306
79
|
* @ui5-restricted
|
|
307
80
|
* @final
|
|
308
|
-
|
|
309
|
-
;
|
|
310
|
-
|
|
81
|
+
*/;
|
|
311
82
|
_proto.validateDocument = function validateDocument(oContext, mParameters, oView) {
|
|
312
83
|
var sCustomValidationFunction = mParameters && mParameters.customValidationFunction;
|
|
313
|
-
|
|
314
84
|
if (sCustomValidationFunction) {
|
|
315
85
|
var sModule = sCustomValidationFunction.substring(0, sCustomValidationFunction.lastIndexOf(".") || -1).replace(/\./gi, "/"),
|
|
316
|
-
|
|
317
|
-
|
|
86
|
+
sFunctionName = sCustomValidationFunction.substring(sCustomValidationFunction.lastIndexOf(".") + 1, sCustomValidationFunction.length),
|
|
87
|
+
mData = mParameters.data;
|
|
318
88
|
delete mData["@$ui5.context.isTransient"];
|
|
319
89
|
return FPMHelper.validationWrapper(sModule, sFunctionName, mData, oView, oContext);
|
|
320
90
|
}
|
|
321
|
-
|
|
322
91
|
return Promise.resolve([]);
|
|
323
92
|
}
|
|
93
|
+
|
|
324
94
|
/**
|
|
325
95
|
* Creates a new document.
|
|
326
96
|
*
|
|
@@ -341,36 +111,29 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
341
111
|
* @returns Promise resolves with new binding context
|
|
342
112
|
* @ui5-restricted
|
|
343
113
|
* @final
|
|
344
|
-
|
|
345
|
-
;
|
|
346
|
-
|
|
114
|
+
*/;
|
|
347
115
|
_proto.createDocument = function createDocument(oMainListBinding, mInParameters, oResourceBundle, messageHandler) {
|
|
348
116
|
var bFromCopyPaste = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
|
|
349
117
|
var oView = arguments.length > 5 ? arguments[5] : undefined;
|
|
350
|
-
|
|
351
118
|
try {
|
|
352
119
|
var _exit2 = false;
|
|
353
|
-
|
|
354
120
|
var _this2 = this;
|
|
355
|
-
|
|
356
121
|
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
357
122
|
var oModel = oMainListBinding.getModel(),
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
123
|
+
oMetaModel = oModel.getMetaModel(),
|
|
124
|
+
sMetaPath = oMetaModel.getMetaPath(oMainListBinding.getHeaderContext().getPath()),
|
|
125
|
+
sCreateHash = _this2._getAppComponent().getRouterProxy().getHash(),
|
|
126
|
+
oComponentData = _this2._getAppComponent().getComponentData(),
|
|
127
|
+
oStartupParameters = oComponentData && oComponentData.startupParameters || {},
|
|
128
|
+
sNewAction = !oMainListBinding.isRelative() ? _this2._getNewAction(oStartupParameters, sCreateHash, oMetaModel, sMetaPath) : undefined;
|
|
365
129
|
var mBindingParameters = {
|
|
366
|
-
|
|
130
|
+
$$patchWithoutSideEffects: true
|
|
367
131
|
};
|
|
368
132
|
var sMessagesPath = oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.Common.v1.Messages/$Path"));
|
|
369
133
|
var sBusyPath = "/busy";
|
|
370
134
|
var sFunctionName = oMetaModel.getObject("".concat(sMetaPath, "@com.sap.vocabularies.Common.v1.DefaultValuesFunction")) || oMetaModel.getObject("".concat(ModelHelper.getTargetEntitySet(oMetaModel.getContext(sMetaPath)), "@com.sap.vocabularies.Common.v1.DefaultValuesFunction"));
|
|
371
135
|
var bFunctionOnNavProp;
|
|
372
136
|
var oNewDocumentContext;
|
|
373
|
-
|
|
374
137
|
if (sFunctionName) {
|
|
375
138
|
if (oMetaModel.getObject("".concat(sMetaPath, "@com.sap.vocabularies.Common.v1.DefaultValuesFunction")) && ModelHelper.getTargetEntitySet(oMetaModel.getContext(sMetaPath)) !== sMetaPath) {
|
|
376
139
|
bFunctionOnNavProp = true;
|
|
@@ -378,27 +141,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
378
141
|
bFunctionOnNavProp = false;
|
|
379
142
|
}
|
|
380
143
|
}
|
|
381
|
-
|
|
382
144
|
if (sMessagesPath) {
|
|
383
145
|
mBindingParameters["$select"] = sMessagesPath;
|
|
384
146
|
}
|
|
385
|
-
|
|
386
147
|
var mParameters = getParameters(mInParameters);
|
|
387
|
-
|
|
388
148
|
if (!oMainListBinding) {
|
|
389
149
|
throw new Error("Binding required for new document creation");
|
|
390
150
|
}
|
|
391
|
-
|
|
392
151
|
var sProgrammingModel = _this2.getProgrammingModel(oMainListBinding);
|
|
393
|
-
|
|
394
152
|
if (sProgrammingModel !== ProgrammingModel.Draft && sProgrammingModel !== ProgrammingModel.Sticky) {
|
|
395
153
|
throw new Error("Create document only allowed for draft or sticky session supported services");
|
|
396
154
|
}
|
|
397
|
-
|
|
398
155
|
if (mParameters.busyMode === "Local") {
|
|
399
156
|
sBusyPath = "/busyLocal/".concat(mParameters.busyId);
|
|
400
157
|
}
|
|
401
|
-
|
|
402
158
|
mParameters.beforeCreateCallBack = bFromCopyPaste ? null : mParameters.beforeCreateCallBack;
|
|
403
159
|
BusyLocker.lock(_this2.oLockObject, sBusyPath);
|
|
404
160
|
var oResourceBundleCore = Core.getLibraryResourceBundle("sap.fe.core");
|
|
@@ -407,28 +163,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
407
163
|
return _catch(function () {
|
|
408
164
|
function _temp8(_result) {
|
|
409
165
|
if (_exit2) return _result;
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
oNewDocumentContext = oNewDocumentContext || oResult; // TODO: where does this one coming from???
|
|
417
|
-
|
|
418
|
-
if (bConsiderDocumentModified) {
|
|
419
|
-
_this2.handleDocumentModifications();
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
return Promise.resolve(messageHandler.showMessageDialog()).then(function () {
|
|
166
|
+
oNewDocumentContext = oNewDocumentContext || oResult;
|
|
167
|
+
return Promise.resolve(messageHandler.showMessageDialog({
|
|
168
|
+
control: mParameters.parentControl
|
|
169
|
+
})).then(function () {
|
|
423
170
|
return oNewDocumentContext;
|
|
424
171
|
});
|
|
425
172
|
}
|
|
426
|
-
|
|
427
|
-
var bConsiderDocumentModified = false;
|
|
428
|
-
|
|
429
173
|
var _temp7 = function () {
|
|
430
174
|
if (sNewAction) {
|
|
431
|
-
bConsiderDocumentModified = true;
|
|
432
175
|
return Promise.resolve(_this2.callAction(sNewAction, {
|
|
433
176
|
contexts: oMainListBinding.getHeaderContext(),
|
|
434
177
|
showActionParameterDialog: true,
|
|
@@ -445,7 +188,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
445
188
|
var aNonComputedVisibleKeyFields = bIsNewPageCreation ? CommonUtils.getNonComputedVisibleFields(oMetaModel, sMetaPath, oView) : [];
|
|
446
189
|
sFunctionName = bFromCopyPaste ? null : sFunctionName;
|
|
447
190
|
var sFunctionPath, oFunctionContext;
|
|
448
|
-
|
|
449
191
|
if (sFunctionName) {
|
|
450
192
|
//bound to the source entity:
|
|
451
193
|
if (bFunctionOnNavProp) {
|
|
@@ -456,17 +198,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
456
198
|
oFunctionContext = oMainListBinding.getHeaderContext();
|
|
457
199
|
}
|
|
458
200
|
}
|
|
459
|
-
|
|
460
201
|
var oFunction = sFunctionPath && oMetaModel.createBindingContext(sFunctionPath);
|
|
461
202
|
return _catch(function () {
|
|
462
203
|
function _temp6(_result2) {
|
|
463
204
|
if (_exit2) return _result2;
|
|
464
205
|
mParameters.data = oData ? Object.assign({}, oData, mParameters.data) : mParameters.data;
|
|
465
|
-
|
|
466
206
|
if (mParameters.data) {
|
|
467
207
|
delete mParameters.data["@odata.context"];
|
|
468
208
|
}
|
|
469
|
-
|
|
470
209
|
var _temp4 = function () {
|
|
471
210
|
if (aNonComputedVisibleKeyFields.length > 0) {
|
|
472
211
|
return Promise.resolve(_this2._launchDialogWithKeyFields(oMainListBinding, aNonComputedVisibleKeyFields, oModel, mParameters, messageHandler)).then(function (_this$_launchDialogWi) {
|
|
@@ -476,7 +215,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
476
215
|
} else {
|
|
477
216
|
function _temp9() {
|
|
478
217
|
oNewDocumentContext = oMainListBinding.create(mParameters.data, true, mParameters.createAtEnd, mParameters.inactive);
|
|
479
|
-
|
|
480
218
|
var _temp = function () {
|
|
481
219
|
if (!mParameters.inactive) {
|
|
482
220
|
return Promise.resolve(_this2.onAfterCreateCompletion(oMainListBinding, oNewDocumentContext, mParameters)).then(function (_this$onAfterCreateCo) {
|
|
@@ -484,10 +222,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
484
222
|
});
|
|
485
223
|
}
|
|
486
224
|
}();
|
|
487
|
-
|
|
488
225
|
if (_temp && _temp.then) return _temp.then(function () {});
|
|
489
226
|
}
|
|
490
|
-
|
|
491
227
|
var _temp10 = function () {
|
|
492
228
|
if (mParameters.beforeCreateCallBack) {
|
|
493
229
|
return Promise.resolve(toES6Promise(mParameters.beforeCreateCallBack({
|
|
@@ -495,16 +231,12 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
495
231
|
}))).then(function () {});
|
|
496
232
|
}
|
|
497
233
|
}();
|
|
498
|
-
|
|
499
234
|
return _temp10 && _temp10.then ? _temp10.then(_temp9) : _temp9(_temp10);
|
|
500
235
|
}
|
|
501
236
|
}();
|
|
502
|
-
|
|
503
237
|
if (_temp4 && _temp4.then) return _temp4.then(function () {});
|
|
504
238
|
}
|
|
505
|
-
|
|
506
239
|
var oData;
|
|
507
|
-
|
|
508
240
|
var _temp5 = _catch(function () {
|
|
509
241
|
return Promise.resolve(oFunction && oFunction.getObject() && oFunction.getObject()[0].$IsBound ? operations.callBoundFunction(sFunctionName, oFunctionContext, oModel) : operations.callFunctionImport(sFunctionName, oModel)).then(function (oContext) {
|
|
510
242
|
if (oContext) {
|
|
@@ -515,7 +247,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
515
247
|
Log.error("Error while executing the function ".concat(sFunctionName), oError);
|
|
516
248
|
throw oError;
|
|
517
249
|
});
|
|
518
|
-
|
|
519
250
|
return _temp5 && _temp5.then ? _temp5.then(_temp6) : _temp6(_temp5);
|
|
520
251
|
}, function (oError) {
|
|
521
252
|
Log.error("Error while creating the new document", oError);
|
|
@@ -523,20 +254,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
523
254
|
});
|
|
524
255
|
}
|
|
525
256
|
}();
|
|
526
|
-
|
|
527
257
|
return _temp7 && _temp7.then ? _temp7.then(_temp8) : _temp8(_temp7);
|
|
528
258
|
}, function (error) {
|
|
529
259
|
// TODO: currently, the only errors handled here are raised as string - should be changed to Error objects
|
|
530
|
-
return Promise.resolve(messageHandler.showMessageDialog(
|
|
260
|
+
return Promise.resolve(messageHandler.showMessageDialog({
|
|
261
|
+
control: mParameters.parentControl
|
|
262
|
+
})).then(function () {
|
|
531
263
|
var _oNewDocumentContext;
|
|
532
|
-
|
|
533
264
|
if ((error === FELibrary.Constants.ActionExecutionFailed || error === FELibrary.Constants.CancelActionDialog) && (_oNewDocumentContext = oNewDocumentContext) !== null && _oNewDocumentContext !== void 0 && _oNewDocumentContext.isTransient()) {
|
|
534
265
|
// This is a workaround suggested by model as Context.delete results in an error
|
|
535
266
|
// TODO: remove the $direct once model resolves this issue
|
|
536
267
|
// this line shows the expected console error Uncaught (in promise) Error: Request canceled: POST Travel; group: submitLater
|
|
537
268
|
oNewDocumentContext.delete("$direct");
|
|
538
269
|
}
|
|
539
|
-
|
|
540
270
|
throw error;
|
|
541
271
|
});
|
|
542
272
|
});
|
|
@@ -559,26 +289,21 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
559
289
|
* @returns Array of the active contexts
|
|
560
290
|
*/
|
|
561
291
|
;
|
|
562
|
-
|
|
563
292
|
_proto.findActiveDraftRootContexts = function findActiveDraftRootContexts(aContexts, bFindActiveContexts) {
|
|
564
293
|
if (!bFindActiveContexts) {
|
|
565
294
|
return Promise.resolve();
|
|
566
295
|
}
|
|
567
|
-
|
|
568
296
|
var activeContexts = aContexts.reduce(function (aResult, oContext) {
|
|
569
297
|
var oMetaModel = oContext.getModel().getMetaModel();
|
|
570
298
|
var sMetaPath = oMetaModel.getMetaPath(oContext.getPath());
|
|
571
|
-
|
|
572
299
|
if (oMetaModel.getObject("".concat(sMetaPath, "@com.sap.vocabularies.Common.v1.DraftRoot"))) {
|
|
573
300
|
var bIsActiveEntity = oContext.getObject().IsActiveEntity,
|
|
574
|
-
|
|
575
|
-
|
|
301
|
+
bHasActiveEntity = oContext.getObject().HasActiveEntity;
|
|
576
302
|
if (!bIsActiveEntity && bHasActiveEntity) {
|
|
577
303
|
var oActiveContext = oContext.getModel().bindContext("".concat(oContext.getPath(), "/SiblingEntity")).getBoundContext();
|
|
578
304
|
aResult.push(oActiveContext);
|
|
579
305
|
}
|
|
580
306
|
}
|
|
581
|
-
|
|
582
307
|
return aResult;
|
|
583
308
|
}, []);
|
|
584
309
|
return Promise.all(activeContexts.map(function (oContext) {
|
|
@@ -587,34 +312,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
587
312
|
});
|
|
588
313
|
}));
|
|
589
314
|
};
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
var
|
|
593
|
-
|
|
594
|
-
if (oInternalModelContext && oInternalModelContext.getProperty("deleteEnabled") != undefined) {
|
|
595
|
-
if (checkBox.isCheckBoxVisible === true && checkBox.isCheckBoxSelected === false) {
|
|
596
|
-
//if unsaved objects are not deleted then we need to set the enabled to true and update the model data for next deletion
|
|
597
|
-
oInternalModelContext.setProperty("deleteEnabled", true);
|
|
598
|
-
var obj = Object.assign(oInternalModelContext.getObject(), {});
|
|
599
|
-
obj.selectedContexts = obj.selectedContexts.filter(function (element) {
|
|
600
|
-
return obj.deletableContexts.indexOf(element) === -1;
|
|
601
|
-
});
|
|
602
|
-
obj.deletableContexts = [];
|
|
603
|
-
obj.selectedContexts = [];
|
|
604
|
-
obj.numberOfSelectedContexts = obj.selectedContexts.length;
|
|
605
|
-
oInternalModelContext.setProperty("", obj);
|
|
606
|
-
} else {
|
|
607
|
-
oInternalModelContext.setProperty("deleteEnabled", false);
|
|
608
|
-
oInternalModelContext.setProperty("selectedContexts", []);
|
|
609
|
-
oInternalModelContext.setProperty("numberOfSelectedContexts", 0);
|
|
610
|
-
}
|
|
611
|
-
}
|
|
612
|
-
|
|
613
|
-
if (aContexts.length === 1) {
|
|
614
|
-
MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DELETE_TOAST_SINGULAR", oResourceBundle, null, mParameters.entitySetName));
|
|
615
|
-
} else {
|
|
616
|
-
MessageToast.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DELETE_TOAST_PLURAL", oResourceBundle, null, mParameters.entitySetName));
|
|
617
|
-
}
|
|
315
|
+
_proto._isDraftEnabled = function _isDraftEnabled(vContexts, mParameters) {
|
|
316
|
+
var contextForDraftModel = vContexts[0] || mParameters.unSavedContexts && mParameters.unSavedContexts[0] || mParameters.draftsWithDeletableActive && mParameters.draftsWithDeletableActive[0] || mParameters.draftsWithNonDeletableActive && mParameters.draftsWithNonDeletableActive[0] || mParameters.createModeContexts && mParameters.createModeContexts[0];
|
|
317
|
+
var sProgrammingModel = this.getProgrammingModel(contextForDraftModel);
|
|
318
|
+
return sProgrammingModel === ProgrammingModel.Draft;
|
|
618
319
|
}
|
|
619
320
|
/**
|
|
620
321
|
* Delete one or multiple document(s).
|
|
@@ -630,52 +331,37 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
630
331
|
* @param oResourceBundle
|
|
631
332
|
* @param messageHandler
|
|
632
333
|
* @returns A Promise resolved once the document are deleted
|
|
633
|
-
|
|
634
|
-
;
|
|
635
|
-
|
|
334
|
+
*/;
|
|
636
335
|
_proto.deleteDocument = function deleteDocument(vInContexts, mParameters, oResourceBundle, messageHandler) {
|
|
637
|
-
var
|
|
638
|
-
|
|
639
|
-
var aDeletableContexts = [],
|
|
640
|
-
isCheckBoxVisible = false,
|
|
641
|
-
isLockedTextVisible = false,
|
|
642
|
-
cannotBeDeletedTextVisible = false,
|
|
643
|
-
isCheckBoxSelected,
|
|
644
|
-
bDialogConfirmed = false; // eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
645
|
-
|
|
336
|
+
var bDialogConfirmed = false;
|
|
337
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
646
338
|
var that = this,
|
|
647
|
-
|
|
339
|
+
oResourceBundleCore = Core.getLibraryResourceBundle("sap.fe.core");
|
|
648
340
|
var aParams;
|
|
649
|
-
var oDeleteMessage = {
|
|
650
|
-
title: oResourceBundleCore.getText("C_COMMON_DELETE")
|
|
651
|
-
};
|
|
652
341
|
BusyLocker.lock(this.oLockObject);
|
|
653
342
|
var vContexts;
|
|
654
|
-
|
|
655
343
|
if (Array.isArray(vInContexts)) {
|
|
656
344
|
vContexts = vInContexts;
|
|
657
345
|
} else {
|
|
658
346
|
vContexts = [vInContexts];
|
|
659
347
|
}
|
|
660
|
-
|
|
661
348
|
return new Promise(function (resolve, reject) {
|
|
662
349
|
try {
|
|
663
|
-
var
|
|
664
|
-
|
|
350
|
+
var draftEnabled = that._isDraftEnabled(vContexts, mParameters);
|
|
351
|
+
var items = [];
|
|
352
|
+
var options = [];
|
|
665
353
|
if (mParameters) {
|
|
666
354
|
if (!mParameters.numberOfSelectedContexts) {
|
|
667
|
-
|
|
355
|
+
// non-Table
|
|
356
|
+
if (draftEnabled) {
|
|
668
357
|
for (var i = 0; i < vContexts.length; i++) {
|
|
669
358
|
var oContextData = vContexts[i].getObject();
|
|
670
|
-
|
|
671
359
|
if (oContextData.IsActiveEntity === true && oContextData.HasDraftEntity === true && oContextData.DraftAdministrativeData && oContextData.DraftAdministrativeData.InProcessByUser && !oContextData.DraftAdministrativeData.DraftIsCreatedByMe) {
|
|
672
360
|
var sLockedUser = "";
|
|
673
361
|
var draftAdminData = oContextData && oContextData.DraftAdministrativeData;
|
|
674
|
-
|
|
675
362
|
if (draftAdminData) {
|
|
676
363
|
sLockedUser = draftAdminData["InProcessByUser"];
|
|
677
364
|
}
|
|
678
|
-
|
|
679
365
|
aParams = [sLockedUser];
|
|
680
366
|
MessageBox.show(CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_SINGLE_OBJECT_LOCKED", oResourceBundle, aParams), {
|
|
681
367
|
title: oResourceBundleCore.getText("C_COMMON_DELETE"),
|
|
@@ -685,246 +371,74 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
685
371
|
}
|
|
686
372
|
}
|
|
687
373
|
}
|
|
688
|
-
|
|
689
374
|
mParameters = getParameters(mParameters);
|
|
690
|
-
|
|
375
|
+
var nonTableTxt = "";
|
|
691
376
|
if (mParameters.title) {
|
|
692
377
|
if (mParameters.description) {
|
|
693
378
|
aParams = [mParameters.title + " ", mParameters.description];
|
|
694
379
|
} else {
|
|
695
380
|
aParams = [mParameters.title, ""];
|
|
696
381
|
}
|
|
697
|
-
|
|
698
|
-
oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO", oResourceBundle, aParams, mParameters.entitySetName);
|
|
382
|
+
nonTableTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO", oResourceBundle, aParams, mParameters.entitySetName);
|
|
699
383
|
} else {
|
|
700
|
-
|
|
384
|
+
nonTableTxt = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, undefined, mParameters.entitySetName);
|
|
701
385
|
}
|
|
702
|
-
|
|
703
|
-
|
|
386
|
+
options.push({
|
|
387
|
+
type: "deletableContexts",
|
|
388
|
+
contexts: vContexts,
|
|
389
|
+
text: nonTableTxt,
|
|
390
|
+
selected: true,
|
|
391
|
+
control: "text"
|
|
392
|
+
});
|
|
704
393
|
} else {
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
aDeletableContexts = vContexts;
|
|
711
|
-
var oLineContextData = vContexts[0].getObject();
|
|
712
|
-
var oTable = mParameters.parentControl;
|
|
713
|
-
var sKey = oTable && oTable.getParent().getIdentifierColumn();
|
|
714
|
-
|
|
715
|
-
if (sKey) {
|
|
716
|
-
var sKeyValue = sKey ? oLineContextData[sKey] : undefined;
|
|
717
|
-
var sDescription = mParameters.description && mParameters.description.path ? oLineContextData[mParameters.description.path] : undefined;
|
|
718
|
-
|
|
719
|
-
if (sKeyValue) {
|
|
720
|
-
if (sDescription && mParameters.description && sKey !== mParameters.description.path) {
|
|
721
|
-
aParams = [sKeyValue + " ", sDescription];
|
|
722
|
-
} else {
|
|
723
|
-
aParams = [sKeyValue, ""];
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO", oResourceBundle, aParams, mParameters.entitySetName);
|
|
727
|
-
} else if (sKeyValue) {
|
|
728
|
-
aParams = [sKeyValue, ""];
|
|
729
|
-
oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO", oResourceBundle, aParams, mParameters.entitySetName);
|
|
730
|
-
} else {
|
|
731
|
-
oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, null, mParameters.entitySetName);
|
|
732
|
-
}
|
|
733
|
-
} else {
|
|
734
|
-
oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, null, mParameters.entitySetName);
|
|
735
|
-
}
|
|
736
|
-
} else if (mParameters.numberOfSelectedContexts === 1 && mParameters.unSavedContexts.length === 1) {
|
|
737
|
-
//only one unsaved object
|
|
738
|
-
aDeletableContexts = mParameters.unSavedContexts;
|
|
739
|
-
var _draftAdminData = aDeletableContexts[0].getObject()["DraftAdministrativeData"];
|
|
740
|
-
var sLastChangedByUser = "";
|
|
741
|
-
|
|
742
|
-
if (_draftAdminData) {
|
|
743
|
-
sLastChangedByUser = _draftAdminData["LastChangedByUserDescription"] || _draftAdminData["LastChangedByUser"] || "";
|
|
744
|
-
}
|
|
745
|
-
|
|
746
|
-
aParams = [sLastChangedByUser];
|
|
747
|
-
oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_CHANGES", oResourceBundle, aParams);
|
|
748
|
-
} else if (mParameters.numberOfSelectedContexts === mParameters.unSavedContexts.length) {
|
|
749
|
-
//only multiple unsaved objects
|
|
750
|
-
aDeletableContexts = mParameters.unSavedContexts;
|
|
751
|
-
oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_CHANGES_MULTIPLE_OBJECTS", oResourceBundle);
|
|
752
|
-
} else if (mParameters.numberOfSelectedContexts === vContexts.concat(mParameters.unSavedContexts.concat(mParameters.lockedContexts)).length) {
|
|
753
|
-
//only unsaved, locked ,deletable objects but not non-deletable objects
|
|
754
|
-
aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
|
|
755
|
-
oDeleteMessage.text = aDeletableContexts.length === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR", oResourceBundle, null, mParameters.entitySetName) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL", oResourceBundle, null, mParameters.entitySetName);
|
|
756
|
-
} else {
|
|
757
|
-
//if non-deletable objects exists along with any of unsaved ,deletable objects
|
|
758
|
-
aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
|
|
759
|
-
cannotBeDeletedTextVisible = true;
|
|
760
|
-
oDeleteMessage.text = aDeletableContexts.length === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_SINGULAR_NON_DELETABLE", oResourceBundle, null, mParameters.entitySetName) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTTITLE_PLURAL_NON_DELETABLE", oResourceBundle, [aDeletableContexts.length], mParameters.entitySetName);
|
|
761
|
-
oDeleteMessage.nonDeletableText = that._getNonDeletableText(mParameters, vContexts, oResourceBundle);
|
|
762
|
-
}
|
|
763
|
-
|
|
764
|
-
if (mParameters.lockedContexts.length == 1) {
|
|
765
|
-
//setting the locked text if locked objects exist
|
|
766
|
-
isLockedTextVisible = true;
|
|
767
|
-
oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED", oResourceBundle, [mParameters.numberOfSelectedContexts]);
|
|
768
|
-
}
|
|
769
|
-
|
|
770
|
-
if (mParameters.lockedContexts.length > 1) {
|
|
771
|
-
//setting the locked text if locked objects exist
|
|
772
|
-
isLockedTextVisible = true;
|
|
773
|
-
oDeleteMessage.nonDeletableText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED", oResourceBundle, [mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
|
|
774
|
-
}
|
|
775
|
-
|
|
776
|
-
if (mParameters.unSavedContexts.length > 0 && mParameters.unSavedContexts.length !== mParameters.numberOfSelectedContexts) {
|
|
777
|
-
if ((cannotBeDeletedTextVisible || isLockedTextVisible) && aDeletableContexts.length === mParameters.unSavedContexts.length) {
|
|
778
|
-
//if only unsaved and either or both of locked and non-deletable objects exist then we hide the check box
|
|
779
|
-
isCheckBoxVisible = false;
|
|
780
|
-
aDeletableContexts = mParameters.unSavedContexts;
|
|
781
|
-
|
|
782
|
-
if (mParameters.unSavedContexts.length === 1) {
|
|
783
|
-
oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_SINGULAR", oResourceBundle);
|
|
784
|
-
} else {
|
|
785
|
-
oDeleteMessage.text = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_UNSAVED_AND_FEW_OBJECTS_LOCKED_PLURAL", oResourceBundle);
|
|
786
|
-
}
|
|
787
|
-
} else {
|
|
788
|
-
if (mParameters.unSavedContexts.length === 1) {
|
|
789
|
-
oDeleteMessage.checkBoxText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_SINGULAR", oResourceBundle);
|
|
790
|
-
} else {
|
|
791
|
-
oDeleteMessage.checkBoxText = CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_UNSAVED_PLURAL", oResourceBundle);
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
isCheckBoxVisible = true;
|
|
795
|
-
}
|
|
796
|
-
}
|
|
797
|
-
|
|
798
|
-
if (cannotBeDeletedTextVisible && isLockedTextVisible) {
|
|
799
|
-
//if non-deletable objects exist along with deletable objects
|
|
800
|
-
var sNonDeletableContextText = that._getNonDeletableText(mParameters, vContexts, oResourceBundle); //if both locked and non-deletable objects exist along with deletable objects
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
if (mParameters.unSavedContexts.length > 1) {
|
|
804
|
-
oDeleteMessage.nonDeletableText = sNonDeletableContextText + " " + CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_LOCKED", oResourceBundle, [mParameters.lockedContexts.length, mParameters.numberOfSelectedContexts]);
|
|
805
|
-
}
|
|
806
|
-
|
|
807
|
-
if (mParameters.unSavedContexts.length == 1) {
|
|
808
|
-
oDeleteMessage.nonDeletableText = sNonDeletableContextText + " " + CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_LOCKED", oResourceBundle, [mParameters.numberOfSelectedContexts]);
|
|
809
|
-
}
|
|
394
|
+
// Table
|
|
395
|
+
var totalDeletable = vContexts.length;
|
|
396
|
+
if (draftEnabled) {
|
|
397
|
+
totalDeletable += mParameters.draftsWithNonDeletableActive.length + mParameters.draftsWithDeletableActive.length + mParameters.unSavedContexts.length + mParameters.createModeContexts.length;
|
|
398
|
+
deleteHelper.updateDraftOptionsForDeletableTexts(mParameters, vContexts, totalDeletable, oResourceBundle, items, options);
|
|
810
399
|
}
|
|
400
|
+
deleteHelper.updateOptionsForDeletableTexts(mParameters, vContexts, oResourceBundle, options);
|
|
811
401
|
}
|
|
812
402
|
}
|
|
813
403
|
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
visible: isLockedTextVisible || cannotBeDeletedTextVisible
|
|
819
|
-
}), oDeleteMessageTextControl = new Text({
|
|
820
|
-
text: oDeleteMessage.text
|
|
821
|
-
}), new CheckBox({
|
|
822
|
-
text: oDeleteMessage.checkBoxText,
|
|
823
|
-
selected: true,
|
|
824
|
-
select: function (oEvent) {
|
|
825
|
-
var selected = oEvent.getSource().getSelected();
|
|
826
|
-
|
|
827
|
-
if (selected) {
|
|
828
|
-
aDeletableContexts = vContexts.concat(mParameters.unSavedContexts);
|
|
829
|
-
isCheckBoxSelected = true;
|
|
830
|
-
} else {
|
|
831
|
-
aDeletableContexts = vContexts;
|
|
832
|
-
isCheckBoxSelected = false;
|
|
833
|
-
}
|
|
834
|
-
},
|
|
835
|
-
visible: isCheckBoxVisible
|
|
836
|
-
})]
|
|
404
|
+
// Content of Delete Dialog
|
|
405
|
+
deleteHelper.updateContentForDeleteDialog(options, items);
|
|
406
|
+
var vBox = new VBox({
|
|
407
|
+
items: items
|
|
837
408
|
});
|
|
838
409
|
var sTitle = oResourceBundleCore.getText("C_COMMON_DELETE");
|
|
839
|
-
|
|
840
410
|
var fnConfirm = function () {
|
|
841
411
|
try {
|
|
842
|
-
bDialogConfirmed = true;
|
|
843
412
|
BusyLocker.lock(that.oLockObject);
|
|
844
|
-
var
|
|
845
|
-
return Promise.resolve(_finallyRethrows(function () {
|
|
413
|
+
var _temp12 = _finallyRethrows(function () {
|
|
846
414
|
return _catch(function () {
|
|
847
|
-
function
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
function _temp13(_result5) {
|
|
852
|
-
if (_exit3) return _result5;
|
|
853
|
-
var checkBox = {
|
|
854
|
-
"isCheckBoxVisible": isCheckBoxVisible,
|
|
855
|
-
"isCheckBoxSelected": isCheckBoxSelected
|
|
856
|
-
};
|
|
857
|
-
|
|
858
|
-
var _temp11 = function () {
|
|
859
|
-
if (activeContexts && activeContexts.length) {
|
|
860
|
-
return Promise.resolve(Promise.all(activeContexts.map(function (oContext) {
|
|
861
|
-
return oContext.delete();
|
|
862
|
-
}))).then(function () {
|
|
863
|
-
that.afterDeleteProcess(mParameters, checkBox, aContexts, oResourceBundle);
|
|
864
|
-
return Promise.resolve(messageHandler.showMessageDialog()).then(function () {
|
|
865
|
-
resolve();
|
|
866
|
-
});
|
|
867
|
-
});
|
|
868
|
-
} else {
|
|
869
|
-
that.afterDeleteProcess(mParameters, checkBox, aContexts, oResourceBundle);
|
|
870
|
-
return Promise.resolve(messageHandler.showMessageDialog()).then(function () {
|
|
871
|
-
resolve();
|
|
872
|
-
});
|
|
873
|
-
}
|
|
874
|
-
}();
|
|
875
|
-
|
|
876
|
-
if (_temp11 && _temp11.then) return _temp11.then(function () {});
|
|
877
|
-
}
|
|
878
|
-
|
|
879
|
-
var _temp12 = _catch(function () {
|
|
880
|
-
return Promise.resolve(Promise.all(aContexts.map(function (oContext) {
|
|
881
|
-
//delete the draft
|
|
882
|
-
var bEnableStrictHandling = aContexts.length === 1 ? true : false;
|
|
883
|
-
return draft.deleteDraft(oContext, that._oAppComponent, bEnableStrictHandling);
|
|
884
|
-
}))).then(function () {});
|
|
885
|
-
}, function (oError) {
|
|
886
|
-
return Promise.resolve(messageHandler.showMessages()).then(function () {
|
|
887
|
-
// re-throw error to enforce rejecting the general promise
|
|
888
|
-
throw oError;
|
|
889
|
-
});
|
|
890
|
-
});
|
|
891
|
-
|
|
892
|
-
return _temp12 && _temp12.then ? _temp12.then(_temp13) : _temp13(_temp12);
|
|
893
|
-
});
|
|
894
|
-
}
|
|
895
|
-
|
|
896
|
-
var _temp14 = function () {
|
|
897
|
-
if (mParameters.beforeDeleteCallBack) {
|
|
898
|
-
return Promise.resolve(mParameters.beforeDeleteCallBack({
|
|
899
|
-
contexts: aContexts
|
|
900
|
-
})).then(function () {});
|
|
901
|
-
}
|
|
902
|
-
}();
|
|
903
|
-
|
|
904
|
-
return _temp14 && _temp14.then ? _temp14.then(_temp15) : _temp15(_temp14);
|
|
415
|
+
return Promise.resolve(deleteHelper.deleteConfirmHandler(options, mParameters, messageHandler, oResourceBundle, that._oAppComponent, draftEnabled)).then(function () {
|
|
416
|
+
resolve();
|
|
417
|
+
});
|
|
905
418
|
}, function () {
|
|
906
419
|
reject();
|
|
907
420
|
});
|
|
908
|
-
}, function (_wasThrown2,
|
|
421
|
+
}, function (_wasThrown2, _result5) {
|
|
909
422
|
BusyLocker.unlock(that.oLockObject);
|
|
910
|
-
if (_wasThrown2) throw
|
|
911
|
-
return
|
|
912
|
-
})
|
|
423
|
+
if (_wasThrown2) throw _result5;
|
|
424
|
+
return _result5;
|
|
425
|
+
});
|
|
426
|
+
return Promise.resolve(_temp12 && _temp12.then ? _temp12.then(function () {}) : void 0);
|
|
913
427
|
} catch (e) {
|
|
914
428
|
return Promise.reject(e);
|
|
915
429
|
}
|
|
916
430
|
};
|
|
917
|
-
|
|
918
431
|
var oDialog = new Dialog({
|
|
919
432
|
title: sTitle,
|
|
920
433
|
state: "Warning",
|
|
921
|
-
content: [
|
|
922
|
-
ariaLabelledBy:
|
|
434
|
+
content: [vBox],
|
|
435
|
+
ariaLabelledBy: items,
|
|
923
436
|
beginButton: new Button({
|
|
924
437
|
text: oResourceBundleCore.getText("C_COMMON_DELETE"),
|
|
925
438
|
type: "Emphasized",
|
|
926
439
|
press: function () {
|
|
927
440
|
messageHandling.removeBoundTransitionMessages();
|
|
441
|
+
bDialogConfirmed = true;
|
|
928
442
|
oDialog.close();
|
|
929
443
|
fnConfirm();
|
|
930
444
|
}
|
|
@@ -936,14 +450,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
936
450
|
}
|
|
937
451
|
}),
|
|
938
452
|
afterClose: function () {
|
|
939
|
-
oDialog.destroy();
|
|
940
|
-
|
|
453
|
+
oDialog.destroy();
|
|
454
|
+
// if dialog is closed unconfirmed (e.g. via "Cancel" or Escape button), ensure to reject promise
|
|
941
455
|
if (!bDialogConfirmed) {
|
|
942
456
|
reject();
|
|
943
457
|
}
|
|
944
458
|
}
|
|
945
459
|
});
|
|
946
|
-
|
|
947
460
|
if (mParameters.noDialog) {
|
|
948
461
|
fnConfirm();
|
|
949
462
|
} else {
|
|
@@ -966,37 +479,28 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
966
479
|
* @returns Promise resolves with the new draft context in case of draft programming model
|
|
967
480
|
* @ui5-restricted
|
|
968
481
|
* @final
|
|
969
|
-
|
|
970
|
-
;
|
|
971
|
-
|
|
482
|
+
*/;
|
|
972
483
|
_proto.editDocument = function editDocument(oContext, oView, messageHandler) {
|
|
973
484
|
try {
|
|
974
|
-
var
|
|
975
|
-
|
|
485
|
+
var _this4 = this;
|
|
976
486
|
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
977
|
-
var that =
|
|
978
|
-
|
|
979
|
-
var sProgrammingModel = _this5.getProgrammingModel(oContext);
|
|
980
|
-
|
|
487
|
+
var that = _this4;
|
|
488
|
+
var sProgrammingModel = _this4.getProgrammingModel(oContext);
|
|
981
489
|
if (!oContext) {
|
|
982
490
|
throw new Error("Binding context to active document is required");
|
|
983
491
|
}
|
|
984
|
-
|
|
985
492
|
if (sProgrammingModel !== ProgrammingModel.Draft && sProgrammingModel !== ProgrammingModel.Sticky) {
|
|
986
493
|
throw new Error("Edit is only allowed for draft or sticky session supported services");
|
|
987
494
|
}
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
BusyLocker.lock(that.oLockObject); // before triggering the edit action we'll have to remove all bound transition messages
|
|
991
|
-
|
|
495
|
+
BusyLocker.lock(that.oLockObject);
|
|
496
|
+
// before triggering the edit action we'll have to remove all bound transition messages
|
|
992
497
|
messageHandler.removeTransitionMessages();
|
|
993
498
|
return Promise.resolve(_finallyRethrows(function () {
|
|
994
499
|
return _catch(function () {
|
|
995
|
-
return Promise.resolve(sProgrammingModel === ProgrammingModel.Draft ? draft.createDraftFromActiveDocument(oContext,
|
|
500
|
+
return Promise.resolve(sProgrammingModel === ProgrammingModel.Draft ? draft.createDraftFromActiveDocument(oContext, _this4._getAppComponent(), {
|
|
996
501
|
bPreserveChanges: true,
|
|
997
502
|
oView: oView
|
|
998
|
-
}) : sticky.editDocumentInStickySession(oContext,
|
|
999
|
-
_this5._bCreateMode = false;
|
|
503
|
+
}) : sticky.editDocumentInStickySession(oContext, _this4._getAppComponent())).then(function (oNewContext) {
|
|
1000
504
|
return Promise.resolve(messageHandler.showMessageDialog()).then(function () {
|
|
1001
505
|
return oNewContext;
|
|
1002
506
|
});
|
|
@@ -1008,10 +512,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1008
512
|
throw err;
|
|
1009
513
|
});
|
|
1010
514
|
});
|
|
1011
|
-
}, function (_wasThrown3,
|
|
515
|
+
}, function (_wasThrown3, _result6) {
|
|
1012
516
|
BusyLocker.unlock(that.oLockObject);
|
|
1013
|
-
if (_wasThrown3) throw
|
|
1014
|
-
return
|
|
517
|
+
if (_wasThrown3) throw _result6;
|
|
518
|
+
return _result6;
|
|
1015
519
|
}));
|
|
1016
520
|
} catch (e) {
|
|
1017
521
|
return Promise.reject(e);
|
|
@@ -1028,158 +532,125 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1028
532
|
* @param mInParameters.skipDiscardPopover Optional, supresses the discard popover incase of draft applications while navigating out of OP
|
|
1029
533
|
* @param oResourceBundle
|
|
1030
534
|
* @param messageHandler
|
|
535
|
+
* @param isNewObject True if we're trying to cancel a newly created object
|
|
536
|
+
* @param isObjectModified True if the object has been modified by the user
|
|
1031
537
|
* @returns Promise resolves with ???
|
|
1032
538
|
* @ui5-restricted
|
|
1033
539
|
* @final
|
|
1034
540
|
*/
|
|
1035
541
|
;
|
|
1036
|
-
|
|
1037
|
-
_proto.cancelDocument = function cancelDocument(oContext, mInParameters, oResourceBundle, messageHandler) {
|
|
542
|
+
_proto.cancelDocument = function cancelDocument(oContext, mInParameters, oResourceBundle, messageHandler, isNewObject, isObjectModified) {
|
|
1038
543
|
try {
|
|
1039
|
-
var
|
|
1040
|
-
|
|
544
|
+
var _this6 = this;
|
|
1041
545
|
//context must always be passed - mandatory parameter
|
|
1042
546
|
if (!oContext) {
|
|
1043
547
|
throw new Error("No context exists. Pass a meaningful context");
|
|
1044
548
|
}
|
|
1045
|
-
|
|
1046
|
-
BusyLocker.lock(_this7.oLockObject);
|
|
549
|
+
BusyLocker.lock(_this6.oLockObject);
|
|
1047
550
|
var mParameters = getParameters(mInParameters);
|
|
1048
551
|
var oModel = oContext.getModel();
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
552
|
+
var sProgrammingModel = _this6.getProgrammingModel(oContext);
|
|
553
|
+
if (sProgrammingModel !== ProgrammingModel.Draft && sProgrammingModel !== ProgrammingModel.Sticky) {
|
|
554
|
+
throw new Error("Cancel document only allowed for draft or sticky session supported services");
|
|
555
|
+
}
|
|
1052
556
|
return Promise.resolve(_finallyRethrows(function () {
|
|
1053
557
|
return _catch(function () {
|
|
1054
|
-
function
|
|
1055
|
-
function
|
|
1056
|
-
function
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
if (_exit4) return _result8;
|
|
1062
|
-
_this7._bIsModified = false; // remove existing bound transition messages
|
|
1063
|
-
|
|
1064
|
-
messageHandler.removeTransitionMessages(); // show unbound messages
|
|
1065
|
-
|
|
558
|
+
function _temp22() {
|
|
559
|
+
function _temp20() {
|
|
560
|
+
function _temp18() {
|
|
561
|
+
function _temp16() {
|
|
562
|
+
// remove existing bound transition messages
|
|
563
|
+
messageHandler.removeTransitionMessages();
|
|
564
|
+
// show unbound messages
|
|
1066
565
|
return Promise.resolve(messageHandler.showMessages()).then(function () {
|
|
1067
566
|
return returnedValue;
|
|
1068
567
|
});
|
|
1069
568
|
}
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
function _temp18() {
|
|
1076
|
-
_interrupt = true;
|
|
1077
|
-
}
|
|
1078
|
-
|
|
1079
|
-
var _temp17 = function () {
|
|
1080
|
-
if (!bHasActiveEntity) {
|
|
1081
|
-
if (oContext && oContext.hasPendingChanges()) {
|
|
569
|
+
var _temp15 = function () {
|
|
570
|
+
if (sProgrammingModel === ProgrammingModel.Draft) {
|
|
571
|
+
var _temp23 = function () {
|
|
572
|
+
if (isNewObject) {
|
|
573
|
+
if (oContext.hasPendingChanges()) {
|
|
1082
574
|
oContext.getBinding().resetChanges();
|
|
1083
575
|
}
|
|
1084
|
-
|
|
1085
|
-
return Promise.resolve(draft.deleteDraft(oContext, _this7._oAppComponent)).then(function (_draft$deleteDraft) {
|
|
576
|
+
return Promise.resolve(draft.deleteDraft(oContext, _this6._oAppComponent)).then(function (_draft$deleteDraft) {
|
|
1086
577
|
returnedValue = _draft$deleteDraft;
|
|
1087
578
|
});
|
|
1088
579
|
} else {
|
|
1089
580
|
var oSiblingContext = oModel.bindContext("".concat(oContext.getPath(), "/SiblingEntity")).getBoundContext();
|
|
1090
|
-
|
|
1091
|
-
var _temp27 = _finallyRethrows(function () {
|
|
581
|
+
var _temp24 = _finallyRethrows(function () {
|
|
1092
582
|
return Promise.resolve(oSiblingContext.requestCanonicalPath()).then(function (sCanonicalPath) {
|
|
1093
|
-
if (oContext
|
|
583
|
+
if (oContext.hasPendingChanges()) {
|
|
1094
584
|
oContext.getBinding().resetChanges();
|
|
1095
585
|
}
|
|
1096
|
-
|
|
1097
586
|
returnedValue = oModel.bindContext(sCanonicalPath).getBoundContext();
|
|
1098
587
|
});
|
|
1099
|
-
}, function (_wasThrown4,
|
|
1100
|
-
return Promise.resolve(draft.deleteDraft(oContext,
|
|
1101
|
-
if (_wasThrown4) throw
|
|
1102
|
-
return
|
|
588
|
+
}, function (_wasThrown4, _result7) {
|
|
589
|
+
return Promise.resolve(draft.deleteDraft(oContext, _this6._oAppComponent)).then(function () {
|
|
590
|
+
if (_wasThrown4) throw _result7;
|
|
591
|
+
return _result7;
|
|
1103
592
|
});
|
|
1104
593
|
});
|
|
1105
|
-
|
|
1106
|
-
if (_temp27 && _temp27.then) return _temp27.then(function () {});
|
|
594
|
+
if (_temp24 && _temp24.then) return _temp24.then(function () {});
|
|
1107
595
|
}
|
|
1108
596
|
}();
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
if (!_this7._bCreateMode) {
|
|
1122
|
-
discardedContext.refresh();
|
|
1123
|
-
returnedValue = discardedContext;
|
|
597
|
+
if (_temp23 && _temp23.then) return _temp23.then(function () {});
|
|
598
|
+
} else {
|
|
599
|
+
return Promise.resolve(sticky.discardDocument(oContext)).then(function (discardedContext) {
|
|
600
|
+
if (discardedContext) {
|
|
601
|
+
if (discardedContext.hasPendingChanges()) {
|
|
602
|
+
discardedContext.getBinding().resetChanges();
|
|
603
|
+
}
|
|
604
|
+
if (!isNewObject) {
|
|
605
|
+
discardedContext.refresh();
|
|
606
|
+
returnedValue = discardedContext;
|
|
607
|
+
}
|
|
1124
608
|
}
|
|
1125
|
-
}
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
}], [void 0, function () {
|
|
1130
|
-
throw new Error("Cancel document only allowed for draft or sticky session supported services");
|
|
1131
|
-
}]]);
|
|
1132
|
-
|
|
1133
|
-
return _temp19 && _temp19.then ? _temp19.then(_temp20) : _temp20(_temp19);
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
}();
|
|
612
|
+
return _temp15 && _temp15.then ? _temp15.then(_temp16) : _temp16(_temp15);
|
|
1134
613
|
}
|
|
1135
|
-
|
|
1136
614
|
if (oContext.isKeepAlive()) {
|
|
1137
615
|
oContext.setKeepAlive(false);
|
|
1138
616
|
}
|
|
1139
|
-
|
|
1140
|
-
var _temp21 = function () {
|
|
617
|
+
var _temp17 = function () {
|
|
1141
618
|
if (mParameters.beforeCancelCallBack) {
|
|
1142
619
|
return Promise.resolve(mParameters.beforeCancelCallBack({
|
|
1143
620
|
context: oContext
|
|
1144
621
|
})).then(function () {});
|
|
1145
622
|
}
|
|
1146
623
|
}();
|
|
1147
|
-
|
|
1148
|
-
return _temp21 && _temp21.then ? _temp21.then(_temp22) : _temp22(_temp21);
|
|
624
|
+
return _temp17 && _temp17.then ? _temp17.then(_temp18) : _temp18(_temp17);
|
|
1149
625
|
}
|
|
1150
|
-
|
|
1151
|
-
var _temp23 = function () {
|
|
626
|
+
var _temp19 = function () {
|
|
1152
627
|
if (!mParameters.skipDiscardPopover) {
|
|
1153
|
-
return Promise.resolve(
|
|
628
|
+
return Promise.resolve(_this6._showDiscardPopover(mParameters.cancelButton, isObjectModified, oResourceBundle)).then(function () {});
|
|
1154
629
|
}
|
|
1155
630
|
}();
|
|
1156
|
-
|
|
1157
|
-
return _temp23 && _temp23.then ? _temp23.then(_temp24) : _temp24(_temp23);
|
|
631
|
+
return _temp19 && _temp19.then ? _temp19.then(_temp20) : _temp20(_temp19);
|
|
1158
632
|
}
|
|
1159
|
-
|
|
1160
633
|
var returnedValue = false;
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
if (sProgrammingModel === ProgrammingModel.Draft && !_this7._bIsModified) {
|
|
634
|
+
var _temp21 = function () {
|
|
635
|
+
if (sProgrammingModel === ProgrammingModel.Draft && !isObjectModified) {
|
|
1164
636
|
var draftDataContext = oModel.bindContext("".concat(oContext.getPath(), "/DraftAdministrativeData")).getBoundContext();
|
|
1165
637
|
return Promise.resolve(draftDataContext.requestObject()).then(function (draftAdminData) {
|
|
1166
638
|
if (draftAdminData) {
|
|
1167
|
-
|
|
639
|
+
isObjectModified = draftAdminData.CreationDateTime !== draftAdminData.LastChangeDateTime;
|
|
1168
640
|
}
|
|
1169
641
|
});
|
|
1170
642
|
}
|
|
1171
643
|
}();
|
|
1172
|
-
|
|
1173
|
-
return _temp25 && _temp25.then ? _temp25.then(_temp26) : _temp26(_temp25);
|
|
644
|
+
return _temp21 && _temp21.then ? _temp21.then(_temp22) : _temp22(_temp21);
|
|
1174
645
|
}, function (err) {
|
|
1175
646
|
return Promise.resolve(messageHandler.showMessages()).then(function () {
|
|
1176
647
|
throw err;
|
|
1177
648
|
});
|
|
1178
649
|
});
|
|
1179
|
-
}, function (_wasThrown5,
|
|
1180
|
-
BusyLocker.unlock(
|
|
1181
|
-
if (_wasThrown5) throw
|
|
1182
|
-
return
|
|
650
|
+
}, function (_wasThrown5, _result8) {
|
|
651
|
+
BusyLocker.unlock(_this6.oLockObject);
|
|
652
|
+
if (_wasThrown5) throw _result8;
|
|
653
|
+
return _result8;
|
|
1183
654
|
}));
|
|
1184
655
|
} catch (e) {
|
|
1185
656
|
return Promise.reject(e);
|
|
@@ -1195,42 +666,34 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1195
666
|
* @param bExecuteSideEffectsOnError
|
|
1196
667
|
* @param aBindings
|
|
1197
668
|
* @param messageHandler
|
|
669
|
+
* @param isNewObject True if we're trying to cancel a newly created object
|
|
1198
670
|
* @returns Promise resolves with ???
|
|
1199
671
|
* @ui5-restricted
|
|
1200
672
|
* @final
|
|
1201
673
|
*/
|
|
1202
674
|
;
|
|
1203
|
-
|
|
1204
|
-
_proto.saveDocument = function saveDocument(oContext, oResourceBundle, bExecuteSideEffectsOnError, aBindings, messageHandler) {
|
|
675
|
+
_proto.saveDocument = function saveDocument(oContext, oResourceBundle, bExecuteSideEffectsOnError, aBindings, messageHandler, isNewObject) {
|
|
1205
676
|
try {
|
|
1206
|
-
var
|
|
1207
|
-
|
|
677
|
+
var _this8 = this;
|
|
1208
678
|
if (!oContext) {
|
|
1209
679
|
return Promise.reject(new Error("Binding context to draft document is required"));
|
|
1210
680
|
}
|
|
1211
|
-
|
|
1212
|
-
var sProgrammingModel = _this9.getProgrammingModel(oContext);
|
|
1213
|
-
|
|
681
|
+
var sProgrammingModel = _this8.getProgrammingModel(oContext);
|
|
1214
682
|
if (sProgrammingModel !== ProgrammingModel.Sticky && sProgrammingModel !== ProgrammingModel.Draft) {
|
|
1215
683
|
throw new Error("Save is only allowed for draft or sticky session supported services");
|
|
1216
|
-
}
|
|
684
|
+
}
|
|
685
|
+
// in case of saving / activating the bound transition messages shall be removed before the PATCH/POST
|
|
1217
686
|
// is sent to the backend
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
687
|
messageHandler.removeTransitionMessages();
|
|
1221
688
|
return Promise.resolve(_finallyRethrows(function () {
|
|
1222
689
|
return _catch(function () {
|
|
1223
|
-
BusyLocker.lock(
|
|
1224
|
-
return Promise.resolve(sProgrammingModel === ProgrammingModel.Draft ? draft.activateDocument(oContext,
|
|
1225
|
-
var bNewObject = sProgrammingModel === ProgrammingModel.Sticky ? _this9._bCreateMode : !oContext.getObject().HasActiveEntity;
|
|
690
|
+
BusyLocker.lock(_this8.oLockObject);
|
|
691
|
+
return Promise.resolve(sProgrammingModel === ProgrammingModel.Draft ? draft.activateDocument(oContext, _this8._getAppComponent(), {}, messageHandler) : sticky.activateDocument(oContext, _this8._getAppComponent())).then(function (oActiveDocument) {
|
|
1226
692
|
var messagesReceived = messageHandling.getMessages().concat(messageHandling.getMessages(true, true)); // get unbound and bound messages present in the model
|
|
1227
|
-
|
|
1228
693
|
if (!(messagesReceived.length === 1 && messagesReceived[0].type === coreLibrary.MessageType.Success)) {
|
|
1229
694
|
// show our object creation toast only if it is not coming from backend
|
|
1230
|
-
MessageToast.show(
|
|
695
|
+
MessageToast.show(isNewObject ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_CREATED", oResourceBundle) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_OBJECT_SAVED", oResourceBundle));
|
|
1231
696
|
}
|
|
1232
|
-
|
|
1233
|
-
_this9._bIsModified = false;
|
|
1234
697
|
return oActiveDocument;
|
|
1235
698
|
});
|
|
1236
699
|
}, function (err) {
|
|
@@ -1238,21 +701,19 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1238
701
|
/* The sideEffects are executed only for table items in transient state */
|
|
1239
702
|
aBindings.forEach(function (oListBinding) {
|
|
1240
703
|
if (!CommonUtils.hasTransientContext(oListBinding) && bExecuteSideEffectsOnError) {
|
|
1241
|
-
var oAppComponent =
|
|
1242
|
-
|
|
704
|
+
var oAppComponent = _this8._getAppComponent();
|
|
1243
705
|
oAppComponent.getSideEffectsService().requestSideEffectsForNavigationProperty(oListBinding.getPath(), oContext);
|
|
1244
706
|
}
|
|
1245
707
|
});
|
|
1246
708
|
}
|
|
1247
|
-
|
|
1248
709
|
return Promise.resolve(messageHandler.showMessages()).then(function () {
|
|
1249
710
|
throw err;
|
|
1250
711
|
});
|
|
1251
712
|
});
|
|
1252
|
-
}, function (_wasThrown6,
|
|
1253
|
-
BusyLocker.unlock(
|
|
1254
|
-
if (_wasThrown6) throw
|
|
1255
|
-
return
|
|
713
|
+
}, function (_wasThrown6, _result9) {
|
|
714
|
+
BusyLocker.unlock(_this8.oLockObject);
|
|
715
|
+
if (_wasThrown6) throw _result9;
|
|
716
|
+
return _result9;
|
|
1256
717
|
}));
|
|
1257
718
|
} catch (e) {
|
|
1258
719
|
return Promise.reject(e);
|
|
@@ -1281,64 +742,52 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1281
742
|
* @final
|
|
1282
743
|
*/
|
|
1283
744
|
;
|
|
1284
|
-
|
|
1285
745
|
_proto.callAction = function callAction(sActionName, mParameters, oView, messageHandler) {
|
|
1286
746
|
try {
|
|
1287
|
-
var
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
var that = _this11;
|
|
747
|
+
var _this10 = this;
|
|
748
|
+
mParameters = getParameters(mParameters);
|
|
749
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
750
|
+
var that = _this10;
|
|
1292
751
|
var oContext, oModel;
|
|
1293
752
|
var mBindingParameters = mParameters.bindingParameters;
|
|
1294
|
-
|
|
1295
753
|
if (!sActionName) {
|
|
1296
754
|
throw new Error("Provide name of action to be executed");
|
|
1297
|
-
}
|
|
755
|
+
}
|
|
756
|
+
// action imports are not directly obtained from the metaModel by it is present inside the entityContainer
|
|
1298
757
|
// and the acions it refers to present outside the entitycontainer, hence to obtain kind of the action
|
|
1299
758
|
// split() on its name was required
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
759
|
var sName = sActionName.split("/")[1];
|
|
1303
760
|
sActionName = sName || sActionName;
|
|
1304
|
-
oContext = sName ? undefined : mParameters.contexts;
|
|
1305
|
-
|
|
761
|
+
oContext = sName ? undefined : mParameters.contexts;
|
|
762
|
+
//checking whether the context is an array with more than 0 length or not an array(create action)
|
|
1306
763
|
if (oContext && (Array.isArray(oContext) && oContext.length || !Array.isArray(oContext))) {
|
|
1307
764
|
oContext = Array.isArray(oContext) ? oContext[0] : oContext;
|
|
1308
765
|
oModel = oContext.getModel();
|
|
1309
766
|
}
|
|
1310
|
-
|
|
1311
767
|
if (mParameters.model) {
|
|
1312
768
|
oModel = mParameters.model;
|
|
1313
769
|
}
|
|
1314
|
-
|
|
1315
770
|
if (!oModel) {
|
|
1316
771
|
throw new Error("Pass a context for a bound action or pass the model for an unbound action");
|
|
1317
|
-
}
|
|
772
|
+
}
|
|
773
|
+
// get the binding parameters $select and $expand for the side effect on this action
|
|
1318
774
|
// also gather additional property paths to be requested such as text associations
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
775
|
var oAppComponent = that._getAppComponent();
|
|
1322
|
-
|
|
1323
776
|
var mSideEffectsParameters = oAppComponent.getSideEffectsService().getODataActionSideEffects(sActionName, oContext) || {};
|
|
1324
|
-
|
|
1325
777
|
var displayUnapplicableContextsDialog = function () {
|
|
1326
778
|
if (!mParameters.notApplicableContext || mParameters.notApplicableContext.length === 0) {
|
|
1327
779
|
return Promise.resolve(mParameters.contexts);
|
|
1328
780
|
}
|
|
1329
|
-
|
|
1330
781
|
return new Promise(function (resolve, reject) {
|
|
1331
782
|
try {
|
|
1332
783
|
var fnOpenAndFillDialog = function (oDlg) {
|
|
1333
784
|
var oDialogContent;
|
|
1334
785
|
var nNotApplicable = mParameters.notApplicableContext.length,
|
|
1335
|
-
|
|
1336
|
-
|
|
786
|
+
aNotApplicableItems = [];
|
|
1337
787
|
for (var i = 0; i < mParameters.notApplicableContext.length; i++) {
|
|
1338
788
|
oDialogContent = mParameters.notApplicableContext[i].getObject();
|
|
1339
789
|
aNotApplicableItems.push(oDialogContent);
|
|
1340
790
|
}
|
|
1341
|
-
|
|
1342
791
|
var oNotApplicableItemsModel = new JSONModel(aNotApplicableItems);
|
|
1343
792
|
var oTotals = new JSONModel({
|
|
1344
793
|
total: nNotApplicable,
|
|
@@ -1347,9 +796,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1347
796
|
oDlg.setModel(oNotApplicableItemsModel, "notApplicable");
|
|
1348
797
|
oDlg.setModel(oTotals, "totals");
|
|
1349
798
|
oDlg.open();
|
|
1350
|
-
};
|
|
1351
|
-
|
|
1352
|
-
|
|
799
|
+
};
|
|
800
|
+
// Show the contexts that are not applicable and will not therefore be processed
|
|
1353
801
|
var sFragmentName = "sap.fe.core.controls.ActionPartial";
|
|
1354
802
|
var oDialogFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment");
|
|
1355
803
|
var oMetaModel = oModel.getMetaModel();
|
|
@@ -1358,8 +806,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1358
806
|
var oDialogLabelModel = new JSONModel({
|
|
1359
807
|
title: mParameters.label
|
|
1360
808
|
});
|
|
1361
|
-
|
|
1362
|
-
var _temp32 = _catch(function () {
|
|
809
|
+
var _temp29 = _catch(function () {
|
|
1363
810
|
return Promise.resolve(XMLPreprocessor.process(oDialogFragment, {
|
|
1364
811
|
name: sFragmentName
|
|
1365
812
|
}, {
|
|
@@ -1392,19 +839,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1392
839
|
controller: oController
|
|
1393
840
|
})).then(function (_Fragment$load) {
|
|
1394
841
|
oDialog = _Fragment$load;
|
|
1395
|
-
|
|
1396
842
|
oController.onClose = function () {
|
|
1397
843
|
// User cancels action
|
|
1398
844
|
oDialog.close();
|
|
1399
845
|
resolve();
|
|
1400
846
|
};
|
|
1401
|
-
|
|
1402
847
|
oController.onContinue = function () {
|
|
1403
848
|
// Users continues the action with the bound contexts
|
|
1404
849
|
oDialog.close();
|
|
1405
850
|
resolve(mParameters.applicableContext);
|
|
1406
851
|
};
|
|
1407
|
-
|
|
1408
852
|
mParameters.parentControl.addDependent(oDialog);
|
|
1409
853
|
fnOpenAndFillDialog(oDialog);
|
|
1410
854
|
});
|
|
@@ -1412,27 +856,23 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1412
856
|
}, function (oError) {
|
|
1413
857
|
reject(oError);
|
|
1414
858
|
});
|
|
1415
|
-
|
|
1416
|
-
return Promise.resolve(_temp32 && _temp32.then ? _temp32.then(function () {}) : void 0);
|
|
859
|
+
return Promise.resolve(_temp29 && _temp29.then ? _temp29.then(function () {}) : void 0);
|
|
1417
860
|
} catch (e) {
|
|
1418
861
|
return Promise.reject(e);
|
|
1419
862
|
}
|
|
1420
863
|
});
|
|
1421
864
|
};
|
|
1422
|
-
|
|
1423
865
|
return Promise.resolve(_catch(function () {
|
|
1424
|
-
function
|
|
1425
|
-
return Promise.resolve(
|
|
866
|
+
function _temp27() {
|
|
867
|
+
return Promise.resolve(_this10._handleActionResponse(messageHandler, mParameters, sActionName)).then(function () {
|
|
1426
868
|
return oResult;
|
|
1427
869
|
});
|
|
1428
870
|
}
|
|
1429
|
-
|
|
1430
871
|
var oResult;
|
|
1431
|
-
|
|
1432
|
-
var _temp29 = function () {
|
|
872
|
+
var _temp26 = function () {
|
|
1433
873
|
if (oContext && oModel) {
|
|
1434
874
|
return Promise.resolve(displayUnapplicableContextsDialog()).then(function (contextToProcess) {
|
|
1435
|
-
var
|
|
875
|
+
var _temp25 = function () {
|
|
1436
876
|
if (contextToProcess) {
|
|
1437
877
|
return Promise.resolve(operations.callBoundAction(sActionName, contextToProcess, oModel, oAppComponent, {
|
|
1438
878
|
parameterValues: mParameters.parameterValues,
|
|
@@ -1466,8 +906,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1466
906
|
oResult = null;
|
|
1467
907
|
}
|
|
1468
908
|
}();
|
|
1469
|
-
|
|
1470
|
-
if (_temp28 && _temp28.then) return _temp28.then(function () {});
|
|
909
|
+
if (_temp25 && _temp25.then) return _temp25.then(function () {});
|
|
1471
910
|
});
|
|
1472
911
|
} else {
|
|
1473
912
|
return Promise.resolve(operations.callActionImport(sActionName, oModel, oAppComponent, {
|
|
@@ -1492,10 +931,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1492
931
|
});
|
|
1493
932
|
}
|
|
1494
933
|
}();
|
|
1495
|
-
|
|
1496
|
-
return _temp29 && _temp29.then ? _temp29.then(_temp30) : _temp30(_temp29);
|
|
934
|
+
return _temp26 && _temp26.then ? _temp26.then(_temp27) : _temp27(_temp26);
|
|
1497
935
|
}, function (err) {
|
|
1498
|
-
return Promise.resolve(
|
|
936
|
+
return Promise.resolve(_this10._handleActionResponse(messageHandler, mParameters, sActionName)).then(function () {
|
|
1499
937
|
throw err;
|
|
1500
938
|
});
|
|
1501
939
|
}));
|
|
@@ -1517,15 +955,22 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1517
955
|
* @final
|
|
1518
956
|
*/
|
|
1519
957
|
;
|
|
1520
|
-
|
|
1521
958
|
_proto._handleActionResponse = function _handleActionResponse(messageHandler, mParameters, sActionName) {
|
|
1522
959
|
var aTransientMessages = messageHandling.getMessages(true, true);
|
|
1523
|
-
|
|
960
|
+
var actionName = mParameters.label ? mParameters.label : sActionName;
|
|
1524
961
|
if (aTransientMessages.length > 0 && mParameters && mParameters.internalModelContext) {
|
|
1525
962
|
mParameters.internalModelContext.setProperty("sActionName", mParameters.label ? mParameters.label : sActionName);
|
|
1526
963
|
}
|
|
1527
|
-
|
|
1528
|
-
|
|
964
|
+
var control;
|
|
965
|
+
if (mParameters.controlId) {
|
|
966
|
+
control = mParameters.parentControl.byId(mParameters.controlId);
|
|
967
|
+
} else {
|
|
968
|
+
control = mParameters.parentControl;
|
|
969
|
+
}
|
|
970
|
+
return messageHandler.showMessages({
|
|
971
|
+
sActionName: actionName,
|
|
972
|
+
control: control
|
|
973
|
+
});
|
|
1529
974
|
}
|
|
1530
975
|
/**
|
|
1531
976
|
* Handles validation errors for the 'Discard' action.
|
|
@@ -1536,17 +981,15 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1536
981
|
* @static
|
|
1537
982
|
* @ui5-restricted
|
|
1538
983
|
* @final
|
|
1539
|
-
|
|
1540
|
-
;
|
|
1541
|
-
|
|
984
|
+
*/;
|
|
1542
985
|
_proto.handleValidationError = function handleValidationError() {
|
|
1543
986
|
var oMessageManager = Core.getMessageManager(),
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
987
|
+
errorToRemove = oMessageManager.getMessageModel().getData().filter(function (error) {
|
|
988
|
+
// only needs to handle validation messages, technical and persistent errors needs not to be checked here.
|
|
989
|
+
if (error.validation) {
|
|
990
|
+
return error;
|
|
991
|
+
}
|
|
992
|
+
});
|
|
1550
993
|
oMessageManager.removeMessages(errorToRemove);
|
|
1551
994
|
}
|
|
1552
995
|
/**
|
|
@@ -1563,51 +1006,42 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1563
1006
|
* @returns Promise resolves if user confirms discard, rejects if otherwise, rejects if no control passed to open popover
|
|
1564
1007
|
* @ui5-restricted
|
|
1565
1008
|
* @final
|
|
1566
|
-
|
|
1567
|
-
;
|
|
1568
|
-
|
|
1009
|
+
*/;
|
|
1569
1010
|
_proto._showDiscardPopover = function _showDiscardPopover(oCancelButton, bIsModified, oResourceBundle) {
|
|
1570
1011
|
// TODO: Implement this popover as a fragment as in v2??
|
|
1571
1012
|
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
1572
1013
|
var that = this;
|
|
1573
|
-
that._bContinueDiscard = false; // to be implemented
|
|
1574
|
-
|
|
1575
1014
|
return new Promise(function (resolve, reject) {
|
|
1576
1015
|
if (!oCancelButton) {
|
|
1577
1016
|
reject("Cancel button not found");
|
|
1578
|
-
}
|
|
1579
|
-
|
|
1580
|
-
|
|
1017
|
+
}
|
|
1018
|
+
//Show popover only when data is changed.
|
|
1581
1019
|
if (bIsModified) {
|
|
1582
1020
|
var fnOnAfterDiscard = function () {
|
|
1583
1021
|
oCancelButton.setEnabled(true);
|
|
1584
|
-
|
|
1585
|
-
if (that._bContinueDiscard) {
|
|
1022
|
+
if (that._oPopover.data("continueDiscard")) {
|
|
1586
1023
|
resolve();
|
|
1587
1024
|
} else {
|
|
1588
1025
|
reject("Discard operation was rejected. Document has not been discarded");
|
|
1589
1026
|
}
|
|
1590
|
-
|
|
1591
1027
|
that._oPopover.detachAfterClose(fnOnAfterDiscard);
|
|
1592
1028
|
};
|
|
1593
|
-
|
|
1594
1029
|
if (!that._oPopover) {
|
|
1595
1030
|
var oText = new Text({
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
});
|
|
1031
|
+
//This text is the same as LR v2.
|
|
1032
|
+
//TODO: Display message provided by app developer???
|
|
1033
|
+
text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DRAFT_DISCARD_MESSAGE", oResourceBundle)
|
|
1034
|
+
}),
|
|
1035
|
+
oButton = new Button({
|
|
1036
|
+
text: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_DRAFT_DISCARD_BUTTON", oResourceBundle),
|
|
1037
|
+
width: "100%",
|
|
1038
|
+
press: function () {
|
|
1039
|
+
that.handleValidationError();
|
|
1040
|
+
that._oPopover.data("continueDiscard", true);
|
|
1041
|
+
that._oPopover.close();
|
|
1042
|
+
},
|
|
1043
|
+
ariaLabelledBy: oText
|
|
1044
|
+
});
|
|
1611
1045
|
that._oPopover = new Popover({
|
|
1612
1046
|
showHeader: false,
|
|
1613
1047
|
placement: "Top",
|
|
@@ -1617,16 +1051,13 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1617
1051
|
beforeOpen: function () {
|
|
1618
1052
|
// make sure to NOT trigger multiple cancel flows
|
|
1619
1053
|
oCancelButton.setEnabled(false);
|
|
1620
|
-
|
|
1621
1054
|
that._oPopover.setInitialFocus(oButton);
|
|
1055
|
+
that._oPopover.data("continueDiscard", false);
|
|
1622
1056
|
}
|
|
1623
1057
|
});
|
|
1624
|
-
|
|
1625
1058
|
that._oPopover.addStyleClass("sapUiContentPadding");
|
|
1626
1059
|
}
|
|
1627
|
-
|
|
1628
1060
|
that._oPopover.attachAfterClose(fnOnAfterDiscard);
|
|
1629
|
-
|
|
1630
1061
|
that._oPopover.openBy(oCancelButton, false);
|
|
1631
1062
|
} else {
|
|
1632
1063
|
that.handleValidationError();
|
|
@@ -1634,21 +1065,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1634
1065
|
}
|
|
1635
1066
|
});
|
|
1636
1067
|
}
|
|
1637
|
-
/**
|
|
1638
|
-
* Sets the document to modified state on patch event.
|
|
1639
|
-
*
|
|
1640
|
-
* @function
|
|
1641
|
-
* @static
|
|
1642
|
-
* @name sap.fe.core.TransactionHelper.handleDocumentModifications
|
|
1643
|
-
* @memberof sap.fe.core.TransactionHelper
|
|
1644
|
-
* @ui5-restricted
|
|
1645
|
-
* @final
|
|
1646
|
-
*/
|
|
1647
|
-
;
|
|
1648
|
-
|
|
1649
|
-
_proto.handleDocumentModifications = function handleDocumentModifications() {
|
|
1650
|
-
this._bIsModified = true;
|
|
1651
|
-
}
|
|
1652
1068
|
/**
|
|
1653
1069
|
* Retrieves the owner component.
|
|
1654
1070
|
*
|
|
@@ -1660,18 +1076,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1660
1076
|
* @returns The app component
|
|
1661
1077
|
* @ui5-restricted
|
|
1662
1078
|
* @final
|
|
1663
|
-
|
|
1664
|
-
;
|
|
1665
|
-
|
|
1079
|
+
*/;
|
|
1666
1080
|
_proto._getAppComponent = function _getAppComponent() {
|
|
1667
1081
|
return this._oAppComponent;
|
|
1668
1082
|
};
|
|
1669
|
-
|
|
1670
1083
|
_proto._onFieldChange = function _onFieldChange(oEvent, oCreateButton, messageHandler, fnValidateRequiredProperties) {
|
|
1671
1084
|
messageHandler.removeTransitionMessages();
|
|
1672
1085
|
var oField = oEvent.getSource();
|
|
1673
1086
|
var oFieldPromise = oEvent.getParameter("promise");
|
|
1674
|
-
|
|
1675
1087
|
if (oFieldPromise) {
|
|
1676
1088
|
return oFieldPromise.then(function (value) {
|
|
1677
1089
|
// Setting value of field as '' in case of value help and validating other fields
|
|
@@ -1690,44 +1102,33 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1690
1102
|
});
|
|
1691
1103
|
}
|
|
1692
1104
|
};
|
|
1693
|
-
|
|
1694
|
-
_proto._getNonDeletableText = function _getNonDeletableText(mParameters, vContexts, oResourceBundle) {
|
|
1695
|
-
var aNonDeletableContexts = mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length;
|
|
1696
|
-
return aNonDeletableContexts === 1 ? CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_ONE_OBJECT_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts]) : CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_CONFIRM_DELETE_WITH_OBJECTINFO_AND_FEW_OBJECTS_NON_DELETABLE", oResourceBundle, [mParameters.numberOfSelectedContexts - vContexts.concat(mParameters.unSavedContexts).length, mParameters.numberOfSelectedContexts]);
|
|
1697
|
-
};
|
|
1698
|
-
|
|
1699
1105
|
_proto._launchDialogWithKeyFields = function _launchDialogWithKeyFields(oListBinding, mFields, oModel, mParameters, messageHandler) {
|
|
1700
|
-
var
|
|
1701
|
-
|
|
1106
|
+
var _this11 = this;
|
|
1702
1107
|
var oDialog;
|
|
1703
|
-
var oParentControl = mParameters.parentControl;
|
|
1108
|
+
var oParentControl = mParameters.parentControl;
|
|
1704
1109
|
|
|
1110
|
+
// Crate a fake (transient) listBinding and context, just for the binding context of the dialog
|
|
1705
1111
|
var oTransientListBinding = oModel.bindList(oListBinding.getPath(), oListBinding.getContext(), [], [], {
|
|
1706
1112
|
$$updateGroupId: "submitLater"
|
|
1707
1113
|
});
|
|
1708
|
-
|
|
1709
1114
|
oTransientListBinding.refreshInternal = function () {
|
|
1710
1115
|
/* */
|
|
1711
1116
|
};
|
|
1712
|
-
|
|
1713
1117
|
var oTransientContext = oTransientListBinding.create(mParameters.data, true);
|
|
1714
1118
|
return new Promise(function (resolve, reject) {
|
|
1715
1119
|
try {
|
|
1716
1120
|
var sFragmentName = "sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog";
|
|
1717
|
-
|
|
1718
1121
|
var oFragment = XMLTemplateProcessor.loadTemplate(sFragmentName, "fragment"),
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1122
|
+
oResourceBundle = oParentControl.getController().oResourceBundle,
|
|
1123
|
+
oMetaModel = oModel.getMetaModel(),
|
|
1124
|
+
aImmutableFields = [],
|
|
1125
|
+
oAppComponent = _this11._getAppComponent(),
|
|
1126
|
+
sPath = oListBinding.isRelative() ? oListBinding.getResolvedPath() : oListBinding.getPath(),
|
|
1127
|
+
oEntitySetContext = oMetaModel.createBindingContext(sPath),
|
|
1128
|
+
sMetaPath = oMetaModel.getMetaPath(sPath);
|
|
1727
1129
|
for (var i in mFields) {
|
|
1728
1130
|
aImmutableFields.push(oMetaModel.createBindingContext("".concat(sMetaPath, "/").concat(mFields[i])));
|
|
1729
1131
|
}
|
|
1730
|
-
|
|
1731
1132
|
var oImmutableCtxModel = new JSONModel(aImmutableFields);
|
|
1732
1133
|
var oImmutableCtx = oImmutableCtxModel.createBindingContext("/");
|
|
1733
1134
|
var aRequiredProperties = CommonUtils.getRequiredPropertiesFromInsertRestrictions(sMetaPath, oMetaModel);
|
|
@@ -1749,19 +1150,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1749
1150
|
}
|
|
1750
1151
|
})).then(function (oNewFragment) {
|
|
1751
1152
|
var aFormElements = [];
|
|
1752
|
-
var mFieldValueMap = {};
|
|
1753
|
-
|
|
1153
|
+
var mFieldValueMap = {};
|
|
1154
|
+
// eslint-disable-next-line prefer-const
|
|
1754
1155
|
var oCreateButton;
|
|
1755
|
-
|
|
1756
1156
|
var validateRequiredProperties = function () {
|
|
1757
1157
|
try {
|
|
1758
|
-
function
|
|
1158
|
+
function _temp32() {
|
|
1759
1159
|
oCreateButton.setEnabled(bEnabled);
|
|
1760
1160
|
}
|
|
1761
|
-
|
|
1762
1161
|
var bEnabled = false;
|
|
1763
|
-
|
|
1764
|
-
var _temp36 = _catch(function () {
|
|
1162
|
+
var _temp33 = _catch(function () {
|
|
1765
1163
|
return Promise.resolve(Promise.all(aFormElements.map(function (oFormElement) {
|
|
1766
1164
|
return oFormElement.getFields()[0];
|
|
1767
1165
|
}).filter(function (oField) {
|
|
@@ -1769,31 +1167,26 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1769
1167
|
return oField.getRequired() || oField.getValueState() === ValueState.Error;
|
|
1770
1168
|
}).map(function (oField) {
|
|
1771
1169
|
try {
|
|
1772
|
-
var
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
return _exit6 ? _result13 : oField.getValue() === "" ? undefined : oField.getValue();
|
|
1170
|
+
var _exit4 = false;
|
|
1171
|
+
function _temp37(_result11) {
|
|
1172
|
+
return _exit4 ? _result11 : oField.getValue() === "" ? undefined : oField.getValue();
|
|
1776
1173
|
}
|
|
1777
|
-
|
|
1778
1174
|
var sFieldId = oField.getId();
|
|
1779
|
-
|
|
1780
|
-
var _temp41 = function () {
|
|
1175
|
+
var _temp38 = function () {
|
|
1781
1176
|
if (sFieldId in mFieldValueMap) {
|
|
1782
1177
|
return _catch(function () {
|
|
1783
1178
|
return Promise.resolve(mFieldValueMap[sFieldId]).then(function (vValue) {
|
|
1784
|
-
var
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
return _temp37;
|
|
1179
|
+
var _temp34 = oField.getValue() === "" ? undefined : vValue;
|
|
1180
|
+
_exit4 = true;
|
|
1181
|
+
return _temp34;
|
|
1788
1182
|
});
|
|
1789
1183
|
}, function () {
|
|
1790
|
-
|
|
1184
|
+
_exit4 = true;
|
|
1791
1185
|
return undefined;
|
|
1792
1186
|
});
|
|
1793
1187
|
}
|
|
1794
1188
|
}();
|
|
1795
|
-
|
|
1796
|
-
return Promise.resolve(_temp41 && _temp41.then ? _temp41.then(_temp40) : _temp40(_temp41));
|
|
1189
|
+
return Promise.resolve(_temp38 && _temp38.then ? _temp38.then(_temp37) : _temp37(_temp38));
|
|
1797
1190
|
} catch (e) {
|
|
1798
1191
|
return Promise.reject(e);
|
|
1799
1192
|
}
|
|
@@ -1802,20 +1195,17 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1802
1195
|
if (Array.isArray(vValue)) {
|
|
1803
1196
|
vValue = vValue[0];
|
|
1804
1197
|
}
|
|
1805
|
-
|
|
1806
1198
|
return vValue !== undefined && vValue !== null && vValue !== "";
|
|
1807
1199
|
});
|
|
1808
1200
|
});
|
|
1809
1201
|
}, function () {
|
|
1810
1202
|
bEnabled = false;
|
|
1811
1203
|
});
|
|
1812
|
-
|
|
1813
|
-
return Promise.resolve(_temp36 && _temp36.then ? _temp36.then(_temp35) : _temp35(_temp36));
|
|
1204
|
+
return Promise.resolve(_temp33 && _temp33.then ? _temp33.then(_temp32) : _temp32(_temp33));
|
|
1814
1205
|
} catch (e) {
|
|
1815
1206
|
return Promise.reject(e);
|
|
1816
1207
|
}
|
|
1817
1208
|
};
|
|
1818
|
-
|
|
1819
1209
|
var oController = {
|
|
1820
1210
|
/*
|
|
1821
1211
|
fired on focus out from field or on selecting a value from the valuehelp.
|
|
@@ -1825,9 +1215,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1825
1215
|
*/
|
|
1826
1216
|
handleChange: function (oEvent) {
|
|
1827
1217
|
var sFieldId = oEvent.getParameter("id");
|
|
1828
|
-
mFieldValueMap[sFieldId] =
|
|
1218
|
+
mFieldValueMap[sFieldId] = _this11._onFieldChange(oEvent, oCreateButton, messageHandler, validateRequiredProperties);
|
|
1829
1219
|
},
|
|
1830
|
-
|
|
1831
1220
|
/*
|
|
1832
1221
|
fired on key press. the create button is enabled when a value is added.
|
|
1833
1222
|
liveChange is not fired when value is added from valuehelp.
|
|
@@ -1845,7 +1234,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1845
1234
|
controller: oController
|
|
1846
1235
|
})).then(function (oDialogContent) {
|
|
1847
1236
|
var oResult;
|
|
1848
|
-
|
|
1237
|
+
var closeDialog = function () {
|
|
1238
|
+
//rejected/resolved the promis returned by _launchDialogWithKeyFields
|
|
1239
|
+
//as soon as the dialog is closed. Without waiting for the dialog's
|
|
1240
|
+
//animation to finish
|
|
1241
|
+
if (oResult.error) {
|
|
1242
|
+
reject(oResult.error);
|
|
1243
|
+
} else {
|
|
1244
|
+
resolve(oResult.response);
|
|
1245
|
+
}
|
|
1246
|
+
oDialog.close();
|
|
1247
|
+
};
|
|
1248
|
+
oDialog = new Dialog(generate(["CreateDialog", sMetaPath]), {
|
|
1849
1249
|
title: CommonUtils.getTranslatedText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE", oResourceBundle),
|
|
1850
1250
|
content: [oDialogContent],
|
|
1851
1251
|
beginButton: {
|
|
@@ -1857,8 +1257,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1857
1257
|
createButton.setEnabled(false);
|
|
1858
1258
|
BusyLocker.lock(oDialog);
|
|
1859
1259
|
mParameters.bIsCreateDialog = true;
|
|
1860
|
-
|
|
1861
|
-
var _temp45 = _finallyRethrows(function () {
|
|
1260
|
+
var _temp42 = _finallyRethrows(function () {
|
|
1862
1261
|
return _catch(function () {
|
|
1863
1262
|
return Promise.resolve(Promise.all(Object.keys(mFieldValueMap).map(function (sKey) {
|
|
1864
1263
|
try {
|
|
@@ -1871,38 +1270,33 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1871
1270
|
return Promise.reject(e);
|
|
1872
1271
|
}
|
|
1873
1272
|
}))).then(function (aValues) {
|
|
1874
|
-
function
|
|
1273
|
+
function _temp40() {
|
|
1875
1274
|
var transientData = oTransientContext.getObject();
|
|
1876
1275
|
var createData = {};
|
|
1877
1276
|
Object.keys(transientData).forEach(function (sPropertyPath) {
|
|
1878
|
-
var oProperty = oMetaModel.getObject("".concat(sMetaPath, "/").concat(sPropertyPath));
|
|
1879
|
-
|
|
1277
|
+
var oProperty = oMetaModel.getObject("".concat(sMetaPath, "/").concat(sPropertyPath));
|
|
1278
|
+
// ensure navigation properties are not part of the payload, deep create not supported
|
|
1880
1279
|
if (oProperty && oProperty.$kind === "NavigationProperty") {
|
|
1881
1280
|
return;
|
|
1882
1281
|
}
|
|
1883
|
-
|
|
1884
1282
|
createData[sPropertyPath] = transientData[sPropertyPath];
|
|
1885
1283
|
});
|
|
1886
1284
|
var oNewDocumentContext = oListBinding.create(createData, true, mParameters.createAtEnd, mParameters.inactive);
|
|
1887
|
-
|
|
1888
|
-
var oPromise = _this12.onAfterCreateCompletion(oListBinding, oNewDocumentContext, mParameters);
|
|
1889
|
-
|
|
1285
|
+
var oPromise = _this11.onAfterCreateCompletion(oListBinding, oNewDocumentContext, mParameters);
|
|
1890
1286
|
return Promise.resolve(oPromise).then(function (oResponse) {
|
|
1891
1287
|
if (!oResponse || oResponse && oResponse.bKeepDialogOpen !== true) {
|
|
1892
1288
|
var _oResponse;
|
|
1893
|
-
|
|
1894
1289
|
oResponse = (_oResponse = oResponse) !== null && _oResponse !== void 0 ? _oResponse : {};
|
|
1895
1290
|
oDialog.setBindingContext(null);
|
|
1896
1291
|
oResponse.newContext = oNewDocumentContext;
|
|
1897
1292
|
oResult = {
|
|
1898
1293
|
response: oResponse
|
|
1899
1294
|
};
|
|
1900
|
-
|
|
1295
|
+
closeDialog();
|
|
1901
1296
|
}
|
|
1902
1297
|
});
|
|
1903
1298
|
}
|
|
1904
|
-
|
|
1905
|
-
var _temp42 = function () {
|
|
1299
|
+
var _temp39 = function () {
|
|
1906
1300
|
if (mParameters.beforeCreateCallBack) {
|
|
1907
1301
|
return Promise.resolve(toES6Promise(mParameters.beforeCreateCallBack({
|
|
1908
1302
|
contextPath: oListBinding && oListBinding.getPath(),
|
|
@@ -1910,8 +1304,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1910
1304
|
}))).then(function () {});
|
|
1911
1305
|
}
|
|
1912
1306
|
}();
|
|
1913
|
-
|
|
1914
|
-
return _temp42 && _temp42.then ? _temp42.then(_temp43) : _temp43(_temp42);
|
|
1307
|
+
return _temp39 && _temp39.then ? _temp39.then(_temp40) : _temp40(_temp39);
|
|
1915
1308
|
});
|
|
1916
1309
|
}, function (oError) {
|
|
1917
1310
|
if (oError !== FELibrary.Constants.CreationFailed) {
|
|
@@ -1919,18 +1312,18 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1919
1312
|
oResult = {
|
|
1920
1313
|
error: oError
|
|
1921
1314
|
};
|
|
1922
|
-
|
|
1315
|
+
closeDialog();
|
|
1316
|
+
} else {
|
|
1317
|
+
createButton.setEnabled(true);
|
|
1923
1318
|
}
|
|
1924
1319
|
});
|
|
1925
|
-
}, function (_wasThrown7,
|
|
1320
|
+
}, function (_wasThrown7, _result12) {
|
|
1926
1321
|
BusyLocker.unlock(oDialog);
|
|
1927
|
-
createButton.setEnabled(true);
|
|
1928
1322
|
messageHandler.showMessages();
|
|
1929
|
-
if (_wasThrown7) throw
|
|
1930
|
-
return
|
|
1323
|
+
if (_wasThrown7) throw _result12;
|
|
1324
|
+
return _result12;
|
|
1931
1325
|
});
|
|
1932
|
-
|
|
1933
|
-
return Promise.resolve(_temp45 && _temp45.then ? _temp45.then(function () {}) : void 0);
|
|
1326
|
+
return Promise.resolve(_temp42 && _temp42.then ? _temp42.then(function () {}) : void 0);
|
|
1934
1327
|
} catch (e) {
|
|
1935
1328
|
return Promise.reject(e);
|
|
1936
1329
|
}
|
|
@@ -1942,37 +1335,28 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1942
1335
|
oResult = {
|
|
1943
1336
|
error: FELibrary.Constants.CancelActionDialog
|
|
1944
1337
|
};
|
|
1945
|
-
|
|
1338
|
+
closeDialog();
|
|
1946
1339
|
}
|
|
1947
1340
|
},
|
|
1948
1341
|
afterClose: function () {
|
|
1949
1342
|
var _oDialog$getBindingCo;
|
|
1950
|
-
|
|
1951
1343
|
// show footer as per UX guidelines when dialog is not open
|
|
1952
1344
|
(_oDialog$getBindingCo = oDialog.getBindingContext("internal")) === null || _oDialog$getBindingCo === void 0 ? void 0 : _oDialog$getBindingCo.setProperty("isCreateDialogOpen", false);
|
|
1953
1345
|
oDialog.destroy();
|
|
1954
1346
|
oTransientListBinding.destroy();
|
|
1955
|
-
|
|
1956
|
-
if (oResult.error) {
|
|
1957
|
-
reject(oResult.error);
|
|
1958
|
-
} else {
|
|
1959
|
-
resolve(oResult.response);
|
|
1960
|
-
}
|
|
1961
1347
|
}
|
|
1962
1348
|
});
|
|
1963
1349
|
aFormElements = oDialogContent === null || oDialogContent === void 0 ? void 0 : oDialogContent.getAggregation("form").getAggregation("formContainers")[0].getAggregation("formElements");
|
|
1964
|
-
|
|
1965
1350
|
if (oParentControl && oParentControl.addDependent) {
|
|
1966
1351
|
// if there is a parent control specified add the dialog as dependent
|
|
1967
1352
|
oParentControl.addDependent(oDialog);
|
|
1968
1353
|
}
|
|
1969
|
-
|
|
1970
1354
|
oCreateButton = oDialog.getBeginButton();
|
|
1971
1355
|
oDialog.setBindingContext(oTransientContext);
|
|
1972
1356
|
return _catch(function () {
|
|
1973
1357
|
return Promise.resolve(CommonUtils.setUserDefaults(oAppComponent, aImmutableFields, oTransientContext, false, mParameters.createAction, mParameters.data)).then(function () {
|
|
1974
|
-
validateRequiredProperties();
|
|
1975
|
-
|
|
1358
|
+
validateRequiredProperties();
|
|
1359
|
+
// footer must not be visible when the dialog is open as per UX guidelines
|
|
1976
1360
|
oDialog.getBindingContext("internal").setProperty("isCreateDialogOpen", true);
|
|
1977
1361
|
oDialog.open();
|
|
1978
1362
|
});
|
|
@@ -1988,25 +1372,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
1988
1372
|
}
|
|
1989
1373
|
});
|
|
1990
1374
|
};
|
|
1991
|
-
|
|
1992
1375
|
_proto.onAfterCreateCompletion = function onAfterCreateCompletion(oListBinding, oNewDocumentContext, mParameters) {
|
|
1993
|
-
var
|
|
1994
|
-
|
|
1376
|
+
var _this12 = this;
|
|
1995
1377
|
var fnResolve;
|
|
1996
1378
|
var oPromise = new Promise(function (resolve) {
|
|
1997
1379
|
fnResolve = resolve;
|
|
1998
1380
|
});
|
|
1999
|
-
|
|
2000
1381
|
var fnCreateCompleted = function (oEvent) {
|
|
2001
1382
|
var oContext = oEvent.getParameter("context"),
|
|
2002
|
-
|
|
2003
|
-
|
|
1383
|
+
bSuccess = oEvent.getParameter("success");
|
|
2004
1384
|
if (oContext === oNewDocumentContext) {
|
|
2005
|
-
oListBinding.detachCreateCompleted(fnCreateCompleted,
|
|
1385
|
+
oListBinding.detachCreateCompleted(fnCreateCompleted, _this12);
|
|
2006
1386
|
fnResolve(bSuccess);
|
|
2007
1387
|
}
|
|
2008
1388
|
};
|
|
2009
|
-
|
|
2010
1389
|
var fnSafeContextCreated = function () {
|
|
2011
1390
|
oNewDocumentContext.created().then(undefined, function () {
|
|
2012
1391
|
Log.trace("transient creation context deleted");
|
|
@@ -2014,19 +1393,16 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2014
1393
|
Log.trace("transient creation context deletion error", contextError);
|
|
2015
1394
|
});
|
|
2016
1395
|
};
|
|
2017
|
-
|
|
2018
1396
|
oListBinding.attachCreateCompleted(fnCreateCompleted, this);
|
|
2019
1397
|
return oPromise.then(function (bSuccess) {
|
|
2020
1398
|
if (!bSuccess) {
|
|
2021
1399
|
if (!mParameters.keepTransientContextOnFailed) {
|
|
2022
1400
|
// Cancel the pending POST and delete the context in the listBinding
|
|
2023
1401
|
fnSafeContextCreated(); // To avoid a 'request cancelled' error in the console
|
|
2024
|
-
|
|
2025
1402
|
oListBinding.resetChanges();
|
|
2026
1403
|
oListBinding.getModel().resetChanges(oListBinding.getUpdateGroupId());
|
|
2027
1404
|
throw FELibrary.Constants.CreationFailed;
|
|
2028
1405
|
}
|
|
2029
|
-
|
|
2030
1406
|
return {
|
|
2031
1407
|
bKeepDialogOpen: true
|
|
2032
1408
|
};
|
|
@@ -2050,12 +1426,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2050
1426
|
* @returns The name of the action
|
|
2051
1427
|
* @ui5-restricted
|
|
2052
1428
|
* @final
|
|
2053
|
-
|
|
2054
|
-
;
|
|
2055
|
-
|
|
1429
|
+
*/;
|
|
2056
1430
|
_proto._getNewAction = function _getNewAction(oStartupParameters, sCreateHash, oMetaModel, sMetaPath) {
|
|
2057
1431
|
var sNewAction;
|
|
2058
|
-
|
|
2059
1432
|
if (oStartupParameters && oStartupParameters.preferredMode && sCreateHash.toUpperCase().indexOf("I-ACTION=CREATEWITH") > -1) {
|
|
2060
1433
|
var sPreferredMode = oStartupParameters.preferredMode[0];
|
|
2061
1434
|
sNewAction = sPreferredMode.toUpperCase().indexOf("CREATEWITH:") > -1 ? sPreferredMode.substr(sPreferredMode.lastIndexOf(":") + 1) : undefined;
|
|
@@ -2065,7 +1438,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2065
1438
|
} else {
|
|
2066
1439
|
sNewAction = oMetaModel && oMetaModel.getObject !== undefined ? oMetaModel.getObject("".concat(sMetaPath, "@com.sap.vocabularies.Session.v1.StickySessionSupported/NewAction")) || oMetaModel.getObject("".concat(sMetaPath, "@com.sap.vocabularies.Common.v1.DraftRoot/NewAction")) : undefined;
|
|
2067
1440
|
}
|
|
2068
|
-
|
|
2069
1441
|
return sNewAction;
|
|
2070
1442
|
}
|
|
2071
1443
|
/**
|
|
@@ -2088,9 +1460,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2088
1460
|
* @returns The label for the Create Action Dialog
|
|
2089
1461
|
* @ui5-restricted
|
|
2090
1462
|
* @final
|
|
2091
|
-
|
|
2092
|
-
;
|
|
2093
|
-
|
|
1463
|
+
*/;
|
|
2094
1464
|
_proto._getSpecificCreateActionDialogLabel = function _getSpecificCreateActionDialogLabel(oMetaModel, sMetaPath, sNewAction, oResourceBundleCore) {
|
|
2095
1465
|
var fnGetLabelFromLineItemAnnotation = function () {
|
|
2096
1466
|
if (oMetaModel && oMetaModel.getObject("".concat(sMetaPath, "/@com.sap.vocabularies.UI.v1.LineItem"))) {
|
|
@@ -2103,13 +1473,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/CommonUtils", "sap/fe/core/controlle
|
|
|
2103
1473
|
return undefined;
|
|
2104
1474
|
}
|
|
2105
1475
|
};
|
|
2106
|
-
|
|
2107
1476
|
return fnGetLabelFromLineItemAnnotation() || oMetaModel && oMetaModel.getObject("".concat(sMetaPath, "/").concat(sNewAction, "@com.sap.vocabularies.Common.v1.Label")) || oResourceBundleCore && oResourceBundleCore.getText("C_TRANSACTION_HELPER_SAPFE_ACTION_CREATE");
|
|
2108
1477
|
};
|
|
2109
|
-
|
|
2110
1478
|
return TransactionHelper;
|
|
2111
1479
|
}();
|
|
2112
|
-
|
|
2113
1480
|
return TransactionHelper;
|
|
2114
1481
|
}, false);
|
|
2115
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiZmluYWxpemVyIiwiYmluZCIsInBhY3QiLCJzdGF0ZSIsInZhbHVlIiwicyIsInYiLCJvIiwib2JzZXJ2ZXIiLCJwcm90b3R5cGUiLCJvbkZ1bGZpbGxlZCIsIm9uUmVqZWN0ZWQiLCJjYWxsYmFjayIsIl90aGlzIiwiZGlzY3JpbWluYW50IiwiY2FzZXMiLCJkaXNwYXRjaEluZGV4IiwiYXdhaXRCb2R5Iiwib3V0ZXIiLCJpIiwibGVuZ3RoIiwidGVzdCIsInRlc3RWYWx1ZSIsImZhbGx0aHJvdWdoQ2hlY2siLCJyZWplY3QiLCJfcmVzdW1lQWZ0ZXJCb2R5IiwiX3Jlc3VtZUFmdGVyVGVzdCIsIkNyZWF0aW9uTW9kZSIsIkZFTGlicmFyeSIsIlByb2dyYW1taW5nTW9kZWwiLCJWYWx1ZVN0YXRlIiwiY29yZUxpYnJhcnkiLCJnZXRQYXJhbWV0ZXJzIiwibVBhcmFtZXRlcnMiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJUcmFuc2FjdGlvbkhlbHBlciIsIm9BcHBDb21wb25lbnQiLCJvTG9ja09iamVjdCIsIl9iSXNNb2RpZmllZCIsIl9iQ3JlYXRlTW9kZSIsIl9iQ29udGludWVEaXNjYXJkIiwiX29BcHBDb21wb25lbnQiLCJnZXRQcm9ncmFtbWluZ01vZGVsIiwib0NvbnRleHQiLCJzUHJvZ3JhbW1pbmdNb2RlbCIsInNQYXRoIiwiaXNBIiwiZ2V0UGF0aCIsImlzUmVsYXRpdmUiLCJnZXRSZXNvbHZlZFBhdGgiLCJNb2RlbEhlbHBlciIsImlzRHJhZnRTdXBwb3J0ZWQiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsIkRyYWZ0IiwiaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU3RpY2t5IiwiTm9uRHJhZnQiLCJ2YWxpZGF0ZURvY3VtZW50Iiwib1ZpZXciLCJzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwiY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uIiwic01vZHVsZSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwicmVwbGFjZSIsInNGdW5jdGlvbk5hbWUiLCJtRGF0YSIsImRhdGEiLCJGUE1IZWxwZXIiLCJ2YWxpZGF0aW9uV3JhcHBlciIsIlByb21pc2UiLCJyZXNvbHZlIiwiY3JlYXRlRG9jdW1lbnQiLCJvTWFpbkxpc3RCaW5kaW5nIiwibUluUGFyYW1ldGVycyIsIm9SZXNvdXJjZUJ1bmRsZSIsIm1lc3NhZ2VIYW5kbGVyIiwiYkZyb21Db3B5UGFzdGUiLCJvTW9kZWwiLCJvTWV0YU1vZGVsIiwic01ldGFQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRIZWFkZXJDb250ZXh0Iiwic0NyZWF0ZUhhc2giLCJfZ2V0QXBwQ29tcG9uZW50IiwiZ2V0Um91dGVyUHJveHkiLCJnZXRIYXNoIiwib0NvbXBvbmVudERhdGEiLCJnZXRDb21wb25lbnREYXRhIiwib1N0YXJ0dXBQYXJhbWV0ZXJzIiwic3RhcnR1cFBhcmFtZXRlcnMiLCJzTmV3QWN0aW9uIiwiX2dldE5ld0FjdGlvbiIsInVuZGVmaW5lZCIsIm1CaW5kaW5nUGFyYW1ldGVycyIsInNNZXNzYWdlc1BhdGgiLCJnZXRPYmplY3QiLCJzQnVzeVBhdGgiLCJnZXRUYXJnZXRFbnRpdHlTZXQiLCJnZXRDb250ZXh0IiwiYkZ1bmN0aW9uT25OYXZQcm9wIiwib05ld0RvY3VtZW50Q29udGV4dCIsIkVycm9yIiwiYnVzeU1vZGUiLCJidXN5SWQiLCJiZWZvcmVDcmVhdGVDYWxsQmFjayIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwib1Jlc291cmNlQnVuZGxlQ29yZSIsIkNvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJvUmVzdWx0IiwiYkNvbnNpZGVyRG9jdW1lbnRNb2RpZmllZCIsImhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9ucyIsInNob3dNZXNzYWdlRGlhbG9nIiwiY2FsbEFjdGlvbiIsImNvbnRleHRzIiwic2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyIsImxhYmVsIiwiX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWwiLCJiaW5kaW5nUGFyYW1ldGVycyIsInBhcmVudENvbnRyb2wiLCJiSXNDcmVhdGVBY3Rpb24iLCJza2lwUGFyYW1ldGVyRGlhbG9nIiwiYklzTmV3UGFnZUNyZWF0aW9uIiwiY3JlYXRpb25Nb2RlIiwiQ3JlYXRpb25Sb3ciLCJJbmxpbmUiLCJhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzIiwiQ29tbW9uVXRpbHMiLCJnZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMiLCJzRnVuY3Rpb25QYXRoIiwib0Z1bmN0aW9uQ29udGV4dCIsIm9GdW5jdGlvbiIsImNyZWF0ZUJpbmRpbmdDb250ZXh0Iiwib0RhdGEiLCJPYmplY3QiLCJhc3NpZ24iLCJfbGF1bmNoRGlhbG9nV2l0aEtleUZpZWxkcyIsIm5ld0NvbnRleHQiLCJjcmVhdGUiLCJjcmVhdGVBdEVuZCIsImluYWN0aXZlIiwib25BZnRlckNyZWF0ZUNvbXBsZXRpb24iLCJ0b0VTNlByb21pc2UiLCJjb250ZXh0UGF0aCIsIiRJc0JvdW5kIiwib3BlcmF0aW9ucyIsImNhbGxCb3VuZEZ1bmN0aW9uIiwiY2FsbEZ1bmN0aW9uSW1wb3J0Iiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJDb25zdGFudHMiLCJBY3Rpb25FeGVjdXRpb25GYWlsZWQiLCJDYW5jZWxBY3Rpb25EaWFsb2ciLCJpc1RyYW5zaWVudCIsImRlbGV0ZSIsInVubG9jayIsImZpbmRBY3RpdmVEcmFmdFJvb3RDb250ZXh0cyIsImFDb250ZXh0cyIsImJGaW5kQWN0aXZlQ29udGV4dHMiLCJhY3RpdmVDb250ZXh0cyIsInJlZHVjZSIsImFSZXN1bHQiLCJiSXNBY3RpdmVFbnRpdHkiLCJJc0FjdGl2ZUVudGl0eSIsImJIYXNBY3RpdmVFbnRpdHkiLCJIYXNBY3RpdmVFbnRpdHkiLCJvQWN0aXZlQ29udGV4dCIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwicHVzaCIsImFsbCIsIm1hcCIsInJlcXVlc3RDYW5vbmljYWxQYXRoIiwiYWZ0ZXJEZWxldGVQcm9jZXNzIiwiY2hlY2tCb3giLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsImdldFByb3BlcnR5IiwiaXNDaGVja0JveFZpc2libGUiLCJpc0NoZWNrQm94U2VsZWN0ZWQiLCJzZXRQcm9wZXJ0eSIsIm9iaiIsInNlbGVjdGVkQ29udGV4dHMiLCJmaWx0ZXIiLCJlbGVtZW50IiwiZGVsZXRhYmxlQ29udGV4dHMiLCJpbmRleE9mIiwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIiwiTWVzc2FnZVRvYXN0Iiwic2hvdyIsImdldFRyYW5zbGF0ZWRUZXh0IiwiZW50aXR5U2V0TmFtZSIsImRlbGV0ZURvY3VtZW50IiwidkluQ29udGV4dHMiLCJhRGVsZXRhYmxlQ29udGV4dHMiLCJpc0xvY2tlZFRleHRWaXNpYmxlIiwiY2Fubm90QmVEZWxldGVkVGV4dFZpc2libGUiLCJiRGlhbG9nQ29uZmlybWVkIiwidGhhdCIsImFQYXJhbXMiLCJvRGVsZXRlTWVzc2FnZSIsInRpdGxlIiwiZ2V0VGV4dCIsInZDb250ZXh0cyIsIkFycmF5IiwiaXNBcnJheSIsIm9Db250ZXh0RGF0YSIsIkhhc0RyYWZ0RW50aXR5IiwiRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEiLCJJblByb2Nlc3NCeVVzZXIiLCJEcmFmdElzQ3JlYXRlZEJ5TWUiLCJzTG9ja2VkVXNlciIsImRyYWZ0QWRtaW5EYXRhIiwiTWVzc2FnZUJveCIsIm9uQ2xvc2UiLCJkZXNjcmlwdGlvbiIsInRleHQiLCJvTGluZUNvbnRleHREYXRhIiwib1RhYmxlIiwic0tleSIsImdldFBhcmVudCIsImdldElkZW50aWZpZXJDb2x1bW4iLCJzS2V5VmFsdWUiLCJzRGVzY3JpcHRpb24iLCJwYXRoIiwidW5TYXZlZENvbnRleHRzIiwic0xhc3RDaGFuZ2VkQnlVc2VyIiwiY29uY2F0IiwibG9ja2VkQ29udGV4dHMiLCJub25EZWxldGFibGVUZXh0IiwiX2dldE5vbkRlbGV0YWJsZVRleHQiLCJjaGVja0JveFRleHQiLCJzTm9uRGVsZXRhYmxlQ29udGV4dFRleHQiLCJvTm9uRGVsZXRhYmxlTWVzc2FnZVRleHRDb250cm9sIiwib0RlbGV0ZU1lc3NhZ2VUZXh0Q29udHJvbCIsIm9Db250ZW50IiwiVkJveCIsIml0ZW1zIiwiVGV4dCIsInZpc2libGUiLCJDaGVja0JveCIsInNlbGVjdGVkIiwic2VsZWN0Iiwib0V2ZW50IiwiZ2V0U291cmNlIiwiZ2V0U2VsZWN0ZWQiLCJzVGl0bGUiLCJmbkNvbmZpcm0iLCJiRW5hYmxlU3RyaWN0SGFuZGxpbmciLCJkcmFmdCIsImRlbGV0ZURyYWZ0Iiwic2hvd01lc3NhZ2VzIiwiYmVmb3JlRGVsZXRlQ2FsbEJhY2siLCJvRGlhbG9nIiwiRGlhbG9nIiwiY29udGVudCIsImFyaWFMYWJlbGxlZEJ5IiwiZ2V0VmlzaWJsZSIsImJlZ2luQnV0dG9uIiwiQnV0dG9uIiwidHlwZSIsInByZXNzIiwibWVzc2FnZUhhbmRsaW5nIiwicmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJkZXN0cm95Iiwibm9EaWFsb2ciLCJhZGRTdHlsZUNsYXNzIiwib3BlbiIsImVkaXREb2N1bWVudCIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsImNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50IiwiYlByZXNlcnZlQ2hhbmdlcyIsInN0aWNreSIsImVkaXREb2N1bWVudEluU3RpY2t5U2Vzc2lvbiIsIm9OZXdDb250ZXh0IiwiZXJyIiwiY29uY3VycmVudEVkaXRGbGFnIiwiY2FuY2VsRG9jdW1lbnQiLCJyZXR1cm5lZFZhbHVlIiwicmVxdWVzdE9iamVjdCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiZ2V0QmluZGluZyIsInJlc2V0Q2hhbmdlcyIsIm9TaWJsaW5nQ29udGV4dCIsInNDYW5vbmljYWxQYXRoIiwiZGlzY2FyZERvY3VtZW50IiwiZGlzY2FyZGVkQ29udGV4dCIsInJlZnJlc2giLCJpc0tlZXBBbGl2ZSIsInNldEtlZXBBbGl2ZSIsImJlZm9yZUNhbmNlbENhbGxCYWNrIiwiY29udGV4dCIsInNraXBEaXNjYXJkUG9wb3ZlciIsIl9zaG93RGlzY2FyZFBvcG92ZXIiLCJjYW5jZWxCdXR0b24iLCJkcmFmdERhdGFDb250ZXh0IiwiQ3JlYXRpb25EYXRlVGltZSIsIkxhc3RDaGFuZ2VEYXRlVGltZSIsInNhdmVEb2N1bWVudCIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiYUJpbmRpbmdzIiwiYWN0aXZhdGVEb2N1bWVudCIsIm9BY3RpdmVEb2N1bWVudCIsImJOZXdPYmplY3QiLCJtZXNzYWdlc1JlY2VpdmVkIiwiZ2V0TWVzc2FnZXMiLCJNZXNzYWdlVHlwZSIsIlN1Y2Nlc3MiLCJmb3JFYWNoIiwib0xpc3RCaW5kaW5nIiwiaGFzVHJhbnNpZW50Q29udGV4dCIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsInNBY3Rpb25OYW1lIiwic05hbWUiLCJzcGxpdCIsIm1vZGVsIiwibVNpZGVFZmZlY3RzUGFyYW1ldGVycyIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJkaXNwbGF5VW5hcHBsaWNhYmxlQ29udGV4dHNEaWFsb2ciLCJub3RBcHBsaWNhYmxlQ29udGV4dCIsImZuT3BlbkFuZEZpbGxEaWFsb2ciLCJvRGxnIiwib0RpYWxvZ0NvbnRlbnQiLCJuTm90QXBwbGljYWJsZSIsImFOb3RBcHBsaWNhYmxlSXRlbXMiLCJvTm90QXBwbGljYWJsZUl0ZW1zTW9kZWwiLCJKU09OTW9kZWwiLCJvVG90YWxzIiwidG90YWwiLCJzZXRNb2RlbCIsInNGcmFnbWVudE5hbWUiLCJvRGlhbG9nRnJhZ21lbnQiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZSIsImdldENhbm9uaWNhbFBhdGgiLCJzRW50aXR5U2V0Iiwic3Vic3RyIiwib0RpYWxvZ0xhYmVsTW9kZWwiLCJYTUxQcmVwcm9jZXNzb3IiLCJwcm9jZXNzIiwibmFtZSIsImJpbmRpbmdDb250ZXh0cyIsImVudGl0eVR5cGUiLCJtb2RlbHMiLCJtZXRhTW9kZWwiLCJvRnJhZ21lbnQiLCJvQ29udHJvbGxlciIsIm9uQ29udGludWUiLCJhcHBsaWNhYmxlQ29udGV4dCIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJjb250cm9sbGVyIiwiYWRkRGVwZW5kZW50IiwiX2hhbmRsZUFjdGlvblJlc3BvbnNlIiwiY29udGV4dFRvUHJvY2VzcyIsImNhbGxCb3VuZEFjdGlvbiIsInBhcmFtZXRlclZhbHVlcyIsImludm9jYXRpb25Hcm91cGluZyIsImFkZGl0aW9uYWxTaWRlRWZmZWN0Iiwib25TdWJtaXR0ZWQiLCJvblJlc3BvbnNlIiwiY29udHJvbElkIiwib3BlcmF0aW9uQXZhaWxhYmxlTWFwIiwiYkdldEJvdW5kQ29udGV4dCIsImJPYmplY3RQYWdlIiwiZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uIiwic2VsZWN0ZWRJdGVtcyIsImNhbGxBY3Rpb25JbXBvcnQiLCJhVHJhbnNpZW50TWVzc2FnZXMiLCJoYW5kbGVWYWxpZGF0aW9uRXJyb3IiLCJvTWVzc2FnZU1hbmFnZXIiLCJnZXRNZXNzYWdlTWFuYWdlciIsImVycm9yVG9SZW1vdmUiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwidmFsaWRhdGlvbiIsInJlbW92ZU1lc3NhZ2VzIiwib0NhbmNlbEJ1dHRvbiIsImJJc01vZGlmaWVkIiwiZm5PbkFmdGVyRGlzY2FyZCIsInNldEVuYWJsZWQiLCJfb1BvcG92ZXIiLCJkZXRhY2hBZnRlckNsb3NlIiwib1RleHQiLCJvQnV0dG9uIiwid2lkdGgiLCJQb3BvdmVyIiwic2hvd0hlYWRlciIsInBsYWNlbWVudCIsImJlZm9yZU9wZW4iLCJzZXRJbml0aWFsRm9jdXMiLCJhdHRhY2hBZnRlckNsb3NlIiwib3BlbkJ5IiwiX29uRmllbGRDaGFuZ2UiLCJvQ3JlYXRlQnV0dG9uIiwiZm5WYWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcyIsIm9GaWVsZCIsIm9GaWVsZFByb21pc2UiLCJnZXRQYXJhbWV0ZXIiLCJzZXRWYWx1ZSIsImdldFZhbHVlIiwiY2F0Y2giLCJhTm9uRGVsZXRhYmxlQ29udGV4dHMiLCJtRmllbGRzIiwib1BhcmVudENvbnRyb2wiLCJvVHJhbnNpZW50TGlzdEJpbmRpbmciLCJiaW5kTGlzdCIsIiQkdXBkYXRlR3JvdXBJZCIsInJlZnJlc2hJbnRlcm5hbCIsIm9UcmFuc2llbnRDb250ZXh0IiwiZ2V0Q29udHJvbGxlciIsImFJbW11dGFibGVGaWVsZHMiLCJvRW50aXR5U2V0Q29udGV4dCIsIm9JbW11dGFibGVDdHhNb2RlbCIsIm9JbW11dGFibGVDdHgiLCJhUmVxdWlyZWRQcm9wZXJ0aWVzIiwiZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzRnJvbUluc2VydFJlc3RyaWN0aW9ucyIsIm9SZXF1aXJlZFByb3BlcnR5UGF0aHNDdHhNb2RlbCIsIm9SZXF1aXJlZFByb3BlcnR5UGF0aHNDdHgiLCJlbnRpdHlTZXQiLCJmaWVsZHMiLCJyZXF1aXJlZFByb3BlcnRpZXMiLCJvTmV3RnJhZ21lbnQiLCJhRm9ybUVsZW1lbnRzIiwibUZpZWxkVmFsdWVNYXAiLCJ2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcyIsImJFbmFibGVkIiwib0Zvcm1FbGVtZW50IiwiZ2V0RmllbGRzIiwiZ2V0UmVxdWlyZWQiLCJnZXRWYWx1ZVN0YXRlIiwic0ZpZWxkSWQiLCJnZXRJZCIsInZWYWx1ZSIsImFSZXN1bHRzIiwiZXZlcnkiLCJoYW5kbGVDaGFuZ2UiLCJoYW5kbGVMaXZlQ2hhbmdlIiwiY3JlYXRlQnV0dG9uIiwiYklzQ3JlYXRlRGlhbG9nIiwia2V5cyIsIm9WYWx1ZSIsIm9EaWFsb2dWYWx1ZSIsImFWYWx1ZXMiLCJ0cmFuc2llbnREYXRhIiwiY3JlYXRlRGF0YSIsInNQcm9wZXJ0eVBhdGgiLCJvUHJvcGVydHkiLCIka2luZCIsIm9Qcm9taXNlIiwib1Jlc3BvbnNlIiwiYktlZXBEaWFsb2dPcGVuIiwic2V0QmluZGluZ0NvbnRleHQiLCJyZXNwb25zZSIsImNyZWF0ZVBhcmFtZXRlcnMiLCJDcmVhdGlvbkZhaWxlZCIsImdldEJpbmRpbmdDb250ZXh0IiwiZ2V0QWdncmVnYXRpb24iLCJnZXRCZWdpbkJ1dHRvbiIsInNldFVzZXJEZWZhdWx0cyIsImNyZWF0ZUFjdGlvbiIsImZuUmVzb2x2ZSIsImZuQ3JlYXRlQ29tcGxldGVkIiwiYlN1Y2Nlc3MiLCJkZXRhY2hDcmVhdGVDb21wbGV0ZWQiLCJmblNhZmVDb250ZXh0Q3JlYXRlZCIsImNyZWF0ZWQiLCJ0cmFjZSIsImNvbnRleHRFcnJvciIsImF0dGFjaENyZWF0ZUNvbXBsZXRlZCIsImtlZXBUcmFuc2llbnRDb250ZXh0T25GYWlsZWQiLCJnZXRVcGRhdGVHcm91cElkIiwicHJlZmVycmVkTW9kZSIsInRvVXBwZXJDYXNlIiwic1ByZWZlcnJlZE1vZGUiLCJmbkdldExhYmVsRnJvbUxpbmVJdGVtQW5ub3RhdGlvbiIsImlMaW5lSXRlbUluZGV4IiwiZmluZEluZGV4Iiwib0xpbmVJdGVtIiwiYUxpbmVJdGVtQWN0aW9uIiwiQWN0aW9uIiwiTGFiZWwiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlRyYW5zYWN0aW9uSGVscGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IG9wZXJhdGlvbnMgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L29wZXJhdGlvbnNcIjtcbmltcG9ydCBzdGlja3kgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L3N0aWNreVwiO1xuaW1wb3J0IHR5cGUgTWVzc2FnZUhhbmRsZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgbWVzc2FnZUhhbmRsaW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9tZXNzYWdlSGFuZGxlci9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCBGUE1IZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRlBNSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IEludGVybmFsTW9kZWxDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBNb2RlbEhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IEZFTGlicmFyeSBmcm9tIFwic2FwL2ZlL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IEJ1dHRvbiBmcm9tIFwic2FwL20vQnV0dG9uXCI7XG5pbXBvcnQgQ2hlY2tCb3ggZnJvbSBcInNhcC9tL0NoZWNrQm94XCI7XG5pbXBvcnQgRGlhbG9nIGZyb20gXCJzYXAvbS9EaWFsb2dcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgTWVzc2FnZVRvYXN0IGZyb20gXCJzYXAvbS9NZXNzYWdlVG9hc3RcIjtcbmltcG9ydCBQb3BvdmVyIGZyb20gXCJzYXAvbS9Qb3BvdmVyXCI7XG5pbXBvcnQgVGV4dCBmcm9tIFwic2FwL20vVGV4dFwiO1xuaW1wb3J0IFZCb3ggZnJvbSBcInNhcC9tL1ZCb3hcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgRnJhZ21lbnQgZnJvbSBcInNhcC91aS9jb3JlL0ZyYWdtZW50XCI7XG5pbXBvcnQgY29yZUxpYnJhcnkgZnJvbSBcInNhcC91aS9jb3JlL2xpYnJhcnlcIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFWNENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBPRGF0YUxpc3RCaW5kaW5nLCBWNENvbnRleHQgfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5pbXBvcnQgdG9FUzZQcm9taXNlIGZyb20gXCIuLi8uLi9oZWxwZXJzL1RvRVM2UHJvbWlzZVwiO1xuXG5jb25zdCBDcmVhdGlvbk1vZGUgPSBGRUxpYnJhcnkuQ3JlYXRpb25Nb2RlO1xuY29uc3QgUHJvZ3JhbW1pbmdNb2RlbCA9IEZFTGlicmFyeS5Qcm9ncmFtbWluZ01vZGVsO1xuY29uc3QgVmFsdWVTdGF0ZSA9IGNvcmVMaWJyYXJ5LlZhbHVlU3RhdGU7XG4vKiBNYWtlIHN1cmUgdGhhdCB0aGUgbVBhcmFtZXRlcnMgaXMgbm90IHRoZSBvRXZlbnQgKi9cbmZ1bmN0aW9uIGdldFBhcmFtZXRlcnMobVBhcmFtZXRlcnM6IGFueSkge1xuXHRpZiAobVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuZ2V0TWV0YWRhdGEgJiYgbVBhcmFtZXRlcnMuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgPT09IFwic2FwLnVpLmJhc2UuRXZlbnRcIikge1xuXHRcdG1QYXJhbWV0ZXJzID0ge307XG5cdH1cblx0cmV0dXJuIG1QYXJhbWV0ZXJzIHx8IHt9O1xufVxuXG5jbGFzcyBUcmFuc2FjdGlvbkhlbHBlciB7XG5cdF9vQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQ7XG5cdG9Mb2NrT2JqZWN0OiBhbnk7XG5cdHNQcm9ncmFtbWluZ01vZGVsPzogdHlwZW9mIFByb2dyYW1taW5nTW9kZWw7XG5cdF9iSXNNb2RpZmllZDogYm9vbGVhbiA9IGZhbHNlO1xuXHRfYkNyZWF0ZU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcblx0X2JDb250aW51ZURpc2NhcmQ6IGJvb2xlYW4gPSBmYWxzZTtcblx0X29Qb3BvdmVyITogUG9wb3Zlcjtcblx0Y29uc3RydWN0b3Iob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBvTG9ja09iamVjdDogYW55KSB7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IG9BcHBDb21wb25lbnQ7XG5cdFx0dGhpcy5vTG9ja09iamVjdCA9IG9Mb2NrT2JqZWN0O1xuXHR9XG5cdGdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQ/OiBhbnkpOiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbCB7XG5cdFx0aWYgKCF0aGlzLnNQcm9ncmFtbWluZ01vZGVsICYmIG9Db250ZXh0KSB7XG5cdFx0XHRsZXQgc1BhdGg7XG5cdFx0XHRpZiAob0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdFx0c1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzUGF0aCA9IG9Db250ZXh0LmlzUmVsYXRpdmUoKSA/IG9Db250ZXh0LmdldFJlc29sdmVkUGF0aCgpIDogb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSwgc1BhdGgpKSB7XG5cdFx0XHRcdHRoaXMuc1Byb2dyYW1taW5nTW9kZWwgPSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXHRcdFx0fSBlbHNlIGlmIChNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSkpIHtcblx0XHRcdFx0dGhpcy5zUHJvZ3JhbW1pbmdNb2RlbCA9IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gYXMgdGhlIHRyYW5zYWN0aW9uIGhlbHBlciBpcyBhIHNpbmdsZXRvbiB3ZSBkb24ndCBzdG9yZSB0aGUgbm9uIGRyYWZ0IGFzIHRoZSB1c2VyIGNvdWxkXG5cdFx0XHRcdC8vIHN0YXJ0IHdpdGggYSBub24gZHJhZnQgY2hpbGQgcGFnZSBhbmQgbmF2aWdhdGVzIGJhY2sgdG8gYSBkcmFmdCBlbmFibGVkIG9uZVxuXHRcdFx0XHRyZXR1cm4gUHJvZ3JhbW1pbmdNb2RlbC5Ob25EcmFmdDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuc1Byb2dyYW1taW5nTW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogVmFsaWRhdGVzIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSB2YWxpZGF0ZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmRhdGFdIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgdmFsaWRhdGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICogQHBhcmFtIG9WaWV3IENvbnRhaW5zIHRoZSBvYmplY3Qgb2YgdGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggcmVzdWx0IG9mIHRoZSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvblxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHR2YWxpZGF0ZURvY3VtZW50KG9Db250ZXh0OiBWNENvbnRleHQsIG1QYXJhbWV0ZXJzOiBhbnksIG9WaWV3OiBWaWV3KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uO1xuXHRcdGlmIChzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uKSB7XG5cdFx0XHRjb25zdCBzTW9kdWxlID0gc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5zdWJzdHJpbmcoMCwgc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5sYXN0SW5kZXhPZihcIi5cIikgfHwgLTEpLnJlcGxhY2UoL1xcLi9naSwgXCIvXCIpLFxuXHRcdFx0XHRzRnVuY3Rpb25OYW1lID0gc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5zdWJzdHJpbmcoXG5cdFx0XHRcdFx0c0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5sYXN0SW5kZXhPZihcIi5cIikgKyAxLFxuXHRcdFx0XHRcdHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGVuZ3RoXG5cdFx0XHRcdCksXG5cdFx0XHRcdG1EYXRhID0gbVBhcmFtZXRlcnMuZGF0YTtcblx0XHRcdGRlbGV0ZSBtRGF0YVtcIkAkdWk1LmNvbnRleHQuaXNUcmFuc2llbnRcIl07XG5cdFx0XHRyZXR1cm4gRlBNSGVscGVyLnZhbGlkYXRpb25XcmFwcGVyKHNNb2R1bGUsIHNGdW5jdGlvbk5hbWUsIG1EYXRhLCBvVmlldywgb0NvbnRleHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0gb01haW5MaXN0QmluZGluZyBPRGF0YSBWNCBMaXN0QmluZGluZyBvYmplY3Rcblx0ICogQHBhcmFtIFttSW5QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnMuZGF0YV0gQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBzZW50IHdpdGhpbiB0aGUgUE9TVFxuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnMuYnVzeU1vZGVdIEdsb2JhbCAoZGVmYXVsdCksIExvY2FsLCBOb25lIFRPRE86IHRvIGJlIHJlZmFjdG9yZWRcblx0ICogQHBhcmFtIFttSW5QYXJhbWV0ZXJzLmJ1c3lJZF0gSUQgb2YgdGhlIGxvY2FsIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkXSBJZiBzZXQsIHRoZSBjb250ZXh0IHN0YXlzIGluIHRoZSBsaXN0IGlmIHRoZSBQT1NUIGZhaWxlZCBhbmQgUE9TVCB3aWxsIGJlIHJlcGVhdGVkIHdpdGggdGhlIG5leHQgY2hhbmdlXG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVycy5pbmFjdGl2ZV0gSWYgc2V0LCB0aGUgY29udGV4dCBpcyBzZXQgYXMgaW5hY3RpdmUgZm9yIGVtcHR5IHJvd3Ncblx0ICogQHBhcmFtIFttSW5QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2ddIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcGFyYW0gYkZyb21Db3B5UGFzdGVcblx0ICogQHBhcmFtIG9WaWV3IFRoZSBjdXJyZW50IHZpZXdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIG5ldyBiaW5kaW5nIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRG9jdW1lbnQoXG5cdFx0b01haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRtSW5QYXJhbWV0ZXJzOlxuXHRcdFx0fCB7XG5cdFx0XHRcdFx0ZGF0YT86IGFueTtcblx0XHRcdFx0XHRidXN5TW9kZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRidXN5SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkPzogYW55O1xuXHRcdFx0XHRcdGluYWN0aXZlPzogYm9vbGVhbjtcblx0XHRcdCAgfVxuXHRcdFx0fCB1bmRlZmluZWQsXG5cdFx0b1Jlc291cmNlQnVuZGxlOiBhbnksXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGJGcm9tQ29weVBhc3RlOiBib29sZWFuID0gZmFsc2UsXG5cdFx0b1ZpZXc6IGFueVxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3Qgb01vZGVsID0gb01haW5MaXN0QmluZGluZy5nZXRNb2RlbCgpLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob01haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkuZ2V0UGF0aCgpKSxcblx0XHRcdHNDcmVhdGVIYXNoID0gdGhpcy5fZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGVyUHJveHkoKS5nZXRIYXNoKCksXG5cdFx0XHRvQ29tcG9uZW50RGF0YSA9IHRoaXMuX2dldEFwcENvbXBvbmVudCgpLmdldENvbXBvbmVudERhdGEoKSxcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycyA9IChvQ29tcG9uZW50RGF0YSAmJiBvQ29tcG9uZW50RGF0YS5zdGFydHVwUGFyYW1ldGVycykgfHwge30sXG5cdFx0XHRzTmV3QWN0aW9uID0gIW9NYWluTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpXG5cdFx0XHRcdD8gdGhpcy5fZ2V0TmV3QWN0aW9uKG9TdGFydHVwUGFyYW1ldGVycywgc0NyZWF0ZUhhc2gsIG9NZXRhTW9kZWwsIHNNZXRhUGF0aClcblx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgbUJpbmRpbmdQYXJhbWV0ZXJzOiBhbnkgPSB7IFwiJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0c1wiOiB0cnVlIH07XG5cdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xuXHRcdGxldCBzQnVzeVBhdGggPSBcIi9idXN5XCI7XG5cdFx0bGV0IHNGdW5jdGlvbk5hbWUgPVxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uYCkgfHxcblx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRgJHtNb2RlbEhlbHBlci5nZXRUYXJnZXRFbnRpdHlTZXQob01ldGFNb2RlbC5nZXRDb250ZXh0KHNNZXRhUGF0aCkpfUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uYFxuXHRcdFx0KTtcblx0XHRsZXQgYkZ1bmN0aW9uT25OYXZQcm9wO1xuXHRcdGxldCBvTmV3RG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRpZiAoc0Z1bmN0aW9uTmFtZSkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb25gKSAmJlxuXHRcdFx0XHRNb2RlbEhlbHBlci5nZXRUYXJnZXRFbnRpdHlTZXQob01ldGFNb2RlbC5nZXRDb250ZXh0KHNNZXRhUGF0aCkpICE9PSBzTWV0YVBhdGhcblx0XHRcdCkge1xuXHRcdFx0XHRiRnVuY3Rpb25Pbk5hdlByb3AgPSB0cnVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YkZ1bmN0aW9uT25OYXZQcm9wID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRtQmluZGluZ1BhcmFtZXRlcnNbXCIkc2VsZWN0XCJdID0gc01lc3NhZ2VzUGF0aDtcblx0XHR9XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1JblBhcmFtZXRlcnMpO1xuXHRcdGlmICghb01haW5MaXN0QmluZGluZykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyByZXF1aXJlZCBmb3IgbmV3IGRvY3VtZW50IGNyZWF0aW9uXCIpO1xuXHRcdH1cblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvTWFpbkxpc3RCaW5kaW5nKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDcmVhdGUgZG9jdW1lbnQgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5idXN5TW9kZSA9PT0gXCJMb2NhbFwiKSB7XG5cdFx0XHRzQnVzeVBhdGggPSBgL2J1c3lMb2NhbC8ke21QYXJhbWV0ZXJzLmJ1c3lJZH1gO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayA9IGJGcm9tQ29weVBhc3RlID8gbnVsbCA6IG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLm9Mb2NrT2JqZWN0LCBzQnVzeVBhdGgpO1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZUNvcmUgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdGxldCBvUmVzdWx0OiBhbnk7XG5cblx0XHR0cnkge1xuXHRcdFx0bGV0IGJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQgPSBmYWxzZTtcblx0XHRcdGlmIChzTmV3QWN0aW9uKSB7XG5cdFx0XHRcdGJDb25zaWRlckRvY3VtZW50TW9kaWZpZWQgPSB0cnVlO1xuXHRcdFx0XHRvUmVzdWx0ID0gYXdhaXQgdGhpcy5jYWxsQWN0aW9uKFxuXHRcdFx0XHRcdHNOZXdBY3Rpb24sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Y29udGV4dHM6IG9NYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpLFxuXHRcdFx0XHRcdFx0c2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZzogdHJ1ZSxcblx0XHRcdFx0XHRcdGxhYmVsOiB0aGlzLl9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKG9NZXRhTW9kZWwsIHNNZXRhUGF0aCwgc05ld0FjdGlvbiwgb1Jlc291cmNlQnVuZGxlQ29yZSksXG5cdFx0XHRcdFx0XHRiaW5kaW5nUGFyYW1ldGVyczogbUJpbmRpbmdQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0cGFyZW50Q29udHJvbDogbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCxcblx0XHRcdFx0XHRcdGJJc0NyZWF0ZUFjdGlvbjogdHJ1ZSxcblx0XHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2dcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGJJc05ld1BhZ2VDcmVhdGlvbiA9XG5cdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuQ3JlYXRpb25Sb3cgJiYgbVBhcmFtZXRlcnMuY3JlYXRpb25Nb2RlICE9PSBDcmVhdGlvbk1vZGUuSW5saW5lO1xuXHRcdFx0XHRjb25zdCBhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzID0gYklzTmV3UGFnZUNyZWF0aW9uXG5cdFx0XHRcdFx0PyBDb21tb25VdGlscy5nZXROb25Db21wdXRlZFZpc2libGVGaWVsZHMob01ldGFNb2RlbCwgc01ldGFQYXRoLCBvVmlldylcblx0XHRcdFx0XHQ6IFtdO1xuXHRcdFx0XHRzRnVuY3Rpb25OYW1lID0gYkZyb21Db3B5UGFzdGUgPyBudWxsIDogc0Z1bmN0aW9uTmFtZTtcblx0XHRcdFx0bGV0IHNGdW5jdGlvblBhdGgsIG9GdW5jdGlvbkNvbnRleHQ7XG5cdFx0XHRcdGlmIChzRnVuY3Rpb25OYW1lKSB7XG5cdFx0XHRcdFx0Ly9ib3VuZCB0byB0aGUgc291cmNlIGVudGl0eTpcblx0XHRcdFx0XHRpZiAoYkZ1bmN0aW9uT25OYXZQcm9wKSB7XG5cdFx0XHRcdFx0XHRzRnVuY3Rpb25QYXRoID1cblx0XHRcdFx0XHRcdFx0b01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCkgJiZcblx0XHRcdFx0XHRcdFx0YCR7b01ldGFNb2RlbC5nZXRNZXRhUGF0aChvTWFpbkxpc3RCaW5kaW5nLmdldENvbnRleHQoKS5nZXRQYXRoKCkpfS8ke3NGdW5jdGlvbk5hbWV9YDtcblx0XHRcdFx0XHRcdG9GdW5jdGlvbkNvbnRleHQgPSBvTWFpbkxpc3RCaW5kaW5nLmdldENvbnRleHQoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0c0Z1bmN0aW9uUGF0aCA9XG5cdFx0XHRcdFx0XHRcdG9NYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpICYmXG5cdFx0XHRcdFx0XHRcdGAke29NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob01haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkuZ2V0UGF0aCgpKX0vJHtzRnVuY3Rpb25OYW1lfWA7XG5cdFx0XHRcdFx0XHRvRnVuY3Rpb25Db250ZXh0ID0gb01haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IG9GdW5jdGlvbiA9IHNGdW5jdGlvblBhdGggJiYgKG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bmN0aW9uUGF0aCkgYXMgYW55KTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGxldCBvRGF0YTogYW55O1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvQ29udGV4dCA9XG5cdFx0XHRcdFx0XHRcdG9GdW5jdGlvbiAmJiBvRnVuY3Rpb24uZ2V0T2JqZWN0KCkgJiYgb0Z1bmN0aW9uLmdldE9iamVjdCgpWzBdLiRJc0JvdW5kXG5cdFx0XHRcdFx0XHRcdFx0PyBhd2FpdCBvcGVyYXRpb25zLmNhbGxCb3VuZEZ1bmN0aW9uKHNGdW5jdGlvbk5hbWUsIG9GdW5jdGlvbkNvbnRleHQsIG9Nb2RlbClcblx0XHRcdFx0XHRcdFx0XHQ6IGF3YWl0IG9wZXJhdGlvbnMuY2FsbEZ1bmN0aW9uSW1wb3J0KHNGdW5jdGlvbk5hbWUsIG9Nb2RlbCk7XG5cdFx0XHRcdFx0XHRpZiAob0NvbnRleHQpIHtcblx0XHRcdFx0XHRcdFx0b0RhdGEgPSBvQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGBFcnJvciB3aGlsZSBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uICR7c0Z1bmN0aW9uTmFtZX1gLCBvRXJyb3IpO1xuXHRcdFx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhID0gb0RhdGEgPyBPYmplY3QuYXNzaWduKHt9LCBvRGF0YSwgbVBhcmFtZXRlcnMuZGF0YSkgOiBtUGFyYW1ldGVycy5kYXRhO1xuXHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5kYXRhKSB7XG5cdFx0XHRcdFx0XHRkZWxldGUgbVBhcmFtZXRlcnMuZGF0YVtcIkBvZGF0YS5jb250ZXh0XCJdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRvUmVzdWx0ID0gYXdhaXQgdGhpcy5fbGF1bmNoRGlhbG9nV2l0aEtleUZpZWxkcyhcblx0XHRcdFx0XHRcdFx0b01haW5MaXN0QmluZGluZyxcblx0XHRcdFx0XHRcdFx0YU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyxcblx0XHRcdFx0XHRcdFx0b01vZGVsLFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXJcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0ID0gb1Jlc3VsdC5uZXdDb250ZXh0O1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgdG9FUzZQcm9taXNlKFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTWFpbkxpc3RCaW5kaW5nICYmIG9NYWluTGlzdEJpbmRpbmcuZ2V0UGF0aCgpXG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dCA9IG9NYWluTGlzdEJpbmRpbmcuY3JlYXRlKFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhLFxuXHRcdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuaW5hY3RpdmVcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLmluYWN0aXZlKSB7XG5cdFx0XHRcdFx0XHRcdG9SZXN1bHQgPSBhd2FpdCB0aGlzLm9uQWZ0ZXJDcmVhdGVDb21wbGV0aW9uKG9NYWluTGlzdEJpbmRpbmcsIG9OZXdEb2N1bWVudENvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIG5ldyBkb2N1bWVudFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIW9NYWluTGlzdEJpbmRpbmcuaXNSZWxhdGl2ZSgpKSB7XG5cdFx0XHRcdC8vIHRoZSBjcmVhdGUgbW9kZSBzaGFsbCBjdXJyZW50bHkgb25seSBiZSBzZXQgb24gY3JlYXRpbmcgYSByb290IGRvY3VtZW50XG5cdFx0XHRcdHRoaXMuX2JDcmVhdGVNb2RlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdG9OZXdEb2N1bWVudENvbnRleHQgPSBvTmV3RG9jdW1lbnRDb250ZXh0IHx8IG9SZXN1bHQ7XG5cdFx0XHQvLyBUT0RPOiB3aGVyZSBkb2VzIHRoaXMgb25lIGNvbWluZyBmcm9tPz8/XG5cblx0XHRcdGlmIChiQ29uc2lkZXJEb2N1bWVudE1vZGlmaWVkKSB7XG5cdFx0XHRcdHRoaXMuaGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zKCk7XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0cmV0dXJuIG9OZXdEb2N1bWVudENvbnRleHQhO1xuXHRcdH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG5cdFx0XHQvLyBUT0RPOiBjdXJyZW50bHksIHRoZSBvbmx5IGVycm9ycyBoYW5kbGVkIGhlcmUgYXJlIHJhaXNlZCBhcyBzdHJpbmcgLSBzaG91bGQgYmUgY2hhbmdlZCB0byBFcnJvciBvYmplY3RzXG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoZXJyb3IgPT09IEZFTGlicmFyeS5Db25zdGFudHMuQWN0aW9uRXhlY3V0aW9uRmFpbGVkIHx8IGVycm9yID09PSBGRUxpYnJhcnkuQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZykgJiZcblx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dD8uaXNUcmFuc2llbnQoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHN1Z2dlc3RlZCBieSBtb2RlbCBhcyBDb250ZXh0LmRlbGV0ZSByZXN1bHRzIGluIGFuIGVycm9yXG5cdFx0XHRcdC8vIFRPRE86IHJlbW92ZSB0aGUgJGRpcmVjdCBvbmNlIG1vZGVsIHJlc29sdmVzIHRoaXMgaXNzdWVcblx0XHRcdFx0Ly8gdGhpcyBsaW5lIHNob3dzIHRoZSBleHBlY3RlZCBjb25zb2xlIGVycm9yIFVuY2F1Z2h0IChpbiBwcm9taXNlKSBFcnJvcjogUmVxdWVzdCBjYW5jZWxlZDogUE9TVCBUcmF2ZWw7IGdyb3VwOiBzdWJtaXRMYXRlclxuXHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5vTG9ja09iamVjdCwgc0J1c3lQYXRoKTtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIEZpbmQgdGhlIGFjdGl2ZSBjb250ZXh0cyBvZiB0aGUgZG9jdW1lbnRzLCBvbmx5IGZvciB0aGUgZHJhZnQgcm9vdHMuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBhQ29udGV4dHMgQ29udGV4dHMgRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gYkZpbmRBY3RpdmVDb250ZXh0c1xuXHQgKiBAcmV0dXJucyBBcnJheSBvZiB0aGUgYWN0aXZlIGNvbnRleHRzXG5cdCAqL1xuXHRmaW5kQWN0aXZlRHJhZnRSb290Q29udGV4dHMoYUNvbnRleHRzOiBWNENvbnRleHRbXSwgYkZpbmRBY3RpdmVDb250ZXh0czogYW55KSB7XG5cdFx0aWYgKCFiRmluZEFjdGl2ZUNvbnRleHRzKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHRcdGNvbnN0IGFjdGl2ZUNvbnRleHRzID0gYUNvbnRleHRzLnJlZHVjZShmdW5jdGlvbiAoYVJlc3VsdDogYW55LCBvQ29udGV4dDogYW55KSB7XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGlmIChvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgKSkge1xuXHRcdFx0XHRjb25zdCBiSXNBY3RpdmVFbnRpdHkgPSBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eSxcblx0XHRcdFx0XHRiSGFzQWN0aXZlRW50aXR5ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCkuSGFzQWN0aXZlRW50aXR5O1xuXHRcdFx0XHRpZiAoIWJJc0FjdGl2ZUVudGl0eSAmJiBiSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0FjdGl2ZUNvbnRleHQgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vU2libGluZ0VudGl0eWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdGFSZXN1bHQucHVzaChvQWN0aXZlQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBhUmVzdWx0O1xuXHRcdH0sIFtdKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRhY3RpdmVDb250ZXh0cy5tYXAoZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0O1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXHRhZnRlckRlbGV0ZVByb2Nlc3MobVBhcmFtZXRlcnM6IGFueSwgY2hlY2tCb3g6IGFueSwgYUNvbnRleHRzOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0aWYgKG9JbnRlcm5hbE1vZGVsQ29udGV4dCAmJiBvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJkZWxldGVFbmFibGVkXCIpICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKGNoZWNrQm94LmlzQ2hlY2tCb3hWaXNpYmxlID09PSB0cnVlICYmIGNoZWNrQm94LmlzQ2hlY2tCb3hTZWxlY3RlZCA9PT0gZmFsc2UpIHtcblx0XHRcdFx0Ly9pZiB1bnNhdmVkIG9iamVjdHMgYXJlIG5vdCBkZWxldGVkIHRoZW4gd2UgbmVlZCB0byBzZXQgdGhlIGVuYWJsZWQgdG8gdHJ1ZSBhbmQgdXBkYXRlIHRoZSBtb2RlbCBkYXRhIGZvciBuZXh0IGRlbGV0aW9uXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImRlbGV0ZUVuYWJsZWRcIiwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IG9iaiA9IE9iamVjdC5hc3NpZ24ob0ludGVybmFsTW9kZWxDb250ZXh0LmdldE9iamVjdCgpLCB7fSk7XG5cdFx0XHRcdG9iai5zZWxlY3RlZENvbnRleHRzID0gb2JqLnNlbGVjdGVkQ29udGV4dHMuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqLmRlbGV0YWJsZUNvbnRleHRzLmluZGV4T2YoZWxlbWVudCkgPT09IC0xO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0b2JqLmRlbGV0YWJsZUNvbnRleHRzID0gW107XG5cdFx0XHRcdG9iai5zZWxlY3RlZENvbnRleHRzID0gW107XG5cdFx0XHRcdG9iai5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPSBvYmouc2VsZWN0ZWRDb250ZXh0cy5sZW5ndGg7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcIlwiLCBvYmopO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZGVsZXRlRW5hYmxlZFwiLCBmYWxzZSk7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNlbGVjdGVkQ29udGV4dHNcIiwgW10pO1xuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIiwgMCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChhQ29udGV4dHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRNZXNzYWdlVG9hc3Quc2hvdyhcblx0XHRcdFx0Q29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9ERUxFVEVfVE9BU1RfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdClcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdE1lc3NhZ2VUb2FzdC5zaG93KFxuXHRcdFx0XHRDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RFTEVURV9UT0FTVF9QTFVSQUxcIiwgb1Jlc291cmNlQnVuZGxlLCBudWxsLCBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lKVxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIERlbGV0ZSBvbmUgb3IgbXVsdGlwbGUgZG9jdW1lbnQocykuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB2SW5Db250ZXh0cyBDb250ZXh0cyBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyBOdW1iZXIgb2Ygb2JqZWN0cyBzZWxlY3RlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMubm9EaWFsb2cgVG8gZGlzYWJsZSB0aGUgY29uZmlybWF0aW9uIGRpYWxvZ1xuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnQgYXJlIGRlbGV0ZWRcblx0ICovXG5cdGRlbGV0ZURvY3VtZW50KHZJbkNvbnRleHRzOiBWNENvbnRleHQsIG1QYXJhbWV0ZXJzOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55LCBtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIpIHtcblx0XHRsZXQgYURlbGV0YWJsZUNvbnRleHRzOiBhbnlbXSA9IFtdLFxuXHRcdFx0aXNDaGVja0JveFZpc2libGUgPSBmYWxzZSxcblx0XHRcdGlzTG9ja2VkVGV4dFZpc2libGUgPSBmYWxzZSxcblx0XHRcdGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlID0gZmFsc2UsXG5cdFx0XHRpc0NoZWNrQm94U2VsZWN0ZWQ6IGJvb2xlYW4sXG5cdFx0XHRiRGlhbG9nQ29uZmlybWVkID0gZmFsc2U7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMsXG5cdFx0XHRvUmVzb3VyY2VCdW5kbGVDb3JlID0gQ29yZS5nZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUoXCJzYXAuZmUuY29yZVwiKTtcblx0XHRsZXQgYVBhcmFtcztcblx0XHRsZXQgb0RlbGV0ZU1lc3NhZ2U6IGFueSA9IHtcblx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9ERUxFVEVcIilcblx0XHR9O1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLm9Mb2NrT2JqZWN0KTtcblx0XHRsZXQgdkNvbnRleHRzOiBWNENvbnRleHRbXTtcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2SW5Db250ZXh0cykpIHtcblx0XHRcdHZDb250ZXh0cyA9IHZJbkNvbnRleHRzO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2Q29udGV4dHMgPSBbdkluQ29udGV4dHNdO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbCh2Q29udGV4dHNbMF0pO1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdkNvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gdkNvbnRleHRzW2ldLmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHREYXRhLkhhc0RyYWZ0RW50aXR5ID09PSB0cnVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5JblByb2Nlc3NCeVVzZXIgJiZcblx0XHRcdFx0XHRcdFx0XHRcdCFvQ29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuRHJhZnRJc0NyZWF0ZWRCeU1lXG5cdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgc0xvY2tlZFVzZXIgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRBZG1pbkRhdGEgPSBvQ29udGV4dERhdGEgJiYgb0NvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNMb2NrZWRVc2VyID0gZHJhZnRBZG1pbkRhdGFbXCJJblByb2Nlc3NCeVVzZXJcIl07XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zID0gW3NMb2NrZWRVc2VyXTtcblx0XHRcdFx0XHRcdFx0XHRcdE1lc3NhZ2VCb3guc2hvdyhcblx0XHRcdFx0XHRcdFx0XHRcdFx0Q29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1NJTkdMRV9PQkpFQ1RfTE9DS0VEXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFQYXJhbXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9ERUxFVEVcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b25DbG9zZTogcmVqZWN0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobVBhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnRpdGxlKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5kZXNjcmlwdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdGFQYXJhbXMgPSBbbVBhcmFtZXRlcnMudGl0bGUgKyBcIiBcIiwgbVBhcmFtZXRlcnMuZGVzY3JpcHRpb25dO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGFQYXJhbXMgPSBbbVBhcmFtZXRlcnMudGl0bGUsIFwiXCJdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT1wiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSB2Q29udGV4dHM7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlID0ge1xuXHRcdFx0XHRcdFx0XHR0aXRsZTogb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fREVMRVRFXCIpXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT0gMSAmJiBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgPT09IHZDb250ZXh0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTGluZUNvbnRleHREYXRhID0gdkNvbnRleHRzWzBdLmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvVGFibGUgPSBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBzS2V5ID0gb1RhYmxlICYmIG9UYWJsZS5nZXRQYXJlbnQoKS5nZXRJZGVudGlmaWVyQ29sdW1uKCk7XG5cdFx0XHRcdFx0XHRcdGlmIChzS2V5KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc0tleVZhbHVlID0gc0tleSA/IG9MaW5lQ29udGV4dERhdGFbc0tleV0gOiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc0Rlc2NyaXB0aW9uID1cblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uICYmIG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uLnBhdGhcblx0XHRcdFx0XHRcdFx0XHRcdFx0PyBvTGluZUNvbnRleHREYXRhW21QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uLnBhdGhdXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzS2V5VmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChzRGVzY3JpcHRpb24gJiYgbVBhcmFtZXRlcnMuZGVzY3JpcHRpb24gJiYgc0tleSAhPT0gbVBhcmFtZXRlcnMuZGVzY3JpcHRpb24ucGF0aCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zID0gW3NLZXlWYWx1ZSArIFwiIFwiLCBzRGVzY3JpcHRpb25dO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YVBhcmFtcyA9IFtzS2V5VmFsdWUsIFwiXCJdO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT1wiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFQYXJhbXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChzS2V5VmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFQYXJhbXMgPSBbc0tleVZhbHVlLCBcIlwiXTtcblx0XHRcdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9cIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9TSU5HVUxBUlwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT0gMSAmJiBtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHRcdC8vb25seSBvbmUgdW5zYXZlZCBvYmplY3Rcblx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gbVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBkcmFmdEFkbWluRGF0YSA9IGFEZWxldGFibGVDb250ZXh0c1swXS5nZXRPYmplY3QoKVtcIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhXCJdO1xuXHRcdFx0XHRcdFx0XHRsZXQgc0xhc3RDaGFuZ2VkQnlVc2VyID0gXCJcIjtcblx0XHRcdFx0XHRcdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHRcdFx0XHRcdFx0c0xhc3RDaGFuZ2VkQnlVc2VyID1cblx0XHRcdFx0XHRcdFx0XHRcdGRyYWZ0QWRtaW5EYXRhW1wiTGFzdENoYW5nZWRCeVVzZXJEZXNjcmlwdGlvblwiXSB8fCBkcmFmdEFkbWluRGF0YVtcIkxhc3RDaGFuZ2VkQnlVc2VyXCJdIHx8IFwiXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0YVBhcmFtcyA9IFtzTGFzdENoYW5nZWRCeVVzZXJdO1xuXHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS50ZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1VOU0FWRURfQ0hBTkdFU1wiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9PT0gbVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHQvL29ubHkgbXVsdGlwbGUgdW5zYXZlZCBvYmplY3RzXG5cdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9VTlNBVkVEX0NIQU5HRVNfTVVMVElQTEVfT0JKRUNUU1wiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID09PVxuXHRcdFx0XHRcdFx0XHR2Q29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHMpKS5sZW5ndGhcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHQvL29ubHkgdW5zYXZlZCwgbG9ja2VkICxkZWxldGFibGUgb2JqZWN0cyBidXQgbm90IG5vbi1kZWxldGFibGUgb2JqZWN0c1xuXHRcdFx0XHRcdFx0XHRhRGVsZXRhYmxlQ29udGV4dHMgPSB2Q29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cyk7XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPVxuXHRcdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cy5sZW5ndGggPT09IDFcblx0XHRcdFx0XHRcdFx0XHRcdD8gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0ICApXG5cdFx0XHRcdFx0XHRcdFx0XHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RUSVRMRV9QTFVSQUxcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHQgICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvL2lmIG5vbi1kZWxldGFibGUgb2JqZWN0cyBleGlzdHMgYWxvbmcgd2l0aCBhbnkgb2YgdW5zYXZlZCAsZGVsZXRhYmxlIG9iamVjdHNcblx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzID0gdkNvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMpO1xuXHRcdFx0XHRcdFx0XHRjYW5ub3RCZURlbGV0ZWRUZXh0VmlzaWJsZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLnRleHQgPVxuXHRcdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cy5sZW5ndGggPT09IDFcblx0XHRcdFx0XHRcdFx0XHRcdD8gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1NJTkdVTEFSX05PTl9ERUxFVEFCTEVcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHQgIClcblx0XHRcdFx0XHRcdFx0XHRcdDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVFRJVExFX1BMVVJBTF9OT05fREVMRVRBQkxFXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFthRGVsZXRhYmxlQ29udGV4dHMubGVuZ3RoXSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lXG5cdFx0XHRcdFx0XHRcdFx0XHQgICk7XG5cdFx0XHRcdFx0XHRcdG9EZWxldGVNZXNzYWdlLm5vbkRlbGV0YWJsZVRleHQgPSB0aGF0Ll9nZXROb25EZWxldGFibGVUZXh0KG1QYXJhbWV0ZXJzLCB2Q29udGV4dHMsIG9SZXNvdXJjZUJ1bmRsZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHMubGVuZ3RoID09IDEpIHtcblx0XHRcdFx0XHRcdFx0Ly9zZXR0aW5nIHRoZSBsb2NrZWQgdGV4dCBpZiBsb2NrZWQgb2JqZWN0cyBleGlzdFxuXHRcdFx0XHRcdFx0XHRpc0xvY2tlZFRleHRWaXNpYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9PTkVfT0JKRUNUX0xPQ0tFRFwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRbbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdFx0Ly9zZXR0aW5nIHRoZSBsb2NrZWQgdGV4dCBpZiBsb2NrZWQgb2JqZWN0cyBleGlzdFxuXHRcdFx0XHRcdFx0XHRpc0xvY2tlZFRleHRWaXNpYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19MT0NLRURcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0W21QYXJhbWV0ZXJzLmxvY2tlZENvbnRleHRzLmxlbmd0aCwgbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoICE9PSBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdFx0KGNhbm5vdEJlRGVsZXRlZFRleHRWaXNpYmxlIHx8IGlzTG9ja2VkVGV4dFZpc2libGUpICYmXG5cdFx0XHRcdFx0XHRcdFx0YURlbGV0YWJsZUNvbnRleHRzLmxlbmd0aCA9PT0gbVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aFxuXHRcdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0XHQvL2lmIG9ubHkgdW5zYXZlZCBhbmQgZWl0aGVyIG9yIGJvdGggb2YgbG9ja2VkIGFuZCBub24tZGVsZXRhYmxlIG9iamVjdHMgZXhpc3QgdGhlbiB3ZSBoaWRlIHRoZSBjaGVjayBib3hcblx0XHRcdFx0XHRcdFx0XHRpc0NoZWNrQm94VmlzaWJsZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzLmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9BTkRfRkVXX09CSkVDVFNfTE9DS0VEX1NJTkdVTEFSXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2UudGV4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfVU5TQVZFRF9BTkRfRkVXX09CSkVDVFNfTE9DS0VEX1BMVVJBTFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGVcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoID09PSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5jaGVja0JveFRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX1VOU0FWRURfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5jaGVja0JveFRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX0ZFV19PQkpFQ1RTX1VOU0FWRURfUExVUkFMXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZVxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0aXNDaGVja0JveFZpc2libGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoY2Fubm90QmVEZWxldGVkVGV4dFZpc2libGUgJiYgaXNMb2NrZWRUZXh0VmlzaWJsZSkge1xuXHRcdFx0XHRcdFx0XHQvL2lmIG5vbi1kZWxldGFibGUgb2JqZWN0cyBleGlzdCBhbG9uZyB3aXRoIGRlbGV0YWJsZSBvYmplY3RzXG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNOb25EZWxldGFibGVDb250ZXh0VGV4dCA9IHRoYXQuX2dldE5vbkRlbGV0YWJsZVRleHQobVBhcmFtZXRlcnMsIHZDb250ZXh0cywgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdFx0XHRcdFx0Ly9pZiBib3RoIGxvY2tlZCBhbmQgbm9uLWRlbGV0YWJsZSBvYmplY3RzIGV4aXN0IGFsb25nIHdpdGggZGVsZXRhYmxlIG9iamVjdHNcblx0XHRcdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCA9XG5cdFx0XHRcdFx0XHRcdFx0XHRzTm9uRGVsZXRhYmxlQ29udGV4dFRleHQgK1xuXHRcdFx0XHRcdFx0XHRcdFx0XCIgXCIgK1xuXHRcdFx0XHRcdFx0XHRcdFx0Q29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9GRVdfT0JKRUNUU19MT0NLRURcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRbbVBhcmFtZXRlcnMubG9ja2VkQ29udGV4dHMubGVuZ3RoLCBtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHNdXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoID09IDEpIHtcblx0XHRcdFx0XHRcdFx0XHRvRGVsZXRlTWVzc2FnZS5ub25EZWxldGFibGVUZXh0ID1cblx0XHRcdFx0XHRcdFx0XHRcdHNOb25EZWxldGFibGVDb250ZXh0VGV4dCArXG5cdFx0XHRcdFx0XHRcdFx0XHRcIiBcIiArXG5cdFx0XHRcdFx0XHRcdFx0XHRDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX09CSkVDVElORk9fQU5EX09ORV9PQkpFQ1RfTE9DS0VEXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0W21QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c11cblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0bGV0IG9Ob25EZWxldGFibGVNZXNzYWdlVGV4dENvbnRyb2wsIG9EZWxldGVNZXNzYWdlVGV4dENvbnRyb2w7XG5cdFx0XHRcdGNvbnN0IG9Db250ZW50ID0gbmV3IFZCb3goe1xuXHRcdFx0XHRcdGl0ZW1zOiBbXG5cdFx0XHRcdFx0XHQob05vbkRlbGV0YWJsZU1lc3NhZ2VUZXh0Q29udHJvbCA9IG5ldyBUZXh0KHtcblx0XHRcdFx0XHRcdFx0dGV4dDogb0RlbGV0ZU1lc3NhZ2Uubm9uRGVsZXRhYmxlVGV4dCxcblx0XHRcdFx0XHRcdFx0dmlzaWJsZTogaXNMb2NrZWRUZXh0VmlzaWJsZSB8fCBjYW5ub3RCZURlbGV0ZWRUZXh0VmlzaWJsZVxuXHRcdFx0XHRcdFx0fSkpLFxuXHRcdFx0XHRcdFx0KG9EZWxldGVNZXNzYWdlVGV4dENvbnRyb2wgPSBuZXcgVGV4dCh7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IG9EZWxldGVNZXNzYWdlLnRleHRcblx0XHRcdFx0XHRcdH0pKSxcblx0XHRcdFx0XHRcdG5ldyBDaGVja0JveCh7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IG9EZWxldGVNZXNzYWdlLmNoZWNrQm94VGV4dCxcblx0XHRcdFx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdHNlbGVjdDogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc2VsZWN0ZWQgPSBvRXZlbnQuZ2V0U291cmNlKCkuZ2V0U2VsZWN0ZWQoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc2VsZWN0ZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IHZDb250ZXh0cy5jb25jYXQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzKTtcblx0XHRcdFx0XHRcdFx0XHRcdGlzQ2hlY2tCb3hTZWxlY3RlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGFEZWxldGFibGVDb250ZXh0cyA9IHZDb250ZXh0cztcblx0XHRcdFx0XHRcdFx0XHRcdGlzQ2hlY2tCb3hTZWxlY3RlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0dmlzaWJsZTogaXNDaGVja0JveFZpc2libGVcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Y29uc3Qgc1RpdGxlID0gb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fREVMRVRFXCIpO1xuXHRcdFx0XHRjb25zdCBmbkNvbmZpcm0gPSBhc3luYyBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0YkRpYWxvZ0NvbmZpcm1lZCA9IHRydWU7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0XHRcdGNvbnN0IGFDb250ZXh0cyA9IGFEZWxldGFibGVDb250ZXh0cztcblxuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgbVBhcmFtZXRlcnMuYmVmb3JlRGVsZXRlQ2FsbEJhY2soeyBjb250ZXh0czogYUNvbnRleHRzIH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y29uc3QgYWN0aXZlQ29udGV4dHMgPSBhd2FpdCB0aGF0LmZpbmRBY3RpdmVEcmFmdFJvb3RDb250ZXh0cyhhQ29udGV4dHMsIG1QYXJhbWV0ZXJzLmJGaW5kQWN0aXZlQ29udGV4dHMpO1xuXG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdFx0XHRhQ29udGV4dHMubWFwKGZ1bmN0aW9uIChvQ29udGV4dDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHQvL2RlbGV0ZSB0aGUgZHJhZnRcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGJFbmFibGVTdHJpY3RIYW5kbGluZyA9IGFDb250ZXh0cy5sZW5ndGggPT09IDEgPyB0cnVlIDogZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZHJhZnQuZGVsZXRlRHJhZnQob0NvbnRleHQsIHRoYXQuX29BcHBDb21wb25lbnQsIGJFbmFibGVTdHJpY3RIYW5kbGluZyk7XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHQvLyByZS10aHJvdyBlcnJvciB0byBlbmZvcmNlIHJlamVjdGluZyB0aGUgZ2VuZXJhbCBwcm9taXNlXG5cdFx0XHRcdFx0XHRcdHRocm93IG9FcnJvcjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNvbnN0IGNoZWNrQm94ID0ge1xuXHRcdFx0XHRcdFx0XHRcImlzQ2hlY2tCb3hWaXNpYmxlXCI6IGlzQ2hlY2tCb3hWaXNpYmxlLFxuXHRcdFx0XHRcdFx0XHRcImlzQ2hlY2tCb3hTZWxlY3RlZFwiOiBpc0NoZWNrQm94U2VsZWN0ZWRcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRpZiAoYWN0aXZlQ29udGV4dHMgJiYgYWN0aXZlQ29udGV4dHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdFx0XHRcdGFjdGl2ZUNvbnRleHRzLm1hcChmdW5jdGlvbiAob0NvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0dGhhdC5hZnRlckRlbGV0ZVByb2Nlc3MobVBhcmFtZXRlcnMsIGNoZWNrQm94LCBhQ29udGV4dHMsIG9SZXNvdXJjZUJ1bmRsZSk7XG5cdFx0XHRcdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHRoYXQuYWZ0ZXJEZWxldGVQcm9jZXNzKG1QYXJhbWV0ZXJzLCBjaGVja0JveCwgYUNvbnRleHRzLCBvUmVzb3VyY2VCdW5kbGUpO1xuXHRcdFx0XHRcdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZURpYWxvZygpO1xuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0XHR0aXRsZTogc1RpdGxlLFxuXHRcdFx0XHRcdHN0YXRlOiBcIldhcm5pbmdcIixcblx0XHRcdFx0XHRjb250ZW50OiBbb0NvbnRlbnRdLFxuXHRcdFx0XHRcdGFyaWFMYWJlbGxlZEJ5OiBvTm9uRGVsZXRhYmxlTWVzc2FnZVRleHRDb250cm9sLmdldFZpc2libGUoKVxuXHRcdFx0XHRcdFx0PyBbb05vbkRlbGV0YWJsZU1lc3NhZ2VUZXh0Q29udHJvbCwgb0RlbGV0ZU1lc3NhZ2VUZXh0Q29udHJvbF1cblx0XHRcdFx0XHRcdDogb0RlbGV0ZU1lc3NhZ2VUZXh0Q29udHJvbCxcblx0XHRcdFx0XHRiZWdpbkJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHR0ZXh0OiBvUmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9ERUxFVEVcIiksXG5cdFx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVCb3VuZFRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdGZuQ29uZmlybSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdGVuZEJ1dHRvbjogbmV3IEJ1dHRvbih7XG5cdFx0XHRcdFx0XHR0ZXh0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfQ09NTU9OX0RJQUxPR19DQU5DRUxcIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdC8vIGlmIGRpYWxvZyBpcyBjbG9zZWQgdW5jb25maXJtZWQgKGUuZy4gdmlhIFwiQ2FuY2VsXCIgb3IgRXNjYXBlIGJ1dHRvbiksIGVuc3VyZSB0byByZWplY3QgcHJvbWlzZVxuXHRcdFx0XHRcdFx0aWYgKCFiRGlhbG9nQ29uZmlybWVkKSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBhcyBhbnkpO1xuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMubm9EaWFsb2cpIHtcblx0XHRcdFx0XHRmbkNvbmZpcm0oKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvRGlhbG9nLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogRWRpdHMgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudFxuXHQgKiBAcGFyYW0gb1ZpZXcgQ3VycmVudCB2aWV3XG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIG5ldyBkcmFmdCBjb250ZXh0IGluIGNhc2Ugb2YgZHJhZnQgcHJvZ3JhbW1pbmcgbW9kZWxcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgZWRpdERvY3VtZW50KG9Db250ZXh0OiBWNENvbnRleHQsIG9WaWV3OiBWaWV3LCBtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIpOiBQcm9taXNlPFY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpO1xuXHRcdH1cblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFZGl0IGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHR0aGlzLl9iSXNNb2RpZmllZCA9IGZhbHNlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHQvLyBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgZWRpdCBhY3Rpb24gd2UnbGwgaGF2ZSB0byByZW1vdmUgYWxsIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXNcblx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvTmV3Q29udGV4dCA9XG5cdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0PyBhd2FpdCBkcmFmdC5jcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChvQ29udGV4dCwgdGhpcy5fZ2V0QXBwQ29tcG9uZW50KCksIHtcblx0XHRcdFx0XHRcdFx0YlByZXNlcnZlQ2hhbmdlczogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0b1ZpZXc6IG9WaWV3XG5cdFx0XHRcdFx0ICB9IGFzIGFueSlcblx0XHRcdFx0XHQ6IGF3YWl0IHN0aWNreS5lZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24ob0NvbnRleHQsIHRoaXMuX2dldEFwcENvbXBvbmVudCgpKTtcblxuXHRcdFx0dGhpcy5fYkNyZWF0ZU1vZGUgPSBmYWxzZTtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKCk7XG5cdFx0XHRyZXR1cm4gb05ld0NvbnRleHQ7XG5cdFx0fSBjYXRjaCAoZXJyOiBhbnkpIHtcblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcyh7IGNvbmN1cnJlbnRFZGl0RmxhZzogdHJ1ZSB9KTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQgKiBDYW5jZWwgJ2VkaXQnIG1vZGUgb2YgYSBkb2N1bWVudC5cblx0ICpcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHBhcmFtIG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGRvY3VtZW50IHRvIGJlIGNhbmNlbGVkIG9yIGRlbGV0ZWRcblx0ICogQHBhcmFtIFttSW5QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gQ2FuY2VsIEJ1dHRvbiBvZiB0aGUgZGlzY2FyZCBwb3BvdmVyIChtYW5kYXRvcnkgZm9yIG5vdylcblx0ICogQHBhcmFtIG1JblBhcmFtZXRlcnMuc2tpcERpc2NhcmRQb3BvdmVyIE9wdGlvbmFsLCBzdXByZXNzZXMgdGhlIGRpc2NhcmQgcG9wb3ZlciBpbmNhc2Ugb2YgZHJhZnQgYXBwbGljYXRpb25zIHdoaWxlIG5hdmlnYXRpbmcgb3V0IG9mIE9QXG5cdCAqIEBwYXJhbSBvUmVzb3VyY2VCdW5kbGVcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCA/Pz9cblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgY2FuY2VsRG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IFY0Q29udGV4dCxcblx0XHRtSW5QYXJhbWV0ZXJzOiB7IGNhbmNlbEJ1dHRvbjogYW55OyBza2lwRGlzY2FyZFBvcG92ZXI6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCxcblx0XHRvUmVzb3VyY2VCdW5kbGU6IGFueSxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KTogUHJvbWlzZTxWNENvbnRleHQgfCBib29sZWFuPiB7XG5cdFx0Ly9jb250ZXh0IG11c3QgYWx3YXlzIGJlIHBhc3NlZCAtIG1hbmRhdG9yeSBwYXJhbWV0ZXJcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJObyBjb250ZXh0IGV4aXN0cy4gUGFzcyBhIG1lYW5pbmdmdWwgY29udGV4dFwiKTtcblx0XHR9XG5cdFx0QnVzeUxvY2tlci5sb2NrKHRoaXMub0xvY2tPYmplY3QpO1xuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtSW5QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblxuXHRcdHRyeSB7XG5cdFx0XHRsZXQgcmV0dXJuZWRWYWx1ZTogVjRDb250ZXh0IHwgYm9vbGVhbiA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgIXRoaXMuX2JJc01vZGlmaWVkKSB7XG5cdFx0XHRcdGNvbnN0IGRyYWZ0RGF0YUNvbnRleHQgPSBvTW9kZWwuYmluZENvbnRleHQoYCR7b0NvbnRleHQuZ2V0UGF0aCgpfS9EcmFmdEFkbWluaXN0cmF0aXZlRGF0YWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRjb25zdCBkcmFmdEFkbWluRGF0YSA9IGF3YWl0IGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpO1xuXHRcdFx0XHRpZiAoZHJhZnRBZG1pbkRhdGEpIHtcblx0XHRcdFx0XHR0aGlzLl9iSXNNb2RpZmllZCA9ICEoZHJhZnRBZG1pbkRhdGEuQ3JlYXRpb25EYXRlVGltZSA9PT0gZHJhZnRBZG1pbkRhdGEuTGFzdENoYW5nZURhdGVUaW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5fc2hvd0Rpc2NhcmRQb3BvdmVyKG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiwgdGhpcy5fYklzTW9kaWZpZWQsIG9SZXNvdXJjZUJ1bmRsZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAob0NvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0XHRvQ29udGV4dC5zZXRLZWVwQWxpdmUoZmFsc2UpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmJlZm9yZUNhbmNlbENhbGxCYWNrKSB7XG5cdFx0XHRcdGF3YWl0IG1QYXJhbWV0ZXJzLmJlZm9yZUNhbmNlbENhbGxCYWNrKHsgY29udGV4dDogb0NvbnRleHQgfSk7XG5cdFx0XHR9XG5cdFx0XHRzd2l0Y2ggKHNQcm9ncmFtbWluZ01vZGVsKSB7XG5cdFx0XHRcdGNhc2UgUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdDpcblx0XHRcdFx0XHRjb25zdCBiSGFzQWN0aXZlRW50aXR5ID0gYXdhaXQgb0NvbnRleHQucmVxdWVzdE9iamVjdChcIkhhc0FjdGl2ZUVudGl0eVwiKTtcblx0XHRcdFx0XHRpZiAoIWJIYXNBY3RpdmVFbnRpdHkpIHtcblx0XHRcdFx0XHRcdGlmIChvQ29udGV4dCAmJiBvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybmVkVmFsdWUgPSBhd2FpdCBkcmFmdC5kZWxldGVEcmFmdChvQ29udGV4dCwgdGhpcy5fb0FwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9TaWJsaW5nQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L1NpYmxpbmdFbnRpdHlgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNDYW5vbmljYWxQYXRoID0gYXdhaXQgb1NpYmxpbmdDb250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCk7XG5cdFx0XHRcdFx0XHRcdGlmIChvQ29udGV4dCAmJiBvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybmVkVmFsdWUgPSBvTW9kZWwuYmluZENvbnRleHQoc0Nhbm9uaWNhbFBhdGgpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgZHJhZnQuZGVsZXRlRHJhZnQob0NvbnRleHQsIHRoaXMuX29BcHBDb21wb25lbnQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFByb2dyYW1taW5nTW9kZWwuU3RpY2t5OlxuXHRcdFx0XHRcdGNvbnN0IGRpc2NhcmRlZENvbnRleHQgPSBhd2FpdCBzdGlja3kuZGlzY2FyZERvY3VtZW50KG9Db250ZXh0KTtcblx0XHRcdFx0XHRpZiAoZGlzY2FyZGVkQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0aWYgKGRpc2NhcmRlZENvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0XHRkaXNjYXJkZWRDb250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICghdGhpcy5fYkNyZWF0ZU1vZGUpIHtcblx0XHRcdFx0XHRcdFx0ZGlzY2FyZGVkQ29udGV4dC5yZWZyZXNoKCk7XG5cdFx0XHRcdFx0XHRcdHJldHVybmVkVmFsdWUgPSBkaXNjYXJkZWRDb250ZXh0O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbmNlbCBkb2N1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fYklzTW9kaWZpZWQgPSBmYWxzZTtcblx0XHRcdC8vIHJlbW92ZSBleGlzdGluZyBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzXG5cdFx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdC8vIHNob3cgdW5ib3VuZCBtZXNzYWdlc1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHRyZXR1cm4gcmV0dXJuZWRWYWx1ZTtcblx0XHR9IGNhdGNoIChlcnI6IGFueSkge1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMub0xvY2tPYmplY3QpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlcyB0aGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBzYXZlZFxuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEBwYXJhbSBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvclxuXHQgKiBAcGFyYW0gYUJpbmRpbmdzXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggPz8/XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIHNhdmVEb2N1bWVudChcblx0XHRvQ29udGV4dDogVjRDb250ZXh0LFxuXHRcdG9SZXNvdXJjZUJ1bmRsZTogYW55LFxuXHRcdGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yOiBhbnksXG5cdFx0YUJpbmRpbmdzOiBhbnksXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyXG5cdCk6IFByb21pc2U8VjRDb250ZXh0PiB7XG5cdFx0aWYgKCFvQ29udGV4dCkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBkcmFmdCBkb2N1bWVudCBpcyByZXF1aXJlZFwiKSk7XG5cdFx0fVxuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5ICYmIHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTYXZlIGlzIG9ubHkgYWxsb3dlZCBmb3IgZHJhZnQgb3Igc3RpY2t5IHNlc3Npb24gc3VwcG9ydGVkIHNlcnZpY2VzXCIpO1xuXHRcdH1cblx0XHQvLyBpbiBjYXNlIG9mIHNhdmluZyAvIGFjdGl2YXRpbmcgdGhlIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXMgc2hhbGwgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIFBBVENIL1BPU1Rcblx0XHQvLyBpcyBzZW50IHRvIHRoZSBiYWNrZW5kXG5cdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cblx0XHR0cnkge1xuXHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoaXMub0xvY2tPYmplY3QpO1xuXHRcdFx0Y29uc3Qgb0FjdGl2ZURvY3VtZW50ID1cblx0XHRcdFx0c1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnRcblx0XHRcdFx0XHQ/IGF3YWl0IGRyYWZ0LmFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIHRoaXMuX2dldEFwcENvbXBvbmVudCgpLCB7fSwgbWVzc2FnZUhhbmRsZXIpXG5cdFx0XHRcdFx0OiBhd2FpdCBzdGlja3kuYWN0aXZhdGVEb2N1bWVudChvQ29udGV4dCwgdGhpcy5fZ2V0QXBwQ29tcG9uZW50KCkpO1xuXG5cdFx0XHRjb25zdCBiTmV3T2JqZWN0ID0gc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5ID8gdGhpcy5fYkNyZWF0ZU1vZGUgOiAhb0NvbnRleHQuZ2V0T2JqZWN0KCkuSGFzQWN0aXZlRW50aXR5O1xuXHRcdFx0Y29uc3QgbWVzc2FnZXNSZWNlaXZlZCA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcygpLmNvbmNhdChtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSkpOyAvLyBnZXQgdW5ib3VuZCBhbmQgYm91bmQgbWVzc2FnZXMgcHJlc2VudCBpbiB0aGUgbW9kZWxcblx0XHRcdGlmICghKG1lc3NhZ2VzUmVjZWl2ZWQubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VzUmVjZWl2ZWRbMF0udHlwZSA9PT0gY29yZUxpYnJhcnkuTWVzc2FnZVR5cGUuU3VjY2VzcykpIHtcblx0XHRcdFx0Ly8gc2hvdyBvdXIgb2JqZWN0IGNyZWF0aW9uIHRvYXN0IG9ubHkgaWYgaXQgaXMgbm90IGNvbWluZyBmcm9tIGJhY2tlbmRcblx0XHRcdFx0TWVzc2FnZVRvYXN0LnNob3coXG5cdFx0XHRcdFx0Yk5ld09iamVjdFxuXHRcdFx0XHRcdFx0PyBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX09CSkVDVF9DUkVBVEVEXCIsIG9SZXNvdXJjZUJ1bmRsZSlcblx0XHRcdFx0XHRcdDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfU0FWRURcIiwgb1Jlc291cmNlQnVuZGxlKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9iSXNNb2RpZmllZCA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudDtcblx0XHR9IGNhdGNoIChlcnI6IGFueSkge1xuXHRcdFx0aWYgKGFCaW5kaW5ncyAmJiBhQmluZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHQvKiBUaGUgc2lkZUVmZmVjdHMgYXJlIGV4ZWN1dGVkIG9ubHkgZm9yIHRhYmxlIGl0ZW1zIGluIHRyYW5zaWVudCBzdGF0ZSAqL1xuXHRcdFx0XHRhQmluZGluZ3MuZm9yRWFjaCgob0xpc3RCaW5kaW5nOiBhbnkpID0+IHtcblx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQob0xpc3RCaW5kaW5nKSAmJiBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcikge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuX2dldEFwcENvbXBvbmVudCgpO1xuXHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5vTG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQgKiBDYWxscyBhIGJvdW5kIG9yIHVuYm91bmQgYWN0aW9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHN0YXRpY1xuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5jYWxsQWN0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlc10gQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZ10gU2tpcHMgdGhlIHBhcmFtZXRlciBkaWFsb2cgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIG9mIHRoZW1cblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jb250ZXh0c10gTWFuZGF0b3J5IGZvciBhIGJvdW5kIGFjdGlvbjogRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubW9kZWxdIE1hbmRhdG9yeSBmb3IgYW4gdW5ib3VuZCBhY3Rpb246IEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nXSBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHRdIElmIHNwZWNpZmllZCwgdGhlIGFjdGlvbiBwcm9taXNlIHJldHVybnMgdGhlIGJvdW5kIGNvbnRleHRcblx0ICogQHBhcmFtIG9WaWV3IENvbnRhaW5zIHRoZSBvYmplY3Qgb2YgdGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJlc3BvbnNlIG9iamVjdHMgKFRPRE86IHRvIGJlIGNoYW5nZWQpXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGNhbGxBY3Rpb24oc0FjdGlvbk5hbWU6IHN0cmluZywgbVBhcmFtZXRlcnM6IGFueSwgb1ZpZXc6IFZpZXcgfCBudWxsLCBtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIpOiBQcm9taXNlPGFueT4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0bGV0IG9Db250ZXh0LCBvTW9kZWw6IGFueTtcblx0XHRjb25zdCBtQmluZGluZ1BhcmFtZXRlcnMgPSBtUGFyYW1ldGVycy5iaW5kaW5nUGFyYW1ldGVycztcblx0XHRpZiAoIXNBY3Rpb25OYW1lKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlIG5hbWUgb2YgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXCIpO1xuXHRcdH1cblx0XHQvLyBhY3Rpb24gaW1wb3J0cyBhcmUgbm90IGRpcmVjdGx5IG9idGFpbmVkIGZyb20gdGhlIG1ldGFNb2RlbCBieSBpdCBpcyBwcmVzZW50IGluc2lkZSB0aGUgZW50aXR5Q29udGFpbmVyXG5cdFx0Ly8gYW5kIHRoZSBhY2lvbnMgaXQgcmVmZXJzIHRvIHByZXNlbnQgb3V0c2lkZSB0aGUgZW50aXR5Y29udGFpbmVyLCBoZW5jZSB0byBvYnRhaW4ga2luZCBvZiB0aGUgYWN0aW9uXG5cdFx0Ly8gc3BsaXQoKSBvbiBpdHMgbmFtZSB3YXMgcmVxdWlyZWRcblx0XHRjb25zdCBzTmFtZSA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiL1wiKVsxXTtcblx0XHRzQWN0aW9uTmFtZSA9IHNOYW1lIHx8IHNBY3Rpb25OYW1lO1xuXHRcdG9Db250ZXh0ID0gc05hbWUgPyB1bmRlZmluZWQgOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHQvL2NoZWNraW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMgYW4gYXJyYXkgd2l0aCBtb3JlIHRoYW4gMCBsZW5ndGggb3Igbm90IGFuIGFycmF5KGNyZWF0ZSBhY3Rpb24pXG5cdFx0aWYgKG9Db250ZXh0ICYmICgoQXJyYXkuaXNBcnJheShvQ29udGV4dCkgJiYgb0NvbnRleHQubGVuZ3RoKSB8fCAhQXJyYXkuaXNBcnJheShvQ29udGV4dCkpKSB7XG5cdFx0XHRvQ29udGV4dCA9IEFycmF5LmlzQXJyYXkob0NvbnRleHQpID8gb0NvbnRleHRbMF0gOiBvQ29udGV4dDtcblx0XHRcdG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5tb2RlbCkge1xuXHRcdFx0b01vZGVsID0gbVBhcmFtZXRlcnMubW9kZWw7XG5cdFx0fVxuXHRcdGlmICghb01vZGVsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQYXNzIGEgY29udGV4dCBmb3IgYSBib3VuZCBhY3Rpb24gb3IgcGFzcyB0aGUgbW9kZWwgZm9yIGFuIHVuYm91bmQgYWN0aW9uXCIpO1xuXHRcdH1cblx0XHQvLyBnZXQgdGhlIGJpbmRpbmcgcGFyYW1ldGVycyAkc2VsZWN0IGFuZCAkZXhwYW5kIGZvciB0aGUgc2lkZSBlZmZlY3Qgb24gdGhpcyBhY3Rpb25cblx0XHQvLyBhbHNvIGdhdGhlciBhZGRpdGlvbmFsIHByb3BlcnR5IHBhdGhzIHRvIGJlIHJlcXVlc3RlZCBzdWNoIGFzIHRleHQgYXNzb2NpYXRpb25zXG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoYXQuX2dldEFwcENvbXBvbmVudCgpO1xuXHRcdGNvbnN0IG1TaWRlRWZmZWN0c1BhcmFtZXRlcnMgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc0FjdGlvbk5hbWUsIG9Db250ZXh0KSB8fCB7fTtcblxuXHRcdGNvbnN0IGRpc3BsYXlVbmFwcGxpY2FibGVDb250ZXh0c0RpYWxvZyA9ICgpOiBQcm9taXNlPFY0Q29udGV4dFtdIHwgdm9pZD4gPT4ge1xuXHRcdFx0aWYgKCFtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dCB8fCBtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShtUGFyYW1ldGVycy5jb250ZXh0cyk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGZuT3BlbkFuZEZpbGxEaWFsb2cgPSBmdW5jdGlvbiAob0RsZzogRGlhbG9nKSB7XG5cdFx0XHRcdFx0bGV0IG9EaWFsb2dDb250ZW50O1xuXHRcdFx0XHRcdGNvbnN0IG5Ob3RBcHBsaWNhYmxlID0gbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHQubGVuZ3RoLFxuXHRcdFx0XHRcdFx0YU5vdEFwcGxpY2FibGVJdGVtcyA9IFtdO1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHQubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdG9EaWFsb2dDb250ZW50ID0gbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRbaV0uZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUl0ZW1zLnB1c2gob0RpYWxvZ0NvbnRlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBvTm90QXBwbGljYWJsZUl0ZW1zTW9kZWwgPSBuZXcgSlNPTk1vZGVsKGFOb3RBcHBsaWNhYmxlSXRlbXMpO1xuXHRcdFx0XHRcdGNvbnN0IG9Ub3RhbHMgPSBuZXcgSlNPTk1vZGVsKHsgdG90YWw6IG5Ob3RBcHBsaWNhYmxlLCBsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwgfSk7XG5cdFx0XHRcdFx0b0RsZy5zZXRNb2RlbChvTm90QXBwbGljYWJsZUl0ZW1zTW9kZWwsIFwibm90QXBwbGljYWJsZVwiKTtcblx0XHRcdFx0XHRvRGxnLnNldE1vZGVsKG9Ub3RhbHMsIFwidG90YWxzXCIpO1xuXHRcdFx0XHRcdG9EbGcub3BlbigpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHQvLyBTaG93IHRoZSBjb250ZXh0cyB0aGF0IGFyZSBub3QgYXBwbGljYWJsZSBhbmQgd2lsbCBub3QgdGhlcmVmb3JlIGJlIHByb2Nlc3NlZFxuXHRcdFx0XHRjb25zdCBzRnJhZ21lbnROYW1lID0gXCJzYXAuZmUuY29yZS5jb250cm9scy5BY3Rpb25QYXJ0aWFsXCI7XG5cdFx0XHRcdGNvbnN0IG9EaWFsb2dGcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpO1xuXHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBzQ2Fub25pY2FsUGF0aCA9IG1QYXJhbWV0ZXJzLmNvbnRleHRzWzBdLmdldENhbm9uaWNhbFBhdGgoKTtcblx0XHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IGAke3NDYW5vbmljYWxQYXRoLnN1YnN0cigwLCBzQ2Fub25pY2FsUGF0aC5pbmRleE9mKFwiKFwiKSl9L2A7XG5cdFx0XHRcdGNvbnN0IG9EaWFsb2dMYWJlbE1vZGVsID0gbmV3IEpTT05Nb2RlbCh7XG5cdFx0XHRcdFx0dGl0bGU6IG1QYXJhbWV0ZXJzLmxhYmVsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0ZyYWdtZW50ID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdFx0XHRvRGlhbG9nRnJhZ21lbnQsXG5cdFx0XHRcdFx0XHR7IG5hbWU6IHNGcmFnbWVudE5hbWUgfSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdFx0ZW50aXR5VHlwZTogb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRW50aXR5U2V0KSxcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogb0RpYWxvZ0xhYmVsTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0XHRcdGVudGl0eVR5cGU6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBvRGlhbG9nTGFiZWxNb2RlbFxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG5cdFx0XHRcdFx0bGV0IG9EaWFsb2c6IERpYWxvZztcblx0XHRcdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IHtcblx0XHRcdFx0XHRcdG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0Ly8gVXNlciBjYW5jZWxzIGFjdGlvblxuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvbkNvbnRpbnVlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFVzZXJzIGNvbnRpbnVlcyB0aGUgYWN0aW9uIHdpdGggdGhlIGJvdW5kIGNvbnRleHRzXG5cdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShtUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRvRGlhbG9nID0gKGF3YWl0IEZyYWdtZW50LmxvYWQoeyBkZWZpbml0aW9uOiBvRnJhZ21lbnQsIGNvbnRyb2xsZXI6IG9Db250cm9sbGVyIH0pKSBhcyBEaWFsb2c7XG5cdFx0XHRcdFx0b0NvbnRyb2xsZXIub25DbG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdC8vIFVzZXIgY2FuY2VscyBhY3Rpb25cblx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdG9Db250cm9sbGVyLm9uQ29udGludWUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHQvLyBVc2VycyBjb250aW51ZXMgdGhlIGFjdGlvbiB3aXRoIHRoZSBib3VuZCBjb250ZXh0c1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShtUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dCk7XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wuYWRkRGVwZW5kZW50KG9EaWFsb2cpO1xuXHRcdFx0XHRcdGZuT3BlbkFuZEZpbGxEaWFsb2cob0RpYWxvZyk7XG5cdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHRcdHJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0dHJ5IHtcblx0XHRcdGxldCBvUmVzdWx0OiBhbnk7XG5cdFx0XHRpZiAob0NvbnRleHQgJiYgb01vZGVsKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRUb1Byb2Nlc3MgPSBhd2FpdCBkaXNwbGF5VW5hcHBsaWNhYmxlQ29udGV4dHNEaWFsb2coKTtcblx0XHRcdFx0aWYgKGNvbnRleHRUb1Byb2Nlc3MpIHtcblx0XHRcdFx0XHRvUmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9ucy5jYWxsQm91bmRBY3Rpb24oc0FjdGlvbk5hbWUsIGNvbnRleHRUb1Byb2Nlc3MsIG9Nb2RlbCwgb0FwcENvbXBvbmVudCwge1xuXHRcdFx0XHRcdFx0cGFyYW1ldGVyVmFsdWVzOiBtUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMsXG5cdFx0XHRcdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IG1QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyxcblx0XHRcdFx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCxcblx0XHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2csXG5cdFx0XHRcdFx0XHRtQmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdGVudGl0eVNldE5hbWU6IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0XHRhZGRpdGlvbmFsU2lkZUVmZmVjdDogbVNpZGVFZmZlY3RzUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdG9uU3VibWl0dGVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b25SZXNwb25zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdFx0Y29udHJvbElkOiBtUGFyYW1ldGVycy5jb250cm9sSWQsXG5cdFx0XHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dDogbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCxcblx0XHRcdFx0XHRcdGJJc0NyZWF0ZUFjdGlvbjogbVBhcmFtZXRlcnMuYklzQ3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRcdFx0YkdldEJvdW5kQ29udGV4dDogbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dCxcblx0XHRcdFx0XHRcdGJPYmplY3RQYWdlOiBtUGFyYW1ldGVycy5iT2JqZWN0UGFnZSxcblx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjogbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0c2VsZWN0ZWRJdGVtczogbVBhcmFtZXRlcnMuY29udGV4dHNcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvUmVzdWx0ID0gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b1Jlc3VsdCA9IGF3YWl0IG9wZXJhdGlvbnMuY2FsbEFjdGlvbkltcG9ydChzQWN0aW9uTmFtZSwgb01vZGVsLCBvQXBwQ29tcG9uZW50LCB7XG5cdFx0XHRcdFx0cGFyYW1ldGVyVmFsdWVzOiBtUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMsXG5cdFx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2csXG5cdFx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRlbnRpdHlTZXROYW1lOiBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdG9uU3VibWl0dGVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvblJlc3BvbnNlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRiT2JqZWN0UGFnZTogbVBhcmFtZXRlcnMuYk9iamVjdFBhZ2Vcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyLCBtUGFyYW1ldGVycywgc0FjdGlvbk5hbWUpO1xuXHRcdFx0cmV0dXJuIG9SZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyOiBhbnkpIHtcblx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyLCBtUGFyYW1ldGVycywgc0FjdGlvbk5hbWUpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0fVxuXHQvKipcblx0ICogSGFuZGxlcyBtZXNzYWdlcyBmb3IgYWN0aW9uIGNhbGwuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlciNfaGFuZGxlQWN0aW9uUmVzcG9uc2Vcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgUGFyYW1ldGVycyB0byBiZSBjb25zaWRlcmVkIGZvciB0aGUgYWN0aW9uLlxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSBhZnRlciBtZXNzYWdlIGRpYWxvZyBpcyBvcGVuZWQgaWYgcmVxdWlyZWQuXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9oYW5kbGVBY3Rpb25SZXNwb25zZShtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsIG1QYXJhbWV0ZXJzOiBhbnksIHNBY3Rpb25OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBhVHJhbnNpZW50TWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSk7XG5cdFx0aWYgKGFUcmFuc2llbnRNZXNzYWdlcy5sZW5ndGggPiAwICYmIG1QYXJhbWV0ZXJzICYmIG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0KSB7XG5cdFx0XHRtUGFyYW1ldGVycy5pbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInNBY3Rpb25OYW1lXCIsIG1QYXJhbWV0ZXJzLmxhYmVsID8gbVBhcmFtZXRlcnMubGFiZWwgOiBzQWN0aW9uTmFtZSk7XG5cdFx0fVxuXHRcdHJldHVybiBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0fVxuXHQvKipcblx0ICogSGFuZGxlcyB2YWxpZGF0aW9uIGVycm9ycyBmb3IgdGhlICdEaXNjYXJkJyBhY3Rpb24uXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlciNoYW5kbGVWYWxpZGF0aW9uRXJyb3Jcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBzdGF0aWNcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0aGFuZGxlVmFsaWRhdGlvbkVycm9yKCkge1xuXHRcdGNvbnN0IG9NZXNzYWdlTWFuYWdlciA9IENvcmUuZ2V0TWVzc2FnZU1hbmFnZXIoKSxcblx0XHRcdGVycm9yVG9SZW1vdmUgPSBvTWVzc2FnZU1hbmFnZXJcblx0XHRcdFx0LmdldE1lc3NhZ2VNb2RlbCgpXG5cdFx0XHRcdC5nZXREYXRhKClcblx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdC8vIG9ubHkgbmVlZHMgdG8gaGFuZGxlIHZhbGlkYXRpb24gbWVzc2FnZXMsIHRlY2huaWNhbCBhbmQgcGVyc2lzdGVudCBlcnJvcnMgbmVlZHMgbm90IHRvIGJlIGNoZWNrZWQgaGVyZS5cblx0XHRcdFx0XHRpZiAoZXJyb3IudmFsaWRhdGlvbikge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0b01lc3NhZ2VNYW5hZ2VyLnJlbW92ZU1lc3NhZ2VzKGVycm9yVG9SZW1vdmUpO1xuXHR9XG5cdC8qKlxuXHQgKiBTaG93cyBhIHBvcG92ZXIgaWYgaXQgbmVlZHMgdG8gYmUgc2hvd24uXG5cdCAqIFRPRE86IFBvcG92ZXIgaXMgc2hvd24gaWYgdXNlciBoYXMgbW9kaWZpZWQgYW55IGRhdGEuXG5cdCAqIFRPRE86IFBvcG92ZXIgaXMgc2hvd24gaWYgdGhlcmUncyBhIGRpZmZlcmVuY2UgZnJvbSBkcmFmdCBhZG1pbiBkYXRhLlxuXHQgKlxuXHQgKiBAc3RhdGljXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLl9zaG93RGlzY2FyZFBvcG92ZXJcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSBvQ2FuY2VsQnV0dG9uIFRoZSBjb250cm9sIHdoaWNoIHdpbGwgb3BlbiB0aGUgcG9wb3ZlclxuXHQgKiBAcGFyYW0gYklzTW9kaWZpZWRcblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZVxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIGlmIHVzZXIgY29uZmlybXMgZGlzY2FyZCwgcmVqZWN0cyBpZiBvdGhlcndpc2UsIHJlamVjdHMgaWYgbm8gY29udHJvbCBwYXNzZWQgdG8gb3BlbiBwb3BvdmVyXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9zaG93RGlzY2FyZFBvcG92ZXIob0NhbmNlbEJ1dHRvbjogYW55LCBiSXNNb2RpZmllZDogYW55LCBvUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdC8vIFRPRE86IEltcGxlbWVudCB0aGlzIHBvcG92ZXIgYXMgYSBmcmFnbWVudCBhcyBpbiB2Mj8/XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0dGhhdC5fYkNvbnRpbnVlRGlzY2FyZCA9IGZhbHNlO1xuXHRcdC8vIHRvIGJlIGltcGxlbWVudGVkXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGlmICghb0NhbmNlbEJ1dHRvbikge1xuXHRcdFx0XHRyZWplY3QoXCJDYW5jZWwgYnV0dG9uIG5vdCBmb3VuZFwiKTtcblx0XHRcdH1cblx0XHRcdC8vU2hvdyBwb3BvdmVyIG9ubHkgd2hlbiBkYXRhIGlzIGNoYW5nZWQuXG5cdFx0XHRpZiAoYklzTW9kaWZpZWQpIHtcblx0XHRcdFx0Y29uc3QgZm5PbkFmdGVyRGlzY2FyZCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRvQ2FuY2VsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7XG5cdFx0XHRcdFx0aWYgKHRoYXQuX2JDb250aW51ZURpc2NhcmQpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVqZWN0KFwiRGlzY2FyZCBvcGVyYXRpb24gd2FzIHJlamVjdGVkLiBEb2N1bWVudCBoYXMgbm90IGJlZW4gZGlzY2FyZGVkXCIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5kZXRhY2hBZnRlckNsb3NlKGZuT25BZnRlckRpc2NhcmQpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAoIXRoYXQuX29Qb3BvdmVyKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb1RleHQgPSBuZXcgVGV4dCh7XG5cdFx0XHRcdFx0XHRcdC8vVGhpcyB0ZXh0IGlzIHRoZSBzYW1lIGFzIExSIHYyLlxuXHRcdFx0XHRcdFx0XHQvL1RPRE86IERpc3BsYXkgbWVzc2FnZSBwcm92aWRlZCBieSBhcHAgZGV2ZWxvcGVyPz8/XG5cdFx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfRFJBRlRfRElTQ0FSRF9NRVNTQUdFXCIsIG9SZXNvdXJjZUJ1bmRsZSlcblx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0b0J1dHRvbiA9IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0XHR0ZXh0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfQlVUVE9OXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdFx0XHRcdHdpZHRoOiBcIjEwMCVcIixcblx0XHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGF0LmhhbmRsZVZhbGlkYXRpb25FcnJvcigpO1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX2JDb250aW51ZURpc2NhcmQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGFyaWFMYWJlbGxlZEJ5OiBvVGV4dFxuXHRcdFx0XHRcdFx0fSBhcyBhbnkpO1xuXHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyID0gbmV3IFBvcG92ZXIoe1xuXHRcdFx0XHRcdFx0c2hvd0hlYWRlcjogZmFsc2UsXG5cdFx0XHRcdFx0XHRwbGFjZW1lbnQ6IFwiVG9wXCIsXG5cdFx0XHRcdFx0XHRjb250ZW50OiBbXG5cdFx0XHRcdFx0XHRcdG5ldyBWQm94KHtcblx0XHRcdFx0XHRcdFx0XHRpdGVtczogW29UZXh0LCBvQnV0dG9uXVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdGJlZm9yZU9wZW46IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0Ly8gbWFrZSBzdXJlIHRvIE5PVCB0cmlnZ2VyIG11bHRpcGxlIGNhbmNlbCBmbG93c1xuXHRcdFx0XHRcdFx0XHRvQ2FuY2VsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5zZXRJbml0aWFsRm9jdXMob0J1dHRvbik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0dGhhdC5fb1BvcG92ZXIuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhhdC5fb1BvcG92ZXIuYXR0YWNoQWZ0ZXJDbG9zZShmbk9uQWZ0ZXJEaXNjYXJkKTtcblx0XHRcdFx0dGhhdC5fb1BvcG92ZXIub3BlbkJ5KG9DYW5jZWxCdXR0b24sIGZhbHNlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoYXQuaGFuZGxlVmFsaWRhdGlvbkVycm9yKCk7XG5cdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogU2V0cyB0aGUgZG9jdW1lbnQgdG8gbW9kaWZpZWQgc3RhdGUgb24gcGF0Y2ggZXZlbnQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLmhhbmRsZURvY3VtZW50TW9kaWZpY2F0aW9uc1xuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0aGFuZGxlRG9jdW1lbnRNb2RpZmljYXRpb25zKCkge1xuXHRcdHRoaXMuX2JJc01vZGlmaWVkID0gdHJ1ZTtcblx0fVxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBvd25lciBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLl9nZXRPd25lckNvbXBvbmVudFxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHJldHVybnMgVGhlIGFwcCBjb21wb25lbnRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X2dldEFwcENvbXBvbmVudCgpIHtcblx0XHRyZXR1cm4gdGhpcy5fb0FwcENvbXBvbmVudDtcblx0fVxuXG5cdF9vbkZpZWxkQ2hhbmdlKG9FdmVudDogYW55LCBvQ3JlYXRlQnV0dG9uOiBhbnksIG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlciwgZm5WYWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllczogRnVuY3Rpb24pIHtcblx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRjb25zdCBvRmllbGQgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0Y29uc3Qgb0ZpZWxkUHJvbWlzZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJwcm9taXNlXCIpO1xuXHRcdGlmIChvRmllbGRQcm9taXNlKSB7XG5cdFx0XHRyZXR1cm4gb0ZpZWxkUHJvbWlzZVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAodmFsdWU6IGFueSkge1xuXHRcdFx0XHRcdC8vIFNldHRpbmcgdmFsdWUgb2YgZmllbGQgYXMgJycgaW4gY2FzZSBvZiB2YWx1ZSBoZWxwIGFuZCB2YWxpZGF0aW5nIG90aGVyIGZpZWxkc1xuXHRcdFx0XHRcdG9GaWVsZC5zZXRWYWx1ZSh2YWx1ZSk7XG5cdFx0XHRcdFx0Zm5WYWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcygpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKHZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRpZiAodmFsdWUgIT09IFwiXCIpIHtcblx0XHRcdFx0XHRcdC8vZGlzYWJsaW5nIHRoZSBjb250aW51ZSBidXR0b24gaW4gY2FzZSBvZiBpbnZhbGlkIHZhbHVlIGluIGZpZWxkXG5cdFx0XHRcdFx0XHRvQ3JlYXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyB2YWxpZGF0aW5nIGFsbCB0aGUgZmllbGRzIGluIGNhc2Ugb2YgZW1wdHkgdmFsdWUgaW4gZmllbGRcblx0XHRcdFx0XHRcdG9GaWVsZC5zZXRWYWx1ZSh2YWx1ZSk7XG5cdFx0XHRcdFx0XHRmblZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH1cblx0X2dldE5vbkRlbGV0YWJsZVRleHQobVBhcmFtZXRlcnM6IGFueSwgdkNvbnRleHRzOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdFx0Y29uc3QgYU5vbkRlbGV0YWJsZUNvbnRleHRzID0gbVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzIC0gdkNvbnRleHRzLmNvbmNhdChtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMpLmxlbmd0aDtcblx0XHRyZXR1cm4gYU5vbkRlbGV0YWJsZUNvbnRleHRzID09PSAxXG5cdFx0XHQ/IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPX0FORF9PTkVfT0JKRUNUX05PTl9ERUxFVEFCTEVcIixcblx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0W21QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0c11cblx0XHRcdCAgKVxuXHRcdFx0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUSU5GT19BTkRfRkVXX09CSkVDVFNfTk9OX0RFTEVUQUJMRVwiLFxuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5udW1iZXJPZlNlbGVjdGVkQ29udGV4dHMgLSB2Q29udGV4dHMuY29uY2F0KG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0cykubGVuZ3RoLFxuXHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMubnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXG5cdFx0XHRcdFx0XVxuXHRcdFx0ICApO1xuXHR9XG5cblx0X2xhdW5jaERpYWxvZ1dpdGhLZXlGaWVsZHMoXG5cdFx0b0xpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdG1GaWVsZHM6IGFueSxcblx0XHRvTW9kZWw6IE9EYXRhTW9kZWwsXG5cdFx0bVBhcmFtZXRlcnM6IGFueSxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KSB7XG5cdFx0bGV0IG9EaWFsb2c6IERpYWxvZztcblx0XHRjb25zdCBvUGFyZW50Q29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2w7XG5cblx0XHQvLyBDcmF0ZSBhIGZha2UgKHRyYW5zaWVudCkgbGlzdEJpbmRpbmcgYW5kIGNvbnRleHQsIGp1c3QgZm9yIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIGRpYWxvZ1xuXHRcdGNvbnN0IG9UcmFuc2llbnRMaXN0QmluZGluZyA9IG9Nb2RlbC5iaW5kTGlzdChvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBvTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLCBbXSwgW10sIHtcblx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJzdWJtaXRMYXRlclwiXG5cdFx0fSkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRvVHJhbnNpZW50TGlzdEJpbmRpbmcucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0LyogKi9cblx0XHR9O1xuXHRcdGNvbnN0IG9UcmFuc2llbnRDb250ZXh0ID0gb1RyYW5zaWVudExpc3RCaW5kaW5nLmNyZWF0ZShtUGFyYW1ldGVycy5kYXRhLCB0cnVlKTtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRjb25zdCBzRnJhZ21lbnROYW1lID0gXCJzYXAvZmUvY29yZS9jb250cm9scy9Ob25Db21wdXRlZFZpc2libGVLZXlGaWVsZHNEaWFsb2dcIjtcblx0XHRcdGNvbnN0IG9GcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpLFxuXHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSBvUGFyZW50Q29udHJvbC5nZXRDb250cm9sbGVyKCkub1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRhSW1tdXRhYmxlRmllbGRzOiBhbnlbXSA9IFtdLFxuXHRcdFx0XHRvQXBwQ29tcG9uZW50ID0gdGhpcy5fZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHNQYXRoID0gKG9MaXN0QmluZGluZy5pc1JlbGF0aXZlKCkgPyBvTGlzdEJpbmRpbmcuZ2V0UmVzb2x2ZWRQYXRoKCkgOiBvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpKSBhcyBzdHJpbmcsXG5cdFx0XHRcdG9FbnRpdHlTZXRDb250ZXh0ID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzUGF0aCkgYXMgQ29udGV4dCxcblx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aCk7XG5cdFx0XHRmb3IgKGNvbnN0IGkgaW4gbUZpZWxkcykge1xuXHRcdFx0XHRhSW1tdXRhYmxlRmllbGRzLnB1c2gob01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgJHtzTWV0YVBhdGh9LyR7bUZpZWxkc1tpXX1gKSk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvSW1tdXRhYmxlQ3R4TW9kZWwgPSBuZXcgSlNPTk1vZGVsKGFJbW11dGFibGVGaWVsZHMpO1xuXHRcdFx0Y29uc3Qgb0ltbXV0YWJsZUN0eCA9IG9JbW11dGFibGVDdHhNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgYXMgQ29udGV4dDtcblx0XHRcdGNvbnN0IGFSZXF1aXJlZFByb3BlcnRpZXMgPSBDb21tb25VdGlscy5nZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zKHNNZXRhUGF0aCwgb01ldGFNb2RlbCk7XG5cdFx0XHRjb25zdCBvUmVxdWlyZWRQcm9wZXJ0eVBhdGhzQ3R4TW9kZWwgPSBuZXcgSlNPTk1vZGVsKGFSZXF1aXJlZFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3Qgb1JlcXVpcmVkUHJvcGVydHlQYXRoc0N0eCA9IG9SZXF1aXJlZFByb3BlcnR5UGF0aHNDdHhNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgYXMgQ29udGV4dDtcblx0XHRcdGNvbnN0IG9OZXdGcmFnbWVudCA9IGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRvRnJhZ21lbnQsXG5cdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IG9FbnRpdHlTZXRDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZmllbGRzOiBvSW1tdXRhYmxlQ3R4LFxuXHRcdFx0XHRcdFx0cmVxdWlyZWRQcm9wZXJ0aWVzOiBvUmVxdWlyZWRQcm9wZXJ0eVBhdGhzQ3R4XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdGVudGl0eVNldDogb0VudGl0eVNldENvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdGZpZWxkczogb0ltbXV0YWJsZUN0eC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0cmVxdWlyZWRQcm9wZXJ0aWVzOiBvUmVxdWlyZWRQcm9wZXJ0eVBhdGhzQ3R4TW9kZWxcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdCk7XG5cblx0XHRcdGxldCBhRm9ybUVsZW1lbnRzOiBhbnlbXSA9IFtdO1xuXHRcdFx0Y29uc3QgbUZpZWxkVmFsdWVNYXA6IGFueSA9IHt9O1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuXHRcdFx0bGV0IG9DcmVhdGVCdXR0b246IEJ1dHRvbjtcblxuXHRcdFx0Y29uc3QgdmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGxldCBiRW5hYmxlZCA9IGZhbHNlO1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IGFSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRhRm9ybUVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdC5tYXAoZnVuY3Rpb24gKG9Gb3JtRWxlbWVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Gb3JtRWxlbWVudC5nZXRGaWVsZHMoKVswXTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob0ZpZWxkOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgY29udGludWUgYnV0dG9uIHNob3VsZCByZW1haW4gZGlzYWJsZWQgaW4gY2FzZSBvZiBlbXB0eSByZXF1aXJlZCBmaWVsZHMuXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRSZXF1aXJlZCgpIHx8IG9GaWVsZC5nZXRWYWx1ZVN0YXRlKCkgPT09IFZhbHVlU3RhdGUuRXJyb3I7XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5tYXAoYXN5bmMgZnVuY3Rpb24gKG9GaWVsZDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc0ZpZWxkSWQgPSBvRmllbGQuZ2V0SWQoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc0ZpZWxkSWQgaW4gbUZpZWxkVmFsdWVNYXApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHZWYWx1ZSA9IGF3YWl0IG1GaWVsZFZhbHVlTWFwW3NGaWVsZElkXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRWYWx1ZSgpID09PSBcIlwiID8gdW5kZWZpbmVkIDogdlZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0VmFsdWUoKSA9PT0gXCJcIiA/IHVuZGVmaW5lZCA6IG9GaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YkVuYWJsZWQgPSBhUmVzdWx0cy5ldmVyeShmdW5jdGlvbiAodlZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZWYWx1ZSkpIHtcblx0XHRcdFx0XHRcdFx0dlZhbHVlID0gdlZhbHVlWzBdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIHZWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZWYWx1ZSAhPT0gbnVsbCAmJiB2VmFsdWUgIT09IFwiXCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRcdGJFbmFibGVkID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0b0NyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkKGJFbmFibGVkKTtcblx0XHRcdH07XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IHtcblx0XHRcdFx0Lypcblx0XHRcdFx0XHRcdFx0XHRcdGZpcmVkIG9uIGZvY3VzIG91dCBmcm9tIGZpZWxkIG9yIG9uIHNlbGVjdGluZyBhIHZhbHVlIGZyb20gdGhlIHZhbHVlaGVscC5cblx0XHRcdFx0XHRcdFx0XHRcdHRoZSBjcmVhdGUgYnV0dG9uIGlzIGVuYWJsZWQgd2hlbiBhIHZhbHVlIGlzIGFkZGVkLlxuXHRcdFx0XHRcdFx0XHRcdFx0bGl2ZUNoYW5nZSBpcyBub3QgZmlyZWQgd2hlbiB2YWx1ZSBpcyBhZGRlZCBmcm9tIHZhbHVlaGVscC5cblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlIHZhbGlkYXRpb24gaXMgbm90IGRvbmUgZm9yIGNyZWF0ZSBidXR0b24gZW5hYmxlbWVudC5cblx0XHRcdFx0XHRcdFx0XHQqL1xuXHRcdFx0XHRoYW5kbGVDaGFuZ2U6IChvRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHNGaWVsZElkID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImlkXCIpO1xuXHRcdFx0XHRcdG1GaWVsZFZhbHVlTWFwW3NGaWVsZElkXSA9IHRoaXMuX29uRmllbGRDaGFuZ2Uob0V2ZW50LCBvQ3JlYXRlQnV0dG9uLCBtZXNzYWdlSGFuZGxlciwgdmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQvKlxuXHRcdFx0XHRcdFx0XHRcdFx0ZmlyZWQgb24ga2V5IHByZXNzLiB0aGUgY3JlYXRlIGJ1dHRvbiBpcyBlbmFibGVkIHdoZW4gYSB2YWx1ZSBpcyBhZGRlZC5cblx0XHRcdFx0XHRcdFx0XHRcdGxpdmVDaGFuZ2UgaXMgbm90IGZpcmVkIHdoZW4gdmFsdWUgaXMgYWRkZWQgZnJvbSB2YWx1ZWhlbHAuXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSB2YWxpZGF0aW9uIGlzIG5vdCBkb25lIGZvciBjcmVhdGUgYnV0dG9uIGVuYWJsZW1lbnQuXG5cdFx0XHRcdFx0XHRcdFx0Ki9cblx0XHRcdFx0aGFuZGxlTGl2ZUNoYW5nZTogKG9FdmVudDogYW55KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgc0ZpZWxkSWQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiaWRcIik7XG5cdFx0XHRcdFx0Y29uc3QgdlZhbHVlID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInZhbHVlXCIpO1xuXHRcdFx0XHRcdG1GaWVsZFZhbHVlTWFwW3NGaWVsZElkXSA9IHZWYWx1ZTtcblx0XHRcdFx0XHR2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCBvRGlhbG9nQ29udGVudDogYW55ID0gYXdhaXQgRnJhZ21lbnQubG9hZCh7XG5cdFx0XHRcdGRlZmluaXRpb246IG9OZXdGcmFnbWVudCxcblx0XHRcdFx0Y29udHJvbGxlcjogb0NvbnRyb2xsZXJcblx0XHRcdH0pO1xuXHRcdFx0bGV0IG9SZXN1bHQ6IGFueTtcblxuXHRcdFx0b0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHR0aXRsZTogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9TQVBGRV9BQ1RJT05fQ1JFQVRFXCIsIG9SZXNvdXJjZUJ1bmRsZSksXG5cdFx0XHRcdGNvbnRlbnQ6IFtvRGlhbG9nQ29udGVudF0sXG5cdFx0XHRcdGJlZ2luQnV0dG9uOiB7XG5cdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9TQVBGRV9BQ1RJT05fQ1JFQVRFX0JVVFRPTlwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdHR5cGU6IFwiRW1waGFzaXplZFwiLFxuXHRcdFx0XHRcdHByZXNzOiBhc3luYyAob0V2ZW50OiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGNyZWF0ZUJ1dHRvbiA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdFx0XHRcdGNyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTtcblx0XHRcdFx0XHRcdEJ1c3lMb2NrZXIubG9jayhvRGlhbG9nKTtcblx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmJJc0NyZWF0ZURpYWxvZyA9IHRydWU7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhVmFsdWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXMobUZpZWxkVmFsdWVNYXApLm1hcChhc3luYyBmdW5jdGlvbiAoc0tleTogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvVmFsdWUgPSBhd2FpdCBtRmllbGRWYWx1ZU1hcFtzS2V5XTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9EaWFsb2dWYWx1ZTogYW55ID0ge307XG5cdFx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nVmFsdWVbc0tleV0gPSBvVmFsdWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb0RpYWxvZ1ZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0XHRcdFx0XHRcdGF3YWl0IHRvRVM2UHJvbWlzZShcblx0XHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IG9MaXN0QmluZGluZyAmJiBvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjcmVhdGVQYXJhbWV0ZXJzOiBhVmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Y29uc3QgdHJhbnNpZW50RGF0YSA9IG9UcmFuc2llbnRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjcmVhdGVEYXRhOiBhbnkgPSB7fTtcblx0XHRcdFx0XHRcdFx0T2JqZWN0LmtleXModHJhbnNpZW50RGF0YSkuZm9yRWFjaChmdW5jdGlvbiAoc1Byb3BlcnR5UGF0aDogc3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1Byb3BlcnR5ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS8ke3NQcm9wZXJ0eVBhdGh9YCk7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gZW5zdXJlIG5hdmlnYXRpb24gcHJvcGVydGllcyBhcmUgbm90IHBhcnQgb2YgdGhlIHBheWxvYWQsIGRlZXAgY3JlYXRlIG5vdCBzdXBwb3J0ZWRcblx0XHRcdFx0XHRcdFx0XHRpZiAob1Byb3BlcnR5ICYmIG9Qcm9wZXJ0eS4ka2luZCA9PT0gXCJOYXZpZ2F0aW9uUHJvcGVydHlcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRjcmVhdGVEYXRhW3NQcm9wZXJ0eVBhdGhdID0gdHJhbnNpZW50RGF0YVtzUHJvcGVydHlQYXRoXTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdEb2N1bWVudENvbnRleHQgPSBvTGlzdEJpbmRpbmcuY3JlYXRlKFxuXHRcdFx0XHRcdFx0XHRcdGNyZWF0ZURhdGEsXG5cdFx0XHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGVBdEVuZCxcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5pbmFjdGl2ZVxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9Qcm9taXNlID0gdGhpcy5vbkFmdGVyQ3JlYXRlQ29tcGxldGlvbihvTGlzdEJpbmRpbmcsIG9OZXdEb2N1bWVudENvbnRleHQsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0XHRcdFx0bGV0IG9SZXNwb25zZTogYW55ID0gYXdhaXQgb1Byb21pc2U7XG5cdFx0XHRcdFx0XHRcdGlmICghb1Jlc3BvbnNlIHx8IChvUmVzcG9uc2UgJiYgb1Jlc3BvbnNlLmJLZWVwRGlhbG9nT3BlbiAhPT0gdHJ1ZSkpIHtcblx0XHRcdFx0XHRcdFx0XHRvUmVzcG9uc2UgPSBvUmVzcG9uc2UgPz8ge307XG5cdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5zZXRCaW5kaW5nQ29udGV4dChudWxsIGFzIGFueSk7XG5cdFx0XHRcdFx0XHRcdFx0b1Jlc3BvbnNlLm5ld0NvbnRleHQgPSBvTmV3RG9jdW1lbnRDb250ZXh0O1xuXHRcdFx0XHRcdFx0XHRcdG9SZXN1bHQgPSB7IHJlc3BvbnNlOiBvUmVzcG9uc2UgfTtcblx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdC8vIGluIGNhc2Ugb2YgY3JlYXRpb24gZmFpbGVkLCBkaWFsb2cgc2hvdWxkIHN0YXkgb3BlbiAtIHRvIGFjaGlldmUgdGhlIHNhbWUsIG5vdGhpbmcgaGFzIHRvIGJlIGRvbmUgKGxpa2UgaW4gY2FzZSBvZiBzdWNjZXNzIHdpdGggYktlZXBEaWFsb2dPcGVuKVxuXHRcdFx0XHRcdFx0XHRpZiAob0Vycm9yICE9PSBGRUxpYnJhcnkuQ29uc3RhbnRzLkNyZWF0aW9uRmFpbGVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gb3RoZXIgZXJyb3JzIGFyZSBub3QgZXhwZWN0ZWRcblx0XHRcdFx0XHRcdFx0XHRvUmVzdWx0ID0geyBlcnJvcjogb0Vycm9yIH07XG5cdFx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvRGlhbG9nKTtcblx0XHRcdFx0XHRcdFx0Y3JlYXRlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0ZW5kQnV0dG9uOiB7XG5cdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX0NPTU1PTl9BQ1RJT05fUEFSQU1FVEVSX0RJQUxPR19DQU5DRUxcIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0b1Jlc3VsdCA9IHsgZXJyb3I6IEZFTGlicmFyeS5Db25zdGFudHMuQ2FuY2VsQWN0aW9uRGlhbG9nIH07XG5cdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Ly8gc2hvdyBmb290ZXIgYXMgcGVyIFVYIGd1aWRlbGluZXMgd2hlbiBkaWFsb2cgaXMgbm90IG9wZW5cblx0XHRcdFx0XHQob0RpYWxvZy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KT8uc2V0UHJvcGVydHkoXCJpc0NyZWF0ZURpYWxvZ09wZW5cIiwgZmFsc2UpO1xuXHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdG9UcmFuc2llbnRMaXN0QmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdFx0aWYgKG9SZXN1bHQuZXJyb3IpIHtcblx0XHRcdFx0XHRcdHJlamVjdChvUmVzdWx0LmVycm9yKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShvUmVzdWx0LnJlc3BvbnNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gYXMgYW55KTtcblx0XHRcdGFGb3JtRWxlbWVudHMgPSBvRGlhbG9nQ29udGVudD8uZ2V0QWdncmVnYXRpb24oXCJmb3JtXCIpLmdldEFnZ3JlZ2F0aW9uKFwiZm9ybUNvbnRhaW5lcnNcIilbMF0uZ2V0QWdncmVnYXRpb24oXCJmb3JtRWxlbWVudHNcIik7XG5cdFx0XHRpZiAob1BhcmVudENvbnRyb2wgJiYgb1BhcmVudENvbnRyb2wuYWRkRGVwZW5kZW50KSB7XG5cdFx0XHRcdC8vIGlmIHRoZXJlIGlzIGEgcGFyZW50IGNvbnRyb2wgc3BlY2lmaWVkIGFkZCB0aGUgZGlhbG9nIGFzIGRlcGVuZGVudFxuXHRcdFx0XHRvUGFyZW50Q29udHJvbC5hZGREZXBlbmRlbnQob0RpYWxvZyk7XG5cdFx0XHR9XG5cdFx0XHRvQ3JlYXRlQnV0dG9uID0gb0RpYWxvZy5nZXRCZWdpbkJ1dHRvbigpO1xuXHRcdFx0b0RpYWxvZy5zZXRCaW5kaW5nQ29udGV4dChvVHJhbnNpZW50Q29udGV4dCk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBDb21tb25VdGlscy5zZXRVc2VyRGVmYXVsdHMoXG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHRhSW1tdXRhYmxlRmllbGRzLFxuXHRcdFx0XHRcdG9UcmFuc2llbnRDb250ZXh0LFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbixcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKCk7XG5cdFx0XHRcdC8vIGZvb3RlciBtdXN0IG5vdCBiZSB2aXNpYmxlIHdoZW4gdGhlIGRpYWxvZyBpcyBvcGVuIGFzIHBlciBVWCBndWlkZWxpbmVzXG5cdFx0XHRcdChvRGlhbG9nLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpLnNldFByb3BlcnR5KFwiaXNDcmVhdGVEaWFsb2dPcGVuXCIsIHRydWUpO1xuXHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0b25BZnRlckNyZWF0ZUNvbXBsZXRpb24ob0xpc3RCaW5kaW5nOiBhbnksIG9OZXdEb2N1bWVudENvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGxldCBmblJlc29sdmU6IEZ1bmN0aW9uO1xuXHRcdGNvbnN0IG9Qcm9taXNlID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcblx0XHRcdGZuUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBmbkNyZWF0ZUNvbXBsZXRlZCA9IChvRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKSxcblx0XHRcdFx0YlN1Y2Nlc3MgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdGlmIChvQ29udGV4dCA9PT0gb05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRvTGlzdEJpbmRpbmcuZGV0YWNoQ3JlYXRlQ29tcGxldGVkKGZuQ3JlYXRlQ29tcGxldGVkLCB0aGlzKTtcblx0XHRcdFx0Zm5SZXNvbHZlKGJTdWNjZXNzKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGNvbnN0IGZuU2FmZUNvbnRleHRDcmVhdGVkID0gKCkgPT4ge1xuXHRcdFx0b05ld0RvY3VtZW50Q29udGV4dFxuXHRcdFx0XHQuY3JlYXRlZCgpXG5cdFx0XHRcdC50aGVuKHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoY29udGV4dEVycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgY3JlYXRpb24gY29udGV4dCBkZWxldGlvbiBlcnJvclwiLCBjb250ZXh0RXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0b0xpc3RCaW5kaW5nLmF0dGFjaENyZWF0ZUNvbXBsZXRlZChmbkNyZWF0ZUNvbXBsZXRlZCwgdGhpcyk7XG5cblx0XHRyZXR1cm4gb1Byb21pc2UudGhlbigoYlN1Y2Nlc3M6IGJvb2xlYW4pID0+IHtcblx0XHRcdGlmICghYlN1Y2Nlc3MpIHtcblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkKSB7XG5cdFx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSBwZW5kaW5nIFBPU1QgYW5kIGRlbGV0ZSB0aGUgY29udGV4dCBpbiB0aGUgbGlzdEJpbmRpbmdcblx0XHRcdFx0XHRmblNhZmVDb250ZXh0Q3JlYXRlZCgpOyAvLyBUbyBhdm9pZCBhICdyZXF1ZXN0IGNhbmNlbGxlZCcgZXJyb3IgaW4gdGhlIGNvbnNvbGVcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0b0xpc3RCaW5kaW5nLmdldE1vZGVsKCkucmVzZXRDaGFuZ2VzKG9MaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKCkpO1xuXG5cdFx0XHRcdFx0dGhyb3cgRkVMaWJyYXJ5LkNvbnN0YW50cy5DcmVhdGlvbkZhaWxlZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4geyBiS2VlcERpYWxvZ09wZW46IHRydWUgfTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBvTmV3RG9jdW1lbnRDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBOZXdBY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLl9nZXROZXdBY3Rpb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSBvU3RhcnR1cFBhcmFtZXRlcnMgU3RhcnR1cCBwYXJhbWV0ZXJzIG9mIHRoZSBhcHBsaWNhdGlvblxuXHQgKiBAcGFyYW0gc0NyZWF0ZUhhc2ggSGFzaCB0byBiZSBjaGVja2VkIGZvciBhY3Rpb24gdHlwZVxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgTWV0YU1vZGVsIHVzZWQgdG8gY2hlY2sgZm9yIE5ld0FjdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHNNZXRhUGF0aCBUaGUgTWV0YVBhdGhcblx0ICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZ2V0TmV3QWN0aW9uKG9TdGFydHVwUGFyYW1ldGVyczogYW55LCBzQ3JlYXRlSGFzaDogc3RyaW5nLCBvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgc01ldGFQYXRoOiBzdHJpbmcpIHtcblx0XHRsZXQgc05ld0FjdGlvbjtcblxuXHRcdGlmIChvU3RhcnR1cFBhcmFtZXRlcnMgJiYgb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGUgJiYgc0NyZWF0ZUhhc2gudG9VcHBlckNhc2UoKS5pbmRleE9mKFwiSS1BQ1RJT049Q1JFQVRFV0lUSFwiKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBzUHJlZmVycmVkTW9kZSA9IG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlWzBdO1xuXHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdHNQcmVmZXJyZWRNb2RlLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihcIkNSRUFURVdJVEg6XCIpID4gLTFcblx0XHRcdFx0XHQ/IHNQcmVmZXJyZWRNb2RlLnN1YnN0cihzUHJlZmVycmVkTW9kZS5sYXN0SW5kZXhPZihcIjpcIikgKyAxKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgJiZcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlICYmXG5cdFx0XHRzQ3JlYXRlSGFzaC50b1VwcGVyQ2FzZSgpLmluZGV4T2YoXCJJLUFDVElPTj1BVVRPQ1JFQVRFV0lUSFwiKSA+IC0xXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBzUHJlZmVycmVkTW9kZSA9IG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlWzBdO1xuXHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdHNQcmVmZXJyZWRNb2RlLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihcIkFVVE9DUkVBVEVXSVRIOlwiKSA+IC0xXG5cdFx0XHRcdFx0PyBzUHJlZmVycmVkTW9kZS5zdWJzdHIoc1ByZWZlcnJlZE1vZGUubGFzdEluZGV4T2YoXCI6XCIpICsgMSlcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRPYmplY3QgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdD8gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvTmV3QWN0aW9uYCkgfHxcblx0XHRcdFx0XHQgIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9OZXdBY3Rpb25gKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gc05ld0FjdGlvbjtcblx0fVxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBsYWJlbCBmb3IgdGhlIHRpdGxlIG9mIGEgc3BlY2lmaWMgY3JlYXRlIGFjdGlvbiBkaWFsb2csIGUuZy4gQ3JlYXRlIFNhbGVzIE9yZGVyIGZyb20gUXVvdGF0aW9uLlxuXHQgKlxuXHQgKiBUaGUgZm9sbG93aW5nIHByaW9yaXR5IGlzIGFwcGxpZWQ6XG5cdCAqIDEuIGxhYmVsIG9mIGxpbmUtaXRlbSBhbm5vdGF0aW9uLlxuXHQgKiAyLiBsYWJlbCBhbm5vdGF0ZWQgaW4gdGhlIGFjdGlvbi5cblx0ICogMy4gXCJDcmVhdGVcIiBhcyBhIGNvbnN0YW50IGZyb20gaTE4bi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWxcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBNZXRhTW9kZWwgdXNlZCB0byBjaGVjayBmb3IgdGhlIE5ld0FjdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHNNZXRhUGF0aCBUaGUgTWV0YVBhdGhcblx0ICogQHBhcmFtIHNOZXdBY3Rpb24gQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlQ29yZSBSZXNvdXJjZUJ1bmRsZSB0byBhY2Nlc3MgdGhlIGRlZmF1bHQgQ3JlYXRlIGxhYmVsXG5cdCAqIEByZXR1cm5zIFRoZSBsYWJlbCBmb3IgdGhlIENyZWF0ZSBBY3Rpb24gRGlhbG9nXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKFxuXHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRcdHNNZXRhUGF0aDogc3RyaW5nLFxuXHRcdHNOZXdBY3Rpb246IHN0cmluZyxcblx0XHRvUmVzb3VyY2VCdW5kbGVDb3JlOiBSZXNvdXJjZUJ1bmRsZVxuXHQpIHtcblx0XHRjb25zdCBmbkdldExhYmVsRnJvbUxpbmVJdGVtQW5ub3RhdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmIChvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtYCkpIHtcblx0XHRcdFx0Y29uc3QgaUxpbmVJdGVtSW5kZXggPSBvTWV0YU1vZGVsXG5cdFx0XHRcdFx0LmdldE9iamVjdChgJHtzTWV0YVBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5MaW5lSXRlbWApXG5cdFx0XHRcdFx0LmZpbmRJbmRleChmdW5jdGlvbiAob0xpbmVJdGVtOiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGFMaW5lSXRlbUFjdGlvbiA9IG9MaW5lSXRlbS5BY3Rpb24gPyBvTGluZUl0ZW0uQWN0aW9uLnNwbGl0KFwiKFwiKSA6IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdHJldHVybiBhTGluZUl0ZW1BY3Rpb24gPyBhTGluZUl0ZW1BY3Rpb25bMF0gPT09IHNOZXdBY3Rpb24gOiBmYWxzZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIGlMaW5lSXRlbUluZGV4ID4gLTFcblx0XHRcdFx0XHQ/IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtYClbaUxpbmVJdGVtSW5kZXhdLkxhYmVsXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0Zm5HZXRMYWJlbEZyb21MaW5lSXRlbUFubm90YXRpb24oKSB8fFxuXHRcdFx0KG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS8ke3NOZXdBY3Rpb259QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5MYWJlbGApKSB8fFxuXHRcdFx0KG9SZXNvdXJjZUJ1bmRsZUNvcmUgJiYgb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfU0FQRkVfQUNUSU9OX0NSRUFURVwiKSlcblx0XHQpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRyYW5zYWN0aW9uSGVscGVyO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7O0VBa2pCTyxnQkFBZ0JBLElBQWhCLEVBQXNCQyxPQUF0QixFQUErQjtJQUNyQyxJQUFJO01BQ0gsSUFBSUMsTUFBTSxHQUFHRixJQUFJLEVBQWpCO0lBQ0EsQ0FGRCxD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
|
|
1482
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiZmluYWxpemVyIiwiYmluZCIsIkNyZWF0aW9uTW9kZSIsIkZFTGlicmFyeSIsIlByb2dyYW1taW5nTW9kZWwiLCJWYWx1ZVN0YXRlIiwiY29yZUxpYnJhcnkiLCJnZXRQYXJhbWV0ZXJzIiwibVBhcmFtZXRlcnMiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJUcmFuc2FjdGlvbkhlbHBlciIsIm9BcHBDb21wb25lbnQiLCJvTG9ja09iamVjdCIsIl9vQXBwQ29tcG9uZW50IiwiZ2V0UHJvZ3JhbW1pbmdNb2RlbCIsIm9Db250ZXh0Iiwic1Byb2dyYW1taW5nTW9kZWwiLCJzUGF0aCIsImlzQSIsImdldFBhdGgiLCJpc1JlbGF0aXZlIiwiZ2V0UmVzb2x2ZWRQYXRoIiwiTW9kZWxIZWxwZXIiLCJpc0RyYWZ0U3VwcG9ydGVkIiwiZ2V0TW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJEcmFmdCIsImlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsIlN0aWNreSIsIk5vbkRyYWZ0IiwidmFsaWRhdGVEb2N1bWVudCIsIm9WaWV3Iiwic0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsImN1c3RvbVZhbGlkYXRpb25GdW5jdGlvbiIsInNNb2R1bGUiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsInJlcGxhY2UiLCJzRnVuY3Rpb25OYW1lIiwibGVuZ3RoIiwibURhdGEiLCJkYXRhIiwiRlBNSGVscGVyIiwidmFsaWRhdGlvbldyYXBwZXIiLCJQcm9taXNlIiwicmVzb2x2ZSIsImNyZWF0ZURvY3VtZW50Iiwib01haW5MaXN0QmluZGluZyIsIm1JblBhcmFtZXRlcnMiLCJvUmVzb3VyY2VCdW5kbGUiLCJtZXNzYWdlSGFuZGxlciIsImJGcm9tQ29weVBhc3RlIiwib01vZGVsIiwib01ldGFNb2RlbCIsInNNZXRhUGF0aCIsImdldE1ldGFQYXRoIiwiZ2V0SGVhZGVyQ29udGV4dCIsInNDcmVhdGVIYXNoIiwiX2dldEFwcENvbXBvbmVudCIsImdldFJvdXRlclByb3h5IiwiZ2V0SGFzaCIsIm9Db21wb25lbnREYXRhIiwiZ2V0Q29tcG9uZW50RGF0YSIsIm9TdGFydHVwUGFyYW1ldGVycyIsInN0YXJ0dXBQYXJhbWV0ZXJzIiwic05ld0FjdGlvbiIsIl9nZXROZXdBY3Rpb24iLCJ1bmRlZmluZWQiLCJtQmluZGluZ1BhcmFtZXRlcnMiLCIkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzIiwic01lc3NhZ2VzUGF0aCIsImdldE9iamVjdCIsInNCdXN5UGF0aCIsImdldFRhcmdldEVudGl0eVNldCIsImdldENvbnRleHQiLCJiRnVuY3Rpb25Pbk5hdlByb3AiLCJvTmV3RG9jdW1lbnRDb250ZXh0IiwiRXJyb3IiLCJidXN5TW9kZSIsImJ1c3lJZCIsImJlZm9yZUNyZWF0ZUNhbGxCYWNrIiwiQnVzeUxvY2tlciIsImxvY2siLCJvUmVzb3VyY2VCdW5kbGVDb3JlIiwiQ29yZSIsImdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZSIsIm9SZXN1bHQiLCJzaG93TWVzc2FnZURpYWxvZyIsImNvbnRyb2wiLCJwYXJlbnRDb250cm9sIiwiY2FsbEFjdGlvbiIsImNvbnRleHRzIiwic2hvd0FjdGlvblBhcmFtZXRlckRpYWxvZyIsImxhYmVsIiwiX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWwiLCJiaW5kaW5nUGFyYW1ldGVycyIsImJJc0NyZWF0ZUFjdGlvbiIsInNraXBQYXJhbWV0ZXJEaWFsb2ciLCJiSXNOZXdQYWdlQ3JlYXRpb24iLCJjcmVhdGlvbk1vZGUiLCJDcmVhdGlvblJvdyIsIklubGluZSIsImFOb25Db21wdXRlZFZpc2libGVLZXlGaWVsZHMiLCJDb21tb25VdGlscyIsImdldE5vbkNvbXB1dGVkVmlzaWJsZUZpZWxkcyIsInNGdW5jdGlvblBhdGgiLCJvRnVuY3Rpb25Db250ZXh0Iiwib0Z1bmN0aW9uIiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJvRGF0YSIsIk9iamVjdCIsImFzc2lnbiIsIl9sYXVuY2hEaWFsb2dXaXRoS2V5RmllbGRzIiwibmV3Q29udGV4dCIsImNyZWF0ZSIsImNyZWF0ZUF0RW5kIiwiaW5hY3RpdmUiLCJvbkFmdGVyQ3JlYXRlQ29tcGxldGlvbiIsInRvRVM2UHJvbWlzZSIsImNvbnRleHRQYXRoIiwiJElzQm91bmQiLCJvcGVyYXRpb25zIiwiY2FsbEJvdW5kRnVuY3Rpb24iLCJjYWxsRnVuY3Rpb25JbXBvcnQiLCJvRXJyb3IiLCJMb2ciLCJlcnJvciIsIkNvbnN0YW50cyIsIkFjdGlvbkV4ZWN1dGlvbkZhaWxlZCIsIkNhbmNlbEFjdGlvbkRpYWxvZyIsImlzVHJhbnNpZW50IiwiZGVsZXRlIiwidW5sb2NrIiwiZmluZEFjdGl2ZURyYWZ0Um9vdENvbnRleHRzIiwiYUNvbnRleHRzIiwiYkZpbmRBY3RpdmVDb250ZXh0cyIsImFjdGl2ZUNvbnRleHRzIiwicmVkdWNlIiwiYVJlc3VsdCIsImJJc0FjdGl2ZUVudGl0eSIsIklzQWN0aXZlRW50aXR5IiwiYkhhc0FjdGl2ZUVudGl0eSIsIkhhc0FjdGl2ZUVudGl0eSIsIm9BY3RpdmVDb250ZXh0IiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJwdXNoIiwiYWxsIiwibWFwIiwicmVxdWVzdENhbm9uaWNhbFBhdGgiLCJfaXNEcmFmdEVuYWJsZWQiLCJ2Q29udGV4dHMiLCJjb250ZXh0Rm9yRHJhZnRNb2RlbCIsInVuU2F2ZWRDb250ZXh0cyIsImRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUiLCJkcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlIiwiY3JlYXRlTW9kZUNvbnRleHRzIiwiZGVsZXRlRG9jdW1lbnQiLCJ2SW5Db250ZXh0cyIsImJEaWFsb2dDb25maXJtZWQiLCJ0aGF0IiwiYVBhcmFtcyIsIkFycmF5IiwiaXNBcnJheSIsInJlamVjdCIsImRyYWZ0RW5hYmxlZCIsIml0ZW1zIiwib3B0aW9ucyIsIm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyIsImkiLCJvQ29udGV4dERhdGEiLCJIYXNEcmFmdEVudGl0eSIsIkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhIiwiSW5Qcm9jZXNzQnlVc2VyIiwiRHJhZnRJc0NyZWF0ZWRCeU1lIiwic0xvY2tlZFVzZXIiLCJkcmFmdEFkbWluRGF0YSIsIk1lc3NhZ2VCb3giLCJzaG93IiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJ0aXRsZSIsImdldFRleHQiLCJvbkNsb3NlIiwibm9uVGFibGVUeHQiLCJkZXNjcmlwdGlvbiIsImVudGl0eVNldE5hbWUiLCJ0eXBlIiwidGV4dCIsInNlbGVjdGVkIiwidG90YWxEZWxldGFibGUiLCJkZWxldGVIZWxwZXIiLCJ1cGRhdGVEcmFmdE9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyIsInVwZGF0ZU9wdGlvbnNGb3JEZWxldGFibGVUZXh0cyIsInVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2ciLCJ2Qm94IiwiVkJveCIsInNUaXRsZSIsImZuQ29uZmlybSIsImRlbGV0ZUNvbmZpcm1IYW5kbGVyIiwib0RpYWxvZyIsIkRpYWxvZyIsInN0YXRlIiwiY29udGVudCIsImFyaWFMYWJlbGxlZEJ5IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJwcmVzcyIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZUJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzIiwiY2xvc2UiLCJlbmRCdXR0b24iLCJhZnRlckNsb3NlIiwiZGVzdHJveSIsIm5vRGlhbG9nIiwiYWRkU3R5bGVDbGFzcyIsIm9wZW4iLCJlZGl0RG9jdW1lbnQiLCJyZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMiLCJkcmFmdCIsImNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50IiwiYlByZXNlcnZlQ2hhbmdlcyIsInN0aWNreSIsImVkaXREb2N1bWVudEluU3RpY2t5U2Vzc2lvbiIsIm9OZXdDb250ZXh0IiwiZXJyIiwic2hvd01lc3NhZ2VzIiwiY29uY3VycmVudEVkaXRGbGFnIiwiY2FuY2VsRG9jdW1lbnQiLCJpc05ld09iamVjdCIsImlzT2JqZWN0TW9kaWZpZWQiLCJyZXR1cm5lZFZhbHVlIiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwiZGVsZXRlRHJhZnQiLCJvU2libGluZ0NvbnRleHQiLCJzQ2Fub25pY2FsUGF0aCIsImRpc2NhcmREb2N1bWVudCIsImRpc2NhcmRlZENvbnRleHQiLCJyZWZyZXNoIiwiaXNLZWVwQWxpdmUiLCJzZXRLZWVwQWxpdmUiLCJiZWZvcmVDYW5jZWxDYWxsQmFjayIsImNvbnRleHQiLCJza2lwRGlzY2FyZFBvcG92ZXIiLCJfc2hvd0Rpc2NhcmRQb3BvdmVyIiwiY2FuY2VsQnV0dG9uIiwiZHJhZnREYXRhQ29udGV4dCIsInJlcXVlc3RPYmplY3QiLCJDcmVhdGlvbkRhdGVUaW1lIiwiTGFzdENoYW5nZURhdGVUaW1lIiwic2F2ZURvY3VtZW50IiwiYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJhQmluZGluZ3MiLCJhY3RpdmF0ZURvY3VtZW50Iiwib0FjdGl2ZURvY3VtZW50IiwibWVzc2FnZXNSZWNlaXZlZCIsImdldE1lc3NhZ2VzIiwiY29uY2F0IiwiTWVzc2FnZVR5cGUiLCJTdWNjZXNzIiwiTWVzc2FnZVRvYXN0IiwiZm9yRWFjaCIsIm9MaXN0QmluZGluZyIsImhhc1RyYW5zaWVudENvbnRleHQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkiLCJzQWN0aW9uTmFtZSIsInNOYW1lIiwic3BsaXQiLCJtb2RlbCIsIm1TaWRlRWZmZWN0c1BhcmFtZXRlcnMiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwiZGlzcGxheVVuYXBwbGljYWJsZUNvbnRleHRzRGlhbG9nIiwibm90QXBwbGljYWJsZUNvbnRleHQiLCJmbk9wZW5BbmRGaWxsRGlhbG9nIiwib0RsZyIsIm9EaWFsb2dDb250ZW50Iiwibk5vdEFwcGxpY2FibGUiLCJhTm90QXBwbGljYWJsZUl0ZW1zIiwib05vdEFwcGxpY2FibGVJdGVtc01vZGVsIiwiSlNPTk1vZGVsIiwib1RvdGFscyIsInRvdGFsIiwic2V0TW9kZWwiLCJzRnJhZ21lbnROYW1lIiwib0RpYWxvZ0ZyYWdtZW50IiwiWE1MVGVtcGxhdGVQcm9jZXNzb3IiLCJsb2FkVGVtcGxhdGUiLCJnZXRDYW5vbmljYWxQYXRoIiwic0VudGl0eVNldCIsInN1YnN0ciIsImluZGV4T2YiLCJvRGlhbG9nTGFiZWxNb2RlbCIsIlhNTFByZXByb2Nlc3NvciIsInByb2Nlc3MiLCJuYW1lIiwiYmluZGluZ0NvbnRleHRzIiwiZW50aXR5VHlwZSIsIm1vZGVscyIsIm1ldGFNb2RlbCIsIm9GcmFnbWVudCIsIm9Db250cm9sbGVyIiwib25Db250aW51ZSIsImFwcGxpY2FibGVDb250ZXh0IiwiRnJhZ21lbnQiLCJsb2FkIiwiZGVmaW5pdGlvbiIsImNvbnRyb2xsZXIiLCJhZGREZXBlbmRlbnQiLCJfaGFuZGxlQWN0aW9uUmVzcG9uc2UiLCJjb250ZXh0VG9Qcm9jZXNzIiwiY2FsbEJvdW5kQWN0aW9uIiwicGFyYW1ldGVyVmFsdWVzIiwiaW52b2NhdGlvbkdyb3VwaW5nIiwiYWRkaXRpb25hbFNpZGVFZmZlY3QiLCJvblN1Ym1pdHRlZCIsIm9uUmVzcG9uc2UiLCJjb250cm9sSWQiLCJpbnRlcm5hbE1vZGVsQ29udGV4dCIsIm9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsImJHZXRCb3VuZENvbnRleHQiLCJiT2JqZWN0UGFnZSIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsInNlbGVjdGVkSXRlbXMiLCJjYWxsQWN0aW9uSW1wb3J0IiwiYVRyYW5zaWVudE1lc3NhZ2VzIiwiYWN0aW9uTmFtZSIsInNldFByb3BlcnR5IiwiYnlJZCIsImhhbmRsZVZhbGlkYXRpb25FcnJvciIsIm9NZXNzYWdlTWFuYWdlciIsImdldE1lc3NhZ2VNYW5hZ2VyIiwiZXJyb3JUb1JlbW92ZSIsImdldE1lc3NhZ2VNb2RlbCIsImdldERhdGEiLCJmaWx0ZXIiLCJ2YWxpZGF0aW9uIiwicmVtb3ZlTWVzc2FnZXMiLCJvQ2FuY2VsQnV0dG9uIiwiYklzTW9kaWZpZWQiLCJmbk9uQWZ0ZXJEaXNjYXJkIiwic2V0RW5hYmxlZCIsIl9vUG9wb3ZlciIsImRldGFjaEFmdGVyQ2xvc2UiLCJvVGV4dCIsIlRleHQiLCJvQnV0dG9uIiwid2lkdGgiLCJQb3BvdmVyIiwic2hvd0hlYWRlciIsInBsYWNlbWVudCIsImJlZm9yZU9wZW4iLCJzZXRJbml0aWFsRm9jdXMiLCJhdHRhY2hBZnRlckNsb3NlIiwib3BlbkJ5IiwiX29uRmllbGRDaGFuZ2UiLCJvRXZlbnQiLCJvQ3JlYXRlQnV0dG9uIiwiZm5WYWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcyIsIm9GaWVsZCIsImdldFNvdXJjZSIsIm9GaWVsZFByb21pc2UiLCJnZXRQYXJhbWV0ZXIiLCJ2YWx1ZSIsInNldFZhbHVlIiwiZ2V0VmFsdWUiLCJjYXRjaCIsIm1GaWVsZHMiLCJvUGFyZW50Q29udHJvbCIsIm9UcmFuc2llbnRMaXN0QmluZGluZyIsImJpbmRMaXN0IiwiJCR1cGRhdGVHcm91cElkIiwicmVmcmVzaEludGVybmFsIiwib1RyYW5zaWVudENvbnRleHQiLCJnZXRDb250cm9sbGVyIiwiYUltbXV0YWJsZUZpZWxkcyIsIm9FbnRpdHlTZXRDb250ZXh0Iiwib0ltbXV0YWJsZUN0eE1vZGVsIiwib0ltbXV0YWJsZUN0eCIsImFSZXF1aXJlZFByb3BlcnRpZXMiLCJnZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zIiwib1JlcXVpcmVkUHJvcGVydHlQYXRoc0N0eE1vZGVsIiwib1JlcXVpcmVkUHJvcGVydHlQYXRoc0N0eCIsImVudGl0eVNldCIsImZpZWxkcyIsInJlcXVpcmVkUHJvcGVydGllcyIsIm9OZXdGcmFnbWVudCIsImFGb3JtRWxlbWVudHMiLCJtRmllbGRWYWx1ZU1hcCIsInZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzIiwiYkVuYWJsZWQiLCJvRm9ybUVsZW1lbnQiLCJnZXRGaWVsZHMiLCJnZXRSZXF1aXJlZCIsImdldFZhbHVlU3RhdGUiLCJzRmllbGRJZCIsImdldElkIiwidlZhbHVlIiwiYVJlc3VsdHMiLCJldmVyeSIsImhhbmRsZUNoYW5nZSIsImhhbmRsZUxpdmVDaGFuZ2UiLCJjbG9zZURpYWxvZyIsInJlc3BvbnNlIiwiZ2VuZXJhdGUiLCJjcmVhdGVCdXR0b24iLCJiSXNDcmVhdGVEaWFsb2ciLCJrZXlzIiwic0tleSIsIm9WYWx1ZSIsIm9EaWFsb2dWYWx1ZSIsImFWYWx1ZXMiLCJ0cmFuc2llbnREYXRhIiwiY3JlYXRlRGF0YSIsInNQcm9wZXJ0eVBhdGgiLCJvUHJvcGVydHkiLCIka2luZCIsIm9Qcm9taXNlIiwib1Jlc3BvbnNlIiwiYktlZXBEaWFsb2dPcGVuIiwic2V0QmluZGluZ0NvbnRleHQiLCJjcmVhdGVQYXJhbWV0ZXJzIiwiQ3JlYXRpb25GYWlsZWQiLCJnZXRCaW5kaW5nQ29udGV4dCIsImdldEFnZ3JlZ2F0aW9uIiwiZ2V0QmVnaW5CdXR0b24iLCJzZXRVc2VyRGVmYXVsdHMiLCJjcmVhdGVBY3Rpb24iLCJmblJlc29sdmUiLCJmbkNyZWF0ZUNvbXBsZXRlZCIsImJTdWNjZXNzIiwiZGV0YWNoQ3JlYXRlQ29tcGxldGVkIiwiZm5TYWZlQ29udGV4dENyZWF0ZWQiLCJjcmVhdGVkIiwidHJhY2UiLCJjb250ZXh0RXJyb3IiLCJhdHRhY2hDcmVhdGVDb21wbGV0ZWQiLCJrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkIiwiZ2V0VXBkYXRlR3JvdXBJZCIsInByZWZlcnJlZE1vZGUiLCJ0b1VwcGVyQ2FzZSIsInNQcmVmZXJyZWRNb2RlIiwiZm5HZXRMYWJlbEZyb21MaW5lSXRlbUFubm90YXRpb24iLCJpTGluZUl0ZW1JbmRleCIsImZpbmRJbmRleCIsIm9MaW5lSXRlbSIsImFMaW5lSXRlbUFjdGlvbiIsIkFjdGlvbiIsIkxhYmVsIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJUcmFuc2FjdGlvbkhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCBkcmFmdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvZWRpdEZsb3cvZHJhZnRcIjtcbmltcG9ydCBvcGVyYXRpb25zIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9vcGVyYXRpb25zXCI7XG5pbXBvcnQgc3RpY2t5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9zdGlja3lcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2VIYW5kbGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvbWVzc2FnZUhhbmRsZXIvbWVzc2FnZUhhbmRsaW5nXCI7XG5pbXBvcnQgZGVsZXRlSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0RlbGV0ZUhlbHBlclwiO1xuaW1wb3J0IEZQTUhlbHBlciBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9GUE1IZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgSW50ZXJuYWxNb2RlbENvbnRleHQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9Nb2RlbEhlbHBlclwiO1xuaW1wb3J0IE1vZGVsSGVscGVyIGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1N0YWJsZUlkSGVscGVyXCI7XG5pbXBvcnQgRkVMaWJyYXJ5IGZyb20gXCJzYXAvZmUvY29yZS9saWJyYXJ5XCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBEaWFsb2cgZnJvbSBcInNhcC9tL0RpYWxvZ1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCBNZXNzYWdlVG9hc3QgZnJvbSBcInNhcC9tL01lc3NhZ2VUb2FzdFwiO1xuaW1wb3J0IFBvcG92ZXIgZnJvbSBcInNhcC9tL1BvcG92ZXJcIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgVkJveCBmcm9tIFwic2FwL20vVkJveFwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCBGcmFnbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRnJhZ21lbnRcIjtcbmltcG9ydCBjb3JlTGlicmFyeSBmcm9tIFwic2FwL3VpL2NvcmUvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgWE1MVGVtcGxhdGVQcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL1hNTFRlbXBsYXRlUHJvY2Vzc29yXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBPRGF0YVY0Q29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IE9EYXRhTGlzdEJpbmRpbmcsIFY0Q29udGV4dCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcbmltcG9ydCB0b0VTNlByb21pc2UgZnJvbSBcIi4uLy4uL2hlbHBlcnMvVG9FUzZQcm9taXNlXCI7XG5cbmNvbnN0IENyZWF0aW9uTW9kZSA9IEZFTGlicmFyeS5DcmVhdGlvbk1vZGU7XG5jb25zdCBQcm9ncmFtbWluZ01vZGVsID0gRkVMaWJyYXJ5LlByb2dyYW1taW5nTW9kZWw7XG5jb25zdCBWYWx1ZVN0YXRlID0gY29yZUxpYnJhcnkuVmFsdWVTdGF0ZTtcbi8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBtUGFyYW1ldGVycyBpcyBub3QgdGhlIG9FdmVudCAqL1xuZnVuY3Rpb24gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVyczogYW55KSB7XG5cdGlmIChtUGFyYW1ldGVycyAmJiBtUGFyYW1ldGVycy5nZXRNZXRhZGF0YSAmJiBtUGFyYW1ldGVycy5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKSA9PT0gXCJzYXAudWkuYmFzZS5FdmVudFwiKSB7XG5cdFx0bVBhcmFtZXRlcnMgPSB7fTtcblx0fVxuXHRyZXR1cm4gbVBhcmFtZXRlcnMgfHwge307XG59XG5cbmNsYXNzIFRyYW5zYWN0aW9uSGVscGVyIHtcblx0X29BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudDtcblx0b0xvY2tPYmplY3Q6IGFueTtcblx0c1Byb2dyYW1taW5nTW9kZWw/OiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbDtcblx0X29Qb3BvdmVyITogUG9wb3Zlcjtcblx0Y29uc3RydWN0b3Iob0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBvTG9ja09iamVjdDogYW55KSB7XG5cdFx0dGhpcy5fb0FwcENvbXBvbmVudCA9IG9BcHBDb21wb25lbnQ7XG5cdFx0dGhpcy5vTG9ja09iamVjdCA9IG9Mb2NrT2JqZWN0O1xuXHR9XG5cdGdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQ/OiBhbnkpOiB0eXBlb2YgUHJvZ3JhbW1pbmdNb2RlbCB7XG5cdFx0aWYgKCF0aGlzLnNQcm9ncmFtbWluZ01vZGVsICYmIG9Db250ZXh0KSB7XG5cdFx0XHRsZXQgc1BhdGg7XG5cdFx0XHRpZiAob0NvbnRleHQuaXNBKFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHRcIikpIHtcblx0XHRcdFx0c1BhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzUGF0aCA9IG9Db250ZXh0LmlzUmVsYXRpdmUoKSA/IG9Db250ZXh0LmdldFJlc29sdmVkUGF0aCgpIDogb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKE1vZGVsSGVscGVyLmlzRHJhZnRTdXBwb3J0ZWQob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSwgc1BhdGgpKSB7XG5cdFx0XHRcdHRoaXMuc1Byb2dyYW1taW5nTW9kZWwgPSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0O1xuXHRcdFx0fSBlbHNlIGlmIChNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSkpIHtcblx0XHRcdFx0dGhpcy5zUHJvZ3JhbW1pbmdNb2RlbCA9IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gYXMgdGhlIHRyYW5zYWN0aW9uIGhlbHBlciBpcyBhIHNpbmdsZXRvbiB3ZSBkb24ndCBzdG9yZSB0aGUgbm9uIGRyYWZ0IGFzIHRoZSB1c2VyIGNvdWxkXG5cdFx0XHRcdC8vIHN0YXJ0IHdpdGggYSBub24gZHJhZnQgY2hpbGQgcGFnZSBhbmQgbmF2aWdhdGVzIGJhY2sgdG8gYSBkcmFmdCBlbmFibGVkIG9uZVxuXHRcdFx0XHRyZXR1cm4gUHJvZ3JhbW1pbmdNb2RlbC5Ob25EcmFmdDtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuc1Byb2dyYW1taW5nTW9kZWw7XG5cdH1cblxuXHQvKipcblx0ICogVmFsaWRhdGVzIGEgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSB2YWxpZGF0ZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gQ2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmRhdGFdIEEgbWFwIG9mIGRhdGEgdGhhdCBzaG91bGQgYmUgdmFsaWRhdGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uXSBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIHZhbGlkYXRpb24gZnVuY3Rpb25cblx0ICogQHBhcmFtIG9WaWV3IENvbnRhaW5zIHRoZSBvYmplY3Qgb2YgdGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggcmVzdWx0IG9mIHRoZSBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvblxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHR2YWxpZGF0ZURvY3VtZW50KG9Db250ZXh0OiBWNENvbnRleHQsIG1QYXJhbWV0ZXJzOiBhbnksIG9WaWV3OiBWaWV3KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuY3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uO1xuXHRcdGlmIChzQ3VzdG9tVmFsaWRhdGlvbkZ1bmN0aW9uKSB7XG5cdFx0XHRjb25zdCBzTW9kdWxlID0gc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5zdWJzdHJpbmcoMCwgc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5sYXN0SW5kZXhPZihcIi5cIikgfHwgLTEpLnJlcGxhY2UoL1xcLi9naSwgXCIvXCIpLFxuXHRcdFx0XHRzRnVuY3Rpb25OYW1lID0gc0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5zdWJzdHJpbmcoXG5cdFx0XHRcdFx0c0N1c3RvbVZhbGlkYXRpb25GdW5jdGlvbi5sYXN0SW5kZXhPZihcIi5cIikgKyAxLFxuXHRcdFx0XHRcdHNDdXN0b21WYWxpZGF0aW9uRnVuY3Rpb24ubGVuZ3RoXG5cdFx0XHRcdCksXG5cdFx0XHRcdG1EYXRhID0gbVBhcmFtZXRlcnMuZGF0YTtcblx0XHRcdGRlbGV0ZSBtRGF0YVtcIkAkdWk1LmNvbnRleHQuaXNUcmFuc2llbnRcIl07XG5cdFx0XHRyZXR1cm4gRlBNSGVscGVyLnZhbGlkYXRpb25XcmFwcGVyKHNNb2R1bGUsIHNGdW5jdGlvbk5hbWUsIG1EYXRhLCBvVmlldywgb0NvbnRleHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0gb01haW5MaXN0QmluZGluZyBPRGF0YSBWNCBMaXN0QmluZGluZyBvYmplY3Rcblx0ICogQHBhcmFtIFttSW5QYXJhbWV0ZXJzXSBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnMuZGF0YV0gQSBtYXAgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBzZW50IHdpdGhpbiB0aGUgUE9TVFxuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnMuYnVzeU1vZGVdIEdsb2JhbCAoZGVmYXVsdCksIExvY2FsLCBOb25lIFRPRE86IHRvIGJlIHJlZmFjdG9yZWRcblx0ICogQHBhcmFtIFttSW5QYXJhbWV0ZXJzLmJ1c3lJZF0gSUQgb2YgdGhlIGxvY2FsIGJ1c3kgaW5kaWNhdG9yXG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkXSBJZiBzZXQsIHRoZSBjb250ZXh0IHN0YXlzIGluIHRoZSBsaXN0IGlmIHRoZSBQT1NUIGZhaWxlZCBhbmQgUE9TVCB3aWxsIGJlIHJlcGVhdGVkIHdpdGggdGhlIG5leHQgY2hhbmdlXG5cdCAqIEBwYXJhbSBbbUluUGFyYW1ldGVycy5pbmFjdGl2ZV0gSWYgc2V0LCB0aGUgY29udGV4dCBpcyBzZXQgYXMgaW5hY3RpdmUgZm9yIGVtcHR5IHJvd3Ncblx0ICogQHBhcmFtIFttSW5QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2ddIFNraXBzIHRoZSBhY3Rpb24gcGFyYW1ldGVyIGRpYWxvZ1xuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcGFyYW0gYkZyb21Db3B5UGFzdGVcblx0ICogQHBhcmFtIG9WaWV3IFRoZSBjdXJyZW50IHZpZXdcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIG5ldyBiaW5kaW5nIGNvbnRleHRcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0YXN5bmMgY3JlYXRlRG9jdW1lbnQoXG5cdFx0b01haW5MaXN0QmluZGluZzogT0RhdGFMaXN0QmluZGluZyxcblx0XHRtSW5QYXJhbWV0ZXJzOlxuXHRcdFx0fCB7XG5cdFx0XHRcdFx0ZGF0YT86IGFueTtcblx0XHRcdFx0XHRidXN5TW9kZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRidXN5SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRrZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkPzogYW55O1xuXHRcdFx0XHRcdGluYWN0aXZlPzogYm9vbGVhbjtcblx0XHRcdCAgfVxuXHRcdFx0fCB1bmRlZmluZWQsXG5cdFx0b1Jlc291cmNlQnVuZGxlOiBhbnksXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGJGcm9tQ29weVBhc3RlOiBib29sZWFuID0gZmFsc2UsXG5cdFx0b1ZpZXc6IGFueVxuXHQpOiBQcm9taXNlPE9EYXRhVjRDb250ZXh0PiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3Qgb01vZGVsID0gb01haW5MaXN0QmluZGluZy5nZXRNb2RlbCgpLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9Nb2RlbC5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob01haW5MaXN0QmluZGluZy5nZXRIZWFkZXJDb250ZXh0KCkhLmdldFBhdGgoKSksXG5cdFx0XHRzQ3JlYXRlSGFzaCA9IHRoaXMuX2dldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkuZ2V0SGFzaCgpLFxuXHRcdFx0b0NvbXBvbmVudERhdGEgPSB0aGlzLl9nZXRBcHBDb21wb25lbnQoKS5nZXRDb21wb25lbnREYXRhKCksXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgPSAob0NvbXBvbmVudERhdGEgJiYgb0NvbXBvbmVudERhdGEuc3RhcnR1cFBhcmFtZXRlcnMpIHx8IHt9LFxuXHRcdFx0c05ld0FjdGlvbiA9ICFvTWFpbkxpc3RCaW5kaW5nLmlzUmVsYXRpdmUoKVxuXHRcdFx0XHQ/IHRoaXMuX2dldE5ld0FjdGlvbihvU3RhcnR1cFBhcmFtZXRlcnMsIHNDcmVhdGVIYXNoLCBvTWV0YU1vZGVsLCBzTWV0YVBhdGgpXG5cdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdGNvbnN0IG1CaW5kaW5nUGFyYW1ldGVyczogYW55ID0geyAkJHBhdGNoV2l0aG91dFNpZGVFZmZlY3RzOiB0cnVlIH07XG5cdFx0Y29uc3Qgc01lc3NhZ2VzUGF0aCA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5NZXNzYWdlcy8kUGF0aGApO1xuXHRcdGxldCBzQnVzeVBhdGggPSBcIi9idXN5XCI7XG5cdFx0bGV0IHNGdW5jdGlvbk5hbWUgPVxuXHRcdFx0b01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uYCkgfHxcblx0XHRcdG9NZXRhTW9kZWwuZ2V0T2JqZWN0KFxuXHRcdFx0XHRgJHtNb2RlbEhlbHBlci5nZXRUYXJnZXRFbnRpdHlTZXQob01ldGFNb2RlbC5nZXRDb250ZXh0KHNNZXRhUGF0aCkpfUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRGVmYXVsdFZhbHVlc0Z1bmN0aW9uYFxuXHRcdFx0KTtcblx0XHRsZXQgYkZ1bmN0aW9uT25OYXZQcm9wO1xuXHRcdGxldCBvTmV3RG9jdW1lbnRDb250ZXh0OiBPRGF0YVY0Q29udGV4dCB8IHVuZGVmaW5lZDtcblx0XHRpZiAoc0Z1bmN0aW9uTmFtZSkge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EZWZhdWx0VmFsdWVzRnVuY3Rpb25gKSAmJlxuXHRcdFx0XHRNb2RlbEhlbHBlci5nZXRUYXJnZXRFbnRpdHlTZXQob01ldGFNb2RlbC5nZXRDb250ZXh0KHNNZXRhUGF0aCkpICE9PSBzTWV0YVBhdGhcblx0XHRcdCkge1xuXHRcdFx0XHRiRnVuY3Rpb25Pbk5hdlByb3AgPSB0cnVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YkZ1bmN0aW9uT25OYXZQcm9wID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChzTWVzc2FnZXNQYXRoKSB7XG5cdFx0XHRtQmluZGluZ1BhcmFtZXRlcnNbXCIkc2VsZWN0XCJdID0gc01lc3NhZ2VzUGF0aDtcblx0XHR9XG5cdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSBnZXRQYXJhbWV0ZXJzKG1JblBhcmFtZXRlcnMpO1xuXHRcdGlmICghb01haW5MaXN0QmluZGluZykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQmluZGluZyByZXF1aXJlZCBmb3IgbmV3IGRvY3VtZW50IGNyZWF0aW9uXCIpO1xuXHRcdH1cblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvTWFpbkxpc3RCaW5kaW5nKTtcblx0XHRpZiAoc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQgJiYgc1Byb2dyYW1taW5nTW9kZWwgIT09IFByb2dyYW1taW5nTW9kZWwuU3RpY2t5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDcmVhdGUgZG9jdW1lbnQgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5idXN5TW9kZSA9PT0gXCJMb2NhbFwiKSB7XG5cdFx0XHRzQnVzeVBhdGggPSBgL2J1c3lMb2NhbC8ke21QYXJhbWV0ZXJzLmJ1c3lJZH1gO1xuXHRcdH1cblx0XHRtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayA9IGJGcm9tQ29weVBhc3RlID8gbnVsbCA6IG1QYXJhbWV0ZXJzLmJlZm9yZUNyZWF0ZUNhbGxCYWNrO1xuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLm9Mb2NrT2JqZWN0LCBzQnVzeVBhdGgpO1xuXHRcdGNvbnN0IG9SZXNvdXJjZUJ1bmRsZUNvcmUgPSBDb3JlLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpO1xuXHRcdGxldCBvUmVzdWx0OiBhbnk7XG5cblx0XHR0cnkge1xuXHRcdFx0aWYgKHNOZXdBY3Rpb24pIHtcblx0XHRcdFx0b1Jlc3VsdCA9IGF3YWl0IHRoaXMuY2FsbEFjdGlvbihcblx0XHRcdFx0XHRzTmV3QWN0aW9uLFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGNvbnRleHRzOiBvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSxcblx0XHRcdFx0XHRcdHNob3dBY3Rpb25QYXJhbWV0ZXJEaWFsb2c6IHRydWUsXG5cdFx0XHRcdFx0XHRsYWJlbDogdGhpcy5fZ2V0U3BlY2lmaWNDcmVhdGVBY3Rpb25EaWFsb2dMYWJlbChvTWV0YU1vZGVsLCBzTWV0YVBhdGgsIHNOZXdBY3Rpb24sIG9SZXNvdXJjZUJ1bmRsZUNvcmUpLFxuXHRcdFx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0XHRiSXNDcmVhdGVBY3Rpb246IHRydWUsXG5cdFx0XHRcdFx0XHRza2lwUGFyYW1ldGVyRGlhbG9nOiBtUGFyYW1ldGVycy5za2lwUGFyYW1ldGVyRGlhbG9nXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBiSXNOZXdQYWdlQ3JlYXRpb24gPVxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLkNyZWF0aW9uUm93ICYmIG1QYXJhbWV0ZXJzLmNyZWF0aW9uTW9kZSAhPT0gQ3JlYXRpb25Nb2RlLklubGluZTtcblx0XHRcdFx0Y29uc3QgYU5vbkNvbXB1dGVkVmlzaWJsZUtleUZpZWxkcyA9IGJJc05ld1BhZ2VDcmVhdGlvblxuXHRcdFx0XHRcdD8gQ29tbW9uVXRpbHMuZ2V0Tm9uQ29tcHV0ZWRWaXNpYmxlRmllbGRzKG9NZXRhTW9kZWwsIHNNZXRhUGF0aCwgb1ZpZXcpXG5cdFx0XHRcdFx0OiBbXTtcblx0XHRcdFx0c0Z1bmN0aW9uTmFtZSA9IGJGcm9tQ29weVBhc3RlID8gbnVsbCA6IHNGdW5jdGlvbk5hbWU7XG5cdFx0XHRcdGxldCBzRnVuY3Rpb25QYXRoLCBvRnVuY3Rpb25Db250ZXh0O1xuXHRcdFx0XHRpZiAoc0Z1bmN0aW9uTmFtZSkge1xuXHRcdFx0XHRcdC8vYm91bmQgdG8gdGhlIHNvdXJjZSBlbnRpdHk6XG5cdFx0XHRcdFx0aWYgKGJGdW5jdGlvbk9uTmF2UHJvcCkge1xuXHRcdFx0XHRcdFx0c0Z1bmN0aW9uUGF0aCA9XG5cdFx0XHRcdFx0XHRcdG9NYWluTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpICYmXG5cdFx0XHRcdFx0XHRcdGAke29NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCkuZ2V0UGF0aCgpKX0vJHtzRnVuY3Rpb25OYW1lfWA7XG5cdFx0XHRcdFx0XHRvRnVuY3Rpb25Db250ZXh0ID0gb01haW5MaXN0QmluZGluZy5nZXRDb250ZXh0KCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNGdW5jdGlvblBhdGggPVxuXHRcdFx0XHRcdFx0XHRvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKSAmJlxuXHRcdFx0XHRcdFx0XHRgJHtvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9NYWluTGlzdEJpbmRpbmcuZ2V0SGVhZGVyQ29udGV4dCgpIS5nZXRQYXRoKCkpfS8ke3NGdW5jdGlvbk5hbWV9YDtcblx0XHRcdFx0XHRcdG9GdW5jdGlvbkNvbnRleHQgPSBvTWFpbkxpc3RCaW5kaW5nLmdldEhlYWRlckNvbnRleHQoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgb0Z1bmN0aW9uID0gc0Z1bmN0aW9uUGF0aCAmJiAob01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRnVuY3Rpb25QYXRoKSBhcyBhbnkpO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0bGV0IG9EYXRhOiBhbnk7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGNvbnN0IG9Db250ZXh0ID1cblx0XHRcdFx0XHRcdFx0b0Z1bmN0aW9uICYmIG9GdW5jdGlvbi5nZXRPYmplY3QoKSAmJiBvRnVuY3Rpb24uZ2V0T2JqZWN0KClbMF0uJElzQm91bmRcblx0XHRcdFx0XHRcdFx0XHQ/IGF3YWl0IG9wZXJhdGlvbnMuY2FsbEJvdW5kRnVuY3Rpb24oc0Z1bmN0aW9uTmFtZSwgb0Z1bmN0aW9uQ29udGV4dCwgb01vZGVsKVxuXHRcdFx0XHRcdFx0XHRcdDogYXdhaXQgb3BlcmF0aW9ucy5jYWxsRnVuY3Rpb25JbXBvcnQoc0Z1bmN0aW9uTmFtZSwgb01vZGVsKTtcblx0XHRcdFx0XHRcdGlmIChvQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0XHRvRGF0YSA9IG9Db250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoYEVycm9yIHdoaWxlIGV4ZWN1dGluZyB0aGUgZnVuY3Rpb24gJHtzRnVuY3Rpb25OYW1lfWAsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGEgPSBvRGF0YSA/IE9iamVjdC5hc3NpZ24oe30sIG9EYXRhLCBtUGFyYW1ldGVycy5kYXRhKSA6IG1QYXJhbWV0ZXJzLmRhdGE7XG5cdFx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmRhdGEpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBtUGFyYW1ldGVycy5kYXRhW1wiQG9kYXRhLmNvbnRleHRcIl07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdG9SZXN1bHQgPSBhd2FpdCB0aGlzLl9sYXVuY2hEaWFsb2dXaXRoS2V5RmllbGRzKFxuXHRcdFx0XHRcdFx0XHRvTWFpbkxpc3RCaW5kaW5nLFxuXHRcdFx0XHRcdFx0XHRhTm9uQ29tcHV0ZWRWaXNpYmxlS2V5RmllbGRzLFxuXHRcdFx0XHRcdFx0XHRvTW9kZWwsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlclxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdG9OZXdEb2N1bWVudENvbnRleHQgPSBvUmVzdWx0Lm5ld0NvbnRleHQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjaykge1xuXHRcdFx0XHRcdFx0XHRhd2FpdCB0b0VTNlByb21pc2UoXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2soe1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IG9NYWluTGlzdEJpbmRpbmcgJiYgb01haW5MaXN0QmluZGluZy5nZXRQYXRoKClcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0ID0gb01haW5MaXN0QmluZGluZy5jcmVhdGUoXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRhdGEsXG5cdFx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0ZUF0RW5kLFxuXHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5pbmFjdGl2ZVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdGlmICghbVBhcmFtZXRlcnMuaW5hY3RpdmUpIHtcblx0XHRcdFx0XHRcdFx0b1Jlc3VsdCA9IGF3YWl0IHRoaXMub25BZnRlckNyZWF0ZUNvbXBsZXRpb24ob01haW5MaXN0QmluZGluZywgb05ld0RvY3VtZW50Q29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjcmVhdGluZyB0aGUgbmV3IGRvY3VtZW50XCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0dGhyb3cgb0Vycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG9OZXdEb2N1bWVudENvbnRleHQgPSBvTmV3RG9jdW1lbnRDb250ZXh0IHx8IG9SZXN1bHQ7XG5cblx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlRGlhbG9nKHsgY29udHJvbDogbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbCB9KTtcblx0XHRcdHJldHVybiBvTmV3RG9jdW1lbnRDb250ZXh0ITtcblx0XHR9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuXHRcdFx0Ly8gVE9ETzogY3VycmVudGx5LCB0aGUgb25seSBlcnJvcnMgaGFuZGxlZCBoZXJlIGFyZSByYWlzZWQgYXMgc3RyaW5nIC0gc2hvdWxkIGJlIGNoYW5nZWQgdG8gRXJyb3Igb2JqZWN0c1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coeyBjb250cm9sOiBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sIH0pO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQoZXJyb3IgPT09IEZFTGlicmFyeS5Db25zdGFudHMuQWN0aW9uRXhlY3V0aW9uRmFpbGVkIHx8IGVycm9yID09PSBGRUxpYnJhcnkuQ29uc3RhbnRzLkNhbmNlbEFjdGlvbkRpYWxvZykgJiZcblx0XHRcdFx0b05ld0RvY3VtZW50Q29udGV4dD8uaXNUcmFuc2llbnQoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHN1Z2dlc3RlZCBieSBtb2RlbCBhcyBDb250ZXh0LmRlbGV0ZSByZXN1bHRzIGluIGFuIGVycm9yXG5cdFx0XHRcdC8vIFRPRE86IHJlbW92ZSB0aGUgJGRpcmVjdCBvbmNlIG1vZGVsIHJlc29sdmVzIHRoaXMgaXNzdWVcblx0XHRcdFx0Ly8gdGhpcyBsaW5lIHNob3dzIHRoZSBleHBlY3RlZCBjb25zb2xlIGVycm9yIFVuY2F1Z2h0IChpbiBwcm9taXNlKSBFcnJvcjogUmVxdWVzdCBjYW5jZWxlZDogUE9TVCBUcmF2ZWw7IGdyb3VwOiBzdWJtaXRMYXRlclxuXHRcdFx0XHRvTmV3RG9jdW1lbnRDb250ZXh0LmRlbGV0ZShcIiRkaXJlY3RcIik7XG5cdFx0XHR9XG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5vTG9ja09iamVjdCwgc0J1c3lQYXRoKTtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIEZpbmQgdGhlIGFjdGl2ZSBjb250ZXh0cyBvZiB0aGUgZG9jdW1lbnRzLCBvbmx5IGZvciB0aGUgZHJhZnQgcm9vdHMuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBhQ29udGV4dHMgQ29udGV4dHMgRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgdG8gYmUgZGVsZXRlZFxuXHQgKiBAcGFyYW0gYkZpbmRBY3RpdmVDb250ZXh0c1xuXHQgKiBAcmV0dXJucyBBcnJheSBvZiB0aGUgYWN0aXZlIGNvbnRleHRzXG5cdCAqL1xuXHRmaW5kQWN0aXZlRHJhZnRSb290Q29udGV4dHMoYUNvbnRleHRzOiBWNENvbnRleHRbXSwgYkZpbmRBY3RpdmVDb250ZXh0czogYW55KSB7XG5cdFx0aWYgKCFiRmluZEFjdGl2ZUNvbnRleHRzKSB7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0fVxuXHRcdGNvbnN0IGFjdGl2ZUNvbnRleHRzID0gYUNvbnRleHRzLnJlZHVjZShmdW5jdGlvbiAoYVJlc3VsdDogYW55LCBvQ29udGV4dDogYW55KSB7XG5cdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IHNNZXRhUGF0aCA9IG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgob0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGlmIChvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzTWV0YVBhdGh9QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RgKSkge1xuXHRcdFx0XHRjb25zdCBiSXNBY3RpdmVFbnRpdHkgPSBvQ29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eSxcblx0XHRcdFx0XHRiSGFzQWN0aXZlRW50aXR5ID0gb0NvbnRleHQuZ2V0T2JqZWN0KCkuSGFzQWN0aXZlRW50aXR5O1xuXHRcdFx0XHRpZiAoIWJJc0FjdGl2ZUVudGl0eSAmJiBiSGFzQWN0aXZlRW50aXR5KSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0FjdGl2ZUNvbnRleHQgPSBvQ29udGV4dC5nZXRNb2RlbCgpLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vU2libGluZ0VudGl0eWApLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdGFSZXN1bHQucHVzaChvQWN0aXZlQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBhUmVzdWx0O1xuXHRcdH0sIFtdKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRhY3RpdmVDb250ZXh0cy5tYXAoZnVuY3Rpb24gKG9Db250ZXh0OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9Db250ZXh0LnJlcXVlc3RDYW5vbmljYWxQYXRoKCkudGhlbihmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9Db250ZXh0O1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXG5cdF9pc0RyYWZ0RW5hYmxlZCh2Q29udGV4dHM6IFY0Q29udGV4dFtdLCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Y29uc3QgY29udGV4dEZvckRyYWZ0TW9kZWwgPVxuXHRcdFx0dkNvbnRleHRzWzBdIHx8XG5cdFx0XHQobVBhcmFtZXRlcnMudW5TYXZlZENvbnRleHRzICYmIG1QYXJhbWV0ZXJzLnVuU2F2ZWRDb250ZXh0c1swXSkgfHxcblx0XHRcdChtUGFyYW1ldGVycy5kcmFmdHNXaXRoRGVsZXRhYmxlQWN0aXZlICYmIG1QYXJhbWV0ZXJzLmRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmVbMF0pIHx8XG5cdFx0XHQobVBhcmFtZXRlcnMuZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZSAmJiBtUGFyYW1ldGVycy5kcmFmdHNXaXRoTm9uRGVsZXRhYmxlQWN0aXZlWzBdKSB8fFxuXHRcdFx0KG1QYXJhbWV0ZXJzLmNyZWF0ZU1vZGVDb250ZXh0cyAmJiBtUGFyYW1ldGVycy5jcmVhdGVNb2RlQ29udGV4dHNbMF0pO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKGNvbnRleHRGb3JEcmFmdE1vZGVsKTtcblx0XHRyZXR1cm4gc1Byb2dyYW1taW5nTW9kZWwgPT09IFByb2dyYW1taW5nTW9kZWwuRHJhZnQ7XG5cdH1cblx0LyoqXG5cdCAqIERlbGV0ZSBvbmUgb3IgbXVsdGlwbGUgZG9jdW1lbnQocykuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSB2SW5Db250ZXh0cyBDb250ZXh0cyBFaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycyBPcHRpb25hbCwgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMudGl0bGUgVGl0bGUgb2YgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkXG5cdCAqIEBwYXJhbSBtUGFyYW1ldGVycy5kZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWRcblx0ICogQHBhcmFtIG1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyBOdW1iZXIgb2Ygb2JqZWN0cyBzZWxlY3RlZFxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMubm9EaWFsb2cgVG8gZGlzYWJsZSB0aGUgY29uZmlybWF0aW9uIGRpYWxvZ1xuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcmV0dXJucyBBIFByb21pc2UgcmVzb2x2ZWQgb25jZSB0aGUgZG9jdW1lbnQgYXJlIGRlbGV0ZWRcblx0ICovXG5cdGRlbGV0ZURvY3VtZW50KHZJbkNvbnRleHRzOiBWNENvbnRleHQsIG1QYXJhbWV0ZXJzOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55LCBtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIpIHtcblx0XHRsZXQgYkRpYWxvZ0NvbmZpcm1lZCA9IGZhbHNlO1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzLFxuXHRcdFx0b1Jlc291cmNlQnVuZGxlQ29yZSA9IENvcmUuZ2V0TGlicmFyeVJlc291cmNlQnVuZGxlKFwic2FwLmZlLmNvcmVcIik7XG5cdFx0bGV0IGFQYXJhbXM7XG5cdFx0QnVzeUxvY2tlci5sb2NrKHRoaXMub0xvY2tPYmplY3QpO1xuXHRcdGxldCB2Q29udGV4dHM6IFY0Q29udGV4dFtdO1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHZJbkNvbnRleHRzKSkge1xuXHRcdFx0dkNvbnRleHRzID0gdkluQ29udGV4dHM7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZDb250ZXh0cyA9IFt2SW5Db250ZXh0c107XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGRyYWZ0RW5hYmxlZCA9IHRoYXQuX2lzRHJhZnRFbmFibGVkKHZDb250ZXh0cywgbVBhcmFtZXRlcnMpO1xuXHRcdFx0XHRjb25zdCBpdGVtczogYW55W10gPSBbXTtcblx0XHRcdFx0Y29uc3Qgb3B0aW9uczogYW55W10gPSBbXTtcblxuXHRcdFx0XHRpZiAobVBhcmFtZXRlcnMpIHtcblx0XHRcdFx0XHRpZiAoIW1QYXJhbWV0ZXJzLm51bWJlck9mU2VsZWN0ZWRDb250ZXh0cykge1xuXHRcdFx0XHRcdFx0Ly8gbm9uLVRhYmxlXG5cdFx0XHRcdFx0XHRpZiAoZHJhZnRFbmFibGVkKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdkNvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gdkNvbnRleHRzW2ldLmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0RGF0YS5Jc0FjdGl2ZUVudGl0eSA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0b0NvbnRleHREYXRhLkhhc0RyYWZ0RW50aXR5ID09PSB0cnVlICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRvQ29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEgJiZcblx0XHRcdFx0XHRcdFx0XHRcdG9Db250ZXh0RGF0YS5EcmFmdEFkbWluaXN0cmF0aXZlRGF0YS5JblByb2Nlc3NCeVVzZXIgJiZcblx0XHRcdFx0XHRcdFx0XHRcdCFvQ29udGV4dERhdGEuRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEuRHJhZnRJc0NyZWF0ZWRCeU1lXG5cdFx0XHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgc0xvY2tlZFVzZXIgPSBcIlwiO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZHJhZnRBZG1pbkRhdGEgPSBvQ29udGV4dERhdGEgJiYgb0NvbnRleHREYXRhLkRyYWZ0QWRtaW5pc3RyYXRpdmVEYXRhO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNMb2NrZWRVc2VyID0gZHJhZnRBZG1pbkRhdGFbXCJJblByb2Nlc3NCeVVzZXJcIl07XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zID0gW3NMb2NrZWRVc2VyXTtcblx0XHRcdFx0XHRcdFx0XHRcdE1lc3NhZ2VCb3guc2hvdyhcblx0XHRcdFx0XHRcdFx0XHRcdFx0Q29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9DT05GSVJNX0RFTEVURV9XSVRIX1NJTkdMRV9PQkpFQ1RfTE9DS0VEXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFQYXJhbXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiBvUmVzb3VyY2VCdW5kbGVDb3JlLmdldFRleHQoXCJDX0NPTU1PTl9ERUxFVEVcIiksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b25DbG9zZTogcmVqZWN0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycyA9IGdldFBhcmFtZXRlcnMobVBhcmFtZXRlcnMpO1xuXHRcdFx0XHRcdFx0bGV0IG5vblRhYmxlVHh0ID0gXCJcIjtcblx0XHRcdFx0XHRcdGlmIChtUGFyYW1ldGVycy50aXRsZSkge1xuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuZGVzY3JpcHRpb24pIHtcblx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zID0gW21QYXJhbWV0ZXJzLnRpdGxlICsgXCIgXCIsIG1QYXJhbWV0ZXJzLmRlc2NyaXB0aW9uXTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRhUGFyYW1zID0gW21QYXJhbWV0ZXJzLnRpdGxlLCBcIlwiXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRub25UYWJsZVR4dCA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfQ09ORklSTV9ERUxFVEVfV0lUSF9PQkpFQ1RJTkZPXCIsXG5cdFx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRcdGFQYXJhbXMsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZW50aXR5U2V0TmFtZVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0bm9uVGFibGVUeHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XHRcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0NPTkZJUk1fREVMRVRFX1dJVEhfT0JKRUNUVElUTEVfU0lOR1VMQVJcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWVcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG9wdGlvbnMucHVzaCh7XG5cdFx0XHRcdFx0XHRcdHR5cGU6IFwiZGVsZXRhYmxlQ29udGV4dHNcIixcblx0XHRcdFx0XHRcdFx0Y29udGV4dHM6IHZDb250ZXh0cyxcblx0XHRcdFx0XHRcdFx0dGV4dDogbm9uVGFibGVUeHQsXG5cdFx0XHRcdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRjb250cm9sOiBcInRleHRcIlxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIFRhYmxlXG5cdFx0XHRcdFx0XHRsZXQgdG90YWxEZWxldGFibGUgPSB2Q29udGV4dHMubGVuZ3RoO1xuXG5cdFx0XHRcdFx0XHRpZiAoZHJhZnRFbmFibGVkKSB7XG5cdFx0XHRcdFx0XHRcdHRvdGFsRGVsZXRhYmxlICs9XG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuZHJhZnRzV2l0aE5vbkRlbGV0YWJsZUFjdGl2ZS5sZW5ndGggK1xuXHRcdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmRyYWZ0c1dpdGhEZWxldGFibGVBY3RpdmUubGVuZ3RoICtcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy51blNhdmVkQ29udGV4dHMubGVuZ3RoICtcblx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5jcmVhdGVNb2RlQ29udGV4dHMubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRkZWxldGVIZWxwZXIudXBkYXRlRHJhZnRPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMoXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHRcdFx0dkNvbnRleHRzLFxuXHRcdFx0XHRcdFx0XHRcdHRvdGFsRGVsZXRhYmxlLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRpdGVtcyxcblx0XHRcdFx0XHRcdFx0XHRvcHRpb25zXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGRlbGV0ZUhlbHBlci51cGRhdGVPcHRpb25zRm9yRGVsZXRhYmxlVGV4dHMobVBhcmFtZXRlcnMsIHZDb250ZXh0cywgb1Jlc291cmNlQnVuZGxlLCBvcHRpb25zKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDb250ZW50IG9mIERlbGV0ZSBEaWFsb2dcblx0XHRcdFx0ZGVsZXRlSGVscGVyLnVwZGF0ZUNvbnRlbnRGb3JEZWxldGVEaWFsb2cob3B0aW9ucywgaXRlbXMpO1xuXHRcdFx0XHRjb25zdCB2Qm94ID0gbmV3IFZCb3goeyBpdGVtczogaXRlbXMgfSk7XG5cdFx0XHRcdGNvbnN0IHNUaXRsZSA9IG9SZXNvdXJjZUJ1bmRsZUNvcmUuZ2V0VGV4dChcIkNfQ09NTU9OX0RFTEVURVwiKTtcblxuXHRcdFx0XHRjb25zdCBmbkNvbmZpcm0gPSBhc3luYyBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0QnVzeUxvY2tlci5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBkZWxldGVIZWxwZXIuZGVsZXRlQ29uZmlybUhhbmRsZXIoXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0XHRcdG1QYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHR0aGF0Ll9vQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0XHRkcmFmdEVuYWJsZWRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9IG5ldyBEaWFsb2coe1xuXHRcdFx0XHRcdHRpdGxlOiBzVGl0bGUsXG5cdFx0XHRcdFx0c3RhdGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IFt2Qm94XSxcblx0XHRcdFx0XHRhcmlhTGFiZWxsZWRCeTogaXRlbXMsXG5cdFx0XHRcdFx0YmVnaW5CdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdFx0dGV4dDogb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19DT01NT05fREVMRVRFXCIpLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0XHRwcmVzczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRtZXNzYWdlSGFuZGxpbmcucmVtb3ZlQm91bmRUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdFx0XHRcdFx0YkRpYWxvZ0NvbmZpcm1lZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0Zm5Db25maXJtKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0ZW5kQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19DT01NT05fRElBTE9HX0NBTkNFTFwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdGFmdGVyQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0Ly8gaWYgZGlhbG9nIGlzIGNsb3NlZCB1bmNvbmZpcm1lZCAoZS5nLiB2aWEgXCJDYW5jZWxcIiBvciBFc2NhcGUgYnV0dG9uKSwgZW5zdXJlIHRvIHJlamVjdCBwcm9taXNlXG5cdFx0XHRcdFx0XHRpZiAoIWJEaWFsb2dDb25maXJtZWQpIHtcblx0XHRcdFx0XHRcdFx0cmVqZWN0KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGFzIGFueSk7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5ub0RpYWxvZykge1xuXHRcdFx0XHRcdGZuQ29uZmlybSgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9EaWFsb2cuYWRkU3R5bGVDbGFzcyhcInNhcFVpQ29udGVudFBhZGRpbmdcIik7XG5cdFx0XHRcdFx0b0RpYWxvZy5vcGVuKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoYXQub0xvY2tPYmplY3QpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBFZGl0cyBhIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50XG5cdCAqIEBwYXJhbSBvVmlldyBDdXJyZW50IHZpZXdcblx0ICogQHBhcmFtIG1lc3NhZ2VIYW5kbGVyXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgd2l0aCB0aGUgbmV3IGRyYWZ0IGNvbnRleHQgaW4gY2FzZSBvZiBkcmFmdCBwcm9ncmFtbWluZyBtb2RlbFxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBlZGl0RG9jdW1lbnQob0NvbnRleHQ6IFY0Q29udGV4dCwgb1ZpZXc6IFZpZXcsIG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcik6IFByb21pc2U8VjRDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0Y29uc3Qgc1Byb2dyYW1taW5nTW9kZWwgPSB0aGlzLmdldFByb2dyYW1taW5nTW9kZWwob0NvbnRleHQpO1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkJpbmRpbmcgY29udGV4dCB0byBhY3RpdmUgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIik7XG5cdFx0fVxuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiBzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVkaXQgaXMgb25seSBhbGxvd2VkIGZvciBkcmFmdCBvciBzdGlja3kgc2Vzc2lvbiBzdXBwb3J0ZWQgc2VydmljZXNcIik7XG5cdFx0fVxuXHRcdEJ1c3lMb2NrZXIubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHQvLyBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgZWRpdCBhY3Rpb24gd2UnbGwgaGF2ZSB0byByZW1vdmUgYWxsIGJvdW5kIHRyYW5zaXRpb24gbWVzc2FnZXNcblx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBvTmV3Q29udGV4dCA9XG5cdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0PyBhd2FpdCBkcmFmdC5jcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudChvQ29udGV4dCwgdGhpcy5fZ2V0QXBwQ29tcG9uZW50KCksIHtcblx0XHRcdFx0XHRcdFx0YlByZXNlcnZlQ2hhbmdlczogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0b1ZpZXc6IG9WaWV3XG5cdFx0XHRcdFx0ICB9IGFzIGFueSlcblx0XHRcdFx0XHQ6IGF3YWl0IHN0aWNreS5lZGl0RG9jdW1lbnRJblN0aWNreVNlc3Npb24ob0NvbnRleHQsIHRoaXMuX2dldEFwcENvbXBvbmVudCgpKTtcblxuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VEaWFsb2coKTtcblx0XHRcdHJldHVybiBvTmV3Q29udGV4dDtcblx0XHR9IGNhdGNoIChlcnI6IGFueSkge1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKHsgY29uY3VycmVudEVkaXRGbGFnOiB0cnVlIH0pO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIENhbmNlbCAnZWRpdCcgbW9kZSBvZiBhIGRvY3VtZW50LlxuXHQgKlxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgZG9jdW1lbnQgdG8gYmUgY2FuY2VsZWQgb3IgZGVsZXRlZFxuXHQgKiBAcGFyYW0gW21JblBhcmFtZXRlcnNdIE9wdGlvbmFsLCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdCAqIEBwYXJhbSBtSW5QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiBDYW5jZWwgQnV0dG9uIG9mIHRoZSBkaXNjYXJkIHBvcG92ZXIgKG1hbmRhdG9yeSBmb3Igbm93KVxuXHQgKiBAcGFyYW0gbUluUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIgT3B0aW9uYWwsIHN1cHJlc3NlcyB0aGUgZGlzY2FyZCBwb3BvdmVyIGluY2FzZSBvZiBkcmFmdCBhcHBsaWNhdGlvbnMgd2hpbGUgbmF2aWdhdGluZyBvdXQgb2YgT1Bcblx0ICogQHBhcmFtIG9SZXNvdXJjZUJ1bmRsZVxuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHBhcmFtIGlzTmV3T2JqZWN0IFRydWUgaWYgd2UncmUgdHJ5aW5nIHRvIGNhbmNlbCBhIG5ld2x5IGNyZWF0ZWQgb2JqZWN0XG5cdCAqIEBwYXJhbSBpc09iamVjdE1vZGlmaWVkIFRydWUgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb2RpZmllZCBieSB0aGUgdXNlclxuXHQgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIHdpdGggPz8/XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGNhbmNlbERvY3VtZW50KFxuXHRcdG9Db250ZXh0OiBWNENvbnRleHQsXG5cdFx0bUluUGFyYW1ldGVyczogeyBjYW5jZWxCdXR0b246IGFueTsgc2tpcERpc2NhcmRQb3BvdmVyOiBib29sZWFuIH0gfCB1bmRlZmluZWQsXG5cdFx0b1Jlc291cmNlQnVuZGxlOiBhbnksXG5cdFx0bWVzc2FnZUhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyLFxuXHRcdGlzTmV3T2JqZWN0OiBib29sZWFuLFxuXHRcdGlzT2JqZWN0TW9kaWZpZWQ6IGJvb2xlYW5cblx0KTogUHJvbWlzZTxWNENvbnRleHQgfCBib29sZWFuPiB7XG5cdFx0Ly9jb250ZXh0IG11c3QgYWx3YXlzIGJlIHBhc3NlZCAtIG1hbmRhdG9yeSBwYXJhbWV0ZXJcblx0XHRpZiAoIW9Db250ZXh0KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJObyBjb250ZXh0IGV4aXN0cy4gUGFzcyBhIG1lYW5pbmdmdWwgY29udGV4dFwiKTtcblx0XHR9XG5cdFx0QnVzeUxvY2tlci5sb2NrKHRoaXMub0xvY2tPYmplY3QpO1xuXHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtSW5QYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IHNQcm9ncmFtbWluZ01vZGVsID0gdGhpcy5nZXRQcm9ncmFtbWluZ01vZGVsKG9Db250ZXh0KTtcblxuXHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiBzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5TdGlja3kpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbmNlbCBkb2N1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHR9XG5cdFx0dHJ5IHtcblx0XHRcdGxldCByZXR1cm5lZFZhbHVlOiBWNENvbnRleHQgfCBib29sZWFuID0gZmFsc2U7XG5cblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCAmJiAhaXNPYmplY3RNb2RpZmllZCkge1xuXHRcdFx0XHRjb25zdCBkcmFmdERhdGFDb250ZXh0ID0gb01vZGVsLmJpbmRDb250ZXh0KGAke29Db250ZXh0LmdldFBhdGgoKX0vRHJhZnRBZG1pbmlzdHJhdGl2ZURhdGFgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0Y29uc3QgZHJhZnRBZG1pbkRhdGEgPSBhd2FpdCBkcmFmdERhdGFDb250ZXh0LnJlcXVlc3RPYmplY3QoKTtcblx0XHRcdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHRcdFx0aXNPYmplY3RNb2RpZmllZCA9IGRyYWZ0QWRtaW5EYXRhLkNyZWF0aW9uRGF0ZVRpbWUgIT09IGRyYWZ0QWRtaW5EYXRhLkxhc3RDaGFuZ2VEYXRlVGltZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCFtUGFyYW1ldGVycy5za2lwRGlzY2FyZFBvcG92ZXIpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5fc2hvd0Rpc2NhcmRQb3BvdmVyKG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbiwgaXNPYmplY3RNb2RpZmllZCwgb1Jlc291cmNlQnVuZGxlKTtcblx0XHRcdH1cblx0XHRcdGlmIChvQ29udGV4dC5pc0tlZXBBbGl2ZSgpKSB7XG5cdFx0XHRcdG9Db250ZXh0LnNldEtlZXBBbGl2ZShmYWxzZSk7XG5cdFx0XHR9XG5cdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2spIHtcblx0XHRcdFx0YXdhaXQgbVBhcmFtZXRlcnMuYmVmb3JlQ2FuY2VsQ2FsbEJhY2soeyBjb250ZXh0OiBvQ29udGV4dCB9KTtcblx0XHRcdH1cblx0XHRcdGlmIChzUHJvZ3JhbW1pbmdNb2RlbCA9PT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0XHRpZiAoaXNOZXdPYmplY3QpIHtcblx0XHRcdFx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm5lZFZhbHVlID0gYXdhaXQgZHJhZnQuZGVsZXRlRHJhZnQob0NvbnRleHQsIHRoaXMuX29BcHBDb21wb25lbnQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IG9TaWJsaW5nQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChgJHtvQ29udGV4dC5nZXRQYXRoKCl9L1NpYmxpbmdFbnRpdHlgKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc0Nhbm9uaWNhbFBhdGggPSBhd2FpdCBvU2libGluZ0NvbnRleHQucmVxdWVzdENhbm9uaWNhbFBhdGgoKTtcblx0XHRcdFx0XHRcdGlmIChvQ29udGV4dC5oYXNQZW5kaW5nQ2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0XHRcdG9Db250ZXh0LmdldEJpbmRpbmcoKS5yZXNldENoYW5nZXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybmVkVmFsdWUgPSBvTW9kZWwuYmluZENvbnRleHQoc0Nhbm9uaWNhbFBhdGgpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHRhd2FpdCBkcmFmdC5kZWxldGVEcmFmdChvQ29udGV4dCwgdGhpcy5fb0FwcENvbXBvbmVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBkaXNjYXJkZWRDb250ZXh0ID0gYXdhaXQgc3RpY2t5LmRpc2NhcmREb2N1bWVudChvQ29udGV4dCk7XG5cdFx0XHRcdGlmIChkaXNjYXJkZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0aWYgKGRpc2NhcmRlZENvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0XHRcdFx0ZGlzY2FyZGVkQ29udGV4dC5nZXRCaW5kaW5nKCkucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICghaXNOZXdPYmplY3QpIHtcblx0XHRcdFx0XHRcdGRpc2NhcmRlZENvbnRleHQucmVmcmVzaCgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuZWRWYWx1ZSA9IGRpc2NhcmRlZENvbnRleHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlbW92ZSBleGlzdGluZyBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzXG5cdFx0XHRtZXNzYWdlSGFuZGxlci5yZW1vdmVUcmFuc2l0aW9uTWVzc2FnZXMoKTtcblx0XHRcdC8vIHNob3cgdW5ib3VuZCBtZXNzYWdlc1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHRyZXR1cm4gcmV0dXJuZWRWYWx1ZTtcblx0XHR9IGNhdGNoIChlcnI6IGFueSkge1xuXHRcdFx0YXdhaXQgbWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdEJ1c3lMb2NrZXIudW5sb2NrKHRoaXMub0xvY2tPYmplY3QpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTYXZlcyB0aGUgZG9jdW1lbnQuXG5cdCAqXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAc3RhdGljXG5cdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBzYXZlZFxuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEBwYXJhbSBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvclxuXHQgKiBAcGFyYW0gYUJpbmRpbmdzXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcGFyYW0gaXNOZXdPYmplY3QgVHJ1ZSBpZiB3ZSdyZSB0cnlpbmcgdG8gY2FuY2VsIGEgbmV3bHkgY3JlYXRlZCBvYmplY3Rcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoID8/P1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRhc3luYyBzYXZlRG9jdW1lbnQoXG5cdFx0b0NvbnRleHQ6IFY0Q29udGV4dCxcblx0XHRvUmVzb3VyY2VCdW5kbGU6IGFueSxcblx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcjogYW55LFxuXHRcdGFCaW5kaW5nczogYW55LFxuXHRcdG1lc3NhZ2VIYW5kbGVyOiBNZXNzYWdlSGFuZGxlcixcblx0XHRpc05ld09iamVjdDogYm9vbGVhblxuXHQpOiBQcm9taXNlPFY0Q29udGV4dD4ge1xuXHRcdGlmICghb0NvbnRleHQpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gZHJhZnQgZG9jdW1lbnQgaXMgcmVxdWlyZWRcIikpO1xuXHRcdH1cblx0XHRjb25zdCBzUHJvZ3JhbW1pbmdNb2RlbCA9IHRoaXMuZ2V0UHJvZ3JhbW1pbmdNb2RlbChvQ29udGV4dCk7XG5cdFx0aWYgKHNQcm9ncmFtbWluZ01vZGVsICE9PSBQcm9ncmFtbWluZ01vZGVsLlN0aWNreSAmJiBzUHJvZ3JhbW1pbmdNb2RlbCAhPT0gUHJvZ3JhbW1pbmdNb2RlbC5EcmFmdCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiU2F2ZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGRyYWZ0IG9yIHN0aWNreSBzZXNzaW9uIHN1cHBvcnRlZCBzZXJ2aWNlc1wiKTtcblx0XHR9XG5cdFx0Ly8gaW4gY2FzZSBvZiBzYXZpbmcgLyBhY3RpdmF0aW5nIHRoZSBib3VuZCB0cmFuc2l0aW9uIG1lc3NhZ2VzIHNoYWxsIGJlIHJlbW92ZWQgYmVmb3JlIHRoZSBQQVRDSC9QT1NUXG5cdFx0Ly8gaXMgc2VudCB0byB0aGUgYmFja2VuZFxuXHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXG5cdFx0dHJ5IHtcblx0XHRcdEJ1c3lMb2NrZXIubG9jayh0aGlzLm9Mb2NrT2JqZWN0KTtcblx0XHRcdGNvbnN0IG9BY3RpdmVEb2N1bWVudCA9XG5cdFx0XHRcdHNQcm9ncmFtbWluZ01vZGVsID09PSBQcm9ncmFtbWluZ01vZGVsLkRyYWZ0XG5cdFx0XHRcdFx0PyBhd2FpdCBkcmFmdC5hY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0LCB0aGlzLl9nZXRBcHBDb21wb25lbnQoKSwge30sIG1lc3NhZ2VIYW5kbGVyKVxuXHRcdFx0XHRcdDogYXdhaXQgc3RpY2t5LmFjdGl2YXRlRG9jdW1lbnQob0NvbnRleHQsIHRoaXMuX2dldEFwcENvbXBvbmVudCgpKTtcblxuXHRcdFx0Y29uc3QgbWVzc2FnZXNSZWNlaXZlZCA9IG1lc3NhZ2VIYW5kbGluZy5nZXRNZXNzYWdlcygpLmNvbmNhdChtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSkpOyAvLyBnZXQgdW5ib3VuZCBhbmQgYm91bmQgbWVzc2FnZXMgcHJlc2VudCBpbiB0aGUgbW9kZWxcblx0XHRcdGlmICghKG1lc3NhZ2VzUmVjZWl2ZWQubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VzUmVjZWl2ZWRbMF0udHlwZSA9PT0gY29yZUxpYnJhcnkuTWVzc2FnZVR5cGUuU3VjY2VzcykpIHtcblx0XHRcdFx0Ly8gc2hvdyBvdXIgb2JqZWN0IGNyZWF0aW9uIHRvYXN0IG9ubHkgaWYgaXQgaXMgbm90IGNvbWluZyBmcm9tIGJhY2tlbmRcblx0XHRcdFx0TWVzc2FnZVRvYXN0LnNob3coXG5cdFx0XHRcdFx0aXNOZXdPYmplY3Rcblx0XHRcdFx0XHRcdD8gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9PQkpFQ1RfQ1JFQVRFRFwiLCBvUmVzb3VyY2VCdW5kbGUpXG5cdFx0XHRcdFx0XHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfT0JKRUNUX1NBVkVEXCIsIG9SZXNvdXJjZUJ1bmRsZSlcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9BY3RpdmVEb2N1bWVudDtcblx0XHR9IGNhdGNoIChlcnI6IGFueSkge1xuXHRcdFx0aWYgKGFCaW5kaW5ncyAmJiBhQmluZGluZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0XHQvKiBUaGUgc2lkZUVmZmVjdHMgYXJlIGV4ZWN1dGVkIG9ubHkgZm9yIHRhYmxlIGl0ZW1zIGluIHRyYW5zaWVudCBzdGF0ZSAqL1xuXHRcdFx0XHRhQmluZGluZ3MuZm9yRWFjaCgob0xpc3RCaW5kaW5nOiBhbnkpID0+IHtcblx0XHRcdFx0XHRpZiAoIUNvbW1vblV0aWxzLmhhc1RyYW5zaWVudENvbnRleHQob0xpc3RCaW5kaW5nKSAmJiBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcikge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuX2dldEFwcENvbXBvbmVudCgpO1xuXHRcdFx0XHRcdFx0b0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKS5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRhd2FpdCBtZXNzYWdlSGFuZGxlci5zaG93TWVzc2FnZXMoKTtcblx0XHRcdHRocm93IGVycjtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sodGhpcy5vTG9ja09iamVjdCk7XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQgKiBDYWxscyBhIGJvdW5kIG9yIHVuYm91bmQgYWN0aW9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHN0YXRpY1xuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5jYWxsQWN0aW9uXG5cdCAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlclxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHBhcmFtIFttUGFyYW1ldGVyc10gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLnBhcmFtZXRlclZhbHVlc10gQSBtYXAgb2YgYWN0aW9uIHBhcmFtZXRlciBuYW1lcyBhbmQgcHJvdmlkZWQgdmFsdWVzXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuc2tpcFBhcmFtZXRlckRpYWxvZ10gU2tpcHMgdGhlIHBhcmFtZXRlciBkaWFsb2cgaWYgdmFsdWVzIGFyZSBwcm92aWRlZCBmb3IgYWxsIG9mIHRoZW1cblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jb250ZXh0c10gTWFuZGF0b3J5IGZvciBhIGJvdW5kIGFjdGlvbjogRWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgdG8gYmUgY2FsbGVkXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMubW9kZWxdIE1hbmRhdG9yeSBmb3IgYW4gdW5ib3VuZCBhY3Rpb246IEFuIGluc3RhbmNlIG9mIGFuIE9EYXRhIFY0IG1vZGVsXG5cdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnMuaW52b2NhdGlvbkdyb3VwaW5nXSBNb2RlIGhvdyBhY3Rpb25zIGFyZSB0byBiZSBjYWxsZWQ6ICdDaGFuZ2VTZXQnIHRvIHB1dCBhbGwgYWN0aW9uIGNhbGxzIGludG8gb25lIGNoYW5nZXNldCwgJ0lzb2xhdGVkJyB0byBwdXQgdGhlbSBpbnRvIHNlcGFyYXRlIGNoYW5nZXNldHNcblx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5sYWJlbF0gQSBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhlIGFjdGlvblxuXHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmJHZXRCb3VuZENvbnRleHRdIElmIHNwZWNpZmllZCwgdGhlIGFjdGlvbiBwcm9taXNlIHJldHVybnMgdGhlIGJvdW5kIGNvbnRleHRcblx0ICogQHBhcmFtIG9WaWV3IENvbnRhaW5zIHRoZSBvYmplY3Qgb2YgdGhlIGN1cnJlbnQgdmlld1xuXHQgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXJcblx0ICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJlc3BvbnNlIG9iamVjdHMgKFRPRE86IHRvIGJlIGNoYW5nZWQpXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdGFzeW5jIGNhbGxBY3Rpb24oc0FjdGlvbk5hbWU6IHN0cmluZywgbVBhcmFtZXRlcnM6IGFueSwgb1ZpZXc6IFZpZXcgfCBudWxsLCBtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIpOiBQcm9taXNlPGFueT4ge1xuXHRcdG1QYXJhbWV0ZXJzID0gZ2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0bGV0IG9Db250ZXh0LCBvTW9kZWw6IGFueTtcblx0XHRjb25zdCBtQmluZGluZ1BhcmFtZXRlcnMgPSBtUGFyYW1ldGVycy5iaW5kaW5nUGFyYW1ldGVycztcblx0XHRpZiAoIXNBY3Rpb25OYW1lKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQcm92aWRlIG5hbWUgb2YgYWN0aW9uIHRvIGJlIGV4ZWN1dGVkXCIpO1xuXHRcdH1cblx0XHQvLyBhY3Rpb24gaW1wb3J0cyBhcmUgbm90IGRpcmVjdGx5IG9idGFpbmVkIGZyb20gdGhlIG1ldGFNb2RlbCBieSBpdCBpcyBwcmVzZW50IGluc2lkZSB0aGUgZW50aXR5Q29udGFpbmVyXG5cdFx0Ly8gYW5kIHRoZSBhY2lvbnMgaXQgcmVmZXJzIHRvIHByZXNlbnQgb3V0c2lkZSB0aGUgZW50aXR5Y29udGFpbmVyLCBoZW5jZSB0byBvYnRhaW4ga2luZCBvZiB0aGUgYWN0aW9uXG5cdFx0Ly8gc3BsaXQoKSBvbiBpdHMgbmFtZSB3YXMgcmVxdWlyZWRcblx0XHRjb25zdCBzTmFtZSA9IHNBY3Rpb25OYW1lLnNwbGl0KFwiL1wiKVsxXTtcblx0XHRzQWN0aW9uTmFtZSA9IHNOYW1lIHx8IHNBY3Rpb25OYW1lO1xuXHRcdG9Db250ZXh0ID0gc05hbWUgPyB1bmRlZmluZWQgOiBtUGFyYW1ldGVycy5jb250ZXh0cztcblx0XHQvL2NoZWNraW5nIHdoZXRoZXIgdGhlIGNvbnRleHQgaXMgYW4gYXJyYXkgd2l0aCBtb3JlIHRoYW4gMCBsZW5ndGggb3Igbm90IGFuIGFycmF5KGNyZWF0ZSBhY3Rpb24pXG5cdFx0aWYgKG9Db250ZXh0ICYmICgoQXJyYXkuaXNBcnJheShvQ29udGV4dCkgJiYgb0NvbnRleHQubGVuZ3RoKSB8fCAhQXJyYXkuaXNBcnJheShvQ29udGV4dCkpKSB7XG5cdFx0XHRvQ29udGV4dCA9IEFycmF5LmlzQXJyYXkob0NvbnRleHQpID8gb0NvbnRleHRbMF0gOiBvQ29udGV4dDtcblx0XHRcdG9Nb2RlbCA9IG9Db250ZXh0LmdldE1vZGVsKCk7XG5cdFx0fVxuXHRcdGlmIChtUGFyYW1ldGVycy5tb2RlbCkge1xuXHRcdFx0b01vZGVsID0gbVBhcmFtZXRlcnMubW9kZWw7XG5cdFx0fVxuXHRcdGlmICghb01vZGVsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQYXNzIGEgY29udGV4dCBmb3IgYSBib3VuZCBhY3Rpb24gb3IgcGFzcyB0aGUgbW9kZWwgZm9yIGFuIHVuYm91bmQgYWN0aW9uXCIpO1xuXHRcdH1cblx0XHQvLyBnZXQgdGhlIGJpbmRpbmcgcGFyYW1ldGVycyAkc2VsZWN0IGFuZCAkZXhwYW5kIGZvciB0aGUgc2lkZSBlZmZlY3Qgb24gdGhpcyBhY3Rpb25cblx0XHQvLyBhbHNvIGdhdGhlciBhZGRpdGlvbmFsIHByb3BlcnR5IHBhdGhzIHRvIGJlIHJlcXVlc3RlZCBzdWNoIGFzIHRleHQgYXNzb2NpYXRpb25zXG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoYXQuX2dldEFwcENvbXBvbmVudCgpO1xuXHRcdGNvbnN0IG1TaWRlRWZmZWN0c1BhcmFtZXRlcnMgPSBvQXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZSgpLmdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoc0FjdGlvbk5hbWUsIG9Db250ZXh0KSB8fCB7fTtcblxuXHRcdGNvbnN0IGRpc3BsYXlVbmFwcGxpY2FibGVDb250ZXh0c0RpYWxvZyA9ICgpOiBQcm9taXNlPFY0Q29udGV4dFtdIHwgdm9pZD4gPT4ge1xuXHRcdFx0aWYgKCFtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dCB8fCBtUGFyYW1ldGVycy5ub3RBcHBsaWNhYmxlQ29udGV4dC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShtUGFyYW1ldGVycy5jb250ZXh0cyk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGZuT3BlbkFuZEZpbGxEaWFsb2cgPSBmdW5jdGlvbiAob0RsZzogRGlhbG9nKSB7XG5cdFx0XHRcdFx0bGV0IG9EaWFsb2dDb250ZW50O1xuXHRcdFx0XHRcdGNvbnN0IG5Ob3RBcHBsaWNhYmxlID0gbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHQubGVuZ3RoLFxuXHRcdFx0XHRcdFx0YU5vdEFwcGxpY2FibGVJdGVtcyA9IFtdO1xuXHRcdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHQubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdG9EaWFsb2dDb250ZW50ID0gbVBhcmFtZXRlcnMubm90QXBwbGljYWJsZUNvbnRleHRbaV0uZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRhTm90QXBwbGljYWJsZUl0ZW1zLnB1c2gob0RpYWxvZ0NvbnRlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb25zdCBvTm90QXBwbGljYWJsZUl0ZW1zTW9kZWwgPSBuZXcgSlNPTk1vZGVsKGFOb3RBcHBsaWNhYmxlSXRlbXMpO1xuXHRcdFx0XHRcdGNvbnN0IG9Ub3RhbHMgPSBuZXcgSlNPTk1vZGVsKHsgdG90YWw6IG5Ob3RBcHBsaWNhYmxlLCBsYWJlbDogbVBhcmFtZXRlcnMubGFiZWwgfSk7XG5cdFx0XHRcdFx0b0RsZy5zZXRNb2RlbChvTm90QXBwbGljYWJsZUl0ZW1zTW9kZWwsIFwibm90QXBwbGljYWJsZVwiKTtcblx0XHRcdFx0XHRvRGxnLnNldE1vZGVsKG9Ub3RhbHMsIFwidG90YWxzXCIpO1xuXHRcdFx0XHRcdG9EbGcub3BlbigpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHQvLyBTaG93IHRoZSBjb250ZXh0cyB0aGF0IGFyZSBub3QgYXBwbGljYWJsZSBhbmQgd2lsbCBub3QgdGhlcmVmb3JlIGJlIHByb2Nlc3NlZFxuXHRcdFx0XHRjb25zdCBzRnJhZ21lbnROYW1lID0gXCJzYXAuZmUuY29yZS5jb250cm9scy5BY3Rpb25QYXJ0aWFsXCI7XG5cdFx0XHRcdGNvbnN0IG9EaWFsb2dGcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpO1xuXHRcdFx0XHRjb25zdCBvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBzQ2Fub25pY2FsUGF0aCA9IG1QYXJhbWV0ZXJzLmNvbnRleHRzWzBdLmdldENhbm9uaWNhbFBhdGgoKTtcblx0XHRcdFx0Y29uc3Qgc0VudGl0eVNldCA9IGAke3NDYW5vbmljYWxQYXRoLnN1YnN0cigwLCBzQ2Fub25pY2FsUGF0aC5pbmRleE9mKFwiKFwiKSl9L2A7XG5cdFx0XHRcdGNvbnN0IG9EaWFsb2dMYWJlbE1vZGVsID0gbmV3IEpTT05Nb2RlbCh7XG5cdFx0XHRcdFx0dGl0bGU6IG1QYXJhbWV0ZXJzLmxhYmVsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Y29uc3Qgb0ZyYWdtZW50ID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoXG5cdFx0XHRcdFx0XHRvRGlhbG9nRnJhZ21lbnQsXG5cdFx0XHRcdFx0XHR7IG5hbWU6IHNGcmFnbWVudE5hbWUgfSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdFx0ZW50aXR5VHlwZTogb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzRW50aXR5U2V0KSxcblx0XHRcdFx0XHRcdFx0XHRsYWJlbDogb0RpYWxvZ0xhYmVsTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0XHRcdGVudGl0eVR5cGU6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdGxhYmVsOiBvRGlhbG9nTGFiZWxNb2RlbFxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG5cdFx0XHRcdFx0bGV0IG9EaWFsb2c6IERpYWxvZztcblx0XHRcdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IHtcblx0XHRcdFx0XHRcdG9uQ2xvc2U6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdFx0Ly8gVXNlciBjYW5jZWxzIGFjdGlvblxuXHRcdFx0XHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRvbkNvbnRpbnVlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFVzZXJzIGNvbnRpbnVlcyB0aGUgYWN0aW9uIHdpdGggdGhlIGJvdW5kIGNvbnRleHRzXG5cdFx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShtUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRvRGlhbG9nID0gKGF3YWl0IEZyYWdtZW50LmxvYWQoeyBkZWZpbml0aW9uOiBvRnJhZ21lbnQsIGNvbnRyb2xsZXI6IG9Db250cm9sbGVyIH0pKSBhcyBEaWFsb2c7XG5cdFx0XHRcdFx0b0NvbnRyb2xsZXIub25DbG9zZSA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdC8vIFVzZXIgY2FuY2VscyBhY3Rpb25cblx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdG9Db250cm9sbGVyLm9uQ29udGludWUgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHQvLyBVc2VycyBjb250aW51ZXMgdGhlIGFjdGlvbiB3aXRoIHRoZSBib3VuZCBjb250ZXh0c1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShtUGFyYW1ldGVycy5hcHBsaWNhYmxlQ29udGV4dCk7XG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wuYWRkRGVwZW5kZW50KG9EaWFsb2cpO1xuXHRcdFx0XHRcdGZuT3BlbkFuZEZpbGxEaWFsb2cob0RpYWxvZyk7XG5cdFx0XHRcdH0gY2F0Y2ggKG9FcnJvcikge1xuXHRcdFx0XHRcdHJlamVjdChvRXJyb3IpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0dHJ5IHtcblx0XHRcdGxldCBvUmVzdWx0OiBhbnk7XG5cdFx0XHRpZiAob0NvbnRleHQgJiYgb01vZGVsKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnRleHRUb1Byb2Nlc3MgPSBhd2FpdCBkaXNwbGF5VW5hcHBsaWNhYmxlQ29udGV4dHNEaWFsb2coKTtcblx0XHRcdFx0aWYgKGNvbnRleHRUb1Byb2Nlc3MpIHtcblx0XHRcdFx0XHRvUmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9ucy5jYWxsQm91bmRBY3Rpb24oc0FjdGlvbk5hbWUsIGNvbnRleHRUb1Byb2Nlc3MsIG9Nb2RlbCwgb0FwcENvbXBvbmVudCwge1xuXHRcdFx0XHRcdFx0cGFyYW1ldGVyVmFsdWVzOiBtUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMsXG5cdFx0XHRcdFx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IG1QYXJhbWV0ZXJzLmludm9jYXRpb25Hcm91cGluZyxcblx0XHRcdFx0XHRcdGxhYmVsOiBtUGFyYW1ldGVycy5sYWJlbCxcblx0XHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2csXG5cdFx0XHRcdFx0XHRtQmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdGVudGl0eVNldE5hbWU6IG1QYXJhbWV0ZXJzLmVudGl0eVNldE5hbWUsXG5cdFx0XHRcdFx0XHRhZGRpdGlvbmFsU2lkZUVmZmVjdDogbVNpZGVFZmZlY3RzUGFyYW1ldGVycyxcblx0XHRcdFx0XHRcdG9uU3VibWl0dGVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b25SZXNwb25zZTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRwYXJlbnRDb250cm9sOiBtUGFyYW1ldGVycy5wYXJlbnRDb250cm9sLFxuXHRcdFx0XHRcdFx0Y29udHJvbElkOiBtUGFyYW1ldGVycy5jb250cm9sSWQsXG5cdFx0XHRcdFx0XHRpbnRlcm5hbE1vZGVsQ29udGV4dDogbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRcdFx0XHRvcGVyYXRpb25BdmFpbGFibGVNYXA6IG1QYXJhbWV0ZXJzLm9wZXJhdGlvbkF2YWlsYWJsZU1hcCxcblx0XHRcdFx0XHRcdGJJc0NyZWF0ZUFjdGlvbjogbVBhcmFtZXRlcnMuYklzQ3JlYXRlQWN0aW9uLFxuXHRcdFx0XHRcdFx0YkdldEJvdW5kQ29udGV4dDogbVBhcmFtZXRlcnMuYkdldEJvdW5kQ29udGV4dCxcblx0XHRcdFx0XHRcdGJPYmplY3RQYWdlOiBtUGFyYW1ldGVycy5iT2JqZWN0UGFnZSxcblx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjogbVBhcmFtZXRlcnMuZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uLFxuXHRcdFx0XHRcdFx0c2VsZWN0ZWRJdGVtczogbVBhcmFtZXRlcnMuY29udGV4dHNcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvUmVzdWx0ID0gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b1Jlc3VsdCA9IGF3YWl0IG9wZXJhdGlvbnMuY2FsbEFjdGlvbkltcG9ydChzQWN0aW9uTmFtZSwgb01vZGVsLCBvQXBwQ29tcG9uZW50LCB7XG5cdFx0XHRcdFx0cGFyYW1ldGVyVmFsdWVzOiBtUGFyYW1ldGVycy5wYXJhbWV0ZXJWYWx1ZXMsXG5cdFx0XHRcdFx0bGFiZWw6IG1QYXJhbWV0ZXJzLmxhYmVsLFxuXHRcdFx0XHRcdHNraXBQYXJhbWV0ZXJEaWFsb2c6IG1QYXJhbWV0ZXJzLnNraXBQYXJhbWV0ZXJEaWFsb2csXG5cdFx0XHRcdFx0YmluZGluZ1BhcmFtZXRlcnM6IG1CaW5kaW5nUGFyYW1ldGVycyxcblx0XHRcdFx0XHRlbnRpdHlTZXROYW1lOiBtUGFyYW1ldGVycy5lbnRpdHlTZXROYW1lLFxuXHRcdFx0XHRcdG9uU3VibWl0dGVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sodGhhdC5vTG9ja09iamVjdCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRvblJlc3BvbnNlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayh0aGF0Lm9Mb2NrT2JqZWN0KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHBhcmVudENvbnRyb2w6IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wsXG5cdFx0XHRcdFx0aW50ZXJuYWxNb2RlbENvbnRleHQ6IG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0XHRcdG9wZXJhdGlvbkF2YWlsYWJsZU1hcDogbVBhcmFtZXRlcnMub3BlcmF0aW9uQXZhaWxhYmxlTWFwLFxuXHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGVyOiBtZXNzYWdlSGFuZGxlcixcblx0XHRcdFx0XHRiT2JqZWN0UGFnZTogbVBhcmFtZXRlcnMuYk9iamVjdFBhZ2Vcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyLCBtUGFyYW1ldGVycywgc0FjdGlvbk5hbWUpO1xuXHRcdFx0cmV0dXJuIG9SZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZXJyOiBhbnkpIHtcblx0XHRcdGF3YWl0IHRoaXMuX2hhbmRsZUFjdGlvblJlc3BvbnNlKG1lc3NhZ2VIYW5kbGVyLCBtUGFyYW1ldGVycywgc0FjdGlvbk5hbWUpO1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH1cblx0fVxuXHQvKipcblx0ICogSGFuZGxlcyBtZXNzYWdlcyBmb3IgYWN0aW9uIGNhbGwuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlciNfaGFuZGxlQWN0aW9uUmVzcG9uc2Vcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSBtZXNzYWdlSGFuZGxlclxuXHQgKiBAcGFyYW0gbVBhcmFtZXRlcnMgUGFyYW1ldGVycyB0byBiZSBjb25zaWRlcmVkIGZvciB0aGUgYWN0aW9uLlxuXHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSBhZnRlciBtZXNzYWdlIGRpYWxvZyBpcyBvcGVuZWQgaWYgcmVxdWlyZWQuXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9oYW5kbGVBY3Rpb25SZXNwb25zZShtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsIG1QYXJhbWV0ZXJzOiBhbnksIHNBY3Rpb25OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBhVHJhbnNpZW50TWVzc2FnZXMgPSBtZXNzYWdlSGFuZGxpbmcuZ2V0TWVzc2FnZXModHJ1ZSwgdHJ1ZSk7XG5cdFx0Y29uc3QgYWN0aW9uTmFtZSA9IG1QYXJhbWV0ZXJzLmxhYmVsID8gbVBhcmFtZXRlcnMubGFiZWwgOiBzQWN0aW9uTmFtZTtcblx0XHRpZiAoYVRyYW5zaWVudE1lc3NhZ2VzLmxlbmd0aCA+IDAgJiYgbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMuaW50ZXJuYWxNb2RlbENvbnRleHQpIHtcblx0XHRcdG1QYXJhbWV0ZXJzLmludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwic0FjdGlvbk5hbWVcIiwgbVBhcmFtZXRlcnMubGFiZWwgPyBtUGFyYW1ldGVycy5sYWJlbCA6IHNBY3Rpb25OYW1lKTtcblx0XHR9XG5cdFx0bGV0IGNvbnRyb2w7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmNvbnRyb2xJZCkge1xuXHRcdFx0Y29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2wuYnlJZChtUGFyYW1ldGVycy5jb250cm9sSWQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb250cm9sID0gbVBhcmFtZXRlcnMucGFyZW50Q29udHJvbDtcblx0XHR9XG5cdFx0cmV0dXJuIG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcyh7IHNBY3Rpb25OYW1lOiBhY3Rpb25OYW1lLCBjb250cm9sOiBjb250cm9sIH0pO1xuXHR9XG5cdC8qKlxuXHQgKiBIYW5kbGVzIHZhbGlkYXRpb24gZXJyb3JzIGZvciB0aGUgJ0Rpc2NhcmQnIGFjdGlvbi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyI2hhbmRsZVZhbGlkYXRpb25FcnJvclxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHN0YXRpY1xuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRoYW5kbGVWYWxpZGF0aW9uRXJyb3IoKSB7XG5cdFx0Y29uc3Qgb01lc3NhZ2VNYW5hZ2VyID0gQ29yZS5nZXRNZXNzYWdlTWFuYWdlcigpLFxuXHRcdFx0ZXJyb3JUb1JlbW92ZSA9IG9NZXNzYWdlTWFuYWdlclxuXHRcdFx0XHQuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdFx0LmdldERhdGEoKVxuXHRcdFx0XHQuZmlsdGVyKGZ1bmN0aW9uIChlcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0Ly8gb25seSBuZWVkcyB0byBoYW5kbGUgdmFsaWRhdGlvbiBtZXNzYWdlcywgdGVjaG5pY2FsIGFuZCBwZXJzaXN0ZW50IGVycm9ycyBuZWVkcyBub3QgdG8gYmUgY2hlY2tlZCBoZXJlLlxuXHRcdFx0XHRcdGlmIChlcnJvci52YWxpZGF0aW9uKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRvTWVzc2FnZU1hbmFnZXIucmVtb3ZlTWVzc2FnZXMoZXJyb3JUb1JlbW92ZSk7XG5cdH1cblx0LyoqXG5cdCAqIFNob3dzIGEgcG9wb3ZlciBpZiBpdCBuZWVkcyB0byBiZSBzaG93bi5cblx0ICogVE9ETzogUG9wb3ZlciBpcyBzaG93biBpZiB1c2VyIGhhcyBtb2RpZmllZCBhbnkgZGF0YS5cblx0ICogVE9ETzogUG9wb3ZlciBpcyBzaG93biBpZiB0aGVyZSdzIGEgZGlmZmVyZW5jZSBmcm9tIGRyYWZ0IGFkbWluIGRhdGEuXG5cdCAqXG5cdCAqIEBzdGF0aWNcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuX3Nob3dEaXNjYXJkUG9wb3ZlclxuXHQgKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXJcblx0ICogQHBhcmFtIG9DYW5jZWxCdXR0b24gVGhlIGNvbnRyb2wgd2hpY2ggd2lsbCBvcGVuIHRoZSBwb3BvdmVyXG5cdCAqIEBwYXJhbSBiSXNNb2RpZmllZFxuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlXG5cdCAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgaWYgdXNlciBjb25maXJtcyBkaXNjYXJkLCByZWplY3RzIGlmIG90aGVyd2lzZSwgcmVqZWN0cyBpZiBubyBjb250cm9sIHBhc3NlZCB0byBvcGVuIHBvcG92ZXJcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBmaW5hbFxuXHQgKi9cblx0X3Nob3dEaXNjYXJkUG9wb3ZlcihvQ2FuY2VsQnV0dG9uOiBhbnksIGJJc01vZGlmaWVkOiBhbnksIG9SZXNvdXJjZUJ1bmRsZTogYW55KSB7XG5cdFx0Ly8gVE9ETzogSW1wbGVtZW50IHRoaXMgcG9wb3ZlciBhcyBhIGZyYWdtZW50IGFzIGluIHYyPz9cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cdFx0XHRpZiAoIW9DYW5jZWxCdXR0b24pIHtcblx0XHRcdFx0cmVqZWN0KFwiQ2FuY2VsIGJ1dHRvbiBub3QgZm91bmRcIik7XG5cdFx0XHR9XG5cdFx0XHQvL1Nob3cgcG9wb3ZlciBvbmx5IHdoZW4gZGF0YSBpcyBjaGFuZ2VkLlxuXHRcdFx0aWYgKGJJc01vZGlmaWVkKSB7XG5cdFx0XHRcdGNvbnN0IGZuT25BZnRlckRpc2NhcmQgPSAoKSA9PiB7XG5cdFx0XHRcdFx0b0NhbmNlbEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpO1xuXHRcdFx0XHRcdGlmICh0aGF0Ll9vUG9wb3Zlci5kYXRhKFwiY29udGludWVEaXNjYXJkXCIpKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJlamVjdChcIkRpc2NhcmQgb3BlcmF0aW9uIHdhcyByZWplY3RlZC4gRG9jdW1lbnQgaGFzIG5vdCBiZWVuIGRpc2NhcmRlZFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhhdC5fb1BvcG92ZXIuZGV0YWNoQWZ0ZXJDbG9zZShmbk9uQWZ0ZXJEaXNjYXJkKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKCF0aGF0Ll9vUG9wb3Zlcikge1xuXHRcdFx0XHRcdGNvbnN0IG9UZXh0ID0gbmV3IFRleHQoe1xuXHRcdFx0XHRcdFx0XHQvL1RoaXMgdGV4dCBpcyB0aGUgc2FtZSBhcyBMUiB2Mi5cblx0XHRcdFx0XHRcdFx0Ly9UT0RPOiBEaXNwbGF5IG1lc3NhZ2UgcHJvdmlkZWQgYnkgYXBwIGRldmVsb3Blcj8/P1xuXHRcdFx0XHRcdFx0XHR0ZXh0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfVFJBTlNBQ1RJT05fSEVMUEVSX0RSQUZUX0RJU0NBUkRfTUVTU0FHRVwiLCBvUmVzb3VyY2VCdW5kbGUpXG5cdFx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHRcdG9CdXR0b24gPSBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHRcdFx0dGV4dDogQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJDX1RSQU5TQUNUSU9OX0hFTFBFUl9EUkFGVF9ESVNDQVJEX0JVVFRPTlwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdFx0XHR3aWR0aDogXCIxMDAlXCIsXG5cdFx0XHRcdFx0XHRcdHByZXNzOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0dGhhdC5oYW5kbGVWYWxpZGF0aW9uRXJyb3IoKTtcblx0XHRcdFx0XHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5kYXRhKFwiY29udGludWVEaXNjYXJkXCIsIHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyLmNsb3NlKCk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGFyaWFMYWJlbGxlZEJ5OiBvVGV4dFxuXHRcdFx0XHRcdFx0fSBhcyBhbnkpO1xuXHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyID0gbmV3IFBvcG92ZXIoe1xuXHRcdFx0XHRcdFx0c2hvd0hlYWRlcjogZmFsc2UsXG5cdFx0XHRcdFx0XHRwbGFjZW1lbnQ6IFwiVG9wXCIsXG5cdFx0XHRcdFx0XHRjb250ZW50OiBbXG5cdFx0XHRcdFx0XHRcdG5ldyBWQm94KHtcblx0XHRcdFx0XHRcdFx0XHRpdGVtczogW29UZXh0LCBvQnV0dG9uXVxuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRcdGJlZm9yZU9wZW46ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gbWFrZSBzdXJlIHRvIE5PVCB0cmlnZ2VyIG11bHRpcGxlIGNhbmNlbCBmbG93c1xuXHRcdFx0XHRcdFx0XHRvQ2FuY2VsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHR0aGF0Ll9vUG9wb3Zlci5zZXRJbml0aWFsRm9jdXMob0J1dHRvbik7XG5cdFx0XHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyLmRhdGEoXCJjb250aW51ZURpc2NhcmRcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHRoYXQuX29Qb3BvdmVyLmFkZFN0eWxlQ2xhc3MoXCJzYXBVaUNvbnRlbnRQYWRkaW5nXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoYXQuX29Qb3BvdmVyLmF0dGFjaEFmdGVyQ2xvc2UoZm5PbkFmdGVyRGlzY2FyZCk7XG5cdFx0XHRcdHRoYXQuX29Qb3BvdmVyLm9wZW5CeShvQ2FuY2VsQnV0dG9uLCBmYWxzZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGF0LmhhbmRsZVZhbGlkYXRpb25FcnJvcigpO1xuXHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgb3duZXIgY29tcG9uZW50LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHN0YXRpY1xuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAbmFtZSBzYXAuZmUuY29yZS5UcmFuc2FjdGlvbkhlbHBlci5fZ2V0T3duZXJDb21wb25lbnRcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEByZXR1cm5zIFRoZSBhcHAgY29tcG9uZW50XG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9nZXRBcHBDb21wb25lbnQoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29BcHBDb21wb25lbnQ7XG5cdH1cblxuXHRfb25GaWVsZENoYW5nZShvRXZlbnQ6IGFueSwgb0NyZWF0ZUJ1dHRvbjogYW55LCBtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXIsIGZuVmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXM6IEZ1bmN0aW9uKSB7XG5cdFx0bWVzc2FnZUhhbmRsZXIucmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0Y29uc3Qgb0ZpZWxkID0gb0V2ZW50LmdldFNvdXJjZSgpO1xuXHRcdGNvbnN0IG9GaWVsZFByb21pc2UgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKTtcblx0XHRpZiAob0ZpZWxkUHJvbWlzZSkge1xuXHRcdFx0cmV0dXJuIG9GaWVsZFByb21pc2Vcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKHZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHQvLyBTZXR0aW5nIHZhbHVlIG9mIGZpZWxkIGFzICcnIGluIGNhc2Ugb2YgdmFsdWUgaGVscCBhbmQgdmFsaWRhdGluZyBvdGhlciBmaWVsZHNcblx0XHRcdFx0XHRvRmllbGQuc2V0VmFsdWUodmFsdWUpO1xuXHRcdFx0XHRcdGZuVmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMoKTtcblxuXHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0VmFsdWUoKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uICh2YWx1ZTogYW55KSB7XG5cdFx0XHRcdFx0aWYgKHZhbHVlICE9PSBcIlwiKSB7XG5cdFx0XHRcdFx0XHQvL2Rpc2FibGluZyB0aGUgY29udGludWUgYnV0dG9uIGluIGNhc2Ugb2YgaW52YWxpZCB2YWx1ZSBpbiBmaWVsZFxuXHRcdFx0XHRcdFx0b0NyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gdmFsaWRhdGluZyBhbGwgdGhlIGZpZWxkcyBpbiBjYXNlIG9mIGVtcHR5IHZhbHVlIGluIGZpZWxkXG5cdFx0XHRcdFx0XHRvRmllbGQuc2V0VmFsdWUodmFsdWUpO1xuXHRcdFx0XHRcdFx0Zm5WYWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcygpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0X2xhdW5jaERpYWxvZ1dpdGhLZXlGaWVsZHMoXG5cdFx0b0xpc3RCaW5kaW5nOiBPRGF0YUxpc3RCaW5kaW5nLFxuXHRcdG1GaWVsZHM6IGFueSxcblx0XHRvTW9kZWw6IE9EYXRhTW9kZWwsXG5cdFx0bVBhcmFtZXRlcnM6IGFueSxcblx0XHRtZXNzYWdlSGFuZGxlcjogTWVzc2FnZUhhbmRsZXJcblx0KSB7XG5cdFx0bGV0IG9EaWFsb2c6IERpYWxvZztcblx0XHRjb25zdCBvUGFyZW50Q29udHJvbCA9IG1QYXJhbWV0ZXJzLnBhcmVudENvbnRyb2w7XG5cblx0XHQvLyBDcmF0ZSBhIGZha2UgKHRyYW5zaWVudCkgbGlzdEJpbmRpbmcgYW5kIGNvbnRleHQsIGp1c3QgZm9yIHRoZSBiaW5kaW5nIGNvbnRleHQgb2YgdGhlIGRpYWxvZ1xuXHRcdGNvbnN0IG9UcmFuc2llbnRMaXN0QmluZGluZyA9IG9Nb2RlbC5iaW5kTGlzdChvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBvTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLCBbXSwgW10sIHtcblx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJzdWJtaXRMYXRlclwiXG5cdFx0fSkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0XHRvVHJhbnNpZW50TGlzdEJpbmRpbmcucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0LyogKi9cblx0XHR9O1xuXHRcdGNvbnN0IG9UcmFuc2llbnRDb250ZXh0ID0gb1RyYW5zaWVudExpc3RCaW5kaW5nLmNyZWF0ZShtUGFyYW1ldGVycy5kYXRhLCB0cnVlKTtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRjb25zdCBzRnJhZ21lbnROYW1lID0gXCJzYXAvZmUvY29yZS9jb250cm9scy9Ob25Db21wdXRlZFZpc2libGVLZXlGaWVsZHNEaWFsb2dcIjtcblx0XHRcdGNvbnN0IG9GcmFnbWVudCA9IFhNTFRlbXBsYXRlUHJvY2Vzc29yLmxvYWRUZW1wbGF0ZShzRnJhZ21lbnROYW1lLCBcImZyYWdtZW50XCIpLFxuXHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUgPSBvUGFyZW50Q29udHJvbC5nZXRDb250cm9sbGVyKCkub1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRvTWV0YU1vZGVsID0gb01vZGVsLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRhSW1tdXRhYmxlRmllbGRzOiBhbnlbXSA9IFtdLFxuXHRcdFx0XHRvQXBwQ29tcG9uZW50ID0gdGhpcy5fZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRcdHNQYXRoID0gKG9MaXN0QmluZGluZy5pc1JlbGF0aXZlKCkgPyBvTGlzdEJpbmRpbmcuZ2V0UmVzb2x2ZWRQYXRoKCkgOiBvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpKSBhcyBzdHJpbmcsXG5cdFx0XHRcdG9FbnRpdHlTZXRDb250ZXh0ID0gb01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChzUGF0aCkgYXMgQ29udGV4dCxcblx0XHRcdFx0c01ldGFQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aCk7XG5cdFx0XHRmb3IgKGNvbnN0IGkgaW4gbUZpZWxkcykge1xuXHRcdFx0XHRhSW1tdXRhYmxlRmllbGRzLnB1c2gob01ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgJHtzTWV0YVBhdGh9LyR7bUZpZWxkc1tpXX1gKSk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBvSW1tdXRhYmxlQ3R4TW9kZWwgPSBuZXcgSlNPTk1vZGVsKGFJbW11dGFibGVGaWVsZHMpO1xuXHRcdFx0Y29uc3Qgb0ltbXV0YWJsZUN0eCA9IG9JbW11dGFibGVDdHhNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgYXMgQ29udGV4dDtcblx0XHRcdGNvbnN0IGFSZXF1aXJlZFByb3BlcnRpZXMgPSBDb21tb25VdGlscy5nZXRSZXF1aXJlZFByb3BlcnRpZXNGcm9tSW5zZXJ0UmVzdHJpY3Rpb25zKHNNZXRhUGF0aCwgb01ldGFNb2RlbCk7XG5cdFx0XHRjb25zdCBvUmVxdWlyZWRQcm9wZXJ0eVBhdGhzQ3R4TW9kZWwgPSBuZXcgSlNPTk1vZGVsKGFSZXF1aXJlZFByb3BlcnRpZXMpO1xuXHRcdFx0Y29uc3Qgb1JlcXVpcmVkUHJvcGVydHlQYXRoc0N0eCA9IG9SZXF1aXJlZFByb3BlcnR5UGF0aHNDdHhNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikgYXMgQ29udGV4dDtcblx0XHRcdGNvbnN0IG9OZXdGcmFnbWVudCA9IGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKFxuXHRcdFx0XHRvRnJhZ21lbnQsXG5cdFx0XHRcdHsgbmFtZTogc0ZyYWdtZW50TmFtZSB9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IG9FbnRpdHlTZXRDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZmllbGRzOiBvSW1tdXRhYmxlQ3R4LFxuXHRcdFx0XHRcdFx0cmVxdWlyZWRQcm9wZXJ0aWVzOiBvUmVxdWlyZWRQcm9wZXJ0eVBhdGhzQ3R4XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRtb2RlbHM6IHtcblx0XHRcdFx0XHRcdGVudGl0eVNldDogb0VudGl0eVNldENvbnRleHQuZ2V0TW9kZWwoKSxcblx0XHRcdFx0XHRcdGZpZWxkczogb0ltbXV0YWJsZUN0eC5nZXRNb2RlbCgpLFxuXHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0cmVxdWlyZWRQcm9wZXJ0aWVzOiBvUmVxdWlyZWRQcm9wZXJ0eVBhdGhzQ3R4TW9kZWxcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdCk7XG5cblx0XHRcdGxldCBhRm9ybUVsZW1lbnRzOiBhbnlbXSA9IFtdO1xuXHRcdFx0Y29uc3QgbUZpZWxkVmFsdWVNYXA6IGFueSA9IHt9O1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuXHRcdFx0bGV0IG9DcmVhdGVCdXR0b246IEJ1dHRvbjtcblxuXHRcdFx0Y29uc3QgdmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGxldCBiRW5hYmxlZCA9IGZhbHNlO1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGNvbnN0IGFSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0XHRhRm9ybUVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdC5tYXAoZnVuY3Rpb24gKG9Gb3JtRWxlbWVudDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Gb3JtRWxlbWVudC5nZXRGaWVsZHMoKVswXTtcblx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0LmZpbHRlcihmdW5jdGlvbiAob0ZpZWxkOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBUaGUgY29udGludWUgYnV0dG9uIHNob3VsZCByZW1haW4gZGlzYWJsZWQgaW4gY2FzZSBvZiBlbXB0eSByZXF1aXJlZCBmaWVsZHMuXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRSZXF1aXJlZCgpIHx8IG9GaWVsZC5nZXRWYWx1ZVN0YXRlKCkgPT09IFZhbHVlU3RhdGUuRXJyb3I7XG5cdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdC5tYXAoYXN5bmMgZnVuY3Rpb24gKG9GaWVsZDogYW55KSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc0ZpZWxkSWQgPSBvRmllbGQuZ2V0SWQoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc0ZpZWxkSWQgaW4gbUZpZWxkVmFsdWVNYXApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHZWYWx1ZSA9IGF3YWl0IG1GaWVsZFZhbHVlTWFwW3NGaWVsZElkXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9GaWVsZC5nZXRWYWx1ZSgpID09PSBcIlwiID8gdW5kZWZpbmVkIDogdlZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvRmllbGQuZ2V0VmFsdWUoKSA9PT0gXCJcIiA/IHVuZGVmaW5lZCA6IG9GaWVsZC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YkVuYWJsZWQgPSBhUmVzdWx0cy5ldmVyeShmdW5jdGlvbiAodlZhbHVlOiBhbnkpIHtcblx0XHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZWYWx1ZSkpIHtcblx0XHRcdFx0XHRcdFx0dlZhbHVlID0gdlZhbHVlWzBdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuIHZWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZWYWx1ZSAhPT0gbnVsbCAmJiB2VmFsdWUgIT09IFwiXCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRcdGJFbmFibGVkID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0b0NyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkKGJFbmFibGVkKTtcblx0XHRcdH07XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IHtcblx0XHRcdFx0Lypcblx0XHRcdFx0XHRcdFx0XHRcdGZpcmVkIG9uIGZvY3VzIG91dCBmcm9tIGZpZWxkIG9yIG9uIHNlbGVjdGluZyBhIHZhbHVlIGZyb20gdGhlIHZhbHVlaGVscC5cblx0XHRcdFx0XHRcdFx0XHRcdHRoZSBjcmVhdGUgYnV0dG9uIGlzIGVuYWJsZWQgd2hlbiBhIHZhbHVlIGlzIGFkZGVkLlxuXHRcdFx0XHRcdFx0XHRcdFx0bGl2ZUNoYW5nZSBpcyBub3QgZmlyZWQgd2hlbiB2YWx1ZSBpcyBhZGRlZCBmcm9tIHZhbHVlaGVscC5cblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlIHZhbGlkYXRpb24gaXMgbm90IGRvbmUgZm9yIGNyZWF0ZSBidXR0b24gZW5hYmxlbWVudC5cblx0XHRcdFx0XHRcdFx0XHQqL1xuXHRcdFx0XHRoYW5kbGVDaGFuZ2U6IChvRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHNGaWVsZElkID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImlkXCIpO1xuXHRcdFx0XHRcdG1GaWVsZFZhbHVlTWFwW3NGaWVsZElkXSA9IHRoaXMuX29uRmllbGRDaGFuZ2Uob0V2ZW50LCBvQ3JlYXRlQnV0dG9uLCBtZXNzYWdlSGFuZGxlciwgdmFsaWRhdGVSZXF1aXJlZFByb3BlcnRpZXMpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQvKlxuXHRcdFx0XHRcdFx0XHRcdFx0ZmlyZWQgb24ga2V5IHByZXNzLiB0aGUgY3JlYXRlIGJ1dHRvbiBpcyBlbmFibGVkIHdoZW4gYSB2YWx1ZSBpcyBhZGRlZC5cblx0XHRcdFx0XHRcdFx0XHRcdGxpdmVDaGFuZ2UgaXMgbm90IGZpcmVkIHdoZW4gdmFsdWUgaXMgYWRkZWQgZnJvbSB2YWx1ZWhlbHAuXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZSB2YWxpZGF0aW9uIGlzIG5vdCBkb25lIGZvciBjcmVhdGUgYnV0dG9uIGVuYWJsZW1lbnQuXG5cdFx0XHRcdFx0XHRcdFx0Ki9cblx0XHRcdFx0aGFuZGxlTGl2ZUNoYW5nZTogKG9FdmVudDogYW55KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgc0ZpZWxkSWQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiaWRcIik7XG5cdFx0XHRcdFx0Y29uc3QgdlZhbHVlID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInZhbHVlXCIpO1xuXHRcdFx0XHRcdG1GaWVsZFZhbHVlTWFwW3NGaWVsZElkXSA9IHZWYWx1ZTtcblx0XHRcdFx0XHR2YWxpZGF0ZVJlcXVpcmVkUHJvcGVydGllcygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCBvRGlhbG9nQ29udGVudDogYW55ID0gYXdhaXQgRnJhZ21lbnQubG9hZCh7XG5cdFx0XHRcdGRlZmluaXRpb246IG9OZXdGcmFnbWVudCxcblx0XHRcdFx0Y29udHJvbGxlcjogb0NvbnRyb2xsZXJcblx0XHRcdH0pO1xuXHRcdFx0bGV0IG9SZXN1bHQ6IGFueTtcblx0XHRcdGNvbnN0IGNsb3NlRGlhbG9nID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHQvL3JlamVjdGVkL3Jlc29sdmVkIHRoZSBwcm9taXMgcmV0dXJuZWQgYnkgX2xhdW5jaERpYWxvZ1dpdGhLZXlGaWVsZHNcblx0XHRcdFx0Ly9hcyBzb29uIGFzIHRoZSBkaWFsb2cgaXMgY2xvc2VkLiBXaXRob3V0IHdhaXRpbmcgZm9yIHRoZSBkaWFsb2cnc1xuXHRcdFx0XHQvL2FuaW1hdGlvbiB0byBmaW5pc2hcblx0XHRcdFx0aWYgKG9SZXN1bHQuZXJyb3IpIHtcblx0XHRcdFx0XHRyZWplY3Qob1Jlc3VsdC5lcnJvcik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzb2x2ZShvUmVzdWx0LnJlc3BvbnNlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRvRGlhbG9nLmNsb3NlKCk7XG5cdFx0XHR9O1xuXG5cdFx0XHRvRGlhbG9nID0gbmV3IERpYWxvZyhnZW5lcmF0ZShbXCJDcmVhdGVEaWFsb2dcIiwgc01ldGFQYXRoXSksIHtcblx0XHRcdFx0dGl0bGU6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfU0FQRkVfQUNUSU9OX0NSRUFURVwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRjb250ZW50OiBbb0RpYWxvZ0NvbnRlbnRdLFxuXHRcdFx0XHRiZWdpbkJ1dHRvbjoge1xuXHRcdFx0XHRcdHRleHQ6IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfU0FQRkVfQUNUSU9OX0NSRUFURV9CVVRUT05cIiwgb1Jlc291cmNlQnVuZGxlKSxcblx0XHRcdFx0XHR0eXBlOiBcIkVtcGhhc2l6ZWRcIixcblx0XHRcdFx0XHRwcmVzczogYXN5bmMgKG9FdmVudDogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBjcmVhdGVCdXR0b24gPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRcdFx0XHRjcmVhdGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7XG5cdFx0XHRcdFx0XHRCdXN5TG9ja2VyLmxvY2sob0RpYWxvZyk7XG5cdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5iSXNDcmVhdGVEaWFsb2cgPSB0cnVlO1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYVZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdFx0XHRcdE9iamVjdC5rZXlzKG1GaWVsZFZhbHVlTWFwKS5tYXAoYXN5bmMgZnVuY3Rpb24gKHNLZXk6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb1ZhbHVlID0gYXdhaXQgbUZpZWxkVmFsdWVNYXBbc0tleV07XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nVmFsdWU6IGFueSA9IHt9O1xuXHRcdFx0XHRcdFx0XHRcdFx0b0RpYWxvZ1ZhbHVlW3NLZXldID0gb1ZhbHVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9EaWFsb2dWYWx1ZTtcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRpZiAobVBhcmFtZXRlcnMuYmVmb3JlQ3JlYXRlQ2FsbEJhY2spIHtcblx0XHRcdFx0XHRcdFx0XHRhd2FpdCB0b0VTNlByb21pc2UoXG5cdFx0XHRcdFx0XHRcdFx0XHRtUGFyYW1ldGVycy5iZWZvcmVDcmVhdGVDYWxsQmFjayh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvTGlzdEJpbmRpbmcgJiYgb0xpc3RCaW5kaW5nLmdldFBhdGgoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y3JlYXRlUGFyYW1ldGVyczogYVZhbHVlc1xuXHRcdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHRyYW5zaWVudERhdGEgPSBvVHJhbnNpZW50Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY3JlYXRlRGF0YTogYW55ID0ge307XG5cdFx0XHRcdFx0XHRcdE9iamVjdC5rZXlzKHRyYW5zaWVudERhdGEpLmZvckVhY2goZnVuY3Rpb24gKHNQcm9wZXJ0eVBhdGg6IHN0cmluZykge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9Qcm9wZXJ0eSA9IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vJHtzUHJvcGVydHlQYXRofWApO1xuXHRcdFx0XHRcdFx0XHRcdC8vIGVuc3VyZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwYXlsb2FkLCBkZWVwIGNyZWF0ZSBub3Qgc3VwcG9ydGVkXG5cdFx0XHRcdFx0XHRcdFx0aWYgKG9Qcm9wZXJ0eSAmJiBvUHJvcGVydHkuJGtpbmQgPT09IFwiTmF2aWdhdGlvblByb3BlcnR5XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Y3JlYXRlRGF0YVtzUHJvcGVydHlQYXRoXSA9IHRyYW5zaWVudERhdGFbc1Byb3BlcnR5UGF0aF07XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvTmV3RG9jdW1lbnRDb250ZXh0ID0gb0xpc3RCaW5kaW5nLmNyZWF0ZShcblx0XHRcdFx0XHRcdFx0XHRjcmVhdGVEYXRhLFxuXHRcdFx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRlQXRFbmQsXG5cdFx0XHRcdFx0XHRcdFx0bVBhcmFtZXRlcnMuaW5hY3RpdmVcblx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRjb25zdCBvUHJvbWlzZSA9IHRoaXMub25BZnRlckNyZWF0ZUNvbXBsZXRpb24ob0xpc3RCaW5kaW5nLCBvTmV3RG9jdW1lbnRDb250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdFx0XHRcdFx0XHRcdGxldCBvUmVzcG9uc2U6IGFueSA9IGF3YWl0IG9Qcm9taXNlO1xuXHRcdFx0XHRcdFx0XHRpZiAoIW9SZXNwb25zZSB8fCAob1Jlc3BvbnNlICYmIG9SZXNwb25zZS5iS2VlcERpYWxvZ09wZW4gIT09IHRydWUpKSB7XG5cdFx0XHRcdFx0XHRcdFx0b1Jlc3BvbnNlID0gb1Jlc3BvbnNlID8/IHt9O1xuXHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuc2V0QmluZGluZ0NvbnRleHQobnVsbCBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0XHRcdG9SZXNwb25zZS5uZXdDb250ZXh0ID0gb05ld0RvY3VtZW50Q29udGV4dDtcblx0XHRcdFx0XHRcdFx0XHRvUmVzdWx0ID0geyByZXNwb25zZTogb1Jlc3BvbnNlIH07XG5cdFx0XHRcdFx0XHRcdFx0Y2xvc2VEaWFsb2coKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBjYXRjaCAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gaW4gY2FzZSBvZiBjcmVhdGlvbiBmYWlsZWQsIGRpYWxvZyBzaG91bGQgc3RheSBvcGVuIC0gdG8gYWNoaWV2ZSB0aGUgc2FtZSwgbm90aGluZyBoYXMgdG8gYmUgZG9uZSAobGlrZSBpbiBjYXNlIG9mIHN1Y2Nlc3Mgd2l0aCBiS2VlcERpYWxvZ09wZW4pXG5cdFx0XHRcdFx0XHRcdGlmIChvRXJyb3IgIT09IEZFTGlicmFyeS5Db25zdGFudHMuQ3JlYXRpb25GYWlsZWQpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBvdGhlciBlcnJvcnMgYXJlIG5vdCBleHBlY3RlZFxuXHRcdFx0XHRcdFx0XHRcdG9SZXN1bHQgPSB7IGVycm9yOiBvRXJyb3IgfTtcblx0XHRcdFx0XHRcdFx0XHRjbG9zZURpYWxvZygpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNyZWF0ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvRGlhbG9nKTtcblx0XHRcdFx0XHRcdFx0bWVzc2FnZUhhbmRsZXIuc2hvd01lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRlbmRCdXR0b246IHtcblx0XHRcdFx0XHR0ZXh0OiBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIkNfQ09NTU9OX0FDVElPTl9QQVJBTUVURVJfRElBTE9HX0NBTkNFTFwiLCBvUmVzb3VyY2VCdW5kbGUpLFxuXHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRvUmVzdWx0ID0geyBlcnJvcjogRkVMaWJyYXJ5LkNvbnN0YW50cy5DYW5jZWxBY3Rpb25EaWFsb2cgfTtcblx0XHRcdFx0XHRcdGNsb3NlRGlhbG9nKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRhZnRlckNsb3NlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Ly8gc2hvdyBmb290ZXIgYXMgcGVyIFVYIGd1aWRlbGluZXMgd2hlbiBkaWFsb2cgaXMgbm90IG9wZW5cblx0XHRcdFx0XHQob0RpYWxvZy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0KT8uc2V0UHJvcGVydHkoXCJpc0NyZWF0ZURpYWxvZ09wZW5cIiwgZmFsc2UpO1xuXHRcdFx0XHRcdG9EaWFsb2cuZGVzdHJveSgpO1xuXHRcdFx0XHRcdG9UcmFuc2llbnRMaXN0QmluZGluZy5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gYXMgYW55KTtcblx0XHRcdGFGb3JtRWxlbWVudHMgPSBvRGlhbG9nQ29udGVudD8uZ2V0QWdncmVnYXRpb24oXCJmb3JtXCIpLmdldEFnZ3JlZ2F0aW9uKFwiZm9ybUNvbnRhaW5lcnNcIilbMF0uZ2V0QWdncmVnYXRpb24oXCJmb3JtRWxlbWVudHNcIik7XG5cdFx0XHRpZiAob1BhcmVudENvbnRyb2wgJiYgb1BhcmVudENvbnRyb2wuYWRkRGVwZW5kZW50KSB7XG5cdFx0XHRcdC8vIGlmIHRoZXJlIGlzIGEgcGFyZW50IGNvbnRyb2wgc3BlY2lmaWVkIGFkZCB0aGUgZGlhbG9nIGFzIGRlcGVuZGVudFxuXHRcdFx0XHRvUGFyZW50Q29udHJvbC5hZGREZXBlbmRlbnQob0RpYWxvZyk7XG5cdFx0XHR9XG5cdFx0XHRvQ3JlYXRlQnV0dG9uID0gb0RpYWxvZy5nZXRCZWdpbkJ1dHRvbigpO1xuXHRcdFx0b0RpYWxvZy5zZXRCaW5kaW5nQ29udGV4dChvVHJhbnNpZW50Q29udGV4dCk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBDb21tb25VdGlscy5zZXRVc2VyRGVmYXVsdHMoXG5cdFx0XHRcdFx0b0FwcENvbXBvbmVudCxcblx0XHRcdFx0XHRhSW1tdXRhYmxlRmllbGRzLFxuXHRcdFx0XHRcdG9UcmFuc2llbnRDb250ZXh0LFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0ZUFjdGlvbixcblx0XHRcdFx0XHRtUGFyYW1ldGVycy5kYXRhXG5cdFx0XHRcdCk7XG5cdFx0XHRcdHZhbGlkYXRlUmVxdWlyZWRQcm9wZXJ0aWVzKCk7XG5cdFx0XHRcdC8vIGZvb3RlciBtdXN0IG5vdCBiZSB2aXNpYmxlIHdoZW4gdGhlIGRpYWxvZyBpcyBvcGVuIGFzIHBlciBVWCBndWlkZWxpbmVzXG5cdFx0XHRcdChvRGlhbG9nLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQpLnNldFByb3BlcnR5KFwiaXNDcmVhdGVEaWFsb2dPcGVuXCIsIHRydWUpO1xuXHRcdFx0XHRvRGlhbG9nLm9wZW4oKTtcblx0XHRcdH0gY2F0Y2ggKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdGF3YWl0IG1lc3NhZ2VIYW5kbGVyLnNob3dNZXNzYWdlcygpO1xuXHRcdFx0XHR0aHJvdyBvRXJyb3I7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0b25BZnRlckNyZWF0ZUNvbXBsZXRpb24ob0xpc3RCaW5kaW5nOiBhbnksIG9OZXdEb2N1bWVudENvbnRleHQ6IGFueSwgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGxldCBmblJlc29sdmU6IEZ1bmN0aW9uO1xuXHRcdGNvbnN0IG9Qcm9taXNlID0gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcblx0XHRcdGZuUmVzb2x2ZSA9IHJlc29sdmU7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBmbkNyZWF0ZUNvbXBsZXRlZCA9IChvRXZlbnQ6IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwiY29udGV4dFwiKSxcblx0XHRcdFx0YlN1Y2Nlc3MgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3VjY2Vzc1wiKTtcblx0XHRcdGlmIChvQ29udGV4dCA9PT0gb05ld0RvY3VtZW50Q29udGV4dCkge1xuXHRcdFx0XHRvTGlzdEJpbmRpbmcuZGV0YWNoQ3JlYXRlQ29tcGxldGVkKGZuQ3JlYXRlQ29tcGxldGVkLCB0aGlzKTtcblx0XHRcdFx0Zm5SZXNvbHZlKGJTdWNjZXNzKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdGNvbnN0IGZuU2FmZUNvbnRleHRDcmVhdGVkID0gKCkgPT4ge1xuXHRcdFx0b05ld0RvY3VtZW50Q29udGV4dFxuXHRcdFx0XHQuY3JlYXRlZCgpXG5cdFx0XHRcdC50aGVuKHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdExvZy50cmFjZShcInRyYW5zaWVudCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoY29udGV4dEVycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgY3JlYXRpb24gY29udGV4dCBkZWxldGlvbiBlcnJvclwiLCBjb250ZXh0RXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0b0xpc3RCaW5kaW5nLmF0dGFjaENyZWF0ZUNvbXBsZXRlZChmbkNyZWF0ZUNvbXBsZXRlZCwgdGhpcyk7XG5cblx0XHRyZXR1cm4gb1Byb21pc2UudGhlbigoYlN1Y2Nlc3M6IGJvb2xlYW4pID0+IHtcblx0XHRcdGlmICghYlN1Y2Nlc3MpIHtcblx0XHRcdFx0aWYgKCFtUGFyYW1ldGVycy5rZWVwVHJhbnNpZW50Q29udGV4dE9uRmFpbGVkKSB7XG5cdFx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSBwZW5kaW5nIFBPU1QgYW5kIGRlbGV0ZSB0aGUgY29udGV4dCBpbiB0aGUgbGlzdEJpbmRpbmdcblx0XHRcdFx0XHRmblNhZmVDb250ZXh0Q3JlYXRlZCgpOyAvLyBUbyBhdm9pZCBhICdyZXF1ZXN0IGNhbmNlbGxlZCcgZXJyb3IgaW4gdGhlIGNvbnNvbGVcblx0XHRcdFx0XHRvTGlzdEJpbmRpbmcucmVzZXRDaGFuZ2VzKCk7XG5cdFx0XHRcdFx0b0xpc3RCaW5kaW5nLmdldE1vZGVsKCkucmVzZXRDaGFuZ2VzKG9MaXN0QmluZGluZy5nZXRVcGRhdGVHcm91cElkKCkpO1xuXG5cdFx0XHRcdFx0dGhyb3cgRkVMaWJyYXJ5LkNvbnN0YW50cy5DcmVhdGlvbkZhaWxlZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4geyBiS2VlcERpYWxvZ09wZW46IHRydWUgfTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiBvTmV3RG9jdW1lbnRDb250ZXh0LmNyZWF0ZWQoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBOZXdBY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAc3RhdGljXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBuYW1lIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyLl9nZXROZXdBY3Rpb25cblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSBvU3RhcnR1cFBhcmFtZXRlcnMgU3RhcnR1cCBwYXJhbWV0ZXJzIG9mIHRoZSBhcHBsaWNhdGlvblxuXHQgKiBAcGFyYW0gc0NyZWF0ZUhhc2ggSGFzaCB0byBiZSBjaGVja2VkIGZvciBhY3Rpb24gdHlwZVxuXHQgKiBAcGFyYW0gb01ldGFNb2RlbCBUaGUgTWV0YU1vZGVsIHVzZWQgdG8gY2hlY2sgZm9yIE5ld0FjdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHNNZXRhUGF0aCBUaGUgTWV0YVBhdGhcblx0ICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIGFjdGlvblxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGZpbmFsXG5cdCAqL1xuXHRfZ2V0TmV3QWN0aW9uKG9TdGFydHVwUGFyYW1ldGVyczogYW55LCBzQ3JlYXRlSGFzaDogc3RyaW5nLCBvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCwgc01ldGFQYXRoOiBzdHJpbmcpIHtcblx0XHRsZXQgc05ld0FjdGlvbjtcblxuXHRcdGlmIChvU3RhcnR1cFBhcmFtZXRlcnMgJiYgb1N0YXJ0dXBQYXJhbWV0ZXJzLnByZWZlcnJlZE1vZGUgJiYgc0NyZWF0ZUhhc2gudG9VcHBlckNhc2UoKS5pbmRleE9mKFwiSS1BQ1RJT049Q1JFQVRFV0lUSFwiKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBzUHJlZmVycmVkTW9kZSA9IG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlWzBdO1xuXHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdHNQcmVmZXJyZWRNb2RlLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihcIkNSRUFURVdJVEg6XCIpID4gLTFcblx0XHRcdFx0XHQ/IHNQcmVmZXJyZWRNb2RlLnN1YnN0cihzUHJlZmVycmVkTW9kZS5sYXN0SW5kZXhPZihcIjpcIikgKyAxKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRvU3RhcnR1cFBhcmFtZXRlcnMgJiZcblx0XHRcdG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlICYmXG5cdFx0XHRzQ3JlYXRlSGFzaC50b1VwcGVyQ2FzZSgpLmluZGV4T2YoXCJJLUFDVElPTj1BVVRPQ1JFQVRFV0lUSFwiKSA+IC0xXG5cdFx0KSB7XG5cdFx0XHRjb25zdCBzUHJlZmVycmVkTW9kZSA9IG9TdGFydHVwUGFyYW1ldGVycy5wcmVmZXJyZWRNb2RlWzBdO1xuXHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdHNQcmVmZXJyZWRNb2RlLnRvVXBwZXJDYXNlKCkuaW5kZXhPZihcIkFVVE9DUkVBVEVXSVRIOlwiKSA+IC0xXG5cdFx0XHRcdFx0PyBzUHJlZmVycmVkTW9kZS5zdWJzdHIoc1ByZWZlcnJlZE1vZGUubGFzdEluZGV4T2YoXCI6XCIpICsgMSlcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c05ld0FjdGlvbiA9XG5cdFx0XHRcdG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRPYmplY3QgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdD8gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofUBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvTmV3QWN0aW9uYCkgfHxcblx0XHRcdFx0XHQgIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9OZXdBY3Rpb25gKVxuXHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gc05ld0FjdGlvbjtcblx0fVxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBsYWJlbCBmb3IgdGhlIHRpdGxlIG9mIGEgc3BlY2lmaWMgY3JlYXRlIGFjdGlvbiBkaWFsb2csIGUuZy4gQ3JlYXRlIFNhbGVzIE9yZGVyIGZyb20gUXVvdGF0aW9uLlxuXHQgKlxuXHQgKiBUaGUgZm9sbG93aW5nIHByaW9yaXR5IGlzIGFwcGxpZWQ6XG5cdCAqIDEuIGxhYmVsIG9mIGxpbmUtaXRlbSBhbm5vdGF0aW9uLlxuXHQgKiAyLiBsYWJlbCBhbm5vdGF0ZWQgaW4gdGhlIGFjdGlvbi5cblx0ICogMy4gXCJDcmVhdGVcIiBhcyBhIGNvbnN0YW50IGZyb20gaTE4bi5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBzdGF0aWNcblx0ICogQHByaXZhdGVcblx0ICogQG5hbWUgc2FwLmZlLmNvcmUuVHJhbnNhY3Rpb25IZWxwZXIuX2dldFNwZWNpZmljQ3JlYXRlQWN0aW9uRGlhbG9nTGFiZWxcblx0ICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLlRyYW5zYWN0aW9uSGVscGVyXG5cdCAqIEBwYXJhbSBvTWV0YU1vZGVsIFRoZSBNZXRhTW9kZWwgdXNlZCB0byBjaGVjayBmb3IgdGhlIE5ld0FjdGlvbiBwYXJhbWV0ZXJcblx0ICogQHBhcmFtIHNNZXRhUGF0aCBUaGUgTWV0YVBhdGhcblx0ICogQHBhcmFtIHNOZXdBY3Rpb24gQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gb1Jlc291cmNlQnVuZGxlQ29yZSBSZXNvdXJjZUJ1bmRsZSB0byBhY2Nlc3MgdGhlIGRlZmF1bHQgQ3JlYXRlIGxhYmVsXG5cdCAqIEByZXR1cm5zIFRoZSBsYWJlbCBmb3IgdGhlIENyZWF0ZSBBY3Rpb24gRGlhbG9nXG5cdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHQgKiBAZmluYWxcblx0ICovXG5cdF9nZXRTcGVjaWZpY0NyZWF0ZUFjdGlvbkRpYWxvZ0xhYmVsKFxuXHRcdG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRcdHNNZXRhUGF0aDogc3RyaW5nLFxuXHRcdHNOZXdBY3Rpb246IHN0cmluZyxcblx0XHRvUmVzb3VyY2VCdW5kbGVDb3JlOiBSZXNvdXJjZUJ1bmRsZVxuXHQpIHtcblx0XHRjb25zdCBmbkdldExhYmVsRnJvbUxpbmVJdGVtQW5ub3RhdGlvbiA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdGlmIChvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtYCkpIHtcblx0XHRcdFx0Y29uc3QgaUxpbmVJdGVtSW5kZXggPSBvTWV0YU1vZGVsXG5cdFx0XHRcdFx0LmdldE9iamVjdChgJHtzTWV0YVBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5MaW5lSXRlbWApXG5cdFx0XHRcdFx0LmZpbmRJbmRleChmdW5jdGlvbiAob0xpbmVJdGVtOiBhbnkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGFMaW5lSXRlbUFjdGlvbiA9IG9MaW5lSXRlbS5BY3Rpb24gPyBvTGluZUl0ZW0uQWN0aW9uLnNwbGl0KFwiKFwiKSA6IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdHJldHVybiBhTGluZUl0ZW1BY3Rpb24gPyBhTGluZUl0ZW1BY3Rpb25bMF0gPT09IHNOZXdBY3Rpb24gOiBmYWxzZTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIGlMaW5lSXRlbUluZGV4ID4gLTFcblx0XHRcdFx0XHQ/IG9NZXRhTW9kZWwuZ2V0T2JqZWN0KGAke3NNZXRhUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkxpbmVJdGVtYClbaUxpbmVJdGVtSW5kZXhdLkxhYmVsXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0Zm5HZXRMYWJlbEZyb21MaW5lSXRlbUFubm90YXRpb24oKSB8fFxuXHRcdFx0KG9NZXRhTW9kZWwgJiYgb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c01ldGFQYXRofS8ke3NOZXdBY3Rpb259QGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5MYWJlbGApKSB8fFxuXHRcdFx0KG9SZXNvdXJjZUJ1bmRsZUNvcmUgJiYgb1Jlc291cmNlQnVuZGxlQ29yZS5nZXRUZXh0KFwiQ19UUkFOU0FDVElPTl9IRUxQRVJfU0FQRkVfQUNUSU9OX0NSRUFURVwiKSlcblx0XHQpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRyYW5zYWN0aW9uSGVscGVyO1xuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7OztFQWtqQk8sZ0JBQWdCQSxJQUFJLEVBQUVDLE9BQU8sRUFBRTtJQUNyQyxJQUFJO01BQ0gsSUFBSUMsTUFBTSxHQUFHRixJQUFJLEVBQUU7SUFDcEIsQ0FBQyxDQUFDLE9BQU1HLENBQUMsRUFBRTtNQUNWLE9BQU9GLE9BQU8sQ0FBQ0UsQ0FBQyxDQUFDO0lBQ2xCO0lBQ0EsSUFBSUQsTUFBTSxJQUFJQSxNQUFNLENBQUNFLElBQUksRUFBRTtNQUMxQixPQUFPRixNQUFNLENBQUNFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRUgsT0FBTyxDQUFDO0lBQ3BDO0lBQ0EsT0FBT0MsTUFBTTtFQUNkO0VBR08sMEJBQTBCRixJQUFJLEVBQUVLLFNBQVMsRUFBRTtJQUNqRCxJQUFJO01BQ0gsSUFBSUgsTUFBTSxHQUFHRixJQUFJLEVBQUU7SUFDcEIsQ0FBQyxDQUFDLE9BQU9HLENBQUMsRUFBRTtNQUNYLE9BQU9FLFNBQVMsQ0FBQyxJQUFJLEVBQUVGLENBQUMsQ0FBQztJQUMxQjtJQUNBLElBQUlELE1BQU0sSUFBSUEsTUFBTSxDQUFDRSxJQUFJLEVBQUU7TUFDMUIsT0FBT0YsTUFBTSxDQUFDRSxJQUFJLENBQUNDLFNBQVMsQ0FBQ0MsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRUQsU0FBUyxDQUFDQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzVFO0lBQ0EsT0FBT0QsU0FBUyxDQUFDLEtBQUssRUFBRUgsTUFBTSxDQUFDO0VBQ2hDO0VBcGlCQSxJQUFNSyxZQUFZLEdBQUdDLFNBQVMsQ0FBQ0QsWUFBWTtFQUMzQyxJQUFNRSxnQkFBZ0IsR0FBR0QsU0FBUyxDQUFDQyxnQkFBZ0I7RUFDbkQsSUFBTUMsVUFBVSxHQUFHQyxXQUFXLENBQUNELFVBQVU7RUFDekM7RUFDQSxTQUFTRSxhQUFhLENBQUNDLFdBQWdCLEVBQUU7SUFDeEMsSUFBSUEsV0FBVyxJQUFJQSxXQUFXLENBQUNDLFdBQVcsSUFBSUQsV0FBVyxDQUFDQyxXQUFXLEVBQUUsQ0FBQ0MsT0FBTyxFQUFFLEtBQUssbUJBQW1CLEVBQUU7TUFDMUdGLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDakI7SUFDQSxPQUFPQSxXQUFXLElBQUksQ0FBQyxDQUFDO0VBQ3pCO0VBQUMsSUFFS0csaUJBQWlCO0lBS3RCLDJCQUFZQyxhQUEyQixFQUFFQyxXQUFnQixFQUFFO01BQzFELElBQUksQ0FBQ0MsY0FBYyxHQUFHRixhQUFhO01BQ25DLElBQUksQ0FBQ0MsV0FBVyxHQUFHQSxXQUFXO0lBQy9CO0lBQUM7SUFBQSxPQUNERSxtQkFBbUIsR0FBbkIsNkJBQW9CQyxRQUFjLEVBQTJCO01BQzVELElBQUksQ0FBQyxJQUFJLENBQUNDLGlCQUFpQixJQUFJRCxRQUFRLEVBQUU7UUFDeEMsSUFBSUUsS0FBSztRQUNULElBQUlGLFFBQVEsQ0FBQ0csR0FBRyxDQUFDLCtCQUErQixDQUFDLEVBQUU7VUFDbERELEtBQUssR0FBR0YsUUFBUSxDQUFDSSxPQUFPLEVBQUU7UUFDM0IsQ0FBQyxNQUFNO1VBQ05GLEtBQUssR0FBR0YsUUFBUSxDQUFDSyxVQUFVLEVBQUUsR0FBR0wsUUFBUSxDQUFDTSxlQUFlLEVBQUUsR0FBR04sUUFBUSxDQUFDSSxPQUFPLEVBQUU7UUFDaEY7UUFDQSxJQUFJRyxXQUFXLENBQUNDLGdCQUFnQixDQUFDUixRQUFRLENBQUNTLFFBQVEsRUFBRSxDQUFDQyxZQUFZLEVBQUUsRUFBRVIsS0FBSyxDQUFDLEVBQUU7VUFDNUUsSUFBSSxDQUFDRCxpQkFBaUIsR0FBR2IsZ0JBQWdCLENBQUN1QixLQUFLO1FBQ2hELENBQUMsTUFBTSxJQUFJSixXQUFXLENBQUNLLHdCQUF3QixDQUFDWixRQUFRLENBQUNTLFFBQVEsRUFBRSxDQUFDQyxZQUFZLEVBQUUsQ0FBQyxFQUFFO1VBQ3BGLElBQUksQ0FBQ1QsaUJBQWlCLEdBQUdiLGdCQUFnQixDQUFDeUIsTUFBTTtRQUNqRCxDQUFDLE1BQU07VUFDTjtVQUNBO1VBQ0EsT0FBT3pCLGdCQUFnQixDQUFDMEIsUUFBUTtRQUNqQztNQUNEO01BQ0EsT0FBTyxJQUFJLENBQUNiLGlCQUFpQjtJQUM5Qjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BYkM7SUFBQSxPQWNBYyxnQkFBZ0IsR0FBaEIsMEJBQWlCZixRQUFtQixFQUFFUixXQUFnQixFQUFFd0IsS0FBVyxFQUFnQjtNQUNsRixJQUFNQyx5QkFBeUIsR0FBR3pCLFdBQVcsSUFBSUEsV0FBVyxDQUFDMEIsd0JBQXdCO01BQ3JGLElBQUlELHlCQUF5QixFQUFFO1FBQzlCLElBQU1FLE9BQU8sR0FBR0YseUJBQXlCLENBQUNHLFNBQVMsQ0FBQyxDQUFDLEVBQUVILHlCQUF5QixDQUFDSSxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQ0MsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7VUFDNUhDLGFBQWEsR0FBR04seUJBQXlCLENBQUNHLFNBQVMsQ0FDbERILHlCQUF5QixDQUFDSSxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUM5Q0oseUJBQXlCLENBQUNPLE1BQU0sQ0FDaEM7VUFDREMsS0FBSyxHQUFHakMsV0FBVyxDQUFDa0MsSUFBSTtRQUN6QixPQUFPRCxLQUFLLENBQUMsMkJBQTJCLENBQUM7UUFDekMsT0FBT0UsU0FBUyxDQUFDQyxpQkFBaUIsQ0FBQ1QsT0FBTyxFQUFFSSxhQUFhLEVBQUVFLEtBQUssRUFBRVQsS0FBSyxFQUFFaEIsUUFBUSxDQUFDO01BQ25GO01BQ0EsT0FBTzZCLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDLEVBQUUsQ0FBQztJQUMzQjs7SUFFQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FwQkM7SUFBQSxPQXFCTUMsY0FBYywyQkFDbkJDLGdCQUFrQyxFQUNsQ0MsYUFRWSxFQUNaQyxlQUFvQixFQUNwQkMsY0FBOEI7TUFBQSxJQUM5QkMsY0FBdUIsdUVBQUcsS0FBSztNQUFBLElBQy9CcEIsS0FBVTtNQUFBLElBQ2dCO1FBQUE7UUFBQSxhQUtYLElBQUk7UUFKbkI7UUFDQSxJQUFNcUIsTUFBTSxHQUFHTCxnQkFBZ0IsQ0FBQ3ZCLFFBQVEsRUFBRTtVQUN6QzZCLFVBQVUsR0FBR0QsTUFBTSxDQUFDM0IsWUFBWSxFQUFFO1VBQ2xDNkIsU0FBUyxHQUFHRCxVQUFVLENBQUNFLFdBQVcsQ0FBQ1IsZ0JBQWdCLENBQUNTLGdCQUFnQixFQUFFLENBQUVyQyxPQUFPLEVBQUUsQ0FBQztVQUNsRnNDLFdBQVcsR0FBRyxPQUFLQyxnQkFBZ0IsRUFBRSxDQUFDQyxjQUFjLEVBQUUsQ0FBQ0MsT0FBTyxFQUFFO1VBQ2hFQyxjQUFjLEdBQUcsT0FBS0gsZ0JBQWdCLEVBQUUsQ0FBQ0ksZ0JBQWdCLEVBQUU7VUFDM0RDLGtCQUFrQixHQUFJRixjQUFjLElBQUlBLGNBQWMsQ0FBQ0csaUJBQWlCLElBQUssQ0FBQyxDQUFDO1VBQy9FQyxVQUFVLEdBQUcsQ0FBQ2xCLGdCQUFnQixDQUFDM0IsVUFBVSxFQUFFLEdBQ3hDLE9BQUs4QyxhQUFhLENBQUNILGtCQUFrQixFQUFFTixXQUFXLEVBQUVKLFVBQVUsRUFBRUMsU0FBUyxDQUFDLEdBQzFFYSxTQUFTO1FBQ2IsSUFBTUMsa0JBQXVCLEdBQUc7VUFBRUMseUJBQXlCLEVBQUU7UUFBSyxDQUFDO1FBQ25FLElBQU1DLGFBQWEsR0FBR2pCLFVBQVUsQ0FBQ2tCLFNBQVMsV0FBSWpCLFNBQVMscURBQWtEO1FBQ3pHLElBQUlrQixTQUFTLEdBQUcsT0FBTztRQUN2QixJQUFJbEMsYUFBYSxHQUNoQmUsVUFBVSxDQUFDa0IsU0FBUyxXQUFJakIsU0FBUywyREFBd0QsSUFDekZELFVBQVUsQ0FBQ2tCLFNBQVMsV0FDaEJqRCxXQUFXLENBQUNtRCxrQkFBa0IsQ0FBQ3BCLFVBQVUsQ0FBQ3FCLFVBQVUsQ0FBQ3BCLFNBQVMsQ0FBQyxDQUFDLDJEQUNuRTtRQUNGLElBQUlxQixrQkFBa0I7UUFDdEIsSUFBSUMsbUJBQStDO1FBQ25ELElBQUl0QyxhQUFhLEVBQUU7VUFDbEIsSUFDQ2UsVUFBVSxDQUFDa0IsU0FBUyxXQUFJakIsU0FBUywyREFBd0QsSUFDekZoQyxXQUFXLENBQUNtRCxrQkFBa0IsQ0FBQ3BCLFVBQVUsQ0FBQ3FCLFVBQVUsQ0FBQ3BCLFNBQVMsQ0FBQyxDQUFDLEtBQUtBLFNBQVMsRUFDN0U7WUFDRHFCLGtCQUFrQixHQUFHLElBQUk7VUFDMUIsQ0FBQyxNQUFNO1lBQ05BLGtCQUFrQixHQUFHLEtBQUs7VUFDM0I7UUFDRDtRQUNBLElBQUlMLGFBQWEsRUFBRTtVQUNsQkYsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEdBQUdFLGFBQWE7UUFDOUM7UUFDQSxJQUFNL0QsV0FBVyxHQUFHRCxhQUFhLENBQUMwQyxhQUFhLENBQUM7UUFDaEQsSUFBSSxDQUFDRCxnQkFBZ0IsRUFBRTtVQUN0QixNQUFNLElBQUk4QixLQUFLLENBQUMsNENBQTRDLENBQUM7UUFDOUQ7UUFDQSxJQUFNN0QsaUJBQWlCLEdBQUcsT0FBS0YsbUJBQW1CLENBQUNpQyxnQkFBZ0IsQ0FBQztRQUNwRSxJQUFJL0IsaUJBQWlCLEtBQUtiLGdCQUFnQixDQUFDdUIsS0FBSyxJQUFJVixpQkFBaUIsS0FBS2IsZ0JBQWdCLENBQUN5QixNQUFNLEVBQUU7VUFDbEcsTUFBTSxJQUFJaUQsS0FBSyxDQUFDLDZFQUE2RSxDQUFDO1FBQy9GO1FBQ0EsSUFBSXRFLFdBQVcsQ0FBQ3VFLFFBQVEsS0FBSyxPQUFPLEVBQUU7VUFDckNOLFNBQVMsd0JBQWlCakUsV0FBVyxDQUFDd0UsTUFBTSxDQUFFO1FBQy9DO1FBQ0F4RSxXQUFXLENBQUN5RSxvQkFBb0IsR0FBRzdCLGNBQWMsR0FBRyxJQUFJLEdBQUc1QyxXQUFXLENBQUN5RSxvQkFBb0I7UUFDM0ZDLFVBQVUsQ0FBQ0MsSUFBSSxDQUFDLE9BQUt0RSxXQUFXLEVBQUU0RCxTQUFTLENBQUM7UUFDNUMsSUFBTVcsbUJBQW1CLEdBQUdDLElBQUksQ0FBQ0Msd0JBQXdCLENBQUMsYUFBYSxDQUFDO1FBQ3hFLElBQUlDLE9BQVk7UUFBQztVQUFBLDBCQUViO1lBQUE7Y0FBQTtjQTRGSFYsbUJBQW1CLEdBQUdBLG1CQUFtQixJQUFJVSxPQUFPO2NBQUMsdUJBRS9DcEMsY0FBYyxDQUFDcUMsaUJBQWlCLENBQUM7Z0JBQUVDLE9BQU8sRUFBRWpGLFdBQVcsQ0FBQ2tGO2NBQWMsQ0FBQyxDQUFDO2dCQUM5RSxPQUFPYixtQkFBbUI7Y0FBRTtZQUFBO1lBQUE7Y0FBQSxJQTlGeEJYLFVBQVU7Z0JBQUEsdUJBQ0csT0FBS3lCLFVBQVUsQ0FDOUJ6QixVQUFVLEVBQ1Y7a0JBQ0MwQixRQUFRLEVBQUU1QyxnQkFBZ0IsQ0FBQ1MsZ0JBQWdCLEVBQUU7a0JBQzdDb0MseUJBQXlCLEVBQUUsSUFBSTtrQkFDL0JDLEtBQUssRUFBRSxPQUFLQyxtQ0FBbUMsQ0FBQ3pDLFVBQVUsRUFBRUMsU0FBUyxFQUFFVyxVQUFVLEVBQUVrQixtQkFBbUIsQ0FBQztrQkFDdkdZLGlCQUFpQixFQUFFM0Isa0JBQWtCO2tCQUNyQ3FCLGFBQWEsRUFBRWxGLFdBQVcsQ0FBQ2tGLGFBQWE7a0JBQ3hDTyxlQUFlLEVBQUUsSUFBSTtrQkFDckJDLG1CQUFtQixFQUFFMUYsV0FBVyxDQUFDMEY7Z0JBQ2xDLENBQUMsRUFDRCxJQUFJLEVBQ0ovQyxjQUFjLENBQ2Q7a0JBYkRvQyxPQUFPLG1CQWFOO2dCQUFDO2NBQUE7Z0JBRUYsSUFBTVksa0JBQWtCLEdBQ3ZCM0YsV0FBVyxDQUFDNEYsWUFBWSxLQUFLbEcsWUFBWSxDQUFDbUcsV0FBVyxJQUFJN0YsV0FBVyxDQUFDNEYsWUFBWSxLQUFLbEcsWUFBWSxDQUFDb0csTUFBTTtnQkFDMUcsSUFBTUMsNEJBQTRCLEdBQUdKLGtCQUFrQixHQUNwREssV0FBVyxDQUFDQywyQkFBMkIsQ0FBQ25ELFVBQVUsRUFBRUMsU0FBUyxFQUFFdkIsS0FBSyxDQUFDLEdBQ3JFLEVBQUU7Z0JBQ0xPLGFBQWEsR0FBR2EsY0FBYyxHQUFHLElBQUksR0FBR2IsYUFBYTtnQkFDckQsSUFBSW1FLGFBQWEsRUFBRUMsZ0JBQWdCO2dCQUNuQyxJQUFJcEUsYUFBYSxFQUFFO2tCQUNsQjtrQkFDQSxJQUFJcUMsa0JBQWtCLEVBQUU7b0JBQ3ZCOEIsYUFBYSxHQUNaMUQsZ0JBQWdCLENBQUMyQixVQUFVLEVBQUUsY0FDMUJyQixVQUFVLENBQUNFLFdBQVcsQ0FBQ1IsZ0JBQWdCLENBQUMyQixVQUFVLEVBQUUsQ0FBQ3ZELE9BQU8sRUFBRSxDQUFDLGNBQUltQixhQUFhLENBQUU7b0JBQ3RGb0UsZ0JBQWdCLEdBQUczRCxnQkFBZ0IsQ0FBQzJCLFVBQVUsRUFBRTtrQkFDakQsQ0FBQyxNQUFNO29CQUNOK0IsYUFBYSxHQUNaMUQsZ0JBQWdCLENBQUNTLGdCQUFnQixFQUFFLGNBQ2hDSCxVQUFVLENBQUNFLFdBQVcsQ0FBQ1IsZ0JBQWdCLENBQUNTLGdCQUFnQixFQUFFLENBQUVyQyxPQUFPLEVBQUUsQ0FBQyxjQUFJbUIsYUFBYSxDQUFFO29CQUM3Rm9FLGdCQUFnQixHQUFHM0QsZ0JBQWdCLENBQUNTLGdCQUFnQixFQUFFO2tCQUN2RDtnQkFDRDtnQkFDQSxJQUFNbUQsU0FBUyxHQUFHRixhQUFhLElBQUtwRCxVQUFVLENBQUN1RCxvQkFBb0IsQ0FBQ0gsYUFBYSxDQUFTO2dCQUFDLDBCQUV2RjtrQkFBQTtvQkFBQTtvQkFjSGxHLFdBQVcsQ0FBQ2tDLElBQUksR0FBR29FLEtBQUssR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVGLEtBQUssRUFBRXRHLFdBQVcsQ0FBQ2tDLElBQUksQ0FBQyxHQUFHbEMsV0FBVyxDQUFDa0MsSUFBSTtvQkFDeEYsSUFBSWxDLFdBQVcsQ0FBQ2tDLElBQUksRUFBRTtzQkFDckIsT0FBT2xDLFdBQVcsQ0FBQ2tDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDMUM7b0JBQUM7c0JBQUEsSUFDRzZELDRCQUE0QixDQUFDL0QsTUFBTSxHQUFHLENBQUM7d0JBQUEsdUJBQzFCLE9BQUt5RSwwQkFBMEIsQ0FDOUNqRSxnQkFBZ0IsRUFDaEJ1RCw0QkFBNEIsRUFDNUJsRCxNQUFNLEVBQ043QyxXQUFXLEVBQ1gyQyxjQUFjLENBQ2Q7MEJBTkRvQyxPQUFPLHdCQU1OOzBCQUNEVixtQkFBbUIsR0FBR1UsT0FBTyxDQUFDMkIsVUFBVTt3QkFBQztzQkFBQTt3QkFBQTswQkFVekNyQyxtQkFBbUIsR0FBRzdCLGdCQUFnQixDQUFDbUUsTUFBTSxDQUM1QzNHLFdBQVcsQ0FBQ2tDLElBQUksRUFDaEIsSUFBSSxFQUNKbEMsV0FBVyxDQUFDNEcsV0FBVyxFQUN2QjVHLFdBQVcsQ0FBQzZHLFFBQVEsQ0FDcEI7MEJBQUM7NEJBQUEsSUFDRSxDQUFDN0csV0FBVyxDQUFDNkcsUUFBUTs4QkFBQSx1QkFDUixPQUFLQyx1QkFBdUIsQ0FBQ3RFLGdCQUFnQixFQUFFNkIsbUJBQW1CLEVBQUVyRSxXQUFXLENBQUM7Z0NBQWhHK0UsT0FBTyx3QkFBeUY7OEJBQUM7NEJBQUE7MEJBQUE7MEJBQUE7d0JBQUE7d0JBQUE7MEJBQUEsSUFmOUYvRSxXQUFXLENBQUN5RSxvQkFBb0I7NEJBQUEsdUJBQzdCc0MsWUFBWSxDQUNqQi9HLFdBQVcsQ0FBQ3lFLG9CQUFvQixDQUFDOzhCQUNoQ3VDLFdBQVcsRUFBRXhFLGdCQUFnQixJQUFJQSxnQkFBZ0IsQ0FBQzVCLE9BQU87NEJBQzFELENBQUMsQ0FBQyxDQUNGOzBCQUFBO3dCQUFBO3dCQUFBO3NCQUFBO29CQUFBO29CQUFBO2tCQUFBO2tCQWhDSCxJQUFJMEYsS0FBVTtrQkFBQyxnQ0FDWDtvQkFBQSx1QkFFRkYsU0FBUyxJQUFJQSxTQUFTLENBQUNwQyxTQUFTLEVBQUUsSUFBSW9DLFNBQVMsQ0FBQ3BDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDaUQsUUFBUSxHQUM5REMsVUFBVSxDQUFDQyxpQkFBaUIsQ0FBQ3BGLGFBQWEsRUFBRW9FLGdCQUFnQixFQUFFdEQsTUFBTSxDQUFDLEdBQ3JFcUUsVUFBVSxDQUFDRSxrQkFBa0IsQ0FBQ3JGLGFBQWEsRUFBRWMsTUFBTSxDQUFDLGlCQUh4RHJDLFFBQVE7c0JBQUEsSUFJVkEsUUFBUTt3QkFDWDhGLEtBQUssR0FBRzlGLFFBQVEsQ0FBQ3dELFNBQVMsRUFBRTtzQkFBQztvQkFBQTtrQkFFL0IsQ0FBQyxZQUFRcUQsTUFBVyxFQUFFO29CQUNyQkMsR0FBRyxDQUFDQyxLQUFLLDhDQUF1Q3hGLGFBQWEsR0FBSXNGLE1BQU0sQ0FBQztvQkFDeEUsTUFBTUEsTUFBTTtrQkFDYixDQUFDO2tCQUFBO2dCQWlDRixDQUFDLFlBQVFBLE1BQVcsRUFBRTtrQkFDckJDLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLHVDQUF1QyxFQUFFRixNQUFNLENBQUM7a0JBQzFELE1BQU1BLE1BQU07Z0JBQ2IsQ0FBQztjQUFBO1lBQUE7WUFBQTtVQU9ILENBQUMsWUFBUUUsS0FBYyxFQUFFO1lBQ3hCO1lBQUEsdUJBQ001RSxjQUFjLENBQUNxQyxpQkFBaUIsQ0FBQztjQUFFQyxPQUFPLEVBQUVqRixXQUFXLENBQUNrRjtZQUFjLENBQUMsQ0FBQztjQUFBO2NBQzlFLElBQ0MsQ0FBQ3FDLEtBQUssS0FBSzVILFNBQVMsQ0FBQzZILFNBQVMsQ0FBQ0MscUJBQXFCLElBQUlGLEtBQUssS0FBSzVILFNBQVMsQ0FBQzZILFNBQVMsQ0FBQ0Usa0JBQWtCLDZCQUN4R3JELG1CQUFtQixpREFBbkIscUJBQXFCc0QsV0FBVyxFQUFFLEVBQ2pDO2dCQUNEO2dCQUNBO2dCQUNBO2dCQUNBdEQsbUJBQW1CLENBQUN1RCxNQUFNLENBQUMsU0FBUyxDQUFDO2NBQ3RDO2NBQ0EsTUFBTUwsS0FBSztZQUFDO1VBQ2IsQ0FBQztRQUFBO1VBQ0E3QyxVQUFVLENBQUNtRCxNQUFNLENBQUMsT0FBS3hILFdBQVcsRUFBRTRELFNBQVMsQ0FBQztVQUFDO1VBQUE7UUFBQTtNQUVqRCxDQUFDO1FBQUE7TUFBQTtJQUFBO0lBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBUkM7SUFBQSxPQVNBNkQsMkJBQTJCLEdBQTNCLHFDQUE0QkMsU0FBc0IsRUFBRUMsbUJBQXdCLEVBQUU7TUFDN0UsSUFBSSxDQUFDQSxtQkFBbUIsRUFBRTtRQUN6QixPQUFPM0YsT0FBTyxDQUFDQyxPQUFPLEVBQUU7TUFDekI7TUFDQSxJQUFNMkYsY0FBYyxHQUFHRixTQUFTLENBQUNHLE1BQU0sQ0FBQyxVQUFVQyxPQUFZLEVBQUUzSCxRQUFhLEVBQUU7UUFDOUUsSUFBTXNDLFVBQVUsR0FBR3RDLFFBQVEsQ0FBQ1MsUUFBUSxFQUFFLENBQUNDLFlBQVksRUFBRTtRQUNyRCxJQUFNNkIsU0FBUyxHQUFHRCxVQUFVLENBQUNFLFdBQVcsQ0FBQ3hDLFFBQVEsQ0FBQ0ksT0FBTyxFQUFFLENBQUM7UUFDNUQsSUFBSWtDLFVBQVUsQ0FBQ2tCLFNBQVMsV0FBSWpCLFNBQVMsK0NBQTRDLEVBQUU7VUFDbEYsSUFBTXFGLGVBQWUsR0FBRzVILFFBQVEsQ0FBQ3dELFNBQVMsRUFBRSxDQUFDcUUsY0FBYztZQUMxREMsZ0JBQWdCLEdBQUc5SCxRQUFRLENBQUN3RCxTQUFTLEVBQUUsQ0FBQ3VFLGVBQWU7VUFDeEQsSUFBSSxDQUFDSCxlQUFlLElBQUlFLGdCQUFnQixFQUFFO1lBQ3pDLElBQU1FLGNBQWMsR0FBR2hJLFFBQVEsQ0FBQ1MsUUFBUSxFQUFFLENBQUN3SCxXQUFXLFdBQUlqSSxRQUFRLENBQUNJLE9BQU8sRUFBRSxvQkFBaUIsQ0FBQzhILGVBQWUsRUFBRTtZQUMvR1AsT0FBTyxDQUFDUSxJQUFJLENBQUNILGNBQWMsQ0FBQztVQUM3QjtRQUNEO1FBQ0EsT0FBT0wsT0FBTztNQUNmLENBQUMsRUFBRSxFQUFFLENBQUM7TUFDTixPQUFPOUYsT0FBTyxDQUFDdUcsR0FBRyxDQUNqQlgsY0FBYyxDQUFDWSxHQUFHLENBQUMsVUFBVXJJLFFBQWEsRUFBRTtRQUMzQyxPQUFPQSxRQUFRLENBQUNzSSxvQkFBb0IsRUFBRSxDQUFDdkosSUFBSSxDQUFDLFlBQVk7VUFDdkQsT0FBT2lCLFFBQVE7UUFDaEIsQ0FBQyxDQUFDO01BQ0gsQ0FBQyxDQUFDLENBQ0Y7SUFDRixDQUFDO0lBQUEsT0FFRHVJLGVBQWUsR0FBZix5QkFBZ0JDLFNBQXNCLEVBQUVoSixXQUFnQixFQUFFO01BQ3pELElBQU1pSixvQkFBb0IsR0FDekJELFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFDWGhKLFdBQVcsQ0FBQ2tKLGVBQWUsSUFBSWxKLFdBQVcsQ0FBQ2tKLGVBQWUsQ0FBQyxDQUFDLENBQUUsSUFDOURsSixXQUFXLENBQUNtSix5QkFBeUIsSUFBSW5KLFdBQVcsQ0FBQ21KLHlCQUF5QixDQUFDLENBQUMsQ0FBRSxJQUNsRm5KLFdBQVcsQ0FBQ29KLDRCQUE0QixJQUFJcEosV0FBVyxDQUFDb0osNEJBQTRCLENBQUMsQ0FBQyxDQUFFLElBQ3hGcEosV0FBVyxDQUFDcUosa0JBQWtCLElBQUlySixXQUFXLENBQUNxSixrQkFBa0IsQ0FBQyxDQUFDLENBQUU7TUFDdEUsSUFBTTVJLGlCQUFpQixHQUFHLElBQUksQ0FBQ0YsbUJBQW1CLENBQUMwSSxvQkFBb0IsQ0FBQztNQUN4RSxPQUFPeEksaUJBQWlCLEtBQUtiLGdCQUFnQixDQUFDdUIsS0FBSztJQUNwRDtJQUNBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQWRDO0lBQUEsT0FlQW1JLGNBQWMsR0FBZCx3QkFBZUMsV0FBc0IsRUFBRXZKLFdBQWdCLEVBQUUwQyxlQUFvQixFQUFFQyxjQUE4QixFQUFFO01BQzlHLElBQUk2RyxnQkFBZ0IsR0FBRyxLQUFLO01BQzVCO01BQ0EsSUFBTUMsSUFBSSxHQUFHLElBQUk7UUFDaEI3RSxtQkFBbUIsR0FBR0MsSUFBSSxDQUFDQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUM7TUFDbkUsSUFBSTRFLE9BQU87TUFDWGhGLFVBQVUsQ0FBQ0MsSUFBSSxDQUFDLElBQUksQ0FBQ3RFLFdBQVcsQ0FBQztNQUNqQyxJQUFJMkksU0FBc0I7TUFDMUIsSUFBSVcsS0FBSyxDQUFDQyxPQUFPLENBQUNMLFdBQVcsQ0FBQyxFQUFFO1FBQy9CUCxTQUFTLEdBQUdPLFdBQVc7TUFDeEIsQ0FBQyxNQUFNO1FBQ05QLFNBQVMsR0FBRyxDQUFDTyxXQUFXLENBQUM7TUFDMUI7TUFFQSxPQUFPLElBQUlsSCxPQUFPLENBQU8sVUFBQ0MsT0FBTyxFQUFFdUgsTUFBTSxFQUFLO1FBQzdDLElBQUk7VUFDSCxJQUFNQyxZQUFZLEdBQUdMLElBQUksQ0FBQ1YsZUFBZSxDQUFDQyxTQUFTLEVBQUVoSixXQUFXLENBQUM7VUFDakUsSUFBTStKLEtBQVksR0FBRyxFQUFFO1VBQ3ZCLElBQU1DLE9BQWMsR0FBRyxFQUFFO1VBRXpCLElBQUloSyxXQUFXLEVBQUU7WUFDaEIsSUFBSSxDQUFDQSxXQUFXLENBQUNpSyx3QkFBd0IsRUFBRTtjQUMxQztjQUNBLElBQUlILFlBQVksRUFBRTtnQkFDakIsS0FBSyxJQUFJSSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdsQixTQUFTLENBQUNoSCxNQUFNLEVBQUVrSSxDQUFDLEVBQUUsRUFBRTtrQkFDMUMsSUFBTUMsWUFBWSxHQUFHbkIsU0FBUyxDQUFDa0IsQ0FBQyxDQUFDLENBQUNsRyxTQUFTLEVBQUU7a0JBQzdDLElBQ0NtRyxZQUFZLENBQUM5QixjQUFjLEtBQUssSUFBSSxJQUNwQzhCLFlBQVksQ0FBQ0MsY0FBYyxLQUFLLElBQUksSUFDcENELFlBQVksQ0FBQ0UsdUJBQXVCLElBQ3BDRixZQUFZLENBQUNFLHVCQUF1QixDQUFDQyxlQUFlLElBQ3BELENBQUNILFlBQVksQ0FBQ0UsdUJBQXVCLENBQUNFLGtCQUFrQixFQUN2RDtvQkFDRCxJQUFJQyxXQUFXLEdBQUcsRUFBRTtvQkFDcEIsSUFBTUMsY0FBYyxHQUFHTixZQUFZLElBQUlBLFlBQVksQ0FBQ0UsdUJBQXVCO29CQUMzRSxJQUFJSSxjQUFjLEVBQUU7c0JBQ25CRCxXQUFXLEdBQUdDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDaEQ7b0JBQ0FmLE9BQU8sR0FBRyxDQUFDYyxXQUFXLENBQUM7b0JBQ3ZCRSxVQUFVLENBQUNDLElBQUksQ0FDZDNFLFdBQVcsQ0FBQzRFLGlCQUFpQixDQUM1QiwrREFBK0QsRUFDL0RsSSxlQUFlLEVBQ2ZnSCxPQUFPLENBQ1AsRUFDRDtzQkFDQ21CLEtBQUssRUFBRWpHLG1CQUFtQixDQUFDa0csT0FBTyxDQUFDLGlCQUFpQixDQUFDO3NCQUNyREMsT0FBTyxFQUFFbEI7b0JBQ1YsQ0FBQyxDQUNEO29CQUNEO2tCQUNEO2dCQUNEO2NBQ0Q7Y0FDQTdKLFdBQVcsR0FBR0QsYUFBYSxDQUFDQyxXQUFXLENBQUM7Y0FDeEMsSUFBSWdMLFdBQVcsR0FBRyxFQUFFO2NBQ3BCLElBQUloTCxXQUFXLENBQUM2SyxLQUFLLEVBQUU7Z0JBQ3RCLElBQUk3SyxXQUFXLENBQUNpTCxXQUFXLEVBQUU7a0JBQzVCdkIsT0FBTyxHQUFHLENBQUMxSixXQUFXLENBQUM2SyxLQUFLLEdBQUcsR0FBRyxFQUFFN0ssV0FBVyxDQUFDaUwsV0FBVyxDQUFDO2dCQUM3RCxDQUFDLE1BQU07a0JBQ052QixPQUFPLEdBQUcsQ0FBQzFKLFdBQVcsQ0FBQzZLLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQ2xDO2dCQUNBRyxXQUFXLEdBQUdoRixXQUFXLENBQUM0RSxpQkFBaUIsQ0FDMUMscURBQXFELEVBQ3JEbEksZUFBZSxFQUNmZ0gsT0FBTyxFQUNQMUosV0FBVyxDQUFDa0wsYUFBYSxDQUN6QjtjQUNGLENBQUMsTUFBTTtnQkFDTkYsV0FBVyxHQUFHaEYsV0FBVyxDQUFDNEUsaUJBQWlCLENBQzFDLCtEQUErRCxFQUMvRGxJLGVBQWUsRUFDZmtCLFNBQVMsRUFDVDVELFdBQVcsQ0FBQ2tMLGFBQWEsQ0FDekI7Y0FDRjtjQUNBbEIsT0FBTyxDQUFDckIsSUFBSSxDQUFDO2dCQUNad0MsSUFBSSxFQUFFLG1CQUFtQjtnQkFDekIvRixRQUFRLEVBQUU0RCxTQUFTO2dCQUNuQm9DLElBQUksRUFBRUosV0FBVztnQkFDakJLLFFBQVEsRUFBRSxJQUFJO2dCQUNkcEcsT0FBTyxFQUFFO2NBQ1YsQ0FBQyxDQUFDO1lBQ0gsQ0FBQyxNQUFNO2NBQ047Y0FDQSxJQUFJcUcsY0FBYyxHQUFHdEMsU0FBUyxDQUFDaEgsTUFBTTtjQUVyQyxJQUFJOEgsWUFBWSxFQUFFO2dCQUNqQndCLGNBQWMsSUFDYnRMLFdBQVcsQ0FBQ29KLDRCQUE0QixDQUFDcEgsTUFBTSxHQUMvQ2hDLFdBQVcsQ0FBQ21KLHlCQUF5QixDQUFDbkgsTUFBTSxHQUM1Q2hDLFdBQVcsQ0FBQ2tKLGVBQWUsQ0FBQ2xILE1BQU0sR0FDbENoQyxXQUFXLENBQUNxSixrQkFBa0IsQ0FBQ3JILE1BQU07Z0JBQ3RDdUosWUFBWSxDQUFDQyxtQ0FBbUMsQ0FDL0N4TCxXQUFXLEVBQ1hnSixTQUFTLEVBQ1RzQyxjQUFjLEVBQ2Q1SSxlQUFlLEVBQ2ZxSCxLQUFLLEVBQ0xDLE9BQU8sQ0FDUDtjQUNGO2NBRUF1QixZQUFZLENBQUNFLDhCQUE4QixDQUFDekwsV0FBVyxFQUFFZ0osU0FBUyxFQUFFdEcsZUFBZSxFQUFFc0gsT0FBTyxDQUFDO1lBQzlGO1VBQ0Q7O1VBRUE7VUFDQXVCLFlBQVksQ0FBQ0csNEJBQTRCLENBQUMxQixPQUFPLEVBQUVELEtBQUssQ0FBQztVQUN6RCxJQUFNNEIsSUFBSSxHQUFHLElBQUlDLElBQUksQ0FBQztZQUFFN0IsS0FBSyxFQUFFQTtVQUFNLENBQUMsQ0FBQztVQUN2QyxJQUFNOEIsTUFBTSxHQUFHakgsbUJBQW1CLENBQUNrRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7VUFFN0QsSUFBTWdCLFNBQVM7WUFBQSxJQUFxQjtjQUNuQ3BILFVBQVUsQ0FBQ0MsSUFBSSxDQUFDOEUsSUFBSSxDQUFDcEosV0FBVyxDQUFDO2NBQUM7Z0JBQUEsMEJBQzlCO2tCQUFBLHVCQUNHa0wsWUFBWSxDQUFDUSxvQkFBb0IsQ0FDdEMvQixPQUFPLEVBQ1BoSyxXQUFXLEVBQ1gyQyxjQUFjLEVBQ2RELGVBQWUsRUFDZitHLElBQUksQ0FBQ25KLGNBQWMsRUFDbkJ3SixZQUFZLENBQ1o7b0JBQ0R4SCxPQUFPLEVBQUU7a0JBQUM7Z0JBQ1gsQ0FBQyxjQUFxQjtrQkFDckJ1SCxNQUFNLEVBQUU7Z0JBQ1QsQ0FBQztjQUFBO2dCQUNBbkYsVUFBVSxDQUFDbUQsTUFBTSxDQUFDNEIsSUFBSSxDQUFDcEosV0FBVyxDQUFDO2dCQUFDO2dCQUFBO2NBQUE7Y0FBQTtZQUV0QyxDQUFDO2NBQUE7WUFBQTtVQUFBO1VBRUQsSUFBTTJMLE9BQU8sR0FBRyxJQUFJQyxNQUFNLENBQUM7WUFDMUJwQixLQUFLLEVBQUVnQixNQUFNO1lBQ2JLLEtBQUssRUFBRSxTQUFTO1lBQ2hCQyxPQUFPLEVBQUUsQ0FBQ1IsSUFBSSxDQUFDO1lBQ2ZTLGNBQWMsRUFBRXJDLEtBQUs7WUFDckJzQyxXQUFXLEVBQUUsSUFBSUMsTUFBTSxDQUFDO2NBQ3ZCbEIsSUFBSSxFQUFFeEcsbUJBQW1CLENBQUNrRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7Y0FDcERLLElBQUksRUFBRSxZQUFZO2NBQ2xCb0IsS0FBSyxFQUFFLFlBQVk7Z0JBQ2xCQyxlQUFlLENBQUNDLDZCQUE2QixFQUFFO2dCQUMvQ2pELGdCQUFnQixHQUFHLElBQUk7Z0JBQ3ZCd0MsT0FBTyxDQUFDVSxLQUFLLEVBQUU7Z0JBQ2ZaLFNBQVMsRUFBRTtjQUNaO1lBQ0QsQ0FBQyxDQUFDO1lBQ0ZhLFNBQVMsRUFBRSxJQUFJTCxNQUFNLENBQUM7Y0FDckJsQixJQUFJLEVBQUVwRixXQUFXLENBQUM0RSxpQkFBaUIsQ0FBQyx3QkFBd0IsRUFBRWxJLGVBQWUsQ0FBQztjQUM5RTZKLEtBQUssRUFBRSxZQUFZO2dCQUNsQlAsT0FBTyxDQUFDVSxLQUFLLEVBQUU7Y0FDaEI7WUFDRCxDQUFDLENBQUM7WUFDRkUsVUFBVSxFQUFFLFlBQVk7Y0FDdkJaLE9BQU8sQ0FBQ2EsT0FBTyxFQUFFO2NBQ2pCO2NBQ0EsSUFBSSxDQUFDckQsZ0JBQWdCLEVBQUU7Z0JBQ3RCSyxNQUFNLEVBQUU7Y0FDVDtZQUNEO1VBQ0QsQ0FBQyxDQUFRO1VBQ1QsSUFBSTdKLFdBQVcsQ0FBQzhNLFFBQVEsRUFBRTtZQUN6QmhCLFNBQVMsRUFBRTtVQUNaLENBQUMsTUFBTTtZQUNORSxPQUFPLENBQUNlLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQztZQUM1Q2YsT0FBTyxDQUFDZ0IsSUFBSSxFQUFFO1VBQ2Y7UUFDRCxDQUFDLFNBQVM7VUFDVHRJLFVBQVUsQ0FBQ21ELE1BQU0sQ0FBQzRCLElBQUksQ0FBQ3BKLFdBQVcsQ0FBQztRQUNwQztNQUNELENBQUMsQ0FBQztJQUNIO0lBQ0E7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BWEM7SUFBQSxPQVlNNE0sWUFBWSx5QkFBQ3pNLFFBQW1CLEVBQUVnQixLQUFXLEVBQUVtQixjQUE4QjtNQUFBLElBQWtDO1FBQUEsYUFFdkcsSUFBSTtRQURqQjtRQUNBLElBQU04RyxJQUFJLFNBQU87UUFDakIsSUFBTWhKLGlCQUFpQixHQUFHLE9BQUtGLG1CQUFtQixDQUFDQyxRQUFRLENBQUM7UUFDNUQsSUFBSSxDQUFDQSxRQUFRLEVBQUU7VUFDZCxNQUFNLElBQUk4RCxLQUFLLENBQUMsZ0RBQWdELENBQUM7UUFDbEU7UUFDQSxJQUFJN0QsaUJBQWlCLEtBQUtiLGdCQUFnQixDQUFDdUIsS0FBSyxJQUFJVixpQkFBaUIsS0FBS2IsZ0JBQWdCLENBQUN5QixNQUFNLEVBQUU7VUFDbEcsTUFBTSxJQUFJaUQsS0FBSyxDQUFDLHFFQUFxRSxDQUFDO1FBQ3ZGO1FBQ0FJLFVBQVUsQ0FBQ0MsSUFBSSxDQUFDOEUsSUFBSSxDQUFDcEosV0FBVyxDQUFDO1FBQ2pDO1FBQ0FzQyxjQUFjLENBQUN1Syx3QkFBd0IsRUFBRTtRQUFDO1VBQUEsMEJBRXRDO1lBQUEsdUJBRUZ6TSxpQkFBaUIsS0FBS2IsZ0JBQWdCLENBQUN1QixLQUFLLEdBQ25DZ00sS0FBSyxDQUFDQyw2QkFBNkIsQ0FBQzVNLFFBQVEsRUFBRSxPQUFLMkMsZ0JBQWdCLEVBQUUsRUFBRTtjQUM3RWtLLGdCQUFnQixFQUFFLElBQUk7Y0FDdEI3TCxLQUFLLEVBQUVBO1lBQ1AsQ0FBQyxDQUFRLEdBQ0g4TCxNQUFNLENBQUNDLDJCQUEyQixDQUFDL00sUUFBUSxFQUFFLE9BQUsyQyxnQkFBZ0IsRUFBRSxDQUFDLGlCQU56RXFLLFdBQVc7Y0FBQSx1QkFRWDdLLGNBQWMsQ0FBQ3FDLGlCQUFpQixFQUFFO2dCQUN4QyxPQUFPd0ksV0FBVztjQUFDO1lBQUE7VUFDcEIsQ0FBQyxZQUFRQyxHQUFRLEVBQUU7WUFBQSx1QkFDWjlLLGNBQWMsQ0FBQytLLFlBQVksQ0FBQztjQUFFQyxrQkFBa0IsRUFBRTtZQUFLLENBQUMsQ0FBQztjQUMvRCxNQUFNRixHQUFHO1lBQUM7VUFDWCxDQUFDO1FBQUE7VUFDQS9JLFVBQVUsQ0FBQ21ELE1BQU0sQ0FBQzRCLElBQUksQ0FBQ3BKLFdBQVcsQ0FBQztVQUFDO1VBQUE7UUFBQTtNQUV0QyxDQUFDO1FBQUE7TUFBQTtJQUFBO0lBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQWhCQztJQUFBLE9BaUJNdU4sY0FBYywyQkFDbkJwTixRQUFtQixFQUNuQmlDLGFBQTZFLEVBQzdFQyxlQUFvQixFQUNwQkMsY0FBOEIsRUFDOUJrTCxXQUFvQixFQUNwQkMsZ0JBQXlCO01BQUEsSUFDTTtRQUFBLGFBS2YsSUFBSTtRQUpwQjtRQUNBLElBQUksQ0FBQ3ROLFFBQVEsRUFBRTtVQUNkLE1BQU0sSUFBSThELEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQztRQUNoRTtRQUNBSSxVQUFVLENBQUNDLElBQUksQ0FBQyxPQUFLdEUsV0FBVyxDQUFDO1FBQ2pDLElBQU1MLFdBQVcsR0FBR0QsYUFBYSxDQUFDMEMsYUFBYSxDQUFDO1FBQ2hELElBQU1JLE1BQU0sR0FBR3JDLFFBQVEsQ0FBQ1MsUUFBUSxFQUFFO1FBQ2xDLElBQU1SLGlCQUFpQixHQUFHLE9BQUtGLG1CQUFtQixDQUFDQyxRQUFRLENBQUM7UUFFNUQsSUFBSUMsaUJBQWlCLEtBQUtiLGdCQUFnQixDQUFDdUIsS0FBSyxJQUFJVixpQkFBaUIsS0FBS2IsZ0JBQWdCLENBQUN5QixNQUFNLEVBQUU7VUFDbEcsTUFBTSxJQUFJaUQsS0FBSyxDQUFDLDZFQUE2RSxDQUFDO1FBQy9GO1FBQUM7VUFBQSwwQkFDRztZQUFBO2NBQUE7Z0JBQUE7a0JBQUE7b0JBa0RIO29CQUNBM0IsY0FBYyxDQUFDdUssd0JBQXdCLEVBQUU7b0JBQ3pDO29CQUFBLHVCQUNNdkssY0FBYyxDQUFDK0ssWUFBWSxFQUFFO3NCQUNuQyxPQUFPSyxhQUFhO29CQUFDO2tCQUFBO2tCQUFBO29CQUFBLElBbkNqQnROLGlCQUFpQixLQUFLYixnQkFBZ0IsQ0FBQ3VCLEtBQUs7c0JBQUE7d0JBQUEsSUFDM0MwTSxXQUFXOzBCQUNkLElBQUlyTixRQUFRLENBQUN3TixpQkFBaUIsRUFBRSxFQUFFOzRCQUNqQ3hOLFFBQVEsQ0FBQ3lOLFVBQVUsRUFBRSxDQUFDQyxZQUFZLEVBQUU7MEJBQ3JDOzBCQUFDLHVCQUNxQmYsS0FBSyxDQUFDZ0IsV0FBVyxDQUFDM04sUUFBUSxFQUFFLE9BQUtGLGNBQWMsQ0FBQzs0QkFBdEV5TixhQUFhLHFCQUF5RDswQkFBQzt3QkFBQTswQkFFdkUsSUFBTUssZUFBZSxHQUFHdkwsTUFBTSxDQUFDNEYsV0FBVyxXQUFJakksUUFBUSxDQUFDSSxPQUFPLEVBQUUsb0JBQWlCLENBQUM4SCxlQUFlLEVBQUU7MEJBQUMsMkNBQ2hHOzRCQUFBLHVCQUMwQjBGLGVBQWUsQ0FBQ3RGLG9CQUFvQixFQUFFLGlCQUE3RHVGLGNBQWM7OEJBQ3BCLElBQUk3TixRQUFRLENBQUN3TixpQkFBaUIsRUFBRSxFQUFFO2dDQUNqQ3hOLFFBQVEsQ0FBQ3lOLFVBQVUsRUFBRSxDQUFDQyxZQUFZLEVBQUU7OEJBQ3JDOzhCQUNBSCxhQUFhLEdBQUdsTCxNQUFNLENBQUM0RixXQUFXLENBQUM0RixjQUFjLENBQUMsQ0FBQzNGLGVBQWUsRUFBRTs0QkFBQzswQkFDdEUsQ0FBQzs0QkFBQSx1QkFDTXlFLEtBQUssQ0FBQ2dCLFdBQVcsQ0FBQzNOLFFBQVEsRUFBRSxPQUFLRixjQUFjLENBQUM7OEJBQUE7OEJBQUE7NEJBQUE7MEJBQUE7MEJBQUE7d0JBQUE7c0JBQUE7c0JBQUE7b0JBQUE7c0JBQUEsdUJBSXpCZ04sTUFBTSxDQUFDZ0IsZUFBZSxDQUFDOU4sUUFBUSxDQUFDLGlCQUF6RCtOLGdCQUFnQjt3QkFBQSxJQUNsQkEsZ0JBQWdCOzBCQUNuQixJQUFJQSxnQkFBZ0IsQ0FBQ1AsaUJBQWlCLEVBQUUsRUFBRTs0QkFDekNPLGdCQUFnQixDQUFDTixVQUFVLEVBQUUsQ0FBQ0MsWUFBWSxFQUFFOzBCQUM3QzswQkFBQyxJQUNHLENBQUNMLFdBQVc7NEJBQ2ZVLGdCQUFnQixDQUFDQyxPQUFPLEVBQUU7NEJBQzFCVCxhQUFhLEdBQUdRLGdCQUFnQjswQkFBQzt3QkFBQTtzQkFBQTtvQkFBQTtrQkFBQTtrQkFBQTtnQkFBQTtnQkFoQ3BDLElBQUkvTixRQUFRLENBQUNpTyxXQUFXLEVBQUUsRUFBRTtrQkFDM0JqTyxRQUFRLENBQUNrTyxZQUFZLENBQUMsS0FBSyxDQUFDO2dCQUM3QjtnQkFBQztrQkFBQSxJQUNHMU8sV0FBVyxDQUFDMk8sb0JBQW9CO29CQUFBLHVCQUM3QjNPLFdBQVcsQ0FBQzJPLG9CQUFvQixDQUFDO3NCQUFFQyxPQUFPLEVBQUVwTztvQkFBUyxDQUFDLENBQUM7a0JBQUE7Z0JBQUE7Z0JBQUE7Y0FBQTtjQUFBO2dCQUFBLElBUDFELENBQUNSLFdBQVcsQ0FBQzZPLGtCQUFrQjtrQkFBQSx1QkFDNUIsT0FBS0MsbUJBQW1CLENBQUM5TyxXQUFXLENBQUMrTyxZQUFZLEVBQUVqQixnQkFBZ0IsRUFBRXBMLGVBQWUsQ0FBQztnQkFBQTtjQUFBO2NBQUE7WUFBQTtZQVY1RixJQUFJcUwsYUFBa0MsR0FBRyxLQUFLO1lBQUM7Y0FBQSxJQUUzQ3ROLGlCQUFpQixLQUFLYixnQkFBZ0IsQ0FBQ3VCLEtBQUssSUFBSSxDQUFDMk0sZ0JBQWdCO2dCQUNwRSxJQUFNa0IsZ0JBQWdCLEdBQUduTSxNQUFNLENBQUM0RixXQUFXLFdBQUlqSSxRQUFRLENBQUNJLE9BQU8sRUFBRSw4QkFBMkIsQ0FBQzhILGVBQWUsRUFBRTtnQkFBQyx1QkFDbEZzRyxnQkFBZ0IsQ0FBQ0MsYUFBYSxFQUFFLGlCQUF2RHhFLGNBQWM7a0JBQUEsSUFDaEJBLGNBQWM7b0JBQ2pCcUQsZ0JBQWdCLEdBQUdyRCxjQUFjLENBQUN5RSxnQkFBZ0IsS0FBS3pFLGNBQWMsQ0FBQzBFLGtCQUFrQjtrQkFBQztnQkFBQTtjQUFBO1lBQUE7WUFBQTtVQWdENUYsQ0FBQyxZQUFRMUIsR0FBUSxFQUFFO1lBQUEsdUJBQ1o5SyxjQUFjLENBQUMrSyxZQUFZLEVBQUU7Y0FDbkMsTUFBTUQsR0FBRztZQUFDO1VBQ1gsQ0FBQztRQUFBO1VBQ0EvSSxVQUFVLENBQUNtRCxNQUFNLENBQUMsT0FBS3hILFdBQVcsQ0FBQztVQUFDO1VBQUE7UUFBQTtNQUV0QyxDQUFDO1FBQUE7TUFBQTtJQUFBO0lBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBZEM7SUFBQSxPQWVNK08sWUFBWSx5QkFDakI1TyxRQUFtQixFQUNuQmtDLGVBQW9CLEVBQ3BCMk0sMEJBQStCLEVBQy9CQyxTQUFjLEVBQ2QzTSxjQUE4QixFQUM5QmtMLFdBQW9CO01BQUEsSUFDQztRQUFBLGFBSUssSUFBSTtRQUg5QixJQUFJLENBQUNyTixRQUFRLEVBQUU7VUFDZCxPQUFPNkIsT0FBTyxDQUFDd0gsTUFBTSxDQUFDLElBQUl2RixLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUNsRjtRQUNBLElBQU03RCxpQkFBaUIsR0FBRyxPQUFLRixtQkFBbUIsQ0FBQ0MsUUFBUSxDQUFDO1FBQzVELElBQUlDLGlCQUFpQixLQUFLYixnQkFBZ0IsQ0FBQ3lCLE1BQU0sSUFBSVosaUJBQWlCLEtBQUtiLGdCQUFnQixDQUFDdUIsS0FBSyxFQUFFO1VBQ2xHLE1BQU0sSUFBSW1ELEtBQUssQ0FBQyxxRUFBcUUsQ0FBQztRQUN2RjtRQUNBO1FBQ0E7UUFDQTNCLGNBQWMsQ0FBQ3VLLHdCQUF3QixFQUFFO1FBQUM7VUFBQSwwQkFFdEM7WUFDSHhJLFVBQVUsQ0FBQ0MsSUFBSSxDQUFDLE9BQUt0RSxXQUFXLENBQUM7WUFBQyx1QkFFakNJLGlCQUFpQixLQUFLYixnQkFBZ0IsQ0FBQ3VCLEtBQUssR0FDbkNnTSxLQUFLLENBQUNvQyxnQkFBZ0IsQ0FBQy9PLFFBQVEsRUFBRSxPQUFLMkMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRVIsY0FBYyxDQUFDLEdBQzdFMkssTUFBTSxDQUFDaUMsZ0JBQWdCLENBQUMvTyxRQUFRLEVBQUUsT0FBSzJDLGdCQUFnQixFQUFFLENBQUMsaUJBSDlEcU0sZUFBZTtjQUtyQixJQUFNQyxnQkFBZ0IsR0FBR2pELGVBQWUsQ0FBQ2tELFdBQVcsRUFBRSxDQUFDQyxNQUFNLENBQUNuRCxlQUFlLENBQUNrRCxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztjQUN4RyxJQUFJLEVBQUVELGdCQUFnQixDQUFDek4sTUFBTSxLQUFLLENBQUMsSUFBSXlOLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDdEUsSUFBSSxLQUFLckwsV0FBVyxDQUFDOFAsV0FBVyxDQUFDQyxPQUFPLENBQUMsRUFBRTtnQkFDckc7Z0JBQ0FDLFlBQVksQ0FBQ25GLElBQUksQ0FDaEJrRCxXQUFXLEdBQ1I3SCxXQUFXLENBQUM0RSxpQkFBaUIsQ0FBQyxxQ0FBcUMsRUFBRWxJLGVBQWUsQ0FBQyxHQUNyRnNELFdBQVcsQ0FBQzRFLGlCQUFpQixDQUFDLG1DQUFtQyxFQUFFbEksZUFBZSxDQUFDLENBQ3RGO2NBQ0Y7Y0FFQSxPQUFPOE0sZUFBZTtZQUFDO1VBQ3hCLENBQUMsWUFBUS9CLEdBQVEsRUFBRTtZQUNsQixJQUFJNkIsU0FBUyxJQUFJQSxTQUFTLENBQUN0TixNQUFNLEdBQUcsQ0FBQyxFQUFFO2NBQ3RDO2NBQ0FzTixTQUFTLENBQUNTLE9BQU8sQ0FBQyxVQUFDQyxZQUFpQixFQUFLO2dCQUN4QyxJQUFJLENBQUNoSyxXQUFXLENBQUNpSyxtQkFBbUIsQ0FBQ0QsWUFBWSxDQUFDLElBQUlYLDBCQUEwQixFQUFFO2tCQUNqRixJQUFNalAsYUFBYSxHQUFHLE9BQUsrQyxnQkFBZ0IsRUFBRTtrQkFDN0MvQyxhQUFhLENBQUM4UCxxQkFBcUIsRUFBRSxDQUFDQyx1Q0FBdUMsQ0FBQ0gsWUFBWSxDQUFDcFAsT0FBTyxFQUFFLEVBQUVKLFFBQVEsQ0FBQztnQkFDaEg7Y0FDRCxDQUFDLENBQUM7WUFDSDtZQUFDLHVCQUNLbUMsY0FBYyxDQUFDK0ssWUFBWSxFQUFFO2NBQ25DLE1BQU1ELEdBQUc7WUFBQztVQUNYLENBQUM7UUFBQTtVQUNBL0ksVUFBVSxDQUFDbUQsTUFBTSxDQUFDLE9BQUt4SCxXQUFXLENBQUM7VUFBQztVQUFBO1FBQUE7TUFFdEMsQ0FBQztRQUFBO01BQUE7SUFBQTtJQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBckJDO0lBQUEsT0FzQk04RSxVQUFVLHVCQUFDaUwsV0FBbUIsRUFBRXBRLFdBQWdCLEVBQUV3QixLQUFrQixFQUFFbUIsY0FBOEI7TUFBQSxJQUFnQjtRQUFBLGNBRzVHLElBQUk7UUFGakIzQyxXQUFXLEdBQUdELGFBQWEsQ0FBQ0MsV0FBVyxDQUFDO1FBQ3hDO1FBQ0EsSUFBTXlKLElBQUksVUFBTztRQUNqQixJQUFJakosUUFBUSxFQUFFcUMsTUFBVztRQUN6QixJQUFNZ0Isa0JBQWtCLEdBQUc3RCxXQUFXLENBQUN3RixpQkFBaUI7UUFDeEQsSUFBSSxDQUFDNEssV0FBVyxFQUFFO1VBQ2pCLE1BQU0sSUFBSTlMLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQztRQUN6RDtRQUNBO1FBQ0E7UUFDQTtRQUNBLElBQU0rTCxLQUFLLEdBQUdELFdBQVcsQ0FBQ0UsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2Q0YsV0FBVyxHQUFHQyxLQUFLLElBQUlELFdBQVc7UUFDbEM1UCxRQUFRLEdBQUc2UCxLQUFLLEdBQUd6TSxTQUFTLEdBQUc1RCxXQUFXLENBQUNvRixRQUFRO1FBQ25EO1FBQ0EsSUFBSTVFLFFBQVEsS0FBTW1KLEtBQUssQ0FBQ0MsT0FBTyxDQUFDcEosUUFBUSxDQUFDLElBQUlBLFFBQVEsQ0FBQ3dCLE1BQU0sSUFBSyxDQUFDMkgsS0FBSyxDQUFDQyxPQUFPLENBQUNwSixRQUFRLENBQUMsQ0FBQyxFQUFFO1VBQzNGQSxRQUFRLEdBQUdtSixLQUFLLENBQUNDLE9BQU8sQ0FBQ3BKLFFBQVEsQ0FBQyxHQUFHQSxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUdBLFFBQVE7VUFDM0RxQyxNQUFNLEdBQUdyQyxRQUFRLENBQUNTLFFBQVEsRUFBRTtRQUM3QjtRQUNBLElBQUlqQixXQUFXLENBQUN1USxLQUFLLEVBQUU7VUFDdEIxTixNQUFNLEdBQUc3QyxXQUFXLENBQUN1USxLQUFLO1FBQzNCO1FBQ0EsSUFBSSxDQUFDMU4sTUFBTSxFQUFFO1VBQ1osTUFBTSxJQUFJeUIsS0FBSyxDQUFDLDJFQUEyRSxDQUFDO1FBQzdGO1FBQ0E7UUFDQTtRQUNBLElBQU1sRSxhQUFhLEdBQUdxSixJQUFJLENBQUN0RyxnQkFBZ0IsRUFBRTtRQUM3QyxJQUFNcU4sc0JBQXNCLEdBQUdwUSxhQUFhLENBQUM4UCxxQkFBcUIsRUFBRSxDQUFDTyx5QkFBeUIsQ0FBQ0wsV0FBVyxFQUFFNVAsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTNILElBQU1rUSxpQ0FBaUMsR0FBRyxZQUFtQztVQUM1RSxJQUFJLENBQUMxUSxXQUFXLENBQUMyUSxvQkFBb0IsSUFBSTNRLFdBQVcsQ0FBQzJRLG9CQUFvQixDQUFDM08sTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN2RixPQUFPSyxPQUFPLENBQUNDLE9BQU8sQ0FBQ3RDLFdBQVcsQ0FBQ29GLFFBQVEsQ0FBQztVQUM3QztVQUVBLE9BQU8sSUFBSS9DLE9BQU8sV0FBUUMsT0FBTyxFQUFFdUgsTUFBTTtZQUFBLElBQUs7Y0FDN0MsSUFBTStHLG1CQUFtQixHQUFHLFVBQVVDLElBQVksRUFBRTtnQkFDbkQsSUFBSUMsY0FBYztnQkFDbEIsSUFBTUMsY0FBYyxHQUFHL1EsV0FBVyxDQUFDMlEsb0JBQW9CLENBQUMzTyxNQUFNO2tCQUM3RGdQLG1CQUFtQixHQUFHLEVBQUU7Z0JBQ3pCLEtBQUssSUFBSTlHLENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR2xLLFdBQVcsQ0FBQzJRLG9CQUFvQixDQUFDM08sTUFBTSxFQUFFa0ksQ0FBQyxFQUFFLEVBQUU7a0JBQ2pFNEcsY0FBYyxHQUFHOVEsV0FBVyxDQUFDMlEsb0JBQW9CLENBQUN6RyxDQUFDLENBQUMsQ0FBQ2xHLFNBQVMsRUFBRTtrQkFDaEVnTixtQkFBbUIsQ0FBQ3JJLElBQUksQ0FBQ21JLGNBQWMsQ0FBQztnQkFDekM7Z0JBQ0EsSUFBTUcsd0JBQXdCLEdBQUcsSUFBSUMsU0FBUyxDQUFDRixtQkFBbUIsQ0FBQztnQkFDbkUsSUFBTUcsT0FBTyxHQUFHLElBQUlELFNBQVMsQ0FBQztrQkFBRUUsS0FBSyxFQUFFTCxjQUFjO2tCQUFFekwsS0FBSyxFQUFFdEYsV0FBVyxDQUFDc0Y7Z0JBQU0sQ0FBQyxDQUFDO2dCQUNsRnVMLElBQUksQ0FBQ1EsUUFBUSxDQUFDSix3QkFBd0IsRUFBRSxlQUFlLENBQUM7Z0JBQ3hESixJQUFJLENBQUNRLFFBQVEsQ0FBQ0YsT0FBTyxFQUFFLFFBQVEsQ0FBQztnQkFDaENOLElBQUksQ0FBQzdELElBQUksRUFBRTtjQUNaLENBQUM7Y0FDRDtjQUNBLElBQU1zRSxhQUFhLEdBQUcsb0NBQW9DO2NBQzFELElBQU1DLGVBQWUsR0FBR0Msb0JBQW9CLENBQUNDLFlBQVksQ0FBQ0gsYUFBYSxFQUFFLFVBQVUsQ0FBQztjQUNwRixJQUFNeE8sVUFBVSxHQUFHRCxNQUFNLENBQUMzQixZQUFZLEVBQUU7Y0FDeEMsSUFBTW1OLGNBQWMsR0FBR3JPLFdBQVcsQ0FBQ29GLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQ3NNLGdCQUFnQixFQUFFO2NBQ2pFLElBQU1DLFVBQVUsYUFBTXRELGNBQWMsQ0FBQ3VELE1BQU0sQ0FBQyxDQUFDLEVBQUV2RCxjQUFjLENBQUN3RCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBRztjQUM5RSxJQUFNQyxpQkFBaUIsR0FBRyxJQUFJWixTQUFTLENBQUM7Z0JBQ3ZDckcsS0FBSyxFQUFFN0ssV0FBVyxDQUFDc0Y7Y0FDcEIsQ0FBQyxDQUFDO2NBQUMsaUNBRUM7Z0JBQUEsdUJBQ3FCeU0sZUFBZSxDQUFDQyxPQUFPLENBQzlDVCxlQUFlLEVBQ2Y7a0JBQUVVLElBQUksRUFBRVg7Z0JBQWMsQ0FBQyxFQUN2QjtrQkFDQ1ksZUFBZSxFQUFFO29CQUNoQkMsVUFBVSxFQUFFclAsVUFBVSxDQUFDdUQsb0JBQW9CLENBQUNzTCxVQUFVLENBQUM7b0JBQ3ZEck0sS0FBSyxFQUFFd00saUJBQWlCLENBQUN6TCxvQkFBb0IsQ0FBQyxHQUFHO2tCQUNsRCxDQUFDO2tCQUNEK0wsTUFBTSxFQUFFO29CQUNQRCxVQUFVLEVBQUVyUCxVQUFVO29CQUN0QnVQLFNBQVMsRUFBRXZQLFVBQVU7b0JBQ3JCd0MsS0FBSyxFQUFFd007a0JBQ1I7Z0JBQ0QsQ0FBQyxDQUNELGlCQWRLUSxTQUFTO2tCQWVmO2tCQUNBLElBQUl0RyxPQUFlO2tCQUNuQixJQUFNdUcsV0FBVyxHQUFHO29CQUNuQnhILE9BQU8sRUFBRSxZQUFZO3NCQUNwQjtzQkFDQWlCLE9BQU8sQ0FBQ1UsS0FBSyxFQUFFO3NCQUNmcEssT0FBTyxFQUFFO29CQUNWLENBQUM7b0JBQ0RrUSxVQUFVLEVBQUUsWUFBWTtzQkFDdkI7c0JBQ0F4RyxPQUFPLENBQUNVLEtBQUssRUFBRTtzQkFDZnBLLE9BQU8sQ0FBQ3RDLFdBQVcsQ0FBQ3lTLGlCQUFpQixDQUFDO29CQUN2QztrQkFDRCxDQUFDO2tCQUFDLHVCQUNlQyxRQUFRLENBQUNDLElBQUksQ0FBQztvQkFBRUMsVUFBVSxFQUFFTixTQUFTO29CQUFFTyxVQUFVLEVBQUVOO2tCQUFZLENBQUMsQ0FBQztvQkFBbEZ2RyxPQUFPLGlCQUFzRjtvQkFDN0Z1RyxXQUFXLENBQUN4SCxPQUFPLEdBQUcsWUFBWTtzQkFDakM7c0JBQ0FpQixPQUFPLENBQUNVLEtBQUssRUFBRTtzQkFDZnBLLE9BQU8sRUFBRTtvQkFDVixDQUFDO29CQUNEaVEsV0FBVyxDQUFDQyxVQUFVLEdBQUcsWUFBWTtzQkFDcEM7c0JBQ0F4RyxPQUFPLENBQUNVLEtBQUssRUFBRTtzQkFDZnBLLE9BQU8sQ0FBQ3RDLFdBQVcsQ0FBQ3lTLGlCQUFpQixDQUFDO29CQUN2QyxDQUFDO29CQUVEelMsV0FBVyxDQUFDa0YsYUFBYSxDQUFDNE4sWUFBWSxDQUFDOUcsT0FBTyxDQUFDO29CQUMvQzRFLG1CQUFtQixDQUFDNUUsT0FBTyxDQUFDO2tCQUFDO2dCQUFBO2NBQzlCLENBQUMsWUFBUTNFLE1BQU0sRUFBRTtnQkFDaEJ3QyxNQUFNLENBQUN4QyxNQUFNLENBQUM7Y0FDZixDQUFDO2NBQUE7WUFDRixDQUFDO2NBQUE7WUFBQTtVQUFBLEVBQUM7UUFDSCxDQUFDO1FBQUMsMENBRUU7VUFBQTtZQUFBLHVCQXVERyxRQUFLMEwscUJBQXFCLENBQUNwUSxjQUFjLEVBQUUzQyxXQUFXLEVBQUVvUSxXQUFXLENBQUM7Y0FDMUUsT0FBT3JMLE9BQU87WUFBQztVQUFBO1VBdkRmLElBQUlBLE9BQVk7VUFBQztZQUFBLElBQ2J2RSxRQUFRLElBQUlxQyxNQUFNO2NBQUEsdUJBQ1U2TixpQ0FBaUMsRUFBRSxpQkFBNURzQyxnQkFBZ0I7Z0JBQUE7a0JBQUEsSUFDbEJBLGdCQUFnQjtvQkFBQSx1QkFDSDlMLFVBQVUsQ0FBQytMLGVBQWUsQ0FBQzdDLFdBQVcsRUFBRTRDLGdCQUFnQixFQUFFblEsTUFBTSxFQUFFekMsYUFBYSxFQUFFO3NCQUNoRzhTLGVBQWUsRUFBRWxULFdBQVcsQ0FBQ2tULGVBQWU7c0JBQzVDQyxrQkFBa0IsRUFBRW5ULFdBQVcsQ0FBQ21ULGtCQUFrQjtzQkFDbEQ3TixLQUFLLEVBQUV0RixXQUFXLENBQUNzRixLQUFLO3NCQUN4QkksbUJBQW1CLEVBQUUxRixXQUFXLENBQUMwRixtQkFBbUI7c0JBQ3BEN0Isa0JBQWtCLEVBQUVBLGtCQUFrQjtzQkFDdENxSCxhQUFhLEVBQUVsTCxXQUFXLENBQUNrTCxhQUFhO3NCQUN4Q2tJLG9CQUFvQixFQUFFNUMsc0JBQXNCO3NCQUM1QzZDLFdBQVcsRUFBRSxZQUFZO3dCQUN4QjFRLGNBQWMsQ0FBQ3VLLHdCQUF3QixFQUFFO3dCQUN6Q3hJLFVBQVUsQ0FBQ0MsSUFBSSxDQUFDOEUsSUFBSSxDQUFDcEosV0FBVyxDQUFDO3NCQUNsQyxDQUFDO3NCQUNEaVQsVUFBVSxFQUFFLFlBQVk7d0JBQ3ZCNU8sVUFBVSxDQUFDbUQsTUFBTSxDQUFDNEIsSUFBSSxDQUFDcEosV0FBVyxDQUFDO3NCQUNwQyxDQUFDO3NCQUNENkUsYUFBYSxFQUFFbEYsV0FBVyxDQUFDa0YsYUFBYTtzQkFDeENxTyxTQUFTLEVBQUV2VCxXQUFXLENBQUN1VCxTQUFTO3NCQUNoQ0Msb0JBQW9CLEVBQUV4VCxXQUFXLENBQUN3VCxvQkFBb0I7c0JBQ3REQyxxQkFBcUIsRUFBRXpULFdBQVcsQ0FBQ3lULHFCQUFxQjtzQkFDeERoTyxlQUFlLEVBQUV6RixXQUFXLENBQUN5RixlQUFlO3NCQUM1Q2lPLGdCQUFnQixFQUFFMVQsV0FBVyxDQUFDMFQsZ0JBQWdCO3NCQUM5Q0MsV0FBVyxFQUFFM1QsV0FBVyxDQUFDMlQsV0FBVztzQkFDcENoUixjQUFjLEVBQUVBLGNBQWM7c0JBQzlCaVIsOEJBQThCLEVBQUU1VCxXQUFXLENBQUM0VCw4QkFBOEI7c0JBQzFFQyxhQUFhLEVBQUU3VCxXQUFXLENBQUNvRjtvQkFDNUIsQ0FBQyxDQUFDO3NCQXpCRkwsT0FBTyx3QkF5Qkw7b0JBQUM7a0JBQUE7b0JBRUhBLE9BQU8sR0FBRyxJQUFJO2tCQUFDO2dCQUFBO2dCQUFBO2NBQUE7WUFBQTtjQUFBLHVCQUdBbUMsVUFBVSxDQUFDNE0sZ0JBQWdCLENBQUMxRCxXQUFXLEVBQUV2TixNQUFNLEVBQUV6QyxhQUFhLEVBQUU7Z0JBQy9FOFMsZUFBZSxFQUFFbFQsV0FBVyxDQUFDa1QsZUFBZTtnQkFDNUM1TixLQUFLLEVBQUV0RixXQUFXLENBQUNzRixLQUFLO2dCQUN4QkksbUJBQW1CLEVBQUUxRixXQUFXLENBQUMwRixtQkFBbUI7Z0JBQ3BERixpQkFBaUIsRUFBRTNCLGtCQUFrQjtnQkFDckNxSCxhQUFhLEVBQUVsTCxXQUFXLENBQUNrTCxhQUFhO2dCQUN4Q21JLFdBQVcsRUFBRSxZQUFZO2tCQUN4QjNPLFVBQVUsQ0FBQ0MsSUFBSSxDQUFDOEUsSUFBSSxDQUFDcEosV0FBVyxDQUFDO2dCQUNsQyxDQUFDO2dCQUNEaVQsVUFBVSxFQUFFLFlBQVk7a0JBQ3ZCNU8sVUFBVSxDQUFDbUQsTUFBTSxDQUFDNEIsSUFBSSxDQUFDcEosV0FBVyxDQUFDO2dCQUNwQyxDQUFDO2dCQUNENkUsYUFBYSxFQUFFbEYsV0FBVyxDQUFDa0YsYUFBYTtnQkFDeENzTyxvQkFBb0IsRUFBRXhULFdBQVcsQ0FBQ3dULG9CQUFvQjtnQkFDdERDLHFCQUFxQixFQUFFelQsV0FBVyxDQUFDeVQscUJBQXFCO2dCQUN4RDlRLGNBQWMsRUFBRUEsY0FBYztnQkFDOUJnUixXQUFXLEVBQUUzVCxXQUFXLENBQUMyVDtjQUMxQixDQUFDLENBQUM7Z0JBakJGNU8sT0FBTyx3QkFpQkw7Y0FBQztZQUFBO1VBQUE7VUFBQTtRQUtMLENBQUMsWUFBUTBJLEdBQVEsRUFBRTtVQUFBLHVCQUNaLFFBQUtzRixxQkFBcUIsQ0FBQ3BRLGNBQWMsRUFBRTNDLFdBQVcsRUFBRW9RLFdBQVcsQ0FBQztZQUMxRSxNQUFNM0MsR0FBRztVQUFDO1FBQ1gsQ0FBQztNQUNGLENBQUM7UUFBQTtNQUFBO0lBQUE7SUFDRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQVpDO0lBQUEsT0FhQXNGLHFCQUFxQixHQUFyQiwrQkFBc0JwUSxjQUE4QixFQUFFM0MsV0FBZ0IsRUFBRW9RLFdBQW1CLEVBQWlCO01BQzNHLElBQU0yRCxrQkFBa0IsR0FBR3ZILGVBQWUsQ0FBQ2tELFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO01BQ2xFLElBQU1zRSxVQUFVLEdBQUdoVSxXQUFXLENBQUNzRixLQUFLLEdBQUd0RixXQUFXLENBQUNzRixLQUFLLEdBQUc4SyxXQUFXO01BQ3RFLElBQUkyRCxrQkFBa0IsQ0FBQy9SLE1BQU0sR0FBRyxDQUFDLElBQUloQyxXQUFXLElBQUlBLFdBQVcsQ0FBQ3dULG9CQUFvQixFQUFFO1FBQ3JGeFQsV0FBVyxDQUFDd1Qsb0JBQW9CLENBQUNTLFdBQVcsQ0FBQyxhQUFhLEVBQUVqVSxXQUFXLENBQUNzRixLQUFLLEdBQUd0RixXQUFXLENBQUNzRixLQUFLLEdBQUc4SyxXQUFXLENBQUM7TUFDakg7TUFDQSxJQUFJbkwsT0FBTztNQUNYLElBQUlqRixXQUFXLENBQUN1VCxTQUFTLEVBQUU7UUFDMUJ0TyxPQUFPLEdBQUdqRixXQUFXLENBQUNrRixhQUFhLENBQUNnUCxJQUFJLENBQUNsVSxXQUFXLENBQUN1VCxTQUFTLENBQUM7TUFDaEUsQ0FBQyxNQUFNO1FBQ050TyxPQUFPLEdBQUdqRixXQUFXLENBQUNrRixhQUFhO01BQ3BDO01BQ0EsT0FBT3ZDLGNBQWMsQ0FBQytLLFlBQVksQ0FBQztRQUFFMEMsV0FBVyxFQUFFNEQsVUFBVTtRQUFFL08sT0FBTyxFQUFFQTtNQUFRLENBQUMsQ0FBQztJQUNsRjtJQUNBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BVEM7SUFBQSxPQVVBa1AscUJBQXFCLEdBQXJCLGlDQUF3QjtNQUN2QixJQUFNQyxlQUFlLEdBQUd2UCxJQUFJLENBQUN3UCxpQkFBaUIsRUFBRTtRQUMvQ0MsYUFBYSxHQUFHRixlQUFlLENBQzdCRyxlQUFlLEVBQUUsQ0FDakJDLE9BQU8sRUFBRSxDQUNUQyxNQUFNLENBQUMsVUFBVWxOLEtBQVUsRUFBRTtVQUM3QjtVQUNBLElBQUlBLEtBQUssQ0FBQ21OLFVBQVUsRUFBRTtZQUNyQixPQUFPbk4sS0FBSztVQUNiO1FBQ0QsQ0FBQyxDQUFDO01BQ0o2TSxlQUFlLENBQUNPLGNBQWMsQ0FBQ0wsYUFBYSxDQUFDO0lBQzlDO0lBQ0E7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BZEM7SUFBQSxPQWVBeEYsbUJBQW1CLEdBQW5CLDZCQUFvQjhGLGFBQWtCLEVBQUVDLFdBQWdCLEVBQUVuUyxlQUFvQixFQUFFO01BQy9FO01BQ0E7TUFDQSxJQUFNK0csSUFBSSxHQUFHLElBQUk7TUFFakIsT0FBTyxJQUFJcEgsT0FBTyxDQUFPLFVBQVVDLE9BQU8sRUFBRXVILE1BQU0sRUFBRTtRQUNuRCxJQUFJLENBQUMrSyxhQUFhLEVBQUU7VUFDbkIvSyxNQUFNLENBQUMseUJBQXlCLENBQUM7UUFDbEM7UUFDQTtRQUNBLElBQUlnTCxXQUFXLEVBQUU7VUFDaEIsSUFBTUMsZ0JBQWdCLEdBQUcsWUFBTTtZQUM5QkYsYUFBYSxDQUFDRyxVQUFVLENBQUMsSUFBSSxDQUFDO1lBQzlCLElBQUl0TCxJQUFJLENBQUN1TCxTQUFTLENBQUM5UyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRTtjQUMzQ0ksT0FBTyxFQUFFO1lBQ1YsQ0FBQyxNQUFNO2NBQ051SCxNQUFNLENBQUMsaUVBQWlFLENBQUM7WUFDMUU7WUFDQUosSUFBSSxDQUFDdUwsU0FBUyxDQUFDQyxnQkFBZ0IsQ0FBQ0gsZ0JBQWdCLENBQUM7VUFDbEQsQ0FBQztVQUNELElBQUksQ0FBQ3JMLElBQUksQ0FBQ3VMLFNBQVMsRUFBRTtZQUNwQixJQUFNRSxLQUFLLEdBQUcsSUFBSUMsSUFBSSxDQUFDO2dCQUNyQjtnQkFDQTtnQkFDQS9KLElBQUksRUFBRXBGLFdBQVcsQ0FBQzRFLGlCQUFpQixDQUFDLDRDQUE0QyxFQUFFbEksZUFBZTtjQUNsRyxDQUFDLENBQUM7Y0FDRjBTLE9BQU8sR0FBRyxJQUFJOUksTUFBTSxDQUFDO2dCQUNwQmxCLElBQUksRUFBRXBGLFdBQVcsQ0FBQzRFLGlCQUFpQixDQUFDLDJDQUEyQyxFQUFFbEksZUFBZSxDQUFDO2dCQUNqRzJTLEtBQUssRUFBRSxNQUFNO2dCQUNiOUksS0FBSyxFQUFFLFlBQU07a0JBQ1o5QyxJQUFJLENBQUMwSyxxQkFBcUIsRUFBRTtrQkFDNUIxSyxJQUFJLENBQUN1TCxTQUFTLENBQUM5UyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDO2tCQUM1Q3VILElBQUksQ0FBQ3VMLFNBQVMsQ0FBQ3RJLEtBQUssRUFBRTtnQkFDdkIsQ0FBQztnQkFDRE4sY0FBYyxFQUFFOEk7Y0FDakIsQ0FBQyxDQUFRO1lBQ1Z6TCxJQUFJLENBQUN1TCxTQUFTLEdBQUcsSUFBSU0sT0FBTyxDQUFDO2NBQzVCQyxVQUFVLEVBQUUsS0FBSztjQUNqQkMsU0FBUyxFQUFFLEtBQUs7Y0FDaEJySixPQUFPLEVBQUUsQ0FDUixJQUFJUCxJQUFJLENBQUM7Z0JBQ1I3QixLQUFLLEVBQUUsQ0FBQ21MLEtBQUssRUFBRUUsT0FBTztjQUN2QixDQUFDLENBQUMsQ0FDRjtjQUNESyxVQUFVLEVBQUUsWUFBTTtnQkFDakI7Z0JBQ0FiLGFBQWEsQ0FBQ0csVUFBVSxDQUFDLEtBQUssQ0FBQztnQkFDL0J0TCxJQUFJLENBQUN1TCxTQUFTLENBQUNVLGVBQWUsQ0FBQ04sT0FBTyxDQUFDO2dCQUN2QzNMLElBQUksQ0FBQ3VMLFNBQVMsQ0FBQzlTLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUM7Y0FDOUM7WUFDRCxDQUFDLENBQUM7WUFDRnVILElBQUksQ0FBQ3VMLFNBQVMsQ0FBQ2pJLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQztVQUNwRDtVQUNBdEQsSUFBSSxDQUFDdUwsU0FBUyxDQUFDVyxnQkFBZ0IsQ0FBQ2IsZ0JBQWdCLENBQUM7VUFDakRyTCxJQUFJLENBQUN1TCxTQUFTLENBQUNZLE1BQU0sQ0FBQ2hCLGFBQWEsRUFBRSxLQUFLLENBQUM7UUFDNUMsQ0FBQyxNQUFNO1VBQ05uTCxJQUFJLENBQUMwSyxxQkFBcUIsRUFBRTtVQUM1QjdSLE9BQU8sRUFBRTtRQUNWO01BQ0QsQ0FBQyxDQUFDO0lBQ0g7SUFDQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FYQztJQUFBLE9BWUFhLGdCQUFnQixHQUFoQiw0QkFBbUI7TUFDbEIsT0FBTyxJQUFJLENBQUM3QyxjQUFjO0lBQzNCLENBQUM7SUFBQSxPQUVEdVYsY0FBYyxHQUFkLHdCQUFlQyxNQUFXLEVBQUVDLGFBQWtCLEVBQUVwVCxjQUE4QixFQUFFcVQsNEJBQXNDLEVBQUU7TUFDdkhyVCxjQUFjLENBQUN1Syx3QkFBd0IsRUFBRTtNQUN6QyxJQUFNK0ksTUFBTSxHQUFHSCxNQUFNLENBQUNJLFNBQVMsRUFBRTtNQUNqQyxJQUFNQyxhQUFhLEdBQUdMLE1BQU0sQ0FBQ00sWUFBWSxDQUFDLFNBQVMsQ0FBQztNQUNwRCxJQUFJRCxhQUFhLEVBQUU7UUFDbEIsT0FBT0EsYUFBYSxDQUNsQjVXLElBQUksQ0FBQyxVQUFVOFcsS0FBVSxFQUFFO1VBQzNCO1VBQ0FKLE1BQU0sQ0FBQ0ssUUFBUSxDQUFDRCxLQUFLLENBQUM7VUFDdEJMLDRCQUE0QixFQUFFO1VBRTlCLE9BQU9DLE1BQU0sQ0FBQ00sUUFBUSxFQUFFO1FBQ3pCLENBQUMsQ0FBQyxDQUNEQyxLQUFLLENBQUMsVUFBVUgsS0FBVSxFQUFFO1VBQzVCLElBQUlBLEtBQUssS0FBSyxFQUFFLEVBQUU7WUFDakI7WUFDQU4sYUFBYSxDQUFDaEIsVUFBVSxDQUFDLEtBQUssQ0FBQztVQUNoQyxDQUFDLE1BQU07WUFDTjtZQUNBa0IsTUFBTSxDQUFDSyxRQUFRLENBQUNELEtBQUssQ0FBQztZQUN0QkwsNEJBQTRCLEVBQUU7VUFDL0I7UUFDRCxDQUFDLENBQUM7TUFDSjtJQUNELENBQUM7SUFBQSxPQUVEdlAsMEJBQTBCLEdBQTFCLG9DQUNDdUosWUFBOEIsRUFDOUJ5RyxPQUFZLEVBQ1o1VCxNQUFrQixFQUNsQjdDLFdBQWdCLEVBQ2hCMkMsY0FBOEIsRUFDN0I7TUFBQSxjQW1CaUIsSUFBSTtNQWxCdEIsSUFBSXFKLE9BQWU7TUFDbkIsSUFBTTBLLGNBQWMsR0FBRzFXLFdBQVcsQ0FBQ2tGLGFBQWE7O01BRWhEO01BQ0EsSUFBTXlSLHFCQUFxQixHQUFHOVQsTUFBTSxDQUFDK1QsUUFBUSxDQUFDNUcsWUFBWSxDQUFDcFAsT0FBTyxFQUFFLEVBQUVvUCxZQUFZLENBQUM3TCxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFO1FBQ3hHMFMsZUFBZSxFQUFFO01BQ2xCLENBQUMsQ0FBcUI7TUFDdEJGLHFCQUFxQixDQUFDRyxlQUFlLEdBQUcsWUFBWTtRQUNuRDtNQUFBLENBQ0E7TUFDRCxJQUFNQyxpQkFBaUIsR0FBR0oscUJBQXFCLENBQUNoUSxNQUFNLENBQUMzRyxXQUFXLENBQUNrQyxJQUFJLEVBQUUsSUFBSSxDQUFDO01BRTlFLE9BQU8sSUFBSUcsT0FBTyxXQUFRQyxPQUFPLEVBQUV1SCxNQUFNO1FBQUEsSUFBSztVQUM3QyxJQUFNeUgsYUFBYSxHQUFHLHdEQUF3RDtVQUM5RSxJQUFNZ0IsU0FBUyxHQUFHZCxvQkFBb0IsQ0FBQ0MsWUFBWSxDQUFDSCxhQUFhLEVBQUUsVUFBVSxDQUFDO1lBQzdFNU8sZUFBZSxHQUFHZ1UsY0FBYyxDQUFDTSxhQUFhLEVBQUUsQ0FBQ3RVLGVBQWU7WUFDaEVJLFVBQVUsR0FBR0QsTUFBTSxDQUFDM0IsWUFBWSxFQUFFO1lBQ2xDK1YsZ0JBQXVCLEdBQUcsRUFBRTtZQUM1QjdXLGFBQWEsR0FBRyxRQUFLK0MsZ0JBQWdCLEVBQUU7WUFDdkN6QyxLQUFLLEdBQUlzUCxZQUFZLENBQUNuUCxVQUFVLEVBQUUsR0FBR21QLFlBQVksQ0FBQ2xQLGVBQWUsRUFBRSxHQUFHa1AsWUFBWSxDQUFDcFAsT0FBTyxFQUFhO1lBQ3ZHc1csaUJBQWlCLEdBQUdwVSxVQUFVLENBQUN1RCxvQkFBb0IsQ0FBQzNGLEtBQUssQ0FBWTtZQUNyRXFDLFNBQVMsR0FBR0QsVUFBVSxDQUFDRSxXQUFXLENBQUN0QyxLQUFLLENBQUM7VUFDMUMsS0FBSyxJQUFNd0osQ0FBQyxJQUFJdU0sT0FBTyxFQUFFO1lBQ3hCUSxnQkFBZ0IsQ0FBQ3RPLElBQUksQ0FBQzdGLFVBQVUsQ0FBQ3VELG9CQUFvQixXQUFJdEQsU0FBUyxjQUFJMFQsT0FBTyxDQUFDdk0sQ0FBQyxDQUFDLEVBQUcsQ0FBQztVQUNyRjtVQUNBLElBQU1pTixrQkFBa0IsR0FBRyxJQUFJakcsU0FBUyxDQUFDK0YsZ0JBQWdCLENBQUM7VUFDMUQsSUFBTUcsYUFBYSxHQUFHRCxrQkFBa0IsQ0FBQzlRLG9CQUFvQixDQUFDLEdBQUcsQ0FBWTtVQUM3RSxJQUFNZ1IsbUJBQW1CLEdBQUdyUixXQUFXLENBQUNzUiwyQ0FBMkMsQ0FBQ3ZVLFNBQVMsRUFBRUQsVUFBVSxDQUFDO1VBQzFHLElBQU15VSw4QkFBOEIsR0FBRyxJQUFJckcsU0FBUyxDQUFDbUcsbUJBQW1CLENBQUM7VUFDekUsSUFBTUcseUJBQXlCLEdBQUdELDhCQUE4QixDQUFDbFIsb0JBQW9CLENBQUMsR0FBRyxDQUFZO1VBQUMsdUJBQzNFMEwsZUFBZSxDQUFDQyxPQUFPLENBQ2pETSxTQUFTLEVBQ1Q7WUFBRUwsSUFBSSxFQUFFWDtVQUFjLENBQUMsRUFDdkI7WUFDQ1ksZUFBZSxFQUFFO2NBQ2hCdUYsU0FBUyxFQUFFUCxpQkFBaUI7Y0FDNUJRLE1BQU0sRUFBRU4sYUFBYTtjQUNyQk8sa0JBQWtCLEVBQUVIO1lBQ3JCLENBQUM7WUFDRHBGLE1BQU0sRUFBRTtjQUNQcUYsU0FBUyxFQUFFUCxpQkFBaUIsQ0FBQ2pXLFFBQVEsRUFBRTtjQUN2Q3lXLE1BQU0sRUFBRU4sYUFBYSxDQUFDblcsUUFBUSxFQUFFO2NBQ2hDb1IsU0FBUyxFQUFFdlAsVUFBVTtjQUNyQjZVLGtCQUFrQixFQUFFSjtZQUNyQjtVQUNELENBQUMsQ0FDRCxpQkFoQktLLFlBQVk7WUFrQmxCLElBQUlDLGFBQW9CLEdBQUcsRUFBRTtZQUM3QixJQUFNQyxjQUFtQixHQUFHLENBQUMsQ0FBQztZQUM5QjtZQUNBLElBQUkvQixhQUFxQjtZQUV6QixJQUFNZ0MsMEJBQTBCO2NBQUEsSUFBcUI7Z0JBQUE7a0JBa0NwRGhDLGFBQWEsQ0FBQ2hCLFVBQVUsQ0FBQ2lELFFBQVEsQ0FBQztnQkFBQztnQkFqQ25DLElBQUlBLFFBQVEsR0FBRyxLQUFLO2dCQUFDLGlDQUNqQjtrQkFBQSx1QkFDb0IzVixPQUFPLENBQUN1RyxHQUFHLENBQ2pDaVAsYUFBYSxDQUNYaFAsR0FBRyxDQUFDLFVBQVVvUCxZQUFpQixFQUFFO29CQUNqQyxPQUFPQSxZQUFZLENBQUNDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztrQkFDbkMsQ0FBQyxDQUFDLENBQ0R6RCxNQUFNLENBQUMsVUFBVXdCLE1BQVcsRUFBRTtvQkFDOUI7b0JBQ0EsT0FBT0EsTUFBTSxDQUFDa0MsV0FBVyxFQUFFLElBQUlsQyxNQUFNLENBQUNtQyxhQUFhLEVBQUUsS0FBS3ZZLFVBQVUsQ0FBQ3lFLEtBQUs7a0JBQzNFLENBQUMsQ0FBQyxDQUNEdUUsR0FBRyxXQUFpQm9OLE1BQVc7b0JBQUEsSUFBRTtzQkFBQTtzQkFBQTt3QkFBQSw0QkFVMUJBLE1BQU0sQ0FBQ00sUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHM1MsU0FBUyxHQUFHcVMsTUFBTSxDQUFDTSxRQUFRLEVBQUU7c0JBQUE7c0JBVC9ELElBQU04QixRQUFRLEdBQUdwQyxNQUFNLENBQUNxQyxLQUFLLEVBQUU7c0JBQUM7d0JBQUEsSUFDNUJELFFBQVEsSUFBSVAsY0FBYzswQkFBQSwwQkFDekI7NEJBQUEsdUJBQ2tCQSxjQUFjLENBQUNPLFFBQVEsQ0FBQyxpQkFBdkNFLE1BQU07OEJBQUEsY0FDTHRDLE1BQU0sQ0FBQ00sUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHM1MsU0FBUyxHQUFHMlUsTUFBTTs4QkFBQTs4QkFBQTs0QkFBQTswQkFDckQsQ0FBQyxjQUFhOzRCQUFBOzRCQUFBLE9BQ04zVSxTQUFTOzBCQUNqQixDQUFDO3dCQUFBO3NCQUFBO3NCQUFBO29CQUdILENBQUM7c0JBQUE7b0JBQUE7a0JBQUEsRUFBQyxDQUNILGlCQXJCSzRVLFFBQVE7b0JBc0JkUixRQUFRLEdBQUdRLFFBQVEsQ0FBQ0MsS0FBSyxDQUFDLFVBQVVGLE1BQVcsRUFBRTtzQkFDaEQsSUFBSTVPLEtBQUssQ0FBQ0MsT0FBTyxDQUFDMk8sTUFBTSxDQUFDLEVBQUU7d0JBQzFCQSxNQUFNLEdBQUdBLE1BQU0sQ0FBQyxDQUFDLENBQUM7c0JBQ25CO3NCQUNBLE9BQU9BLE1BQU0sS0FBSzNVLFNBQVMsSUFBSTJVLE1BQU0sS0FBSyxJQUFJLElBQUlBLE1BQU0sS0FBSyxFQUFFO29CQUNoRSxDQUFDLENBQUM7a0JBQUM7Z0JBQ0osQ0FBQyxjQUFhO2tCQUNiUCxRQUFRLEdBQUcsS0FBSztnQkFDakIsQ0FBQztnQkFBQTtjQUVGLENBQUM7Z0JBQUE7Y0FBQTtZQUFBO1lBQ0QsSUFBTXpGLFdBQVcsR0FBRztjQUNuQjtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Y0FDSW1HLFlBQVksRUFBRSxVQUFDNUMsTUFBVyxFQUFLO2dCQUM5QixJQUFNdUMsUUFBUSxHQUFHdkMsTUFBTSxDQUFDTSxZQUFZLENBQUMsSUFBSSxDQUFDO2dCQUMxQzBCLGNBQWMsQ0FBQ08sUUFBUSxDQUFDLEdBQUcsUUFBS3hDLGNBQWMsQ0FBQ0MsTUFBTSxFQUFFQyxhQUFhLEVBQUVwVCxjQUFjLEVBQUVvViwwQkFBMEIsQ0FBQztjQUNsSCxDQUFDO2NBQ0Q7QUFDSjtBQUNBO0FBQ0E7QUFDQTtjQUNJWSxnQkFBZ0IsRUFBRSxVQUFDN0MsTUFBVyxFQUFLO2dCQUNsQyxJQUFNdUMsUUFBUSxHQUFHdkMsTUFBTSxDQUFDTSxZQUFZLENBQUMsSUFBSSxDQUFDO2dCQUMxQyxJQUFNbUMsTUFBTSxHQUFHekMsTUFBTSxDQUFDTSxZQUFZLENBQUMsT0FBTyxDQUFDO2dCQUMzQzBCLGNBQWMsQ0FBQ08sUUFBUSxDQUFDLEdBQUdFLE1BQU07Z0JBQ2pDUiwwQkFBMEIsRUFBRTtjQUM3QjtZQUNELENBQUM7WUFBQyx1QkFFZ0NyRixRQUFRLENBQUNDLElBQUksQ0FBQztjQUMvQ0MsVUFBVSxFQUFFZ0YsWUFBWTtjQUN4Qi9FLFVBQVUsRUFBRU47WUFDYixDQUFDLENBQUMsaUJBSEl6QixjQUFtQjtjQUl6QixJQUFJL0wsT0FBWTtjQUNoQixJQUFNNlQsV0FBVyxHQUFHLFlBQVk7Z0JBQy9CO2dCQUNBO2dCQUNBO2dCQUNBLElBQUk3VCxPQUFPLENBQUN3QyxLQUFLLEVBQUU7a0JBQ2xCc0MsTUFBTSxDQUFDOUUsT0FBTyxDQUFDd0MsS0FBSyxDQUFDO2dCQUN0QixDQUFDLE1BQU07a0JBQ05qRixPQUFPLENBQUN5QyxPQUFPLENBQUM4VCxRQUFRLENBQUM7Z0JBQzFCO2dCQUNBN00sT0FBTyxDQUFDVSxLQUFLLEVBQUU7Y0FDaEIsQ0FBQztjQUVEVixPQUFPLEdBQUcsSUFBSUMsTUFBTSxDQUFDNk0sUUFBUSxDQUFDLENBQUMsY0FBYyxFQUFFL1YsU0FBUyxDQUFDLENBQUMsRUFBRTtnQkFDM0Q4SCxLQUFLLEVBQUU3RSxXQUFXLENBQUM0RSxpQkFBaUIsQ0FBQywwQ0FBMEMsRUFBRWxJLGVBQWUsQ0FBQztnQkFDakd5SixPQUFPLEVBQUUsQ0FBQzJFLGNBQWMsQ0FBQztnQkFDekJ6RSxXQUFXLEVBQUU7a0JBQ1pqQixJQUFJLEVBQUVwRixXQUFXLENBQUM0RSxpQkFBaUIsQ0FBQyxpREFBaUQsRUFBRWxJLGVBQWUsQ0FBQztrQkFDdkd5SSxJQUFJLEVBQUUsWUFBWTtrQkFDbEJvQixLQUFLLFlBQVN1SixNQUFXO29CQUFBLElBQUs7c0JBQzdCLElBQU1pRCxZQUFZLEdBQUdqRCxNQUFNLENBQUNJLFNBQVMsRUFBRTtzQkFDdkM2QyxZQUFZLENBQUNoRSxVQUFVLENBQUMsS0FBSyxDQUFDO3NCQUM5QnJRLFVBQVUsQ0FBQ0MsSUFBSSxDQUFDcUgsT0FBTyxDQUFDO3NCQUN4QmhNLFdBQVcsQ0FBQ2daLGVBQWUsR0FBRyxJQUFJO3NCQUFDO3dCQUFBLDBCQUMvQjswQkFBQSx1QkFDbUIzVyxPQUFPLENBQUN1RyxHQUFHLENBQ2hDckMsTUFBTSxDQUFDMFMsSUFBSSxDQUFDbkIsY0FBYyxDQUFDLENBQUNqUCxHQUFHLFdBQWlCcVEsSUFBWTs0QkFBQSxJQUFFOzhCQUFBLHVCQUN4Q3BCLGNBQWMsQ0FBQ29CLElBQUksQ0FBQyxpQkFBbkNDLE1BQU07Z0NBQ1osSUFBTUMsWUFBaUIsR0FBRyxDQUFDLENBQUM7Z0NBQzVCQSxZQUFZLENBQUNGLElBQUksQ0FBQyxHQUFHQyxNQUFNO2dDQUMzQixPQUFPQyxZQUFZOzhCQUFDOzRCQUNyQixDQUFDOzhCQUFBOzRCQUFBOzBCQUFBLEVBQUMsQ0FDRixpQkFQS0MsT0FBTzs0QkFBQTs4QkFnQmIsSUFBTUMsYUFBYSxHQUFHdkMsaUJBQWlCLENBQUMvUyxTQUFTLEVBQUU7OEJBQ25ELElBQU11VixVQUFlLEdBQUcsQ0FBQyxDQUFDOzhCQUMxQmhULE1BQU0sQ0FBQzBTLElBQUksQ0FBQ0ssYUFBYSxDQUFDLENBQUN2SixPQUFPLENBQUMsVUFBVXlKLGFBQXFCLEVBQUU7Z0NBQ25FLElBQU1DLFNBQVMsR0FBRzNXLFVBQVUsQ0FBQ2tCLFNBQVMsV0FBSWpCLFNBQVMsY0FBSXlXLGFBQWEsRUFBRztnQ0FDdkU7Z0NBQ0EsSUFBSUMsU0FBUyxJQUFJQSxTQUFTLENBQUNDLEtBQUssS0FBSyxvQkFBb0IsRUFBRTtrQ0FDMUQ7Z0NBQ0Q7Z0NBQ0FILFVBQVUsQ0FBQ0MsYUFBYSxDQUFDLEdBQUdGLGFBQWEsQ0FBQ0UsYUFBYSxDQUFDOzhCQUN6RCxDQUFDLENBQUM7OEJBQ0YsSUFBTW5WLG1CQUFtQixHQUFHMkwsWUFBWSxDQUFDckosTUFBTSxDQUM5QzRTLFVBQVUsRUFDVixJQUFJLEVBQ0p2WixXQUFXLENBQUM0RyxXQUFXLEVBQ3ZCNUcsV0FBVyxDQUFDNkcsUUFBUSxDQUNwQjs4QkFFRCxJQUFNOFMsUUFBUSxHQUFHLFFBQUs3Uyx1QkFBdUIsQ0FBQ2tKLFlBQVksRUFBRTNMLG1CQUFtQixFQUFFckUsV0FBVyxDQUFDOzhCQUFDLHVCQUNuRTJaLFFBQVEsaUJBQS9CQyxTQUFjO2dDQUFBLElBQ2QsQ0FBQ0EsU0FBUyxJQUFLQSxTQUFTLElBQUlBLFNBQVMsQ0FBQ0MsZUFBZSxLQUFLLElBQUs7a0NBQUE7a0NBQ2xFRCxTQUFTLGlCQUFHQSxTQUFTLG1EQUFJLENBQUMsQ0FBQztrQ0FDM0I1TixPQUFPLENBQUM4TixpQkFBaUIsQ0FBQyxJQUFJLENBQVE7a0NBQ3RDRixTQUFTLENBQUNsVCxVQUFVLEdBQUdyQyxtQkFBbUI7a0NBQzFDVSxPQUFPLEdBQUc7b0NBQUU4VCxRQUFRLEVBQUVlO2tDQUFVLENBQUM7a0NBQ2pDaEIsV0FBVyxFQUFFO2dDQUFDOzhCQUFBOzRCQUFBOzRCQUFBOzhCQUFBLElBaENYNVksV0FBVyxDQUFDeUUsb0JBQW9CO2dDQUFBLHVCQUM3QnNDLFlBQVksQ0FDakIvRyxXQUFXLENBQUN5RSxvQkFBb0IsQ0FBQztrQ0FDaEN1QyxXQUFXLEVBQUVnSixZQUFZLElBQUlBLFlBQVksQ0FBQ3BQLE9BQU8sRUFBRTtrQ0FDbkRtWixnQkFBZ0IsRUFBRVY7Z0NBQ25CLENBQUMsQ0FBQyxDQUNGOzhCQUFBOzRCQUFBOzRCQUFBOzBCQUFBO3dCQTRCSCxDQUFDLFlBQVFoUyxNQUFXLEVBQUU7MEJBQUEsSUFFakJBLE1BQU0sS0FBSzFILFNBQVMsQ0FBQzZILFNBQVMsQ0FBQ3dTLGNBQWM7NEJBQ2hEOzRCQUNBalYsT0FBTyxHQUFHOzhCQUFFd0MsS0FBSyxFQUFFRjs0QkFBTyxDQUFDOzRCQUMzQnVSLFdBQVcsRUFBRTswQkFBQzs0QkFFZEcsWUFBWSxDQUFDaEUsVUFBVSxDQUFDLElBQUksQ0FBQzswQkFBQzt3QkFFaEMsQ0FBQztzQkFBQTt3QkFDQXJRLFVBQVUsQ0FBQ21ELE1BQU0sQ0FBQ21FLE9BQU8sQ0FBQzt3QkFDMUJySixjQUFjLENBQUMrSyxZQUFZLEVBQUU7d0JBQUM7d0JBQUE7c0JBQUE7c0JBQUE7b0JBRWhDLENBQUM7c0JBQUE7b0JBQUE7a0JBQUE7Z0JBQ0YsQ0FBQztnQkFDRGYsU0FBUyxFQUFFO2tCQUNWdkIsSUFBSSxFQUFFcEYsV0FBVyxDQUFDNEUsaUJBQWlCLENBQUMseUNBQXlDLEVBQUVsSSxlQUFlLENBQUM7a0JBQy9GNkosS0FBSyxFQUFFLFlBQVk7b0JBQ2xCeEgsT0FBTyxHQUFHO3NCQUFFd0MsS0FBSyxFQUFFNUgsU0FBUyxDQUFDNkgsU0FBUyxDQUFDRTtvQkFBbUIsQ0FBQztvQkFDM0RrUixXQUFXLEVBQUU7a0JBQ2Q7Z0JBQ0QsQ0FBQztnQkFDRGhNLFVBQVUsRUFBRSxZQUFZO2tCQUFBO2tCQUN2QjtrQkFDQSx5QkFBQ1osT0FBTyxDQUFDaU8saUJBQWlCLENBQUMsVUFBVSxDQUFDLDBEQUF0QyxzQkFBaUVoRyxXQUFXLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDO2tCQUN6R2pJLE9BQU8sQ0FBQ2EsT0FBTyxFQUFFO2tCQUNqQjhKLHFCQUFxQixDQUFDOUosT0FBTyxFQUFFO2dCQUNoQztjQUNELENBQUMsQ0FBUTtjQUNUZ0wsYUFBYSxHQUFHL0csY0FBYyxhQUFkQSxjQUFjLHVCQUFkQSxjQUFjLENBQUVvSixjQUFjLENBQUMsTUFBTSxDQUFDLENBQUNBLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDQSxjQUFjLENBQUMsY0FBYyxDQUFDO2NBQ3pILElBQUl4RCxjQUFjLElBQUlBLGNBQWMsQ0FBQzVELFlBQVksRUFBRTtnQkFDbEQ7Z0JBQ0E0RCxjQUFjLENBQUM1RCxZQUFZLENBQUM5RyxPQUFPLENBQUM7Y0FDckM7Y0FDQStKLGFBQWEsR0FBRy9KLE9BQU8sQ0FBQ21PLGNBQWMsRUFBRTtjQUN4Q25PLE9BQU8sQ0FBQzhOLGlCQUFpQixDQUFDL0MsaUJBQWlCLENBQUM7Y0FBQywwQkFDekM7Z0JBQUEsdUJBQ0cvUSxXQUFXLENBQUNvVSxlQUFlLENBQ2hDaGEsYUFBYSxFQUNiNlcsZ0JBQWdCLEVBQ2hCRixpQkFBaUIsRUFDakIsS0FBSyxFQUNML1csV0FBVyxDQUFDcWEsWUFBWSxFQUN4QnJhLFdBQVcsQ0FBQ2tDLElBQUksQ0FDaEI7a0JBQ0Q2ViwwQkFBMEIsRUFBRTtrQkFDNUI7a0JBQ0MvTCxPQUFPLENBQUNpTyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBMEJoRyxXQUFXLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDO2tCQUN2R2pJLE9BQU8sQ0FBQ2dCLElBQUksRUFBRTtnQkFBQztjQUNoQixDQUFDLFlBQVEzRixNQUFXLEVBQUU7Z0JBQUEsdUJBQ2YxRSxjQUFjLENBQUMrSyxZQUFZLEVBQUU7a0JBQ25DLE1BQU1yRyxNQUFNO2dCQUFDO2NBQ2QsQ0FBQztZQUFBO1VBQUE7UUFDRixDQUFDO1VBQUE7UUFBQTtNQUFBLEVBQUM7SUFDSCxDQUFDO0lBQUEsT0FDRFAsdUJBQXVCLEdBQXZCLGlDQUF3QmtKLFlBQWlCLEVBQUUzTCxtQkFBd0IsRUFBRXJFLFdBQWdCLEVBQUU7TUFBQTtNQUN0RixJQUFJc2EsU0FBbUI7TUFDdkIsSUFBTVgsUUFBUSxHQUFHLElBQUl0WCxPQUFPLENBQVUsVUFBQ0MsT0FBTyxFQUFLO1FBQ2xEZ1ksU0FBUyxHQUFHaFksT0FBTztNQUNwQixDQUFDLENBQUM7TUFFRixJQUFNaVksaUJBQWlCLEdBQUcsVUFBQ3pFLE1BQVcsRUFBSztRQUMxQyxJQUFNdFYsUUFBUSxHQUFHc1YsTUFBTSxDQUFDTSxZQUFZLENBQUMsU0FBUyxDQUFDO1VBQzlDb0UsUUFBUSxHQUFHMUUsTUFBTSxDQUFDTSxZQUFZLENBQUMsU0FBUyxDQUFDO1FBQzFDLElBQUk1VixRQUFRLEtBQUs2RCxtQkFBbUIsRUFBRTtVQUNyQzJMLFlBQVksQ0FBQ3lLLHFCQUFxQixDQUFDRixpQkFBaUIsRUFBRSxPQUFJLENBQUM7VUFDM0RELFNBQVMsQ0FBQ0UsUUFBUSxDQUFDO1FBQ3BCO01BQ0QsQ0FBQztNQUNELElBQU1FLG9CQUFvQixHQUFHLFlBQU07UUFDbENyVyxtQkFBbUIsQ0FDakJzVyxPQUFPLEVBQUUsQ0FDVHBiLElBQUksQ0FBQ3FFLFNBQVMsRUFBRSxZQUFZO1VBQzVCMEQsR0FBRyxDQUFDc1QsS0FBSyxDQUFDLG9DQUFvQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUNEcEUsS0FBSyxDQUFDLFVBQVVxRSxZQUFpQixFQUFFO1VBQ25DdlQsR0FBRyxDQUFDc1QsS0FBSyxDQUFDLDJDQUEyQyxFQUFFQyxZQUFZLENBQUM7UUFDckUsQ0FBQyxDQUFDO01BQ0osQ0FBQztNQUVEN0ssWUFBWSxDQUFDOEsscUJBQXFCLENBQUNQLGlCQUFpQixFQUFFLElBQUksQ0FBQztNQUUzRCxPQUFPWixRQUFRLENBQUNwYSxJQUFJLENBQUMsVUFBQ2liLFFBQWlCLEVBQUs7UUFDM0MsSUFBSSxDQUFDQSxRQUFRLEVBQUU7VUFDZCxJQUFJLENBQUN4YSxXQUFXLENBQUMrYSw0QkFBNEIsRUFBRTtZQUM5QztZQUNBTCxvQkFBb0IsRUFBRSxDQUFDLENBQUM7WUFDeEIxSyxZQUFZLENBQUM5QixZQUFZLEVBQUU7WUFDM0I4QixZQUFZLENBQUMvTyxRQUFRLEVBQUUsQ0FBQ2lOLFlBQVksQ0FBQzhCLFlBQVksQ0FBQ2dMLGdCQUFnQixFQUFFLENBQUM7WUFFckUsTUFBTXJiLFNBQVMsQ0FBQzZILFNBQVMsQ0FBQ3dTLGNBQWM7VUFDekM7VUFDQSxPQUFPO1lBQUVILGVBQWUsRUFBRTtVQUFLLENBQUM7UUFDakMsQ0FBQyxNQUFNO1VBQ04sT0FBT3hWLG1CQUFtQixDQUFDc1csT0FBTyxFQUFFO1FBQ3JDO01BQ0QsQ0FBQyxDQUFDO0lBQ0g7SUFDQTtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQWZDO0lBQUEsT0FnQkFoWCxhQUFhLEdBQWIsdUJBQWNILGtCQUF1QixFQUFFTixXQUFtQixFQUFFSixVQUEwQixFQUFFQyxTQUFpQixFQUFFO01BQzFHLElBQUlXLFVBQVU7TUFFZCxJQUFJRixrQkFBa0IsSUFBSUEsa0JBQWtCLENBQUN5WCxhQUFhLElBQUkvWCxXQUFXLENBQUNnWSxXQUFXLEVBQUUsQ0FBQ3JKLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1FBQzVILElBQU1zSixjQUFjLEdBQUczWCxrQkFBa0IsQ0FBQ3lYLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDMUR2WCxVQUFVLEdBQ1R5WCxjQUFjLENBQUNELFdBQVcsRUFBRSxDQUFDckosT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUNyRHNKLGNBQWMsQ0FBQ3ZKLE1BQU0sQ0FBQ3VKLGNBQWMsQ0FBQ3RaLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDMUQrQixTQUFTO01BQ2QsQ0FBQyxNQUFNLElBQ05KLGtCQUFrQixJQUNsQkEsa0JBQWtCLENBQUN5WCxhQUFhLElBQ2hDL1gsV0FBVyxDQUFDZ1ksV0FBVyxFQUFFLENBQUNySixPQUFPLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDaEU7UUFDRCxJQUFNc0osZUFBYyxHQUFHM1gsa0JBQWtCLENBQUN5WCxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQzFEdlgsVUFBVSxHQUNUeVgsZUFBYyxDQUFDRCxXQUFXLEVBQUUsQ0FBQ3JKLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUN6RHNKLGVBQWMsQ0FBQ3ZKLE1BQU0sQ0FBQ3VKLGVBQWMsQ0FBQ3RaLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDMUQrQixTQUFTO01BQ2QsQ0FBQyxNQUFNO1FBQ05GLFVBQVUsR0FDVFosVUFBVSxJQUFJQSxVQUFVLENBQUNrQixTQUFTLEtBQUtKLFNBQVMsR0FDN0NkLFVBQVUsQ0FBQ2tCLFNBQVMsV0FBSWpCLFNBQVMsdUVBQW9FLElBQ3JHRCxVQUFVLENBQUNrQixTQUFTLFdBQUlqQixTQUFTLHlEQUFzRCxHQUN2RmEsU0FBUztNQUNkO01BQ0EsT0FBT0YsVUFBVTtJQUNsQjtJQUNBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQXBCQztJQUFBLE9BcUJBNkIsbUNBQW1DLEdBQW5DLDZDQUNDekMsVUFBMEIsRUFDMUJDLFNBQWlCLEVBQ2pCVyxVQUFrQixFQUNsQmtCLG1CQUFtQyxFQUNsQztNQUNELElBQU13VyxnQ0FBZ0MsR0FBRyxZQUFZO1FBQ3BELElBQUl0WSxVQUFVLElBQUlBLFVBQVUsQ0FBQ2tCLFNBQVMsV0FBSWpCLFNBQVMsMkNBQXdDLEVBQUU7VUFDNUYsSUFBTXNZLGNBQWMsR0FBR3ZZLFVBQVUsQ0FDL0JrQixTQUFTLFdBQUlqQixTQUFTLDJDQUF3QyxDQUM5RHVZLFNBQVMsQ0FBQyxVQUFVQyxTQUFjLEVBQUU7WUFDcEMsSUFBTUMsZUFBZSxHQUFHRCxTQUFTLENBQUNFLE1BQU0sR0FBR0YsU0FBUyxDQUFDRSxNQUFNLENBQUNuTCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcxTSxTQUFTO1lBQ2xGLE9BQU80WCxlQUFlLEdBQUdBLGVBQWUsQ0FBQyxDQUFDLENBQUMsS0FBSzlYLFVBQVUsR0FBRyxLQUFLO1VBQ25FLENBQUMsQ0FBQztVQUNILE9BQU8yWCxjQUFjLEdBQUcsQ0FBQyxDQUFDLEdBQ3ZCdlksVUFBVSxDQUFDa0IsU0FBUyxXQUFJakIsU0FBUywyQ0FBd0MsQ0FBQ3NZLGNBQWMsQ0FBQyxDQUFDSyxLQUFLLEdBQy9GOVgsU0FBUztRQUNiLENBQUMsTUFBTTtVQUNOLE9BQU9BLFNBQVM7UUFDakI7TUFDRCxDQUFDO01BRUQsT0FDQ3dYLGdDQUFnQyxFQUFFLElBQ2pDdFksVUFBVSxJQUFJQSxVQUFVLENBQUNrQixTQUFTLFdBQUlqQixTQUFTLGNBQUlXLFVBQVUsMkNBQXlDLElBQ3RHa0IsbUJBQW1CLElBQUlBLG1CQUFtQixDQUFDa0csT0FBTyxDQUFDLDBDQUEwQyxDQUFFO0lBRWxHLENBQUM7SUFBQTtFQUFBO0VBQUEsT0FHYTNLLGlCQUFpQjtBQUFBIn0=
|