@sapui5/sap.fe.core 1.98.0 → 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 +3 -2
- 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 +3 -2
- package/src/sap/fe/core/AppStateHandler.js +229 -181
- 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 -2399
- package/src/sap/fe/core/CommonUtils.ts +2078 -0
- package/src/sap/fe/core/ExtensionAPI.js +3 -2
- package/src/sap/fe/core/PageController.js +84 -125
- package/src/sap/fe/core/PageController.ts +101 -0
- package/src/sap/fe/core/RouterProxy.js +986 -823
- 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 -164
- 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 -1664
- package/src/sap/fe/core/TransactionHelper.ts +1706 -0
- package/src/sap/fe/core/actions/draft.js +559 -608
- package/src/sap/fe/core/actions/draft.ts +593 -0
- package/src/sap/fe/core/actions/messageHandling.js +545 -514
- 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 -1215
- 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 +54 -211
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -2
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +279 -11
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +8 -6
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +47 -45
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +2 -3
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +29 -26
- package/src/sap/fe/core/controllerextensions/MassEdit.js +101 -8
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +17 -8
- package/src/sap/fe/core/controllerextensions/PageReady.js +2 -2
- package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
- package/src/sap/fe/core/controllerextensions/Paginator.js +3 -2
- package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -2
- package/src/sap/fe/core/controllerextensions/Routing.js +9 -4
- 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 +3 -3
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +18 -18
- package/src/sap/fe/core/controllerextensions/ViewState.js +3 -2
- 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 +3 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +3 -2
- package/src/sap/fe/core/controls/FieldWrapper.js +11 -22
- package/src/sap/fe/core/controls/FilterBar.js +3 -2
- package/src/sap/fe/core/controls/FormElementWrapper.js +3 -2
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -2
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -0
- 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/MassEditHandlers.js +3 -2
- package/src/sap/fe/core/converters/ConverterContext.js +2 -2
- package/src/sap/fe/core/converters/ConverterContext.ts +4 -3
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +1 -0
- package/src/sap/fe/core/converters/ManifestWrapper.js +39 -26
- package/src/sap/fe/core/converters/ManifestWrapper.ts +9 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +11 -8
- package/src/sap/fe/core/converters/MetaModelConverter.ts +16 -16
- 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/common/AnnotationConverter.js +17 -13
- package/src/sap/fe/core/converters/controls/Common/Action.js +2 -2
- package/src/sap/fe/core/converters/controls/Common/Action.ts +2 -2
- package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
- package/src/sap/fe/core/converters/controls/Common/Form.js +4 -2
- package/src/sap/fe/core/converters/controls/Common/Form.ts +16 -2
- package/src/sap/fe/core/converters/controls/Common/Table.js +250 -146
- package/src/sap/fe/core/converters/controls/Common/Table.ts +300 -167
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +115 -56
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +120 -74
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +467 -32
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +483 -54
- 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 +13 -5
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +20 -5
- package/src/sap/fe/core/converters/helpers/IssueManager.js +4 -1
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +3 -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 +13 -6
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +26 -15
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -2
- 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 +39 -28
- package/src/sap/fe/core/formatters/TableFormatter.ts +43 -28
- package/src/sap/fe/core/formatters/ValueFormatter.js +1 -1
- package/src/sap/fe/core/formatters/ValueFormatter.ts +7 -6
- package/src/sap/fe/core/fpm/Component.js +3 -2
- package/src/sap/fe/core/helpers/AppStartupHelper.js +2 -2
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +7 -4
- package/src/sap/fe/core/helpers/BindingExpression.js +314 -355
- package/src/sap/fe/core/helpers/BindingExpression.ts +317 -391
- 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 +3 -4
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +9 -9
- package/src/sap/fe/core/helpers/MassEditHelper.js +27 -18
- package/src/sap/fe/core/helpers/ModelHelper.js +229 -225
- 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 +4 -3
- package/src/sap/fe/core/library.support.js +3 -2
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +1 -1
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +1 -1
- package/src/sap/fe/core/messagebundle.properties +23 -10
- package/src/sap/fe/core/messagebundle_ar.properties +9 -0
- package/src/sap/fe/core/messagebundle_bg.properties +9 -0
- package/src/sap/fe/core/messagebundle_ca.properties +9 -0
- package/src/sap/fe/core/messagebundle_cs.properties +10 -1
- package/src/sap/fe/core/messagebundle_cy.properties +9 -0
- package/src/sap/fe/core/messagebundle_da.properties +9 -0
- package/src/sap/fe/core/messagebundle_de.properties +9 -0
- package/src/sap/fe/core/messagebundle_el.properties +9 -0
- package/src/sap/fe/core/messagebundle_en.properties +9 -0
- package/src/sap/fe/core/messagebundle_en_GB.properties +9 -0
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +9 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +9 -0
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +9 -0
- package/src/sap/fe/core/messagebundle_es.properties +9 -0
- package/src/sap/fe/core/messagebundle_es_MX.properties +9 -0
- package/src/sap/fe/core/messagebundle_et.properties +9 -0
- package/src/sap/fe/core/messagebundle_fi.properties +9 -0
- package/src/sap/fe/core/messagebundle_fr.properties +13 -4
- package/src/sap/fe/core/messagebundle_fr_CA.properties +15 -6
- package/src/sap/fe/core/messagebundle_hi.properties +15 -6
- package/src/sap/fe/core/messagebundle_hr.properties +15 -6
- package/src/sap/fe/core/messagebundle_hu.properties +9 -0
- package/src/sap/fe/core/messagebundle_id.properties +10 -1
- package/src/sap/fe/core/messagebundle_it.properties +9 -0
- package/src/sap/fe/core/messagebundle_iw.properties +9 -0
- package/src/sap/fe/core/messagebundle_ja.properties +9 -0
- package/src/sap/fe/core/messagebundle_kk.properties +15 -6
- package/src/sap/fe/core/messagebundle_ko.properties +9 -0
- package/src/sap/fe/core/messagebundle_lt.properties +9 -0
- package/src/sap/fe/core/messagebundle_lv.properties +15 -6
- package/src/sap/fe/core/messagebundle_ms.properties +14 -5
- package/src/sap/fe/core/messagebundle_nl.properties +9 -0
- package/src/sap/fe/core/messagebundle_no.properties +9 -0
- package/src/sap/fe/core/messagebundle_pl.properties +9 -0
- package/src/sap/fe/core/messagebundle_pt.properties +9 -0
- package/src/sap/fe/core/messagebundle_pt_PT.properties +9 -0
- package/src/sap/fe/core/messagebundle_ro.properties +9 -0
- package/src/sap/fe/core/messagebundle_ru.properties +9 -0
- package/src/sap/fe/core/messagebundle_sh.properties +11 -2
- package/src/sap/fe/core/messagebundle_sk.properties +9 -0
- package/src/sap/fe/core/messagebundle_sl.properties +15 -6
- package/src/sap/fe/core/messagebundle_sv.properties +9 -0
- package/src/sap/fe/core/messagebundle_th.properties +9 -0
- package/src/sap/fe/core/messagebundle_tr.properties +9 -0
- package/src/sap/fe/core/messagebundle_uk.properties +9 -0
- package/src/sap/fe/core/messagebundle_vi.properties +9 -0
- package/src/sap/fe/core/messagebundle_zh_CN.properties +9 -0
- package/src/sap/fe/core/messagebundle_zh_TW.properties +15 -6
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
- 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 +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +7 -6
- 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 -899
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
- package/src/sap/fe/core/services/ShellServicesFactory.js +1 -1
- package/src/sap/fe/core/services/ShellServicesFactory.ts +15 -10
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +35 -81
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +46 -94
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +461 -487
- 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/templating/FieldControlHelper.js +8 -8
- package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
- package/src/sap/fe/core/templating/FilterHelper.js +138 -72
- package/src/sap/fe/core/templating/FilterHelper.ts +139 -71
- package/src/sap/fe/core/templating/UIFormatters.js +31 -1
- package/src/sap/fe/core/templating/UIFormatters.ts +33 -2
- 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
|
@@ -1,610 +1,561 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* SAPUI5
|
|
3
|
-
*
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
? mParam.fnAfterActivateDocument(oContext, oActiveDocumentContext)
|
|
562
|
-
: oActiveDocumentContext
|
|
563
|
-
);
|
|
564
|
-
})
|
|
565
|
-
.catch(function(exc) {
|
|
566
|
-
return Promise.reject(exc);
|
|
567
|
-
});
|
|
568
|
-
}
|
|
569
|
-
|
|
570
|
-
/**
|
|
571
|
-
* HTTP POST call when DraftAction is present for Draft Delete; HTTP DELETE for Draft(when no DraftAction)
|
|
572
|
-
* and Active Instance uses DELETE always.
|
|
573
|
-
*
|
|
574
|
-
* @function
|
|
575
|
-
* @name sap.fe.core.actions.draft#deleteDraft
|
|
576
|
-
* @memberof sap.fe.core.actions.draft
|
|
577
|
-
* @static
|
|
578
|
-
* @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be discarded
|
|
579
|
-
* @private
|
|
580
|
-
* @returns {Promise}
|
|
581
|
-
* @ui5-restricted
|
|
582
|
-
*/
|
|
583
|
-
function deleteDraft(oContext) {
|
|
584
|
-
var sDiscardAction = getActionName(oContext, draftOperations.DISCARD),
|
|
585
|
-
bIsActiveEntity = oContext.getObject().IsActiveEntity;
|
|
586
|
-
|
|
587
|
-
if (bIsActiveEntity || (!bIsActiveEntity && !sDiscardAction)) {
|
|
588
|
-
//Use Delete in case of active entity and no discard action available for draft
|
|
589
|
-
if (oContext.hasPendingChanges()) {
|
|
590
|
-
oContext
|
|
591
|
-
.getBinding()
|
|
592
|
-
.resetChanges()
|
|
593
|
-
.then(function() {
|
|
594
|
-
return oContext.delete();
|
|
595
|
-
})
|
|
596
|
-
.catch(function(error) {
|
|
597
|
-
return Promise.reject(error);
|
|
598
|
-
});
|
|
599
|
-
} else {
|
|
600
|
-
return oContext.delete();
|
|
601
|
-
}
|
|
602
|
-
} else {
|
|
603
|
-
//Use Discard Post Action if it is a draft entity and discard action exists
|
|
604
|
-
return executeDraftDiscardAction(oContext);
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
return draft;
|
|
609
|
-
}
|
|
610
|
-
);
|
|
5
|
+
sap.ui.define(["sap/m/Dialog", "sap/m/Button", "sap/m/Text", "sap/m/MessageBox", "sap/fe/core/actions/messageHandling", "sap/fe/core/CommonUtils", "sap/base/Log"], function (Dialog, Button, Text, MessageBox, messageHandling, CommonUtils, Log) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Interface for callbacks used in the functions
|
|
10
|
+
*
|
|
11
|
+
*
|
|
12
|
+
* @author SAP SE
|
|
13
|
+
* @since 1.54.0
|
|
14
|
+
* @interface
|
|
15
|
+
* @name sap.fe.core.actions.draft.ICallback
|
|
16
|
+
* @private
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Callback to approve or reject the creation of a draft
|
|
21
|
+
* @name sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument
|
|
22
|
+
* @function
|
|
23
|
+
* @static
|
|
24
|
+
* @abstract
|
|
25
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
|
|
26
|
+
* @returns {(boolean|Promise)} Approval of draft creation [true|false] or Promise that resolves with the boolean value
|
|
27
|
+
*
|
|
28
|
+
* @private
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Callback after a draft was successully created
|
|
33
|
+
* @name sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument
|
|
34
|
+
* @function
|
|
35
|
+
* @static
|
|
36
|
+
* @abstract
|
|
37
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context of the new draft
|
|
38
|
+
* @param {sap.ui.model.odata.v4.Context} oActiveDocumentContext Context of the active document for the new draft
|
|
39
|
+
* @returns {sap.ui.model.odata.v4.Context} oActiveDocumentContext
|
|
40
|
+
*
|
|
41
|
+
* @private
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Callback to approve or reject overwriting an unsaved draft of another user
|
|
46
|
+
* @name sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired
|
|
47
|
+
* @function
|
|
48
|
+
* @public
|
|
49
|
+
* @static
|
|
50
|
+
* @abstract
|
|
51
|
+
*
|
|
52
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
|
|
53
|
+
* @returns {(boolean|Promise)} Approval to overwrite unsaved draft [true|false] or Promise that resolves with the boolean value
|
|
54
|
+
*
|
|
55
|
+
* @ui5-restricted
|
|
56
|
+
*/
|
|
57
|
+
|
|
58
|
+
/* Constants for draft operations */
|
|
59
|
+
var draftOperations = {
|
|
60
|
+
EDIT: "EditAction",
|
|
61
|
+
ACTIVATION: "ActivationAction",
|
|
62
|
+
DISCARD: "DiscardAction",
|
|
63
|
+
PREPARE: "PreparationAction"
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Static functions for the draft programming model
|
|
67
|
+
*
|
|
68
|
+
* @namespace
|
|
69
|
+
* @alias sap.fe.core.actions.draft
|
|
70
|
+
* @private
|
|
71
|
+
* @experimental This module is only for experimental use! <br/><b>This is only a POC and maybe deleted</b>
|
|
72
|
+
* @since 1.54.0
|
|
73
|
+
*/
|
|
74
|
+
|
|
75
|
+
var draft = {
|
|
76
|
+
createDraftFromActiveDocument: createDraftFromActiveDocument,
|
|
77
|
+
activateDocument: activateDocument,
|
|
78
|
+
deleteDraft: deleteDraft
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Determines action name for a draft operation.
|
|
82
|
+
*
|
|
83
|
+
* @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
|
|
84
|
+
* @param {string} sOperation The operation name
|
|
85
|
+
* @returns {string} The name of the draft operation
|
|
86
|
+
*/
|
|
87
|
+
|
|
88
|
+
function getActionName(oContext, sOperation) {
|
|
89
|
+
var oModel = oContext.getModel(),
|
|
90
|
+
oMetaModel = oModel.getMetaModel(),
|
|
91
|
+
sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
|
|
92
|
+
return oMetaModel.getObject(sEntitySetPath + "@com.sap.vocabularies.Common.v1.DraftRoot/" + sOperation);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Creates an operation context binding for the given context and operation.
|
|
96
|
+
*
|
|
97
|
+
* @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
|
|
98
|
+
* @param {string} sOperation The operation (action or function import)
|
|
99
|
+
* @param oOptions Options to create the operation context
|
|
100
|
+
* @returns {sap.ui.model.odata.v4.ODataContextBinding} The context binding of the bound operation
|
|
101
|
+
*/
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
function createOperation(oContext, sOperation, oOptions) {
|
|
105
|
+
var sOperationName = getActionName(oContext, sOperation);
|
|
106
|
+
return oContext.getModel().bindContext(sOperationName + "(...)", oContext, oOptions);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check if optional draft prepare action exists.
|
|
110
|
+
*
|
|
111
|
+
* @param {sap.ui.model.odata.v4.Context} oContext The context that should be bound to the operation
|
|
112
|
+
* @returns {boolean} True if a a prepare action exists
|
|
113
|
+
*/
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
function hasPrepareAction(oContext) {
|
|
117
|
+
return !!getActionName(oContext, draftOperations.PREPARE);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Creates a new draft from an active document.
|
|
121
|
+
*
|
|
122
|
+
* @function
|
|
123
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
|
|
124
|
+
* @param {boolean} bPreserveChanges If true - existing changes from another user that are not locked are preserved and an error message (http status 409) is send from the backend, otherwise false - existing changes from another user that are not locked are overwritten</li>
|
|
125
|
+
* @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
|
|
126
|
+
* @private
|
|
127
|
+
* @ui5-restricted
|
|
128
|
+
*/
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
function executeDraftEditAction(oContext, bPreserveChanges) {
|
|
132
|
+
if (oContext.getProperty("IsActiveEntity")) {
|
|
133
|
+
var oOptions = {
|
|
134
|
+
$$inheritExpandSelect: true
|
|
135
|
+
};
|
|
136
|
+
var oOperation = createOperation(oContext, draftOperations.EDIT, oOptions);
|
|
137
|
+
oOperation.setParameter("PreserveChanges", bPreserveChanges);
|
|
138
|
+
var sGroupId = "direct";
|
|
139
|
+
var oEditPromise = oOperation.execute(sGroupId).then(function (oDraftDocumentContext) {
|
|
140
|
+
return oDraftDocumentContext;
|
|
141
|
+
});
|
|
142
|
+
oOperation.getModel().submitBatch(sGroupId);
|
|
143
|
+
return oEditPromise;
|
|
144
|
+
} else {
|
|
145
|
+
throw new Error("You cannot edit this draft document");
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/*function fnOnStrictHandlingFailed(oContext: any, sGroupId: any, aMessages: any) { //Will uncomment this function in the commit : 5513510
|
|
149
|
+
if (aMessages.length === 1) {
|
|
150
|
+
const sMessage = aMessages[0].message,
|
|
151
|
+
dialogPromise = new Promise(function(resolve: (value: any) => void) {
|
|
152
|
+
sap.ui.require(["sap/m/MessageBox"], function(MessageBox: any) {
|
|
153
|
+
MessageBox.warning(sMessage, {
|
|
154
|
+
title: "Warning",
|
|
155
|
+
actions: [MessageBox.Action.OK, MessageBox.Action.CANCEL],
|
|
156
|
+
onClose: function(sAction: any) {
|
|
157
|
+
if (sAction === MessageBox.Action.OK) {
|
|
158
|
+
resolve(true);
|
|
159
|
+
oContext.getModel().submitBatch(sGroupId);
|
|
160
|
+
} else {
|
|
161
|
+
resolve(false);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
return dialogPromise;
|
|
168
|
+
}
|
|
169
|
+
}*/
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Activates a draft document. The draft will replace the sibling entity and will be deleted by the back end.
|
|
173
|
+
*
|
|
174
|
+
* @function
|
|
175
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
|
|
176
|
+
* @param {object} oAppComponent The AppComponent
|
|
177
|
+
* @param {string} [sGroupId] The optional batch group in which the operation is to be executed
|
|
178
|
+
* @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
|
|
179
|
+
* @private
|
|
180
|
+
* @ui5-restricted
|
|
181
|
+
*/
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
function executeDraftActivationAction(oContext, oAppComponent, sGroupId) {
|
|
185
|
+
var bHasPrepareAction = hasPrepareAction(oContext); // According to the draft spec if the service contains a prepare action and we trigger both prepare and
|
|
186
|
+
// activate in one $batch the activate action is called with iF-Match=*
|
|
187
|
+
|
|
188
|
+
var bIgnoreEtag = bHasPrepareAction;
|
|
189
|
+
|
|
190
|
+
if (!oContext.getProperty("IsActiveEntity")) {
|
|
191
|
+
var oOperation = createOperation(oContext, draftOperations.ACTIVATION, {
|
|
192
|
+
$$inheritExpandSelect: true
|
|
193
|
+
});
|
|
194
|
+
return oOperation.execute(sGroupId, bIgnoreEtag).then(function (oActiveDocumentContext) {
|
|
195
|
+
return oActiveDocumentContext;
|
|
196
|
+
}).catch( //if ACTIVATE action fails then we request either the sideEffects against PREPARE action (if annotated) or the messages as fallback:
|
|
197
|
+
function () {
|
|
198
|
+
if (bHasPrepareAction) {
|
|
199
|
+
var sActionName = getActionName(oContext, draftOperations.PREPARE),
|
|
200
|
+
oSideEffectsService = oAppComponent.getSideEffectsService(),
|
|
201
|
+
oBindingParameters = oSideEffectsService.getODataActionSideEffects(sActionName, oContext),
|
|
202
|
+
aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
|
|
203
|
+
|
|
204
|
+
if (aTargetPaths && aTargetPaths.length > 0) {
|
|
205
|
+
oSideEffectsService.requestSideEffects(aTargetPaths, oContext).catch(function (oError) {
|
|
206
|
+
Log.error("Error while requesting side effects", oError);
|
|
207
|
+
});
|
|
208
|
+
} else {
|
|
209
|
+
requestMessages(oContext, oSideEffectsService).catch(function (oError) {
|
|
210
|
+
Log.error("Error while requesting messages", oError);
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return Promise.reject();
|
|
216
|
+
});
|
|
217
|
+
} else {
|
|
218
|
+
throw new Error("The activation action cannot be executed on an active document");
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Execute a preparation action.
|
|
223
|
+
*
|
|
224
|
+
* @function
|
|
225
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
|
|
226
|
+
* @param {object} oAppComponent The AppComponent
|
|
227
|
+
* @param {object} mParameters The parameters
|
|
228
|
+
* @param {boolean} [mParameters.groupId] The optional batch group where we want to execute the operation in
|
|
229
|
+
* @param {boolean} [mParameters.bPrepareForEdit] Shall the messages be requested if supported by service
|
|
230
|
+
* @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
|
|
231
|
+
* @private
|
|
232
|
+
* @ui5-restricted
|
|
233
|
+
*/
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
function executeDraftPreparationAction(oContext, oAppComponent, mParameters) {
|
|
237
|
+
var mParams = mParameters || {};
|
|
238
|
+
|
|
239
|
+
if (!oContext.getProperty("IsActiveEntity")) {
|
|
240
|
+
var oOperation = createOperation(oContext, draftOperations.PREPARE); // TODO: side effects qualifier shall be even deprecated to be checked
|
|
241
|
+
|
|
242
|
+
oOperation.setParameter("SideEffectsQualifier", "");
|
|
243
|
+
var sGroupId = mParams.groupId || oOperation.getGroupId();
|
|
244
|
+
var oPreparationPromise = oOperation.execute(sGroupId).then(function () {
|
|
245
|
+
if (mParams.bPrepareForEdit) {
|
|
246
|
+
// if PREPARE action is triggered after Edit then either the sideEffects (if annotated against PREPARE) are executed or the messages are requested as fallback if no sideEffects:
|
|
247
|
+
var sActionName = getActionName(oContext, draftOperations.PREPARE),
|
|
248
|
+
oSideEffectsService = oAppComponent.getSideEffectsService(),
|
|
249
|
+
oBindingParameters = oSideEffectsService.getODataActionSideEffects(sActionName, oContext),
|
|
250
|
+
aTargetPaths = oBindingParameters && oBindingParameters.pathExpressions;
|
|
251
|
+
|
|
252
|
+
if (aTargetPaths && aTargetPaths.length > 0) {
|
|
253
|
+
oSideEffectsService.requestSideEffects(aTargetPaths, oContext, sGroupId).catch(function (oError) {
|
|
254
|
+
Log.error("Error while requesting side effects", oError);
|
|
255
|
+
});
|
|
256
|
+
} else {
|
|
257
|
+
requestMessages(oContext, oSideEffectsService);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return oOperation;
|
|
262
|
+
}).catch(function (oError) {
|
|
263
|
+
Log.error("Error while executing the operation", oError);
|
|
264
|
+
});
|
|
265
|
+
return oPreparationPromise;
|
|
266
|
+
} else {
|
|
267
|
+
throw new Error("The preparation action cannot be executed on an active document");
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Determines the message path for a context.
|
|
272
|
+
*
|
|
273
|
+
* @function
|
|
274
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context for which the path shall be determined
|
|
275
|
+
* @returns {string} Message path, empty if not annotated
|
|
276
|
+
* @private
|
|
277
|
+
* @ui5-restricted
|
|
278
|
+
*/
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
function getMessagesPath(oContext) {
|
|
282
|
+
var oModel = oContext.getModel(),
|
|
283
|
+
oMetaModel = oModel.getMetaModel(),
|
|
284
|
+
sEntitySetPath = oMetaModel.getMetaPath(oContext.getPath());
|
|
285
|
+
return oMetaModel.getObject(sEntitySetPath + "/@com.sap.vocabularies.Common.v1.Messages/$Path");
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Requests the messages if annotated for a given context.
|
|
289
|
+
*
|
|
290
|
+
* @function
|
|
291
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context for which the messages shall be requested
|
|
292
|
+
* @param {object} oSideEffectsService Service for the SideEffects on SAP Fiori elements
|
|
293
|
+
* @returns {Promise} Promise which is resolved once messages were requested
|
|
294
|
+
* @private
|
|
295
|
+
* @ui5-restricted
|
|
296
|
+
*/
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
function requestMessages(oContext, oSideEffectsService) {
|
|
300
|
+
var sMessagesPath = getMessagesPath(oContext);
|
|
301
|
+
|
|
302
|
+
if (sMessagesPath) {
|
|
303
|
+
return oSideEffectsService.requestSideEffects([{
|
|
304
|
+
$PropertyPath: sMessagesPath
|
|
305
|
+
}], oContext);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
return Promise.resolve();
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Executes discard of a draft function using HTTP Post.
|
|
312
|
+
*
|
|
313
|
+
* @function
|
|
314
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context for which the action should be performed
|
|
315
|
+
* @returns {Promise.<sap.ui.model.odata.v4.Context>} Resolve function returns the context of the operation
|
|
316
|
+
* @private
|
|
317
|
+
* @ui5-restricted
|
|
318
|
+
*/
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
function executeDraftDiscardAction(oContext) {
|
|
322
|
+
if (!oContext.getProperty("IsActiveEntity")) {
|
|
323
|
+
var oDiscardOperation = createOperation(oContext, draftOperations.DISCARD);
|
|
324
|
+
var oDiscardPromise = oDiscardOperation.execute("direct");
|
|
325
|
+
oContext.getModel().submitBatch("direct");
|
|
326
|
+
return oDiscardPromise;
|
|
327
|
+
} else {
|
|
328
|
+
throw new Error("The discard action cannot be executed on an active document");
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Creates a draft document from an existing document.
|
|
333
|
+
*
|
|
334
|
+
* The function supports several hooks as there is a certain coreography defined.
|
|
335
|
+
*
|
|
336
|
+
* @function
|
|
337
|
+
* @name sap.fe.core.actions.draft#createDraftFromActiveDocument
|
|
338
|
+
* @memberof sap.fe.core.actions.draft
|
|
339
|
+
* @static
|
|
340
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
|
|
341
|
+
* @param {object} oAppComponent The AppComponent
|
|
342
|
+
* @param {object} mParameters The parameters
|
|
343
|
+
* @param {boolean} [mParameters.oView] The view
|
|
344
|
+
* @param {boolean} [mParameters.bPreserveChanges] Preserve changes of an existing draft of another user
|
|
345
|
+
* @param {boolean} [mParameters.bPrepareOnEdit] Also call prepare when calling draft creation
|
|
346
|
+
* @param {sap.fe.core.actions.draft.ICallback.beforeCreateDraftFromActiveDocument} [mParameters.fnBeforeCreateDraftFromActiveDocument] Callback that allows veto before create request is executed
|
|
347
|
+
* @param {sap.fe.core.actions.draft.ICallback.afterCreateDraftFromActiveDocument} [mParameters.fnAfterCreateDraftFromActiveDocument] Callback for postprocessiong after draft document was created
|
|
348
|
+
* @param {sap.fe.core.actions.draft.ICallback.whenDecisionToOverwriteDocumentIsRequired} [mParameters.fnWhenDecisionToOverwriteDocumentIsRequired] Callback for deciding on overwriting an unsaved change by another user
|
|
349
|
+
* @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
|
|
350
|
+
* @private
|
|
351
|
+
* @ui5-restricted
|
|
352
|
+
*/
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
function createDraftFromActiveDocument(oContext, oAppComponent, mParameters) {
|
|
356
|
+
var mParam = mParameters || {},
|
|
357
|
+
localI18nRef = sap.ui.getCore().getLibraryResourceBundle("sap.fe.core"),
|
|
358
|
+
bRunPreserveChangesFlow = typeof mParam.bPreserveChanges === "undefined" || typeof mParam.bPreserveChanges === "boolean" && mParam.bPreserveChanges; //default true
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Overwrite or reject based on fnWhenDecisionToOverwriteDocumentIsRequired.
|
|
362
|
+
*
|
|
363
|
+
* @param {*} bOverwrite Overwrite the change or not
|
|
364
|
+
* @returns {Promise} Resolves with result of {@link sap.fe.core.actions#executeDraftEditAction}
|
|
365
|
+
*/
|
|
366
|
+
|
|
367
|
+
function overwriteOnDemand(bOverwrite) {
|
|
368
|
+
if (bOverwrite) {
|
|
369
|
+
//Overwrite existing changes
|
|
370
|
+
var oModel = oContext.getModel();
|
|
371
|
+
var draftDataContext = oModel.bindContext(oContext.getPath() + "/DraftAdministrativeData").getBoundContext();
|
|
372
|
+
var oResourceBundle;
|
|
373
|
+
return mParameters.oView.getModel("sap.fe.i18n").getResourceBundle().then(function (_oResourceBundle) {
|
|
374
|
+
oResourceBundle = _oResourceBundle;
|
|
375
|
+
return draftDataContext.requestObject();
|
|
376
|
+
}).then(function (draftAdminData) {
|
|
377
|
+
if (draftAdminData) {
|
|
378
|
+
// remove all unbound transition messages as we show a special dialog
|
|
379
|
+
messageHandling.removeUnboundTransitionMessages();
|
|
380
|
+
var sInfo = draftAdminData.InProcessByUserDescription || draftAdminData.InProcessByUser;
|
|
381
|
+
var sEntitySet = mParameters.oView.getViewData().entitySet;
|
|
382
|
+
|
|
383
|
+
if (sInfo) {
|
|
384
|
+
var sLockedByUserMsg = CommonUtils.getTranslatedText("C_DRAFT_OBJECT_PAGE_DRAFT_LOCKED_BY_USER", oResourceBundle, sInfo, sEntitySet);
|
|
385
|
+
MessageBox.error(sLockedByUserMsg);
|
|
386
|
+
throw new Error(sLockedByUserMsg);
|
|
387
|
+
} else {
|
|
388
|
+
sInfo = draftAdminData.CreatedByUserDescription || draftAdminData.CreatedByUser;
|
|
389
|
+
var sUnsavedChangesMsg = CommonUtils.getTranslatedText("C_DRAFT_OBJECT_PAGE_DRAFT_UNSAVED_CHANGES", oResourceBundle, sInfo, sEntitySet);
|
|
390
|
+
return showMessageBox(sUnsavedChangesMsg).then(function () {
|
|
391
|
+
return executeDraftEditAction(oContext, false);
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
return Promise.reject(new Error("Draft creation aborted for document: " + oContext.getPath()));
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
function showMessageBox(sUnsavedChangesMsg) {
|
|
402
|
+
return new Promise(function (resolve, reject) {
|
|
403
|
+
var oDialog = new Dialog({
|
|
404
|
+
title: localI18nRef.getText("C_DRAFT_OBJECT_PAGE_WARNING"),
|
|
405
|
+
state: "Warning",
|
|
406
|
+
content: new Text({
|
|
407
|
+
text: sUnsavedChangesMsg
|
|
408
|
+
}),
|
|
409
|
+
beginButton: new Button({
|
|
410
|
+
text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_EDIT"),
|
|
411
|
+
type: "Emphasized",
|
|
412
|
+
press: function () {
|
|
413
|
+
oDialog.close();
|
|
414
|
+
resolve(true);
|
|
415
|
+
}
|
|
416
|
+
}),
|
|
417
|
+
endButton: new Button({
|
|
418
|
+
text: localI18nRef.getText("C_COMMON_OBJECT_PAGE_CANCEL"),
|
|
419
|
+
press: function () {
|
|
420
|
+
oDialog.close();
|
|
421
|
+
reject("Draft creation aborted for document: " + oContext.getPath());
|
|
422
|
+
}
|
|
423
|
+
}),
|
|
424
|
+
afterClose: function () {
|
|
425
|
+
oDialog.destroy();
|
|
426
|
+
}
|
|
427
|
+
});
|
|
428
|
+
oDialog.addStyleClass("sapUiContentPadding");
|
|
429
|
+
oDialog.open();
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
if (!oContext) {
|
|
434
|
+
return Promise.reject(new Error("Binding context to active document is required"));
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
return Promise.resolve(mParam.fnBeforeCreateDraftFromActiveDocument ? mParam.fnBeforeCreateDraftFromActiveDocument(oContext, bRunPreserveChangesFlow) : true).then(function (bExecute) {
|
|
438
|
+
if (!bExecute) {
|
|
439
|
+
throw new Error("Draft creation was aborted by extension for document: " + oContext.getPath());
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
return executeDraftEditAction(oContext, bRunPreserveChangesFlow).catch(function (oResponse) {
|
|
443
|
+
//Only call back if error 409
|
|
444
|
+
if (bRunPreserveChangesFlow && oResponse.status === 409) {
|
|
445
|
+
return Promise.resolve(mParam.fnWhenDecisionToOverwriteDocumentIsRequired ? mParam.fnWhenDecisionToOverwriteDocumentIsRequired() : true).then(overwriteOnDemand);
|
|
446
|
+
} else {
|
|
447
|
+
throw new Error(oResponse);
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
}).then(function (oDraftContext) {
|
|
451
|
+
return Promise.resolve(mParam.fnAfterCreateDraftFromActiveDocument ? mParam.fnAfterCreateDraftFromActiveDocument(oContext, oDraftContext) : oDraftContext);
|
|
452
|
+
}).then(function (oDraftContext) {
|
|
453
|
+
if (mParam.bPrepareOnEdit && hasPrepareAction(oDraftContext)) {
|
|
454
|
+
return executeDraftPreparationAction(oDraftContext, oAppComponent, {
|
|
455
|
+
bPrepareForEdit: true
|
|
456
|
+
}).then(function () {
|
|
457
|
+
return oDraftContext;
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
return oDraftContext;
|
|
462
|
+
}).catch(function (exc) {
|
|
463
|
+
return Promise.reject(exc);
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* Creates an active document from a draft document.
|
|
468
|
+
*
|
|
469
|
+
* The function supports several hooks as there is a certain choreography defined.
|
|
470
|
+
*
|
|
471
|
+
* @function
|
|
472
|
+
* @name sap.fe.core.actions.draft#activateDocument
|
|
473
|
+
* @memberof sap.fe.core.actions.draft
|
|
474
|
+
* @static
|
|
475
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context of the active document for the new draft
|
|
476
|
+
* @param {object} oAppComponent The AppComponent
|
|
477
|
+
* @param {object} mParameters The parameters
|
|
478
|
+
* @param {sap.fe.core.actions.draft.ICallback.fnBeforeActivateDocument} [mParameters.fnBeforeActivateDocument] Callback that allows veto before create request is executed
|
|
479
|
+
* @param {sap.fe.core.actions.draft.ICallback.fnAfterActivateDocument} [mParameters.fnAfterActivateDocument] Callback for postprocessiong after document was activated.
|
|
480
|
+
* @returns {Promise} Promise resolves with the {@link sap.ui.model.odata.v4.Context context} of the new draft document
|
|
481
|
+
* @private
|
|
482
|
+
* @ui5-restricted
|
|
483
|
+
*/
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
function activateDocument(oContext, oAppComponent, mParameters) {
|
|
487
|
+
var mParam = mParameters || {};
|
|
488
|
+
|
|
489
|
+
if (!oContext) {
|
|
490
|
+
return Promise.reject(new Error("Binding context to draft document is required"));
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
return Promise.resolve(mParam.fnBeforeActivateDocument ? mParam.fnBeforeActivateDocument(oContext) : true).then(function (bExecute) {
|
|
494
|
+
if (!bExecute) {
|
|
495
|
+
return Promise.reject(new Error("Activation of the document was aborted by extension for document: " + oContext.getPath()));
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
if (!hasPrepareAction(oContext)) {
|
|
499
|
+
return executeDraftActivationAction(oContext, oAppComponent);
|
|
500
|
+
}
|
|
501
|
+
/* activation requires preparation */
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
var sBatchGroup = "draft"; // we use the same batchGroup to force prepare and activate in a same batch but with different changeset
|
|
505
|
+
|
|
506
|
+
var oPreparePromise = executeDraftPreparationAction(oContext, oAppComponent, {
|
|
507
|
+
groupId: sBatchGroup,
|
|
508
|
+
bPrepareForEdit: false
|
|
509
|
+
});
|
|
510
|
+
oContext.getModel().submitBatch(sBatchGroup);
|
|
511
|
+
var oActivatePromise = executeDraftActivationAction(oContext, oAppComponent, sBatchGroup);
|
|
512
|
+
return Promise.all([oPreparePromise, oActivatePromise]).then(function (values) {
|
|
513
|
+
return values[1];
|
|
514
|
+
}).catch(function (exc) {
|
|
515
|
+
return Promise.reject(exc);
|
|
516
|
+
});
|
|
517
|
+
}).then(function (oActiveDocumentContext) {
|
|
518
|
+
return Promise.resolve(mParam.fnAfterActivateDocument ? mParam.fnAfterActivateDocument(oContext, oActiveDocumentContext) : oActiveDocumentContext);
|
|
519
|
+
}).catch(function (exc) {
|
|
520
|
+
return Promise.reject(exc);
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* HTTP POST call when DraftAction is present for Draft Delete; HTTP DELETE for Draft(when no DraftAction)
|
|
525
|
+
* and Active Instance uses DELETE always.
|
|
526
|
+
*
|
|
527
|
+
* @function
|
|
528
|
+
* @name sap.fe.core.actions.draft#deleteDraft
|
|
529
|
+
* @memberof sap.fe.core.actions.draft
|
|
530
|
+
* @static
|
|
531
|
+
* @param {sap.ui.model.odata.v4.Context} oContext Context of the document to be discarded
|
|
532
|
+
* @private
|
|
533
|
+
* @returns {Promise}
|
|
534
|
+
* @ui5-restricted
|
|
535
|
+
*/
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
function deleteDraft(oContext) {
|
|
539
|
+
var sDiscardAction = getActionName(oContext, draftOperations.DISCARD),
|
|
540
|
+
bIsActiveEntity = oContext.getObject().IsActiveEntity;
|
|
541
|
+
|
|
542
|
+
if (bIsActiveEntity || !bIsActiveEntity && !sDiscardAction) {
|
|
543
|
+
//Use Delete in case of active entity and no discard action available for draft
|
|
544
|
+
if (oContext.hasPendingChanges()) {
|
|
545
|
+
return oContext.getBinding().resetChanges().then(function () {
|
|
546
|
+
return oContext.delete();
|
|
547
|
+
}).catch(function (error) {
|
|
548
|
+
return Promise.reject(error);
|
|
549
|
+
});
|
|
550
|
+
} else {
|
|
551
|
+
return oContext.delete();
|
|
552
|
+
}
|
|
553
|
+
} else {
|
|
554
|
+
//Use Discard Post Action if it is a draft entity and discard action exists
|
|
555
|
+
return executeDraftDiscardAction(oContext);
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
return draft;
|
|
560
|
+
}, false);
|
|
561
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyYWZ0LnRzIl0sIm5hbWVzIjpbImRyYWZ0T3BlcmF0aW9ucyIsIkVESVQiLCJBQ1RJVkFUSU9OIiwiRElTQ0FSRCIsIlBSRVBBUkUiLCJkcmFmdCIsImNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50IiwiYWN0aXZhdGVEb2N1bWVudCIsImRlbGV0ZURyYWZ0IiwiZ2V0QWN0aW9uTmFtZSIsIm9Db250ZXh0Iiwic09wZXJhdGlvbiIsIm9Nb2RlbCIsImdldE1vZGVsIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNFbnRpdHlTZXRQYXRoIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiY3JlYXRlT3BlcmF0aW9uIiwib09wdGlvbnMiLCJzT3BlcmF0aW9uTmFtZSIsImJpbmRDb250ZXh0IiwiaGFzUHJlcGFyZUFjdGlvbiIsImV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24iLCJiUHJlc2VydmVDaGFuZ2VzIiwiZ2V0UHJvcGVydHkiLCIkJGluaGVyaXRFeHBhbmRTZWxlY3QiLCJvT3BlcmF0aW9uIiwic2V0UGFyYW1ldGVyIiwic0dyb3VwSWQiLCJvRWRpdFByb21pc2UiLCJleGVjdXRlIiwidGhlbiIsIm9EcmFmdERvY3VtZW50Q29udGV4dCIsInN1Ym1pdEJhdGNoIiwiRXJyb3IiLCJleGVjdXRlRHJhZnRBY3RpdmF0aW9uQWN0aW9uIiwib0FwcENvbXBvbmVudCIsImJIYXNQcmVwYXJlQWN0aW9uIiwiYklnbm9yZUV0YWciLCJvQWN0aXZlRG9jdW1lbnRDb250ZXh0IiwiY2F0Y2giLCJzQWN0aW9uTmFtZSIsIm9TaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJvQmluZGluZ1BhcmFtZXRlcnMiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwiYVRhcmdldFBhdGhzIiwicGF0aEV4cHJlc3Npb25zIiwibGVuZ3RoIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJyZXF1ZXN0TWVzc2FnZXMiLCJQcm9taXNlIiwicmVqZWN0IiwiZXhlY3V0ZURyYWZ0UHJlcGFyYXRpb25BY3Rpb24iLCJtUGFyYW1ldGVycyIsIm1QYXJhbXMiLCJncm91cElkIiwiZ2V0R3JvdXBJZCIsIm9QcmVwYXJhdGlvblByb21pc2UiLCJiUHJlcGFyZUZvckVkaXQiLCJnZXRNZXNzYWdlc1BhdGgiLCJzTWVzc2FnZXNQYXRoIiwiJFByb3BlcnR5UGF0aCIsInJlc29sdmUiLCJleGVjdXRlRHJhZnREaXNjYXJkQWN0aW9uIiwib0Rpc2NhcmRPcGVyYXRpb24iLCJvRGlzY2FyZFByb21pc2UiLCJtUGFyYW0iLCJsb2NhbEkxOG5SZWYiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJnZXRMaWJyYXJ5UmVzb3VyY2VCdW5kbGUiLCJiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdyIsIm92ZXJ3cml0ZU9uRGVtYW5kIiwiYk92ZXJ3cml0ZSIsImRyYWZ0RGF0YUNvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJvUmVzb3VyY2VCdW5kbGUiLCJvVmlldyIsImdldFJlc291cmNlQnVuZGxlIiwiX29SZXNvdXJjZUJ1bmRsZSIsInJlcXVlc3RPYmplY3QiLCJkcmFmdEFkbWluRGF0YSIsIm1lc3NhZ2VIYW5kbGluZyIsInJlbW92ZVVuYm91bmRUcmFuc2l0aW9uTWVzc2FnZXMiLCJzSW5mbyIsIkluUHJvY2Vzc0J5VXNlckRlc2NyaXB0aW9uIiwiSW5Qcm9jZXNzQnlVc2VyIiwic0VudGl0eVNldCIsImdldFZpZXdEYXRhIiwiZW50aXR5U2V0Iiwic0xvY2tlZEJ5VXNlck1zZyIsIkNvbW1vblV0aWxzIiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJNZXNzYWdlQm94IiwiQ3JlYXRlZEJ5VXNlckRlc2NyaXB0aW9uIiwiQ3JlYXRlZEJ5VXNlciIsInNVbnNhdmVkQ2hhbmdlc01zZyIsInNob3dNZXNzYWdlQm94Iiwib0RpYWxvZyIsIkRpYWxvZyIsInRpdGxlIiwiZ2V0VGV4dCIsInN0YXRlIiwiY29udGVudCIsIlRleHQiLCJ0ZXh0IiwiYmVnaW5CdXR0b24iLCJCdXR0b24iLCJ0eXBlIiwicHJlc3MiLCJjbG9zZSIsImVuZEJ1dHRvbiIsImFmdGVyQ2xvc2UiLCJkZXN0cm95IiwiYWRkU3R5bGVDbGFzcyIsIm9wZW4iLCJmbkJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50IiwiYkV4ZWN1dGUiLCJvUmVzcG9uc2UiLCJzdGF0dXMiLCJmbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkIiwib0RyYWZ0Q29udGV4dCIsImZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudCIsImJQcmVwYXJlT25FZGl0IiwiZXhjIiwiZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50Iiwic0JhdGNoR3JvdXAiLCJvUHJlcGFyZVByb21pc2UiLCJvQWN0aXZhdGVQcm9taXNlIiwiYWxsIiwidmFsdWVzIiwiZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQiLCJzRGlzY2FyZEFjdGlvbiIsImJJc0FjdGl2ZUVudGl0eSIsIklzQWN0aXZlRW50aXR5IiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwiZGVsZXRlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7O0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQSxNQUFNQSxlQUFlLEdBQUc7QUFDdkJDLElBQUFBLElBQUksRUFBRSxZQURpQjtBQUV2QkMsSUFBQUEsVUFBVSxFQUFFLGtCQUZXO0FBR3ZCQyxJ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QUFDQyxNQUFSLENBQWUwRSxHQUFmLENBQVA7QUFDQSxLQXBDSyxDQUFQO0FBcUNBO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFdBQVM1SCxXQUFULENBQXFCRSxRQUFyQixFQUFzRDtBQUNyRCxRQUFNa0ksY0FBYyxHQUFHbkksYUFBYSxDQUFDQyxRQUFELEVBQVdWLGVBQWUsQ0FBQ0csT0FBM0IsQ0FBcEM7QUFBQSxRQUNDMEksZUFBZSxHQUFHbkksUUFBUSxDQUFDUyxTQUFULEdBQXFCMkgsY0FEeEM7O0FBR0EsUUFBSUQsZUFBZSxJQUFLLENBQUNBLGVBQUQsSUFBb0IsQ0FBQ0QsY0FBN0MsRUFBOEQ7QUFDN0Q7QUFDQSxVQUFJbEksUUFBUSxDQUFDcUksaUJBQVQsRUFBSixFQUFrQztBQUNqQyxlQUFPckksUUFBUSxDQUNic0ksVUFESyxHQUVMQyxZQUZLLEdBR0wvRyxJQUhLLENBR0EsWUFBVztBQUNoQixpQkFBT3hCLFFBQVEsQ0FBQ3dJLE1BQVQsRUFBUDtBQUNBLFNBTEssRUFNTHZHLEtBTkssQ0FNQyxVQUFTWSxLQUFULEVBQXFCO0FBQzNCLGlCQUFPRSxPQUFPLENBQUNDLE1BQVIsQ0FBZUgsS0FBZixDQUFQO0FBQ0EsU0FSSyxDQUFQO0FBU0EsT0FWRCxNQVVPO0FBQ04sZUFBTzdDLFFBQVEsQ0FBQ3dJLE1BQVQsRUFBUDtBQUNBO0FBQ0QsS0FmRCxNQWVPO0FBQ047QUFDQSxhQUFPNUUseUJBQXlCLENBQUM1RCxRQUFELENBQWhDO0FBQ0E7QUFDRDs7U0FFY0wsSyIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpYWxvZyBmcm9tIFwic2FwL20vRGlhbG9nXCI7XG5pbXBvcnQgQnV0dG9uIGZyb20gXCJzYXAvbS9CdXR0b25cIjtcbmltcG9ydCBUZXh0IGZyb20gXCJzYXAvbS9UZXh0XCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IG1lc3NhZ2VIYW5kbGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvYWN0aW9ucy9tZXNzYWdlSGFuZGxpbmdcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IHsgQXBwQ29tcG9uZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlXCI7XG5pbXBvcnQgeyBTaWRlRWZmZWN0c1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgVmlldyBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL1ZpZXdcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvcmVzb3VyY2UvUmVzb3VyY2VNb2RlbFwiO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgY2FsbGJhY2tzIHVzZWQgaW4gdGhlIGZ1bmN0aW9uc1xuICpcbiAqXG4gKiBAYXV0aG9yIFNBUCBTRVxuICogQHNpbmNlIDEuNTQuMFxuICogQGludGVyZmFjZVxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2tcbiAqIEBwcml2YXRlXG4gKi9cblxuLyoqXG4gKiBDYWxsYmFjayB0byBhcHByb3ZlIG9yIHJlamVjdCB0aGUgY3JlYXRpb24gb2YgYSBkcmFmdFxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBhY3RpdmUgZG9jdW1lbnQgZm9yIHRoZSBuZXcgZHJhZnRcbiAqIEByZXR1cm5zIHsoYm9vbGVhbnxQcm9taXNlKX0gQXBwcm92YWwgb2YgZHJhZnQgY3JlYXRpb24gW3RydWV8ZmFsc2VdIG9yIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBib29sZWFuIHZhbHVlXG4gKlxuICogQHByaXZhdGVcbiAqL1xuXG4vKipcbiAqIENhbGxiYWNrIGFmdGVyIGEgZHJhZnQgd2FzIHN1Y2Nlc3N1bGx5IGNyZWF0ZWRcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLmFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcbiAqIEBmdW5jdGlvblxuICogQHN0YXRpY1xuICogQGFic3RyYWN0XG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBuZXcgZHJhZnRcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9BY3RpdmVEb2N1bWVudENvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcmV0dXJucyB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9BY3RpdmVEb2N1bWVudENvbnRleHRcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbi8qKlxuICogQ2FsbGJhY2sgdG8gYXBwcm92ZSBvciByZWplY3Qgb3ZlcndyaXRpbmcgYW4gdW5zYXZlZCBkcmFmdCBvZiBhbm90aGVyIHVzZXJcbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLndoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkXG4gKiBAZnVuY3Rpb25cbiAqIEBwdWJsaWNcbiAqIEBzdGF0aWNcbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHJldHVybnMgeyhib29sZWFufFByb21pc2UpfSBBcHByb3ZhbCB0byBvdmVyd3JpdGUgdW5zYXZlZCBkcmFmdCBbdHJ1ZXxmYWxzZV0gb3IgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJvb2xlYW4gdmFsdWVcbiAqXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuLyogQ29uc3RhbnRzIGZvciBkcmFmdCBvcGVyYXRpb25zICovXG5jb25zdCBkcmFmdE9wZXJhdGlvbnMgPSB7XG5cdEVESVQ6IFwiRWRpdEFjdGlvblwiLFxuXHRBQ1RJVkFUSU9OOiBcIkFjdGl2YXRpb25BY3Rpb25cIixcblx0RElTQ0FSRDogXCJEaXNjYXJkQWN0aW9uXCIsXG5cdFBSRVBBUkU6IFwiUHJlcGFyYXRpb25BY3Rpb25cIlxufTtcbi8qKlxuICogU3RhdGljIGZ1bmN0aW9ucyBmb3IgdGhlIGRyYWZ0IHByb2dyYW1taW5nIG1vZGVsXG4gKlxuICogQG5hbWVzcGFjZVxuICogQGFsaWFzIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBwcml2YXRlXG4gKiBAZXhwZXJpbWVudGFsIFRoaXMgbW9kdWxlIGlzIG9ubHkgZm9yIGV4cGVyaW1lbnRhbCB1c2UhIDxici8+PGI+VGhpcyBpcyBvbmx5IGEgUE9DIGFuZCBtYXliZSBkZWxldGVkPC9iPlxuICogQHNpbmNlIDEuNTQuMFxuICovXG5jb25zdCBkcmFmdCA9IHtcblx0Y3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQ6IGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50LFxuXHRhY3RpdmF0ZURvY3VtZW50OiBhY3RpdmF0ZURvY3VtZW50LFxuXHRkZWxldGVEcmFmdDogZGVsZXRlRHJhZnRcbn07XG4vKipcbiAqIERldGVybWluZXMgYWN0aW9uIG5hbWUgZm9yIGEgZHJhZnQgb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBvcGVyYXRpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBzT3BlcmF0aW9uIFRoZSBvcGVyYXRpb24gbmFtZVxuICogQHJldHVybnMge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGRyYWZ0IG9wZXJhdGlvblxuICovXG5mdW5jdGlvbiBnZXRBY3Rpb25OYW1lKG9Db250ZXh0OiBhbnksIHNPcGVyYXRpb246IHN0cmluZykge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCksXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cblx0cmV0dXJuIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KHNFbnRpdHlTZXRQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9cIiArIHNPcGVyYXRpb24pO1xufVxuLyoqXG4gKiBDcmVhdGVzIGFuIG9wZXJhdGlvbiBjb250ZXh0IGJpbmRpbmcgZm9yIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBzaG91bGQgYmUgYm91bmQgdG8gdGhlIG9wZXJhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHNPcGVyYXRpb24gVGhlIG9wZXJhdGlvbiAoYWN0aW9uIG9yIGZ1bmN0aW9uIGltcG9ydClcbiAqIEBwYXJhbSBvT3B0aW9ucyBPcHRpb25zIHRvIGNyZWF0ZSB0aGUgb3BlcmF0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFDb250ZXh0QmluZGluZ30gVGhlIGNvbnRleHQgYmluZGluZyBvZiB0aGUgYm91bmQgb3BlcmF0aW9uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dDogYW55LCBzT3BlcmF0aW9uOiBzdHJpbmcsIG9PcHRpb25zPzogYW55KSB7XG5cdGNvbnN0IHNPcGVyYXRpb25OYW1lID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgc09wZXJhdGlvbik7XG5cblx0cmV0dXJuIG9Db250ZXh0LmdldE1vZGVsKCkuYmluZENvbnRleHQoc09wZXJhdGlvbk5hbWUgKyBcIiguLi4pXCIsIG9Db250ZXh0LCBvT3B0aW9ucyk7XG59XG4vKipcbiAqIENoZWNrIGlmIG9wdGlvbmFsIGRyYWZ0IHByZXBhcmUgYWN0aW9uIGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBUaGUgY29udGV4dCB0aGF0IHNob3VsZCBiZSBib3VuZCB0byB0aGUgb3BlcmF0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBhIGEgcHJlcGFyZSBhY3Rpb24gZXhpc3RzXG4gKi9cbmZ1bmN0aW9uIGhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQ6IGFueSkge1xuXHRyZXR1cm4gISFnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSk7XG59XG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZHJhZnQgZnJvbSBhbiBhY3RpdmUgZG9jdW1lbnQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYlByZXNlcnZlQ2hhbmdlcyBJZiB0cnVlIC0gZXhpc3RpbmcgY2hhbmdlcyBmcm9tIGFub3RoZXIgdXNlciB0aGF0IGFyZSBub3QgbG9ja2VkIGFyZSBwcmVzZXJ2ZWQgYW5kIGFuIGVycm9yIG1lc3NhZ2UgKGh0dHAgc3RhdHVzIDQwOSkgaXMgc2VuZCBmcm9tIHRoZSBiYWNrZW5kLCBvdGhlcndpc2UgZmFsc2UgLSBleGlzdGluZyBjaGFuZ2VzIGZyb20gYW5vdGhlciB1c2VyIHRoYXQgYXJlIG5vdCBsb2NrZWQgYXJlIG92ZXJ3cml0dGVuPC9saT5cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEVkaXRBY3Rpb24ob0NvbnRleHQ6IGFueSwgYlByZXNlcnZlQ2hhbmdlczogYm9vbGVhbikge1xuXHRpZiAob0NvbnRleHQuZ2V0UHJvcGVydHkoXCJJc0FjdGl2ZUVudGl0eVwiKSkge1xuXHRcdGNvbnN0IG9PcHRpb25zID0geyAkJGluaGVyaXRFeHBhbmRTZWxlY3Q6IHRydWUgfTtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuRURJVCwgb09wdGlvbnMpO1xuXHRcdG9PcGVyYXRpb24uc2V0UGFyYW1ldGVyKFwiUHJlc2VydmVDaGFuZ2VzXCIsIGJQcmVzZXJ2ZUNoYW5nZXMpO1xuXHRcdGNvbnN0IHNHcm91cElkID0gXCJkaXJlY3RcIjtcblx0XHRjb25zdCBvRWRpdFByb21pc2UgPSBvT3BlcmF0aW9uLmV4ZWN1dGUoc0dyb3VwSWQpLnRoZW4oZnVuY3Rpb24ob0RyYWZ0RG9jdW1lbnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdHJldHVybiBvRHJhZnREb2N1bWVudENvbnRleHQ7XG5cdFx0fSk7XG5cdFx0b09wZXJhdGlvbi5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKHNHcm91cElkKTtcblx0XHRyZXR1cm4gb0VkaXRQcm9taXNlO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIllvdSBjYW5ub3QgZWRpdCB0aGlzIGRyYWZ0IGRvY3VtZW50XCIpO1xuXHR9XG59XG4vKmZ1bmN0aW9uIGZuT25TdHJpY3RIYW5kbGluZ0ZhaWxlZChvQ29udGV4dDogYW55LCBzR3JvdXBJZDogYW55LCBhTWVzc2FnZXM6IGFueSkgeyAvL1dpbGwgdW5jb21tZW50IHRoaXMgZnVuY3Rpb24gaW4gdGhlIGNvbW1pdCA6IDU1MTM1MTBcblx0aWYgKGFNZXNzYWdlcy5sZW5ndGggPT09IDEpIHtcblx0XHRjb25zdCBzTWVzc2FnZSA9IGFNZXNzYWdlc1swXS5tZXNzYWdlLFxuXHRcdFx0ZGlhbG9nUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkKSB7XG5cdFx0XHRcdHNhcC51aS5yZXF1aXJlKFtcInNhcC9tL01lc3NhZ2VCb3hcIl0sIGZ1bmN0aW9uKE1lc3NhZ2VCb3g6IGFueSkge1xuXHRcdFx0XHRcdE1lc3NhZ2VCb3gud2FybmluZyhzTWVzc2FnZSwge1xuXHRcdFx0XHRcdFx0dGl0bGU6IFwiV2FybmluZ1wiLFxuXHRcdFx0XHRcdFx0YWN0aW9uczogW01lc3NhZ2VCb3guQWN0aW9uLk9LLCBNZXNzYWdlQm94LkFjdGlvbi5DQU5DRUxdLFxuXHRcdFx0XHRcdFx0b25DbG9zZTogZnVuY3Rpb24oc0FjdGlvbjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChzQWN0aW9uID09PSBNZXNzYWdlQm94LkFjdGlvbi5PSykge1xuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChzR3JvdXBJZCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRyZXR1cm4gZGlhbG9nUHJvbWlzZTtcblx0fVxufSovXG4vKipcbiAqIEFjdGl2YXRlcyBhIGRyYWZ0IGRvY3VtZW50LiBUaGUgZHJhZnQgd2lsbCByZXBsYWNlIHRoZSBzaWJsaW5nIGVudGl0eSBhbmQgd2lsbCBiZSBkZWxldGVkIGJ5IHRoZSBiYWNrIGVuZC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIHtvYmplY3R9IG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIHtzdHJpbmd9IFtzR3JvdXBJZF0gVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIGluIHdoaWNoIHRoZSBvcGVyYXRpb24gaXMgdG8gYmUgZXhlY3V0ZWRcbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdEFjdGl2YXRpb25BY3Rpb24ob0NvbnRleHQ6IGFueSwgb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50LCBzR3JvdXBJZD86IHN0cmluZykge1xuXHRjb25zdCBiSGFzUHJlcGFyZUFjdGlvbiA9IGhhc1ByZXBhcmVBY3Rpb24ob0NvbnRleHQpO1xuXG5cdC8vIEFjY29yZGluZyB0byB0aGUgZHJhZnQgc3BlYyBpZiB0aGUgc2VydmljZSBjb250YWlucyBhIHByZXBhcmUgYWN0aW9uIGFuZCB3ZSB0cmlnZ2VyIGJvdGggcHJlcGFyZSBhbmRcblx0Ly8gYWN0aXZhdGUgaW4gb25lICRiYXRjaCB0aGUgYWN0aXZhdGUgYWN0aW9uIGlzIGNhbGxlZCB3aXRoIGlGLU1hdGNoPSpcblx0Y29uc3QgYklnbm9yZUV0YWcgPSBiSGFzUHJlcGFyZUFjdGlvbjtcblxuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvT3BlcmF0aW9uID0gY3JlYXRlT3BlcmF0aW9uKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuQUNUSVZBVElPTiwgeyAkJGluaGVyaXRFeHBhbmRTZWxlY3Q6IHRydWUgfSk7XG5cdFx0cmV0dXJuIG9PcGVyYXRpb25cblx0XHRcdC5leGVjdXRlKHNHcm91cElkLCBiSWdub3JlRXRhZylcblx0XHRcdC50aGVuKGZ1bmN0aW9uKG9BY3RpdmVEb2N1bWVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0FjdGl2ZURvY3VtZW50Q29udGV4dDtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goXG5cdFx0XHRcdC8vaWYgQUNUSVZBVEUgYWN0aW9uIGZhaWxzIHRoZW4gd2UgcmVxdWVzdCBlaXRoZXIgdGhlIHNpZGVFZmZlY3RzIGFnYWluc3QgUFJFUEFSRSBhY3Rpb24gKGlmIGFubm90YXRlZCkgb3IgdGhlIG1lc3NhZ2VzIGFzIGZhbGxiYWNrOlxuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoYkhhc1ByZXBhcmVBY3Rpb24pIHtcblx0XHRcdFx0XHRcdGNvbnN0IHNBY3Rpb25OYW1lID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpLFxuXHRcdFx0XHRcdFx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKSxcblx0XHRcdFx0XHRcdFx0b0JpbmRpbmdQYXJhbWV0ZXJzID0gb1NpZGVFZmZlY3RzU2VydmljZS5nZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzKHNBY3Rpb25OYW1lLCBvQ29udGV4dCksXG5cdFx0XHRcdFx0XHRcdGFUYXJnZXRQYXRocyA9IG9CaW5kaW5nUGFyYW1ldGVycyAmJiBvQmluZGluZ1BhcmFtZXRlcnMucGF0aEV4cHJlc3Npb25zO1xuXHRcdFx0XHRcdFx0aWYgKGFUYXJnZXRQYXRocyAmJiBhVGFyZ2V0UGF0aHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlLnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0UGF0aHMsIG9Db250ZXh0KS5jYXRjaChmdW5jdGlvbihvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVxdWVzdE1lc3NhZ2VzKG9Db250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlKS5jYXRjaChmdW5jdGlvbihvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3RpbmcgbWVzc2FnZXNcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBhY3RpdmF0aW9uIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG4vKipcbiAqIEV4ZWN1dGUgYSBwcmVwYXJhdGlvbiBhY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEBwYXJhbSB7b2JqZWN0fSBvQXBwQ29tcG9uZW50IFRoZSBBcHBDb21wb25lbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBtUGFyYW1ldGVycyBUaGUgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtib29sZWFufSBbbVBhcmFtZXRlcnMuZ3JvdXBJZF0gVGhlIG9wdGlvbmFsIGJhdGNoIGdyb3VwIHdoZXJlIHdlIHdhbnQgdG8gZXhlY3V0ZSB0aGUgb3BlcmF0aW9uIGluXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iUHJlcGFyZUZvckVkaXRdIFNoYWxsIHRoZSBtZXNzYWdlcyBiZSByZXF1ZXN0ZWQgaWYgc3VwcG9ydGVkIGJ5IHNlcnZpY2VcbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uKFxuXHRvQ29udGV4dDogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQsXG5cdG1QYXJhbWV0ZXJzOiB7IGdyb3VwSWQ/OiBzdHJpbmc7IGJQcmVwYXJlRm9yRWRpdD86IGJvb2xlYW4gfVxuKSB7XG5cdGNvbnN0IG1QYXJhbXMgPSBtUGFyYW1ldGVycyB8fCB7fTtcblx0aWYgKCFvQ29udGV4dC5nZXRQcm9wZXJ0eShcIklzQWN0aXZlRW50aXR5XCIpKSB7XG5cdFx0Y29uc3Qgb09wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLlBSRVBBUkUpO1xuXG5cdFx0Ly8gVE9ETzogc2lkZSBlZmZlY3RzIHF1YWxpZmllciBzaGFsbCBiZSBldmVuIGRlcHJlY2F0ZWQgdG8gYmUgY2hlY2tlZFxuXHRcdG9PcGVyYXRpb24uc2V0UGFyYW1ldGVyKFwiU2lkZUVmZmVjdHNRdWFsaWZpZXJcIiwgXCJcIik7XG5cblx0XHRjb25zdCBzR3JvdXBJZCA9IG1QYXJhbXMuZ3JvdXBJZCB8fCBvT3BlcmF0aW9uLmdldEdyb3VwSWQoKTtcblx0XHRjb25zdCBvUHJlcGFyYXRpb25Qcm9taXNlID0gb09wZXJhdGlvblxuXHRcdFx0LmV4ZWN1dGUoc0dyb3VwSWQpXG5cdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKG1QYXJhbXMuYlByZXBhcmVGb3JFZGl0KSB7XG5cdFx0XHRcdFx0Ly8gaWYgUFJFUEFSRSBhY3Rpb24gaXMgdHJpZ2dlcmVkIGFmdGVyIEVkaXQgdGhlbiBlaXRoZXIgdGhlIHNpZGVFZmZlY3RzIChpZiBhbm5vdGF0ZWQgYWdhaW5zdCBQUkVQQVJFKSBhcmUgZXhlY3V0ZWQgb3IgdGhlIG1lc3NhZ2VzIGFyZSByZXF1ZXN0ZWQgYXMgZmFsbGJhY2sgaWYgbm8gc2lkZUVmZmVjdHM6XG5cdFx0XHRcdFx0Y29uc3Qgc0FjdGlvbk5hbWUgPSBnZXRBY3Rpb25OYW1lKG9Db250ZXh0LCBkcmFmdE9wZXJhdGlvbnMuUFJFUEFSRSksXG5cdFx0XHRcdFx0XHRvU2lkZUVmZmVjdHNTZXJ2aWNlID0gb0FwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKSxcblx0XHRcdFx0XHRcdG9CaW5kaW5nUGFyYW1ldGVycyA9IG9TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0T0RhdGFBY3Rpb25TaWRlRWZmZWN0cyhzQWN0aW9uTmFtZSwgb0NvbnRleHQpLFxuXHRcdFx0XHRcdFx0YVRhcmdldFBhdGhzID0gb0JpbmRpbmdQYXJhbWV0ZXJzICYmIG9CaW5kaW5nUGFyYW1ldGVycy5wYXRoRXhwcmVzc2lvbnM7XG5cdFx0XHRcdFx0aWYgKGFUYXJnZXRQYXRocyAmJiBhVGFyZ2V0UGF0aHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoYVRhcmdldFBhdGhzLCBvQ29udGV4dCwgc0dyb3VwSWQpLmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJlcXVlc3Rpbmcgc2lkZSBlZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVxdWVzdE1lc3NhZ2VzKG9Db250ZXh0LCBvU2lkZUVmZmVjdHNTZXJ2aWNlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG9PcGVyYXRpb247XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uXCIsIG9FcnJvcik7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiBvUHJlcGFyYXRpb25Qcm9taXNlO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBwcmVwYXJhdGlvbiBhY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkIG9uIGFuIGFjdGl2ZSBkb2N1bWVudFwiKTtcblx0fVxufVxuLyoqXG4gKiBEZXRlcm1pbmVzIHRoZSBtZXNzYWdlIHBhdGggZm9yIGEgY29udGV4dC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBwYXRoIHNoYWxsIGJlIGRldGVybWluZWRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IE1lc3NhZ2UgcGF0aCwgZW1wdHkgaWYgbm90IGFubm90YXRlZFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBnZXRNZXNzYWdlc1BhdGgob0NvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcge1xuXHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpLFxuXHRcdG9NZXRhTW9kZWwgPSBvTW9kZWwuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwsXG5cdFx0c0VudGl0eVNldFBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdHJldHVybiBvTWV0YU1vZGVsLmdldE9iamVjdChzRW50aXR5U2V0UGF0aCArIFwiL0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuTWVzc2FnZXMvJFBhdGhcIik7XG59XG4vKipcbiAqIFJlcXVlc3RzIHRoZSBtZXNzYWdlcyBpZiBhbm5vdGF0ZWQgZm9yIGEgZ2l2ZW4gY29udGV4dC5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgZm9yIHdoaWNoIHRoZSBtZXNzYWdlcyBzaGFsbCBiZSByZXF1ZXN0ZWRcbiAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHNTZXJ2aWNlIFNlcnZpY2UgZm9yIHRoZSBTaWRlRWZmZWN0cyBvbiBTQVAgRmlvcmkgZWxlbWVudHNcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgbWVzc2FnZXMgd2VyZSByZXF1ZXN0ZWRcbiAqIEBwcml2YXRlXG4gKiBAdWk1LXJlc3RyaWN0ZWRcbiAqL1xuZnVuY3Rpb24gcmVxdWVzdE1lc3NhZ2VzKG9Db250ZXh0OiBhbnksIG9TaWRlRWZmZWN0c1NlcnZpY2U6IFNpZGVFZmZlY3RzU2VydmljZSkge1xuXHRjb25zdCBzTWVzc2FnZXNQYXRoID0gZ2V0TWVzc2FnZXNQYXRoKG9Db250ZXh0KTtcblx0aWYgKHNNZXNzYWdlc1BhdGgpIHtcblx0XHRyZXR1cm4gb1NpZGVFZmZlY3RzU2VydmljZS5yZXF1ZXN0U2lkZUVmZmVjdHMoW3sgJFByb3BlcnR5UGF0aDogc01lc3NhZ2VzUGF0aCB9XSBhcyBhbnksIG9Db250ZXh0KTtcblx0fVxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59XG4vKipcbiAqIEV4ZWN1dGVzIGRpc2NhcmQgb2YgYSBkcmFmdCBmdW5jdGlvbiB1c2luZyBIVFRQIFBvc3QuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWRcbiAqIEByZXR1cm5zIHtQcm9taXNlLjxzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dD59IFJlc29sdmUgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgb3BlcmF0aW9uXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEcmFmdERpc2NhcmRBY3Rpb24ob0NvbnRleHQ6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRpZiAoIW9Db250ZXh0LmdldFByb3BlcnR5KFwiSXNBY3RpdmVFbnRpdHlcIikpIHtcblx0XHRjb25zdCBvRGlzY2FyZE9wZXJhdGlvbiA9IGNyZWF0ZU9wZXJhdGlvbihvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkRJU0NBUkQpO1xuXHRcdGNvbnN0IG9EaXNjYXJkUHJvbWlzZSA9IG9EaXNjYXJkT3BlcmF0aW9uLmV4ZWN1dGUoXCJkaXJlY3RcIik7XG5cdFx0b0NvbnRleHQuZ2V0TW9kZWwoKS5zdWJtaXRCYXRjaChcImRpcmVjdFwiKTtcblx0XHRyZXR1cm4gb0Rpc2NhcmRQcm9taXNlO1xuXHR9IGVsc2Uge1xuXHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBkaXNjYXJkIGFjdGlvbiBjYW5ub3QgYmUgZXhlY3V0ZWQgb24gYW4gYWN0aXZlIGRvY3VtZW50XCIpO1xuXHR9XG59XG4vKipcbiAqIENyZWF0ZXMgYSBkcmFmdCBkb2N1bWVudCBmcm9tIGFuIGV4aXN0aW5nIGRvY3VtZW50LlxuICpcbiAqIFRoZSBmdW5jdGlvbiBzdXBwb3J0cyBzZXZlcmFsIGhvb2tzIGFzIHRoZXJlIGlzIGEgY2VydGFpbiBjb3Jlb2dyYXBoeSBkZWZpbmVkLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdCNjcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudFxuICogQG1lbWJlcm9mIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnRcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IG9Db250ZXh0IENvbnRleHQgb2YgdGhlIGFjdGl2ZSBkb2N1bWVudCBmb3IgdGhlIG5ldyBkcmFmdFxuICogQHBhcmFtIHtvYmplY3R9IG9BcHBDb21wb25lbnQgVGhlIEFwcENvbXBvbmVudFxuICogQHBhcmFtIHtvYmplY3R9IG1QYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5vVmlld10gVGhlIHZpZXdcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW21QYXJhbWV0ZXJzLmJQcmVzZXJ2ZUNoYW5nZXNdIFByZXNlcnZlIGNoYW5nZXMgb2YgYW4gZXhpc3RpbmcgZHJhZnQgb2YgYW5vdGhlciB1c2VyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFttUGFyYW1ldGVycy5iUHJlcGFyZU9uRWRpdF0gQWxzbyBjYWxsIHByZXBhcmUgd2hlbiBjYWxsaW5nIGRyYWZ0IGNyZWF0aW9uXG4gKiBAcGFyYW0ge3NhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQuSUNhbGxiYWNrLmJlZm9yZUNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50fSBbbVBhcmFtZXRlcnMuZm5CZWZvcmVDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudF0gQ2FsbGJhY2sgdGhhdCBhbGxvd3MgdmV0byBiZWZvcmUgY3JlYXRlIHJlcXVlc3QgaXMgZXhlY3V0ZWRcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suYWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudH0gW21QYXJhbWV0ZXJzLmZuQWZ0ZXJDcmVhdGVEcmFmdEZyb21BY3RpdmVEb2N1bWVudF0gQ2FsbGJhY2sgZm9yIHBvc3Rwcm9jZXNzaW9uZyBhZnRlciBkcmFmdCBkb2N1bWVudCB3YXMgY3JlYXRlZFxuICogQHBhcmFtIHtzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay53aGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZH0gW21QYXJhbWV0ZXJzLmZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWRdIENhbGxiYWNrIGZvciBkZWNpZGluZyBvbiBvdmVyd3JpdGluZyBhbiB1bnNhdmVkIGNoYW5nZSBieSBhbm90aGVyIHVzZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHJlc29sdmVzIHdpdGggdGhlIHtAbGluayBzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dCBjb250ZXh0fSBvZiB0aGUgbmV3IGRyYWZ0IGRvY3VtZW50XG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50KFxuXHRvQ29udGV4dDogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBvYmplY3QsXG5cdG1QYXJhbWV0ZXJzOiB7XG5cdFx0b1ZpZXc6IFZpZXc7XG5cdFx0YlByZXNlcnZlQ2hhbmdlcz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cdFx0YlByZXBhcmVPbkVkaXQ/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXHRcdGZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQ/OiBhbnk7XG5cdFx0Zm5BZnRlckNyZWF0ZURyYWZ0RnJvbUFjdGl2ZURvY3VtZW50PzogYW55O1xuXHRcdGZuV2hlbkRlY2lzaW9uVG9PdmVyd3JpdGVEb2N1bWVudElzUmVxdWlyZWQ/OiBhbnk7XG5cdH1cbikge1xuXHRjb25zdCBtUGFyYW0gPSBtUGFyYW1ldGVycyB8fCB7fSxcblx0XHRsb2NhbEkxOG5SZWYgPSBzYXAudWkuZ2V0Q29yZSgpLmdldExpYnJhcnlSZXNvdXJjZUJ1bmRsZShcInNhcC5mZS5jb3JlXCIpIGFzIFJlc291cmNlQnVuZGxlLFxuXHRcdGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93ID1cblx0XHRcdHR5cGVvZiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyA9PT0gXCJ1bmRlZmluZWRcIiB8fCAodHlwZW9mIG1QYXJhbS5iUHJlc2VydmVDaGFuZ2VzID09PSBcImJvb2xlYW5cIiAmJiBtUGFyYW0uYlByZXNlcnZlQ2hhbmdlcyk7IC8vZGVmYXVsdCB0cnVlXG5cblx0LyoqXG5cdCAqIE92ZXJ3cml0ZSBvciByZWplY3QgYmFzZWQgb24gZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZC5cblx0ICpcblx0ICogQHBhcmFtIHsqfSBiT3ZlcndyaXRlIE92ZXJ3cml0ZSB0aGUgY2hhbmdlIG9yIG5vdFxuXHQgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2l0aCByZXN1bHQgb2Yge0BsaW5rIHNhcC5mZS5jb3JlLmFjdGlvbnMjZXhlY3V0ZURyYWZ0RWRpdEFjdGlvbn1cblx0ICovXG5cdGZ1bmN0aW9uIG92ZXJ3cml0ZU9uRGVtYW5kKGJPdmVyd3JpdGU6IGFueSkge1xuXHRcdGlmIChiT3ZlcndyaXRlKSB7XG5cdFx0XHQvL092ZXJ3cml0ZSBleGlzdGluZyBjaGFuZ2VzXG5cdFx0XHRjb25zdCBvTW9kZWwgPSBvQ29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdFx0Y29uc3QgZHJhZnREYXRhQ29udGV4dCA9IG9Nb2RlbC5iaW5kQ29udGV4dChvQ29udGV4dC5nZXRQYXRoKCkgKyBcIi9EcmFmdEFkbWluaXN0cmF0aXZlRGF0YVwiKS5nZXRCb3VuZENvbnRleHQoKTtcblx0XHRcdGxldCBvUmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlO1xuXG5cdFx0XHRyZXR1cm4gKChtUGFyYW1ldGVycy5vVmlldy5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpIGFzIFJlc291cmNlTW9kZWwpLmdldFJlc291cmNlQnVuZGxlKCkgYXMgUHJvbWlzZTxSZXNvdXJjZUJ1bmRsZT4pXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uKF9vUmVzb3VyY2VCdW5kbGU6IGFueSkge1xuXHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSA9IF9vUmVzb3VyY2VCdW5kbGU7XG5cdFx0XHRcdFx0cmV0dXJuIGRyYWZ0RGF0YUNvbnRleHQucmVxdWVzdE9iamVjdCgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbihkcmFmdEFkbWluRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0aWYgKGRyYWZ0QWRtaW5EYXRhKSB7XG5cdFx0XHRcdFx0XHQvLyByZW1vdmUgYWxsIHVuYm91bmQgdHJhbnNpdGlvbiBtZXNzYWdlcyBhcyB3ZSBzaG93IGEgc3BlY2lhbCBkaWFsb2dcblx0XHRcdFx0XHRcdG1lc3NhZ2VIYW5kbGluZy5yZW1vdmVVbmJvdW5kVHJhbnNpdGlvbk1lc3NhZ2VzKCk7XG5cdFx0XHRcdFx0XHRsZXQgc0luZm8gPSBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXJEZXNjcmlwdGlvbiB8fCBkcmFmdEFkbWluRGF0YS5JblByb2Nlc3NCeVVzZXI7XG5cdFx0XHRcdFx0XHRjb25zdCBzRW50aXR5U2V0ID0gKG1QYXJhbWV0ZXJzLm9WaWV3LmdldFZpZXdEYXRhKCkgYXMgYW55KS5lbnRpdHlTZXQ7XG5cdFx0XHRcdFx0XHRpZiAoc0luZm8pIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgc0xvY2tlZEJ5VXNlck1zZyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9EUkFGVF9MT0NLRURfQllfVVNFUlwiLFxuXHRcdFx0XHRcdFx0XHRcdG9SZXNvdXJjZUJ1bmRsZSxcblx0XHRcdFx0XHRcdFx0XHRzSW5mbyxcblx0XHRcdFx0XHRcdFx0XHRzRW50aXR5U2V0XG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdE1lc3NhZ2VCb3guZXJyb3Ioc0xvY2tlZEJ5VXNlck1zZyk7XG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihzTG9ja2VkQnlVc2VyTXNnKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHNJbmZvID0gZHJhZnRBZG1pbkRhdGEuQ3JlYXRlZEJ5VXNlckRlc2NyaXB0aW9uIHx8IGRyYWZ0QWRtaW5EYXRhLkNyZWF0ZWRCeVVzZXI7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNVbnNhdmVkQ2hhbmdlc01zZyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFxuXHRcdFx0XHRcdFx0XHRcdFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9EUkFGVF9VTlNBVkVEX0NIQU5HRVNcIixcblx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdFx0c0luZm8sXG5cdFx0XHRcdFx0XHRcdFx0c0VudGl0eVNldFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gc2hvd01lc3NhZ2VCb3goc1Vuc2F2ZWRDaGFuZ2VzTXNnKS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBleGVjdXRlRHJhZnRFZGl0QWN0aW9uKG9Db250ZXh0LCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJEcmFmdCBjcmVhdGlvbiBhYm9ydGVkIGZvciBkb2N1bWVudDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkpKTtcblx0fVxuXG5cdGZ1bmN0aW9uIHNob3dNZXNzYWdlQm94KHNVbnNhdmVkQ2hhbmdlc01zZzogYW55KSB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpIHtcblx0XHRcdGNvbnN0IG9EaWFsb2cgPSBuZXcgRGlhbG9nKHtcblx0XHRcdFx0dGl0bGU6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19EUkFGVF9PQkpFQ1RfUEFHRV9XQVJOSU5HXCIpLFxuXHRcdFx0XHRzdGF0ZTogXCJXYXJuaW5nXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IG5ldyBUZXh0KHtcblx0XHRcdFx0XHR0ZXh0OiBzVW5zYXZlZENoYW5nZXNNc2dcblx0XHRcdFx0fSksXG5cdFx0XHRcdGJlZ2luQnV0dG9uOiBuZXcgQnV0dG9uKHtcblx0XHRcdFx0XHR0ZXh0OiBsb2NhbEkxOG5SZWYuZ2V0VGV4dChcIkNfQ09NTU9OX09CSkVDVF9QQUdFX0VESVRcIiksXG5cdFx0XHRcdFx0dHlwZTogXCJFbXBoYXNpemVkXCIsXG5cdFx0XHRcdFx0cHJlc3M6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0b0RpYWxvZy5jbG9zZSgpO1xuXHRcdFx0XHRcdFx0cmVzb2x2ZSh0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRlbmRCdXR0b246IG5ldyBCdXR0b24oe1xuXHRcdFx0XHRcdHRleHQ6IGxvY2FsSTE4blJlZi5nZXRUZXh0KFwiQ19DT01NT05fT0JKRUNUX1BBR0VfQ0FOQ0VMXCIpLFxuXHRcdFx0XHRcdHByZXNzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdG9EaWFsb2cuY2xvc2UoKTtcblx0XHRcdFx0XHRcdHJlamVjdChcIkRyYWZ0IGNyZWF0aW9uIGFib3J0ZWQgZm9yIGRvY3VtZW50OiBcIiArIG9Db250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSxcblx0XHRcdFx0YWZ0ZXJDbG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0b0RpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0b0RpYWxvZy5hZGRTdHlsZUNsYXNzKFwic2FwVWlDb250ZW50UGFkZGluZ1wiKTtcblx0XHRcdG9EaWFsb2cub3BlbigpO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCFvQ29udGV4dCkge1xuXHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJCaW5kaW5nIGNvbnRleHQgdG8gYWN0aXZlIGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0fVxuXG5cdHJldHVybiBQcm9taXNlLnJlc29sdmUoXG5cdFx0bVBhcmFtLmZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcblx0XHRcdD8gbVBhcmFtLmZuQmVmb3JlQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQob0NvbnRleHQsIGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93KVxuXHRcdFx0OiB0cnVlXG5cdClcblx0XHQudGhlbihmdW5jdGlvbihiRXhlY3V0ZTogYW55KSB7XG5cdFx0XHRpZiAoIWJFeGVjdXRlKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkRyYWZ0IGNyZWF0aW9uIHdhcyBhYm9ydGVkIGJ5IGV4dGVuc2lvbiBmb3IgZG9jdW1lbnQ6IFwiICsgb0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBleGVjdXRlRHJhZnRFZGl0QWN0aW9uKG9Db250ZXh0LCBiUnVuUHJlc2VydmVDaGFuZ2VzRmxvdykuY2F0Y2goZnVuY3Rpb24ob1Jlc3BvbnNlOiBhbnkpIHtcblx0XHRcdFx0Ly9Pbmx5IGNhbGwgYmFjayBpZiBlcnJvciA0MDlcblx0XHRcdFx0aWYgKGJSdW5QcmVzZXJ2ZUNoYW5nZXNGbG93ICYmIG9SZXNwb25zZS5zdGF0dXMgPT09IDQwOSkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXG5cdFx0XHRcdFx0XHRtUGFyYW0uZm5XaGVuRGVjaXNpb25Ub092ZXJ3cml0ZURvY3VtZW50SXNSZXF1aXJlZCA/IG1QYXJhbS5mbldoZW5EZWNpc2lvblRvT3ZlcndyaXRlRG9jdW1lbnRJc1JlcXVpcmVkKCkgOiB0cnVlXG5cdFx0XHRcdFx0KS50aGVuKG92ZXJ3cml0ZU9uRGVtYW5kKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3Iob1Jlc3BvbnNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSlcblx0XHQudGhlbihmdW5jdGlvbihvRHJhZnRDb250ZXh0OiBhbnkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoXG5cdFx0XHRcdG1QYXJhbS5mbkFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnRcblx0XHRcdFx0XHQ/IG1QYXJhbS5mbkFmdGVyQ3JlYXRlRHJhZnRGcm9tQWN0aXZlRG9jdW1lbnQob0NvbnRleHQsIG9EcmFmdENvbnRleHQpXG5cdFx0XHRcdFx0OiBvRHJhZnRDb250ZXh0XG5cdFx0XHQpO1xuXHRcdH0pXG5cdFx0LnRoZW4oZnVuY3Rpb24ob0RyYWZ0Q29udGV4dDogYW55KSB7XG5cdFx0XHRpZiAobVBhcmFtLmJQcmVwYXJlT25FZGl0ICYmIGhhc1ByZXBhcmVBY3Rpb24ob0RyYWZ0Q29udGV4dCkpIHtcblx0XHRcdFx0cmV0dXJuIGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uKG9EcmFmdENvbnRleHQsIG9BcHBDb21wb25lbnQsIHsgYlByZXBhcmVGb3JFZGl0OiB0cnVlIH0pLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQ7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG9EcmFmdENvbnRleHQ7XG5cdFx0fSlcblx0XHQuY2F0Y2goZnVuY3Rpb24oZXhjOiBhbnkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChleGMpO1xuXHRcdH0pO1xufVxuLyoqXG4gKiBDcmVhdGVzIGFuIGFjdGl2ZSBkb2N1bWVudCBmcm9tIGEgZHJhZnQgZG9jdW1lbnQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIHNldmVyYWwgaG9va3MgYXMgdGhlcmUgaXMgYSBjZXJ0YWluIGNob3Jlb2dyYXBoeSBkZWZpbmVkLlxuICpcbiAqIEBmdW5jdGlvblxuICogQG5hbWUgc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdCNhY3RpdmF0ZURvY3VtZW50XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdFxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgQ29udGV4dCBvZiB0aGUgYWN0aXZlIGRvY3VtZW50IGZvciB0aGUgbmV3IGRyYWZ0XG4gKiBAcGFyYW0ge29iamVjdH0gb0FwcENvbXBvbmVudCBUaGUgQXBwQ29tcG9uZW50XG4gKiBAcGFyYW0ge29iamVjdH0gbVBhcmFtZXRlcnMgVGhlIHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7c2FwLmZlLmNvcmUuYWN0aW9ucy5kcmFmdC5JQ2FsbGJhY2suZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50fSBbbVBhcmFtZXRlcnMuZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayB0aGF0IGFsbG93cyB2ZXRvIGJlZm9yZSBjcmVhdGUgcmVxdWVzdCBpcyBleGVjdXRlZFxuICogQHBhcmFtIHtzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0LklDYWxsYmFjay5mbkFmdGVyQWN0aXZhdGVEb2N1bWVudH0gW21QYXJhbWV0ZXJzLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50XSBDYWxsYmFjayBmb3IgcG9zdHByb2Nlc3Npb25nIGFmdGVyIGRvY3VtZW50IHdhcyBhY3RpdmF0ZWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gUHJvbWlzZSByZXNvbHZlcyB3aXRoIHRoZSB7QGxpbmsgc2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHQgY29udGV4dH0gb2YgdGhlIG5ldyBkcmFmdCBkb2N1bWVudFxuICogQHByaXZhdGVcbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBhY3RpdmF0ZURvY3VtZW50KFxuXHRvQ29udGV4dDogYW55LFxuXHRvQXBwQ29tcG9uZW50OiBvYmplY3QsXG5cdG1QYXJhbWV0ZXJzOiB7IGZuQmVmb3JlQWN0aXZhdGVEb2N1bWVudD86IGFueTsgZm5BZnRlckFjdGl2YXRlRG9jdW1lbnQ/OiBhbnkgfVxuKSB7XG5cdGNvbnN0IG1QYXJhbSA9IG1QYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdGlmICghb0NvbnRleHQpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQmluZGluZyBjb250ZXh0IHRvIGRyYWZ0IGRvY3VtZW50IGlzIHJlcXVpcmVkXCIpKTtcblx0fVxuXHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1QYXJhbS5mbkJlZm9yZUFjdGl2YXRlRG9jdW1lbnQgPyBtUGFyYW0uZm5CZWZvcmVBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0KSA6IHRydWUpXG5cdFx0LnRoZW4oZnVuY3Rpb24oYkV4ZWN1dGU6IGFueSkge1xuXHRcdFx0aWYgKCFiRXhlY3V0ZSkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQWN0aXZhdGlvbiBvZiB0aGUgZG9jdW1lbnQgd2FzIGFib3J0ZWQgYnkgZXh0ZW5zaW9uIGZvciBkb2N1bWVudDogXCIgKyBvQ29udGV4dC5nZXRQYXRoKCkpKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFoYXNQcmVwYXJlQWN0aW9uKG9Db250ZXh0KSkge1xuXHRcdFx0XHRyZXR1cm4gZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihvQ29udGV4dCwgb0FwcENvbXBvbmVudCk7XG5cdFx0XHR9XG5cblx0XHRcdC8qIGFjdGl2YXRpb24gcmVxdWlyZXMgcHJlcGFyYXRpb24gKi9cblx0XHRcdGNvbnN0IHNCYXRjaEdyb3VwID0gXCJkcmFmdFwiO1xuXHRcdFx0Ly8gd2UgdXNlIHRoZSBzYW1lIGJhdGNoR3JvdXAgdG8gZm9yY2UgcHJlcGFyZSBhbmQgYWN0aXZhdGUgaW4gYSBzYW1lIGJhdGNoIGJ1dCB3aXRoIGRpZmZlcmVudCBjaGFuZ2VzZXRcblx0XHRcdGNvbnN0IG9QcmVwYXJlUHJvbWlzZSA9IGV4ZWN1dGVEcmFmdFByZXBhcmF0aW9uQWN0aW9uKG9Db250ZXh0LCBvQXBwQ29tcG9uZW50LCB7XG5cdFx0XHRcdGdyb3VwSWQ6IHNCYXRjaEdyb3VwLFxuXHRcdFx0XHRiUHJlcGFyZUZvckVkaXQ6IGZhbHNlXG5cdFx0XHR9KTtcblx0XHRcdG9Db250ZXh0LmdldE1vZGVsKCkuc3VibWl0QmF0Y2goc0JhdGNoR3JvdXApO1xuXG5cdFx0XHRjb25zdCBvQWN0aXZhdGVQcm9taXNlID0gZXhlY3V0ZURyYWZ0QWN0aXZhdGlvbkFjdGlvbihvQ29udGV4dCwgb0FwcENvbXBvbmVudCwgc0JhdGNoR3JvdXApO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoW29QcmVwYXJlUHJvbWlzZSwgb0FjdGl2YXRlUHJvbWlzZV0pXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uKHZhbHVlczogW2FueSwgYW55XSkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZXNbMV07XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbihleGM6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChleGMpO1xuXHRcdFx0XHR9KTtcblx0XHR9KVxuXHRcdC50aGVuKGZ1bmN0aW9uKG9BY3RpdmVEb2N1bWVudENvbnRleHQ6IGFueSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShcblx0XHRcdFx0bVBhcmFtLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50ID8gbVBhcmFtLmZuQWZ0ZXJBY3RpdmF0ZURvY3VtZW50KG9Db250ZXh0LCBvQWN0aXZlRG9jdW1lbnRDb250ZXh0KSA6IG9BY3RpdmVEb2N1bWVudENvbnRleHRcblx0XHRcdCk7XG5cdFx0fSlcblx0XHQuY2F0Y2goZnVuY3Rpb24oZXhjOiBhbnkpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChleGMpO1xuXHRcdH0pO1xufVxuLyoqXG4gKiBIVFRQIFBPU1QgY2FsbCB3aGVuIERyYWZ0QWN0aW9uIGlzIHByZXNlbnQgZm9yIERyYWZ0IERlbGV0ZTsgSFRUUCBERUxFVEUgZm9yIERyYWZ0KHdoZW4gbm8gRHJhZnRBY3Rpb24pXG4gKiBhbmQgQWN0aXZlIEluc3RhbmNlIHVzZXMgREVMRVRFIGFsd2F5cy5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIHNhcC5mZS5jb3JlLmFjdGlvbnMuZHJhZnQjZGVsZXRlRHJhZnRcbiAqIEBtZW1iZXJvZiBzYXAuZmUuY29yZS5hY3Rpb25zLmRyYWZ0XG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3NhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0fSBvQ29udGV4dCBDb250ZXh0IG9mIHRoZSBkb2N1bWVudCB0byBiZSBkaXNjYXJkZWRcbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqIEB1aTUtcmVzdHJpY3RlZFxuICovXG5mdW5jdGlvbiBkZWxldGVEcmFmdChvQ29udGV4dDogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG5cdGNvbnN0IHNEaXNjYXJkQWN0aW9uID0gZ2V0QWN0aW9uTmFtZShvQ29udGV4dCwgZHJhZnRPcGVyYXRpb25zLkRJU0NBUkQpLFxuXHRcdGJJc0FjdGl2ZUVudGl0eSA9IG9Db250ZXh0LmdldE9iamVjdCgpLklzQWN0aXZlRW50aXR5O1xuXG5cdGlmIChiSXNBY3RpdmVFbnRpdHkgfHwgKCFiSXNBY3RpdmVFbnRpdHkgJiYgIXNEaXNjYXJkQWN0aW9uKSkge1xuXHRcdC8vVXNlIERlbGV0ZSBpbiBjYXNlIG9mIGFjdGl2ZSBlbnRpdHkgYW5kIG5vIGRpc2NhcmQgYWN0aW9uIGF2YWlsYWJsZSBmb3IgZHJhZnRcblx0XHRpZiAob0NvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSkge1xuXHRcdFx0cmV0dXJuIG9Db250ZXh0XG5cdFx0XHRcdC5nZXRCaW5kaW5nKClcblx0XHRcdFx0LnJlc2V0Q2hhbmdlcygpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBvQ29udGV4dC5kZWxldGUoKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uKGVycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIG9Db250ZXh0LmRlbGV0ZSgpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvL1VzZSBEaXNjYXJkIFBvc3QgQWN0aW9uIGlmIGl0IGlzIGEgZHJhZnQgZW50aXR5IGFuZCBkaXNjYXJkIGFjdGlvbiBleGlzdHNcblx0XHRyZXR1cm4gZXhlY3V0ZURyYWZ0RGlzY2FyZEFjdGlvbihvQ29udGV4dCk7XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZHJhZnQ7XG4iXX0=
|