@sapui5/sap.fe.templates 1.100.0 → 1.102.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.
Files changed (150) hide show
  1. package/package.json +4 -5
  2. package/src/sap/fe/templates/.library +1 -2
  3. package/src/sap/fe/templates/AnalyticalListPage/Component.js +24 -12
  4. package/src/sap/fe/templates/AnalyticalListPage/Component.ts +6 -0
  5. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +30 -32
  6. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.ts +25 -0
  7. package/src/sap/fe/templates/Feedback.js +80 -0
  8. package/src/sap/fe/templates/Feedback.ts +67 -0
  9. package/src/sap/fe/templates/ListComponent.js +156 -118
  10. package/src/sap/fe/templates/ListComponent.ts +105 -0
  11. package/src/sap/fe/templates/ListReport/Component.js +82 -53
  12. package/src/sap/fe/templates/ListReport/Component.ts +39 -0
  13. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +126 -112
  14. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +106 -0
  15. package/src/sap/fe/templates/ListReport/ListReport.view.xml +106 -58
  16. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +1196 -1081
  17. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +1088 -0
  18. package/src/sap/fe/templates/ListReport/ListReportTemplating.js +45 -0
  19. package/src/sap/fe/templates/ListReport/ListReportTemplating.ts +30 -0
  20. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +54 -53
  21. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +55 -0
  22. package/src/sap/fe/templates/ListReport/overrides/Share.js +137 -137
  23. package/src/sap/fe/templates/ListReport/overrides/Share.ts +135 -0
  24. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +451 -428
  25. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +419 -0
  26. package/src/sap/fe/templates/ListReport/view/fragments/CollectionVisualization.fragment.xml +25 -25
  27. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +72 -0
  28. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.ts +62 -0
  29. package/src/sap/fe/templates/ListReport/view/fragments/{MultipleMode.fragment.xml → MultipleModeOld.fragment.xml} +24 -23
  30. package/src/sap/fe/templates/ObjectPage/Component.js +169 -138
  31. package/src/sap/fe/templates/ObjectPage/Component.ts +131 -0
  32. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +140 -142
  33. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +116 -0
  34. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +162 -22
  35. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +1534 -1447
  36. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +1454 -0
  37. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +872 -0
  38. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +837 -0
  39. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +136 -101
  40. package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.ts +84 -0
  41. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +24 -21
  42. package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.ts +10 -0
  43. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +98 -53
  44. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.ts +50 -0
  45. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +20 -19
  46. package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.ts +15 -0
  47. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +50 -47
  48. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.ts +47 -0
  49. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +34 -34
  50. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.ts +34 -0
  51. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.js +15 -15
  52. package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.ts +13 -0
  53. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.js +11 -11
  54. package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.ts +7 -0
  55. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +55 -52
  56. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +57 -0
  57. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +15 -17
  58. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +13 -0
  59. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +13 -17
  60. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.ts +14 -0
  61. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +23 -21
  62. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.ts +21 -0
  63. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +310 -317
  64. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +316 -0
  65. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +66 -57
  66. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +65 -0
  67. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +26 -33
  68. package/src/sap/fe/templates/ObjectPage/view/fragments/CollaborationDraft.fragment.xml +11 -10
  69. package/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +15 -15
  70. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +31 -27
  71. package/src/sap/fe/templates/ObjectPage/view/fragments/FormActionButtons.fragment.xml +15 -16
  72. package/src/sap/fe/templates/ObjectPage/view/fragments/FormActions.fragment.xml +1 -5
  73. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPoint.fragment.xml +1 -2
  74. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPointTitle.fragment.xml +1 -3
  75. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacet.fragment.xml +3 -4
  76. package/src/sap/fe/templates/ObjectPage/view/fragments/Heading.fragment.xml +16 -17
  77. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingTitle.fragment.xml +3 -3
  78. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +3 -3
  79. package/src/sap/fe/templates/ObjectPage/view/fragments/RelatedApps.fragment.xml +7 -4
  80. package/src/sap/fe/templates/ObjectPage/view/fragments/Section.fragment.xml +71 -6
  81. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContent.fragment.xml +114 -94
  82. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContentLazyLoader.fragment.xml +127 -107
  83. package/src/sap/fe/templates/ObjectPage/view/fragments/SwitchDraftAndActiveObjectPopOver.fragment.xml +27 -0
  84. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +899 -817
  85. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +833 -0
  86. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +205 -189
  87. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.ts +178 -0
  88. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +484 -459
  89. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.ts +438 -0
  90. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +16 -14
  91. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +20 -0
  92. package/src/sap/fe/templates/TableScroller.js +45 -53
  93. package/src/sap/fe/templates/TableScroller.ts +48 -0
  94. package/src/sap/fe/templates/controls/Chart.fragment.xml +18 -17
  95. package/src/sap/fe/templates/controls/MacroChart.fragment.xml +23 -0
  96. package/src/sap/fe/templates/controls/Table.fragment.xml +3 -4
  97. package/src/sap/fe/templates/library.js +49 -63
  98. package/src/sap/fe/templates/library.ts +57 -0
  99. package/src/sap/fe/templates/messagebundle.properties +19 -7
  100. package/src/sap/fe/templates/messagebundle_ar.properties +12 -4
  101. package/src/sap/fe/templates/messagebundle_bg.properties +12 -4
  102. package/src/sap/fe/templates/messagebundle_ca.properties +12 -4
  103. package/src/sap/fe/templates/messagebundle_cs.properties +12 -4
  104. package/src/sap/fe/templates/messagebundle_cy.properties +12 -4
  105. package/src/sap/fe/templates/messagebundle_da.properties +12 -4
  106. package/src/sap/fe/templates/messagebundle_de.properties +12 -4
  107. package/src/sap/fe/templates/messagebundle_el.properties +12 -4
  108. package/src/sap/fe/templates/messagebundle_en.properties +12 -4
  109. package/src/sap/fe/templates/messagebundle_en_GB.properties +12 -4
  110. package/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +13 -5
  111. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +13 -5
  112. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +13 -5
  113. package/src/sap/fe/templates/messagebundle_es.properties +12 -4
  114. package/src/sap/fe/templates/messagebundle_es_MX.properties +12 -4
  115. package/src/sap/fe/templates/messagebundle_et.properties +12 -4
  116. package/src/sap/fe/templates/messagebundle_fi.properties +12 -4
  117. package/src/sap/fe/templates/messagebundle_fr.properties +12 -4
  118. package/src/sap/fe/templates/messagebundle_fr_CA.properties +12 -4
  119. package/src/sap/fe/templates/messagebundle_hi.properties +12 -4
  120. package/src/sap/fe/templates/messagebundle_hr.properties +12 -4
  121. package/src/sap/fe/templates/messagebundle_hu.properties +12 -4
  122. package/src/sap/fe/templates/messagebundle_id.properties +12 -4
  123. package/src/sap/fe/templates/messagebundle_it.properties +12 -4
  124. package/src/sap/fe/templates/messagebundle_iw.properties +12 -4
  125. package/src/sap/fe/templates/messagebundle_ja.properties +12 -4
  126. package/src/sap/fe/templates/messagebundle_kk.properties +12 -4
  127. package/src/sap/fe/templates/messagebundle_ko.properties +12 -4
  128. package/src/sap/fe/templates/messagebundle_lt.properties +12 -4
  129. package/src/sap/fe/templates/messagebundle_lv.properties +12 -4
  130. package/src/sap/fe/templates/messagebundle_ms.properties +12 -4
  131. package/src/sap/fe/templates/messagebundle_nl.properties +12 -4
  132. package/src/sap/fe/templates/messagebundle_no.properties +12 -4
  133. package/src/sap/fe/templates/messagebundle_pl.properties +12 -4
  134. package/src/sap/fe/templates/messagebundle_pt.properties +13 -5
  135. package/src/sap/fe/templates/messagebundle_pt_PT.properties +12 -4
  136. package/src/sap/fe/templates/messagebundle_ro.properties +12 -4
  137. package/src/sap/fe/templates/messagebundle_ru.properties +12 -4
  138. package/src/sap/fe/templates/messagebundle_sh.properties +12 -4
  139. package/src/sap/fe/templates/messagebundle_sk.properties +12 -4
  140. package/src/sap/fe/templates/messagebundle_sl.properties +12 -4
  141. package/src/sap/fe/templates/messagebundle_sv.properties +12 -4
  142. package/src/sap/fe/templates/messagebundle_th.properties +12 -4
  143. package/src/sap/fe/templates/messagebundle_tr.properties +12 -4
  144. package/src/sap/fe/templates/messagebundle_uk.properties +12 -4
  145. package/src/sap/fe/templates/messagebundle_vi.properties +12 -4
  146. package/src/sap/fe/templates/messagebundle_zh_CN.properties +12 -4
  147. package/src/sap/fe/templates/messagebundle_zh_TW.properties +12 -4
  148. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.js +0 -518
  149. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.js +0 -120
  150. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.ts +0 -138
@@ -1,1450 +1,1537 @@
1
1
  /*!
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
- (c) Copyright 2009-2021 SAP SE. All rights reserved
4
-
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
5
4
  */
6
- sap.ui.define(
7
- [
8
- "sap/fe/core/PageController",
9
- "sap/fe/core/controllerextensions/InternalRouting",
10
- "./overrides/InternalRouting",
11
- "sap/fe/core/controllerextensions/EditFlow",
12
- "sap/fe/core/controllerextensions/InternalEditFlow",
13
- "sap/fe/core/controllerextensions/PageReady",
14
- "sap/fe/core/controllerextensions/InternalIntentBasedNavigation",
15
- "sap/fe/core/controllerextensions/IntentBasedNavigation",
16
- "./overrides/IntentBasedNavigation",
17
- "sap/base/Log",
18
- "sap/base/util/merge",
19
- "sap/fe/core/CommonUtils",
20
- "sap/fe/navigation/SelectionVariant",
21
- "sap/fe/macros/table/Utils",
22
- "sap/m/MessageBox",
23
- "sap/fe/core/BusyLocker",
24
- "sap/m/Link",
25
- "sap/fe/macros/chart/ChartRuntime",
26
- "sap/fe/templates/ObjectPage/ExtensionAPI",
27
- "sap/ui/core/mvc/OverrideExecution",
28
- "sap/fe/core/controllerextensions/ViewState",
29
- "./overrides/ViewState",
30
- "sap/fe/templates/RootContainer/overrides/EditFlow",
31
- "sap/fe/core/helpers/ModelHelper",
32
- "sap/fe/core/controllerextensions/Routing",
33
- "sap/m/InstanceManager",
34
- "sap/fe/core/controllerextensions/MessageHandler",
35
- "./overrides/MessageHandler",
36
- "sap/fe/core/controllerextensions/Share",
37
- "./overrides/Share",
38
- "sap/fe/macros/DelegateUtil",
39
- "sap/fe/macros/CommonHelper",
40
- "sap/fe/templates/TableScroller",
41
- "sap/ui/model/json/JSONModel",
42
- "sap/fe/core/controllerextensions/Paginator",
43
- "./overrides/Paginator",
44
- "sap/fe/core/controllerextensions/Placeholder",
45
- "sap/base/util/UriParameters",
46
- "sap/fe/core/controllerextensions/MassEdit",
47
- "sap/fe/core/actions/collaboration/ActivitySync",
48
- "sap/fe/core/actions/collaboration/Manage"
49
- ],
50
- function(
51
- PageController,
52
- InternalRouting,
53
- InternalRoutingOverride,
54
- EditFlow,
55
- InternalEditFlow,
56
- PageReady,
57
- InternalIntentBasedNavigation,
58
- IntentBasedNavigation,
59
- IntentBasedNavigationOverride,
60
- Log,
61
- merge,
62
- CommonUtils,
63
- SelectionVariant,
64
- TableUtils,
65
- MessageBox,
66
- BusyLocker,
67
- Link,
68
- ChartRuntime,
69
- ExtensionAPI,
70
- OverrideExecution,
71
- ViewState,
72
- ViewStateOverrides,
73
- EditFlowOverrides,
74
- ModelHelper,
75
- Routing,
76
- InstanceManager,
77
- MessageHandler,
78
- MessageHandlerOverride,
79
- Share,
80
- ShareOverrides,
81
- DelegateUtil,
82
- CommonHelper,
83
- TableScroller,
84
- JSONModel,
85
- Paginator,
86
- PaginatorOverride,
87
- Placeholder,
88
- UriParameters,
89
- MassEdit,
90
- collaborationActivitySync,
91
- collaborationManage
92
- ) {
93
- "use strict";
94
-
95
- return PageController.extend("sap.fe.templates.ObjectPage.ObjectPageController", {
96
- metadata: {
97
- methods: {
98
- getExtensionAPI: {
99
- "public": true,
100
- "final": true
101
- },
102
- onPageReady: {
103
- "public": true,
104
- "final": false,
105
- overrideExecution: OverrideExecution.After
106
- }
107
- }
108
- },
109
- placeholder: Placeholder,
110
- editFlow: EditFlow,
111
- share: Share.override(ShareOverrides),
112
- _editFlow: InternalEditFlow.override(EditFlowOverrides),
113
- _routing: InternalRouting.override(InternalRoutingOverride),
114
- paginator: Paginator.override(PaginatorOverride),
115
- messageHandler: MessageHandler.override(MessageHandlerOverride),
116
- intentBasedNavigation: IntentBasedNavigation.override(IntentBasedNavigationOverride),
117
- _intentBasedNavigation: InternalIntentBasedNavigation.override({
118
- getNavigationMode: function() {
119
- var bIsStickyEditMode =
120
- this._oView.getController().getStickyEditMode && this._oView.getController().getStickyEditMode();
121
- return bIsStickyEditMode ? "explace" : undefined;
122
- }
123
- }),
124
- viewState: ViewState.override(ViewStateOverrides),
125
- pageReady: PageReady.override({
126
- isContextExpected: function() {
127
- return true;
128
- }
129
- }),
130
- massEdit: MassEdit,
131
-
132
- getExtensionAPI: function(sId) {
133
- if (sId) {
134
- // to allow local ID usage for custom pages we'll create/return own instances for custom sections
135
- this.mCustomSectionExtensionAPIs = this.mCustomSectionExtensionAPIs || {};
136
-
137
- if (!this.mCustomSectionExtensionAPIs[sId]) {
138
- this.mCustomSectionExtensionAPIs[sId] = new ExtensionAPI(this, sId);
139
- }
140
- return this.mCustomSectionExtensionAPIs[sId];
141
- } else {
142
- if (!this.extensionAPI) {
143
- this.extensionAPI = new ExtensionAPI(this);
144
- }
145
- return this.extensionAPI;
146
- }
147
- },
148
-
149
- onInit: function() {
150
- PageController.prototype.onInit.apply(this);
151
- var oObjectPage = this.byId("fe::ObjectPage");
152
-
153
- // Setting defaults of internal model context
154
- var oInternalModelContext = this.getView().getBindingContext("internal");
155
- oInternalModelContext.setProperty("externalNavigationContext", { "page": true });
156
- oInternalModelContext.setProperty("relatedApps", {
157
- visibility: false,
158
- items: null
159
- });
160
- oInternalModelContext.setProperty("batchGroups", this._getBatchGroupsForView());
161
- oInternalModelContext.setProperty("errorNavigationSectionFlag", false);
162
- if (!this.getView().getViewData().useNewLazyLoading && oObjectPage.getEnableLazyLoading()) {
163
- //Attaching the event to make the subsection context binding active when it is visible.
164
- oObjectPage.attachEvent("subSectionEnteredViewPort", this._handleSubSectionEnteredViewPort.bind(this));
165
- }
166
- },
167
-
168
- onExit: function() {
169
- var that = this;
170
- if (this.mCustomSectionExtensionAPIs) {
171
- Object.keys(this.mCustomSectionExtensionAPIs).forEach(function(sId) {
172
- that.mCustomSectionExtensionAPIs[sId] && that.mCustomSectionExtensionAPIs[sId].destroy();
173
- });
174
- delete this.mCustomSectionExtensionAPIs;
175
- }
176
- this.extensionAPI && this.extensionAPI.destroy();
177
- delete this.extensionAPI;
178
-
179
- var oMessageButton = this.getView().byId("fe::FooterBar::MessageButton"),
180
- oMessagePopover = oMessageButton ? oMessageButton.oMessagePopover : null;
181
- if (oMessagePopover && oMessagePopover.isOpen()) {
182
- oMessagePopover.close();
183
- }
184
- },
185
-
186
- _getTableBinding: function(oTable) {
187
- return oTable && oTable.getRowBinding();
188
- },
189
-
190
- onBeforeRendering: function() {
191
- PageController.prototype.onBeforeRendering.apply(this);
192
- },
193
-
194
- onAfterRendering: function(oEvent) {
195
- var that = this;
196
- this.getView()
197
- .getModel("sap.fe.i18n")
198
- .getResourceBundle()
199
- .then(function(response) {
200
- that.oResourceBundle = response;
201
- })
202
- .catch(function(oError) {
203
- Log.error("Error while retrieving the resource bundle", oError);
204
- });
205
- },
206
-
207
- _onBeforeBinding: function(oContext, mParameters) {
208
- // TODO: we should check how this comes together with the transaction helper, same to the change in the afterBinding
209
- var that = this,
210
- aTables = this._findTables(),
211
- oFastCreationRow,
212
- oObjectPage = this.byId("fe::ObjectPage"),
213
- oInternalModelContext = that.getView().getBindingContext("internal"),
214
- oInternalModel = that.getView().getModel("internal"),
215
- aBatchGroups = oInternalModelContext.getProperty("batchGroups"),
216
- iViewLevel = this.getView().getViewData().viewLevel;
217
-
218
- aBatchGroups.push("$auto");
219
- if (mParameters.bDraftNavigation !== true) {
220
- this._closeSideContent();
221
- }
222
- if (
223
- oObjectPage.getBindingContext() &&
224
- oObjectPage.getBindingContext().hasPendingChanges() &&
225
- !aBatchGroups.some(
226
- oObjectPage
227
- .getBindingContext()
228
- .getModel()
229
- .hasPendingChanges.bind(oObjectPage.getBindingContext().getModel())
230
- )
231
- ) {
232
- /* In case there are pending changes for the creation row and no others we need to reset the changes
233
- TODO: this is just a quick solution, this needs to be reworked
234
- */
235
-
236
- oObjectPage
237
- .getBindingContext()
238
- .getBinding()
239
- .resetChanges();
240
- }
241
-
242
- // For now we have to set the binding context to null for every fast creation row
243
- // TODO: Get rid of this coding or move it to another layer - to be discussed with MDC and model
244
- for (var i = 0; i < aTables.length; i++) {
245
- oFastCreationRow = aTables[i].getCreationRow();
246
- if (oFastCreationRow) {
247
- oFastCreationRow.setBindingContext(null);
248
- }
249
- }
250
-
251
- // Scroll to present Section so that bindings are enabled during navigation through paginator buttons, as there is no view rerendering/rebind
252
- var fnScrollToPresentSection = function(oEvent) {
253
- if (!oObjectPage.isFirstRendering() && !mParameters.bPersistOPScroll) {
254
- oObjectPage.setSelectedSection(null);
255
- }
256
- };
257
- oObjectPage.attachEventOnce("modelContextChange", fnScrollToPresentSection);
258
-
259
- // if the structure of the ObjectPageLayout is changed then scroll to present Section
260
- // FIXME Is this really working as intended ? Initially this was onBeforeRendering, but never triggered onBeforeRendering because it was registered after it
261
- var oDelegateOnBefore = {
262
- onAfterRendering: fnScrollToPresentSection
263
- };
264
- oObjectPage.addEventDelegate(oDelegateOnBefore, that);
265
- this.pageReady.attachEventOnce("pageReady", function(oEvent) {
266
- oObjectPage.removeEventDelegate(oDelegateOnBefore);
267
- });
268
-
269
- //Set the Binding for Paginators using ListBinding ID
270
- if (iViewLevel > 1) {
271
- var oBinding = mParameters && mParameters.listBinding,
272
- oPaginatorCurrentContext = oInternalModel.getProperty("/paginatorCurrentContext");
273
- if (oPaginatorCurrentContext) {
274
- var oBindingToUse = oPaginatorCurrentContext.getBinding();
275
- this.paginator.initialize(oBindingToUse, oPaginatorCurrentContext);
276
- oInternalModel.setProperty("/paginatorCurrentContext", null);
277
- } else if (oBinding) {
278
- if (oBinding.isA("sap.ui.model.odata.v4.ODataListBinding")) {
279
- this.paginator.initialize(oBinding, oContext);
280
- } else {
281
- //if the binding type is not ODataListBinding because of a deeplink navigation or a refresh of the page
282
- // we need to create it
283
- var sContextPath = oBinding.getPath().replace(/\([^\)]*\)*$/, ""); //removing the last tuple
284
- oBinding = new sap.ui.model.odata.v4.ODataListBinding(
285
- oBinding.oModel,
286
- "",
287
- oBinding.oModel.createBindingContext(sContextPath)
288
- );
289
-
290
- oBinding.getContexts(0);
291
- oBinding.attachEvent("change", function _setListBindingAsync() {
292
- if (oBinding.getContexts().length > 0) {
293
- that.paginator.initialize(oBinding, oContext);
294
- oBinding.detachEvent("change", _setListBindingAsync);
295
- }
296
- });
297
- }
298
- }
299
- }
300
- if (!this.getView().getViewData().useNewLazyLoading && oObjectPage.getEnableLazyLoading()) {
301
- var aSections = oObjectPage.getSections(),
302
- bUseIconTabBar = oObjectPage.getUseIconTabBar(),
303
- iSkip = 2,
304
- bIsInEditMode = oObjectPage.getModel("ui").getProperty("/editMode") === "Editable",
305
- bEditableHeader = this.getView().getViewData().editableHeaderContent;
306
- for (var iSection = 0; iSection < aSections.length; iSection++) {
307
- var oSection = aSections[iSection];
308
- var aSubSections = oSection.getSubSections();
309
- for (var iSubSection = 0; iSubSection < aSubSections.length; iSubSection++, iSkip--) {
310
- // In IconTabBar mode keep the second section bound if there is an editable header and we are switching to display mode
311
- if (iSkip < 1 || (bUseIconTabBar && (iSection > 1 || (iSection === 1 && !bEditableHeader && !bIsInEditMode)))) {
312
- var oSubSection = aSubSections[iSubSection];
313
- if (oSubSection.data().isVisibilityDynamic !== "true") {
314
- oSubSection.setBindingContext(null);
315
- }
316
- }
317
- }
318
- }
319
- }
320
-
321
- if (this.placeholder.isPlaceholderEnabled() && mParameters.showPlaceholder) {
322
- var oView = this.getView();
323
- var oNavContainer = oView.getParent().oContainer.getParent();
324
- if (oNavContainer) {
325
- oNavContainer.showPlaceholder({});
326
- }
327
- }
328
- },
329
-
330
- _getFirstClickableElement: function(oObjectPage) {
331
- var oFirstClickableElement;
332
- var aActions = oObjectPage.getHeaderTitle() && oObjectPage.getHeaderTitle().getActions();
333
- if (aActions && aActions.length) {
334
- oFirstClickableElement = aActions.find(function(oAction) {
335
- return oAction.getVisible() && oAction.getEnabled();
336
- });
337
- }
338
- return oFirstClickableElement;
339
- },
340
-
341
- _getFirstEmptyMandatoryFieldFromSubSection: function(aSubSections) {
342
- if (aSubSections) {
343
- for (var subSection = 0; subSection < aSubSections.length; subSection++) {
344
- var aBlocks = aSubSections[subSection].getBlocks();
345
-
346
- if (aBlocks) {
347
- for (var block = 0; block < aBlocks.length; block++) {
348
- var aFormContainers;
349
-
350
- if (aBlocks[block].isA("sap.ui.layout.form.Form")) {
351
- aFormContainers = aBlocks[block].getFormContainers();
352
- } else if (
353
- aBlocks[block].getContent &&
354
- aBlocks[block].getContent() &&
355
- aBlocks[block].getContent().isA("sap.ui.layout.form.Form")
356
- ) {
357
- aFormContainers = aBlocks[block].getContent().getFormContainers();
358
- }
359
-
360
- if (aFormContainers) {
361
- for (var formContainer = 0; formContainer < aFormContainers.length; formContainer++) {
362
- var aFormElements = aFormContainers[formContainer].getFormElements();
363
- if (aFormElements) {
364
- for (var formElement = 0; formElement < aFormElements.length; formElement++) {
365
- var aFields = aFormElements[formElement].getFields();
366
-
367
- // The first field is not necessarily an InputBase (e.g. could be a Text)
368
- // So we need to check whether it has a getRequired method
369
- if (aFields[0].getRequired && aFields[0].getRequired() && !aFields[0].getValue()) {
370
- return aFields[0];
371
- }
372
- }
373
- }
374
- }
375
- }
376
- }
377
- }
378
- }
379
- }
380
- return undefined;
381
- },
382
-
383
- _updateFocusInEditMode: function(aSubSections) {
384
- var oObjectPage = this.byId("fe::ObjectPage");
385
-
386
- var oMandatoryField = this._getFirstEmptyMandatoryFieldFromSubSection(aSubSections);
387
- var oFieldToFocus;
388
- if (oMandatoryField) {
389
- oFieldToFocus = oMandatoryField.content.getContentEdit()[0];
390
- } else {
391
- oFieldToFocus = oObjectPage._getFirstEditableInput() || this._getFirstClickableElement(oObjectPage);
392
- }
393
-
394
- if (oFieldToFocus) {
395
- setTimeout(function() {
396
- // We set the focus in a timeeout, otherwise the focus sometimes goes to the TabBar
397
- oFieldToFocus.focus();
398
- }, 0);
399
- }
400
- },
401
-
402
- _handleSubSectionEnteredViewPort: function(oEvent) {
403
- var oSubSection = oEvent.getParameter("subSection");
404
- oSubSection.setBindingContext(undefined);
405
- },
406
-
407
- _onBackNavigationInDraft: function(oContext) {
408
- if (
409
- this.getAppComponent()
410
- .getRouterProxy()
411
- .checkIfBackHasSameContext()
412
- ) {
413
- // Back nav will keep the same context --> no need to display the dialog
414
- history.back();
415
- } else {
416
- CommonUtils.fnProcessDataLossOrDraftDiscardConfirmation(
417
- function() {
418
- history.back();
419
- },
420
- Function.prototype,
421
- oContext,
422
- this,
423
- false
424
- );
425
- }
426
- },
427
-
428
- _onAfterBinding: function(oBindingContext, mParameters) {
429
- var oObjectPage = this.byId("fe::ObjectPage"),
430
- that = this,
431
- aTables = this._findTables();
432
-
433
- this._sideEffects.clearPropertiesStatus();
434
-
435
- // TODO: this is only a temp solution as long as the model fix the cache issue and we use this additional
436
- // binding with ownRequest
437
- oBindingContext = oObjectPage.getBindingContext();
438
-
439
- var aIBNActions = [];
440
- oObjectPage.getSections().forEach(function(oSection) {
441
- oSection.getSubSections().forEach(function(oSubSection) {
442
- aIBNActions = CommonUtils.getIBNActions(oSubSection, aIBNActions);
443
- });
444
- });
445
-
446
- // Assign internal binding contexts to oFormContainer:
447
- // 1. It is not possible to assign the internal binding context to the XML fragment
448
- // (FormContainer.fragment.xml) yet - it is used already for the data-structure.
449
- // 2. Another problem is, that FormContainers assigned to a 'MoreBlock' does not have an
450
- // internal model context at all.
451
-
452
- aTables.forEach(function(oTable) {
453
- var oInternalModelContext = oTable.getBindingContext("internal");
454
- oInternalModelContext.setProperty("creationRowFieldValidity", {});
455
- oInternalModelContext.setProperty("creationRowCustomValidity", {});
456
-
457
- aIBNActions = CommonUtils.getIBNActions(oTable, aIBNActions);
458
- // temporary workaround for BCP: 2080218004
459
- // Need to fix with BLI: FIORITECHP1-15274
460
- // only for edit mode, we clear the table cache
461
- // Workaround starts here!!
462
- var oTableRowBinding = oTable.getRowBinding();
463
- if (oTableRowBinding) {
464
- if (ModelHelper.isStickySessionSupported(oTableRowBinding.getModel().getMetaModel())) {
465
- // apply for both edit and display mode in sticky
466
- oTableRowBinding.removeCachesAndMessages("");
467
- }
468
- }
469
- // Workaround ends here!!
470
-
471
- // Update 'enabled' property of DataFieldForAction buttons on table toolbar
472
- // The same is also performed on Table selectionChange event
473
- var oActionOperationAvailableMap = JSON.parse(
474
- CommonHelper.parseCustomData(DelegateUtil.getCustomData(oTable, "operationAvailableMap"))
475
- ),
476
- aSelectedContexts = oTable.getSelectedContexts();
477
-
478
- CommonUtils.setActionEnablement(oInternalModelContext, oActionOperationAvailableMap, aSelectedContexts);
479
- });
480
- CommonUtils.getSemanticTargetsFromPageModel(that, "_pageModel");
481
- //Retrieve Object Page header actions from Object Page title control
482
- var oObjectPageTitle = oObjectPage.getHeaderTitle();
483
- var aIBNHeaderActions = [];
484
- aIBNHeaderActions = CommonUtils.getIBNActions(oObjectPageTitle, aIBNHeaderActions);
485
- aIBNActions = aIBNActions.concat(aIBNHeaderActions);
486
- CommonUtils.updateDataFieldForIBNButtonsVisibility(aIBNActions, this.getView());
487
-
488
- var oModel, oFinalUIState;
489
-
490
- // TODO: this should be moved into an init event of the MDC tables (not yet existing) and should be part
491
- // of any controller extension
492
- /**
493
- * @param oTable
494
- * @param oListBinding
495
- */
496
- function enableFastCreationRow(oTable, oListBinding) {
497
- var oFastCreationRow = oTable.getCreationRow(),
498
- oFastCreationListBinding,
499
- oFastCreationContext;
500
-
501
- if (oFastCreationRow) {
502
- oFinalUIState
503
- .then(function() {
504
- if (oFastCreationRow.getModel("ui").getProperty("/isEditable")) {
505
- oFastCreationListBinding = oModel.bindList(oListBinding.getPath(), oListBinding.getContext(), [], [], {
506
- $$updateGroupId: "doNotSubmit",
507
- $$groupId: "doNotSubmit"
508
- });
509
- // Workaround suggested by OData model v4 colleagues
510
- oFastCreationListBinding.refreshInternal = function() {};
511
- /*
512
- oFastCreationListBinding.hasPendingChanges = function() {
513
- return false;
514
- };
515
- */
516
-
517
- oFastCreationContext = oFastCreationListBinding.create();
518
- oFastCreationRow.setBindingContext(oFastCreationContext);
519
-
520
- // this is needed to avoid console error
521
- oFastCreationContext.created().catch(function() {
522
- Log.trace("transient fast creation context deleted");
523
- });
524
- }
525
- })
526
- .catch(function(oError) {
527
- Log.error("Error while computing the final UI state", oError);
528
- });
529
- }
530
- }
531
-
532
- // this should not be needed at the all
533
- /**
534
- * @param oTable
535
- */
536
- function handleTableModifications(oTable) {
537
- var oBinding = that._getTableBinding(oTable),
538
- fnHandleTablePatchEvents = function() {
539
- enableFastCreationRow(oTable, oBinding);
540
- };
541
-
542
- if (!oBinding) {
543
- Log.error("Expected binding missing for table: " + oTable.getId());
544
- return;
545
- }
546
-
547
- if (oBinding.oContext) {
548
- fnHandleTablePatchEvents();
549
- } else {
550
- var fnHandleChange = function() {
551
- if (oBinding.oContext) {
552
- fnHandleTablePatchEvents();
553
- oBinding.detachChange(fnHandleChange);
554
- }
555
- };
556
- oBinding.attachChange(fnHandleChange);
557
- }
558
- }
559
-
560
- if (oBindingContext) {
561
- oModel = oBindingContext.getModel();
562
-
563
- // Compute Edit Mode
564
- oFinalUIState = this._editFlow.computeEditMode(oBindingContext);
565
-
566
- if (ModelHelper.isCollaborationDraftSupported(oModel.getMetaModel())) {
567
- oFinalUIState
568
- .then(function() {
569
- if (
570
- that
571
- .getView()
572
- .getModel("ui")
573
- .getProperty("/isEditable")
574
- ) {
575
- collaborationActivitySync.connect(that.getView());
576
- }
577
- })
578
- .catch(function(oError) {
579
- Log.error("Error while waiting for the final UI State", oError);
580
- });
581
- }
582
-
583
- // update related apps once Data is received in case of binding cache is not available
584
- // TODO: this is only a temp solution since we need to call _updateRelatedApps method only after data for Object Page is received (if there is no binding)
585
- if (oBindingContext.getBinding().oCache) {
586
- that._updateRelatedApps();
587
- } else {
588
- var fnUpdateRelatedApps = function() {
589
- that._updateRelatedApps();
590
- oBindingContext.getBinding().detachDataReceived(fnUpdateRelatedApps);
591
- };
592
- oBindingContext.getBinding().attachDataReceived(fnUpdateRelatedApps);
593
- }
594
-
595
- //Attach the patch sent and patch completed event to the object page binding so that we can react
596
- var oBinding = (oBindingContext.getBinding && oBindingContext.getBinding()) || oBindingContext;
597
- oBinding.attachEvent("patchSent", this.editFlow.handlePatchSent, this);
598
- oBinding.attachEvent("patchCompleted", this.editFlow.handlePatchCompleted, this);
599
-
600
- aTables.forEach(function(oTable) {
601
- // access binding only after table is bound
602
- TableUtils.whenBound(oTable)
603
- .then(handleTableModifications)
604
- .catch(function(oError) {
605
- Log.error("Error while waiting for the table to be bound", oError);
606
- });
607
- });
608
-
609
- if (!this.getView().getViewData().useNewLazyLoading) {
610
- // should be called only after binding is ready hence calling it in onAfterBinding
611
- oObjectPage._triggerVisibleSubSectionsEvents();
612
- }
613
- }
614
- },
615
- onPageReady: function(mParameters) {
616
- // Apply app state only after the page is ready with the first section selected
617
- var that = this;
618
- var oView = this.getView();
619
- var oInternalModelContext = oView.getBindingContext("internal");
620
- var oBindingContext = oView.getBindingContext();
621
- //Show popup while navigating back from object page in case of draft
622
- if (oBindingContext) {
623
- var bIsStickyMode = ModelHelper.isStickySessionSupported(oBindingContext.getModel().getMetaModel());
624
- if (!bIsStickyMode) {
625
- var oAppComponent = CommonUtils.getAppComponent(oView);
626
- oAppComponent.getShellServices().setBackNavigation(that._onBackNavigationInDraft.bind(that, oBindingContext));
627
- }
628
- }
629
- this.getAppComponent()
630
- .getAppStateHandler()
631
- .applyAppState();
632
-
633
- if (mParameters.forceFocus) {
634
- var oObjectPage = this.byId("fe::ObjectPage");
635
- // set the focus to the first action button, or to the first editable input if in editable mode
636
- var isInDisplayMode = oObjectPage.getModel("ui").getProperty("/editMode") === "Display";
637
- var aVisibleSections = oObjectPage.getSections().filter(function(oSection) {
638
- return oSection.getVisible() === true;
639
- });
640
- // Select the first visible section
641
- oObjectPage.setSelectedSection(aVisibleSections[0].getId());
642
-
643
- if (isInDisplayMode) {
644
- var oFirstClickableElement = this._getFirstClickableElement(oObjectPage);
645
- if (oFirstClickableElement) {
646
- oFirstClickableElement.focus();
647
- }
648
- } else {
649
- var aVisibleSubSections;
650
- if (oView.getViewData().sectionLayout === "Tabs") {
651
- // In a tabbed layout, only the subsections of the selected section are visible on the screen
652
- aVisibleSubSections = aVisibleSections[0].getSubSections();
653
- } else {
654
- // In a paged layout, all subsections of the visible sections are visible on the screen
655
- aVisibleSubSections = aVisibleSections
656
- .map(function(oSection) {
657
- return oSection.getSubSections();
658
- })
659
- .flat();
660
- }
661
- this._updateFocusInEditMode(aVisibleSubSections);
662
- }
663
- }
664
-
665
- oInternalModelContext.setProperty("errorNavigationSectionFlag", false);
666
- this._checkDataPointTitleForExternalNavigation();
667
- },
668
- /**
669
- * Get the status of edit mode for sticky session.
670
- *
671
- * @returns {boolean} The status of edit mode for sticky session
672
- *
673
- *
674
- */
675
- getStickyEditMode: function() {
676
- var oBindingContext = this.oView.getBindingContext && this.oView.getBindingContext(),
677
- bIsStickyEditMode = false;
678
- if (oBindingContext) {
679
- var bIsStickyMode = ModelHelper.isStickySessionSupported(oBindingContext.getModel().getMetaModel());
680
- if (bIsStickyMode) {
681
- bIsStickyEditMode = this.oView.getModel("ui").getProperty("/isEditable");
682
- }
683
- }
684
- return bIsStickyEditMode;
685
- },
686
-
687
- _getObjectPageLayoutControl: function() {
688
- return this.byId("fe::ObjectPage");
689
- },
690
-
691
- _getPageTitleInformation: function() {
692
- var oObjectPage = this.byId("fe::ObjectPage");
693
- var oObjectPageSubtitle = oObjectPage.getCustomData().find(function(oCustomData) {
694
- return oCustomData.getKey() === "ObjectPageSubtitle";
695
- });
696
- var oTitleInfo = {
697
- title: oObjectPage.data("ObjectPageTitle") || "",
698
- subtitle: oObjectPageSubtitle && oObjectPageSubtitle.getValue(),
699
- intent: "",
700
- icon: ""
701
- };
702
-
703
- return oTitleInfo;
704
- },
705
-
706
- _executeHeaderShortcut: function(sId) {
707
- var sButtonId = this.getView().getId() + "--" + sId,
708
- oButton = this.byId("fe::ObjectPage")
709
- .getHeaderTitle()
710
- .getActions()
711
- .find(function(oElement) {
712
- return oElement.getId() === sButtonId;
713
- });
714
- CommonUtils.fireButtonPress(oButton);
715
- },
716
-
717
- _executeFooterShortcut: function(sId) {
718
- var sButtonId = this.getView().getId() + "--" + sId,
719
- oButton = this.byId("fe::ObjectPage")
720
- .getFooter()
721
- .getContent()
722
- .find(function(oElement) {
723
- return oElement.getMetadata().getName() === "sap.m.Button" && oElement.getId() === sButtonId;
724
- });
725
- CommonUtils.fireButtonPress(oButton);
726
- },
727
-
728
- _executeTabShortCut: function(oExecution) {
729
- var oObjectPage = this.byId("fe::ObjectPage"),
730
- iSelectedSectionIndex = oObjectPage.indexOfSection(this.byId(oObjectPage.getSelectedSection())),
731
- aSections = oObjectPage.getSections(),
732
- iSectionIndexMax = aSections.length - 1,
733
- sCommand = oExecution.oSource.getCommand(),
734
- newSection;
735
- if (iSelectedSectionIndex !== -1 && iSectionIndexMax > 0) {
736
- if (sCommand === "NextTab") {
737
- if (iSelectedSectionIndex <= iSectionIndexMax - 1) {
738
- newSection = aSections[++iSelectedSectionIndex];
739
- }
740
- } else {
741
- // PreviousTab
742
- if (iSelectedSectionIndex !== 0) {
743
- newSection = aSections[--iSelectedSectionIndex];
744
- }
745
- }
746
- if (newSection) {
747
- oObjectPage.setSelectedSection(newSection);
748
- newSection.focus();
749
- }
750
- }
751
- },
752
-
753
- _getFooterVisibility: function(oEvent) {
754
- var oInternalModelContext = this.getView().getBindingContext("internal");
755
- var sViewId = this.getView().getId();
756
- oInternalModelContext.setProperty("messageFooterContainsErrors", false);
757
- sap.ui
758
- .getCore()
759
- .getMessageManager()
760
- .getMessageModel()
761
- .getData()
762
- .forEach(function(oMessage) {
763
- if (oMessage.validation && oMessage.type === "Error" && oMessage.target.indexOf(sViewId) > -1) {
764
- oInternalModelContext.setProperty("messageFooterContainsErrors", true);
765
- }
766
- });
767
- },
768
-
769
- _showMessagePopover: function(err, oRet) {
770
- if (err) {
771
- Log.error(err);
772
- }
773
- var that = this;
774
- if (
775
- !this.getAppComponent()
776
- .getRootContainer()
777
- .getCurrentPage()
778
- .isA("sap.m.MessagePage")
779
- ) {
780
- var oMessageButton = that.getView().byId("fe::FooterBar::MessageButton"),
781
- oMessagePopover = oMessageButton.oMessagePopover,
782
- oItemBinding = oMessagePopover.getBinding("items");
783
-
784
- if (oItemBinding.getLength() > 0 && !oMessagePopover.isOpen()) {
785
- oMessageButton.setVisible(true);
786
- // workaround to ensure that oMessageButton is rendered when openBy is called
787
- setTimeout(function() {
788
- oMessagePopover.openBy(oMessageButton);
789
- }, 0);
790
- }
791
- }
792
- return oRet;
793
- },
794
-
795
- _editDocument: function(oContext) {
796
- var oModel = this.getView().getModel("ui");
797
- BusyLocker.lock(oModel);
798
- return this.editFlow.editDocument.apply(this.editFlow, [oContext]).finally(function() {
799
- BusyLocker.unlock(oModel);
800
- });
801
- },
802
-
803
- _saveDocument: function(oContext) {
804
- var that = this,
805
- oModel = this.getView().getModel("ui"),
806
- aWaitCreateDocuments = [];
807
- // indicates if we are creating a new row in the OP
808
- var bExecuteSideEffectsOnError = false;
809
- BusyLocker.lock(oModel);
810
- this._findTables().forEach(function(oTable) {
811
- var oBinding = that._getTableBinding(oTable);
812
- var mParameters = {
813
- creationMode: oTable.data("creationMode"),
814
- creationRow: oTable.getCreationRow(),
815
- createAtEnd: oTable.data("createAtEnd") === "true"
816
- };
817
- var bCreateDocument =
818
- mParameters.creationRow &&
819
- mParameters.creationRow.getBindingContext() &&
820
- Object.keys(mParameters.creationRow.getBindingContext().getObject()).length > 1;
821
- if (bCreateDocument) {
822
- // the bSkipSideEffects is a parameter created when we click the save key. If we press this key
823
- // we don't execute the handleSideEffects funciton to avoid batch redundancy
824
- mParameters.bSkipSideEffects = true;
825
- bExecuteSideEffectsOnError = true;
826
- aWaitCreateDocuments.push(
827
- that.editFlow.createDocument(oBinding, mParameters).then(function() {
828
- return oBinding;
829
- })
830
- );
831
- }
832
- });
833
- return Promise.all(aWaitCreateDocuments)
834
- .then(function(aBindings) {
835
- var mParameters = {
836
- bExecuteSideEffectsOnError: bExecuteSideEffectsOnError,
837
- bindings: aBindings
838
- };
839
- return that.editFlow.saveDocument(oContext, mParameters).catch(that._showMessagePopover.bind(that));
840
- })
841
- .finally(function() {
842
- if (BusyLocker.isLocked(oModel)) {
843
- BusyLocker.unlock(oModel);
844
- }
845
- });
846
- },
847
-
848
- _manageCollaboration: function() {
849
- collaborationManage.openManageDialog(this.getView());
850
- },
851
-
852
- _showCollaborationUserDetails: function(event) {
853
- collaborationManage.showUserDetails(event, this.getView());
854
- },
855
-
856
- _cancelDocument: function(oContext, mParameters) {
857
- mParameters.cancelButton = this.getView().byId(mParameters.cancelButton); //to get the reference of the cancel button from command execution
858
- return this.editFlow.cancelDocument(oContext, mParameters);
859
- },
860
-
861
- _applyDocument: function(oContext) {
862
- var that = this;
863
- return this.editFlow.applyDocument(oContext).catch(that._showMessagePopover.bind(that));
864
- },
865
-
866
- _updateRelatedApps: function() {
867
- var oObjectPage = this.byId("fe::ObjectPage");
868
- if (CommonUtils.resolveStringtoBoolean(oObjectPage.data("showRelatedApps"))) {
869
- CommonUtils.updateRelatedAppsDetails(oObjectPage);
870
- }
871
- },
872
-
873
- _findTableInSubSection: function(aParentElement, aSubsection, aTables) {
874
- var aSubSectionTables = [];
875
- for (var element = 0; element < aParentElement.length; element++) {
876
- var oElement = aParentElement[element].getContent instanceof Function && aParentElement[element].getContent();
877
- if (oElement && oElement.isA && oElement.isA("sap.ui.layout.DynamicSideContent")) {
878
- oElement = oElement.getMainContent instanceof Function && oElement.getMainContent();
879
- if (oElement && oElement.length > 0) {
880
- oElement = oElement[0];
881
- }
882
- }
883
- if (oElement && oElement.isA && oElement.isA("sap.fe.macros.TableAPI")) {
884
- oElement = oElement.getContent instanceof Function && oElement.getContent();
885
- if (oElement && oElement.length > 0) {
886
- oElement = oElement[0];
887
- }
888
- }
889
- if (oElement && oElement.isA && oElement.isA("sap.ui.mdc.Table")) {
890
- aTables.push(oElement);
891
- aSubSectionTables.push({
892
- "table": oElement,
893
- "gridTable": oElement.getType().isA("sap.ui.mdc.table.GridTableType")
894
- });
895
- }
896
- }
897
- if (
898
- aSubSectionTables.length === 1 &&
899
- aParentElement.length === 1 &&
900
- aSubSectionTables[0].gridTable &&
901
- !aSubsection.hasStyleClass("sapUxAPObjectPageSubSectionFitContainer")
902
- ) {
903
- //In case there is only a single table in a section we fit that to the whole page so that the scrollbar comes only on table and not on page
904
- aSubsection.addStyleClass("sapUxAPObjectPageSubSectionFitContainer");
905
- } else {
906
- if (aSubSectionTables && !aSubsection.hasStyleClass("sapUxAPObjectPageSubSectionFitContainer")) {
907
- aSubSectionTables.forEach(function(oTable) {
908
- if (oTable.gridTable) {
909
- //Resetting the row count to default value in case we have a combination of forms and tables or multiple tables in a subsection
910
- oTable.table.getType().setRowCount(null);
911
- }
912
- });
913
- }
914
- }
915
- },
916
-
917
- _getAllSubSections: function() {
918
- var oObjectPage = this.byId("fe::ObjectPage"),
919
- aSubSections = [];
920
- oObjectPage.getSections().forEach(function(oSection) {
921
- aSubSections = aSubSections.concat(oSection.getSubSections());
922
- });
923
- return aSubSections;
924
- },
925
-
926
- _getAllBlocks: function() {
927
- var aBlocks = [];
928
- this._getAllSubSections().forEach(function(oSubSection) {
929
- aBlocks = aBlocks.concat(oSubSection.getBlocks());
930
- });
931
- return aBlocks;
932
- },
933
-
934
- //TODO: This is needed for two workarounds - to be removed again
935
- _findTables: function() {
936
- var aSubSections = this._getAllSubSections(),
937
- aTables = [];
938
- for (var subSection = 0; subSection < aSubSections.length; subSection++) {
939
- this._findTableInSubSection(aSubSections[subSection].getBlocks(), aSubSections[subSection], aTables);
940
- this._findTableInSubSection(aSubSections[subSection].getMoreBlocks(), aSubSections[subSection], aTables);
941
- }
942
- return aTables;
943
- },
944
-
945
- _closeSideContent: function() {
946
- this._getAllBlocks().forEach(function(oBlock) {
947
- var oContent = oBlock.getContent instanceof Function && oBlock.getContent();
948
- if (oContent && oContent.isA && oContent.isA("sap.ui.layout.DynamicSideContent")) {
949
- if (oContent.setShowSideContent instanceof Function) {
950
- oContent.setShowSideContent(false);
951
- }
952
- }
953
- });
954
- },
955
-
956
- /**
957
- * Chart Context is resolved for 1:n microcharts.
958
- *
959
- * @param {sap.ui.model.Context} oChartContext The Context of the MicroChart
960
- * @param {string} sChartPath The collectionPath of the the chart
961
- * @returns {Array} Array of Attributes of the chart Context
962
- */
963
- _getChartContextData: function(oChartContext, sChartPath) {
964
- var oContextData = oChartContext.getObject(),
965
- oChartContextData = [oContextData];
966
- if (oChartContext && sChartPath) {
967
- if (oContextData[sChartPath]) {
968
- oChartContextData = oContextData[sChartPath];
969
- delete oContextData[sChartPath];
970
- oChartContextData.push(oContextData);
971
- }
972
- }
973
- return oChartContextData;
974
- },
975
-
976
- /**
977
- * Scroll the tables to the row with the sPath
978
- *
979
- * @function
980
- * @name sap.fe.templates.ObjectPage.ObjectPageController.controller#_scrollTablesToRow
981
- * @param {string} sRowPath 'sPath of the table row'
982
- *
983
- */
984
-
985
- _scrollTablesToRow: function(sRowPath) {
986
- if (this._findTables && this._findTables().length > 0) {
987
- var aTables = this._findTables();
988
- for (var i = 0; i < aTables.length; i++) {
989
- TableScroller.scrollTableToRow(aTables[i], sRowPath);
990
- }
991
- }
992
- },
993
-
994
- /**
995
- * Method to merge selected contexts and filters.
996
- *
997
- * @function
998
- * @name _mergeMultipleContexts
999
- * @param {object} oPageContext Page context
1000
- * @param {object|Array} aLineContext Selected Contexts
1001
- * @param {string} sChartPath Collection name of the chart
1002
- * @returns {object} Selection Variant Object
1003
- */
1004
- _mergeMultipleContexts: function(oPageContext, aLineContext, sChartPath) {
1005
- var that = this;
1006
- var aAttributes = [],
1007
- aPageAttributes = [],
1008
- oMetaModel,
1009
- oContext,
1010
- sMetaPathLine,
1011
- sMetaPathPage,
1012
- sPathLine,
1013
- oPageLevelSV,
1014
- sPagePath;
1015
-
1016
- sPagePath = oPageContext.getPath();
1017
- oMetaModel = oPageContext && oPageContext.getModel() && oPageContext.getModel().getMetaModel();
1018
- sMetaPathPage = oMetaModel && oMetaModel.getMetaPath(sPagePath).replace(/^\/*/, "");
1019
-
1020
- // Get single line context if necessary
1021
- if (aLineContext && aLineContext.length) {
1022
- oContext = aLineContext[0];
1023
- sPathLine = oContext.getPath();
1024
- sMetaPathLine = oMetaModel && oMetaModel.getMetaPath(sPathLine).replace(/^\/*/, "");
1025
-
1026
- aLineContext.map(function(oSingleContext) {
1027
- if (sChartPath) {
1028
- var oChartContextData = that._getChartContextData(oSingleContext, sChartPath);
1029
- if (oChartContextData) {
1030
- aAttributes = oChartContextData.map(function(oChartContextData) {
1031
- return {
1032
- contextData: oChartContextData,
1033
- entitySet: sMetaPathPage + "/" + sChartPath
1034
- };
1035
- });
1036
- }
1037
- } else {
1038
- aAttributes.push({
1039
- contextData: oSingleContext.getObject(),
1040
- entitySet: sMetaPathLine
1041
- });
1042
- }
1043
- });
1044
- }
1045
- aPageAttributes.push({
1046
- contextData: oPageContext.getObject(),
1047
- entitySet: sMetaPathPage
1048
- });
1049
- // Adding Page Context to selection variant
1050
- aPageAttributes = CommonUtils.removeSensitiveData(aPageAttributes, oMetaModel);
1051
- oPageLevelSV = CommonUtils.addPageContextToSelectionVariant(new SelectionVariant(), aPageAttributes, that.getView());
1052
- aAttributes = CommonUtils.removeSensitiveData(aAttributes, oMetaModel);
1053
- return {
1054
- selectionVariant: oPageLevelSV,
1055
- attributes: aAttributes
1056
- };
1057
- },
1058
-
1059
- _getBatchGroupsForView: function() {
1060
- var that = this,
1061
- oViewData = that.getView().getViewData(),
1062
- oConfigurations = oViewData.controlConfiguration,
1063
- aConfigurations = oConfigurations && Object.keys(oConfigurations),
1064
- aBatchGroups = ["$auto.Heroes", "$auto.Decoration", "$auto.Workers"];
1065
-
1066
- if (aConfigurations && aConfigurations.length > 0) {
1067
- aConfigurations.forEach(function(sKey) {
1068
- var oConfiguration = oConfigurations[sKey];
1069
- if (oConfiguration.requestGroupId === "LongRunners") {
1070
- aBatchGroups.push("$auto.LongRunners");
1071
- }
1072
- });
1073
- }
1074
- return aBatchGroups;
1075
- },
1076
-
1077
- /*
1078
- * Reset Breadcrumb links
1079
- *
1080
- * @function
1081
- * @param {sap.m.Breadcrumbs} [oSource] parent control
1082
- * @description Used when context of the objectpage changes.
1083
- * This event callback is attached to modelContextChange
1084
- * event of the Breadcrumb control to catch context change.
1085
- * Then element binding and hrefs are updated for each Link.
1086
- *
1087
- * @ui5-restricted
1088
- * @experimental
1089
- */
1090
- _setBreadcrumbLinks: function(oSource) {
1091
- var oContext = oSource.getBindingContext();
1092
- var oAppComponent = this.getAppComponent();
1093
- if (oContext) {
1094
- var sNewPath = oContext.getPath(),
1095
- aPathParts = sNewPath.split("/"),
1096
- sPath = "",
1097
- oMetaModel = oAppComponent.getMetaModel(),
1098
- iSkipParameterized = 0;
1099
-
1100
- aPathParts.shift();
1101
- aPathParts.splice(-1, 1);
1102
- aPathParts.forEach(function(sPathPart, i) {
1103
- sPath += "/" + sPathPart;
1104
- var oRootViewController = oAppComponent.getRootViewController();
1105
- var pWaitForTitleHiearchyInfo;
1106
- var sParameterPath = oMetaModel.getMetaPath(sPath);
1107
- var bResultContext = oMetaModel.getObject(sParameterPath + "/@com.sap.vocabularies.Common.v1.ResultContext");
1108
- if (bResultContext) {
1109
- // We dont need to create a breadcrumb for Parameter path
1110
- iSkipParameterized = 1;
1111
- return;
1112
- }
1113
-
1114
- pWaitForTitleHiearchyInfo = oRootViewController.getTitleInfoFromPath(sPath);
1115
-
1116
- pWaitForTitleHiearchyInfo
1117
- .then(function(oTitleHiearchyInfo) {
1118
- var idx = i - iSkipParameterized,
1119
- oLink = oSource.getLinks()[idx] ? oSource.getLinks()[idx] : new Link();
1120
- // sCurrentEntity is a fallback value in case of empty title
1121
- oLink.setText(oTitleHiearchyInfo.subtitle || oTitleHiearchyInfo.title);
1122
- oLink.setHref(oTitleHiearchyInfo.intent);
1123
- if (!oSource.getLinks()[idx]) {
1124
- oSource.addLink(oLink);
1125
- }
1126
- })
1127
- .catch(function(oError) {
1128
- Log.error("Error while computing the title hierarchy", oError);
1129
- });
1130
- });
1131
- }
1132
- },
1133
- _checkDataPointTitleForExternalNavigation: function() {
1134
- var oView = this.getView();
1135
- var oInternalModelContext = oView.getBindingContext("internal");
1136
- var oDataPoints = CommonUtils.getHeaderFacetItemConfigForExternalNavigation(
1137
- oView.getViewData(),
1138
- this.getAppComponent()
1139
- .getRoutingService()
1140
- .getOutbounds()
1141
- );
1142
- var oShellServices = this.getAppComponent().getShellServices();
1143
- var oPageContext = oView && oView.getBindingContext();
1144
- oInternalModelContext.setProperty("isHeaderDPLinkVisible", {});
1145
- if (oPageContext) {
1146
- oPageContext
1147
- .requestObject()
1148
- .then(function(oData) {
1149
- fnGetLinks(oDataPoints, oData);
1150
- })
1151
- .catch(function(oError) {
1152
- Log.error("Cannot retrieve the links from the shell service", oError);
1153
- });
1154
- }
1155
- /**
1156
- * @param oError
1157
- */
1158
- function fnOnError(oError) {
1159
- Log.error(oError);
1160
- }
1161
- /**
1162
- * @param aSupportedLinks
1163
- */
1164
- function fnSetLinkEnablement(aSupportedLinks) {
1165
- var sLinkId = this.id;
1166
- // process viable links from getLinks for all datapoints having outbound
1167
- if (aSupportedLinks && aSupportedLinks.length === 1 && aSupportedLinks[0].supported) {
1168
- oInternalModelContext.setProperty("isHeaderDPLinkVisible/" + sLinkId, true);
1169
- }
1170
- }
1171
- /**
1172
- * @param oDataPoints
1173
- * @param oPageData
1174
- */
1175
- function fnGetLinks(oDataPoints, oPageData) {
1176
- for (var sId in oDataPoints) {
1177
- var oDataPoint = oDataPoints[sId];
1178
- var oParams = {};
1179
- var oLink = oView.byId(sId);
1180
- if (!oLink) {
1181
- // for data points configured in app descriptor but not annotated in the header
1182
- continue;
1183
- }
1184
- var oLinkContext = oLink.getBindingContext();
1185
- var oLinkData = oLinkContext && oLinkContext.getObject();
1186
- var oMixedContext = merge({}, oPageData, oLinkData);
1187
- // process semantic object mappings
1188
- if (oDataPoint.semanticObjectMapping) {
1189
- var aSemanticObjectMapping = oDataPoint.semanticObjectMapping;
1190
- for (var item in aSemanticObjectMapping) {
1191
- var oMapping = aSemanticObjectMapping[item];
1192
- var sMainProperty = oMapping["LocalProperty"]["$PropertyPath"];
1193
- var sMappedProperty = oMapping["SemanticObjectProperty"];
1194
- if (sMainProperty !== sMappedProperty) {
1195
- if (oMixedContext.hasOwnProperty(sMainProperty)) {
1196
- var oNewMapping = {};
1197
- oNewMapping[sMappedProperty] = oMixedContext[sMainProperty];
1198
- oMixedContext = merge({}, oMixedContext, oNewMapping);
1199
- delete oMixedContext[sMainProperty];
1200
- }
1201
- }
1202
- }
1203
- }
1204
-
1205
- if (oMixedContext) {
1206
- for (var sKey in oMixedContext) {
1207
- if (sKey.indexOf("_") !== 0 && sKey.indexOf("odata.context") === -1) {
1208
- oParams[sKey] = oMixedContext[sKey];
1209
- }
1210
- }
1211
- }
1212
- // validate if a link must be rendered
1213
- oShellServices
1214
- .isNavigationSupported([
1215
- {
1216
- target: {
1217
- semanticObject: oDataPoint.semanticObject,
1218
- action: oDataPoint.action
1219
- },
1220
- params: oParams
1221
- }
1222
- ])
1223
- .then(
1224
- fnSetLinkEnablement.bind({
1225
- id: sId
1226
- })
1227
- )
1228
- .catch(fnOnError);
1229
- }
1230
- }
1231
- },
1232
- handlers: {
1233
- onTableContextChange: function(oEvent) {
1234
- var that = this;
1235
- var oSource = oEvent.getSource();
1236
- var oTable;
1237
- this._findTables().some(function(_oTable) {
1238
- if (_oTable.getRowBinding() === oSource) {
1239
- oTable = _oTable;
1240
- return true;
1241
- }
1242
- return false;
1243
- });
1244
-
1245
- var oCurrentActionPromise = this._editFlow.getCurrentActionPromise();
1246
- if (oCurrentActionPromise) {
1247
- var aTableContexts;
1248
- if (
1249
- oTable
1250
- .getType()
1251
- .getMetadata()
1252
- .isA("sap.ui.mdc.table.GridTableType")
1253
- ) {
1254
- aTableContexts = oSource.getContexts(0);
1255
- } else {
1256
- aTableContexts = oSource.getCurrentContexts();
1257
- }
1258
- //if contexts are not fully loaded the getcontexts function above will trigger a new change event call
1259
- if (!aTableContexts[0]) {
1260
- return;
1261
- }
1262
- oCurrentActionPromise
1263
- .then(function(oActionResponse) {
1264
- if (!oActionResponse || oActionResponse.controlId !== oTable.sId) {
1265
- return;
1266
- }
1267
- var oActionData = oActionResponse.oData;
1268
- var aKeys = oActionResponse.keys;
1269
- var iNewItemp = -1;
1270
- aTableContexts.find(function(oTableContext, i) {
1271
- var oTableData = oTableContext.getObject();
1272
- var bCompare = aKeys.every(function(sKey) {
1273
- return oTableData[sKey] === oActionData[sKey];
1274
- });
1275
- if (bCompare) {
1276
- iNewItemp = i;
1277
- }
1278
- return bCompare;
1279
- });
1280
- if (iNewItemp !== -1) {
1281
- var aDialogs = InstanceManager.getOpenDialogs();
1282
- var oDialog = aDialogs.length > 0 ? aDialogs[0] : null;
1283
- if (oDialog) {
1284
- // by design, a sap.m.dialog set the focus to the previous focused element when closing.
1285
- // we should wait for the dialog to be close before to focus another element
1286
- oDialog.attachEventOnce("afterClose", function() {
1287
- oTable.focusRow(iNewItemp, true);
1288
- });
1289
- } else {
1290
- oTable.focusRow(iNewItemp, true);
1291
- }
1292
- that._editFlow.deleteCurrentActionPromise();
1293
- }
1294
- })
1295
- .catch(function(err) {
1296
- Log.error("An error occurs while scrolling to the newly created Item: " + err);
1297
- });
1298
- }
1299
- // fire ModelContextChange on the message button whenever the table context changes
1300
- var oMessageButton = that.getView().byId("fe::FooterBar::MessageButton");
1301
- oMessageButton.fireModelContextChange();
1302
- },
1303
-
1304
- /**
1305
- * Invokes an action - bound/unbound and sets the page dirty.
1306
- *
1307
- * @param oView
1308
- * @param {string} sActionName The name of the action to be called
1309
- * @param {map} [mParameters] Contains the following attributes:
1310
- * @param {sap.ui.model.odata.v4.Context} [mParameters.contexts] Mandatory for a bound action, either one context or an array with contexts for which the action shall be called
1311
- * @param {sap.ui.model.odata.v4.ODataModel} [mParameters.model] Mandatory for an unbound action; an instance of an OData V4 model
1312
- * @returns {Promise}
1313
- * @ui5-restricted
1314
- * @final
1315
- */
1316
- onCallAction: function(oView, sActionName, mParameters) {
1317
- var oController = oView.getController();
1318
- var that = oController;
1319
- return oController.editFlow
1320
- .invokeAction(sActionName, mParameters)
1321
- .then(that._showMessagePopover.bind(that, undefined))
1322
- .catch(that._showMessagePopover.bind(that));
1323
- },
1324
- onDataPointTitlePressed: function(oController, oSource, oManifestOutbound, sControlConfig, sCollectionPath) {
1325
- oManifestOutbound = typeof oManifestOutbound === "string" ? JSON.parse(oManifestOutbound) : oManifestOutbound;
1326
- var oTargetInfo = oManifestOutbound[sControlConfig],
1327
- aSemanticObjectMapping = CommonUtils.getSemanticObjectMapping(oTargetInfo),
1328
- oDataPointOrChartBindingContext = oSource.getBindingContext(),
1329
- sMetaPath = oDataPointOrChartBindingContext
1330
- .getModel()
1331
- .getMetaModel()
1332
- .getMetaPath(oDataPointOrChartBindingContext.getPath()),
1333
- aNavigationData = oController._getChartContextData(oDataPointOrChartBindingContext, sCollectionPath),
1334
- additionalNavigationParameters;
1335
-
1336
- aNavigationData = aNavigationData.map(function(oNavigationData) {
1337
- return {
1338
- data: oNavigationData,
1339
- metaPath: sMetaPath + (sCollectionPath ? "/" + sCollectionPath : "")
1340
- };
1341
- });
1342
- if (oTargetInfo && oTargetInfo.parameters) {
1343
- var oParams =
1344
- oTargetInfo.parameters && oController._intentBasedNavigation.getOutboundParams(oTargetInfo.parameters);
1345
- if (Object.keys(oParams).length > 0) {
1346
- additionalNavigationParameters = oParams;
1347
- }
1348
- }
1349
- if (oTargetInfo && oTargetInfo.semanticObject && oTargetInfo.action) {
1350
- oController._intentBasedNavigation.navigate(oTargetInfo.semanticObject, oTargetInfo.action, {
1351
- navigationContexts: aNavigationData,
1352
- semanticObjectMapping: aSemanticObjectMapping,
1353
- additionalNavigationParameters: additionalNavigationParameters
1354
- });
1355
- }
1356
- },
1357
- /**
1358
- * Triggers an outbound navigation when a user chooses the chevron.
1359
- *
1360
- * @param {object} oController
1361
- * @param {string} sOutboundTarget Name of the outbound target (needs to be defined in the manifest)
1362
- * @param {sap.ui.model.odata.v4.Context} oContext The context that contains the data for the target app
1363
- * @param {string} sCreatePath Create path when the chevron is created.
1364
- * @returns {Promise} Promise which is resolved once the navigation is triggered (??? maybe only once finished?)
1365
- * @ui5-restricted
1366
- * @final
1367
- */
1368
- onChevronPressNavigateOutBound: function(oController, sOutboundTarget, oContext, sCreatePath) {
1369
- return oController._intentBasedNavigation.onChevronPressNavigateOutBound(
1370
- oController,
1371
- sOutboundTarget,
1372
- oContext,
1373
- sCreatePath
1374
- );
1375
- },
1376
-
1377
- onNavigateChange: function(oEvent) {
1378
- //will be called always when we click on a section tab
1379
- this.getExtensionAPI().updateAppState();
1380
- this.bSectionNavigated = true;
1381
-
1382
- var oInternalModelContext = this.getView().getBindingContext("internal");
1383
- var oObjectPage = this.byId("fe::ObjectPage");
1384
- if (
1385
- oObjectPage.getModel("ui").getProperty("/editMode") !== "Display" &&
1386
- this.getView().getViewData().sectionLayout === "Tabs" &&
1387
- oInternalModelContext.getProperty("errorNavigationSectionFlag") === false
1388
- ) {
1389
- var oSubSection = oEvent.getParameter("subSection");
1390
- this._updateFocusInEditMode([oSubSection]);
1391
- }
1392
- },
1393
- onVariantSelected: function(oEvent) {
1394
- this.getExtensionAPI().updateAppState();
1395
- },
1396
- onVariantSaved: function(oEvent) {
1397
- var that = this;
1398
- //TODO: Should remove this setTimeOut once Variant Management provides an api to fetch the current variant key on save
1399
- setTimeout(function() {
1400
- that.getExtensionAPI().updateAppState();
1401
- }, 500);
1402
- },
1403
- navigateToSubSection: function(oController, vDetailConfig) {
1404
- var oDetailConfig = typeof vDetailConfig === "string" ? JSON.parse(vDetailConfig) : vDetailConfig,
1405
- oObjectPage = oController.getView().byId("fe::ObjectPage"),
1406
- oSection,
1407
- oSubSection;
1408
- if (oDetailConfig.sectionId) {
1409
- oSection = oController.getView().byId(oDetailConfig.sectionId);
1410
- oSubSection = oDetailConfig.subSectionId
1411
- ? oController.getView().byId(oDetailConfig.subSectionId)
1412
- : oSection && oSection.getSubSections() && oSection.getSubSections()[0];
1413
- } else if (oDetailConfig.subSectionId) {
1414
- oSubSection = oController.getView().byId(oDetailConfig.subSectionId);
1415
- oSection = oSubSection && oSubSection.getParent();
1416
- }
1417
- if (!oSection || !oSubSection || !oSection.getVisible() || !oSubSection.getVisible()) {
1418
- oController
1419
- .getView()
1420
- .getModel("sap.fe.i18n")
1421
- .getResourceBundle()
1422
- .then(function(oResourceBundle) {
1423
- var sTitle = CommonUtils.getTranslatedText(
1424
- "C_ROUTING_NAVIGATION_DISABLED_TITLE",
1425
- oResourceBundle,
1426
- null,
1427
- oController.getView().getViewData().entitySet
1428
- );
1429
- Log.error(sTitle);
1430
- MessageBox.error(sTitle);
1431
- })
1432
- .catch(function(error) {
1433
- Log.error(error);
1434
- });
1435
- } else {
1436
- oObjectPage.scrollToSection(oSubSection.getId());
1437
- // trigger iapp state change
1438
- oObjectPage.fireNavigate({
1439
- section: oSection,
1440
- subSection: oSubSection
1441
- });
1442
- }
1443
- },
1444
- onChartSelectionChanged: function(oEvent) {
1445
- ChartRuntime.fnUpdateChart(oEvent);
1446
- }
1447
- }
1448
- });
1449
- }
1450
- );
5
+ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/collaboration/Manage", "sap/fe/core/controllerextensions/EditFlow", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/IntentBasedNavigation", "sap/fe/core/controllerextensions/InternalEditFlow", "sap/fe/core/controllerextensions/InternalIntentBasedNavigation", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/MassEdit", "sap/fe/core/controllerextensions/MessageHandler", "sap/fe/core/controllerextensions/PageReady", "sap/fe/core/controllerextensions/Paginator", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/PageController", "sap/fe/macros/chart/ChartRuntime", "sap/fe/macros/CommonHelper", "sap/fe/macros/DelegateUtil", "sap/fe/macros/table/Utils", "sap/fe/navigation/SelectionVariant", "sap/fe/templates/ObjectPage/ExtensionAPI", "sap/fe/templates/RootContainer/overrides/EditFlow", "sap/fe/templates/TableScroller", "sap/m/InstanceManager", "sap/m/Link", "sap/m/MessageBox", "sap/ui/core/Core", "sap/ui/core/Fragment", "sap/ui/core/mvc/OverrideExecution", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/XMLTemplateProcessor", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/ODataListBinding", "./overrides/IntentBasedNavigation", "./overrides/InternalRouting", "./overrides/MessageHandler", "./overrides/Paginator", "./overrides/Share", "./overrides/ViewState"], function (Log, merge, CommonUtils, BusyLocker, ActivitySync, Manage, EditFlow, draft, IntentBasedNavigation, InternalEditFlow, InternalIntentBasedNavigation, InternalRouting, MassEdit, MessageHandler, PageReady, Paginator, Placeholder, Share, ViewState, ClassSupport, ModelHelper, PageController, ChartRuntime, CommonHelper, DelegateUtil, TableUtils, SelectionVariant, ExtensionAPI, EditFlowOverrides, TableScroller, InstanceManager, Link, MessageBox, Core, Fragment, OverrideExecution, XMLPreprocessor, XMLTemplateProcessor, JSONModel, ODataListBinding, IntentBasedNavigationOverride, InternalRoutingOverride, MessageHandlerOverride, PaginatorOverride, ShareOverrides, ViewStateOverrides) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _dec17, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor10, _descriptor11, _descriptor12;
9
+
10
+ var usingExtension = ClassSupport.usingExtension;
11
+ var publicExtension = ClassSupport.publicExtension;
12
+ var finalExtension = ClassSupport.finalExtension;
13
+ var extensible = ClassSupport.extensible;
14
+ var defineUI5Class = ClassSupport.defineUI5Class;
15
+ var showUserDetails = Manage.showUserDetails;
16
+ var openManageDialog = Manage.openManageDialog;
17
+ var connect = ActivitySync.connect;
18
+
19
+ function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
20
+
21
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
22
+
23
+ function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
24
+
25
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
26
+
27
+ function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
28
+
29
+ function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
30
+
31
+ var ObjectPageController = (_dec = defineUI5Class("sap.fe.templates.ObjectPage.ObjectPageController"), _dec2 = usingExtension(Placeholder), _dec3 = usingExtension(EditFlow), _dec4 = usingExtension(Share.override(ShareOverrides)), _dec5 = usingExtension(InternalEditFlow.override(EditFlowOverrides)), _dec6 = usingExtension(InternalRouting.override(InternalRoutingOverride)), _dec7 = usingExtension(Paginator.override(PaginatorOverride)), _dec8 = usingExtension(MessageHandler.override(MessageHandlerOverride)), _dec9 = usingExtension(IntentBasedNavigation.override(IntentBasedNavigationOverride)), _dec10 = usingExtension(InternalIntentBasedNavigation.override({
32
+ getNavigationMode: function () {
33
+ var bIsStickyEditMode = this.getView().getController().getStickyEditMode && this.getView().getController().getStickyEditMode();
34
+ return bIsStickyEditMode ? "explace" : undefined;
35
+ }
36
+ })), _dec11 = usingExtension(ViewState.override(ViewStateOverrides)), _dec12 = usingExtension(PageReady.override({
37
+ isContextExpected: function () {
38
+ return true;
39
+ }
40
+ })), _dec13 = usingExtension(MassEdit), _dec14 = publicExtension(), _dec15 = finalExtension(), _dec16 = publicExtension(), _dec17 = extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_PageController) {
41
+ _inheritsLoose(ObjectPageController, _PageController);
42
+
43
+ function ObjectPageController() {
44
+ var _this;
45
+
46
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
47
+ args[_key] = arguments[_key];
48
+ }
49
+
50
+ _this = _PageController.call.apply(_PageController, [this].concat(args)) || this;
51
+
52
+ _initializerDefineProperty(_this, "placeholder", _descriptor, _assertThisInitialized(_this));
53
+
54
+ _initializerDefineProperty(_this, "editFlow", _descriptor2, _assertThisInitialized(_this));
55
+
56
+ _initializerDefineProperty(_this, "share", _descriptor3, _assertThisInitialized(_this));
57
+
58
+ _initializerDefineProperty(_this, "_editFlow", _descriptor4, _assertThisInitialized(_this));
59
+
60
+ _initializerDefineProperty(_this, "_routing", _descriptor5, _assertThisInitialized(_this));
61
+
62
+ _initializerDefineProperty(_this, "paginator", _descriptor6, _assertThisInitialized(_this));
63
+
64
+ _initializerDefineProperty(_this, "messageHandler", _descriptor7, _assertThisInitialized(_this));
65
+
66
+ _initializerDefineProperty(_this, "intentBasedNavigation", _descriptor8, _assertThisInitialized(_this));
67
+
68
+ _initializerDefineProperty(_this, "_intentBasedNavigation", _descriptor9, _assertThisInitialized(_this));
69
+
70
+ _initializerDefineProperty(_this, "viewState", _descriptor10, _assertThisInitialized(_this));
71
+
72
+ _initializerDefineProperty(_this, "pageReady", _descriptor11, _assertThisInitialized(_this));
73
+
74
+ _initializerDefineProperty(_this, "massEdit", _descriptor12, _assertThisInitialized(_this));
75
+
76
+ _this.handlers = {
77
+ onTableContextChange: function (oEvent) {
78
+ var _this2 = this;
79
+
80
+ var oSource = oEvent.getSource();
81
+ var oTable;
82
+
83
+ this._findTables().some(function (_oTable) {
84
+ if (_oTable.getRowBinding() === oSource) {
85
+ oTable = _oTable;
86
+ return true;
87
+ }
88
+
89
+ return false;
90
+ });
91
+
92
+ var oCurrentActionPromise = this._editFlow.getCurrentActionPromise();
93
+
94
+ if (oCurrentActionPromise) {
95
+ var aTableContexts;
96
+
97
+ if (oTable.getType().getMetadata().isA("sap.ui.mdc.table.GridTableType")) {
98
+ aTableContexts = oSource.getContexts(0);
99
+ } else {
100
+ aTableContexts = oSource.getCurrentContexts();
101
+ } //if contexts are not fully loaded the getcontexts function above will trigger a new change event call
102
+
103
+
104
+ if (!aTableContexts[0]) {
105
+ return;
106
+ }
107
+
108
+ oCurrentActionPromise.then(function (oActionResponse) {
109
+ if (!oActionResponse || oActionResponse.controlId !== oTable.sId) {
110
+ return;
111
+ }
112
+
113
+ var oActionData = oActionResponse.oData;
114
+ var aKeys = oActionResponse.keys;
115
+ var iNewItemp = -1;
116
+ aTableContexts.find(function (oTableContext, i) {
117
+ var oTableData = oTableContext.getObject();
118
+ var bCompare = aKeys.every(function (sKey) {
119
+ return oTableData[sKey] === oActionData[sKey];
120
+ });
121
+
122
+ if (bCompare) {
123
+ iNewItemp = i;
124
+ }
125
+
126
+ return bCompare;
127
+ });
128
+
129
+ if (iNewItemp !== -1) {
130
+ var aDialogs = InstanceManager.getOpenDialogs();
131
+ var oDialog = aDialogs.length > 0 ? aDialogs.find(function (dialog) {
132
+ return dialog.data("FullScreenDialog") !== true;
133
+ }) : null;
134
+
135
+ if (oDialog) {
136
+ // by design, a sap.m.dialog set the focus to the previous focused element when closing.
137
+ // we should wait for the dialog to be close before to focus another element
138
+ oDialog.attachEventOnce("afterClose", function () {
139
+ oTable.focusRow(iNewItemp, true);
140
+ });
141
+ } else {
142
+ oTable.focusRow(iNewItemp, true);
143
+ }
144
+
145
+ _this2._editFlow.deleteCurrentActionPromise();
146
+ }
147
+ }).catch(function (err) {
148
+ Log.error("An error occurs while scrolling to the newly created Item: " + err);
149
+ });
150
+ } // fire ModelContextChange on the message button whenever the table context changes
151
+
152
+
153
+ var oMessageButton = this.getView().byId("fe::FooterBar::MessageButton");
154
+ oMessageButton.fireModelContextChange();
155
+ },
156
+
157
+ /**
158
+ * Invokes an action - bound/unbound and sets the page dirty.
159
+ *
160
+ * @param oView
161
+ * @param {string} sActionName The name of the action to be called
162
+ * @param {map} [mParameters] Contains the following attributes:
163
+ * @param {sap.ui.model.odata.v4.Context} [mParameters.contexts] Mandatory for a bound action, either one context or an array with contexts for which the action shall be called
164
+ * @param {sap.ui.model.odata.v4.ODataModel} [mParameters.model] Mandatory for an unbound action; an instance of an OData V4 model
165
+ * @returns {Promise}
166
+ * @ui5-restricted
167
+ * @final
168
+ */
169
+ onCallAction: function (oView, sActionName, mParameters) {
170
+ var oController = oView.getController();
171
+ var that = oController;
172
+ return oController.editFlow.invokeAction(sActionName, mParameters).then(that._showMessagePopover.bind(that, undefined)).catch(that._showMessagePopover.bind(that));
173
+ },
174
+ onDataPointTitlePressed: function (oController, oSource, oManifestOutbound, sControlConfig, sCollectionPath) {
175
+ oManifestOutbound = typeof oManifestOutbound === "string" ? JSON.parse(oManifestOutbound) : oManifestOutbound;
176
+ var oTargetInfo = oManifestOutbound[sControlConfig],
177
+ aSemanticObjectMapping = CommonUtils.getSemanticObjectMapping(oTargetInfo),
178
+ oDataPointOrChartBindingContext = oSource.getBindingContext(),
179
+ sMetaPath = oDataPointOrChartBindingContext.getModel().getMetaModel().getMetaPath(oDataPointOrChartBindingContext.getPath());
180
+
181
+ var aNavigationData = oController._getChartContextData(oDataPointOrChartBindingContext, sCollectionPath);
182
+
183
+ var additionalNavigationParameters;
184
+ aNavigationData = aNavigationData.map(function (oNavigationData) {
185
+ return {
186
+ data: oNavigationData,
187
+ metaPath: sMetaPath + (sCollectionPath ? "/" + sCollectionPath : "")
188
+ };
189
+ });
190
+
191
+ if (oTargetInfo && oTargetInfo.parameters) {
192
+ var oParams = oTargetInfo.parameters && oController._intentBasedNavigation.getOutboundParams(oTargetInfo.parameters);
193
+
194
+ if (Object.keys(oParams).length > 0) {
195
+ additionalNavigationParameters = oParams;
196
+ }
197
+ }
198
+
199
+ if (oTargetInfo && oTargetInfo.semanticObject && oTargetInfo.action) {
200
+ oController._intentBasedNavigation.navigate(oTargetInfo.semanticObject, oTargetInfo.action, {
201
+ navigationContexts: aNavigationData,
202
+ semanticObjectMapping: aSemanticObjectMapping,
203
+ additionalNavigationParameters: additionalNavigationParameters
204
+ });
205
+ }
206
+ },
207
+
208
+ /**
209
+ * Triggers an outbound navigation when a user chooses the chevron.
210
+ *
211
+ * @param {object} oController
212
+ * @param {string} sOutboundTarget Name of the outbound target (needs to be defined in the manifest)
213
+ * @param {sap.ui.model.odata.v4.Context} oContext The context that contains the data for the target app
214
+ * @param {string} sCreatePath Create path when the chevron is created.
215
+ * @returns {Promise} Promise which is resolved once the navigation is triggered (??? maybe only once finished?)
216
+ * @ui5-restricted
217
+ * @final
218
+ */
219
+ onChevronPressNavigateOutBound: function (oController, sOutboundTarget, oContext, sCreatePath) {
220
+ return oController._intentBasedNavigation.onChevronPressNavigateOutBound(oController, sOutboundTarget, oContext, sCreatePath);
221
+ },
222
+ onNavigateChange: function (oEvent) {
223
+ //will be called always when we click on a section tab
224
+ this.getExtensionAPI().updateAppState();
225
+ this.bSectionNavigated = true;
226
+ var oInternalModelContext = this.getView().getBindingContext("internal");
227
+
228
+ var oObjectPage = this._getObjectPageLayoutControl();
229
+
230
+ if (oObjectPage.getModel("ui").getProperty("/isEditable") && this.getView().getViewData().sectionLayout === "Tabs" && oInternalModelContext.getProperty("errorNavigationSectionFlag") === false) {
231
+ var oSubSection = oEvent.getParameter("subSection");
232
+
233
+ this._updateFocusInEditMode([oSubSection]);
234
+ }
235
+ },
236
+ onVariantSelected: function () {
237
+ this.getExtensionAPI().updateAppState();
238
+ },
239
+ onVariantSaved: function () {
240
+ var _this3 = this;
241
+
242
+ //TODO: Should remove this setTimeOut once Variant Management provides an api to fetch the current variant key on save
243
+ setTimeout(function () {
244
+ _this3.getExtensionAPI().updateAppState();
245
+ }, 500);
246
+ },
247
+ navigateToSubSection: function (oController, vDetailConfig) {
248
+ var oDetailConfig = typeof vDetailConfig === "string" ? JSON.parse(vDetailConfig) : vDetailConfig;
249
+ var oObjectPage = oController.getView().byId("fe::ObjectPage");
250
+ var oSection;
251
+ var oSubSection;
252
+
253
+ if (oDetailConfig.sectionId) {
254
+ oSection = oController.getView().byId(oDetailConfig.sectionId);
255
+ oSubSection = oDetailConfig.subSectionId ? oController.getView().byId(oDetailConfig.subSectionId) : oSection && oSection.getSubSections() && oSection.getSubSections()[0];
256
+ } else if (oDetailConfig.subSectionId) {
257
+ oSubSection = oController.getView().byId(oDetailConfig.subSectionId);
258
+ oSection = oSubSection && oSubSection.getParent();
259
+ }
260
+
261
+ if (!oSection || !oSubSection || !oSection.getVisible() || !oSubSection.getVisible()) {
262
+ oController.getView().getModel("sap.fe.i18n").getResourceBundle().then(function (oResourceBundle) {
263
+ var sTitle = CommonUtils.getTranslatedText("C_ROUTING_NAVIGATION_DISABLED_TITLE", oResourceBundle, null, oController.getView().getViewData().entitySet);
264
+ Log.error(sTitle);
265
+ MessageBox.error(sTitle);
266
+ }).catch(function (error) {
267
+ Log.error(error);
268
+ });
269
+ } else {
270
+ oObjectPage.scrollToSection(oSubSection.getId()); // trigger iapp state change
271
+
272
+ oObjectPage.fireNavigate({
273
+ section: oSection,
274
+ subSection: oSubSection
275
+ });
276
+ }
277
+ },
278
+ onChartSelectionChanged: function (oEvent) {
279
+ ChartRuntime.fnUpdateChart(oEvent);
280
+ }
281
+ };
282
+ return _this;
283
+ }
284
+
285
+ var _proto = ObjectPageController.prototype;
286
+
287
+ _proto.getExtensionAPI = function getExtensionAPI(sId) {
288
+ if (sId) {
289
+ // to allow local ID usage for custom pages we'll create/return own instances for custom sections
290
+ this.mCustomSectionExtensionAPIs = this.mCustomSectionExtensionAPIs || {};
291
+
292
+ if (!this.mCustomSectionExtensionAPIs[sId]) {
293
+ this.mCustomSectionExtensionAPIs[sId] = new ExtensionAPI(this, sId);
294
+ }
295
+
296
+ return this.mCustomSectionExtensionAPIs[sId];
297
+ } else {
298
+ if (!this.extensionAPI) {
299
+ this.extensionAPI = new ExtensionAPI(this);
300
+ }
301
+
302
+ return this.extensionAPI;
303
+ }
304
+ };
305
+
306
+ _proto.onInit = function onInit() {
307
+ _PageController.prototype.onInit.call(this);
308
+
309
+ var oObjectPage = this._getObjectPageLayoutControl(); // Setting defaults of internal model context
310
+
311
+
312
+ var oInternalModelContext = this.getView().getBindingContext("internal");
313
+ oInternalModelContext.setProperty("externalNavigationContext", {
314
+ "page": true
315
+ });
316
+ oInternalModelContext.setProperty("relatedApps", {
317
+ visibility: false,
318
+ items: null
319
+ });
320
+ oInternalModelContext.setProperty("batchGroups", this._getBatchGroupsForView());
321
+ oInternalModelContext.setProperty("errorNavigationSectionFlag", false);
322
+
323
+ if (!this.getView().getViewData().useNewLazyLoading && oObjectPage.getEnableLazyLoading()) {
324
+ //Attaching the event to make the subsection context binding active when it is visible.
325
+ oObjectPage.attachEvent("subSectionEnteredViewPort", this._handleSubSectionEnteredViewPort.bind(this));
326
+ }
327
+ };
328
+
329
+ _proto.onExit = function onExit() {
330
+ if (this.mCustomSectionExtensionAPIs) {
331
+ for (var _i = 0, _Object$keys = Object.keys(this.mCustomSectionExtensionAPIs); _i < _Object$keys.length; _i++) {
332
+ var sId = _Object$keys[_i];
333
+ this.mCustomSectionExtensionAPIs[sId] && this.mCustomSectionExtensionAPIs[sId].destroy();
334
+ }
335
+
336
+ delete this.mCustomSectionExtensionAPIs;
337
+ }
338
+
339
+ this.extensionAPI && this.extensionAPI.destroy();
340
+ delete this.extensionAPI;
341
+ var oMessageButton = this.getView().byId("fe::FooterBar::MessageButton"),
342
+ oMessagePopover = oMessageButton ? oMessageButton.oMessagePopover : null;
343
+
344
+ if (oMessagePopover && oMessagePopover.isOpen()) {
345
+ oMessagePopover.close();
346
+ } //when exiting we set keepAlive context to false
347
+
348
+
349
+ var oContext = this.getView().getBindingContext();
350
+
351
+ if (oContext && oContext.isKeepAlive()) {
352
+ oContext.setKeepAlive(false);
353
+ }
354
+ };
355
+
356
+ _proto._getTableBinding = function _getTableBinding(oTable) {
357
+ return oTable && oTable.getRowBinding();
358
+ };
359
+
360
+ _proto.onBeforeRendering = function onBeforeRendering() {
361
+ PageController.prototype.onBeforeRendering.apply(this); // In the retrieveTextFromValueList scenario we need to ensure in case of reload/refresh that the meta model in the methode retrieveTextFromValueList of the FieldRuntime is available
362
+
363
+ if (this.oView.oViewData.retrieveTextFromValueList && CommonHelper.getMetaModel() === undefined) {
364
+ CommonHelper.setMetaModel(this.getAppComponent().getMetaModel());
365
+ }
366
+ };
367
+
368
+ _proto.onAfterRendering = function onAfterRendering() {
369
+ var _this4 = this;
370
+
371
+ this.getView().getModel("sap.fe.i18n").getResourceBundle().then(function (response) {
372
+ _this4.oResourceBundle = response;
373
+ }).catch(function (oError) {
374
+ Log.error("Error while retrieving the resource bundle", oError);
375
+ });
376
+ };
377
+
378
+ _proto._onBeforeBinding = function _onBeforeBinding(oContext, mParameters) {
379
+ var _this5 = this;
380
+
381
+ // TODO: we should check how this comes together with the transaction helper, same to the change in the afterBinding
382
+ var aTables = this._findTables(),
383
+ oObjectPage = this._getObjectPageLayoutControl(),
384
+ oInternalModelContext = this.getView().getBindingContext("internal"),
385
+ oInternalModel = this.getView().getModel("internal"),
386
+ aBatchGroups = oInternalModelContext.getProperty("batchGroups"),
387
+ iViewLevel = this.getView().getViewData().viewLevel;
388
+
389
+ var oFastCreationRow;
390
+ aBatchGroups.push("$auto");
391
+
392
+ if (mParameters.bDraftNavigation !== true) {
393
+ this._closeSideContent();
394
+ }
395
+
396
+ var opContext = oObjectPage.getBindingContext();
397
+
398
+ if (opContext && opContext.hasPendingChanges() && !aBatchGroups.some(opContext.getModel().hasPendingChanges.bind(opContext.getModel()))) {
399
+ /* In case there are pending changes for the creation row and no others we need to reset the changes
400
+ TODO: this is just a quick solution, this needs to be reworked
401
+ */
402
+ opContext.getBinding().resetChanges();
403
+ } // For now we have to set the binding context to null for every fast creation row
404
+ // TODO: Get rid of this coding or move it to another layer - to be discussed with MDC and model
405
+
406
+
407
+ for (var i = 0; i < aTables.length; i++) {
408
+ oFastCreationRow = aTables[i].getCreationRow();
409
+
410
+ if (oFastCreationRow) {
411
+ oFastCreationRow.setBindingContext(null);
412
+ }
413
+ } // Scroll to present Section so that bindings are enabled during navigation through paginator buttons, as there is no view rerendering/rebind
414
+
415
+
416
+ var fnScrollToPresentSection = function () {
417
+ if (!oObjectPage.isFirstRendering() && !mParameters.bPersistOPScroll) {
418
+ oObjectPage.setSelectedSection(null);
419
+ }
420
+ };
421
+
422
+ oObjectPage.attachEventOnce("modelContextChange", fnScrollToPresentSection); // if the structure of the ObjectPageLayout is changed then scroll to present Section
423
+ // FIXME Is this really working as intended ? Initially this was onBeforeRendering, but never triggered onBeforeRendering because it was registered after it
424
+
425
+ var oDelegateOnBefore = {
426
+ onAfterRendering: fnScrollToPresentSection
427
+ };
428
+ oObjectPage.addEventDelegate(oDelegateOnBefore, this);
429
+ this.pageReady.attachEventOnce("pageReady", function () {
430
+ oObjectPage.removeEventDelegate(oDelegateOnBefore);
431
+ }); //Set the Binding for Paginators using ListBinding ID
432
+
433
+ if (iViewLevel > 1) {
434
+ var oBinding = mParameters && mParameters.listBinding;
435
+ var oPaginatorCurrentContext = oInternalModel.getProperty("/paginatorCurrentContext");
436
+
437
+ if (oPaginatorCurrentContext) {
438
+ var oBindingToUse = oPaginatorCurrentContext.getBinding();
439
+ this.paginator.initialize(oBindingToUse, oPaginatorCurrentContext);
440
+ oInternalModel.setProperty("/paginatorCurrentContext", null);
441
+ } else if (oBinding) {
442
+ if (oBinding.isA("sap.ui.model.odata.v4.ODataListBinding")) {
443
+ this.paginator.initialize(oBinding, oContext);
444
+ } else {
445
+ //if the binding type is not ODataListBinding because of a deeplink navigation or a refresh of the page
446
+ // we need to create it
447
+ var sContextPath = oBinding.getPath().replace(/\([^\)]*\)*$/, ""); //removing the last tuple
448
+
449
+ oBinding = new ODataListBinding(oBinding.oModel, "", oBinding.oModel.createBindingContext(sContextPath));
450
+
451
+ var _setListBindingAsync = function () {
452
+ if (oBinding.getContexts().length > 0) {
453
+ _this5.paginator.initialize(oBinding, oContext);
454
+
455
+ oBinding.detachEvent("change", _setListBindingAsync);
456
+ }
457
+ };
458
+
459
+ oBinding.getContexts(0);
460
+ oBinding.attachEvent("change", _setListBindingAsync);
461
+ }
462
+ }
463
+ }
464
+
465
+ if (!this.getView().getViewData().useNewLazyLoading && oObjectPage.getEnableLazyLoading()) {
466
+ var aSections = oObjectPage.getSections();
467
+ var bUseIconTabBar = oObjectPage.getUseIconTabBar();
468
+ var iSkip = 2;
469
+ var bIsInEditMode = oObjectPage.getModel("ui").getProperty("/isEditable");
470
+ var bEditableHeader = this.getView().getViewData().editableHeaderContent;
471
+
472
+ for (var iSection = 0; iSection < aSections.length; iSection++) {
473
+ var oSection = aSections[iSection];
474
+ var aSubSections = oSection.getSubSections();
475
+
476
+ for (var iSubSection = 0; iSubSection < aSubSections.length; iSubSection++, iSkip--) {
477
+ // In IconTabBar mode keep the second section bound if there is an editable header and we are switching to display mode
478
+ if (iSkip < 1 || bUseIconTabBar && (iSection > 1 || iSection === 1 && !bEditableHeader && !bIsInEditMode)) {
479
+ var oSubSection = aSubSections[iSubSection];
480
+
481
+ if (oSubSection.data().isVisibilityDynamic !== "true") {
482
+ oSubSection.setBindingContext(null);
483
+ }
484
+ }
485
+ }
486
+ }
487
+ }
488
+
489
+ if (this.placeholder.isPlaceholderEnabled() && mParameters.showPlaceholder) {
490
+ var oView = this.getView();
491
+ var oNavContainer = oView.getParent().oContainer.getParent();
492
+
493
+ if (oNavContainer) {
494
+ oNavContainer.showPlaceholder({});
495
+ }
496
+ }
497
+ };
498
+
499
+ _proto._getFirstClickableElement = function _getFirstClickableElement(oObjectPage) {
500
+ var oFirstClickableElement;
501
+ var aActions = oObjectPage.getHeaderTitle() && oObjectPage.getHeaderTitle().getActions();
502
+
503
+ if (aActions && aActions.length) {
504
+ oFirstClickableElement = aActions.find(function (oAction) {
505
+ // Due to the left alignment of the Draft switch and the collaborative draft avatar controls
506
+ // there is a ToolbarSpacer in the actions aggregation which we need to exclude here!
507
+ return !oAction.isA("sap.m.ToolbarSpacer") && oAction.getVisible() && oAction.getEnabled();
508
+ });
509
+ }
510
+
511
+ return oFirstClickableElement;
512
+ };
513
+
514
+ _proto._getFirstEmptyMandatoryFieldFromSubSection = function _getFirstEmptyMandatoryFieldFromSubSection(aSubSections) {
515
+ if (aSubSections) {
516
+ for (var subSection = 0; subSection < aSubSections.length; subSection++) {
517
+ var aBlocks = aSubSections[subSection].getBlocks();
518
+
519
+ if (aBlocks) {
520
+ for (var block = 0; block < aBlocks.length; block++) {
521
+ var aFormContainers = void 0;
522
+
523
+ if (aBlocks[block].isA("sap.ui.layout.form.Form")) {
524
+ aFormContainers = aBlocks[block].getFormContainers();
525
+ } else if (aBlocks[block].getContent && aBlocks[block].getContent() && aBlocks[block].getContent().isA("sap.ui.layout.form.Form")) {
526
+ aFormContainers = aBlocks[block].getContent().getFormContainers();
527
+ }
528
+
529
+ if (aFormContainers) {
530
+ for (var formContainer = 0; formContainer < aFormContainers.length; formContainer++) {
531
+ var aFormElements = aFormContainers[formContainer].getFormElements();
532
+
533
+ if (aFormElements) {
534
+ for (var formElement = 0; formElement < aFormElements.length; formElement++) {
535
+ var aFields = aFormElements[formElement].getFields(); // The first field is not necessarily an InputBase (e.g. could be a Text)
536
+ // So we need to check whether it has a getRequired method
537
+
538
+ try {
539
+ if (aFields[0].getRequired && aFields[0].getRequired() && !aFields[0].getValue()) {
540
+ return aFields[0];
541
+ }
542
+ } catch (error) {
543
+ Log.debug("Error when searching for mandaotry empty field: " + error);
544
+ }
545
+ }
546
+ }
547
+ }
548
+ }
549
+ }
550
+ }
551
+ }
552
+ }
553
+
554
+ return undefined;
555
+ };
556
+
557
+ _proto._updateFocusInEditMode = function _updateFocusInEditMode(aSubSections) {
558
+ var oObjectPage = this._getObjectPageLayoutControl();
559
+
560
+ var oMandatoryField = this._getFirstEmptyMandatoryFieldFromSubSection(aSubSections);
561
+
562
+ var oFieldToFocus;
563
+
564
+ if (oMandatoryField) {
565
+ oFieldToFocus = oMandatoryField.content.getContentEdit()[0];
566
+ } else {
567
+ oFieldToFocus = oObjectPage._getFirstEditableInput() || this._getFirstClickableElement(oObjectPage);
568
+ }
569
+
570
+ if (oFieldToFocus) {
571
+ setTimeout(function () {
572
+ // We set the focus in a timeeout, otherwise the focus sometimes goes to the TabBar
573
+ oFieldToFocus.focus();
574
+ }, 0);
575
+ }
576
+ };
577
+
578
+ _proto._handleSubSectionEnteredViewPort = function _handleSubSectionEnteredViewPort(oEvent) {
579
+ var oSubSection = oEvent.getParameter("subSection");
580
+ oSubSection.setBindingContext(undefined);
581
+ };
582
+
583
+ _proto._onBackNavigationInDraft = function _onBackNavigationInDraft(oContext) {
584
+ if (this.getAppComponent().getRouterProxy().checkIfBackHasSameContext()) {
585
+ // Back nav will keep the same context --> no need to display the dialog
586
+ history.back();
587
+ } else {
588
+ draft.processDataLossOrDraftDiscardConfirmation(function () {
589
+ history.back();
590
+ }, Function.prototype, oContext, this, false, draft.NavigationType.BackNavigation);
591
+ }
592
+ } // eslint-disable-next-line @typescript-eslint/no-unused-vars
593
+ ;
594
+
595
+ _proto._onAfterBinding = function _onAfterBinding(oBindingContext, mParameters) {
596
+ var _this6 = this;
597
+
598
+ var oObjectPage = this._getObjectPageLayoutControl();
599
+
600
+ var aTables = this._findTables();
601
+
602
+ this._sideEffects.clearPropertiesStatus(); // TODO: this is only a temp solution as long as the model fix the cache issue and we use this additional
603
+ // binding with ownRequest
604
+
605
+
606
+ oBindingContext = oObjectPage.getBindingContext();
607
+ var aIBNActions = [];
608
+ oObjectPage.getSections().forEach(function (oSection) {
609
+ oSection.getSubSections().forEach(function (oSubSection) {
610
+ aIBNActions = CommonUtils.getIBNActions(oSubSection, aIBNActions);
611
+ });
612
+ }); // Assign internal binding contexts to oFormContainer:
613
+ // 1. It is not possible to assign the internal binding context to the XML fragment
614
+ // (FormContainer.fragment.xml) yet - it is used already for the data-structure.
615
+ // 2. Another problem is, that FormContainers assigned to a 'MoreBlock' does not have an
616
+ // internal model context at all.
617
+
618
+ aTables.forEach(function (oTable) {
619
+ var oInternalModelContext = oTable.getBindingContext("internal");
620
+ oInternalModelContext.setProperty("creationRowFieldValidity", {});
621
+ oInternalModelContext.setProperty("creationRowCustomValidity", {});
622
+ aIBNActions = CommonUtils.getIBNActions(oTable, aIBNActions); // temporary workaround for BCP: 2080218004
623
+ // Need to fix with BLI: FIORITECHP1-15274
624
+ // only for edit mode, we clear the table cache
625
+ // Workaround starts here!!
626
+
627
+ var oTableRowBinding = oTable.getRowBinding();
628
+
629
+ if (oTableRowBinding) {
630
+ if (ModelHelper.isStickySessionSupported(oTableRowBinding.getModel().getMetaModel())) {
631
+ // apply for both edit and display mode in sticky
632
+ oTableRowBinding.removeCachesAndMessages("");
633
+ }
634
+ } // Workaround ends here!!
635
+ // Update 'enabled' property of DataFieldForAction buttons on table toolbar
636
+ // The same is also performed on Table selectionChange event
637
+
638
+
639
+ var oActionOperationAvailableMap = JSON.parse(CommonHelper.parseCustomData(DelegateUtil.getCustomData(oTable, "operationAvailableMap"))),
640
+ aSelectedContexts = oTable.getSelectedContexts();
641
+ CommonUtils.setActionEnablement(oInternalModelContext, oActionOperationAvailableMap, aSelectedContexts);
642
+ });
643
+ CommonUtils.getSemanticTargetsFromPageModel(this, "_pageModel"); //Retrieve Object Page header actions from Object Page title control
644
+
645
+ var oObjectPageTitle = oObjectPage.getHeaderTitle();
646
+ var aIBNHeaderActions = [];
647
+ aIBNHeaderActions = CommonUtils.getIBNActions(oObjectPageTitle, aIBNHeaderActions);
648
+ aIBNActions = aIBNActions.concat(aIBNHeaderActions);
649
+ CommonUtils.updateDataFieldForIBNButtonsVisibility(aIBNActions, this.getView());
650
+ var oModel, oFinalUIState; // TODO: this should be moved into an init event of the MDC tables (not yet existing) and should be part
651
+ // of any controller extension
652
+
653
+ /**
654
+ * @param oTable
655
+ * @param oListBinding
656
+ */
657
+
658
+ function enableFastCreationRow(oTable, oListBinding) {
659
+ var oFastCreationRow = oTable.getCreationRow();
660
+ var oFastCreationListBinding, oFastCreationContext;
661
+
662
+ if (oFastCreationRow) {
663
+ oFinalUIState.then(function () {
664
+ if (oFastCreationRow.getModel("ui").getProperty("/isEditable")) {
665
+ oFastCreationListBinding = oModel.bindList(oListBinding.getPath(), oListBinding.getContext(), [], [], {
666
+ $$updateGroupId: "doNotSubmit",
667
+ $$groupId: "doNotSubmit"
668
+ }); // Workaround suggested by OData model v4 colleagues
669
+
670
+ oFastCreationListBinding.refreshInternal = function () {
671
+ /* do nothing */
672
+ };
673
+ /*
674
+ oFastCreationListBinding.hasPendingChanges = function() {
675
+ return false;
676
+ };
677
+ */
678
+
679
+
680
+ oFastCreationContext = oFastCreationListBinding.create();
681
+ oFastCreationRow.setBindingContext(oFastCreationContext); // this is needed to avoid console error
682
+
683
+ oFastCreationContext.created().catch(function () {
684
+ Log.trace("transient fast creation context deleted");
685
+ });
686
+ }
687
+ }).catch(function (oError) {
688
+ Log.error("Error while computing the final UI state", oError);
689
+ });
690
+ }
691
+ } // this should not be needed at the all
692
+
693
+ /**
694
+ * @param oTable
695
+ */
696
+
697
+
698
+ var handleTableModifications = function (oTable) {
699
+ var oBinding = _this6._getTableBinding(oTable),
700
+ fnHandleTablePatchEvents = function () {
701
+ enableFastCreationRow(oTable, oBinding);
702
+ };
703
+
704
+ if (!oBinding) {
705
+ Log.error("Expected binding missing for table: " + oTable.getId());
706
+ return;
707
+ }
708
+
709
+ if (oBinding.oContext) {
710
+ fnHandleTablePatchEvents();
711
+ } else {
712
+ var fnHandleChange = function () {
713
+ if (oBinding.oContext) {
714
+ fnHandleTablePatchEvents();
715
+ oBinding.detachChange(fnHandleChange);
716
+ }
717
+ };
718
+
719
+ oBinding.attachChange(fnHandleChange);
720
+ }
721
+ };
722
+
723
+ if (oBindingContext) {
724
+ oModel = oBindingContext.getModel(); // Compute Edit Mode
725
+
726
+ oFinalUIState = this._editFlow.computeEditMode(oBindingContext);
727
+
728
+ if (ModelHelper.isCollaborationDraftSupported(oModel.getMetaModel())) {
729
+ oFinalUIState.then(function () {
730
+ if (_this6.getView().getModel("ui").getProperty("/isEditable")) {
731
+ connect(_this6.getView());
732
+ }
733
+ }).catch(function (oError) {
734
+ Log.error("Error while waiting for the final UI State", oError);
735
+ });
736
+ } // update related apps once Data is received in case of binding cache is not available
737
+ // TODO: this is only a temp solution since we need to call _updateRelatedApps method only after data for Object Page is received (if there is no binding)
738
+
739
+
740
+ if (oBindingContext.getBinding().oCache) {
741
+ this._updateRelatedApps();
742
+ } else {
743
+ var fnUpdateRelatedApps = function () {
744
+ _this6._updateRelatedApps();
745
+
746
+ oBindingContext.getBinding().detachDataReceived(fnUpdateRelatedApps);
747
+ };
748
+
749
+ oBindingContext.getBinding().attachDataReceived(fnUpdateRelatedApps);
750
+ } //Attach the patch sent and patch completed event to the object page binding so that we can react
751
+
752
+
753
+ var oBinding = oBindingContext.getBinding && oBindingContext.getBinding() || oBindingContext; // Attach the event handler only once to the same binding
754
+
755
+ if (this.currentBinding !== oBinding) {
756
+ oBinding.attachEvent("patchSent", this.editFlow.handlePatchSent, this);
757
+ this.currentBinding = oBinding;
758
+ }
759
+
760
+ aTables.forEach(function (oTable) {
761
+ // access binding only after table is bound
762
+ TableUtils.whenBound(oTable).then(handleTableModifications).catch(function (oError) {
763
+ Log.error("Error while waiting for the table to be bound", oError);
764
+ });
765
+ });
766
+
767
+ if (!this.getView().getViewData().useNewLazyLoading) {
768
+ // should be called only after binding is ready hence calling it in onAfterBinding
769
+ oObjectPage._triggerVisibleSubSectionsEvents();
770
+ }
771
+ }
772
+ };
773
+
774
+ _proto.onPageReady = function onPageReady(mParameters) {
775
+ var _this7 = this;
776
+
777
+ var setFocus = function () {
778
+ // Set the focus to the first action button, or to the first editable input if in editable mode
779
+ var oObjectPage = _this7._getObjectPageLayoutControl();
780
+
781
+ var isInDisplayMode = !oObjectPage.getModel("ui").getProperty("/isEditable");
782
+
783
+ if (isInDisplayMode) {
784
+ var oFirstClickableElement = _this7._getFirstClickableElement(oObjectPage);
785
+
786
+ if (oFirstClickableElement) {
787
+ oFirstClickableElement.focus();
788
+ }
789
+ } else {
790
+ var oSelectedSection = Core.byId(oObjectPage.getSelectedSection());
791
+
792
+ _this7._updateFocusInEditMode(oSelectedSection.getSubSections());
793
+ }
794
+ }; // Apply app state only after the page is ready with the first section selected
795
+
796
+
797
+ var oView = this.getView();
798
+ var oInternalModelContext = oView.getBindingContext("internal");
799
+ var oBindingContext = oView.getBindingContext(); //Show popup while navigating back from object page in case of draft
800
+
801
+ if (oBindingContext) {
802
+ var bIsStickyMode = ModelHelper.isStickySessionSupported(oBindingContext.getModel().getMetaModel());
803
+
804
+ if (!bIsStickyMode) {
805
+ var oAppComponent = CommonUtils.getAppComponent(oView);
806
+ oAppComponent.getShellServices().setBackNavigation(function () {
807
+ return _this7._onBackNavigationInDraft(oBindingContext);
808
+ });
809
+ }
810
+ }
811
+
812
+ this.getAppComponent().getAppStateHandler().applyAppState().then(function () {
813
+ if (mParameters.forceFocus) {
814
+ setFocus();
815
+ }
816
+ }).catch(function (Error) {
817
+ Log.error("Error while setting the focus", Error);
818
+ });
819
+ oInternalModelContext.setProperty("errorNavigationSectionFlag", false);
820
+
821
+ this._checkDataPointTitleForExternalNavigation();
822
+ }
823
+ /**
824
+ * Get the status of edit mode for sticky session.
825
+ *
826
+ * @returns {boolean} The status of edit mode for sticky session
827
+ *
828
+ *
829
+ */
830
+ ;
831
+
832
+ _proto.getStickyEditMode = function getStickyEditMode() {
833
+ var oBindingContext = this.getView().getBindingContext && this.getView().getBindingContext();
834
+ var bIsStickyEditMode = false;
835
+
836
+ if (oBindingContext) {
837
+ var bIsStickyMode = ModelHelper.isStickySessionSupported(oBindingContext.getModel().getMetaModel());
838
+
839
+ if (bIsStickyMode) {
840
+ bIsStickyEditMode = this.getView().getModel("ui").getProperty("/isEditable");
841
+ }
842
+ }
843
+
844
+ return bIsStickyEditMode;
845
+ };
846
+
847
+ _proto._getObjectPageLayoutControl = function _getObjectPageLayoutControl() {
848
+ return this.byId("fe::ObjectPage");
849
+ };
850
+
851
+ _proto._getPageTitleInformation = function _getPageTitleInformation() {
852
+ var oObjectPage = this._getObjectPageLayoutControl();
853
+
854
+ var oObjectPageSubtitle = oObjectPage.getCustomData().find(function (oCustomData) {
855
+ return oCustomData.getKey() === "ObjectPageSubtitle";
856
+ });
857
+ var oTitleInfo = {
858
+ title: oObjectPage.data("ObjectPageTitle") || "",
859
+ subtitle: oObjectPageSubtitle && oObjectPageSubtitle.getValue(),
860
+ intent: "",
861
+ icon: ""
862
+ };
863
+ return oTitleInfo;
864
+ };
865
+
866
+ _proto._executeHeaderShortcut = function _executeHeaderShortcut(sId) {
867
+ var sButtonId = this.getView().getId() + "--" + sId,
868
+ oButton = this._getObjectPageLayoutControl().getHeaderTitle().getActions().find(function (oElement) {
869
+ return oElement.getId() === sButtonId;
870
+ });
871
+
872
+ CommonUtils.fireButtonPress(oButton);
873
+ };
874
+
875
+ _proto._executeFooterShortcut = function _executeFooterShortcut(sId) {
876
+ var sButtonId = this.getView().getId() + "--" + sId,
877
+ oButton = this._getObjectPageLayoutControl().getFooter().getContent().find(function (oElement) {
878
+ return oElement.getMetadata().getName() === "sap.m.Button" && oElement.getId() === sButtonId;
879
+ });
880
+
881
+ CommonUtils.fireButtonPress(oButton);
882
+ };
883
+
884
+ _proto._executeTabShortCut = function _executeTabShortCut(oExecution) {
885
+ var oObjectPage = this._getObjectPageLayoutControl(),
886
+ aSections = oObjectPage.getSections(),
887
+ iSectionIndexMax = aSections.length - 1,
888
+ sCommand = oExecution.oSource.getCommand();
889
+
890
+ var newSection,
891
+ iSelectedSectionIndex = oObjectPage.indexOfSection(this.byId(oObjectPage.getSelectedSection()));
892
+
893
+ if (iSelectedSectionIndex !== -1 && iSectionIndexMax > 0) {
894
+ if (sCommand === "NextTab") {
895
+ if (iSelectedSectionIndex <= iSectionIndexMax - 1) {
896
+ newSection = aSections[++iSelectedSectionIndex];
897
+ }
898
+ } else {
899
+ // PreviousTab
900
+ if (iSelectedSectionIndex !== 0) {
901
+ newSection = aSections[--iSelectedSectionIndex];
902
+ }
903
+ }
904
+
905
+ if (newSection) {
906
+ oObjectPage.setSelectedSection(newSection);
907
+ newSection.focus();
908
+ }
909
+ }
910
+ };
911
+
912
+ _proto._getFooterVisibility = function _getFooterVisibility() {
913
+ var oInternalModelContext = this.getView().getBindingContext("internal");
914
+ var sViewId = this.getView().getId();
915
+ oInternalModelContext.setProperty("messageFooterContainsErrors", false);
916
+ sap.ui.getCore().getMessageManager().getMessageModel().getData().forEach(function (oMessage) {
917
+ if (oMessage.validation && oMessage.type === "Error" && oMessage.target.indexOf(sViewId) > -1) {
918
+ oInternalModelContext.setProperty("messageFooterContainsErrors", true);
919
+ }
920
+ });
921
+ };
922
+
923
+ _proto._showMessagePopover = function _showMessagePopover(err, oRet) {
924
+ if (err) {
925
+ Log.error(err);
926
+ }
927
+
928
+ if (!this.getAppComponent().getRootContainer().getCurrentPage().isA("sap.m.MessagePage")) {
929
+ var oMessageButton = this.getView().byId("fe::FooterBar::MessageButton"),
930
+ oMessagePopover = oMessageButton.oMessagePopover,
931
+ oItemBinding = oMessagePopover.getBinding("items");
932
+
933
+ if (oItemBinding.getLength() > 0 && !oMessagePopover.isOpen()) {
934
+ oMessageButton.setVisible(true); // workaround to ensure that oMessageButton is rendered when openBy is called
935
+
936
+ setTimeout(function () {
937
+ oMessagePopover.openBy(oMessageButton);
938
+ }, 0);
939
+ }
940
+ }
941
+
942
+ return oRet;
943
+ };
944
+
945
+ _proto._editDocument = function _editDocument(oContext) {
946
+ var oModel = this.getView().getModel("ui");
947
+ BusyLocker.lock(oModel);
948
+ return this.editFlow.editDocument.apply(this.editFlow, [oContext]).finally(function () {
949
+ BusyLocker.unlock(oModel);
950
+ });
951
+ };
952
+
953
+ _proto._saveDocument = function _saveDocument(oContext) {
954
+ var _this8 = this;
955
+
956
+ var oModel = this.getView().getModel("ui"),
957
+ aWaitCreateDocuments = []; // indicates if we are creating a new row in the OP
958
+
959
+ var bExecuteSideEffectsOnError = false;
960
+ BusyLocker.lock(oModel);
961
+
962
+ this._findTables().forEach(function (oTable) {
963
+ var oBinding = _this8._getTableBinding(oTable);
964
+
965
+ var mParameters = {
966
+ creationMode: oTable.data("creationMode"),
967
+ creationRow: oTable.getCreationRow(),
968
+ createAtEnd: oTable.data("createAtEnd") === "true"
969
+ };
970
+ var bCreateDocument = mParameters.creationRow && mParameters.creationRow.getBindingContext() && Object.keys(mParameters.creationRow.getBindingContext().getObject()).length > 1;
971
+
972
+ if (bCreateDocument) {
973
+ // the bSkipSideEffects is a parameter created when we click the save key. If we press this key
974
+ // we don't execute the handleSideEffects funciton to avoid batch redundancy
975
+ mParameters.bSkipSideEffects = true;
976
+ bExecuteSideEffectsOnError = true;
977
+ aWaitCreateDocuments.push(_this8.editFlow.createDocument(oBinding, mParameters).then(function () {
978
+ return oBinding;
979
+ }));
980
+ }
981
+ });
982
+
983
+ return Promise.all(aWaitCreateDocuments).then(function (aBindings) {
984
+ var mParameters = {
985
+ bExecuteSideEffectsOnError: bExecuteSideEffectsOnError,
986
+ bindings: aBindings
987
+ };
988
+ return _this8.editFlow.saveDocument(oContext, mParameters).catch(function () {
989
+ return _this8._showMessagePopover;
990
+ });
991
+ }).finally(function () {
992
+ if (BusyLocker.isLocked(oModel)) {
993
+ BusyLocker.unlock(oModel);
994
+ }
995
+ });
996
+ };
997
+
998
+ _proto._manageCollaboration = function _manageCollaboration() {
999
+ openManageDialog(this.getView());
1000
+ };
1001
+
1002
+ _proto._showCollaborationUserDetails = function _showCollaborationUserDetails(event) {
1003
+ showUserDetails(event, this.getView());
1004
+ };
1005
+
1006
+ _proto._cancelDocument = function _cancelDocument(oContext, mParameters) {
1007
+ mParameters.cancelButton = this.getView().byId(mParameters.cancelButton); //to get the reference of the cancel button from command execution
1008
+
1009
+ return this.editFlow.cancelDocument(oContext, mParameters);
1010
+ };
1011
+
1012
+ _proto._applyDocument = function _applyDocument(oContext) {
1013
+ var _this9 = this;
1014
+
1015
+ return this.editFlow.applyDocument(oContext).catch(function () {
1016
+ return _this9._showMessagePopover();
1017
+ });
1018
+ };
1019
+
1020
+ _proto._showSwitchDraftAndActivePopover = function _showSwitchDraftAndActivePopover(event) {
1021
+ var _this10 = this;
1022
+
1023
+ var view = this.getView(),
1024
+ source = event.getSource(),
1025
+ fragmentName = "sap.fe.templates.ObjectPage.view.fragments.SwitchDraftAndActiveObjectPopOver";
1026
+
1027
+ if (this.switchDraftAndActivePopOver) {
1028
+ this.switchDraftAndActivePopOver.openBy(source, false);
1029
+ } else {
1030
+ var localThisModel = new JSONModel({}),
1031
+ preprocessorSettings = {
1032
+ bindingContexts: {
1033
+ "this": localThisModel.createBindingContext("/")
1034
+ },
1035
+ models: {
1036
+ "this": localThisModel
1037
+ }
1038
+ };
1039
+ var popoverFragment = XMLTemplateProcessor.loadTemplate(fragmentName, "fragment");
1040
+ Promise.resolve(XMLPreprocessor.process(popoverFragment, {
1041
+ name: fragmentName
1042
+ }, preprocessorSettings)).then(function (fragment) {
1043
+ return Fragment.load({
1044
+ definition: fragment,
1045
+ controller: _this10
1046
+ });
1047
+ }).then(function (popover) {
1048
+ view.addDependent(popover);
1049
+ popover.setModel(view.getModel("sap.fe.i18n"), "i18n");
1050
+ popover.setPlacement("Bottom");
1051
+ _this10.switchDraftAndActivePopOver = popover;
1052
+ popover.attachAfterOpen(function () {
1053
+ // While the list entry corresponding to the currently displayed document version is emphasized with a blue
1054
+ // background, we need to pre-focus the other entry
1055
+ var context = _this10.getView().getBindingContext(),
1056
+ isActiveEntity = context.getObject().IsActiveEntity;
1057
+
1058
+ var switchDraftAndActiveOptionsList = popover.getContent().find(function (element) {
1059
+ return element.data("listIdentifier") === "switchDraftAndActivePopoverList";
1060
+ });
1061
+ var listItemToFocus = isActiveEntity ? switchDraftAndActiveOptionsList.getItems().find(function (element) {
1062
+ return element.getKey() === "switchToDraft";
1063
+ }) : switchDraftAndActiveOptionsList.getItems().find(function (element) {
1064
+ return element.getKey() === "switchToActive";
1065
+ });
1066
+ listItemToFocus.focus();
1067
+ });
1068
+ popover.openBy(source); // ensure to remove the reference to the draft popover as it would be destroyed on exit
1069
+
1070
+ view.attachEventOnce("beforeExit", function () {
1071
+ delete _this10.switchDraftAndActivePopOver;
1072
+ });
1073
+ }).catch(function (Error) {
1074
+ Log.error("Error while opening the draft switch popup", Error);
1075
+ });
1076
+ }
1077
+ };
1078
+
1079
+ _proto._switchDraftAndActivePopoverListSelect = function _switchDraftAndActivePopoverListSelect(event) {
1080
+ var context = this.getView().getBindingContext(),
1081
+ selectedItemKey = event.getParameter("item").getProperty("key"),
1082
+ isActiveEntity = context.getObject().IsActiveEntity; // It was decided that we should NOT set the entry in the list corresponding to the currently displayed document version to
1083
+ // disabled, hence the user can click entries which to not cause an action (clicking "Draft" when you already display the
1084
+ // draft version of the document)
1085
+ // Hence we check here which entry in the list was clicked and which document version we currently display and only do
1086
+ // the switch between draft / active version if it makes sense.
1087
+
1088
+ if (isActiveEntity && selectedItemKey === "switchToDraft" || !isActiveEntity && selectedItemKey === "switchToActive") {
1089
+ this.editFlow.toggleDraftActive(context);
1090
+ }
1091
+
1092
+ event.getSource().getParent().close();
1093
+ };
1094
+
1095
+ _proto._updateRelatedApps = function _updateRelatedApps() {
1096
+ var oObjectPage = this._getObjectPageLayoutControl();
1097
+
1098
+ if (CommonUtils.resolveStringtoBoolean(oObjectPage.data("showRelatedApps"))) {
1099
+ CommonUtils.updateRelatedAppsDetails(oObjectPage);
1100
+ }
1101
+ };
1102
+
1103
+ _proto._findTableInSubSection = function _findTableInSubSection(aParentElement, aSubsection, aTables) {
1104
+ var aSubSectionTables = [];
1105
+
1106
+ for (var element = 0; element < aParentElement.length; element++) {
1107
+ var oElement = aParentElement[element].getContent instanceof Function && aParentElement[element].getContent();
1108
+
1109
+ if (oElement && oElement.isA && oElement.isA("sap.ui.layout.DynamicSideContent")) {
1110
+ oElement = oElement.getMainContent instanceof Function && oElement.getMainContent();
1111
+
1112
+ if (oElement && oElement.length > 0) {
1113
+ oElement = oElement[0];
1114
+ }
1115
+ }
1116
+
1117
+ if (oElement && oElement.isA && oElement.isA("sap.fe.macros.TableAPI")) {
1118
+ oElement = oElement.getContent instanceof Function && oElement.getContent();
1119
+
1120
+ if (oElement && oElement.length > 0) {
1121
+ oElement = oElement[0];
1122
+ }
1123
+ }
1124
+
1125
+ if (oElement && oElement.isA && oElement.isA("sap.ui.mdc.Table")) {
1126
+ aTables.push(oElement);
1127
+ aSubSectionTables.push({
1128
+ "table": oElement,
1129
+ "gridTable": oElement.getType().isA("sap.ui.mdc.table.GridTableType")
1130
+ });
1131
+ }
1132
+ }
1133
+
1134
+ if (aSubSectionTables.length === 1 && aParentElement.length === 1 && aSubSectionTables[0].gridTable && !aSubsection.hasStyleClass("sapUxAPObjectPageSubSectionFitContainer")) {
1135
+ //In case there is only a single table in a section we fit that to the whole page so that the scrollbar comes only on table and not on page
1136
+ aSubsection.addStyleClass("sapUxAPObjectPageSubSectionFitContainer");
1137
+ } else {
1138
+ if (aSubSectionTables && !aSubsection.hasStyleClass("sapUxAPObjectPageSubSectionFitContainer")) {
1139
+ aSubSectionTables.forEach(function (oTable) {
1140
+ if (oTable.gridTable) {
1141
+ //Resetting the row count to default value in case we have a combination of forms and tables or multiple tables in a subsection
1142
+ oTable.table.getType().setRowCount(null);
1143
+ }
1144
+ });
1145
+ }
1146
+ }
1147
+ };
1148
+
1149
+ _proto._getAllSubSections = function _getAllSubSections() {
1150
+ var oObjectPage = this._getObjectPageLayoutControl();
1151
+
1152
+ var aSubSections = [];
1153
+ oObjectPage.getSections().forEach(function (oSection) {
1154
+ aSubSections = aSubSections.concat(oSection.getSubSections());
1155
+ });
1156
+ return aSubSections;
1157
+ };
1158
+
1159
+ _proto._getAllBlocks = function _getAllBlocks() {
1160
+ var aBlocks = [];
1161
+
1162
+ this._getAllSubSections().forEach(function (oSubSection) {
1163
+ aBlocks = aBlocks.concat(oSubSection.getBlocks());
1164
+ });
1165
+
1166
+ return aBlocks;
1167
+ };
1168
+
1169
+ _proto._findTables = function _findTables() {
1170
+ var aSubSections = this._getAllSubSections();
1171
+
1172
+ var aTables = [];
1173
+
1174
+ for (var subSection = 0; subSection < aSubSections.length; subSection++) {
1175
+ this._findTableInSubSection(aSubSections[subSection].getBlocks(), aSubSections[subSection], aTables);
1176
+
1177
+ this._findTableInSubSection(aSubSections[subSection].getMoreBlocks(), aSubSections[subSection], aTables);
1178
+ }
1179
+
1180
+ return aTables;
1181
+ };
1182
+
1183
+ _proto._closeSideContent = function _closeSideContent() {
1184
+ this._getAllBlocks().forEach(function (oBlock) {
1185
+ var oContent = oBlock.getContent instanceof Function && oBlock.getContent();
1186
+
1187
+ if (oContent && oContent.isA && oContent.isA("sap.ui.layout.DynamicSideContent")) {
1188
+ if (oContent.setShowSideContent instanceof Function) {
1189
+ oContent.setShowSideContent(false);
1190
+ }
1191
+ }
1192
+ });
1193
+ }
1194
+ /**
1195
+ * Chart Context is resolved for 1:n microcharts.
1196
+ *
1197
+ * @param {sap.ui.model.Context} oChartContext The Context of the MicroChart
1198
+ * @param {string} sChartPath The collectionPath of the the chart
1199
+ * @returns {Array} Array of Attributes of the chart Context
1200
+ */
1201
+ ;
1202
+
1203
+ _proto._getChartContextData = function _getChartContextData(oChartContext, sChartPath) {
1204
+ var oContextData = oChartContext.getObject();
1205
+ var oChartContextData = [oContextData];
1206
+
1207
+ if (oChartContext && sChartPath) {
1208
+ if (oContextData[sChartPath]) {
1209
+ oChartContextData = oContextData[sChartPath];
1210
+ delete oContextData[sChartPath];
1211
+ oChartContextData.push(oContextData);
1212
+ }
1213
+ }
1214
+
1215
+ return oChartContextData;
1216
+ }
1217
+ /**
1218
+ * Scroll the tables to the row with the sPath
1219
+ *
1220
+ * @function
1221
+ * @name sap.fe.templates.ObjectPage.ObjectPageController.controller#_scrollTablesToRow
1222
+ * @param {string} sRowPath 'sPath of the table row'
1223
+ *
1224
+ */
1225
+ ;
1226
+
1227
+ _proto._scrollTablesToRow = function _scrollTablesToRow(sRowPath) {
1228
+ if (this._findTables && this._findTables().length > 0) {
1229
+ var aTables = this._findTables();
1230
+
1231
+ for (var i = 0; i < aTables.length; i++) {
1232
+ TableScroller.scrollTableToRow(aTables[i], sRowPath);
1233
+ }
1234
+ }
1235
+ }
1236
+ /**
1237
+ * Method to merge selected contexts and filters.
1238
+ *
1239
+ * @function
1240
+ * @name _mergeMultipleContexts
1241
+ * @param {object} oPageContext Page context
1242
+ * @param {object|Array} aLineContext Selected Contexts
1243
+ * @param {string} sChartPath Collection name of the chart
1244
+ * @returns {object} Selection Variant Object
1245
+ */
1246
+ ;
1247
+
1248
+ _proto._mergeMultipleContexts = function _mergeMultipleContexts(oPageContext, aLineContext, sChartPath) {
1249
+ var _this11 = this;
1250
+
1251
+ var aAttributes = [],
1252
+ aPageAttributes = [],
1253
+ oContext,
1254
+ sMetaPathLine,
1255
+ sPathLine;
1256
+ var sPagePath = oPageContext.getPath();
1257
+ var oMetaModel = oPageContext && oPageContext.getModel() && oPageContext.getModel().getMetaModel();
1258
+ var sMetaPathPage = oMetaModel && oMetaModel.getMetaPath(sPagePath).replace(/^\/*/, ""); // Get single line context if necessary
1259
+
1260
+ if (aLineContext && aLineContext.length) {
1261
+ oContext = aLineContext[0];
1262
+ sPathLine = oContext.getPath();
1263
+ sMetaPathLine = oMetaModel && oMetaModel.getMetaPath(sPathLine).replace(/^\/*/, "");
1264
+ aLineContext.map(function (oSingleContext) {
1265
+ if (sChartPath) {
1266
+ var oChartContextData = _this11._getChartContextData(oSingleContext, sChartPath);
1267
+
1268
+ if (oChartContextData) {
1269
+ aAttributes = oChartContextData.map(function (oChartContextData) {
1270
+ return {
1271
+ contextData: oChartContextData,
1272
+ entitySet: sMetaPathPage + "/" + sChartPath
1273
+ };
1274
+ });
1275
+ }
1276
+ } else {
1277
+ aAttributes.push({
1278
+ contextData: oSingleContext.getObject(),
1279
+ entitySet: sMetaPathLine
1280
+ });
1281
+ }
1282
+ });
1283
+ }
1284
+
1285
+ aPageAttributes.push({
1286
+ contextData: oPageContext.getObject(),
1287
+ entitySet: sMetaPathPage
1288
+ }); // Adding Page Context to selection variant
1289
+
1290
+ aPageAttributes = CommonUtils.removeSensitiveData(aPageAttributes, oMetaModel);
1291
+ var oPageLevelSV = CommonUtils.addPageContextToSelectionVariant(new SelectionVariant(), aPageAttributes, this.getView());
1292
+ aAttributes = CommonUtils.removeSensitiveData(aAttributes, oMetaModel);
1293
+ return {
1294
+ selectionVariant: oPageLevelSV,
1295
+ attributes: aAttributes
1296
+ };
1297
+ };
1298
+
1299
+ _proto._getBatchGroupsForView = function _getBatchGroupsForView() {
1300
+ var oViewData = this.getView().getViewData(),
1301
+ oConfigurations = oViewData.controlConfiguration,
1302
+ aConfigurations = oConfigurations && Object.keys(oConfigurations),
1303
+ aBatchGroups = ["$auto.Heroes", "$auto.Decoration", "$auto.Workers"];
1304
+
1305
+ if (aConfigurations && aConfigurations.length > 0) {
1306
+ aConfigurations.forEach(function (sKey) {
1307
+ var oConfiguration = oConfigurations[sKey];
1308
+
1309
+ if (oConfiguration.requestGroupId === "LongRunners") {
1310
+ aBatchGroups.push("$auto.LongRunners");
1311
+ }
1312
+ });
1313
+ }
1314
+
1315
+ return aBatchGroups;
1316
+ }
1317
+ /*
1318
+ * Reset Breadcrumb links
1319
+ *
1320
+ * @function
1321
+ * @param {sap.m.Breadcrumbs} [oSource] parent control
1322
+ * @description Used when context of the objectpage changes.
1323
+ * This event callback is attached to modelContextChange
1324
+ * event of the Breadcrumb control to catch context change.
1325
+ * Then element binding and hrefs are updated for each Link.
1326
+ *
1327
+ * @ui5-restricted
1328
+ * @experimental
1329
+ */
1330
+ ;
1331
+
1332
+ _proto._setBreadcrumbLinks = function _setBreadcrumbLinks(oSource) {
1333
+ var oContext = oSource.getBindingContext();
1334
+ var oAppComponent = this.getAppComponent();
1335
+
1336
+ if (oContext) {
1337
+ var sNewPath = oContext.getPath(),
1338
+ aPathParts = sNewPath.split("/"),
1339
+ oMetaModel = oAppComponent.getMetaModel();
1340
+ var sPath = "",
1341
+ iSkipParameterized = 0;
1342
+ aPathParts.shift();
1343
+ aPathParts.splice(-1, 1);
1344
+ aPathParts.forEach(function (sPathPart, i) {
1345
+ sPath += "/" + sPathPart;
1346
+ var oRootViewController = oAppComponent.getRootViewController();
1347
+ var sParameterPath = oMetaModel.getMetaPath(sPath);
1348
+ var bResultContext = oMetaModel.getObject(sParameterPath + "/@com.sap.vocabularies.Common.v1.ResultContext");
1349
+
1350
+ if (bResultContext) {
1351
+ // We dont need to create a breadcrumb for Parameter path
1352
+ iSkipParameterized = 1;
1353
+ return;
1354
+ }
1355
+
1356
+ var pWaitForTitleHiearchyInfo = oRootViewController.getTitleInfoFromPath(sPath);
1357
+ pWaitForTitleHiearchyInfo.then(function (oTitleHiearchyInfo) {
1358
+ var idx = i - iSkipParameterized,
1359
+ oLink = oSource.getLinks()[idx] ? oSource.getLinks()[idx] : new Link(); // sCurrentEntity is a fallback value in case of empty title
1360
+
1361
+ oLink.setText(oTitleHiearchyInfo.subtitle || oTitleHiearchyInfo.title);
1362
+ oLink.setHref(oTitleHiearchyInfo.intent);
1363
+
1364
+ if (!oSource.getLinks()[idx]) {
1365
+ oSource.addLink(oLink);
1366
+ }
1367
+ }).catch(function (oError) {
1368
+ Log.error("Error while computing the title hierarchy", oError);
1369
+ });
1370
+ });
1371
+ }
1372
+ };
1373
+
1374
+ _proto._checkDataPointTitleForExternalNavigation = function _checkDataPointTitleForExternalNavigation() {
1375
+ var oView = this.getView();
1376
+ var oInternalModelContext = oView.getBindingContext("internal");
1377
+ var oDataPoints = CommonUtils.getHeaderFacetItemConfigForExternalNavigation(oView.getViewData(), this.getAppComponent().getRoutingService().getOutbounds());
1378
+ var oShellServices = this.getAppComponent().getShellServices();
1379
+ var oPageContext = oView && oView.getBindingContext();
1380
+ oInternalModelContext.setProperty("isHeaderDPLinkVisible", {});
1381
+
1382
+ if (oPageContext) {
1383
+ oPageContext.requestObject().then(function (oData) {
1384
+ fnGetLinks(oDataPoints, oData);
1385
+ }).catch(function (oError) {
1386
+ Log.error("Cannot retrieve the links from the shell service", oError);
1387
+ });
1388
+ }
1389
+ /**
1390
+ * @param oError
1391
+ */
1392
+
1393
+
1394
+ function fnOnError(oError) {
1395
+ Log.error(oError);
1396
+ }
1397
+
1398
+ function fnSetLinkEnablement(id, aSupportedLinks) {
1399
+ var sLinkId = id; // process viable links from getLinks for all datapoints having outbound
1400
+
1401
+ if (aSupportedLinks && aSupportedLinks.length === 1 && aSupportedLinks[0].supported) {
1402
+ oInternalModelContext.setProperty("isHeaderDPLinkVisible/" + sLinkId, true);
1403
+ }
1404
+ }
1405
+ /**
1406
+ * @param oDataPoints
1407
+ * @param oPageData
1408
+ */
1409
+
1410
+
1411
+ function fnGetLinks(oDataPoints, oPageData) {
1412
+ var _loop = function (sId) {
1413
+ var oDataPoint = oDataPoints[sId];
1414
+ var oParams = {};
1415
+ var oLink = oView.byId(sId);
1416
+
1417
+ if (!oLink) {
1418
+ // for data points configured in app descriptor but not annotated in the header
1419
+ return "continue";
1420
+ }
1421
+
1422
+ var oLinkContext = oLink.getBindingContext();
1423
+ var oLinkData = oLinkContext && oLinkContext.getObject();
1424
+ var oMixedContext = merge({}, oPageData, oLinkData); // process semantic object mappings
1425
+
1426
+ if (oDataPoint.semanticObjectMapping) {
1427
+ var aSemanticObjectMapping = oDataPoint.semanticObjectMapping;
1428
+
1429
+ for (var item in aSemanticObjectMapping) {
1430
+ var oMapping = aSemanticObjectMapping[item];
1431
+ var sMainProperty = oMapping["LocalProperty"]["$PropertyPath"];
1432
+ var sMappedProperty = oMapping["SemanticObjectProperty"];
1433
+
1434
+ if (sMainProperty !== sMappedProperty) {
1435
+ if (oMixedContext.hasOwnProperty(sMainProperty)) {
1436
+ var oNewMapping = {};
1437
+ oNewMapping[sMappedProperty] = oMixedContext[sMainProperty];
1438
+ oMixedContext = merge({}, oMixedContext, oNewMapping);
1439
+ delete oMixedContext[sMainProperty];
1440
+ }
1441
+ }
1442
+ }
1443
+ }
1444
+
1445
+ if (oMixedContext) {
1446
+ for (var sKey in oMixedContext) {
1447
+ if (sKey.indexOf("_") !== 0 && sKey.indexOf("odata.context") === -1) {
1448
+ oParams[sKey] = oMixedContext[sKey];
1449
+ }
1450
+ }
1451
+ } // validate if a link must be rendered
1452
+
1453
+
1454
+ oShellServices.isNavigationSupported([{
1455
+ target: {
1456
+ semanticObject: oDataPoint.semanticObject,
1457
+ action: oDataPoint.action
1458
+ },
1459
+ params: oParams
1460
+ }]).then(function (aLinks) {
1461
+ return fnSetLinkEnablement(sId, aLinks);
1462
+ }).catch(fnOnError);
1463
+ };
1464
+
1465
+ for (var sId in oDataPoints) {
1466
+ var _ret = _loop(sId);
1467
+
1468
+ if (_ret === "continue") continue;
1469
+ }
1470
+ }
1471
+ };
1472
+
1473
+ return ObjectPageController;
1474
+ }(PageController), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "placeholder", [_dec2], {
1475
+ configurable: true,
1476
+ enumerable: true,
1477
+ writable: true,
1478
+ initializer: null
1479
+ }), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "editFlow", [_dec3], {
1480
+ configurable: true,
1481
+ enumerable: true,
1482
+ writable: true,
1483
+ initializer: null
1484
+ }), _descriptor3 = _applyDecoratedDescriptor(_class2.prototype, "share", [_dec4], {
1485
+ configurable: true,
1486
+ enumerable: true,
1487
+ writable: true,
1488
+ initializer: null
1489
+ }), _descriptor4 = _applyDecoratedDescriptor(_class2.prototype, "_editFlow", [_dec5], {
1490
+ configurable: true,
1491
+ enumerable: true,
1492
+ writable: true,
1493
+ initializer: null
1494
+ }), _descriptor5 = _applyDecoratedDescriptor(_class2.prototype, "_routing", [_dec6], {
1495
+ configurable: true,
1496
+ enumerable: true,
1497
+ writable: true,
1498
+ initializer: null
1499
+ }), _descriptor6 = _applyDecoratedDescriptor(_class2.prototype, "paginator", [_dec7], {
1500
+ configurable: true,
1501
+ enumerable: true,
1502
+ writable: true,
1503
+ initializer: null
1504
+ }), _descriptor7 = _applyDecoratedDescriptor(_class2.prototype, "messageHandler", [_dec8], {
1505
+ configurable: true,
1506
+ enumerable: true,
1507
+ writable: true,
1508
+ initializer: null
1509
+ }), _descriptor8 = _applyDecoratedDescriptor(_class2.prototype, "intentBasedNavigation", [_dec9], {
1510
+ configurable: true,
1511
+ enumerable: true,
1512
+ writable: true,
1513
+ initializer: null
1514
+ }), _descriptor9 = _applyDecoratedDescriptor(_class2.prototype, "_intentBasedNavigation", [_dec10], {
1515
+ configurable: true,
1516
+ enumerable: true,
1517
+ writable: true,
1518
+ initializer: null
1519
+ }), _descriptor10 = _applyDecoratedDescriptor(_class2.prototype, "viewState", [_dec11], {
1520
+ configurable: true,
1521
+ enumerable: true,
1522
+ writable: true,
1523
+ initializer: null
1524
+ }), _descriptor11 = _applyDecoratedDescriptor(_class2.prototype, "pageReady", [_dec12], {
1525
+ configurable: true,
1526
+ enumerable: true,
1527
+ writable: true,
1528
+ initializer: null
1529
+ }), _descriptor12 = _applyDecoratedDescriptor(_class2.prototype, "massEdit", [_dec13], {
1530
+ configurable: true,
1531
+ enumerable: true,
1532
+ writable: true,
1533
+ initializer: null
1534
+ }), _applyDecoratedDescriptor(_class2.prototype, "getExtensionAPI", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "getExtensionAPI"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPageReady", [_dec16, _dec17], Object.getOwnPropertyDescriptor(_class2.prototype, "onPageReady"), _class2.prototype)), _class2)) || _class);
1535
+ return ObjectPageController;
1536
+ }, false);
1537
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk9iamVjdFBhZ2VDb250cm9sbGVyLmNvbnRyb2xsZXIudHMiXSwibmFtZXMiOlsiT2JqZWN0UGFnZUNvbnRyb2xsZXIiLCJkZWZpbmVVSTVDbGFzcyIsInVzaW5nRXh0ZW5zaW9uIiwiUGxhY2Vob2xkZXIiLCJFZGl0RmxvdyIsIlNoYXJlIiwib3ZlcnJpZGUiLCJTaGFyZU92ZXJyaWRlcyIsIkludGVybmFsRWRpdEZsb3ciLCJFZGl0Rmxvd092ZXJyaWRlcyIsIkludGVybmFsUm91dGluZyIsIkludGVybmFsUm91dGluZ092ZXJyaWRlIiwiUGFnaW5hdG9yIiwiUGFnaW5hdG9yT3ZlcnJpZGUiLCJNZXNzYWdlSGFuZGxlciIsIk1lc3NhZ2VIYW5kbGVyT3ZlcnJpZGUiLCJJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSIsIkludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiZ2V0TmF2aWdhdGlvbk1vZGUiLCJiSXNTdGlja3lFZGl0TW9kZSIsImdldFZpZXciLCJnZXRDb250cm9sbGVyIiwiZ2V0U3RpY2t5RWRpdE1vZGUiLCJ1bmRlZmluZWQiLCJWaWV3U3RhdGUiLCJWaWV3U3RhdGVPdmVycmlkZXMiLCJQYWdlUmVhZHkiLCJpc0NvbnRleHRFeHBlY3RlZCIsIk1hc3NFZGl0IiwicHVibGljRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJleHRlbnNpYmxlIiwiT3ZlcnJpZGVFeGVjdXRpb24iLCJBZnRlciIsImhhbmRsZXJzIiwib25UYWJsZUNvbnRleHRDaGFuZ2UiLCJvRXZlbnQiLCJvU291cmNlIiwiZ2V0U291cmNlIiwib1RhYmxlIiwiX2ZpbmRUYWJsZXMiLCJzb21lIiwiX29UYWJsZSIsImdldFJvd0JpbmRpbmciLCJvQ3VycmVudEFjdGlvblByb21pc2UiLCJfZWRpdEZsb3ciLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImFUYWJsZUNvbnRleHRzIiwiZ2V0VHlwZSIsImdldE1ldGFkYXRhIiwiaXNBIiwiZ2V0Q29udGV4dHMiLCJnZXRDdXJyZW50Q29udGV4dHMiLCJ0aGVuIiwib0FjdGlvblJlc3BvbnNlIiwiY29udHJvbElkIiwic0lkIiwib0FjdGlvbkRhdGEiLCJvRGF0YSIsImFLZXlzIiwia2V5cyIsImlOZXdJdGVtcCIsImZpbmQiLCJvVGFibGVDb250ZXh0IiwiaSIsIm9UYWJsZURhdGEiLCJnZXRPYmplY3QiLCJiQ29tcGFyZSIsImV2ZXJ5Iiwic0tleSIsImFEaWFsb2dzIiwiSW5zdGFuY2VNYW5hZ2VyIiwiZ2V0T3BlbkRpYWxvZ3MiLCJvRGlhbG9nIiwibGVuZ3RoIiwiZGlhbG9nIiwiZGF0YSIsImF0dGFjaEV2ZW50T25jZSIsImZvY3VzUm93IiwiZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJjYXRjaCIsImVyciIsIkxvZyIsImVycm9yIiwib01lc3NhZ2VCdXR0b24iLCJieUlkIiwiZmlyZU1vZGVsQ29udGV4dENoYW5nZSIsIm9uQ2FsbEFjdGlvbiIsIm9WaWV3Iiwic0FjdGlvbk5hbWUiLCJtUGFyYW1ldGVycyIsIm9Db250cm9sbGVyIiwidGhhdCIsImVkaXRGbG93IiwiaW52b2tlQWN0aW9uIiwiX3Nob3dNZXNzYWdlUG9wb3ZlciIsImJpbmQiLCJvbkRhdGFQb2ludFRpdGxlUHJlc3NlZCIsIm9NYW5pZmVzdE91dGJvdW5kIiwic0NvbnRyb2xDb25maWciLCJzQ29sbGVjdGlvblBhdGgiLCJKU09OIiwicGFyc2UiLCJvVGFyZ2V0SW5mbyIsImFTZW1hbnRpY09iamVjdE1hcHBpbmciLCJDb21tb25VdGlscyIsImdldFNlbWFudGljT2JqZWN0TWFwcGluZyIsIm9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsInNNZXRhUGF0aCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiYU5hdmlnYXRpb25EYXRhIiwiX2dldENoYXJ0Q29udGV4dERhdGEiLCJhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJtYXAiLCJvTmF2aWdhdGlvbkRhdGEiLCJtZXRhUGF0aCIsInBhcmFtZXRlcnMiLCJvUGFyYW1zIiwiX2ludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldE91dGJvdW5kUGFyYW1zIiwiT2JqZWN0Iiwic2VtYW50aWNPYmplY3QiLCJhY3Rpb24iLCJuYXZpZ2F0ZSIsIm5hdmlnYXRpb25Db250ZXh0cyIsInNlbWFudGljT2JqZWN0TWFwcGluZyIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsInNPdXRib3VuZFRhcmdldCIsIm9Db250ZXh0Iiwic0NyZWF0ZVBhdGgiLCJvbk5hdmlnYXRlQ2hhbmdlIiwiZ2V0RXh0ZW5zaW9uQVBJIiwidXBkYXRlQXBwU3RhdGUiLCJiU2VjdGlvbk5hdmlnYXRlZCIsIm9JbnRlcm5hbE1vZGVsQ29udGV4dCIsIm9PYmplY3RQYWdlIiwiX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sIiwiZ2V0UHJvcGVydHkiLCJnZXRWaWV3RGF0YSIsInNlY3Rpb25MYXlvdXQiLCJvU3ViU2VjdGlvbiIsImdldFBhcmFtZXRlciIsIl91cGRhdGVGb2N1c0luRWRpdE1vZGUiLCJvblZhcmlhbnRTZWxlY3RlZCIsIm9uVmFyaWFudFNhdmVkIiwic2V0VGltZW91dCIsIm5hdmlnYXRlVG9TdWJTZWN0aW9uIiwidkRldGFpbENvbmZpZyIsIm9EZXRhaWxDb25maWciLCJvU2VjdGlvbiIsInNlY3Rpb25JZCIsInN1YlNlY3Rpb25JZCIsImdldFN1YlNlY3Rpb25zIiwiZ2V0UGFyZW50IiwiZ2V0VmlzaWJsZSIsImdldFJlc291cmNlQnVuZGxlIiwib1Jlc291cmNlQnVuZGxlIiwic1RpdGxlIiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJlbnRpdHlTZXQiLCJNZXNzYWdlQm94Iiwic2Nyb2xsVG9TZWN0aW9uIiwiZ2V0SWQiLCJmaXJlTmF2aWdhdGUiLCJzZWN0aW9uIiwic3ViU2VjdGlvbiIsIm9uQ2hhcnRTZWxlY3Rpb25DaGFuZ2VkIiwiQ2hhcnRSdW50aW1lIiwiZm5VcGRhdGVDaGFydCIsIm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcyIsIkV4dGVuc2lvbkFQSSIsImV4dGVuc2lvbkFQSSIsIm9uSW5pdCIsInNldFByb3BlcnR5IiwidmlzaWJpbGl0eSIsIml0ZW1zIiwiX2dldEJhdGNoR3JvdXBzRm9yVmlldyIsInVzZU5ld0xhenlMb2FkaW5nIiwiZ2V0RW5hYmxlTGF6eUxvYWRpbmciLCJhdHRhY2hFdmVudCIsIl9oYW5kbGVTdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0Iiwib25FeGl0IiwiZGVzdHJveSIsIm9NZXNzYWdlUG9wb3ZlciIsImlzT3BlbiIsImNsb3NlIiwiaXNLZWVwQWxpdmUiLCJzZXRLZWVwQWxpdmUiLCJfZ2V0VGFibGVCaW5kaW5nIiwib25CZWZvcmVSZW5kZXJpbmciLCJQYWdlQ29udHJvbGxlciIsInByb3RvdHlwZSIsImFwcGx5Iiwib1ZpZXdEYXRhIiwicmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCIsIkNvbW1vbkhlbHBlciIsInNldE1ldGFNb2RlbCIsImdldEFwcENvbXBvbmVudCIsIm9uQWZ0ZXJSZW5kZXJpbmciLCJyZXNwb25zZSIsIm9FcnJvciIsIl9vbkJlZm9yZUJpbmRpbmciLCJhVGFibGVzIiwib0ludGVybmFsTW9kZWwiLCJhQmF0Y2hHcm91cHMiLCJpVmlld0xldmVsIiwidmlld0xldmVsIiwib0Zhc3RDcmVhdGlvblJvdyIsInB1c2giLCJiRHJhZnROYXZpZ2F0aW9uIiwiX2Nsb3NlU2lkZUNvbnRlbnQiLCJvcENvbnRleHQiLCJoYXNQZW5kaW5nQ2hhbmdlcyIsImdldEJpbmRpbmciLCJyZXNldENoYW5nZXMiLCJnZXRDcmVhdGlvblJvdyIsInNldEJpbmRpbmdDb250ZXh0IiwiZm5TY3JvbGxUb1ByZXNlbnRTZWN0aW9uIiwiaXNGaXJzdFJlbmRlcmluZyIsImJQZXJzaXN0T1BTY3JvbGwiLCJzZXRTZWxlY3RlZFNlY3Rpb24iLCJvRGVsZWdhdGVPbkJlZm9yZSIsImFkZEV2ZW50RGVsZWdhdGUiLCJwYWdlUmVhZHkiLCJyZW1vdmVFdmVudERlbGVnYXRlIiwib0JpbmRpbmciLCJsaXN0QmluZGluZyIsIm9QYWdpbmF0b3JDdXJyZW50Q29udGV4dCIsIm9CaW5kaW5nVG9Vc2UiLCJwYWdpbmF0b3IiLCJpbml0aWFsaXplIiwic0NvbnRleHRQYXRoIiwicmVwbGFjZSIsIk9EYXRhTGlzdEJpbmRpbmciLCJvTW9kZWwiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsIl9zZXRMaXN0QmluZGluZ0FzeW5jIiwiZGV0YWNoRXZlbnQiLCJhU2VjdGlvbnMiLCJnZXRTZWN0aW9ucyIsImJVc2VJY29uVGFiQmFyIiwiZ2V0VXNlSWNvblRhYkJhciIsImlTa2lwIiwiYklzSW5FZGl0TW9kZSIsImJFZGl0YWJsZUhlYWRlciIsImVkaXRhYmxlSGVhZGVyQ29udGVudCIsImlTZWN0aW9uIiwiYVN1YlNlY3Rpb25zIiwiaVN1YlNlY3Rpb24iLCJpc1Zpc2liaWxpdHlEeW5hbWljIiwicGxhY2Vob2xkZXIiLCJpc1BsYWNlaG9sZGVyRW5hYmxlZCIsInNob3dQbGFjZWhvbGRlciIsIm9OYXZDb250YWluZXIiLCJvQ29udGFpbmVyIiwiX2dldEZpcnN0Q2xpY2thYmxlRWxlbWVudCIsIm9GaXJzdENsaWNrYWJsZUVsZW1lbnQiLCJhQWN0aW9ucyIsImdldEhlYWRlclRpdGxlIiwiZ2V0QWN0aW9ucyIsIm9BY3Rpb24iLCJnZXRFbmFibGVkIiwiX2dldEZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZEZyb21TdWJTZWN0aW9uIiwiYUJsb2NrcyIsImdldEJsb2NrcyIsImJsb2NrIiwiYUZvcm1Db250YWluZXJzIiwiZ2V0Rm9ybUNvbnRhaW5lcnMiLCJnZXRDb250ZW50IiwiZm9ybUNvbnRhaW5lciIsImFGb3JtRWxlbWVudHMiLCJnZXRGb3JtRWxlbWVudHMiLCJmb3JtRWxlbWVudCIsImFGaWVsZHMiLCJnZXRGaWVsZHMiLCJnZXRSZXF1aXJlZCIsImdldFZhbHVlIiwiZGVidWciLCJvTWFuZGF0b3J5RmllbGQiLCJvRmllbGRUb0ZvY3VzIiwiY29udGVudCIsImdldENvbnRlbnRFZGl0IiwiX2dldEZpcnN0RWRpdGFibGVJbnB1dCIsImZvY3VzIiwiX29uQmFja05hdmlnYXRpb25JbkRyYWZ0IiwiZ2V0Um91dGVyUHJveHkiLCJjaGVja0lmQmFja0hhc1NhbWVDb250ZXh0IiwiaGlzdG9yeSIsImJhY2siLCJkcmFmdCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiRnVuY3Rpb24iLCJOYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwiX29uQWZ0ZXJCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwiX3NpZGVFZmZlY3RzIiwiY2xlYXJQcm9wZXJ0aWVzU3RhdHVzIiwiYUlCTkFjdGlvbnMiLCJmb3JFYWNoIiwiZ2V0SUJOQWN0aW9ucyIsIm9UYWJsZVJvd0JpbmRpbmciLCJNb2RlbEhlbHBlciIsImlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsInJlbW92ZUNhY2hlc0FuZE1lc3NhZ2VzIiwib0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsInBhcnNlQ3VzdG9tRGF0YSIsIkRlbGVnYXRlVXRpbCIsImdldEN1c3RvbURhdGEiLCJhU2VsZWN0ZWRDb250ZXh0cyIsImdldFNlbGVjdGVkQ29udGV4dHMiLCJzZXRBY3Rpb25FbmFibGVtZW50IiwiZ2V0U2VtYW50aWNUYXJnZXRzRnJvbVBhZ2VNb2RlbCIsIm9PYmplY3RQYWdlVGl0bGUiLCJhSUJOSGVhZGVyQWN0aW9ucyIsImNvbmNhdCIsInVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5Iiwib0ZpbmFsVUlTdGF0ZSIsImVuYWJsZUZhc3RDcmVhdGlvblJvdyIsIm9MaXN0QmluZGluZyIsIm9GYXN0Q3JlYXRpb25MaXN0QmluZGluZyIsIm9GYXN0Q3JlYXRpb25Db250ZXh0IiwiYmluZExpc3QiLCJnZXRDb250ZXh0IiwiJCR1cGRhdGVHcm91cElkIiwiJCRncm91cElkIiwicmVmcmVzaEludGVybmFsIiwiY3JlYXRlIiwiY3JlYXRlZCIsInRyYWNlIiwiaGFuZGxlVGFibGVNb2RpZmljYXRpb25zIiwiZm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzIiwiZm5IYW5kbGVDaGFuZ2UiLCJkZXRhY2hDaGFuZ2UiLCJhdHRhY2hDaGFuZ2UiLCJjb21wdXRlRWRpdE1vZGUiLCJpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCIsImNvbm5lY3QiLCJvQ2FjaGUiLCJfdXBkYXRlUmVsYXRlZEFwcHMiLCJmblVwZGF0ZVJlbGF0ZWRBcHBzIiwiZGV0YWNoRGF0YVJlY2VpdmVkIiwiYXR0YWNoRGF0YVJlY2VpdmVkIiwiY3VycmVudEJpbmRpbmciLCJoYW5kbGVQYXRjaFNlbnQiLCJUYWJsZVV0aWxzIiwid2hlbkJvdW5kIiwiX3RyaWdnZXJWaXNpYmxlU3ViU2VjdGlvbnNFdmVudHMiLCJvblBhZ2VSZWFkeSIsInNldEZvY3VzIiwiaXNJbkRpc3BsYXlNb2RlIiwib1NlbGVjdGVkU2VjdGlvbiIsIkNvcmUiLCJnZXRTZWxlY3RlZFNlY3Rpb24iLCJiSXNTdGlja3lNb2RlIiwib0FwcENvbXBvbmVudCIsImdldFNoZWxsU2VydmljZXMiLCJzZXRCYWNrTmF2aWdhdGlvbiIsImdldEFwcFN0YXRlSGFuZGxlciIsImFwcGx5QXBwU3RhdGUiLCJmb3JjZUZvY3VzIiwiRXJyb3IiLCJfY2hlY2tEYXRhUG9pbnRUaXRsZUZvckV4dGVybmFsTmF2aWdhdGlvbiIsIl9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbiIsIm9PYmplY3RQYWdlU3VidGl0bGUiLCJvQ3VzdG9tRGF0YSIsImdldEtleSIsIm9UaXRsZUluZm8iLCJ0aXRsZSIsInN1YnRpdGxlIiwiaW50ZW50IiwiaWNvbiIsIl9leGVjdXRlSGVhZGVyU2hvcnRjdXQiLCJzQnV0dG9uSWQiLCJvQnV0dG9uIiwib0VsZW1lbnQiLCJmaXJlQnV0dG9uUHJlc3MiLCJfZXhlY3V0ZUZvb3RlclNob3J0Y3V0IiwiZ2V0Rm9vdGVyIiwiZ2V0TmFtZSIsIl9leGVjdXRlVGFiU2hvcnRDdXQiLCJvRXhlY3V0aW9uIiwiaVNlY3Rpb25JbmRleE1heCIsInNDb21tYW5kIiwiZ2V0Q29tbWFuZCIsIm5ld1NlY3Rpb24iLCJpU2VsZWN0ZWRTZWN0aW9uSW5kZXgiLCJpbmRleE9mU2VjdGlvbiIsIl9nZXRGb290ZXJWaXNpYmlsaXR5Iiwic1ZpZXdJZCIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldE1lc3NhZ2VNYW5hZ2VyIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsIm9NZXNzYWdlIiwidmFsaWRhdGlvbiIsInR5cGUiLCJ0YXJnZXQiLCJpbmRleE9mIiwib1JldCIsImdldFJvb3RDb250YWluZXIiLCJnZXRDdXJyZW50UGFnZSIsIm9JdGVtQmluZGluZyIsImdldExlbmd0aCIsInNldFZpc2libGUiLCJvcGVuQnkiLCJfZWRpdERvY3VtZW50IiwiQnVzeUxvY2tlciIsImxvY2siLCJlZGl0RG9jdW1lbnQiLCJmaW5hbGx5IiwidW5sb2NrIiwiX3NhdmVEb2N1bWVudCIsImFXYWl0Q3JlYXRlRG9jdW1lbnRzIiwiYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJjcmVhdGlvbk1vZGUiLCJjcmVhdGlvblJvdyIsImNyZWF0ZUF0RW5kIiwiYkNyZWF0ZURvY3VtZW50IiwiYlNraXBTaWRlRWZmZWN0cyIsImNyZWF0ZURvY3VtZW50IiwiUHJvbWlzZSIsImFsbCIsImFCaW5kaW5ncyIsImJpbmRpbmdzIiwic2F2ZURvY3VtZW50IiwiaXNMb2NrZWQiLCJfbWFuYWdlQ29sbGFib3JhdGlvbiIsIm9wZW5NYW5hZ2VEaWFsb2ciLCJfc2hvd0NvbGxhYm9yYXRpb25Vc2VyRGV0YWlscyIsImV2ZW50Iiwic2hvd1VzZXJEZXRhaWxzIiwiX2NhbmNlbERvY3VtZW50IiwiY2FuY2VsQnV0dG9uIiwiY2FuY2VsRG9jdW1lbnQiLCJfYXBwbHlEb2N1bWVudCIsImFwcGx5RG9jdW1lbnQiLCJfc2hvd1N3aXRjaERyYWZ0QW5kQWN0aXZlUG9wb3ZlciIsInZpZXciLCJzb3VyY2UiLCJmcmFnbWVudE5hbWUiLCJzd2l0Y2hEcmFmdEFuZEFjdGl2ZVBvcE92ZXIiLCJsb2NhbFRoaXNNb2RlbCIsIkpTT05Nb2RlbCIsInByZXByb2Nlc3NvclNldHRpbmdzIiwiYmluZGluZ0NvbnRleHRzIiwibW9kZWxzIiwicG9wb3ZlckZyYWdtZW50IiwiWE1MVGVtcGxhdGVQcm9jZXNzb3IiLCJsb2FkVGVtcGxhdGUiLCJyZXNvbHZlIiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsIm5hbWUiLCJmcmFnbWVudCIsIkZyYWdtZW50IiwibG9hZCIsImRlZmluaXRpb24iLCJjb250cm9sbGVyIiwicG9wb3ZlciIsImFkZERlcGVuZGVudCIsInNldE1vZGVsIiwic2V0UGxhY2VtZW50IiwiYXR0YWNoQWZ0ZXJPcGVuIiwiY29udGV4dCIsImlzQWN0aXZlRW50aXR5IiwiSXNBY3RpdmVFbnRpdHkiLCJzd2l0Y2hEcmFmdEFuZEFjdGl2ZU9wdGlvbnNMaXN0IiwiZWxlbWVudCIsImxpc3RJdGVtVG9Gb2N1cyIsImdldEl0ZW1zIiwiX3N3aXRjaERyYWZ0QW5kQWN0aXZlUG9wb3Zlckxpc3RTZWxlY3QiLCJzZWxlY3RlZEl0ZW1LZXkiLCJ0b2dnbGVEcmFmdEFjdGl2ZSIsInJlc29sdmVTdHJpbmd0b0Jvb2xlYW4iLCJ1cGRhdGVSZWxhdGVkQXBwc0RldGFpbHMiLCJfZmluZFRhYmxlSW5TdWJTZWN0aW9uIiwiYVBhcmVudEVsZW1lbnQiLCJhU3Vic2VjdGlvbiIsImFTdWJTZWN0aW9uVGFibGVzIiwiZ2V0TWFpbkNvbnRlbnQiLCJncmlkVGFibGUiLCJoYXNTdHlsZUNsYXNzIiwiYWRkU3R5bGVDbGFzcyIsInRhYmxlIiwic2V0Um93Q291bnQiLCJfZ2V0QWxsU3ViU2VjdGlvbnMiLCJfZ2V0QWxsQmxvY2tzIiwiZ2V0TW9yZUJsb2NrcyIsIm9CbG9jayIsIm9Db250ZW50Iiwic2V0U2hvd1NpZGVDb250ZW50Iiwib0NoYXJ0Q29udGV4dCIsInNDaGFydFBhdGgiLCJvQ29udGV4dERhdGEiLCJvQ2hhcnRDb250ZXh0RGF0YSIsIl9zY3JvbGxUYWJsZXNUb1JvdyIsInNSb3dQYXRoIiwiVGFibGVTY3JvbGxlciIsInNjcm9sbFRhYmxlVG9Sb3ciLCJfbWVyZ2VNdWx0aXBsZUNvbnRleHRzIiwib1BhZ2VDb250ZXh0IiwiYUxpbmVDb250ZXh0IiwiYUF0dHJpYnV0ZXMiLCJhUGFnZUF0dHJpYnV0ZXMiLCJzTWV0YVBhdGhMaW5lIiwic1BhdGhMaW5lIiwic1BhZ2VQYXRoIiwib01ldGFNb2RlbCIsInNNZXRhUGF0aFBhZ2UiLCJvU2luZ2xlQ29udGV4dCIsImNvbnRleHREYXRhIiwicmVtb3ZlU2Vuc2l0aXZlRGF0YSIsIm9QYWdlTGV2ZWxTViIsImFkZFBhZ2VDb250ZXh0VG9TZWxlY3Rpb25WYXJpYW50IiwiU2VsZWN0aW9uVmFyaWFudCIsInNlbGVjdGlvblZhcmlhbnQiLCJhdHRyaWJ1dGVzIiwib0NvbmZpZ3VyYXRpb25zIiwiY29udHJvbENvbmZpZ3VyYXRpb24iLCJhQ29uZmlndXJhdGlvbnMiLCJvQ29uZmlndXJhdGlvbiIsInJlcXVlc3RHcm91cElkIiwiX3NldEJyZWFkY3J1bWJMaW5rcyIsInNOZXdQYXRoIiwiYVBhdGhQYXJ0cyIsInNwbGl0Iiwic1BhdGgiLCJpU2tpcFBhcmFtZXRlcml6ZWQiLCJzaGlmdCIsInNwbGljZSIsInNQYXRoUGFydCIsIm9Sb290Vmlld0NvbnRyb2xsZXIiLCJnZXRSb290Vmlld0NvbnRyb2xsZXIiLCJzUGFyYW1ldGVyUGF0aCIsImJSZXN1bHRDb250ZXh0IiwicFdhaXRGb3JUaXRsZUhpZWFyY2h5SW5mbyIsImdldFRpdGxlSW5mb0Zyb21QYXRoIiwib1RpdGxlSGllYXJjaHlJbmZvIiwiaWR4Iiwib0xpbmsiLCJnZXRMaW5rcyIsIkxpbmsiLCJzZXRUZXh0Iiwic2V0SHJlZiIsImFkZExpbmsiLCJvRGF0YVBvaW50cyIsImdldEhlYWRlckZhY2V0SXRlbUNvbmZpZ0ZvckV4dGVybmFsTmF2aWdhdGlvbiIsImdldFJvdXRpbmdTZXJ2aWNlIiwiZ2V0T3V0Ym91bmRzIiwib1NoZWxsU2VydmljZXMiLCJyZXF1ZXN0T2JqZWN0IiwiZm5HZXRMaW5rcyIsImZuT25FcnJvciIsImZuU2V0TGlua0VuYWJsZW1lbnQiLCJpZCIsImFTdXBwb3J0ZWRMaW5rcyIsInNMaW5rSWQiLCJzdXBwb3J0ZWQiLCJvUGFnZURhdGEiLCJvRGF0YVBvaW50Iiwib0xpbmtDb250ZXh0Iiwib0xpbmtEYXRhIiwib01peGVkQ29udGV4dCIsIm1lcmdlIiwiaXRlbSIsIm9NYXBwaW5nIiwic01haW5Qcm9wZXJ0eSIsInNNYXBwZWRQcm9wZXJ0eSIsImhhc093blByb3BlcnR5Iiwib05ld01hcHBpbmciLCJpc05hdmlnYXRpb25TdXBwb3J0ZWQiLCJwYXJhbXMiLCJhTGlua3MiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQThETUEsb0IsV0FETEMsY0FBYyxDQUFDLGtEQUFELEMsVUFHYkMsY0FBYyxDQUFDQyxXQUFELEMsVUFFZEQsY0FBYyxDQUFDRSxRQUFELEMsVUFFZEYsY0FBYyxDQUFDRyxLQUFLLENBQUNDLFFBQU4sQ0FBZUMsY0FBZixDQUFELEMsVUFFZEwsY0FBYyxDQUFDTSxnQkFBZ0IsQ0FBQ0YsUUFBakIsQ0FBMEJHLGlCQUExQixDQUFELEMsVUFFZFAsY0FBYyxDQUFDUSxlQUFlLENBQUNKLFFBQWhCLENBQXlCSyx1QkFBekIsQ0FBRCxDLFVBRWRULGNBQWMsQ0FBQ1UsU0FBUyxDQUFDTixRQUFWLENBQW1CTyxpQkFBbkIsQ0FBRCxDLFVBRWRYLGNBQWMsQ0FBQ1ksY0FBYyxDQUFDUixRQUFmLENBQXdCUyxzQkFBeEIsQ0FBRCxDLFVBRWRiLGNBQWMsQ0FBQ2MscUJBQXFCLENBQUNWLFFBQXRCLENBQStCVyw2QkFBL0IsQ0FBRCxDLFdBRWRmLGNBQWMsQ0FDZGdCLDZCQUE2QixDQUFDWixRQUE5QixDQUF1QztBQUN0Q2EsSUFBQUEsaUJBQWlCLEVBQUUsWUFBK0M7QUFDakUsVUFBTUMsaUJBQWlCLEdBQ3JCLEtBQUtDLE9BQUwsR0FBZUMsYUFBZixFQUFELENBQXlEQyxpQkFBekQsSUFDQyxLQUFLRixPQUFMLEdBQWVDLGFBQWYsRUFBRCxDQUF5REMsaUJBQXpELEVBRkQ7QUFHQSxhQUFPSCxpQkFBaUIsR0FBRyxTQUFILEdBQWVJLFNBQXZDO0FBQ0E7QUFOcUMsR0FBdkMsQ0FEYyxDLFdBV2R0QixjQUFjLENBQUN1QixTQUFTLENBQUNuQixRQUFWLENBQW1Cb0Isa0JBQW5CLENBQUQsQyxXQUVkeEIsY0FBYyxDQUNkeUIsU0FBUyxDQUFDckIsUUFBVixDQUFtQjtBQUNsQnNCLElBQUFBLGlCQUFpQixFQUFFLFlBQVk7QUFDOUIsYUFBTyxJQUFQO0FBQ0E7QUFIaUIsR0FBbkIsQ0FEYyxDLFdBUWQxQixjQUFjLENBQUMyQixRQUFELEMsV0FTZEMsZUFBZSxFLFdBQ2ZDLGNBQWMsRSxXQWdlZEQsZUFBZSxFLFdBQ2ZFLFVBQVUsQ0FBQ0MsaUJBQWlCLENBQUNDLEtBQW5CLEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZQThvQlhDLFEsR0FBVztBQUNWQyxRQUFBQSxvQkFEVSxZQUN1Q0MsTUFEdkMsRUFDb0Q7QUFBQTs7QUFDN0QsY0FBTUMsT0FBTyxHQUFHRCxNQUFNLENBQUNFLFNBQVAsRUFBaEI7QUFDQSxjQUFJQyxNQUFKOztBQUNBLGVBQUtDLFdBQUwsR0FBbUJDLElBQW5CLENBQXdCLFVBQVVDLE9BQVYsRUFBd0I7QUFDL0MsZ0JBQUlBLE9BQU8sQ0FBQ0MsYUFBUixPQUE0Qk4sT0FBaEMsRUFBeUM7QUFDeENFLGNBQUFBLE1BQU0sR0FBR0csT0FBVDtBQUNBLHFCQUFPLElBQVA7QUFDQTs7QUFDRCxtQkFBTyxLQUFQO0FBQ0EsV0FORDs7QUFRQSxjQUFNRSxxQkFBcUIsR0FBRyxLQUFLQyxTQUFMLENBQWVDLHVCQUFmLEVBQTlCOztBQUNBLGNBQUlGLHFCQUFKLEVBQTJCO0FBQzFCLGdCQUFJRyxjQUFKOztBQUNBLGdCQUFJUixNQUFNLENBQUNTLE9BQVAsR0FBaUJDLFdBQWpCLEdBQStCQyxHQUEvQixDQUFtQyxnQ0FBbkMsQ0FBSixFQUEwRTtBQUN6RUgsY0FBQUEsY0FBYyxHQUFHVixPQUFPLENBQUNjLFdBQVIsQ0FBb0IsQ0FBcEIsQ0FBakI7QUFDQSxhQUZELE1BRU87QUFDTkosY0FBQUEsY0FBYyxHQUFHVixPQUFPLENBQUNlLGtCQUFSLEVBQWpCO0FBQ0EsYUFOeUIsQ0FPMUI7OztBQUNBLGdCQUFJLENBQUNMLGNBQWMsQ0FBQyxDQUFELENBQW5CLEVBQXdCO0FBQ3ZCO0FBQ0E7O0FBQ0RILFlBQUFBLHFCQUFxQixDQUNuQlMsSUFERixDQUNPLFVBQUNDLGVBQUQsRUFBMEI7QUFDL0Isa0JBQUksQ0FBQ0EsZUFBRCxJQUFvQkEsZUFBZSxDQUFDQyxTQUFoQixLQUE4QmhCLE1BQU0sQ0FBQ2lCLEdBQTdELEVBQWtFO0FBQ2pFO0FBQ0E7O0FBQ0Qsa0JBQU1DLFdBQVcsR0FBR0gsZUFBZSxDQUFDSSxLQUFwQztBQUNBLGtCQUFNQyxLQUFLLEdBQUdMLGVBQWUsQ0FBQ00sSUFBOUI7QUFDQSxrQkFBSUMsU0FBUyxHQUFHLENBQUMsQ0FBakI7QUFDQWQsY0FBQUEsY0FBYyxDQUFDZSxJQUFmLENBQW9CLFVBQVVDLGFBQVYsRUFBOEJDLENBQTlCLEVBQXNDO0FBQ3pELG9CQUFNQyxVQUFVLEdBQUdGLGFBQWEsQ0FBQ0csU0FBZCxFQUFuQjtBQUNBLG9CQUFNQyxRQUFRLEdBQUdSLEtBQUssQ0FBQ1MsS0FBTixDQUFZLFVBQVVDLElBQVYsRUFBcUI7QUFDakQseUJBQU9KLFVBQVUsQ0FBQ0ksSUFBRCxDQUFWLEtBQXFCWixXQUFXLENBQUNZLElBQUQsQ0FBdkM7QUFDQSxpQkFGZ0IsQ0FBakI7O0FBR0Esb0JBQUlGLFFBQUosRUFBYztBQUNiTixrQkFBQUEsU0FBUyxHQUFHRyxDQUFaO0FBQ0E7O0FBQ0QsdUJBQU9HLFFBQVA7QUFDQSxlQVREOztBQVVBLGtCQUFJTixTQUFTLEtBQUssQ0FBQyxDQUFuQixFQUFzQjtBQUNyQixvQkFBTVMsUUFBUSxHQUFHQyxlQUFlLENBQUNDLGNBQWhCLEVBQWpCO0FBQ0Esb0JBQU1DLE9BQU8sR0FDWkgsUUFBUSxDQUFDSSxNQUFULEdBQWtCLENBQWxCLEdBQXNCSixRQUFRLENBQUNSLElBQVQsQ0FBYyxVQUFDYSxNQUFEO0FBQUEseUJBQVlBLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLGtCQUFaLE1BQW9DLElBQWhEO0FBQUEsaUJBQWQsQ0FBdEIsR0FBNEYsSUFEN0Y7O0FBRUEsb0JBQUlILE9BQUosRUFBYTtBQUNaO0FBQ0E7QUFDQUEsa0JBQUFBLE9BQU8sQ0FBQ0ksZUFBUixDQUF3QixZQUF4QixFQUFzQyxZQUFZO0FBQ2pEdEMsb0JBQUFBLE1BQU0sQ0FBQ3VDLFFBQVAsQ0FBZ0JqQixTQUFoQixFQUEyQixJQUEzQjtBQUNBLG1CQUZEO0FBR0EsaUJBTkQsTUFNTztBQUNOdEIsa0JBQUFBLE1BQU0sQ0FBQ3VDLFFBQVAsQ0FBZ0JqQixTQUFoQixFQUEyQixJQUEzQjtBQUNBOztBQUNELGdCQUFBLE1BQUksQ0FBQ2hCLFNBQUwsQ0FBZWtDLDBCQUFmO0FBQ0E7QUFDRCxhQWpDRixFQWtDRUMsS0FsQ0YsQ0FrQ1EsVUFBVUMsR0FBVixFQUFvQjtBQUMxQkMsY0FBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUsZ0VBQWdFRixHQUExRTtBQUNBLGFBcENGO0FBcUNBLFdBNUQ0RCxDQTZEN0Q7OztBQUNBLGNBQU1HLGNBQWMsR0FBRyxLQUFLaEUsT0FBTCxHQUFlaUUsSUFBZixDQUFvQiw4QkFBcEIsQ0FBdkI7QUFDQUQsVUFBQUEsY0FBYyxDQUFDRSxzQkFBZjtBQUNBLFNBakVTOztBQW1FVjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRUMsUUFBQUEsWUEvRVUsWUErRUdDLEtBL0VILEVBK0VlQyxXQS9FZixFQStFb0NDLFdBL0VwQyxFQStFc0Q7QUFDL0QsY0FBTUMsV0FBVyxHQUFHSCxLQUFLLENBQUNuRSxhQUFOLEVBQXBCO0FBQ0EsY0FBTXVFLElBQUksR0FBR0QsV0FBYjtBQUNBLGlCQUFPQSxXQUFXLENBQUNFLFFBQVosQ0FDTEMsWUFESyxDQUNRTCxXQURSLEVBQ3FCQyxXQURyQixFQUVMckMsSUFGSyxDQUVBdUMsSUFBSSxDQUFDRyxtQkFBTCxDQUF5QkMsSUFBekIsQ0FBOEJKLElBQTlCLEVBQW9DckUsU0FBcEMsQ0FGQSxFQUdMeUQsS0FISyxDQUdDWSxJQUFJLENBQUNHLG1CQUFMLENBQXlCQyxJQUF6QixDQUE4QkosSUFBOUIsQ0FIRCxDQUFQO0FBSUEsU0F0RlM7QUF1RlZLLFFBQUFBLHVCQXZGVSxZQXVGY04sV0F2RmQsRUF1RmdDdEQsT0F2RmhDLEVBdUY4QzZELGlCQXZGOUMsRUF1RnNFQyxjQXZGdEUsRUF1RjJGQyxlQXZGM0YsRUF1RmlIO0FBQzFIRixVQUFBQSxpQkFBaUIsR0FBRyxPQUFPQSxpQkFBUCxLQUE2QixRQUE3QixHQUF3Q0csSUFBSSxDQUFDQyxLQUFMLENBQVdKLGlCQUFYLENBQXhDLEdBQXdFQSxpQkFBNUY7QUFDQSxjQUFNSyxXQUFXLEdBQUdMLGlCQUFpQixDQUFDQyxjQUFELENBQXJDO0FBQUEsY0FDQ0ssc0JBQXNCLEdBQUdDLFdBQVcsQ0FBQ0Msd0JBQVosQ0FBcUNILFdBQXJDLENBRDFCO0FBQUEsY0FFQ0ksK0JBQStCLEdBQUd0RSxPQUFPLENBQUN1RSxpQkFBUixFQUZuQztBQUFBLGNBR0NDLFNBQVMsR0FBR0YsK0JBQStCLENBQ3pDRyxRQURVLEdBRVZDLFlBRlUsR0FHVkMsV0FIVSxDQUdFTCwrQkFBK0IsQ0FBQ00sT0FBaEMsRUFIRixDQUhiOztBQU9BLGNBQUlDLGVBQWUsR0FBR3ZCLFdBQVcsQ0FBQ3dCLG9CQUFaLENBQWlDUiwrQkFBakMsRUFBa0VQLGVBQWxFLENBQXRCOztBQUNBLGNBQUlnQiw4QkFBSjtBQUVBRixVQUFBQSxlQUFlLEdBQUdBLGVBQWUsQ0FBQ0csR0FBaEIsQ0FBb0IsVUFBVUMsZUFBVixFQUFnQztBQUNyRSxtQkFBTztBQUNOMUMsY0FBQUEsSUFBSSxFQUFFMEMsZUFEQTtBQUVOQyxjQUFBQSxRQUFRLEVBQUVWLFNBQVMsSUFBSVQsZUFBZSxHQUFHLE1BQU1BLGVBQVQsR0FBMkIsRUFBOUM7QUFGYixhQUFQO0FBSUEsV0FMaUIsQ0FBbEI7O0FBTUEsY0FBSUcsV0FBVyxJQUFJQSxXQUFXLENBQUNpQixVQUEvQixFQUEyQztBQUMxQyxnQkFBTUMsT0FBTyxHQUFHbEIsV0FBVyxDQUFDaUIsVUFBWixJQUEwQjdCLFdBQVcsQ0FBQytCLHNCQUFaLENBQW1DQyxpQkFBbkMsQ0FBcURwQixXQUFXLENBQUNpQixVQUFqRSxDQUExQzs7QUFDQSxnQkFBSUksTUFBTSxDQUFDaEUsSUFBUCxDQUFZNkQsT0FBWixFQUFxQi9DLE1BQXJCLEdBQThCLENBQWxDLEVBQXFDO0FBQ3BDMEMsY0FBQUEsOEJBQThCLEdBQUdLLE9BQWpDO0FBQ0E7QUFDRDs7QUFDRCxjQUFJbEIsV0FBVyxJQUFJQSxXQUFXLENBQUNzQixjQUEzQixJQUE2Q3RCLFdBQVcsQ0FBQ3VCLE1BQTdELEVBQXFFO0FBQ3BFbkMsWUFBQUEsV0FBVyxDQUFDK0Isc0JBQVosQ0FBbUNLLFFBQW5DLENBQTRDeEIsV0FBVyxDQUFDc0IsY0FBeEQsRUFBd0V0QixXQUFXLENBQUN1QixNQUFwRixFQUE0RjtBQUMzRkUsY0FBQUEsa0JBQWtCLEVBQUVkLGVBRHVFO0FBRTNGZSxjQUFBQSxxQkFBcUIsRUFBRXpCLHNCQUZvRTtBQUczRlksY0FBQUEsOEJBQThCLEVBQUVBO0FBSDJELGFBQTVGO0FBS0E7QUFDRCxTQXRIUzs7QUF1SFY7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNFYyxRQUFBQSw4QkFsSVUsWUFrSXFCdkMsV0FsSXJCLEVBa0l3RHdDLGVBbEl4RCxFQWtJaUZDLFFBbElqRixFQWtJZ0dDLFdBbEloRyxFQWtJcUg7QUFDOUgsaUJBQU8xQyxXQUFXLENBQUMrQixzQkFBWixDQUFtQ1EsOEJBQW5DLENBQWtFdkMsV0FBbEUsRUFBK0V3QyxlQUEvRSxFQUFnR0MsUUFBaEcsRUFBMEdDLFdBQTFHLENBQVA7QUFDQSxTQXBJUztBQXNJVkMsUUFBQUEsZ0JBdElVLFlBc0ltQ2xHLE1BdEluQyxFQXNJZ0Q7QUFDekQ7QUFDQSxlQUFLbUcsZUFBTCxHQUF1QkMsY0FBdkI7QUFDQSxlQUFLQyxpQkFBTCxHQUF5QixJQUF6QjtBQUVBLGNBQU1DLHFCQUFxQixHQUFHLEtBQUt0SCxPQUFMLEdBQWV3RixpQkFBZixDQUFpQyxVQUFqQyxDQUE5Qjs7QUFDQSxjQUFNK0IsV0FBVyxHQUFHLEtBQUtDLDJCQUFMLEVBQXBCOztBQUNBLGNBQ0NELFdBQVcsQ0FBQzdCLFFBQVosQ0FBcUIsSUFBckIsRUFBMkIrQixXQUEzQixDQUF1QyxhQUF2QyxLQUNDLEtBQUt6SCxPQUFMLEdBQWUwSCxXQUFmLEVBQUQsQ0FBc0NDLGFBQXRDLEtBQXdELE1BRHhELElBRUFMLHFCQUFxQixDQUFDRyxXQUF0QixDQUFrQyw0QkFBbEMsTUFBb0UsS0FIckUsRUFJRTtBQUNELGdCQUFNRyxXQUFXLEdBQUc1RyxNQUFNLENBQUM2RyxZQUFQLENBQW9CLFlBQXBCLENBQXBCOztBQUNBLGlCQUFLQyxzQkFBTCxDQUE0QixDQUFDRixXQUFELENBQTVCO0FBQ0E7QUFDRCxTQXJKUztBQXNKVkcsUUFBQUEsaUJBQWlCLEVBQUUsWUFBc0M7QUFDeEQsZUFBS1osZUFBTCxHQUF1QkMsY0FBdkI7QUFDQSxTQXhKUztBQXlKVlksUUFBQUEsY0FBYyxFQUFFLFlBQXNDO0FBQUE7O0FBQ3JEO0FBQ0FDLFVBQUFBLFVBQVUsQ0FBQyxZQUFNO0FBQ2hCLFlBQUEsTUFBSSxDQUFDZCxlQUFMLEdBQXVCQyxjQUF2QjtBQUNBLFdBRlMsRUFFUCxHQUZPLENBQVY7QUFHQSxTQTlKUztBQStKVmMsUUFBQUEsb0JBQW9CLEVBQUUsVUFBVTNELFdBQVYsRUFBNkM0RCxhQUE3QyxFQUFpRTtBQUN0RixjQUFNQyxhQUFhLEdBQUcsT0FBT0QsYUFBUCxLQUF5QixRQUF6QixHQUFvQ2xELElBQUksQ0FBQ0MsS0FBTCxDQUFXaUQsYUFBWCxDQUFwQyxHQUFnRUEsYUFBdEY7QUFDQSxjQUFNWixXQUFXLEdBQUdoRCxXQUFXLENBQUN2RSxPQUFaLEdBQXNCaUUsSUFBdEIsQ0FBMkIsZ0JBQTNCLENBQXBCO0FBQ0EsY0FBSW9FLFFBQUo7QUFDQSxjQUFJVCxXQUFKOztBQUNBLGNBQUlRLGFBQWEsQ0FBQ0UsU0FBbEIsRUFBNkI7QUFDNUJELFlBQUFBLFFBQVEsR0FBRzlELFdBQVcsQ0FBQ3ZFLE9BQVosR0FBc0JpRSxJQUF0QixDQUEyQm1FLGFBQWEsQ0FBQ0UsU0FBekMsQ0FBWDtBQUNBVixZQUFBQSxXQUFXLEdBQ1ZRLGFBQWEsQ0FBQ0csWUFBZCxHQUNHaEUsV0FBVyxDQUFDdkUsT0FBWixHQUFzQmlFLElBQXRCLENBQTJCbUUsYUFBYSxDQUFDRyxZQUF6QyxDQURILEdBRUdGLFFBQVEsSUFBSUEsUUFBUSxDQUFDRyxjQUFULEVBQVosSUFBeUNILFFBQVEsQ0FBQ0csY0FBVCxHQUEwQixDQUExQixDQUg3QztBQUtBLFdBUEQsTUFPTyxJQUFJSixhQUFhLENBQUNHLFlBQWxCLEVBQWdDO0FBQ3RDWCxZQUFBQSxXQUFXLEdBQUdyRCxXQUFXLENBQUN2RSxPQUFaLEdBQXNCaUUsSUFBdEIsQ0FBMkJtRSxhQUFhLENBQUNHLFlBQXpDLENBQWQ7QUFDQUYsWUFBQUEsUUFBUSxHQUFHVCxXQUFXLElBQUtBLFdBQVcsQ0FBQ2EsU0FBWixFQUEzQjtBQUNBOztBQUNELGNBQUksQ0FBQ0osUUFBRCxJQUFhLENBQUNULFdBQWQsSUFBNkIsQ0FBQ1MsUUFBUSxDQUFDSyxVQUFULEVBQTlCLElBQXVELENBQUNkLFdBQVcsQ0FBQ2MsVUFBWixFQUE1RCxFQUFzRjtBQUNuRm5FLFlBQUFBLFdBQVcsQ0FBQ3ZFLE9BQVosR0FBc0IwRixRQUF0QixDQUErQixhQUEvQixDQUFELENBQWlFaUQsaUJBQWpFLEVBQUQsQ0FDRTFHLElBREYsQ0FDTyxVQUFVMkcsZUFBVixFQUEyQjtBQUNoQyxrQkFBTUMsTUFBTSxHQUFHeEQsV0FBVyxDQUFDeUQsaUJBQVosQ0FDZCxxQ0FEYyxFQUVkRixlQUZjLEVBR2QsSUFIYyxFQUlickUsV0FBVyxDQUFDdkUsT0FBWixHQUFzQjBILFdBQXRCLEVBQUQsQ0FBNkNxQixTQUovQixDQUFmO0FBTUFqRixjQUFBQSxHQUFHLENBQUNDLEtBQUosQ0FBVThFLE1BQVY7QUFDQUcsY0FBQUEsVUFBVSxDQUFDakYsS0FBWCxDQUFpQjhFLE1BQWpCO0FBQ0EsYUFWRixFQVdFakYsS0FYRixDQVdRLFVBQVVHLEtBQVYsRUFBaUI7QUFDdkJELGNBQUFBLEdBQUcsQ0FBQ0MsS0FBSixDQUFVQSxLQUFWO0FBQ0EsYUFiRjtBQWNBLFdBZkQsTUFlTztBQUNOd0QsWUFBQUEsV0FBVyxDQUFDMEIsZUFBWixDQUE0QnJCLFdBQVcsQ0FBQ3NCLEtBQVosRUFBNUIsRUFETSxDQUVOOztBQUNBM0IsWUFBQUEsV0FBVyxDQUFDNEIsWUFBWixDQUF5QjtBQUN4QkMsY0FBQUEsT0FBTyxFQUFFZixRQURlO0FBRXhCZ0IsY0FBQUEsVUFBVSxFQUFFekI7QUFGWSxhQUF6QjtBQUlBO0FBQ0QsU0F0TVM7QUF1TVYwQixRQUFBQSx1QkFBdUIsRUFBRSxVQUFVdEksTUFBVixFQUF1QjtBQUMvQ3VJLFVBQUFBLFlBQVksQ0FBQ0MsYUFBYixDQUEyQnhJLE1BQTNCO0FBQ0E7QUF6TVMsTzs7Ozs7O1dBOW1DWG1HLGUsR0FGQSx5QkFFZ0IvRSxHQUZoQixFQUU0QztBQUMzQyxVQUFJQSxHQUFKLEVBQVM7QUFDUjtBQUNBLGFBQUtxSCwyQkFBTCxHQUFtQyxLQUFLQSwyQkFBTCxJQUFvQyxFQUF2RTs7QUFFQSxZQUFJLENBQUMsS0FBS0EsMkJBQUwsQ0FBaUNySCxHQUFqQyxDQUFMLEVBQTRDO0FBQzNDLGVBQUtxSCwyQkFBTCxDQUFpQ3JILEdBQWpDLElBQXdDLElBQUlzSCxZQUFKLENBQWlCLElBQWpCLEVBQXVCdEgsR0FBdkIsQ0FBeEM7QUFDQTs7QUFDRCxlQUFPLEtBQUtxSCwyQkFBTCxDQUFpQ3JILEdBQWpDLENBQVA7QUFDQSxPQVJELE1BUU87QUFDTixZQUFJLENBQUMsS0FBS3VILFlBQVYsRUFBd0I7QUFDdkIsZUFBS0EsWUFBTCxHQUFvQixJQUFJRCxZQUFKLENBQWlCLElBQWpCLENBQXBCO0FBQ0E7O0FBQ0QsZUFBTyxLQUFLQyxZQUFaO0FBQ0E7QUFDRCxLOztXQUVEQyxNLEdBQUEsa0JBQVM7QUFDUixnQ0FBTUEsTUFBTjs7QUFDQSxVQUFNckMsV0FBVyxHQUFHLEtBQUtDLDJCQUFMLEVBQXBCLENBRlEsQ0FJUjs7O0FBQ0EsVUFBTUYscUJBQXFCLEdBQUcsS0FBS3RILE9BQUwsR0FBZXdGLGlCQUFmLENBQWlDLFVBQWpDLENBQTlCO0FBQ0E4QixNQUFBQSxxQkFBcUIsQ0FBQ3VDLFdBQXRCLENBQWtDLDJCQUFsQyxFQUErRDtBQUFFLGdCQUFRO0FBQVYsT0FBL0Q7QUFDQXZDLE1BQUFBLHFCQUFxQixDQUFDdUMsV0FBdEIsQ0FBa0MsYUFBbEMsRUFBaUQ7QUFDaERDLFFBQUFBLFVBQVUsRUFBRSxLQURvQztBQUVoREMsUUFBQUEsS0FBSyxFQUFFO0FBRnlDLE9BQWpEO0FBSUF6QyxNQUFBQSxxQkFBcUIsQ0FBQ3VDLFdBQXRCLENBQWtDLGFBQWxDLEVBQWlELEtBQUtHLHNCQUFMLEVBQWpEO0FBQ0ExQyxNQUFBQSxxQkFBcUIsQ0FBQ3VDLFdBQXRCLENBQWtDLDRCQUFsQyxFQUFnRSxLQUFoRTs7QUFDQSxVQUFJLENBQUUsS0FBSzdKLE9BQUwsR0FBZTBILFdBQWYsRUFBRCxDQUFzQ3VDLGlCQUF2QyxJQUE2RDFDLFdBQUQsQ0FBcUIyQyxvQkFBckIsRUFBaEUsRUFBNkc7QUFDNUc7QUFDQTNDLFFBQUFBLFdBQVcsQ0FBQzRDLFdBQVosQ0FBd0IsMkJBQXhCLEVBQXFELEtBQUtDLGdDQUFMLENBQXNDeEYsSUFBdEMsQ0FBMkMsSUFBM0MsQ0FBckQ7QUFDQTtBQUNELEs7O1dBRUR5RixNLEdBQUEsa0JBQVM7QUFDUixVQUFJLEtBQUtaLDJCQUFULEVBQXNDO0FBQ3JDLHdDQUFrQmpELE1BQU0sQ0FBQ2hFLElBQVAsQ0FBWSxLQUFLaUgsMkJBQWpCLENBQWxCLGtDQUFpRTtBQUE1RCxjQUFNckgsR0FBRyxtQkFBVDtBQUNKLGVBQUtxSCwyQkFBTCxDQUFpQ3JILEdBQWpDLEtBQXlDLEtBQUtxSCwyQkFBTCxDQUFpQ3JILEdBQWpDLEVBQXNDa0ksT0FBdEMsRUFBekM7QUFDQTs7QUFDRCxlQUFPLEtBQUtiLDJCQUFaO0FBQ0E7O0FBQ0QsV0FBS0UsWUFBTCxJQUFxQixLQUFLQSxZQUFMLENBQWtCVyxPQUFsQixFQUFyQjtBQUNBLGFBQU8sS0FBS1gsWUFBWjtBQUVBLFVBQU0zRixjQUFjLEdBQUcsS0FBS2hFLE9BQUwsR0FBZWlFLElBQWYsQ0FBb0IsOEJBQXBCLENBQXZCO0FBQUEsVUFDQ3NHLGVBQWUsR0FBR3ZHLGNBQWMsR0FBSUEsY0FBRCxDQUF3QnVHLGVBQTNCLEdBQTZDLElBRDlFOztBQUVBLFVBQUlBLGVBQWUsSUFBSUEsZUFBZSxDQUFDQyxNQUFoQixFQUF2QixFQUFpRDtBQUNoREQsUUFBQUEsZUFBZSxDQUFDRSxLQUFoQjtBQUNBLE9BZE8sQ0FlUjs7O0FBQ0EsVUFBTXpELFFBQVEsR0FBRyxLQUFLaEgsT0FBTCxHQUFld0YsaUJBQWYsRUFBakI7O0FBQ0EsVUFBSXdCLFFBQVEsSUFBSUEsUUFBUSxDQUFDMEQsV0FBVCxFQUFoQixFQUF3QztBQUN2QzFELFFBQUFBLFFBQVEsQ0FBQzJELFlBQVQsQ0FBc0IsS0FBdEI7QUFDQTtBQUNELEs7O1dBRURDLGdCLEdBQUEsMEJBQWlCekosTUFBakIsRUFBOEI7QUFDN0IsYUFBT0EsTUFBTSxJQUFJQSxNQUFNLENBQUNJLGFBQVAsRUFBakI7QUFDQSxLOztXQUVEc0osaUIsR0FBQSw2QkFBb0I7QUFDbkJDLE1BQUFBLGNBQWMsQ0FBQ0MsU0FBZixDQUF5QkYsaUJBQXpCLENBQTJDRyxLQUEzQyxDQUFpRCxJQUFqRCxFQURtQixDQUVuQjs7QUFDQSxVQUFJLEtBQUs1RyxLQUFMLENBQVc2RyxTQUFYLENBQXFCQyx5QkFBckIsSUFBa0RDLFlBQVksQ0FBQ3hGLFlBQWIsT0FBZ0N4RixTQUF0RixFQUFpRztBQUNoR2dMLFFBQUFBLFlBQVksQ0FBQ0MsWUFBYixDQUEwQixLQUFLQyxlQUFMLEdBQXVCMUYsWUFBdkIsRUFBMUI7QUFDQTtBQUNELEs7O1dBRUQyRixnQixHQUFBLDRCQUFtQjtBQUFBOztBQUNoQixXQUFLdEwsT0FBTCxHQUFlMEYsUUFBZixDQUF3QixhQUF4QixDQUFELENBQTBEaUQsaUJBQTFELEVBQUQsQ0FDRTFHLElBREYsQ0FDTyxVQUFDc0osUUFBRCxFQUFtQjtBQUN4QixRQUFBLE1BQUksQ0FBQzNDLGVBQUwsR0FBdUIyQyxRQUF2QjtBQUNBLE9BSEYsRUFJRTNILEtBSkYsQ0FJUSxVQUFVNEgsTUFBVixFQUF1QjtBQUM3QjFILFFBQUFBLEdBQUcsQ0FBQ0MsS0FBSixDQUFVLDRDQUFWLEVBQXdEeUgsTUFBeEQ7QUFDQSxPQU5GO0FBT0EsSzs7V0FFREMsZ0IsR0FBQSwwQkFBaUJ6RSxRQUFqQixFQUFnQzFDLFdBQWhDLEVBQWtEO0FBQUE7O0FBQ2pEO0FBQ0EsVUFBTW9ILE9BQU8sR0FBRyxLQUFLdEssV0FBTCxFQUFoQjtBQUFBLFVBQ0NtRyxXQUFXLEdBQUcsS0FBS0MsMkJBQUwsRUFEZjtBQUFBLFVBRUNGLHFCQUFxQixHQUFHLEtBQUt0SCxPQUFMLEdBQWV3RixpQkFBZixDQUFpQyxVQUFqQyxDQUZ6QjtBQUFBLFVBR0NtRyxjQUFjLEdBQUcsS0FBSzNMLE9BQUwsR0FBZTBGLFFBQWYsQ0FBd0IsVUFBeEIsQ0FIbEI7QUFBQSxVQUlDa0csWUFBWSxHQUFHdEUscUJBQXFCLENBQUNHLFdBQXRCLENBQWtDLGFBQWxDLENBSmhCO0FBQUEsVUFLQ29FLFVBQVUsR0FBSSxLQUFLN0wsT0FBTCxHQUFlMEgsV0FBZixFQUFELENBQXNDb0UsU0FMcEQ7O0FBTUEsVUFBSUMsZ0JBQUo7QUFDQUgsTUFBQUEsWUFBWSxDQUFDSSxJQUFiLENBQWtCLE9BQWxCOztBQUNBLFVBQUkxSCxXQUFXLENBQUMySCxnQkFBWixLQUFpQyxJQUFyQyxFQUEyQztBQUMxQyxhQUFLQyxpQkFBTDtBQUNBOztBQUNELFVBQU1DLFNBQVMsR0FBRzVFLFdBQVcsQ0FBQy9CLGlCQUFaLEVBQWxCOztBQUNBLFVBQ0MyRyxTQUFTLElBQ1RBLFNBQVMsQ0FBQ0MsaUJBQVYsRUFEQSxJQUVBLENBQUNSLFlBQVksQ0FBQ3ZLLElBQWIsQ0FBbUI4SyxTQUFTLENBQUN6RyxRQUFWLEVBQUQsQ0FBcUMwRyxpQkFBckMsQ0FBdUR4SCxJQUF2RCxDQUE0RHVILFNBQVMsQ0FBQ3pHLFFBQVYsRUFBNUQsQ0FBbEIsQ0FIRixFQUlFO0FBQ0Q7QUFDSDtBQUNBO0FBRUd5RyxRQUFBQSxTQUFTLENBQUNFLFVBQVYsR0FBdUJDLFlBQXZCO0FBQ0EsT0F4QmdELENBMEJqRDtBQUNBOzs7QUFDQSxXQUFLLElBQUkxSixDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHOEksT0FBTyxDQUFDcEksTUFBNUIsRUFBb0NWLENBQUMsRUFBckMsRUFBeUM7QUFDeENtSixRQUFBQSxnQkFBZ0IsR0FBR0wsT0FBTyxDQUFDOUksQ0FBRCxDQUFQLENBQVcySixjQUFYLEVBQW5COztBQUNBLFlBQUlSLGdCQUFKLEVBQXNCO0FBQ3JCQSxVQUFBQSxnQkFBZ0IsQ0FBQ1MsaUJBQWpCLENBQW1DLElBQW5DO0FBQ0E7QUFDRCxPQWpDZ0QsQ0FtQ2pEOzs7QUFDQSxVQUFNQyx3QkFBd0IsR0FBRyxZQUFZO0FBQzVDLFlBQUksQ0FBRWxGLFdBQUQsQ0FBcUJtRixnQkFBckIsRUFBRCxJQUE0QyxDQUFDcEksV0FBVyxDQUFDcUksZ0JBQTdELEVBQStFO0FBQzlFcEYsVUFBQUEsV0FBVyxDQUFDcUYsa0JBQVosQ0FBK0IsSUFBL0I7QUFDQTtBQUNELE9BSkQ7O0FBS0FyRixNQUFBQSxXQUFXLENBQUM5RCxlQUFaLENBQTRCLG9CQUE1QixFQUFrRGdKLHdCQUFsRCxFQXpDaUQsQ0EyQ2pEO0FBQ0E7O0FBQ0EsVUFBTUksaUJBQWlCLEdBQUc7QUFDekJ2QixRQUFBQSxnQkFBZ0IsRUFBRW1CO0FBRE8sT0FBMUI7QUFHQWxGLE1BQUFBLFdBQVcsQ0FBQ3VGLGdCQUFaLENBQTZCRCxpQkFBN0IsRUFBZ0QsSUFBaEQ7QUFDQSxXQUFLRSxTQUFMLENBQWV0SixlQUFmLENBQStCLFdBQS9CLEVBQTRDLFlBQVk7QUFDdkQ4RCxRQUFBQSxXQUFXLENBQUN5RixtQkFBWixDQUFnQ0gsaUJBQWhDO0FBQ0EsT0FGRCxFQWpEaUQsQ0FxRGpEOztBQUNBLFVBQUloQixVQUFVLEdBQUcsQ0FBakIsRUFBb0I7QUFDbkIsWUFBSW9CLFFBQVEsR0FBRzNJLFdBQVcsSUFBSUEsV0FBVyxDQUFDNEksV0FBMUM7QUFDQSxZQUFNQyx3QkFBd0IsR0FBR3hCLGNBQWMsQ0FBQ2xFLFdBQWYsQ0FBMkIsMEJBQTNCLENBQWpDOztBQUNBLFlBQUkwRix3QkFBSixFQUE4QjtBQUM3QixjQUFNQyxhQUFhLEdBQUdELHdCQUF3QixDQUFDZCxVQUF6QixFQUF0QjtBQUNBLGVBQUtnQixTQUFMLENBQWVDLFVBQWYsQ0FBMEJGLGFBQTFCLEVBQXlDRCx3QkFBekM7QUFDQXhCLFVBQUFBLGNBQWMsQ0FBQzlCLFdBQWYsQ0FBMkIsMEJBQTNCLEVBQXVELElBQXZEO0FBQ0EsU0FKRCxNQUlPLElBQUlvRCxRQUFKLEVBQWM7QUFDcEIsY0FBSUEsUUFBUSxDQUFDbkwsR0FBVCxDQUFhLHdDQUFiLENBQUosRUFBNEQ7QUFDM0QsaUJBQUt1TCxTQUFMLENBQWVDLFVBQWYsQ0FBMEJMLFFBQTFCLEVBQW9DakcsUUFBcEM7QUFDQSxXQUZELE1BRU87QUFDTjtBQUNBO0FBQ0EsZ0JBQU11RyxZQUFZLEdBQUdOLFFBQVEsQ0FBQ3BILE9BQVQsR0FBbUIySCxPQUFuQixDQUEyQixjQUEzQixFQUEyQyxFQUEzQyxDQUFyQixDQUhNLENBRytEOztBQUNyRVAsWUFBQUEsUUFBUSxHQUFHLElBQUtRLGdCQUFMLENBQThCUixRQUFRLENBQUNTLE1BQXZDLEVBQStDLEVBQS9DLEVBQW1EVCxRQUFRLENBQUNTLE1BQVQsQ0FBZ0JDLG9CQUFoQixDQUFxQ0osWUFBckMsQ0FBbkQsQ0FBWDs7QUFDQSxnQkFBTUssb0JBQW9CLEdBQUcsWUFBTTtBQUNsQyxrQkFBSVgsUUFBUSxDQUFDbEwsV0FBVCxHQUF1QnVCLE1BQXZCLEdBQWdDLENBQXBDLEVBQXVDO0FBQ3RDLGdCQUFBLE1BQUksQ0FBQytKLFNBQUwsQ0FBZUMsVUFBZixDQUEwQkwsUUFBMUIsRUFBb0NqRyxRQUFwQzs7QUFDQWlHLGdCQUFBQSxRQUFRLENBQUNZLFdBQVQsQ0FBcUIsUUFBckIsRUFBK0JELG9CQUEvQjtBQUNBO0FBQ0QsYUFMRDs7QUFNQVgsWUFBQUEsUUFBUSxDQUFDbEwsV0FBVCxDQUFxQixDQUFyQjtBQUNBa0wsWUFBQUEsUUFBUSxDQUFDOUMsV0FBVCxDQUFxQixRQUFyQixFQUErQnlELG9CQUEvQjtBQUNBO0FBQ0Q7QUFDRDs7QUFDRCxVQUFJLENBQUUsS0FBSzVOLE9BQUwsR0FBZTBILFdBQWYsRUFBRCxDQUFzQ3VDLGlCQUF2QyxJQUE0RDFDLFdBQVcsQ0FBQzJDLG9CQUFaLEVBQWhFLEVBQW9HO0FBQ25HLFlBQU00RCxTQUFTLEdBQUd2RyxXQUFXLENBQUN3RyxXQUFaLEVBQWxCO0FBQ0EsWUFBTUMsY0FBYyxHQUFHekcsV0FBVyxDQUFDMEcsZ0JBQVosRUFBdkI7QUFDQSxZQUFJQyxLQUFLLEdBQUcsQ0FBWjtBQUNBLFlBQU1DLGFBQWEsR0FBRzVHLFdBQVcsQ0FBQzdCLFFBQVosQ0FBcUIsSUFBckIsRUFBMkIrQixXQUEzQixDQUF1QyxhQUF2QyxDQUF0QjtBQUNBLFlBQU0yRyxlQUFlLEdBQUksS0FBS3BPLE9BQUwsR0FBZTBILFdBQWYsRUFBRCxDQUFzQzJHLHFCQUE5RDs7QUFDQSxhQUFLLElBQUlDLFFBQVEsR0FBRyxDQUFwQixFQUF1QkEsUUFBUSxHQUFHUixTQUFTLENBQUN4SyxNQUE1QyxFQUFvRGdMLFFBQVEsRUFBNUQsRUFBZ0U7QUFDL0QsY0FBTWpHLFFBQVEsR0FBR3lGLFNBQVMsQ0FBQ1EsUUFBRCxDQUExQjtBQUNBLGNBQU1DLFlBQVksR0FBR2xHLFFBQVEsQ0FBQ0csY0FBVCxFQUFyQjs7QUFDQSxlQUFLLElBQUlnRyxXQUFXLEdBQUcsQ0FBdkIsRUFBMEJBLFdBQVcsR0FBR0QsWUFBWSxDQUFDakwsTUFBckQsRUFBNkRrTCxXQUFXLElBQUlOLEtBQUssRUFBakYsRUFBcUY7QUFDcEY7QUFDQSxnQkFBSUEsS0FBSyxHQUFHLENBQVIsSUFBY0YsY0FBYyxLQUFLTSxRQUFRLEdBQUcsQ0FBWCxJQUFpQkEsUUFBUSxLQUFLLENBQWIsSUFBa0IsQ0FBQ0YsZUFBbkIsSUFBc0MsQ0FBQ0QsYUFBN0QsQ0FBaEMsRUFBK0c7QUFDOUcsa0JBQU12RyxXQUFXLEdBQUcyRyxZQUFZLENBQUNDLFdBQUQsQ0FBaEM7O0FBQ0Esa0JBQUk1RyxXQUFXLENBQUNwRSxJQUFaLEdBQW1CaUwsbUJBQW5CLEtBQTJDLE1BQS9DLEVBQXVEO0FBQ3REN0csZ0JBQUFBLFdBQVcsQ0FBQzRFLGlCQUFaLENBQThCLElBQTlCO0FBQ0E7QUFDRDtBQUNEO0FBQ0Q7QUFDRDs7QUFFRCxVQUFJLEtBQUtrQyxXQUFMLENBQWlCQyxvQkFBakIsTUFBMkNySyxXQUFXLENBQUNzSyxlQUEzRCxFQUE0RTtBQUMzRSxZQUFNeEssS0FBSyxHQUFHLEtBQUtwRSxPQUFMLEVBQWQ7QUFDQSxZQUFNNk8sYUFBYSxHQUFJekssS0FBSyxDQUFDcUUsU0FBTixFQUFELENBQTJCcUcsVUFBM0IsQ0FBc0NyRyxTQUF0QyxFQUF0Qjs7QUFDQSxZQUFJb0csYUFBSixFQUFtQjtBQUNsQkEsVUFBQUEsYUFBYSxDQUFDRCxlQUFkLENBQThCLEVBQTlCO0FBQ0E7QUFDRDtBQUNELEs7O1dBRURHLHlCLEdBQUEsbUNBQTBCeEgsV0FBMUIsRUFBNEM7QUFDM0MsVUFBSXlILHNCQUFKO0FBQ0EsVUFBTUMsUUFBUSxHQUFHMUgsV0FBVyxDQUFDMkgsY0FBWixNQUFnQzNILFdBQVcsQ0FBQzJILGNBQVosR0FBNkJDLFVBQTdCLEVBQWpEOztBQUNBLFVBQUlGLFFBQVEsSUFBSUEsUUFBUSxDQUFDM0wsTUFBekIsRUFBaUM7QUFDaEMwTCxRQUFBQSxzQkFBc0IsR0FBR0MsUUFBUSxDQUFDdk0sSUFBVCxDQUFjLFVBQVUwTSxPQUFWLEVBQXdCO0FBQzlEO0FBQ0E7QUFDQSxpQkFBTyxDQUFDQSxPQUFPLENBQUN0TixHQUFSLENBQVkscUJBQVosQ0FBRCxJQUF1Q3NOLE9BQU8sQ0FBQzFHLFVBQVIsRUFBdkMsSUFBK0QwRyxPQUFPLENBQUNDLFVBQVIsRUFBdEU7QUFDQSxTQUp3QixDQUF6QjtBQUtBOztBQUNELGFBQU9MLHNCQUFQO0FBQ0EsSzs7V0FFRE0sMEMsR0FBQSxvREFBMkNmLFlBQTNDLEVBQThEO0FBQzdELFVBQUlBLFlBQUosRUFBa0I7QUFDakIsYUFBSyxJQUFJbEYsVUFBVSxHQUFHLENBQXRCLEVBQXlCQSxVQUFVLEdBQUdrRixZQUFZLENBQUNqTCxNQUFuRCxFQUEyRCtGLFVBQVUsRUFBckUsRUFBeUU7QUFDeEUsY0FBTWtHLE9BQU8sR0FBR2hCLFlBQVksQ0FBQ2xGLFVBQUQsQ0FBWixDQUF5Qm1HLFNBQXpCLEVBQWhCOztBQUVBLGNBQUlELE9BQUosRUFBYTtBQUNaLGlCQUFLLElBQUlFLEtBQUssR0FBRyxDQUFqQixFQUFvQkEsS0FBSyxHQUFHRixPQUFPLENBQUNqTSxNQUFwQyxFQUE0Q21NLEtBQUssRUFBakQsRUFBcUQ7QUFDcEQsa0JBQUlDLGVBQWUsU0FBbkI7O0FBRUEsa0JBQUlILE9BQU8sQ0FBQ0UsS0FBRCxDQUFQLENBQWUzTixHQUFmLENBQW1CLHlCQUFuQixDQUFKLEVBQW1EO0FBQ2xENE4sZ0JBQUFBLGVBQWUsR0FBR0gsT0FBTyxDQUFDRSxLQUFELENBQVAsQ0FBZUUsaUJBQWYsRUFBbEI7QUFDQSxlQUZELE1BRU8sSUFDTkosT0FBTyxDQUFDRSxLQUFELENBQVAsQ0FBZUcsVUFBZixJQUNBTCxPQUFPLENBQUNFLEtBQUQsQ0FBUCxDQUFlRyxVQUFmLEVBREEsSUFFQUwsT0FBTyxDQUFDRSxLQUFELENBQVAsQ0FBZUcsVUFBZixHQUE0QjlOLEdBQTVCLENBQWdDLHlCQUFoQyxDQUhNLEVBSUw7QUFDRDROLGdCQUFBQSxlQUFlLEdBQUdILE9BQU8sQ0FBQ0UsS0FBRCxDQUFQLENBQWVHLFVBQWYsR0FBNEJELGlCQUE1QixFQUFsQjtBQUNBOztBQUVELGtCQUFJRCxlQUFKLEVBQXFCO0FBQ3BCLHFCQUFLLElBQUlHLGFBQWEsR0FBRyxDQUF6QixFQUE0QkEsYUFBYSxHQUFHSCxlQUFlLENBQUNwTSxNQUE1RCxFQUFvRXVNLGFBQWEsRUFBakYsRUFBcUY7QUFDcEYsc0JBQU1DLGFBQWEsR0FBR0osZUFBZSxDQUFDRyxhQUFELENBQWYsQ0FBK0JFLGVBQS9CLEVBQXRCOztBQUNBLHNCQUFJRCxhQUFKLEVBQW1CO0FBQ2xCLHlCQUFLLElBQUlFLFdBQVcsR0FBRyxDQUF2QixFQUEwQkEsV0FBVyxHQUFHRixhQUFhLENBQUN4TSxNQUF0RCxFQUE4RDBNLFdBQVcsRUFBekUsRUFBNkU7QUFDNUUsMEJBQU1DLE9BQU8sR0FBR0gsYUFBYSxDQUFDRSxXQUFELENBQWIsQ0FBMkJFLFNBQTNCLEVBQWhCLENBRDRFLENBRzVFO0FBQ0E7O0FBQ0EsMEJBQUk7QUFDSCw0QkFBSUQsT0FBTyxDQUFDLENBQUQsQ0FBUCxDQUFXRSxXQUFYLElBQTBCRixPQUFPLENBQUMsQ0FBRCxDQUFQLENBQVdFLFdBQVgsRUFBMUIsSUFBc0QsQ0FBQ0YsT0FBTyxDQUFDLENBQUQsQ0FBUCxDQUFXRyxRQUFYLEVBQTNELEVBQWtGO0FBQ2pGLGlDQUFPSCxPQUFPLENBQUMsQ0FBRCxDQUFkO0FBQ0E7QUFDRCx1QkFKRCxDQUlFLE9BQU9sTSxLQUFQLEVBQWM7QUFDZkQsd0JBQUFBLEdBQUcsQ0FBQ3VNLEtBQUosQ0FBVSxxREFBcUR0TSxLQUEvRDtBQUNBO0FBQ0Q7QUFDRDtBQUNEO0FBQ0Q7QUFDRDtBQUNEO0FBQ0Q7QUFDRDs7QUFDRCxhQUFPNUQsU0FBUDtBQUNBLEs7O1dBRUQySCxzQixHQUFBLGdDQUF1QnlHLFlBQXZCLEVBQTBDO0FBQ3pDLFVBQU1oSCxXQUFXLEdBQUcsS0FBS0MsMkJBQUwsRUFBcEI7O0FBRUEsVUFBTThJLGVBQWUsR0FBRyxLQUFLaEIsMENBQUwsQ0FBZ0RmLFlBQWhELENBQXhCOztBQUNBLFVBQUlnQyxhQUFKOztBQUNBLFVBQUlELGVBQUosRUFBcUI7QUFDcEJDLFFBQUFBLGFBQWEsR0FBR0QsZUFBZSxDQUFDRSxPQUFoQixDQUF3QkMsY0FBeEIsR0FBeUMsQ0FBekMsQ0FBaEI7QUFDQSxPQUZELE1BRU87QUFDTkYsUUFBQUEsYUFBYSxHQUFJaEosV0FBRCxDQUFxQm1KLHNCQUFyQixNQUFpRCxLQUFLM0IseUJBQUwsQ0FBK0J4SCxXQUEvQixDQUFqRTtBQUNBOztBQUVELFVBQUlnSixhQUFKLEVBQW1CO0FBQ2xCdEksUUFBQUEsVUFBVSxDQUFDLFlBQVk7QUFDdEI7QUFDQXNJLFVBQUFBLGFBQWEsQ0FBQ0ksS0FBZDtBQUNBLFNBSFMsRUFHUCxDQUhPLENBQVY7QUFJQTtBQUNELEs7O1dBRUR2RyxnQyxHQUFBLDBDQUFpQ3BKLE1BQWpDLEVBQThDO0FBQzdDLFVBQU00RyxXQUFXLEdBQUc1RyxNQUFNLENBQUM2RyxZQUFQLENBQW9CLFlBQXBCLENBQXBCO0FBQ0FELE1BQUFBLFdBQVcsQ0FBQzRFLGlCQUFaLENBQThCck0sU0FBOUI7QUFDQSxLOztXQUVEeVEsd0IsR0FBQSxrQ0FBeUI1SixRQUF6QixFQUF3QztBQUN2QyxVQUFJLEtBQUtxRSxlQUFMLEdBQXVCd0YsY0FBdkIsR0FBd0NDLHlCQUF4QyxFQUFKLEVBQXlFO0FBQ3hFO0FBQ0FDLFFBQUFBLE9BQU8sQ0FBQ0MsSUFBUjtBQUNBLE9BSEQsTUFHTztBQUNOQyxRQUFBQSxLQUFLLENBQUNDLHlDQUFOLENBQ0MsWUFBWTtBQUNYSCxVQUFBQSxPQUFPLENBQUNDLElBQVI7QUFDQSxTQUhGLEVBSUNHLFFBQVEsQ0FBQ3BHLFNBSlYsRUFLQy9ELFFBTEQsRUFNQyxJQU5ELEVBT0MsS0FQRCxFQVFDaUssS0FBSyxDQUFDRyxjQUFOLENBQXFCQyxjQVJ0QjtBQVVBO0FBQ0QsSyxDQUVEOzs7V0FDQUMsZSxHQUFBLHlCQUFnQkMsZUFBaEIsRUFBc0NqTixXQUF0QyxFQUF3RDtBQUFBOztBQUN2RCxVQUFNaUQsV0FBVyxHQUFHLEtBQUtDLDJCQUFMLEVBQXBCOztBQUNBLFVBQU1rRSxPQUFPLEdBQUcsS0FBS3RLLFdBQUwsRUFBaEI7O0FBRUEsV0FBS29RLFlBQUwsQ0FBa0JDLHFCQUFsQixHQUp1RCxDQU12RDtBQUNBOzs7QUFDQUYsTUFBQUEsZUFBZSxHQUFHaEssV0FBVyxDQUFDL0IsaUJBQVosRUFBbEI7QUFFQSxVQUFJa00sV0FBa0IsR0FBRyxFQUF6QjtBQUNBbkssTUFBQUEsV0FBVyxDQUFDd0csV0FBWixHQUEwQjRELE9BQTFCLENBQWtDLFVBQVV0SixRQUFWLEVBQXlCO0FBQzFEQSxRQUFBQSxRQUFRLENBQUNHLGNBQVQsR0FBMEJtSixPQUExQixDQUFrQyxVQUFVL0osV0FBVixFQUE0QjtBQUM3RDhKLFVBQUFBLFdBQVcsR0FBR3JNLFdBQVcsQ0FBQ3VNLGFBQVosQ0FBMEJoSyxXQUExQixFQUF1QzhKLFdBQXZDLENBQWQ7QUFDQSxTQUZEO0FBR0EsT0FKRCxFQVh1RCxDQWlCdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQWhHLE1BQUFBLE9BQU8sQ0FBQ2lHLE9BQVIsQ0FBZ0IsVUFBVXhRLE1BQVYsRUFBdUI7QUFDdEMsWUFBTW1HLHFCQUFxQixHQUFHbkcsTUFBTSxDQUFDcUUsaUJBQVAsQ0FBeUIsVUFBekIsQ0FBOUI7QUFDQThCLFFBQUFBLHFCQUFxQixDQUFDdUMsV0FBdEIsQ0FBa0MsMEJBQWxDLEVBQThELEVBQTlEO0FBQ0F2QyxRQUFBQSxxQkFBcUIsQ0FBQ3VDLFdBQXRCLENBQWtDLDJCQUFsQyxFQUErRCxFQUEvRDtBQUVBNkgsUUFBQUEsV0FBVyxHQUFHck0sV0FBVyxDQUFDdU0sYUFBWixDQUEwQnpRLE1BQTFCLEVBQWtDdVEsV0FBbEMsQ0FBZCxDQUxzQyxDQU10QztBQUNBO0FBQ0E7QUFDQTs7QUFDQSxZQUFNRyxnQkFBZ0IsR0FBRzFRLE1BQU0sQ0FBQ0ksYUFBUCxFQUF6Qjs7QUFDQSxZQUFJc1EsZ0JBQUosRUFBc0I7QUFDckIsY0FBSUMsV0FBVyxDQUFDQyx3QkFBWixDQUFxQ0YsZ0JBQWdCLENBQUNuTSxRQUFqQixHQUE0QkMsWUFBNUIsRUFBckMsQ0FBSixFQUFzRjtBQUNyRjtBQUNBa00sWUFBQUEsZ0JBQWdCLENBQUNHLHVCQUFqQixDQUF5QyxFQUF6QztBQUNBO0FBQ0QsU0FoQnFDLENBaUJ0QztBQUVBO0FBQ0E7OztBQUNBLFlBQU1DLDRCQUE0QixHQUFHaE4sSUFBSSxDQUFDQyxLQUFMLENBQ25DaUcsWUFBWSxDQUFDK0csZUFBYixDQUE2QkMsWUFBWSxDQUFDQyxhQUFiLENBQTJCalIsTUFBM0IsRUFBbUMsdUJBQW5DLENBQTdCLENBRG1DLENBQXJDO0FBQUEsWUFHQ2tSLGlCQUFpQixHQUFHbFIsTUFBTSxDQUFDbVIsbUJBQVAsRUFIckI7QUFLQWpOLFFBQUFBLFdBQVcsQ0FBQ2tOLG1CQUFaLENBQWdDakwscUJBQWhDLEVBQXVEMkssNEJBQXZELEVBQXFGSSxpQkFBckY7QUFDQSxPQTNCRDtBQTRCQWhOLE1BQUFBLFdBQVcsQ0FBQ21OLCtCQUFaLENBQTRDLElBQTVDLEVBQWtELFlBQWxELEVBbkR1RCxDQW9EdkQ7O0FBQ0EsVUFBTUMsZ0JBQWdCLEdBQUdsTCxXQUFXLENBQUMySCxjQUFaLEVBQXpCO0FBQ0EsVUFBSXdELGlCQUF3QixHQUFHLEVBQS9CO0FBQ0FBLE1BQUFBLGlCQUFpQixHQUFHck4sV0FBVyxDQUFDdU0sYUFBWixDQUEwQmEsZ0JBQTFCLEVBQTRDQyxpQkFBNUMsQ0FBcEI7QUFDQWhCLE1BQUFBLFdBQVcsR0FBR0EsV0FBVyxDQUFDaUIsTUFBWixDQUFtQkQsaUJBQW5CLENBQWQ7QUFDQXJOLE1BQUFBLFdBQVcsQ0FBQ3VOLHNDQUFaLENBQW1EbEIsV0FBbkQsRUFBZ0UsS0FBSzFSLE9BQUwsRUFBaEU7QUFFQSxVQUFJME4sTUFBSixFQUFpQm1GLGFBQWpCLENBM0R1RCxDQTZEdkQ7QUFDQTs7QUFDQTtBQUNGO0FBQ0E7QUFDQTs7QUFDRSxlQUFTQyxxQkFBVCxDQUErQjNSLE1BQS9CLEVBQTRDNFIsWUFBNUMsRUFBK0Q7QUFDOUQsWUFBTWhILGdCQUFnQixHQUFHNUssTUFBTSxDQUFDb0wsY0FBUCxFQUF6QjtBQUNBLFlBQUl5Ryx3QkFBSixFQUE4QkMsb0JBQTlCOztBQUVBLFlBQUlsSCxnQkFBSixFQUFzQjtBQUNyQjhHLFVBQUFBLGFBQWEsQ0FDWDVRLElBREYsQ0FDTyxZQUFZO0FBQ2pCLGdCQUFJOEosZ0JBQWdCLENBQUNyRyxRQUFqQixDQUEwQixJQUExQixFQUFnQytCLFdBQWhDLENBQTRDLGFBQTVDLENBQUosRUFBZ0U7QUFDL0R1TCxjQUFBQSx3QkFBd0IsR0FBR3RGLE1BQU0sQ0FBQ3dGLFFBQVAsQ0FBZ0JILFlBQVksQ0FBQ2xOLE9BQWIsRUFBaEIsRUFBd0NrTixZQUFZLENBQUNJLFVBQWIsRUFBeEMsRUFBbUUsRUFBbkUsRUFBdUUsRUFBdkUsRUFBMkU7QUFDckdDLGdCQUFBQSxlQUFlLEVBQUUsYUFEb0Y7QUFFckdDLGdCQUFBQSxTQUFTLEVBQUU7QUFGMEYsZUFBM0UsQ0FBM0IsQ0FEK0QsQ0FLL0Q7O0FBQ0FMLGNBQUFBLHdCQUF3QixDQUFDTSxlQUF6QixHQUEyQyxZQUFZO0FBQ3REO0FBQ0EsZUFGRDtBQUdBO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7OztBQUVPTCxjQUFBQSxvQkFBb0IsR0FBR0Qsd0JBQXdCLENBQUNPLE1BQXpCLEVBQXZCO0FBQ0F4SCxjQUFBQSxnQkFBZ0IsQ0FBQ1MsaUJBQWpCLENBQW1DeUcsb0JBQW5DLEVBaEIrRCxDQWtCL0Q7O0FBQ0FBLGNBQUFBLG9CQUFvQixDQUFDTyxPQUFyQixHQUErQjVQLEtBQS9CLENBQXFDLFlBQVk7QUFDaERFLGdCQUFBQSxHQUFHLENBQUMyUCxLQUFKLENBQVUseUNBQVY7QUFDQSxlQUZEO0FBR0E7QUFDRCxXQXpCRixFQTBCRTdQLEtBMUJGLENBMEJRLFVBQVU0SCxNQUFWLEVBQXVCO0FBQzdCMUgsWUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUsMENBQVYsRUFBc0R5SCxNQUF0RDtBQUNBLFdBNUJGO0FBNkJBO0FBQ0QsT0F0R3NELENBd0d2RDs7QUFDQTtBQUNGO0FBQ0E7OztBQUNFLFVBQU1rSSx3QkFBd0IsR0FBRyxVQUFDdlMsTUFBRCxFQUFpQjtBQUNqRCxZQUFNOEwsUUFBUSxHQUFHLE1BQUksQ0FBQ3JDLGdCQUFMLENBQXNCekosTUFBdEIsQ0FBakI7QUFBQSxZQUNDd1Msd0JBQXdCLEdBQUcsWUFBWTtBQUN0Q2IsVUFBQUEscUJBQXFCLENBQUMzUixNQUFELEVBQVM4TCxRQUFULENBQXJCO0FBQ0EsU0FIRjs7QUFLQSxZQUFJLENBQUNBLFFBQUwsRUFBZTtBQUNkbkosVUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUseUNBQXlDNUMsTUFBTSxDQUFDK0gsS0FBUCxFQUFuRDtBQUNBO0FBQ0E7O0FBRUQsWUFBSStELFFBQVEsQ0FBQ2pHLFFBQWIsRUFBdUI7QUFDdEIyTSxVQUFBQSx3QkFBd0I7QUFDeEIsU0FGRCxNQUVPO0FBQ04sY0FBTUMsY0FBYyxHQUFHLFlBQVk7QUFDbEMsZ0JBQUkzRyxRQUFRLENBQUNqRyxRQUFiLEVBQXVCO0FBQ3RCMk0sY0FBQUEsd0JBQXdCO0FBQ3hCMUcsY0FBQUEsUUFBUSxDQUFDNEcsWUFBVCxDQUFzQkQsY0FBdEI7QUFDQTtBQUNELFdBTEQ7O0FBTUEzRyxVQUFBQSxRQUFRLENBQUM2RyxZQUFULENBQXNCRixjQUF0QjtBQUNBO0FBQ0QsT0F0QkQ7O0FBd0JBLFVBQUlyQyxlQUFKLEVBQXFCO0FBQ3BCN0QsUUFBQUEsTUFBTSxHQUFHNkQsZUFBZSxDQUFDN0wsUUFBaEIsRUFBVCxDQURvQixDQUdwQjs7QUFDQW1OLFFBQUFBLGFBQWEsR0FBRyxLQUFLcFIsU0FBTCxDQUFlc1MsZUFBZixDQUErQnhDLGVBQS9CLENBQWhCOztBQUVBLFlBQUlPLFdBQVcsQ0FBQ2tDLDZCQUFaLENBQTBDdEcsTUFBTSxDQUFDL0gsWUFBUCxFQUExQyxDQUFKLEVBQXNFO0FBQ3JFa04sVUFBQUEsYUFBYSxDQUNYNVEsSUFERixDQUNPLFlBQU07QUFDWCxnQkFBSSxNQUFJLENBQUNqQyxPQUFMLEdBQWUwRixRQUFmLENBQXdCLElBQXhCLEVBQThCK0IsV0FBOUIsQ0FBMEMsYUFBMUMsQ0FBSixFQUE4RDtBQUM3RHdNLGNBQUFBLE9BQU8sQ0FBQyxNQUFJLENBQUNqVSxPQUFMLEVBQUQsQ0FBUDtBQUNBO0FBQ0QsV0FMRixFQU1FNEQsS0FORixDQU1RLFVBQVU0SCxNQUFWLEVBQXVCO0FBQzdCMUgsWUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUsNENBQVYsRUFBd0R5SCxNQUF4RDtBQUNBLFdBUkY7QUFTQSxTQWhCbUIsQ0FrQnBCO0FBQ0E7OztBQUNBLFlBQUkrRixlQUFlLENBQUNsRixVQUFoQixHQUE2QjZILE1BQWpDLEVBQXlDO0FBQ3hDLGVBQUtDLGtCQUFMO0FBQ0EsU0FGRCxNQUVPO0FBQ04sY0FBTUMsbUJBQW1CLEdBQUcsWUFBTTtBQUNqQyxZQUFBLE1BQUksQ0FBQ0Qsa0JBQUw7O0FBQ0E1QyxZQUFBQSxlQUFlLENBQUNsRixVQUFoQixHQUE2QmdJLGtCQUE3QixDQUFnREQsbUJBQWhEO0FBQ0EsV0FIRDs7QUFJQTdDLFVBQUFBLGVBQWUsQ0FBQ2xGLFVBQWhCLEdBQTZCaUksa0JBQTdCLENBQWdERixtQkFBaEQ7QUFDQSxTQTVCbUIsQ0E4QnBCOzs7QUFDQSxZQUFNbkgsUUFBUSxHQUFJc0UsZUFBZSxDQUFDbEYsVUFBaEIsSUFBOEJrRixlQUFlLENBQUNsRixVQUFoQixFQUEvQixJQUFnRWtGLGVBQWpGLENBL0JvQixDQWlDcEI7O0FBQ0EsWUFBSSxLQUFLZ0QsY0FBTCxLQUF3QnRILFFBQTVCLEVBQXNDO0FBQ3JDQSxVQUFBQSxRQUFRLENBQUM5QyxXQUFULENBQXFCLFdBQXJCLEVBQWtDLEtBQUsxRixRQUFMLENBQWMrUCxlQUFoRCxFQUFpRSxJQUFqRTtBQUNBLGVBQUtELGNBQUwsR0FBc0J0SCxRQUF0QjtBQUNBOztBQUVEdkIsUUFBQUEsT0FBTyxDQUFDaUcsT0FBUixDQUFnQixVQUFVeFEsTUFBVixFQUF1QjtBQUN0QztBQUNBc1QsVUFBQUEsVUFBVSxDQUFDQyxTQUFYLENBQXFCdlQsTUFBckIsRUFDRWMsSUFERixDQUNPeVIsd0JBRFAsRUFFRTlQLEtBRkYsQ0FFUSxVQUFVNEgsTUFBVixFQUF1QjtBQUM3QjFILFlBQUFBLEdBQUcsQ0FBQ0MsS0FBSixDQUFVLCtDQUFWLEVBQTJEeUgsTUFBM0Q7QUFDQSxXQUpGO0FBS0EsU0FQRDs7QUFTQSxZQUFJLENBQUUsS0FBS3hMLE9BQUwsR0FBZTBILFdBQWYsRUFBRCxDQUFzQ3VDLGlCQUEzQyxFQUE4RDtBQUM3RDtBQUNDMUMsVUFBQUEsV0FBRCxDQUFxQm9OLGdDQUFyQjtBQUNBO0FBQ0Q7QUFDRCxLOztXQUlEQyxXLEdBRkEscUJBRVl0USxXQUZaLEVBRThCO0FBQUE7O0FBQzdCLFVBQU11USxRQUFRLEdBQUcsWUFBTTtBQUN0QjtBQUNBLFlBQU10TixXQUFXLEdBQUcsTUFBSSxDQUFDQywyQkFBTCxFQUFwQjs7QUFDQSxZQUFNc04sZUFBZSxHQUFHLENBQUN2TixXQUFXLENBQUM3QixRQUFaLENBQXFCLElBQXJCLEVBQTJCK0IsV0FBM0IsQ0FBdUMsYUFBdkMsQ0FBekI7O0FBRUEsWUFBSXFOLGVBQUosRUFBcUI7QUFDcEIsY0FBTTlGLHNCQUFzQixHQUFHLE1BQUksQ0FBQ0QseUJBQUwsQ0FBK0J4SCxXQUEvQixDQUEvQjs7QUFDQSxjQUFJeUgsc0JBQUosRUFBNEI7QUFDM0JBLFlBQUFBLHNCQUFzQixDQUFDMkIsS0FBdkI7QUFDQTtBQUNELFNBTEQsTUFLTztBQUNOLGNBQU1vRSxnQkFBcUIsR0FBR0MsSUFBSSxDQUFDL1EsSUFBTCxDQUFVc0QsV0FBVyxDQUFDME4sa0JBQVosRUFBVixDQUE5Qjs7QUFDQSxVQUFBLE1BQUksQ0FBQ25OLHNCQUFMLENBQTRCaU4sZ0JBQWdCLENBQUN2TSxjQUFqQixFQUE1QjtBQUNBO0FBQ0QsT0FkRCxDQUQ2QixDQWdCN0I7OztBQUNBLFVBQU1wRSxLQUFLLEdBQUcsS0FBS3BFLE9BQUwsRUFBZDtBQUNBLFVBQU1zSCxxQkFBcUIsR0FBR2xELEtBQUssQ0FBQ29CLGlCQUFOLENBQXdCLFVBQXhCLENBQTlCO0FBQ0EsVUFBTStMLGVBQWUsR0FBR25OLEtBQUssQ0FBQ29CLGlCQUFOLEVBQXhCLENBbkI2QixDQW9CN0I7O0FBQ0EsVUFBSStMLGVBQUosRUFBcUI7QUFDcEIsWUFBTTJELGFBQWEsR0FBR3BELFdBQVcsQ0FBQ0Msd0JBQVosQ0FBc0NSLGVBQWUsQ0FBQzdMLFFBQWhCLEVBQUQsQ0FBMkNDLFlBQTNDLEVBQXJDLENBQXRCOztBQUNBLFlBQUksQ0FBQ3VQLGFBQUwsRUFBb0I7QUFDbkIsY0FBTUMsYUFBYSxHQUFHOVAsV0FBVyxDQUFDZ0csZUFBWixDQUE0QmpILEtBQTVCLENBQXRCO0FBQ0ErUSxVQUFBQSxhQUFhLENBQUNDLGdCQUFkLEdBQWlDQyxpQkFBakMsQ0FBbUQ7QUFBQSxtQkFBTSxNQUFJLENBQUN6RSx3QkFBTCxDQUE4QlcsZUFBOUIsQ0FBTjtBQUFBLFdBQW5EO0FBQ0E7QUFDRDs7QUFDRCxXQUFLbEcsZUFBTCxHQUNFaUssa0JBREYsR0FFRUMsYUFGRixHQUdFdFQsSUFIRixDQUdPLFlBQU07QUFDWCxZQUFJcUMsV0FBVyxDQUFDa1IsVUFBaEIsRUFBNEI7QUFDM0JYLFVBQUFBLFFBQVE7QUFDUjtBQUNELE9BUEYsRUFRRWpSLEtBUkYsQ0FRUSxVQUFVNlIsS0FBVixFQUFpQjtBQUN2QjNSLFFBQUFBLEdBQUcsQ0FBQ0MsS0FBSixDQUFVLCtCQUFWLEVBQTJDMFIsS0FBM0M7QUFDQSxPQVZGO0FBWUFuTyxNQUFBQSxxQkFBcUIsQ0FBQ3VDLFdBQXRCLENBQWtDLDRCQUFsQyxFQUFnRSxLQUFoRTs7QUFDQSxXQUFLNkwseUNBQUw7QUFDQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ3hWLGlCLEdBQUEsNkJBQW9CO0FBQ25CLFVBQU1xUixlQUFlLEdBQUcsS0FBS3ZSLE9BQUwsR0FBZXdGLGlCQUFmLElBQXFDLEtBQUt4RixPQUFMLEdBQWV3RixpQkFBZixFQUE3RDtBQUNBLFVBQUl6RixpQkFBaUIsR0FBRyxLQUF4Qjs7QUFDQSxVQUFJd1IsZUFBSixFQUFxQjtBQUNwQixZQUFNMkQsYUFBYSxHQUFHcEQsV0FBVyxDQUFDQyx3QkFBWixDQUFxQ1IsZUFBZSxDQUFDN0wsUUFBaEIsR0FBMkJDLFlBQTNCLEVBQXJDLENBQXRCOztBQUNBLFlBQUl1UCxhQUFKLEVBQW1CO0FBQ2xCblYsVUFBQUEsaUJBQWlCLEdBQUcsS0FBS0MsT0FBTCxHQUFlMEYsUUFBZixDQUF3QixJQUF4QixFQUE4QitCLFdBQTlCLENBQTBDLGFBQTFDLENBQXBCO0FBQ0E7QUFDRDs7QUFDRCxhQUFPMUgsaUJBQVA7QUFDQSxLOztXQUVEeUgsMkIsR0FBQSx1Q0FBOEI7QUFDN0IsYUFBTyxLQUFLdkQsSUFBTCxDQUFVLGdCQUFWLENBQVA7QUFDQSxLOztXQUVEMFIsd0IsR0FBQSxvQ0FBMkI7QUFDMUIsVUFBTXBPLFdBQVcsR0FBRyxLQUFLQywyQkFBTCxFQUFwQjs7QUFDQSxVQUFNb08sbUJBQW1CLEdBQUdyTyxXQUFXLENBQUM2SyxhQUFaLEdBQTRCMVAsSUFBNUIsQ0FBaUMsVUFBVW1ULFdBQVYsRUFBNEI7QUFDeEYsZUFBT0EsV0FBVyxDQUFDQyxNQUFaLE9BQXlCLG9CQUFoQztBQUNBLE9BRjJCLENBQTVCO0FBR0EsVUFBTUMsVUFBVSxHQUFHO0FBQ2xCQyxRQUFBQSxLQUFLLEVBQUV6TyxXQUFXLENBQUMvRCxJQUFaLENBQWlCLGlCQUFqQixLQUF1QyxFQUQ1QjtBQUVsQnlTLFFBQUFBLFFBQVEsRUFBRUwsbUJBQW1CLElBQUlBLG1CQUFtQixDQUFDeEYsUUFBcEIsRUFGZjtBQUdsQjhGLFFBQUFBLE1BQU0sRUFBRSxFQUhVO0FBSWxCQyxRQUFBQSxJQUFJLEVBQUU7QUFKWSxPQUFuQjtBQU9BLGFBQU9KLFVBQVA7QUFDQSxLOztXQUVESyxzQixHQUFBLGdDQUF1QmhVLEdBQXZCLEVBQWlDO0FBQ2hDLFVBQU1pVSxTQUFTLEdBQUcsS0FBS3JXLE9BQUwsR0FBZWtKLEtBQWYsS0FBeUIsSUFBekIsR0FBZ0M5RyxHQUFsRDtBQUFBLFVBQ0NrVSxPQUFPLEdBQUksS0FBSzlPLDJCQUFMLEdBQW1DMEgsY0FBbkMsRUFBRCxDQUNSQyxVQURRLEdBRVJ6TSxJQUZRLENBRUgsVUFBVTZULFFBQVYsRUFBeUI7QUFDOUIsZUFBT0EsUUFBUSxDQUFDck4sS0FBVCxPQUFxQm1OLFNBQTVCO0FBQ0EsT0FKUSxDQURYOztBQU1BaFIsTUFBQUEsV0FBVyxDQUFDbVIsZUFBWixDQUE0QkYsT0FBNUI7QUFDQSxLOztXQUVERyxzQixHQUFBLGdDQUF1QnJVLEdBQXZCLEVBQWlDO0FBQ2hDLFVBQU1pVSxTQUFTLEdBQUcsS0FBS3JXLE9BQUwsR0FBZWtKLEtBQWYsS0FBeUIsSUFBekIsR0FBZ0M5RyxHQUFsRDtBQUFBLFVBQ0NrVSxPQUFPLEdBQUksS0FBSzlPLDJCQUFMLEdBQW1Da1AsU0FBbkMsRUFBRCxDQUF3RDlHLFVBQXhELEdBQXFFbE4sSUFBckUsQ0FBMEUsVUFBVTZULFFBQVYsRUFBeUI7QUFDNUcsZUFBT0EsUUFBUSxDQUFDMVUsV0FBVCxHQUF1QjhVLE9BQXZCLE9BQXFDLGNBQXJDLElBQXVESixRQUFRLENBQUNyTixLQUFULE9BQXFCbU4sU0FBbkY7QUFDQSxPQUZTLENBRFg7O0FBSUFoUixNQUFBQSxXQUFXLENBQUNtUixlQUFaLENBQTRCRixPQUE1QjtBQUNBLEs7O1dBRURNLG1CLEdBQUEsNkJBQW9CQyxVQUFwQixFQUFxQztBQUNwQyxVQUFNdFAsV0FBVyxHQUFHLEtBQUtDLDJCQUFMLEVBQXBCO0FBQUEsVUFDQ3NHLFNBQVMsR0FBR3ZHLFdBQVcsQ0FBQ3dHLFdBQVosRUFEYjtBQUFBLFVBRUMrSSxnQkFBZ0IsR0FBR2hKLFNBQVMsQ0FBQ3hLLE1BQVYsR0FBbUIsQ0FGdkM7QUFBQSxVQUdDeVQsUUFBUSxHQUFHRixVQUFVLENBQUM1VixPQUFYLENBQW1CK1YsVUFBbkIsRUFIWjs7QUFJQSxVQUFJQyxVQUFKO0FBQUEsVUFDQ0MscUJBQXFCLEdBQUczUCxXQUFXLENBQUM0UCxjQUFaLENBQTJCLEtBQUtsVCxJQUFMLENBQVVzRCxXQUFXLENBQUMwTixrQkFBWixFQUFWLENBQTNCLENBRHpCOztBQUVBLFVBQUlpQyxxQkFBcUIsS0FBSyxDQUFDLENBQTNCLElBQWdDSixnQkFBZ0IsR0FBRyxDQUF2RCxFQUEwRDtBQUN6RCxZQUFJQyxRQUFRLEtBQUssU0FBakIsRUFBNEI7QUFDM0IsY0FBSUcscUJBQXFCLElBQUlKLGdCQUFnQixHQUFHLENBQWhELEVBQW1EO0FBQ2xERyxZQUFBQSxVQUFVLEdBQUduSixTQUFTLENBQUMsRUFBRW9KLHFCQUFILENBQXRCO0FBQ0E7QUFDRCxTQUpELE1BSU87QUFDTjtBQUNBLGNBQUlBLHFCQUFxQixLQUFLLENBQTlCLEVBQWlDO0FBQ2hDRCxZQUFBQSxVQUFVLEdBQUduSixTQUFTLENBQUMsRUFBRW9KLHFCQUFILENBQXRCO0FBQ0E7QUFDRDs7QUFDRCxZQUFJRCxVQUFKLEVBQWdCO0FBQ2YxUCxVQUFBQSxXQUFXLENBQUNxRixrQkFBWixDQUErQnFLLFVBQS9CO0FBQ0FBLFVBQUFBLFVBQVUsQ0FBQ3RHLEtBQVg7QUFDQTtBQUNEO0FBQ0QsSzs7V0FFRHlHLG9CLEdBQUEsZ0NBQXVCO0FBQ3RCLFVBQU05UCxxQkFBcUIsR0FBRyxLQUFLdEgsT0FBTCxHQUFld0YsaUJBQWYsQ0FBaUMsVUFBakMsQ0FBOUI7QUFDQSxVQUFNNlIsT0FBTyxHQUFHLEtBQUtyWCxPQUFMLEdBQWVrSixLQUFmLEVBQWhCO0FBQ0E1QixNQUFBQSxxQkFBcUIsQ0FBQ3VDLFdBQXRCLENBQWtDLDZCQUFsQyxFQUFpRSxLQUFqRTtBQUNBeU4sTUFBQUEsR0FBRyxDQUFDQyxFQUFKLENBQ0VDLE9BREYsR0FFRUMsaUJBRkYsR0FHRUMsZUFIRixHQUlFQyxPQUpGLEdBS0VoRyxPQUxGLENBS1UsVUFBVWlHLFFBQVYsRUFBeUI7QUFDakMsWUFBSUEsUUFBUSxDQUFDQyxVQUFULElBQXVCRCxRQUFRLENBQUNFLElBQVQsS0FBa0IsT0FBekMsSUFBb0RGLFFBQVEsQ0FBQ0csTUFBVCxDQUFnQkMsT0FBaEIsQ0FBd0JYLE9BQXhCLElBQW1DLENBQUMsQ0FBNUYsRUFBK0Y7QUFDOUYvUCxVQUFBQSxxQkFBcUIsQ0FBQ3VDLFdBQXRCLENBQWtDLDZCQUFsQyxFQUFpRSxJQUFqRTtBQUNBO0FBQ0QsT0FURjtBQVVBLEs7O1dBRURsRixtQixHQUFBLDZCQUFvQmQsR0FBcEIsRUFBK0JvVSxJQUEvQixFQUEyQztBQUMxQyxVQUFJcFUsR0FBSixFQUFTO0FBQ1JDLFFBQUFBLEdBQUcsQ0FBQ0MsS0FBSixDQUFVRixHQUFWO0FBQ0E7O0FBQ0QsVUFBSSxDQUFFLEtBQUt3SCxlQUFMLEdBQXVCNk0sZ0JBQXZCLEVBQUQsQ0FBbURDLGNBQW5ELEdBQW9FclcsR0FBcEUsQ0FBd0UsbUJBQXhFLENBQUwsRUFBbUc7QUFDbEcsWUFBTWtDLGNBQWMsR0FBRyxLQUFLaEUsT0FBTCxHQUFlaUUsSUFBZixDQUFvQiw4QkFBcEIsQ0FBdkI7QUFBQSxZQUNDc0csZUFBZSxHQUFHdkcsY0FBYyxDQUFDdUcsZUFEbEM7QUFBQSxZQUVDNk4sWUFBWSxHQUFHN04sZUFBZSxDQUFDOEIsVUFBaEIsQ0FBMkIsT0FBM0IsQ0FGaEI7O0FBSUEsWUFBSStMLFlBQVksQ0FBQ0MsU0FBYixLQUEyQixDQUEzQixJQUFnQyxDQUFDOU4sZUFBZSxDQUFDQyxNQUFoQixFQUFyQyxFQUErRDtBQUM5RHhHLFVBQUFBLGNBQWMsQ0FBQ3NVLFVBQWYsQ0FBMEIsSUFBMUIsRUFEOEQsQ0FFOUQ7O0FBQ0FyUSxVQUFBQSxVQUFVLENBQUMsWUFBWTtBQUN0QnNDLFlBQUFBLGVBQWUsQ0FBQ2dPLE1BQWhCLENBQXVCdlUsY0FBdkI7QUFDQSxXQUZTLEVBRVAsQ0FGTyxDQUFWO0FBR0E7QUFDRDs7QUFDRCxhQUFPaVUsSUFBUDtBQUNBLEs7O1dBRURPLGEsR0FBQSx1QkFBY3hSLFFBQWQsRUFBNkI7QUFDNUIsVUFBTTBHLE1BQU0sR0FBRyxLQUFLMU4sT0FBTCxHQUFlMEYsUUFBZixDQUF3QixJQUF4QixDQUFmO0FBQ0ErUyxNQUFBQSxVQUFVLENBQUNDLElBQVgsQ0FBZ0JoTCxNQUFoQjtBQUNBLGFBQU8sS0FBS2pKLFFBQUwsQ0FBY2tVLFlBQWQsQ0FBMkIzTixLQUEzQixDQUFpQyxLQUFLdkcsUUFBdEMsRUFBZ0QsQ0FBQ3VDLFFBQUQsQ0FBaEQsRUFBNEQ0UixPQUE1RCxDQUFvRSxZQUFZO0FBQ3RGSCxRQUFBQSxVQUFVLENBQUNJLE1BQVgsQ0FBa0JuTCxNQUFsQjtBQUNBLE9BRk0sQ0FBUDtBQUdBLEs7O1dBRURvTCxhLEdBQUEsdUJBQWM5UixRQUFkLEVBQTZCO0FBQUE7O0FBQzVCLFVBQU0wRyxNQUFNLEdBQUcsS0FBSzFOLE9BQUwsR0FBZTBGLFFBQWYsQ0FBd0IsSUFBeEIsQ0FBZjtBQUFBLFVBQ0NxVCxvQkFBMkIsR0FBRyxFQUQvQixDQUQ0QixDQUc1Qjs7QUFDQSxVQUFJQywwQkFBMEIsR0FBRyxLQUFqQztBQUNBUCxNQUFBQSxVQUFVLENBQUNDLElBQVgsQ0FBZ0JoTCxNQUFoQjs7QUFDQSxXQUFLdE0sV0FBTCxHQUFtQnVRLE9BQW5CLENBQTJCLFVBQUN4USxNQUFELEVBQWlCO0FBQzNDLFlBQU04TCxRQUFRLEdBQUcsTUFBSSxDQUFDckMsZ0JBQUwsQ0FBc0J6SixNQUF0QixDQUFqQjs7QUFDQSxZQUFNbUQsV0FBZ0IsR0FBRztBQUN4QjJVLFVBQUFBLFlBQVksRUFBRTlYLE1BQU0sQ0FBQ3FDLElBQVAsQ0FBWSxjQUFaLENBRFU7QUFFeEIwVixVQUFBQSxXQUFXLEVBQUUvWCxNQUFNLENBQUNvTCxjQUFQLEVBRlc7QUFHeEI0TSxVQUFBQSxXQUFXLEVBQUVoWSxNQUFNLENBQUNxQyxJQUFQLENBQVksYUFBWixNQUErQjtBQUhwQixTQUF6QjtBQUtBLFlBQU00VixlQUFlLEdBQ3BCOVUsV0FBVyxDQUFDNFUsV0FBWixJQUNBNVUsV0FBVyxDQUFDNFUsV0FBWixDQUF3QjFULGlCQUF4QixFQURBLElBRUFnQixNQUFNLENBQUNoRSxJQUFQLENBQVk4QixXQUFXLENBQUM0VSxXQUFaLENBQXdCMVQsaUJBQXhCLEdBQTRDMUMsU0FBNUMsRUFBWixFQUFxRVEsTUFBckUsR0FBOEUsQ0FIL0U7O0FBSUEsWUFBSThWLGVBQUosRUFBcUI7QUFDcEI7QUFDQTtBQUNBOVUsVUFBQUEsV0FBVyxDQUFDK1UsZ0JBQVosR0FBK0IsSUFBL0I7QUFDQUwsVUFBQUEsMEJBQTBCLEdBQUcsSUFBN0I7QUFDQUQsVUFBQUEsb0JBQW9CLENBQUMvTSxJQUFyQixDQUNDLE1BQUksQ0FBQ3ZILFFBQUwsQ0FBYzZVLGNBQWQsQ0FBNkJyTSxRQUE3QixFQUF1QzNJLFdBQXZDLEVBQW9EckMsSUFBcEQsQ0FBeUQsWUFBWTtBQUNwRSxtQkFBT2dMLFFBQVA7QUFDQSxXQUZELENBREQ7QUFLQTtBQUNELE9BdEJEOztBQXVCQSxhQUFPc00sT0FBTyxDQUFDQyxHQUFSLENBQVlULG9CQUFaLEVBQ0w5VyxJQURLLENBQ0EsVUFBQ3dYLFNBQUQsRUFBc0I7QUFDM0IsWUFBTW5WLFdBQVcsR0FBRztBQUNuQjBVLFVBQUFBLDBCQUEwQixFQUFFQSwwQkFEVDtBQUVuQlUsVUFBQUEsUUFBUSxFQUFFRDtBQUZTLFNBQXBCO0FBSUEsZUFBTyxNQUFJLENBQUNoVixRQUFMLENBQWNrVixZQUFkLENBQTJCM1MsUUFBM0IsRUFBcUMxQyxXQUFyQyxFQUFrRFYsS0FBbEQsQ0FBd0Q7QUFBQSxpQkFBTSxNQUFJLENBQUNlLG1CQUFYO0FBQUEsU0FBeEQsQ0FBUDtBQUNBLE9BUEssRUFRTGlVLE9BUkssQ0FRRyxZQUFZO0FBQ3BCLFlBQUlILFVBQVUsQ0FBQ21CLFFBQVgsQ0FBb0JsTSxNQUFwQixDQUFKLEVBQWlDO0FBQ2hDK0ssVUFBQUEsVUFBVSxDQUFDSSxNQUFYLENBQWtCbkwsTUFBbEI7QUFDQTtBQUNELE9BWkssQ0FBUDtBQWFBLEs7O1dBRURtTSxvQixHQUFBLGdDQUF1QjtBQUN0QkMsTUFBQUEsZ0JBQWdCLENBQUMsS0FBSzlaLE9BQUwsRUFBRCxDQUFoQjtBQUNBLEs7O1dBRUQrWiw2QixHQUFBLHVDQUE4QkMsS0FBOUIsRUFBMEM7QUFDekNDLE1BQUFBLGVBQWUsQ0FBQ0QsS0FBRCxFQUFRLEtBQUtoYSxPQUFMLEVBQVIsQ0FBZjtBQUNBLEs7O1dBRURrYSxlLEdBQUEseUJBQWdCbFQsUUFBaEIsRUFBK0IxQyxXQUEvQixFQUFpRDtBQUNoREEsTUFBQUEsV0FBVyxDQUFDNlYsWUFBWixHQUEyQixLQUFLbmEsT0FBTCxHQUFlaUUsSUFBZixDQUFvQkssV0FBVyxDQUFDNlYsWUFBaEMsQ0FBM0IsQ0FEZ0QsQ0FDMEI7O0FBQzFFLGFBQU8sS0FBSzFWLFFBQUwsQ0FBYzJWLGNBQWQsQ0FBNkJwVCxRQUE3QixFQUF1QzFDLFdBQXZDLENBQVA7QUFDQSxLOztXQUVEK1YsYyxHQUFBLHdCQUFlclQsUUFBZixFQUE4QjtBQUFBOztBQUM3QixhQUFPLEtBQUt2QyxRQUFMLENBQWM2VixhQUFkLENBQTRCdFQsUUFBNUIsRUFBc0NwRCxLQUF0QyxDQUE0QztBQUFBLGVBQU0sTUFBSSxDQUFDZSxtQkFBTCxFQUFOO0FBQUEsT0FBNUMsQ0FBUDtBQUNBLEs7O1dBRUQ0VixnQyxHQUFBLDBDQUFpQ1AsS0FBakMsRUFBK0M7QUFBQTs7QUFDOUMsVUFBTVEsSUFBSSxHQUFHLEtBQUt4YSxPQUFMLEVBQWI7QUFBQSxVQUNDeWEsTUFBTSxHQUFHVCxLQUFLLENBQUM5WSxTQUFOLEVBRFY7QUFBQSxVQUVDd1osWUFBWSxHQUFHLDhFQUZoQjs7QUFJQSxVQUFJLEtBQUtDLDJCQUFULEVBQXNDO0FBQ3JDLGFBQUtBLDJCQUFMLENBQWlDcEMsTUFBakMsQ0FBd0NrQyxNQUF4QyxFQUFnRCxLQUFoRDtBQUNBLE9BRkQsTUFFTztBQUNOLFlBQU1HLGNBQWMsR0FBRyxJQUFJQyxTQUFKLENBQWMsRUFBZCxDQUF2QjtBQUFBLFlBQ0NDLG9CQUFvQixHQUFHO0FBQ3RCQyxVQUFBQSxlQUFlLEVBQUU7QUFDaEIsb0JBQVFILGNBQWMsQ0FBQ2pOLG9CQUFmLENBQW9DLEdBQXBDO0FBRFEsV0FESztBQUl0QnFOLFVBQUFBLE1BQU0sRUFBRTtBQUNQLG9CQUFRSjtBQUREO0FBSmMsU0FEeEI7QUFTQSxZQUFNSyxlQUFlLEdBQUdDLG9CQUFvQixDQUFDQyxZQUFyQixDQUFrQ1QsWUFBbEMsRUFBZ0QsVUFBaEQsQ0FBeEI7QUFDQW5CLFFBQUFBLE9BQU8sQ0FBQzZCLE9BQVIsQ0FBZ0JDLGVBQWUsQ0FBQ0MsT0FBaEIsQ0FBd0JMLGVBQXhCLEVBQXlDO0FBQUVNLFVBQUFBLElBQUksRUFBRWI7QUFBUixTQUF6QyxFQUFpRUksb0JBQWpFLENBQWhCLEVBQ0U3WSxJQURGLENBQ08sVUFBQ3VaLFFBQUQsRUFBYztBQUNuQixpQkFBT0MsUUFBUSxDQUFDQyxJQUFULENBQWM7QUFBRUMsWUFBQUEsVUFBVSxFQUFFSCxRQUFkO0FBQXdCSSxZQUFBQSxVQUFVLEVBQUU7QUFBcEMsV0FBZCxDQUFQO0FBQ0EsU0FIRixFQUlFM1osSUFKRixDQUlPLFVBQUM0WixPQUFELEVBQWtCO0FBQ3ZCckIsVUFBQUEsSUFBSSxDQUFDc0IsWUFBTCxDQUFrQkQsT0FBbEI7QUFDQUEsVUFBQUEsT0FBTyxDQUFDRSxRQUFSLENBQWlCdkIsSUFBSSxDQUFDOVUsUUFBTCxDQUFjLGFBQWQsQ0FBakIsRUFBK0MsTUFBL0M7QUFDQW1XLFVBQUFBLE9BQU8sQ0FBQ0csWUFBUixDQUFxQixRQUFyQjtBQUNBLFVBQUEsT0FBSSxDQUFDckIsMkJBQUwsR0FBbUNrQixPQUFuQztBQUNBQSxVQUFBQSxPQUFPLENBQUNJLGVBQVIsQ0FBd0IsWUFBTTtBQUM3QjtBQUNBO0FBQ0EsZ0JBQU1DLE9BQVksR0FBRyxPQUFJLENBQUNsYyxPQUFMLEdBQWV3RixpQkFBZixFQUFyQjtBQUFBLGdCQUNDMlcsY0FBYyxHQUFHRCxPQUFPLENBQUNwWixTQUFSLEdBQW9Cc1osY0FEdEM7O0FBRUEsZ0JBQU1DLCtCQUEyQyxHQUFJUixPQUFPLENBQUNqTSxVQUFSLEVBQUQsQ0FBK0NsTixJQUEvQyxDQUNuRCxVQUFDNFosT0FBRDtBQUFBLHFCQUFhQSxPQUFPLENBQUM5WSxJQUFSLENBQWEsZ0JBQWIsTUFBbUMsaUNBQWhEO0FBQUEsYUFEbUQsQ0FBcEQ7QUFHQSxnQkFBTStZLGVBQXFCLEdBQUdKLGNBQWMsR0FDeENFLCtCQUErQixDQUFDRyxRQUFoQyxHQUEyQzlaLElBQTNDLENBQWdELFVBQUM0WixPQUFEO0FBQUEscUJBQWFBLE9BQU8sQ0FBQ3hHLE1BQVIsT0FBcUIsZUFBbEM7QUFBQSxhQUFoRCxDQUR3QyxHQUV4Q3VHLCtCQUErQixDQUFDRyxRQUFoQyxHQUEyQzlaLElBQTNDLENBQWdELFVBQUM0WixPQUFEO0FBQUEscUJBQWFBLE9BQU8sQ0FBQ3hHLE1BQVIsT0FBcUIsZ0JBQWxDO0FBQUEsYUFBaEQsQ0FGSjtBQUdBeUcsWUFBQUEsZUFBZSxDQUFDNUwsS0FBaEI7QUFDQSxXQVpEO0FBYUFrTCxVQUFBQSxPQUFPLENBQUN0RCxNQUFSLENBQWVrQyxNQUFmLEVBbEJ1QixDQW1CdkI7O0FBQ0FELFVBQUFBLElBQUksQ0FBQy9XLGVBQUwsQ0FBcUIsWUFBckIsRUFBbUMsWUFBTTtBQUN4QyxtQkFBTyxPQUFJLENBQUNrWCwyQkFBWjtBQUNBLFdBRkQ7QUFHQSxTQTNCRixFQTRCRS9XLEtBNUJGLENBNEJRLFVBQVU2UixLQUFWLEVBQWlCO0FBQ3ZCM1IsVUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUsNENBQVYsRUFBd0QwUixLQUF4RDtBQUNBLFNBOUJGO0FBK0JBO0FBQ0QsSzs7V0FFRGdILHNDLEdBQUEsZ0RBQXVDekMsS0FBdkMsRUFBcUQ7QUFDcEQsVUFBTWtDLE9BQVksR0FBRyxLQUFLbGMsT0FBTCxHQUFld0YsaUJBQWYsRUFBckI7QUFBQSxVQUNDa1gsZUFBZSxHQUFHMUMsS0FBSyxDQUFDblMsWUFBTixDQUFtQixNQUFuQixFQUEyQkosV0FBM0IsQ0FBdUMsS0FBdkMsQ0FEbkI7QUFBQSxVQUVDMFUsY0FBYyxHQUFHRCxPQUFPLENBQUNwWixTQUFSLEdBQW9Cc1osY0FGdEMsQ0FEb0QsQ0FJcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxVQUFLRCxjQUFjLElBQUlPLGVBQWUsS0FBSyxlQUF2QyxJQUE0RCxDQUFDUCxjQUFELElBQW1CTyxlQUFlLEtBQUssZ0JBQXZHLEVBQTBIO0FBQ3pILGFBQUtqWSxRQUFMLENBQWNrWSxpQkFBZCxDQUFnQ1QsT0FBaEM7QUFDQTs7QUFDQ2xDLE1BQUFBLEtBQUssQ0FBQzlZLFNBQU4sRUFBRCxDQUErQnVILFNBQS9CLEVBQUQsQ0FBd0RnQyxLQUF4RDtBQUNBLEs7O1dBRUQwSixrQixHQUFBLDhCQUFxQjtBQUNwQixVQUFNNU0sV0FBVyxHQUFHLEtBQUtDLDJCQUFMLEVBQXBCOztBQUNBLFVBQUluQyxXQUFXLENBQUN1WCxzQkFBWixDQUFtQ3JWLFdBQVcsQ0FBQy9ELElBQVosQ0FBaUIsaUJBQWpCLENBQW5DLENBQUosRUFBNkU7QUFDNUU2QixRQUFBQSxXQUFXLENBQUN3WCx3QkFBWixDQUFxQ3RWLFdBQXJDO0FBQ0E7QUFDRCxLOztXQUVEdVYsc0IsR0FBQSxnQ0FBdUJDLGNBQXZCLEVBQTRDQyxXQUE1QyxFQUE4RHRSLE9BQTlELEVBQTRFO0FBQzNFLFVBQU11UixpQkFBaUIsR0FBRyxFQUExQjs7QUFDQSxXQUFLLElBQUlYLE9BQU8sR0FBRyxDQUFuQixFQUFzQkEsT0FBTyxHQUFHUyxjQUFjLENBQUN6WixNQUEvQyxFQUF1RGdaLE9BQU8sRUFBOUQsRUFBa0U7QUFDakUsWUFBSS9GLFFBQVEsR0FBR3dHLGNBQWMsQ0FBQ1QsT0FBRCxDQUFkLENBQXdCMU0sVUFBeEIsWUFBOEN1QixRQUE5QyxJQUEwRDRMLGNBQWMsQ0FBQ1QsT0FBRCxDQUFkLENBQXdCMU0sVUFBeEIsRUFBekU7O0FBQ0EsWUFBSTJHLFFBQVEsSUFBSUEsUUFBUSxDQUFDelUsR0FBckIsSUFBNEJ5VSxRQUFRLENBQUN6VSxHQUFULENBQWEsa0NBQWIsQ0FBaEMsRUFBa0Y7QUFDakZ5VSxVQUFBQSxRQUFRLEdBQUdBLFFBQVEsQ0FBQzJHLGNBQVQsWUFBbUMvTCxRQUFuQyxJQUErQ29GLFFBQVEsQ0FBQzJHLGNBQVQsRUFBMUQ7O0FBQ0EsY0FBSTNHLFFBQVEsSUFBSUEsUUFBUSxDQUFDalQsTUFBVCxHQUFrQixDQUFsQyxFQUFxQztBQUNwQ2lULFlBQUFBLFFBQVEsR0FBR0EsUUFBUSxDQUFDLENBQUQsQ0FBbkI7QUFDQTtBQUNEOztBQUNELFlBQUlBLFFBQVEsSUFBSUEsUUFBUSxDQUFDelUsR0FBckIsSUFBNEJ5VSxRQUFRLENBQUN6VSxHQUFULENBQWEsd0JBQWIsQ0FBaEMsRUFBd0U7QUFDdkV5VSxVQUFBQSxRQUFRLEdBQUdBLFFBQVEsQ0FBQzNHLFVBQVQsWUFBK0J1QixRQUEvQixJQUEyQ29GLFFBQVEsQ0FBQzNHLFVBQVQsRUFBdEQ7O0FBQ0EsY0FBSTJHLFFBQVEsSUFBSUEsUUFBUSxDQUFDalQsTUFBVCxHQUFrQixDQUFsQyxFQUFxQztBQUNwQ2lULFlBQUFBLFFBQVEsR0FBR0EsUUFBUSxDQUFDLENBQUQsQ0FBbkI7QUFDQTtBQUNEOztBQUNELFlBQUlBLFFBQVEsSUFBSUEsUUFBUSxDQUFDelUsR0FBckIsSUFBNEJ5VSxRQUFRLENBQUN6VSxHQUFULENBQWEsa0JBQWIsQ0FBaEMsRUFBa0U7QUFDakU0SixVQUFBQSxPQUFPLENBQUNNLElBQVIsQ0FBYXVLLFFBQWI7QUFDQTBHLFVBQUFBLGlCQUFpQixDQUFDalIsSUFBbEIsQ0FBdUI7QUFDdEIscUJBQVN1SyxRQURhO0FBRXRCLHlCQUFhQSxRQUFRLENBQUMzVSxPQUFULEdBQW1CRSxHQUFuQixDQUF1QixnQ0FBdkI7QUFGUyxXQUF2QjtBQUlBO0FBQ0Q7O0FBQ0QsVUFDQ21iLGlCQUFpQixDQUFDM1osTUFBbEIsS0FBNkIsQ0FBN0IsSUFDQXlaLGNBQWMsQ0FBQ3paLE1BQWYsS0FBMEIsQ0FEMUIsSUFFQTJaLGlCQUFpQixDQUFDLENBQUQsQ0FBakIsQ0FBcUJFLFNBRnJCLElBR0EsQ0FBQ0gsV0FBVyxDQUFDSSxhQUFaLENBQTBCLHlDQUExQixDQUpGLEVBS0U7QUFDRDtBQUNBSixRQUFBQSxXQUFXLENBQUNLLGFBQVosQ0FBMEIseUNBQTFCO0FBQ0EsT0FSRCxNQVFPO0FBQ04sWUFBSUosaUJBQWlCLElBQUksQ0FBQ0QsV0FBVyxDQUFDSSxhQUFaLENBQTBCLHlDQUExQixDQUExQixFQUFnRztBQUMvRkgsVUFBQUEsaUJBQWlCLENBQUN0TCxPQUFsQixDQUEwQixVQUFVeFEsTUFBVixFQUFrRDtBQUMzRSxnQkFBSUEsTUFBTSxDQUFDZ2MsU0FBWCxFQUFzQjtBQUNyQjtBQUNBaGMsY0FBQUEsTUFBTSxDQUFDbWMsS0FBUCxDQUFhMWIsT0FBYixHQUF1QjJiLFdBQXZCLENBQW1DLElBQW5DO0FBQ0E7QUFDRCxXQUxEO0FBTUE7QUFDRDtBQUNELEs7O1dBRURDLGtCLEdBQUEsOEJBQXFCO0FBQ3BCLFVBQU1qVyxXQUFXLEdBQUcsS0FBS0MsMkJBQUwsRUFBcEI7O0FBQ0EsVUFBSStHLFlBQW1CLEdBQUcsRUFBMUI7QUFDQWhILE1BQUFBLFdBQVcsQ0FBQ3dHLFdBQVosR0FBMEI0RCxPQUExQixDQUFrQyxVQUFVdEosUUFBVixFQUF5QjtBQUMxRGtHLFFBQUFBLFlBQVksR0FBR0EsWUFBWSxDQUFDb0UsTUFBYixDQUFvQnRLLFFBQVEsQ0FBQ0csY0FBVCxFQUFwQixDQUFmO0FBQ0EsT0FGRDtBQUdBLGFBQU8rRixZQUFQO0FBQ0EsSzs7V0FFRGtQLGEsR0FBQSx5QkFBZ0I7QUFDZixVQUFJbE8sT0FBYyxHQUFHLEVBQXJCOztBQUNBLFdBQUtpTyxrQkFBTCxHQUEwQjdMLE9BQTFCLENBQWtDLFVBQVUvSixXQUFWLEVBQTRCO0FBQzdEMkgsUUFBQUEsT0FBTyxHQUFHQSxPQUFPLENBQUNvRCxNQUFSLENBQWUvSyxXQUFXLENBQUM0SCxTQUFaLEVBQWYsQ0FBVjtBQUNBLE9BRkQ7O0FBR0EsYUFBT0QsT0FBUDtBQUNBLEs7O1dBRURuTyxXLEdBQUEsdUJBQWM7QUFDYixVQUFNbU4sWUFBWSxHQUFHLEtBQUtpUCxrQkFBTCxFQUFyQjs7QUFDQSxVQUFNOVIsT0FBYyxHQUFHLEVBQXZCOztBQUNBLFdBQUssSUFBSXJDLFVBQVUsR0FBRyxDQUF0QixFQUF5QkEsVUFBVSxHQUFHa0YsWUFBWSxDQUFDakwsTUFBbkQsRUFBMkQrRixVQUFVLEVBQXJFLEVBQXlFO0FBQ3hFLGFBQUt5VCxzQkFBTCxDQUE0QnZPLFlBQVksQ0FBQ2xGLFVBQUQsQ0FBWixDQUF5Qm1HLFNBQXpCLEVBQTVCLEVBQWtFakIsWUFBWSxDQUFDbEYsVUFBRCxDQUE5RSxFQUE0RnFDLE9BQTVGOztBQUNBLGFBQUtvUixzQkFBTCxDQUE0QnZPLFlBQVksQ0FBQ2xGLFVBQUQsQ0FBWixDQUF5QnFVLGFBQXpCLEVBQTVCLEVBQXNFblAsWUFBWSxDQUFDbEYsVUFBRCxDQUFsRixFQUFnR3FDLE9BQWhHO0FBQ0E7O0FBQ0QsYUFBT0EsT0FBUDtBQUNBLEs7O1dBRURRLGlCLEdBQUEsNkJBQW9CO0FBQ25CLFdBQUt1UixhQUFMLEdBQXFCOUwsT0FBckIsQ0FBNkIsVUFBVWdNLE1BQVYsRUFBdUI7QUFDbkQsWUFBTUMsUUFBUSxHQUFHRCxNQUFNLENBQUMvTixVQUFQLFlBQTZCdUIsUUFBN0IsSUFBeUN3TSxNQUFNLENBQUMvTixVQUFQLEVBQTFEOztBQUNBLFlBQUlnTyxRQUFRLElBQUlBLFFBQVEsQ0FBQzliLEdBQXJCLElBQTRCOGIsUUFBUSxDQUFDOWIsR0FBVCxDQUFhLGtDQUFiLENBQWhDLEVBQWtGO0FBQ2pGLGNBQUk4YixRQUFRLENBQUNDLGtCQUFULFlBQXVDMU0sUUFBM0MsRUFBcUQ7QUFDcER5TSxZQUFBQSxRQUFRLENBQUNDLGtCQUFULENBQTRCLEtBQTVCO0FBQ0E7QUFDRDtBQUNELE9BUEQ7QUFRQTtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQzlYLG9CLEdBQUEsOEJBQXFCK1gsYUFBckIsRUFBeUNDLFVBQXpDLEVBQTZEO0FBQzVELFVBQU1DLFlBQVksR0FBR0YsYUFBYSxDQUFDaGIsU0FBZCxFQUFyQjtBQUNBLFVBQUltYixpQkFBaUIsR0FBRyxDQUFDRCxZQUFELENBQXhCOztBQUNBLFVBQUlGLGFBQWEsSUFBSUMsVUFBckIsRUFBaUM7QUFDaEMsWUFBSUMsWUFBWSxDQUFDRCxVQUFELENBQWhCLEVBQThCO0FBQzdCRSxVQUFBQSxpQkFBaUIsR0FBR0QsWUFBWSxDQUFDRCxVQUFELENBQWhDO0FBQ0EsaUJBQU9DLFlBQVksQ0FBQ0QsVUFBRCxDQUFuQjtBQUNBRSxVQUFBQSxpQkFBaUIsQ0FBQ2pTLElBQWxCLENBQXVCZ1MsWUFBdkI7QUFDQTtBQUNEOztBQUNELGFBQU9DLGlCQUFQO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FFQ0Msa0IsR0FBQSw0QkFBbUJDLFFBQW5CLEVBQXFDO0FBQ3BDLFVBQUksS0FBSy9jLFdBQUwsSUFBb0IsS0FBS0EsV0FBTCxHQUFtQmtDLE1BQW5CLEdBQTRCLENBQXBELEVBQXVEO0FBQ3RELFlBQU1vSSxPQUFPLEdBQUcsS0FBS3RLLFdBQUwsRUFBaEI7O0FBQ0EsYUFBSyxJQUFJd0IsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBRzhJLE9BQU8sQ0FBQ3BJLE1BQTVCLEVBQW9DVixDQUFDLEVBQXJDLEVBQXlDO0FBQ3hDd2IsVUFBQUEsYUFBYSxDQUFDQyxnQkFBZCxDQUErQjNTLE9BQU8sQ0FBQzlJLENBQUQsQ0FBdEMsRUFBMkN1YixRQUEzQztBQUNBO0FBQ0Q7QUFDRDtBQUVEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7V0FDQ0csc0IsR0FBQSxnQ0FBdUJDLFlBQXZCLEVBQThDQyxZQUE5QyxFQUFtRVQsVUFBbkUsRUFBdUY7QUFBQTs7QUFDdEYsVUFBSVUsV0FBa0IsR0FBRyxFQUF6QjtBQUFBLFVBQ0NDLGVBQWUsR0FBRyxFQURuQjtBQUFBLFVBRUMxWCxRQUZEO0FBQUEsVUFHQzJYLGFBSEQ7QUFBQSxVQUlDQyxTQUpEO0FBTUEsVUFBTUMsU0FBUyxHQUFHTixZQUFZLENBQUMxWSxPQUFiLEVBQWxCO0FBQ0EsVUFBTWlaLFVBQVUsR0FBR1AsWUFBWSxJQUFJQSxZQUFZLENBQUM3WSxRQUFiLEVBQWhCLElBQTRDNlksWUFBWSxDQUFDN1ksUUFBYixHQUF3QkMsWUFBeEIsRUFBL0Q7QUFDQSxVQUFNb1osYUFBYSxHQUFHRCxVQUFVLElBQUlBLFVBQVUsQ0FBQ2xaLFdBQVgsQ0FBdUJpWixTQUF2QixFQUFrQ3JSLE9BQWxDLENBQTBDLE1BQTFDLEVBQWtELEVBQWxELENBQXBDLENBVHNGLENBV3RGOztBQUNBLFVBQUlnUixZQUFZLElBQUlBLFlBQVksQ0FBQ2xiLE1BQWpDLEVBQXlDO0FBQ3hDMEQsUUFBQUEsUUFBUSxHQUFHd1gsWUFBWSxDQUFDLENBQUQsQ0FBdkI7QUFDQUksUUFBQUEsU0FBUyxHQUFHNVgsUUFBUSxDQUFDbkIsT0FBVCxFQUFaO0FBQ0E4WSxRQUFBQSxhQUFhLEdBQUdHLFVBQVUsSUFBSUEsVUFBVSxDQUFDbFosV0FBWCxDQUF1QmdaLFNBQXZCLEVBQWtDcFIsT0FBbEMsQ0FBMEMsTUFBMUMsRUFBa0QsRUFBbEQsQ0FBOUI7QUFFQWdSLFFBQUFBLFlBQVksQ0FBQ3ZZLEdBQWIsQ0FBaUIsVUFBQytZLGNBQUQsRUFBeUI7QUFDekMsY0FBSWpCLFVBQUosRUFBZ0I7QUFDZixnQkFBTUUsaUJBQWlCLEdBQUcsT0FBSSxDQUFDbFksb0JBQUwsQ0FBMEJpWixjQUExQixFQUEwQ2pCLFVBQTFDLENBQTFCOztBQUNBLGdCQUFJRSxpQkFBSixFQUF1QjtBQUN0QlEsY0FBQUEsV0FBVyxHQUFHUixpQkFBaUIsQ0FBQ2hZLEdBQWxCLENBQXNCLFVBQVVnWSxpQkFBVixFQUFrQztBQUNyRSx1QkFBTztBQUNOZ0Isa0JBQUFBLFdBQVcsRUFBRWhCLGlCQURQO0FBRU5sVixrQkFBQUEsU0FBUyxFQUFFZ1csYUFBYSxHQUFHLEdBQWhCLEdBQXNCaEI7QUFGM0IsaUJBQVA7QUFJQSxlQUxhLENBQWQ7QUFNQTtBQUNELFdBVkQsTUFVTztBQUNOVSxZQUFBQSxXQUFXLENBQUN6UyxJQUFaLENBQWlCO0FBQ2hCaVQsY0FBQUEsV0FBVyxFQUFFRCxjQUFjLENBQUNsYyxTQUFmLEVBREc7QUFFaEJpRyxjQUFBQSxTQUFTLEVBQUU0VjtBQUZLLGFBQWpCO0FBSUE7QUFDRCxTQWpCRDtBQWtCQTs7QUFDREQsTUFBQUEsZUFBZSxDQUFDMVMsSUFBaEIsQ0FBcUI7QUFDcEJpVCxRQUFBQSxXQUFXLEVBQUVWLFlBQVksQ0FBQ3piLFNBQWIsRUFETztBQUVwQmlHLFFBQUFBLFNBQVMsRUFBRWdXO0FBRlMsT0FBckIsRUFwQ3NGLENBd0N0Rjs7QUFDQUwsTUFBQUEsZUFBZSxHQUFHclosV0FBVyxDQUFDNlosbUJBQVosQ0FBZ0NSLGVBQWhDLEVBQWlESSxVQUFqRCxDQUFsQjtBQUNBLFVBQU1LLFlBQVksR0FBRzlaLFdBQVcsQ0FBQytaLGdDQUFaLENBQTZDLElBQUlDLGdCQUFKLEVBQTdDLEVBQXFFWCxlQUFyRSxFQUFzRixLQUFLMWUsT0FBTCxFQUF0RixDQUFyQjtBQUNBeWUsTUFBQUEsV0FBVyxHQUFHcFosV0FBVyxDQUFDNlosbUJBQVosQ0FBZ0NULFdBQWhDLEVBQTZDSyxVQUE3QyxDQUFkO0FBQ0EsYUFBTztBQUNOUSxRQUFBQSxnQkFBZ0IsRUFBRUgsWUFEWjtBQUVOSSxRQUFBQSxVQUFVLEVBQUVkO0FBRk4sT0FBUDtBQUlBLEs7O1dBRUR6VSxzQixHQUFBLGtDQUF5QjtBQUN4QixVQUFNaUIsU0FBUyxHQUFHLEtBQUtqTCxPQUFMLEdBQWUwSCxXQUFmLEVBQWxCO0FBQUEsVUFDQzhYLGVBQWUsR0FBR3ZVLFNBQVMsQ0FBQ3dVLG9CQUQ3QjtBQUFBLFVBRUNDLGVBQWUsR0FBR0YsZUFBZSxJQUFJaFosTUFBTSxDQUFDaEUsSUFBUCxDQUFZZ2QsZUFBWixDQUZ0QztBQUFBLFVBR0M1VCxZQUFZLEdBQUcsQ0FBQyxjQUFELEVBQWlCLGtCQUFqQixFQUFxQyxlQUFyQyxDQUhoQjs7QUFLQSxVQUFJOFQsZUFBZSxJQUFJQSxlQUFlLENBQUNwYyxNQUFoQixHQUF5QixDQUFoRCxFQUFtRDtBQUNsRG9jLFFBQUFBLGVBQWUsQ0FBQy9OLE9BQWhCLENBQXdCLFVBQVUxTyxJQUFWLEVBQXFCO0FBQzVDLGNBQU0wYyxjQUFjLEdBQUdILGVBQWUsQ0FBQ3ZjLElBQUQsQ0FBdEM7O0FBQ0EsY0FBSTBjLGNBQWMsQ0FBQ0MsY0FBZixLQUFrQyxhQUF0QyxFQUFxRDtBQUNwRGhVLFlBQUFBLFlBQVksQ0FBQ0ksSUFBYixDQUFrQixtQkFBbEI7QUFDQTtBQUNELFNBTEQ7QUFNQTs7QUFDRCxhQUFPSixZQUFQO0FBQ0E7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O1dBQ0NpVSxtQixHQUFBLDZCQUFvQjVlLE9BQXBCLEVBQWtDO0FBQ2pDLFVBQU0rRixRQUFRLEdBQUcvRixPQUFPLENBQUN1RSxpQkFBUixFQUFqQjtBQUNBLFVBQU0yUCxhQUFhLEdBQUcsS0FBSzlKLGVBQUwsRUFBdEI7O0FBQ0EsVUFBSXJFLFFBQUosRUFBYztBQUNiLFlBQU04WSxRQUFRLEdBQUc5WSxRQUFRLENBQUNuQixPQUFULEVBQWpCO0FBQUEsWUFDQ2thLFVBQVUsR0FBR0QsUUFBUSxDQUFDRSxLQUFULENBQWUsR0FBZixDQURkO0FBQUEsWUFFQ2xCLFVBQVUsR0FBRzNKLGFBQWEsQ0FBQ3hQLFlBQWQsRUFGZDtBQUdBLFlBQUlzYSxLQUFLLEdBQUcsRUFBWjtBQUFBLFlBQ0NDLGtCQUFrQixHQUFHLENBRHRCO0FBR0FILFFBQUFBLFVBQVUsQ0FBQ0ksS0FBWDtBQUNBSixRQUFBQSxVQUFVLENBQUNLLE1BQVgsQ0FBa0IsQ0FBQyxDQUFuQixFQUFzQixDQUF0QjtBQUNBTCxRQUFBQSxVQUFVLENBQUNwTyxPQUFYLENBQW1CLFVBQVUwTyxTQUFWLEVBQTBCemQsQ0FBMUIsRUFBa0M7QUFDcERxZCxVQUFBQSxLQUFLLElBQUksTUFBTUksU0FBZjtBQUNBLGNBQU1DLG1CQUFtQixHQUFHbkwsYUFBYSxDQUFDb0wscUJBQWQsRUFBNUI7QUFDQSxjQUFNQyxjQUFjLEdBQUcxQixVQUFVLENBQUNsWixXQUFYLENBQXVCcWEsS0FBdkIsQ0FBdkI7QUFDQSxjQUFNUSxjQUFjLEdBQUczQixVQUFVLENBQUNoYyxTQUFYLENBQXFCMGQsY0FBYyxHQUFHLGdEQUF0QyxDQUF2Qjs7QUFDQSxjQUFJQyxjQUFKLEVBQW9CO0FBQ25CO0FBQ0FQLFlBQUFBLGtCQUFrQixHQUFHLENBQXJCO0FBQ0E7QUFDQTs7QUFFRCxjQUFNUSx5QkFBeUIsR0FBR0osbUJBQW1CLENBQUNLLG9CQUFwQixDQUF5Q1YsS0FBekMsQ0FBbEM7QUFFQVMsVUFBQUEseUJBQXlCLENBQ3ZCemUsSUFERixDQUNPLFVBQVUyZSxrQkFBVixFQUFtQztBQUN4QyxnQkFBTUMsR0FBRyxHQUFHamUsQ0FBQyxHQUFHc2Qsa0JBQWhCO0FBQUEsZ0JBQ0NZLEtBQUssR0FBRzdmLE9BQU8sQ0FBQzhmLFFBQVIsR0FBbUJGLEdBQW5CLElBQTBCNWYsT0FBTyxDQUFDOGYsUUFBUixHQUFtQkYsR0FBbkIsQ0FBMUIsR0FBb0QsSUFBSUcsSUFBSixFQUQ3RCxDQUR3QyxDQUd4Qzs7QUFDQUYsWUFBQUEsS0FBSyxDQUFDRyxPQUFOLENBQWNMLGtCQUFrQixDQUFDM0ssUUFBbkIsSUFBK0IySyxrQkFBa0IsQ0FBQzVLLEtBQWhFO0FBQ0E4SyxZQUFBQSxLQUFLLENBQUNJLE9BQU4sQ0FBY04sa0JBQWtCLENBQUMxSyxNQUFqQzs7QUFDQSxnQkFBSSxDQUFDalYsT0FBTyxDQUFDOGYsUUFBUixHQUFtQkYsR0FBbkIsQ0FBTCxFQUE4QjtBQUM3QjVmLGNBQUFBLE9BQU8sQ0FBQ2tnQixPQUFSLENBQWdCTCxLQUFoQjtBQUNBO0FBQ0QsV0FWRixFQVdFbGQsS0FYRixDQVdRLFVBQVU0SCxNQUFWLEVBQXVCO0FBQzdCMUgsWUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUsMkNBQVYsRUFBdUR5SCxNQUF2RDtBQUNBLFdBYkY7QUFjQSxTQTNCRDtBQTRCQTtBQUNELEs7O1dBRURrSyx5QyxHQUFBLHFEQUE0QztBQUMzQyxVQUFNdFIsS0FBSyxHQUFHLEtBQUtwRSxPQUFMLEVBQWQ7QUFDQSxVQUFNc0gscUJBQXFCLEdBQUdsRCxLQUFLLENBQUNvQixpQkFBTixDQUF3QixVQUF4QixDQUE5QjtBQUNBLFVBQU00YixXQUFXLEdBQUcvYixXQUFXLENBQUNnYyw2Q0FBWixDQUNuQmpkLEtBQUssQ0FBQ3NELFdBQU4sRUFEbUIsRUFFbkIsS0FBSzJELGVBQUwsR0FBdUJpVyxpQkFBdkIsR0FBMkNDLFlBQTNDLEVBRm1CLENBQXBCO0FBSUEsVUFBTUMsY0FBYyxHQUFHLEtBQUtuVyxlQUFMLEdBQXVCK0osZ0JBQXZCLEVBQXZCO0FBQ0EsVUFBTW1KLFlBQVksR0FBR25hLEtBQUssSUFBS0EsS0FBSyxDQUFDb0IsaUJBQU4sRUFBL0I7QUFDQThCLE1BQUFBLHFCQUFxQixDQUFDdUMsV0FBdEIsQ0FBa0MsdUJBQWxDLEVBQTJELEVBQTNEOztBQUNBLFVBQUkwVSxZQUFKLEVBQWtCO0FBQ2pCQSxRQUFBQSxZQUFZLENBQ1ZrRCxhQURGLEdBRUV4ZixJQUZGLENBRU8sVUFBVUssS0FBVixFQUFzQjtBQUMzQm9mLFVBQUFBLFVBQVUsQ0FBQ04sV0FBRCxFQUFjOWUsS0FBZCxDQUFWO0FBQ0EsU0FKRixFQUtFc0IsS0FMRixDQUtRLFVBQVU0SCxNQUFWLEVBQXVCO0FBQzdCMUgsVUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVUsa0RBQVYsRUFBOER5SCxNQUE5RDtBQUNBLFNBUEY7QUFRQTtBQUVEO0FBQ0Y7QUFDQTs7O0FBQ0UsZUFBU21XLFNBQVQsQ0FBbUJuVyxNQUFuQixFQUFnQztBQUMvQjFILFFBQUFBLEdBQUcsQ0FBQ0MsS0FBSixDQUFVeUgsTUFBVjtBQUNBOztBQUVELGVBQVNvVyxtQkFBVCxDQUE2QkMsRUFBN0IsRUFBeUNDLGVBQXpDLEVBQStEO0FBQzlELFlBQU1DLE9BQU8sR0FBR0YsRUFBaEIsQ0FEOEQsQ0FFOUQ7O0FBQ0EsWUFBSUMsZUFBZSxJQUFJQSxlQUFlLENBQUN4ZSxNQUFoQixLQUEyQixDQUE5QyxJQUFtRHdlLGVBQWUsQ0FBQyxDQUFELENBQWYsQ0FBbUJFLFNBQTFFLEVBQXFGO0FBQ3BGMWEsVUFBQUEscUJBQXFCLENBQUN1QyxXQUF0QixDQUFrQywyQkFBMkJrWSxPQUE3RCxFQUFzRSxJQUF0RTtBQUNBO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTs7O0FBQ0UsZUFBU0wsVUFBVCxDQUFvQk4sV0FBcEIsRUFBc0NhLFNBQXRDLEVBQXNEO0FBQUEsOEJBQzFDN2YsR0FEMEM7QUFFcEQsY0FBTThmLFVBQVUsR0FBR2QsV0FBVyxDQUFDaGYsR0FBRCxDQUE5QjtBQUNBLGNBQU1pRSxPQUFZLEdBQUcsRUFBckI7QUFDQSxjQUFNeWEsS0FBSyxHQUFHMWMsS0FBSyxDQUFDSCxJQUFOLENBQVc3QixHQUFYLENBQWQ7O0FBQ0EsY0FBSSxDQUFDMGUsS0FBTCxFQUFZO0FBQ1g7QUFDQTtBQUNBOztBQUNELGNBQU1xQixZQUFZLEdBQUdyQixLQUFLLENBQUN0YixpQkFBTixFQUFyQjtBQUNBLGNBQU00YyxTQUFjLEdBQUdELFlBQVksSUFBSUEsWUFBWSxDQUFDcmYsU0FBYixFQUF2QztBQUNBLGNBQUl1ZixhQUFrQixHQUFHQyxLQUFLLENBQUMsRUFBRCxFQUFLTCxTQUFMLEVBQWdCRyxTQUFoQixDQUE5QixDQVhvRCxDQVlwRDs7QUFDQSxjQUFJRixVQUFVLENBQUNyYixxQkFBZixFQUFzQztBQUNyQyxnQkFBTXpCLHNCQUFzQixHQUFHOGMsVUFBVSxDQUFDcmIscUJBQTFDOztBQUNBLGlCQUFLLElBQU0wYixJQUFYLElBQW1CbmQsc0JBQW5CLEVBQTJDO0FBQzFDLGtCQUFNb2QsUUFBUSxHQUFHcGQsc0JBQXNCLENBQUNtZCxJQUFELENBQXZDO0FBQ0Esa0JBQU1FLGFBQWEsR0FBR0QsUUFBUSxDQUFDLGVBQUQsQ0FBUixDQUEwQixlQUExQixDQUF0QjtBQUNBLGtCQUFNRSxlQUFlLEdBQUdGLFFBQVEsQ0FBQyx3QkFBRCxDQUFoQzs7QUFDQSxrQkFBSUMsYUFBYSxLQUFLQyxlQUF0QixFQUF1QztBQUN0QyxvQkFBSUwsYUFBYSxDQUFDTSxjQUFkLENBQTZCRixhQUE3QixDQUFKLEVBQWlEO0FBQ2hELHNCQUFNRyxXQUFnQixHQUFHLEVBQXpCO0FBQ0FBLGtCQUFBQSxXQUFXLENBQUNGLGVBQUQsQ0FBWCxHQUErQkwsYUFBYSxDQUFDSSxhQUFELENBQTVDO0FBQ0FKLGtCQUFBQSxhQUFhLEdBQUdDLEtBQUssQ0FBQyxFQUFELEVBQUtELGFBQUwsRUFBb0JPLFdBQXBCLENBQXJCO0FBQ0EseUJBQU9QLGFBQWEsQ0FBQ0ksYUFBRCxDQUFwQjtBQUNBO0FBQ0Q7QUFDRDtBQUNEOztBQUVELGNBQUlKLGFBQUosRUFBbUI7QUFDbEIsaUJBQUssSUFBTXBmLElBQVgsSUFBbUJvZixhQUFuQixFQUFrQztBQUNqQyxrQkFBSXBmLElBQUksQ0FBQytVLE9BQUwsQ0FBYSxHQUFiLE1BQXNCLENBQXRCLElBQTJCL1UsSUFBSSxDQUFDK1UsT0FBTCxDQUFhLGVBQWIsTUFBa0MsQ0FBQyxDQUFsRSxFQUFxRTtBQUNwRTNSLGdCQUFBQSxPQUFPLENBQUNwRCxJQUFELENBQVAsR0FBZ0JvZixhQUFhLENBQUNwZixJQUFELENBQTdCO0FBQ0E7QUFDRDtBQUNELFdBcENtRCxDQXFDcEQ7OztBQUNBdWUsVUFBQUEsY0FBYyxDQUNacUIscUJBREYsQ0FDd0IsQ0FDdEI7QUFDQzlLLFlBQUFBLE1BQU0sRUFBRTtBQUNQdFIsY0FBQUEsY0FBYyxFQUFFeWIsVUFBVSxDQUFDemIsY0FEcEI7QUFFUEMsY0FBQUEsTUFBTSxFQUFFd2IsVUFBVSxDQUFDeGI7QUFGWixhQURUO0FBS0NvYyxZQUFBQSxNQUFNLEVBQUV6YztBQUxULFdBRHNCLENBRHhCLEVBVUVwRSxJQVZGLENBVU8sVUFBQzhnQixNQUFELEVBQVk7QUFDakIsbUJBQU9uQixtQkFBbUIsQ0FBQ3hmLEdBQUQsRUFBTTJnQixNQUFOLENBQTFCO0FBQ0EsV0FaRixFQWFFbmYsS0FiRixDQWFRK2QsU0FiUjtBQXRDb0Q7O0FBQ3JELGFBQUssSUFBTXZmLEdBQVgsSUFBa0JnZixXQUFsQixFQUErQjtBQUFBLDJCQUFwQmhmLEdBQW9COztBQUFBLG1DQU03QjtBQTZDRDtBQUNEO0FBQ0QsSzs7O0lBOXBDaUMwSSxjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBNjJDcEJuTSxvQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IENvbW1vblV0aWxzIGZyb20gXCJzYXAvZmUvY29yZS9Db21tb25VdGlsc1wiO1xuaW1wb3J0IEJ1c3lMb2NrZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0J1c3lMb2NrZXJcIjtcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9BY3Rpdml0eVN5bmNcIjtcbmltcG9ydCB7IG9wZW5NYW5hZ2VEaWFsb2csIHNob3dVc2VyRGV0YWlscyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL01hbmFnZVwiO1xuaW1wb3J0IEVkaXRGbG93IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9FZGl0Rmxvd1wiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IEludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxFZGl0RmxvdyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxFZGl0Rmxvd1wiO1xuaW1wb3J0IEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvblwiO1xuaW1wb3J0IEludGVybmFsUm91dGluZyBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgTWFzc0VkaXQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01hc3NFZGl0XCI7XG5pbXBvcnQgTWVzc2FnZUhhbmRsZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgUGFnZVJlYWR5IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9QYWdlUmVhZHlcIjtcbmltcG9ydCBQYWdpbmF0b3IgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BhZ2luYXRvclwiO1xuaW1wb3J0IFBsYWNlaG9sZGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9QbGFjZWhvbGRlclwiO1xuaW1wb3J0IFNoYXJlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9TaGFyZVwiO1xuaW1wb3J0IFZpZXdTdGF0ZSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvVmlld1N0YXRlXCI7XG5pbXBvcnQgeyBkZWZpbmVVSTVDbGFzcywgZXh0ZW5zaWJsZSwgZmluYWxFeHRlbnNpb24sIHB1YmxpY0V4dGVuc2lvbiwgdXNpbmdFeHRlbnNpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCBNb2RlbEhlbHBlciwgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgQ2hhcnRSdW50aW1lIGZyb20gXCJzYXAvZmUvbWFjcm9zL2NoYXJ0L0NoYXJ0UnVudGltZVwiO1xuaW1wb3J0IENvbW1vbkhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9Db21tb25IZWxwZXJcIjtcbmltcG9ydCBEZWxlZ2F0ZVV0aWwgZnJvbSBcInNhcC9mZS9tYWNyb3MvRGVsZWdhdGVVdGlsXCI7XG5pbXBvcnQgVGFibGVVdGlscyBmcm9tIFwic2FwL2ZlL21hY3Jvcy90YWJsZS9VdGlsc1wiO1xuaW1wb3J0IFNlbGVjdGlvblZhcmlhbnQgZnJvbSBcInNhcC9mZS9uYXZpZ2F0aW9uL1NlbGVjdGlvblZhcmlhbnRcIjtcbmltcG9ydCB7IGRlZmF1bHQgYXMgRXh0ZW5zaW9uQVBJLCBkZWZhdWx0IGFzIE9iamVjdFBhZ2VFeHRlbnNpb25BUEkgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL0V4dGVuc2lvbkFQSVwiO1xuaW1wb3J0IFJvb3RDb250YWluZXJCYXNlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9Sb290Q29udGFpbmVyL2NvbnRyb2xsZXIvUm9vdENvbnRhaW5lckJhc2VDb250cm9sbGVyXCI7XG5pbXBvcnQgRWRpdEZsb3dPdmVycmlkZXMgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvUm9vdENvbnRhaW5lci9vdmVycmlkZXMvRWRpdEZsb3dcIjtcbmltcG9ydCBUYWJsZVNjcm9sbGVyIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL1RhYmxlU2Nyb2xsZXJcIjtcbmltcG9ydCBJbnN0YW5jZU1hbmFnZXIgZnJvbSBcInNhcC9tL0luc3RhbmNlTWFuYWdlclwiO1xuaW1wb3J0IExpbmsgZnJvbSBcInNhcC9tL0xpbmtcIjtcbmltcG9ydCBNZXNzYWdlQm94IGZyb20gXCJzYXAvbS9NZXNzYWdlQm94XCI7XG5pbXBvcnQgUG9wb3ZlciBmcm9tIFwic2FwL20vUG9wb3ZlclwiO1xuaW1wb3J0IFNlbGVjdExpc3QgZnJvbSBcInNhcC9tL1NlbGVjdExpc3RcIjtcbmltcG9ydCBFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgQ29yZSBmcm9tIFwic2FwL3VpL2NvcmUvQ29yZVwiO1xuaW1wb3J0IEZyYWdtZW50IGZyb20gXCJzYXAvdWkvY29yZS9GcmFnbWVudFwiO1xuaW1wb3J0IEl0ZW0gZnJvbSBcInNhcC91aS9jb3JlL0l0ZW1cIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9CaW5kaW5nXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL3Jlc291cmNlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCBPYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlIGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlXCI7XG5pbXBvcnQgT2JqZWN0UGFnZUxheW91dCBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZUxheW91dFwiO1xuaW1wb3J0IE9iamVjdFBhZ2VTZWN0aW9uIGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlU2VjdGlvblwiO1xuaW1wb3J0IE9iamVjdFBhZ2VTdWJTZWN0aW9uIGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlU3ViU2VjdGlvblwiO1xuaW1wb3J0IEludGVudEJhc2VkTmF2aWdhdGlvbk92ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9JbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbFJvdXRpbmdPdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvSW50ZXJuYWxSb3V0aW5nXCI7XG5pbXBvcnQgTWVzc2FnZUhhbmRsZXJPdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCBQYWdpbmF0b3JPdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvUGFnaW5hdG9yXCI7XG5pbXBvcnQgU2hhcmVPdmVycmlkZXMgZnJvbSBcIi4vb3ZlcnJpZGVzL1NoYXJlXCI7XG5pbXBvcnQgVmlld1N0YXRlT3ZlcnJpZGVzIGZyb20gXCIuL292ZXJyaWRlcy9WaWV3U3RhdGVcIjtcblxuQGRlZmluZVVJNUNsYXNzKFwic2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLk9iamVjdFBhZ2VDb250cm9sbGVyXCIpXG5jbGFzcyBPYmplY3RQYWdlQ29udHJvbGxlciBleHRlbmRzIFBhZ2VDb250cm9sbGVyIHtcblx0b1ZpZXchOiBhbnk7XG5cdEB1c2luZ0V4dGVuc2lvbihQbGFjZWhvbGRlcilcblx0cGxhY2Vob2xkZXIhOiBQbGFjZWhvbGRlcjtcblx0QHVzaW5nRXh0ZW5zaW9uKEVkaXRGbG93KVxuXHRlZGl0RmxvdyE6IEVkaXRGbG93O1xuXHRAdXNpbmdFeHRlbnNpb24oU2hhcmUub3ZlcnJpZGUoU2hhcmVPdmVycmlkZXMpKVxuXHRzaGFyZSE6IFNoYXJlO1xuXHRAdXNpbmdFeHRlbnNpb24oSW50ZXJuYWxFZGl0Rmxvdy5vdmVycmlkZShFZGl0Rmxvd092ZXJyaWRlcykpXG5cdF9lZGl0RmxvdyE6IEludGVybmFsRWRpdEZsb3c7XG5cdEB1c2luZ0V4dGVuc2lvbihJbnRlcm5hbFJvdXRpbmcub3ZlcnJpZGUoSW50ZXJuYWxSb3V0aW5nT3ZlcnJpZGUpKVxuXHRfcm91dGluZyE6IEludGVybmFsUm91dGluZztcblx0QHVzaW5nRXh0ZW5zaW9uKFBhZ2luYXRvci5vdmVycmlkZShQYWdpbmF0b3JPdmVycmlkZSkpXG5cdHBhZ2luYXRvciE6IFBhZ2luYXRvcjtcblx0QHVzaW5nRXh0ZW5zaW9uKE1lc3NhZ2VIYW5kbGVyLm92ZXJyaWRlKE1lc3NhZ2VIYW5kbGVyT3ZlcnJpZGUpKVxuXHRtZXNzYWdlSGFuZGxlciE6IE1lc3NhZ2VIYW5kbGVyO1xuXHRAdXNpbmdFeHRlbnNpb24oSW50ZW50QmFzZWROYXZpZ2F0aW9uLm92ZXJyaWRlKEludGVudEJhc2VkTmF2aWdhdGlvbk92ZXJyaWRlKSlcblx0aW50ZW50QmFzZWROYXZpZ2F0aW9uITogSW50ZW50QmFzZWROYXZpZ2F0aW9uO1xuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0SW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24ub3ZlcnJpZGUoe1xuXHRcdFx0Z2V0TmF2aWdhdGlvbk1vZGU6IGZ1bmN0aW9uICh0aGlzOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbikge1xuXHRcdFx0XHRjb25zdCBiSXNTdGlja3lFZGl0TW9kZSA9XG5cdFx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuZ2V0U3RpY2t5RWRpdE1vZGUgJiZcblx0XHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Q29udHJvbGxlcigpIGFzIE9iamVjdFBhZ2VDb250cm9sbGVyKS5nZXRTdGlja3lFZGl0TW9kZSgpO1xuXHRcdFx0XHRyZXR1cm4gYklzU3RpY2t5RWRpdE1vZGUgPyBcImV4cGxhY2VcIiA6IHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHR9KVxuXHQpXG5cdF9pbnRlbnRCYXNlZE5hdmlnYXRpb24hOiBJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbjtcblx0QHVzaW5nRXh0ZW5zaW9uKFZpZXdTdGF0ZS5vdmVycmlkZShWaWV3U3RhdGVPdmVycmlkZXMpKVxuXHR2aWV3U3RhdGUhOiBWaWV3U3RhdGU7XG5cdEB1c2luZ0V4dGVuc2lvbihcblx0XHRQYWdlUmVhZHkub3ZlcnJpZGUoe1xuXHRcdFx0aXNDb250ZXh0RXhwZWN0ZWQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fSlcblx0KVxuXHRwYWdlUmVhZHkhOiBQYWdlUmVhZHk7XG5cdEB1c2luZ0V4dGVuc2lvbihNYXNzRWRpdClcblx0bWFzc0VkaXQhOiBNYXNzRWRpdDtcblx0cHJpdmF0ZSBtQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXM/OiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJPjtcblx0cHJpdmF0ZSBleHRlbnNpb25BUEk/OiBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJO1xuXHRwcml2YXRlIG9SZXNvdXJjZUJ1bmRsZT86IFJlc291cmNlQnVuZGxlO1xuXHRwcml2YXRlIGJTZWN0aW9uTmF2aWdhdGVkPzogYm9vbGVhbjtcblx0cHJpdmF0ZSBzd2l0Y2hEcmFmdEFuZEFjdGl2ZVBvcE92ZXI/OiBQb3BvdmVyO1xuXHRwcml2YXRlIGN1cnJlbnRCaW5kaW5nPzogQmluZGluZztcblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGZpbmFsRXh0ZW5zaW9uKClcblx0Z2V0RXh0ZW5zaW9uQVBJKHNJZD86IHN0cmluZyk6IEV4dGVuc2lvbkFQSSB7XG5cdFx0aWYgKHNJZCkge1xuXHRcdFx0Ly8gdG8gYWxsb3cgbG9jYWwgSUQgdXNhZ2UgZm9yIGN1c3RvbSBwYWdlcyB3ZSdsbCBjcmVhdGUvcmV0dXJuIG93biBpbnN0YW5jZXMgZm9yIGN1c3RvbSBzZWN0aW9uc1xuXHRcdFx0dGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMgPSB0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcyB8fCB7fTtcblxuXHRcdFx0aWYgKCF0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdKSB7XG5cdFx0XHRcdHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF0gPSBuZXcgRXh0ZW5zaW9uQVBJKHRoaXMsIHNJZCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCF0aGlzLmV4dGVuc2lvbkFQSSkge1xuXHRcdFx0XHR0aGlzLmV4dGVuc2lvbkFQSSA9IG5ldyBFeHRlbnNpb25BUEkodGhpcyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25BUEk7XG5cdFx0fVxuXHR9XG5cblx0b25Jbml0KCkge1xuXHRcdHN1cGVyLm9uSW5pdCgpO1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblxuXHRcdC8vIFNldHRpbmcgZGVmYXVsdHMgb2YgaW50ZXJuYWwgbW9kZWwgY29udGV4dFxuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZXh0ZXJuYWxOYXZpZ2F0aW9uQ29udGV4dFwiLCB7IFwicGFnZVwiOiB0cnVlIH0pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcInJlbGF0ZWRBcHBzXCIsIHtcblx0XHRcdHZpc2liaWxpdHk6IGZhbHNlLFxuXHRcdFx0aXRlbXM6IG51bGxcblx0XHR9KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJiYXRjaEdyb3Vwc1wiLCB0aGlzLl9nZXRCYXRjaEdyb3Vwc0ZvclZpZXcoKSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiZXJyb3JOYXZpZ2F0aW9uU2VjdGlvbkZsYWdcIiwgZmFsc2UpO1xuXHRcdGlmICghKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS51c2VOZXdMYXp5TG9hZGluZyAmJiAob09iamVjdFBhZ2UgYXMgYW55KS5nZXRFbmFibGVMYXp5TG9hZGluZygpKSB7XG5cdFx0XHQvL0F0dGFjaGluZyB0aGUgZXZlbnQgdG8gbWFrZSB0aGUgc3Vic2VjdGlvbiBjb250ZXh0IGJpbmRpbmcgYWN0aXZlIHdoZW4gaXQgaXMgdmlzaWJsZS5cblx0XHRcdG9PYmplY3RQYWdlLmF0dGFjaEV2ZW50KFwic3ViU2VjdGlvbkVudGVyZWRWaWV3UG9ydFwiLCB0aGlzLl9oYW5kbGVTdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0LmJpbmQodGhpcykpO1xuXHRcdH1cblx0fVxuXG5cdG9uRXhpdCgpIHtcblx0XHRpZiAodGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMpIHtcblx0XHRcdGZvciAoY29uc3Qgc0lkIG9mIE9iamVjdC5rZXlzKHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzKSkge1xuXHRcdFx0XHR0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdICYmIHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF0uZGVzdHJveSgpO1xuXHRcdFx0fVxuXHRcdFx0ZGVsZXRlIHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzO1xuXHRcdH1cblx0XHR0aGlzLmV4dGVuc2lvbkFQSSAmJiB0aGlzLmV4dGVuc2lvbkFQSS5kZXN0cm95KCk7XG5cdFx0ZGVsZXRlIHRoaXMuZXh0ZW5zaW9uQVBJO1xuXG5cdFx0Y29uc3Qgb01lc3NhZ2VCdXR0b24gPSB0aGlzLmdldFZpZXcoKS5ieUlkKFwiZmU6OkZvb3RlckJhcjo6TWVzc2FnZUJ1dHRvblwiKSxcblx0XHRcdG9NZXNzYWdlUG9wb3ZlciA9IG9NZXNzYWdlQnV0dG9uID8gKG9NZXNzYWdlQnV0dG9uIGFzIGFueSkub01lc3NhZ2VQb3BvdmVyIDogbnVsbDtcblx0XHRpZiAob01lc3NhZ2VQb3BvdmVyICYmIG9NZXNzYWdlUG9wb3Zlci5pc09wZW4oKSkge1xuXHRcdFx0b01lc3NhZ2VQb3BvdmVyLmNsb3NlKCk7XG5cdFx0fVxuXHRcdC8vd2hlbiBleGl0aW5nIHdlIHNldCBrZWVwQWxpdmUgY29udGV4dCB0byBmYWxzZVxuXHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGlmIChvQ29udGV4dCAmJiBvQ29udGV4dC5pc0tlZXBBbGl2ZSgpKSB7XG5cdFx0XHRvQ29udGV4dC5zZXRLZWVwQWxpdmUoZmFsc2UpO1xuXHRcdH1cblx0fVxuXG5cdF9nZXRUYWJsZUJpbmRpbmcob1RhYmxlOiBhbnkpIHtcblx0XHRyZXR1cm4gb1RhYmxlICYmIG9UYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdH1cblxuXHRvbkJlZm9yZVJlbmRlcmluZygpIHtcblx0XHRQYWdlQ29udHJvbGxlci5wcm90b3R5cGUub25CZWZvcmVSZW5kZXJpbmcuYXBwbHkodGhpcyk7XG5cdFx0Ly8gSW4gdGhlIHJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Qgc2NlbmFyaW8gd2UgbmVlZCB0byBlbnN1cmUgaW4gY2FzZSBvZiByZWxvYWQvcmVmcmVzaCB0aGF0IHRoZSBtZXRhIG1vZGVsIGluIHRoZSBtZXRob2RlIHJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Qgb2YgdGhlIEZpZWxkUnVudGltZSBpcyBhdmFpbGFibGVcblx0XHRpZiAodGhpcy5vVmlldy5vVmlld0RhdGEucmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCAmJiBDb21tb25IZWxwZXIuZ2V0TWV0YU1vZGVsKCkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Q29tbW9uSGVscGVyLnNldE1ldGFNb2RlbCh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldE1ldGFNb2RlbCgpKTtcblx0XHR9XG5cdH1cblxuXHRvbkFmdGVyUmVuZGVyaW5nKCkge1xuXHRcdCgodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKSBhcyBSZXNvdXJjZU1vZGVsKS5nZXRSZXNvdXJjZUJ1bmRsZSgpIGFzIFByb21pc2U8UmVzb3VyY2VCdW5kbGU+KVxuXHRcdFx0LnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcblx0XHRcdFx0dGhpcy5vUmVzb3VyY2VCdW5kbGUgPSByZXNwb25zZTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRfb25CZWZvcmVCaW5kaW5nKG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHQvLyBUT0RPOiB3ZSBzaG91bGQgY2hlY2sgaG93IHRoaXMgY29tZXMgdG9nZXRoZXIgd2l0aCB0aGUgdHJhbnNhY3Rpb24gaGVscGVyLCBzYW1lIHRvIHRoZSBjaGFuZ2UgaW4gdGhlIGFmdGVyQmluZGluZ1xuXHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9maW5kVGFibGVzKCksXG5cdFx0XHRvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCkgYXMgT2JqZWN0UGFnZUxheW91dCxcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQsXG5cdFx0XHRvSW50ZXJuYWxNb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsLFxuXHRcdFx0YUJhdGNoR3JvdXBzID0gb0ludGVybmFsTW9kZWxDb250ZXh0LmdldFByb3BlcnR5KFwiYmF0Y2hHcm91cHNcIiksXG5cdFx0XHRpVmlld0xldmVsID0gKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS52aWV3TGV2ZWw7XG5cdFx0bGV0IG9GYXN0Q3JlYXRpb25Sb3c7XG5cdFx0YUJhdGNoR3JvdXBzLnB1c2goXCIkYXV0b1wiKTtcblx0XHRpZiAobVBhcmFtZXRlcnMuYkRyYWZ0TmF2aWdhdGlvbiAhPT0gdHJ1ZSkge1xuXHRcdFx0dGhpcy5fY2xvc2VTaWRlQ29udGVudCgpO1xuXHRcdH1cblx0XHRjb25zdCBvcENvbnRleHQgPSBvT2JqZWN0UGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQ7XG5cdFx0aWYgKFxuXHRcdFx0b3BDb250ZXh0ICYmXG5cdFx0XHRvcENvbnRleHQuaGFzUGVuZGluZ0NoYW5nZXMoKSAmJlxuXHRcdFx0IWFCYXRjaEdyb3Vwcy5zb21lKChvcENvbnRleHQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5oYXNQZW5kaW5nQ2hhbmdlcy5iaW5kKG9wQ29udGV4dC5nZXRNb2RlbCgpKSlcblx0XHQpIHtcblx0XHRcdC8qIFx0SW4gY2FzZSB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzIGZvciB0aGUgY3JlYXRpb24gcm93IGFuZCBubyBvdGhlcnMgd2UgbmVlZCB0byByZXNldCB0aGUgY2hhbmdlc1xuICAgIFx0XHRcdFx0XHRcdFRPRE86IHRoaXMgaXMganVzdCBhIHF1aWNrIHNvbHV0aW9uLCB0aGlzIG5lZWRzIHRvIGJlIHJld29ya2VkXG4gICAgXHRcdFx0XHQgXHQqL1xuXG5cdFx0XHRvcENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblxuXHRcdC8vIEZvciBub3cgd2UgaGF2ZSB0byBzZXQgdGhlIGJpbmRpbmcgY29udGV4dCB0byBudWxsIGZvciBldmVyeSBmYXN0IGNyZWF0aW9uIHJvd1xuXHRcdC8vIFRPRE86IEdldCByaWQgb2YgdGhpcyBjb2Rpbmcgb3IgbW92ZSBpdCB0byBhbm90aGVyIGxheWVyIC0gdG8gYmUgZGlzY3Vzc2VkIHdpdGggTURDIGFuZCBtb2RlbFxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYVRhYmxlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0b0Zhc3RDcmVhdGlvblJvdyA9IGFUYWJsZXNbaV0uZ2V0Q3JlYXRpb25Sb3coKTtcblx0XHRcdGlmIChvRmFzdENyZWF0aW9uUm93KSB7XG5cdFx0XHRcdG9GYXN0Q3JlYXRpb25Sb3cuc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2Nyb2xsIHRvIHByZXNlbnQgU2VjdGlvbiBzbyB0aGF0IGJpbmRpbmdzIGFyZSBlbmFibGVkIGR1cmluZyBuYXZpZ2F0aW9uIHRocm91Z2ggcGFnaW5hdG9yIGJ1dHRvbnMsIGFzIHRoZXJlIGlzIG5vIHZpZXcgcmVyZW5kZXJpbmcvcmViaW5kXG5cdFx0Y29uc3QgZm5TY3JvbGxUb1ByZXNlbnRTZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKCEob09iamVjdFBhZ2UgYXMgYW55KS5pc0ZpcnN0UmVuZGVyaW5nKCkgJiYgIW1QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwpIHtcblx0XHRcdFx0b09iamVjdFBhZ2Uuc2V0U2VsZWN0ZWRTZWN0aW9uKG51bGwgYXMgYW55KTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdG9PYmplY3RQYWdlLmF0dGFjaEV2ZW50T25jZShcIm1vZGVsQ29udGV4dENoYW5nZVwiLCBmblNjcm9sbFRvUHJlc2VudFNlY3Rpb24pO1xuXG5cdFx0Ly8gaWYgdGhlIHN0cnVjdHVyZSBvZiB0aGUgT2JqZWN0UGFnZUxheW91dCBpcyBjaGFuZ2VkIHRoZW4gc2Nyb2xsIHRvIHByZXNlbnQgU2VjdGlvblxuXHRcdC8vIEZJWE1FIElzIHRoaXMgcmVhbGx5IHdvcmtpbmcgYXMgaW50ZW5kZWQgPyBJbml0aWFsbHkgdGhpcyB3YXMgb25CZWZvcmVSZW5kZXJpbmcsIGJ1dCBuZXZlciB0cmlnZ2VyZWQgb25CZWZvcmVSZW5kZXJpbmcgYmVjYXVzZSBpdCB3YXMgcmVnaXN0ZXJlZCBhZnRlciBpdFxuXHRcdGNvbnN0IG9EZWxlZ2F0ZU9uQmVmb3JlID0ge1xuXHRcdFx0b25BZnRlclJlbmRlcmluZzogZm5TY3JvbGxUb1ByZXNlbnRTZWN0aW9uXG5cdFx0fTtcblx0XHRvT2JqZWN0UGFnZS5hZGRFdmVudERlbGVnYXRlKG9EZWxlZ2F0ZU9uQmVmb3JlLCB0aGlzKTtcblx0XHR0aGlzLnBhZ2VSZWFkeS5hdHRhY2hFdmVudE9uY2UoXCJwYWdlUmVhZHlcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0b09iamVjdFBhZ2UucmVtb3ZlRXZlbnREZWxlZ2F0ZShvRGVsZWdhdGVPbkJlZm9yZSk7XG5cdFx0fSk7XG5cblx0XHQvL1NldCB0aGUgQmluZGluZyBmb3IgUGFnaW5hdG9ycyB1c2luZyBMaXN0QmluZGluZyBJRFxuXHRcdGlmIChpVmlld0xldmVsID4gMSkge1xuXHRcdFx0bGV0IG9CaW5kaW5nID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMubGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBvUGFnaW5hdG9yQ3VycmVudENvbnRleHQgPSBvSW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiKTtcblx0XHRcdGlmIChvUGFnaW5hdG9yQ3VycmVudENvbnRleHQpIHtcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdUb1VzZSA9IG9QYWdpbmF0b3JDdXJyZW50Q29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0XHRcdHRoaXMucGFnaW5hdG9yLmluaXRpYWxpemUob0JpbmRpbmdUb1VzZSwgb1BhZ2luYXRvckN1cnJlbnRDb250ZXh0KTtcblx0XHRcdFx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgbnVsbCk7XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nKSB7XG5cdFx0XHRcdGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRcdHRoaXMucGFnaW5hdG9yLmluaXRpYWxpemUob0JpbmRpbmcsIG9Db250ZXh0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvL2lmIHRoZSBiaW5kaW5nIHR5cGUgaXMgbm90IE9EYXRhTGlzdEJpbmRpbmcgYmVjYXVzZSBvZiBhIGRlZXBsaW5rIG5hdmlnYXRpb24gb3IgYSByZWZyZXNoIG9mIHRoZSBwYWdlXG5cdFx0XHRcdFx0Ly8gd2UgbmVlZCB0byBjcmVhdGUgaXRcblx0XHRcdFx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBvQmluZGluZy5nZXRQYXRoKCkucmVwbGFjZSgvXFwoW15cXCldKlxcKSokLywgXCJcIik7IC8vcmVtb3ZpbmcgdGhlIGxhc3QgdHVwbGVcblx0XHRcdFx0XHRvQmluZGluZyA9IG5ldyAoT0RhdGFMaXN0QmluZGluZyBhcyBhbnkpKG9CaW5kaW5nLm9Nb2RlbCwgXCJcIiwgb0JpbmRpbmcub01vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNDb250ZXh0UGF0aCkpO1xuXHRcdFx0XHRcdGNvbnN0IF9zZXRMaXN0QmluZGluZ0FzeW5jID0gKCkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKG9CaW5kaW5nLmdldENvbnRleHRzKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnBhZ2luYXRvci5pbml0aWFsaXplKG9CaW5kaW5nLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdG9CaW5kaW5nLmRldGFjaEV2ZW50KFwiY2hhbmdlXCIsIF9zZXRMaXN0QmluZGluZ0FzeW5jKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdG9CaW5kaW5nLmdldENvbnRleHRzKDApO1xuXHRcdFx0XHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50KFwiY2hhbmdlXCIsIF9zZXRMaXN0QmluZGluZ0FzeW5jKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoISh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkudXNlTmV3TGF6eUxvYWRpbmcgJiYgb09iamVjdFBhZ2UuZ2V0RW5hYmxlTGF6eUxvYWRpbmcoKSkge1xuXHRcdFx0Y29uc3QgYVNlY3Rpb25zID0gb09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKTtcblx0XHRcdGNvbnN0IGJVc2VJY29uVGFiQmFyID0gb09iamVjdFBhZ2UuZ2V0VXNlSWNvblRhYkJhcigpO1xuXHRcdFx0bGV0IGlTa2lwID0gMjtcblx0XHRcdGNvbnN0IGJJc0luRWRpdE1vZGUgPSBvT2JqZWN0UGFnZS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIik7XG5cdFx0XHRjb25zdCBiRWRpdGFibGVIZWFkZXIgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmVkaXRhYmxlSGVhZGVyQ29udGVudDtcblx0XHRcdGZvciAobGV0IGlTZWN0aW9uID0gMDsgaVNlY3Rpb24gPCBhU2VjdGlvbnMubGVuZ3RoOyBpU2VjdGlvbisrKSB7XG5cdFx0XHRcdGNvbnN0IG9TZWN0aW9uID0gYVNlY3Rpb25zW2lTZWN0aW9uXTtcblx0XHRcdFx0Y29uc3QgYVN1YlNlY3Rpb25zID0gb1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKTtcblx0XHRcdFx0Zm9yIChsZXQgaVN1YlNlY3Rpb24gPSAwOyBpU3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IGlTdWJTZWN0aW9uKyssIGlTa2lwLS0pIHtcblx0XHRcdFx0XHQvLyBJbiBJY29uVGFiQmFyIG1vZGUga2VlcCB0aGUgc2Vjb25kIHNlY3Rpb24gYm91bmQgaWYgdGhlcmUgaXMgYW4gZWRpdGFibGUgaGVhZGVyIGFuZCB3ZSBhcmUgc3dpdGNoaW5nIHRvIGRpc3BsYXkgbW9kZVxuXHRcdFx0XHRcdGlmIChpU2tpcCA8IDEgfHwgKGJVc2VJY29uVGFiQmFyICYmIChpU2VjdGlvbiA+IDEgfHwgKGlTZWN0aW9uID09PSAxICYmICFiRWRpdGFibGVIZWFkZXIgJiYgIWJJc0luRWRpdE1vZGUpKSkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9TdWJTZWN0aW9uID0gYVN1YlNlY3Rpb25zW2lTdWJTZWN0aW9uXTtcblx0XHRcdFx0XHRcdGlmIChvU3ViU2VjdGlvbi5kYXRhKCkuaXNWaXNpYmlsaXR5RHluYW1pYyAhPT0gXCJ0cnVlXCIpIHtcblx0XHRcdFx0XHRcdFx0b1N1YlNlY3Rpb24uc2V0QmluZGluZ0NvbnRleHQobnVsbCBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLnBsYWNlaG9sZGVyLmlzUGxhY2Vob2xkZXJFbmFibGVkKCkgJiYgbVBhcmFtZXRlcnMuc2hvd1BsYWNlaG9sZGVyKSB7XG5cdFx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0Y29uc3Qgb05hdkNvbnRhaW5lciA9IChvVmlldy5nZXRQYXJlbnQoKSBhcyBhbnkpLm9Db250YWluZXIuZ2V0UGFyZW50KCk7XG5cdFx0XHRpZiAob05hdkNvbnRhaW5lcikge1xuXHRcdFx0XHRvTmF2Q29udGFpbmVyLnNob3dQbGFjZWhvbGRlcih7fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2dldEZpcnN0Q2xpY2thYmxlRWxlbWVudChvT2JqZWN0UGFnZTogYW55KSB7XG5cdFx0bGV0IG9GaXJzdENsaWNrYWJsZUVsZW1lbnQ7XG5cdFx0Y29uc3QgYUFjdGlvbnMgPSBvT2JqZWN0UGFnZS5nZXRIZWFkZXJUaXRsZSgpICYmIG9PYmplY3RQYWdlLmdldEhlYWRlclRpdGxlKCkuZ2V0QWN0aW9ucygpO1xuXHRcdGlmIChhQWN0aW9ucyAmJiBhQWN0aW9ucy5sZW5ndGgpIHtcblx0XHRcdG9GaXJzdENsaWNrYWJsZUVsZW1lbnQgPSBhQWN0aW9ucy5maW5kKGZ1bmN0aW9uIChvQWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0Ly8gRHVlIHRvIHRoZSBsZWZ0IGFsaWdubWVudCBvZiB0aGUgRHJhZnQgc3dpdGNoIGFuZCB0aGUgY29sbGFib3JhdGl2ZSBkcmFmdCBhdmF0YXIgY29udHJvbHNcblx0XHRcdFx0Ly8gdGhlcmUgaXMgYSBUb29sYmFyU3BhY2VyIGluIHRoZSBhY3Rpb25zIGFnZ3JlZ2F0aW9uIHdoaWNoIHdlIG5lZWQgdG8gZXhjbHVkZSBoZXJlIVxuXHRcdFx0XHRyZXR1cm4gIW9BY3Rpb24uaXNBKFwic2FwLm0uVG9vbGJhclNwYWNlclwiKSAmJiBvQWN0aW9uLmdldFZpc2libGUoKSAmJiBvQWN0aW9uLmdldEVuYWJsZWQoKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gb0ZpcnN0Q2xpY2thYmxlRWxlbWVudDtcblx0fVxuXG5cdF9nZXRGaXJzdEVtcHR5TWFuZGF0b3J5RmllbGRGcm9tU3ViU2VjdGlvbihhU3ViU2VjdGlvbnM6IGFueSkge1xuXHRcdGlmIChhU3ViU2VjdGlvbnMpIHtcblx0XHRcdGZvciAobGV0IHN1YlNlY3Rpb24gPSAwOyBzdWJTZWN0aW9uIDwgYVN1YlNlY3Rpb25zLmxlbmd0aDsgc3ViU2VjdGlvbisrKSB7XG5cdFx0XHRcdGNvbnN0IGFCbG9ja3MgPSBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0QmxvY2tzKCk7XG5cblx0XHRcdFx0aWYgKGFCbG9ja3MpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBibG9jayA9IDA7IGJsb2NrIDwgYUJsb2Nrcy5sZW5ndGg7IGJsb2NrKyspIHtcblx0XHRcdFx0XHRcdGxldCBhRm9ybUNvbnRhaW5lcnM7XG5cblx0XHRcdFx0XHRcdGlmIChhQmxvY2tzW2Jsb2NrXS5pc0EoXCJzYXAudWkubGF5b3V0LmZvcm0uRm9ybVwiKSkge1xuXHRcdFx0XHRcdFx0XHRhRm9ybUNvbnRhaW5lcnMgPSBhQmxvY2tzW2Jsb2NrXS5nZXRGb3JtQ29udGFpbmVycygpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRcdFx0YUJsb2Nrc1tibG9ja10uZ2V0Q29udGVudCAmJlxuXHRcdFx0XHRcdFx0XHRhQmxvY2tzW2Jsb2NrXS5nZXRDb250ZW50KCkgJiZcblx0XHRcdFx0XHRcdFx0YUJsb2Nrc1tibG9ja10uZ2V0Q29udGVudCgpLmlzQShcInNhcC51aS5sYXlvdXQuZm9ybS5Gb3JtXCIpXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0YUZvcm1Db250YWluZXJzID0gYUJsb2Nrc1tibG9ja10uZ2V0Q29udGVudCgpLmdldEZvcm1Db250YWluZXJzKCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChhRm9ybUNvbnRhaW5lcnMpIHtcblx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgZm9ybUNvbnRhaW5lciA9IDA7IGZvcm1Db250YWluZXIgPCBhRm9ybUNvbnRhaW5lcnMubGVuZ3RoOyBmb3JtQ29udGFpbmVyKyspIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBhRm9ybUVsZW1lbnRzID0gYUZvcm1Db250YWluZXJzW2Zvcm1Db250YWluZXJdLmdldEZvcm1FbGVtZW50cygpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChhRm9ybUVsZW1lbnRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBmb3JtRWxlbWVudCA9IDA7IGZvcm1FbGVtZW50IDwgYUZvcm1FbGVtZW50cy5sZW5ndGg7IGZvcm1FbGVtZW50KyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgYUZpZWxkcyA9IGFGb3JtRWxlbWVudHNbZm9ybUVsZW1lbnRdLmdldEZpZWxkcygpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFRoZSBmaXJzdCBmaWVsZCBpcyBub3QgbmVjZXNzYXJpbHkgYW4gSW5wdXRCYXNlIChlLmcuIGNvdWxkIGJlIGEgVGV4dClcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU28gd2UgbmVlZCB0byBjaGVjayB3aGV0aGVyIGl0IGhhcyBhIGdldFJlcXVpcmVkIG1ldGhvZFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChhRmllbGRzWzBdLmdldFJlcXVpcmVkICYmIGFGaWVsZHNbMF0uZ2V0UmVxdWlyZWQoKSAmJiAhYUZpZWxkc1swXS5nZXRWYWx1ZSgpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gYUZpZWxkc1swXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0TG9nLmRlYnVnKFwiRXJyb3Igd2hlbiBzZWFyY2hpbmcgZm9yIG1hbmRhb3RyeSBlbXB0eSBmaWVsZDogXCIgKyBlcnJvcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdF91cGRhdGVGb2N1c0luRWRpdE1vZGUoYVN1YlNlY3Rpb25zOiBhbnkpIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCkgYXMgT2JqZWN0UGFnZUxheW91dDtcblxuXHRcdGNvbnN0IG9NYW5kYXRvcnlGaWVsZCA9IHRoaXMuX2dldEZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZEZyb21TdWJTZWN0aW9uKGFTdWJTZWN0aW9ucyk7XG5cdFx0bGV0IG9GaWVsZFRvRm9jdXM6IGFueTtcblx0XHRpZiAob01hbmRhdG9yeUZpZWxkKSB7XG5cdFx0XHRvRmllbGRUb0ZvY3VzID0gb01hbmRhdG9yeUZpZWxkLmNvbnRlbnQuZ2V0Q29udGVudEVkaXQoKVswXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b0ZpZWxkVG9Gb2N1cyA9IChvT2JqZWN0UGFnZSBhcyBhbnkpLl9nZXRGaXJzdEVkaXRhYmxlSW5wdXQoKSB8fCB0aGlzLl9nZXRGaXJzdENsaWNrYWJsZUVsZW1lbnQob09iamVjdFBhZ2UpO1xuXHRcdH1cblxuXHRcdGlmIChvRmllbGRUb0ZvY3VzKSB7XG5cdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Ly8gV2Ugc2V0IHRoZSBmb2N1cyBpbiBhIHRpbWVlb3V0LCBvdGhlcndpc2UgdGhlIGZvY3VzIHNvbWV0aW1lcyBnb2VzIHRvIHRoZSBUYWJCYXJcblx0XHRcdFx0b0ZpZWxkVG9Gb2N1cy5mb2N1cygpO1xuXHRcdFx0fSwgMCk7XG5cdFx0fVxuXHR9XG5cblx0X2hhbmRsZVN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnQob0V2ZW50OiBhbnkpIHtcblx0XHRjb25zdCBvU3ViU2VjdGlvbiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWJTZWN0aW9uXCIpO1xuXHRcdG9TdWJTZWN0aW9uLnNldEJpbmRpbmdDb250ZXh0KHVuZGVmaW5lZCk7XG5cdH1cblxuXHRfb25CYWNrTmF2aWdhdGlvbkluRHJhZnQob0NvbnRleHQ6IGFueSkge1xuXHRcdGlmICh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkuY2hlY2tJZkJhY2tIYXNTYW1lQ29udGV4dCgpKSB7XG5cdFx0XHQvLyBCYWNrIG5hdiB3aWxsIGtlZXAgdGhlIHNhbWUgY29udGV4dCAtLT4gbm8gbmVlZCB0byBkaXNwbGF5IHRoZSBkaWFsb2dcblx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkcmFmdC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0ZHJhZnQuTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRfb25BZnRlckJpbmRpbmcob0JpbmRpbmdDb250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCkgYXMgT2JqZWN0UGFnZUxheW91dDtcblx0XHRjb25zdCBhVGFibGVzID0gdGhpcy5fZmluZFRhYmxlcygpO1xuXG5cdFx0dGhpcy5fc2lkZUVmZmVjdHMuY2xlYXJQcm9wZXJ0aWVzU3RhdHVzKCk7XG5cblx0XHQvLyBUT0RPOiB0aGlzIGlzIG9ubHkgYSB0ZW1wIHNvbHV0aW9uIGFzIGxvbmcgYXMgdGhlIG1vZGVsIGZpeCB0aGUgY2FjaGUgaXNzdWUgYW5kIHdlIHVzZSB0aGlzIGFkZGl0aW9uYWxcblx0XHQvLyBiaW5kaW5nIHdpdGggb3duUmVxdWVzdFxuXHRcdG9CaW5kaW5nQ29udGV4dCA9IG9PYmplY3RQYWdlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cblx0XHRsZXQgYUlCTkFjdGlvbnM6IGFueVtdID0gW107XG5cdFx0b09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvU2VjdGlvbjogYW55KSB7XG5cdFx0XHRvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TdWJTZWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0YUlCTkFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9TdWJTZWN0aW9uLCBhSUJOQWN0aW9ucyk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdC8vIEFzc2lnbiBpbnRlcm5hbCBiaW5kaW5nIGNvbnRleHRzIHRvIG9Gb3JtQ29udGFpbmVyOlxuXHRcdC8vIDEuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBhc3NpZ24gdGhlIGludGVybmFsIGJpbmRpbmcgY29udGV4dCB0byB0aGUgWE1MIGZyYWdtZW50XG5cdFx0Ly8gKEZvcm1Db250YWluZXIuZnJhZ21lbnQueG1sKSB5ZXQgLSBpdCBpcyB1c2VkIGFscmVhZHkgZm9yIHRoZSBkYXRhLXN0cnVjdHVyZS5cblx0XHQvLyAyLiBBbm90aGVyIHByb2JsZW0gaXMsIHRoYXQgRm9ybUNvbnRhaW5lcnMgYXNzaWduZWQgdG8gYSAnTW9yZUJsb2NrJyBkb2VzIG5vdCBoYXZlIGFuXG5cdFx0Ly8gaW50ZXJuYWwgbW9kZWwgY29udGV4dCBhdCBhbGwuXG5cblx0XHRhVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogYW55KSB7XG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVGFibGUuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKTtcblx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImNyZWF0aW9uUm93RmllbGRWYWxpZGl0eVwiLCB7fSk7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0N1c3RvbVZhbGlkaXR5XCIsIHt9KTtcblxuXHRcdFx0YUlCTkFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9UYWJsZSwgYUlCTkFjdGlvbnMpO1xuXHRcdFx0Ly8gdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIEJDUDogMjA4MDIxODAwNFxuXHRcdFx0Ly8gTmVlZCB0byBmaXggd2l0aCBCTEk6IEZJT1JJVEVDSFAxLTE1Mjc0XG5cdFx0XHQvLyBvbmx5IGZvciBlZGl0IG1vZGUsIHdlIGNsZWFyIHRoZSB0YWJsZSBjYWNoZVxuXHRcdFx0Ly8gV29ya2Fyb3VuZCBzdGFydHMgaGVyZSEhXG5cdFx0XHRjb25zdCBvVGFibGVSb3dCaW5kaW5nID0gb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0XHRcdGlmIChvVGFibGVSb3dCaW5kaW5nKSB7XG5cdFx0XHRcdGlmIChNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob1RhYmxlUm93QmluZGluZy5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKSkge1xuXHRcdFx0XHRcdC8vIGFwcGx5IGZvciBib3RoIGVkaXQgYW5kIGRpc3BsYXkgbW9kZSBpbiBzdGlja3lcblx0XHRcdFx0XHRvVGFibGVSb3dCaW5kaW5nLnJlbW92ZUNhY2hlc0FuZE1lc3NhZ2VzKFwiXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHQvLyBXb3JrYXJvdW5kIGVuZHMgaGVyZSEhXG5cblx0XHRcdC8vIFVwZGF0ZSAnZW5hYmxlZCcgcHJvcGVydHkgb2YgRGF0YUZpZWxkRm9yQWN0aW9uIGJ1dHRvbnMgb24gdGFibGUgdG9vbGJhclxuXHRcdFx0Ly8gVGhlIHNhbWUgaXMgYWxzbyBwZXJmb3JtZWQgb24gVGFibGUgc2VsZWN0aW9uQ2hhbmdlIGV2ZW50XG5cdFx0XHRjb25zdCBvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwID0gSlNPTi5wYXJzZShcblx0XHRcdFx0XHRDb21tb25IZWxwZXIucGFyc2VDdXN0b21EYXRhKERlbGVnYXRlVXRpbC5nZXRDdXN0b21EYXRhKG9UYWJsZSwgXCJvcGVyYXRpb25BdmFpbGFibGVNYXBcIikpIGFzIGFueVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRhU2VsZWN0ZWRDb250ZXh0cyA9IG9UYWJsZS5nZXRTZWxlY3RlZENvbnRleHRzKCk7XG5cblx0XHRcdENvbW1vblV0aWxzLnNldEFjdGlvbkVuYWJsZW1lbnQob0ludGVybmFsTW9kZWxDb250ZXh0LCBvQWN0aW9uT3BlcmF0aW9uQXZhaWxhYmxlTWFwLCBhU2VsZWN0ZWRDb250ZXh0cyk7XG5cdFx0fSk7XG5cdFx0Q29tbW9uVXRpbHMuZ2V0U2VtYW50aWNUYXJnZXRzRnJvbVBhZ2VNb2RlbCh0aGlzLCBcIl9wYWdlTW9kZWxcIik7XG5cdFx0Ly9SZXRyaWV2ZSBPYmplY3QgUGFnZSBoZWFkZXIgYWN0aW9ucyBmcm9tIE9iamVjdCBQYWdlIHRpdGxlIGNvbnRyb2xcblx0XHRjb25zdCBvT2JqZWN0UGFnZVRpdGxlID0gb09iamVjdFBhZ2UuZ2V0SGVhZGVyVGl0bGUoKTtcblx0XHRsZXQgYUlCTkhlYWRlckFjdGlvbnM6IGFueVtdID0gW107XG5cdFx0YUlCTkhlYWRlckFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9PYmplY3RQYWdlVGl0bGUsIGFJQk5IZWFkZXJBY3Rpb25zKTtcblx0XHRhSUJOQWN0aW9ucyA9IGFJQk5BY3Rpb25zLmNvbmNhdChhSUJOSGVhZGVyQWN0aW9ucyk7XG5cdFx0Q29tbW9uVXRpbHMudXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkoYUlCTkFjdGlvbnMsIHRoaXMuZ2V0VmlldygpKTtcblxuXHRcdGxldCBvTW9kZWw6IGFueSwgb0ZpbmFsVUlTdGF0ZTogYW55O1xuXG5cdFx0Ly8gVE9ETzogdGhpcyBzaG91bGQgYmUgbW92ZWQgaW50byBhbiBpbml0IGV2ZW50IG9mIHRoZSBNREMgdGFibGVzIChub3QgeWV0IGV4aXN0aW5nKSBhbmQgc2hvdWxkIGJlIHBhcnRcblx0XHQvLyBvZiBhbnkgY29udHJvbGxlciBleHRlbnNpb25cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gb1RhYmxlXG5cdFx0ICogQHBhcmFtIG9MaXN0QmluZGluZ1xuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGVuYWJsZUZhc3RDcmVhdGlvblJvdyhvVGFibGU6IGFueSwgb0xpc3RCaW5kaW5nOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9GYXN0Q3JlYXRpb25Sb3cgPSBvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKTtcblx0XHRcdGxldCBvRmFzdENyZWF0aW9uTGlzdEJpbmRpbmcsIG9GYXN0Q3JlYXRpb25Db250ZXh0O1xuXG5cdFx0XHRpZiAob0Zhc3RDcmVhdGlvblJvdykge1xuXHRcdFx0XHRvRmluYWxVSVN0YXRlXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0aWYgKG9GYXN0Q3JlYXRpb25Sb3cuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0XHRcdG9GYXN0Q3JlYXRpb25MaXN0QmluZGluZyA9IG9Nb2RlbC5iaW5kTGlzdChvTGlzdEJpbmRpbmcuZ2V0UGF0aCgpLCBvTGlzdEJpbmRpbmcuZ2V0Q29udGV4dCgpLCBbXSwgW10sIHtcblx0XHRcdFx0XHRcdFx0XHQkJHVwZGF0ZUdyb3VwSWQ6IFwiZG9Ob3RTdWJtaXRcIixcblx0XHRcdFx0XHRcdFx0XHQkJGdyb3VwSWQ6IFwiZG9Ob3RTdWJtaXRcIlxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0Ly8gV29ya2Fyb3VuZCBzdWdnZXN0ZWQgYnkgT0RhdGEgbW9kZWwgdjQgY29sbGVhZ3Vlc1xuXHRcdFx0XHRcdFx0XHRvRmFzdENyZWF0aW9uTGlzdEJpbmRpbmcucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdC8qIGRvIG5vdGhpbmcgKi9cblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0LypcbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvRmFzdENyZWF0aW9uTGlzdEJpbmRpbmcuaGFzUGVuZGluZ0NoYW5nZXMgPSBmdW5jdGlvbigpIHtcbiAgICBcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuICAgIFx0XHRcdFx0XHRcdFx0fTtcbiAgICBcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQqL1xuXG5cdFx0XHRcdFx0XHRcdG9GYXN0Q3JlYXRpb25Db250ZXh0ID0gb0Zhc3RDcmVhdGlvbkxpc3RCaW5kaW5nLmNyZWF0ZSgpO1xuXHRcdFx0XHRcdFx0XHRvRmFzdENyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG9GYXN0Q3JlYXRpb25Db250ZXh0KTtcblxuXHRcdFx0XHRcdFx0XHQvLyB0aGlzIGlzIG5lZWRlZCB0byBhdm9pZCBjb25zb2xlIGVycm9yXG5cdFx0XHRcdFx0XHRcdG9GYXN0Q3JlYXRpb25Db250ZXh0LmNyZWF0ZWQoKS5jYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLnRyYWNlKFwidHJhbnNpZW50IGZhc3QgY3JlYXRpb24gY29udGV4dCBkZWxldGVkXCIpO1xuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNvbXB1dGluZyB0aGUgZmluYWwgVUkgc3RhdGVcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyB0aGlzIHNob3VsZCBub3QgYmUgbmVlZGVkIGF0IHRoZSBhbGxcblx0XHQvKipcblx0XHQgKiBAcGFyYW0gb1RhYmxlXG5cdFx0ICovXG5cdFx0Y29uc3QgaGFuZGxlVGFibGVNb2RpZmljYXRpb25zID0gKG9UYWJsZTogYW55KSA9PiB7XG5cdFx0XHRjb25zdCBvQmluZGluZyA9IHRoaXMuX2dldFRhYmxlQmluZGluZyhvVGFibGUpLFxuXHRcdFx0XHRmbkhhbmRsZVRhYmxlUGF0Y2hFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0ZW5hYmxlRmFzdENyZWF0aW9uUm93KG9UYWJsZSwgb0JpbmRpbmcpO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRpZiAoIW9CaW5kaW5nKSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkV4cGVjdGVkIGJpbmRpbmcgbWlzc2luZyBmb3IgdGFibGU6IFwiICsgb1RhYmxlLmdldElkKCkpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvQmluZGluZy5vQ29udGV4dCkge1xuXHRcdFx0XHRmbkhhbmRsZVRhYmxlUGF0Y2hFdmVudHMoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGZuSGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGlmIChvQmluZGluZy5vQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0Zm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzKCk7XG5cdFx0XHRcdFx0XHRvQmluZGluZy5kZXRhY2hDaGFuZ2UoZm5IYW5kbGVDaGFuZ2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoQ2hhbmdlKGZuSGFuZGxlQ2hhbmdlKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0b01vZGVsID0gb0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCk7XG5cblx0XHRcdC8vIENvbXB1dGUgRWRpdCBNb2RlXG5cdFx0XHRvRmluYWxVSVN0YXRlID0gdGhpcy5fZWRpdEZsb3cuY29tcHV0ZUVkaXRNb2RlKG9CaW5kaW5nQ29udGV4dCk7XG5cblx0XHRcdGlmIChNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChvTW9kZWwuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRcdG9GaW5hbFVJU3RhdGVcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGNvbm5lY3QodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgd2FpdGluZyBmb3IgdGhlIGZpbmFsIFVJIFN0YXRlXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHVwZGF0ZSByZWxhdGVkIGFwcHMgb25jZSBEYXRhIGlzIHJlY2VpdmVkIGluIGNhc2Ugb2YgYmluZGluZyBjYWNoZSBpcyBub3QgYXZhaWxhYmxlXG5cdFx0XHQvLyBUT0RPOiB0aGlzIGlzIG9ubHkgYSB0ZW1wIHNvbHV0aW9uIHNpbmNlIHdlIG5lZWQgdG8gY2FsbCBfdXBkYXRlUmVsYXRlZEFwcHMgbWV0aG9kIG9ubHkgYWZ0ZXIgZGF0YSBmb3IgT2JqZWN0IFBhZ2UgaXMgcmVjZWl2ZWQgKGlmIHRoZXJlIGlzIG5vIGJpbmRpbmcpXG5cdFx0XHRpZiAob0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKS5vQ2FjaGUpIHtcblx0XHRcdFx0dGhpcy5fdXBkYXRlUmVsYXRlZEFwcHMoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGZuVXBkYXRlUmVsYXRlZEFwcHMgPSAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUmVsYXRlZEFwcHMoKTtcblx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLmRldGFjaERhdGFSZWNlaXZlZChmblVwZGF0ZVJlbGF0ZWRBcHBzKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0b0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKS5hdHRhY2hEYXRhUmVjZWl2ZWQoZm5VcGRhdGVSZWxhdGVkQXBwcyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vQXR0YWNoIHRoZSBwYXRjaCBzZW50IGFuZCBwYXRjaCBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHRcdGNvbnN0IG9CaW5kaW5nID0gKG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nICYmIG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkpIHx8IG9CaW5kaW5nQ29udGV4dDtcblxuXHRcdFx0Ly8gQXR0YWNoIHRoZSBldmVudCBoYW5kbGVyIG9ubHkgb25jZSB0byB0aGUgc2FtZSBiaW5kaW5nXG5cdFx0XHRpZiAodGhpcy5jdXJyZW50QmluZGluZyAhPT0gb0JpbmRpbmcpIHtcblx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnQoXCJwYXRjaFNlbnRcIiwgdGhpcy5lZGl0Rmxvdy5oYW5kbGVQYXRjaFNlbnQsIHRoaXMpO1xuXHRcdFx0XHR0aGlzLmN1cnJlbnRCaW5kaW5nID0gb0JpbmRpbmc7XG5cdFx0XHR9XG5cblx0XHRcdGFUYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAob1RhYmxlOiBhbnkpIHtcblx0XHRcdFx0Ly8gYWNjZXNzIGJpbmRpbmcgb25seSBhZnRlciB0YWJsZSBpcyBib3VuZFxuXHRcdFx0XHRUYWJsZVV0aWxzLndoZW5Cb3VuZChvVGFibGUpXG5cdFx0XHRcdFx0LnRoZW4oaGFuZGxlVGFibGVNb2RpZmljYXRpb25zKVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSB0YWJsZSB0byBiZSBib3VuZFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmICghKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS51c2VOZXdMYXp5TG9hZGluZykge1xuXHRcdFx0XHQvLyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgYmluZGluZyBpcyByZWFkeSBoZW5jZSBjYWxsaW5nIGl0IGluIG9uQWZ0ZXJCaW5kaW5nXG5cdFx0XHRcdChvT2JqZWN0UGFnZSBhcyBhbnkpLl90cmlnZ2VyVmlzaWJsZVN1YlNlY3Rpb25zRXZlbnRzKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBleHRlbnNpYmxlKE92ZXJyaWRlRXhlY3V0aW9uLkFmdGVyKVxuXHRvblBhZ2VSZWFkeShtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0Y29uc3Qgc2V0Rm9jdXMgPSAoKSA9PiB7XG5cdFx0XHQvLyBTZXQgdGhlIGZvY3VzIHRvIHRoZSBmaXJzdCBhY3Rpb24gYnV0dG9uLCBvciB0byB0aGUgZmlyc3QgZWRpdGFibGUgaW5wdXQgaWYgaW4gZWRpdGFibGUgbW9kZVxuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdFx0Y29uc3QgaXNJbkRpc3BsYXlNb2RlID0gIW9PYmplY3RQYWdlLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKTtcblxuXHRcdFx0aWYgKGlzSW5EaXNwbGF5TW9kZSkge1xuXHRcdFx0XHRjb25zdCBvRmlyc3RDbGlja2FibGVFbGVtZW50ID0gdGhpcy5fZ2V0Rmlyc3RDbGlja2FibGVFbGVtZW50KG9PYmplY3RQYWdlKTtcblx0XHRcdFx0aWYgKG9GaXJzdENsaWNrYWJsZUVsZW1lbnQpIHtcblx0XHRcdFx0XHRvRmlyc3RDbGlja2FibGVFbGVtZW50LmZvY3VzKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IG9TZWxlY3RlZFNlY3Rpb246IGFueSA9IENvcmUuYnlJZChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSk7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUZvY3VzSW5FZGl0TW9kZShvU2VsZWN0ZWRTZWN0aW9uLmdldFN1YlNlY3Rpb25zKCkpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0Ly8gQXBwbHkgYXBwIHN0YXRlIG9ubHkgYWZ0ZXIgdGhlIHBhZ2UgaXMgcmVhZHkgd2l0aCB0aGUgZmlyc3Qgc2VjdGlvbiBzZWxlY3RlZFxuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdC8vU2hvdyBwb3B1cCB3aGlsZSBuYXZpZ2F0aW5nIGJhY2sgZnJvbSBvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGRyYWZ0XG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0Y29uc3QgYklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCgob0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdFx0aWYgKCFiSXNTdGlja3lNb2RlKSB7XG5cdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigoKSA9PiB0aGlzLl9vbkJhY2tOYXZpZ2F0aW9uSW5EcmFmdChvQmluZGluZ0NvbnRleHQpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0LmdldEFwcFN0YXRlSGFuZGxlcigpXG5cdFx0XHQuYXBwbHlBcHBTdGF0ZSgpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5mb3JjZUZvY3VzKSB7XG5cdFx0XHRcdFx0c2V0Rm9jdXMoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoRXJyb3IpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2V0dGluZyB0aGUgZm9jdXNcIiwgRXJyb3IpO1xuXHRcdFx0fSk7XG5cblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJlcnJvck5hdmlnYXRpb25TZWN0aW9uRmxhZ1wiLCBmYWxzZSk7XG5cdFx0dGhpcy5fY2hlY2tEYXRhUG9pbnRUaXRsZUZvckV4dGVybmFsTmF2aWdhdGlvbigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgc3RhdHVzIG9mIGVkaXQgbW9kZSBmb3Igc3RpY2t5IHNlc3Npb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBUaGUgc3RhdHVzIG9mIGVkaXQgbW9kZSBmb3Igc3RpY2t5IHNlc3Npb25cblx0ICpcblx0ICpcblx0ICovXG5cdGdldFN0aWNreUVkaXRNb2RlKCkge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0ICYmICh0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIENvbnRleHQpO1xuXHRcdGxldCBiSXNTdGlja3lFZGl0TW9kZSA9IGZhbHNlO1xuXHRcdGlmIChvQmluZGluZ0NvbnRleHQpIHtcblx0XHRcdGNvbnN0IGJJc1N0aWNreU1vZGUgPSBNb2RlbEhlbHBlci5pc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQob0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCkgYXMgT0RhdGFNZXRhTW9kZWwpO1xuXHRcdFx0aWYgKGJJc1N0aWNreU1vZGUpIHtcblx0XHRcdFx0YklzU3RpY2t5RWRpdE1vZGUgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBiSXNTdGlja3lFZGl0TW9kZTtcblx0fVxuXG5cdF9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpIHtcblx0XHRyZXR1cm4gdGhpcy5ieUlkKFwiZmU6Ok9iamVjdFBhZ2VcIikgYXMgT2JqZWN0UGFnZUxheW91dDtcblx0fVxuXG5cdF9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbigpIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2VTdWJ0aXRsZSA9IG9PYmplY3RQYWdlLmdldEN1c3RvbURhdGEoKS5maW5kKGZ1bmN0aW9uIChvQ3VzdG9tRGF0YTogYW55KSB7XG5cdFx0XHRyZXR1cm4gb0N1c3RvbURhdGEuZ2V0S2V5KCkgPT09IFwiT2JqZWN0UGFnZVN1YnRpdGxlXCI7XG5cdFx0fSk7XG5cdFx0Y29uc3Qgb1RpdGxlSW5mbyA9IHtcblx0XHRcdHRpdGxlOiBvT2JqZWN0UGFnZS5kYXRhKFwiT2JqZWN0UGFnZVRpdGxlXCIpIHx8IFwiXCIsXG5cdFx0XHRzdWJ0aXRsZTogb09iamVjdFBhZ2VTdWJ0aXRsZSAmJiBvT2JqZWN0UGFnZVN1YnRpdGxlLmdldFZhbHVlKCksXG5cdFx0XHRpbnRlbnQ6IFwiXCIsXG5cdFx0XHRpY29uOiBcIlwiXG5cdFx0fTtcblxuXHRcdHJldHVybiBvVGl0bGVJbmZvO1xuXHR9XG5cblx0X2V4ZWN1dGVIZWFkZXJTaG9ydGN1dChzSWQ6IGFueSkge1xuXHRcdGNvbnN0IHNCdXR0b25JZCA9IHRoaXMuZ2V0VmlldygpLmdldElkKCkgKyBcIi0tXCIgKyBzSWQsXG5cdFx0XHRvQnV0dG9uID0gKHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCkuZ2V0SGVhZGVyVGl0bGUoKSBhcyBPYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlKVxuXHRcdFx0XHQuZ2V0QWN0aW9ucygpXG5cdFx0XHRcdC5maW5kKGZ1bmN0aW9uIChvRWxlbWVudDogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9FbGVtZW50LmdldElkKCkgPT09IHNCdXR0b25JZDtcblx0XHRcdFx0fSk7XG5cdFx0Q29tbW9uVXRpbHMuZmlyZUJ1dHRvblByZXNzKG9CdXR0b24pO1xuXHR9XG5cblx0X2V4ZWN1dGVGb290ZXJTaG9ydGN1dChzSWQ6IGFueSkge1xuXHRcdGNvbnN0IHNCdXR0b25JZCA9IHRoaXMuZ2V0VmlldygpLmdldElkKCkgKyBcIi0tXCIgKyBzSWQsXG5cdFx0XHRvQnV0dG9uID0gKHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCkuZ2V0Rm9vdGVyKCkgYXMgYW55KS5nZXRDb250ZW50KCkuZmluZChmdW5jdGlvbiAob0VsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0VsZW1lbnQuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgPT09IFwic2FwLm0uQnV0dG9uXCIgJiYgb0VsZW1lbnQuZ2V0SWQoKSA9PT0gc0J1dHRvbklkO1xuXHRcdFx0fSk7XG5cdFx0Q29tbW9uVXRpbHMuZmlyZUJ1dHRvblByZXNzKG9CdXR0b24pO1xuXHR9XG5cblx0X2V4ZWN1dGVUYWJTaG9ydEN1dChvRXhlY3V0aW9uOiBhbnkpIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCksXG5cdFx0XHRhU2VjdGlvbnMgPSBvT2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpLFxuXHRcdFx0aVNlY3Rpb25JbmRleE1heCA9IGFTZWN0aW9ucy5sZW5ndGggLSAxLFxuXHRcdFx0c0NvbW1hbmQgPSBvRXhlY3V0aW9uLm9Tb3VyY2UuZ2V0Q29tbWFuZCgpO1xuXHRcdGxldCBuZXdTZWN0aW9uLFxuXHRcdFx0aVNlbGVjdGVkU2VjdGlvbkluZGV4ID0gb09iamVjdFBhZ2UuaW5kZXhPZlNlY3Rpb24odGhpcy5ieUlkKG9PYmplY3RQYWdlLmdldFNlbGVjdGVkU2VjdGlvbigpKSBhcyBPYmplY3RQYWdlU2VjdGlvbik7XG5cdFx0aWYgKGlTZWxlY3RlZFNlY3Rpb25JbmRleCAhPT0gLTEgJiYgaVNlY3Rpb25JbmRleE1heCA+IDApIHtcblx0XHRcdGlmIChzQ29tbWFuZCA9PT0gXCJOZXh0VGFiXCIpIHtcblx0XHRcdFx0aWYgKGlTZWxlY3RlZFNlY3Rpb25JbmRleCA8PSBpU2VjdGlvbkluZGV4TWF4IC0gMSkge1xuXHRcdFx0XHRcdG5ld1NlY3Rpb24gPSBhU2VjdGlvbnNbKytpU2VsZWN0ZWRTZWN0aW9uSW5kZXhdO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBQcmV2aW91c1RhYlxuXHRcdFx0XHRpZiAoaVNlbGVjdGVkU2VjdGlvbkluZGV4ICE9PSAwKSB7XG5cdFx0XHRcdFx0bmV3U2VjdGlvbiA9IGFTZWN0aW9uc1stLWlTZWxlY3RlZFNlY3Rpb25JbmRleF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChuZXdTZWN0aW9uKSB7XG5cdFx0XHRcdG9PYmplY3RQYWdlLnNldFNlbGVjdGVkU2VjdGlvbihuZXdTZWN0aW9uKTtcblx0XHRcdFx0bmV3U2VjdGlvbi5mb2N1cygpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9nZXRGb290ZXJWaXNpYmlsaXR5KCkge1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3Qgc1ZpZXdJZCA9IHRoaXMuZ2V0VmlldygpLmdldElkKCk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIsIGZhbHNlKTtcblx0XHRzYXAudWlcblx0XHRcdC5nZXRDb3JlKClcblx0XHRcdC5nZXRNZXNzYWdlTWFuYWdlcigpXG5cdFx0XHQuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdGlmIChvTWVzc2FnZS52YWxpZGF0aW9uICYmIG9NZXNzYWdlLnR5cGUgPT09IFwiRXJyb3JcIiAmJiBvTWVzc2FnZS50YXJnZXQuaW5kZXhPZihzVmlld0lkKSA+IC0xKSB7XG5cdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdF9zaG93TWVzc2FnZVBvcG92ZXIoZXJyPzogYW55LCBvUmV0PzogYW55KSB7XG5cdFx0aWYgKGVycikge1xuXHRcdFx0TG9nLmVycm9yKGVycik7XG5cdFx0fVxuXHRcdGlmICghKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdENvbnRhaW5lcigpIGFzIGFueSkuZ2V0Q3VycmVudFBhZ2UoKS5pc0EoXCJzYXAubS5NZXNzYWdlUGFnZVwiKSkge1xuXHRcdFx0Y29uc3Qgb01lc3NhZ2VCdXR0b24gPSB0aGlzLmdldFZpZXcoKS5ieUlkKFwiZmU6OkZvb3RlckJhcjo6TWVzc2FnZUJ1dHRvblwiKSBhcyBhbnksXG5cdFx0XHRcdG9NZXNzYWdlUG9wb3ZlciA9IG9NZXNzYWdlQnV0dG9uLm9NZXNzYWdlUG9wb3Zlcixcblx0XHRcdFx0b0l0ZW1CaW5kaW5nID0gb01lc3NhZ2VQb3BvdmVyLmdldEJpbmRpbmcoXCJpdGVtc1wiKTtcblxuXHRcdFx0aWYgKG9JdGVtQmluZGluZy5nZXRMZW5ndGgoKSA+IDAgJiYgIW9NZXNzYWdlUG9wb3Zlci5pc09wZW4oKSkge1xuXHRcdFx0XHRvTWVzc2FnZUJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdFx0XHQvLyB3b3JrYXJvdW5kIHRvIGVuc3VyZSB0aGF0IG9NZXNzYWdlQnV0dG9uIGlzIHJlbmRlcmVkIHdoZW4gb3BlbkJ5IGlzIGNhbGxlZFxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRvTWVzc2FnZVBvcG92ZXIub3BlbkJ5KG9NZXNzYWdlQnV0dG9uKTtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvUmV0O1xuXHR9XG5cblx0X2VkaXREb2N1bWVudChvQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKTtcblx0XHRCdXN5TG9ja2VyLmxvY2sob01vZGVsKTtcblx0XHRyZXR1cm4gdGhpcy5lZGl0Rmxvdy5lZGl0RG9jdW1lbnQuYXBwbHkodGhpcy5lZGl0RmxvdywgW29Db250ZXh0XSkuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTW9kZWwpO1xuXHRcdH0pO1xuXHR9XG5cblx0X3NhdmVEb2N1bWVudChvQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKSxcblx0XHRcdGFXYWl0Q3JlYXRlRG9jdW1lbnRzOiBhbnlbXSA9IFtdO1xuXHRcdC8vIGluZGljYXRlcyBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcgcm93IGluIHRoZSBPUFxuXHRcdGxldCBiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IGZhbHNlO1xuXHRcdEJ1c3lMb2NrZXIubG9jayhvTW9kZWwpO1xuXHRcdHRoaXMuX2ZpbmRUYWJsZXMoKS5mb3JFYWNoKChvVGFibGU6IGFueSkgPT4ge1xuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSB0aGlzLl9nZXRUYWJsZUJpbmRpbmcob1RhYmxlKTtcblx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJzOiBhbnkgPSB7XG5cdFx0XHRcdGNyZWF0aW9uTW9kZTogb1RhYmxlLmRhdGEoXCJjcmVhdGlvbk1vZGVcIiksXG5cdFx0XHRcdGNyZWF0aW9uUm93OiBvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKSxcblx0XHRcdFx0Y3JlYXRlQXRFbmQ6IG9UYWJsZS5kYXRhKFwiY3JlYXRlQXRFbmRcIikgPT09IFwidHJ1ZVwiXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgYkNyZWF0ZURvY3VtZW50ID1cblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cgJiZcblx0XHRcdFx0bVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKSAmJlxuXHRcdFx0XHRPYmplY3Qua2V5cyhtUGFyYW1ldGVycy5jcmVhdGlvblJvdy5nZXRCaW5kaW5nQ29udGV4dCgpLmdldE9iamVjdCgpKS5sZW5ndGggPiAxO1xuXHRcdFx0aWYgKGJDcmVhdGVEb2N1bWVudCkge1xuXHRcdFx0XHQvLyB0aGUgYlNraXBTaWRlRWZmZWN0cyBpcyBhIHBhcmFtZXRlciBjcmVhdGVkIHdoZW4gd2UgY2xpY2sgdGhlIHNhdmUga2V5LiBJZiB3ZSBwcmVzcyB0aGlzIGtleVxuXHRcdFx0XHQvLyB3ZSBkb24ndCBleGVjdXRlIHRoZSBoYW5kbGVTaWRlRWZmZWN0cyBmdW5jaXRvbiB0byBhdm9pZCBiYXRjaCByZWR1bmRhbmN5XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmJTa2lwU2lkZUVmZmVjdHMgPSB0cnVlO1xuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvciA9IHRydWU7XG5cdFx0XHRcdGFXYWl0Q3JlYXRlRG9jdW1lbnRzLnB1c2goXG5cdFx0XHRcdFx0dGhpcy5lZGl0Rmxvdy5jcmVhdGVEb2N1bWVudChvQmluZGluZywgbVBhcmFtZXRlcnMpLnRoZW4oZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9CaW5kaW5nO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKGFXYWl0Q3JlYXRlRG9jdW1lbnRzKVxuXHRcdFx0LnRoZW4oKGFCaW5kaW5nczogYW55W10pID0+IHtcblx0XHRcdFx0Y29uc3QgbVBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdFx0YkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3I6IGJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yLFxuXHRcdFx0XHRcdGJpbmRpbmdzOiBhQmluZGluZ3Ncblx0XHRcdFx0fTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZWRpdEZsb3cuc2F2ZURvY3VtZW50KG9Db250ZXh0LCBtUGFyYW1ldGVycykuY2F0Y2goKCkgPT4gdGhpcy5fc2hvd01lc3NhZ2VQb3BvdmVyKTtcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGlmIChCdXN5TG9ja2VyLmlzTG9ja2VkKG9Nb2RlbCkpIHtcblx0XHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTW9kZWwpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdF9tYW5hZ2VDb2xsYWJvcmF0aW9uKCkge1xuXHRcdG9wZW5NYW5hZ2VEaWFsb2codGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0X3Nob3dDb2xsYWJvcmF0aW9uVXNlckRldGFpbHMoZXZlbnQ6IGFueSkge1xuXHRcdHNob3dVc2VyRGV0YWlscyhldmVudCwgdGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0X2NhbmNlbERvY3VtZW50KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbik7IC8vdG8gZ2V0IHRoZSByZWZlcmVuY2Ugb2YgdGhlIGNhbmNlbCBidXR0b24gZnJvbSBjb21tYW5kIGV4ZWN1dGlvblxuXHRcdHJldHVybiB0aGlzLmVkaXRGbG93LmNhbmNlbERvY3VtZW50KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHRfYXBwbHlEb2N1bWVudChvQ29udGV4dDogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuZWRpdEZsb3cuYXBwbHlEb2N1bWVudChvQ29udGV4dCkuY2F0Y2goKCkgPT4gdGhpcy5fc2hvd01lc3NhZ2VQb3BvdmVyKCkpO1xuXHR9XG5cblx0X3Nob3dTd2l0Y2hEcmFmdEFuZEFjdGl2ZVBvcG92ZXIoZXZlbnQ6IEV2ZW50KSB7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuZ2V0VmlldygpLFxuXHRcdFx0c291cmNlID0gZXZlbnQuZ2V0U291cmNlKCksXG5cdFx0XHRmcmFnbWVudE5hbWUgPSBcInNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS52aWV3LmZyYWdtZW50cy5Td2l0Y2hEcmFmdEFuZEFjdGl2ZU9iamVjdFBvcE92ZXJcIjtcblxuXHRcdGlmICh0aGlzLnN3aXRjaERyYWZ0QW5kQWN0aXZlUG9wT3Zlcikge1xuXHRcdFx0dGhpcy5zd2l0Y2hEcmFmdEFuZEFjdGl2ZVBvcE92ZXIub3BlbkJ5KHNvdXJjZSwgZmFsc2UpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBsb2NhbFRoaXNNb2RlbCA9IG5ldyBKU09OTW9kZWwoe30pLFxuXHRcdFx0XHRwcmVwcm9jZXNzb3JTZXR0aW5ncyA9IHtcblx0XHRcdFx0XHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRcdFx0XHRcdFwidGhpc1wiOiBsb2NhbFRoaXNNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIilcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0XCJ0aGlzXCI6IGxvY2FsVGhpc01vZGVsXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0Y29uc3QgcG9wb3ZlckZyYWdtZW50ID0gWE1MVGVtcGxhdGVQcm9jZXNzb3IubG9hZFRlbXBsYXRlKGZyYWdtZW50TmFtZSwgXCJmcmFnbWVudFwiKTtcblx0XHRcdFByb21pc2UucmVzb2x2ZShYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyhwb3BvdmVyRnJhZ21lbnQsIHsgbmFtZTogZnJhZ21lbnROYW1lIH0sIHByZXByb2Nlc3NvclNldHRpbmdzKSlcblx0XHRcdFx0LnRoZW4oKGZyYWdtZW50KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIEZyYWdtZW50LmxvYWQoeyBkZWZpbml0aW9uOiBmcmFnbWVudCwgY29udHJvbGxlcjogdGhpcyB9KTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oKHBvcG92ZXI6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHZpZXcuYWRkRGVwZW5kZW50KHBvcG92ZXIpO1xuXHRcdFx0XHRcdHBvcG92ZXIuc2V0TW9kZWwodmlldy5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpLCBcImkxOG5cIik7XG5cdFx0XHRcdFx0cG9wb3Zlci5zZXRQbGFjZW1lbnQoXCJCb3R0b21cIik7XG5cdFx0XHRcdFx0dGhpcy5zd2l0Y2hEcmFmdEFuZEFjdGl2ZVBvcE92ZXIgPSBwb3BvdmVyO1xuXHRcdFx0XHRcdHBvcG92ZXIuYXR0YWNoQWZ0ZXJPcGVuKCgpID0+IHtcblx0XHRcdFx0XHRcdC8vIFdoaWxlIHRoZSBsaXN0IGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgZG9jdW1lbnQgdmVyc2lvbiBpcyBlbXBoYXNpemVkIHdpdGggYSBibHVlXG5cdFx0XHRcdFx0XHQvLyBiYWNrZ3JvdW5kLCB3ZSBuZWVkIHRvIHByZS1mb2N1cyB0aGUgb3RoZXIgZW50cnlcblx0XHRcdFx0XHRcdGNvbnN0IGNvbnRleHQ6IGFueSA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRcdFx0XHRcdGlzQWN0aXZlRW50aXR5ID0gY29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eTtcblx0XHRcdFx0XHRcdGNvbnN0IHN3aXRjaERyYWZ0QW5kQWN0aXZlT3B0aW9uc0xpc3Q6IFNlbGVjdExpc3QgPSAocG9wb3Zlci5nZXRDb250ZW50KCkgYXMgdW5rbm93biBhcyBDb250cm9sW10pLmZpbmQoXG5cdFx0XHRcdFx0XHRcdChlbGVtZW50KSA9PiBlbGVtZW50LmRhdGEoXCJsaXN0SWRlbnRpZmllclwiKSA9PT0gXCJzd2l0Y2hEcmFmdEFuZEFjdGl2ZVBvcG92ZXJMaXN0XCJcblx0XHRcdFx0XHRcdCkgYXMgU2VsZWN0TGlzdDtcblx0XHRcdFx0XHRcdGNvbnN0IGxpc3RJdGVtVG9Gb2N1czogSXRlbSA9IGlzQWN0aXZlRW50aXR5XG5cdFx0XHRcdFx0XHRcdD8gKHN3aXRjaERyYWZ0QW5kQWN0aXZlT3B0aW9uc0xpc3QuZ2V0SXRlbXMoKS5maW5kKChlbGVtZW50KSA9PiBlbGVtZW50LmdldEtleSgpID09PSBcInN3aXRjaFRvRHJhZnRcIikgYXMgSXRlbSlcblx0XHRcdFx0XHRcdFx0OiAoc3dpdGNoRHJhZnRBbmRBY3RpdmVPcHRpb25zTGlzdC5nZXRJdGVtcygpLmZpbmQoKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0S2V5KCkgPT09IFwic3dpdGNoVG9BY3RpdmVcIikgYXMgSXRlbSk7XG5cdFx0XHRcdFx0XHRsaXN0SXRlbVRvRm9jdXMuZm9jdXMoKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRwb3BvdmVyLm9wZW5CeShzb3VyY2UpO1xuXHRcdFx0XHRcdC8vIGVuc3VyZSB0byByZW1vdmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgZHJhZnQgcG9wb3ZlciBhcyBpdCB3b3VsZCBiZSBkZXN0cm95ZWQgb24gZXhpdFxuXHRcdFx0XHRcdHZpZXcuYXR0YWNoRXZlbnRPbmNlKFwiYmVmb3JlRXhpdFwiLCAoKSA9PiB7XG5cdFx0XHRcdFx0XHRkZWxldGUgdGhpcy5zd2l0Y2hEcmFmdEFuZEFjdGl2ZVBvcE92ZXI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoRXJyb3IpIHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBvcGVuaW5nIHRoZSBkcmFmdCBzd2l0Y2ggcG9wdXBcIiwgRXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRfc3dpdGNoRHJhZnRBbmRBY3RpdmVQb3BvdmVyTGlzdFNlbGVjdChldmVudDogRXZlbnQpIHtcblx0XHRjb25zdCBjb250ZXh0OiBhbnkgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0c2VsZWN0ZWRJdGVtS2V5ID0gZXZlbnQuZ2V0UGFyYW1ldGVyKFwiaXRlbVwiKS5nZXRQcm9wZXJ0eShcImtleVwiKSxcblx0XHRcdGlzQWN0aXZlRW50aXR5ID0gY29udGV4dC5nZXRPYmplY3QoKS5Jc0FjdGl2ZUVudGl0eTtcblx0XHQvLyBJdCB3YXMgZGVjaWRlZCB0aGF0IHdlIHNob3VsZCBOT1Qgc2V0IHRoZSBlbnRyeSBpbiB0aGUgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGRvY3VtZW50IHZlcnNpb24gdG9cblx0XHQvLyBkaXNhYmxlZCwgaGVuY2UgdGhlIHVzZXIgY2FuIGNsaWNrIGVudHJpZXMgd2hpY2ggdG8gbm90IGNhdXNlIGFuIGFjdGlvbiAoY2xpY2tpbmcgXCJEcmFmdFwiIHdoZW4geW91IGFscmVhZHkgZGlzcGxheSB0aGVcblx0XHQvLyBkcmFmdCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudClcblx0XHQvLyBIZW5jZSB3ZSBjaGVjayBoZXJlIHdoaWNoIGVudHJ5IGluIHRoZSBsaXN0IHdhcyBjbGlja2VkIGFuZCB3aGljaCBkb2N1bWVudCB2ZXJzaW9uIHdlIGN1cnJlbnRseSBkaXNwbGF5IGFuZCBvbmx5IGRvXG5cdFx0Ly8gdGhlIHN3aXRjaCBiZXR3ZWVuIGRyYWZ0IC8gYWN0aXZlIHZlcnNpb24gaWYgaXQgbWFrZXMgc2Vuc2UuXG5cdFx0aWYgKChpc0FjdGl2ZUVudGl0eSAmJiBzZWxlY3RlZEl0ZW1LZXkgPT09IFwic3dpdGNoVG9EcmFmdFwiKSB8fCAoIWlzQWN0aXZlRW50aXR5ICYmIHNlbGVjdGVkSXRlbUtleSA9PT0gXCJzd2l0Y2hUb0FjdGl2ZVwiKSkge1xuXHRcdFx0dGhpcy5lZGl0Rmxvdy50b2dnbGVEcmFmdEFjdGl2ZShjb250ZXh0KTtcblx0XHR9XG5cdFx0KChldmVudC5nZXRTb3VyY2UoKSBhcyBDb250cm9sKS5nZXRQYXJlbnQoKSBhcyBQb3BvdmVyKS5jbG9zZSgpO1xuXHR9XG5cblx0X3VwZGF0ZVJlbGF0ZWRBcHBzKCkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRpZiAoQ29tbW9uVXRpbHMucmVzb2x2ZVN0cmluZ3RvQm9vbGVhbihvT2JqZWN0UGFnZS5kYXRhKFwic2hvd1JlbGF0ZWRBcHBzXCIpKSkge1xuXHRcdFx0Q29tbW9uVXRpbHMudXBkYXRlUmVsYXRlZEFwcHNEZXRhaWxzKG9PYmplY3RQYWdlKTtcblx0XHR9XG5cdH1cblxuXHRfZmluZFRhYmxlSW5TdWJTZWN0aW9uKGFQYXJlbnRFbGVtZW50OiBhbnksIGFTdWJzZWN0aW9uOiBhbnksIGFUYWJsZXM6IGFueSkge1xuXHRcdGNvbnN0IGFTdWJTZWN0aW9uVGFibGVzID0gW107XG5cdFx0Zm9yIChsZXQgZWxlbWVudCA9IDA7IGVsZW1lbnQgPCBhUGFyZW50RWxlbWVudC5sZW5ndGg7IGVsZW1lbnQrKykge1xuXHRcdFx0bGV0IG9FbGVtZW50ID0gYVBhcmVudEVsZW1lbnRbZWxlbWVudF0uZ2V0Q29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIGFQYXJlbnRFbGVtZW50W2VsZW1lbnRdLmdldENvbnRlbnQoKTtcblx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBKFwic2FwLnVpLmxheW91dC5EeW5hbWljU2lkZUNvbnRlbnRcIikpIHtcblx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudC5nZXRNYWluQ29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIG9FbGVtZW50LmdldE1haW5Db250ZW50KCk7XG5cdFx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudFswXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50LmlzQSAmJiBvRWxlbWVudC5pc0EoXCJzYXAuZmUubWFjcm9zLlRhYmxlQVBJXCIpKSB7XG5cdFx0XHRcdG9FbGVtZW50ID0gb0VsZW1lbnQuZ2V0Q29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIG9FbGVtZW50LmdldENvbnRlbnQoKTtcblx0XHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRvRWxlbWVudCA9IG9FbGVtZW50WzBdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQuaXNBICYmIG9FbGVtZW50LmlzQShcInNhcC51aS5tZGMuVGFibGVcIikpIHtcblx0XHRcdFx0YVRhYmxlcy5wdXNoKG9FbGVtZW50KTtcblx0XHRcdFx0YVN1YlNlY3Rpb25UYWJsZXMucHVzaCh7XG5cdFx0XHRcdFx0XCJ0YWJsZVwiOiBvRWxlbWVudCxcblx0XHRcdFx0XHRcImdyaWRUYWJsZVwiOiBvRWxlbWVudC5nZXRUeXBlKCkuaXNBKFwic2FwLnVpLm1kYy50YWJsZS5HcmlkVGFibGVUeXBlXCIpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoXG5cdFx0XHRhU3ViU2VjdGlvblRhYmxlcy5sZW5ndGggPT09IDEgJiZcblx0XHRcdGFQYXJlbnRFbGVtZW50Lmxlbmd0aCA9PT0gMSAmJlxuXHRcdFx0YVN1YlNlY3Rpb25UYWJsZXNbMF0uZ3JpZFRhYmxlICYmXG5cdFx0XHQhYVN1YnNlY3Rpb24uaGFzU3R5bGVDbGFzcyhcInNhcFV4QVBPYmplY3RQYWdlU3ViU2VjdGlvbkZpdENvbnRhaW5lclwiKVxuXHRcdCkge1xuXHRcdFx0Ly9JbiBjYXNlIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgdGFibGUgaW4gYSBzZWN0aW9uIHdlIGZpdCB0aGF0IHRvIHRoZSB3aG9sZSBwYWdlIHNvIHRoYXQgdGhlIHNjcm9sbGJhciBjb21lcyBvbmx5IG9uIHRhYmxlIGFuZCBub3Qgb24gcGFnZVxuXHRcdFx0YVN1YnNlY3Rpb24uYWRkU3R5bGVDbGFzcyhcInNhcFV4QVBPYmplY3RQYWdlU3ViU2VjdGlvbkZpdENvbnRhaW5lclwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGFTdWJTZWN0aW9uVGFibGVzICYmICFhU3Vic2VjdGlvbi5oYXNTdHlsZUNsYXNzKFwic2FwVXhBUE9iamVjdFBhZ2VTdWJTZWN0aW9uRml0Q29udGFpbmVyXCIpKSB7XG5cdFx0XHRcdGFTdWJTZWN0aW9uVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKG9UYWJsZTogeyB0YWJsZTogYW55OyBncmlkVGFibGU6IGFueSB9KSB7XG5cdFx0XHRcdFx0aWYgKG9UYWJsZS5ncmlkVGFibGUpIHtcblx0XHRcdFx0XHRcdC8vUmVzZXR0aW5nIHRoZSByb3cgY291bnQgdG8gZGVmYXVsdCB2YWx1ZSBpbiBjYXNlIHdlIGhhdmUgYSBjb21iaW5hdGlvbiBvZiBmb3JtcyBhbmQgdGFibGVzIG9yIG11bHRpcGxlIHRhYmxlcyBpbiBhIHN1YnNlY3Rpb25cblx0XHRcdFx0XHRcdG9UYWJsZS50YWJsZS5nZXRUeXBlKCkuc2V0Um93Q291bnQobnVsbCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRfZ2V0QWxsU3ViU2VjdGlvbnMoKSB7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdGxldCBhU3ViU2VjdGlvbnM6IGFueVtdID0gW107XG5cdFx0b09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvU2VjdGlvbjogYW55KSB7XG5cdFx0XHRhU3ViU2VjdGlvbnMgPSBhU3ViU2VjdGlvbnMuY29uY2F0KG9TZWN0aW9uLmdldFN1YlNlY3Rpb25zKCkpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBhU3ViU2VjdGlvbnM7XG5cdH1cblxuXHRfZ2V0QWxsQmxvY2tzKCkge1xuXHRcdGxldCBhQmxvY2tzOiBhbnlbXSA9IFtdO1xuXHRcdHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCkuZm9yRWFjaChmdW5jdGlvbiAob1N1YlNlY3Rpb246IGFueSkge1xuXHRcdFx0YUJsb2NrcyA9IGFCbG9ja3MuY29uY2F0KG9TdWJTZWN0aW9uLmdldEJsb2NrcygpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gYUJsb2Nrcztcblx0fVxuXG5cdF9maW5kVGFibGVzKCkge1xuXHRcdGNvbnN0IGFTdWJTZWN0aW9ucyA9IHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCk7XG5cdFx0Y29uc3QgYVRhYmxlczogYW55W10gPSBbXTtcblx0XHRmb3IgKGxldCBzdWJTZWN0aW9uID0gMDsgc3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IHN1YlNlY3Rpb24rKykge1xuXHRcdFx0dGhpcy5fZmluZFRhYmxlSW5TdWJTZWN0aW9uKGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXS5nZXRCbG9ja3MoKSwgYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLCBhVGFibGVzKTtcblx0XHRcdHRoaXMuX2ZpbmRUYWJsZUluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0TW9yZUJsb2NrcygpLCBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0sIGFUYWJsZXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gYVRhYmxlcztcblx0fVxuXG5cdF9jbG9zZVNpZGVDb250ZW50KCkge1xuXHRcdHRoaXMuX2dldEFsbEJsb2NrcygpLmZvckVhY2goZnVuY3Rpb24gKG9CbG9jazogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udGVudCA9IG9CbG9jay5nZXRDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb0Jsb2NrLmdldENvbnRlbnQoKTtcblx0XHRcdGlmIChvQ29udGVudCAmJiBvQ29udGVudC5pc0EgJiYgb0NvbnRlbnQuaXNBKFwic2FwLnVpLmxheW91dC5EeW5hbWljU2lkZUNvbnRlbnRcIikpIHtcblx0XHRcdFx0aWYgKG9Db250ZW50LnNldFNob3dTaWRlQ29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0b0NvbnRlbnQuc2V0U2hvd1NpZGVDb250ZW50KGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYXJ0IENvbnRleHQgaXMgcmVzb2x2ZWQgZm9yIDE6biBtaWNyb2NoYXJ0cy5cblx0ICpcblx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwuQ29udGV4dH0gb0NoYXJ0Q29udGV4dCBUaGUgQ29udGV4dCBvZiB0aGUgTWljcm9DaGFydFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0NoYXJ0UGF0aCBUaGUgY29sbGVjdGlvblBhdGggb2YgdGhlIHRoZSBjaGFydFxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IEFycmF5IG9mIEF0dHJpYnV0ZXMgb2YgdGhlIGNoYXJ0IENvbnRleHRcblx0ICovXG5cdF9nZXRDaGFydENvbnRleHREYXRhKG9DaGFydENvbnRleHQ6IGFueSwgc0NoYXJ0UGF0aDogc3RyaW5nKSB7XG5cdFx0Y29uc3Qgb0NvbnRleHREYXRhID0gb0NoYXJ0Q29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRsZXQgb0NoYXJ0Q29udGV4dERhdGEgPSBbb0NvbnRleHREYXRhXTtcblx0XHRpZiAob0NoYXJ0Q29udGV4dCAmJiBzQ2hhcnRQYXRoKSB7XG5cdFx0XHRpZiAob0NvbnRleHREYXRhW3NDaGFydFBhdGhdKSB7XG5cdFx0XHRcdG9DaGFydENvbnRleHREYXRhID0gb0NvbnRleHREYXRhW3NDaGFydFBhdGhdO1xuXHRcdFx0XHRkZWxldGUgb0NvbnRleHREYXRhW3NDaGFydFBhdGhdO1xuXHRcdFx0XHRvQ2hhcnRDb250ZXh0RGF0YS5wdXNoKG9Db250ZXh0RGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvQ2hhcnRDb250ZXh0RGF0YTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTY3JvbGwgdGhlIHRhYmxlcyB0byB0aGUgcm93IHdpdGggdGhlIHNQYXRoXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlciNfc2Nyb2xsVGFibGVzVG9Sb3dcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNSb3dQYXRoICdzUGF0aCBvZiB0aGUgdGFibGUgcm93J1xuXHQgKlxuXHQgKi9cblxuXHRfc2Nyb2xsVGFibGVzVG9Sb3coc1Jvd1BhdGg6IHN0cmluZykge1xuXHRcdGlmICh0aGlzLl9maW5kVGFibGVzICYmIHRoaXMuX2ZpbmRUYWJsZXMoKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBhVGFibGVzID0gdGhpcy5fZmluZFRhYmxlcygpO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhVGFibGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFRhYmxlU2Nyb2xsZXIuc2Nyb2xsVGFibGVUb1JvdyhhVGFibGVzW2ldLCBzUm93UGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBtZXJnZSBzZWxlY3RlZCBjb250ZXh0cyBhbmQgZmlsdGVycy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9tZXJnZU11bHRpcGxlQ29udGV4dHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9QYWdlQ29udGV4dCBQYWdlIGNvbnRleHRcblx0ICogQHBhcmFtIHtvYmplY3R8QXJyYXl9IGFMaW5lQ29udGV4dCBTZWxlY3RlZCBDb250ZXh0c1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0NoYXJ0UGF0aCBDb2xsZWN0aW9uIG5hbWUgb2YgdGhlIGNoYXJ0XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNlbGVjdGlvbiBWYXJpYW50IE9iamVjdFxuXHQgKi9cblx0X21lcmdlTXVsdGlwbGVDb250ZXh0cyhvUGFnZUNvbnRleHQ6IENvbnRleHQsIGFMaW5lQ29udGV4dDogYW55W10sIHNDaGFydFBhdGg6IHN0cmluZykge1xuXHRcdGxldCBhQXR0cmlidXRlczogYW55W10gPSBbXSxcblx0XHRcdGFQYWdlQXR0cmlidXRlcyA9IFtdLFxuXHRcdFx0b0NvbnRleHQsXG5cdFx0XHRzTWV0YVBhdGhMaW5lOiBzdHJpbmcsXG5cdFx0XHRzUGF0aExpbmU7XG5cblx0XHRjb25zdCBzUGFnZVBhdGggPSBvUGFnZUNvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvUGFnZUNvbnRleHQgJiYgb1BhZ2VDb250ZXh0LmdldE1vZGVsKCkgJiYgKG9QYWdlQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpIGFzIE9EYXRhTWV0YU1vZGVsKTtcblx0XHRjb25zdCBzTWV0YVBhdGhQYWdlID0gb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYWdlUGF0aCkucmVwbGFjZSgvXlxcLyovLCBcIlwiKTtcblxuXHRcdC8vIEdldCBzaW5nbGUgbGluZSBjb250ZXh0IGlmIG5lY2Vzc2FyeVxuXHRcdGlmIChhTGluZUNvbnRleHQgJiYgYUxpbmVDb250ZXh0Lmxlbmd0aCkge1xuXHRcdFx0b0NvbnRleHQgPSBhTGluZUNvbnRleHRbMF07XG5cdFx0XHRzUGF0aExpbmUgPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRzTWV0YVBhdGhMaW5lID0gb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoTGluZSkucmVwbGFjZSgvXlxcLyovLCBcIlwiKTtcblxuXHRcdFx0YUxpbmVDb250ZXh0Lm1hcCgob1NpbmdsZUNvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoc0NoYXJ0UGF0aCkge1xuXHRcdFx0XHRcdGNvbnN0IG9DaGFydENvbnRleHREYXRhID0gdGhpcy5fZ2V0Q2hhcnRDb250ZXh0RGF0YShvU2luZ2xlQ29udGV4dCwgc0NoYXJ0UGF0aCk7XG5cdFx0XHRcdFx0aWYgKG9DaGFydENvbnRleHREYXRhKSB7XG5cdFx0XHRcdFx0XHRhQXR0cmlidXRlcyA9IG9DaGFydENvbnRleHREYXRhLm1hcChmdW5jdGlvbiAob0NoYXJ0Q29udGV4dERhdGE6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhOiBvQ2hhcnRDb250ZXh0RGF0YSxcblx0XHRcdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IHNNZXRhUGF0aFBhZ2UgKyBcIi9cIiArIHNDaGFydFBhdGhcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhQXR0cmlidXRlcy5wdXNoKHtcblx0XHRcdFx0XHRcdGNvbnRleHREYXRhOiBvU2luZ2xlQ29udGV4dC5nZXRPYmplY3QoKSxcblx0XHRcdFx0XHRcdGVudGl0eVNldDogc01ldGFQYXRoTGluZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0YVBhZ2VBdHRyaWJ1dGVzLnB1c2goe1xuXHRcdFx0Y29udGV4dERhdGE6IG9QYWdlQ29udGV4dC5nZXRPYmplY3QoKSxcblx0XHRcdGVudGl0eVNldDogc01ldGFQYXRoUGFnZVxuXHRcdH0pO1xuXHRcdC8vIEFkZGluZyBQYWdlIENvbnRleHQgdG8gc2VsZWN0aW9uIHZhcmlhbnRcblx0XHRhUGFnZUF0dHJpYnV0ZXMgPSBDb21tb25VdGlscy5yZW1vdmVTZW5zaXRpdmVEYXRhKGFQYWdlQXR0cmlidXRlcywgb01ldGFNb2RlbCk7XG5cdFx0Y29uc3Qgb1BhZ2VMZXZlbFNWID0gQ29tbW9uVXRpbHMuYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQobmV3IFNlbGVjdGlvblZhcmlhbnQoKSwgYVBhZ2VBdHRyaWJ1dGVzLCB0aGlzLmdldFZpZXcoKSk7XG5cdFx0YUF0dHJpYnV0ZXMgPSBDb21tb25VdGlscy5yZW1vdmVTZW5zaXRpdmVEYXRhKGFBdHRyaWJ1dGVzLCBvTWV0YU1vZGVsKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VsZWN0aW9uVmFyaWFudDogb1BhZ2VMZXZlbFNWLFxuXHRcdFx0YXR0cmlidXRlczogYUF0dHJpYnV0ZXNcblx0XHR9O1xuXHR9XG5cblx0X2dldEJhdGNoR3JvdXBzRm9yVmlldygpIHtcblx0XHRjb25zdCBvVmlld0RhdGEgPSB0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSxcblx0XHRcdG9Db25maWd1cmF0aW9ucyA9IG9WaWV3RGF0YS5jb250cm9sQ29uZmlndXJhdGlvbixcblx0XHRcdGFDb25maWd1cmF0aW9ucyA9IG9Db25maWd1cmF0aW9ucyAmJiBPYmplY3Qua2V5cyhvQ29uZmlndXJhdGlvbnMpLFxuXHRcdFx0YUJhdGNoR3JvdXBzID0gW1wiJGF1dG8uSGVyb2VzXCIsIFwiJGF1dG8uRGVjb3JhdGlvblwiLCBcIiRhdXRvLldvcmtlcnNcIl07XG5cblx0XHRpZiAoYUNvbmZpZ3VyYXRpb25zICYmIGFDb25maWd1cmF0aW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0XHRhQ29uZmlndXJhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoc0tleTogYW55KSB7XG5cdFx0XHRcdGNvbnN0IG9Db25maWd1cmF0aW9uID0gb0NvbmZpZ3VyYXRpb25zW3NLZXldO1xuXHRcdFx0XHRpZiAob0NvbmZpZ3VyYXRpb24ucmVxdWVzdEdyb3VwSWQgPT09IFwiTG9uZ1J1bm5lcnNcIikge1xuXHRcdFx0XHRcdGFCYXRjaEdyb3Vwcy5wdXNoKFwiJGF1dG8uTG9uZ1J1bm5lcnNcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gYUJhdGNoR3JvdXBzO1xuXHR9XG5cblx0Lypcblx0ICogUmVzZXQgQnJlYWRjcnVtYiBsaW5rc1xuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtzYXAubS5CcmVhZGNydW1ic30gW29Tb3VyY2VdIHBhcmVudCBjb250cm9sXG5cdCAqIEBkZXNjcmlwdGlvbiBVc2VkIHdoZW4gY29udGV4dCBvZiB0aGUgb2JqZWN0cGFnZSBjaGFuZ2VzLlxuXHQgKiAgICAgICAgICAgICAgVGhpcyBldmVudCBjYWxsYmFjayBpcyBhdHRhY2hlZCB0byBtb2RlbENvbnRleHRDaGFuZ2Vcblx0ICogICAgICAgICAgICAgIGV2ZW50IG9mIHRoZSBCcmVhZGNydW1iIGNvbnRyb2wgdG8gY2F0Y2ggY29udGV4dCBjaGFuZ2UuXG5cdCAqICAgICAgICAgICAgICBUaGVuIGVsZW1lbnQgYmluZGluZyBhbmQgaHJlZnMgYXJlIHVwZGF0ZWQgZm9yIGVhY2ggTGluay5cblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBleHBlcmltZW50YWxcblx0ICovXG5cdF9zZXRCcmVhZGNydW1iTGlua3Mob1NvdXJjZTogYW55KSB7XG5cdFx0Y29uc3Qgb0NvbnRleHQgPSBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0aWYgKG9Db250ZXh0KSB7XG5cdFx0XHRjb25zdCBzTmV3UGF0aCA9IG9Db250ZXh0LmdldFBhdGgoKSxcblx0XHRcdFx0YVBhdGhQYXJ0cyA9IHNOZXdQYXRoLnNwbGl0KFwiL1wiKSxcblx0XHRcdFx0b01ldGFNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0XHRsZXQgc1BhdGggPSBcIlwiLFxuXHRcdFx0XHRpU2tpcFBhcmFtZXRlcml6ZWQgPSAwO1xuXG5cdFx0XHRhUGF0aFBhcnRzLnNoaWZ0KCk7XG5cdFx0XHRhUGF0aFBhcnRzLnNwbGljZSgtMSwgMSk7XG5cdFx0XHRhUGF0aFBhcnRzLmZvckVhY2goZnVuY3Rpb24gKHNQYXRoUGFydDogYW55LCBpOiBhbnkpIHtcblx0XHRcdFx0c1BhdGggKz0gXCIvXCIgKyBzUGF0aFBhcnQ7XG5cdFx0XHRcdGNvbnN0IG9Sb290Vmlld0NvbnRyb2xsZXIgPSBvQXBwQ29tcG9uZW50LmdldFJvb3RWaWV3Q29udHJvbGxlcigpIGFzIFJvb3RDb250YWluZXJCYXNlQ29udHJvbGxlcjtcblx0XHRcdFx0Y29uc3Qgc1BhcmFtZXRlclBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKTtcblx0XHRcdFx0Y29uc3QgYlJlc3VsdENvbnRleHQgPSBvTWV0YU1vZGVsLmdldE9iamVjdChzUGFyYW1ldGVyUGF0aCArIFwiL0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVzdWx0Q29udGV4dFwiKTtcblx0XHRcdFx0aWYgKGJSZXN1bHRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Ly8gV2UgZG9udCBuZWVkIHRvIGNyZWF0ZSBhIGJyZWFkY3J1bWIgZm9yIFBhcmFtZXRlciBwYXRoXG5cdFx0XHRcdFx0aVNraXBQYXJhbWV0ZXJpemVkID0gMTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBwV2FpdEZvclRpdGxlSGllYXJjaHlJbmZvID0gb1Jvb3RWaWV3Q29udHJvbGxlci5nZXRUaXRsZUluZm9Gcm9tUGF0aChzUGF0aCk7XG5cblx0XHRcdFx0cFdhaXRGb3JUaXRsZUhpZWFyY2h5SW5mb1xuXHRcdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvVGl0bGVIaWVhcmNoeUluZm86IGFueSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgaWR4ID0gaSAtIGlTa2lwUGFyYW1ldGVyaXplZCxcblx0XHRcdFx0XHRcdFx0b0xpbmsgPSBvU291cmNlLmdldExpbmtzKClbaWR4XSA/IG9Tb3VyY2UuZ2V0TGlua3MoKVtpZHhdIDogbmV3IExpbmsoKTtcblx0XHRcdFx0XHRcdC8vIHNDdXJyZW50RW50aXR5IGlzIGEgZmFsbGJhY2sgdmFsdWUgaW4gY2FzZSBvZiBlbXB0eSB0aXRsZVxuXHRcdFx0XHRcdFx0b0xpbmsuc2V0VGV4dChvVGl0bGVIaWVhcmNoeUluZm8uc3VidGl0bGUgfHwgb1RpdGxlSGllYXJjaHlJbmZvLnRpdGxlKTtcblx0XHRcdFx0XHRcdG9MaW5rLnNldEhyZWYob1RpdGxlSGllYXJjaHlJbmZvLmludGVudCk7XG5cdFx0XHRcdFx0XHRpZiAoIW9Tb3VyY2UuZ2V0TGlua3MoKVtpZHhdKSB7XG5cdFx0XHRcdFx0XHRcdG9Tb3VyY2UuYWRkTGluayhvTGluayk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBjb21wdXRpbmcgdGhlIHRpdGxlIGhpZXJhcmNoeVwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0X2NoZWNrRGF0YVBvaW50VGl0bGVGb3JFeHRlcm5hbE5hdmlnYXRpb24oKSB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IG9EYXRhUG9pbnRzID0gQ29tbW9uVXRpbHMuZ2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uKFxuXHRcdFx0b1ZpZXcuZ2V0Vmlld0RhdGEoKSxcblx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRPdXRib3VuZHMoKVxuXHRcdCk7XG5cdFx0Y29uc3Qgb1NoZWxsU2VydmljZXMgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFNoZWxsU2VydmljZXMoKTtcblx0XHRjb25zdCBvUGFnZUNvbnRleHQgPSBvVmlldyAmJiAob1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJpc0hlYWRlckRQTGlua1Zpc2libGVcIiwge30pO1xuXHRcdGlmIChvUGFnZUNvbnRleHQpIHtcblx0XHRcdG9QYWdlQ29udGV4dFxuXHRcdFx0XHQucmVxdWVzdE9iamVjdCgpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0Zm5HZXRMaW5rcyhvRGF0YVBvaW50cywgb0RhdGEpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIHRoZSBsaW5rcyBmcm9tIHRoZSBzaGVsbCBzZXJ2aWNlXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSBvRXJyb3Jcblx0XHQgKi9cblx0XHRmdW5jdGlvbiBmbk9uRXJyb3Iob0Vycm9yOiBhbnkpIHtcblx0XHRcdExvZy5lcnJvcihvRXJyb3IpO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGZuU2V0TGlua0VuYWJsZW1lbnQoaWQ6IHN0cmluZywgYVN1cHBvcnRlZExpbmtzOiBhbnkpIHtcblx0XHRcdGNvbnN0IHNMaW5rSWQgPSBpZDtcblx0XHRcdC8vIHByb2Nlc3MgdmlhYmxlIGxpbmtzIGZyb20gZ2V0TGlua3MgZm9yIGFsbCBkYXRhcG9pbnRzIGhhdmluZyBvdXRib3VuZFxuXHRcdFx0aWYgKGFTdXBwb3J0ZWRMaW5rcyAmJiBhU3VwcG9ydGVkTGlua3MubGVuZ3RoID09PSAxICYmIGFTdXBwb3J0ZWRMaW5rc1swXS5zdXBwb3J0ZWQpIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaXNIZWFkZXJEUExpbmtWaXNpYmxlL1wiICsgc0xpbmtJZCwgdHJ1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogQHBhcmFtIG9EYXRhUG9pbnRzXG5cdFx0ICogQHBhcmFtIG9QYWdlRGF0YVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIGZuR2V0TGlua3Mob0RhdGFQb2ludHM6IGFueSwgb1BhZ2VEYXRhOiBhbnkpIHtcblx0XHRcdGZvciAoY29uc3Qgc0lkIGluIG9EYXRhUG9pbnRzKSB7XG5cdFx0XHRcdGNvbnN0IG9EYXRhUG9pbnQgPSBvRGF0YVBvaW50c1tzSWRdO1xuXHRcdFx0XHRjb25zdCBvUGFyYW1zOiBhbnkgPSB7fTtcblx0XHRcdFx0Y29uc3Qgb0xpbmsgPSBvVmlldy5ieUlkKHNJZCk7XG5cdFx0XHRcdGlmICghb0xpbmspIHtcblx0XHRcdFx0XHQvLyBmb3IgZGF0YSBwb2ludHMgY29uZmlndXJlZCBpbiBhcHAgZGVzY3JpcHRvciBidXQgbm90IGFubm90YXRlZCBpbiB0aGUgaGVhZGVyXG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3Qgb0xpbmtDb250ZXh0ID0gb0xpbmsuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRcdFx0Y29uc3Qgb0xpbmtEYXRhOiBhbnkgPSBvTGlua0NvbnRleHQgJiYgb0xpbmtDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRsZXQgb01peGVkQ29udGV4dDogYW55ID0gbWVyZ2Uoe30sIG9QYWdlRGF0YSwgb0xpbmtEYXRhKTtcblx0XHRcdFx0Ly8gcHJvY2VzcyBzZW1hbnRpYyBvYmplY3QgbWFwcGluZ3Ncblx0XHRcdFx0aWYgKG9EYXRhUG9pbnQuc2VtYW50aWNPYmplY3RNYXBwaW5nKSB7XG5cdFx0XHRcdFx0Y29uc3QgYVNlbWFudGljT2JqZWN0TWFwcGluZyA9IG9EYXRhUG9pbnQuc2VtYW50aWNPYmplY3RNYXBwaW5nO1xuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbSBpbiBhU2VtYW50aWNPYmplY3RNYXBwaW5nKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvTWFwcGluZyA9IGFTZW1hbnRpY09iamVjdE1hcHBpbmdbaXRlbV07XG5cdFx0XHRcdFx0XHRjb25zdCBzTWFpblByb3BlcnR5ID0gb01hcHBpbmdbXCJMb2NhbFByb3BlcnR5XCJdW1wiJFByb3BlcnR5UGF0aFwiXTtcblx0XHRcdFx0XHRcdGNvbnN0IHNNYXBwZWRQcm9wZXJ0eSA9IG9NYXBwaW5nW1wiU2VtYW50aWNPYmplY3RQcm9wZXJ0eVwiXTtcblx0XHRcdFx0XHRcdGlmIChzTWFpblByb3BlcnR5ICE9PSBzTWFwcGVkUHJvcGVydHkpIHtcblx0XHRcdFx0XHRcdFx0aWYgKG9NaXhlZENvbnRleHQuaGFzT3duUHJvcGVydHkoc01haW5Qcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBvTmV3TWFwcGluZzogYW55ID0ge307XG5cdFx0XHRcdFx0XHRcdFx0b05ld01hcHBpbmdbc01hcHBlZFByb3BlcnR5XSA9IG9NaXhlZENvbnRleHRbc01haW5Qcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHRcdFx0b01peGVkQ29udGV4dCA9IG1lcmdlKHt9LCBvTWl4ZWRDb250ZXh0LCBvTmV3TWFwcGluZyk7XG5cdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIG9NaXhlZENvbnRleHRbc01haW5Qcm9wZXJ0eV07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAob01peGVkQ29udGV4dCkge1xuXHRcdFx0XHRcdGZvciAoY29uc3Qgc0tleSBpbiBvTWl4ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0XHRpZiAoc0tleS5pbmRleE9mKFwiX1wiKSAhPT0gMCAmJiBzS2V5LmluZGV4T2YoXCJvZGF0YS5jb250ZXh0XCIpID09PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRvUGFyYW1zW3NLZXldID0gb01peGVkQ29udGV4dFtzS2V5XTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gdmFsaWRhdGUgaWYgYSBsaW5rIG11c3QgYmUgcmVuZGVyZWRcblx0XHRcdFx0b1NoZWxsU2VydmljZXNcblx0XHRcdFx0XHQuaXNOYXZpZ2F0aW9uU3VwcG9ydGVkKFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0OiB7XG5cdFx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IG9EYXRhUG9pbnQuc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRcdFx0YWN0aW9uOiBvRGF0YVBvaW50LmFjdGlvblxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRwYXJhbXM6IG9QYXJhbXNcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRdKVxuXHRcdFx0XHRcdC50aGVuKChhTGlua3MpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBmblNldExpbmtFbmFibGVtZW50KHNJZCwgYUxpbmtzKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmbk9uRXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGhhbmRsZXJzID0ge1xuXHRcdG9uVGFibGVDb250ZXh0Q2hhbmdlKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb1NvdXJjZSA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdGxldCBvVGFibGU6IGFueTtcblx0XHRcdHRoaXMuX2ZpbmRUYWJsZXMoKS5zb21lKGZ1bmN0aW9uIChfb1RhYmxlOiBhbnkpIHtcblx0XHRcdFx0aWYgKF9vVGFibGUuZ2V0Um93QmluZGluZygpID09PSBvU291cmNlKSB7XG5cdFx0XHRcdFx0b1RhYmxlID0gX29UYWJsZTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3Qgb0N1cnJlbnRBY3Rpb25Qcm9taXNlID0gdGhpcy5fZWRpdEZsb3cuZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKTtcblx0XHRcdGlmIChvQ3VycmVudEFjdGlvblByb21pc2UpIHtcblx0XHRcdFx0bGV0IGFUYWJsZUNvbnRleHRzOiBhbnk7XG5cdFx0XHRcdGlmIChvVGFibGUuZ2V0VHlwZSgpLmdldE1ldGFkYXRhKCkuaXNBKFwic2FwLnVpLm1kYy50YWJsZS5HcmlkVGFibGVUeXBlXCIpKSB7XG5cdFx0XHRcdFx0YVRhYmxlQ29udGV4dHMgPSBvU291cmNlLmdldENvbnRleHRzKDApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFUYWJsZUNvbnRleHRzID0gb1NvdXJjZS5nZXRDdXJyZW50Q29udGV4dHMoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvL2lmIGNvbnRleHRzIGFyZSBub3QgZnVsbHkgbG9hZGVkIHRoZSBnZXRjb250ZXh0cyBmdW5jdGlvbiBhYm92ZSB3aWxsIHRyaWdnZXIgYSBuZXcgY2hhbmdlIGV2ZW50IGNhbGxcblx0XHRcdFx0aWYgKCFhVGFibGVDb250ZXh0c1swXSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRvQ3VycmVudEFjdGlvblByb21pc2Vcblx0XHRcdFx0XHQudGhlbigob0FjdGlvblJlc3BvbnNlOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGlmICghb0FjdGlvblJlc3BvbnNlIHx8IG9BY3Rpb25SZXNwb25zZS5jb250cm9sSWQgIT09IG9UYWJsZS5zSWQpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y29uc3Qgb0FjdGlvbkRhdGEgPSBvQWN0aW9uUmVzcG9uc2Uub0RhdGE7XG5cdFx0XHRcdFx0XHRjb25zdCBhS2V5cyA9IG9BY3Rpb25SZXNwb25zZS5rZXlzO1xuXHRcdFx0XHRcdFx0bGV0IGlOZXdJdGVtcCA9IC0xO1xuXHRcdFx0XHRcdFx0YVRhYmxlQ29udGV4dHMuZmluZChmdW5jdGlvbiAob1RhYmxlQ29udGV4dDogYW55LCBpOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb1RhYmxlRGF0YSA9IG9UYWJsZUNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJDb21wYXJlID0gYUtleXMuZXZlcnkoZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvVGFibGVEYXRhW3NLZXldID09PSBvQWN0aW9uRGF0YVtzS2V5XTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGlmIChiQ29tcGFyZSkge1xuXHRcdFx0XHRcdFx0XHRcdGlOZXdJdGVtcCA9IGk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIGJDb21wYXJlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRpZiAoaU5ld0l0ZW1wICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhRGlhbG9ncyA9IEluc3RhbmNlTWFuYWdlci5nZXRPcGVuRGlhbG9ncygpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nID1cblx0XHRcdFx0XHRcdFx0XHRhRGlhbG9ncy5sZW5ndGggPiAwID8gYURpYWxvZ3MuZmluZCgoZGlhbG9nKSA9PiBkaWFsb2cuZGF0YShcIkZ1bGxTY3JlZW5EaWFsb2dcIikgIT09IHRydWUpIDogbnVsbDtcblx0XHRcdFx0XHRcdFx0aWYgKG9EaWFsb2cpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBieSBkZXNpZ24sIGEgc2FwLm0uZGlhbG9nIHNldCB0aGUgZm9jdXMgdG8gdGhlIHByZXZpb3VzIGZvY3VzZWQgZWxlbWVudCB3aGVuIGNsb3NpbmcuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIHdhaXQgZm9yIHRoZSBkaWFsb2cgdG8gYmUgY2xvc2UgYmVmb3JlIHRvIGZvY3VzIGFub3RoZXIgZWxlbWVudFxuXHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuYXR0YWNoRXZlbnRPbmNlKFwiYWZ0ZXJDbG9zZVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvVGFibGUuZm9jdXNSb3coaU5ld0l0ZW1wLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRvVGFibGUuZm9jdXNSb3coaU5ld0l0ZW1wLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0aGlzLl9lZGl0Rmxvdy5kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNjcm9sbGluZyB0byB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtOiBcIiArIGVycik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHQvLyBmaXJlIE1vZGVsQ29udGV4dENoYW5nZSBvbiB0aGUgbWVzc2FnZSBidXR0b24gd2hlbmV2ZXIgdGhlIHRhYmxlIGNvbnRleHQgY2hhbmdlc1xuXHRcdFx0Y29uc3Qgb01lc3NhZ2VCdXR0b24gPSB0aGlzLmdldFZpZXcoKS5ieUlkKFwiZmU6OkZvb3RlckJhcjo6TWVzc2FnZUJ1dHRvblwiKTtcblx0XHRcdG9NZXNzYWdlQnV0dG9uLmZpcmVNb2RlbENvbnRleHRDaGFuZ2UoKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogSW52b2tlcyBhbiBhY3Rpb24gLSBib3VuZC91bmJvdW5kIGFuZCBzZXRzIHRoZSBwYWdlIGRpcnR5LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIG9WaWV3XG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkXG5cdFx0ICogQHBhcmFtIHttYXB9IFttUGFyYW1ldGVyc10gQ29udGFpbnMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuXHRcdCAqIEBwYXJhbSB7c2FwLnVpLm1vZGVsLm9kYXRhLnY0LkNvbnRleHR9IFttUGFyYW1ldGVycy5jb250ZXh0c10gTWFuZGF0b3J5IGZvciBhIGJvdW5kIGFjdGlvbiwgZWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gc2hhbGwgYmUgY2FsbGVkXG5cdFx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbH0gW21QYXJhbWV0ZXJzLm1vZGVsXSBNYW5kYXRvcnkgZm9yIGFuIHVuYm91bmQgYWN0aW9uOyBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuXHRcdCAqIEByZXR1cm5zIHtQcm9taXNlfVxuXHRcdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHRcdCAqIEBmaW5hbFxuXHRcdCAqL1xuXHRcdG9uQ2FsbEFjdGlvbihvVmlldzogYW55LCBzQWN0aW9uTmFtZTogc3RyaW5nLCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IG9WaWV3LmdldENvbnRyb2xsZXIoKTtcblx0XHRcdGNvbnN0IHRoYXQgPSBvQ29udHJvbGxlcjtcblx0XHRcdHJldHVybiBvQ29udHJvbGxlci5lZGl0Rmxvd1xuXHRcdFx0XHQuaW52b2tlQWN0aW9uKHNBY3Rpb25OYW1lLCBtUGFyYW1ldGVycylcblx0XHRcdFx0LnRoZW4odGhhdC5fc2hvd01lc3NhZ2VQb3BvdmVyLmJpbmQodGhhdCwgdW5kZWZpbmVkKSlcblx0XHRcdFx0LmNhdGNoKHRoYXQuX3Nob3dNZXNzYWdlUG9wb3Zlci5iaW5kKHRoYXQpKTtcblx0XHR9LFxuXHRcdG9uRGF0YVBvaW50VGl0bGVQcmVzc2VkKG9Db250cm9sbGVyOiBhbnksIG9Tb3VyY2U6IGFueSwgb01hbmlmZXN0T3V0Ym91bmQ6IGFueSwgc0NvbnRyb2xDb25maWc6IGFueSwgc0NvbGxlY3Rpb25QYXRoOiBhbnkpIHtcblx0XHRcdG9NYW5pZmVzdE91dGJvdW5kID0gdHlwZW9mIG9NYW5pZmVzdE91dGJvdW5kID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShvTWFuaWZlc3RPdXRib3VuZCkgOiBvTWFuaWZlc3RPdXRib3VuZDtcblx0XHRcdGNvbnN0IG9UYXJnZXRJbmZvID0gb01hbmlmZXN0T3V0Ym91bmRbc0NvbnRyb2xDb25maWddLFxuXHRcdFx0XHRhU2VtYW50aWNPYmplY3RNYXBwaW5nID0gQ29tbW9uVXRpbHMuZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nKG9UYXJnZXRJbmZvKSxcblx0XHRcdFx0b0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dCA9IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdFx0c01ldGFQYXRoID0gb0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dFxuXHRcdFx0XHRcdC5nZXRNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFNb2RlbCgpXG5cdFx0XHRcdFx0LmdldE1ldGFQYXRoKG9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGxldCBhTmF2aWdhdGlvbkRhdGEgPSBvQ29udHJvbGxlci5fZ2V0Q2hhcnRDb250ZXh0RGF0YShvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0LCBzQ29sbGVjdGlvblBhdGgpO1xuXHRcdFx0bGV0IGFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVycztcblxuXHRcdFx0YU5hdmlnYXRpb25EYXRhID0gYU5hdmlnYXRpb25EYXRhLm1hcChmdW5jdGlvbiAob05hdmlnYXRpb25EYXRhOiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRkYXRhOiBvTmF2aWdhdGlvbkRhdGEsXG5cdFx0XHRcdFx0bWV0YVBhdGg6IHNNZXRhUGF0aCArIChzQ29sbGVjdGlvblBhdGggPyBcIi9cIiArIHNDb2xsZWN0aW9uUGF0aCA6IFwiXCIpXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblx0XHRcdGlmIChvVGFyZ2V0SW5mbyAmJiBvVGFyZ2V0SW5mby5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdGNvbnN0IG9QYXJhbXMgPSBvVGFyZ2V0SW5mby5wYXJhbWV0ZXJzICYmIG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24uZ2V0T3V0Ym91bmRQYXJhbXMob1RhcmdldEluZm8ucGFyYW1ldGVycyk7XG5cdFx0XHRcdGlmIChPYmplY3Qua2V5cyhvUGFyYW1zKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzID0gb1BhcmFtcztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9UYXJnZXRJbmZvICYmIG9UYXJnZXRJbmZvLnNlbWFudGljT2JqZWN0ICYmIG9UYXJnZXRJbmZvLmFjdGlvbikge1xuXHRcdFx0XHRvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlKG9UYXJnZXRJbmZvLnNlbWFudGljT2JqZWN0LCBvVGFyZ2V0SW5mby5hY3Rpb24sIHtcblx0XHRcdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM6IGFOYXZpZ2F0aW9uRGF0YSxcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc6IGFTZW1hbnRpY09iamVjdE1hcHBpbmcsXG5cdFx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzOiBhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnNcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBUcmlnZ2VycyBhbiBvdXRib3VuZCBuYXZpZ2F0aW9uIHdoZW4gYSB1c2VyIGNob29zZXMgdGhlIGNoZXZyb24uXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRyb2xsZXJcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gc091dGJvdW5kVGFyZ2V0IE5hbWUgb2YgdGhlIG91dGJvdW5kIHRhcmdldCAobmVlZHMgdG8gYmUgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QpXG5cdFx0ICogQHBhcmFtIHtzYXAudWkubW9kZWwub2RhdGEudjQuQ29udGV4dH0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBjb250YWlucyB0aGUgZGF0YSBmb3IgdGhlIHRhcmdldCBhcHBcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gc0NyZWF0ZVBhdGggQ3JlYXRlIHBhdGggd2hlbiB0aGUgY2hldnJvbiBpcyBjcmVhdGVkLlxuXHRcdCAqIEByZXR1cm5zIHtQcm9taXNlfSBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkICg/Pz8gbWF5YmUgb25seSBvbmNlIGZpbmlzaGVkPylcblx0XHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0XHQgKiBAZmluYWxcblx0XHQgKi9cblx0XHRvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQob0NvbnRyb2xsZXI6IE9iamVjdFBhZ2VDb250cm9sbGVyLCBzT3V0Ym91bmRUYXJnZXQ6IHN0cmluZywgb0NvbnRleHQ6IGFueSwgc0NyZWF0ZVBhdGg6IHN0cmluZykge1xuXHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyLCBzT3V0Ym91bmRUYXJnZXQsIG9Db250ZXh0LCBzQ3JlYXRlUGF0aCk7XG5cdFx0fSxcblxuXHRcdG9uTmF2aWdhdGVDaGFuZ2UodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHQvL3dpbGwgYmUgY2FsbGVkIGFsd2F5cyB3aGVuIHdlIGNsaWNrIG9uIGEgc2VjdGlvbiB0YWJcblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdHRoaXMuYlNlY3Rpb25OYXZpZ2F0ZWQgPSB0cnVlO1xuXG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRvT2JqZWN0UGFnZS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIikgJiZcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5zZWN0aW9uTGF5b3V0ID09PSBcIlRhYnNcIiAmJlxuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJlcnJvck5hdmlnYXRpb25TZWN0aW9uRmxhZ1wiKSA9PT0gZmFsc2Vcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBvU3ViU2VjdGlvbiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWJTZWN0aW9uXCIpO1xuXHRcdFx0XHR0aGlzLl91cGRhdGVGb2N1c0luRWRpdE1vZGUoW29TdWJTZWN0aW9uXSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvblZhcmlhbnRTZWxlY3RlZDogZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0fSxcblx0XHRvblZhcmlhbnRTYXZlZDogZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0XHQvL1RPRE86IFNob3VsZCByZW1vdmUgdGhpcyBzZXRUaW1lT3V0IG9uY2UgVmFyaWFudCBNYW5hZ2VtZW50IHByb3ZpZGVzIGFuIGFwaSB0byBmZXRjaCB0aGUgY3VycmVudCB2YXJpYW50IGtleSBvbiBzYXZlXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdFx0fSwgNTAwKTtcblx0XHR9LFxuXHRcdG5hdmlnYXRlVG9TdWJTZWN0aW9uOiBmdW5jdGlvbiAob0NvbnRyb2xsZXI6IE9iamVjdFBhZ2VDb250cm9sbGVyLCB2RGV0YWlsQ29uZmlnOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9EZXRhaWxDb25maWcgPSB0eXBlb2YgdkRldGFpbENvbmZpZyA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2UodkRldGFpbENvbmZpZykgOiB2RGV0YWlsQ29uZmlnO1xuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuYnlJZChcImZlOjpPYmplY3RQYWdlXCIpIGFzIE9iamVjdFBhZ2VMYXlvdXQ7XG5cdFx0XHRsZXQgb1NlY3Rpb247XG5cdFx0XHRsZXQgb1N1YlNlY3Rpb247XG5cdFx0XHRpZiAob0RldGFpbENvbmZpZy5zZWN0aW9uSWQpIHtcblx0XHRcdFx0b1NlY3Rpb24gPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuYnlJZChvRGV0YWlsQ29uZmlnLnNlY3Rpb25JZCkgYXMgT2JqZWN0UGFnZVNlY3Rpb247XG5cdFx0XHRcdG9TdWJTZWN0aW9uID0gKFxuXHRcdFx0XHRcdG9EZXRhaWxDb25maWcuc3ViU2VjdGlvbklkXG5cdFx0XHRcdFx0XHQ/IG9Db250cm9sbGVyLmdldFZpZXcoKS5ieUlkKG9EZXRhaWxDb25maWcuc3ViU2VjdGlvbklkKVxuXHRcdFx0XHRcdFx0OiBvU2VjdGlvbiAmJiBvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpICYmIG9TZWN0aW9uLmdldFN1YlNlY3Rpb25zKClbMF1cblx0XHRcdFx0KSBhcyBPYmplY3RQYWdlU3ViU2VjdGlvbjtcblx0XHRcdH0gZWxzZSBpZiAob0RldGFpbENvbmZpZy5zdWJTZWN0aW9uSWQpIHtcblx0XHRcdFx0b1N1YlNlY3Rpb24gPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuYnlJZChvRGV0YWlsQ29uZmlnLnN1YlNlY3Rpb25JZCkgYXMgT2JqZWN0UGFnZVN1YlNlY3Rpb247XG5cdFx0XHRcdG9TZWN0aW9uID0gb1N1YlNlY3Rpb24gJiYgKG9TdWJTZWN0aW9uLmdldFBhcmVudCgpIGFzIE9iamVjdFBhZ2VTZWN0aW9uKTtcblx0XHRcdH1cblx0XHRcdGlmICghb1NlY3Rpb24gfHwgIW9TdWJTZWN0aW9uIHx8ICFvU2VjdGlvbi5nZXRWaXNpYmxlKCkgfHwgIW9TdWJTZWN0aW9uLmdldFZpc2libGUoKSkge1xuXHRcdFx0XHQoKG9Db250cm9sbGVyLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpIGFzIFJlc291cmNlTW9kZWwpLmdldFJlc291cmNlQnVuZGxlKCkgYXMgUHJvbWlzZTxSZXNvdXJjZUJ1bmRsZT4pXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9SZXNvdXJjZUJ1bmRsZSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc1RpdGxlID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFwiQ19ST1VUSU5HX05BVklHQVRJT05fRElTQUJMRURfVElUTEVcIixcblx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdFx0XHQob0NvbnRyb2xsZXIuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5lbnRpdHlTZXRcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3Ioc1RpdGxlKTtcblx0XHRcdFx0XHRcdE1lc3NhZ2VCb3guZXJyb3Ioc1RpdGxlKTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihlcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvT2JqZWN0UGFnZS5zY3JvbGxUb1NlY3Rpb24ob1N1YlNlY3Rpb24uZ2V0SWQoKSk7XG5cdFx0XHRcdC8vIHRyaWdnZXIgaWFwcCBzdGF0ZSBjaGFuZ2Vcblx0XHRcdFx0b09iamVjdFBhZ2UuZmlyZU5hdmlnYXRlKHtcblx0XHRcdFx0XHRzZWN0aW9uOiBvU2VjdGlvbixcblx0XHRcdFx0XHRzdWJTZWN0aW9uOiBvU3ViU2VjdGlvblxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uQ2hhcnRTZWxlY3Rpb25DaGFuZ2VkOiBmdW5jdGlvbiAob0V2ZW50OiBhbnkpIHtcblx0XHRcdENoYXJ0UnVudGltZS5mblVwZGF0ZUNoYXJ0KG9FdmVudCk7XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBPYmplY3RQYWdlQ29udHJvbGxlcjtcbiJdfQ==