@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.
- package/package.json +1 -1
- package/src/sap/fe/templates/.library +1 -1
- package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +2 -2
- package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.ts +1 -1
- package/src/sap/fe/templates/Feedback.js +18 -18
- package/src/sap/fe/templates/Feedback.ts +12 -12
- package/src/sap/fe/templates/ListReport/ExtensionAPI.js +15 -15
- package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +19 -16
- package/src/sap/fe/templates/ListReport/ListReport.view.xml +107 -58
- package/src/sap/fe/templates/ListReport/ListReportController.controller.js +180 -70
- package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +191 -88
- package/src/sap/fe/templates/ListReport/ListReportTemplating.js +45 -0
- package/src/sap/fe/templates/ListReport/ListReportTemplating.ts +30 -0
- package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +1 -1
- package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.ts +2 -2
- package/src/sap/fe/templates/ListReport/overrides/Share.js +9 -7
- package/src/sap/fe/templates/ListReport/overrides/Share.ts +10 -10
- package/src/sap/fe/templates/ListReport/overrides/ViewState.js +13 -6
- package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +17 -11
- package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +1 -1
- package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.ts +1 -1
- package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +12 -16
- package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +17 -20
- package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +167 -20
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +195 -206
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +187 -229
- package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +861 -0
- package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +822 -0
- package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +2 -3
- package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.ts +4 -4
- package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +1 -1
- package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.ts +1 -1
- package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +1 -1
- package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.ts +1 -1
- package/src/sap/fe/templates/ObjectPage/handler/DraftHandler.js +103 -0
- package/src/sap/fe/templates/ObjectPage/handler/DraftHandler.ts +97 -0
- package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +1 -1
- package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +5 -5
- package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +1 -1
- package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +2 -2
- package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +1 -1
- package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.ts +2 -2
- package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +1 -1
- package/src/sap/fe/templates/ObjectPage/overrides/Paginator.ts +1 -1
- package/src/sap/fe/templates/ObjectPage/overrides/Share.js +17 -17
- package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +19 -30
- package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +2 -2
- package/src/sap/fe/templates/ObjectPage/overrides/ViewState.ts +4 -4
- package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +15 -11
- package/src/sap/fe/templates/ObjectPage/view/fragments/CollaborationDraft.fragment.xml +1 -2
- package/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +25 -17
- package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +28 -24
- package/src/sap/fe/templates/ObjectPage/view/fragments/FormActionButtons.fragment.xml +15 -16
- package/src/sap/fe/templates/ObjectPage/view/fragments/FormActions.fragment.xml +1 -5
- package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPoint.fragment.xml +1 -2
- package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPointTitle.fragment.xml +1 -3
- package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacet.fragment.xml +3 -17
- package/src/sap/fe/templates/ObjectPage/view/fragments/Heading.fragment.xml +16 -17
- package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingTitle.fragment.xml +4 -3
- package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderAddress.fragment.xml +7 -2
- package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderContact.fragment.xml +26 -0
- package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +4 -4
- package/src/sap/fe/templates/ObjectPage/view/fragments/RelatedApps.fragment.xml +7 -4
- package/src/sap/fe/templates/ObjectPage/view/fragments/Section.fragment.xml +74 -6
- package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContent.fragment.xml +118 -94
- package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContentLazyLoader.fragment.xml +127 -107
- package/src/sap/fe/templates/ObjectPage/view/fragments/SectionFormContent.fragment.xml +1 -0
- package/src/sap/fe/templates/ObjectPage/view/fragments/SectionMoreFormContent.fragment.xml +1 -0
- package/src/sap/fe/templates/ObjectPage/view/fragments/SwitchDraftAndActiveObjectPopOver.fragment.xml +2 -2
- package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +102 -57
- package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +96 -61
- package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.js +3 -4
- package/src/sap/fe/templates/RootContainer/controller/NavContainer.controller.ts +4 -5
- package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.js +140 -52
- package/src/sap/fe/templates/RootContainer/controller/RootContainerBaseController.ts +108 -54
- package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +1 -1
- package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +3 -3
- package/src/sap/fe/templates/TableScroller.js +3 -3
- package/src/sap/fe/templates/TableScroller.ts +2 -2
- package/src/sap/fe/templates/controls/MacroChart.fragment.xml +1 -0
- package/src/sap/fe/templates/controls/Table.fragment.xml +4 -4
- package/src/sap/fe/templates/library.js +5 -2
- package/src/sap/fe/templates/library.ts +3 -0
- package/src/sap/fe/templates/messagebundle.properties +6 -18
- package/src/sap/fe/templates/messagebundle_ar.properties +10 -6
- package/src/sap/fe/templates/messagebundle_bg.properties +6 -2
- package/src/sap/fe/templates/messagebundle_ca.properties +10 -6
- package/src/sap/fe/templates/messagebundle_cs.properties +6 -2
- package/src/sap/fe/templates/messagebundle_cy.properties +10 -6
- package/src/sap/fe/templates/messagebundle_da.properties +10 -6
- package/src/sap/fe/templates/messagebundle_de.properties +10 -6
- package/src/sap/fe/templates/messagebundle_el.properties +10 -6
- package/src/sap/fe/templates/messagebundle_en.properties +6 -2
- package/src/sap/fe/templates/messagebundle_en_GB.properties +8 -4
- package/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +13 -5
- package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +7 -3
- package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +7 -3
- package/src/sap/fe/templates/messagebundle_es.properties +6 -2
- package/src/sap/fe/templates/messagebundle_es_MX.properties +10 -6
- package/src/sap/fe/templates/messagebundle_et.properties +6 -2
- package/src/sap/fe/templates/messagebundle_fi.properties +10 -6
- package/src/sap/fe/templates/messagebundle_fr.properties +6 -2
- package/src/sap/fe/templates/messagebundle_fr_CA.properties +10 -6
- package/src/sap/fe/templates/messagebundle_hi.properties +10 -6
- package/src/sap/fe/templates/messagebundle_hr.properties +10 -6
- package/src/sap/fe/templates/messagebundle_hu.properties +6 -2
- package/src/sap/fe/templates/messagebundle_id.properties +6 -2
- package/src/sap/fe/templates/messagebundle_it.properties +10 -6
- package/src/sap/fe/templates/messagebundle_iw.properties +10 -6
- package/src/sap/fe/templates/messagebundle_ja.properties +6 -2
- package/src/sap/fe/templates/messagebundle_kk.properties +10 -6
- package/src/sap/fe/templates/messagebundle_ko.properties +6 -2
- package/src/sap/fe/templates/messagebundle_lt.properties +6 -2
- package/src/sap/fe/templates/messagebundle_lv.properties +6 -2
- package/src/sap/fe/templates/messagebundle_ms.properties +10 -6
- package/src/sap/fe/templates/messagebundle_nl.properties +6 -2
- package/src/sap/fe/templates/messagebundle_no.properties +10 -6
- package/src/sap/fe/templates/messagebundle_pl.properties +10 -6
- package/src/sap/fe/templates/messagebundle_pt.properties +6 -2
- package/src/sap/fe/templates/messagebundle_pt_PT.properties +6 -2
- package/src/sap/fe/templates/messagebundle_ro.properties +10 -6
- package/src/sap/fe/templates/messagebundle_ru.properties +10 -6
- package/src/sap/fe/templates/messagebundle_sh.properties +6 -2
- package/src/sap/fe/templates/messagebundle_sk.properties +6 -2
- package/src/sap/fe/templates/messagebundle_sl.properties +10 -6
- package/src/sap/fe/templates/messagebundle_sv.properties +6 -2
- package/src/sap/fe/templates/messagebundle_th.properties +10 -6
- package/src/sap/fe/templates/messagebundle_tr.properties +6 -2
- package/src/sap/fe/templates/messagebundle_uk.properties +6 -2
- package/src/sap/fe/templates/messagebundle_vi.properties +10 -6
- package/src/sap/fe/templates/messagebundle_zh_CN.properties +10 -6
- package/src/sap/fe/templates/messagebundle_zh_TW.properties +10 -6
- package/src/sap/fe/templates/ObjectPage/AnnotationHelper.js +0 -482
- package/src/sap/fe/templates/ObjectPage/AnnotationHelper.ts +0 -511
- package/src/sap/fe/templates/ObjectPage/templating/ObjectPageTemplating.js +0 -120
- 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkFubm90YXRpb25IZWxwZXIudHMiXSwibmFtZXMiOlsiQW5ub3RhdGlvbkhlbHBlciIsImdldEVsZW1lbnRCaW5kaW5nIiwic1BhdGgiLCJzTmF2aWdhdGlvblBhdGgiLCJPRGF0YU1vZGVsQW5ub3RhdGlvbkhlbHBlciIsImdldE5hdmlnYXRpb25QYXRoIiwiY2hlY2tEcmFmdFN0YXRlIiwib0Fubm90YXRpb25zIiwiZ2V0U3dpdGNoVG9BY3RpdmVWaXNpYmlsaXR5IiwiZ2V0U3dpdGNoVG9EcmFmdFZpc2liaWxpdHkiLCJnZXRTd2l0Y2hEcmFmdEFuZEFjdGl2ZVZpc2liaWxpdHkiLCJfZmluZEFjdGlvbiIsImFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyIsInNBY3Rpb25UeXBlIiwib0FjdGlvbiIsImxlbmd0aCIsImZpbmQiLCJvSGVhZGVyQWN0aW9uIiwidHlwZSIsImdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25FbmFibGVkIiwib0RlbGV0ZUFjdGlvbiIsImVuYWJsZWQiLCJnZXREZWxldGVDb21tYW5kRXhlY3V0aW9uVmlzaWJsZSIsInZpc2libGUiLCJnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvblZpc2libGUiLCJvRWRpdEFjdGlvbiIsImdldEVkaXRDb21tYW5kRXhlY3V0aW9uRW5hYmxlZCIsImdldEVkaXRBY3Rpb24iLCJvRW50aXR5U2V0IiwiZ2V0UGF0aCIsImdldE9iamVjdCIsImJEcmFmdFJvb3QiLCJoYXNPd25Qcm9wZXJ0eSIsImJTdGlja3lTZXNzaW9uIiwic0FjdGlvbk5hbWUiLCJpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zIiwib0ZpZWxkQ29udHJvbCIsImJDb21wdXRlZCIsImJJbW11dGFibGUiLCJiUmVhZE9ubHkiLCJCb29sIiwicmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyIsInNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSIsIk1hbmFnZWRPYmplY3QiLCJiaW5kaW5nUGFyc2VyIiwiZ2V0RXhwcmVzc2lvbkZvck1pY3JvQ2hhcnRUaXRsZVByZXNzIiwib0NvbmZpZ3VyYXRpb24iLCJvTWFuaWZlc3RPdXRib3VuZCIsInNDb2xsZWN0aW9uTmFtZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ1bmRlZmluZWQiLCJnZXRNaWNyb0NoYXJ0VGl0bGVBc0xpbmsiLCJvQ29udHJvbENvbmZpZ3VyYXRpb24iLCJnZXRHcm91cElkRnJvbUNvbmZpZyIsIm9Db25maWd1cmF0aW9ucyIsInNBbm5vdGF0aW9uUGF0aCIsInNEZWZhdWx0R3JvdXBJZCIsImFBdXRvUGF0dGVybnMiLCJzR3JvdXBJZCIsInJlcXVlc3RHcm91cElkIiwic29tZSIsImF1dG9QYXR0ZXJuIiwiZ2V0QmluZGluZ1dpdGhHcm91cElkRnJvbUNvbmZpZyIsInNLZXkiLCJzQmluZGluZyIsImRvZXNGaWVsZEdyb3VwQ29udGFpbk9ubHlPbmVNdWx0aUxpbmVEYXRhRmllbGQiLCJhRm9ybUVsZW1lbnRzIiwiaXNWYWx1ZU11bHRpbGluZVRleHQiLCJnZXRWaXNpYmxlRXhwcmVzc2lvbkZvckJyZWFkY3J1bWJzIiwib1ZpZXdEYXRhIiwic2hvd0JyZWFkQ3J1bWJzIiwiZmNsRW5hYmxlZCIsImdldFNoYXJlQnV0dG9uVmlzaWJpbGl0eSIsInZpZXdEYXRhIiwic1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCIsImdldFZpc2libGl0eU9mSGVhZGVyRmFjZXQiLCJvVGl0bGVBbm5vdGF0aW9ucyIsIm9EZXNjcmlwdGlvbkFubm90YXRpb25zIiwib0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wiLCJvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbCIsImJJc1RpdGxlUmVhZE9ubHkiLCJ0aXRsZUV4cHJlc3Npb24iLCJiSXNEZXNjcmlwdGlvblJlYWRPbmx5IiwiZGVzY3JpcHRpb25FeHByZXNzaW9uIiwiY29tYmluZVRpdGxlQW5kRGVzY3JpcHRpb25FeHByZXNzaW9uIiwib1RpdGxlRmllbGRDb250cm9sIiwib0Rlc2NyaXB0aW9uRmllbGRDb250cm9sIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yRGVsZXRlIiwic0VudGl0eVNldE5hbWUiLCJzRGVsZXRhYmxlQ29udGV4dHMiLCJzVGl0bGUiLCJzRGVzY3JpcHRpb24iLCJvUGFyYW1zIiwidGl0bGUiLCJlbnRpdHlTZXROYW1lIiwiQ29tbW9uSGVscGVyIiwiYWRkU2luZ2xlUXVvdGVzIiwiZGVzY3JpcHRpb24iLCJnZW5lcmF0ZUZ1bmN0aW9uIiwib2JqZWN0VG9TdHJpbmciLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JFZGl0Iiwib0RhdGFGaWVsZCIsInNFZGl0YWJsZUNvbnRleHRzIiwiQWN0aW9uIiwic0RhdGFGaWVsZEVudW1NZW1iZXIiLCJJbnZvY2F0aW9uR3JvdXBpbmciLCJzSW52b2NhdGlvbkdyb3VwIiwiY29udGV4dHMiLCJpbnZvY2F0aW9uR3JvdXBpbmciLCJtb2RlbCIsImxhYmVsIiwiTGFiZWwiLCJpc05hdmlnYWJsZSIsImRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiIsImdldFByZXNzRXhwcmVzc2lvbkZvckZvb3RlckFubm90YXRpb25BY3Rpb24iLCJzQWN0aW9uQ29udGV4dHMiLCJnZXRTdGFzaGFibGVIQm94QmluZGluZyIsIm9IZWFkZXJGYWNldCIsIkZhY2V0IiwidGFyZ2V0QW5ub3RhdGlvblR5cGUiLCJ0YXJnZXRBbm5vdGF0aW9uVmFsdWUiLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JMaW5rIiwiaXNTdWJTZWN0aW9uVGl0bGVWaXNpYmxlIiwic1N1YlNlY3Rpb252aXNpYmxlIiwic1N1YlNlY3Rpb250aXRsZSIsInNTdWJTZWN0aW9uc2hvd1RpdGxlIiwiaW5kZXhPZiIsInNFeHByZXNzaW9uUmVzdWx0Iiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQSxnQkFBZ0IsR0FBRztBQUN4QkMsSUFBQUEsaUJBQWlCLEVBQUUsVUFBVUMsS0FBVixF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bW1vbkhlbHBlciBmcm9tIFwic2FwL2ZlL21hY3Jvcy9Db21tb25IZWxwZXJcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Bbm5vdGF0aW9uSGVscGVyXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbi8qXG5cdCBUaGlzIGNsYXNzIGNvbnRhaW5zIGFubm90YXRpb24gaGVscGVycyB0aGF0IG1pZ2h0IGJlIHVzZWQgZnJvbSBzZXZlcmFsIHRlbXBsYXRlcyBvciBjb250cm9sc1xuXHQgKi9cbmNvbnN0IEFubm90YXRpb25IZWxwZXIgPSB7XG5cdGdldEVsZW1lbnRCaW5kaW5nOiBmdW5jdGlvbiAoc1BhdGg6IGFueSkge1xuXHRcdGNvbnN0IHNOYXZpZ2F0aW9uUGF0aCA9IE9EYXRhTW9kZWxBbm5vdGF0aW9uSGVscGVyLmdldE5hdmlnYXRpb25QYXRoKHNQYXRoKTtcblx0XHRpZiAoc05hdmlnYXRpb25QYXRoKSB7XG5cdFx0XHRyZXR1cm4gXCJ7cGF0aDonXCIgKyBzTmF2aWdhdGlvblBhdGggKyBcIid9XCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSBuZWVkcyBlbXB0eSBvYmplY3Rcblx0XHRcdHJldHVybiBcIntwYXRoOiAnJ31cIjtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGNoZWNrIGlmIGRyYWZ0IHBhdHRlcm4gaXMgc3VwcG9ydGVkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0Fubm90YXRpb25zIEFubm90YXRpb25zIG9mIHRoZSBjdXJyZW50IGVudGl0eSBzZXQuXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIEJvb2xlYW4gdmFsdWUgYmFzZWQgb24gZHJhZnQgc3RhdGVcblx0ICovXG5cdGNoZWNrRHJhZnRTdGF0ZTogZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KSB7XG5cdFx0aWYgKFxuXHRcdFx0b0Fubm90YXRpb25zW1wiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIl0gJiZcblx0XHRcdG9Bbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCJdW1wiRWRpdEFjdGlvblwiXVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgdmlzaWJpbGl0eSBmb3IgdGhlIFN3aXRjaFRvQWN0aXZlIGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcblx0ICovXG5cdGdldFN3aXRjaFRvQWN0aXZlVmlzaWJpbGl0eTogZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0XHRpZiAodGhpcy5jaGVja0RyYWZ0U3RhdGUob0Fubm90YXRpb25zKSkge1xuXHRcdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICR7dWk+L2lzRWRpdGFibGV9ICYmICEke3VpPmNyZWF0ZU1vZGV9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBnZXQgdGhlIHZpc2liaWxpdHkgZm9yIHRoZSBTd2l0Y2hUb0RyYWZ0IGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcblx0ICovXG5cdGdldFN3aXRjaFRvRHJhZnRWaXNpYmlsaXR5OiBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnkpOiBhbnkge1xuXHRcdGlmICh0aGlzLmNoZWNrRHJhZnRTdGF0ZShvQW5ub3RhdGlvbnMpKSB7XG5cdFx0XHRyZXR1cm4gXCJ7PSAoJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9KSA/ICggISgke3VpPi9pc0VkaXRhYmxlfSkgJiYgISR7dWk+Y3JlYXRlTW9kZX0gJiYgJHtIYXNEcmFmdEVudGl0eX0gJiYgJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9ICkgOiBmYWxzZSB9XCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgdmlzaWJpbGl0eSBmb3IgdGhlIFN3aXRjaERyYWZ0QW5kQWN0aXZlIGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcblx0ICovXG5cdGdldFN3aXRjaERyYWZ0QW5kQWN0aXZlVmlzaWJpbGl0eTogZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0XHRpZiAodGhpcy5jaGVja0RyYWZ0U3RhdGUob0Fubm90YXRpb25zKSkge1xuXHRcdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICEke3VpPmNyZWF0ZU1vZGV9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmaW5kIGFuIGFjdGlvbiBmcm9tIHRoZSBhcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBpbiB0aGUgY29udmVydGVyIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7b2JqZWN0W119IGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiAnaGVhZGVyJyBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHNBY3Rpb25UeXBlIFRoZSBhY3Rpb24gdHlwZVxuXHQgKiBAcmV0dXJucyB7b2JqZWN0IHwgdW5kZWZpbmVkfSBUaGUgYWN0aW9uIHdpdGggdGhlIG1hdGNoaW5nIGFjdGlvbiB0eXBlXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfZmluZEFjdGlvbjogZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogYW55W10sIHNBY3Rpb25UeXBlOiBzdHJpbmcpIHtcblx0XHRsZXQgb0FjdGlvbjtcblx0XHRpZiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zICYmIGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucy5sZW5ndGgpIHtcblx0XHRcdG9BY3Rpb24gPSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMuZmluZChmdW5jdGlvbiAob0hlYWRlckFjdGlvbjogYW55KSB7XG5cdFx0XHRcdHJldHVybiBvSGVhZGVyQWN0aW9uLnR5cGUgPT09IHNBY3Rpb25UeXBlO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvQWN0aW9uO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgdGhlIERlbGV0ZSBidXR0b24gb24gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlIGluIGNhc2Ugb2YgYSBDb21tYW5kIEV4ZWN1dGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHtBcnJheX0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIEFycmF5IG9mIGhlYWRlciBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZVxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcblx0ICovXG5cdGdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25FbmFibGVkOiBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRcdGNvbnN0IG9EZWxldGVBY3Rpb24gPSBBbm5vdGF0aW9uSGVscGVyLl9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJTZWNvbmRhcnlcIik7XG5cdFx0cmV0dXJuIG9EZWxldGVBY3Rpb24gPyBvRGVsZXRlQWN0aW9uLmVuYWJsZWQgOiBcInRydWVcIjtcblx0fSxcblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGZvcm1hdCB0aGUgJ3Zpc2libGUnIHByb3BlcnR5IGZvciB0aGUgRGVsZXRlIGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuXHQgKi9cblx0Z2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvblZpc2libGU6IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdFx0Y29uc3Qgb0RlbGV0ZUFjdGlvbiA9IEFubm90YXRpb25IZWxwZXIuX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlNlY29uZGFyeVwiKTtcblx0XHRyZXR1cm4gb0RlbGV0ZUFjdGlvbiA/IG9EZWxldGVBY3Rpb24udmlzaWJsZSA6IFwidHJ1ZVwiO1xuXHR9LFxuXHQvKipcblx0ICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAndmlzaWJsZScgcHJvcGVydHkgZm9yIHRoZSBFZGl0IGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0FycmF5fSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuXHQgKi9cblx0Z2V0RWRpdENvbW1hbmRFeGVjdXRpb25WaXNpYmxlOiBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRcdGNvbnN0IG9FZGl0QWN0aW9uID0gQW5ub3RhdGlvbkhlbHBlci5fZmluZEFjdGlvbihhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMsIFwiUHJpbWFyeVwiKTtcblx0XHRyZXR1cm4gb0VkaXRBY3Rpb24gPyBvRWRpdEFjdGlvbi52aXNpYmxlIDogXCJ0cnVlXCI7XG5cdH0sXG5cdC8qKlxuXHQgKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgdGhlIEVkaXQgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2Vcblx0ICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSBjb252ZXJ0ZXIgb3V0cHV0XG5cdCAqL1xuXHRnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQ6IGZ1bmN0aW9uIChhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnM6IGFueVtdKSB7XG5cdFx0Y29uc3Qgb0VkaXRBY3Rpb24gPSBBbm5vdGF0aW9uSGVscGVyLl9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJQcmltYXJ5XCIpO1xuXHRcdHJldHVybiBvRWRpdEFjdGlvbiA/IG9FZGl0QWN0aW9uLmVuYWJsZWQgOiBcInRydWVcIjtcblx0fSxcblx0LyoqXG5cdCAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgRWRpdEFjdGlvbiBmcm9tIHRoZSBFbnRpdHlzZXQgYmFzZWQgb24gRHJhZnQgb3Igc3RpY2t5IGJhc2VkIGFwcGxpY2F0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29FbnRpdHlTZXRdIFRoZSB2YWx1ZSBmcm9tIHRoZSBleHByZXNzaW9uLlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBib29sZWFuIHZhbHVlIGJhc2VkIG9uIHZSYXdWYWx1ZSAmIG9EcmFmdE5vZGVcblx0ICovXG5cdGdldEVkaXRBY3Rpb246IGZ1bmN0aW9uIChvRW50aXR5U2V0OiBDb250ZXh0KSB7XG5cdFx0Y29uc3Qgc1BhdGggPSBvRW50aXR5U2V0LmdldFBhdGgoKSxcblx0XHRcdG9Bbm5vdGF0aW9ucyA9IG9FbnRpdHlTZXQuZ2V0T2JqZWN0KHNQYXRoICsgXCJAXCIpO1xuXHRcdGNvbnN0IGJEcmFmdFJvb3QgPSBvQW5ub3RhdGlvbnMuaGFzT3duUHJvcGVydHkoXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiKTtcblx0XHRjb25zdCBiU3RpY2t5U2Vzc2lvbiA9IG9Bbm5vdGF0aW9ucy5oYXNPd25Qcm9wZXJ0eShcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWRcIik7XG5cdFx0bGV0IHNBY3Rpb25OYW1lO1xuXHRcdGlmIChiRHJhZnRSb290KSB7XG5cdFx0XHRzQWN0aW9uTmFtZSA9IG9FbnRpdHlTZXQuZ2V0T2JqZWN0KHNQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdC9FZGl0QWN0aW9uXCIpO1xuXHRcdH0gZWxzZSBpZiAoYlN0aWNreVNlc3Npb24pIHtcblx0XHRcdHNBY3Rpb25OYW1lID0gb0VudGl0eVNldC5nZXRPYmplY3Qoc1BhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5TZXNzaW9uLnYxLlN0aWNreVNlc3Npb25TdXBwb3J0ZWQvRWRpdEFjdGlvblwiKTtcblx0XHR9XG5cdFx0cmV0dXJuICFzQWN0aW9uTmFtZSA/IHNBY3Rpb25OYW1lIDogc1BhdGggKyBcIi9cIiArIHNBY3Rpb25OYW1lO1xuXHR9LFxuXHRpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zOiBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnksIG9GaWVsZENvbnRyb2w6IGFueSkge1xuXHRcdGxldCBiQ29tcHV0ZWQsIGJJbW11dGFibGUsIGJSZWFkT25seTtcblx0XHRpZiAob0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkNvbXB1dGVkXCJdKSB7XG5cdFx0XHRiQ29tcHV0ZWQgPSBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl0uQm9vbFxuXHRcdFx0XHQ/IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5Db21wdXRlZFwiXS5Cb29sID09IFwidHJ1ZVwiXG5cdFx0XHRcdDogdHJ1ZTtcblx0XHR9XG5cdFx0aWYgKG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5JbW11dGFibGVcIl0pIHtcblx0XHRcdGJJbW11dGFibGUgPSBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlXCJdLkJvb2xcblx0XHRcdFx0PyBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlXCJdLkJvb2wgPT0gXCJ0cnVlXCJcblx0XHRcdFx0OiB0cnVlO1xuXHRcdH1cblx0XHRiUmVhZE9ubHkgPSBiQ29tcHV0ZWQgfHwgYkltbXV0YWJsZTtcblxuXHRcdGlmIChvRmllbGRDb250cm9sKSB7XG5cdFx0XHRiUmVhZE9ubHkgPSBiUmVhZE9ubHkgfHwgb0ZpZWxkQ29udHJvbCA9PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5GaWVsZENvbnRyb2xUeXBlL1JlYWRPbmx5XCI7XG5cdFx0fVxuXHRcdGlmIChiUmVhZE9ubHkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXHRyZWFkT25seUV4cHJlc3Npb25Gcm9tRHluYW1pY0Fubm90YXRpb25zOiBmdW5jdGlvbiAob0ZpZWxkQ29udHJvbDogYW55KSB7XG5cdFx0bGV0IHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seTtcblx0XHRpZiAob0ZpZWxkQ29udHJvbCkge1xuXHRcdFx0aWYgKChNYW5hZ2VkT2JqZWN0IGFzIGFueSkuYmluZGluZ1BhcnNlcihvRmllbGRDb250cm9sKSkge1xuXHRcdFx0XHRzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkgPSBcIiVcIiArIG9GaWVsZENvbnRyb2wgKyBcIiA9PT0gMSBcIjtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSkge1xuXHRcdFx0cmV0dXJuIFwiez0gXCIgKyBzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkgKyBcIj8gZmFsc2UgOiB0cnVlIH1cIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fSxcblx0Lypcblx0ICogRnVuY3Rpb24gdG8gZ2V0IHRoZSBleHByZXNzaW9uIGZvciBjaGFydCBUaXRsZSBQcmVzc1xuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtvQ29uZmlndXJhdGlvbn0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3Rcblx0ICogIEBwYXJhbSB7b01hbmlmZXN0fSBbb01hbmlmZXN0XSBPdXRib3VuZHMgZnJvbSBtYW5pZmVzdFxuXHQgKiByZXR1cm5zIHtTdHJpbmd9IFtzQ29sbGVjdGlvbk5hbWVdIENvbGxlY3Rpb24gTmFtZSBvZiB0aGUgTWljcm8gQ2hhcnRcblx0ICpcblx0ICogcmV0dXJucyB7U3RyaW5nfSBbRXhwcmVzc2lvbl0gSGFuZGxlciBFeHByZXNzaW9uIGZvciB0aGUgdGl0bGUgcHJlc3Ncblx0ICpcblx0ICovXG5cdGdldEV4cHJlc3Npb25Gb3JNaWNyb0NoYXJ0VGl0bGVQcmVzczogZnVuY3Rpb24gKG9Db25maWd1cmF0aW9uOiBhbnksIG9NYW5pZmVzdE91dGJvdW5kOiBhbnksIHNDb2xsZWN0aW9uTmFtZTogYW55KSB7XG5cdFx0aWYgKG9Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdChvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl1bXCJvdXRib3VuZFwiXSkgfHxcblx0XHRcdFx0KG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl0gJiYgb0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXVtcIm91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcIi5oYW5kbGVycy5vbkRhdGFQb2ludFRpdGxlUHJlc3NlZCgkY29udHJvbGxlciwgJHskc291cmNlPi99LCdcIiArXG5cdFx0XHRcdFx0SlNPTi5zdHJpbmdpZnkob01hbmlmZXN0T3V0Ym91bmQpICtcblx0XHRcdFx0XHRcIicsJ1wiICtcblx0XHRcdFx0XHRvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0gK1xuXHRcdFx0XHRcdFwiJywnXCIgK1xuXHRcdFx0XHRcdHNDb2xsZWN0aW9uTmFtZSArXG5cdFx0XHRcdFx0XCInIClcIlxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmIChvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRcdHJldHVybiBcIi5oYW5kbGVycy5uYXZpZ2F0ZVRvU3ViU2VjdGlvbigkY29udHJvbGxlciwgJ1wiICsgSlNPTi5zdHJpbmdpZnkob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkgKyBcIicpXCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0Lypcblx0ICogRnVuY3Rpb24gdG8gcmVuZGVyIENoYXJ0IFRpdGxlIGFzIExpbmtcblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b0NvbnRyb2xDb25maWd1cmF0aW9ufSBbb0NvbmZpZ3VyYXRpb25zXSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuXHQgKiByZXR1cm5zIHtTdHJpbmd9IFtzS2V5XSBGb3IgdGhlIFRhcmdldE91dGJvdW5kIGFuZCBUYXJnZXRTZWN0aW9uXG5cdCAqXG5cdCAqL1xuXHRnZXRNaWNyb0NoYXJ0VGl0bGVBc0xpbms6IGZ1bmN0aW9uIChvQ29udHJvbENvbmZpZ3VyYXRpb246IGFueSkge1xuXHRcdGlmIChcblx0XHRcdG9Db250cm9sQ29uZmlndXJhdGlvbiAmJlxuXHRcdFx0KG9Db250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdIHx8XG5cdFx0XHRcdChvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiBvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gXCJFeHRlcm5hbFwiO1xuXHRcdH0gZWxzZSBpZiAob0NvbnRyb2xDb25maWd1cmF0aW9uICYmIG9Db250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRyZXR1cm4gXCJJblBhZ2VcIjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIFwiTm9uZVwiO1xuXHRcdH1cblx0fSxcblxuXHQvKiBHZXQgZ3JvdXBJZCBmcm9tIGNvbnRyb2wgY29uZmlndXJhdGlvblxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvQ29uZmlndXJhdGlvbnNdIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBbc0Fubm90YXRpb25QYXRoXSBBbm5vdGF0aW9uIFBhdGggZm9yIHRoZSBjb25maWd1cmF0aW9uXG5cdCAqIEBkZXNjcmlwdGlvbiBVc2VkIHRvIGdldCB0aGUgZ3JvdXBJZCBmb3IgRGF0YVBvaW50cyBhbmQgTWljcm9DaGFydHMgaW4gdGhlIEhlYWRlci5cblx0ICpcblx0ICovXG5cdGdldEdyb3VwSWRGcm9tQ29uZmlnOiBmdW5jdGlvbiAob0NvbmZpZ3VyYXRpb25zOiBhbnksIHNBbm5vdGF0aW9uUGF0aDogYW55LCBzRGVmYXVsdEdyb3VwSWQ/OiBhbnkpIHtcblx0XHRjb25zdCBvQ29uZmlndXJhdGlvbiA9IG9Db25maWd1cmF0aW9uc1tzQW5ub3RhdGlvblBhdGhdLFxuXHRcdFx0YUF1dG9QYXR0ZXJucyA9IFtcIkhlcm9lc1wiLCBcIkRlY29yYXRpb25cIiwgXCJXb3JrZXJzXCIsIFwiTG9uZ1J1bm5lcnNcIl07XG5cdFx0bGV0IHNHcm91cElkID0gc0RlZmF1bHRHcm91cElkO1xuXHRcdGlmIChcblx0XHRcdG9Db25maWd1cmF0aW9uICYmXG5cdFx0XHRvQ29uZmlndXJhdGlvbi5yZXF1ZXN0R3JvdXBJZCAmJlxuXHRcdFx0YUF1dG9QYXR0ZXJucy5zb21lKGZ1bmN0aW9uIChhdXRvUGF0dGVybjogc3RyaW5nKSB7XG5cdFx0XHRcdHJldHVybiBhdXRvUGF0dGVybiA9PT0gb0NvbmZpZ3VyYXRpb24ucmVxdWVzdEdyb3VwSWQ7XG5cdFx0XHR9KVxuXHRcdCkge1xuXHRcdFx0c0dyb3VwSWQgPSBcIiRhdXRvLlwiICsgb0NvbmZpZ3VyYXRpb24ucmVxdWVzdEdyb3VwSWQ7XG5cdFx0fVxuXHRcdHJldHVybiBzR3JvdXBJZDtcblx0fSxcblxuXHQvKlxuXHQgKiBHZXQgQ29udGV4dCBCaW5kaW5nIHdpdGggZ3JvdXBJZCBmcm9tIGNvbnRyb2wgY29uZmlndXJhdGlvblxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvQ29uZmlndXJhdGlvbnNdIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBbc0tleV0gQW5ub3RhdGlvbiBQYXRoIGZvciBvZiB0aGUgY29uZmlndXJhdGlvblxuXHQgKiBAZGVzY3JpcHRpb24gVXNlZCB0byBnZXQgdGhlIGJpbmRpbmcgZm9yIERhdGFQb2ludHMgaW4gdGhlIEhlYWRlci5cblx0ICpcblx0ICovXG5cdGdldEJpbmRpbmdXaXRoR3JvdXBJZEZyb21Db25maWc6IGZ1bmN0aW9uIChvQ29uZmlndXJhdGlvbnM6IGFueSwgc0tleTogYW55KSB7XG5cdFx0Y29uc3Qgc0dyb3VwSWQgPSBBbm5vdGF0aW9uSGVscGVyLmdldEdyb3VwSWRGcm9tQ29uZmlnKG9Db25maWd1cmF0aW9ucywgc0tleSk7XG5cdFx0bGV0IHNCaW5kaW5nO1xuXHRcdGlmIChzR3JvdXBJZCkge1xuXHRcdFx0c0JpbmRpbmcgPSBcInsgcGF0aCA6ICcnLCBwYXJhbWV0ZXJzIDogeyAkJGdyb3VwSWQgOiAnXCIgKyBzR3JvdXBJZCArIFwiJyB9IH1cIjtcblx0XHR9XG5cdFx0cmV0dXJuIHNCaW5kaW5nO1xuXHR9LFxuXHQvKipcblx0ICogTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgYSBGaWVsZEdyb3VwIGNvbnNpc3RzIG9mIG9ubHkgMSBEYXRhRmllbGQgd2l0aCBNdWx0aUxpbmUgVGV4dCBhbm5vdGF0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0RhdGFGaWVsZEFic3RyYWN0VHlwZXNbXX0gYUZvcm1FbGVtZW50cyBBIGNvbGxlY3Rpb24gb2YgZm9ybSBlbGVtZW50cyB1c2VkIGluIHRoZSBjdXJyZW50IGZpZWxkIGdyb3VwXG5cdCAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgb25seSAxIGRhdGEgZmllbGQgd2l0aCBNdWx0aWxpbmUgVGV4dCBhbm5vdGF0aW9uIGV4aXN0cy5cblx0ICovXG5cdGRvZXNGaWVsZEdyb3VwQ29udGFpbk9ubHlPbmVNdWx0aUxpbmVEYXRhRmllbGQ6IGZ1bmN0aW9uIChhRm9ybUVsZW1lbnRzOiBhbnlbXSkge1xuXHRcdHJldHVybiBhRm9ybUVsZW1lbnRzICYmIGFGb3JtRWxlbWVudHMubGVuZ3RoID09PSAxICYmICEhYUZvcm1FbGVtZW50c1swXS5pc1ZhbHVlTXVsdGlsaW5lVGV4dDtcblx0fSxcblx0Lypcblx0ICogR2V0IFZpc2libGl0eSBvZiBicmVhZGNydW1icy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb1ZpZXdEYXRhXSBWaWV3RGF0YSBtb2RlbFxuXHQgKiByZXR1cm5zIHsqfSBFeHByZXNzaW9uIG9yIGJvb2xlYW5cblx0ICovXG5cdGdldFZpc2libGVFeHByZXNzaW9uRm9yQnJlYWRjcnVtYnM6IGZ1bmN0aW9uIChvVmlld0RhdGE6IGFueSkge1xuXHRcdHJldHVybiBvVmlld0RhdGEuc2hvd0JyZWFkQ3J1bWJzICYmIG9WaWV3RGF0YS5mY2xFbmFibGVkICE9PSB1bmRlZmluZWRcblx0XHRcdD8gXCJ7ZmNsaGVscGVyPi9icmVhZENydW1iSXNWaXNpYmxlfVwiXG5cdFx0XHQ6IG9WaWV3RGF0YS5zaG93QnJlYWRDcnVtYnM7XG5cdH0sXG5cdGdldFNoYXJlQnV0dG9uVmlzaWJpbGl0eTogZnVuY3Rpb24gKHZpZXdEYXRhOiBhbnkpIHtcblx0XHRsZXQgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCA9IFwiISR7dWk+Y3JlYXRlTW9kZX1cIjtcblx0XHRpZiAodmlld0RhdGEuZmNsRW5hYmxlZCkge1xuXHRcdFx0c1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCA9IFwiJHtmY2xoZWxwZXI+L3Nob3dTaGFyZUljb259ICYmIFwiICsgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cDtcblx0XHR9XG5cdFx0cmV0dXJuIFwiez0gXCIgKyBzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwICsgXCIgfVwiO1xuXHR9LFxuXG5cdC8qXG5cdCAqIEdldCB2aXNpYmxpdHkgZm9yIGVkaXRhYmxlIGhlYWRlciBmYWNldC5cblx0ICpcblx0ICogSWYgZWl0aGVyIHRoZSB0aXRsZSBvciBkZXNjcmlwdGlvbiBmaWVsZCBmcm9tIHRoZSBoZWFkZXIgYW5ub3RhdGlvbnMgYXJlIGVkaXRhYmxlLCB0aGVuIHRoZVxuXHQgKiBlZGl0YWJsZSBoZWFkZXIgZmFjZXQgaXMgdmlzaWJsZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0Fubm90YXRpb25zXSBBbm5vdGF0aW9ucyBvYmplY3QgZm9yIGdpdmVuIGVudGl0eSBzZXRcblx0ICogQHBhcmFtIHtvYmplY3R9IFtvRmllbGRDb250cm9sXSBmaWVsZCBjb250cm9sXG5cdCAqIHJldHVybnMgeyp9ICBiaW5kaW5nIGV4cHJlc3Npb24gb3IgYm9vbGVhbiB2YWx1ZSByZXNvbHZlZCBmb3JtIGZ1bmNpdG9ucyBpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zIGFuZCBpc1JlYWRPbmx5RnJvbUR5bmFtaWNBbm5vdGF0aW9uc1xuXHQgKi9cblx0Z2V0VmlzaWJsaXR5T2ZIZWFkZXJGYWNldDogZnVuY3Rpb24gKFxuXHRcdG9UaXRsZUFubm90YXRpb25zOiBhbnksXG5cdFx0b0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnM6IGFueSxcblx0XHRvRmllbGRUaXRsZUZpZWxkQ29udHJvbDogYW55LFxuXHRcdG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sOiBhbnlcblx0KSB7XG5cdFx0Ly8gQ2hlY2sgQW5ub3RhdGlvbnMgZm9yIFRpdGxlIEZpZWxkXG5cdFx0Y29uc3QgYklzVGl0bGVSZWFkT25seSA9IEFubm90YXRpb25IZWxwZXIuaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyhvVGl0bGVBbm5vdGF0aW9ucywgb0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wpO1xuXHRcdGNvbnN0IHRpdGxlRXhwcmVzc2lvbiA9IEFubm90YXRpb25IZWxwZXIucmVhZE9ubHlFeHByZXNzaW9uRnJvbUR5bmFtaWNBbm5vdGF0aW9ucyhvRmllbGRUaXRsZUZpZWxkQ29udHJvbCk7XG5cdFx0Ly8gVGhlcmUgaXMgbm8gZXhwcmVzc2lvbiBhbmQgdGhlIHRpdGxlIGlzIG5vdCByZWFkeSBvbmx5LCB0aGlzIGlzIHN1ZmZpY2llbnQgZm9yIGFuIGVkaXRhYmxlIGhlYWRlclxuXHRcdGlmICghYklzVGl0bGVSZWFkT25seSAmJiAhdGl0bGVFeHByZXNzaW9uKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBDaGVjayBBbm5vdGF0aW9ucyBmb3IgRGVzY3JpcHRpb24gRmllbGRcblx0XHRjb25zdCBiSXNEZXNjcmlwdGlvblJlYWRPbmx5ID0gQW5ub3RhdGlvbkhlbHBlci5pc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zKFxuXHRcdFx0b0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnMsXG5cdFx0XHRvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbFxuXHRcdCk7XG5cdFx0Y29uc3QgZGVzY3JpcHRpb25FeHByZXNzaW9uID0gQW5ub3RhdGlvbkhlbHBlci5yZWFkT25seUV4cHJlc3Npb25Gcm9tRHluYW1pY0Fubm90YXRpb25zKG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sKTtcblx0XHQvLyBUaGVyZSBpcyBubyBleHByZXNzaW9uIGFuZCB0aGUgZGVzY3JpcHRpb24gaXMgbm90IHJlYWR5IG9ubHksIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYW4gZWRpdGFibGUgaGVhZGVyXG5cdFx0aWYgKCFiSXNEZXNjcmlwdGlvblJlYWRPbmx5ICYmICFkZXNjcmlwdGlvbkV4cHJlc3Npb24pIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIEJvdGggdGl0bGUgYW5kIGRlc2NyaXB0aW9uIGFyZSBub3QgZWRpdGFibGUgYW5kIHRoZXJlIGFyZSBubyBkeW5hbWljIGFubm90YXRpb25zXG5cdFx0aWYgKGJJc1RpdGxlUmVhZE9ubHkgJiYgYklzRGVzY3JpcHRpb25SZWFkT25seSAmJiAhdGl0bGVFeHByZXNzaW9uICYmICFkZXNjcmlwdGlvbkV4cHJlc3Npb24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBOb3cgY29tYmluZSBleHByZXNzaW9uc1xuXHRcdGlmICh0aXRsZUV4cHJlc3Npb24gJiYgIWRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdFx0cmV0dXJuIHRpdGxlRXhwcmVzc2lvbjtcblx0XHR9IGVsc2UgaWYgKCF0aXRsZUV4cHJlc3Npb24gJiYgZGVzY3JpcHRpb25FeHByZXNzaW9uKSB7XG5cdFx0XHRyZXR1cm4gZGVzY3JpcHRpb25FeHByZXNzaW9uO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gQW5ub3RhdGlvbkhlbHBlci5jb21iaW5lVGl0bGVBbmREZXNjcmlwdGlvbkV4cHJlc3Npb24ob0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wsIG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sKTtcblx0XHR9XG5cdH0sXG5cdGNvbWJpbmVUaXRsZUFuZERlc2NyaXB0aW9uRXhwcmVzc2lvbjogZnVuY3Rpb24gKG9UaXRsZUZpZWxkQ29udHJvbDogYW55LCBvRGVzY3JpcHRpb25GaWVsZENvbnRyb2w6IGFueSkge1xuXHRcdC8vIElmIGJvdGggaGVhZGVyIGFuZCB0aXRsZSBmaWVsZCBhcmUgYmFzZWQgb24gZHlubWFpYyBmaWVsZCBjb250cm9sLCB0aGUgZWRpdGFibGUgaGVhZGVyXG5cdFx0Ly8gaXMgdmlzaWJsZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgaXMgbm90IHJlYWR5IG9ubHlcblx0XHRyZXR1cm4gXCJ7PSAlXCIgKyBvVGl0bGVGaWVsZENvbnRyb2wgKyBcIiA9PT0gMSA/ICggJVwiICsgb0Rlc2NyaXB0aW9uRmllbGRDb250cm9sICsgXCIgPT09IDEgPyBmYWxzZSA6IHRydWUgKSA6IHRydWUgfVwiO1xuXHR9LFxuXHQvKlxuXHQgKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBvZiBkZWxldGUgYnV0dG9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtzdHJpbmd9IFtzRW50aXR5U2V0TmFtZV0gRW50aXR5IHNldCBuYW1lXG5cdCAqIHJldHVybnMge3N0cmluZ30gIGJpbmRpbmcgZXhwcmVzc2lvbiAvIGZ1bmN0aW9uIHN0cmluZyBnZW5lcmF0ZWQgZnJvbSBjb21tYW5oZWxwZXIncyBmdW5jdGlvbiBnZW5lcmF0ZUZ1bmN0aW9uXG5cdCAqL1xuXHRnZXRQcmVzc0V4cHJlc3Npb25Gb3JEZWxldGU6IGZ1bmN0aW9uIChzRW50aXR5U2V0TmFtZTogYW55KSB7XG5cdFx0Y29uc3Qgc0RlbGV0YWJsZUNvbnRleHRzID0gXCIkeyR2aWV3Pi9nZXRCaW5kaW5nQ29udGV4dH1cIixcblx0XHRcdHNUaXRsZSA9IFwiJHskdmlldz4vI2ZlOjpPYmplY3RQYWdlL2dldEhlYWRlclRpdGxlL2dldEV4cGFuZGVkSGVhZGluZy9nZXRJdGVtcy8xL2dldFRleHR9XCIsXG5cdFx0XHRzRGVzY3JpcHRpb24gPSBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS9nZXRIZWFkZXJUaXRsZS9nZXRFeHBhbmRlZENvbnRlbnQvMC9nZXRJdGVtcy8wL2dldFRleHR9XCI7XG5cdFx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHRcdHRpdGxlOiBzVGl0bGUsXG5cdFx0XHRlbnRpdHlTZXROYW1lOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNFbnRpdHlTZXROYW1lKSxcblx0XHRcdGRlc2NyaXB0aW9uOiBzRGVzY3JpcHRpb25cblx0XHR9O1xuXHRcdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcIi5lZGl0Rmxvdy5kZWxldGVEb2N1bWVudFwiLCBzRGVsZXRhYmxlQ29udGV4dHMsIENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKSk7XG5cdH0sXG5cdC8qXG5cdCAqIEdldCBFeHByZXNzaW9uIG9mIHByZXNzIGV2ZW50IG9mIEVkaXQgYnV0dG9uLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQHBhcmFtIHtvYmplY3R9IFtvRGF0YUZpZWxkXSBEYXRhIGZpZWxkIG9iamVjdFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW3NFbnRpdHlTZXROYW1lXSBFbnRpdHkgc2V0IG5hbWVcblx0ICogQHBhcmFtIHtvYmplY3R9IFtvSGVhZGVyQWN0aW9uXSBIZWFkZXIgYWN0aW9uIG9iamVjdFxuXHQgKiByZXR1cm5zIHtzdHJpbmd9ICBiaW5kaW5nIGV4cHJlc3Npb24gLyBmdW5jdGlvbiBzdHJpbmcgZ2VuZXJhdGVkIGZyb20gY29tbWFuaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuXHQgKi9cblx0Z2V0UHJlc3NFeHByZXNzaW9uRm9yRWRpdDogZnVuY3Rpb24gKG9EYXRhRmllbGQ6IGFueSwgc0VudGl0eVNldE5hbWU6IGFueSwgb0hlYWRlckFjdGlvbjogYW55KSB7XG5cdFx0Y29uc3Qgc0VkaXRhYmxlQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5BY3Rpb24pLFxuXHRcdFx0c0RhdGFGaWVsZEVudW1NZW1iZXIgPSBvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nICYmIG9EYXRhRmllbGQuSW52b2NhdGlvbkdyb3VwaW5nW1wiJEVudW1NZW1iZXJcIl0sXG5cdFx0XHRzSW52b2NhdGlvbkdyb3VwID1cblx0XHRcdFx0c0RhdGFGaWVsZEVudW1NZW1iZXIgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuT3BlcmF0aW9uR3JvdXBpbmdUeXBlL0NoYW5nZVNldFwiID8gXCJDaGFuZ2VTZXRcIiA6IFwiSXNvbGF0ZWRcIjtcblx0XHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdFx0Y29udGV4dHM6IFwiJHskdmlldz4vZ2V0QmluZGluZ0NvbnRleHR9XCIsXG5cdFx0XHRlbnRpdHlTZXROYW1lOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNFbnRpdHlTZXROYW1lKSxcblx0XHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRcdG1vZGVsOiBcIiR7JHNvdXJjZT4vfS5nZXRNb2RlbCgpXCIsXG5cdFx0XHRsYWJlbDogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuTGFiZWwsIHRydWUpLFxuXHRcdFx0aXNOYXZpZ2FibGU6IG9IZWFkZXJBY3Rpb24gJiYgb0hlYWRlckFjdGlvbi5pc05hdmlnYWJsZSxcblx0XHRcdGRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbjpcblx0XHRcdFx0b0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHRcdFx0XHRcdD8gXCInXCIgKyBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiArIFwiJ1wiXG5cdFx0XHRcdFx0OiB1bmRlZmluZWRcblx0XHR9O1xuXHRcdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcblx0XHRcdFwiLmhhbmRsZXJzLm9uQ2FsbEFjdGlvblwiLFxuXHRcdFx0XCIkeyR2aWV3Pi99XCIsXG5cdFx0XHRzRWRpdGFibGVDb250ZXh0cyxcblx0XHRcdENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKVxuXHRcdCk7XG5cdH0sXG5cdC8qXG5cdCAqIE1ldGhvZCB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIHRoZSAncHJlc3MnIGV2ZW50IGZvciBmb290ZXIgYW5ub3RhdGlvbiBhY3Rpb25zXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29EYXRhRmllbGRdIERhdGEgZmllbGQgb2JqZWN0XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbc0VudGl0eVNldE5hbWVdIEVudGl0eSBzZXQgbmFtZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29IZWFkZXJBY3Rpb25dIEhlYWRlciBhY3Rpb24gb2JqZWN0XG5cdCAqIHJldHVybnMge3N0cmluZ30gIEJpbmRpbmcgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiBzdHJpbmcgdGhhdCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgQ29tbW9uaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuXHQgKi9cblx0Z2V0UHJlc3NFeHByZXNzaW9uRm9yRm9vdGVyQW5ub3RhdGlvbkFjdGlvbjogZnVuY3Rpb24gKG9EYXRhRmllbGQ6IGFueSwgc0VudGl0eVNldE5hbWU6IGFueSwgb0hlYWRlckFjdGlvbjogYW55KSB7XG5cdFx0Y29uc3Qgc0FjdGlvbkNvbnRleHRzID0gQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuQWN0aW9uKSxcblx0XHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID0gb0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZyAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZ1tcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdFx0c0ludm9jYXRpb25Hcm91cCA9XG5cdFx0XHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLk9wZXJhdGlvbkdyb3VwaW5nVHlwZS9DaGFuZ2VTZXRcIiA/IFwiQ2hhbmdlU2V0XCIgOiBcIklzb2xhdGVkXCI7XG5cdFx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS99LmdldEJpbmRpbmdDb250ZXh0KClcIixcblx0XHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdFx0aW52b2NhdGlvbkdyb3VwaW5nOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNJbnZvY2F0aW9uR3JvdXApLFxuXHRcdFx0bW9kZWw6IFwiJHskc291cmNlPi99LmdldE1vZGVsKClcIixcblx0XHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5MYWJlbCwgdHJ1ZSksXG5cdFx0XHRpc05hdmlnYWJsZTogb0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmlzTmF2aWdhYmxlLFxuXHRcdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOlxuXHRcdFx0XHRvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uXG5cdFx0XHRcdFx0PyBcIidcIiArIG9IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uICsgXCInXCJcblx0XHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHRcdH07XG5cdFx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFwiLmhhbmRsZXJzLm9uQ2FsbEFjdGlvblwiLCBcIiR7JHZpZXc+L31cIiwgc0FjdGlvbkNvbnRleHRzLCBDb21tb25IZWxwZXIub2JqZWN0VG9TdHJpbmcob1BhcmFtcykpO1xuXHR9LFxuXHQvKlxuXHQgKiBHZXRzIHRoZSBiaW5kaW5nIG9mIHRoZSBjb250YWluZXIgSEJveCBmb3IgdGhlIGhlYWRlciBmYWNldC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0NvbnRyb2xDb25maWd1cmF0aW9uXSBUaGUgY29udHJvbCBjb25maWd1cmF0aW9uIGZvcm0gb2YgdGhlIHZpZXdEYXRhIG1vZGVsXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBbb0hlYWRlckZhY2V0XSBUaGUgb2JqZWN0IG9mIHRoZSBoZWFkZXIgZmFjZXRcblx0ICogcmV0dXJucyB7Kn0gIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZnJvbSBmdW5jdGlvbiBnZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnIG9yIHVuZGVmaW5lZC5cblx0ICovXG5cdGdldFN0YXNoYWJsZUhCb3hCaW5kaW5nOiBmdW5jdGlvbiAob0NvbnRyb2xDb25maWd1cmF0aW9uOiBhbnksIG9IZWFkZXJGYWNldDogYW55KSB7XG5cdFx0aWYgKG9IZWFkZXJGYWNldCAmJiBvSGVhZGVyRmFjZXQuRmFjZXQgJiYgb0hlYWRlckZhY2V0LkZhY2V0LnRhcmdldEFubm90YXRpb25UeXBlID09PSBcIkRhdGFQb2ludFwiKSB7XG5cdFx0XHRyZXR1cm4gQW5ub3RhdGlvbkhlbHBlci5nZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnKG9Db250cm9sQ29uZmlndXJhdGlvbiwgb0hlYWRlckZhY2V0LkZhY2V0LnRhcmdldEFubm90YXRpb25WYWx1ZSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qXG5cdCAqIEdldHMgdGhlICdQcmVzcycgZXZlbnQgZXhwcmVzc2lvbiBmb3IgdGhlIGV4dGVybmFsIGFuZCBpbnRlcm5hbCBkYXRhIHBvaW50IGxpbmsuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29Db25maWd1cmF0aW9uXSBDb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuXHQgKiBAcGFyYW0ge29iamVjdH0gW29NYW5pZmVzdE91dGJvdW5kXSBPdXRib3VuZHMgZnJvbSBtYW5pZmVzdFxuXHQgKiByZXR1cm5zIHtzdHJpbmd9IFRoZSBydW50aW1lIGJpbmRpbmcgb2YgdGhlICdQcmVzcycgZXZlbnRcblx0ICovXG5cdGdldFByZXNzRXhwcmVzc2lvbkZvckxpbms6IGZ1bmN0aW9uIChvQ29uZmlndXJhdGlvbjogYW55LCBvTWFuaWZlc3RPdXRib3VuZDogYW55KSB7XG5cdFx0aWYgKG9Db25maWd1cmF0aW9uKSB7XG5cdFx0XHRpZiAob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiBvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0pIHtcblx0XHRcdFx0cmV0dXJuIChcblx0XHRcdFx0XHRcIi5oYW5kbGVycy5vbkRhdGFQb2ludFRpdGxlUHJlc3NlZCgkY29udHJvbGxlciwgJHskc291cmNlPn0sIFwiICtcblx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeShvTWFuaWZlc3RPdXRib3VuZCkgK1xuXHRcdFx0XHRcdFwiLFwiICtcblx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeShvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0pICtcblx0XHRcdFx0XHRcIilcIlxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIGlmIChvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRcdHJldHVybiBcIi5oYW5kbGVycy5uYXZpZ2F0ZVRvU3ViU2VjdGlvbigkY29udHJvbGxlciwgJ1wiICsgSlNPTi5zdHJpbmdpZnkob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkgKyBcIicpXCI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0aXNTdWJTZWN0aW9uVGl0bGVWaXNpYmxlOiBmdW5jdGlvbiAoc1N1YlNlY3Rpb252aXNpYmxlOiBhbnksIHNTdWJTZWN0aW9udGl0bGU6IGFueSwgc1N1YlNlY3Rpb25zaG93VGl0bGU6IGFueSkge1xuXHRcdGlmIChzU3ViU2VjdGlvbnZpc2libGUuaW5kZXhPZihcIns9XCIpID09PSAwKSB7XG5cdFx0XHQvLyBEeW5hbWljIGV4cHJlc3Npb25cblx0XHRcdGNvbnN0IHNFeHByZXNzaW9uUmVzdWx0ID0gc1N1YlNlY3Rpb252aXNpYmxlLnN1YnN0cmluZyhcblx0XHRcdFx0c1N1YlNlY3Rpb252aXNpYmxlLmluZGV4T2YoXCJ7PVwiKSArIDIsXG5cdFx0XHRcdHNTdWJTZWN0aW9udmlzaWJsZS5sYXN0SW5kZXhPZihcIn1cIilcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcIns9IChcIiArXG5cdFx0XHRcdHNFeHByZXNzaW9uUmVzdWx0ICtcblx0XHRcdFx0XCIpICYmICgnXCIgK1xuXHRcdFx0XHRzU3ViU2VjdGlvbnRpdGxlICtcblx0XHRcdFx0XCInICE9PSd1bmRlZmluZWQnKSAmJiAoXCIgK1xuXHRcdFx0XHRzU3ViU2VjdGlvbnNob3dUaXRsZSArXG5cdFx0XHRcdFwiID8gdHJ1ZSA6IGZhbHNlKSB9XCJcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBzU3ViU2VjdGlvbnZpc2libGUgJiYgc1N1YlNlY3Rpb250aXRsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiAoc1N1YlNlY3Rpb25zaG93VGl0bGUgPyBcInRydWVcIiA6IFwiZmFsc2VcIik7XG5cdFx0fVxuXHR9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBbm5vdGF0aW9uSGVscGVyO1xuIl19
|