@sapui5/sap.fe.templates 1.101.0 → 1.103.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/package.json +1 -1
  2. package/src/sap/fe/templates/.library +1 -1
  3. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +2 -2
  4. package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.ts +1 -1
  5. package/src/sap/fe/templates/Feedback.js +18 -18
  6. package/src/sap/fe/templates/Feedback.ts +12 -12
  7. package/src/sap/fe/templates/ListReport/ExtensionAPI.js +15 -15
  8. package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +19 -16
  9. package/src/sap/fe/templates/ListReport/ListReport.view.xml +107 -58
  10. package/src/sap/fe/templates/ListReport/ListReportController.controller.js +180 -70
  11. package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +191 -88
  12. package/src/sap/fe/templates/ListReport/ListReportTemplating.js +45 -0
  13. package/src/sap/fe/templates/ListReport/ListReportTemplating.ts +30 -0
  14. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +1 -1
  15. package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +2 -2
  16. package/src/sap/fe/templates/ListReport/overrides/Share.js +9 -7
  17. package/src/sap/fe/templates/ListReport/overrides/Share.ts +10 -10
  18. package/src/sap/fe/templates/ListReport/overrides/ViewState.js +13 -6
  19. package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +17 -11
  20. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +1 -1
  21. package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.ts +1 -1
  22. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +12 -16
  23. package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +17 -20
  24. package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +167 -20
  25. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +195 -206
  26. package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +187 -229
  27. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +861 -0
  28. package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +822 -0
  29. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +2 -3
  30. package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.ts +4 -4
  31. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +1 -1
  32. package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.ts +1 -1
  33. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +1 -1
  34. package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.ts +1 -1
  35. package/src/sap/fe/templates/ObjectPage/handler/DraftHandler.js +103 -0
  36. package/src/sap/fe/templates/ObjectPage/handler/DraftHandler.ts +97 -0
  37. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +1 -1
  38. package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +5 -5
  39. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +1 -1
  40. package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +2 -2
  41. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +1 -1
  42. package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.ts +2 -2
  43. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +1 -1
  44. package/src/sap/fe/templates/ObjectPage/overrides/Paginator.ts +1 -1
  45. package/src/sap/fe/templates/ObjectPage/overrides/Share.js +17 -17
  46. package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +19 -30
  47. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +2 -2
  48. package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +4 -4
  49. package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +15 -11
  50. package/src/sap/fe/templates/ObjectPage/view/fragments/CollaborationDraft.fragment.xml +1 -2
  51. package/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +25 -17
  52. package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +28 -24
  53. package/src/sap/fe/templates/ObjectPage/view/fragments/FormActionButtons.fragment.xml +15 -16
  54. package/src/sap/fe/templates/ObjectPage/view/fragments/FormActions.fragment.xml +1 -5
  55. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPoint.fragment.xml +1 -2
  56. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPointTitle.fragment.xml +1 -3
  57. package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacet.fragment.xml +3 -17
  58. package/src/sap/fe/templates/ObjectPage/view/fragments/Heading.fragment.xml +16 -17
  59. package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingTitle.fragment.xml +4 -3
  60. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderAddress.fragment.xml +7 -2
  61. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderContact.fragment.xml +26 -0
  62. package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +4 -4
  63. package/src/sap/fe/templates/ObjectPage/view/fragments/RelatedApps.fragment.xml +7 -4
  64. package/src/sap/fe/templates/ObjectPage/view/fragments/Section.fragment.xml +74 -6
  65. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContent.fragment.xml +118 -94
  66. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContentLazyLoader.fragment.xml +127 -107
  67. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionFormContent.fragment.xml +1 -0
  68. package/src/sap/fe/templates/ObjectPage/view/fragments/SectionMoreFormContent.fragment.xml +1 -0
  69. package/src/sap/fe/templates/ObjectPage/view/fragments/SwitchDraftAndActiveObjectPopOver.fragment.xml +2 -2
  70. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +102 -57
  71. package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +96 -61
  72. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +3 -4
  73. package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.ts +4 -5
  74. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +140 -52
  75. package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.ts +108 -54
  76. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +1 -1
  77. package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +3 -3
  78. package/src/sap/fe/templates/TableScroller.js +3 -3
  79. package/src/sap/fe/templates/TableScroller.ts +2 -2
  80. package/src/sap/fe/templates/controls/MacroChart.fragment.xml +1 -0
  81. package/src/sap/fe/templates/controls/Table.fragment.xml +4 -4
  82. package/src/sap/fe/templates/library.js +5 -2
  83. package/src/sap/fe/templates/library.ts +3 -0
  84. package/src/sap/fe/templates/messagebundle.properties +6 -18
  85. package/src/sap/fe/templates/messagebundle_ar.properties +10 -6
  86. package/src/sap/fe/templates/messagebundle_bg.properties +6 -2
  87. package/src/sap/fe/templates/messagebundle_ca.properties +10 -6
  88. package/src/sap/fe/templates/messagebundle_cs.properties +6 -2
  89. package/src/sap/fe/templates/messagebundle_cy.properties +10 -6
  90. package/src/sap/fe/templates/messagebundle_da.properties +10 -6
  91. package/src/sap/fe/templates/messagebundle_de.properties +10 -6
  92. package/src/sap/fe/templates/messagebundle_el.properties +10 -6
  93. package/src/sap/fe/templates/messagebundle_en.properties +6 -2
  94. package/src/sap/fe/templates/messagebundle_en_GB.properties +8 -4
  95. package/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +13 -5
  96. package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +7 -3
  97. package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +7 -3
  98. package/src/sap/fe/templates/messagebundle_es.properties +6 -2
  99. package/src/sap/fe/templates/messagebundle_es_MX.properties +10 -6
  100. package/src/sap/fe/templates/messagebundle_et.properties +6 -2
  101. package/src/sap/fe/templates/messagebundle_fi.properties +10 -6
  102. package/src/sap/fe/templates/messagebundle_fr.properties +6 -2
  103. package/src/sap/fe/templates/messagebundle_fr_CA.properties +10 -6
  104. package/src/sap/fe/templates/messagebundle_hi.properties +10 -6
  105. package/src/sap/fe/templates/messagebundle_hr.properties +10 -6
  106. package/src/sap/fe/templates/messagebundle_hu.properties +6 -2
  107. package/src/sap/fe/templates/messagebundle_id.properties +6 -2
  108. package/src/sap/fe/templates/messagebundle_it.properties +10 -6
  109. package/src/sap/fe/templates/messagebundle_iw.properties +10 -6
  110. package/src/sap/fe/templates/messagebundle_ja.properties +6 -2
  111. package/src/sap/fe/templates/messagebundle_kk.properties +10 -6
  112. package/src/sap/fe/templates/messagebundle_ko.properties +6 -2
  113. package/src/sap/fe/templates/messagebundle_lt.properties +6 -2
  114. package/src/sap/fe/templates/messagebundle_lv.properties +6 -2
  115. package/src/sap/fe/templates/messagebundle_ms.properties +10 -6
  116. package/src/sap/fe/templates/messagebundle_nl.properties +6 -2
  117. package/src/sap/fe/templates/messagebundle_no.properties +10 -6
  118. package/src/sap/fe/templates/messagebundle_pl.properties +10 -6
  119. package/src/sap/fe/templates/messagebundle_pt.properties +6 -2
  120. package/src/sap/fe/templates/messagebundle_pt_PT.properties +6 -2
  121. package/src/sap/fe/templates/messagebundle_ro.properties +10 -6
  122. package/src/sap/fe/templates/messagebundle_ru.properties +10 -6
  123. package/src/sap/fe/templates/messagebundle_sh.properties +6 -2
  124. package/src/sap/fe/templates/messagebundle_sk.properties +6 -2
  125. package/src/sap/fe/templates/messagebundle_sl.properties +10 -6
  126. package/src/sap/fe/templates/messagebundle_sv.properties +6 -2
  127. package/src/sap/fe/templates/messagebundle_th.properties +10 -6
  128. package/src/sap/fe/templates/messagebundle_tr.properties +6 -2
  129. package/src/sap/fe/templates/messagebundle_uk.properties +6 -2
  130. package/src/sap/fe/templates/messagebundle_vi.properties +10 -6
  131. package/src/sap/fe/templates/messagebundle_zh_CN.properties +10 -6
  132. package/src/sap/fe/templates/messagebundle_zh_TW.properties +10 -6
  133. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.js +0 -482
  134. package/src/sap/fe/templates/ObjectPage/AnnotationHelper.ts +0 -511
  135. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.js +0 -120
  136. package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.ts +0 -138
@@ -1,482 +0,0 @@
1
- /*!
2
- * SAP UI development toolkit for HTML5 (SAPUI5)
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
- */
5
- sap.ui.define(["sap/fe/macros/CommonHelper", "sap/ui/base/ManagedObject", "sap/ui/model/odata/v4/AnnotationHelper"], function (CommonHelper, ManagedObject, ODataModelAnnotationHelper) {
6
- "use strict";
7
-
8
- /*
9
- This class contains annotation helpers that might be used from several templates or controls
10
- */
11
- var AnnotationHelper = {
12
- getElementBinding: function (sPath) {
13
- var sNavigationPath = ODataModelAnnotationHelper.getNavigationPath(sPath);
14
-
15
- if (sNavigationPath) {
16
- return "{path:'" + sNavigationPath + "'}";
17
- } else {
18
- //no navigation property needs empty object
19
- return "{path: ''}";
20
- }
21
- },
22
-
23
- /**
24
- * Function to check if draft pattern is supported.
25
- *
26
- * @param {object} oAnnotations Annotations of the current entity set.
27
- * @returns {string} Returns the Boolean value based on draft state
28
- */
29
- checkDraftState: function (oAnnotations) {
30
- if (oAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"] && oAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"]["EditAction"]) {
31
- return true;
32
- } else {
33
- return false;
34
- }
35
- },
36
-
37
- /**
38
- * Function to get the visibility for the SwitchToActive button in the object page or subobject page.
39
- *
40
- * @param {object} oAnnotations Annotations of the current entity set.
41
- * @returns {string} Returns expression binding or Boolean value based on the draft state
42
- */
43
- getSwitchToActiveVisibility: function (oAnnotations) {
44
- if (this.checkDraftState(oAnnotations)) {
45
- return "{= (%{DraftAdministrativeData/DraftIsCreatedByMe}) ? ( ${ui>/isEditable} && !${ui>createMode} && %{DraftAdministrativeData/DraftIsCreatedByMe} ) : false }";
46
- } else {
47
- return false;
48
- }
49
- },
50
-
51
- /**
52
- * Function to get the visibility for the SwitchToDraft button in the object page or subobject page.
53
- *
54
- * @param {object} oAnnotations Annotations of the current entity set.
55
- * @returns {string} Returns expression binding or Boolean value based on the draft state
56
- */
57
- getSwitchToDraftVisibility: function (oAnnotations) {
58
- if (this.checkDraftState(oAnnotations)) {
59
- return "{= (%{DraftAdministrativeData/DraftIsCreatedByMe}) ? ( !(${ui>/isEditable}) && !${ui>createMode} && ${HasDraftEntity} && %{DraftAdministrativeData/DraftIsCreatedByMe} ) : false }";
60
- } else {
61
- return false;
62
- }
63
- },
64
-
65
- /**
66
- * Function to get the visibility for the SwitchDraftAndActive button in the object page or subobject page.
67
- *
68
- * @param {object} oAnnotations Annotations of the current entity set.
69
- * @returns {string} Returns expression binding or Boolean value based on the draft state
70
- */
71
- getSwitchDraftAndActiveVisibility: function (oAnnotations) {
72
- if (this.checkDraftState(oAnnotations)) {
73
- return "{= (%{DraftAdministrativeData/DraftIsCreatedByMe}) ? ( !${ui>createMode} && %{DraftAdministrativeData/DraftIsCreatedByMe} ) : false }";
74
- } else {
75
- return false;
76
- }
77
- },
78
-
79
- /**
80
- * Function to find an action from the array of header actions in the converter context.
81
- *
82
- * @param {object[]} aConverterContextHeaderActions Array of 'header' actions on the object page.
83
- * @param {string} sActionType The action type
84
- * @returns {object | undefined} The action with the matching action type
85
- * @private
86
- */
87
- _findAction: function (aConverterContextHeaderActions, sActionType) {
88
- var oAction;
89
-
90
- if (aConverterContextHeaderActions && aConverterContextHeaderActions.length) {
91
- oAction = aConverterContextHeaderActions.find(function (oHeaderAction) {
92
- return oHeaderAction.type === sActionType;
93
- });
94
- }
95
-
96
- return oAction;
97
- },
98
-
99
- /**
100
- * Function to format the 'enabled' property for the Delete button on the object page or subobject page in case of a Command Execution.
101
- *
102
- * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
103
- * @returns {string} Returns expression binding or Boolean value from the converter output
104
- */
105
- getDeleteCommandExecutionEnabled: function (aConverterContextHeaderActions) {
106
- var oDeleteAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Secondary");
107
-
108
- return oDeleteAction ? oDeleteAction.enabled : "true";
109
- },
110
-
111
- /**
112
- * Function to format the 'visible' property for the Delete button on the object page or subobject page in case of a Command Execution.
113
- *
114
- * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
115
- * @returns {string} Returns expression binding or Boolean value from the converter output
116
- */
117
- getDeleteCommandExecutionVisible: function (aConverterContextHeaderActions) {
118
- var oDeleteAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Secondary");
119
-
120
- return oDeleteAction ? oDeleteAction.visible : "true";
121
- },
122
-
123
- /**
124
- * Function to format the 'visible' property for the Edit button on the object page or subobject page in case of a Command Execution.
125
- *
126
- * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
127
- * @returns {string} Returns expression binding or Boolean value from the converter output
128
- */
129
- getEditCommandExecutionVisible: function (aConverterContextHeaderActions) {
130
- var oEditAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Primary");
131
-
132
- return oEditAction ? oEditAction.visible : "true";
133
- },
134
-
135
- /**
136
- * Function to format the 'enabled' property for the Edit button on the object page or subobject page in case of a Command Execution.
137
- *
138
- * @param {Array} aConverterContextHeaderActions Array of header actions on the object page
139
- * @returns {string} Returns expression binding or Boolean value from the converter output
140
- */
141
- getEditCommandExecutionEnabled: function (aConverterContextHeaderActions) {
142
- var oEditAction = AnnotationHelper._findAction(aConverterContextHeaderActions, "Primary");
143
-
144
- return oEditAction ? oEditAction.enabled : "true";
145
- },
146
-
147
- /**
148
- * Function to get the EditAction from the Entityset based on Draft or sticky based application.
149
- *
150
- * @param {object} [oEntitySet] The value from the expression.
151
- * @returns {string} Returns expression binding or boolean value based on vRawValue & oDraftNode
152
- */
153
- getEditAction: function (oEntitySet) {
154
- var sPath = oEntitySet.getPath(),
155
- oAnnotations = oEntitySet.getObject(sPath + "@");
156
- var bDraftRoot = oAnnotations.hasOwnProperty("@com.sap.vocabularies.Common.v1.DraftRoot");
157
- var bStickySession = oAnnotations.hasOwnProperty("@com.sap.vocabularies.Session.v1.StickySessionSupported");
158
- var sActionName;
159
-
160
- if (bDraftRoot) {
161
- sActionName = oEntitySet.getObject(sPath + "@com.sap.vocabularies.Common.v1.DraftRoot/EditAction");
162
- } else if (bStickySession) {
163
- sActionName = oEntitySet.getObject(sPath + "@com.sap.vocabularies.Session.v1.StickySessionSupported/EditAction");
164
- }
165
-
166
- return !sActionName ? sActionName : sPath + "/" + sActionName;
167
- },
168
- isReadOnlyFromStaticAnnotations: function (oAnnotations, oFieldControl) {
169
- var bComputed, bImmutable, bReadOnly;
170
-
171
- if (oAnnotations["@Org.OData.Core.V1.Computed"]) {
172
- bComputed = oAnnotations["@Org.OData.Core.V1.Computed"].Bool ? oAnnotations["@Org.OData.Core.V1.Computed"].Bool == "true" : true;
173
- }
174
-
175
- if (oAnnotations["@Org.OData.Core.V1.Immutable"]) {
176
- bImmutable = oAnnotations["@Org.OData.Core.V1.Immutable"].Bool ? oAnnotations["@Org.OData.Core.V1.Immutable"].Bool == "true" : true;
177
- }
178
-
179
- bReadOnly = bComputed || bImmutable;
180
-
181
- if (oFieldControl) {
182
- bReadOnly = bReadOnly || oFieldControl == "com.sap.vocabularies.Common.v1.FieldControlType/ReadOnly";
183
- }
184
-
185
- if (bReadOnly) {
186
- return true;
187
- } else {
188
- return false;
189
- }
190
- },
191
- readOnlyExpressionFromDynamicAnnotations: function (oFieldControl) {
192
- var sIsFieldControlPathReadOnly;
193
-
194
- if (oFieldControl) {
195
- if (ManagedObject.bindingParser(oFieldControl)) {
196
- sIsFieldControlPathReadOnly = "%" + oFieldControl + " === 1 ";
197
- }
198
- }
199
-
200
- if (sIsFieldControlPathReadOnly) {
201
- return "{= " + sIsFieldControlPathReadOnly + "? false : true }";
202
- } else {
203
- return;
204
- }
205
- },
206
-
207
- /*
208
- * Function to get the expression for chart Title Press
209
- *
210
- * @function
211
- * @param {oConfiguration} [oConfigurations] control configuration from manifest
212
- * @param {oManifest} [oManifest] Outbounds from manifest
213
- * returns {String} [sCollectionName] Collection Name of the Micro Chart
214
- *
215
- * returns {String} [Expression] Handler Expression for the title press
216
- *
217
- */
218
- getExpressionForMicroChartTitlePress: function (oConfiguration, oManifestOutbound, sCollectionName) {
219
- if (oConfiguration) {
220
- if (oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"] || oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"] && oConfiguration["targetSections"]) {
221
- return ".handlers.onDataPointTitlePressed($controller, ${$source>/},'" + JSON.stringify(oManifestOutbound) + "','" + oConfiguration["targetOutbound"]["outbound"] + "','" + sCollectionName + "' )";
222
- } else if (oConfiguration["targetSections"]) {
223
- return ".handlers.navigateToSubSection($controller, '" + JSON.stringify(oConfiguration["targetSections"]) + "')";
224
- } else {
225
- return undefined;
226
- }
227
- }
228
- },
229
-
230
- /*
231
- * Function to render Chart Title as Link
232
- *
233
- * @function
234
- * @param {oControlConfiguration} [oConfigurations] control configuration from manifest
235
- * returns {String} [sKey] For the TargetOutbound and TargetSection
236
- *
237
- */
238
- getMicroChartTitleAsLink: function (oControlConfiguration) {
239
- if (oControlConfiguration && (oControlConfiguration["targetOutbound"] || oControlConfiguration["targetOutbound"] && oControlConfiguration["targetSections"])) {
240
- return "External";
241
- } else if (oControlConfiguration && oControlConfiguration["targetSections"]) {
242
- return "InPage";
243
- } else {
244
- return "None";
245
- }
246
- },
247
-
248
- /* Get groupId from control configuration
249
- *
250
- * @function
251
- * @param {Object} [oConfigurations] control configuration from manifest
252
- * @param {String} [sAnnotationPath] Annotation Path for the configuration
253
- * @description Used to get the groupId for DataPoints and MicroCharts in the Header.
254
- *
255
- */
256
- getGroupIdFromConfig: function (oConfigurations, sAnnotationPath, sDefaultGroupId) {
257
- var oConfiguration = oConfigurations[sAnnotationPath],
258
- aAutoPatterns = ["Heroes", "Decoration", "Workers", "LongRunners"];
259
- var sGroupId = sDefaultGroupId;
260
-
261
- if (oConfiguration && oConfiguration.requestGroupId && aAutoPatterns.some(function (autoPattern) {
262
- return autoPattern === oConfiguration.requestGroupId;
263
- })) {
264
- sGroupId = "$auto." + oConfiguration.requestGroupId;
265
- }
266
-
267
- return sGroupId;
268
- },
269
-
270
- /*
271
- * Get Context Binding with groupId from control configuration
272
- *
273
- * @function
274
- * @param {Object} [oConfigurations] control configuration from manifest
275
- * @param {String} [sKey] Annotation Path for of the configuration
276
- * @description Used to get the binding for DataPoints in the Header.
277
- *
278
- */
279
- getBindingWithGroupIdFromConfig: function (oConfigurations, sKey) {
280
- var sGroupId = AnnotationHelper.getGroupIdFromConfig(oConfigurations, sKey);
281
- var sBinding;
282
-
283
- if (sGroupId) {
284
- sBinding = "{ path : '', parameters : { $$groupId : '" + sGroupId + "' } }";
285
- }
286
-
287
- return sBinding;
288
- },
289
-
290
- /**
291
- * Method to check whether a FieldGroup consists of only 1 DataField with MultiLine Text annotation.
292
- *
293
- * @param {DataFieldAbstractTypes[]} aFormElements A collection of form elements used in the current field group
294
- * @returns {boolean} Returns true if only 1 data field with Multiline Text annotation exists.
295
- */
296
- doesFieldGroupContainOnlyOneMultiLineDataField: function (aFormElements) {
297
- return aFormElements && aFormElements.length === 1 && !!aFormElements[0].isValueMultilineText;
298
- },
299
-
300
- /*
301
- * Get Visiblity of breadcrumbs.
302
- *
303
- * @function
304
- * @param {Object} [oViewData] ViewData model
305
- * returns {*} Expression or boolean
306
- */
307
- getVisibleExpressionForBreadcrumbs: function (oViewData) {
308
- return oViewData.showBreadCrumbs && oViewData.fclEnabled !== undefined ? "{fclhelper>/breadCrumbIsVisible}" : oViewData.showBreadCrumbs;
309
- },
310
- getShareButtonVisibility: function (viewData) {
311
- var sShareButtonVisibilityExp = "!${ui>createMode}";
312
-
313
- if (viewData.fclEnabled) {
314
- sShareButtonVisibilityExp = "${fclhelper>/showShareIcon} && " + sShareButtonVisibilityExp;
315
- }
316
-
317
- return "{= " + sShareButtonVisibilityExp + " }";
318
- },
319
-
320
- /*
321
- * Get visiblity for editable header facet.
322
- *
323
- * If either the title or description field from the header annotations are editable, then the
324
- * editable header facet is visible.
325
- *
326
- * @function
327
- * @param {object} [oAnnotations] Annotations object for given entity set
328
- * @param {object} [oFieldControl] field control
329
- * returns {*} binding expression or boolean value resolved form funcitons isReadOnlyFromStaticAnnotations and isReadOnlyFromDynamicAnnotations
330
- */
331
- getVisiblityOfHeaderFacet: function (oTitleAnnotations, oDescriptionAnnotations, oFieldTitleFieldControl, oFieldDescriptionFieldControl) {
332
- // Check Annotations for Title Field
333
- var bIsTitleReadOnly = AnnotationHelper.isReadOnlyFromStaticAnnotations(oTitleAnnotations, oFieldTitleFieldControl);
334
- var titleExpression = AnnotationHelper.readOnlyExpressionFromDynamicAnnotations(oFieldTitleFieldControl); // There is no expression and the title is not ready only, this is sufficient for an editable header
335
-
336
- if (!bIsTitleReadOnly && !titleExpression) {
337
- return true;
338
- } // Check Annotations for Description Field
339
-
340
-
341
- var bIsDescriptionReadOnly = AnnotationHelper.isReadOnlyFromStaticAnnotations(oDescriptionAnnotations, oFieldDescriptionFieldControl);
342
- var descriptionExpression = AnnotationHelper.readOnlyExpressionFromDynamicAnnotations(oFieldDescriptionFieldControl); // There is no expression and the description is not ready only, this is sufficient for an editable header
343
-
344
- if (!bIsDescriptionReadOnly && !descriptionExpression) {
345
- return true;
346
- } // Both title and description are not editable and there are no dynamic annotations
347
-
348
-
349
- if (bIsTitleReadOnly && bIsDescriptionReadOnly && !titleExpression && !descriptionExpression) {
350
- return false;
351
- } // Now combine expressions
352
-
353
-
354
- if (titleExpression && !descriptionExpression) {
355
- return titleExpression;
356
- } else if (!titleExpression && descriptionExpression) {
357
- return descriptionExpression;
358
- } else {
359
- return AnnotationHelper.combineTitleAndDescriptionExpression(oFieldTitleFieldControl, oFieldDescriptionFieldControl);
360
- }
361
- },
362
- combineTitleAndDescriptionExpression: function (oTitleFieldControl, oDescriptionFieldControl) {
363
- // If both header and title field are based on dynmaic field control, the editable header
364
- // is visible if at least one of these is not ready only
365
- return "{= %" + oTitleFieldControl + " === 1 ? ( %" + oDescriptionFieldControl + " === 1 ? false : true ) : true }";
366
- },
367
-
368
- /*
369
- * Get Expression of press event of delete button.
370
- *
371
- * @function
372
- * @param {string} [sEntitySetName] Entity set name
373
- * returns {string} binding expression / function string generated from commanhelper's function generateFunction
374
- */
375
- getPressExpressionForDelete: function (sEntitySetName) {
376
- var sDeletableContexts = "${$view>/getBindingContext}",
377
- sTitle = "${$view>/#fe::ObjectPage/getHeaderTitle/getExpandedHeading/getItems/1/getText}",
378
- sDescription = "${$view>/#fe::ObjectPage/getHeaderTitle/getExpandedContent/0/getItems/0/getText}";
379
- var oParams = {
380
- title: sTitle,
381
- entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
382
- description: sDescription
383
- };
384
- return CommonHelper.generateFunction(".editFlow.deleteDocument", sDeletableContexts, CommonHelper.objectToString(oParams));
385
- },
386
-
387
- /*
388
- * Get Expression of press event of Edit button.
389
- *
390
- * @function
391
- * @param {object} [oDataField] Data field object
392
- * @param {string} [sEntitySetName] Entity set name
393
- * @param {object} [oHeaderAction] Header action object
394
- * returns {string} binding expression / function string generated from commanhelper's function generateFunction
395
- */
396
- getPressExpressionForEdit: function (oDataField, sEntitySetName, oHeaderAction) {
397
- var sEditableContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
398
- sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
399
- sInvocationGroup = sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
400
- var oParams = {
401
- contexts: "${$view>/getBindingContext}",
402
- entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
403
- invocationGrouping: CommonHelper.addSingleQuotes(sInvocationGroup),
404
- model: "${$source>/}.getModel()",
405
- label: CommonHelper.addSingleQuotes(oDataField && oDataField.Label, true),
406
- isNavigable: oHeaderAction && oHeaderAction.isNavigable,
407
- defaultValuesExtensionFunction: oHeaderAction && oHeaderAction.defaultValuesExtensionFunction ? "'" + oHeaderAction.defaultValuesExtensionFunction + "'" : undefined
408
- };
409
- return CommonHelper.generateFunction(".handlers.onCallAction", "${$view>/}", sEditableContexts, CommonHelper.objectToString(oParams));
410
- },
411
-
412
- /*
413
- * Method to get the expression for the 'press' event for footer annotation actions
414
- *
415
- * @function
416
- * @param {object} [oDataField] Data field object
417
- * @param {string} [sEntitySetName] Entity set name
418
- * @param {object} [oHeaderAction] Header action object
419
- * returns {string} Binding expression or function string that is generated from the Commonhelper's function generateFunction
420
- */
421
- getPressExpressionForFooterAnnotationAction: function (oDataField, sEntitySetName, oHeaderAction) {
422
- var sActionContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
423
- sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
424
- sInvocationGroup = sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
425
- var oParams = {
426
- contexts: "${$view>/#fe::ObjectPage/}.getBindingContext()",
427
- entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
428
- invocationGrouping: CommonHelper.addSingleQuotes(sInvocationGroup),
429
- model: "${$source>/}.getModel()",
430
- label: CommonHelper.addSingleQuotes(oDataField && oDataField.Label, true),
431
- isNavigable: oHeaderAction && oHeaderAction.isNavigable,
432
- defaultValuesExtensionFunction: oHeaderAction && oHeaderAction.defaultValuesExtensionFunction ? "'" + oHeaderAction.defaultValuesExtensionFunction + "'" : undefined
433
- };
434
- return CommonHelper.generateFunction(".handlers.onCallAction", "${$view>/}", sActionContexts, CommonHelper.objectToString(oParams));
435
- },
436
-
437
- /*
438
- * Gets the binding of the container HBox for the header facet.
439
- *
440
- * @function
441
- * @param {object} [oControlConfiguration] The control configuration form of the viewData model
442
- * @param {object} [oHeaderFacet] The object of the header facet
443
- * returns {*} The binding expression from function getBindingWithGroupIdFromConfig or undefined.
444
- */
445
- getStashableHBoxBinding: function (oControlConfiguration, oHeaderFacet) {
446
- if (oHeaderFacet && oHeaderFacet.Facet && oHeaderFacet.Facet.targetAnnotationType === "DataPoint") {
447
- return AnnotationHelper.getBindingWithGroupIdFromConfig(oControlConfiguration, oHeaderFacet.Facet.targetAnnotationValue);
448
- }
449
- },
450
-
451
- /*
452
- * Gets the 'Press' event expression for the external and internal data point link.
453
- *
454
- * @function
455
- * @param {object} [oConfiguration] Control configuration from manifest
456
- * @param {object} [oManifestOutbound] Outbounds from manifest
457
- * returns {string} The runtime binding of the 'Press' event
458
- */
459
- getPressExpressionForLink: function (oConfiguration, oManifestOutbound) {
460
- if (oConfiguration) {
461
- if (oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"]) {
462
- return ".handlers.onDataPointTitlePressed($controller, ${$source>}, " + JSON.stringify(oManifestOutbound) + "," + JSON.stringify(oConfiguration["targetOutbound"]["outbound"]) + ")";
463
- } else if (oConfiguration["targetSections"]) {
464
- return ".handlers.navigateToSubSection($controller, '" + JSON.stringify(oConfiguration["targetSections"]) + "')";
465
- } else {
466
- return undefined;
467
- }
468
- }
469
- },
470
- isSubSectionTitleVisible: function (sSubSectionvisible, sSubSectiontitle, sSubSectionshowTitle) {
471
- if (sSubSectionvisible.indexOf("{=") === 0) {
472
- // Dynamic expression
473
- var sExpressionResult = sSubSectionvisible.substring(sSubSectionvisible.indexOf("{=") + 2, sSubSectionvisible.lastIndexOf("}"));
474
- return "{= (" + sExpressionResult + ") && ('" + sSubSectiontitle + "' !=='undefined') && (" + sSubSectionshowTitle + " ? true : false) }";
475
- } else {
476
- return sSubSectionvisible && sSubSectiontitle !== "undefined" && (sSubSectionshowTitle ? "true" : "false");
477
- }
478
- }
479
- };
480
- return AnnotationHelper;
481
- }, false);
482
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkFubm90YXRpb25IZWxwZXIudHMiXSwibmFtZXMiOlsiQW5ub3RhdGlvbkhlbHBlciIsImdldEVsZW1lbnRCaW5kaW5nIiwic1BhdGgiLCJzTmF2aWdhdGlvblBhdGgiLCJPRGF0YU1vZGVsQW5ub3RhdGlvbkhlbHBlciIsImdldE5hdmlnYXRpb25QYXRoIiwiY2hlY2tEcmFmdFN0YXRlIiwib0Fubm90YXRpb25zIiwiZ2V0U3dpdGNoVG9BY3RpdmVWaXNpYmlsaXR5IiwiZ2V0U3dpdGNoVG9EcmFmdFZpc2liaWxpdHkiLCJnZXRTd2l0Y2hEcmFmdEFuZEFjdGl2ZVZpc2liaWxpdHkiLCJfZmluZEFjdGlvbiIsImFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyIsInNBY3Rpb25UeXBlIiwib0FjdGlvbiIsImxlbmd0aCIsImZpbmQiLCJvSGVhZGVyQWN0aW9uIiwidHlwZSIsImdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25FbmFibGVkIiwib0RlbGV0ZUFjdGlvbiIsImVuYWJsZWQiLCJnZXREZWxldGVDb21tYW5kRXhlY3V0aW9uVmlzaWJsZSIsInZpc2libGUiLCJnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvblZpc2libGUiLCJvRWRpdEFjdGlvbiIsImdldEVkaXRDb21tYW5kRXhlY3V0aW9uRW5hYmxlZCIsImdldEVkaXRBY3Rpb24iLCJvRW50aXR5U2V0IiwiZ2V0UGF0aCIsImdldE9iamVjdCIsImJEcmFmdFJvb3QiLCJoYXNPd25Qcm9wZXJ0eSIsImJTdGlja3lTZXNzaW9uIiwic0FjdGlvbk5hbWUiLCJpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zIiwib0ZpZWxkQ29udHJvbCIsImJDb21wdXRlZCIsImJJbW11dGFibGUiLCJiUmVhZE9ubHkiLCJCb29sIiwicmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyIsInNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSIsIk1hbmFnZWRPYmplY3QiLCJiaW5kaW5nUGFyc2VyIiwiZ2V0RXhwcmVzc2lvbkZvck1pY3JvQ2hhcnRUaXRsZVByZXNzIiwib0NvbmZpZ3VyYXRpb24iLCJvTWFuaWZlc3RPdXRib3VuZCIsInNDb2xsZWN0aW9uTmFtZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJnZXRNaWNyb0NoYXJ0VGl0bGVBc0xpbmsiLCJvQ29udHJvbENvbmZpZ3VyYXRpb24iLCJnZXRHcm91cElkRnJvbUNvbmZpZyIsIm9Db25maWd1cmF0aW9ucyIsInNBbm5vdGF0aW9uUGF0aCIsInNEZWZhdWx0R3JvdXBJZCIsImFBdXRvUGF0dGVybnMiLCJzR3JvdXBJZCIsInJlcXVlc3RHcm91cElkIiwic29tZSIsImF1dG9QYXR0ZXJuIiwiZ2V0QmluZGluZ1dpdGhHcm91cElkRnJvbUNvbmZpZyIsInNLZXkiLCJzQmluZGluZyIsImRvZXNGaWVsZEdyb3VwQ29udGFpbk9ubHlPbmVNdWx0aUxpbmVEYXRhRmllbGQiLCJhRm9ybUVsZW1lbnRzIiwiaXNWYWx1ZU11bHRpbGluZVRleHQiLCJnZXRWaXNpYmxlRXhwcmVzc2lvbkZvckJyZWFkY3J1bWJzIiwib1ZpZXdEYXRhIiwic2hvd0JyZWFkQ3J1bWJzIiwiZmNsRW5hYmxlZCIsImdldFNoYXJlQnV0dG9uVmlzaWJpbGl0eSIsInZpZXdEYXRhIiwic1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCIsImdldFZpc2libGl0eU9mSGVhZGVyRmFjZXQiLCJvVGl0bGVBbm5vdGF0aW9ucyIsIm9EZXNjcmlwdGlvbkFubm90YXRpb25zIiwib0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wiLCJvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbCIsImJJc1RpdGxlUmVhZE9ubHkiLCJ0aXRsZUV4cHJlc3Npb24iLCJiSXNEZXNjcmlwdGlvblJlYWRPbmx5IiwiZGVzY3JpcHRpb25FeHByZXNzaW9uIiwiY29tYmluZVRpdGxlQW5kRGVzY3JpcHRpb25FeHByZXNzaW9uIiwib1RpdGxlRmllbGRDb250cm9sIiwib0Rlc2NyaXB0aW9uRmllbGRDb250cm9sIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yRGVsZXRlIiwic0VudGl0eVNldE5hbWUiLCJzRGVsZXRhYmxlQ29udGV4dHMiLCJzVGl0bGUiLCJzRGVzY3JpcHRpb24iLCJvUGFyYW1zIiwidGl0bGUiLCJlbnRpdHlTZXROYW1lIiwiQ29tbW9uSGVscGVyIiwiYWRkU2luZ2xlUXVvdGVzIiwiZGVzY3JpcHRpb24iLCJnZW5lcmF0ZUZ1bmN0aW9uIiwib2JqZWN0VG9TdHJpbmciLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JFZGl0Iiwib0RhdGFGaWVsZCIsInNFZGl0YWJsZUNvbnRleHRzIiwiQWN0aW9uIiwic0RhdGFGaWVsZEVudW1NZW1iZXIiLCJJbnZvY2F0aW9uR3JvdXBpbmciLCJzSW52b2NhdGlvbkdyb3VwIiwiY29udGV4dHMiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJtb2RlbCIsImxhYmVsIiwiTGFiZWwiLCJpc05hdmlnYWJsZSIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsImdldFByZXNzRXhwcmVzc2lvbkZvckZvb3RlckFubm90YXRpb25BY3Rpb24iLCJzQWN0aW9uQ29udGV4dHMiLCJnZXRTdGFzaGFibGVIQm94QmluZGluZyIsIm9IZWFkZXJGYWNldCIsIkZhY2V0IiwidGFyZ2V0QW5ub3RhdGlvblR5cGUiLCJ0YXJnZXRBbm5vdGF0aW9uVmFsdWUiLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JMaW5rIiwiaXNTdWJTZWN0aW9uVGl0bGVWaXNpYmxlIiwic1N1YlNlY3Rpb252aXNpYmxlIiwic1N1YlNlY3Rpb250aXRsZSIsInNTdWJTZWN0aW9uc2hvd1RpdGxlIiwiaW5kZXhPZiIsInNFeHByZXNzaW9uUmVzdWx0Iiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQSxnQkFBZ0IsR0FBRztBQUN4QkMsSUFBQUEsaUJBQWlCLEVBQUUsVUFBVUMsS0FBVixFQUFzQjtBQUN4QyxVQUFNQyxlQUFlLEdBQUdDLDBCQUEwQixDQUFDQyxpQkFBM0IsQ0FBNkNILEtBQTdDLENBQXhCOztBQUNBLFVBQUlDLGVBQUosRUFBcUI7QUFDcEIsZUFBTyxZQUFZQSxlQUFaLEdBQThCLElBQXJDO0FBQ0EsT0FGRCxNQUVPO0FBQ047QUFDQSxlQUFPLFlBQVA7QUFDQTtBQUNELEtBVHVCOztBQVd4QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ0csSUFBQUEsZUFBZSxFQUFFLFVBQVVDLFlBQVYsRUFBNkI7QUFDN0MsVUFDQ0EsWUFBWSxDQUFDLDJDQUFELENBQVosSUFDQUEsWUFBWSxDQUFDLDJDQUFELENBQVosQ0FBMEQsWUFBMUQsQ0FGRCxFQUdFO0FBQ0QsZUFBTyxJQUFQO0FBQ0EsT0FMRCxNQUtPO0FBQ04sZUFBTyxLQUFQO0FBQ0E7QUFDRCxLQTFCdUI7O0FBNEJ4QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ0MsSUFBQUEsMkJBQTJCLEVBQUUsVUFBVUQsWUFBVixFQUFrQztBQUM5RCxVQUFJLEtBQUtELGVBQUwsQ0FBcUJDLFlBQXJCLENBQUosRUFBd0M7QUFDdkMsZUFBTyw0SkFBUDtBQUNBLE9BRkQsTUFFTztBQUNOLGVBQU8sS0FBUDtBQUNBO0FBQ0QsS0F4Q3VCOztBQTBDeEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NFLElBQUFBLDBCQUEwQixFQUFFLFVBQVVGLFlBQVYsRUFBa0M7QUFDN0QsVUFBSSxLQUFLRCxlQUFMLENBQXFCQyxZQUFyQixDQUFKLEVBQXdDO0FBQ3ZDLGVBQU8sb0xBQVA7QUFDQSxPQUZELE1BRU87QUFDTixlQUFPLEtBQVA7QUFDQTtBQUNELEtBdER1Qjs7QUF3RHhCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDRyxJQUFBQSxpQ0FBaUMsRUFBRSxVQUFVSCxZQUFWLEVBQWtDO0FBQ3BFLFVBQUksS0FBS0QsZUFBTCxDQUFxQkMsWUFBckIsQ0FBSixFQUF3QztBQUN2QyxlQUFPLHVJQUFQO0FBQ0EsT0FGRCxNQUVPO0FBQ04sZUFBTyxLQUFQO0FBQ0E7QUFDRCxLQXBFdUI7O0FBc0V4QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NJLElBQUFBLFdBQVcsRUFBRSxVQUFVQyw4QkFBVixFQUFpREMsV0FBakQsRUFBc0U7QUFDbEYsVUFBSUMsT0FBSjs7QUFDQSxVQUFJRiw4QkFBOEIsSUFBSUEsOEJBQThCLENBQUNHLE1BQXJFLEVBQTZFO0FBQzVFRCxRQUFBQSxPQUFPLEdBQUdGLDhCQUE4QixDQUFDSSxJQUEvQixDQUFvQyxVQUFVQyxhQUFWLEVBQThCO0FBQzNFLGlCQUFPQSxhQUFhLENBQUNDLElBQWQsS0FBdUJMLFdBQTlCO0FBQ0EsU0FGUyxDQUFWO0FBR0E7O0FBQ0QsYUFBT0MsT0FBUDtBQUNBLEtBdEZ1Qjs7QUF3RnhCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDSyxJQUFBQSxnQ0FBZ0MsRUFBRSxVQUFVUCw4QkFBVixFQUFpRDtBQUNsRixVQUFNUSxhQUFhLEdBQUdwQixnQkFBZ0IsQ0FBQ1csV0FBakIsQ0FBNkJDLDhCQUE3QixFQUE2RCxXQUE3RCxDQUF0Qjs7QUFDQSxhQUFPUSxhQUFhLEdBQUdBLGFBQWEsQ0FBQ0MsT0FBakIsR0FBMkIsTUFBL0M7QUFDQSxLQWpHdUI7O0FBa0d4QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ0MsSUFBQUEsZ0NBQWdDLEVBQUUsVUFBVVYsOEJBQVYsRUFBaUQ7QUFDbEYsVUFBTVEsYUFBYSxHQUFHcEIsZ0JBQWdCLENBQUNXLFdBQWpCLENBQTZCQyw4QkFBN0IsRUFBNkQsV0FBN0QsQ0FBdEI7O0FBQ0EsYUFBT1EsYUFBYSxHQUFHQSxhQUFhLENBQUNHLE9BQWpCLEdBQTJCLE1BQS9DO0FBQ0EsS0EzR3VCOztBQTRHeEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NDLElBQUFBLDhCQUE4QixFQUFFLFVBQVVaLDhCQUFWLEVBQWlEO0FBQ2hGLFVBQU1hLFdBQVcsR0FBR3pCLGdCQUFnQixDQUFDVyxXQUFqQixDQUE2QkMsOEJBQTdCLEVBQTZELFNBQTdELENBQXBCOztBQUNBLGFBQU9hLFdBQVcsR0FBR0EsV0FBVyxDQUFDRixPQUFmLEdBQXlCLE1BQTNDO0FBQ0EsS0FySHVCOztBQXNIeEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NHLElBQUFBLDhCQUE4QixFQUFFLFVBQVVkLDhCQUFWLEVBQWlEO0FBQ2hGLFVBQU1hLFdBQVcsR0FBR3pCLGdCQUFnQixDQUFDVyxXQUFqQixDQUE2QkMsOEJBQTdCLEVBQTZELFNBQTdELENBQXBCOztBQUNBLGFBQU9hLFdBQVcsR0FBR0EsV0FBVyxDQUFDSixPQUFmLEdBQXlCLE1BQTNDO0FBQ0EsS0EvSHVCOztBQWdJeEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NNLElBQUFBLGFBQWEsRUFBRSxVQUFVQyxVQUFWLEVBQStCO0FBQzdDLFVBQU0xQixLQUFLLEdBQUcwQixVQUFVLENBQUNDLE9BQVgsRUFBZDtBQUFBLFVBQ0N0QixZQUFZLEdBQUdxQixVQUFVLENBQUNFLFNBQVgsQ0FBcUI1QixLQUFLLEdBQUcsR0FBN0IsQ0FEaEI7QUFFQSxVQUFNNkIsVUFBVSxHQUFHeEIsWUFBWSxDQUFDeUIsY0FBYixDQUE0QiwyQ0FBNUIsQ0FBbkI7QUFDQSxVQUFNQyxjQUFjLEdBQUcxQixZQUFZLENBQUN5QixjQUFiLENBQTRCLHlEQUE1QixDQUF2QjtBQUNBLFVBQUlFLFdBQUo7O0FBQ0EsVUFBSUgsVUFBSixFQUFnQjtBQUNmRyxRQUFBQSxXQUFXLEdBQUdOLFVBQVUsQ0FBQ0UsU0FBWCxDQUFxQjVCLEtBQUssR0FBRyxzREFBN0IsQ0FBZDtBQUNBLE9BRkQsTUFFTyxJQUFJK0IsY0FBSixFQUFvQjtBQUMxQkMsUUFBQUEsV0FBVyxHQUFHTixVQUFVLENBQUNFLFNBQVgsQ0FBcUI1QixLQUFLLEdBQUcsb0VBQTdCLENBQWQ7QUFDQTs7QUFDRCxhQUFPLENBQUNnQyxXQUFELEdBQWVBLFdBQWYsR0FBNkJoQyxLQUFLLEdBQUcsR0FBUixHQUFjZ0MsV0FBbEQ7QUFDQSxLQWxKdUI7QUFtSnhCQyxJQUFBQSwrQkFBK0IsRUFBRSxVQUFVNUIsWUFBVixFQUE2QjZCLGFBQTdCLEVBQWlEO0FBQ2pGLFVBQUlDLFNBQUosRUFBZUMsVUFBZixFQUEyQkMsU0FBM0I7O0FBQ0EsVUFBSWhDLFlBQVksQ0FBQyw2QkFBRCxDQUFoQixFQUFpRDtBQUNoRDhCLFFBQUFBLFNBQVMsR0FBRzlCLFlBQVksQ0FBQyw2QkFBRCxDQUFaLENBQTRDaUMsSUFBNUMsR0FDVGpDLFlBQVksQ0FBQyw2QkFBRCxDQUFaLENBQTRDaUMsSUFBNUMsSUFBb0QsTUFEM0MsR0FFVCxJQUZIO0FBR0E7O0FBQ0QsVUFBSWpDLFlBQVksQ0FBQyw4QkFBRCxDQUFoQixFQUFrRDtBQUNqRCtCLFFBQUFBLFVBQVUsR0FBRy9CLFlBQVksQ0FBQyw4QkFBRCxDQUFaLENBQTZDaUMsSUFBN0MsR0FDVmpDLFlBQVksQ0FBQyw4QkFBRCxDQUFaLENBQTZDaUMsSUFBN0MsSUFBcUQsTUFEM0MsR0FFVixJQUZIO0FBR0E7O0FBQ0RELE1BQUFBLFNBQVMsR0FBR0YsU0FBUyxJQUFJQyxVQUF6Qjs7QUFFQSxVQUFJRixhQUFKLEVBQW1CO0FBQ2xCRyxRQUFBQSxTQUFTLEdBQUdBLFNBQVMsSUFBSUgsYUFBYSxJQUFJLDBEQUExQztBQUNBOztBQUNELFVBQUlHLFNBQUosRUFBZTtBQUNkLGVBQU8sSUFBUDtBQUNBLE9BRkQsTUFFTztBQUNOLGVBQU8sS0FBUDtBQUNBO0FBQ0QsS0F6S3VCO0FBMEt4QkUsSUFBQUEsd0NBQXdDLEVBQUUsVUFBVUwsYUFBVixFQUE4QjtBQUN2RSxVQUFJTSwyQkFBSjs7QUFDQSxVQUFJTixhQUFKLEVBQW1CO0FBQ2xCLFlBQUtPLGFBQUQsQ0FBdUJDLGFBQXZCLENBQXFDUixhQUFyQyxDQUFKLEVBQXlEO0FBQ3hETSxVQUFBQSwyQkFBMkIsR0FBRyxNQUFNTixhQUFOLEdBQXNCLFNBQXBEO0FBQ0E7QUFDRDs7QUFDRCxVQUFJTSwyQkFBSixFQUFpQztBQUNoQyxlQUFPLFFBQVFBLDJCQUFSLEdBQXNDLGtCQUE3QztBQUNBLE9BRkQsTUFFTztBQUNOO0FBQ0E7QUFDRCxLQXRMdUI7O0FBdUx4QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NHLElBQUFBLG9DQUFvQyxFQUFFLFVBQVVDLGNBQVYsRUFBK0JDLGlCQUEvQixFQUF1REMsZUFBdkQsRUFBNkU7QUFDbEgsVUFBSUYsY0FBSixFQUFvQjtBQUNuQixZQUNFQSxjQUFjLENBQUMsZ0JBQUQsQ0FBZCxJQUFvQ0EsY0FBYyxDQUFDLGdCQUFELENBQWQsQ0FBaUMsVUFBakMsQ0FBckMsSUFDQ0EsY0FBYyxDQUFDLGdCQUFELENBQWQsSUFBb0NBLGNBQWMsQ0FBQyxnQkFBRCxDQUFkLENBQWlDLFVBQWpDLENBQXBDLElBQW9GQSxjQUFjLENBQUMsZ0JBQUQsQ0FGcEcsRUFHRTtBQUNELGlCQUNDLGtFQUNBRyxJQUFJLENBQUNDLFNBQUwsQ0FBZUgsaUJBQWYsQ0FEQSxHQUVBLEtBRkEsR0FHQUQsY0FBYyxDQUFDLGdCQUFELENBQWQsQ0FBaUMsVUFBakMsQ0FIQSxHQUlBLEtBSkEsR0FLQUUsZUFMQSxHQU1BLEtBUEQ7QUFTQSxTQWJELE1BYU8sSUFBSUYsY0FBYyxDQUFDLGdCQUFELENBQWxCLEVBQXNDO0FBQzVDLGlCQUFPLGtEQUFrREcsSUFBSSxDQUFDQyxTQUFMLENBQWVKLGNBQWMsQ0FBQyxnQkFBRCxDQUE3QixDQUFsRCxHQUFxRyxJQUE1RztBQUNBLFNBRk0sTUFFQTtBQUNOLGlCQUFPSyxTQUFQO0FBQ0E7QUFDRDtBQUNELEtBdk51Qjs7QUF3TnhCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ0MsSUFBQUEsd0JBQXdCLEVBQUUsVUFBVUMscUJBQVYsRUFBc0M7QUFDL0QsVUFDQ0EscUJBQXFCLEtBQ3BCQSxxQkFBcUIsQ0FBQyxnQkFBRCxDQUFyQixJQUNDQSxxQkFBcUIsQ0FBQyxnQkFBRCxDQUFyQixJQUEyQ0EscUJBQXFCLENBQUMsZ0JBQUQsQ0FGN0MsQ0FEdEIsRUFJRTtBQUNELGVBQU8sVUFBUDtBQUNBLE9BTkQsTUFNTyxJQUFJQSxxQkFBcUIsSUFBSUEscUJBQXFCLENBQUMsZ0JBQUQsQ0FBbEQsRUFBc0U7QUFDNUUsZUFBTyxRQUFQO0FBQ0EsT0FGTSxNQUVBO0FBQ04sZUFBTyxNQUFQO0FBQ0E7QUFDRCxLQTVPdUI7O0FBOE94QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NDLElBQUFBLG9CQUFvQixFQUFFLFVBQVVDLGVBQVYsRUFBZ0NDLGVBQWhDLEVBQXNEQyxlQUF0RCxFQUE2RTtBQUNsRyxVQUFNWCxjQUFjLEdBQUdTLGVBQWUsQ0FBQ0MsZUFBRCxDQUF0QztBQUFBLFVBQ0NFLGFBQWEsR0FBRyxDQUFDLFFBQUQsRUFBVyxZQUFYLEVBQXlCLFNBQXpCLEVBQW9DLGFBQXBDLENBRGpCO0FBRUEsVUFBSUMsUUFBUSxHQUFHRixlQUFmOztBQUNBLFVBQ0NYLGNBQWMsSUFDZEEsY0FBYyxDQUFDYyxjQURmLElBRUFGLGFBQWEsQ0FBQ0csSUFBZCxDQUFtQixVQUFVQyxXQUFWLEVBQStCO0FBQ2pELGVBQU9BLFdBQVcsS0FBS2hCLGNBQWMsQ0FBQ2MsY0FBdEM7QUFDQSxPQUZELENBSEQsRUFNRTtBQUNERCxRQUFBQSxRQUFRLEdBQUcsV0FBV2IsY0FBYyxDQUFDYyxjQUFyQztBQUNBOztBQUNELGFBQU9ELFFBQVA7QUFDQSxLQXBRdUI7O0FBc1F4QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ0ksSUFBQUEsK0JBQStCLEVBQUUsVUFBVVIsZUFBVixFQUFnQ1MsSUFBaEMsRUFBMkM7QUFDM0UsVUFBTUwsUUFBUSxHQUFHM0QsZ0JBQWdCLENBQUNzRCxvQkFBakIsQ0FBc0NDLGVBQXRDLEVBQXVEUyxJQUF2RCxDQUFqQjtBQUNBLFVBQUlDLFFBQUo7O0FBQ0EsVUFBSU4sUUFBSixFQUFjO0FBQ2JNLFFBQUFBLFFBQVEsR0FBRyw4Q0FBOENOLFFBQTlDLEdBQXlELE9BQXBFO0FBQ0E7O0FBQ0QsYUFBT00sUUFBUDtBQUNBLEtBdFJ1Qjs7QUF1UnhCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDQyxJQUFBQSw4Q0FBOEMsRUFBRSxVQUFVQyxhQUFWLEVBQWdDO0FBQy9FLGFBQU9BLGFBQWEsSUFBSUEsYUFBYSxDQUFDcEQsTUFBZCxLQUF5QixDQUExQyxJQUErQyxDQUFDLENBQUNvRCxhQUFhLENBQUMsQ0FBRCxDQUFiLENBQWlCQyxvQkFBekU7QUFDQSxLQS9SdUI7O0FBZ1N4QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDQyxJQUFBQSxrQ0FBa0MsRUFBRSxVQUFVQyxTQUFWLEVBQTBCO0FBQzdELGFBQU9BLFNBQVMsQ0FBQ0MsZUFBVixJQUE2QkQsU0FBUyxDQUFDRSxVQUFWLEtBQXlCckIsU0FBdEQsR0FDSixrQ0FESSxHQUVKbUIsU0FBUyxDQUFDQyxlQUZiO0FBR0EsS0EzU3VCO0FBNFN4QkUsSUFBQUEsd0JBQXdCLEVBQUUsVUFBVUMsUUFBVixFQUF5QjtBQUNsRCxVQUFJQyx5QkFBeUIsR0FBRyxtQkFBaEM7O0FBQ0EsVUFBSUQsUUFBUSxDQUFDRixVQUFiLEVBQXlCO0FBQ3hCRyxRQUFBQSx5QkFBeUIsR0FBRyxvQ0FBb0NBLHlCQUFoRTtBQUNBOztBQUNELGFBQU8sUUFBUUEseUJBQVIsR0FBb0MsSUFBM0M7QUFDQSxLQWxUdUI7O0FBb1R4QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0NDLElBQUFBLHlCQUF5QixFQUFFLFVBQzFCQyxpQkFEMEIsRUFFMUJDLHVCQUYwQixFQUcxQkMsdUJBSDBCLEVBSTFCQyw2QkFKMEIsRUFLekI7QUFDRDtBQUNBLFVBQU1DLGdCQUFnQixHQUFHakYsZ0JBQWdCLENBQUNtQywrQkFBakIsQ0FBaUQwQyxpQkFBakQsRUFBb0VFLHVCQUFwRSxDQUF6QjtBQUNBLFVBQU1HLGVBQWUsR0FBR2xGLGdCQUFnQixDQUFDeUMsd0NBQWpCLENBQTBEc0MsdUJBQTFELENBQXhCLENBSEMsQ0FJRDs7QUFDQSxVQUFJLENBQUNFLGdCQUFELElBQXFCLENBQUNDLGVBQTFCLEVBQTJDO0FBQzFDLGVBQU8sSUFBUDtBQUNBLE9BUEEsQ0FTRDs7O0FBQ0EsVUFBTUMsc0JBQXNCLEdBQUduRixnQkFBZ0IsQ0FBQ21DLCtCQUFqQixDQUM5QjJDLHVCQUQ4QixFQUU5QkUsNkJBRjhCLENBQS9CO0FBSUEsVUFBTUkscUJBQXFCLEdBQUdwRixnQkFBZ0IsQ0FBQ3lDLHdDQUFqQixDQUEwRHVDLDZCQUExRCxDQUE5QixDQWRDLENBZUQ7O0FBQ0EsVUFBSSxDQUFDRyxzQkFBRCxJQUEyQixDQUFDQyxxQkFBaEMsRUFBdUQ7QUFDdEQsZUFBTyxJQUFQO0FBQ0EsT0FsQkEsQ0FvQkQ7OztBQUNBLFVBQUlILGdCQUFnQixJQUFJRSxzQkFBcEIsSUFBOEMsQ0FBQ0QsZUFBL0MsSUFBa0UsQ0FBQ0UscUJBQXZFLEVBQThGO0FBQzdGLGVBQU8sS0FBUDtBQUNBLE9BdkJBLENBeUJEOzs7QUFDQSxVQUFJRixlQUFlLElBQUksQ0FBQ0UscUJBQXhCLEVBQStDO0FBQzlDLGVBQU9GLGVBQVA7QUFDQSxPQUZELE1BRU8sSUFBSSxDQUFDQSxlQUFELElBQW9CRSxxQkFBeEIsRUFBK0M7QUFDckQsZUFBT0EscUJBQVA7QUFDQSxPQUZNLE1BRUE7QUFDTixlQUFPcEYsZ0JBQWdCLENBQUNxRixvQ0FBakIsQ0FBc0ROLHVCQUF0RCxFQUErRUMsNkJBQS9FLENBQVA7QUFDQTtBQUNELEtBcld1QjtBQXNXeEJLLElBQUFBLG9DQUFvQyxFQUFFLFVBQVVDLGtCQUFWLEVBQW1DQyx3QkFBbkMsRUFBa0U7QUFDdkc7QUFDQTtBQUNBLGFBQU8sU0FBU0Qsa0JBQVQsR0FBOEIsY0FBOUIsR0FBK0NDLHdCQUEvQyxHQUEwRSxrQ0FBakY7QUFDQSxLQTFXdUI7O0FBMld4QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDQyxJQUFBQSwyQkFBMkIsRUFBRSxVQUFVQyxjQUFWLEVBQStCO0FBQzNELFVBQU1DLGtCQUFrQixHQUFHLDZCQUEzQjtBQUFBLFVBQ0NDLE1BQU0sR0FBRyxnRkFEVjtBQUFBLFVBRUNDLFlBQVksR0FBRyxrRkFGaEI7QUFHQSxVQUFNQyxPQUFPLEdBQUc7QUFDZkMsUUFBQUEsS0FBSyxFQUFFSCxNQURRO0FBRWZJLFFBQUFBLGFBQWEsRUFBRUMsWUFBWSxDQUFDQyxlQUFiLENBQTZCUixjQUE3QixDQUZBO0FBR2ZTLFFBQUFBLFdBQVcsRUFBRU47QUFIRSxPQUFoQjtBQUtBLGFBQU9JLFlBQVksQ0FBQ0csZ0JBQWIsQ0FBOEIsMEJBQTlCLEVBQTBEVCxrQkFBMUQsRUFBOEVNLFlBQVksQ0FBQ0ksY0FBYixDQUE0QlAsT0FBNUIsQ0FBOUUsQ0FBUDtBQUNBLEtBNVh1Qjs7QUE2WHhCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDUSxJQUFBQSx5QkFBeUIsRUFBRSxVQUFVQyxVQUFWLEVBQTJCYixjQUEzQixFQUFnRHhFLGFBQWhELEVBQW9FO0FBQzlGLFVBQU1zRixpQkFBaUIsR0FBR1AsWUFBWSxDQUFDQyxlQUFiLENBQTZCSyxVQUFVLElBQUlBLFVBQVUsQ0FBQ0UsTUFBdEQsQ0FBMUI7QUFBQSxVQUNDQyxvQkFBb0IsR0FBR0gsVUFBVSxJQUFJQSxVQUFVLENBQUNJLGtCQUF6QixJQUErQ0osVUFBVSxDQUFDSSxrQkFBWCxDQUE4QixhQUE5QixDQUR2RTtBQUFBLFVBRUNDLGdCQUFnQixHQUNmRixvQkFBb0IsS0FBSyw0REFBekIsR0FBd0YsV0FBeEYsR0FBc0csVUFIeEc7QUFJQSxVQUFNWixPQUFPLEdBQUc7QUFDZmUsUUFBQUEsUUFBUSxFQUFFLDZCQURLO0FBRWZiLFFBQUFBLGFBQWEsRUFBRUMsWUFBWSxDQUFDQyxlQUFiLENBQTZCUixjQUE3QixDQUZBO0FBR2ZvQixRQUFBQSxrQkFBa0IsRUFBRWIsWUFBWSxDQUFDQyxlQUFiLENBQTZCVSxnQkFBN0IsQ0FITDtBQUlmRyxRQUFBQSxLQUFLLEVBQUUseUJBSlE7QUFLZkMsUUFBQUEsS0FBSyxFQUFFZixZQUFZLENBQUNDLGVBQWIsQ0FBNkJLLFVBQVUsSUFBSUEsVUFBVSxDQUFDVSxLQUF0RCxFQUE2RCxJQUE3RCxDQUxRO0FBTWZDLFFBQUFBLFdBQVcsRUFBRWhHLGFBQWEsSUFBSUEsYUFBYSxDQUFDZ0csV0FON0I7QUFPZkMsUUFBQUEsOEJBQThCLEVBQzdCakcsYUFBYSxJQUFJQSxhQUFhLENBQUNpRyw4QkFBL0IsR0FDRyxNQUFNakcsYUFBYSxDQUFDaUcsOEJBQXBCLEdBQXFELEdBRHhELEdBRUcvRDtBQVZXLE9BQWhCO0FBWUEsYUFBTzZDLFlBQVksQ0FBQ0csZ0JBQWIsQ0FDTix3QkFETSxFQUVOLFlBRk0sRUFHTkksaUJBSE0sRUFJTlAsWUFBWSxDQUFDSSxjQUFiLENBQTRCUCxPQUE1QixDQUpNLENBQVA7QUFNQSxLQTdadUI7O0FBOFp4QjtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ3NCLElBQUFBLDJDQUEyQyxFQUFFLFVBQVViLFVBQVYsRUFBMkJiLGNBQTNCLEVBQWdEeEUsYUFBaEQsRUFBb0U7QUFDaEgsVUFBTW1HLGVBQWUsR0FBR3BCLFlBQVksQ0FBQ0MsZUFBYixDQUE2QkssVUFBVSxJQUFJQSxVQUFVLENBQUNFLE1BQXRELENBQXhCO0FBQUEsVUFDQ0Msb0JBQW9CLEdBQUdILFVBQVUsSUFBSUEsVUFBVSxDQUFDSSxrQkFBekIsSUFBK0NKLFVBQVUsQ0FBQ0ksa0JBQVgsQ0FBOEIsYUFBOUIsQ0FEdkU7QUFBQSxVQUVDQyxnQkFBZ0IsR0FDZkYsb0JBQW9CLEtBQUssNERBQXpCLEdBQXdGLFdBQXhGLEdBQXNHLFVBSHhHO0FBSUEsVUFBTVosT0FBTyxHQUFHO0FBQ2ZlLFFBQUFBLFFBQVEsRUFBRSxnREFESztBQUVmYixRQUFBQSxhQUFhLEVBQUVDLFlBQVksQ0FBQ0MsZUFBYixDQUE2QlIsY0FBN0IsQ0FGQTtBQUdmb0IsUUFBQUEsa0JBQWtCLEVBQUViLFlBQVksQ0FBQ0MsZUFBYixDQUE2QlUsZ0JBQTdCLENBSEw7QUFJZkcsUUFBQUEsS0FBSyxFQUFFLHlCQUpRO0FBS2ZDLFFBQUFBLEtBQUssRUFBRWYsWUFBWSxDQUFDQyxlQUFiLENBQTZCSyxVQUFVLElBQUlBLFVBQVUsQ0FBQ1UsS0FBdEQsRUFBNkQsSUFBN0QsQ0FMUTtBQU1mQyxRQUFBQSxXQUFXLEVBQUVoRyxhQUFhLElBQUlBLGFBQWEsQ0FBQ2dHLFdBTjdCO0FBT2ZDLFFBQUFBLDhCQUE4QixFQUM3QmpHLGFBQWEsSUFBSUEsYUFBYSxDQUFDaUcsOEJBQS9CLEdBQ0csTUFBTWpHLGFBQWEsQ0FBQ2lHLDhCQUFwQixHQUFxRCxHQUR4RCxHQUVHL0Q7QUFWVyxPQUFoQjtBQVlBLGFBQU82QyxZQUFZLENBQUNHLGdCQUFiLENBQThCLHdCQUE5QixFQUF3RCxZQUF4RCxFQUFzRWlCLGVBQXRFLEVBQXVGcEIsWUFBWSxDQUFDSSxjQUFiLENBQTRCUCxPQUE1QixDQUF2RixDQUFQO0FBQ0EsS0F6YnVCOztBQTBieEI7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNDd0IsSUFBQUEsdUJBQXVCLEVBQUUsVUFBVWhFLHFCQUFWLEVBQXNDaUUsWUFBdEMsRUFBeUQ7QUFDakYsVUFBSUEsWUFBWSxJQUFJQSxZQUFZLENBQUNDLEtBQTdCLElBQXNDRCxZQUFZLENBQUNDLEtBQWIsQ0FBbUJDLG9CQUFuQixLQUE0QyxXQUF0RixFQUFtRztBQUNsRyxlQUFPeEgsZ0JBQWdCLENBQUMrRCwrQkFBakIsQ0FBaURWLHFCQUFqRCxFQUF3RWlFLFlBQVksQ0FBQ0MsS0FBYixDQUFtQkUscUJBQTNGLENBQVA7QUFDQTtBQUNELEtBdGN1Qjs7QUF3Y3hCO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQ0MsSUFBQUEseUJBQXlCLEVBQUUsVUFBVTVFLGNBQVYsRUFBK0JDLGlCQUEvQixFQUF1RDtBQUNqRixVQUFJRCxjQUFKLEVBQW9CO0FBQ25CLFlBQUlBLGNBQWMsQ0FBQyxnQkFBRCxDQUFkLElBQW9DQSxjQUFjLENBQUMsZ0JBQUQsQ0FBZCxDQUFpQyxVQUFqQyxDQUF4QyxFQUFzRjtBQUNyRixpQkFDQyxpRUFDQUcsSUFBSSxDQUFDQyxTQUFMLENBQWVILGlCQUFmLENBREEsR0FFQSxHQUZBLEdBR0FFLElBQUksQ0FBQ0MsU0FBTCxDQUFlSixjQUFjLENBQUMsZ0JBQUQsQ0FBZCxDQUFpQyxVQUFqQyxDQUFmLENBSEEsR0FJQSxHQUxEO0FBT0EsU0FSRCxNQVFPLElBQUlBLGNBQWMsQ0FBQyxnQkFBRCxDQUFsQixFQUFzQztBQUM1QyxpQkFBTyxrREFBa0RHLElBQUksQ0FBQ0MsU0FBTCxDQUFlSixjQUFjLENBQUMsZ0JBQUQsQ0FBN0IsQ0FBbEQsR0FBcUcsSUFBNUc7QUFDQSxTQUZNLE1BRUE7QUFDTixpQkFBT0ssU0FBUDtBQUNBO0FBQ0Q7QUFDRCxLQWhldUI7QUFpZXhCd0UsSUFBQUEsd0JBQXdCLEVBQUUsVUFBVUMsa0JBQVYsRUFBbUNDLGdCQUFuQyxFQUEwREMsb0JBQTFELEVBQXFGO0FBQzlHLFVBQUlGLGtCQUFrQixDQUFDRyxPQUFuQixDQUEyQixJQUEzQixNQUFxQyxDQUF6QyxFQUE0QztBQUMzQztBQUNBLFlBQU1DLGlCQUFpQixHQUFHSixrQkFBa0IsQ0FBQ0ssU0FBbkIsQ0FDekJMLGtCQUFrQixDQUFDRyxPQUFuQixDQUEyQixJQUEzQixJQUFtQyxDQURWLEVBRXpCSCxrQkFBa0IsQ0FBQ00sV0FBbkIsQ0FBK0IsR0FBL0IsQ0FGeUIsQ0FBMUI7QUFJQSxlQUNDLFNBQ0FGLGlCQURBLEdBRUEsU0FGQSxHQUdBSCxnQkFIQSxHQUlBLHdCQUpBLEdBS0FDLG9CQUxBLEdBTUEsb0JBUEQ7QUFTQSxPQWZELE1BZU87QUFDTixlQUFPRixrQkFBa0IsSUFBSUMsZ0JBQWdCLEtBQUssV0FBM0MsS0FBMkRDLG9CQUFvQixHQUFHLE1BQUgsR0FBWSxPQUEzRixDQUFQO0FBQ0E7QUFDRDtBQXBmdUIsR0FBekI7U0F1ZmU5SCxnQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbW1vbkhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9Db21tb25IZWxwZXJcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Bbm5vdGF0aW9uSGVscGVyXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbi8qXG5cdCBUaGlzIGNsYXNzIGNvbnRhaW5zIGFubm90YXRpb24gaGVscGVycyB0aGF0IG1pZ2h0IGJlIHVzZWQgZnJvbSBzZXZlcmFsIHRlbXBsYXRlcyBvciBjb250cm9sc1xuXHQgKi9cbmNvbnN0IEFubm90YXRpb25IZWxwZXIgPSB7XG5cdGdldEVsZW1lbnRCaW5kaW5nOiBmdW5jdGlvbiAoc1BhdGg6IGFueSkge1xuXHRcdGNvbnN0IHNOYXZpZ2F0aW9uUGF0aCA9IE9EYXRhTW9kZWxBbm5vdGF0aW9uSGVscGVyLmdldE5hdmlnYXRpb25QYXRoKHNQYXRoKTtcblx0XHRpZiAoc05hdmlnYXRpb25QYXRoKSB7XG5cdFx0XHRyZXR1cm4gXCJ7cGF0aDonXCIgKyBzTmF2aWdhdGlvblBhdGggKyBcIid9XCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSBuZWVkcyBlbXB0eSBvYmplY3Rcblx0XHRcdHJldHVybiBcIntwYXRoOiAnJ31cIjtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGNoZWNrIGlmIGRyYWZ0IHBhdHRlcm4gaXMgc3VwcG9ydGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0Fubm90YXRpb25zIEFubm90YXRpb25zIG9mIHRoZSBjdXJyZW50IGVudGl0eSBzZXQuXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIEJvb2xlYW4gdmFsdWUgYmFzZWQgb24gZHJhZnQgc3RhdGVcblx0ICovXG5cdGNoZWNrRHJhZnRTdGF0ZTogZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KSB7XG5cdFx0aWYgKFxuXHRcdFx0b0Fubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIl0gJiZcblx0XHRcdG9Bbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCJdW1wiRWRpdEFjdGlvblwiXVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgdmlzaWJpbGl0eSBmb3IgdGhlIFN3aXRjaFRvQWN0aXZlIGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcblx0ICovXG5cdGdldFN3aXRjaFRvQWN0aXZlVmlzaWJpbGl0eTogZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0XHRpZiAodGhpcy5jaGVja0RyYWZ0U3RhdGUob0Fubm90YXRpb25zKSkge1xuXHRcdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICR7dWk+L2lzRWRpdGFibGV9ICYmICEke3VpPmNyZWF0ZU1vZGV9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBnZXQgdGhlIHZpc2liaWxpdHkgZm9yIHRoZSBTd2l0Y2hUb0RyYWZ0IGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcblx0ICovXG5cdGdldFN3aXRjaFRvRHJhZnRWaXNpYmlsaXR5OiBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnkpOiBhbnkge1xuXHRcdGlmICh0aGlzLmNoZWNrRHJhZnRTdGF0ZShvQW5ub3RhdGlvbnMpKSB7XG5cdFx0XHRyZXR1cm4gXCJ7PSAoJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9KSA/ICggISgke3VpPi9pc0VkaXRhYmxlfSkgJiYgISR7dWk+Y3JlYXRlTW9kZX0gJiYgJHtIYXNEcmFmdEVudGl0eX0gJiYgJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9ICkgOiBmYWxzZSB9XCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgdmlzaWJpbGl0eSBmb3IgdGhlIFN3aXRjaERyYWZ0QW5kQWN0aXZlIGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcblx0ICovXG5cdGdldFN3aXRjaERyYWZ0QW5kQWN0aXZlVmlzaWJpbGl0eTogZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0XHRpZiAodGhpcy5jaGVja0RyYWZ0U3RhdGUob0Fubm90YXRpb25zKSkge1xuXHRcdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICEke3VpPmNyZWF0ZU1vZGV9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmaW5kIGFuIGFjdGlvbiBmcm9tIHRoZSBhcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBpbiB0aGUgY29udmVydGVyIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0W119IGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiAnaGVhZGVyJyBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25UeXBlIFRoZSBhY3Rpb24gdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0IHwgdW5kZWZpbmVkfSBUaGUgYWN0aW9uIHdpdGggdGhlIG1hdGNoaW5nIGFjdGlvbiB0eXBlXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZmluZEFjdGlvbjogZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogYW55W10sIHNBY3Rpb25UeXBlOiBzdHJpbmcpIHtcblx0XHRsZXQgb0FjdGlvbjtcblx0XHRpZiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zICYmIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucy5sZW5ndGgpIHtcblx0XHRcdG9BY3Rpb24gPSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMuZmluZChmdW5jdGlvbiAob0hlYWRlckFjdGlvbjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvSGVhZGVyQWN0aW9uLnR5cGUgPT09IHNBY3Rpb25UeXBlO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvQWN0aW9uO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgdGhlIERlbGV0ZSBidXR0b24gb24gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlIGluIGNhc2Ugb2YgYSBDb21tYW5kIEV4ZWN1dGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIEFycmF5IG9mIGhlYWRlciBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZVxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcblx0ICovXG5cdGdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25FbmFibGVkOiBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRcdGNvbnN0IG9EZWxldGVBY3Rpb24gPSBBbm5vdGF0aW9uSGVscGVyLl9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJTZWNvbmRhcnlcIik7XG5cdFx0cmV0dXJuIG9EZWxldGVBY3Rpb24gPyBvRGVsZXRlQWN0aW9uLmVuYWJsZWQgOiBcInRydWVcIjtcblx0fSxcblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGZvcm1hdCB0aGUgJ3Zpc2libGUnIHByb3BlcnR5IGZvciB0aGUgRGVsZXRlIGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuXHQgKi9cblx0Z2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvblZpc2libGU6IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdFx0Y29uc3Qgb0RlbGV0ZUFjdGlvbiA9IEFubm90YXRpb25IZWxwZXIuX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlNlY29uZGFyeVwiKTtcblx0XHRyZXR1cm4gb0RlbGV0ZUFjdGlvbiA/IG9EZWxldGVBY3Rpb24udmlzaWJsZSA6IFwidHJ1ZVwiO1xuXHR9LFxuXHQvKipcblx0ICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAndmlzaWJsZScgcHJvcGVydHkgZm9yIHRoZSBFZGl0IGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuXHQgKi9cblx0Z2V0RWRpdENvbW1hbmRFeGVjdXRpb25WaXNpYmxlOiBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRcdGNvbnN0IG9FZGl0QWN0aW9uID0gQW5ub3RhdGlvbkhlbHBlci5fZmluZEFjdGlvbihhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMsIFwiUHJpbWFyeVwiKTtcblx0XHRyZXR1cm4gb0VkaXRBY3Rpb24gPyBvRWRpdEFjdGlvbi52aXNpYmxlIDogXCJ0cnVlXCI7XG5cdH0sXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgdGhlIEVkaXQgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2Vcblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSBjb252ZXJ0ZXIgb3V0cHV0XG5cdCAqL1xuXHRnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQ6IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdFx0Y29uc3Qgb0VkaXRBY3Rpb24gPSBBbm5vdGF0aW9uSGVscGVyLl9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJQcmltYXJ5XCIpO1xuXHRcdHJldHVybiBvRWRpdEFjdGlvbiA/IG9FZGl0QWN0aW9uLmVuYWJsZWQgOiBcInRydWVcIjtcblx0fSxcblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgRWRpdEFjdGlvbiBmcm9tIHRoZSBFbnRpdHlzZXQgYmFzZWQgb24gRHJhZnQgb3Igc3RpY2t5IGJhc2VkIGFwcGxpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29FbnRpdHlTZXRdIFRoZSB2YWx1ZSBmcm9tIHRoZSBleHByZXNzaW9uLlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBib29sZWFuIHZhbHVlIGJhc2VkIG9uIHZSYXdWYWx1ZSAmIG9EcmFmdE5vZGVcblx0ICovXG5cdGdldEVkaXRBY3Rpb246IGZ1bmN0aW9uIChvRW50aXR5U2V0OiBDb250ZXh0KSB7XG5cdFx0Y29uc3Qgc1BhdGggPSBvRW50aXR5U2V0LmdldFBhdGgoKSxcblx0XHRcdG9Bbm5vdGF0aW9ucyA9IG9FbnRpdHlTZXQuZ2V0T2JqZWN0KHNQYXRoICsgXCJAXCIpO1xuXHRcdGNvbnN0IGJEcmFmdFJvb3QgPSBvQW5ub3RhdGlvbnMuaGFzT3duUHJvcGVydHkoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiKTtcblx0XHRjb25zdCBiU3RpY2t5U2Vzc2lvbiA9IG9Bbm5vdGF0aW9ucy5oYXNPd25Qcm9wZXJ0eShcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWRcIik7XG5cdFx0bGV0IHNBY3Rpb25OYW1lO1xuXHRcdGlmIChiRHJhZnRSb290KSB7XG5cdFx0XHRzQWN0aW9uTmFtZSA9IG9FbnRpdHlTZXQuZ2V0T2JqZWN0KHNQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9FZGl0QWN0aW9uXCIpO1xuXHRcdH0gZWxzZSBpZiAoYlN0aWNreVNlc3Npb24pIHtcblx0XHRcdHNBY3Rpb25OYW1lID0gb0VudGl0eVNldC5nZXRPYmplY3Qoc1BhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvRWRpdEFjdGlvblwiKTtcblx0XHR9XG5cdFx0cmV0dXJuICFzQWN0aW9uTmFtZSA/IHNBY3Rpb25OYW1lIDogc1BhdGggKyBcIi9cIiArIHNBY3Rpb25OYW1lO1xuXHR9LFxuXHRpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zOiBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnksIG9GaWVsZENvbnRyb2w6IGFueSkge1xuXHRcdGxldCBiQ29tcHV0ZWQsIGJJbW11dGFibGUsIGJSZWFkT25seTtcblx0XHRpZiAob0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkXCJdKSB7XG5cdFx0XHRiQ29tcHV0ZWQgPSBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl0uQm9vbFxuXHRcdFx0XHQ/IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5Db21wdXRlZFwiXS5Cb29sID09IFwidHJ1ZVwiXG5cdFx0XHRcdDogdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0pIHtcblx0XHRcdGJJbW11dGFibGUgPSBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlXCJdLkJvb2xcblx0XHRcdFx0PyBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlXCJdLkJvb2wgPT0gXCJ0cnVlXCJcblx0XHRcdFx0OiB0cnVlO1xuXHRcdH1cblx0XHRiUmVhZE9ubHkgPSBiQ29tcHV0ZWQgfHwgYkltbXV0YWJsZTtcblxuXHRcdGlmIChvRmllbGRDb250cm9sKSB7XG5cdFx0XHRiUmVhZE9ubHkgPSBiUmVhZE9ubHkgfHwgb0ZpZWxkQ29udHJvbCA9PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xUeXBlL1JlYWRPbmx5XCI7XG5cdFx0fVxuXHRcdGlmIChiUmVhZE9ubHkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXHRyZWFkT25seUV4cHJlc3Npb25Gcm9tRHluYW1pY0Fubm90YXRpb25zOiBmdW5jdGlvbiAob0ZpZWxkQ29udHJvbDogYW55KSB7XG5cdFx0bGV0IHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seTtcblx0XHRpZiAob0ZpZWxkQ29udHJvbCkge1xuXHRcdFx0aWYgKChNYW5hZ2VkT2JqZWN0IGFzIGFueSkuYmluZGluZ1BhcnNlcihvRmllbGRDb250cm9sKSkge1xuXHRcdFx0XHRzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkgPSBcIiVcIiArIG9GaWVsZENvbnRyb2wgKyBcIiA9PT0gMSBcIjtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSkge1xuXHRcdFx0cmV0dXJuIFwiez0gXCIgKyBzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkgKyBcIj8gZmFsc2UgOiB0cnVlIH1cIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fSxcblx0Lypcblx0ICogRnVuY3Rpb24gdG8gZ2V0IHRoZSBleHByZXNzaW9uIGZvciBjaGFydCBUaXRsZSBQcmVzc1xuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtvQ29uZmlndXJhdGlvbn0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3Rcblx0ICogIEBwYXJhbSB7b01hbmlmZXN0fSBbb01hbmlmZXN0XSBPdXRib3VuZHMgZnJvbSBtYW5pZmVzdFxuXHQgKiByZXR1cm5zIHtTdHJpbmd9IFtzQ29sbGVjdGlvbk5hbWVdIENvbGxlY3Rpb24gTmFtZSBvZiB0aGUgTWljcm8gQ2hhcnRcblx0ICpcblx0ICogcmV0dXJucyB7U3RyaW5nfSBbRXhwcmVzc2lvbl0gSGFuZGxlciBFeHByZXNzaW9uIGZvciB0aGUgdGl0bGUgcHJlc3Ncblx0ICpcblx0ICovXG5cdGdldEV4cHJlc3Npb25Gb3JNaWNyb0NoYXJ0VGl0bGVQcmVzczogZnVuY3Rpb24gKG9Db25maWd1cmF0aW9uOiBhbnksIG9NYW5pZmVzdE91dGJvdW5kOiBhbnksIHNDb2xsZWN0aW9uTmFtZTogYW55KSB7XG5cdFx0aWYgKG9Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSkgfHxcblx0XHRcdFx0KG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl0gJiYgb0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXVtcIm91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcIi5oYW5kbGVycy5vbkRhdGFQb2ludFRpdGxlUHJlc3NlZCgkY29udHJvbGxlciwgJHskc291cmNlPi99LCdcIiArXG5cdFx0XHRcdFx0SlNPTi5zdHJpbmdpZnkob01hbmlmZXN0T3V0Ym91bmQpICtcblx0XHRcdFx0XHRcIicsJ1wiICtcblx0XHRcdFx0XHRvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0gK1xuXHRcdFx0XHRcdFwiJywnXCIgK1xuXHRcdFx0XHRcdHNDb2xsZWN0aW9uTmFtZSArXG5cdFx0XHRcdFx0XCInIClcIlxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmIChvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRcdHJldHVybiBcIi5oYW5kbGVycy5uYXZpZ2F0ZVRvU3ViU2VjdGlvbigkY29udHJvbGxlciwgJ1wiICsgSlNPTi5zdHJpbmdpZnkob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkgKyBcIicpXCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0Lypcblx0ICogRnVuY3Rpb24gdG8gcmVuZGVyIENoYXJ0IFRpdGxlIGFzIExpbmtcblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b0NvbnRyb2xDb25maWd1cmF0aW9ufSBbb0NvbmZpZ3VyYXRpb25zXSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuXHQgKiByZXR1cm5zIHtTdHJpbmd9IFtzS2V5XSBGb3IgdGhlIFRhcmdldE91dGJvdW5kIGFuZCBUYXJnZXRTZWN0aW9uXG5cdCAqXG5cdCAqL1xuXHRnZXRNaWNyb0NoYXJ0VGl0bGVBc0xpbms6IGZ1bmN0aW9uIChvQ29udHJvbENvbmZpZ3VyYXRpb246IGFueSkge1xuXHRcdGlmIChcblx0XHRcdG9Db250cm9sQ29uZmlndXJhdGlvbiAmJlxuXHRcdFx0KG9Db250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdIHx8XG5cdFx0XHRcdChvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiBvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gXCJFeHRlcm5hbFwiO1xuXHRcdH0gZWxzZSBpZiAob0NvbnRyb2xDb25maWd1cmF0aW9uICYmIG9Db250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRyZXR1cm4gXCJJblBhZ2VcIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFwiTm9uZVwiO1xuXHRcdH1cblx0fSxcblxuXHQvKiBHZXQgZ3JvdXBJZCBmcm9tIGNvbnRyb2wgY29uZmlndXJhdGlvblxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvQ29uZmlndXJhdGlvbnNdIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBbc0Fubm90YXRpb25QYXRoXSBBbm5vdGF0aW9uIFBhdGggZm9yIHRoZSBjb25maWd1cmF0aW9uXG5cdCAqIEBkZXNjcmlwdGlvbiBVc2VkIHRvIGdldCB0aGUgZ3JvdXBJZCBmb3IgRGF0YVBvaW50cyBhbmQgTWljcm9DaGFydHMgaW4gdGhlIEhlYWRlci5cblx0ICpcblx0ICovXG5cdGdldEdyb3VwSWRGcm9tQ29uZmlnOiBmdW5jdGlvbiAob0NvbmZpZ3VyYXRpb25zOiBhbnksIHNBbm5vdGF0aW9uUGF0aDogYW55LCBzRGVmYXVsdEdyb3VwSWQ/OiBhbnkpIHtcblx0XHRjb25zdCBvQ29uZmlndXJhdGlvbiA9IG9Db25maWd1cmF0aW9uc1tzQW5ub3RhdGlvblBhdGhdLFxuXHRcdFx0YUF1dG9QYXR0ZXJucyA9IFtcIkhlcm9lc1wiLCBcIkRlY29yYXRpb25cIiwgXCJXb3JrZXJzXCIsIFwiTG9uZ1J1bm5lcnNcIl07XG5cdFx0bGV0IHNHcm91cElkID0gc0RlZmF1bHRHcm91cElkO1xuXHRcdGlmIChcblx0XHRcdG9Db25maWd1cmF0aW9uICYmXG5cdFx0XHRvQ29uZmlndXJhdGlvbi5yZXF1ZXN0R3JvdXBJZCAmJlxuXHRcdFx0YUF1dG9QYXR0ZXJucy5zb21lKGZ1bmN0aW9uIChhdXRvUGF0dGVybjogc3RyaW5nKSB7XG5cdFx0XHRcdHJldHVybiBhdXRvUGF0dGVybiA9PT0gb0NvbmZpZ3VyYXRpb24ucmVxdWVzdEdyb3VwSWQ7XG5cdFx0XHR9KVxuXHRcdCkge1xuXHRcdFx0c0dyb3VwSWQgPSBcIiRhdXRvLlwiICsgb0NvbmZpZ3VyYXRpb24ucmVxdWVzdEdyb3VwSWQ7XG5cdFx0fVxuXHRcdHJldHVybiBzR3JvdXBJZDtcblx0fSxcblxuXHQvKlxuXHQgKiBHZXQgQ29udGV4dCBCaW5kaW5nIHdpdGggZ3JvdXBJZCBmcm9tIGNvbnRyb2wgY29uZmlndXJhdGlvblxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvQ29uZmlndXJhdGlvbnNdIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBbc0tleV0gQW5ub3RhdGlvbiBQYXRoIGZvciBvZiB0aGUgY29uZmlndXJhdGlvblxuXHQgKiBAZGVzY3JpcHRpb24gVXNlZCB0byBnZXQgdGhlIGJpbmRpbmcgZm9yIERhdGFQb2ludHMgaW4gdGhlIEhlYWRlci5cblx0ICpcblx0ICovXG5cdGdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWc6IGZ1bmN0aW9uIChvQ29uZmlndXJhdGlvbnM6IGFueSwgc0tleTogYW55KSB7XG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBBbm5vdGF0aW9uSGVscGVyLmdldEdyb3VwSWRGcm9tQ29uZmlnKG9Db25maWd1cmF0aW9ucywgc0tleSk7XG5cdFx0bGV0IHNCaW5kaW5nO1xuXHRcdGlmIChzR3JvdXBJZCkge1xuXHRcdFx0c0JpbmRpbmcgPSBcInsgcGF0aCA6ICcnLCBwYXJhbWV0ZXJzIDogeyAkJGdyb3VwSWQgOiAnXCIgKyBzR3JvdXBJZCArIFwiJyB9IH1cIjtcblx0XHR9XG5cdFx0cmV0dXJuIHNCaW5kaW5nO1xuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgYSBGaWVsZEdyb3VwIGNvbnNpc3RzIG9mIG9ubHkgMSBEYXRhRmllbGQgd2l0aCBNdWx0aUxpbmUgVGV4dCBhbm5vdGF0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0RhdGFGaWVsZEFic3RyYWN0VHlwZXNbXX0gYUZvcm1FbGVtZW50cyBBIGNvbGxlY3Rpb24gb2YgZm9ybSBlbGVtZW50cyB1c2VkIGluIHRoZSBjdXJyZW50IGZpZWxkIGdyb3VwXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgb25seSAxIGRhdGEgZmllbGQgd2l0aCBNdWx0aWxpbmUgVGV4dCBhbm5vdGF0aW9uIGV4aXN0cy5cblx0ICovXG5cdGRvZXNGaWVsZEdyb3VwQ29udGFpbk9ubHlPbmVNdWx0aUxpbmVEYXRhRmllbGQ6IGZ1bmN0aW9uIChhRm9ybUVsZW1lbnRzOiBhbnlbXSkge1xuXHRcdHJldHVybiBhRm9ybUVsZW1lbnRzICYmIGFGb3JtRWxlbWVudHMubGVuZ3RoID09PSAxICYmICEhYUZvcm1FbGVtZW50c1swXS5pc1ZhbHVlTXVsdGlsaW5lVGV4dDtcblx0fSxcblx0Lypcblx0ICogR2V0IFZpc2libGl0eSBvZiBicmVhZGNydW1icy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb1ZpZXdEYXRhXSBWaWV3RGF0YSBtb2RlbFxuXHQgKiByZXR1cm5zIHsqfSBFeHByZXNzaW9uIG9yIGJvb2xlYW5cblx0ICovXG5cdGdldFZpc2libGVFeHByZXNzaW9uRm9yQnJlYWRjcnVtYnM6IGZ1bmN0aW9uIChvVmlld0RhdGE6IGFueSkge1xuXHRcdHJldHVybiBvVmlld0RhdGEuc2hvd0JyZWFkQ3J1bWJzICYmIG9WaWV3RGF0YS5mY2xFbmFibGVkICE9PSB1bmRlZmluZWRcblx0XHRcdD8gXCJ7ZmNsaGVscGVyPi9icmVhZENydW1iSXNWaXNpYmxlfVwiXG5cdFx0XHQ6IG9WaWV3RGF0YS5zaG93QnJlYWRDcnVtYnM7XG5cdH0sXG5cdGdldFNoYXJlQnV0dG9uVmlzaWJpbGl0eTogZnVuY3Rpb24gKHZpZXdEYXRhOiBhbnkpIHtcblx0XHRsZXQgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCA9IFwiISR7dWk+Y3JlYXRlTW9kZX1cIjtcblx0XHRpZiAodmlld0RhdGEuZmNsRW5hYmxlZCkge1xuXHRcdFx0c1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCA9IFwiJHtmY2xoZWxwZXI+L3Nob3dTaGFyZUljb259ICYmIFwiICsgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cDtcblx0XHR9XG5cdFx0cmV0dXJuIFwiez0gXCIgKyBzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwICsgXCIgfVwiO1xuXHR9LFxuXG5cdC8qXG5cdCAqIEdldCB2aXNpYmxpdHkgZm9yIGVkaXRhYmxlIGhlYWRlciBmYWNldC5cblx0ICpcblx0ICogSWYgZWl0aGVyIHRoZSB0aXRsZSBvciBkZXNjcmlwdGlvbiBmaWVsZCBmcm9tIHRoZSBoZWFkZXIgYW5ub3RhdGlvbnMgYXJlIGVkaXRhYmxlLCB0aGVuIHRoZVxuXHQgKiBlZGl0YWJsZSBoZWFkZXIgZmFjZXQgaXMgdmlzaWJsZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0Fubm90YXRpb25zXSBBbm5vdGF0aW9ucyBvYmplY3QgZm9yIGdpdmVuIGVudGl0eSBzZXRcblx0ICogQHBhcmFtIHtvYmplY3R9IFtvRmllbGRDb250cm9sXSBmaWVsZCBjb250cm9sXG5cdCAqIHJldHVybnMgeyp9ICBiaW5kaW5nIGV4cHJlc3Npb24gb3IgYm9vbGVhbiB2YWx1ZSByZXNvbHZlZCBmb3JtIGZ1bmNpdG9ucyBpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zIGFuZCBpc1JlYWRPbmx5RnJvbUR5bmFtaWNBbm5vdGF0aW9uc1xuXHQgKi9cblx0Z2V0VmlzaWJsaXR5T2ZIZWFkZXJGYWNldDogZnVuY3Rpb24gKFxuXHRcdG9UaXRsZUFubm90YXRpb25zOiBhbnksXG5cdFx0b0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnM6IGFueSxcblx0XHRvRmllbGRUaXRsZUZpZWxkQ29udHJvbDogYW55LFxuXHRcdG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sOiBhbnlcblx0KSB7XG5cdFx0Ly8gQ2hlY2sgQW5ub3RhdGlvbnMgZm9yIFRpdGxlIEZpZWxkXG5cdFx0Y29uc3QgYklzVGl0bGVSZWFkT25seSA9IEFubm90YXRpb25IZWxwZXIuaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyhvVGl0bGVBbm5vdGF0aW9ucywgb0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wpO1xuXHRcdGNvbnN0IHRpdGxlRXhwcmVzc2lvbiA9IEFubm90YXRpb25IZWxwZXIucmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyhvRmllbGRUaXRsZUZpZWxkQ29udHJvbCk7XG5cdFx0Ly8gVGhlcmUgaXMgbm8gZXhwcmVzc2lvbiBhbmQgdGhlIHRpdGxlIGlzIG5vdCByZWFkeSBvbmx5LCB0aGlzIGlzIHN1ZmZpY2llbnQgZm9yIGFuIGVkaXRhYmxlIGhlYWRlclxuXHRcdGlmICghYklzVGl0bGVSZWFkT25seSAmJiAhdGl0bGVFeHByZXNzaW9uKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBDaGVjayBBbm5vdGF0aW9ucyBmb3IgRGVzY3JpcHRpb24gRmllbGRcblx0XHRjb25zdCBiSXNEZXNjcmlwdGlvblJlYWRPbmx5ID0gQW5ub3RhdGlvbkhlbHBlci5pc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zKFxuXHRcdFx0b0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnMsXG5cdFx0XHRvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbFxuXHRcdCk7XG5cdFx0Y29uc3QgZGVzY3JpcHRpb25FeHByZXNzaW9uID0gQW5ub3RhdGlvbkhlbHBlci5yZWFkT25seUV4cHJlc3Npb25Gcm9tRHluYW1pY0Fubm90YXRpb25zKG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sKTtcblx0XHQvLyBUaGVyZSBpcyBubyBleHByZXNzaW9uIGFuZCB0aGUgZGVzY3JpcHRpb24gaXMgbm90IHJlYWR5IG9ubHksIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYW4gZWRpdGFibGUgaGVhZGVyXG5cdFx0aWYgKCFiSXNEZXNjcmlwdGlvblJlYWRPbmx5ICYmICFkZXNjcmlwdGlvbkV4cHJlc3Npb24pIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIEJvdGggdGl0bGUgYW5kIGRlc2NyaXB0aW9uIGFyZSBub3QgZWRpdGFibGUgYW5kIHRoZXJlIGFyZSBubyBkeW5hbWljIGFubm90YXRpb25zXG5cdFx0aWYgKGJJc1RpdGxlUmVhZE9ubHkgJiYgYklzRGVzY3JpcHRpb25SZWFkT25seSAmJiAhdGl0bGVFeHByZXNzaW9uICYmICFkZXNjcmlwdGlvbkV4cHJlc3Npb24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBOb3cgY29tYmluZSBleHByZXNzaW9uc1xuXHRcdGlmICh0aXRsZUV4cHJlc3Npb24gJiYgIWRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdFx0cmV0dXJuIHRpdGxlRXhwcmVzc2lvbjtcblx0XHR9IGVsc2UgaWYgKCF0aXRsZUV4cHJlc3Npb24gJiYgZGVzY3JpcHRpb25FeHByZXNzaW9uKSB7XG5cdFx0XHRyZXR1cm4gZGVzY3JpcHRpb25FeHByZXNzaW9uO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gQW5ub3RhdGlvbkhlbHBlci5jb21iaW5lVGl0bGVBbmREZXNjcmlwdGlvbkV4cHJlc3Npb24ob0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wsIG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sKTtcblx0XHR9XG5cdH0sXG5cdGNvbWJpbmVUaXRsZUFuZERlc2NyaXB0aW9uRXhwcmVzc2lvbjogZnVuY3Rpb24gKG9UaXRsZUZpZWxkQ29udHJvbDogYW55LCBvRGVzY3JpcHRpb25GaWVsZENvbnRyb2w6IGFueSkge1xuXHRcdC8vIElmIGJvdGggaGVhZGVyIGFuZCB0aXRsZSBmaWVsZCBhcmUgYmFzZWQgb24gZHlubWFpYyBmaWVsZCBjb250cm9sLCB0aGUgZWRpdGFibGUgaGVhZGVyXG5cdFx0Ly8gaXMgdmlzaWJsZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgaXMgbm90IHJlYWR5IG9ubHlcblx0XHRyZXR1cm4gXCJ7PSAlXCIgKyBvVGl0bGVGaWVsZENvbnRyb2wgKyBcIiA9PT0gMSA/ICggJVwiICsgb0Rlc2NyaXB0aW9uRmllbGRDb250cm9sICsgXCIgPT09IDEgPyBmYWxzZSA6IHRydWUgKSA6IHRydWUgfVwiO1xuXHR9LFxuXHQvKlxuXHQgKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBvZiBkZWxldGUgYnV0dG9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzRW50aXR5U2V0TmFtZV0gRW50aXR5IHNldCBuYW1lXG5cdCAqIHJldHVybnMge3N0cmluZ30gIGJpbmRpbmcgZXhwcmVzc2lvbiAvIGZ1bmN0aW9uIHN0cmluZyBnZW5lcmF0ZWQgZnJvbSBjb21tYW5oZWxwZXIncyBmdW5jdGlvbiBnZW5lcmF0ZUZ1bmN0aW9uXG5cdCAqL1xuXHRnZXRQcmVzc0V4cHJlc3Npb25Gb3JEZWxldGU6IGZ1bmN0aW9uIChzRW50aXR5U2V0TmFtZTogYW55KSB7XG5cdFx0Y29uc3Qgc0RlbGV0YWJsZUNvbnRleHRzID0gXCIkeyR2aWV3Pi9nZXRCaW5kaW5nQ29udGV4dH1cIixcblx0XHRcdHNUaXRsZSA9IFwiJHskdmlldz4vI2ZlOjpPYmplY3RQYWdlL2dldEhlYWRlclRpdGxlL2dldEV4cGFuZGVkSGVhZGluZy9nZXRJdGVtcy8xL2dldFRleHR9XCIsXG5cdFx0XHRzRGVzY3JpcHRpb24gPSBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS9nZXRIZWFkZXJUaXRsZS9nZXRFeHBhbmRlZENvbnRlbnQvMC9nZXRJdGVtcy8wL2dldFRleHR9XCI7XG5cdFx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHRcdHRpdGxlOiBzVGl0bGUsXG5cdFx0XHRlbnRpdHlTZXROYW1lOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNFbnRpdHlTZXROYW1lKSxcblx0XHRcdGRlc2NyaXB0aW9uOiBzRGVzY3JpcHRpb25cblx0XHR9O1xuXHRcdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcIi5lZGl0Rmxvdy5kZWxldGVEb2N1bWVudFwiLCBzRGVsZXRhYmxlQ29udGV4dHMsIENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKSk7XG5cdH0sXG5cdC8qXG5cdCAqIEdldCBFeHByZXNzaW9uIG9mIHByZXNzIGV2ZW50IG9mIEVkaXQgYnV0dG9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IFtvRGF0YUZpZWxkXSBEYXRhIGZpZWxkIG9iamVjdFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NFbnRpdHlTZXROYW1lXSBFbnRpdHkgc2V0IG5hbWVcblx0ICogQHBhcmFtIHtvYmplY3R9IFtvSGVhZGVyQWN0aW9uXSBIZWFkZXIgYWN0aW9uIG9iamVjdFxuXHQgKiByZXR1cm5zIHtzdHJpbmd9ICBiaW5kaW5nIGV4cHJlc3Npb24gLyBmdW5jdGlvbiBzdHJpbmcgZ2VuZXJhdGVkIGZyb20gY29tbWFuaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuXHQgKi9cblx0Z2V0UHJlc3NFeHByZXNzaW9uRm9yRWRpdDogZnVuY3Rpb24gKG9EYXRhRmllbGQ6IGFueSwgc0VudGl0eVNldE5hbWU6IGFueSwgb0hlYWRlckFjdGlvbjogYW55KSB7XG5cdFx0Y29uc3Qgc0VkaXRhYmxlQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5BY3Rpb24pLFxuXHRcdFx0c0RhdGFGaWVsZEVudW1NZW1iZXIgPSBvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nICYmIG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nW1wiJEVudW1NZW1iZXJcIl0sXG5cdFx0XHRzSW52b2NhdGlvbkdyb3VwID1cblx0XHRcdFx0c0RhdGFGaWVsZEVudW1NZW1iZXIgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuT3BlcmF0aW9uR3JvdXBpbmdUeXBlL0NoYW5nZVNldFwiID8gXCJDaGFuZ2VTZXRcIiA6IFwiSXNvbGF0ZWRcIjtcblx0XHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdFx0Y29udGV4dHM6IFwiJHskdmlldz4vZ2V0QmluZGluZ0NvbnRleHR9XCIsXG5cdFx0XHRlbnRpdHlTZXROYW1lOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNFbnRpdHlTZXROYW1lKSxcblx0XHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRcdG1vZGVsOiBcIiR7JHNvdXJjZT4vfS5nZXRNb2RlbCgpXCIsXG5cdFx0XHRsYWJlbDogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuTGFiZWwsIHRydWUpLFxuXHRcdFx0aXNOYXZpZ2FibGU6IG9IZWFkZXJBY3Rpb24gJiYgb0hlYWRlckFjdGlvbi5pc05hdmlnYWJsZSxcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjpcblx0XHRcdFx0b0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHRcdFx0XHRcdD8gXCInXCIgKyBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiArIFwiJ1wiXG5cdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHR9O1xuXHRcdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcblx0XHRcdFwiLmhhbmRsZXJzLm9uQ2FsbEFjdGlvblwiLFxuXHRcdFx0XCIkeyR2aWV3Pi99XCIsXG5cdFx0XHRzRWRpdGFibGVDb250ZXh0cyxcblx0XHRcdENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKVxuXHRcdCk7XG5cdH0sXG5cdC8qXG5cdCAqIE1ldGhvZCB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIHRoZSAncHJlc3MnIGV2ZW50IGZvciBmb290ZXIgYW5ub3RhdGlvbiBhY3Rpb25zXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29EYXRhRmllbGRdIERhdGEgZmllbGQgb2JqZWN0XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbc0VudGl0eVNldE5hbWVdIEVudGl0eSBzZXQgbmFtZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29IZWFkZXJBY3Rpb25dIEhlYWRlciBhY3Rpb24gb2JqZWN0XG5cdCAqIHJldHVybnMge3N0cmluZ30gIEJpbmRpbmcgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiBzdHJpbmcgdGhhdCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgQ29tbW9uaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuXHQgKi9cblx0Z2V0UHJlc3NFeHByZXNzaW9uRm9yRm9vdGVyQW5ub3RhdGlvbkFjdGlvbjogZnVuY3Rpb24gKG9EYXRhRmllbGQ6IGFueSwgc0VudGl0eVNldE5hbWU6IGFueSwgb0hlYWRlckFjdGlvbjogYW55KSB7XG5cdFx0Y29uc3Qgc0FjdGlvbkNvbnRleHRzID0gQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuQWN0aW9uKSxcblx0XHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID0gb0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZyAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZ1tcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdFx0c0ludm9jYXRpb25Hcm91cCA9XG5cdFx0XHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk9wZXJhdGlvbkdyb3VwaW5nVHlwZS9DaGFuZ2VTZXRcIiA/IFwiQ2hhbmdlU2V0XCIgOiBcIklzb2xhdGVkXCI7XG5cdFx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS99LmdldEJpbmRpbmdDb250ZXh0KClcIixcblx0XHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNJbnZvY2F0aW9uR3JvdXApLFxuXHRcdFx0bW9kZWw6IFwiJHskc291cmNlPi99LmdldE1vZGVsKClcIixcblx0XHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5MYWJlbCwgdHJ1ZSksXG5cdFx0XHRpc05hdmlnYWJsZTogb0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmlzTmF2aWdhYmxlLFxuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOlxuXHRcdFx0XHRvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uXG5cdFx0XHRcdFx0PyBcIidcIiArIG9IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uICsgXCInXCJcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdH07XG5cdFx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFwiLmhhbmRsZXJzLm9uQ2FsbEFjdGlvblwiLCBcIiR7JHZpZXc+L31cIiwgc0FjdGlvbkNvbnRleHRzLCBDb21tb25IZWxwZXIub2JqZWN0VG9TdHJpbmcob1BhcmFtcykpO1xuXHR9LFxuXHQvKlxuXHQgKiBHZXRzIHRoZSBiaW5kaW5nIG9mIHRoZSBjb250YWluZXIgSEJveCBmb3IgdGhlIGhlYWRlciBmYWNldC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0NvbnRyb2xDb25maWd1cmF0aW9uXSBUaGUgY29udHJvbCBjb25maWd1cmF0aW9uIGZvcm0gb2YgdGhlIHZpZXdEYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0hlYWRlckZhY2V0XSBUaGUgb2JqZWN0IG9mIHRoZSBoZWFkZXIgZmFjZXRcblx0ICogcmV0dXJucyB7Kn0gIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZnJvbSBmdW5jdGlvbiBnZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnIG9yIHVuZGVmaW5lZC5cblx0ICovXG5cdGdldFN0YXNoYWJsZUhCb3hCaW5kaW5nOiBmdW5jdGlvbiAob0NvbnRyb2xDb25maWd1cmF0aW9uOiBhbnksIG9IZWFkZXJGYWNldDogYW55KSB7XG5cdFx0aWYgKG9IZWFkZXJGYWNldCAmJiBvSGVhZGVyRmFjZXQuRmFjZXQgJiYgb0hlYWRlckZhY2V0LkZhY2V0LnRhcmdldEFubm90YXRpb25UeXBlID09PSBcIkRhdGFQb2ludFwiKSB7XG5cdFx0XHRyZXR1cm4gQW5ub3RhdGlvbkhlbHBlci5nZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnKG9Db250cm9sQ29uZmlndXJhdGlvbiwgb0hlYWRlckZhY2V0LkZhY2V0LnRhcmdldEFubm90YXRpb25WYWx1ZSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qXG5cdCAqIEdldHMgdGhlICdQcmVzcycgZXZlbnQgZXhwcmVzc2lvbiBmb3IgdGhlIGV4dGVybmFsIGFuZCBpbnRlcm5hbCBkYXRhIHBvaW50IGxpbmsuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29Db25maWd1cmF0aW9uXSBDb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29NYW5pZmVzdE91dGJvdW5kXSBPdXRib3VuZHMgZnJvbSBtYW5pZmVzdFxuXHQgKiByZXR1cm5zIHtzdHJpbmd9IFRoZSBydW50aW1lIGJpbmRpbmcgb2YgdGhlICdQcmVzcycgZXZlbnRcblx0ICovXG5cdGdldFByZXNzRXhwcmVzc2lvbkZvckxpbms6IGZ1bmN0aW9uIChvQ29uZmlndXJhdGlvbjogYW55LCBvTWFuaWZlc3RPdXRib3VuZDogYW55KSB7XG5cdFx0aWYgKG9Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRpZiAob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiBvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0pIHtcblx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcIi5oYW5kbGVycy5vbkRhdGFQb2ludFRpdGxlUHJlc3NlZCgkY29udHJvbGxlciwgJHskc291cmNlPn0sIFwiICtcblx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeShvTWFuaWZlc3RPdXRib3VuZCkgK1xuXHRcdFx0XHRcdFwiLFwiICtcblx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeShvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0pICtcblx0XHRcdFx0XHRcIilcIlxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmIChvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRcdHJldHVybiBcIi5oYW5kbGVycy5uYXZpZ2F0ZVRvU3ViU2VjdGlvbigkY29udHJvbGxlciwgJ1wiICsgSlNPTi5zdHJpbmdpZnkob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkgKyBcIicpXCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0aXNTdWJTZWN0aW9uVGl0bGVWaXNpYmxlOiBmdW5jdGlvbiAoc1N1YlNlY3Rpb252aXNpYmxlOiBhbnksIHNTdWJTZWN0aW9udGl0bGU6IGFueSwgc1N1YlNlY3Rpb25zaG93VGl0bGU6IGFueSkge1xuXHRcdGlmIChzU3ViU2VjdGlvbnZpc2libGUuaW5kZXhPZihcIns9XCIpID09PSAwKSB7XG5cdFx0XHQvLyBEeW5hbWljIGV4cHJlc3Npb25cblx0XHRcdGNvbnN0IHNFeHByZXNzaW9uUmVzdWx0ID0gc1N1YlNlY3Rpb252aXNpYmxlLnN1YnN0cmluZyhcblx0XHRcdFx0c1N1YlNlY3Rpb252aXNpYmxlLmluZGV4T2YoXCJ7PVwiKSArIDIsXG5cdFx0XHRcdHNTdWJTZWN0aW9udmlzaWJsZS5sYXN0SW5kZXhPZihcIn1cIilcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcIns9IChcIiArXG5cdFx0XHRcdHNFeHByZXNzaW9uUmVzdWx0ICtcblx0XHRcdFx0XCIpICYmICgnXCIgK1xuXHRcdFx0XHRzU3ViU2VjdGlvbnRpdGxlICtcblx0XHRcdFx0XCInICE9PSd1bmRlZmluZWQnKSAmJiAoXCIgK1xuXHRcdFx0XHRzU3ViU2VjdGlvbnNob3dUaXRsZSArXG5cdFx0XHRcdFwiID8gdHJ1ZSA6IGZhbHNlKSB9XCJcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBzU3ViU2VjdGlvbnZpc2libGUgJiYgc1N1YlNlY3Rpb250aXRsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiAoc1N1YlNlY3Rpb25zaG93VGl0bGUgPyBcInRydWVcIiA6IFwiZmFsc2VcIik7XG5cdFx0fVxuXHR9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBbm5vdGF0aW9uSGVscGVyO1xuIl19