@sapui5/sap.fe.core 1.96.4 → 1.99.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +6 -5
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AnnotationHelper.js +377 -405
- package/src/sap/fe/core/AnnotationHelper.ts +385 -0
- package/src/sap/fe/core/AppComponent.js +5 -3
- package/src/sap/fe/core/AppStateHandler.js +229 -195
- package/src/sap/fe/core/AppStateHandler.ts +171 -0
- package/src/sap/fe/core/BaseController.js +3 -2
- package/src/sap/fe/core/BusyLocker.js +105 -121
- package/src/sap/fe/core/BusyLocker.ts +98 -0
- package/src/sap/fe/core/CommonUtils.js +2073 -2606
- package/src/sap/fe/core/CommonUtils.ts +2078 -0
- package/src/sap/fe/core/ExtensionAPI.js +16 -7
- package/src/sap/fe/core/PageController.js +84 -119
- package/src/sap/fe/core/PageController.ts +101 -0
- package/src/sap/fe/core/RouterProxy.js +986 -809
- package/src/sap/fe/core/RouterProxy.ts +838 -0
- package/src/sap/fe/core/Synchronization.js +51 -35
- package/src/sap/fe/core/Synchronization.ts +29 -0
- package/src/sap/fe/core/TemplateComponent.js +173 -155
- package/src/sap/fe/core/TemplateComponent.ts +166 -0
- package/src/sap/fe/core/TemplateModel.js +97 -54
- package/src/sap/fe/core/TemplateModel.ts +63 -0
- package/src/sap/fe/core/TransactionHelper.js +1576 -1627
- package/src/sap/fe/core/TransactionHelper.ts +1706 -0
- package/src/sap/fe/core/actions/draft.js +559 -581
- package/src/sap/fe/core/actions/draft.ts +593 -0
- package/src/sap/fe/core/actions/messageHandling.js +545 -435
- package/src/sap/fe/core/actions/messageHandling.ts +532 -0
- package/src/sap/fe/core/actions/nonDraft.js +17 -19
- package/src/sap/fe/core/actions/nonDraft.ts +12 -0
- package/src/sap/fe/core/actions/operations.js +1074 -1192
- package/src/sap/fe/core/actions/operations.ts +1162 -0
- package/src/sap/fe/core/actions/sticky.js +102 -105
- package/src/sap/fe/core/actions/sticky.ts +102 -0
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +3 -2
- package/src/sap/fe/core/controllerextensions/EditFlow.js +235 -264
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -2
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +288 -13
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +35 -25
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +79 -46
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +86 -10
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +109 -31
- package/src/sap/fe/core/controllerextensions/MassEdit.js +172 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +237 -104
- package/src/sap/fe/core/controllerextensions/PageReady.js +3 -3
- package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
- package/src/sap/fe/core/controllerextensions/Paginator.js +37 -9
- package/src/sap/fe/core/controllerextensions/Placeholder.js +8 -4
- package/src/sap/fe/core/controllerextensions/Routing.js +25 -5
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +3 -2
- package/src/sap/fe/core/controllerextensions/Share.js +3 -2
- package/src/sap/fe/core/controllerextensions/SideEffects.js +9 -9
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +22 -21
- package/src/sap/fe/core/controllerextensions/ViewState.js +36 -8
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -1
- package/src/sap/fe/core/controls/CommandExecution.js +3 -2
- package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -2
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +112 -113
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +9 -5
- package/src/sap/fe/core/controls/FieldWrapper.js +18 -23
- package/src/sap/fe/core/controls/FilterBar.js +3 -2
- package/src/sap/fe/core/controls/FormElementWrapper.js +3 -7
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -2
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -2
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +5 -4
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -2
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -2
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
- package/src/sap/fe/core/converters/ConverterContext.js +14 -2
- package/src/sap/fe/core/converters/ConverterContext.ts +14 -3
- package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +8 -1
- package/src/sap/fe/core/converters/ManifestWrapper.js +56 -32
- package/src/sap/fe/core/converters/ManifestWrapper.ts +24 -6
- package/src/sap/fe/core/converters/MetaModelConverter.js +76 -6
- package/src/sap/fe/core/converters/MetaModelConverter.ts +79 -15
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +2 -2
- package/src/sap/fe/core/converters/annotations/DataField.js +3 -3
- package/src/sap/fe/core/converters/annotations/DataField.ts +1 -1
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +85 -46
- package/src/sap/fe/core/converters/controls/Common/Action.js +16 -4
- package/src/sap/fe/core/converters/controls/Common/Action.ts +14 -5
- package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
- package/src/sap/fe/core/converters/controls/Common/Form.js +60 -19
- package/src/sap/fe/core/converters/controls/Common/Form.ts +66 -14
- package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +72 -0
- package/src/sap/fe/core/converters/controls/Common/Table.js +503 -399
- package/src/sap/fe/core/converters/controls/Common/Table.ts +615 -480
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +527 -0
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +655 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +489 -37
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +506 -58
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +6 -6
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +9 -15
- package/src/sap/fe/core/converters/helpers/Aggregation.js +18 -3
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
- package/src/sap/fe/core/converters/helpers/ID.js +9 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +4 -0
- package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +4 -4
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +3 -3
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +29 -11
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -20
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +13 -3
- package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
- package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
- package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
- package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
- package/src/sap/fe/core/formatters/TableFormatter.js +65 -31
- package/src/sap/fe/core/formatters/TableFormatter.ts +62 -30
- package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
- package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
- package/src/sap/fe/core/fpm/Component.js +3 -2
- package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +391 -0
- package/src/sap/fe/core/helpers/BindingExpression.js +479 -464
- package/src/sap/fe/core/helpers/BindingExpression.ts +477 -483
- package/src/sap/fe/core/helpers/ClassSupport.js +27 -15
- package/src/sap/fe/core/helpers/ClassSupport.ts +31 -20
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +63 -59
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +56 -0
- package/src/sap/fe/core/helpers/EditState.js +81 -84
- package/src/sap/fe/core/helpers/EditState.ts +81 -0
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
- package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
- package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
- package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +210 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +202 -0
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +32 -0
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.ts +36 -0
- package/src/sap/fe/core/helpers/MassEditHelper.js +687 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +229 -174
- package/src/sap/fe/core/helpers/ModelHelper.ts +227 -0
- package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
- package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +332 -313
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +330 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
- package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
- package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
- package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
- package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
- package/src/sap/fe/core/library.js +30 -3
- package/src/sap/fe/core/library.support.js +12 -5
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
- package/src/sap/fe/core/messagebundle.properties +72 -10
- package/src/sap/fe/core/messagebundle_ar.properties +41 -0
- package/src/sap/fe/core/messagebundle_bg.properties +41 -0
- package/src/sap/fe/core/messagebundle_ca.properties +41 -0
- package/src/sap/fe/core/messagebundle_cs.properties +42 -1
- package/src/sap/fe/core/messagebundle_cy.properties +41 -0
- package/src/sap/fe/core/messagebundle_da.properties +41 -0
- package/src/sap/fe/core/messagebundle_de.properties +41 -0
- package/src/sap/fe/core/messagebundle_el.properties +41 -0
- package/src/sap/fe/core/messagebundle_en.properties +41 -0
- package/src/sap/fe/core/messagebundle_en_GB.properties +41 -0
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +41 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +35 -0
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +41 -0
- package/src/sap/fe/core/messagebundle_es.properties +41 -0
- package/src/sap/fe/core/messagebundle_es_MX.properties +41 -0
- package/src/sap/fe/core/messagebundle_et.properties +41 -0
- package/src/sap/fe/core/messagebundle_fi.properties +41 -0
- package/src/sap/fe/core/messagebundle_fr.properties +46 -5
- package/src/sap/fe/core/messagebundle_fr_CA.properties +41 -0
- package/src/sap/fe/core/messagebundle_hi.properties +41 -0
- package/src/sap/fe/core/messagebundle_hr.properties +41 -0
- package/src/sap/fe/core/messagebundle_hu.properties +42 -1
- package/src/sap/fe/core/messagebundle_id.properties +45 -4
- package/src/sap/fe/core/messagebundle_it.properties +41 -0
- package/src/sap/fe/core/messagebundle_iw.properties +41 -0
- package/src/sap/fe/core/messagebundle_ja.properties +50 -9
- package/src/sap/fe/core/messagebundle_kk.properties +41 -0
- package/src/sap/fe/core/messagebundle_ko.properties +41 -0
- package/src/sap/fe/core/messagebundle_lt.properties +41 -0
- package/src/sap/fe/core/messagebundle_lv.properties +41 -0
- package/src/sap/fe/core/messagebundle_ms.properties +41 -0
- package/src/sap/fe/core/messagebundle_nl.properties +41 -0
- package/src/sap/fe/core/messagebundle_no.properties +41 -0
- package/src/sap/fe/core/messagebundle_pl.properties +41 -0
- package/src/sap/fe/core/messagebundle_pt.properties +43 -2
- package/src/sap/fe/core/messagebundle_pt_PT.properties +41 -0
- package/src/sap/fe/core/messagebundle_ro.properties +41 -0
- package/src/sap/fe/core/messagebundle_ru.properties +41 -0
- package/src/sap/fe/core/messagebundle_sh.properties +41 -0
- package/src/sap/fe/core/messagebundle_sk.properties +41 -0
- package/src/sap/fe/core/messagebundle_sl.properties +41 -0
- package/src/sap/fe/core/messagebundle_sv.properties +42 -1
- package/src/sap/fe/core/messagebundle_th.properties +41 -0
- package/src/sap/fe/core/messagebundle_tr.properties +41 -0
- package/src/sap/fe/core/messagebundle_uk.properties +41 -0
- package/src/sap/fe/core/messagebundle_vi.properties +41 -0
- package/src/sap/fe/core/messagebundle_zh_CN.properties +41 -0
- package/src/sap/fe/core/messagebundle_zh_TW.properties +41 -0
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +269 -202
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +9 -5
- package/src/sap/fe/core/services/NavigationServiceFactory.js +406 -300
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +316 -0
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +149 -81
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +80 -0
- package/src/sap/fe/core/services/RoutingServiceFactory.js +987 -1166
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
- package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
- package/src/sap/fe/core/services/ShellServicesFactory.ts +45 -11
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +41 -84
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +56 -99
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +461 -478
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +453 -0
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
- package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
- package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
- package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
- package/src/sap/fe/core/templating/DataModelPathHelper.js +6 -24
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +10 -23
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
- package/src/sap/fe/core/templating/EntitySetHelper.js +80 -7
- package/src/sap/fe/core/templating/EntitySetHelper.ts +42 -2
- package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
- package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
- package/src/sap/fe/core/templating/FilterHelper.js +139 -70
- package/src/sap/fe/core/templating/FilterHelper.ts +140 -70
- package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
- package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
- package/src/sap/fe/core/templating/UIFormatters.js +45 -113
- package/src/sap/fe/core/templating/UIFormatters.ts +39 -76
- package/src/sap/fe/core/type/Email.js +1 -1
- package/src/sap/fe/core/type/Email.ts +4 -6
- package/ui5.yaml +0 -3
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define(["sap/fe/core/helpers/BindingExpression", "../../../ManifestSettings", "../../../helpers/BindingHelper", "sap/fe/core/templating/DataModelPathHelper"], function (BindingExpression, ManifestSettings, BindingHelper, DataModelPathHelper) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var _exports = {};
|
|
9
|
+
var isPathUpdatable = DataModelPathHelper.isPathUpdatable;
|
|
10
|
+
var isPathInsertable = DataModelPathHelper.isPathInsertable;
|
|
11
|
+
var isPathDeletable = DataModelPathHelper.isPathDeletable;
|
|
12
|
+
var getTargetObjectPath = DataModelPathHelper.getTargetObjectPath;
|
|
13
|
+
var UI = BindingHelper.UI;
|
|
14
|
+
var singletonPathVisitor = BindingHelper.singletonPathVisitor;
|
|
15
|
+
var TemplateType = ManifestSettings.TemplateType;
|
|
16
|
+
var CreationMode = ManifestSettings.CreationMode;
|
|
17
|
+
var greaterThan = BindingExpression.greaterThan;
|
|
18
|
+
var or = BindingExpression.or;
|
|
19
|
+
var notEqual = BindingExpression.notEqual;
|
|
20
|
+
var not = BindingExpression.not;
|
|
21
|
+
var isConstant = BindingExpression.isConstant;
|
|
22
|
+
var isBinding = BindingExpression.isBinding;
|
|
23
|
+
var ifElse = BindingExpression.ifElse;
|
|
24
|
+
var greaterOrEqual = BindingExpression.greaterOrEqual;
|
|
25
|
+
var length = BindingExpression.length;
|
|
26
|
+
var equal = BindingExpression.equal;
|
|
27
|
+
var constant = BindingExpression.constant;
|
|
28
|
+
var compileBinding = BindingExpression.compileBinding;
|
|
29
|
+
var bindingExpression = BindingExpression.bindingExpression;
|
|
30
|
+
var annotationExpression = BindingExpression.annotationExpression;
|
|
31
|
+
var and = BindingExpression.and;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Generates the context for the standard actions.
|
|
35
|
+
*
|
|
36
|
+
* @param {ConverterContext} converterContext
|
|
37
|
+
* @param {NavigationSettingsConfiguration} navigationSettings
|
|
38
|
+
* @param {TableControlConfiguration} tableManifestConfiguration
|
|
39
|
+
* @param {ViewPathConfiguration} viewConfiguration
|
|
40
|
+
* @returns The context for table actions
|
|
41
|
+
*/
|
|
42
|
+
function generateStandardActionsContext(converterContext, navigationSettings, tableManifestConfiguration, viewConfiguration) {
|
|
43
|
+
return {
|
|
44
|
+
collectionPath: getTargetObjectPath(converterContext.getDataModelObjectPath()),
|
|
45
|
+
hiddenAnnotation: {
|
|
46
|
+
create: isActionAnnotatedHidden(converterContext, "CreateHidden"),
|
|
47
|
+
"delete": isActionAnnotatedHidden(converterContext, "DeleteHidden"),
|
|
48
|
+
update: isActionAnnotatedHidden(converterContext, "UpdateHidden")
|
|
49
|
+
},
|
|
50
|
+
isExternalCreateConfigured: isExternalCreateConfigured(navigationSettings),
|
|
51
|
+
isDraftOrStickySupported: isDraftOrStickySupported(converterContext),
|
|
52
|
+
isViewWithMultipleVisualizations: viewConfiguration ? converterContext.getManifestWrapper().hasMultipleVisualizations(viewConfiguration) : false,
|
|
53
|
+
newAction: getNewAction(converterContext),
|
|
54
|
+
tableManifestConfiguration: tableManifestConfiguration,
|
|
55
|
+
restrictions: getRestrictions(converterContext)
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Checks if an external created is configured for the navigation.
|
|
60
|
+
*
|
|
61
|
+
* @param {NavigationSettingsConfiguration} navigationSettings
|
|
62
|
+
* @returns {boolean}
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
_exports.generateStandardActionsContext = generateStandardActionsContext;
|
|
67
|
+
|
|
68
|
+
function isExternalCreateConfigured(navigationSettings) {
|
|
69
|
+
var navigation = navigationSettings === null || navigationSettings === void 0 ? void 0 : navigationSettings.create;
|
|
70
|
+
return (navigation && navigation.outbound && navigation.outboundDetail) !== undefined;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Checks if draft is supported.
|
|
74
|
+
*
|
|
75
|
+
* @param {ConverterContext} converterContext
|
|
76
|
+
* @returns {boolean}
|
|
77
|
+
*/
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
_exports.isExternalCreateConfigured = isExternalCreateConfigured;
|
|
81
|
+
|
|
82
|
+
function isDraftSupported(converterContext) {
|
|
83
|
+
var _currentEntitySet$ann, _currentEntitySet$ann2, _currentEntitySet$ann3, _currentEntitySet$ann4, _converterContext$get, _converterContext$get2, _converterContext$get3, _converterContext$get4, _converterContext$get5, _converterContext$get6, _converterContext$get7;
|
|
84
|
+
|
|
85
|
+
var currentEntitySet = converterContext.getEntitySet();
|
|
86
|
+
var bIsDraftRoot = currentEntitySet && (_currentEntitySet$ann = currentEntitySet.annotations) !== null && _currentEntitySet$ann !== void 0 && (_currentEntitySet$ann2 = _currentEntitySet$ann.Common) !== null && _currentEntitySet$ann2 !== void 0 && _currentEntitySet$ann2.DraftRoot ? true : false;
|
|
87
|
+
var bIsDraftNode = currentEntitySet && (_currentEntitySet$ann3 = currentEntitySet.annotations) !== null && _currentEntitySet$ann3 !== void 0 && (_currentEntitySet$ann4 = _currentEntitySet$ann3.Common) !== null && _currentEntitySet$ann4 !== void 0 && _currentEntitySet$ann4.DraftNode ? true : false;
|
|
88
|
+
var bIsDraftParentEntityForContainment = (_converterContext$get = converterContext.getDataModelObjectPath().targetObject) !== null && _converterContext$get !== void 0 && _converterContext$get.containsTarget && ((_converterContext$get2 = converterContext.getDataModelObjectPath().startingEntitySet) !== null && _converterContext$get2 !== void 0 && (_converterContext$get3 = _converterContext$get2.annotations) !== null && _converterContext$get3 !== void 0 && (_converterContext$get4 = _converterContext$get3.Common) !== null && _converterContext$get4 !== void 0 && _converterContext$get4.DraftRoot || (_converterContext$get5 = converterContext.getDataModelObjectPath().startingEntitySet) !== null && _converterContext$get5 !== void 0 && (_converterContext$get6 = _converterContext$get5.annotations) !== null && _converterContext$get6 !== void 0 && (_converterContext$get7 = _converterContext$get6.Common) !== null && _converterContext$get7 !== void 0 && _converterContext$get7.DraftNode) ? true : false;
|
|
89
|
+
return bIsDraftRoot || bIsDraftNode || !converterContext.getEntitySet() && bIsDraftParentEntityForContainment;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Checks if sticky or draft is supported.
|
|
93
|
+
*
|
|
94
|
+
* @param {ConverterContext} converterContext
|
|
95
|
+
* @returns {boolean}
|
|
96
|
+
*/
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
_exports.isDraftSupported = isDraftSupported;
|
|
100
|
+
|
|
101
|
+
function isDraftOrStickySupported(converterContext) {
|
|
102
|
+
var _converterContext$get8, _converterContext$get9, _converterContext$get10;
|
|
103
|
+
|
|
104
|
+
var bIsDraftSupported = isDraftSupported(converterContext);
|
|
105
|
+
var bIsStickySessionSupported = (_converterContext$get8 = converterContext.getDataModelObjectPath().startingEntitySet) !== null && _converterContext$get8 !== void 0 && (_converterContext$get9 = _converterContext$get8.annotations) !== null && _converterContext$get9 !== void 0 && (_converterContext$get10 = _converterContext$get9.Session) !== null && _converterContext$get10 !== void 0 && _converterContext$get10.StickySessionSupported ? true : false;
|
|
106
|
+
return bIsDraftSupported || bIsStickySessionSupported;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Gets the configured newAction into annotation.
|
|
110
|
+
*
|
|
111
|
+
* @param {ConverterContext} converterContext
|
|
112
|
+
* @returns {any}
|
|
113
|
+
*/
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
_exports.isDraftOrStickySupported = isDraftOrStickySupported;
|
|
117
|
+
|
|
118
|
+
function getNewAction(converterContext) {
|
|
119
|
+
var _ref, _currentEntitySet$ann5, _currentEntitySet$ann6, _currentEntitySet$ann7, _currentEntitySet$ann8, _currentEntitySet$ann9, _currentEntitySet$ann10;
|
|
120
|
+
|
|
121
|
+
var currentEntitySet = converterContext.getEntitySet();
|
|
122
|
+
var newActionName = (_ref = (currentEntitySet === null || currentEntitySet === void 0 ? void 0 : (_currentEntitySet$ann5 = currentEntitySet.annotations) === null || _currentEntitySet$ann5 === void 0 ? void 0 : (_currentEntitySet$ann6 = _currentEntitySet$ann5.Common) === null || _currentEntitySet$ann6 === void 0 ? void 0 : (_currentEntitySet$ann7 = _currentEntitySet$ann6.DraftRoot) === null || _currentEntitySet$ann7 === void 0 ? void 0 : _currentEntitySet$ann7.NewAction) || (currentEntitySet === null || currentEntitySet === void 0 ? void 0 : (_currentEntitySet$ann8 = currentEntitySet.annotations) === null || _currentEntitySet$ann8 === void 0 ? void 0 : (_currentEntitySet$ann9 = _currentEntitySet$ann8.Session) === null || _currentEntitySet$ann9 === void 0 ? void 0 : (_currentEntitySet$ann10 = _currentEntitySet$ann9.StickySessionSupported) === null || _currentEntitySet$ann10 === void 0 ? void 0 : _currentEntitySet$ann10.NewAction)) === null || _ref === void 0 ? void 0 : _ref.toString();
|
|
123
|
+
|
|
124
|
+
if (newActionName) {
|
|
125
|
+
var _converterContext$get11, _converterContext$get12, _converterContext$get13;
|
|
126
|
+
|
|
127
|
+
var availableProperty = converterContext === null || converterContext === void 0 ? void 0 : (_converterContext$get11 = converterContext.getEntityType().actions[newActionName]) === null || _converterContext$get11 === void 0 ? void 0 : (_converterContext$get12 = _converterContext$get11.annotations) === null || _converterContext$get12 === void 0 ? void 0 : (_converterContext$get13 = _converterContext$get12.Core) === null || _converterContext$get13 === void 0 ? void 0 : _converterContext$get13.OperationAvailable;
|
|
128
|
+
availableProperty = availableProperty !== undefined ? availableProperty : true;
|
|
129
|
+
return {
|
|
130
|
+
name: newActionName,
|
|
131
|
+
available: annotationExpression(availableProperty)
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Gets the binding expression for the action visibility configured into annotation.
|
|
139
|
+
*
|
|
140
|
+
* @param {ConverterContext} converterContext
|
|
141
|
+
* @param {string} sAnnotationTerm
|
|
142
|
+
* @returns {Expression<boolean>}
|
|
143
|
+
*/
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
_exports.getNewAction = getNewAction;
|
|
147
|
+
|
|
148
|
+
function isActionAnnotatedHidden(converterContext, sAnnotationTerm) {
|
|
149
|
+
var _currentEntitySet$ann11;
|
|
150
|
+
|
|
151
|
+
var currentEntitySet = converterContext.getEntitySet();
|
|
152
|
+
var dataModelObjectPath = converterContext.getDataModelObjectPath(); // Consider only the last level of navigation. The others are already considered in the element binding of the page.
|
|
153
|
+
|
|
154
|
+
var visitedNavigationPaths = dataModelObjectPath.navigationProperties.length > 0 ? [dataModelObjectPath.navigationProperties[dataModelObjectPath.navigationProperties.length - 1].name] : [];
|
|
155
|
+
return currentEntitySet ? annotationExpression((currentEntitySet === null || currentEntitySet === void 0 ? void 0 : (_currentEntitySet$ann11 = currentEntitySet.annotations.UI) === null || _currentEntitySet$ann11 === void 0 ? void 0 : _currentEntitySet$ann11[sAnnotationTerm]) || false, visitedNavigationPaths, undefined, function (path) {
|
|
156
|
+
return singletonPathVisitor(path, converterContext, visitedNavigationPaths);
|
|
157
|
+
}) : constant(false);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Gets the annotated restrictions for the actions.
|
|
161
|
+
*
|
|
162
|
+
* @param {ConverterContext} converterContext
|
|
163
|
+
* @returns {StandardActionsRestrictionsType}
|
|
164
|
+
*/
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
_exports.isActionAnnotatedHidden = isActionAnnotatedHidden;
|
|
168
|
+
|
|
169
|
+
function getRestrictions(converterContext) {
|
|
170
|
+
var dataModelObjectPath = converterContext.getDataModelObjectPath();
|
|
171
|
+
var restrictionsDef = [{
|
|
172
|
+
key: "isInsertable",
|
|
173
|
+
"function": isPathInsertable
|
|
174
|
+
}, {
|
|
175
|
+
key: "isUpdatable",
|
|
176
|
+
"function": isPathUpdatable
|
|
177
|
+
}, {
|
|
178
|
+
key: "isDeletable",
|
|
179
|
+
"function": isPathDeletable
|
|
180
|
+
}];
|
|
181
|
+
var result = {};
|
|
182
|
+
restrictionsDef.forEach(function (def) {
|
|
183
|
+
var _defFunction$apply;
|
|
184
|
+
|
|
185
|
+
var defFunction = def["function"];
|
|
186
|
+
result[def.key] = {
|
|
187
|
+
expression: defFunction.apply(null, [dataModelObjectPath]),
|
|
188
|
+
isOnlyCurrentEntityExpression: !!((_defFunction$apply = defFunction.apply(null, [dataModelObjectPath, undefined, true])) !== null && _defFunction$apply !== void 0 && _defFunction$apply.currentEntityRestriction)
|
|
189
|
+
};
|
|
190
|
+
});
|
|
191
|
+
return result;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Checks if templating for insert/update actions is mandatory.
|
|
195
|
+
*
|
|
196
|
+
* @param {StandardActionsContext} standardActionsContext
|
|
197
|
+
* @param {boolean} isDraftOrSticky
|
|
198
|
+
* @param {boolean} isCreateAlwaysHidden
|
|
199
|
+
* @returns {boolean}
|
|
200
|
+
*/
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
_exports.getRestrictions = getRestrictions;
|
|
204
|
+
|
|
205
|
+
function getInsertUpdateActionsTemplating(standardActionsContext, isDraftOrSticky, isCreateAlwaysHidden) {
|
|
206
|
+
return (isDraftOrSticky || standardActionsContext.isExternalCreateConfigured) && !isCreateAlwaysHidden;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Gets the binding expressions for the properties of the action Create.
|
|
210
|
+
*
|
|
211
|
+
* @param {ConverterContext} converterContext
|
|
212
|
+
* @param {StandardActionsContext} standardActionsContext
|
|
213
|
+
* @returns {StandardActionConfigType}
|
|
214
|
+
*/
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
_exports.getInsertUpdateActionsTemplating = getInsertUpdateActionsTemplating;
|
|
218
|
+
|
|
219
|
+
function getStandardActionCreate(converterContext, standardActionsContext) {
|
|
220
|
+
var createVisibility = getCreateVisibility(converterContext, standardActionsContext);
|
|
221
|
+
return {
|
|
222
|
+
isTemplated: compileBinding(getCreateTemplating(standardActionsContext, createVisibility)),
|
|
223
|
+
visible: compileBinding(createVisibility),
|
|
224
|
+
enabled: compileBinding(getCreateEnablement(converterContext, standardActionsContext, createVisibility))
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Gets the binding expressions for the properties of the action Delete.
|
|
229
|
+
*
|
|
230
|
+
* @param {ConverterContext} converterContext
|
|
231
|
+
* @param {StandardActionsContext} standardActionsContext
|
|
232
|
+
* @returns {StandardActionConfigType}
|
|
233
|
+
*/
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
_exports.getStandardActionCreate = getStandardActionCreate;
|
|
237
|
+
|
|
238
|
+
function getStandardActionDelete(converterContext, standardActionsContext) {
|
|
239
|
+
var deleteVisibility = getDeleteVisibility(converterContext, standardActionsContext);
|
|
240
|
+
return {
|
|
241
|
+
isTemplated: compileBinding(getDefaultTemplating(deleteVisibility)),
|
|
242
|
+
visible: compileBinding(deleteVisibility),
|
|
243
|
+
enabled: compileBinding(getDeleteEnablement(converterContext, standardActionsContext, deleteVisibility))
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Gets the binding expressions for the properties of the action Paste.
|
|
248
|
+
*
|
|
249
|
+
* @param {ConverterContext} converterContext
|
|
250
|
+
* @param {StandardActionsContext} standardActionsContext
|
|
251
|
+
* @param {boolean} isInsertUpdateActionsTemplated
|
|
252
|
+
* @returns {StandardActionConfigType}
|
|
253
|
+
*/
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
_exports.getStandardActionDelete = getStandardActionDelete;
|
|
257
|
+
|
|
258
|
+
function getStandardActionPaste(converterContext, standardActionsContext, isInsertUpdateActionsTemplated) {
|
|
259
|
+
var createVisibility = getCreateVisibility(converterContext, standardActionsContext);
|
|
260
|
+
var createEnablement = getCreateEnablement(converterContext, standardActionsContext, createVisibility);
|
|
261
|
+
var pasteVisibility = getPasteVisibility(converterContext, standardActionsContext, createVisibility, isInsertUpdateActionsTemplated);
|
|
262
|
+
return {
|
|
263
|
+
visible: compileBinding(pasteVisibility),
|
|
264
|
+
enabled: compileBinding(getPasteEnablement(pasteVisibility, createEnablement))
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Gets the binding expressions for the properties of the action MassEdit.
|
|
269
|
+
*
|
|
270
|
+
* @param {ConverterContext} converterContext
|
|
271
|
+
* @param {StandardActionsContext} standardActionsContext
|
|
272
|
+
* @returns {StandardActionConfigType}
|
|
273
|
+
*/
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
_exports.getStandardActionPaste = getStandardActionPaste;
|
|
277
|
+
|
|
278
|
+
function getStandardActionMassEdit(converterContext, standardActionsContext) {
|
|
279
|
+
var massEditVisibility = getMassEditVisibility(converterContext, standardActionsContext);
|
|
280
|
+
return {
|
|
281
|
+
isTemplated: compileBinding(getDefaultTemplating(massEditVisibility)),
|
|
282
|
+
visible: compileBinding(massEditVisibility),
|
|
283
|
+
enabled: compileBinding(getMassEditEnablement(converterContext, standardActionsContext, massEditVisibility))
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Gets the binding expression for the templating of the action Create.
|
|
288
|
+
*
|
|
289
|
+
* @param {StandardActionsContext} standardActionsContext
|
|
290
|
+
* @param {Expression<boolean>} createVisibility
|
|
291
|
+
* @returns {Expression<boolean> }
|
|
292
|
+
*/
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
_exports.getStandardActionMassEdit = getStandardActionMassEdit;
|
|
296
|
+
|
|
297
|
+
function getCreateTemplating(standardActionsContext, createVisibility) {
|
|
298
|
+
var isCreationRow = standardActionsContext.tableManifestConfiguration.creationMode === CreationMode.CreationRow;
|
|
299
|
+
var newAction = standardActionsContext.newAction;
|
|
300
|
+
var isInsertable = standardActionsContext.restrictions.isInsertable.expression; //Templating of Create Button is not done:
|
|
301
|
+
// - If Button is never visible or CreationMode is on CreationRow
|
|
302
|
+
// - Otherwise If new action is configured and never available
|
|
303
|
+
// - Otherwise If delete restrictions coming from NavigationRestrictions are constantly false
|
|
304
|
+
// - Otherwise If there is no external create action
|
|
305
|
+
// - Otherwise if there is delete restrictions on the current entitySet set to false
|
|
306
|
+
|
|
307
|
+
return ifElse(or(and(isConstant(createVisibility), equal(createVisibility, false)), isCreationRow), false, ifElse(and(isConstant(newAction === null || newAction === void 0 ? void 0 : newAction.available), equal(newAction === null || newAction === void 0 ? void 0 : newAction.available, false)), false, ifElse(and(not(standardActionsContext.restrictions.isInsertable.isOnlyCurrentEntityExpression), isConstant(isInsertable)), isInsertable, ifElse(standardActionsContext.isExternalCreateConfigured, true, not(and(isConstant(isInsertable), equal(isInsertable, constant(false))))))));
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Gets the binding expression for the templating of the non-Create actions.
|
|
311
|
+
*
|
|
312
|
+
* @param {Expression<boolean>} actionVisibility
|
|
313
|
+
* @returns {Expression<boolean> }
|
|
314
|
+
*/
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
_exports.getCreateTemplating = getCreateTemplating;
|
|
318
|
+
|
|
319
|
+
function getDefaultTemplating(actionVisibility) {
|
|
320
|
+
return not(and(isConstant(actionVisibility), equal(actionVisibility, false)));
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Gets the binding expression for the property visible of the action Create.
|
|
324
|
+
*
|
|
325
|
+
* @param {ConverterContext} converterContext
|
|
326
|
+
* @param {StandardActionsContext} standardActionsContext
|
|
327
|
+
* @returns {Expression<boolean> }
|
|
328
|
+
*/
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
_exports.getDefaultTemplating = getDefaultTemplating;
|
|
332
|
+
|
|
333
|
+
function getCreateVisibility(converterContext, standardActionsContext) {
|
|
334
|
+
var isInsertable = standardActionsContext.restrictions.isInsertable.expression;
|
|
335
|
+
var isCreateHidden = standardActionsContext.hiddenAnnotation.create;
|
|
336
|
+
var newAction = standardActionsContext.newAction; //Create Button is visible:
|
|
337
|
+
// - If the creation mode is external
|
|
338
|
+
// - If we're on the list report and create is not hidden
|
|
339
|
+
// - Otherwise this depends on the value of the the UI.IsEditable
|
|
340
|
+
// - Otherwise
|
|
341
|
+
// - If we're on the list report ->
|
|
342
|
+
// - If UI.CreateHidden points to a property path -> provide a negated binding to this path
|
|
343
|
+
// - Otherwise, create is visible
|
|
344
|
+
// - Otherwise
|
|
345
|
+
// - This depends on the value of the the UI.IsEditable
|
|
346
|
+
|
|
347
|
+
return ifElse(standardActionsContext.isExternalCreateConfigured, ifElse(converterContext.getTemplateType() === TemplateType.ListReport, not(isCreateHidden), and(not(isCreateHidden), UI.IsEditable)), ifElse(or(and(isConstant(newAction === null || newAction === void 0 ? void 0 : newAction.available), equal(newAction === null || newAction === void 0 ? void 0 : newAction.available, false)), and(isConstant(isInsertable), equal(isInsertable, false), !newAction), and(isConstant(isCreateHidden), equal(isCreateHidden, true)), standardActionsContext.isViewWithMultipleVisualizations, converterContext.getTemplateType() === TemplateType.AnalyticalListPage), false, ifElse(converterContext.getTemplateType() === TemplateType.ListReport, ifElse(isBinding(isCreateHidden), not(isCreateHidden), true), and(not(isCreateHidden), UI.IsEditable))));
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Gets the binding expression for the property visible of the action Delete.
|
|
351
|
+
*
|
|
352
|
+
* @param {ConverterContext} converterContext
|
|
353
|
+
* @param {StandardActionsContext} standardActionsContext
|
|
354
|
+
* @returns {Expression<boolean> }
|
|
355
|
+
*/
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
_exports.getCreateVisibility = getCreateVisibility;
|
|
359
|
+
|
|
360
|
+
function getDeleteVisibility(converterContext, standardActionsContext) {
|
|
361
|
+
var isDeleteHidden = standardActionsContext.hiddenAnnotation.delete;
|
|
362
|
+
var pathDeletableExpression = standardActionsContext.restrictions.isDeletable.expression; //Delete Button is visible:
|
|
363
|
+
// Prerequisites:
|
|
364
|
+
// - If we're not on multiple visualizations configuration or ALP
|
|
365
|
+
//
|
|
366
|
+
// - If restrictions on deletable set to false -> not visible
|
|
367
|
+
// - Otherwise
|
|
368
|
+
// - If UI.DeleteHidden is true -> not visible
|
|
369
|
+
// - Otherwise
|
|
370
|
+
// - If we're on OP -> depending of the editMode and restrictions on deletable
|
|
371
|
+
// - Otherwise
|
|
372
|
+
// - If UI.DeleteHidden points to a property path -> provide a negated binding to this path
|
|
373
|
+
// - Otherwise, delete is visible
|
|
374
|
+
|
|
375
|
+
return ifElse(or(standardActionsContext.isViewWithMultipleVisualizations, converterContext.getTemplateType() === TemplateType.AnalyticalListPage), false, ifElse(and(isConstant(pathDeletableExpression), equal(pathDeletableExpression, false)), false, ifElse(and(isConstant(isDeleteHidden), equal(isDeleteHidden, constant(true))), false, ifElse(converterContext.getTemplateType() !== TemplateType.ListReport, and(not(isDeleteHidden), equal(bindingExpression("/editMode", "ui"), "Editable")), ifElse(isBinding(isDeleteHidden), not(isDeleteHidden), true)))));
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Gets the binding expression for the property visible of the action Paste.
|
|
379
|
+
*
|
|
380
|
+
* @param {ConverterContext} converterContext
|
|
381
|
+
* @param {StandardActionsContext} standardActionsContext
|
|
382
|
+
* @param {Expression<boolean>} createVisibility
|
|
383
|
+
* @param {boolean} isInsertUpdateActionsTemplated
|
|
384
|
+
* @returns {Expression<boolean> }
|
|
385
|
+
*/
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
_exports.getDeleteVisibility = getDeleteVisibility;
|
|
389
|
+
|
|
390
|
+
function getPasteVisibility(converterContext, standardActionsContext, createVisibility, isInsertUpdateActionsTemplated) {
|
|
391
|
+
// If Create is visible, enablePaste is not disabled into manifest and we are on OP/blocks outside Fiori elements templates
|
|
392
|
+
// Then button will be visible according to insertable restrictions and create visibility
|
|
393
|
+
// Otherwise it's not visible
|
|
394
|
+
return ifElse(and(notEqual(standardActionsContext.tableManifestConfiguration.enablePaste, false), createVisibility, isInsertUpdateActionsTemplated), [TemplateType.ListReport, TemplateType.AnalyticalListPage].indexOf(converterContext.getTemplateType()) === -1 && standardActionsContext.restrictions.isInsertable.expression, false);
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Gets the binding expression for the property visible of the action MassEdit.
|
|
398
|
+
*
|
|
399
|
+
* @param {ConverterContext} converterContext
|
|
400
|
+
* @param {StandardActionsContext} standardActionsContext
|
|
401
|
+
* @returns {Expression<boolean> }
|
|
402
|
+
*/
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
_exports.getPasteVisibility = getPasteVisibility;
|
|
406
|
+
|
|
407
|
+
function getMassEditVisibility(converterContext, standardActionsContext) {
|
|
408
|
+
var _standardActionsConte;
|
|
409
|
+
|
|
410
|
+
var isUpdateHidden = standardActionsContext.hiddenAnnotation.update,
|
|
411
|
+
pathUpdatableExpression = standardActionsContext.restrictions.isUpdatable.expression,
|
|
412
|
+
bMassEditEnabledInManifest = ((_standardActionsConte = standardActionsContext.tableManifestConfiguration) === null || _standardActionsConte === void 0 ? void 0 : _standardActionsConte.enableMassEdit) || false;
|
|
413
|
+
var templateBindingExpression = converterContext.getTemplateType() === TemplateType.ObjectPage ? equal(UI.IsEditable, true) : converterContext.getTemplateType() === TemplateType.ListReport; //MassEdit is visible
|
|
414
|
+
// If
|
|
415
|
+
// - there is no static restrictions set to false
|
|
416
|
+
// - and enableMassEdit is not set to false into the manifest
|
|
417
|
+
// - and the selectionMode is relevant
|
|
418
|
+
// Then MassEdit is always visible in LR or dynamically visible in OP according to ui>Editable and hiddenAnnotation
|
|
419
|
+
// Button is hidden for all other cases
|
|
420
|
+
|
|
421
|
+
return ifElse(and(not(and(isConstant(pathUpdatableExpression), equal(pathUpdatableExpression, false))), bMassEditEnabledInManifest), and(templateBindingExpression, not(isUpdateHidden)), false);
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Gets the binding expression for the property enabled of the action Create.
|
|
425
|
+
*
|
|
426
|
+
* @param {ConverterContext} converterContext
|
|
427
|
+
* @param {StandardActionsContext} standardActionsContext
|
|
428
|
+
* @param {Expression<boolean>} createVisibility
|
|
429
|
+
* @returns {Expression<boolean> }
|
|
430
|
+
*/
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
_exports.getMassEditVisibility = getMassEditVisibility;
|
|
434
|
+
|
|
435
|
+
function getCreateEnablement(converterContext, standardActionsContext, createVisibility) {
|
|
436
|
+
var _converterContext$res;
|
|
437
|
+
|
|
438
|
+
var isInsertable = standardActionsContext.restrictions.isInsertable.expression;
|
|
439
|
+
var CollectionType = (_converterContext$res = converterContext.resolveAbsolutePath(standardActionsContext.collectionPath).target) === null || _converterContext$res === void 0 ? void 0 : _converterContext$res._type;
|
|
440
|
+
return and(createVisibility, ifElse(CollectionType === "EntitySet", true, ifElse(converterContext.getTemplateType() !== TemplateType.ObjectPage, isInsertable, and(isInsertable, equal(bindingExpression("/editMode", "ui"), "Editable")))));
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Gets the binding expression for the property enabled of the action Delete.
|
|
444
|
+
*
|
|
445
|
+
* @param {ConverterContext} converterContext
|
|
446
|
+
* @param {StandardActionsContext} standardActionsContext
|
|
447
|
+
* @param {Expression<boolean>} deleteVisibility
|
|
448
|
+
* @returns {Expression<boolean> }
|
|
449
|
+
*/
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
_exports.getCreateEnablement = getCreateEnablement;
|
|
453
|
+
|
|
454
|
+
function getDeleteEnablement(converterContext, standardActionsContext, deleteVisibility) {
|
|
455
|
+
var isDeletable = standardActionsContext.restrictions.isDeletable.expression;
|
|
456
|
+
var isOnlyDynamicOnCurrentEntity = standardActionsContext.restrictions.isDeletable.isOnlyCurrentEntityExpression && !isConstant(isDeletable);
|
|
457
|
+
var numberOfSelectedContexts = bindingExpression("numberOfSelectedContexts", "internal");
|
|
458
|
+
var numberOfDeletableContexts = bindingExpression("deletableContexts", "internal");
|
|
459
|
+
var numberOfUnSavedContexts = bindingExpression("unSavedContexts", "internal");
|
|
460
|
+
return and(deleteVisibility, ifElse(or(converterContext.getTemplateType() !== TemplateType.ObjectPage, isOnlyDynamicOnCurrentEntity), ifElse(or(and(notEqual(numberOfDeletableContexts, undefined), greaterThan(length(numberOfDeletableContexts), 0)), and(notEqual(numberOfUnSavedContexts, undefined), greaterThan(length(numberOfUnSavedContexts), 0))), bindingExpression("deleteEnabled", "internal"), false), and(notEqual(numberOfSelectedContexts, 0), isDeletable)));
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Gets the binding expression for the property enabled of the action Paste.
|
|
464
|
+
*
|
|
465
|
+
* @param {Expression<boolean>} pasteVisibility
|
|
466
|
+
* @param {Expression<boolean>} createEnablement
|
|
467
|
+
* @returns {Expression<boolean> }
|
|
468
|
+
*/
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
_exports.getDeleteEnablement = getDeleteEnablement;
|
|
472
|
+
|
|
473
|
+
function getPasteEnablement(pasteVisibility, createEnablement) {
|
|
474
|
+
return and(pasteVisibility, createEnablement);
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Gets the binding expression for the property enabled of the action MassEdit.
|
|
478
|
+
*
|
|
479
|
+
* @param {ConverterContext} converterContext
|
|
480
|
+
* @param {StandardActionsContext} standardActionsContext
|
|
481
|
+
* @param {Expression<boolean>} massEditVisibility
|
|
482
|
+
* @returns {Expression<boolean> }
|
|
483
|
+
*/
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
_exports.getPasteEnablement = getPasteEnablement;
|
|
487
|
+
|
|
488
|
+
function getMassEditEnablement(converterContext, standardActionsContext, massEditVisibility) {
|
|
489
|
+
var pathUpdatableExpression = standardActionsContext.restrictions.isUpdatable.expression;
|
|
490
|
+
var isOnlyDynamicOnCurrentEntity = standardActionsContext.restrictions.isUpdatable.isOnlyCurrentEntityExpression && !isConstant(pathUpdatableExpression);
|
|
491
|
+
var numberOfSelectedContexts = greaterOrEqual(bindingExpression("numberOfSelectedContexts", "internal"), 1);
|
|
492
|
+
var numberOfUpdatableContexts = greaterOrEqual(length(bindingExpression("updatableContexts", "internal")), 1);
|
|
493
|
+
var bIsDraftSupported = isDraftSupported(converterContext);
|
|
494
|
+
var bDisplayMode = isInDisplayMode(converterContext); // numberOfUpdatableContexts needs to be added to the binding in case
|
|
495
|
+
// 1. Update is dependent on current entity property (isOnlyDynamicOnCurrentEntity is true).
|
|
496
|
+
// 2. The table is read only and draft enabled(like LR), in this case only active contexts can be mass edited.
|
|
497
|
+
// So, update depends on 'IsActiveEntity' value which needs to be checked runtime.
|
|
498
|
+
|
|
499
|
+
var runtimeBinding = ifElse(or(and(bDisplayMode, bIsDraftSupported), isOnlyDynamicOnCurrentEntity), and(numberOfSelectedContexts, numberOfUpdatableContexts), and(numberOfSelectedContexts));
|
|
500
|
+
return and(massEditVisibility, ifElse(isOnlyDynamicOnCurrentEntity, runtimeBinding, and(runtimeBinding, pathUpdatableExpression)));
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Tells if the table in template is in display mode.
|
|
504
|
+
*
|
|
505
|
+
* @param {ConverterContext} converterContext
|
|
506
|
+
* @param {ViewPathConfiguration} viewConfiguration
|
|
507
|
+
* @returns {boolean}
|
|
508
|
+
*/
|
|
509
|
+
|
|
510
|
+
|
|
511
|
+
_exports.getMassEditEnablement = getMassEditEnablement;
|
|
512
|
+
|
|
513
|
+
function isInDisplayMode(converterContext, viewConfiguration) {
|
|
514
|
+
var templateType = converterContext.getTemplateType();
|
|
515
|
+
|
|
516
|
+
if (templateType === TemplateType.ListReport || templateType === TemplateType.AnalyticalListPage || viewConfiguration && converterContext.getManifestWrapper().hasMultipleVisualizations(viewConfiguration)) {
|
|
517
|
+
return true;
|
|
518
|
+
} // updatable will be handled at the property level
|
|
519
|
+
|
|
520
|
+
|
|
521
|
+
return false;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
_exports.isInDisplayMode = isInDisplayMode;
|
|
525
|
+
return _exports;
|
|
526
|
+
}, false);
|
|
527
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlN0YW5kYXJkQWN0aW9ucy50cyJdLCJuYW1lcyI6WyJnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQiLCJjb252ZXJ0ZXJDb250ZXh0IiwibmF2aWdhdGlvblNldHRpbmdzIiwidGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb24iLCJ2aWV3Q29uZmlndXJhdGlvbiIsImNvbGxlY3Rpb25QYXRoIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJoaWRkZW5Bbm5vdGF0aW9uIiwiY3JlYXRlIiwiaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4iLCJ1cGRhdGUiLCJpc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZCIsImlzRHJhZnRPclN0aWNreVN1cHBvcnRlZCIsImlzVmlld1dpdGhNdWx0aXBsZVZpc3VhbGl6YXRpb25zIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyIsIm5ld0FjdGlvbiIsImdldE5ld0FjdGlvbiIsInJlc3RyaWN0aW9ucyIsImdldFJlc3RyaWN0aW9ucyIsIm5hdmlnYXRpb24iLCJvdXRib3VuZCIsIm91dGJvdW5kRGV0YWlsIiwidW5kZWZpbmVkIiwiaXNEcmFmdFN1cHBvcnRlZCIsImN1cnJlbnRFbnRpdHlTZXQiLCJnZXRFbnRpdHlTZXQiLCJiSXNEcmFmdFJvb3QiLCJhbm5vdGF0aW9ucyIsIkNvbW1vbiIsIkRyYWZ0Um9vdCIsImJJc0RyYWZ0Tm9kZSIsIkRyYWZ0Tm9kZSIsImJJc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQiLCJ0YXJnZXRPYmplY3QiLCJjb250YWluc1RhcmdldCIsInN0YXJ0aW5nRW50aXR5U2V0IiwiYklzRHJhZnRTdXBwb3J0ZWQiLCJiSXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkIiwiU2Vzc2lvbiIsIlN0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJuZXdBY3Rpb25OYW1lIiwiTmV3QWN0aW9uIiwidG9TdHJpbmciLCJhdmFpbGFibGVQcm9wZXJ0eSIsImdldEVudGl0eVR5cGUiLCJhY3Rpb25zIiwiQ29yZSIsIk9wZXJhdGlvbkF2YWlsYWJsZSIsIm5hbWUiLCJhdmFpbGFibGUiLCJhbm5vdGF0aW9uRXhwcmVzc2lvbiIsInNBbm5vdGF0aW9uVGVybSIsImRhdGFNb2RlbE9iamVjdFBhdGgiLCJ2aXNpdGVkTmF2aWdhdGlvblBhdGhzIiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJsZW5ndGgiLCJVSSIsInBhdGgiLCJzaW5nbGV0b25QYXRoVmlzaXRvciIsImNvbnN0YW50IiwicmVzdHJpY3Rpb25zRGVmIiwia2V5IiwiaXNQYXRoSW5zZXJ0YWJsZSIsImlzUGF0aFVwZGF0YWJsZSIsImlzUGF0aERlbGV0YWJsZSIsInJlc3VsdCIsImZvckVhY2giLCJkZWYiLCJkZWZGdW5jdGlvbiIsImV4cHJlc3Npb24iLCJhcHBseSIsImlzT25seUN1cnJlbnRFbnRpdHlFeHByZXNzaW9uIiwiY3VycmVudEVudGl0eVJlc3RyaWN0aW9uIiwiZ2V0SW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRpbmciLCJzdGFuZGFyZEFjdGlvbnNDb250ZXh0IiwiaXNEcmFmdE9yU3RpY2t5IiwiaXNDcmVhdGVBbHdheXNIaWRkZW4iLCJnZXRTdGFuZGFyZEFjdGlvbkNyZWF0ZSIsImNyZWF0ZVZpc2liaWxpdHkiLCJnZXRDcmVhdGVWaXNpYmlsaXR5IiwiaXNUZW1wbGF0ZWQiLCJjb21waWxlQmluZGluZyIsImdldENyZWF0ZVRlbXBsYXRpbmciLCJ2aXNpYmxlIiwiZW5hYmxlZCIsImdldENyZWF0ZUVuYWJsZW1lbnQiLCJnZXRTdGFuZGFyZEFjdGlvbkRlbGV0ZSIsImRlbGV0ZVZpc2liaWxpdHkiLCJnZXREZWxldGVWaXNpYmlsaXR5IiwiZ2V0RGVmYXVsdFRlbXBsYXRpbmciLCJnZXREZWxldGVFbmFibGVtZW50IiwiZ2V0U3RhbmRhcmRBY3Rpb25QYXN0ZSIsImlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZCIsImNyZWF0ZUVuYWJsZW1lbnQiLCJwYXN0ZVZpc2liaWxpdHkiLCJnZXRQYXN0ZVZpc2liaWxpdHkiLCJnZXRQYXN0ZUVuYWJsZW1lbnQiLCJnZXRTdGFuZGFyZEFjdGlvbk1hc3NFZGl0IiwibWFzc0VkaXRWaXNpYmlsaXR5IiwiZ2V0TWFzc0VkaXRWaXNpYmlsaXR5IiwiZ2V0TWFzc0VkaXRFbmFibGVtZW50IiwiaXNDcmVhdGlvblJvdyIsImNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uTW9kZSIsIkNyZWF0aW9uUm93IiwiaXNJbnNlcnRhYmxlIiwiaWZFbHNlIiwib3IiLCJhbmQiLCJpc0NvbnN0YW50IiwiZXF1YWwiLCJub3QiLCJhY3Rpb25WaXNpYmlsaXR5IiwiaXNDcmVhdGVIaWRkZW4iLCJnZXRUZW1wbGF0ZVR5cGUiLCJUZW1wbGF0ZVR5cGUiLCJMaXN0UmVwb3J0IiwiSXNFZGl0YWJsZSIsIkFuYWx5dGljYWxMaXN0UGFnZSIsImlzQmluZGluZyIsImlzRGVsZXRlSGlkZGVuIiwiZGVsZXRlIiwicGF0aERlbGV0YWJsZUV4cHJlc3Npb24iLCJpc0RlbGV0YWJsZSIsImJpbmRpbmdFeHByZXNzaW9uIiwibm90RXF1YWwiLCJlbmFibGVQYXN0ZSIsImluZGV4T2YiLCJpc1VwZGF0ZUhpZGRlbiIsInBhdGhVcGRhdGFibGVFeHByZXNzaW9uIiwiaXNVcGRhdGFibGUiLCJiTWFzc0VkaXRFbmFibGVkSW5NYW5pZmVzdCIsImVuYWJsZU1hc3NFZGl0IiwidGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiIsIk9iamVjdFBhZ2UiLCJDb2xsZWN0aW9uVHlwZSIsInJlc29sdmVBYnNvbHV0ZVBhdGgiLCJ0YXJnZXQiLCJfdHlwZSIsImlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkiLCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMiLCJudW1iZXJPZkRlbGV0YWJsZUNvbnRleHRzIiwibnVtYmVyT2ZVblNhdmVkQ29udGV4dHMiLCJncmVhdGVyVGhhbiIsImdyZWF0ZXJPckVxdWFsIiwibnVtYmVyT2ZVcGRhdGFibGVDb250ZXh0cyIsImJEaXNwbGF5TW9kZSIsImlzSW5EaXNwbGF5TW9kZSIsInJ1bnRpbWVCaW5kaW5nIiwidGVtcGxhdGVUeXBlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFTyxXQUFTQSw4QkFBVCxDQUNOQyxnQkFETSxFQUVOQyxrQkFGTSxFQUdOQywwQkFITSxFQUlOQyxpQkFKTSxFQUttQjtBQUN6QixXQUFPO0FBQ05DLE1BQUFBLGNBQWMsRUFBRUMsbUJBQW1CLENBQUNMLGdCQUFnQixDQUFDTSxzQkFBakIsRUFBRCxDQUQ3QjtBQUVOQyxNQUFBQSxnQkFBZ0IsRUFBRTtBQUNqQkMsUUFBQUEsTUFBTSxFQUFFQyx1QkFBdUIsQ0FBQ1QsZ0JBQUQsRUFBbUIsY0FBbkIsQ0FEZDtBQUVqQixrQkFBVVMsdUJBQXVCLENBQUNULGdCQUFELEVBQW1CLGNBQW5CLENBRmhCO0FBR2pCVSxRQUFBQSxNQUFNLEVBQUVELHVCQUF1QixDQUFDVCxnQkFBRCxFQUFtQixjQUFuQjtBQUhkLE9BRlo7QUFPTlcsTUFBQUEsMEJBQTBCLEVBQUVBLDBCQUEwQixDQUFDVixrQkFBRCxDQVBoRDtBQVFOVyxNQUFBQSx3QkFBd0IsRUFBRUEsd0JBQXdCLENBQUNaLGdCQUFELENBUjVDO0FBU05hLE1BQUFBLGdDQUFnQyxFQUFFVixpQkFBaUIsR0FDaERILGdCQUFnQixDQUFDYyxrQkFBakIsR0FBc0NDLHlCQUF0QyxDQUFnRVosaUJBQWhFLENBRGdELEdBRWhELEtBWEc7QUFZTmEsTUFBQUEsU0FBUyxFQUFFQyxZQUFZLENBQUNqQixnQkFBRCxDQVpqQjtBQWFORSxNQUFBQSwwQkFBMEIsRUFBRUEsMEJBYnRCO0FBY05nQixNQUFBQSxZQUFZLEVBQUVDLGVBQWUsQ0FBQ25CLGdCQUFEO0FBZHZCLEtBQVA7QUFnQkE7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FB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QVksR0FBR3RKLGdCQUFnQixDQUFDbUgsZUFBakIsRUFBckI7O0FBQ0EsUUFDQ21DLFlBQVksS0FBS2xDLFlBQVksQ0FBQ0MsVUFBOUIsSUFDQWlDLFlBQVksS0FBS2xDLFlBQVksQ0FBQ0csa0JBRDlCLElBRUNwSCxpQkFBaUIsSUFBSUgsZ0JBQWdCLENBQUNjLGtCQUFqQixHQUFzQ0MseUJBQXRDLENBQWdFWixpQkFBaEUsQ0FIdkIsRUFJRTtBQUNELGFBQU8sSUFBUDtBQUNBLEtBUnNILENBU3ZIOzs7QUFDQSxXQUFPLEtBQVA7QUFDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4uLy4uLy4uL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7XG5cdGFuZCxcblx0YW5ub3RhdGlvbkV4cHJlc3Npb24sXG5cdGJpbmRpbmdFeHByZXNzaW9uLFxuXHRCaW5kaW5nRXhwcmVzc2lvbixcblx0Y29tcGlsZUJpbmRpbmcsXG5cdGNvbnN0YW50LFxuXHRlcXVhbCxcblx0bGVuZ3RoLFxuXHRFeHByZXNzaW9uLFxuXHRncmVhdGVyT3JFcXVhbCxcblx0aWZFbHNlLFxuXHRpc0JpbmRpbmcsXG5cdGlzQ29uc3RhbnQsXG5cdG5vdCxcblx0bm90RXF1YWwsXG5cdG9yLFxuXHRncmVhdGVyVGhhblxufSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nRXhwcmVzc2lvblwiO1xuaW1wb3J0IHsgQ3JlYXRpb25Nb2RlLCBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uLCBUZW1wbGF0ZVR5cGUsIFZpZXdQYXRoQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBzaW5nbGV0b25QYXRoVmlzaXRvciwgVUkgfSBmcm9tIFwiLi4vLi4vLi4vaGVscGVycy9CaW5kaW5nSGVscGVyXCI7XG5pbXBvcnQgeyBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgZ2V0VGFyZ2V0T2JqZWN0UGF0aCwgaXNQYXRoRGVsZXRhYmxlLCBpc1BhdGhJbnNlcnRhYmxlLCBpc1BhdGhVcGRhdGFibGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgeyBUYWJsZUNvbnRyb2xDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4uL1RhYmxlXCI7XG5cbmV4cG9ydCB0eXBlIFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSA9IHtcblx0aXNUZW1wbGF0ZWQ/OiBCaW5kaW5nRXhwcmVzc2lvbjxib29sZWFuPjtcblx0dmlzaWJsZTogQmluZGluZ0V4cHJlc3Npb248Ym9vbGVhbj47XG5cdGVuYWJsZWQ6IEJpbmRpbmdFeHByZXNzaW9uPGJvb2xlYW4+O1xufTtcblxudHlwZSBFeHByZXNzaW9uUmVzdHJpY3Rpb25zVHlwZSA9IHtcblx0ZXhwcmVzc2lvbjogRXhwcmVzc2lvbjxib29sZWFuPjtcblx0aXNPbmx5Q3VycmVudEVudGl0eUV4cHJlc3Npb246IGJvb2xlYW47XG59O1xudHlwZSBTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlID0gUmVjb3JkPHN0cmluZywgRXhwcmVzc2lvblJlc3RyaWN0aW9uc1R5cGU+O1xuXG5leHBvcnQgdHlwZSBTdGFuZGFyZEFjdGlvbnNDb250ZXh0ID0ge1xuXHRjb2xsZWN0aW9uUGF0aDogc3RyaW5nO1xuXHRoaWRkZW5Bbm5vdGF0aW9uOiB7XG5cdFx0Y3JlYXRlOiBFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHRcdFwiZGVsZXRlXCI6IEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdFx0dXBkYXRlOiBFeHByZXNzaW9uPGJvb2xlYW4+O1xuXHR9O1xuXHRpc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZDogYm9vbGVhbjtcblx0aXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkOiBib29sZWFuO1xuXHRpc1ZpZXdXaXRoTXVsdGlwbGVWaXN1YWxpemF0aW9uczogYm9vbGVhbjtcblx0bmV3QWN0aW9uPzoge1xuXHRcdG5hbWU/OiBzdHJpbmc7XG5cdFx0YXZhaWxhYmxlPzogRXhwcmVzc2lvbjxib29sZWFuPjtcblx0fTtcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb247XG5cdHJlc3RyaWN0aW9uczogU3RhbmRhcmRBY3Rpb25zUmVzdHJpY3Rpb25zVHlwZTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBjb250ZXh0IGZvciB0aGUgc3RhbmRhcmQgYWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7TmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbn0gbmF2aWdhdGlvblNldHRpbmdzXG4gKiBAcGFyYW0ge1RhYmxlQ29udHJvbENvbmZpZ3VyYXRpb259IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge1ZpZXdQYXRoQ29uZmlndXJhdGlvbn0gdmlld0NvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zICBUaGUgY29udGV4dCBmb3IgdGFibGUgYWN0aW9uc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVN0YW5kYXJkQWN0aW9uc0NvbnRleHQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdG5hdmlnYXRpb25TZXR0aW5nczogTmF2aWdhdGlvblNldHRpbmdzQ29uZmlndXJhdGlvbixcblx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IFRhYmxlQ29udHJvbENvbmZpZ3VyYXRpb24sXG5cdHZpZXdDb25maWd1cmF0aW9uPzogVmlld1BhdGhDb25maWd1cmF0aW9uXG4pOiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0IHtcblx0cmV0dXJuIHtcblx0XHRjb2xsZWN0aW9uUGF0aDogZ2V0VGFyZ2V0T2JqZWN0UGF0aChjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKSksXG5cdFx0aGlkZGVuQW5ub3RhdGlvbjoge1xuXHRcdFx0Y3JlYXRlOiBpc0FjdGlvbkFubm90YXRlZEhpZGRlbihjb252ZXJ0ZXJDb250ZXh0LCBcIkNyZWF0ZUhpZGRlblwiKSxcblx0XHRcdFwiZGVsZXRlXCI6IGlzQWN0aW9uQW5ub3RhdGVkSGlkZGVuKGNvbnZlcnRlckNvbnRleHQsIFwiRGVsZXRlSGlkZGVuXCIpLFxuXHRcdFx0dXBkYXRlOiBpc0FjdGlvbkFubm90YXRlZEhpZGRlbihjb252ZXJ0ZXJDb250ZXh0LCBcIlVwZGF0ZUhpZGRlblwiKVxuXHRcdH0sXG5cdFx0aXNFeHRlcm5hbENyZWF0ZUNvbmZpZ3VyZWQ6IGlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkKG5hdmlnYXRpb25TZXR0aW5ncyksXG5cdFx0aXNEcmFmdE9yU3RpY2t5U3VwcG9ydGVkOiBpc0RyYWZ0T3JTdGlja3lTdXBwb3J0ZWQoY29udmVydGVyQ29udGV4dCksXG5cdFx0aXNWaWV3V2l0aE11bHRpcGxlVmlzdWFsaXphdGlvbnM6IHZpZXdDb25maWd1cmF0aW9uXG5cdFx0XHQ/IGNvbnZlcnRlckNvbnRleHQuZ2V0TWFuaWZlc3RXcmFwcGVyKCkuaGFzTXVsdGlwbGVWaXN1YWxpemF0aW9ucyh2aWV3Q29uZmlndXJhdGlvbilcblx0XHRcdDogZmFsc2UsXG5cdFx0bmV3QWN0aW9uOiBnZXROZXdBY3Rpb24oY29udmVydGVyQ29udGV4dCksXG5cdFx0dGFibGVNYW5pZmVzdENvbmZpZ3VyYXRpb246IHRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uLFxuXHRcdHJlc3RyaWN0aW9uczogZ2V0UmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQpXG5cdH07XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGV4dGVybmFsIGNyZWF0ZWQgaXMgY29uZmlndXJlZCBmb3IgdGhlIG5hdmlnYXRpb24uXG4gKlxuICogQHBhcmFtIHtOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9ufSBuYXZpZ2F0aW9uU2V0dGluZ3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFeHRlcm5hbENyZWF0ZUNvbmZpZ3VyZWQobmF2aWdhdGlvblNldHRpbmdzOiBOYXZpZ2F0aW9uU2V0dGluZ3NDb25maWd1cmF0aW9uKTogYm9vbGVhbiB7XG5cdGNvbnN0IG5hdmlnYXRpb24gPSBuYXZpZ2F0aW9uU2V0dGluZ3M/LmNyZWF0ZTtcblx0cmV0dXJuIChuYXZpZ2F0aW9uICYmIG5hdmlnYXRpb24ub3V0Ym91bmQgJiYgbmF2aWdhdGlvbi5vdXRib3VuZERldGFpbCkgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgZHJhZnQgaXMgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RyYWZ0U3VwcG9ydGVkKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBib29sZWFuIHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IGJJc0RyYWZ0Um9vdCA9IGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdFJvb3QgPyB0cnVlIDogZmFsc2U7XG5cdGNvbnN0IGJJc0RyYWZ0Tm9kZSA9IGN1cnJlbnRFbnRpdHlTZXQgJiYgY3VycmVudEVudGl0eVNldC5hbm5vdGF0aW9ucz8uQ29tbW9uPy5EcmFmdE5vZGUgPyB0cnVlIDogZmFsc2U7XG5cdGNvbnN0IGJJc0RyYWZ0UGFyZW50RW50aXR5Rm9yQ29udGFpbm1lbnQgPVxuXHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnRhcmdldE9iamVjdD8uY29udGFpbnNUYXJnZXQgJiZcblx0XHQoY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkuc3RhcnRpbmdFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Um9vdCB8fFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCkuc3RhcnRpbmdFbnRpdHlTZXQ/LmFubm90YXRpb25zPy5Db21tb24/LkRyYWZ0Tm9kZSlcblx0XHRcdD8gdHJ1ZVxuXHRcdFx0OiBmYWxzZTtcblxuXHRyZXR1cm4gYklzRHJhZnRSb290IHx8IGJJc0RyYWZ0Tm9kZSB8fCAoIWNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCkgJiYgYklzRHJhZnRQYXJlbnRFbnRpdHlGb3JDb250YWlubWVudCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHN0aWNreSBvciBkcmFmdCBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRHJhZnRPclN0aWNreVN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogYm9vbGVhbiB7XG5cdGNvbnN0IGJJc0RyYWZ0U3VwcG9ydGVkID0gaXNEcmFmdFN1cHBvcnRlZChjb252ZXJ0ZXJDb250ZXh0KTtcblx0Y29uc3QgYklzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpLnN0YXJ0aW5nRW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uU2Vzc2lvblxuXHRcdD8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFxuXHRcdD8gdHJ1ZVxuXHRcdDogZmFsc2U7XG5cblx0cmV0dXJuIGJJc0RyYWZ0U3VwcG9ydGVkIHx8IGJJc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29uZmlndXJlZCBuZXdBY3Rpb24gaW50byBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHJldHVybnMge2FueX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5ld0FjdGlvbihjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogYW55IHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IG5ld0FjdGlvbk5hbWU6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4gPSAoXG5cdFx0Y3VycmVudEVudGl0eVNldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uRHJhZnRSb290Py5OZXdBY3Rpb24gfHxcblx0XHRjdXJyZW50RW50aXR5U2V0Py5hbm5vdGF0aW9ucz8uU2Vzc2lvbj8uU3RpY2t5U2Vzc2lvblN1cHBvcnRlZD8uTmV3QWN0aW9uXG5cdCk/LnRvU3RyaW5nKCk7XG5cdGlmIChuZXdBY3Rpb25OYW1lKSB7XG5cdFx0bGV0IGF2YWlsYWJsZVByb3BlcnR5OiBhbnkgPSBjb252ZXJ0ZXJDb250ZXh0Py5nZXRFbnRpdHlUeXBlKCkuYWN0aW9uc1tuZXdBY3Rpb25OYW1lXT8uYW5ub3RhdGlvbnM/LkNvcmU/Lk9wZXJhdGlvbkF2YWlsYWJsZTtcblx0XHRhdmFpbGFibGVQcm9wZXJ0eSA9IGF2YWlsYWJsZVByb3BlcnR5ICE9PSB1bmRlZmluZWQgPyBhdmFpbGFibGVQcm9wZXJ0eSA6IHRydWU7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5hbWU6IG5ld0FjdGlvbk5hbWUsXG5cdFx0XHRhdmFpbGFibGU6IGFubm90YXRpb25FeHByZXNzaW9uKGF2YWlsYWJsZVByb3BlcnR5KVxuXHRcdH07XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBhY3Rpb24gdmlzaWJpbGl0eSBjb25maWd1cmVkIGludG8gYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzQW5ub3RhdGlvblRlcm1cbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+fVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBY3Rpb25Bbm5vdGF0ZWRIaWRkZW4oY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCwgc0Fubm90YXRpb25UZXJtOiBzdHJpbmcpOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgY3VycmVudEVudGl0eVNldCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0KCk7XG5cdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBjb252ZXJ0ZXJDb250ZXh0LmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0Ly8gQ29uc2lkZXIgb25seSB0aGUgbGFzdCBsZXZlbCBvZiBuYXZpZ2F0aW9uLiBUaGUgb3RoZXJzIGFyZSBhbHJlYWR5IGNvbnNpZGVyZWQgaW4gdGhlIGVsZW1lbnQgYmluZGluZyBvZiB0aGUgcGFnZS5cblx0Y29uc3QgdmlzaXRlZE5hdmlnYXRpb25QYXRocyA9XG5cdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggPiAwXG5cdFx0XHQ/IFtkYXRhTW9kZWxPYmplY3RQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzW2RhdGFNb2RlbE9iamVjdFBhdGgubmF2aWdhdGlvblByb3BlcnRpZXMubGVuZ3RoIC0gMV0ubmFtZV1cblx0XHRcdDogW107XG5cdHJldHVybiBjdXJyZW50RW50aXR5U2V0XG5cdFx0PyBhbm5vdGF0aW9uRXhwcmVzc2lvbihcblx0XHRcdFx0KChjdXJyZW50RW50aXR5U2V0Py5hbm5vdGF0aW9ucy5VSSBhcyBhbnkpPy5bc0Fubm90YXRpb25UZXJtXSBhcyBQcm9wZXJ0eUFubm90YXRpb25WYWx1ZTxib29sZWFuPikgfHwgZmFsc2UsXG5cdFx0XHRcdHZpc2l0ZWROYXZpZ2F0aW9uUGF0aHMsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0KHBhdGg6IHN0cmluZykgPT4gc2luZ2xldG9uUGF0aFZpc2l0b3IocGF0aCwgY29udmVydGVyQ29udGV4dCwgdmlzaXRlZE5hdmlnYXRpb25QYXRocylcblx0XHQgIClcblx0XHQ6IGNvbnN0YW50KGZhbHNlKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBhbm5vdGF0ZWQgcmVzdHJpY3Rpb25zIGZvciB0aGUgYWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEByZXR1cm5zIHtTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVzdHJpY3Rpb25zKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBTdGFuZGFyZEFjdGlvbnNSZXN0cmljdGlvbnNUeXBlIHtcblx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRjb25zdCByZXN0cmljdGlvbnNEZWYgPSBbXG5cdFx0e1xuXHRcdFx0a2V5OiBcImlzSW5zZXJ0YWJsZVwiLFxuXHRcdFx0XCJmdW5jdGlvblwiOiBpc1BhdGhJbnNlcnRhYmxlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IFwiaXNVcGRhdGFibGVcIixcblx0XHRcdFwiZnVuY3Rpb25cIjogaXNQYXRoVXBkYXRhYmxlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRrZXk6IFwiaXNEZWxldGFibGVcIixcblx0XHRcdFwiZnVuY3Rpb25cIjogaXNQYXRoRGVsZXRhYmxlXG5cdFx0fVxuXHRdO1xuXHRjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIEV4cHJlc3Npb25SZXN0cmljdGlvbnNUeXBlPiA9IHt9O1xuXHRyZXN0cmljdGlvbnNEZWYuZm9yRWFjaChmdW5jdGlvbihkZWYpIHtcblx0XHRjb25zdCBkZWZGdW5jdGlvbiA9IGRlZltcImZ1bmN0aW9uXCJdO1xuXHRcdHJlc3VsdFtkZWYua2V5XSA9IHtcblx0XHRcdGV4cHJlc3Npb246IGRlZkZ1bmN0aW9uLmFwcGx5KG51bGwsIFtkYXRhTW9kZWxPYmplY3RQYXRoXSksXG5cdFx0XHRpc09ubHlDdXJyZW50RW50aXR5RXhwcmVzc2lvbjogISEoZGVmRnVuY3Rpb24uYXBwbHkobnVsbCwgW2RhdGFNb2RlbE9iamVjdFBhdGgsIHVuZGVmaW5lZCwgdHJ1ZV0pIGFzIGFueSlcblx0XHRcdFx0Py5jdXJyZW50RW50aXR5UmVzdHJpY3Rpb25cblx0XHR9O1xuXHR9KTtcblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGVtcGxhdGluZyBmb3IgaW5zZXJ0L3VwZGF0ZSBhY3Rpb25zIGlzIG1hbmRhdG9yeS5cbiAqXG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNEcmFmdE9yU3RpY2t5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzQ3JlYXRlQWx3YXlzSGlkZGVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0aW5nKFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0LFxuXHRpc0RyYWZ0T3JTdGlja3k6IGJvb2xlYW4sXG5cdGlzQ3JlYXRlQWx3YXlzSGlkZGVuOiBib29sZWFuXG4pOiBib29sZWFuIHtcblx0cmV0dXJuIChpc0RyYWZ0T3JTdGlja3kgfHwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5pc0V4dGVybmFsQ3JlYXRlQ29uZmlndXJlZCkgJiYgIWlzQ3JlYXRlQWx3YXlzSGlkZGVuO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhY3Rpb24gQ3JlYXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25DcmVhdGUoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSB7XG5cdGNvbnN0IGNyZWF0ZVZpc2liaWxpdHkgPSBnZXRDcmVhdGVWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlQmluZGluZyhnZXRDcmVhdGVUZW1wbGF0aW5nKHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGNyZWF0ZVZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhjcmVhdGVWaXNpYmlsaXR5KSxcblx0XHRlbmFibGVkOiBjb21waWxlQmluZGluZyhnZXRDcmVhdGVFbmFibGVtZW50KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGNyZWF0ZVZpc2liaWxpdHkpKVxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhY3Rpb24gRGVsZXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25EZWxldGUoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSB7XG5cdGNvbnN0IGRlbGV0ZVZpc2liaWxpdHkgPSBnZXREZWxldGVWaXNpYmlsaXR5KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQpO1xuXG5cdHJldHVybiB7XG5cdFx0aXNUZW1wbGF0ZWQ6IGNvbXBpbGVCaW5kaW5nKGdldERlZmF1bHRUZW1wbGF0aW5nKGRlbGV0ZVZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhkZWxldGVWaXNpYmlsaXR5KSxcblx0XHRlbmFibGVkOiBjb21waWxlQmluZGluZyhnZXREZWxldGVFbmFibGVtZW50KGNvbnZlcnRlckNvbnRleHQsIHN0YW5kYXJkQWN0aW9uc0NvbnRleHQsIGRlbGV0ZVZpc2liaWxpdHkpKVxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBhY3Rpb24gUGFzdGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkXG4gKiBAcmV0dXJucyB7U3RhbmRhcmRBY3Rpb25Db25maWdUeXBlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhbmRhcmRBY3Rpb25QYXN0ZShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuXG4pOiBTdGFuZGFyZEFjdGlvbkNvbmZpZ1R5cGUge1xuXHRjb25zdCBjcmVhdGVWaXNpYmlsaXR5ID0gZ2V0Q3JlYXRlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblx0Y29uc3QgY3JlYXRlRW5hYmxlbWVudCA9IGdldENyZWF0ZUVuYWJsZW1lbnQoY29udmVydGVyQ29udGV4dCwgc3RhbmRhcmRBY3Rpb25zQ29udGV4dCwgY3JlYXRlVmlzaWJpbGl0eSk7XG5cdGNvbnN0IHBhc3RlVmlzaWJpbGl0eSA9IGdldFBhc3RlVmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBjcmVhdGVWaXNpYmlsaXR5LCBpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWQpO1xuXHRyZXR1cm4ge1xuXHRcdHZpc2libGU6IGNvbXBpbGVCaW5kaW5nKHBhc3RlVmlzaWJpbGl0eSksXG5cdFx0ZW5hYmxlZDogY29tcGlsZUJpbmRpbmcoZ2V0UGFzdGVFbmFibGVtZW50KHBhc3RlVmlzaWJpbGl0eSwgY3JlYXRlRW5hYmxlbWVudCkpXG5cdH07XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9ucyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGFjdGlvbiBNYXNzRWRpdC5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHRcbiAqIEBwYXJhbSB7U3RhbmRhcmRBY3Rpb25zQ29udGV4dH0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuICogQHJldHVybnMge1N0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YW5kYXJkQWN0aW9uTWFzc0VkaXQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IFN0YW5kYXJkQWN0aW9uQ29uZmlnVHlwZSB7XG5cdGNvbnN0IG1hc3NFZGl0VmlzaWJpbGl0eSA9IGdldE1hc3NFZGl0VmlzaWJpbGl0eShjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0KTtcblxuXHRyZXR1cm4ge1xuXHRcdGlzVGVtcGxhdGVkOiBjb21waWxlQmluZGluZyhnZXREZWZhdWx0VGVtcGxhdGluZyhtYXNzRWRpdFZpc2liaWxpdHkpKSxcblx0XHR2aXNpYmxlOiBjb21waWxlQmluZGluZyhtYXNzRWRpdFZpc2liaWxpdHkpLFxuXHRcdGVuYWJsZWQ6IGNvbXBpbGVCaW5kaW5nKGdldE1hc3NFZGl0RW5hYmxlbWVudChjb252ZXJ0ZXJDb250ZXh0LCBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LCBtYXNzRWRpdFZpc2liaWxpdHkpKVxuXHR9O1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHRlbXBsYXRpbmcgb2YgdGhlIGFjdGlvbiBDcmVhdGUuXG4gKlxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGNyZWF0ZVZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0ZVRlbXBsYXRpbmcoXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGNyZWF0ZVZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0NyZWF0aW9uUm93ID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5jcmVhdGlvbk1vZGUgPT09IENyZWF0aW9uTW9kZS5DcmVhdGlvblJvdztcblx0Y29uc3QgbmV3QWN0aW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5uZXdBY3Rpb247XG5cdGNvbnN0IGlzSW5zZXJ0YWJsZSA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzSW5zZXJ0YWJsZS5leHByZXNzaW9uO1xuXG5cdC8vVGVtcGxhdGluZyBvZiBDcmVhdGUgQnV0dG9uIGlzIG5vdCBkb25lOlxuXHQvLyBcdCAtIElmIEJ1dHRvbiBpcyBuZXZlciB2aXNpYmxlIG9yIENyZWF0aW9uTW9kZSBpcyBvbiBDcmVhdGlvblJvd1xuXHQvLyAgIC0gT3RoZXJ3aXNlIElmIG5ldyBhY3Rpb24gaXMgY29uZmlndXJlZCBhbmQgbmV2ZXIgYXZhaWxhYmxlXG5cdC8vXHQgLSBPdGhlcndpc2UgSWYgZGVsZXRlIHJlc3RyaWN0aW9ucyBjb21pbmcgZnJvbSBOYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIGFyZSBjb25zdGFudGx5IGZhbHNlXG5cdC8vICAgLSBPdGhlcndpc2UgSWYgdGhlcmUgaXMgbm8gZXh0ZXJuYWwgY3JlYXRlIGFjdGlvblxuXHQvL1x0IC0gT3RoZXJ3aXNlIGlmIHRoZXJlIGlzIGRlbGV0ZSByZXN0cmljdGlvbnMgb24gdGhlIGN1cnJlbnQgZW50aXR5U2V0IHNldCB0byBmYWxzZVxuXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0b3IoYW5kKGlzQ29uc3RhbnQoY3JlYXRlVmlzaWJpbGl0eSksIGVxdWFsKGNyZWF0ZVZpc2liaWxpdHksIGZhbHNlKSksIGlzQ3JlYXRpb25Sb3cpLFxuXHRcdGZhbHNlLFxuXHRcdGlmRWxzZShcblx0XHRcdGFuZChpc0NvbnN0YW50KG5ld0FjdGlvbj8uYXZhaWxhYmxlKSwgZXF1YWwobmV3QWN0aW9uPy5hdmFpbGFibGUsIGZhbHNlKSksXG5cdFx0XHRmYWxzZSxcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0YW5kKG5vdChzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc0luc2VydGFibGUuaXNPbmx5Q3VycmVudEVudGl0eUV4cHJlc3Npb24pLCBpc0NvbnN0YW50KGlzSW5zZXJ0YWJsZSkpLFxuXHRcdFx0XHRpc0luc2VydGFibGUsXG5cdFx0XHRcdGlmRWxzZShcblx0XHRcdFx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmlzRXh0ZXJuYWxDcmVhdGVDb25maWd1cmVkLFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0bm90KGFuZChpc0NvbnN0YW50KGlzSW5zZXJ0YWJsZSksIGVxdWFsKGlzSW5zZXJ0YWJsZSwgY29uc3RhbnQoZmFsc2UpKSkpXG5cdFx0XHRcdClcblx0XHRcdClcblx0XHQpXG5cdCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgYmluZGluZyBleHByZXNzaW9uIGZvciB0aGUgdGVtcGxhdGluZyBvZiB0aGUgbm9uLUNyZWF0ZSBhY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gYWN0aW9uVmlzaWJpbGl0eVxuICogQHJldHVybnMge0V4cHJlc3Npb248Ym9vbGVhbj4gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmYXVsdFRlbXBsYXRpbmcoYWN0aW9uVmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRyZXR1cm4gbm90KGFuZChpc0NvbnN0YW50KGFjdGlvblZpc2liaWxpdHkpLCBlcXVhbChhY3Rpb25WaXNpYmlsaXR5LCBmYWxzZSkpKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2aXNpYmxlIG9mIHRoZSBhY3Rpb24gQ3JlYXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDcmVhdGVWaXNpYmlsaXR5KFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0OiBTdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Y29uc3QgaXNJbnNlcnRhYmxlID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNJbnNlcnRhYmxlLmV4cHJlc3Npb247XG5cdGNvbnN0IGlzQ3JlYXRlSGlkZGVuID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5oaWRkZW5Bbm5vdGF0aW9uLmNyZWF0ZTtcblx0Y29uc3QgbmV3QWN0aW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5uZXdBY3Rpb247XG5cblx0Ly9DcmVhdGUgQnV0dG9uIGlzIHZpc2libGU6XG5cdC8vIFx0IC0gSWYgdGhlIGNyZWF0aW9uIG1vZGUgaXMgZXh0ZXJuYWxcblx0Ly8gICAgICAtIElmIHdlJ3JlIG9uIHRoZSBsaXN0IHJlcG9ydCBhbmQgY3JlYXRlIGlzIG5vdCBoaWRkZW5cblx0Ly9cdFx0LSBPdGhlcndpc2UgdGhpcyBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiB0aGUgdGhlIFVJLklzRWRpdGFibGVcblx0Ly8gICAtIE90aGVyd2lzZVxuXHQvLyBcdCBcdC0gSWYgd2UncmUgb24gdGhlIGxpc3QgcmVwb3J0IC0+XG5cdC8vIFx0IFx0XHQtIElmIFVJLkNyZWF0ZUhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSBwYXRoIC0+IHByb3ZpZGUgYSBuZWdhdGVkIGJpbmRpbmcgdG8gdGhpcyBwYXRoXG5cdC8vIFx0IFx0XHQtIE90aGVyd2lzZSwgY3JlYXRlIGlzIHZpc2libGVcblx0Ly8gXHQgXHQtIE90aGVyd2lzZVxuXHQvLyBcdCAgXHQgLSBUaGlzIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mIHRoZSB0aGUgVUkuSXNFZGl0YWJsZVxuXHRyZXR1cm4gaWZFbHNlKFxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaXNFeHRlcm5hbENyZWF0ZUNvbmZpZ3VyZWQsXG5cdFx0aWZFbHNlKFxuXHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQsXG5cdFx0XHRub3QoaXNDcmVhdGVIaWRkZW4pLFxuXHRcdFx0YW5kKG5vdChpc0NyZWF0ZUhpZGRlbiksIFVJLklzRWRpdGFibGUpXG5cdFx0KSxcblx0XHRpZkVsc2UoXG5cdFx0XHRvcihcblx0XHRcdFx0YW5kKGlzQ29uc3RhbnQobmV3QWN0aW9uPy5hdmFpbGFibGUpLCBlcXVhbChuZXdBY3Rpb24/LmF2YWlsYWJsZSwgZmFsc2UpKSxcblx0XHRcdFx0YW5kKGlzQ29uc3RhbnQoaXNJbnNlcnRhYmxlKSwgZXF1YWwoaXNJbnNlcnRhYmxlLCBmYWxzZSksICFuZXdBY3Rpb24pLFxuXHRcdFx0XHRhbmQoaXNDb25zdGFudChpc0NyZWF0ZUhpZGRlbiksIGVxdWFsKGlzQ3JlYXRlSGlkZGVuLCB0cnVlKSksXG5cdFx0XHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaXNWaWV3V2l0aE11bHRpcGxlVmlzdWFsaXphdGlvbnMsXG5cdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgPT09IFRlbXBsYXRlVHlwZS5BbmFseXRpY2FsTGlzdFBhZ2Vcblx0XHRcdCksXG5cdFx0XHRmYWxzZSxcblx0XHRcdGlmRWxzZShcblx0XHRcdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQsXG5cdFx0XHRcdGlmRWxzZShpc0JpbmRpbmcoaXNDcmVhdGVIaWRkZW4pLCBub3QoaXNDcmVhdGVIaWRkZW4pLCB0cnVlKSxcblx0XHRcdFx0YW5kKG5vdChpc0NyZWF0ZUhpZGRlbiksIFVJLklzRWRpdGFibGUpXG5cdFx0XHQpXG5cdFx0KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5IHZpc2libGUgb2YgdGhlIGFjdGlvbiBEZWxldGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGV0ZVZpc2liaWxpdHkoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0RlbGV0ZUhpZGRlbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQuaGlkZGVuQW5ub3RhdGlvbi5kZWxldGU7XG5cdGNvbnN0IHBhdGhEZWxldGFibGVFeHByZXNzaW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNEZWxldGFibGUuZXhwcmVzc2lvbjtcblxuXHQvL0RlbGV0ZSBCdXR0b24gaXMgdmlzaWJsZTpcblx0Ly8gXHQgUHJlcmVxdWlzaXRlczpcblx0Ly9cdCAtIElmIHdlJ3JlIG5vdCBvbiBtdWx0aXBsZSB2aXN1YWxpemF0aW9ucyBjb25maWd1cmF0aW9uIG9yIEFMUFxuXHQvL1xuXHQvLyAgIC0gSWYgcmVzdHJpY3Rpb25zIG9uIGRlbGV0YWJsZSBzZXQgdG8gZmFsc2UgLT4gbm90IHZpc2libGVcblx0Ly8gICAtIE90aGVyd2lzZVxuXHQvL1x0XHRcdC0gSWYgVUkuRGVsZXRlSGlkZGVuIGlzIHRydWUgLT4gbm90IHZpc2libGVcblx0Ly9cdFx0XHQtIE90aGVyd2lzZVxuXHQvLyBcdCBcdFx0XHQtIElmIHdlJ3JlIG9uIE9QIC0+IGRlcGVuZGluZyBvZiB0aGUgZWRpdE1vZGUgYW5kIHJlc3RyaWN0aW9ucyBvbiBkZWxldGFibGVcblx0Ly9cdFx0XHRcdC0gT3RoZXJ3aXNlXG5cdC8vXHRcdFx0XHQgXHQtIElmIFVJLkRlbGV0ZUhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSBwYXRoIC0+IHByb3ZpZGUgYSBuZWdhdGVkIGJpbmRpbmcgdG8gdGhpcyBwYXRoXG5cdC8vXHQgXHQgXHRcdCBcdC0gT3RoZXJ3aXNlLCBkZWxldGUgaXMgdmlzaWJsZVxuXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0b3Ioc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5pc1ZpZXdXaXRoTXVsdGlwbGVWaXN1YWxpemF0aW9ucywgY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSksXG5cdFx0ZmFsc2UsXG5cdFx0aWZFbHNlKFxuXHRcdFx0YW5kKGlzQ29uc3RhbnQocGF0aERlbGV0YWJsZUV4cHJlc3Npb24pLCBlcXVhbChwYXRoRGVsZXRhYmxlRXhwcmVzc2lvbiwgZmFsc2UpKSxcblx0XHRcdGZhbHNlLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRhbmQoaXNDb25zdGFudChpc0RlbGV0ZUhpZGRlbiksIGVxdWFsKGlzRGVsZXRlSGlkZGVuLCBjb25zdGFudCh0cnVlKSkpLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRcdGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkgIT09IFRlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LFxuXHRcdFx0XHRcdGFuZChub3QoaXNEZWxldGVIaWRkZW4pLCBlcXVhbChiaW5kaW5nRXhwcmVzc2lvbihcIi9lZGl0TW9kZVwiLCBcInVpXCIpLCBcIkVkaXRhYmxlXCIpKSxcblx0XHRcdFx0XHRpZkVsc2UoaXNCaW5kaW5nKGlzRGVsZXRlSGlkZGVuKSwgbm90KGlzRGVsZXRlSGlkZGVuKSwgdHJ1ZSlcblx0XHRcdFx0KVxuXHRcdFx0KVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2aXNpYmxlIG9mIHRoZSBhY3Rpb24gUGFzdGUuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gY3JlYXRlVmlzaWJpbGl0eVxuICogQHBhcmFtIHtib29sZWFufSBpc0luc2VydFVwZGF0ZUFjdGlvbnNUZW1wbGF0ZWRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhc3RlVmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dCxcblx0Y3JlYXRlVmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPixcblx0aXNJbnNlcnRVcGRhdGVBY3Rpb25zVGVtcGxhdGVkOiBib29sZWFuXG4pOiBFeHByZXNzaW9uPGJvb2xlYW4+IHtcblx0Ly8gSWYgQ3JlYXRlIGlzIHZpc2libGUsIGVuYWJsZVBhc3RlIGlzIG5vdCBkaXNhYmxlZCBpbnRvIG1hbmlmZXN0IGFuZCB3ZSBhcmUgb24gT1AvYmxvY2tzIG91dHNpZGUgRmlvcmkgZWxlbWVudHMgdGVtcGxhdGVzXG5cdC8vIFRoZW4gYnV0dG9uIHdpbGwgYmUgdmlzaWJsZSBhY2NvcmRpbmcgdG8gaW5zZXJ0YWJsZSByZXN0cmljdGlvbnMgYW5kIGNyZWF0ZSB2aXNpYmlsaXR5XG5cdC8vIE90aGVyd2lzZSBpdCdzIG5vdCB2aXNpYmxlXG5cdHJldHVybiBpZkVsc2UoXG5cdFx0YW5kKFxuXHRcdFx0bm90RXF1YWwoc3RhbmRhcmRBY3Rpb25zQ29udGV4dC50YWJsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5lbmFibGVQYXN0ZSwgZmFsc2UpLFxuXHRcdFx0Y3JlYXRlVmlzaWJpbGl0eSxcblx0XHRcdGlzSW5zZXJ0VXBkYXRlQWN0aW9uc1RlbXBsYXRlZFxuXHRcdCksXG5cdFx0W1RlbXBsYXRlVHlwZS5MaXN0UmVwb3J0LCBUZW1wbGF0ZVR5cGUuQW5hbHl0aWNhbExpc3RQYWdlXS5pbmRleE9mKGNvbnZlcnRlckNvbnRleHQuZ2V0VGVtcGxhdGVUeXBlKCkpID09PSAtMSAmJlxuXHRcdFx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNJbnNlcnRhYmxlLmV4cHJlc3Npb24sXG5cdFx0ZmFsc2Vcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSB2aXNpYmxlIG9mIHRoZSBhY3Rpb24gTWFzc0VkaXQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hc3NFZGl0VmlzaWJpbGl0eShcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0c3RhbmRhcmRBY3Rpb25zQ29udGV4dDogU3RhbmRhcmRBY3Rpb25zQ29udGV4dFxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IGlzVXBkYXRlSGlkZGVuID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5oaWRkZW5Bbm5vdGF0aW9uLnVwZGF0ZSxcblx0XHRwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzVXBkYXRhYmxlLmV4cHJlc3Npb24sXG5cdFx0Yk1hc3NFZGl0RW5hYmxlZEluTWFuaWZlc3Q6IGJvb2xlYW4gPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnRhYmxlTWFuaWZlc3RDb25maWd1cmF0aW9uPy5lbmFibGVNYXNzRWRpdCB8fCBmYWxzZTtcblx0Y29uc3QgdGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiA9XG5cdFx0Y29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLk9iamVjdFBhZ2Vcblx0XHRcdD8gZXF1YWwoVUkuSXNFZGl0YWJsZSwgdHJ1ZSlcblx0XHRcdDogY29udmVydGVyQ29udGV4dC5nZXRUZW1wbGF0ZVR5cGUoKSA9PT0gVGVtcGxhdGVUeXBlLkxpc3RSZXBvcnQ7XG5cdC8vTWFzc0VkaXQgaXMgdmlzaWJsZVxuXHQvLyBJZlxuXHQvL1x0XHQtIHRoZXJlIGlzIG5vIHN0YXRpYyByZXN0cmljdGlvbnMgc2V0IHRvIGZhbHNlXG5cdC8vXHRcdC0gYW5kIGVuYWJsZU1hc3NFZGl0IGlzIG5vdCBzZXQgdG8gZmFsc2UgaW50byB0aGUgbWFuaWZlc3Rcblx0Ly9cdFx0LSBhbmQgdGhlIHNlbGVjdGlvbk1vZGUgaXMgcmVsZXZhbnRcblx0Ly9cdFRoZW4gTWFzc0VkaXQgaXMgYWx3YXlzIHZpc2libGUgaW4gTFIgb3IgZHluYW1pY2FsbHkgdmlzaWJsZSBpbiBPUCBhY2NvcmRpbmcgdG8gdWk+RWRpdGFibGUgYW5kIGhpZGRlbkFubm90YXRpb25cblx0Ly8gIEJ1dHRvbiBpcyBoaWRkZW4gZm9yIGFsbCBvdGhlciBjYXNlc1xuXHRyZXR1cm4gaWZFbHNlKFxuXHRcdGFuZChub3QoYW5kKGlzQ29uc3RhbnQocGF0aFVwZGF0YWJsZUV4cHJlc3Npb24pLCBlcXVhbChwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbiwgZmFsc2UpKSksIGJNYXNzRWRpdEVuYWJsZWRJbk1hbmlmZXN0KSxcblx0XHRhbmQodGVtcGxhdGVCaW5kaW5nRXhwcmVzc2lvbiwgbm90KGlzVXBkYXRlSGlkZGVuKSksXG5cdFx0ZmFsc2Vcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBhY3Rpb24gQ3JlYXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGNyZWF0ZVZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0ZUVuYWJsZW1lbnQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGNyZWF0ZVZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0luc2VydGFibGUgPSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc0luc2VydGFibGUuZXhwcmVzc2lvbjtcblx0Y29uc3QgQ29sbGVjdGlvblR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LnJlc29sdmVBYnNvbHV0ZVBhdGg8YW55PihzdGFuZGFyZEFjdGlvbnNDb250ZXh0LmNvbGxlY3Rpb25QYXRoKS50YXJnZXQ/Ll90eXBlO1xuXHRyZXR1cm4gYW5kKFxuXHRcdGNyZWF0ZVZpc2liaWxpdHksXG5cdFx0aWZFbHNlKFxuXHRcdFx0Q29sbGVjdGlvblR5cGUgPT09IFwiRW50aXR5U2V0XCIsXG5cdFx0XHR0cnVlLFxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZSxcblx0XHRcdFx0aXNJbnNlcnRhYmxlLFxuXHRcdFx0XHRhbmQoaXNJbnNlcnRhYmxlLCBlcXVhbChiaW5kaW5nRXhwcmVzc2lvbihcIi9lZGl0TW9kZVwiLCBcInVpXCIpLCBcIkVkaXRhYmxlXCIpKVxuXHRcdFx0KVxuXHRcdClcblx0KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBhY3Rpb24gRGVsZXRlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtTdGFuZGFyZEFjdGlvbnNDb250ZXh0fSBzdGFuZGFyZEFjdGlvbnNDb250ZXh0XG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IGRlbGV0ZVZpc2liaWxpdHlcbiAqIEByZXR1cm5zIHtFeHByZXNzaW9uPGJvb2xlYW4+IH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGV0ZUVuYWJsZW1lbnQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdGRlbGV0ZVZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj5cbik6IEV4cHJlc3Npb248Ym9vbGVhbj4ge1xuXHRjb25zdCBpc0RlbGV0YWJsZSA9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzRGVsZXRhYmxlLmV4cHJlc3Npb247XG5cdGNvbnN0IGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkgPVxuXHRcdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQucmVzdHJpY3Rpb25zLmlzRGVsZXRhYmxlLmlzT25seUN1cnJlbnRFbnRpdHlFeHByZXNzaW9uICYmICFpc0NvbnN0YW50KGlzRGVsZXRhYmxlKTtcblx0Y29uc3QgbnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzID0gYmluZGluZ0V4cHJlc3Npb24oXCJudW1iZXJPZlNlbGVjdGVkQ29udGV4dHNcIiwgXCJpbnRlcm5hbFwiKTtcblx0Y29uc3QgbnVtYmVyT2ZEZWxldGFibGVDb250ZXh0cyA9IGJpbmRpbmdFeHByZXNzaW9uKFwiZGVsZXRhYmxlQ29udGV4dHNcIiwgXCJpbnRlcm5hbFwiKTtcblx0Y29uc3QgbnVtYmVyT2ZVblNhdmVkQ29udGV4dHMgPSBiaW5kaW5nRXhwcmVzc2lvbihcInVuU2F2ZWRDb250ZXh0c1wiLCBcImludGVybmFsXCIpO1xuXG5cdHJldHVybiBhbmQoXG5cdFx0ZGVsZXRlVmlzaWJpbGl0eSxcblx0XHRpZkVsc2UoXG5cdFx0XHRvcihjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpICE9PSBUZW1wbGF0ZVR5cGUuT2JqZWN0UGFnZSwgaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSksXG5cdFx0XHRpZkVsc2UoXG5cdFx0XHRcdG9yKFxuXHRcdFx0XHRcdGFuZChub3RFcXVhbChudW1iZXJPZkRlbGV0YWJsZUNvbnRleHRzLCB1bmRlZmluZWQpLCBncmVhdGVyVGhhbihsZW5ndGgobnVtYmVyT2ZEZWxldGFibGVDb250ZXh0cyksIDApKSxcblx0XHRcdFx0XHRhbmQobm90RXF1YWwobnVtYmVyT2ZVblNhdmVkQ29udGV4dHMsIHVuZGVmaW5lZCksIGdyZWF0ZXJUaGFuKGxlbmd0aChudW1iZXJPZlVuU2F2ZWRDb250ZXh0cyksIDApKVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRiaW5kaW5nRXhwcmVzc2lvbihcImRlbGV0ZUVuYWJsZWRcIiwgXCJpbnRlcm5hbFwiKSxcblx0XHRcdFx0ZmFsc2Vcblx0XHRcdCksXG5cdFx0XHRhbmQobm90RXF1YWwobnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzLCAwKSwgaXNEZWxldGFibGUpXG5cdFx0KVxuXHQpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIHByb3BlcnR5IGVuYWJsZWQgb2YgdGhlIGFjdGlvbiBQYXN0ZS5cbiAqXG4gKiBAcGFyYW0ge0V4cHJlc3Npb248Ym9vbGVhbj59IHBhc3RlVmlzaWJpbGl0eVxuICogQHBhcmFtIHtFeHByZXNzaW9uPGJvb2xlYW4+fSBjcmVhdGVFbmFibGVtZW50XG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXN0ZUVuYWJsZW1lbnQocGFzdGVWaXNpYmlsaXR5OiBFeHByZXNzaW9uPGJvb2xlYW4+LCBjcmVhdGVFbmFibGVtZW50OiBFeHByZXNzaW9uPGJvb2xlYW4+KTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdHJldHVybiBhbmQocGFzdGVWaXNpYmlsaXR5LCBjcmVhdGVFbmFibGVtZW50KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBwcm9wZXJ0eSBlbmFibGVkIG9mIHRoZSBhY3Rpb24gTWFzc0VkaXQuXG4gKlxuICogQHBhcmFtIHtDb252ZXJ0ZXJDb250ZXh0fSBjb252ZXJ0ZXJDb250ZXh0XG4gKiBAcGFyYW0ge1N0YW5kYXJkQWN0aW9uc0NvbnRleHR9IHN0YW5kYXJkQWN0aW9uc0NvbnRleHRcbiAqIEBwYXJhbSB7RXhwcmVzc2lvbjxib29sZWFuPn0gbWFzc0VkaXRWaXNpYmlsaXR5XG4gKiBAcmV0dXJucyB7RXhwcmVzc2lvbjxib29sZWFuPiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXNzRWRpdEVuYWJsZW1lbnQoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdHN0YW5kYXJkQWN0aW9uc0NvbnRleHQ6IFN0YW5kYXJkQWN0aW9uc0NvbnRleHQsXG5cdG1hc3NFZGl0VmlzaWJpbGl0eTogRXhwcmVzc2lvbjxib29sZWFuPlxuKTogRXhwcmVzc2lvbjxib29sZWFuPiB7XG5cdGNvbnN0IHBhdGhVcGRhdGFibGVFeHByZXNzaW9uID0gc3RhbmRhcmRBY3Rpb25zQ29udGV4dC5yZXN0cmljdGlvbnMuaXNVcGRhdGFibGUuZXhwcmVzc2lvbjtcblx0Y29uc3QgaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eTogYW55ID1cblx0XHRzdGFuZGFyZEFjdGlvbnNDb250ZXh0LnJlc3RyaWN0aW9ucy5pc1VwZGF0YWJsZS5pc09ubHlDdXJyZW50RW50aXR5RXhwcmVzc2lvbiAmJiAhaXNDb25zdGFudChwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbik7XG5cdGNvbnN0IG51bWJlck9mU2VsZWN0ZWRDb250ZXh0cyA9IGdyZWF0ZXJPckVxdWFsKGJpbmRpbmdFeHByZXNzaW9uKFwibnVtYmVyT2ZTZWxlY3RlZENvbnRleHRzXCIsIFwiaW50ZXJuYWxcIiksIDEpO1xuXHRjb25zdCBudW1iZXJPZlVwZGF0YWJsZUNvbnRleHRzID0gZ3JlYXRlck9yRXF1YWwobGVuZ3RoKGJpbmRpbmdFeHByZXNzaW9uKFwidXBkYXRhYmxlQ29udGV4dHNcIiwgXCJpbnRlcm5hbFwiKSksIDEpO1xuXHRjb25zdCBiSXNEcmFmdFN1cHBvcnRlZCA9IGlzRHJhZnRTdXBwb3J0ZWQoY29udmVydGVyQ29udGV4dCk7XG5cdGNvbnN0IGJEaXNwbGF5TW9kZSA9IGlzSW5EaXNwbGF5TW9kZShjb252ZXJ0ZXJDb250ZXh0KTtcblxuXHQvLyBudW1iZXJPZlVwZGF0YWJsZUNvbnRleHRzIG5lZWRzIHRvIGJlIGFkZGVkIHRvIHRoZSBiaW5kaW5nIGluIGNhc2Vcblx0Ly8gMS4gVXBkYXRlIGlzIGRlcGVuZGVudCBvbiBjdXJyZW50IGVudGl0eSBwcm9wZXJ0eSAoaXNPbmx5RHluYW1pY09uQ3VycmVudEVudGl0eSBpcyB0cnVlKS5cblx0Ly8gMi4gVGhlIHRhYmxlIGlzIHJlYWQgb25seSBhbmQgZHJhZnQgZW5hYmxlZChsaWtlIExSKSwgaW4gdGhpcyBjYXNlIG9ubHkgYWN0aXZlIGNvbnRleHRzIGNhbiBiZSBtYXNzIGVkaXRlZC5cblx0Ly8gICAgU28sIHVwZGF0ZSBkZXBlbmRzIG9uICdJc0FjdGl2ZUVudGl0eScgdmFsdWUgd2hpY2ggbmVlZHMgdG8gYmUgY2hlY2tlZCBydW50aW1lLlxuXHRjb25zdCBydW50aW1lQmluZGluZyA9IGlmRWxzZShcblx0XHRvcihhbmQoYkRpc3BsYXlNb2RlLCBiSXNEcmFmdFN1cHBvcnRlZCksIGlzT25seUR5bmFtaWNPbkN1cnJlbnRFbnRpdHkpLFxuXHRcdGFuZChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMsIG51bWJlck9mVXBkYXRhYmxlQ29udGV4dHMpLFxuXHRcdGFuZChudW1iZXJPZlNlbGVjdGVkQ29udGV4dHMpXG5cdCk7XG5cblx0cmV0dXJuIGFuZChtYXNzRWRpdFZpc2liaWxpdHksIGlmRWxzZShpc09ubHlEeW5hbWljT25DdXJyZW50RW50aXR5LCBydW50aW1lQmluZGluZywgYW5kKHJ1bnRpbWVCaW5kaW5nLCBwYXRoVXBkYXRhYmxlRXhwcmVzc2lvbikpKTtcbn1cblxuLyoqXG4gKiBUZWxscyBpZiB0aGUgdGFibGUgaW4gdGVtcGxhdGUgaXMgaW4gZGlzcGxheSBtb2RlLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dFxuICogQHBhcmFtIHtWaWV3UGF0aENvbmZpZ3VyYXRpb259IHZpZXdDb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5EaXNwbGF5TW9kZShjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LCB2aWV3Q29uZmlndXJhdGlvbj86IFZpZXdQYXRoQ29uZmlndXJhdGlvbik6IGJvb2xlYW4ge1xuXHRjb25zdCB0ZW1wbGF0ZVR5cGUgPSBjb252ZXJ0ZXJDb250ZXh0LmdldFRlbXBsYXRlVHlwZSgpO1xuXHRpZiAoXG5cdFx0dGVtcGxhdGVUeXBlID09PSBUZW1wbGF0ZVR5cGUuTGlzdFJlcG9ydCB8fFxuXHRcdHRlbXBsYXRlVHlwZSA9PT0gVGVtcGxhdGVUeXBlLkFuYWx5dGljYWxMaXN0UGFnZSB8fFxuXHRcdCh2aWV3Q29uZmlndXJhdGlvbiAmJiBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmhhc011bHRpcGxlVmlzdWFsaXphdGlvbnModmlld0NvbmZpZ3VyYXRpb24pKVxuXHQpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXHQvLyB1cGRhdGFibGUgd2lsbCBiZSBoYW5kbGVkIGF0IHRoZSBwcm9wZXJ0eSBsZXZlbFxuXHRyZXR1cm4gZmFsc2U7XG59XG4iXX0=
|