@sapui5/sap.fe.templates 1.101.0 → 1.102.1
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/ListReport/ExtensionAPI.js +8 -5
- package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +11 -5
- package/src/sap/fe/templates/ListReport/ListReport.view.xml +104 -57
- package/src/sap/fe/templates/ListReport/ListReportController.controller.js +104 -19
- package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +98 -19
- 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/Share.js +7 -4
- package/src/sap/fe/templates/ListReport/overrides/Share.ts +4 -3
- package/src/sap/fe/templates/ListReport/overrides/ViewState.js +10 -2
- package/src/sap/fe/templates/ListReport/overrides/ViewState.ts +7 -1
- package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +164 -18
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +51 -47
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +52 -40
- package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +872 -0
- package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +837 -0
- package/src/sap/fe/templates/ObjectPage/overrides/Share.js +3 -3
- package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +2 -2
- package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +9 -10
- package/src/sap/fe/templates/ObjectPage/view/fragments/CollaborationDraft.fragment.xml +1 -2
- package/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +15 -15
- 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 -4
- package/src/sap/fe/templates/ObjectPage/view/fragments/Heading.fragment.xml +16 -17
- package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingTitle.fragment.xml +3 -3
- package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +3 -3
- package/src/sap/fe/templates/ObjectPage/view/fragments/RelatedApps.fragment.xml +7 -4
- package/src/sap/fe/templates/ObjectPage/view/fragments/Section.fragment.xml +71 -6
- package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContent.fragment.xml +114 -94
- package/src/sap/fe/templates/ObjectPage/view/fragments/SectionContentLazyLoader.fragment.xml +127 -107
- package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.js +81 -33
- package/src/sap/fe/templates/RootContainer/controller/Fcl.controller.ts +71 -33
- package/src/sap/fe/templates/controls/MacroChart.fragment.xml +1 -0
- package/src/sap/fe/templates/controls/Table.fragment.xml +3 -4
- package/src/sap/fe/templates/library.js +1 -1
- 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 +7 -3
- 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
|
@@ -0,0 +1,872 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
|
+
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
|
+
*/
|
|
5
|
+
sap.ui.define(["sap/fe/core/CommonUtils", "sap/fe/core/converters/helpers/BindingHelper", "sap/fe/core/helpers/BindingExpression", "sap/fe/macros/CommonHelper", "sap/fe/macros/field/FieldTemplating", "sap/m/library", "sap/ui/base/ManagedObject", "sap/ui/model/odata/v4/AnnotationHelper"], function (CommonUtils, BindingHelper, BindingExpression, CommonHelper, FieldTemplating, mLibrary, ManagedObject, ODataModelAnnotationHelper) {
|
|
6
|
+
"use strict";
|
|
7
|
+
|
|
8
|
+
var _exports = {};
|
|
9
|
+
var formatValueRecursively = FieldTemplating.formatValueRecursively;
|
|
10
|
+
var addTextArrangementToBindingExpression = FieldTemplating.addTextArrangementToBindingExpression;
|
|
11
|
+
var resolveBindingString = BindingExpression.resolveBindingString;
|
|
12
|
+
var or = BindingExpression.or;
|
|
13
|
+
var isEmpty = BindingExpression.isEmpty;
|
|
14
|
+
var ifElse = BindingExpression.ifElse;
|
|
15
|
+
var concat = BindingExpression.concat;
|
|
16
|
+
var compileBinding = BindingExpression.compileBinding;
|
|
17
|
+
var annotationExpression = BindingExpression.annotationExpression;
|
|
18
|
+
var and = BindingExpression.and;
|
|
19
|
+
var UI = BindingHelper.UI;
|
|
20
|
+
var Entity = BindingHelper.Entity;
|
|
21
|
+
var Draft = BindingHelper.Draft;
|
|
22
|
+
|
|
23
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
24
|
+
|
|
25
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
26
|
+
|
|
27
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
28
|
+
|
|
29
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
30
|
+
|
|
31
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
32
|
+
|
|
33
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
34
|
+
|
|
35
|
+
var ButtonType = mLibrary.ButtonType;
|
|
36
|
+
|
|
37
|
+
//```mermaid
|
|
38
|
+
// graph TD
|
|
39
|
+
// A[Object Page Title] -->|Get DataField Value| C{Evaluate Create Mode}
|
|
40
|
+
// C -->|In Create Mode| D{Is DataField Value empty}
|
|
41
|
+
// D -->|Yes| F{Is there a TypeName}
|
|
42
|
+
// F -->|Yes| G[Is there an custom title]
|
|
43
|
+
// G -->|Yes| G1[Show the custom title + 'TypeName']
|
|
44
|
+
// G -->|No| G2[Display the default title 'New + TypeName']
|
|
45
|
+
// F -->|No| H[Is there a custom title]
|
|
46
|
+
// H -->|Yes| I[Show the custom title]
|
|
47
|
+
// H -->|No| J[Show the default 'Unamned Object']
|
|
48
|
+
// D -->|No| E
|
|
49
|
+
// C -->|Not in create mode| E[Show DataField Value]
|
|
50
|
+
// ```
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Compute the title for the object page.
|
|
54
|
+
* @param oHeaderInfo The @UI.HeaderInfo annotation content
|
|
55
|
+
* @param oViewData The view data object we're currently on
|
|
56
|
+
* @param fullContextPath The full context path used to reach that object page
|
|
57
|
+
* @param oDraftRoot
|
|
58
|
+
* @returns The binding expression for the object page title
|
|
59
|
+
*/
|
|
60
|
+
var getExpressionForTitle = function (oHeaderInfo, oViewData, fullContextPath, oDraftRoot) {
|
|
61
|
+
var _oHeaderInfo$Title, _oHeaderInfo$Title2, _oHeaderInfo$Title3, _oHeaderInfo$Title3$V, _oHeaderInfo$Title3$V2, _oHeaderInfo$Title3$V3, _oHeaderInfo$Title3$V4, _oHeaderInfo$Title3$V5, _oHeaderInfo$Title3$V6, _oHeaderInfo$Title3$V7;
|
|
62
|
+
|
|
63
|
+
var titleNoHeaderInfo = CommonUtils.getTranslatedText("T_NEW_OBJECT", oViewData.resourceBundle, undefined, oViewData.entitySet);
|
|
64
|
+
var titleWithHeaderInfo = CommonUtils.getTranslatedText("T_ANNOTATION_HELPER_DEFAULT_OBJECT_PAGE_HEADER_TITLE", oViewData.resourceBundle, undefined, oViewData.entitySet);
|
|
65
|
+
var oEmptyHeaderInfoTitle = (oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : oHeaderInfo.Title) === undefined || (oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : oHeaderInfo.Title) === "" || (oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : (_oHeaderInfo$Title = oHeaderInfo.Title) === null || _oHeaderInfo$Title === void 0 ? void 0 : _oHeaderInfo$Title.Value) === "";
|
|
66
|
+
var titleForActiveHeaderNoHeaderInfo = !oEmptyHeaderInfoTitle ? CommonUtils.getTranslatedText("T_ANNOTATION_HELPER_DEFAULT_OBJECT_PAGE_HEADER_TITLE_NO_HEADER_INFO", oViewData.resourceBundle) : "";
|
|
67
|
+
var titleValueExpression = annotationExpression(oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : (_oHeaderInfo$Title2 = oHeaderInfo.Title) === null || _oHeaderInfo$Title2 === void 0 ? void 0 : _oHeaderInfo$Title2.Value);
|
|
68
|
+
|
|
69
|
+
if (oHeaderInfo !== null && oHeaderInfo !== void 0 && (_oHeaderInfo$Title3 = oHeaderInfo.Title) !== null && _oHeaderInfo$Title3 !== void 0 && (_oHeaderInfo$Title3$V = _oHeaderInfo$Title3.Value) !== null && _oHeaderInfo$Title3$V !== void 0 && (_oHeaderInfo$Title3$V2 = _oHeaderInfo$Title3$V.$target) !== null && _oHeaderInfo$Title3$V2 !== void 0 && (_oHeaderInfo$Title3$V3 = _oHeaderInfo$Title3$V2.annotations) !== null && _oHeaderInfo$Title3$V3 !== void 0 && (_oHeaderInfo$Title3$V4 = _oHeaderInfo$Title3$V3.Common) !== null && _oHeaderInfo$Title3$V4 !== void 0 && (_oHeaderInfo$Title3$V5 = _oHeaderInfo$Title3$V4.Text) !== null && _oHeaderInfo$Title3$V5 !== void 0 && (_oHeaderInfo$Title3$V6 = _oHeaderInfo$Title3$V5.annotations) !== null && _oHeaderInfo$Title3$V6 !== void 0 && (_oHeaderInfo$Title3$V7 = _oHeaderInfo$Title3$V6.UI) !== null && _oHeaderInfo$Title3$V7 !== void 0 && _oHeaderInfo$Title3$V7.TextArrangement) {
|
|
70
|
+
// In case an explicit text arrangement was set we make use of it in the description as well
|
|
71
|
+
titleValueExpression = addTextArrangementToBindingExpression(titleValueExpression, fullContextPath);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
titleValueExpression = formatValueRecursively(titleValueExpression, fullContextPath); // If there is a TypeName defined, show the default title 'New + TypeName', otherwise show the custom title or the default 'New object'
|
|
75
|
+
|
|
76
|
+
var createModeTitle = oHeaderInfo !== null && oHeaderInfo !== void 0 && oHeaderInfo.TypeName ? concat(titleWithHeaderInfo, ": ", annotationExpression(oHeaderInfo.TypeName.toString())) : titleNoHeaderInfo;
|
|
77
|
+
var activeExpression = oDraftRoot ? Entity.IsActive : true;
|
|
78
|
+
return compileBinding(ifElse( // If Create Mode && Empty expression
|
|
79
|
+
and(or(UI.IsCreateModeSticky, UI.IsCreateMode), titleValueExpression && isEmpty(titleValueExpression)), createModeTitle, // Otherwise show the default expression
|
|
80
|
+
ifElse(and(activeExpression, titleValueExpression && isEmpty(titleValueExpression)), titleForActiveHeaderNoHeaderInfo, titleValueExpression)));
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Retrieves the expression for the description of an object page.
|
|
84
|
+
*
|
|
85
|
+
* @param oHeaderInfo The @UI.HeaderInfo annotation content
|
|
86
|
+
* @param fullContextPath The full context path used to reach that object page
|
|
87
|
+
* @returns The binding expression for the object page description
|
|
88
|
+
*/
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
_exports.getExpressionForTitle = getExpressionForTitle;
|
|
92
|
+
|
|
93
|
+
var getExpressionForDescription = function (oHeaderInfo, fullContextPath) {
|
|
94
|
+
var _oHeaderInfo$Descript, _oHeaderInfo$Descript2, _oHeaderInfo$Descript3, _oHeaderInfo$Descript4, _oHeaderInfo$Descript5, _oHeaderInfo$Descript6, _oHeaderInfo$Descript7, _oHeaderInfo$Descript8, _oHeaderInfo$Descript9;
|
|
95
|
+
|
|
96
|
+
var bindingExpression = annotationExpression(oHeaderInfo === null || oHeaderInfo === void 0 ? void 0 : (_oHeaderInfo$Descript = oHeaderInfo.Description) === null || _oHeaderInfo$Descript === void 0 ? void 0 : _oHeaderInfo$Descript.Value);
|
|
97
|
+
|
|
98
|
+
if (oHeaderInfo !== null && oHeaderInfo !== void 0 && (_oHeaderInfo$Descript2 = oHeaderInfo.Description) !== null && _oHeaderInfo$Descript2 !== void 0 && (_oHeaderInfo$Descript3 = _oHeaderInfo$Descript2.Value) !== null && _oHeaderInfo$Descript3 !== void 0 && (_oHeaderInfo$Descript4 = _oHeaderInfo$Descript3.$target) !== null && _oHeaderInfo$Descript4 !== void 0 && (_oHeaderInfo$Descript5 = _oHeaderInfo$Descript4.annotations) !== null && _oHeaderInfo$Descript5 !== void 0 && (_oHeaderInfo$Descript6 = _oHeaderInfo$Descript5.Common) !== null && _oHeaderInfo$Descript6 !== void 0 && (_oHeaderInfo$Descript7 = _oHeaderInfo$Descript6.Text) !== null && _oHeaderInfo$Descript7 !== void 0 && (_oHeaderInfo$Descript8 = _oHeaderInfo$Descript7.annotations) !== null && _oHeaderInfo$Descript8 !== void 0 && (_oHeaderInfo$Descript9 = _oHeaderInfo$Descript8.UI) !== null && _oHeaderInfo$Descript9 !== void 0 && _oHeaderInfo$Descript9.TextArrangement) {
|
|
99
|
+
// In case an explicit text arrangement was set we make use of it in the description as well
|
|
100
|
+
bindingExpression = addTextArrangementToBindingExpression(bindingExpression, fullContextPath);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return compileBinding(formatValueRecursively(bindingExpression, fullContextPath));
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Return the expression for the save button.
|
|
107
|
+
*
|
|
108
|
+
* @param oViewData The current view data
|
|
109
|
+
* @param fullContextPath The path used up until here
|
|
110
|
+
* @returns The binding expression that shows the right save button text
|
|
111
|
+
*/
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
_exports.getExpressionForDescription = getExpressionForDescription;
|
|
115
|
+
|
|
116
|
+
var getExpressionForSaveButton = function (oViewData, fullContextPath) {
|
|
117
|
+
var _fullContextPath$star;
|
|
118
|
+
|
|
119
|
+
var saveButtonText = CommonUtils.getTranslatedText("T_OP_OBJECT_PAGE_SAVE", oViewData.resourceBundle);
|
|
120
|
+
var createButtonText = CommonUtils.getTranslatedText("T_OP_OBJECT_PAGE_CREATE", oViewData.resourceBundle);
|
|
121
|
+
var saveExpression;
|
|
122
|
+
|
|
123
|
+
if ((_fullContextPath$star = fullContextPath.startingEntitySet.annotations.Session) !== null && _fullContextPath$star !== void 0 && _fullContextPath$star.StickySessionSupported) {
|
|
124
|
+
// If we're in sticky mode AND the ui is in create mode, show Create, else show Save
|
|
125
|
+
saveExpression = ifElse(UI.IsCreateModeSticky, createButtonText, saveButtonText);
|
|
126
|
+
} else {
|
|
127
|
+
// If we're in draft AND the draft is a new object (!IsActiveEntity && !HasActiveEntity), show create, else show save
|
|
128
|
+
saveExpression = ifElse(Draft.IsNewObject, createButtonText, saveButtonText);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return compileBinding(saveExpression);
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* Method returns whether footer is visible or not on object / subobject page.
|
|
135
|
+
*
|
|
136
|
+
* @function
|
|
137
|
+
* @name getFooterVisible
|
|
138
|
+
* @param {ConverterAction[]} footerActions The footer action object coming from the converter
|
|
139
|
+
* @param {DataField[]} dataFields Data field array for normal footer visibility processing
|
|
140
|
+
* @returns {boolean | BindingExpression<string>} `true` if any action is true, otherwise compiled Binding or `false`
|
|
141
|
+
*/
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
_exports.getExpressionForSaveButton = getExpressionForSaveButton;
|
|
145
|
+
|
|
146
|
+
var getFooterVisible = function (footerActions, dataFields) {
|
|
147
|
+
var manifestActions = footerActions.filter(function (action) {
|
|
148
|
+
return isManifestAction(action);
|
|
149
|
+
});
|
|
150
|
+
var customActionVisibility;
|
|
151
|
+
|
|
152
|
+
if (manifestActions.length) {
|
|
153
|
+
// If we have manifest actions
|
|
154
|
+
var customActionIndividualVisibility = manifestActions.map(function (action) {
|
|
155
|
+
return resolveBindingString(action.visible, "boolean");
|
|
156
|
+
}); // construct the footer's visibility-binding out of all actions' visibility-bindings, first the binding of all custom actions ...
|
|
157
|
+
|
|
158
|
+
customActionVisibility = or.apply(void 0, _toConsumableArray(customActionIndividualVisibility)); // and then the binding of all annotation actions inside the footer ...
|
|
159
|
+
|
|
160
|
+
var annotationActionVisibility = getDataFieldBasedFooterVisibility(dataFields, true); // finally, return everything.
|
|
161
|
+
|
|
162
|
+
return compileBinding(or(customActionVisibility, resolveBindingString(annotationActionVisibility, "boolean")));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return getDataFieldBasedFooterVisibility(dataFields, true);
|
|
166
|
+
};
|
|
167
|
+
/**
|
|
168
|
+
* Checks if the footer is visible or not.
|
|
169
|
+
*
|
|
170
|
+
* @function
|
|
171
|
+
* @static
|
|
172
|
+
* @name sap.fe.templates.ObjectPage.ObjectPageTemplating.getDataFieldBasedFooterVisibility
|
|
173
|
+
* @memberof sap.fe.templates.ObjectPage.ObjectPageTemplating
|
|
174
|
+
* @param {Array} aDataFields Array of DataFields in the identification
|
|
175
|
+
* @param {boolean} bConsiderEditable Whether the edit mode binding is required or not
|
|
176
|
+
* @returns {string} An expression if all the actions are ui.hidden, true otherwise
|
|
177
|
+
* @private
|
|
178
|
+
* @ui5-restricted
|
|
179
|
+
**/
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
_exports.getFooterVisible = getFooterVisible;
|
|
183
|
+
|
|
184
|
+
var getDataFieldBasedFooterVisibility = function (aDataFields, bConsiderEditable) {
|
|
185
|
+
var sHiddenExpression = "";
|
|
186
|
+
var sSemiHiddenExpression;
|
|
187
|
+
var aHiddenActionPath = [];
|
|
188
|
+
|
|
189
|
+
for (var i in aDataFields) {
|
|
190
|
+
var oDataField = aDataFields[i];
|
|
191
|
+
|
|
192
|
+
if (oDataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction" && oDataField.Determining === true) {
|
|
193
|
+
var hiddenExpression = oDataField["@".concat("com.sap.vocabularies.UI.v1.Hidden")];
|
|
194
|
+
|
|
195
|
+
if (!hiddenExpression) {
|
|
196
|
+
return true;
|
|
197
|
+
} else if (hiddenExpression.$Path) {
|
|
198
|
+
if (aHiddenActionPath.indexOf(hiddenExpression.$Path) === -1) {
|
|
199
|
+
aHiddenActionPath.push(hiddenExpression.$Path);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (aHiddenActionPath.length) {
|
|
206
|
+
for (var index = 0; index < aHiddenActionPath.length; index++) {
|
|
207
|
+
if (aHiddenActionPath[index]) {
|
|
208
|
+
sSemiHiddenExpression = "(%{" + aHiddenActionPath[index] + "} === true ? false : true )";
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (index == aHiddenActionPath.length - 1) {
|
|
212
|
+
sHiddenExpression = sHiddenExpression + sSemiHiddenExpression;
|
|
213
|
+
} else {
|
|
214
|
+
sHiddenExpression = sHiddenExpression + sSemiHiddenExpression + "||";
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return "{= " + (bConsiderEditable ? "(" : "") + sHiddenExpression + (bConsiderEditable ? " || ${ui>/isEditable}) " : " ") + "&& ${internal>isCreateDialogOpen} !== true}";
|
|
219
|
+
} else {
|
|
220
|
+
return "{= " + (bConsiderEditable ? "${ui>/isEditable} && " : "") + "${internal>isCreateDialogOpen} !== true}";
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
/**
|
|
224
|
+
* Method returns Whether the action type is manifest or not.
|
|
225
|
+
*
|
|
226
|
+
* @function
|
|
227
|
+
* @name isManifestActionVisible
|
|
228
|
+
* @param {object} oAction The action object
|
|
229
|
+
* @returns {boolean} `true` if action is coming from manifest, `false` otherwise
|
|
230
|
+
*/
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
_exports.getDataFieldBasedFooterVisibility = getDataFieldBasedFooterVisibility;
|
|
234
|
+
|
|
235
|
+
var isManifestAction = function (oAction) {
|
|
236
|
+
var aActions = ["Primary", "DefaultApply", "Secondary", "ForAction", "ForNavigation", "SwitchToActiveObject", "SwitchToDraftObject", "DraftActions"];
|
|
237
|
+
return aActions.indexOf(oAction.type) < 0;
|
|
238
|
+
};
|
|
239
|
+
/**
|
|
240
|
+
* Returns an expression to determine Emphasized button type based on Criticality across all actions
|
|
241
|
+
* If critical action is rendered, its considered to be the primary action. Hence template's default primary action is set back to Default.
|
|
242
|
+
*
|
|
243
|
+
* @function
|
|
244
|
+
* @static
|
|
245
|
+
* @name sap.fe.templates.ObjectPage.ObjectPageTemplating.buildEmphasizedButtonExpression
|
|
246
|
+
* @memberof sap.fe.templates.ObjectPage.ObjectPageTemplating
|
|
247
|
+
* @param {Array} aIdentification Array of all the DataFields in Identification
|
|
248
|
+
* @returns {string} An expression to deduce if button type is Default or Emphasized
|
|
249
|
+
* @private
|
|
250
|
+
* @ui5-restricted
|
|
251
|
+
**/
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
_exports.isManifestAction = isManifestAction;
|
|
255
|
+
|
|
256
|
+
var buildEmphasizedButtonExpression = function (aIdentification) {
|
|
257
|
+
if (!aIdentification) {
|
|
258
|
+
return ButtonType.Emphasized;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
var sFormatEmphasizedExpression;
|
|
262
|
+
var bIsAlwaysDefault,
|
|
263
|
+
sHiddenSimplePath,
|
|
264
|
+
sHiddenExpression = "";
|
|
265
|
+
aIdentification.forEach(function (oDataField) {
|
|
266
|
+
var oCriticalityProperty = oDataField.Criticality;
|
|
267
|
+
var oDataFieldHidden = oDataField["@com.sap.vocabularies.UI.v1.Hidden"];
|
|
268
|
+
|
|
269
|
+
if (oDataField.$Type === "com.sap.vocabularies.UI.v1.DataFieldForAction" && !bIsAlwaysDefault && oCriticalityProperty) {
|
|
270
|
+
if (!sFormatEmphasizedExpression && oDataFieldHidden === true) {
|
|
271
|
+
// if DataField is set to hidden, we can skip other checks and return Default button type
|
|
272
|
+
sFormatEmphasizedExpression = ButtonType.Emphasized;
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (oDataFieldHidden && oDataFieldHidden.$Path) {
|
|
277
|
+
// when visibility of critical button is based on path, collect all paths for expression
|
|
278
|
+
sHiddenSimplePath = oDataFieldHidden.$Path;
|
|
279
|
+
|
|
280
|
+
if (sHiddenExpression) {
|
|
281
|
+
sHiddenExpression = sHiddenExpression + " && ";
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
sHiddenExpression = sHiddenExpression + "%{" + sHiddenSimplePath + "} === true";
|
|
285
|
+
sFormatEmphasizedExpression = "{= (" + sHiddenExpression + ") ? 'Emphasized' : 'Default' }";
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
switch (oCriticalityProperty.$EnumMember) {
|
|
289
|
+
// supported criticality are [Positive/3/'3'] and [Negative/1/'1']
|
|
290
|
+
case "com.sap.vocabularies.UI.v1.CriticalityType/Negative":
|
|
291
|
+
case "com.sap.vocabularies.UI.v1.CriticalityType/Positive":
|
|
292
|
+
case "1":
|
|
293
|
+
case 1:
|
|
294
|
+
case "3":
|
|
295
|
+
case 3:
|
|
296
|
+
if (!oDataFieldHidden) {
|
|
297
|
+
sFormatEmphasizedExpression = ButtonType.Default;
|
|
298
|
+
bIsAlwaysDefault = true;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
sFormatEmphasizedExpression = sFormatEmphasizedExpression || ButtonType.Default;
|
|
302
|
+
break;
|
|
303
|
+
|
|
304
|
+
default:
|
|
305
|
+
sFormatEmphasizedExpression = ButtonType.Emphasized;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
if (oCriticalityProperty.$Path) {
|
|
309
|
+
// when Criticality is set using a path, use the path for deducing the Emphsized type for default Primary Action
|
|
310
|
+
var sCombinedHiddenExpression = sHiddenExpression ? "!(" + sHiddenExpression + ") && " : "";
|
|
311
|
+
sFormatEmphasizedExpression = "{= " + sCombinedHiddenExpression + "((${" + oCriticalityProperty.$Path + "} === 'com.sap.vocabularies.UI.v1.CriticalityType/Negative') || (${" + oCriticalityProperty.$Path + "} === '1') || (${" + oCriticalityProperty.$Path + "} === 1) " + "|| (${" + oCriticalityProperty.$Path + "} === 'com.sap.vocabularies.UI.v1.CriticalityType/Positive') || (${" + oCriticalityProperty.$Path + "} === '3') || (${" + oCriticalityProperty.$Path + "} === 3)) ? " + "'Default'" + " : " + "'Emphasized'" + " }";
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
return sFormatEmphasizedExpression || ButtonType.Emphasized;
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
_exports.buildEmphasizedButtonExpression = buildEmphasizedButtonExpression;
|
|
319
|
+
|
|
320
|
+
var getElementBinding = function (sPath) {
|
|
321
|
+
var sNavigationPath = ODataModelAnnotationHelper.getNavigationPath(sPath);
|
|
322
|
+
|
|
323
|
+
if (sNavigationPath) {
|
|
324
|
+
return "{path:'" + sNavigationPath + "'}";
|
|
325
|
+
} else {
|
|
326
|
+
//no navigation property needs empty object
|
|
327
|
+
return "{path: ''}";
|
|
328
|
+
}
|
|
329
|
+
};
|
|
330
|
+
/**
|
|
331
|
+
* Function to check if draft pattern is supported.
|
|
332
|
+
*
|
|
333
|
+
* @param {object} oAnnotations Annotations of the current entity set.
|
|
334
|
+
* @returns {string} Returns the Boolean value based on draft state
|
|
335
|
+
*/
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
_exports.getElementBinding = getElementBinding;
|
|
339
|
+
|
|
340
|
+
var checkDraftState = function (oAnnotations) {
|
|
341
|
+
if (oAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"] && oAnnotations["@com.sap.vocabularies.Common.v1.DraftRoot"]["EditAction"]) {
|
|
342
|
+
return true;
|
|
343
|
+
} else {
|
|
344
|
+
return false;
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
/**
|
|
348
|
+
* Function to get the visibility for the SwitchToActive button in the object page or subobject page.
|
|
349
|
+
*
|
|
350
|
+
* @param {object} oAnnotations Annotations of the current entity set.
|
|
351
|
+
* @returns {string} Returns expression binding or Boolean value based on the draft state
|
|
352
|
+
*/
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
_exports.checkDraftState = checkDraftState;
|
|
356
|
+
|
|
357
|
+
var getSwitchToActiveVisibility = function (oAnnotations) {
|
|
358
|
+
if (checkDraftState(oAnnotations)) {
|
|
359
|
+
return "{= (%{DraftAdministrativeData/DraftIsCreatedByMe}) ? ( ${ui>/isEditable} && !${ui>createMode} && %{DraftAdministrativeData/DraftIsCreatedByMe} ) : false }";
|
|
360
|
+
} else {
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
/**
|
|
365
|
+
* Function to get the visibility for the SwitchToDraft button in the object page or subobject page.
|
|
366
|
+
*
|
|
367
|
+
* @param {object} oAnnotations Annotations of the current entity set.
|
|
368
|
+
* @returns {string} Returns expression binding or Boolean value based on the draft state
|
|
369
|
+
*/
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
_exports.getSwitchToActiveVisibility = getSwitchToActiveVisibility;
|
|
373
|
+
|
|
374
|
+
var getSwitchToDraftVisibility = function (oAnnotations) {
|
|
375
|
+
if (checkDraftState(oAnnotations)) {
|
|
376
|
+
return "{= (%{DraftAdministrativeData/DraftIsCreatedByMe}) ? ( !(${ui>/isEditable}) && !${ui>createMode} && ${HasDraftEntity} && %{DraftAdministrativeData/DraftIsCreatedByMe} ) : false }";
|
|
377
|
+
} else {
|
|
378
|
+
return false;
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
/**
|
|
382
|
+
* Function to get the visibility for the SwitchDraftAndActive button in the object page or subobject page.
|
|
383
|
+
*
|
|
384
|
+
* @param {object} oAnnotations Annotations of the current entity set.
|
|
385
|
+
* @returns {string} Returns expression binding or Boolean value based on the draft state
|
|
386
|
+
*/
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
_exports.getSwitchToDraftVisibility = getSwitchToDraftVisibility;
|
|
390
|
+
|
|
391
|
+
var getSwitchDraftAndActiveVisibility = function (oAnnotations) {
|
|
392
|
+
if (checkDraftState(oAnnotations)) {
|
|
393
|
+
return "{= (%{DraftAdministrativeData/DraftIsCreatedByMe}) ? ( !${ui>createMode} && %{DraftAdministrativeData/DraftIsCreatedByMe} ) : false }";
|
|
394
|
+
} else {
|
|
395
|
+
return false;
|
|
396
|
+
}
|
|
397
|
+
};
|
|
398
|
+
/**
|
|
399
|
+
* Function to find an action from the array of header actions in the converter context.
|
|
400
|
+
*
|
|
401
|
+
* @param {object[]} aConverterContextHeaderActions Array of 'header' actions on the object page.
|
|
402
|
+
* @param {string} sActionType The action type
|
|
403
|
+
* @returns {object | undefined} The action with the matching action type
|
|
404
|
+
* @private
|
|
405
|
+
*/
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
_exports.getSwitchDraftAndActiveVisibility = getSwitchDraftAndActiveVisibility;
|
|
409
|
+
|
|
410
|
+
var _findAction = function (aConverterContextHeaderActions, sActionType) {
|
|
411
|
+
var oAction;
|
|
412
|
+
|
|
413
|
+
if (aConverterContextHeaderActions && aConverterContextHeaderActions.length) {
|
|
414
|
+
oAction = aConverterContextHeaderActions.find(function (oHeaderAction) {
|
|
415
|
+
return oHeaderAction.type === sActionType;
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
return oAction;
|
|
420
|
+
};
|
|
421
|
+
/**
|
|
422
|
+
* Function to format the 'enabled' property for the Delete button on the object page or subobject page in case of a Command Execution.
|
|
423
|
+
*
|
|
424
|
+
* @param {Array} aConverterContextHeaderActions Array of header actions on the object page
|
|
425
|
+
* @returns {string} Returns expression binding or Boolean value from the converter output
|
|
426
|
+
*/
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
_exports._findAction = _findAction;
|
|
430
|
+
|
|
431
|
+
var getDeleteCommandExecutionEnabled = function (aConverterContextHeaderActions) {
|
|
432
|
+
var oDeleteAction = _findAction(aConverterContextHeaderActions, "Secondary");
|
|
433
|
+
|
|
434
|
+
return oDeleteAction ? oDeleteAction.enabled : "true";
|
|
435
|
+
};
|
|
436
|
+
/**
|
|
437
|
+
* Function to format the 'visible' property for the Delete button on the object page or subobject page in case of a Command Execution.
|
|
438
|
+
*
|
|
439
|
+
* @param {Array} aConverterContextHeaderActions Array of header actions on the object page
|
|
440
|
+
* @returns {string} Returns expression binding or Boolean value from the converter output
|
|
441
|
+
*/
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
_exports.getDeleteCommandExecutionEnabled = getDeleteCommandExecutionEnabled;
|
|
445
|
+
|
|
446
|
+
var getDeleteCommandExecutionVisible = function (aConverterContextHeaderActions) {
|
|
447
|
+
var oDeleteAction = _findAction(aConverterContextHeaderActions, "Secondary");
|
|
448
|
+
|
|
449
|
+
return oDeleteAction ? oDeleteAction.visible : "true";
|
|
450
|
+
};
|
|
451
|
+
/**
|
|
452
|
+
* Function to format the 'visible' property for the Edit button on the object page or subobject page in case of a Command Execution.
|
|
453
|
+
*
|
|
454
|
+
* @param {Array} aConverterContextHeaderActions Array of header actions on the object page
|
|
455
|
+
* @returns {string} Returns expression binding or Boolean value from the converter output
|
|
456
|
+
*/
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
_exports.getDeleteCommandExecutionVisible = getDeleteCommandExecutionVisible;
|
|
460
|
+
|
|
461
|
+
var getEditCommandExecutionVisible = function (aConverterContextHeaderActions) {
|
|
462
|
+
var oEditAction = _findAction(aConverterContextHeaderActions, "Primary");
|
|
463
|
+
|
|
464
|
+
return oEditAction ? oEditAction.visible : "true";
|
|
465
|
+
};
|
|
466
|
+
/**
|
|
467
|
+
* Function to format the 'enabled' property for the Edit button on the object page or subobject page in case of a Command Execution.
|
|
468
|
+
*
|
|
469
|
+
* @param {Array} aConverterContextHeaderActions Array of header actions on the object page
|
|
470
|
+
* @returns {string} Returns expression binding or Boolean value from the converter output
|
|
471
|
+
*/
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
_exports.getEditCommandExecutionVisible = getEditCommandExecutionVisible;
|
|
475
|
+
|
|
476
|
+
var getEditCommandExecutionEnabled = function (aConverterContextHeaderActions) {
|
|
477
|
+
var oEditAction = _findAction(aConverterContextHeaderActions, "Primary");
|
|
478
|
+
|
|
479
|
+
return oEditAction ? oEditAction.enabled : "true";
|
|
480
|
+
};
|
|
481
|
+
/**
|
|
482
|
+
* Function to get the EditAction from the Entityset based on Draft or sticky based application.
|
|
483
|
+
*
|
|
484
|
+
* @param {object} [oEntitySet] The value from the expression.
|
|
485
|
+
* @returns {string} Returns expression binding or boolean value based on vRawValue & oDraftNode
|
|
486
|
+
*/
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
_exports.getEditCommandExecutionEnabled = getEditCommandExecutionEnabled;
|
|
490
|
+
|
|
491
|
+
var getEditAction = function (oEntitySet) {
|
|
492
|
+
var sPath = oEntitySet.getPath(),
|
|
493
|
+
oAnnotations = oEntitySet.getObject(sPath + "@");
|
|
494
|
+
var bDraftRoot = oAnnotations.hasOwnProperty("@com.sap.vocabularies.Common.v1.DraftRoot");
|
|
495
|
+
var bStickySession = oAnnotations.hasOwnProperty("@com.sap.vocabularies.Session.v1.StickySessionSupported");
|
|
496
|
+
var sActionName;
|
|
497
|
+
|
|
498
|
+
if (bDraftRoot) {
|
|
499
|
+
sActionName = oEntitySet.getObject(sPath + "@com.sap.vocabularies.Common.v1.DraftRoot/EditAction");
|
|
500
|
+
} else if (bStickySession) {
|
|
501
|
+
sActionName = oEntitySet.getObject(sPath + "@com.sap.vocabularies.Session.v1.StickySessionSupported/EditAction");
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
return !sActionName ? sActionName : sPath + "/" + sActionName;
|
|
505
|
+
};
|
|
506
|
+
|
|
507
|
+
_exports.getEditAction = getEditAction;
|
|
508
|
+
|
|
509
|
+
var isReadOnlyFromStaticAnnotations = function (oAnnotations, oFieldControl) {
|
|
510
|
+
var bComputed, bImmutable, bReadOnly;
|
|
511
|
+
|
|
512
|
+
if (oAnnotations["@Org.OData.Core.V1.Computed"]) {
|
|
513
|
+
bComputed = oAnnotations["@Org.OData.Core.V1.Computed"].Bool ? oAnnotations["@Org.OData.Core.V1.Computed"].Bool == "true" : true;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
if (oAnnotations["@Org.OData.Core.V1.Immutable"]) {
|
|
517
|
+
bImmutable = oAnnotations["@Org.OData.Core.V1.Immutable"].Bool ? oAnnotations["@Org.OData.Core.V1.Immutable"].Bool == "true" : true;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
bReadOnly = bComputed || bImmutable;
|
|
521
|
+
|
|
522
|
+
if (oFieldControl) {
|
|
523
|
+
bReadOnly = bReadOnly || oFieldControl == "com.sap.vocabularies.Common.v1.FieldControlType/ReadOnly";
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
if (bReadOnly) {
|
|
527
|
+
return true;
|
|
528
|
+
} else {
|
|
529
|
+
return false;
|
|
530
|
+
}
|
|
531
|
+
};
|
|
532
|
+
|
|
533
|
+
_exports.isReadOnlyFromStaticAnnotations = isReadOnlyFromStaticAnnotations;
|
|
534
|
+
|
|
535
|
+
var readOnlyExpressionFromDynamicAnnotations = function (oFieldControl) {
|
|
536
|
+
var sIsFieldControlPathReadOnly;
|
|
537
|
+
|
|
538
|
+
if (oFieldControl) {
|
|
539
|
+
if (ManagedObject.bindingParser(oFieldControl)) {
|
|
540
|
+
sIsFieldControlPathReadOnly = "%" + oFieldControl + " === 1 ";
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
if (sIsFieldControlPathReadOnly) {
|
|
545
|
+
return "{= " + sIsFieldControlPathReadOnly + "? false : true }";
|
|
546
|
+
} else {
|
|
547
|
+
return;
|
|
548
|
+
}
|
|
549
|
+
};
|
|
550
|
+
/*
|
|
551
|
+
* Function to get the expression for chart Title Press
|
|
552
|
+
*
|
|
553
|
+
* @function
|
|
554
|
+
* @param {oConfiguration} [oConfigurations] control configuration from manifest
|
|
555
|
+
* @param {oManifest} [oManifest] Outbounds from manifest
|
|
556
|
+
* returns {String} [sCollectionName] Collection Name of the Micro Chart
|
|
557
|
+
*
|
|
558
|
+
* returns {String} [Expression] Handler Expression for the title press
|
|
559
|
+
*
|
|
560
|
+
*/
|
|
561
|
+
|
|
562
|
+
|
|
563
|
+
_exports.readOnlyExpressionFromDynamicAnnotations = readOnlyExpressionFromDynamicAnnotations;
|
|
564
|
+
|
|
565
|
+
var getExpressionForMicroChartTitlePress = function (oConfiguration, oManifestOutbound, sCollectionName) {
|
|
566
|
+
if (oConfiguration) {
|
|
567
|
+
if (oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"] || oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"] && oConfiguration["targetSections"]) {
|
|
568
|
+
return ".handlers.onDataPointTitlePressed($controller, ${$source>/},'" + JSON.stringify(oManifestOutbound) + "','" + oConfiguration["targetOutbound"]["outbound"] + "','" + sCollectionName + "' )";
|
|
569
|
+
} else if (oConfiguration["targetSections"]) {
|
|
570
|
+
return ".handlers.navigateToSubSection($controller, '" + JSON.stringify(oConfiguration["targetSections"]) + "')";
|
|
571
|
+
} else {
|
|
572
|
+
return undefined;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
};
|
|
576
|
+
/*
|
|
577
|
+
* Function to render Chart Title as Link
|
|
578
|
+
*
|
|
579
|
+
* @function
|
|
580
|
+
* @param {oControlConfiguration} [oConfigurations] control configuration from manifest
|
|
581
|
+
* returns {String} [sKey] For the TargetOutbound and TargetSection
|
|
582
|
+
*
|
|
583
|
+
*/
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
_exports.getExpressionForMicroChartTitlePress = getExpressionForMicroChartTitlePress;
|
|
587
|
+
|
|
588
|
+
var getMicroChartTitleAsLink = function (oControlConfiguration) {
|
|
589
|
+
if (oControlConfiguration && (oControlConfiguration["targetOutbound"] || oControlConfiguration["targetOutbound"] && oControlConfiguration["targetSections"])) {
|
|
590
|
+
return "External";
|
|
591
|
+
} else if (oControlConfiguration && oControlConfiguration["targetSections"]) {
|
|
592
|
+
return "InPage";
|
|
593
|
+
} else {
|
|
594
|
+
return "None";
|
|
595
|
+
}
|
|
596
|
+
};
|
|
597
|
+
/* Get groupId from control configuration
|
|
598
|
+
*
|
|
599
|
+
* @function
|
|
600
|
+
* @param {Object} [oConfigurations] control configuration from manifest
|
|
601
|
+
* @param {String} [sAnnotationPath] Annotation Path for the configuration
|
|
602
|
+
* @description Used to get the groupId for DataPoints and MicroCharts in the Header.
|
|
603
|
+
*
|
|
604
|
+
*/
|
|
605
|
+
|
|
606
|
+
|
|
607
|
+
_exports.getMicroChartTitleAsLink = getMicroChartTitleAsLink;
|
|
608
|
+
|
|
609
|
+
var getGroupIdFromConfig = function (oConfigurations, sAnnotationPath, sDefaultGroupId) {
|
|
610
|
+
var oConfiguration = oConfigurations[sAnnotationPath],
|
|
611
|
+
aAutoPatterns = ["Heroes", "Decoration", "Workers", "LongRunners"];
|
|
612
|
+
var sGroupId = sDefaultGroupId;
|
|
613
|
+
|
|
614
|
+
if (oConfiguration && oConfiguration.requestGroupId && aAutoPatterns.some(function (autoPattern) {
|
|
615
|
+
return autoPattern === oConfiguration.requestGroupId;
|
|
616
|
+
})) {
|
|
617
|
+
sGroupId = "$auto." + oConfiguration.requestGroupId;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
return sGroupId;
|
|
621
|
+
};
|
|
622
|
+
/*
|
|
623
|
+
* Get Context Binding with groupId from control configuration
|
|
624
|
+
*
|
|
625
|
+
* @function
|
|
626
|
+
* @param {Object} [oConfigurations] control configuration from manifest
|
|
627
|
+
* @param {String} [sKey] Annotation Path for of the configuration
|
|
628
|
+
* @description Used to get the binding for DataPoints in the Header.
|
|
629
|
+
*
|
|
630
|
+
*/
|
|
631
|
+
|
|
632
|
+
|
|
633
|
+
_exports.getGroupIdFromConfig = getGroupIdFromConfig;
|
|
634
|
+
|
|
635
|
+
var getBindingWithGroupIdFromConfig = function (oConfigurations, sKey) {
|
|
636
|
+
var sGroupId = getGroupIdFromConfig(oConfigurations, sKey);
|
|
637
|
+
var sBinding;
|
|
638
|
+
|
|
639
|
+
if (sGroupId) {
|
|
640
|
+
sBinding = "{ path : '', parameters : { $$groupId : '" + sGroupId + "' } }";
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
return sBinding;
|
|
644
|
+
};
|
|
645
|
+
/**
|
|
646
|
+
* Method to check whether a FieldGroup consists of only 1 DataField with MultiLine Text annotation.
|
|
647
|
+
*
|
|
648
|
+
* @param {DataFieldAbstractTypes[]} aFormElements A collection of form elements used in the current field group
|
|
649
|
+
* @returns {boolean} Returns true if only 1 data field with Multiline Text annotation exists.
|
|
650
|
+
*/
|
|
651
|
+
|
|
652
|
+
|
|
653
|
+
_exports.getBindingWithGroupIdFromConfig = getBindingWithGroupIdFromConfig;
|
|
654
|
+
|
|
655
|
+
var doesFieldGroupContainOnlyOneMultiLineDataField = function (aFormElements) {
|
|
656
|
+
return aFormElements && aFormElements.length === 1 && !!aFormElements[0].isValueMultilineText;
|
|
657
|
+
};
|
|
658
|
+
/*
|
|
659
|
+
* Get Visiblity of breadcrumbs.
|
|
660
|
+
*
|
|
661
|
+
* @function
|
|
662
|
+
* @param {Object} [oViewData] ViewData model
|
|
663
|
+
* returns {*} Expression or boolean
|
|
664
|
+
*/
|
|
665
|
+
|
|
666
|
+
|
|
667
|
+
_exports.doesFieldGroupContainOnlyOneMultiLineDataField = doesFieldGroupContainOnlyOneMultiLineDataField;
|
|
668
|
+
|
|
669
|
+
var getVisibleExpressionForBreadcrumbs = function (oViewData) {
|
|
670
|
+
return oViewData.showBreadCrumbs && oViewData.fclEnabled !== undefined ? "{fclhelper>/breadCrumbIsVisible}" : oViewData.showBreadCrumbs;
|
|
671
|
+
};
|
|
672
|
+
|
|
673
|
+
_exports.getVisibleExpressionForBreadcrumbs = getVisibleExpressionForBreadcrumbs;
|
|
674
|
+
|
|
675
|
+
var getShareButtonVisibility = function (viewData) {
|
|
676
|
+
var sShareButtonVisibilityExp = "!${ui>createMode}";
|
|
677
|
+
|
|
678
|
+
if (viewData.fclEnabled) {
|
|
679
|
+
sShareButtonVisibilityExp = "${fclhelper>/showShareIcon} && " + sShareButtonVisibilityExp;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
return "{= " + sShareButtonVisibilityExp + " }";
|
|
683
|
+
};
|
|
684
|
+
/*
|
|
685
|
+
* Get visiblity for editable header facet.
|
|
686
|
+
*
|
|
687
|
+
* If either the title or description field from the header annotations are editable, then the
|
|
688
|
+
* editable header facet is visible.
|
|
689
|
+
*
|
|
690
|
+
* @function
|
|
691
|
+
* @param {object} [oAnnotations] Annotations object for given entity set
|
|
692
|
+
* @param {object} [oFieldControl] field control
|
|
693
|
+
* returns {*} binding expression or boolean value resolved form funcitons isReadOnlyFromStaticAnnotations and isReadOnlyFromDynamicAnnotations
|
|
694
|
+
*/
|
|
695
|
+
|
|
696
|
+
|
|
697
|
+
_exports.getShareButtonVisibility = getShareButtonVisibility;
|
|
698
|
+
|
|
699
|
+
var getVisiblityOfHeaderFacet = function (oTitleAnnotations, oDescriptionAnnotations, oFieldTitleFieldControl, oFieldDescriptionFieldControl) {
|
|
700
|
+
// Check Annotations for Title Field
|
|
701
|
+
var bIsTitleReadOnly = isReadOnlyFromStaticAnnotations(oTitleAnnotations, oFieldTitleFieldControl);
|
|
702
|
+
var titleExpression = readOnlyExpressionFromDynamicAnnotations(oFieldTitleFieldControl); // There is no expression and the title is not ready only, this is sufficient for an editable header
|
|
703
|
+
|
|
704
|
+
if (!bIsTitleReadOnly && !titleExpression) {
|
|
705
|
+
return true;
|
|
706
|
+
} // Check Annotations for Description Field
|
|
707
|
+
|
|
708
|
+
|
|
709
|
+
var bIsDescriptionReadOnly = isReadOnlyFromStaticAnnotations(oDescriptionAnnotations, oFieldDescriptionFieldControl);
|
|
710
|
+
var descriptionExpression = readOnlyExpressionFromDynamicAnnotations(oFieldDescriptionFieldControl); // There is no expression and the description is not ready only, this is sufficient for an editable header
|
|
711
|
+
|
|
712
|
+
if (!bIsDescriptionReadOnly && !descriptionExpression) {
|
|
713
|
+
return true;
|
|
714
|
+
} // Both title and description are not editable and there are no dynamic annotations
|
|
715
|
+
|
|
716
|
+
|
|
717
|
+
if (bIsTitleReadOnly && bIsDescriptionReadOnly && !titleExpression && !descriptionExpression) {
|
|
718
|
+
return false;
|
|
719
|
+
} // Now combine expressions
|
|
720
|
+
|
|
721
|
+
|
|
722
|
+
if (titleExpression && !descriptionExpression) {
|
|
723
|
+
return titleExpression;
|
|
724
|
+
} else if (!titleExpression && descriptionExpression) {
|
|
725
|
+
return descriptionExpression;
|
|
726
|
+
} else {
|
|
727
|
+
return combineTitleAndDescriptionExpression(oFieldTitleFieldControl, oFieldDescriptionFieldControl);
|
|
728
|
+
}
|
|
729
|
+
};
|
|
730
|
+
|
|
731
|
+
_exports.getVisiblityOfHeaderFacet = getVisiblityOfHeaderFacet;
|
|
732
|
+
|
|
733
|
+
var combineTitleAndDescriptionExpression = function (oTitleFieldControl, oDescriptionFieldControl) {
|
|
734
|
+
// If both header and title field are based on dynmaic field control, the editable header
|
|
735
|
+
// is visible if at least one of these is not ready only
|
|
736
|
+
return "{= %" + oTitleFieldControl + " === 1 ? ( %" + oDescriptionFieldControl + " === 1 ? false : true ) : true }";
|
|
737
|
+
};
|
|
738
|
+
/*
|
|
739
|
+
* Get Expression of press event of delete button.
|
|
740
|
+
*
|
|
741
|
+
* @function
|
|
742
|
+
* @param {string} [sEntitySetName] Entity set name
|
|
743
|
+
* returns {string} binding expression / function string generated from commanhelper's function generateFunction
|
|
744
|
+
*/
|
|
745
|
+
|
|
746
|
+
|
|
747
|
+
_exports.combineTitleAndDescriptionExpression = combineTitleAndDescriptionExpression;
|
|
748
|
+
|
|
749
|
+
var getPressExpressionForDelete = function (sEntitySetName) {
|
|
750
|
+
var sDeletableContexts = "${$view>/getBindingContext}",
|
|
751
|
+
sTitle = "${$view>/#fe::ObjectPage/getHeaderTitle/getExpandedHeading/getItems/1/getText}",
|
|
752
|
+
sDescription = "${$view>/#fe::ObjectPage/getHeaderTitle/getExpandedContent/0/getItems/0/getText}";
|
|
753
|
+
var oParams = {
|
|
754
|
+
title: sTitle,
|
|
755
|
+
entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
|
|
756
|
+
description: sDescription
|
|
757
|
+
};
|
|
758
|
+
return CommonHelper.generateFunction(".editFlow.deleteDocument", sDeletableContexts, CommonHelper.objectToString(oParams));
|
|
759
|
+
};
|
|
760
|
+
/*
|
|
761
|
+
* Get Expression of press event of Edit button.
|
|
762
|
+
*
|
|
763
|
+
* @function
|
|
764
|
+
* @param {object} [oDataField] Data field object
|
|
765
|
+
* @param {string} [sEntitySetName] Entity set name
|
|
766
|
+
* @param {object} [oHeaderAction] Header action object
|
|
767
|
+
* returns {string} binding expression / function string generated from commanhelper's function generateFunction
|
|
768
|
+
*/
|
|
769
|
+
|
|
770
|
+
|
|
771
|
+
_exports.getPressExpressionForDelete = getPressExpressionForDelete;
|
|
772
|
+
|
|
773
|
+
var getPressExpressionForEdit = function (oDataField, sEntitySetName, oHeaderAction) {
|
|
774
|
+
var sEditableContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
|
|
775
|
+
sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
|
|
776
|
+
sInvocationGroup = sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
|
|
777
|
+
var oParams = {
|
|
778
|
+
contexts: "${$view>/getBindingContext}",
|
|
779
|
+
entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
|
|
780
|
+
invocationGrouping: CommonHelper.addSingleQuotes(sInvocationGroup),
|
|
781
|
+
model: "${$source>/}.getModel()",
|
|
782
|
+
label: CommonHelper.addSingleQuotes(oDataField && oDataField.Label, true),
|
|
783
|
+
isNavigable: oHeaderAction && oHeaderAction.isNavigable,
|
|
784
|
+
defaultValuesExtensionFunction: oHeaderAction && oHeaderAction.defaultValuesExtensionFunction ? "'" + oHeaderAction.defaultValuesExtensionFunction + "'" : undefined
|
|
785
|
+
};
|
|
786
|
+
return CommonHelper.generateFunction(".handlers.onCallAction", "${$view>/}", sEditableContexts, CommonHelper.objectToString(oParams));
|
|
787
|
+
};
|
|
788
|
+
/*
|
|
789
|
+
* Method to get the expression for the 'press' event for footer annotation actions
|
|
790
|
+
*
|
|
791
|
+
* @function
|
|
792
|
+
* @param {object} [oDataField] Data field object
|
|
793
|
+
* @param {string} [sEntitySetName] Entity set name
|
|
794
|
+
* @param {object} [oHeaderAction] Header action object
|
|
795
|
+
* returns {string} Binding expression or function string that is generated from the Commonhelper's function generateFunction
|
|
796
|
+
*/
|
|
797
|
+
|
|
798
|
+
|
|
799
|
+
_exports.getPressExpressionForEdit = getPressExpressionForEdit;
|
|
800
|
+
|
|
801
|
+
var getPressExpressionForFooterAnnotationAction = function (oDataField, sEntitySetName, oHeaderAction) {
|
|
802
|
+
var sActionContexts = CommonHelper.addSingleQuotes(oDataField && oDataField.Action),
|
|
803
|
+
sDataFieldEnumMember = oDataField && oDataField.InvocationGrouping && oDataField.InvocationGrouping["$EnumMember"],
|
|
804
|
+
sInvocationGroup = sDataFieldEnumMember === "com.sap.vocabularies.UI.v1.OperationGroupingType/ChangeSet" ? "ChangeSet" : "Isolated";
|
|
805
|
+
var oParams = {
|
|
806
|
+
contexts: "${$view>/#fe::ObjectPage/}.getBindingContext()",
|
|
807
|
+
entitySetName: CommonHelper.addSingleQuotes(sEntitySetName),
|
|
808
|
+
invocationGrouping: CommonHelper.addSingleQuotes(sInvocationGroup),
|
|
809
|
+
model: "${$source>/}.getModel()",
|
|
810
|
+
label: CommonHelper.addSingleQuotes(oDataField && oDataField.Label, true),
|
|
811
|
+
isNavigable: oHeaderAction && oHeaderAction.isNavigable,
|
|
812
|
+
defaultValuesExtensionFunction: oHeaderAction && oHeaderAction.defaultValuesExtensionFunction ? "'" + oHeaderAction.defaultValuesExtensionFunction + "'" : undefined
|
|
813
|
+
};
|
|
814
|
+
return CommonHelper.generateFunction(".handlers.onCallAction", "${$view>/}", sActionContexts, CommonHelper.objectToString(oParams));
|
|
815
|
+
};
|
|
816
|
+
/*
|
|
817
|
+
* Gets the binding of the container HBox for the header facet.
|
|
818
|
+
*
|
|
819
|
+
* @function
|
|
820
|
+
* @param {object} [oControlConfiguration] The control configuration form of the viewData model
|
|
821
|
+
* @param {object} [oHeaderFacet] The object of the header facet
|
|
822
|
+
* returns {*} The binding expression from function getBindingWithGroupIdFromConfig or undefined.
|
|
823
|
+
*/
|
|
824
|
+
|
|
825
|
+
|
|
826
|
+
_exports.getPressExpressionForFooterAnnotationAction = getPressExpressionForFooterAnnotationAction;
|
|
827
|
+
|
|
828
|
+
var getStashableHBoxBinding = function (oControlConfiguration, oHeaderFacet) {
|
|
829
|
+
if (oHeaderFacet && oHeaderFacet.Facet && oHeaderFacet.Facet.targetAnnotationType === "DataPoint") {
|
|
830
|
+
return getBindingWithGroupIdFromConfig(oControlConfiguration, oHeaderFacet.Facet.targetAnnotationValue);
|
|
831
|
+
}
|
|
832
|
+
};
|
|
833
|
+
/*
|
|
834
|
+
* Gets the 'Press' event expression for the external and internal data point link.
|
|
835
|
+
*
|
|
836
|
+
* @function
|
|
837
|
+
* @param {object} [oConfiguration] Control configuration from manifest
|
|
838
|
+
* @param {object} [oManifestOutbound] Outbounds from manifest
|
|
839
|
+
* returns {string} The runtime binding of the 'Press' event
|
|
840
|
+
*/
|
|
841
|
+
|
|
842
|
+
|
|
843
|
+
_exports.getStashableHBoxBinding = getStashableHBoxBinding;
|
|
844
|
+
|
|
845
|
+
var getPressExpressionForLink = function (oConfiguration, oManifestOutbound) {
|
|
846
|
+
if (oConfiguration) {
|
|
847
|
+
if (oConfiguration["targetOutbound"] && oConfiguration["targetOutbound"]["outbound"]) {
|
|
848
|
+
return ".handlers.onDataPointTitlePressed($controller, ${$source>}, " + JSON.stringify(oManifestOutbound) + "," + JSON.stringify(oConfiguration["targetOutbound"]["outbound"]) + ")";
|
|
849
|
+
} else if (oConfiguration["targetSections"]) {
|
|
850
|
+
return ".handlers.navigateToSubSection($controller, '" + JSON.stringify(oConfiguration["targetSections"]) + "')";
|
|
851
|
+
} else {
|
|
852
|
+
return undefined;
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
};
|
|
856
|
+
|
|
857
|
+
_exports.getPressExpressionForLink = getPressExpressionForLink;
|
|
858
|
+
|
|
859
|
+
var isSubSectionTitleVisible = function (sSubSectionvisible, sSubSectiontitle, sSubSectionshowTitle) {
|
|
860
|
+
if (sSubSectionvisible.indexOf("{=") === 0) {
|
|
861
|
+
// Dynamic expression
|
|
862
|
+
var sExpressionResult = sSubSectionvisible.substring(sSubSectionvisible.indexOf("{=") + 2, sSubSectionvisible.lastIndexOf("}"));
|
|
863
|
+
return "{= (" + sExpressionResult + ") && ('" + sSubSectiontitle + "' !=='undefined') && (" + sSubSectionshowTitle + " ? true : false) }";
|
|
864
|
+
} else {
|
|
865
|
+
return sSubSectionvisible && sSubSectiontitle !== "undefined" && (sSubSectionshowTitle ? "true" : "false");
|
|
866
|
+
}
|
|
867
|
+
};
|
|
868
|
+
|
|
869
|
+
_exports.isSubSectionTitleVisible = isSubSectionTitleVisible;
|
|
870
|
+
return _exports;
|
|
871
|
+
}, false);
|
|
872
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk9iamVjdFBhZ2VUZW1wbGF0aW5nLnRzIl0sIm5hbWVzIjpbIkJ1dHRvblR5cGUiLCJtTGlicmFyeSIsImdldEV4cHJlc3Npb25Gb3JUaXRsZSIsIm9IZWFkZXJJbmZvIiwib1ZpZXdEYXRhIiwiZnVsbENvbnRleHRQYXRoIiwib0RyYWZ0Um9vdCIsInRpdGxlTm9IZWFkZXJJbmZvIiwiQ29tbW9uVXRpbHMiLCJnZXRUcmFuc2xhdGVkVGV4dCIsInJlc291cmNlQnVuZGxlIiwidW5kZWZpbmVkIiwiZW50aXR5U2V0IiwidGl0bGVXaXRoSGVhZGVySW5mbyIsIm9FbXB0eUhlYWRlckluZm9UaXRsZSIsIlRpdGxlIiwiVmFsdWUiLCJ0aXRsZUZvckFjdGl2ZUhlYWRlck5vSGVhZGVySW5mbyIsInRpdGxlVmFsdWVFeHByZXNzaW9uIiwiYW5ub3RhdGlvbkV4cHJlc3Npb24iLCIkdGFyZ2V0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJUZXh0IiwiVUkiLCJUZXh0QXJyYW5nZW1lbnQiLCJhZGRUZXh0QXJyYW5nZW1lbnRUb0JpbmRpbmdFeHByZXNzaW9uIiwiZm9ybWF0VmFsdWVSZWN1cnNpdmVseSIsImNyZWF0ZU1vZGVUaXRsZSIsIlR5cGVOYW1lIiwiY29uY2F0IiwidG9TdHJpbmciLCJhY3RpdmVFeHByZXNzaW9uIiwiRW50aXR5IiwiSXNBY3RpdmUiLCJjb21waWxlQmluZGluZyIsImlmRWxzZSIsImFuZCIsIm9yIiwiSXNDcmVhdGVNb2RlU3RpY2t5IiwiSXNDcmVhdGVNb2RlIiwiaXNFbXB0eSIsImdldEV4cHJlc3Npb25Gb3JEZXNjcmlwdGlvbiIsImJpbmRpbmdFeHByZXNzaW9uIiwiRGVzY3JpcHRpb24iLCJnZXRFeHByZXNzaW9uRm9yU2F2ZUJ1dHRvbiIsInNhdmVCdXR0b25UZXh0IiwiY3JlYXRlQnV0dG9uVGV4dCIsInNhdmVFeHByZXNzaW9uIiwic3RhcnRpbmdFbnRpdHlTZXQiLCJTZXNzaW9uIiwiU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsIkRyYWZ0IiwiSXNOZXdPYmplY3QiLCJnZXRGb290ZXJWaXNpYmxlIiwiZm9vdGVyQWN0aW9ucyIsImRhdGFGaWVsZHMiLCJtYW5pZmVzdEFjdGlvbnMiLCJmaWx0ZXIiLCJhY3Rpb24iLCJpc01hbmlmZXN0QWN0aW9uIiwiY3VzdG9tQWN0aW9uVmlzaWJpbGl0eSIsImxlbmd0aCIsImN1c3RvbUFjdGlvbkluZGl2aWR1YWxWaXNpYmlsaXR5IiwibWFwIiwicmVzb2x2ZUJpbmRpbmdTdHJpbmciLCJ2aXNpYmxlIiwiYW5ub3RhdGlvbkFjdGlvblZpc2liaWxpdHkiLCJnZXREYXRhRmllbGRCYXNlZEZvb3RlclZpc2liaWxpdHkiLCJhRGF0YUZpZWxkcyIsImJDb25zaWRlckVkaXRhYmxlIiwic0hpZGRlbkV4cHJlc3Npb24iLCJzU2VtaUhpZGRlbkV4cHJlc3Npb24iLCJhSGlkZGVuQWN0aW9uUGF0aCIsImkiLCJvRGF0YUZpZWxkIiwiJFR5cGUiLCJEZXRlcm1pbmluZyIsImhpZGRlbkV4cHJlc3Npb24iLCIkUGF0aCIsImluZGV4T2YiLCJwdXNoIiwiaW5kZXgiLCJvQWN0aW9uIiwiYUFjdGlvbnMiLCJ0eXBlIiwiYnVpbGRFbXBoYXNpemVkQnV0dG9uRXhwcmVzc2lvbiIsImFJZGVudGlmaWNhdGlvbiIsIkVtcGhhc2l6ZWQiLCJzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24iLCJiSXNBbHdheXNEZWZhdWx0Iiwic0hpZGRlblNpbXBsZVBhdGgiLCJmb3JFYWNoIiwib0NyaXRpY2FsaXR5UHJvcGVydHkiLCJDcml0aWNhbGl0eSIsIm9EYXRhRmllbGRIaWRkZW4iLCIkRW51bU1lbWJlciIsIkRlZmF1bHQiLCJzQ29tYmluZWRIaWRkZW5FeHByZXNzaW9uIiwiZ2V0RWxlbWVudEJpbmRpbmciLCJzUGF0aCIsInNOYXZpZ2F0aW9uUGF0aCIsIk9EYXRhTW9kZWxBbm5vdGF0aW9uSGVscGVyIiwiZ2V0TmF2aWdhdGlvblBhdGgiLCJjaGVja0RyYWZ0U3RhdGUiLCJvQW5ub3RhdGlvbnMiLCJnZXRTd2l0Y2hUb0FjdGl2ZVZpc2liaWxpdHkiLCJnZXRTd2l0Y2hUb0RyYWZ0VmlzaWJpbGl0eSIsImdldFN3aXRjaERyYWZ0QW5kQWN0aXZlVmlzaWJpbGl0eSIsIl9maW5kQWN0aW9uIiwiYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIiwic0FjdGlvblR5cGUiLCJmaW5kIiwib0hlYWRlckFjdGlvbiIsImdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25FbmFibGVkIiwib0RlbGV0ZUFjdGlvbiIsImVuYWJsZWQiLCJnZXREZWxldGVDb21tYW5kRXhlY3V0aW9uVmlzaWJsZSIsImdldEVkaXRDb21tYW5kRXhlY3V0aW9uVmlzaWJsZSIsIm9FZGl0QWN0aW9uIiwiZ2V0RWRpdENvbW1hbmRFeGVjdXRpb25FbmFibGVkIiwiZ2V0RWRpdEFjdGlvbiIsIm9FbnRpdHlTZXQiLCJnZXRQYXRoIiwiZ2V0T2JqZWN0IiwiYkRyYWZ0Um9vdCIsImhhc093blByb3BlcnR5IiwiYlN0aWNreVNlc3Npb24iLCJzQWN0aW9uTmFtZSIsImlzUmVhZE9ubHlGcm9tU3RhdGljQW5ub3RhdGlvbnMiLCJvRmllbGRDb250cm9sIiwiYkNvbXB1dGVkIiwiYkltbXV0YWJsZSIsImJSZWFkT25seSIsIkJvb2wiLCJyZWFkT25seUV4cHJlc3Npb25Gcm9tRHluYW1pY0Fubm90YXRpb25zIiwic0lzRmllbGRDb250cm9sUGF0aFJlYWRPbmx5IiwiTWFuYWdlZE9iamVjdCIsImJpbmRpbmdQYXJzZXIiLCJnZXRFeHByZXNzaW9uRm9yTWljcm9DaGFydFRpdGxlUHJlc3MiLCJvQ29uZmlndXJhdGlvbiIsIm9NYW5pZmVzdE91dGJvdW5kIiwic0NvbGxlY3Rpb25OYW1lIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldE1pY3JvQ2hhcnRUaXRsZUFzTGluayIsIm9Db250cm9sQ29uZmlndXJhdGlvbiIsImdldEdyb3VwSWRGcm9tQ29uZmlnIiwib0NvbmZpZ3VyYXRpb25zIiwic0Fubm90YXRpb25QYXRoIiwic0RlZmF1bHRHcm91cElkIiwiYUF1dG9QYXR0ZXJucyIsInNHcm91cElkIiwicmVxdWVzdEdyb3VwSWQiLCJzb21lIiwiYXV0b1BhdHRlcm4iLCJnZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnIiwic0tleSIsInNCaW5kaW5nIiwiZG9lc0ZpZWxkR3JvdXBDb250YWluT25seU9uZU11bHRpTGluZURhdGFGaWVsZCIsImFGb3JtRWxlbWVudHMiLCJpc1ZhbHVlTXVsdGlsaW5lVGV4dCIsImdldFZpc2libGVFeHByZXNzaW9uRm9yQnJlYWRjcnVtYnMiLCJzaG93QnJlYWRDcnVtYnMiLCJmY2xFbmFibGVkIiwiZ2V0U2hhcmVCdXR0b25WaXNpYmlsaXR5Iiwidmlld0RhdGEiLCJzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwIiwiZ2V0VmlzaWJsaXR5T2ZIZWFkZXJGYWNldCIsIm9UaXRsZUFubm90YXRpb25zIiwib0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnMiLCJvRmllbGRUaXRsZUZpZWxkQ29udHJvbCIsIm9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sIiwiYklzVGl0bGVSZWFkT25seSIsInRpdGxlRXhwcmVzc2lvbiIsImJJc0Rlc2NyaXB0aW9uUmVhZE9ubHkiLCJkZXNjcmlwdGlvbkV4cHJlc3Npb24iLCJjb21iaW5lVGl0bGVBbmREZXNjcmlwdGlvbkV4cHJlc3Npb24iLCJvVGl0bGVGaWVsZENvbnRyb2wiLCJvRGVzY3JpcHRpb25GaWVsZENvbnRyb2wiLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JEZWxldGUiLCJzRW50aXR5U2V0TmFtZSIsInNEZWxldGFibGVDb250ZXh0cyIsInNUaXRsZSIsInNEZXNjcmlwdGlvbiIsIm9QYXJhbXMiLCJ0aXRsZSIsImVudGl0eVNldE5hbWUiLCJDb21tb25IZWxwZXIiLCJhZGRTaW5nbGVRdW90ZXMiLCJkZXNjcmlwdGlvbiIsImdlbmVyYXRlRnVuY3Rpb24iLCJvYmplY3RUb1N0cmluZyIsImdldFByZXNzRXhwcmVzc2lvbkZvckVkaXQiLCJzRWRpdGFibGVDb250ZXh0cyIsIkFjdGlvbiIsInNEYXRhRmllbGRFbnVtTWVtYmVyIiwiSW52b2NhdGlvbkdyb3VwaW5nIiwic0ludm9jYXRpb25Hcm91cCIsImNvbnRleHRzIiwiaW52b2NhdGlvbkdyb3VwaW5nIiwibW9kZWwiLCJsYWJlbCIsIkxhYmVsIiwiaXNOYXZpZ2FibGUiLCJkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24iLCJnZXRQcmVzc0V4cHJlc3Npb25Gb3JGb290ZXJBbm5vdGF0aW9uQWN0aW9uIiwic0FjdGlvbkNvbnRleHRzIiwiZ2V0U3Rhc2hhYmxlSEJveEJpbmRpbmciLCJvSGVhZGVyRmFjZXQiLCJGYWNldCIsInRhcmdldEFubm90YXRpb25UeXBlIiwidGFyZ2V0QW5ub3RhdGlvblZhbHVlIiwiZ2V0UHJlc3NFeHByZXNzaW9uRm9yTGluayIsImlzU3ViU2VjdGlvblRpdGxlVmlzaWJsZSIsInNTdWJTZWN0aW9udmlzaWJsZSIsInNTdWJTZWN0aW9udGl0bGUiLCJzU3ViU2VjdGlvbnNob3dUaXRsZSIsInNFeHByZXNzaW9uUmVzdWx0Iiwic3Vic3RyaW5nIiwibGFzdEluZGV4T2YiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QkEsTUFBTUEsVUFBVSxHQUFHQyxRQUFRLENBQUNELFVBQTVCOztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQU1FLHFCQUFxQixHQUFHLFVBQ3BDQyxXQURvQyxFQUVwQ0MsU0FGb0MsRUFHcENDLGVBSG9DLEVBSXBDQyxVQUpvQyxFQUtSO0FBQUE7O0FBQzVCLFFBQU1DLGlCQUFpQixHQUFHQyxXQUFXLENBQUNDLGlCQUFaLENBQThCLGNBQTlCLEVBQThDTCxTQUFTLENBQUNNLGNBQXhELEVBQXdFQyxTQUF4RSxFQUFtRlAs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SixrQkFBa0IsQ0FBQ3ZJLE9BQW5CLENBQTJCLElBQTNCLElBQW1DLENBQWhFLEVBQW1FdUksa0JBQWtCLENBQUNLLFdBQW5CLENBQStCLEdBQS9CLENBQW5FLENBQTFCO0FBQ0EsYUFDQyxTQUNBRixpQkFEQSxHQUVBLFNBRkEsR0FHQUYsZ0JBSEEsR0FJQSx3QkFKQSxHQUtBQyxvQkFMQSxHQU1BLG9CQVBEO0FBU0EsS0FaRCxNQVlPO0FBQ04sYUFBT0Ysa0JBQWtCLElBQUlDLGdCQUFnQixLQUFLLFdBQTNDLEtBQTJEQyxvQkFBb0IsR0FBRyxNQUFILEdBQVksT0FBM0YsQ0FBUDtBQUNBO0FBQ0QsR0FoQk0iLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEZvcm1hdHRlcnMgZm9yIHRoZSBPYmplY3QgUGFnZVxuaW1wb3J0IHsgRGF0YUZpZWxkLCBIZWFkZXJJbmZvVHlwZSwgVUlBbm5vdGF0aW9uVGVybXMsIFVJQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgeyBEYXRhRmllbGRUeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9VSVwiO1xuaW1wb3J0IFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgeyBDb252ZXJ0ZXJBY3Rpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vQWN0aW9uXCI7XG5pbXBvcnQgeyBEcmFmdCwgRW50aXR5LCBVSSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvQmluZGluZ0hlbHBlclwiO1xuaW1wb3J0IHsgTWFuaWZlc3RBY3Rpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQge1xuXHRhbmQsXG5cdGFubm90YXRpb25FeHByZXNzaW9uLFxuXHRCaW5kaW5nRXhwcmVzc2lvbixcblx0Y29tcGlsZUJpbmRpbmcsXG5cdGNvbmNhdCxcblx0RXhwcmVzc2lvbixcblx0aWZFbHNlLFxuXHRpc0VtcHR5LFxuXHRvcixcblx0cmVzb2x2ZUJpbmRpbmdTdHJpbmdcbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvQmluZGluZ0V4cHJlc3Npb25cIjtcbmltcG9ydCB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgQ29tbW9uSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL0NvbW1vbkhlbHBlclwiO1xuaW1wb3J0IHsgYWRkVGV4dEFycmFuZ2VtZW50VG9CaW5kaW5nRXhwcmVzc2lvbiwgZm9ybWF0VmFsdWVSZWN1cnNpdmVseSB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkL0ZpZWxkVGVtcGxhdGluZ1wiO1xuaW1wb3J0IG1MaWJyYXJ5IGZyb20gXCJzYXAvbS9saWJyYXJ5XCI7XG5pbXBvcnQgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IE9EYXRhTW9kZWxBbm5vdGF0aW9uSGVscGVyIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQW5ub3RhdGlvbkhlbHBlclwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5jb25zdCBCdXR0b25UeXBlID0gbUxpYnJhcnkuQnV0dG9uVHlwZTtcblxudHlwZSBWaWV3RGF0YSA9IHtcblx0cmVzb3VyY2VCdW5kbGU6IFJlc291cmNlQnVuZGxlO1xuXHRlbnRpdHlTZXQ6IHN0cmluZztcbn07XG5cbi8vYGBgbWVybWFpZFxuLy8gZ3JhcGggVERcbi8vIEFbT2JqZWN0IFBhZ2UgVGl0bGVdIC0tPnxHZXQgRGF0YUZpZWxkIFZhbHVlfCBDe0V2YWx1YXRlIENyZWF0ZSBNb2RlfVxuLy8gQyAtLT58SW4gQ3JlYXRlIE1vZGV8IER7SXMgRGF0YUZpZWxkIFZhbHVlIGVtcHR5fVxuLy8gRCAtLT58WWVzfCBGe0lzIHRoZXJlIGEgVHlwZU5hbWV9XG4vLyBGIC0tPnxZZXN8IEdbSXMgdGhlcmUgYW4gY3VzdG9tIHRpdGxlXVxuLy8gRyAtLT58WWVzfCBHMVtTaG93IHRoZSBjdXN0b20gdGl0bGUgKyAnVHlwZU5hbWUnXVxuLy8gRyAtLT58Tm98IEcyW0Rpc3BsYXkgdGhlIGRlZmF1bHQgdGl0bGUgJ05ldyArIFR5cGVOYW1lJ11cbi8vIEYgLS0+fE5vfCBIW0lzIHRoZXJlIGEgY3VzdG9tIHRpdGxlXVxuLy8gSCAtLT58WWVzfCBJW1Nob3cgdGhlIGN1c3RvbSB0aXRsZV1cbi8vIEggLS0+fE5vfCBKW1Nob3cgdGhlIGRlZmF1bHQgJ1VuYW1uZWQgT2JqZWN0J11cbi8vIEQgLS0+fE5vfCBFXG4vLyBDIC0tPnxOb3QgaW4gY3JlYXRlIG1vZGV8IEVbU2hvdyBEYXRhRmllbGQgVmFsdWVdXG4vLyBgYGBcbi8qKlxuICogQ29tcHV0ZSB0aGUgdGl0bGUgZm9yIHRoZSBvYmplY3QgcGFnZS5cbiAqIEBwYXJhbSBvSGVhZGVySW5mbyBUaGUgQFVJLkhlYWRlckluZm8gYW5ub3RhdGlvbiBjb250ZW50XG4gKiBAcGFyYW0gb1ZpZXdEYXRhIFRoZSB2aWV3IGRhdGEgb2JqZWN0IHdlJ3JlIGN1cnJlbnRseSBvblxuICogQHBhcmFtIGZ1bGxDb250ZXh0UGF0aCBUaGUgZnVsbCBjb250ZXh0IHBhdGggdXNlZCB0byByZWFjaCB0aGF0IG9iamVjdCBwYWdlXG4gKiBAcGFyYW0gb0RyYWZ0Um9vdFxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiBmb3IgdGhlIG9iamVjdCBwYWdlIHRpdGxlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yVGl0bGUgPSBmdW5jdGlvbiAoXG5cdG9IZWFkZXJJbmZvOiBIZWFkZXJJbmZvVHlwZSB8IHVuZGVmaW5lZCxcblx0b1ZpZXdEYXRhOiBWaWV3RGF0YSxcblx0ZnVsbENvbnRleHRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoLFxuXHRvRHJhZnRSb290OiBPYmplY3QgfCB1bmRlZmluZWRcbik6IEJpbmRpbmdFeHByZXNzaW9uPHN0cmluZz4ge1xuXHRjb25zdCB0aXRsZU5vSGVhZGVySW5mbyA9IENvbW1vblV0aWxzLmdldFRyYW5zbGF0ZWRUZXh0KFwiVF9ORVdfT0JKRUNUXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSwgdW5kZWZpbmVkLCBvVmlld0RhdGEuZW50aXR5U2V0KTtcblxuXHRjb25zdCB0aXRsZVdpdGhIZWFkZXJJbmZvID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XCJUX0FOTk9UQVRJT05fSEVMUEVSX0RFRkFVTFRfT0JKRUNUX1BBR0VfSEVBREVSX1RJVExFXCIsXG5cdFx0b1ZpZXdEYXRhLnJlc291cmNlQnVuZGxlLFxuXHRcdHVuZGVmaW5lZCxcblx0XHRvVmlld0RhdGEuZW50aXR5U2V0XG5cdCk7XG5cblx0Y29uc3Qgb0VtcHR5SGVhZGVySW5mb1RpdGxlID1cblx0XHRvSGVhZGVySW5mbz8uVGl0bGUgPT09IHVuZGVmaW5lZCB8fCAob0hlYWRlckluZm8/LlRpdGxlIGFzIGFueSkgPT09IFwiXCIgfHwgKG9IZWFkZXJJbmZvPy5UaXRsZSBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlID09PSBcIlwiO1xuXG5cdGNvbnN0IHRpdGxlRm9yQWN0aXZlSGVhZGVyTm9IZWFkZXJJbmZvID0gIW9FbXB0eUhlYWRlckluZm9UaXRsZVxuXHRcdD8gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJUX0FOTk9UQVRJT05fSEVMUEVSX0RFRkFVTFRfT0JKRUNUX1BBR0VfSEVBREVSX1RJVExFX05PX0hFQURFUl9JTkZPXCIsIG9WaWV3RGF0YS5yZXNvdXJjZUJ1bmRsZSlcblx0XHQ6IFwiXCI7XG5cblx0bGV0IHRpdGxlVmFsdWVFeHByZXNzaW9uID0gYW5ub3RhdGlvbkV4cHJlc3Npb24oKG9IZWFkZXJJbmZvPy5UaXRsZSBhcyBEYXRhRmllbGRUeXBlcyk/LlZhbHVlKTtcblx0aWYgKChvSGVhZGVySW5mbz8uVGl0bGUgYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZT8uJHRhcmdldD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGV4dD8uYW5ub3RhdGlvbnM/LlVJPy5UZXh0QXJyYW5nZW1lbnQpIHtcblx0XHQvLyBJbiBjYXNlIGFuIGV4cGxpY2l0IHRleHQgYXJyYW5nZW1lbnQgd2FzIHNldCB3ZSBtYWtlIHVzZSBvZiBpdCBpbiB0aGUgZGVzY3JpcHRpb24gYXMgd2VsbFxuXHRcdHRpdGxlVmFsdWVFeHByZXNzaW9uID0gYWRkVGV4dEFycmFuZ2VtZW50VG9CaW5kaW5nRXhwcmVzc2lvbih0aXRsZVZhbHVlRXhwcmVzc2lvbiwgZnVsbENvbnRleHRQYXRoKTtcblx0fVxuXG5cdHRpdGxlVmFsdWVFeHByZXNzaW9uID0gZm9ybWF0VmFsdWVSZWN1cnNpdmVseSh0aXRsZVZhbHVlRXhwcmVzc2lvbiwgZnVsbENvbnRleHRQYXRoKTtcblxuXHQvLyBJZiB0aGVyZSBpcyBhIFR5cGVOYW1lIGRlZmluZWQsIHNob3cgdGhlIGRlZmF1bHQgdGl0bGUgJ05ldyArIFR5cGVOYW1lJywgb3RoZXJ3aXNlIHNob3cgdGhlIGN1c3RvbSB0aXRsZSBvciB0aGUgZGVmYXVsdCAnTmV3IG9iamVjdCdcblx0Y29uc3QgY3JlYXRlTW9kZVRpdGxlID0gb0hlYWRlckluZm8/LlR5cGVOYW1lXG5cdFx0PyBjb25jYXQodGl0bGVXaXRoSGVhZGVySW5mbywgXCI6IFwiLCBhbm5vdGF0aW9uRXhwcmVzc2lvbihvSGVhZGVySW5mby5UeXBlTmFtZS50b1N0cmluZygpKSlcblx0XHQ6IHRpdGxlTm9IZWFkZXJJbmZvO1xuXHRjb25zdCBhY3RpdmVFeHByZXNzaW9uID0gb0RyYWZ0Um9vdCA/IEVudGl0eS5Jc0FjdGl2ZSA6IHRydWU7XG5cblx0cmV0dXJuIGNvbXBpbGVCaW5kaW5nKFxuXHRcdGlmRWxzZShcblx0XHRcdC8vIElmIENyZWF0ZSBNb2RlICYmIEVtcHR5IGV4cHJlc3Npb25cblx0XHRcdGFuZChvcihVSS5Jc0NyZWF0ZU1vZGVTdGlja3ksIFVJLklzQ3JlYXRlTW9kZSksIHRpdGxlVmFsdWVFeHByZXNzaW9uICYmIGlzRW1wdHkodGl0bGVWYWx1ZUV4cHJlc3Npb24pKSxcblxuXHRcdFx0Y3JlYXRlTW9kZVRpdGxlLFxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHNob3cgdGhlIGRlZmF1bHQgZXhwcmVzc2lvblxuXHRcdFx0aWZFbHNlKFxuXHRcdFx0XHRhbmQoYWN0aXZlRXhwcmVzc2lvbiwgdGl0bGVWYWx1ZUV4cHJlc3Npb24gJiYgaXNFbXB0eSh0aXRsZVZhbHVlRXhwcmVzc2lvbikpLFxuXHRcdFx0XHR0aXRsZUZvckFjdGl2ZUhlYWRlck5vSGVhZGVySW5mbyxcblx0XHRcdFx0dGl0bGVWYWx1ZUV4cHJlc3Npb25cblx0XHRcdClcblx0XHQpXG5cdCk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIGFuIG9iamVjdCBwYWdlLlxuICpcbiAqIEBwYXJhbSBvSGVhZGVySW5mbyBUaGUgQFVJLkhlYWRlckluZm8gYW5ub3RhdGlvbiBjb250ZW50XG4gKiBAcGFyYW0gZnVsbENvbnRleHRQYXRoIFRoZSBmdWxsIGNvbnRleHQgcGF0aCB1c2VkIHRvIHJlYWNoIHRoYXQgb2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZm9yIHRoZSBvYmplY3QgcGFnZSBkZXNjcmlwdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzc2lvbkZvckRlc2NyaXB0aW9uID0gZnVuY3Rpb24gKFxuXHRvSGVhZGVySW5mbzogSGVhZGVySW5mb1R5cGUgfCB1bmRlZmluZWQsXG5cdGZ1bGxDb250ZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aFxuKTogQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGxldCBiaW5kaW5nRXhwcmVzc2lvbiA9IGFubm90YXRpb25FeHByZXNzaW9uKChvSGVhZGVySW5mbz8uRGVzY3JpcHRpb24gYXMgRGF0YUZpZWxkVHlwZXMpPy5WYWx1ZSk7XG5cdGlmICgob0hlYWRlckluZm8/LkRlc2NyaXB0aW9uIGFzIERhdGFGaWVsZFR5cGVzKT8uVmFsdWU/LiR0YXJnZXQ/LmFubm90YXRpb25zPy5Db21tb24/LlRleHQ/LmFubm90YXRpb25zPy5VST8uVGV4dEFycmFuZ2VtZW50KSB7XG5cdFx0Ly8gSW4gY2FzZSBhbiBleHBsaWNpdCB0ZXh0IGFycmFuZ2VtZW50IHdhcyBzZXQgd2UgbWFrZSB1c2Ugb2YgaXQgaW4gdGhlIGRlc2NyaXB0aW9uIGFzIHdlbGxcblx0XHRiaW5kaW5nRXhwcmVzc2lvbiA9IGFkZFRleHRBcnJhbmdlbWVudFRvQmluZGluZ0V4cHJlc3Npb24oYmluZGluZ0V4cHJlc3Npb24sIGZ1bGxDb250ZXh0UGF0aCk7XG5cdH1cblxuXHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoZm9ybWF0VmFsdWVSZWN1cnNpdmVseShiaW5kaW5nRXhwcmVzc2lvbiwgZnVsbENvbnRleHRQYXRoKSk7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlIHNhdmUgYnV0dG9uLlxuICpcbiAqIEBwYXJhbSBvVmlld0RhdGEgVGhlIGN1cnJlbnQgdmlldyBkYXRhXG4gKiBAcGFyYW0gZnVsbENvbnRleHRQYXRoIFRoZSBwYXRoIHVzZWQgdXAgdW50aWwgaGVyZVxuICogQHJldHVybnMgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbiB0aGF0IHNob3dzIHRoZSByaWdodCBzYXZlIGJ1dHRvbiB0ZXh0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yU2F2ZUJ1dHRvbiA9IGZ1bmN0aW9uIChvVmlld0RhdGE6IFZpZXdEYXRhLCBmdWxsQ29udGV4dFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGgpOiBCaW5kaW5nRXhwcmVzc2lvbjxzdHJpbmc+IHtcblx0Y29uc3Qgc2F2ZUJ1dHRvblRleHQgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcIlRfT1BfT0JKRUNUX1BBR0VfU0FWRVwiLCBvVmlld0RhdGEucmVzb3VyY2VCdW5kbGUpO1xuXHRjb25zdCBjcmVhdGVCdXR0b25UZXh0ID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXCJUX09QX09CSkVDVF9QQUdFX0NSRUFURVwiLCBvVmlld0RhdGEucmVzb3VyY2VCdW5kbGUpO1xuXHRsZXQgc2F2ZUV4cHJlc3Npb247XG5cblx0aWYgKGZ1bGxDb250ZXh0UGF0aC5zdGFydGluZ0VudGl0eVNldC5hbm5vdGF0aW9ucy5TZXNzaW9uPy5TdGlja3lTZXNzaW9uU3VwcG9ydGVkKSB7XG5cdFx0Ly8gSWYgd2UncmUgaW4gc3RpY2t5IG1vZGUgQU5EIHRoZSB1aSBpcyBpbiBjcmVhdGUgbW9kZSwgc2hvdyBDcmVhdGUsIGVsc2Ugc2hvdyBTYXZlXG5cdFx0c2F2ZUV4cHJlc3Npb24gPSBpZkVsc2UoVUkuSXNDcmVhdGVNb2RlU3RpY2t5LCBjcmVhdGVCdXR0b25UZXh0LCBzYXZlQnV0dG9uVGV4dCk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gSWYgd2UncmUgaW4gZHJhZnQgQU5EIHRoZSBkcmFmdCBpcyBhIG5ldyBvYmplY3QgKCFJc0FjdGl2ZUVudGl0eSAmJiAhSGFzQWN0aXZlRW50aXR5KSwgc2hvdyBjcmVhdGUsIGVsc2Ugc2hvdyBzYXZlXG5cdFx0c2F2ZUV4cHJlc3Npb24gPSBpZkVsc2UoRHJhZnQuSXNOZXdPYmplY3QsIGNyZWF0ZUJ1dHRvblRleHQsIHNhdmVCdXR0b25UZXh0KTtcblx0fVxuXHRyZXR1cm4gY29tcGlsZUJpbmRpbmcoc2F2ZUV4cHJlc3Npb24pO1xufTtcblxuLyoqXG4gKiBNZXRob2QgcmV0dXJucyB3aGV0aGVyIGZvb3RlciBpcyB2aXNpYmxlIG9yIG5vdCBvbiBvYmplY3QgLyBzdWJvYmplY3QgcGFnZS5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBuYW1lIGdldEZvb3RlclZpc2libGVcbiAqIEBwYXJhbSB7Q29udmVydGVyQWN0aW9uW119IGZvb3RlckFjdGlvbnMgVGhlIGZvb3RlciBhY3Rpb24gb2JqZWN0IGNvbWluZyBmcm9tIHRoZSBjb252ZXJ0ZXJcbiAqIEBwYXJhbSB7RGF0YUZpZWxkW119IGRhdGFGaWVsZHMgRGF0YSBmaWVsZCBhcnJheSBmb3Igbm9ybWFsIGZvb3RlciB2aXNpYmlsaXR5IHByb2Nlc3NpbmdcbiAqIEByZXR1cm5zIHtib29sZWFuIHwgQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPn0gYHRydWVgIGlmIGFueSBhY3Rpb24gaXMgdHJ1ZSwgb3RoZXJ3aXNlIGNvbXBpbGVkIEJpbmRpbmcgb3IgYGZhbHNlYFxuICovXG5leHBvcnQgY29uc3QgZ2V0Rm9vdGVyVmlzaWJsZSA9IGZ1bmN0aW9uIChmb290ZXJBY3Rpb25zOiBDb252ZXJ0ZXJBY3Rpb25bXSwgZGF0YUZpZWxkczogRGF0YUZpZWxkW10pOiBib29sZWFuIHwgQmluZGluZ0V4cHJlc3Npb248c3RyaW5nPiB7XG5cdGNvbnN0IG1hbmlmZXN0QWN0aW9ucyA9IGZvb3RlckFjdGlvbnMuZmlsdGVyKChhY3Rpb24pID0+IGlzTWFuaWZlc3RBY3Rpb24oYWN0aW9uKSkgYXMgTWFuaWZlc3RBY3Rpb25bXTtcblx0bGV0IGN1c3RvbUFjdGlvblZpc2liaWxpdHk6IEV4cHJlc3Npb248Ym9vbGVhbj47XG5cdGlmIChtYW5pZmVzdEFjdGlvbnMubGVuZ3RoKSB7XG5cdFx0Ly8gSWYgd2UgaGF2ZSBtYW5pZmVzdCBhY3Rpb25zXG5cdFx0Y29uc3QgY3VzdG9tQWN0aW9uSW5kaXZpZHVhbFZpc2liaWxpdHkgPSBtYW5pZmVzdEFjdGlvbnMubWFwKChhY3Rpb24pID0+IHtcblx0XHRcdHJldHVybiByZXNvbHZlQmluZGluZ1N0cmluZzxib29sZWFuPihhY3Rpb24udmlzaWJsZSBhcyBzdHJpbmcgfCBib29sZWFuLCBcImJvb2xlYW5cIik7XG5cdFx0fSk7XG5cdFx0Ly8gY29uc3RydWN0IHRoZSBmb290ZXIncyB2aXNpYmlsaXR5LWJpbmRpbmcgb3V0IG9mIGFsbCBhY3Rpb25zJyB2aXNpYmlsaXR5LWJpbmRpbmdzLCBmaXJzdCB0aGUgYmluZGluZyBvZiBhbGwgY3VzdG9tIGFjdGlvbnMgLi4uXG5cdFx0Y3VzdG9tQWN0aW9uVmlzaWJpbGl0eSA9IG9yKC4uLmN1c3RvbUFjdGlvbkluZGl2aWR1YWxWaXNpYmlsaXR5KTtcblx0XHQvLyBhbmQgdGhlbiB0aGUgYmluZGluZyBvZiBhbGwgYW5ub3RhdGlvbiBhY3Rpb25zIGluc2lkZSB0aGUgZm9vdGVyIC4uLlxuXHRcdGNvbnN0IGFubm90YXRpb25BY3Rpb25WaXNpYmlsaXR5ID0gZ2V0RGF0YUZpZWxkQmFzZWRGb290ZXJWaXNpYmlsaXR5KGRhdGFGaWVsZHMsIHRydWUpO1xuXHRcdC8vIGZpbmFsbHksIHJldHVybiBldmVyeXRoaW5nLlxuXHRcdHJldHVybiBjb21waWxlQmluZGluZyhvcihjdXN0b21BY3Rpb25WaXNpYmlsaXR5LCByZXNvbHZlQmluZGluZ1N0cmluZzxib29sZWFuPihhbm5vdGF0aW9uQWN0aW9uVmlzaWJpbGl0eSwgXCJib29sZWFuXCIpKSk7XG5cdH1cblx0cmV0dXJuIGdldERhdGFGaWVsZEJhc2VkRm9vdGVyVmlzaWJpbGl0eShkYXRhRmllbGRzLCB0cnVlKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBmb290ZXIgaXMgdmlzaWJsZSBvciBub3QuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZVRlbXBsYXRpbmcuZ2V0RGF0YUZpZWxkQmFzZWRGb290ZXJWaXNpYmlsaXR5XG4gKiBAbWVtYmVyb2Ygc2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLk9iamVjdFBhZ2VUZW1wbGF0aW5nXG4gKiBAcGFyYW0ge0FycmF5fSBhRGF0YUZpZWxkcyBBcnJheSBvZiBEYXRhRmllbGRzIGluIHRoZSBpZGVudGlmaWNhdGlvblxuICogQHBhcmFtIHtib29sZWFufSBiQ29uc2lkZXJFZGl0YWJsZSBXaGV0aGVyIHRoZSBlZGl0IG1vZGUgYmluZGluZyBpcyByZXF1aXJlZCBvciBub3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEFuIGV4cHJlc3Npb24gaWYgYWxsIHRoZSBhY3Rpb25zIGFyZSB1aS5oaWRkZW4sIHRydWUgb3RoZXJ3aXNlXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKiovXG5leHBvcnQgY29uc3QgZ2V0RGF0YUZpZWxkQmFzZWRGb290ZXJWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKGFEYXRhRmllbGRzOiBhbnlbXSwgYkNvbnNpZGVyRWRpdGFibGU6IGJvb2xlYW4pIHtcblx0bGV0IHNIaWRkZW5FeHByZXNzaW9uID0gXCJcIjtcblx0bGV0IHNTZW1pSGlkZGVuRXhwcmVzc2lvbjtcblx0Y29uc3QgYUhpZGRlbkFjdGlvblBhdGggPSBbXTtcblxuXHRmb3IgKGNvbnN0IGkgaW4gYURhdGFGaWVsZHMpIHtcblx0XHRjb25zdCBvRGF0YUZpZWxkID0gYURhdGFGaWVsZHNbaV07XG5cdFx0aWYgKG9EYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbiAmJiBvRGF0YUZpZWxkLkRldGVybWluaW5nID09PSB0cnVlKSB7XG5cdFx0XHRjb25zdCBoaWRkZW5FeHByZXNzaW9uID0gb0RhdGFGaWVsZFtgQCR7VUlBbm5vdGF0aW9uVGVybXMuSGlkZGVufWBdO1xuXHRcdFx0aWYgKCFoaWRkZW5FeHByZXNzaW9uKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSBlbHNlIGlmIChoaWRkZW5FeHByZXNzaW9uLiRQYXRoKSB7XG5cdFx0XHRcdGlmIChhSGlkZGVuQWN0aW9uUGF0aC5pbmRleE9mKGhpZGRlbkV4cHJlc3Npb24uJFBhdGgpID09PSAtMSkge1xuXHRcdFx0XHRcdGFIaWRkZW5BY3Rpb25QYXRoLnB1c2goaGlkZGVuRXhwcmVzc2lvbi4kUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoYUhpZGRlbkFjdGlvblBhdGgubGVuZ3RoKSB7XG5cdFx0Zm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFIaWRkZW5BY3Rpb25QYXRoLmxlbmd0aDsgaW5kZXgrKykge1xuXHRcdFx0aWYgKGFIaWRkZW5BY3Rpb25QYXRoW2luZGV4XSkge1xuXHRcdFx0XHRzU2VtaUhpZGRlbkV4cHJlc3Npb24gPSBcIigle1wiICsgYUhpZGRlbkFjdGlvblBhdGhbaW5kZXhdICsgXCJ9ID09PSB0cnVlID8gZmFsc2UgOiB0cnVlIClcIjtcblx0XHRcdH1cblx0XHRcdGlmIChpbmRleCA9PSBhSGlkZGVuQWN0aW9uUGF0aC5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdHNIaWRkZW5FeHByZXNzaW9uID0gc0hpZGRlbkV4cHJlc3Npb24gKyBzU2VtaUhpZGRlbkV4cHJlc3Npb247XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzSGlkZGVuRXhwcmVzc2lvbiA9IHNIaWRkZW5FeHByZXNzaW9uICsgc1NlbWlIaWRkZW5FeHByZXNzaW9uICsgXCJ8fFwiO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gKFxuXHRcdFx0XCJ7PSBcIiArXG5cdFx0XHQoYkNvbnNpZGVyRWRpdGFibGUgPyBcIihcIiA6IFwiXCIpICtcblx0XHRcdHNIaWRkZW5FeHByZXNzaW9uICtcblx0XHRcdChiQ29uc2lkZXJFZGl0YWJsZSA/IFwiIHx8ICR7dWk+L2lzRWRpdGFibGV9KSBcIiA6IFwiIFwiKSArXG5cdFx0XHRcIiYmICR7aW50ZXJuYWw+aXNDcmVhdGVEaWFsb2dPcGVufSAhPT0gdHJ1ZX1cIlxuXHRcdCk7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFwiez0gXCIgKyAoYkNvbnNpZGVyRWRpdGFibGUgPyBcIiR7dWk+L2lzRWRpdGFibGV9ICYmIFwiIDogXCJcIikgKyBcIiR7aW50ZXJuYWw+aXNDcmVhdGVEaWFsb2dPcGVufSAhPT0gdHJ1ZX1cIjtcblx0fVxufTtcblxuLyoqXG4gKiBNZXRob2QgcmV0dXJucyBXaGV0aGVyIHRoZSBhY3Rpb24gdHlwZSBpcyBtYW5pZmVzdCBvciBub3QuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAbmFtZSBpc01hbmlmZXN0QWN0aW9uVmlzaWJsZVxuICogQHBhcmFtIHtvYmplY3R9IG9BY3Rpb24gVGhlIGFjdGlvbiBvYmplY3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgYWN0aW9uIGlzIGNvbWluZyBmcm9tIG1hbmlmZXN0LCBgZmFsc2VgIG90aGVyd2lzZVxuICovXG5leHBvcnQgY29uc3QgaXNNYW5pZmVzdEFjdGlvbiA9IGZ1bmN0aW9uIChvQWN0aW9uOiBhbnkpIHtcblx0Y29uc3QgYUFjdGlvbnMgPSBbXG5cdFx0XCJQcmltYXJ5XCIsXG5cdFx0XCJEZWZhdWx0QXBwbHlcIixcblx0XHRcIlNlY29uZGFyeVwiLFxuXHRcdFwiRm9yQWN0aW9uXCIsXG5cdFx0XCJGb3JOYXZpZ2F0aW9uXCIsXG5cdFx0XCJTd2l0Y2hUb0FjdGl2ZU9iamVjdFwiLFxuXHRcdFwiU3dpdGNoVG9EcmFmdE9iamVjdFwiLFxuXHRcdFwiRHJhZnRBY3Rpb25zXCJcblx0XTtcblx0cmV0dXJuIGFBY3Rpb25zLmluZGV4T2Yob0FjdGlvbi50eXBlKSA8IDA7XG59O1xuXG4vKipcbiAqIFJldHVybnMgYW4gZXhwcmVzc2lvbiB0byBkZXRlcm1pbmUgRW1waGFzaXplZCAgYnV0dG9uIHR5cGUgYmFzZWQgb24gQ3JpdGljYWxpdHkgYWNyb3NzIGFsbCBhY3Rpb25zXG4gKiBJZiBjcml0aWNhbCBhY3Rpb24gaXMgcmVuZGVyZWQsIGl0cyBjb25zaWRlcmVkIHRvIGJlIHRoZSBwcmltYXJ5IGFjdGlvbi4gSGVuY2UgdGVtcGxhdGUncyBkZWZhdWx0IHByaW1hcnkgYWN0aW9uIGlzIHNldCBiYWNrIHRvIERlZmF1bHQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAbmFtZSBzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZVRlbXBsYXRpbmcuYnVpbGRFbXBoYXNpemVkQnV0dG9uRXhwcmVzc2lvblxuICogQG1lbWJlcm9mIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlVGVtcGxhdGluZ1xuICogQHBhcmFtIHtBcnJheX0gYUlkZW50aWZpY2F0aW9uIEFycmF5IG9mIGFsbCB0aGUgRGF0YUZpZWxkcyBpbiBJZGVudGlmaWNhdGlvblxuICogQHJldHVybnMge3N0cmluZ30gQW4gZXhwcmVzc2lvbiB0byBkZWR1Y2UgaWYgYnV0dG9uIHR5cGUgaXMgRGVmYXVsdCBvciBFbXBoYXNpemVkXG4gKiBAcHJpdmF0ZVxuICogQHVpNS1yZXN0cmljdGVkXG4gKiovXG5leHBvcnQgY29uc3QgYnVpbGRFbXBoYXNpemVkQnV0dG9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChhSWRlbnRpZmljYXRpb24/OiBhbnlbXSkge1xuXHRpZiAoIWFJZGVudGlmaWNhdGlvbikge1xuXHRcdHJldHVybiBCdXR0b25UeXBlLkVtcGhhc2l6ZWQ7XG5cdH1cblx0bGV0IHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXHRsZXQgYklzQWx3YXlzRGVmYXVsdDogYm9vbGVhbixcblx0XHRzSGlkZGVuU2ltcGxlUGF0aCxcblx0XHRzSGlkZGVuRXhwcmVzc2lvbiA9IFwiXCI7XG5cdGFJZGVudGlmaWNhdGlvbi5mb3JFYWNoKGZ1bmN0aW9uIChvRGF0YUZpZWxkOiBhbnkpIHtcblx0XHRjb25zdCBvQ3JpdGljYWxpdHlQcm9wZXJ0eSA9IG9EYXRhRmllbGQuQ3JpdGljYWxpdHk7XG5cdFx0Y29uc3Qgb0RhdGFGaWVsZEhpZGRlbiA9IG9EYXRhRmllbGRbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuSGlkZGVuXCJdO1xuXHRcdGlmIChvRGF0YUZpZWxkLiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkRhdGFGaWVsZEZvckFjdGlvblwiICYmICFiSXNBbHdheXNEZWZhdWx0ICYmIG9Dcml0aWNhbGl0eVByb3BlcnR5KSB7XG5cdFx0XHRpZiAoIXNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiAmJiBvRGF0YUZpZWxkSGlkZGVuID09PSB0cnVlKSB7XG5cdFx0XHRcdC8vIGlmIERhdGFGaWVsZCBpcyBzZXQgdG8gaGlkZGVuLCB3ZSBjYW4gc2tpcCBvdGhlciBjaGVja3MgYW5kIHJldHVybiBEZWZhdWx0IGJ1dHRvbiB0eXBlXG5cdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IEJ1dHRvblR5cGUuRW1waGFzaXplZDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9EYXRhRmllbGRIaWRkZW4gJiYgb0RhdGFGaWVsZEhpZGRlbi4kUGF0aCkge1xuXHRcdFx0XHQvLyB3aGVuIHZpc2liaWxpdHkgb2YgY3JpdGljYWwgYnV0dG9uIGlzIGJhc2VkIG9uIHBhdGgsIGNvbGxlY3QgYWxsIHBhdGhzIGZvciBleHByZXNzaW9uXG5cdFx0XHRcdHNIaWRkZW5TaW1wbGVQYXRoID0gb0RhdGFGaWVsZEhpZGRlbi4kUGF0aDtcblx0XHRcdFx0aWYgKHNIaWRkZW5FeHByZXNzaW9uKSB7XG5cdFx0XHRcdFx0c0hpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiArIFwiICYmIFwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNIaWRkZW5FeHByZXNzaW9uID0gc0hpZGRlbkV4cHJlc3Npb24gKyBcIiV7XCIgKyBzSGlkZGVuU2ltcGxlUGF0aCArIFwifSA9PT0gdHJ1ZVwiO1xuXHRcdFx0XHRzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gPSBcIns9IChcIiArIHNIaWRkZW5FeHByZXNzaW9uICsgXCIpID8gJ0VtcGhhc2l6ZWQnIDogJ0RlZmF1bHQnIH1cIjtcblx0XHRcdH1cblx0XHRcdHN3aXRjaCAob0NyaXRpY2FsaXR5UHJvcGVydHkuJEVudW1NZW1iZXIpIHtcblx0XHRcdFx0Ly8gc3VwcG9ydGVkIGNyaXRpY2FsaXR5IGFyZSBbUG9zaXRpdmUvMy8nMyddIGFuZCBbTmVnYXRpdmUvMS8nMSddXG5cdFx0XHRcdGNhc2UgXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5Dcml0aWNhbGl0eVR5cGUvTmVnYXRpdmVcIjpcblx0XHRcdFx0Y2FzZSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9Qb3NpdGl2ZVwiOlxuXHRcdFx0XHRjYXNlIFwiMVwiOlxuXHRcdFx0XHRjYXNlIDE6XG5cdFx0XHRcdGNhc2UgXCIzXCI6XG5cdFx0XHRcdGNhc2UgMzpcblx0XHRcdFx0XHRpZiAoIW9EYXRhRmllbGRIaWRkZW4pIHtcblx0XHRcdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IEJ1dHRvblR5cGUuRGVmYXVsdDtcblx0XHRcdFx0XHRcdGJJc0Fsd2F5c0RlZmF1bHQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gPSBzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gfHwgQnV0dG9uVHlwZS5EZWZhdWx0O1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHNGb3JtYXRFbXBoYXNpemVkRXhwcmVzc2lvbiA9IEJ1dHRvblR5cGUuRW1waGFzaXplZDtcblx0XHRcdH1cblx0XHRcdGlmIChvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCkge1xuXHRcdFx0XHQvLyB3aGVuIENyaXRpY2FsaXR5IGlzIHNldCB1c2luZyBhIHBhdGgsIHVzZSB0aGUgcGF0aCBmb3IgZGVkdWNpbmcgdGhlIEVtcGhzaXplZCB0eXBlIGZvciBkZWZhdWx0IFByaW1hcnkgQWN0aW9uXG5cdFx0XHRcdGNvbnN0IHNDb21iaW5lZEhpZGRlbkV4cHJlc3Npb24gPSBzSGlkZGVuRXhwcmVzc2lvbiA/IFwiIShcIiArIHNIaWRkZW5FeHByZXNzaW9uICsgXCIpICYmIFwiIDogXCJcIjtcblx0XHRcdFx0c0Zvcm1hdEVtcGhhc2l6ZWRFeHByZXNzaW9uID1cblx0XHRcdFx0XHRcIns9IFwiICtcblx0XHRcdFx0XHRzQ29tYmluZWRIaWRkZW5FeHByZXNzaW9uICtcblx0XHRcdFx0XHRcIigoJHtcIiArXG5cdFx0XHRcdFx0b0NyaXRpY2FsaXR5UHJvcGVydHkuJFBhdGggK1xuXHRcdFx0XHRcdFwifSA9PT0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9OZWdhdGl2ZScpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAnMScpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAxKSBcIiArXG5cdFx0XHRcdFx0XCJ8fCAoJHtcIiArXG5cdFx0XHRcdFx0b0NyaXRpY2FsaXR5UHJvcGVydHkuJFBhdGggK1xuXHRcdFx0XHRcdFwifSA9PT0gJ2NvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNyaXRpY2FsaXR5VHlwZS9Qb3NpdGl2ZScpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAnMycpIHx8ICgke1wiICtcblx0XHRcdFx0XHRvQ3JpdGljYWxpdHlQcm9wZXJ0eS4kUGF0aCArXG5cdFx0XHRcdFx0XCJ9ID09PSAzKSkgPyBcIiArXG5cdFx0XHRcdFx0XCInRGVmYXVsdCdcIiArXG5cdFx0XHRcdFx0XCIgOiBcIiArXG5cdFx0XHRcdFx0XCInRW1waGFzaXplZCdcIiArXG5cdFx0XHRcdFx0XCIgfVwiO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdHJldHVybiBzRm9ybWF0RW1waGFzaXplZEV4cHJlc3Npb24gfHwgQnV0dG9uVHlwZS5FbXBoYXNpemVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRCaW5kaW5nID0gZnVuY3Rpb24gKHNQYXRoOiBhbnkpIHtcblx0Y29uc3Qgc05hdmlnYXRpb25QYXRoID0gT0RhdGFNb2RlbEFubm90YXRpb25IZWxwZXIuZ2V0TmF2aWdhdGlvblBhdGgoc1BhdGgpO1xuXHRpZiAoc05hdmlnYXRpb25QYXRoKSB7XG5cdFx0cmV0dXJuIFwie3BhdGg6J1wiICsgc05hdmlnYXRpb25QYXRoICsgXCInfVwiO1xuXHR9IGVsc2Uge1xuXHRcdC8vbm8gbmF2aWdhdGlvbiBwcm9wZXJ0eSBuZWVkcyBlbXB0eSBvYmplY3Rcblx0XHRyZXR1cm4gXCJ7cGF0aDogJyd9XCI7XG5cdH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gY2hlY2sgaWYgZHJhZnQgcGF0dGVybiBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9Bbm5vdGF0aW9ucyBBbm5vdGF0aW9ucyBvZiB0aGUgY3VycmVudCBlbnRpdHkgc2V0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiBkcmFmdCBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgY2hlY2tEcmFmdFN0YXRlID0gZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KSB7XG5cdGlmIChcblx0XHRvQW5ub3RhdGlvbnNbXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLkRyYWZ0Um9vdFwiXSAmJlxuXHRcdG9Bbm5vdGF0aW9uc1tcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290XCJdW1wiRWRpdEFjdGlvblwiXVxuXHQpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZ2V0IHRoZSB2aXNpYmlsaXR5IGZvciB0aGUgU3dpdGNoVG9BY3RpdmUgYnV0dG9uIGluIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb0Fubm90YXRpb25zIEFubm90YXRpb25zIG9mIHRoZSBjdXJyZW50IGVudGl0eSBzZXQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGJhc2VkIG9uIHRoZSBkcmFmdCBzdGF0ZVxuICovXG5leHBvcnQgY29uc3QgZ2V0U3dpdGNoVG9BY3RpdmVWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0aWYgKGNoZWNrRHJhZnRTdGF0ZShvQW5ub3RhdGlvbnMpKSB7XG5cdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICR7dWk+L2lzRWRpdGFibGV9ICYmICEke3VpPmNyZWF0ZU1vZGV9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIHZpc2liaWxpdHkgZm9yIHRoZSBTd2l0Y2hUb0RyYWZ0IGJ1dHRvbiBpbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9Bbm5vdGF0aW9ucyBBbm5vdGF0aW9ucyBvZiB0aGUgY3VycmVudCBlbnRpdHkgc2V0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBiYXNlZCBvbiB0aGUgZHJhZnQgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFN3aXRjaFRvRHJhZnRWaXNpYmlsaXR5ID0gZnVuY3Rpb24gKG9Bbm5vdGF0aW9uczogYW55KTogYW55IHtcblx0aWYgKGNoZWNrRHJhZnRTdGF0ZShvQW5ub3RhdGlvbnMpKSB7XG5cdFx0cmV0dXJuIFwiez0gKCV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSkgPyAoICEoJHt1aT4vaXNFZGl0YWJsZX0pICYmICEke3VpPmNyZWF0ZU1vZGV9ICYmICR7SGFzRHJhZnRFbnRpdHl9ICYmICV7RHJhZnRBZG1pbmlzdHJhdGl2ZURhdGEvRHJhZnRJc0NyZWF0ZWRCeU1lfSApIDogZmFsc2UgfVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIHZpc2liaWxpdHkgZm9yIHRoZSBTd2l0Y2hEcmFmdEFuZEFjdGl2ZSBidXR0b24gaW4gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvQW5ub3RhdGlvbnMgQW5ub3RhdGlvbnMgb2YgdGhlIGN1cnJlbnQgZW50aXR5IHNldC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgYmFzZWQgb24gdGhlIGRyYWZ0IHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTd2l0Y2hEcmFmdEFuZEFjdGl2ZVZpc2liaWxpdHkgPSBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnkpOiBhbnkge1xuXHRpZiAoY2hlY2tEcmFmdFN0YXRlKG9Bbm5vdGF0aW9ucykpIHtcblx0XHRyZXR1cm4gXCJ7PSAoJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9KSA/ICggISR7dWk+Y3JlYXRlTW9kZX0gJiYgJXtEcmFmdEFkbWluaXN0cmF0aXZlRGF0YS9EcmFmdElzQ3JlYXRlZEJ5TWV9ICkgOiBmYWxzZSB9XCI7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGZpbmQgYW4gYWN0aW9uIGZyb20gdGhlIGFycmF5IG9mIGhlYWRlciBhY3Rpb25zIGluIHRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdFtdfSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgJ2hlYWRlcicgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gc0FjdGlvblR5cGUgVGhlIGFjdGlvbiB0eXBlXG4gKiBAcmV0dXJucyB7b2JqZWN0IHwgdW5kZWZpbmVkfSBUaGUgYWN0aW9uIHdpdGggdGhlIG1hdGNoaW5nIGFjdGlvbiB0eXBlXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgX2ZpbmRBY3Rpb24gPSBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSwgc0FjdGlvblR5cGU6IHN0cmluZykge1xuXHRsZXQgb0FjdGlvbjtcblx0aWYgKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyAmJiBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMubGVuZ3RoKSB7XG5cdFx0b0FjdGlvbiA9IGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucy5maW5kKGZ1bmN0aW9uIChvSGVhZGVyQWN0aW9uOiBhbnkpIHtcblx0XHRcdHJldHVybiBvSGVhZGVyQWN0aW9uLnR5cGUgPT09IHNBY3Rpb25UeXBlO1xuXHRcdH0pO1xuXHR9XG5cdHJldHVybiBvQWN0aW9uO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgdGhlIERlbGV0ZSBidXR0b24gb24gdGhlIG9iamVjdCBwYWdlIG9yIHN1Ym9iamVjdCBwYWdlIGluIGNhc2Ugb2YgYSBDb21tYW5kIEV4ZWN1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMgQXJyYXkgb2YgaGVhZGVyIGFjdGlvbnMgb24gdGhlIG9iamVjdCBwYWdlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbnZlcnRlciBvdXRwdXRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldERlbGV0ZUNvbW1hbmRFeGVjdXRpb25FbmFibGVkID0gZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogYW55W10pIHtcblx0Y29uc3Qgb0RlbGV0ZUFjdGlvbiA9IF9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJTZWNvbmRhcnlcIik7XG5cdHJldHVybiBvRGVsZXRlQWN0aW9uID8gb0RlbGV0ZUFjdGlvbi5lbmFibGVkIDogXCJ0cnVlXCI7XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGZvcm1hdCB0aGUgJ3Zpc2libGUnIHByb3BlcnR5IGZvciB0aGUgRGVsZXRlIGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RGVsZXRlQ29tbWFuZEV4ZWN1dGlvblZpc2libGUgPSBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRjb25zdCBvRGVsZXRlQWN0aW9uID0gX2ZpbmRBY3Rpb24oYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zLCBcIlNlY29uZGFyeVwiKTtcblx0cmV0dXJuIG9EZWxldGVBY3Rpb24gPyBvRGVsZXRlQWN0aW9uLnZpc2libGUgOiBcInRydWVcIjtcbn07XG5cbi8qKlxuICogRnVuY3Rpb24gdG8gZm9ybWF0IHRoZSAndmlzaWJsZScgcHJvcGVydHkgZm9yIHRoZSBFZGl0IGJ1dHRvbiBvbiB0aGUgb2JqZWN0IHBhZ2Ugb3Igc3Vib2JqZWN0IHBhZ2UgaW4gY2FzZSBvZiBhIENvbW1hbmQgRXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucyBBcnJheSBvZiBoZWFkZXIgYWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBhZ2VcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgZXhwcmVzc2lvbiBiaW5kaW5nIG9yIEJvb2xlYW4gdmFsdWUgZnJvbSB0aGUgY29udmVydGVyIG91dHB1dFxuICovXG5leHBvcnQgY29uc3QgZ2V0RWRpdENvbW1hbmRFeGVjdXRpb25WaXNpYmxlID0gZnVuY3Rpb24gKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9uczogYW55W10pIHtcblx0Y29uc3Qgb0VkaXRBY3Rpb24gPSBfZmluZEFjdGlvbihhQ29udmVydGVyQ29udGV4dEhlYWRlckFjdGlvbnMsIFwiUHJpbWFyeVwiKTtcblx0cmV0dXJuIG9FZGl0QWN0aW9uID8gb0VkaXRBY3Rpb24udmlzaWJsZSA6IFwidHJ1ZVwiO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiB0byBmb3JtYXQgdGhlICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgdGhlIEVkaXQgYnV0dG9uIG9uIHRoZSBvYmplY3QgcGFnZSBvciBzdWJvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGEgQ29tbWFuZCBFeGVjdXRpb24uXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zIEFycmF5IG9mIGhlYWRlciBhY3Rpb25zIG9uIHRoZSBvYmplY3QgcGFnZVxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBleHByZXNzaW9uIGJpbmRpbmcgb3IgQm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSBjb252ZXJ0ZXIgb3V0cHV0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFZGl0Q29tbWFuZEV4ZWN1dGlvbkVuYWJsZWQgPSBmdW5jdGlvbiAoYUNvbnZlcnRlckNvbnRleHRIZWFkZXJBY3Rpb25zOiBhbnlbXSkge1xuXHRjb25zdCBvRWRpdEFjdGlvbiA9IF9maW5kQWN0aW9uKGFDb252ZXJ0ZXJDb250ZXh0SGVhZGVyQWN0aW9ucywgXCJQcmltYXJ5XCIpO1xuXHRyZXR1cm4gb0VkaXRBY3Rpb24gPyBvRWRpdEFjdGlvbi5lbmFibGVkIDogXCJ0cnVlXCI7XG59O1xuXG4vKipcbiAqIEZ1bmN0aW9uIHRvIGdldCB0aGUgRWRpdEFjdGlvbiBmcm9tIHRoZSBFbnRpdHlzZXQgYmFzZWQgb24gRHJhZnQgb3Igc3RpY2t5IGJhc2VkIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0VudGl0eVNldF0gVGhlIHZhbHVlIGZyb20gdGhlIGV4cHJlc3Npb24uXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIGV4cHJlc3Npb24gYmluZGluZyBvciBib29sZWFuIHZhbHVlIGJhc2VkIG9uIHZSYXdWYWx1ZSAmIG9EcmFmdE5vZGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEVkaXRBY3Rpb24gPSBmdW5jdGlvbiAob0VudGl0eVNldDogQ29udGV4dCkge1xuXHRjb25zdCBzUGF0aCA9IG9FbnRpdHlTZXQuZ2V0UGF0aCgpLFxuXHRcdG9Bbm5vdGF0aW9ucyA9IG9FbnRpdHlTZXQuZ2V0T2JqZWN0KHNQYXRoICsgXCJAXCIpO1xuXHRjb25zdCBiRHJhZnRSb290ID0gb0Fubm90YXRpb25zLmhhc093blByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5EcmFmdFJvb3RcIik7XG5cdGNvbnN0IGJTdGlja3lTZXNzaW9uID0gb0Fubm90YXRpb25zLmhhc093blByb3BlcnR5KFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLlNlc3Npb24udjEuU3RpY2t5U2Vzc2lvblN1cHBvcnRlZFwiKTtcblx0bGV0IHNBY3Rpb25OYW1lO1xuXHRpZiAoYkRyYWZ0Um9vdCkge1xuXHRcdHNBY3Rpb25OYW1lID0gb0VudGl0eVNldC5nZXRPYmplY3Qoc1BhdGggKyBcIkBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRHJhZnRSb290L0VkaXRBY3Rpb25cIik7XG5cdH0gZWxzZSBpZiAoYlN0aWNreVNlc3Npb24pIHtcblx0XHRzQWN0aW9uTmFtZSA9IG9FbnRpdHlTZXQuZ2V0T2JqZWN0KHNQYXRoICsgXCJAY29tLnNhcC52b2NhYnVsYXJpZXMuU2Vzc2lvbi52MS5TdGlja3lTZXNzaW9uU3VwcG9ydGVkL0VkaXRBY3Rpb25cIik7XG5cdH1cblx0cmV0dXJuICFzQWN0aW9uTmFtZSA/IHNBY3Rpb25OYW1lIDogc1BhdGggKyBcIi9cIiArIHNBY3Rpb25OYW1lO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUmVhZE9ubHlGcm9tU3RhdGljQW5ub3RhdGlvbnMgPSBmdW5jdGlvbiAob0Fubm90YXRpb25zOiBhbnksIG9GaWVsZENvbnRyb2w6IGFueSkge1xuXHRsZXQgYkNvbXB1dGVkLCBiSW1tdXRhYmxlLCBiUmVhZE9ubHk7XG5cdGlmIChvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl0pIHtcblx0XHRiQ29tcHV0ZWQgPSBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuQ29tcHV0ZWRcIl0uQm9vbCA/IG9Bbm5vdGF0aW9uc1tcIkBPcmcuT0RhdGEuQ29yZS5WMS5Db21wdXRlZFwiXS5Cb29sID09IFwidHJ1ZVwiIDogdHJ1ZTtcblx0fVxuXHRpZiAob0Fubm90YXRpb25zW1wiQE9yZy5PRGF0YS5Db3JlLlYxLkltbXV0YWJsZVwiXSkge1xuXHRcdGJJbW11dGFibGUgPSBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlXCJdLkJvb2wgPyBvQW5ub3RhdGlvbnNbXCJAT3JnLk9EYXRhLkNvcmUuVjEuSW1tdXRhYmxlXCJdLkJvb2wgPT0gXCJ0cnVlXCIgOiB0cnVlO1xuXHR9XG5cdGJSZWFkT25seSA9IGJDb21wdXRlZCB8fCBiSW1tdXRhYmxlO1xuXG5cdGlmIChvRmllbGRDb250cm9sKSB7XG5cdFx0YlJlYWRPbmx5ID0gYlJlYWRPbmx5IHx8IG9GaWVsZENvbnRyb2wgPT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuRmllbGRDb250cm9sVHlwZS9SZWFkT25seVwiO1xuXHR9XG5cdGlmIChiUmVhZE9ubHkpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn07XG5cbmV4cG9ydCBjb25zdCByZWFkT25seUV4cHJlc3Npb25Gcm9tRHluYW1pY0Fubm90YXRpb25zID0gZnVuY3Rpb24gKG9GaWVsZENvbnRyb2w6IGFueSkge1xuXHRsZXQgc0lzRmllbGRDb250cm9sUGF0aFJlYWRPbmx5O1xuXHRpZiAob0ZpZWxkQ29udHJvbCkge1xuXHRcdGlmICgoTWFuYWdlZE9iamVjdCBhcyBhbnkpLmJpbmRpbmdQYXJzZXIob0ZpZWxkQ29udHJvbCkpIHtcblx0XHRcdHNJc0ZpZWxkQ29udHJvbFBhdGhSZWFkT25seSA9IFwiJVwiICsgb0ZpZWxkQ29udHJvbCArIFwiID09PSAxIFwiO1xuXHRcdH1cblx0fVxuXHRpZiAoc0lzRmllbGRDb250cm9sUGF0aFJlYWRPbmx5KSB7XG5cdFx0cmV0dXJuIFwiez0gXCIgKyBzSXNGaWVsZENvbnRyb2xQYXRoUmVhZE9ubHkgKyBcIj8gZmFsc2UgOiB0cnVlIH1cIjtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm47XG5cdH1cbn07XG5cbi8qXG4gKiBGdW5jdGlvbiB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIGNoYXJ0IFRpdGxlIFByZXNzXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29Db25maWd1cmF0aW9ufSBbb0NvbmZpZ3VyYXRpb25zXSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuICogIEBwYXJhbSB7b01hbmlmZXN0fSBbb01hbmlmZXN0XSBPdXRib3VuZHMgZnJvbSBtYW5pZmVzdFxuICogcmV0dXJucyB7U3RyaW5nfSBbc0NvbGxlY3Rpb25OYW1lXSBDb2xsZWN0aW9uIE5hbWUgb2YgdGhlIE1pY3JvIENoYXJ0XG4gKlxuICogcmV0dXJucyB7U3RyaW5nfSBbRXhwcmVzc2lvbl0gSGFuZGxlciBFeHByZXNzaW9uIGZvciB0aGUgdGl0bGUgcHJlc3NcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFeHByZXNzaW9uRm9yTWljcm9DaGFydFRpdGxlUHJlc3MgPSBmdW5jdGlvbiAob0NvbmZpZ3VyYXRpb246IGFueSwgb01hbmlmZXN0T3V0Ym91bmQ6IGFueSwgc0NvbGxlY3Rpb25OYW1lOiBhbnkpIHtcblx0aWYgKG9Db25maWd1cmF0aW9uKSB7XG5cdFx0aWYgKFxuXHRcdFx0KG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl0gJiYgb0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXVtcIm91dGJvdW5kXCJdKSB8fFxuXHRcdFx0KG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl0gJiYgb0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXVtcIm91dGJvdW5kXCJdICYmIG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcIi5oYW5kbGVycy5vbkRhdGFQb2ludFRpdGxlUHJlc3NlZCgkY29udHJvbGxlciwgJHskc291cmNlPi99LCdcIiArXG5cdFx0XHRcdEpTT04uc3RyaW5naWZ5KG9NYW5pZmVzdE91dGJvdW5kKSArXG5cdFx0XHRcdFwiJywnXCIgK1xuXHRcdFx0XHRvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0gK1xuXHRcdFx0XHRcIicsJ1wiICtcblx0XHRcdFx0c0NvbGxlY3Rpb25OYW1lICtcblx0XHRcdFx0XCInIClcIlxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pIHtcblx0XHRcdHJldHVybiBcIi5oYW5kbGVycy5uYXZpZ2F0ZVRvU3ViU2VjdGlvbigkY29udHJvbGxlciwgJ1wiICsgSlNPTi5zdHJpbmdpZnkob0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkgKyBcIicpXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG59O1xuXG4vKlxuICogRnVuY3Rpb24gdG8gcmVuZGVyIENoYXJ0IFRpdGxlIGFzIExpbmtcbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b0NvbnRyb2xDb25maWd1cmF0aW9ufSBbb0NvbmZpZ3VyYXRpb25zXSBjb250cm9sIGNvbmZpZ3VyYXRpb24gZnJvbSBtYW5pZmVzdFxuICogcmV0dXJucyB7U3RyaW5nfSBbc0tleV0gRm9yIHRoZSBUYXJnZXRPdXRib3VuZCBhbmQgVGFyZ2V0U2VjdGlvblxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1pY3JvQ2hhcnRUaXRsZUFzTGluayA9IGZ1bmN0aW9uIChvQ29udHJvbENvbmZpZ3VyYXRpb246IGFueSkge1xuXHRpZiAoXG5cdFx0b0NvbnRyb2xDb25maWd1cmF0aW9uICYmXG5cdFx0KG9Db250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdIHx8IChvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXSAmJiBvQ29udHJvbENvbmZpZ3VyYXRpb25bXCJ0YXJnZXRTZWN0aW9uc1wiXSkpXG5cdCkge1xuXHRcdHJldHVybiBcIkV4dGVybmFsXCI7XG5cdH0gZWxzZSBpZiAob0NvbnRyb2xDb25maWd1cmF0aW9uICYmIG9Db250cm9sQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0cmV0dXJuIFwiSW5QYWdlXCI7XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFwiTm9uZVwiO1xuXHR9XG59O1xuXG4vKiBHZXQgZ3JvdXBJZCBmcm9tIGNvbnRyb2wgY29uZmlndXJhdGlvblxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtPYmplY3R9IFtvQ29uZmlndXJhdGlvbnNdIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG4gKiBAcGFyYW0ge1N0cmluZ30gW3NBbm5vdGF0aW9uUGF0aF0gQW5ub3RhdGlvbiBQYXRoIGZvciB0aGUgY29uZmlndXJhdGlvblxuICogQGRlc2NyaXB0aW9uIFVzZWQgdG8gZ2V0IHRoZSBncm91cElkIGZvciBEYXRhUG9pbnRzIGFuZCBNaWNyb0NoYXJ0cyBpbiB0aGUgSGVhZGVyLlxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEdyb3VwSWRGcm9tQ29uZmlnID0gZnVuY3Rpb24gKG9Db25maWd1cmF0aW9uczogYW55LCBzQW5ub3RhdGlvblBhdGg6IGFueSwgc0RlZmF1bHRHcm91cElkPzogYW55KSB7XG5cdGNvbnN0IG9Db25maWd1cmF0aW9uID0gb0NvbmZpZ3VyYXRpb25zW3NBbm5vdGF0aW9uUGF0aF0sXG5cdFx0YUF1dG9QYXR0ZXJucyA9IFtcIkhlcm9lc1wiLCBcIkRlY29yYXRpb25cIiwgXCJXb3JrZXJzXCIsIFwiTG9uZ1J1bm5lcnNcIl07XG5cdGxldCBzR3JvdXBJZCA9IHNEZWZhdWx0R3JvdXBJZDtcblx0aWYgKFxuXHRcdG9Db25maWd1cmF0aW9uICYmXG5cdFx0b0NvbmZpZ3VyYXRpb24ucmVxdWVzdEdyb3VwSWQgJiZcblx0XHRhQXV0b1BhdHRlcm5zLnNvbWUoZnVuY3Rpb24gKGF1dG9QYXR0ZXJuOiBzdHJpbmcpIHtcblx0XHRcdHJldHVybiBhdXRvUGF0dGVybiA9PT0gb0NvbmZpZ3VyYXRpb24ucmVxdWVzdEdyb3VwSWQ7XG5cdFx0fSlcblx0KSB7XG5cdFx0c0dyb3VwSWQgPSBcIiRhdXRvLlwiICsgb0NvbmZpZ3VyYXRpb24ucmVxdWVzdEdyb3VwSWQ7XG5cdH1cblx0cmV0dXJuIHNHcm91cElkO1xufTtcblxuLypcbiAqIEdldCBDb250ZXh0IEJpbmRpbmcgd2l0aCBncm91cElkIGZyb20gY29udHJvbCBjb25maWd1cmF0aW9uXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gW29Db25maWd1cmF0aW9uc10gY29udHJvbCBjb25maWd1cmF0aW9uIGZyb20gbWFuaWZlc3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBbc0tleV0gQW5ub3RhdGlvbiBQYXRoIGZvciBvZiB0aGUgY29uZmlndXJhdGlvblxuICogQGRlc2NyaXB0aW9uIFVzZWQgdG8gZ2V0IHRoZSBiaW5kaW5nIGZvciBEYXRhUG9pbnRzIGluIHRoZSBIZWFkZXIuXG4gKlxuICovXG5leHBvcnQgY29uc3QgZ2V0QmluZGluZ1dpdGhHcm91cElkRnJvbUNvbmZpZyA9IGZ1bmN0aW9uIChvQ29uZmlndXJhdGlvbnM6IGFueSwgc0tleTogYW55KSB7XG5cdGNvbnN0IHNHcm91cElkID0gZ2V0R3JvdXBJZEZyb21Db25maWcob0NvbmZpZ3VyYXRpb25zLCBzS2V5KTtcblx0bGV0IHNCaW5kaW5nO1xuXHRpZiAoc0dyb3VwSWQpIHtcblx0XHRzQmluZGluZyA9IFwieyBwYXRoIDogJycsIHBhcmFtZXRlcnMgOiB7ICQkZ3JvdXBJZCA6ICdcIiArIHNHcm91cElkICsgXCInIH0gfVwiO1xuXHR9XG5cdHJldHVybiBzQmluZGluZztcbn07XG5cbi8qKlxuICogTWV0aG9kIHRvIGNoZWNrIHdoZXRoZXIgYSBGaWVsZEdyb3VwIGNvbnNpc3RzIG9mIG9ubHkgMSBEYXRhRmllbGQgd2l0aCBNdWx0aUxpbmUgVGV4dCBhbm5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RGF0YUZpZWxkQWJzdHJhY3RUeXBlc1tdfSBhRm9ybUVsZW1lbnRzIEEgY29sbGVjdGlvbiBvZiBmb3JtIGVsZW1lbnRzIHVzZWQgaW4gdGhlIGN1cnJlbnQgZmllbGQgZ3JvdXBcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgb25seSAxIGRhdGEgZmllbGQgd2l0aCBNdWx0aWxpbmUgVGV4dCBhbm5vdGF0aW9uIGV4aXN0cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGRvZXNGaWVsZEdyb3VwQ29udGFpbk9ubHlPbmVNdWx0aUxpbmVEYXRhRmllbGQgPSBmdW5jdGlvbiAoYUZvcm1FbGVtZW50czogYW55W10pIHtcblx0cmV0dXJuIGFGb3JtRWxlbWVudHMgJiYgYUZvcm1FbGVtZW50cy5sZW5ndGggPT09IDEgJiYgISFhRm9ybUVsZW1lbnRzWzBdLmlzVmFsdWVNdWx0aWxpbmVUZXh0O1xufTtcblxuLypcbiAqIEdldCBWaXNpYmxpdHkgb2YgYnJlYWRjcnVtYnMuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gW29WaWV3RGF0YV0gVmlld0RhdGEgbW9kZWxcbiAqIHJldHVybnMgeyp9IEV4cHJlc3Npb24gb3IgYm9vbGVhblxuICovXG5leHBvcnQgY29uc3QgZ2V0VmlzaWJsZUV4cHJlc3Npb25Gb3JCcmVhZGNydW1icyA9IGZ1bmN0aW9uIChvVmlld0RhdGE6IGFueSkge1xuXHRyZXR1cm4gb1ZpZXdEYXRhLnNob3dCcmVhZENydW1icyAmJiBvVmlld0RhdGEuZmNsRW5hYmxlZCAhPT0gdW5kZWZpbmVkID8gXCJ7ZmNsaGVscGVyPi9icmVhZENydW1iSXNWaXNpYmxlfVwiIDogb1ZpZXdEYXRhLnNob3dCcmVhZENydW1icztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTaGFyZUJ1dHRvblZpc2liaWxpdHkgPSBmdW5jdGlvbiAodmlld0RhdGE6IGFueSkge1xuXHRsZXQgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCA9IFwiISR7dWk+Y3JlYXRlTW9kZX1cIjtcblx0aWYgKHZpZXdEYXRhLmZjbEVuYWJsZWQpIHtcblx0XHRzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwID0gXCIke2ZjbGhlbHBlcj4vc2hvd1NoYXJlSWNvbn0gJiYgXCIgKyBzU2hhcmVCdXR0b25WaXNpYmlsaXR5RXhwO1xuXHR9XG5cdHJldHVybiBcIns9IFwiICsgc1NoYXJlQnV0dG9uVmlzaWJpbGl0eUV4cCArIFwiIH1cIjtcbn07XG5cbi8qXG4gKiBHZXQgdmlzaWJsaXR5IGZvciBlZGl0YWJsZSBoZWFkZXIgZmFjZXQuXG4gKlxuICogSWYgZWl0aGVyIHRoZSB0aXRsZSBvciBkZXNjcmlwdGlvbiBmaWVsZCBmcm9tIHRoZSBoZWFkZXIgYW5ub3RhdGlvbnMgYXJlIGVkaXRhYmxlLCB0aGVuIHRoZVxuICogZWRpdGFibGUgaGVhZGVyIGZhY2V0IGlzIHZpc2libGUuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gW29Bbm5vdGF0aW9uc10gQW5ub3RhdGlvbnMgb2JqZWN0IGZvciBnaXZlbiBlbnRpdHkgc2V0XG4gKiBAcGFyYW0ge29iamVjdH0gW29GaWVsZENvbnRyb2xdIGZpZWxkIGNvbnRyb2xcbiAqIHJldHVybnMgeyp9ICBiaW5kaW5nIGV4cHJlc3Npb24gb3IgYm9vbGVhbiB2YWx1ZSByZXNvbHZlZCBmb3JtIGZ1bmNpdG9ucyBpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zIGFuZCBpc1JlYWRPbmx5RnJvbUR5bmFtaWNBbm5vdGF0aW9uc1xuICovXG5leHBvcnQgY29uc3QgZ2V0VmlzaWJsaXR5T2ZIZWFkZXJGYWNldCA9IGZ1bmN0aW9uIChcblx0b1RpdGxlQW5ub3RhdGlvbnM6IGFueSxcblx0b0Rlc2NyaXB0aW9uQW5ub3RhdGlvbnM6IGFueSxcblx0b0ZpZWxkVGl0bGVGaWVsZENvbnRyb2w6IGFueSxcblx0b0ZpZWxkRGVzY3JpcHRpb25GaWVsZENvbnRyb2w6IGFueVxuKSB7XG5cdC8vIENoZWNrIEFubm90YXRpb25zIGZvciBUaXRsZSBGaWVsZFxuXHRjb25zdCBiSXNUaXRsZVJlYWRPbmx5ID0gaXNSZWFkT25seUZyb21TdGF0aWNBbm5vdGF0aW9ucyhvVGl0bGVBbm5vdGF0aW9ucywgb0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wpO1xuXHRjb25zdCB0aXRsZUV4cHJlc3Npb24gPSByZWFkT25seUV4cHJlc3Npb25Gcm9tRHluYW1pY0Fubm90YXRpb25zKG9GaWVsZFRpdGxlRmllbGRDb250cm9sKTtcblx0Ly8gVGhlcmUgaXMgbm8gZXhwcmVzc2lvbiBhbmQgdGhlIHRpdGxlIGlzIG5vdCByZWFkeSBvbmx5LCB0aGlzIGlzIHN1ZmZpY2llbnQgZm9yIGFuIGVkaXRhYmxlIGhlYWRlclxuXHRpZiAoIWJJc1RpdGxlUmVhZE9ubHkgJiYgIXRpdGxlRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gQ2hlY2sgQW5ub3RhdGlvbnMgZm9yIERlc2NyaXB0aW9uIEZpZWxkXG5cdGNvbnN0IGJJc0Rlc2NyaXB0aW9uUmVhZE9ubHkgPSBpc1JlYWRPbmx5RnJvbVN0YXRpY0Fubm90YXRpb25zKG9EZXNjcmlwdGlvbkFubm90YXRpb25zLCBvRmllbGREZXNjcmlwdGlvbkZpZWxkQ29udHJvbCk7XG5cdGNvbnN0IGRlc2NyaXB0aW9uRXhwcmVzc2lvbiA9IHJlYWRPbmx5RXhwcmVzc2lvbkZyb21EeW5hbWljQW5ub3RhdGlvbnMob0ZpZWxkRGVzY3JpcHRpb25GaWVsZENvbnRyb2wpO1xuXHQvLyBUaGVyZSBpcyBubyBleHByZXNzaW9uIGFuZCB0aGUgZGVzY3JpcHRpb24gaXMgbm90IHJlYWR5IG9ubHksIHRoaXMgaXMgc3VmZmljaWVudCBmb3IgYW4gZWRpdGFibGUgaGVhZGVyXG5cdGlmICghYklzRGVzY3JpcHRpb25SZWFkT25seSAmJiAhZGVzY3JpcHRpb25FeHByZXNzaW9uKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyBCb3RoIHRpdGxlIGFuZCBkZXNjcmlwdGlvbiBhcmUgbm90IGVkaXRhYmxlIGFuZCB0aGVyZSBhcmUgbm8gZHluYW1pYyBhbm5vdGF0aW9uc1xuXHRpZiAoYklzVGl0bGVSZWFkT25seSAmJiBiSXNEZXNjcmlwdGlvblJlYWRPbmx5ICYmICF0aXRsZUV4cHJlc3Npb24gJiYgIWRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIE5vdyBjb21iaW5lIGV4cHJlc3Npb25zXG5cdGlmICh0aXRsZUV4cHJlc3Npb24gJiYgIWRlc2NyaXB0aW9uRXhwcmVzc2lvbikge1xuXHRcdHJldHVybiB0aXRsZUV4cHJlc3Npb247XG5cdH0gZWxzZSBpZiAoIXRpdGxlRXhwcmVzc2lvbiAmJiBkZXNjcmlwdGlvbkV4cHJlc3Npb24pIHtcblx0XHRyZXR1cm4gZGVzY3JpcHRpb25FeHByZXNzaW9uO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBjb21iaW5lVGl0bGVBbmREZXNjcmlwdGlvbkV4cHJlc3Npb24ob0ZpZWxkVGl0bGVGaWVsZENvbnRyb2wsIG9GaWVsZERlc2NyaXB0aW9uRmllbGRDb250cm9sKTtcblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGNvbWJpbmVUaXRsZUFuZERlc2NyaXB0aW9uRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChvVGl0bGVGaWVsZENvbnRyb2w6IGFueSwgb0Rlc2NyaXB0aW9uRmllbGRDb250cm9sOiBhbnkpIHtcblx0Ly8gSWYgYm90aCBoZWFkZXIgYW5kIHRpdGxlIGZpZWxkIGFyZSBiYXNlZCBvbiBkeW5tYWljIGZpZWxkIGNvbnRyb2wsIHRoZSBlZGl0YWJsZSBoZWFkZXJcblx0Ly8gaXMgdmlzaWJsZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlc2UgaXMgbm90IHJlYWR5IG9ubHlcblx0cmV0dXJuIFwiez0gJVwiICsgb1RpdGxlRmllbGRDb250cm9sICsgXCIgPT09IDEgPyAoICVcIiArIG9EZXNjcmlwdGlvbkZpZWxkQ29udHJvbCArIFwiID09PSAxID8gZmFsc2UgOiB0cnVlICkgOiB0cnVlIH1cIjtcbn07XG5cbi8qXG4gKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBvZiBkZWxldGUgYnV0dG9uLlxuICpcbiAqIEBmdW5jdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IFtzRW50aXR5U2V0TmFtZV0gRW50aXR5IHNldCBuYW1lXG4gKiByZXR1cm5zIHtzdHJpbmd9ICBiaW5kaW5nIGV4cHJlc3Npb24gLyBmdW5jdGlvbiBzdHJpbmcgZ2VuZXJhdGVkIGZyb20gY29tbWFuaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJlc3NFeHByZXNzaW9uRm9yRGVsZXRlID0gZnVuY3Rpb24gKHNFbnRpdHlTZXROYW1lOiBhbnkpIHtcblx0Y29uc3Qgc0RlbGV0YWJsZUNvbnRleHRzID0gXCIkeyR2aWV3Pi9nZXRCaW5kaW5nQ29udGV4dH1cIixcblx0XHRzVGl0bGUgPSBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS9nZXRIZWFkZXJUaXRsZS9nZXRFeHBhbmRlZEhlYWRpbmcvZ2V0SXRlbXMvMS9nZXRUZXh0fVwiLFxuXHRcdHNEZXNjcmlwdGlvbiA9IFwiJHskdmlldz4vI2ZlOjpPYmplY3RQYWdlL2dldEhlYWRlclRpdGxlL2dldEV4cGFuZGVkQ29udGVudC8wL2dldEl0ZW1zLzAvZ2V0VGV4dH1cIjtcblx0Y29uc3Qgb1BhcmFtcyA9IHtcblx0XHR0aXRsZTogc1RpdGxlLFxuXHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdGRlc2NyaXB0aW9uOiBzRGVzY3JpcHRpb25cblx0fTtcblx0cmV0dXJuIENvbW1vbkhlbHBlci5nZW5lcmF0ZUZ1bmN0aW9uKFwiLmVkaXRGbG93LmRlbGV0ZURvY3VtZW50XCIsIHNEZWxldGFibGVDb250ZXh0cywgQ29tbW9uSGVscGVyLm9iamVjdFRvU3RyaW5nKG9QYXJhbXMpKTtcbn07XG5cbi8qXG4gKiBHZXQgRXhwcmVzc2lvbiBvZiBwcmVzcyBldmVudCBvZiBFZGl0IGJ1dHRvbi5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0RhdGFGaWVsZF0gRGF0YSBmaWVsZCBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc0VudGl0eVNldE5hbWVdIEVudGl0eSBzZXQgbmFtZVxuICogQHBhcmFtIHtvYmplY3R9IFtvSGVhZGVyQWN0aW9uXSBIZWFkZXIgYWN0aW9uIG9iamVjdFxuICogcmV0dXJucyB7c3RyaW5nfSAgYmluZGluZyBleHByZXNzaW9uIC8gZnVuY3Rpb24gc3RyaW5nIGdlbmVyYXRlZCBmcm9tIGNvbW1hbmhlbHBlcidzIGZ1bmN0aW9uIGdlbmVyYXRlRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFByZXNzRXhwcmVzc2lvbkZvckVkaXQgPSBmdW5jdGlvbiAob0RhdGFGaWVsZDogYW55LCBzRW50aXR5U2V0TmFtZTogYW55LCBvSGVhZGVyQWN0aW9uOiBhbnkpIHtcblx0Y29uc3Qgc0VkaXRhYmxlQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5BY3Rpb24pLFxuXHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID0gb0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZyAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZ1tcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdHNJbnZvY2F0aW9uR3JvdXAgPSBzRGF0YUZpZWxkRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcGVyYXRpb25Hcm91cGluZ1R5cGUvQ2hhbmdlU2V0XCIgPyBcIkNoYW5nZVNldFwiIDogXCJJc29sYXRlZFwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+L2dldEJpbmRpbmdDb250ZXh0fVwiLFxuXHRcdGVudGl0eVNldE5hbWU6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0VudGl0eVNldE5hbWUpLFxuXHRcdGludm9jYXRpb25Hcm91cGluZzogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhzSW52b2NhdGlvbkdyb3VwKSxcblx0XHRtb2RlbDogXCIkeyRzb3VyY2U+L30uZ2V0TW9kZWwoKVwiLFxuXHRcdGxhYmVsOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5MYWJlbCwgdHJ1ZSksXG5cdFx0aXNOYXZpZ2FibGU6IG9IZWFkZXJBY3Rpb24gJiYgb0hlYWRlckFjdGlvbi5pc05hdmlnYWJsZSxcblx0XHRkZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb246XG5cdFx0XHRvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uXG5cdFx0XHRcdD8gXCInXCIgKyBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvbiArIFwiJ1wiXG5cdFx0XHRcdDogdW5kZWZpbmVkXG5cdH07XG5cdHJldHVybiBDb21tb25IZWxwZXIuZ2VuZXJhdGVGdW5jdGlvbihcIi5oYW5kbGVycy5vbkNhbGxBY3Rpb25cIiwgXCIkeyR2aWV3Pi99XCIsIHNFZGl0YWJsZUNvbnRleHRzLCBDb21tb25IZWxwZXIub2JqZWN0VG9TdHJpbmcob1BhcmFtcykpO1xufTtcblxuLypcbiAqIE1ldGhvZCB0byBnZXQgdGhlIGV4cHJlc3Npb24gZm9yIHRoZSAncHJlc3MnIGV2ZW50IGZvciBmb290ZXIgYW5ub3RhdGlvbiBhY3Rpb25zXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gW29EYXRhRmllbGRdIERhdGEgZmllbGQgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gW3NFbnRpdHlTZXROYW1lXSBFbnRpdHkgc2V0IG5hbWVcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0hlYWRlckFjdGlvbl0gSGVhZGVyIGFjdGlvbiBvYmplY3RcbiAqIHJldHVybnMge3N0cmluZ30gIEJpbmRpbmcgZXhwcmVzc2lvbiBvciBmdW5jdGlvbiBzdHJpbmcgdGhhdCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgQ29tbW9uaGVscGVyJ3MgZnVuY3Rpb24gZ2VuZXJhdGVGdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJlc3NFeHByZXNzaW9uRm9yRm9vdGVyQW5ub3RhdGlvbkFjdGlvbiA9IGZ1bmN0aW9uIChvRGF0YUZpZWxkOiBhbnksIHNFbnRpdHlTZXROYW1lOiBhbnksIG9IZWFkZXJBY3Rpb246IGFueSkge1xuXHRjb25zdCBzQWN0aW9uQ29udGV4dHMgPSBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKG9EYXRhRmllbGQgJiYgb0RhdGFGaWVsZC5BY3Rpb24pLFxuXHRcdHNEYXRhRmllbGRFbnVtTWVtYmVyID0gb0RhdGFGaWVsZCAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZyAmJiBvRGF0YUZpZWxkLkludm9jYXRpb25Hcm91cGluZ1tcIiRFbnVtTWVtYmVyXCJdLFxuXHRcdHNJbnZvY2F0aW9uR3JvdXAgPSBzRGF0YUZpZWxkRW51bU1lbWJlciA9PT0gXCJjb20uc2FwLnZvY2FidWxhcmllcy5VSS52MS5PcGVyYXRpb25Hcm91cGluZ1R5cGUvQ2hhbmdlU2V0XCIgPyBcIkNoYW5nZVNldFwiIDogXCJJc29sYXRlZFwiO1xuXHRjb25zdCBvUGFyYW1zID0ge1xuXHRcdGNvbnRleHRzOiBcIiR7JHZpZXc+LyNmZTo6T2JqZWN0UGFnZS99LmdldEJpbmRpbmdDb250ZXh0KClcIixcblx0XHRlbnRpdHlTZXROYW1lOiBDb21tb25IZWxwZXIuYWRkU2luZ2xlUXVvdGVzKHNFbnRpdHlTZXROYW1lKSxcblx0XHRpbnZvY2F0aW9uR3JvdXBpbmc6IENvbW1vbkhlbHBlci5hZGRTaW5nbGVRdW90ZXMoc0ludm9jYXRpb25Hcm91cCksXG5cdFx0bW9kZWw6IFwiJHskc291cmNlPi99LmdldE1vZGVsKClcIixcblx0XHRsYWJlbDogQ29tbW9uSGVscGVyLmFkZFNpbmdsZVF1b3RlcyhvRGF0YUZpZWxkICYmIG9EYXRhRmllbGQuTGFiZWwsIHRydWUpLFxuXHRcdGlzTmF2aWdhYmxlOiBvSGVhZGVyQWN0aW9uICYmIG9IZWFkZXJBY3Rpb24uaXNOYXZpZ2FibGUsXG5cdFx0ZGVmYXVsdFZhbHVlc0V4dGVuc2lvbkZ1bmN0aW9uOlxuXHRcdFx0b0hlYWRlckFjdGlvbiAmJiBvSGVhZGVyQWN0aW9uLmRlZmF1bHRWYWx1ZXNFeHRlbnNpb25GdW5jdGlvblxuXHRcdFx0XHQ/IFwiJ1wiICsgb0hlYWRlckFjdGlvbi5kZWZhdWx0VmFsdWVzRXh0ZW5zaW9uRnVuY3Rpb24gKyBcIidcIlxuXHRcdFx0XHQ6IHVuZGVmaW5lZFxuXHR9O1xuXHRyZXR1cm4gQ29tbW9uSGVscGVyLmdlbmVyYXRlRnVuY3Rpb24oXCIuaGFuZGxlcnMub25DYWxsQWN0aW9uXCIsIFwiJHskdmlldz4vfVwiLCBzQWN0aW9uQ29udGV4dHMsIENvbW1vbkhlbHBlci5vYmplY3RUb1N0cmluZyhvUGFyYW1zKSk7XG59O1xuXG4vKlxuICogR2V0cyB0aGUgYmluZGluZyBvZiB0aGUgY29udGFpbmVyIEhCb3ggZm9yIHRoZSBoZWFkZXIgZmFjZXQuXG4gKlxuICogQGZ1bmN0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gW29Db250cm9sQ29uZmlndXJhdGlvbl0gVGhlIGNvbnRyb2wgY29uZmlndXJhdGlvbiBmb3JtIG9mIHRoZSB2aWV3RGF0YSBtb2RlbFxuICogQHBhcmFtIHtvYmplY3R9IFtvSGVhZGVyRmFjZXRdIFRoZSBvYmplY3Qgb2YgdGhlIGhlYWRlciBmYWNldFxuICogcmV0dXJucyB7Kn0gIFRoZSBiaW5kaW5nIGV4cHJlc3Npb24gZnJvbSBmdW5jdGlvbiBnZXRCaW5kaW5nV2l0aEdyb3VwSWRGcm9tQ29uZmlnIG9yIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFN0YXNoYWJsZUhCb3hCaW5kaW5nID0gZnVuY3Rpb24gKG9Db250cm9sQ29uZmlndXJhdGlvbjogYW55LCBvSGVhZGVyRmFjZXQ6IGFueSkge1xuXHRpZiAob0hlYWRlckZhY2V0ICYmIG9IZWFkZXJGYWNldC5GYWNldCAmJiBvSGVhZGVyRmFjZXQuRmFjZXQudGFyZ2V0QW5ub3RhdGlvblR5cGUgPT09IFwiRGF0YVBvaW50XCIpIHtcblx0XHRyZXR1cm4gZ2V0QmluZGluZ1dpdGhHcm91cElkRnJvbUNvbmZpZyhvQ29udHJvbENvbmZpZ3VyYXRpb24sIG9IZWFkZXJGYWNldC5GYWNldC50YXJnZXRBbm5vdGF0aW9uVmFsdWUpO1xuXHR9XG59O1xuXG4vKlxuICogR2V0cyB0aGUgJ1ByZXNzJyBldmVudCBleHByZXNzaW9uIGZvciB0aGUgZXh0ZXJuYWwgYW5kIGludGVybmFsIGRhdGEgcG9pbnQgbGluay5cbiAqXG4gKiBAZnVuY3Rpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb0NvbmZpZ3VyYXRpb25dIENvbnRyb2wgY29uZmlndXJhdGlvbiBmcm9tIG1hbmlmZXN0XG4gKiBAcGFyYW0ge29iamVjdH0gW29NYW5pZmVzdE91dGJvdW5kXSBPdXRib3VuZHMgZnJvbSBtYW5pZmVzdFxuICogcmV0dXJucyB7c3RyaW5nfSBUaGUgcnVudGltZSBiaW5kaW5nIG9mIHRoZSAnUHJlc3MnIGV2ZW50XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQcmVzc0V4cHJlc3Npb25Gb3JMaW5rID0gZnVuY3Rpb24gKG9Db25maWd1cmF0aW9uOiBhbnksIG9NYW5pZmVzdE91dGJvdW5kOiBhbnkpIHtcblx0aWYgKG9Db25maWd1cmF0aW9uKSB7XG5cdFx0aWYgKG9Db25maWd1cmF0aW9uW1widGFyZ2V0T3V0Ym91bmRcIl0gJiYgb0NvbmZpZ3VyYXRpb25bXCJ0YXJnZXRPdXRib3VuZFwiXVtcIm91dGJvdW5kXCJdKSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcIi5oYW5kbGVycy5vbkRhdGFQb2ludFRpdGxlUHJlc3NlZCgkY29udHJvbGxlciwgJHskc291cmNlPn0sIFwiICtcblx0XHRcdFx0SlNPTi5zdHJpbmdpZnkob01hbmlmZXN0T3V0Ym91bmQpICtcblx0XHRcdFx0XCIsXCIgK1xuXHRcdFx0XHRKU09OLnN0cmluZ2lmeShvQ29uZmlndXJhdGlvbltcInRhcmdldE91dGJvdW5kXCJdW1wib3V0Ym91bmRcIl0pICtcblx0XHRcdFx0XCIpXCJcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChvQ29uZmlndXJhdGlvbltcInRhcmdldFNlY3Rpb25zXCJdKSB7XG5cdFx0XHRyZXR1cm4gXCIuaGFuZGxlcnMubmF2aWdhdGVUb1N1YlNlY3Rpb24oJGNvbnRyb2xsZXIsICdcIiArIEpTT04uc3RyaW5naWZ5KG9Db25maWd1cmF0aW9uW1widGFyZ2V0U2VjdGlvbnNcIl0pICsgXCInKVwiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxufTtcblxuZXhwb3J0IGNvbnN0IGlzU3ViU2VjdGlvblRpdGxlVmlzaWJsZSA9IGZ1bmN0aW9uIChzU3ViU2VjdGlvbnZpc2libGU6IGFueSwgc1N1YlNlY3Rpb250aXRsZTogYW55LCBzU3ViU2VjdGlvbnNob3dUaXRsZTogYW55KSB7XG5cdGlmIChzU3ViU2VjdGlvbnZpc2libGUuaW5kZXhPZihcIns9XCIpID09PSAwKSB7XG5cdFx0Ly8gRHluYW1pYyBleHByZXNzaW9uXG5cdFx0Y29uc3Qgc0V4cHJlc3Npb25SZXN1bHQgPSBzU3ViU2VjdGlvbnZpc2libGUuc3Vic3RyaW5nKHNTdWJTZWN0aW9udmlzaWJsZS5pbmRleE9mKFwiez1cIikgKyAyLCBzU3ViU2VjdGlvbnZpc2libGUubGFzdEluZGV4T2YoXCJ9XCIpKTtcblx0XHRyZXR1cm4gKFxuXHRcdFx0XCJ7PSAoXCIgK1xuXHRcdFx0c0V4cHJlc3Npb25SZXN1bHQgK1xuXHRcdFx0XCIpICYmICgnXCIgK1xuXHRcdFx0c1N1YlNlY3Rpb250aXRsZSArXG5cdFx0XHRcIicgIT09J3VuZGVmaW5lZCcpICYmIChcIiArXG5cdFx0XHRzU3ViU2VjdGlvbnNob3dUaXRsZSArXG5cdFx0XHRcIiA/IHRydWUgOiBmYWxzZSkgfVwiXG5cdFx0KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gc1N1YlNlY3Rpb252aXNpYmxlICYmIHNTdWJTZWN0aW9udGl0bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgKHNTdWJTZWN0aW9uc2hvd1RpdGxlID8gXCJ0cnVlXCIgOiBcImZhbHNlXCIpO1xuXHR9XG59O1xuIl19
|