@sapui5/sap.fe.templates 1.109.0 → 1.110.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/package.json +11 -8
- package/src/sap/fe/templates/.library +26 -27
- package/src/sap/fe/templates/AnalyticalListPage/Component.js +1 -7
- package/src/sap/fe/templates/AnalyticalListPage/chart/FEChartDelegate.js +1 -4
- package/src/sap/fe/templates/ListComponent.js +45 -62
- package/src/sap/fe/templates/ListComponent.ts +43 -43
- package/src/sap/fe/templates/ListReport/Component.js +11 -19
- package/src/sap/fe/templates/ListReport/Component.ts +6 -0
- package/src/sap/fe/templates/ListReport/ExtensionAPI.js +11 -37
- package/src/sap/fe/templates/ListReport/ExtensionAPI.ts +1 -1
- package/src/sap/fe/templates/ListReport/LRMessageStrip.js +196 -0
- package/src/sap/fe/templates/ListReport/LRMessageStrip.ts +216 -0
- package/src/sap/fe/templates/ListReport/ListReport.view.xml +31 -0
- package/src/sap/fe/templates/ListReport/ListReportController.controller.js +140 -247
- package/src/sap/fe/templates/ListReport/ListReportController.controller.ts +49 -14
- package/src/sap/fe/templates/ListReport/ListReportTemplating.js +2 -7
- package/src/sap/fe/templates/ListReport/controls/MultipleModeControl.js +21 -108
- package/src/sap/fe/templates/ListReport/overrides/IntentBasedNavigation.js +9 -17
- package/src/sap/fe/templates/ListReport/overrides/Share.js +9 -25
- package/src/sap/fe/templates/ListReport/overrides/ViewState.js +51 -122
- package/src/sap/fe/templates/ListReport/view/fragments/MultipleMode.fragment.js +1 -23
- package/src/sap/fe/templates/ObjectPage/Component.js +19 -40
- package/src/sap/fe/templates/ObjectPage/Component.ts +9 -2
- package/src/sap/fe/templates/ObjectPage/ExtendPageDefinition.js +64 -0
- package/src/sap/fe/templates/ObjectPage/ExtendPageDefinition.ts +80 -0
- package/src/sap/fe/templates/ObjectPage/ExtensionAPI.js +21 -58
- package/src/sap/fe/templates/ObjectPage/ExtensionAPI.ts +4 -4
- package/src/sap/fe/templates/ObjectPage/ObjectPage.view.xml +2 -1
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.js +173 -459
- package/src/sap/fe/templates/ObjectPage/ObjectPageController.controller.ts +13 -18
- package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.js +129 -208
- package/src/sap/fe/templates/ObjectPage/ObjectPageTemplating.ts +62 -14
- package/src/sap/fe/templates/ObjectPage/components/DraftHandlerButton.js +1 -32
- package/src/sap/fe/templates/ObjectPage/controls/StashableHBox.js +9 -37
- package/src/sap/fe/templates/ObjectPage/controls/StashableVBox.js +1 -7
- package/src/sap/fe/templates/ObjectPage/controls/SubSectionBlock.js +9 -31
- package/src/sap/fe/templates/ObjectPage/designtime/FlexBox.designtime.js +1 -1
- package/src/sap/fe/templates/ObjectPage/designtime/StashableHBox.designtime.js +2 -4
- package/src/sap/fe/templates/ObjectPage/designtime/StashableVBox.designtime.js +1 -1
- package/src/sap/fe/templates/ObjectPage/flexibility/ScrollableHeaderContainer.flexibility.js +4 -5
- package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.js +4 -4
- package/src/sap/fe/templates/ObjectPage/flexibility/StashableHBox.flexibility.ts +3 -3
- package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.js +4 -4
- package/src/sap/fe/templates/ObjectPage/flexibility/StashableVBox.flexibility.ts +3 -3
- package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.js +16 -21
- package/src/sap/fe/templates/ObjectPage/overrides/IntentBasedNavigation.ts +1 -1
- package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.js +19 -1
- package/src/sap/fe/templates/ObjectPage/overrides/InternalRouting.ts +21 -0
- package/src/sap/fe/templates/ObjectPage/overrides/MessageHandler.js +1 -1
- package/src/sap/fe/templates/ObjectPage/overrides/Paginator.js +4 -5
- package/src/sap/fe/templates/ObjectPage/overrides/Share.js +19 -69
- package/src/sap/fe/templates/ObjectPage/overrides/Share.ts +1 -1
- package/src/sap/fe/templates/ObjectPage/overrides/ViewState.js +5 -20
- package/src/sap/fe/templates/ObjectPage/view/fragments/Actions.fragment.xml +6 -6
- package/src/sap/fe/templates/ObjectPage/view/fragments/EditableHeaderFacet.fragment.xml +4 -3
- package/src/sap/fe/templates/ObjectPage/view/fragments/FooterContent.fragment.xml +3 -3
- package/src/sap/fe/templates/ObjectPage/view/fragments/FormActions.fragment.xml +1 -1
- package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderContent.fragment.xml +1 -1
- package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderDataPoint.fragment.xml +1 -1
- package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacet.fragment.xml +4 -3
- package/src/sap/fe/templates/ObjectPage/view/fragments/HeaderFacetCustomContainer.fragment.xml +7 -5
- package/src/sap/fe/templates/ObjectPage/view/fragments/HeadingAvatar.fragment.xml +1 -1
- package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderContact.fragment.xml +3 -2
- package/src/sap/fe/templates/ObjectPage/view/fragments/ObjectPageHeaderForm.fragment.xml +2 -1
- package/src/sap/fe/templates/ObjectPage/view/fragments/SideContentCustomContainer.fragment.xml +7 -7
- package/src/sap/fe/templates/TableScroller.js +1 -6
- package/src/sap/fe/templates/library.js +4 -7
- package/src/sap/fe/templates/library.ts +1 -2
- package/src/sap/fe/templates/messagebundle.properties +30 -29
- package/src/sap/fe/templates/messagebundle_bg.properties +2 -2
- package/src/sap/fe/templates/messagebundle_cs.properties +1 -1
- package/src/sap/fe/templates/messagebundle_en_US_sappsd.properties +1 -1
- package/src/sap/fe/templates/messagebundle_en_US_saprigi.properties +1 -1
- package/src/sap/fe/templates/messagebundle_en_US_saptrc.properties +1 -1
- package/src/sap/fe/templates/messagebundle_no.properties +3 -3
- package/src/sap/fe/templates/messagebundle_sl.properties +7 -7
- package/ui5.yaml +0 -1
- package/src/sap/fe/templates/Feedback.js +0 -80
- package/src/sap/fe/templates/Feedback.ts +0 -64
- package/src/sap/fe/templates/ObjectPage/view/fragments/FormActionButtons.fragment.xml +0 -82
- package/src/sap/fe/templates/RootContainer/overrides/EditFlow.js +0 -20
- package/src/sap/fe/templates/RootContainer/overrides/EditFlow.ts +0 -20
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2021 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/collaboration/Manage", "sap/fe/core/controllerextensions/
|
|
5
|
+
sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime", "sap/fe/core/CommonUtils", "sap/fe/core/controllerextensions/BusyLocker", "sap/fe/core/controllerextensions/collaboration/ActivitySync", "sap/fe/core/controllerextensions/collaboration/Manage", "sap/fe/core/controllerextensions/editFlow/draft", "sap/fe/core/controllerextensions/IntentBasedNavigation", "sap/fe/core/controllerextensions/InternalIntentBasedNavigation", "sap/fe/core/controllerextensions/InternalRouting", "sap/fe/core/controllerextensions/MassEdit", "sap/fe/core/controllerextensions/MessageHandler", "sap/fe/core/controllerextensions/PageReady", "sap/fe/core/controllerextensions/Paginator", "sap/fe/core/controllerextensions/Placeholder", "sap/fe/core/controllerextensions/Share", "sap/fe/core/controllerextensions/ViewState", "sap/fe/core/helpers/ClassSupport", "sap/fe/core/helpers/ModelHelper", "sap/fe/core/PageController", "sap/fe/macros/chart/ChartRuntime", "sap/fe/macros/CommonHelper", "sap/fe/macros/DelegateUtil", "sap/fe/macros/table/Utils", "sap/fe/navigation/SelectionVariant", "sap/fe/templates/ObjectPage/ExtensionAPI", "sap/fe/templates/TableScroller", "sap/m/InstanceManager", "sap/m/Link", "sap/m/MessageBox", "sap/ui/core/Core", "sap/ui/core/mvc/OverrideExecution", "sap/ui/model/odata/v4/ODataListBinding", "./overrides/IntentBasedNavigation", "./overrides/InternalRouting", "./overrides/MessageHandler", "./overrides/Paginator", "./overrides/Share", "./overrides/ViewState"], function (Log, merge, ActionRuntime, CommonUtils, BusyLocker, ActivitySync, Manage, draft, IntentBasedNavigation, InternalIntentBasedNavigation, InternalRouting, MassEdit, MessageHandler, PageReady, Paginator, Placeholder, Share, ViewState, ClassSupport, ModelHelper, PageController, ChartRuntime, CommonHelper, DelegateUtil, TableUtils, SelectionVariant, ExtensionAPI, TableScroller, InstanceManager, Link, MessageBox, Core, OverrideExecution, ODataListBinding, IntentBasedNavigationOverride, InternalRoutingOverride, MessageHandlerOverride, PaginatorOverride, ShareOverrides, ViewStateOverrides) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
|
-
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15,
|
|
9
|
-
|
|
8
|
+
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _class, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5, _descriptor6, _descriptor7, _descriptor8, _descriptor9, _descriptor10;
|
|
10
9
|
var usingExtension = ClassSupport.usingExtension;
|
|
11
10
|
var publicExtension = ClassSupport.publicExtension;
|
|
12
11
|
var finalExtension = ClassSupport.finalExtension;
|
|
@@ -17,98 +16,64 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
17
16
|
var isConnected = ActivitySync.isConnected;
|
|
18
17
|
var disconnect = ActivitySync.disconnect;
|
|
19
18
|
var connect = ActivitySync.connect;
|
|
20
|
-
|
|
21
19
|
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
22
|
-
|
|
23
20
|
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); }
|
|
24
|
-
|
|
25
21
|
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; }
|
|
26
|
-
|
|
27
22
|
function _catch(body, recover) {
|
|
28
23
|
try {
|
|
29
24
|
var result = body();
|
|
30
25
|
} catch (e) {
|
|
31
26
|
return recover(e);
|
|
32
27
|
}
|
|
33
|
-
|
|
34
28
|
if (result && result.then) {
|
|
35
29
|
return result.then(void 0, recover);
|
|
36
30
|
}
|
|
37
|
-
|
|
38
31
|
return result;
|
|
39
32
|
}
|
|
40
|
-
|
|
41
33
|
function _finallyRethrows(body, finalizer) {
|
|
42
34
|
try {
|
|
43
35
|
var result = body();
|
|
44
36
|
} catch (e) {
|
|
45
37
|
return finalizer(true, e);
|
|
46
38
|
}
|
|
47
|
-
|
|
48
39
|
if (result && result.then) {
|
|
49
40
|
return result.then(finalizer.bind(null, false), finalizer.bind(null, true));
|
|
50
41
|
}
|
|
51
|
-
|
|
52
42
|
return finalizer(false, result);
|
|
53
43
|
}
|
|
54
|
-
|
|
55
44
|
function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
|
|
56
|
-
|
|
57
45
|
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
58
|
-
|
|
59
46
|
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
60
|
-
|
|
61
47
|
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
62
|
-
|
|
63
48
|
function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
|
|
64
|
-
|
|
65
49
|
function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
|
|
66
|
-
|
|
67
|
-
var ObjectPageController = (_dec = defineUI5Class("sap.fe.templates.ObjectPage.ObjectPageController"), _dec2 = usingExtension(Placeholder), _dec3 = usingExtension(EditFlow), _dec4 = usingExtension(Share.override(ShareOverrides)), _dec5 = usingExtension(InternalEditFlow.override(EditFlowOverrides)), _dec6 = usingExtension(InternalRouting.override(InternalRoutingOverride)), _dec7 = usingExtension(Paginator.override(PaginatorOverride)), _dec8 = usingExtension(MessageHandler.override(MessageHandlerOverride)), _dec9 = usingExtension(IntentBasedNavigation.override(IntentBasedNavigationOverride)), _dec10 = usingExtension(InternalIntentBasedNavigation.override({
|
|
50
|
+
var ObjectPageController = (_dec = defineUI5Class("sap.fe.templates.ObjectPage.ObjectPageController"), _dec2 = usingExtension(Placeholder), _dec3 = usingExtension(Share.override(ShareOverrides)), _dec4 = usingExtension(InternalRouting.override(InternalRoutingOverride)), _dec5 = usingExtension(Paginator.override(PaginatorOverride)), _dec6 = usingExtension(MessageHandler.override(MessageHandlerOverride)), _dec7 = usingExtension(IntentBasedNavigation.override(IntentBasedNavigationOverride)), _dec8 = usingExtension(InternalIntentBasedNavigation.override({
|
|
68
51
|
getNavigationMode: function () {
|
|
69
52
|
var bIsStickyEditMode = this.getView().getController().getStickyEditMode && this.getView().getController().getStickyEditMode();
|
|
70
53
|
return bIsStickyEditMode ? "explace" : undefined;
|
|
71
54
|
}
|
|
72
|
-
})),
|
|
55
|
+
})), _dec9 = usingExtension(ViewState.override(ViewStateOverrides)), _dec10 = usingExtension(PageReady.override({
|
|
73
56
|
isContextExpected: function () {
|
|
74
57
|
return true;
|
|
75
58
|
}
|
|
76
|
-
})),
|
|
59
|
+
})), _dec11 = usingExtension(MassEdit), _dec12 = publicExtension(), _dec13 = finalExtension(), _dec14 = publicExtension(), _dec15 = extensible(OverrideExecution.After), _dec(_class = (_class2 = /*#__PURE__*/function (_PageController) {
|
|
77
60
|
_inheritsLoose(ObjectPageController, _PageController);
|
|
78
|
-
|
|
79
61
|
function ObjectPageController() {
|
|
80
62
|
var _this;
|
|
81
|
-
|
|
82
63
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
83
64
|
args[_key] = arguments[_key];
|
|
84
65
|
}
|
|
85
|
-
|
|
86
66
|
_this = _PageController.call.apply(_PageController, [this].concat(args)) || this;
|
|
87
|
-
|
|
88
67
|
_initializerDefineProperty(_this, "placeholder", _descriptor, _assertThisInitialized(_this));
|
|
89
|
-
|
|
90
|
-
_initializerDefineProperty(_this, "
|
|
91
|
-
|
|
92
|
-
_initializerDefineProperty(_this, "
|
|
93
|
-
|
|
94
|
-
_initializerDefineProperty(_this, "
|
|
95
|
-
|
|
96
|
-
_initializerDefineProperty(_this, "
|
|
97
|
-
|
|
98
|
-
_initializerDefineProperty(_this, "paginator", _descriptor6, _assertThisInitialized(_this));
|
|
99
|
-
|
|
100
|
-
_initializerDefineProperty(_this, "messageHandler", _descriptor7, _assertThisInitialized(_this));
|
|
101
|
-
|
|
102
|
-
_initializerDefineProperty(_this, "intentBasedNavigation", _descriptor8, _assertThisInitialized(_this));
|
|
103
|
-
|
|
104
|
-
_initializerDefineProperty(_this, "_intentBasedNavigation", _descriptor9, _assertThisInitialized(_this));
|
|
105
|
-
|
|
106
|
-
_initializerDefineProperty(_this, "viewState", _descriptor10, _assertThisInitialized(_this));
|
|
107
|
-
|
|
108
|
-
_initializerDefineProperty(_this, "pageReady", _descriptor11, _assertThisInitialized(_this));
|
|
109
|
-
|
|
110
|
-
_initializerDefineProperty(_this, "massEdit", _descriptor12, _assertThisInitialized(_this));
|
|
111
|
-
|
|
68
|
+
_initializerDefineProperty(_this, "share", _descriptor2, _assertThisInitialized(_this));
|
|
69
|
+
_initializerDefineProperty(_this, "_routing", _descriptor3, _assertThisInitialized(_this));
|
|
70
|
+
_initializerDefineProperty(_this, "paginator", _descriptor4, _assertThisInitialized(_this));
|
|
71
|
+
_initializerDefineProperty(_this, "messageHandler", _descriptor5, _assertThisInitialized(_this));
|
|
72
|
+
_initializerDefineProperty(_this, "intentBasedNavigation", _descriptor6, _assertThisInitialized(_this));
|
|
73
|
+
_initializerDefineProperty(_this, "_intentBasedNavigation", _descriptor7, _assertThisInitialized(_this));
|
|
74
|
+
_initializerDefineProperty(_this, "viewState", _descriptor8, _assertThisInitialized(_this));
|
|
75
|
+
_initializerDefineProperty(_this, "pageReady", _descriptor9, _assertThisInitialized(_this));
|
|
76
|
+
_initializerDefineProperty(_this, "massEdit", _descriptor10, _assertThisInitialized(_this));
|
|
112
77
|
_this.handlers = {
|
|
113
78
|
/**
|
|
114
79
|
* Invokes the page primary action on press of Ctrl+Enter.
|
|
@@ -130,13 +95,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
130
95
|
*/
|
|
131
96
|
onPrimaryAction: function (oController, oView, oContext, sActionName, mParameters, mConditions) {
|
|
132
97
|
var iViewLevel = oController.getView().getViewData().viewLevel,
|
|
133
|
-
|
|
134
|
-
|
|
98
|
+
oObjectPage = oController._getObjectPageLayoutControl();
|
|
135
99
|
if (mConditions.positiveActionVisible) {
|
|
136
100
|
if (mConditions.positiveActionEnabled) {
|
|
137
101
|
oController.handlers.onCallAction(oView, sActionName, mParameters);
|
|
138
102
|
}
|
|
139
|
-
} else if (mConditions.editActionVisible
|
|
103
|
+
} else if (mConditions.editActionVisible) {
|
|
140
104
|
if (mConditions.editActionEnabled) {
|
|
141
105
|
oController._editDocument(oContext);
|
|
142
106
|
}
|
|
@@ -148,40 +112,31 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
148
112
|
},
|
|
149
113
|
onTableContextChange: function (oEvent) {
|
|
150
114
|
var _this2 = this;
|
|
151
|
-
|
|
152
115
|
var oSource = oEvent.getSource();
|
|
153
116
|
var oTable;
|
|
154
|
-
|
|
155
117
|
this._findTables().some(function (_oTable) {
|
|
156
118
|
if (_oTable.getRowBinding() === oSource) {
|
|
157
119
|
oTable = _oTable;
|
|
158
120
|
return true;
|
|
159
121
|
}
|
|
160
|
-
|
|
161
122
|
return false;
|
|
162
123
|
});
|
|
163
|
-
|
|
164
124
|
var oCurrentActionPromise = this._editFlow.getCurrentActionPromise();
|
|
165
|
-
|
|
166
125
|
if (oCurrentActionPromise) {
|
|
167
126
|
var aTableContexts;
|
|
168
|
-
|
|
169
127
|
if (oTable.getType().getMetadata().isA("sap.ui.mdc.table.GridTableType")) {
|
|
170
128
|
aTableContexts = oSource.getContexts(0);
|
|
171
129
|
} else {
|
|
172
130
|
aTableContexts = oSource.getCurrentContexts();
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
|
|
131
|
+
}
|
|
132
|
+
//if contexts are not fully loaded the getcontexts function above will trigger a new change event call
|
|
176
133
|
if (!aTableContexts[0]) {
|
|
177
134
|
return;
|
|
178
135
|
}
|
|
179
|
-
|
|
180
136
|
oCurrentActionPromise.then(function (oActionResponse) {
|
|
181
137
|
if (!oActionResponse || oActionResponse.controlId !== oTable.sId) {
|
|
182
138
|
return;
|
|
183
139
|
}
|
|
184
|
-
|
|
185
140
|
var oActionData = oActionResponse.oData;
|
|
186
141
|
var aKeys = oActionResponse.keys;
|
|
187
142
|
var iNewItemp = -1;
|
|
@@ -190,20 +145,16 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
190
145
|
var bCompare = aKeys.every(function (sKey) {
|
|
191
146
|
return oTableData[sKey] === oActionData[sKey];
|
|
192
147
|
});
|
|
193
|
-
|
|
194
148
|
if (bCompare) {
|
|
195
149
|
iNewItemp = i;
|
|
196
150
|
}
|
|
197
|
-
|
|
198
151
|
return bCompare;
|
|
199
152
|
});
|
|
200
|
-
|
|
201
153
|
if (iNewItemp !== -1) {
|
|
202
154
|
var aDialogs = InstanceManager.getOpenDialogs();
|
|
203
155
|
var oDialog = aDialogs.length > 0 ? aDialogs.find(function (dialog) {
|
|
204
156
|
return dialog.data("FullScreenDialog") !== true;
|
|
205
157
|
}) : null;
|
|
206
|
-
|
|
207
158
|
if (oDialog) {
|
|
208
159
|
// by design, a sap.m.dialog set the focus to the previous focused element when closing.
|
|
209
160
|
// we should wait for the dialog to be close before to focus another element
|
|
@@ -213,18 +164,15 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
213
164
|
} else {
|
|
214
165
|
oTable.focusRow(iNewItemp, true);
|
|
215
166
|
}
|
|
216
|
-
|
|
217
167
|
_this2._editFlow.deleteCurrentActionPromise();
|
|
218
168
|
}
|
|
219
169
|
}).catch(function (err) {
|
|
220
170
|
Log.error("An error occurs while scrolling to the newly created Item: ".concat(err));
|
|
221
171
|
});
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
|
|
172
|
+
}
|
|
173
|
+
// fire ModelContextChange on the message button whenever the table context changes
|
|
225
174
|
this.messageButton.fireModelContextChange();
|
|
226
175
|
},
|
|
227
|
-
|
|
228
176
|
/**
|
|
229
177
|
* Invokes an action - bound/unbound and sets the page dirty.
|
|
230
178
|
*
|
|
@@ -244,12 +192,10 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
244
192
|
onDataPointTitlePressed: function (oController, oSource, oManifestOutbound, sControlConfig, sCollectionPath) {
|
|
245
193
|
oManifestOutbound = typeof oManifestOutbound === "string" ? JSON.parse(oManifestOutbound) : oManifestOutbound;
|
|
246
194
|
var oTargetInfo = oManifestOutbound[sControlConfig],
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
195
|
+
aSemanticObjectMapping = CommonUtils.getSemanticObjectMapping(oTargetInfo),
|
|
196
|
+
oDataPointOrChartBindingContext = oSource.getBindingContext(),
|
|
197
|
+
sMetaPath = oDataPointOrChartBindingContext.getModel().getMetaModel().getMetaPath(oDataPointOrChartBindingContext.getPath());
|
|
251
198
|
var aNavigationData = oController._getChartContextData(oDataPointOrChartBindingContext, sCollectionPath);
|
|
252
|
-
|
|
253
199
|
var additionalNavigationParameters;
|
|
254
200
|
aNavigationData = aNavigationData.map(function (oNavigationData) {
|
|
255
201
|
return {
|
|
@@ -257,15 +203,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
257
203
|
metaPath: sMetaPath + (sCollectionPath ? "/".concat(sCollectionPath) : "")
|
|
258
204
|
};
|
|
259
205
|
});
|
|
260
|
-
|
|
261
206
|
if (oTargetInfo && oTargetInfo.parameters) {
|
|
262
207
|
var oParams = oTargetInfo.parameters && oController._intentBasedNavigation.getOutboundParams(oTargetInfo.parameters);
|
|
263
|
-
|
|
264
208
|
if (Object.keys(oParams).length > 0) {
|
|
265
209
|
additionalNavigationParameters = oParams;
|
|
266
210
|
}
|
|
267
211
|
}
|
|
268
|
-
|
|
269
212
|
if (oTargetInfo && oTargetInfo.semanticObject && oTargetInfo.action) {
|
|
270
213
|
oController._intentBasedNavigation.navigate(oTargetInfo.semanticObject, oTargetInfo.action, {
|
|
271
214
|
navigationContexts: aNavigationData,
|
|
@@ -274,7 +217,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
274
217
|
});
|
|
275
218
|
}
|
|
276
219
|
},
|
|
277
|
-
|
|
278
220
|
/**
|
|
279
221
|
* Triggers an outbound navigation when a user chooses the chevron.
|
|
280
222
|
*
|
|
@@ -294,12 +236,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
294
236
|
this.getExtensionAPI().updateAppState();
|
|
295
237
|
this.bSectionNavigated = true;
|
|
296
238
|
var oInternalModelContext = this.getView().getBindingContext("internal");
|
|
297
|
-
|
|
298
239
|
var oObjectPage = this._getObjectPageLayoutControl();
|
|
299
|
-
|
|
300
240
|
if (oObjectPage.getModel("ui").getProperty("/isEditable") && this.getView().getViewData().sectionLayout === "Tabs" && oInternalModelContext.getProperty("errorNavigationSectionFlag") === false) {
|
|
301
241
|
var oSubSection = oEvent.getParameter("subSection");
|
|
302
|
-
|
|
303
242
|
this._updateFocusInEditMode([oSubSection]);
|
|
304
243
|
}
|
|
305
244
|
},
|
|
@@ -308,7 +247,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
308
247
|
},
|
|
309
248
|
onVariantSaved: function () {
|
|
310
249
|
var _this3 = this;
|
|
311
|
-
|
|
312
250
|
//TODO: Should remove this setTimeOut once Variant Management provides an api to fetch the current variant key on save
|
|
313
251
|
setTimeout(function () {
|
|
314
252
|
_this3.getExtensionAPI().updateAppState();
|
|
@@ -319,7 +257,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
319
257
|
var oObjectPage = oController.getView().byId("fe::ObjectPage");
|
|
320
258
|
var oSection;
|
|
321
259
|
var oSubSection;
|
|
322
|
-
|
|
323
260
|
if (oDetailConfig.sectionId) {
|
|
324
261
|
oSection = oController.getView().byId(oDetailConfig.sectionId);
|
|
325
262
|
oSubSection = oDetailConfig.subSectionId ? oController.getView().byId(oDetailConfig.subSectionId) : oSection && oSection.getSubSections() && oSection.getSubSections()[0];
|
|
@@ -327,7 +264,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
327
264
|
oSubSection = oController.getView().byId(oDetailConfig.subSectionId);
|
|
328
265
|
oSection = oSubSection && oSubSection.getParent();
|
|
329
266
|
}
|
|
330
|
-
|
|
331
267
|
if (!oSection || !oSubSection || !oSection.getVisible() || !oSubSection.getVisible()) {
|
|
332
268
|
oController.getView().getModel("sap.fe.i18n").getResourceBundle().then(function (oResourceBundle) {
|
|
333
269
|
var sTitle = CommonUtils.getTranslatedText("C_ROUTING_NAVIGATION_DISABLED_TITLE", oResourceBundle, undefined, oController.getView().getViewData().entitySet);
|
|
@@ -337,8 +273,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
337
273
|
Log.error(error);
|
|
338
274
|
});
|
|
339
275
|
} else {
|
|
340
|
-
oObjectPage.scrollToSection(oSubSection.getId());
|
|
341
|
-
|
|
276
|
+
oObjectPage.scrollToSection(oSubSection.getId());
|
|
277
|
+
// trigger iapp state change
|
|
342
278
|
oObjectPage.fireNavigate({
|
|
343
279
|
section: oSection,
|
|
344
280
|
subSection: oSubSection
|
|
@@ -357,37 +293,30 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
357
293
|
};
|
|
358
294
|
return _this;
|
|
359
295
|
}
|
|
360
|
-
|
|
361
296
|
var _proto = ObjectPageController.prototype;
|
|
362
|
-
|
|
363
297
|
_proto.getExtensionAPI = function getExtensionAPI(sId) {
|
|
364
298
|
if (sId) {
|
|
365
299
|
// to allow local ID usage for custom pages we'll create/return own instances for custom sections
|
|
366
300
|
this.mCustomSectionExtensionAPIs = this.mCustomSectionExtensionAPIs || {};
|
|
367
|
-
|
|
368
301
|
if (!this.mCustomSectionExtensionAPIs[sId]) {
|
|
369
302
|
this.mCustomSectionExtensionAPIs[sId] = new ExtensionAPI(this, sId);
|
|
370
303
|
}
|
|
371
|
-
|
|
372
304
|
return this.mCustomSectionExtensionAPIs[sId];
|
|
373
305
|
} else {
|
|
374
306
|
if (!this.extensionAPI) {
|
|
375
307
|
this.extensionAPI = new ExtensionAPI(this);
|
|
376
308
|
}
|
|
377
|
-
|
|
378
309
|
return this.extensionAPI;
|
|
379
310
|
}
|
|
380
311
|
};
|
|
381
|
-
|
|
382
312
|
_proto.onInit = function onInit() {
|
|
383
313
|
_PageController.prototype.onInit.call(this);
|
|
314
|
+
var oObjectPage = this._getObjectPageLayoutControl();
|
|
384
315
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
316
|
+
// Setting defaults of internal model context
|
|
388
317
|
var oInternalModelContext = this.getView().getBindingContext("internal");
|
|
389
318
|
oInternalModelContext === null || oInternalModelContext === void 0 ? void 0 : oInternalModelContext.setProperty("externalNavigationContext", {
|
|
390
|
-
|
|
319
|
+
page: true
|
|
391
320
|
});
|
|
392
321
|
oInternalModelContext === null || oInternalModelContext === void 0 ? void 0 : oInternalModelContext.setProperty("relatedApps", {
|
|
393
322
|
visibility: false,
|
|
@@ -395,58 +324,48 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
395
324
|
});
|
|
396
325
|
oInternalModelContext === null || oInternalModelContext === void 0 ? void 0 : oInternalModelContext.setProperty("batchGroups", this._getBatchGroupsForView());
|
|
397
326
|
oInternalModelContext === null || oInternalModelContext === void 0 ? void 0 : oInternalModelContext.setProperty("errorNavigationSectionFlag", false);
|
|
398
|
-
|
|
399
327
|
if (!this.getView().getViewData().useNewLazyLoading && oObjectPage.getEnableLazyLoading()) {
|
|
400
328
|
//Attaching the event to make the subsection context binding active when it is visible.
|
|
401
329
|
oObjectPage.attachEvent("subSectionEnteredViewPort", this._handleSubSectionEnteredViewPort.bind(this));
|
|
402
330
|
}
|
|
403
|
-
|
|
404
331
|
this.messageButton = this.getView().byId("fe::FooterBar::MessageButton");
|
|
405
332
|
this.messageButton.oItemBinding.attachChange(this._fnShowOPMessage, this);
|
|
333
|
+
oInternalModelContext === null || oInternalModelContext === void 0 ? void 0 : oInternalModelContext.setProperty("rootEditEnabled", true);
|
|
334
|
+
oInternalModelContext === null || oInternalModelContext === void 0 ? void 0 : oInternalModelContext.setProperty("rootEditVisible", true);
|
|
406
335
|
};
|
|
407
|
-
|
|
408
336
|
_proto.onExit = function onExit() {
|
|
409
337
|
if (this.mCustomSectionExtensionAPIs) {
|
|
410
338
|
for (var _i = 0, _Object$keys = Object.keys(this.mCustomSectionExtensionAPIs); _i < _Object$keys.length; _i++) {
|
|
411
339
|
var sId = _Object$keys[_i];
|
|
412
|
-
|
|
413
340
|
if (this.mCustomSectionExtensionAPIs[sId]) {
|
|
414
341
|
this.mCustomSectionExtensionAPIs[sId].destroy();
|
|
415
342
|
}
|
|
416
343
|
}
|
|
417
|
-
|
|
418
344
|
delete this.mCustomSectionExtensionAPIs;
|
|
419
345
|
}
|
|
420
|
-
|
|
421
346
|
if (this.extensionAPI) {
|
|
422
347
|
this.extensionAPI.destroy();
|
|
423
348
|
}
|
|
424
|
-
|
|
425
349
|
delete this.extensionAPI;
|
|
426
350
|
var oMessagePopover = this.messageButton ? this.messageButton.oMessagePopover : null;
|
|
427
|
-
|
|
428
351
|
if (oMessagePopover && oMessagePopover.isOpen()) {
|
|
429
352
|
oMessagePopover.close();
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
|
|
353
|
+
}
|
|
354
|
+
//when exiting we set keepAlive context to false
|
|
433
355
|
var oContext = this.getView().getBindingContext();
|
|
434
|
-
|
|
435
356
|
if (oContext && oContext.isKeepAlive()) {
|
|
436
357
|
oContext.setKeepAlive(false);
|
|
437
358
|
}
|
|
438
|
-
|
|
439
359
|
if (isConnected(this.getView())) {
|
|
440
360
|
disconnect(this.getView()); // Cleanup collaboration connection when leaving the app
|
|
441
361
|
}
|
|
442
362
|
}
|
|
363
|
+
|
|
443
364
|
/**
|
|
444
365
|
* Method to show the message strip on the object page.
|
|
445
366
|
*
|
|
446
367
|
* @private
|
|
447
|
-
|
|
448
|
-
;
|
|
449
|
-
|
|
368
|
+
*/;
|
|
450
369
|
_proto._fnShowOPMessage = function _fnShowOPMessage() {
|
|
451
370
|
var extensionAPI = this.getExtensionAPI();
|
|
452
371
|
var view = this.getView();
|
|
@@ -454,98 +373,85 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
454
373
|
return item.getBindingContext("message").getObject();
|
|
455
374
|
}).filter(function (message) {
|
|
456
375
|
var _view$getBindingConte;
|
|
457
|
-
|
|
458
376
|
return message.getTargets()[0] === ((_view$getBindingConte = view.getBindingContext()) === null || _view$getBindingConte === void 0 ? void 0 : _view$getBindingConte.getPath());
|
|
459
377
|
});
|
|
460
|
-
|
|
461
378
|
if (extensionAPI) {
|
|
462
379
|
extensionAPI.showMessages(messages);
|
|
463
380
|
}
|
|
464
381
|
};
|
|
465
|
-
|
|
466
382
|
_proto._getTableBinding = function _getTableBinding(oTable) {
|
|
467
383
|
return oTable && oTable.getRowBinding();
|
|
468
384
|
};
|
|
469
|
-
|
|
470
385
|
_proto.onBeforeRendering = function onBeforeRendering() {
|
|
471
386
|
var _this$oView$oViewData;
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
387
|
+
PageController.prototype.onBeforeRendering.apply(this);
|
|
388
|
+
// In the retrieveTextFromValueList scenario we need to ensure in case of reload/refresh that the meta model in the methode retrieveTextFromValueList of the FieldRuntime is available
|
|
475
389
|
if ((_this$oView$oViewData = this.oView.oViewData) !== null && _this$oView$oViewData !== void 0 && _this$oView$oViewData.retrieveTextFromValueList && CommonHelper.getMetaModel() === undefined) {
|
|
476
390
|
CommonHelper.setMetaModel(this.getAppComponent().getMetaModel());
|
|
477
391
|
}
|
|
478
392
|
};
|
|
479
|
-
|
|
480
393
|
_proto.onAfterRendering = function onAfterRendering() {
|
|
481
394
|
var _this4 = this;
|
|
482
|
-
|
|
483
395
|
this.getView().getModel("sap.fe.i18n").getResourceBundle().then(function (response) {
|
|
484
396
|
_this4.oResourceBundle = response;
|
|
485
397
|
}).catch(function (oError) {
|
|
486
398
|
Log.error("Error while retrieving the resource bundle", oError);
|
|
487
399
|
});
|
|
488
400
|
};
|
|
489
|
-
|
|
490
401
|
_proto._onBeforeBinding = function _onBeforeBinding(oContext, mParameters) {
|
|
491
402
|
var _this5 = this;
|
|
492
|
-
|
|
493
403
|
// TODO: we should check how this comes together with the transaction helper, same to the change in the afterBinding
|
|
494
404
|
var aTables = this._findTables(),
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
405
|
+
oObjectPage = this._getObjectPageLayoutControl(),
|
|
406
|
+
oInternalModelContext = this.getView().getBindingContext("internal"),
|
|
407
|
+
oInternalModel = this.getView().getModel("internal"),
|
|
408
|
+
aBatchGroups = oInternalModelContext.getProperty("batchGroups"),
|
|
409
|
+
iViewLevel = this.getView().getViewData().viewLevel;
|
|
501
410
|
var oFastCreationRow;
|
|
502
411
|
aBatchGroups.push("$auto");
|
|
503
|
-
|
|
504
412
|
if (mParameters.bDraftNavigation !== true) {
|
|
505
413
|
this._closeSideContent();
|
|
506
414
|
}
|
|
507
|
-
|
|
508
415
|
var opContext = oObjectPage.getBindingContext();
|
|
509
|
-
|
|
510
416
|
if (opContext && opContext.hasPendingChanges() && !aBatchGroups.some(opContext.getModel().hasPendingChanges.bind(opContext.getModel()))) {
|
|
511
417
|
/* In case there are pending changes for the creation row and no others we need to reset the changes
|
|
512
418
|
TODO: this is just a quick solution, this needs to be reworked
|
|
513
419
|
*/
|
|
514
|
-
opContext.getBinding().resetChanges();
|
|
515
|
-
} // For now we have to set the binding context to null for every fast creation row
|
|
516
|
-
// TODO: Get rid of this coding or move it to another layer - to be discussed with MDC and model
|
|
517
420
|
|
|
421
|
+
opContext.getBinding().resetChanges();
|
|
422
|
+
}
|
|
518
423
|
|
|
424
|
+
// For now we have to set the binding context to null for every fast creation row
|
|
425
|
+
// TODO: Get rid of this coding or move it to another layer - to be discussed with MDC and model
|
|
519
426
|
for (var i = 0; i < aTables.length; i++) {
|
|
520
427
|
oFastCreationRow = aTables[i].getCreationRow();
|
|
521
|
-
|
|
522
428
|
if (oFastCreationRow) {
|
|
523
429
|
oFastCreationRow.setBindingContext(null);
|
|
524
430
|
}
|
|
525
|
-
}
|
|
526
|
-
|
|
431
|
+
}
|
|
527
432
|
|
|
433
|
+
// Scroll to present Section so that bindings are enabled during navigation through paginator buttons, as there is no view rerendering/rebind
|
|
528
434
|
var fnScrollToPresentSection = function () {
|
|
529
435
|
if (!oObjectPage.isFirstRendering() && !mParameters.bPersistOPScroll) {
|
|
530
436
|
oObjectPage.setSelectedSection(null);
|
|
531
437
|
}
|
|
532
438
|
};
|
|
439
|
+
oObjectPage.attachEventOnce("modelContextChange", fnScrollToPresentSection);
|
|
533
440
|
|
|
534
|
-
|
|
441
|
+
// if the structure of the ObjectPageLayout is changed then scroll to present Section
|
|
535
442
|
// FIXME Is this really working as intended ? Initially this was onBeforeRendering, but never triggered onBeforeRendering because it was registered after it
|
|
536
|
-
|
|
537
443
|
var oDelegateOnBefore = {
|
|
538
444
|
onAfterRendering: fnScrollToPresentSection
|
|
539
445
|
};
|
|
540
446
|
oObjectPage.addEventDelegate(oDelegateOnBefore, this);
|
|
541
447
|
this.pageReady.attachEventOnce("pageReady", function () {
|
|
542
448
|
oObjectPage.removeEventDelegate(oDelegateOnBefore);
|
|
543
|
-
});
|
|
449
|
+
});
|
|
544
450
|
|
|
451
|
+
//Set the Binding for Paginators using ListBinding ID
|
|
545
452
|
if (iViewLevel > 1) {
|
|
546
453
|
var oBinding = mParameters && mParameters.listBinding;
|
|
547
454
|
var oPaginatorCurrentContext = oInternalModel.getProperty("/paginatorCurrentContext");
|
|
548
|
-
|
|
549
455
|
if (oPaginatorCurrentContext) {
|
|
550
456
|
var oBindingToUse = oPaginatorCurrentContext.getBinding();
|
|
551
457
|
this.paginator.initialize(oBindingToUse, oPaginatorCurrentContext);
|
|
@@ -557,20 +463,16 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
557
463
|
// if the binding type is not ODataListBinding because of a deeplink navigation or a refresh of the page
|
|
558
464
|
// we need to create it
|
|
559
465
|
var sBindingPath = oBinding.getPath();
|
|
560
|
-
|
|
561
466
|
if (/\([^\)]*\)$/.test(sBindingPath)) {
|
|
562
467
|
// The current binding path ends with (xxx), so we create the listBinding by removing (xxx)
|
|
563
468
|
var sListBindingPath = sBindingPath.replace(/\([^\)]*\)$/, "");
|
|
564
469
|
oBinding = new ODataListBinding(oBinding.oModel, sListBindingPath);
|
|
565
|
-
|
|
566
470
|
var _setListBindingAsync = function () {
|
|
567
471
|
if (oBinding.getContexts().length > 0) {
|
|
568
472
|
_this5.paginator.initialize(oBinding, oContext);
|
|
569
|
-
|
|
570
473
|
oBinding.detachEvent("change", _setListBindingAsync);
|
|
571
474
|
}
|
|
572
475
|
};
|
|
573
|
-
|
|
574
476
|
oBinding.getContexts(0);
|
|
575
477
|
oBinding.attachEvent("change", _setListBindingAsync);
|
|
576
478
|
} else {
|
|
@@ -580,23 +482,19 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
580
482
|
}
|
|
581
483
|
}
|
|
582
484
|
}
|
|
583
|
-
|
|
584
485
|
if (!this.getView().getViewData().useNewLazyLoading && oObjectPage.getEnableLazyLoading()) {
|
|
585
486
|
var aSections = oObjectPage.getSections();
|
|
586
487
|
var bUseIconTabBar = oObjectPage.getUseIconTabBar();
|
|
587
488
|
var iSkip = 2;
|
|
588
489
|
var bIsInEditMode = oObjectPage.getModel("ui").getProperty("/isEditable");
|
|
589
490
|
var bEditableHeader = this.getView().getViewData().editableHeaderContent;
|
|
590
|
-
|
|
591
491
|
for (var iSection = 0; iSection < aSections.length; iSection++) {
|
|
592
492
|
var oSection = aSections[iSection];
|
|
593
493
|
var aSubSections = oSection.getSubSections();
|
|
594
|
-
|
|
595
494
|
for (var iSubSection = 0; iSubSection < aSubSections.length; iSubSection++, iSkip--) {
|
|
596
495
|
// In IconTabBar mode keep the second section bound if there is an editable header and we are switching to display mode
|
|
597
496
|
if (iSkip < 1 || bUseIconTabBar && (iSection > 1 || iSection === 1 && !bEditableHeader && !bIsInEditMode)) {
|
|
598
497
|
var oSubSection = aSubSections[iSubSection];
|
|
599
|
-
|
|
600
498
|
if (oSubSection.data().isVisibilityDynamic !== "true") {
|
|
601
499
|
oSubSection.setBindingContext(null);
|
|
602
500
|
}
|
|
@@ -604,21 +502,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
604
502
|
}
|
|
605
503
|
}
|
|
606
504
|
}
|
|
607
|
-
|
|
608
505
|
if (this.placeholder.isPlaceholderEnabled() && mParameters.showPlaceholder) {
|
|
609
506
|
var oView = this.getView();
|
|
610
507
|
var oNavContainer = oView.getParent().oContainer.getParent();
|
|
611
|
-
|
|
612
508
|
if (oNavContainer) {
|
|
613
509
|
oNavContainer.showPlaceholder({});
|
|
614
510
|
}
|
|
615
511
|
}
|
|
616
512
|
};
|
|
617
|
-
|
|
618
513
|
_proto._getFirstClickableElement = function _getFirstClickableElement(oObjectPage) {
|
|
619
514
|
var oFirstClickableElement;
|
|
620
515
|
var aActions = oObjectPage.getHeaderTitle() && oObjectPage.getHeaderTitle().getActions();
|
|
621
|
-
|
|
622
516
|
if (aActions && aActions.length) {
|
|
623
517
|
oFirstClickableElement = aActions.find(function (oAction) {
|
|
624
518
|
// Due to the left alignment of the Draft switch and the collaborative draft avatar controls
|
|
@@ -633,34 +527,29 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
633
527
|
}
|
|
634
528
|
});
|
|
635
529
|
}
|
|
636
|
-
|
|
637
530
|
return oFirstClickableElement;
|
|
638
531
|
};
|
|
639
|
-
|
|
640
532
|
_proto._getFirstEmptyMandatoryFieldFromSubSection = function _getFirstEmptyMandatoryFieldFromSubSection(aSubSections) {
|
|
641
533
|
if (aSubSections) {
|
|
642
534
|
for (var subSection = 0; subSection < aSubSections.length; subSection++) {
|
|
643
535
|
var aBlocks = aSubSections[subSection].getBlocks();
|
|
644
|
-
|
|
645
536
|
if (aBlocks) {
|
|
646
537
|
for (var block = 0; block < aBlocks.length; block++) {
|
|
647
538
|
var aFormContainers = void 0;
|
|
648
|
-
|
|
649
539
|
if (aBlocks[block].isA("sap.ui.layout.form.Form")) {
|
|
650
540
|
aFormContainers = aBlocks[block].getFormContainers();
|
|
651
541
|
} else if (aBlocks[block].getContent && aBlocks[block].getContent() && aBlocks[block].getContent().isA("sap.ui.layout.form.Form")) {
|
|
652
542
|
aFormContainers = aBlocks[block].getContent().getFormContainers();
|
|
653
543
|
}
|
|
654
|
-
|
|
655
544
|
if (aFormContainers) {
|
|
656
545
|
for (var formContainer = 0; formContainer < aFormContainers.length; formContainer++) {
|
|
657
546
|
var aFormElements = aFormContainers[formContainer].getFormElements();
|
|
658
|
-
|
|
659
547
|
if (aFormElements) {
|
|
660
548
|
for (var formElement = 0; formElement < aFormElements.length; formElement++) {
|
|
661
|
-
var aFields = aFormElements[formElement].getFields();
|
|
662
|
-
// So we need to check whether it has a getRequired method
|
|
549
|
+
var aFields = aFormElements[formElement].getFields();
|
|
663
550
|
|
|
551
|
+
// The first field is not necessarily an InputBase (e.g. could be a Text)
|
|
552
|
+
// So we need to check whether it has a getRequired method
|
|
664
553
|
try {
|
|
665
554
|
if (aFields[0].getRequired && aFields[0].getRequired() && !aFields[0].getValue()) {
|
|
666
555
|
return aFields[0];
|
|
@@ -676,23 +565,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
676
565
|
}
|
|
677
566
|
}
|
|
678
567
|
}
|
|
679
|
-
|
|
680
568
|
return undefined;
|
|
681
569
|
};
|
|
682
|
-
|
|
683
570
|
_proto._updateFocusInEditMode = function _updateFocusInEditMode(aSubSections) {
|
|
684
571
|
var oObjectPage = this._getObjectPageLayoutControl();
|
|
685
|
-
|
|
686
572
|
var oMandatoryField = this._getFirstEmptyMandatoryFieldFromSubSection(aSubSections);
|
|
687
|
-
|
|
688
573
|
var oFieldToFocus;
|
|
689
|
-
|
|
690
574
|
if (oMandatoryField) {
|
|
691
575
|
oFieldToFocus = oMandatoryField.content.getContentEdit()[0];
|
|
692
576
|
} else {
|
|
693
577
|
oFieldToFocus = oObjectPage._getFirstEditableInput() || this._getFirstClickableElement(oObjectPage);
|
|
694
578
|
}
|
|
695
|
-
|
|
696
579
|
if (oFieldToFocus) {
|
|
697
580
|
setTimeout(function () {
|
|
698
581
|
// We set the focus in a timeeout, otherwise the focus sometimes goes to the TabBar
|
|
@@ -700,15 +583,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
700
583
|
}, 0);
|
|
701
584
|
}
|
|
702
585
|
};
|
|
703
|
-
|
|
704
586
|
_proto._handleSubSectionEnteredViewPort = function _handleSubSectionEnteredViewPort(oEvent) {
|
|
705
587
|
var oSubSection = oEvent.getParameter("subSection");
|
|
706
588
|
oSubSection.setBindingContext(undefined);
|
|
707
589
|
};
|
|
708
|
-
|
|
709
590
|
_proto._onBackNavigationInDraft = function _onBackNavigationInDraft(oContext) {
|
|
710
591
|
this.messageHandler.removeTransitionMessages();
|
|
711
|
-
|
|
712
592
|
if (this.getAppComponent().getRouterProxy().checkIfBackHasSameContext()) {
|
|
713
593
|
// Back nav will keep the same context --> no need to display the dialog
|
|
714
594
|
history.back();
|
|
@@ -717,15 +597,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
717
597
|
history.back();
|
|
718
598
|
}, Function.prototype, oContext, this, false, draft.NavigationType.BackNavigation);
|
|
719
599
|
}
|
|
720
|
-
}
|
|
721
|
-
;
|
|
600
|
+
}
|
|
722
601
|
|
|
602
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
603
|
+
;
|
|
723
604
|
_proto._onAfterBinding = function _onAfterBinding(oBindingContext, mParameters) {
|
|
724
605
|
var _this6 = this;
|
|
725
|
-
|
|
726
606
|
// TODO: this should be moved into an init event of the MDC tables (not yet existing) and should be part
|
|
727
607
|
// of any controller extension
|
|
728
|
-
|
|
729
608
|
/**
|
|
730
609
|
* @param oTable
|
|
731
610
|
* @param oListBinding
|
|
@@ -734,7 +613,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
734
613
|
try {
|
|
735
614
|
var oFastCreationRow = oTable.getCreationRow();
|
|
736
615
|
var oFastCreationListBinding, oFastCreationContext;
|
|
737
|
-
|
|
738
616
|
var _temp5 = function () {
|
|
739
617
|
if (oFastCreationRow) {
|
|
740
618
|
var _temp6 = _catch(function () {
|
|
@@ -744,61 +622,54 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
744
622
|
oFastCreationListBinding = oModel.bindList(oListBinding.getPath(), oListBinding.getContext(), [], [], {
|
|
745
623
|
$$updateGroupId: "doNotSubmit",
|
|
746
624
|
$$groupId: "doNotSubmit"
|
|
747
|
-
});
|
|
748
|
-
|
|
625
|
+
});
|
|
626
|
+
// Workaround suggested by OData model v4 colleagues
|
|
749
627
|
oFastCreationListBinding.refreshInternal = function () {
|
|
750
628
|
/* do nothing */
|
|
751
629
|
};
|
|
752
|
-
|
|
753
630
|
oFastCreationContext = oFastCreationListBinding.create();
|
|
754
|
-
oFastCreationRow.setBindingContext(oFastCreationContext);
|
|
631
|
+
oFastCreationRow.setBindingContext(oFastCreationContext);
|
|
755
632
|
|
|
633
|
+
// this is needed to avoid console error
|
|
756
634
|
var _temp7 = _catch(function () {
|
|
757
635
|
return Promise.resolve(oFastCreationContext.created()).then(function () {});
|
|
758
636
|
}, function () {
|
|
759
637
|
Log.trace("transient fast creation context deleted");
|
|
760
638
|
});
|
|
761
|
-
|
|
762
639
|
if (_temp7 && _temp7.then) return _temp7.then(function () {});
|
|
763
640
|
}
|
|
764
641
|
}();
|
|
765
|
-
|
|
766
642
|
if (_temp2 && _temp2.then) return _temp2.then(function () {});
|
|
767
643
|
});
|
|
768
644
|
}, function (oError) {
|
|
769
645
|
Log.error("Error while computing the final UI state", oError);
|
|
770
646
|
});
|
|
771
|
-
|
|
772
647
|
if (_temp6 && _temp6.then) return _temp6.then(function () {});
|
|
773
648
|
}
|
|
774
649
|
}();
|
|
775
|
-
|
|
776
650
|
return Promise.resolve(_temp5 && _temp5.then ? _temp5.then(function () {}) : void 0);
|
|
777
651
|
} catch (e) {
|
|
778
652
|
return Promise.reject(e);
|
|
779
653
|
}
|
|
780
654
|
}; // this should not be needed at the all
|
|
781
|
-
|
|
782
655
|
/**
|
|
783
656
|
* @param oTable
|
|
784
657
|
*/
|
|
785
|
-
|
|
786
|
-
|
|
787
658
|
var oObjectPage = this._getObjectPageLayoutControl();
|
|
788
|
-
|
|
789
659
|
var aTables = this._findTables();
|
|
660
|
+
this._sideEffects.clearPropertiesStatus();
|
|
790
661
|
|
|
791
|
-
|
|
662
|
+
// TODO: this is only a temp solution as long as the model fix the cache issue and we use this additional
|
|
792
663
|
// binding with ownRequest
|
|
793
|
-
|
|
794
|
-
|
|
795
664
|
oBindingContext = oObjectPage.getBindingContext();
|
|
796
665
|
var aIBNActions = [];
|
|
797
666
|
oObjectPage.getSections().forEach(function (oSection) {
|
|
798
667
|
oSection.getSubSections().forEach(function (oSubSection) {
|
|
799
668
|
aIBNActions = CommonUtils.getIBNActions(oSubSection, aIBNActions);
|
|
800
669
|
});
|
|
801
|
-
});
|
|
670
|
+
});
|
|
671
|
+
|
|
672
|
+
// Assign internal binding contexts to oFormContainer:
|
|
802
673
|
// 1. It is not possible to assign the internal binding context to the XML fragment
|
|
803
674
|
// (FormContainer.fragment.xml) yet - it is used already for the data-structure.
|
|
804
675
|
// 2. Another problem is, that FormContainers assigned to a 'MoreBlock' does not have an
|
|
@@ -808,49 +679,45 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
808
679
|
var oInternalModelContext = oTable.getBindingContext("internal");
|
|
809
680
|
oInternalModelContext.setProperty("creationRowFieldValidity", {});
|
|
810
681
|
oInternalModelContext.setProperty("creationRowCustomValidity", {});
|
|
811
|
-
aIBNActions = CommonUtils.getIBNActions(oTable, aIBNActions);
|
|
682
|
+
aIBNActions = CommonUtils.getIBNActions(oTable, aIBNActions);
|
|
683
|
+
// temporary workaround for BCP: 2080218004
|
|
812
684
|
// Need to fix with BLI: FIORITECHP1-15274
|
|
813
685
|
// only for edit mode, we clear the table cache
|
|
814
686
|
// Workaround starts here!!
|
|
815
|
-
|
|
816
687
|
var oTableRowBinding = oTable.getRowBinding();
|
|
817
|
-
|
|
818
688
|
if (oTableRowBinding) {
|
|
819
689
|
if (ModelHelper.isStickySessionSupported(oTableRowBinding.getModel().getMetaModel())) {
|
|
820
690
|
// apply for both edit and display mode in sticky
|
|
821
691
|
oTableRowBinding.removeCachesAndMessages("");
|
|
822
692
|
}
|
|
823
|
-
}
|
|
693
|
+
}
|
|
694
|
+
// Workaround ends here!!
|
|
695
|
+
|
|
824
696
|
// Update 'enabled' property of DataFieldForAction buttons on table toolbar
|
|
825
697
|
// The same is also performed on Table selectionChange event
|
|
826
|
-
|
|
827
|
-
|
|
828
698
|
var oActionOperationAvailableMap = JSON.parse(CommonHelper.parseCustomData(DelegateUtil.getCustomData(oTable, "operationAvailableMap"))),
|
|
829
|
-
|
|
830
|
-
ActionRuntime.setActionEnablement(oInternalModelContext, oActionOperationAvailableMap, aSelectedContexts, "table");
|
|
831
|
-
|
|
699
|
+
aSelectedContexts = oTable.getSelectedContexts();
|
|
700
|
+
ActionRuntime.setActionEnablement(oInternalModelContext, oActionOperationAvailableMap, aSelectedContexts, "table");
|
|
701
|
+
// Clear the selection in the table, need to be fixed and review with BLI: FIORITECHP1-24318
|
|
832
702
|
oTable.clearSelection();
|
|
833
703
|
});
|
|
834
|
-
CommonUtils.getSemanticTargetsFromPageModel(this, "_pageModel");
|
|
835
|
-
|
|
704
|
+
CommonUtils.getSemanticTargetsFromPageModel(this, "_pageModel");
|
|
705
|
+
//Retrieve Object Page header actions from Object Page title control
|
|
836
706
|
var oObjectPageTitle = oObjectPage.getHeaderTitle();
|
|
837
707
|
var aIBNHeaderActions = [];
|
|
838
708
|
aIBNHeaderActions = CommonUtils.getIBNActions(oObjectPageTitle, aIBNHeaderActions);
|
|
839
709
|
aIBNActions = aIBNActions.concat(aIBNHeaderActions);
|
|
840
710
|
CommonUtils.updateDataFieldForIBNButtonsVisibility(aIBNActions, this.getView());
|
|
841
711
|
var oModel, oFinalUIState;
|
|
842
|
-
|
|
843
712
|
var handleTableModifications = function (oTable) {
|
|
844
713
|
var oBinding = _this6._getTableBinding(oTable),
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
714
|
+
fnHandleTablePatchEvents = function () {
|
|
715
|
+
enableFastCreationRow(oTable, oBinding);
|
|
716
|
+
};
|
|
849
717
|
if (!oBinding) {
|
|
850
718
|
Log.error("Expected binding missing for table: ".concat(oTable.getId()));
|
|
851
719
|
return;
|
|
852
720
|
}
|
|
853
|
-
|
|
854
721
|
if (oBinding.oContext) {
|
|
855
722
|
fnHandleTablePatchEvents();
|
|
856
723
|
} else {
|
|
@@ -860,16 +727,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
860
727
|
oBinding.detachChange(fnHandleChange);
|
|
861
728
|
}
|
|
862
729
|
};
|
|
863
|
-
|
|
864
730
|
oBinding.attachChange(fnHandleChange);
|
|
865
731
|
}
|
|
866
732
|
};
|
|
867
|
-
|
|
868
733
|
if (oBindingContext) {
|
|
869
|
-
oModel = oBindingContext.getModel();
|
|
734
|
+
oModel = oBindingContext.getModel();
|
|
870
735
|
|
|
736
|
+
// Compute Edit Mode
|
|
871
737
|
oFinalUIState = this._editFlow.computeEditMode(oBindingContext);
|
|
872
|
-
|
|
873
738
|
if (ModelHelper.isCollaborationDraftSupported(oModel.getMetaModel())) {
|
|
874
739
|
oFinalUIState.then(function () {
|
|
875
740
|
if (_this6.getView().getModel("ui").getProperty("/isEditable")) {
|
|
@@ -880,76 +745,67 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
880
745
|
}).catch(function (oError) {
|
|
881
746
|
Log.error("Error while waiting for the final UI State", oError);
|
|
882
747
|
});
|
|
883
|
-
}
|
|
748
|
+
}
|
|
749
|
+
// update related apps once Data is received in case of binding cache is not available
|
|
884
750
|
// TODO: this is only a temp solution since we need to call _updateRelatedApps method only after data for Object Page is received (if there is no binding)
|
|
885
|
-
|
|
886
|
-
|
|
887
751
|
if (oBindingContext.getBinding().oCache) {
|
|
888
752
|
this._updateRelatedApps();
|
|
889
753
|
} else {
|
|
890
754
|
var fnUpdateRelatedApps = function () {
|
|
891
755
|
_this6._updateRelatedApps();
|
|
892
|
-
|
|
893
756
|
oBindingContext.getBinding().detachDataReceived(fnUpdateRelatedApps);
|
|
894
757
|
};
|
|
895
|
-
|
|
896
758
|
oBindingContext.getBinding().attachDataReceived(fnUpdateRelatedApps);
|
|
897
|
-
}
|
|
898
|
-
|
|
759
|
+
}
|
|
899
760
|
|
|
900
|
-
|
|
761
|
+
//Attach the patch sent and patch completed event to the object page binding so that we can react
|
|
762
|
+
var oBinding = oBindingContext.getBinding && oBindingContext.getBinding() || oBindingContext;
|
|
901
763
|
|
|
764
|
+
// Attach the event handler only once to the same binding
|
|
902
765
|
if (this.currentBinding !== oBinding) {
|
|
903
766
|
oBinding.attachEvent("patchSent", this.editFlow.handlePatchSent, this);
|
|
904
767
|
this.currentBinding = oBinding;
|
|
905
768
|
}
|
|
906
|
-
|
|
907
769
|
aTables.forEach(function (oTable) {
|
|
908
770
|
// access binding only after table is bound
|
|
909
771
|
TableUtils.whenBound(oTable).then(handleTableModifications).catch(function (oError) {
|
|
910
772
|
Log.error("Error while waiting for the table to be bound", oError);
|
|
911
773
|
});
|
|
912
774
|
});
|
|
913
|
-
|
|
914
775
|
if (!this.getView().getViewData().useNewLazyLoading) {
|
|
915
776
|
// should be called only after binding is ready hence calling it in onAfterBinding
|
|
916
777
|
oObjectPage._triggerVisibleSubSectionsEvents();
|
|
917
778
|
}
|
|
779
|
+
|
|
780
|
+
//To Compute the Edit Binding of the subObject page using root object page, create a context for draft root and update the edit button in sub OP using the context
|
|
781
|
+
ActionRuntime.updateEditButtonVisibilityAndEnablement(this.getView());
|
|
918
782
|
}
|
|
919
783
|
};
|
|
920
|
-
|
|
921
784
|
_proto.onPageReady = function onPageReady(mParameters) {
|
|
922
785
|
var _this7 = this;
|
|
923
|
-
|
|
924
786
|
var setFocus = function () {
|
|
925
787
|
// Set the focus to the first action button, or to the first editable input if in editable mode
|
|
926
788
|
var oObjectPage = _this7._getObjectPageLayoutControl();
|
|
927
|
-
|
|
928
789
|
var isInDisplayMode = !oObjectPage.getModel("ui").getProperty("/isEditable");
|
|
929
|
-
|
|
930
790
|
if (isInDisplayMode) {
|
|
931
791
|
var oFirstClickableElement = _this7._getFirstClickableElement(oObjectPage);
|
|
932
|
-
|
|
933
792
|
if (oFirstClickableElement) {
|
|
934
793
|
oFirstClickableElement.focus();
|
|
935
794
|
}
|
|
936
795
|
} else {
|
|
937
796
|
var oSelectedSection = Core.byId(oObjectPage.getSelectedSection());
|
|
938
|
-
|
|
939
797
|
if (oSelectedSection) {
|
|
940
798
|
_this7._updateFocusInEditMode(oSelectedSection.getSubSections());
|
|
941
799
|
}
|
|
942
800
|
}
|
|
943
|
-
};
|
|
944
|
-
|
|
945
|
-
|
|
801
|
+
};
|
|
802
|
+
// Apply app state only after the page is ready with the first section selected
|
|
946
803
|
var oView = this.getView();
|
|
947
804
|
var oInternalModelContext = oView.getBindingContext("internal");
|
|
948
|
-
var oBindingContext = oView.getBindingContext();
|
|
949
|
-
|
|
805
|
+
var oBindingContext = oView.getBindingContext();
|
|
806
|
+
//Show popup while navigating back from object page in case of draft
|
|
950
807
|
if (oBindingContext) {
|
|
951
808
|
var bIsStickyMode = ModelHelper.isStickySessionSupported(oBindingContext.getModel().getMetaModel());
|
|
952
|
-
|
|
953
809
|
if (!bIsStickyMode) {
|
|
954
810
|
var oAppComponent = CommonUtils.getAppComponent(oView);
|
|
955
811
|
oAppComponent.getShellServices().setBackNavigation(function () {
|
|
@@ -957,8 +813,8 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
957
813
|
});
|
|
958
814
|
}
|
|
959
815
|
}
|
|
960
|
-
|
|
961
|
-
this.getAppComponent().getAppStateHandler().applyAppState().then(function () {
|
|
816
|
+
var viewId = this.getView().getId();
|
|
817
|
+
this.getAppComponent().getAppStateHandler().applyAppState(viewId, this.getView()).then(function () {
|
|
962
818
|
if (mParameters.forceFocus) {
|
|
963
819
|
setFocus();
|
|
964
820
|
}
|
|
@@ -966,38 +822,30 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
966
822
|
Log.error("Error while setting the focus", Error);
|
|
967
823
|
});
|
|
968
824
|
oInternalModelContext.setProperty("errorNavigationSectionFlag", false);
|
|
969
|
-
|
|
970
825
|
this._checkDataPointTitleForExternalNavigation();
|
|
971
826
|
}
|
|
827
|
+
|
|
972
828
|
/**
|
|
973
829
|
* Get the status of edit mode for sticky session.
|
|
974
830
|
*
|
|
975
831
|
* @returns The status of edit mode for sticky session
|
|
976
|
-
|
|
977
|
-
;
|
|
978
|
-
|
|
832
|
+
*/;
|
|
979
833
|
_proto.getStickyEditMode = function getStickyEditMode() {
|
|
980
834
|
var oBindingContext = this.getView().getBindingContext && this.getView().getBindingContext();
|
|
981
835
|
var bIsStickyEditMode = false;
|
|
982
|
-
|
|
983
836
|
if (oBindingContext) {
|
|
984
837
|
var bIsStickyMode = ModelHelper.isStickySessionSupported(oBindingContext.getModel().getMetaModel());
|
|
985
|
-
|
|
986
838
|
if (bIsStickyMode) {
|
|
987
839
|
bIsStickyEditMode = this.getView().getModel("ui").getProperty("/isEditable");
|
|
988
840
|
}
|
|
989
841
|
}
|
|
990
|
-
|
|
991
842
|
return bIsStickyEditMode;
|
|
992
843
|
};
|
|
993
|
-
|
|
994
844
|
_proto._getObjectPageLayoutControl = function _getObjectPageLayoutControl() {
|
|
995
845
|
return this.byId("fe::ObjectPage");
|
|
996
846
|
};
|
|
997
|
-
|
|
998
847
|
_proto._getPageTitleInformation = function _getPageTitleInformation() {
|
|
999
848
|
var oObjectPage = this._getObjectPageLayoutControl();
|
|
1000
|
-
|
|
1001
849
|
var oObjectPageSubtitle = oObjectPage.getCustomData().find(function (oCustomData) {
|
|
1002
850
|
return oCustomData.getKey() === "ObjectPageSubtitle";
|
|
1003
851
|
});
|
|
@@ -1008,36 +856,29 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1008
856
|
icon: ""
|
|
1009
857
|
};
|
|
1010
858
|
};
|
|
1011
|
-
|
|
1012
859
|
_proto._executeHeaderShortcut = function _executeHeaderShortcut(sId) {
|
|
1013
860
|
var sButtonId = "".concat(this.getView().getId(), "--").concat(sId),
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
861
|
+
oButton = this._getObjectPageLayoutControl().getHeaderTitle().getActions().find(function (oElement) {
|
|
862
|
+
return oElement.getId() === sButtonId;
|
|
863
|
+
});
|
|
1018
864
|
if (oButton) {
|
|
1019
865
|
CommonUtils.fireButtonPress(oButton);
|
|
1020
866
|
}
|
|
1021
867
|
};
|
|
1022
|
-
|
|
1023
868
|
_proto._executeFooterShortcut = function _executeFooterShortcut(sId) {
|
|
1024
869
|
var sButtonId = "".concat(this.getView().getId(), "--").concat(sId),
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
870
|
+
oButton = this._getObjectPageLayoutControl().getFooter().getContent().find(function (oElement) {
|
|
871
|
+
return oElement.getMetadata().getName() === "sap.m.Button" && oElement.getId() === sButtonId;
|
|
872
|
+
});
|
|
1029
873
|
CommonUtils.fireButtonPress(oButton);
|
|
1030
874
|
};
|
|
1031
|
-
|
|
1032
875
|
_proto._executeTabShortCut = function _executeTabShortCut(oExecution) {
|
|
1033
876
|
var oObjectPage = this._getObjectPageLayoutControl(),
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
877
|
+
aSections = oObjectPage.getSections(),
|
|
878
|
+
iSectionIndexMax = aSections.length - 1,
|
|
879
|
+
sCommand = oExecution.oSource.getCommand();
|
|
1038
880
|
var newSection,
|
|
1039
|
-
|
|
1040
|
-
|
|
881
|
+
iSelectedSectionIndex = oObjectPage.indexOfSection(this.byId(oObjectPage.getSelectedSection()));
|
|
1041
882
|
if (iSelectedSectionIndex !== -1 && iSectionIndexMax > 0) {
|
|
1042
883
|
if (sCommand === "NextTab") {
|
|
1043
884
|
if (iSelectedSectionIndex <= iSectionIndexMax - 1) {
|
|
@@ -1047,14 +888,12 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1047
888
|
// PreviousTab
|
|
1048
889
|
newSection = aSections[--iSelectedSectionIndex];
|
|
1049
890
|
}
|
|
1050
|
-
|
|
1051
891
|
if (newSection) {
|
|
1052
892
|
oObjectPage.setSelectedSection(newSection);
|
|
1053
893
|
newSection.focus();
|
|
1054
894
|
}
|
|
1055
895
|
}
|
|
1056
896
|
};
|
|
1057
|
-
|
|
1058
897
|
_proto._getFooterVisibility = function _getFooterVisibility() {
|
|
1059
898
|
var oInternalModelContext = this.getView().getBindingContext("internal");
|
|
1060
899
|
var sViewId = this.getView().getId();
|
|
@@ -1065,32 +904,26 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1065
904
|
}
|
|
1066
905
|
});
|
|
1067
906
|
};
|
|
1068
|
-
|
|
1069
907
|
_proto._showMessagePopover = function _showMessagePopover(err, oRet) {
|
|
1070
908
|
if (err) {
|
|
1071
909
|
Log.error(err);
|
|
1072
910
|
}
|
|
1073
|
-
|
|
1074
911
|
var rootViewController = this.getAppComponent().getRootViewController();
|
|
1075
912
|
var currentPageView = rootViewController.isFclEnabled() ? rootViewController.getRightmostView() : this.getAppComponent().getRootContainer().getCurrentPage();
|
|
1076
|
-
|
|
1077
913
|
if (!currentPageView.isA("sap.m.MessagePage")) {
|
|
1078
914
|
var oMessageButton = this.messageButton,
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
915
|
+
oMessagePopover = oMessageButton.oMessagePopover,
|
|
916
|
+
oItemBinding = oMessagePopover.getBinding("items");
|
|
1082
917
|
if (oItemBinding.getLength() > 0 && !oMessagePopover.isOpen()) {
|
|
1083
|
-
oMessageButton.setVisible(true);
|
|
1084
|
-
|
|
918
|
+
oMessageButton.setVisible(true);
|
|
919
|
+
// workaround to ensure that oMessageButton is rendered when openBy is called
|
|
1085
920
|
setTimeout(function () {
|
|
1086
921
|
oMessagePopover.openBy(oMessageButton);
|
|
1087
922
|
}, 0);
|
|
1088
923
|
}
|
|
1089
924
|
}
|
|
1090
|
-
|
|
1091
925
|
return oRet;
|
|
1092
926
|
};
|
|
1093
|
-
|
|
1094
927
|
_proto._editDocument = function _editDocument(oContext) {
|
|
1095
928
|
var oModel = this.getView().getModel("ui");
|
|
1096
929
|
BusyLocker.lock(oModel);
|
|
@@ -1098,6 +931,7 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1098
931
|
BusyLocker.unlock(oModel);
|
|
1099
932
|
});
|
|
1100
933
|
}
|
|
934
|
+
|
|
1101
935
|
/**
|
|
1102
936
|
* Gets the context of the DraftRoot path.
|
|
1103
937
|
* If a view has been created with the draft Root Path, this method returns its bindingContext.
|
|
@@ -1107,19 +941,13 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1107
941
|
* @function
|
|
1108
942
|
* @name getDraftRootPath
|
|
1109
943
|
* @returns Returns a Promise
|
|
1110
|
-
|
|
1111
|
-
;
|
|
1112
|
-
|
|
944
|
+
*/;
|
|
1113
945
|
_proto.getDraftRootContext = function getDraftRootContext() {
|
|
1114
946
|
try {
|
|
1115
947
|
var _exit2 = false;
|
|
1116
|
-
|
|
1117
948
|
var _this9 = this;
|
|
1118
|
-
|
|
1119
949
|
var view = _this9.getView();
|
|
1120
|
-
|
|
1121
950
|
var context = view.getBindingContext();
|
|
1122
|
-
|
|
1123
951
|
var _temp11 = function () {
|
|
1124
952
|
if (context) {
|
|
1125
953
|
function _temp12(_result) {
|
|
@@ -1127,40 +955,29 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1127
955
|
_exit2 = true;
|
|
1128
956
|
return undefined;
|
|
1129
957
|
}
|
|
1130
|
-
|
|
1131
958
|
var draftRootContextPath = ModelHelper.getDraftRootPath(context);
|
|
1132
959
|
var simpleDraftRootContext;
|
|
1133
|
-
|
|
1134
960
|
var _temp13 = function () {
|
|
1135
961
|
if (draftRootContextPath) {
|
|
1136
|
-
var _this9$getAppComponen, _simpleDraftRootConte
|
|
1137
|
-
|
|
962
|
+
var _this9$getAppComponen, _simpleDraftRootConte;
|
|
1138
963
|
// Check if a view matches with the draft root path
|
|
1139
964
|
var existingBindingContextOnPage = (_this9$getAppComponen = _this9.getAppComponent().getRootViewController().getInstancedViews().find(function (pageView) {
|
|
1140
965
|
var _pageView$getBindingC;
|
|
1141
|
-
|
|
1142
966
|
return ((_pageView$getBindingC = pageView.getBindingContext()) === null || _pageView$getBindingC === void 0 ? void 0 : _pageView$getBindingC.getPath()) === draftRootContextPath;
|
|
1143
967
|
})) === null || _this9$getAppComponen === void 0 ? void 0 : _this9$getAppComponen.getBindingContext();
|
|
1144
|
-
|
|
1145
968
|
if (existingBindingContextOnPage) {
|
|
1146
969
|
_exit2 = true;
|
|
1147
970
|
return existingBindingContextOnPage;
|
|
1148
971
|
}
|
|
1149
|
-
|
|
1150
972
|
var internalModel = view.getModel("internal");
|
|
1151
973
|
simpleDraftRootContext = internalModel.getProperty("/simpleDraftRootContext");
|
|
1152
|
-
|
|
1153
974
|
if (((_simpleDraftRootConte = simpleDraftRootContext) === null || _simpleDraftRootConte === void 0 ? void 0 : _simpleDraftRootConte.getPath()) === draftRootContextPath) {
|
|
1154
975
|
_exit2 = true;
|
|
1155
976
|
return simpleDraftRootContext;
|
|
1156
977
|
}
|
|
1157
|
-
|
|
1158
978
|
var model = context.getModel();
|
|
1159
|
-
var metaModel = model.getMetaModel();
|
|
1160
|
-
var sEntityPath = metaModel.getMetaPath(draftRootContextPath);
|
|
1161
|
-
var mDataModel = MetaModelConverter.getInvolvedDataModelObjects(metaModel.getContext(sEntityPath));
|
|
1162
979
|
simpleDraftRootContext = model.bindContext(draftRootContextPath).getBoundContext();
|
|
1163
|
-
return Promise.resolve(
|
|
980
|
+
return Promise.resolve(CommonUtils.waitForContextRequested(simpleDraftRootContext)).then(function () {
|
|
1164
981
|
// Store this new created context to use it on the next iterations
|
|
1165
982
|
internalModel.setProperty("/simpleDraftRootContext", simpleDraftRootContext);
|
|
1166
983
|
_exit2 = true;
|
|
@@ -1168,11 +985,9 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1168
985
|
});
|
|
1169
986
|
}
|
|
1170
987
|
}();
|
|
1171
|
-
|
|
1172
988
|
return _temp13 && _temp13.then ? _temp13.then(_temp12) : _temp12(_temp13);
|
|
1173
989
|
}
|
|
1174
990
|
}();
|
|
1175
|
-
|
|
1176
991
|
return Promise.resolve(_temp11 && _temp11.then ? _temp11.then(function (_result2) {
|
|
1177
992
|
return _exit2 ? _result2 : undefined;
|
|
1178
993
|
}) : _exit2 ? _temp11 : undefined);
|
|
@@ -1180,39 +995,32 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1180
995
|
return Promise.reject(e);
|
|
1181
996
|
}
|
|
1182
997
|
};
|
|
1183
|
-
|
|
1184
998
|
_proto._validateDocument = function _validateDocument() {
|
|
1185
999
|
try {
|
|
1186
1000
|
var _exit4 = false;
|
|
1187
|
-
|
|
1188
1001
|
var _this11 = this;
|
|
1189
|
-
|
|
1190
1002
|
var control = Core.byId(Core.getCurrentFocusedControlId());
|
|
1191
1003
|
var context = control === null || control === void 0 ? void 0 : control.getBindingContext();
|
|
1192
|
-
|
|
1193
1004
|
var _temp15 = function () {
|
|
1194
1005
|
if (context && !context.isTransient()) {
|
|
1195
1006
|
// Wait for the pending changes before starting this validation
|
|
1196
1007
|
return Promise.resolve(_this11._editFlow.syncTask()).then(function () {
|
|
1197
1008
|
var appComponent = _this11.getAppComponent();
|
|
1198
|
-
|
|
1199
1009
|
var sideEffectsService = appComponent.getSideEffectsService();
|
|
1200
1010
|
var entityType = sideEffectsService.getEntityTypeFromContext(context);
|
|
1201
|
-
var globalSideEffects = entityType ? sideEffectsService.getGlobalODataEntitySideEffects(entityType) : [];
|
|
1202
|
-
|
|
1011
|
+
var globalSideEffects = entityType ? sideEffectsService.getGlobalODataEntitySideEffects(entityType) : [];
|
|
1012
|
+
// If there is at least one global SideEffects for the related entity, execute it/them
|
|
1203
1013
|
return function () {
|
|
1204
1014
|
if (globalSideEffects.length) {
|
|
1205
1015
|
var _Promise$all2 = Promise.all(globalSideEffects.map(function (sideEffects) {
|
|
1206
1016
|
return _this11._sideEffects.requestSideEffects(sideEffects, context);
|
|
1207
1017
|
}));
|
|
1208
|
-
|
|
1209
1018
|
_exit4 = true;
|
|
1210
1019
|
return _Promise$all2;
|
|
1211
1020
|
} else {
|
|
1212
1021
|
return Promise.resolve(_this11.getDraftRootContext()).then(function (draftRootContext) {
|
|
1213
1022
|
if (draftRootContext) {
|
|
1214
1023
|
var _draft$executeDraftVa2 = draft.executeDraftValidation(draftRootContext, appComponent);
|
|
1215
|
-
|
|
1216
1024
|
_exit4 = true;
|
|
1217
1025
|
return _draft$executeDraftVa2;
|
|
1218
1026
|
}
|
|
@@ -1222,7 +1030,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1222
1030
|
});
|
|
1223
1031
|
}
|
|
1224
1032
|
}();
|
|
1225
|
-
|
|
1226
1033
|
return Promise.resolve(_temp15 && _temp15.then ? _temp15.then(function (_result4) {
|
|
1227
1034
|
return _exit4 ? _result4 : undefined;
|
|
1228
1035
|
}) : _exit4 ? _temp15 : undefined);
|
|
@@ -1230,28 +1037,22 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1230
1037
|
return Promise.reject(e);
|
|
1231
1038
|
}
|
|
1232
1039
|
};
|
|
1233
|
-
|
|
1234
1040
|
_proto._saveDocument = function _saveDocument(oContext) {
|
|
1235
1041
|
try {
|
|
1236
1042
|
var _this13 = this;
|
|
1237
|
-
|
|
1238
1043
|
var oModel = _this13.getView().getModel("ui"),
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1044
|
+
aWaitCreateDocuments = [];
|
|
1045
|
+
// indicates if we are creating a new row in the OP
|
|
1242
1046
|
var bExecuteSideEffectsOnError = false;
|
|
1243
1047
|
BusyLocker.lock(oModel);
|
|
1244
|
-
|
|
1245
1048
|
_this13._findTables().forEach(function (oTable) {
|
|
1246
1049
|
var oBinding = _this13._getTableBinding(oTable);
|
|
1247
|
-
|
|
1248
1050
|
var mParameters = {
|
|
1249
1051
|
creationMode: oTable.data("creationMode"),
|
|
1250
1052
|
creationRow: oTable.getCreationRow(),
|
|
1251
1053
|
createAtEnd: oTable.data("createAtEnd") === "true"
|
|
1252
1054
|
};
|
|
1253
1055
|
var bCreateDocument = mParameters.creationRow && mParameters.creationRow.getBindingContext() && Object.keys(mParameters.creationRow.getBindingContext().getObject()).length > 1;
|
|
1254
|
-
|
|
1255
1056
|
if (bCreateDocument) {
|
|
1256
1057
|
// the bSkipSideEffects is a parameter created when we click the save key. If we press this key
|
|
1257
1058
|
// we don't execute the handleSideEffects funciton to avoid batch redundancy
|
|
@@ -1262,18 +1063,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1262
1063
|
}));
|
|
1263
1064
|
}
|
|
1264
1065
|
});
|
|
1265
|
-
|
|
1266
1066
|
return Promise.resolve(_finallyRethrows(function () {
|
|
1267
1067
|
return Promise.resolve(Promise.all(aWaitCreateDocuments)).then(function (aBindings) {
|
|
1268
1068
|
var mParameters = {
|
|
1269
1069
|
bExecuteSideEffectsOnError: bExecuteSideEffectsOnError,
|
|
1270
1070
|
bindings: aBindings
|
|
1271
|
-
};
|
|
1071
|
+
};
|
|
1072
|
+
// We need to either reject or resolve a promise here and return it since this save
|
|
1272
1073
|
// function is not only called when pressing the save button in the footer, but also
|
|
1273
1074
|
// when the user selects create or save in a dataloss popup.
|
|
1274
1075
|
// The logic of the dataloss popup needs to detect if the save had errors or not in order
|
|
1275
1076
|
// to decide if the subsequent action - like a back navigation - has to be executed or not.
|
|
1276
|
-
|
|
1277
1077
|
return _catch(function () {
|
|
1278
1078
|
return Promise.resolve(_this13.editFlow.saveDocument(oContext, mParameters)).then(function () {});
|
|
1279
1079
|
}, function (error) {
|
|
@@ -1282,7 +1082,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1282
1082
|
// dataloss logic does not perform the follow up function
|
|
1283
1083
|
// like e.g. a back navigation hence we return a promise and reject it
|
|
1284
1084
|
_this13._showMessagePopover(error);
|
|
1285
|
-
|
|
1286
1085
|
throw error;
|
|
1287
1086
|
});
|
|
1288
1087
|
});
|
|
@@ -1290,7 +1089,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1290
1089
|
if (BusyLocker.isLocked(oModel)) {
|
|
1291
1090
|
BusyLocker.unlock(oModel);
|
|
1292
1091
|
}
|
|
1293
|
-
|
|
1294
1092
|
if (_wasThrown) throw _result5;
|
|
1295
1093
|
return _result5;
|
|
1296
1094
|
}));
|
|
@@ -1298,43 +1096,32 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1298
1096
|
return Promise.reject(e);
|
|
1299
1097
|
}
|
|
1300
1098
|
};
|
|
1301
|
-
|
|
1302
1099
|
_proto._manageCollaboration = function _manageCollaboration() {
|
|
1303
1100
|
openManageDialog(this.getView());
|
|
1304
1101
|
};
|
|
1305
|
-
|
|
1306
1102
|
_proto._showCollaborationUserDetails = function _showCollaborationUserDetails(event) {
|
|
1307
1103
|
showUserDetails(event, this.getView());
|
|
1308
1104
|
};
|
|
1309
|
-
|
|
1310
1105
|
_proto._cancelDocument = function _cancelDocument(oContext, mParameters) {
|
|
1311
1106
|
mParameters.cancelButton = this.getView().byId(mParameters.cancelButton); //to get the reference of the cancel button from command execution
|
|
1312
|
-
|
|
1313
1107
|
return this.editFlow.cancelDocument(oContext, mParameters);
|
|
1314
1108
|
};
|
|
1315
|
-
|
|
1316
1109
|
_proto._applyDocument = function _applyDocument(oContext) {
|
|
1317
1110
|
var _this14 = this;
|
|
1318
|
-
|
|
1319
1111
|
return this.editFlow.applyDocument(oContext).catch(function () {
|
|
1320
1112
|
return _this14._showMessagePopover();
|
|
1321
1113
|
});
|
|
1322
1114
|
};
|
|
1323
|
-
|
|
1324
1115
|
_proto._updateRelatedApps = function _updateRelatedApps() {
|
|
1325
1116
|
var oObjectPage = this._getObjectPageLayoutControl();
|
|
1326
|
-
|
|
1327
1117
|
if (CommonUtils.resolveStringtoBoolean(oObjectPage.data("showRelatedApps"))) {
|
|
1328
1118
|
CommonUtils.updateRelatedAppsDetails(oObjectPage);
|
|
1329
1119
|
}
|
|
1330
1120
|
};
|
|
1331
|
-
|
|
1332
1121
|
_proto._findControlInSubSection = function _findControlInSubSection(aParentElement, aSubsection, aControls, bIsChart) {
|
|
1333
1122
|
var aSubSectionTables = [];
|
|
1334
|
-
|
|
1335
1123
|
for (var element = 0; element < aParentElement.length; element++) {
|
|
1336
1124
|
var oElement = aParentElement[element].getContent instanceof Function && aParentElement[element].getContent();
|
|
1337
|
-
|
|
1338
1125
|
if (bIsChart) {
|
|
1339
1126
|
if (oElement && oElement.mAggregations && oElement.getAggregation("items")) {
|
|
1340
1127
|
var aItems = oElement.getAggregation("items");
|
|
@@ -1345,102 +1132,76 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1345
1132
|
});
|
|
1346
1133
|
}
|
|
1347
1134
|
}
|
|
1348
|
-
|
|
1349
1135
|
if (oElement && oElement.isA && oElement.isA("sap.ui.layout.DynamicSideContent")) {
|
|
1350
1136
|
oElement = oElement.getMainContent instanceof Function && oElement.getMainContent();
|
|
1351
|
-
|
|
1352
1137
|
if (oElement && oElement.length > 0) {
|
|
1353
1138
|
oElement = oElement[0];
|
|
1354
1139
|
}
|
|
1355
1140
|
}
|
|
1356
|
-
|
|
1357
1141
|
if (oElement && oElement.isA && oElement.isA("sap.fe.macros.table.TableAPI")) {
|
|
1358
1142
|
oElement = oElement.getContent instanceof Function && oElement.getContent();
|
|
1359
|
-
|
|
1360
1143
|
if (oElement && oElement.length > 0) {
|
|
1361
1144
|
oElement = oElement[0];
|
|
1362
1145
|
}
|
|
1363
1146
|
}
|
|
1364
|
-
|
|
1365
1147
|
if (oElement && oElement.isA && oElement.isA("sap.ui.mdc.Table")) {
|
|
1366
1148
|
aControls.push(oElement);
|
|
1367
1149
|
aSubSectionTables.push({
|
|
1368
|
-
|
|
1369
|
-
|
|
1150
|
+
table: oElement,
|
|
1151
|
+
gridTable: oElement.getType().isA("sap.ui.mdc.table.GridTableType")
|
|
1370
1152
|
});
|
|
1371
1153
|
}
|
|
1372
|
-
|
|
1373
1154
|
if (oElement && oElement.isA && oElement.isA("sap.fe.macros.chart.ChartAPI")) {
|
|
1374
1155
|
oElement = oElement.getContent instanceof Function && oElement.getContent();
|
|
1375
|
-
|
|
1376
1156
|
if (oElement && oElement.length > 0) {
|
|
1377
1157
|
oElement = oElement[0];
|
|
1378
1158
|
}
|
|
1379
1159
|
}
|
|
1380
|
-
|
|
1381
1160
|
if (oElement && oElement.isA && oElement.isA("sap.ui.mdc.Chart")) {
|
|
1382
1161
|
aControls.push(oElement);
|
|
1383
1162
|
}
|
|
1384
1163
|
}
|
|
1385
|
-
|
|
1386
1164
|
if (aSubSectionTables.length === 1 && aParentElement.length === 1 && aSubSectionTables[0].gridTable && !aSubsection.hasStyleClass("sapUxAPObjectPageSubSectionFitContainer")) {
|
|
1387
1165
|
//In case there is only a single table in a section we fit that to the whole page so that the scrollbar comes only on table and not on page
|
|
1388
1166
|
aSubsection.addStyleClass("sapUxAPObjectPageSubSectionFitContainer");
|
|
1389
1167
|
}
|
|
1390
1168
|
};
|
|
1391
|
-
|
|
1392
1169
|
_proto._getAllSubSections = function _getAllSubSections() {
|
|
1393
1170
|
var oObjectPage = this._getObjectPageLayoutControl();
|
|
1394
|
-
|
|
1395
1171
|
var aSubSections = [];
|
|
1396
1172
|
oObjectPage.getSections().forEach(function (oSection) {
|
|
1397
1173
|
aSubSections = aSubSections.concat(oSection.getSubSections());
|
|
1398
1174
|
});
|
|
1399
1175
|
return aSubSections;
|
|
1400
1176
|
};
|
|
1401
|
-
|
|
1402
1177
|
_proto._getAllBlocks = function _getAllBlocks() {
|
|
1403
1178
|
var aBlocks = [];
|
|
1404
|
-
|
|
1405
1179
|
this._getAllSubSections().forEach(function (oSubSection) {
|
|
1406
1180
|
aBlocks = aBlocks.concat(oSubSection.getBlocks());
|
|
1407
1181
|
});
|
|
1408
|
-
|
|
1409
1182
|
return aBlocks;
|
|
1410
1183
|
};
|
|
1411
|
-
|
|
1412
1184
|
_proto._findTables = function _findTables() {
|
|
1413
1185
|
var aSubSections = this._getAllSubSections();
|
|
1414
|
-
|
|
1415
1186
|
var aTables = [];
|
|
1416
|
-
|
|
1417
1187
|
for (var subSection = 0; subSection < aSubSections.length; subSection++) {
|
|
1418
1188
|
this._findControlInSubSection(aSubSections[subSection].getBlocks(), aSubSections[subSection], aTables);
|
|
1419
|
-
|
|
1420
1189
|
this._findControlInSubSection(aSubSections[subSection].getMoreBlocks(), aSubSections[subSection], aTables);
|
|
1421
1190
|
}
|
|
1422
|
-
|
|
1423
1191
|
return aTables;
|
|
1424
1192
|
};
|
|
1425
|
-
|
|
1426
1193
|
_proto._findCharts = function _findCharts() {
|
|
1427
1194
|
var aSubSections = this._getAllSubSections();
|
|
1428
|
-
|
|
1429
1195
|
var aCharts = [];
|
|
1430
|
-
|
|
1431
1196
|
for (var subSection = 0; subSection < aSubSections.length; subSection++) {
|
|
1432
1197
|
this._findControlInSubSection(aSubSections[subSection].getBlocks(), aSubSections[subSection], aCharts, true);
|
|
1433
|
-
|
|
1434
1198
|
this._findControlInSubSection(aSubSections[subSection].getMoreBlocks(), aSubSections[subSection], aCharts, true);
|
|
1435
1199
|
}
|
|
1436
|
-
|
|
1437
1200
|
return aCharts;
|
|
1438
1201
|
};
|
|
1439
|
-
|
|
1440
1202
|
_proto._closeSideContent = function _closeSideContent() {
|
|
1441
1203
|
this._getAllBlocks().forEach(function (oBlock) {
|
|
1442
1204
|
var oContent = oBlock.getContent instanceof Function && oBlock.getContent();
|
|
1443
|
-
|
|
1444
1205
|
if (oContent && oContent.isA && oContent.isA("sap.ui.layout.DynamicSideContent")) {
|
|
1445
1206
|
if (oContent.setShowSideContent instanceof Function) {
|
|
1446
1207
|
oContent.setShowSideContent(false);
|
|
@@ -1448,19 +1209,17 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1448
1209
|
}
|
|
1449
1210
|
});
|
|
1450
1211
|
}
|
|
1212
|
+
|
|
1451
1213
|
/**
|
|
1452
1214
|
* Chart Context is resolved for 1:n microcharts.
|
|
1453
1215
|
*
|
|
1454
1216
|
* @param oChartContext The Context of the MicroChart
|
|
1455
1217
|
* @param sChartPath The collectionPath of the the chart
|
|
1456
1218
|
* @returns Array of Attributes of the chart Context
|
|
1457
|
-
|
|
1458
|
-
;
|
|
1459
|
-
|
|
1219
|
+
*/;
|
|
1460
1220
|
_proto._getChartContextData = function _getChartContextData(oChartContext, sChartPath) {
|
|
1461
1221
|
var oContextData = oChartContext.getObject();
|
|
1462
1222
|
var oChartContextData = [oContextData];
|
|
1463
|
-
|
|
1464
1223
|
if (oChartContext && sChartPath) {
|
|
1465
1224
|
if (oContextData[sChartPath]) {
|
|
1466
1225
|
oChartContextData = oContextData[sChartPath];
|
|
@@ -1468,27 +1227,25 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1468
1227
|
oChartContextData.push(oContextData);
|
|
1469
1228
|
}
|
|
1470
1229
|
}
|
|
1471
|
-
|
|
1472
1230
|
return oChartContextData;
|
|
1473
1231
|
}
|
|
1232
|
+
|
|
1474
1233
|
/**
|
|
1475
1234
|
* Scroll the tables to the row with the sPath
|
|
1476
1235
|
*
|
|
1477
1236
|
* @function
|
|
1478
1237
|
* @name sap.fe.templates.ObjectPage.ObjectPageController.controller#_scrollTablesToRow
|
|
1479
1238
|
* @param {string} sRowPath 'sPath of the table row'
|
|
1480
|
-
|
|
1481
|
-
;
|
|
1482
|
-
|
|
1239
|
+
*/;
|
|
1483
1240
|
_proto._scrollTablesToRow = function _scrollTablesToRow(sRowPath) {
|
|
1484
1241
|
if (this._findTables && this._findTables().length > 0) {
|
|
1485
1242
|
var aTables = this._findTables();
|
|
1486
|
-
|
|
1487
1243
|
for (var i = 0; i < aTables.length; i++) {
|
|
1488
1244
|
TableScroller.scrollTableToRow(aTables[i], sRowPath);
|
|
1489
1245
|
}
|
|
1490
1246
|
}
|
|
1491
1247
|
}
|
|
1248
|
+
|
|
1492
1249
|
/**
|
|
1493
1250
|
* Method to merge selected contexts and filters.
|
|
1494
1251
|
*
|
|
@@ -1498,21 +1255,19 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1498
1255
|
* @param aLineContext Selected Contexts
|
|
1499
1256
|
* @param sChartPath Collection name of the chart
|
|
1500
1257
|
* @returns Selection Variant Object
|
|
1501
|
-
|
|
1502
|
-
;
|
|
1503
|
-
|
|
1258
|
+
*/;
|
|
1504
1259
|
_proto._mergeMultipleContexts = function _mergeMultipleContexts(oPageContext, aLineContext, sChartPath) {
|
|
1505
1260
|
var _this15 = this;
|
|
1506
|
-
|
|
1507
1261
|
var aAttributes = [],
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1262
|
+
aPageAttributes = [],
|
|
1263
|
+
oContext,
|
|
1264
|
+
sMetaPathLine,
|
|
1265
|
+
sPathLine;
|
|
1512
1266
|
var sPagePath = oPageContext.getPath();
|
|
1513
1267
|
var oMetaModel = oPageContext && oPageContext.getModel() && oPageContext.getModel().getMetaModel();
|
|
1514
|
-
var sMetaPathPage = oMetaModel && oMetaModel.getMetaPath(sPagePath).replace(/^\/*/, "");
|
|
1268
|
+
var sMetaPathPage = oMetaModel && oMetaModel.getMetaPath(sPagePath).replace(/^\/*/, "");
|
|
1515
1269
|
|
|
1270
|
+
// Get single line context if necessary
|
|
1516
1271
|
if (aLineContext && aLineContext.length) {
|
|
1517
1272
|
oContext = aLineContext[0];
|
|
1518
1273
|
sPathLine = oContext.getPath();
|
|
@@ -1520,7 +1275,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1520
1275
|
aLineContext.forEach(function (oSingleContext) {
|
|
1521
1276
|
if (sChartPath) {
|
|
1522
1277
|
var oChartContextData = _this15._getChartContextData(oSingleContext, sChartPath);
|
|
1523
|
-
|
|
1524
1278
|
if (oChartContextData) {
|
|
1525
1279
|
aAttributes = oChartContextData.map(function (oSubChartContextData) {
|
|
1526
1280
|
return {
|
|
@@ -1537,12 +1291,11 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1537
1291
|
}
|
|
1538
1292
|
});
|
|
1539
1293
|
}
|
|
1540
|
-
|
|
1541
1294
|
aPageAttributes.push({
|
|
1542
1295
|
contextData: oPageContext.getObject(),
|
|
1543
1296
|
entitySet: sMetaPathPage
|
|
1544
|
-
});
|
|
1545
|
-
|
|
1297
|
+
});
|
|
1298
|
+
// Adding Page Context to selection variant
|
|
1546
1299
|
aPageAttributes = CommonUtils.removeSensitiveData(aPageAttributes, oMetaModel);
|
|
1547
1300
|
var oPageLevelSV = CommonUtils.addPageContextToSelectionVariant(new SelectionVariant(), aPageAttributes, this.getView());
|
|
1548
1301
|
aAttributes = CommonUtils.removeSensitiveData(aAttributes, oMetaModel);
|
|
@@ -1551,25 +1304,22 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1551
1304
|
attributes: aAttributes
|
|
1552
1305
|
};
|
|
1553
1306
|
};
|
|
1554
|
-
|
|
1555
1307
|
_proto._getBatchGroupsForView = function _getBatchGroupsForView() {
|
|
1556
1308
|
var oViewData = this.getView().getViewData(),
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1309
|
+
oConfigurations = oViewData.controlConfiguration,
|
|
1310
|
+
aConfigurations = oConfigurations && Object.keys(oConfigurations),
|
|
1311
|
+
aBatchGroups = ["$auto.Heroes", "$auto.Decoration", "$auto.Workers"];
|
|
1561
1312
|
if (aConfigurations && aConfigurations.length > 0) {
|
|
1562
1313
|
aConfigurations.forEach(function (sKey) {
|
|
1563
1314
|
var oConfiguration = oConfigurations[sKey];
|
|
1564
|
-
|
|
1565
1315
|
if (oConfiguration.requestGroupId === "LongRunners") {
|
|
1566
1316
|
aBatchGroups.push("$auto.LongRunners");
|
|
1567
1317
|
}
|
|
1568
1318
|
});
|
|
1569
1319
|
}
|
|
1570
|
-
|
|
1571
1320
|
return aBatchGroups;
|
|
1572
1321
|
}
|
|
1322
|
+
|
|
1573
1323
|
/*
|
|
1574
1324
|
* Reset Breadcrumb links
|
|
1575
1325
|
*
|
|
@@ -1582,25 +1332,19 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1582
1332
|
*
|
|
1583
1333
|
* @ui5-restricted
|
|
1584
1334
|
* @experimental
|
|
1585
|
-
|
|
1586
|
-
;
|
|
1587
|
-
|
|
1335
|
+
*/;
|
|
1588
1336
|
_proto._setBreadcrumbLinks = function _setBreadcrumbLinks(oSource) {
|
|
1589
1337
|
try {
|
|
1590
1338
|
var _sNewPath$split;
|
|
1591
|
-
|
|
1592
1339
|
var _this17 = this;
|
|
1593
|
-
|
|
1594
1340
|
var oContext = oSource.getBindingContext(),
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1341
|
+
oAppComponent = _this17.getAppComponent(),
|
|
1342
|
+
aPromises = [],
|
|
1343
|
+
aSkipParameterized = [],
|
|
1344
|
+
sNewPath = oContext === null || oContext === void 0 ? void 0 : oContext.getPath(),
|
|
1345
|
+
aPathParts = (_sNewPath$split = sNewPath === null || sNewPath === void 0 ? void 0 : sNewPath.split("/")) !== null && _sNewPath$split !== void 0 ? _sNewPath$split : [],
|
|
1346
|
+
oMetaModel = oAppComponent && oAppComponent.getMetaModel();
|
|
1602
1347
|
var sPath = "";
|
|
1603
|
-
|
|
1604
1348
|
var _temp17 = _catch(function () {
|
|
1605
1349
|
aPathParts.shift();
|
|
1606
1350
|
aPathParts.splice(-1, 1);
|
|
@@ -1609,7 +1353,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1609
1353
|
var oRootViewController = oAppComponent.getRootViewController();
|
|
1610
1354
|
var sParameterPath = oMetaModel.getMetaPath(sPath);
|
|
1611
1355
|
var bResultContext = oMetaModel.getObject("".concat(sParameterPath, "/@com.sap.vocabularies.Common.v1.ResultContext"));
|
|
1612
|
-
|
|
1613
1356
|
if (bResultContext) {
|
|
1614
1357
|
// We dont need to create a breadcrumb for Parameter path
|
|
1615
1358
|
aSkipParameterized.push(1);
|
|
@@ -1617,26 +1360,22 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1617
1360
|
} else {
|
|
1618
1361
|
aSkipParameterized.push(0);
|
|
1619
1362
|
}
|
|
1620
|
-
|
|
1621
1363
|
aPromises.push(oRootViewController.getTitleInfoFromPath(sPath));
|
|
1622
1364
|
});
|
|
1623
1365
|
return Promise.resolve(Promise.all(aPromises)).then(function (titleHierarchyInfos) {
|
|
1624
1366
|
var idx, hierarchyPosition, oLink;
|
|
1625
|
-
|
|
1626
1367
|
var _iterator = _createForOfIteratorHelper(titleHierarchyInfos),
|
|
1627
|
-
|
|
1628
|
-
|
|
1368
|
+
_step;
|
|
1629
1369
|
try {
|
|
1630
1370
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
1631
1371
|
var titleHierarchyInfo = _step.value;
|
|
1632
1372
|
hierarchyPosition = titleHierarchyInfos.indexOf(titleHierarchyInfo);
|
|
1633
1373
|
idx = hierarchyPosition - aSkipParameterized[hierarchyPosition];
|
|
1634
|
-
oLink = oSource.getLinks()[idx] ? oSource.getLinks()[idx] : new Link();
|
|
1635
|
-
|
|
1636
|
-
oLink.setText(titleHierarchyInfo.subtitle || titleHierarchyInfo.title);
|
|
1637
|
-
|
|
1374
|
+
oLink = oSource.getLinks()[idx] ? oSource.getLinks()[idx] : new Link();
|
|
1375
|
+
//sCurrentEntity is a fallback value in case of empty title
|
|
1376
|
+
oLink.setText(titleHierarchyInfo.subtitle || titleHierarchyInfo.title);
|
|
1377
|
+
//We apply an additional encodeURI in case of special characters (ie "/") used in the url through the semantic keys
|
|
1638
1378
|
oLink.setHref(encodeURI(titleHierarchyInfo.intent));
|
|
1639
|
-
|
|
1640
1379
|
if (!oSource.getLinks()[idx]) {
|
|
1641
1380
|
oSource.addLink(oLink);
|
|
1642
1381
|
}
|
|
@@ -1650,13 +1389,11 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1650
1389
|
}, function (error) {
|
|
1651
1390
|
Log.error("Error while setting the breadcrumb links:" + error);
|
|
1652
1391
|
});
|
|
1653
|
-
|
|
1654
1392
|
return Promise.resolve(_temp17 && _temp17.then ? _temp17.then(function () {}) : void 0);
|
|
1655
1393
|
} catch (e) {
|
|
1656
1394
|
return Promise.reject(e);
|
|
1657
1395
|
}
|
|
1658
1396
|
};
|
|
1659
|
-
|
|
1660
1397
|
_proto._checkDataPointTitleForExternalNavigation = function _checkDataPointTitleForExternalNavigation() {
|
|
1661
1398
|
var oView = this.getView();
|
|
1662
1399
|
var oInternalModelContext = oView.getBindingContext("internal");
|
|
@@ -1664,7 +1401,6 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1664
1401
|
var oShellServices = this.getAppComponent().getShellServices();
|
|
1665
1402
|
var oPageContext = oView && oView.getBindingContext();
|
|
1666
1403
|
oInternalModelContext.setProperty("isHeaderDPLinkVisible", {});
|
|
1667
|
-
|
|
1668
1404
|
if (oPageContext) {
|
|
1669
1405
|
oPageContext.requestObject().then(function (oData) {
|
|
1670
1406
|
fnGetLinks(oDataPoints, oData);
|
|
@@ -1672,51 +1408,44 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1672
1408
|
Log.error("Cannot retrieve the links from the shell service", oError);
|
|
1673
1409
|
});
|
|
1674
1410
|
}
|
|
1411
|
+
|
|
1675
1412
|
/**
|
|
1676
1413
|
* @param oError
|
|
1677
1414
|
*/
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
1415
|
function fnOnError(oError) {
|
|
1681
1416
|
Log.error(oError);
|
|
1682
1417
|
}
|
|
1683
|
-
|
|
1684
1418
|
function fnSetLinkEnablement(id, aSupportedLinks) {
|
|
1685
|
-
var sLinkId = id;
|
|
1686
|
-
|
|
1419
|
+
var sLinkId = id;
|
|
1420
|
+
// process viable links from getLinks for all datapoints having outbound
|
|
1687
1421
|
if (aSupportedLinks && aSupportedLinks.length === 1 && aSupportedLinks[0].supported) {
|
|
1688
1422
|
oInternalModelContext.setProperty("isHeaderDPLinkVisible/".concat(sLinkId), true);
|
|
1689
1423
|
}
|
|
1690
1424
|
}
|
|
1425
|
+
|
|
1691
1426
|
/**
|
|
1692
1427
|
* @param oSubDataPoints
|
|
1693
1428
|
* @param oPageData
|
|
1694
1429
|
*/
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
1430
|
function fnGetLinks(oSubDataPoints, oPageData) {
|
|
1698
1431
|
var _loop = function (sId) {
|
|
1699
1432
|
var oDataPoint = oSubDataPoints[sId];
|
|
1700
1433
|
var oParams = {};
|
|
1701
1434
|
var oLink = oView.byId(sId);
|
|
1702
|
-
|
|
1703
1435
|
if (!oLink) {
|
|
1704
1436
|
// for data points configured in app descriptor but not annotated in the header
|
|
1705
1437
|
return "continue";
|
|
1706
1438
|
}
|
|
1707
|
-
|
|
1708
1439
|
var oLinkContext = oLink.getBindingContext();
|
|
1709
1440
|
var oLinkData = oLinkContext && oLinkContext.getObject();
|
|
1710
|
-
var oMixedContext = merge({}, oPageData, oLinkData);
|
|
1711
|
-
|
|
1441
|
+
var oMixedContext = merge({}, oPageData, oLinkData);
|
|
1442
|
+
// process semantic object mappings
|
|
1712
1443
|
if (oDataPoint.semanticObjectMapping) {
|
|
1713
1444
|
var aSemanticObjectMapping = oDataPoint.semanticObjectMapping;
|
|
1714
|
-
|
|
1715
1445
|
for (var item in aSemanticObjectMapping) {
|
|
1716
1446
|
var oMapping = aSemanticObjectMapping[item];
|
|
1717
1447
|
var sMainProperty = oMapping["LocalProperty"]["$PropertyPath"];
|
|
1718
1448
|
var sMappedProperty = oMapping["SemanticObjectProperty"];
|
|
1719
|
-
|
|
1720
1449
|
if (sMainProperty !== sMappedProperty) {
|
|
1721
1450
|
if (oMixedContext.hasOwnProperty(sMainProperty)) {
|
|
1722
1451
|
var oNewMapping = {};
|
|
@@ -1727,16 +1456,14 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1727
1456
|
}
|
|
1728
1457
|
}
|
|
1729
1458
|
}
|
|
1730
|
-
|
|
1731
1459
|
if (oMixedContext) {
|
|
1732
1460
|
for (var sKey in oMixedContext) {
|
|
1733
1461
|
if (sKey.indexOf("_") !== 0 && sKey.indexOf("odata.context") === -1) {
|
|
1734
1462
|
oParams[sKey] = oMixedContext[sKey];
|
|
1735
1463
|
}
|
|
1736
1464
|
}
|
|
1737
|
-
}
|
|
1738
|
-
|
|
1739
|
-
|
|
1465
|
+
}
|
|
1466
|
+
// validate if a link must be rendered
|
|
1740
1467
|
oShellServices.isNavigationSupported([{
|
|
1741
1468
|
target: {
|
|
1742
1469
|
semanticObject: oDataPoint.semanticObject,
|
|
@@ -1747,77 +1474,64 @@ sap.ui.define(["sap/base/Log", "sap/base/util/merge", "sap/fe/core/ActionRuntime
|
|
|
1747
1474
|
return fnSetLinkEnablement(sId, aLinks);
|
|
1748
1475
|
}).catch(fnOnError);
|
|
1749
1476
|
};
|
|
1750
|
-
|
|
1751
1477
|
for (var sId in oSubDataPoints) {
|
|
1752
1478
|
var _ret = _loop(sId);
|
|
1753
|
-
|
|
1754
1479
|
if (_ret === "continue") continue;
|
|
1755
1480
|
}
|
|
1756
1481
|
}
|
|
1757
1482
|
};
|
|
1758
|
-
|
|
1759
1483
|
return ObjectPageController;
|
|
1760
1484
|
}(PageController), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "placeholder", [_dec2], {
|
|
1761
1485
|
configurable: true,
|
|
1762
1486
|
enumerable: true,
|
|
1763
1487
|
writable: true,
|
|
1764
1488
|
initializer: null
|
|
1765
|
-
}), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "
|
|
1766
|
-
configurable: true,
|
|
1767
|
-
enumerable: true,
|
|
1768
|
-
writable: true,
|
|
1769
|
-
initializer: null
|
|
1770
|
-
}), _descriptor3 = _applyDecoratedDescriptor(_class2.prototype, "share", [_dec4], {
|
|
1771
|
-
configurable: true,
|
|
1772
|
-
enumerable: true,
|
|
1773
|
-
writable: true,
|
|
1774
|
-
initializer: null
|
|
1775
|
-
}), _descriptor4 = _applyDecoratedDescriptor(_class2.prototype, "_editFlow", [_dec5], {
|
|
1489
|
+
}), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "share", [_dec3], {
|
|
1776
1490
|
configurable: true,
|
|
1777
1491
|
enumerable: true,
|
|
1778
1492
|
writable: true,
|
|
1779
1493
|
initializer: null
|
|
1780
|
-
}),
|
|
1494
|
+
}), _descriptor3 = _applyDecoratedDescriptor(_class2.prototype, "_routing", [_dec4], {
|
|
1781
1495
|
configurable: true,
|
|
1782
1496
|
enumerable: true,
|
|
1783
1497
|
writable: true,
|
|
1784
1498
|
initializer: null
|
|
1785
|
-
}),
|
|
1499
|
+
}), _descriptor4 = _applyDecoratedDescriptor(_class2.prototype, "paginator", [_dec5], {
|
|
1786
1500
|
configurable: true,
|
|
1787
1501
|
enumerable: true,
|
|
1788
1502
|
writable: true,
|
|
1789
1503
|
initializer: null
|
|
1790
|
-
}),
|
|
1504
|
+
}), _descriptor5 = _applyDecoratedDescriptor(_class2.prototype, "messageHandler", [_dec6], {
|
|
1791
1505
|
configurable: true,
|
|
1792
1506
|
enumerable: true,
|
|
1793
1507
|
writable: true,
|
|
1794
1508
|
initializer: null
|
|
1795
|
-
}),
|
|
1509
|
+
}), _descriptor6 = _applyDecoratedDescriptor(_class2.prototype, "intentBasedNavigation", [_dec7], {
|
|
1796
1510
|
configurable: true,
|
|
1797
1511
|
enumerable: true,
|
|
1798
1512
|
writable: true,
|
|
1799
1513
|
initializer: null
|
|
1800
|
-
}),
|
|
1514
|
+
}), _descriptor7 = _applyDecoratedDescriptor(_class2.prototype, "_intentBasedNavigation", [_dec8], {
|
|
1801
1515
|
configurable: true,
|
|
1802
1516
|
enumerable: true,
|
|
1803
1517
|
writable: true,
|
|
1804
1518
|
initializer: null
|
|
1805
|
-
}),
|
|
1519
|
+
}), _descriptor8 = _applyDecoratedDescriptor(_class2.prototype, "viewState", [_dec9], {
|
|
1806
1520
|
configurable: true,
|
|
1807
1521
|
enumerable: true,
|
|
1808
1522
|
writable: true,
|
|
1809
1523
|
initializer: null
|
|
1810
|
-
}),
|
|
1524
|
+
}), _descriptor9 = _applyDecoratedDescriptor(_class2.prototype, "pageReady", [_dec10], {
|
|
1811
1525
|
configurable: true,
|
|
1812
1526
|
enumerable: true,
|
|
1813
1527
|
writable: true,
|
|
1814
1528
|
initializer: null
|
|
1815
|
-
}),
|
|
1529
|
+
}), _descriptor10 = _applyDecoratedDescriptor(_class2.prototype, "massEdit", [_dec11], {
|
|
1816
1530
|
configurable: true,
|
|
1817
1531
|
enumerable: true,
|
|
1818
1532
|
writable: true,
|
|
1819
1533
|
initializer: null
|
|
1820
|
-
}), _applyDecoratedDescriptor(_class2.prototype, "getExtensionAPI", [
|
|
1534
|
+
}), _applyDecoratedDescriptor(_class2.prototype, "getExtensionAPI", [_dec12, _dec13], Object.getOwnPropertyDescriptor(_class2.prototype, "getExtensionAPI"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "onPageReady", [_dec14, _dec15], Object.getOwnPropertyDescriptor(_class2.prototype, "onPageReady"), _class2.prototype)), _class2)) || _class);
|
|
1821
1535
|
return ObjectPageController;
|
|
1822
1536
|
}, false);
|
|
1823
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiZmluYWxpemVyIiwiYmluZCIsIk9iamVjdFBhZ2VDb250cm9sbGVyIiwiZGVmaW5lVUk1Q2xhc3MiLCJ1c2luZ0V4dGVuc2lvbiIsIlBsYWNlaG9sZGVyIiwiRWRpdEZsb3ciLCJTaGFyZSIsIm92ZXJyaWRlIiwiU2hhcmVPdmVycmlkZXMiLCJJbnRlcm5hbEVkaXRGbG93IiwiRWRpdEZsb3dPdmVycmlkZXMiLCJJbnRlcm5hbFJvdXRpbmciLCJJbnRlcm5hbFJvdXRpbmdPdmVycmlkZSIsIlBhZ2luYXRvciIsIlBhZ2luYXRvck92ZXJyaWRlIiwiTWVzc2FnZUhhbmRsZXIiLCJNZXNzYWdlSGFuZGxlck92ZXJyaWRlIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uIiwiSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUiLCJJbnRlcm5hbEludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldE5hdmlnYXRpb25Nb2RlIiwiYklzU3RpY2t5RWRpdE1vZGUiLCJnZXRWaWV3IiwiZ2V0Q29udHJvbGxlciIsImdldFN0aWNreUVkaXRNb2RlIiwidW5kZWZpbmVkIiwiVmlld1N0YXRlIiwiVmlld1N0YXRlT3ZlcnJpZGVzIiwiUGFnZVJlYWR5IiwiaXNDb250ZXh0RXhwZWN0ZWQiLCJNYXNzRWRpdCIsInB1YmxpY0V4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwiZXh0ZW5zaWJsZSIsIk92ZXJyaWRlRXhlY3V0aW9uIiwiQWZ0ZXIiLCJoYW5kbGVycyIsIm9uUHJpbWFyeUFjdGlvbiIsIm9Db250cm9sbGVyIiwib1ZpZXciLCJvQ29udGV4dCIsInNBY3Rpb25OYW1lIiwibVBhcmFtZXRlcnMiLCJtQ29uZGl0aW9ucyIsImlWaWV3TGV2ZWwiLCJnZXRWaWV3RGF0YSIsInZpZXdMZXZlbCIsIm9PYmplY3RQYWdlIiwiX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sIiwicG9zaXRpdmVBY3Rpb25WaXNpYmxlIiwicG9zaXRpdmVBY3Rpb25FbmFibGVkIiwib25DYWxsQWN0aW9uIiwiZWRpdEFjdGlvblZpc2libGUiLCJlZGl0QWN0aW9uRW5hYmxlZCIsIl9lZGl0RG9jdW1lbnQiLCJnZXRNb2RlbCIsImdldFByb3BlcnR5IiwiX3NhdmVEb2N1bWVudCIsIl9hcHBseURvY3VtZW50Iiwib25UYWJsZUNvbnRleHRDaGFuZ2UiLCJvRXZlbnQiLCJvU291cmNlIiwiZ2V0U291cmNlIiwib1RhYmxlIiwiX2ZpbmRUYWJsZXMiLCJzb21lIiwiX29UYWJsZSIsImdldFJvd0JpbmRpbmciLCJvQ3VycmVudEFjdGlvblByb21pc2UiLCJfZWRpdEZsb3ciLCJnZXRDdXJyZW50QWN0aW9uUHJvbWlzZSIsImFUYWJsZUNvbnRleHRzIiwiZ2V0VHlwZSIsImdldE1ldGFkYXRhIiwiaXNBIiwiZ2V0Q29udGV4dHMiLCJnZXRDdXJyZW50Q29udGV4dHMiLCJvQWN0aW9uUmVzcG9uc2UiLCJjb250cm9sSWQiLCJzSWQiLCJvQWN0aW9uRGF0YSIsIm9EYXRhIiwiYUtleXMiLCJrZXlzIiwiaU5ld0l0ZW1wIiwiZmluZCIsIm9UYWJsZUNvbnRleHQiLCJpIiwib1RhYmxlRGF0YSIsImdldE9iamVjdCIsImJDb21wYXJlIiwiZXZlcnkiLCJzS2V5IiwiYURpYWxvZ3MiLCJJbnN0YW5jZU1hbmFnZXIiLCJnZXRPcGVuRGlhbG9ncyIsIm9EaWFsb2ciLCJsZW5ndGgiLCJkaWFsb2ciLCJkYXRhIiwiYXR0YWNoRXZlbnRPbmNlIiwiZm9jdXNSb3ciLCJkZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSIsImNhdGNoIiwiZXJyIiwiTG9nIiwiZXJyb3IiLCJtZXNzYWdlQnV0dG9uIiwiZmlyZU1vZGVsQ29udGV4dENoYW5nZSIsImVkaXRGbG93IiwiaW52b2tlQWN0aW9uIiwiX3Nob3dNZXNzYWdlUG9wb3ZlciIsIm9uRGF0YVBvaW50VGl0bGVQcmVzc2VkIiwib01hbmlmZXN0T3V0Ym91bmQiLCJzQ29udHJvbENvbmZpZyIsInNDb2xsZWN0aW9uUGF0aCIsIkpTT04iLCJwYXJzZSIsIm9UYXJnZXRJbmZvIiwiYVNlbWFudGljT2JqZWN0TWFwcGluZyIsIkNvbW1vblV0aWxzIiwiZ2V0U2VtYW50aWNPYmplY3RNYXBwaW5nIiwib0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwic01ldGFQYXRoIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0TWV0YVBhdGgiLCJnZXRQYXRoIiwiYU5hdmlnYXRpb25EYXRhIiwiX2dldENoYXJ0Q29udGV4dERhdGEiLCJhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnMiLCJtYXAiLCJvTmF2aWdhdGlvbkRhdGEiLCJtZXRhUGF0aCIsInBhcmFtZXRlcnMiLCJvUGFyYW1zIiwiX2ludGVudEJhc2VkTmF2aWdhdGlvbiIsImdldE91dGJvdW5kUGFyYW1zIiwiT2JqZWN0Iiwic2VtYW50aWNPYmplY3QiLCJhY3Rpb24iLCJuYXZpZ2F0ZSIsIm5hdmlnYXRpb25Db250ZXh0cyIsInNlbWFudGljT2JqZWN0TWFwcGluZyIsIm9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZCIsInNPdXRib3VuZFRhcmdldCIsInNDcmVhdGVQYXRoIiwib25OYXZpZ2F0ZUNoYW5nZSIsImdldEV4dGVuc2lvbkFQSSIsInVwZGF0ZUFwcFN0YXRlIiwiYlNlY3Rpb25OYXZpZ2F0ZWQiLCJvSW50ZXJuYWxNb2RlbENvbnRleHQiLCJzZWN0aW9uTGF5b3V0Iiwib1N1YlNlY3Rpb24iLCJnZXRQYXJhbWV0ZXIiLCJfdXBkYXRlRm9jdXNJbkVkaXRNb2RlIiwib25WYXJpYW50U2VsZWN0ZWQiLCJvblZhcmlhbnRTYXZlZCIsInNldFRpbWVvdXQiLCJuYXZpZ2F0ZVRvU3ViU2VjdGlvbiIsInZEZXRhaWxDb25maWciLCJvRGV0YWlsQ29uZmlnIiwiYnlJZCIsIm9TZWN0aW9uIiwic2VjdGlvbklkIiwic3ViU2VjdGlvbklkIiwiZ2V0U3ViU2VjdGlvbnMiLCJnZXRQYXJlbnQiLCJnZXRWaXNpYmxlIiwiZ2V0UmVzb3VyY2VCdW5kbGUiLCJvUmVzb3VyY2VCdW5kbGUiLCJzVGl0bGUiLCJnZXRUcmFuc2xhdGVkVGV4dCIsImVudGl0eVNldCIsIk1lc3NhZ2VCb3giLCJzY3JvbGxUb1NlY3Rpb24iLCJnZXRJZCIsImZpcmVOYXZpZ2F0ZSIsInNlY3Rpb24iLCJzdWJTZWN0aW9uIiwib25DaGFydFNlbGVjdGlvbkNoYW5nZWQiLCJDaGFydFJ1bnRpbWUiLCJmblVwZGF0ZUNoYXJ0Iiwib25TdGF0ZUNoYW5nZSIsImNsb3NlT1BNZXNzYWdlU3RyaXAiLCJoaWRlTWVzc2FnZSIsIm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcyIsIkV4dGVuc2lvbkFQSSIsImV4dGVuc2lvbkFQSSIsIm9uSW5pdCIsInNldFByb3BlcnR5IiwidmlzaWJpbGl0eSIsIml0ZW1zIiwiX2dldEJhdGNoR3JvdXBzRm9yVmlldyIsInVzZU5ld0xhenlMb2FkaW5nIiwiZ2V0RW5hYmxlTGF6eUxvYWRpbmciLCJhdHRhY2hFdmVudCIsIl9oYW5kbGVTdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0Iiwib0l0ZW1CaW5kaW5nIiwiYXR0YWNoQ2hhbmdlIiwiX2ZuU2hvd09QTWVzc2FnZSIsIm9uRXhpdCIsImRlc3Ryb3kiLCJvTWVzc2FnZVBvcG92ZXIiLCJpc09wZW4iLCJjbG9zZSIsImlzS2VlcEFsaXZlIiwic2V0S2VlcEFsaXZlIiwiaXNDb25uZWN0ZWQiLCJkaXNjb25uZWN0IiwidmlldyIsIm1lc3NhZ2VzIiwiZ2V0SXRlbXMiLCJpdGVtIiwiZmlsdGVyIiwibWVzc2FnZSIsImdldFRhcmdldHMiLCJzaG93TWVzc2FnZXMiLCJfZ2V0VGFibGVCaW5kaW5nIiwib25CZWZvcmVSZW5kZXJpbmciLCJQYWdlQ29udHJvbGxlciIsInByb3RvdHlwZSIsImFwcGx5Iiwib1ZpZXdEYXRhIiwicmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCIsIkNvbW1vbkhlbHBlciIsInNldE1ldGFNb2RlbCIsImdldEFwcENvbXBvbmVudCIsIm9uQWZ0ZXJSZW5kZXJpbmciLCJyZXNwb25zZSIsIm9FcnJvciIsIl9vbkJlZm9yZUJpbmRpbmciLCJhVGFibGVzIiwib0ludGVybmFsTW9kZWwiLCJhQmF0Y2hHcm91cHMiLCJvRmFzdENyZWF0aW9uUm93IiwicHVzaCIsImJEcmFmdE5hdmlnYXRpb24iLCJfY2xvc2VTaWRlQ29udGVudCIsIm9wQ29udGV4dCIsImhhc1BlbmRpbmdDaGFuZ2VzIiwiZ2V0QmluZGluZyIsInJlc2V0Q2hhbmdlcyIsImdldENyZWF0aW9uUm93Iiwic2V0QmluZGluZ0NvbnRleHQiLCJmblNjcm9sbFRvUHJlc2VudFNlY3Rpb24iLCJpc0ZpcnN0UmVuZGVyaW5nIiwiYlBlcnNpc3RPUFNjcm9sbCIsInNldFNlbGVjdGVkU2VjdGlvbiIsIm9EZWxlZ2F0ZU9uQmVmb3JlIiwiYWRkRXZlbnREZWxlZ2F0ZSIsInBhZ2VSZWFkeSIsInJlbW92ZUV2ZW50RGVsZWdhdGUiLCJvQmluZGluZyIsImxpc3RCaW5kaW5nIiwib1BhZ2luYXRvckN1cnJlbnRDb250ZXh0Iiwib0JpbmRpbmdUb1VzZSIsInBhZ2luYXRvciIsImluaXRpYWxpemUiLCJzQmluZGluZ1BhdGgiLCJ0ZXN0Iiwic0xpc3RCaW5kaW5nUGF0aCIsInJlcGxhY2UiLCJPRGF0YUxpc3RCaW5kaW5nIiwib01vZGVsIiwiX3NldExpc3RCaW5kaW5nQXN5bmMiLCJkZXRhY2hFdmVudCIsImFTZWN0aW9ucyIsImdldFNlY3Rpb25zIiwiYlVzZUljb25UYWJCYXIiLCJnZXRVc2VJY29uVGFiQmFyIiwiaVNraXAiLCJiSXNJbkVkaXRNb2RlIiwiYkVkaXRhYmxlSGVhZGVyIiwiZWRpdGFibGVIZWFkZXJDb250ZW50IiwiaVNlY3Rpb24iLCJhU3ViU2VjdGlvbnMiLCJpU3ViU2VjdGlvbiIsImlzVmlzaWJpbGl0eUR5bmFtaWMiLCJwbGFjZWhvbGRlciIsImlzUGxhY2Vob2xkZXJFbmFibGVkIiwic2hvd1BsYWNlaG9sZGVyIiwib05hdkNvbnRhaW5lciIsIm9Db250YWluZXIiLCJfZ2V0Rmlyc3RDbGlja2FibGVFbGVtZW50Iiwib0ZpcnN0Q2xpY2thYmxlRWxlbWVudCIsImFBY3Rpb25zIiwiZ2V0SGVhZGVyVGl0bGUiLCJnZXRBY3Rpb25zIiwib0FjdGlvbiIsImdldEVuYWJsZWQiLCJfZ2V0Rmlyc3RFbXB0eU1hbmRhdG9yeUZpZWxkRnJvbVN1YlNlY3Rpb24iLCJhQmxvY2tzIiwiZ2V0QmxvY2tzIiwiYmxvY2siLCJhRm9ybUNvbnRhaW5lcnMiLCJnZXRGb3JtQ29udGFpbmVycyIsImdldENvbnRlbnQiLCJmb3JtQ29udGFpbmVyIiwiYUZvcm1FbGVtZW50cyIsImdldEZvcm1FbGVtZW50cyIsImZvcm1FbGVtZW50IiwiYUZpZWxkcyIsImdldEZpZWxkcyIsImdldFJlcXVpcmVkIiwiZ2V0VmFsdWUiLCJkZWJ1ZyIsIm9NYW5kYXRvcnlGaWVsZCIsIm9GaWVsZFRvRm9jdXMiLCJjb250ZW50IiwiZ2V0Q29udGVudEVkaXQiLCJfZ2V0Rmlyc3RFZGl0YWJsZUlucHV0IiwiZm9jdXMiLCJfb25CYWNrTmF2aWdhdGlvbkluRHJhZnQiLCJtZXNzYWdlSGFuZGxlciIsInJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcyIsImdldFJvdXRlclByb3h5IiwiY2hlY2tJZkJhY2tIYXNTYW1lQ29udGV4dCIsImhpc3RvcnkiLCJiYWNrIiwiZHJhZnQiLCJwcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbiIsIkZ1bmN0aW9uIiwiTmF2aWdhdGlvblR5cGUiLCJCYWNrTmF2aWdhdGlvbiIsIl9vbkFmdGVyQmluZGluZyIsIm9CaW5kaW5nQ29udGV4dCIsImVuYWJsZUZhc3RDcmVhdGlvblJvdyIsIm9MaXN0QmluZGluZyIsIm9GYXN0Q3JlYXRpb25MaXN0QmluZGluZyIsIm9GYXN0Q3JlYXRpb25Db250ZXh0Iiwib0ZpbmFsVUlTdGF0ZSIsImJpbmRMaXN0IiwiZ2V0Q29udGV4dCIsIiQkdXBkYXRlR3JvdXBJZCIsIiQkZ3JvdXBJZCIsInJlZnJlc2hJbnRlcm5hbCIsImNyZWF0ZSIsImNyZWF0ZWQiLCJ0cmFjZSIsIl9zaWRlRWZmZWN0cyIsImNsZWFyUHJvcGVydGllc1N0YXR1cyIsImFJQk5BY3Rpb25zIiwiZm9yRWFjaCIsImdldElCTkFjdGlvbnMiLCJvVGFibGVSb3dCaW5kaW5nIiwiTW9kZWxIZWxwZXIiLCJpc1N0aWNreVNlc3Npb25TdXBwb3J0ZWQiLCJyZW1vdmVDYWNoZXNBbmRNZXNzYWdlcyIsIm9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAiLCJwYXJzZUN1c3RvbURhdGEiLCJEZWxlZ2F0ZVV0aWwiLCJnZXRDdXN0b21EYXRhIiwiYVNlbGVjdGVkQ29udGV4dHMiLCJnZXRTZWxlY3RlZENvbnRleHRzIiwiQWN0aW9uUnVudGltZSIsInNldEFjdGlvbkVuYWJsZW1lbnQiLCJjbGVhclNlbGVjdGlvbiIsImdldFNlbWFudGljVGFyZ2V0c0Zyb21QYWdlTW9kZWwiLCJvT2JqZWN0UGFnZVRpdGxlIiwiYUlCTkhlYWRlckFjdGlvbnMiLCJjb25jYXQiLCJ1cGRhdGVEYXRhRmllbGRGb3JJQk5CdXR0b25zVmlzaWJpbGl0eSIsImhhbmRsZVRhYmxlTW9kaWZpY2F0aW9ucyIsImZuSGFuZGxlVGFibGVQYXRjaEV2ZW50cyIsImZuSGFuZGxlQ2hhbmdlIiwiZGV0YWNoQ2hhbmdlIiwiY29tcHV0ZUVkaXRNb2RlIiwiaXNDb2xsYWJvcmF0aW9uRHJhZnRTdXBwb3J0ZWQiLCJjb25uZWN0Iiwib0NhY2hlIiwiX3VwZGF0ZVJlbGF0ZWRBcHBzIiwiZm5VcGRhdGVSZWxhdGVkQXBwcyIsImRldGFjaERhdGFSZWNlaXZlZCIsImF0dGFjaERhdGFSZWNlaXZlZCIsImN1cnJlbnRCaW5kaW5nIiwiaGFuZGxlUGF0Y2hTZW50IiwiVGFibGVVdGlscyIsIndoZW5Cb3VuZCIsIl90cmlnZ2VyVmlzaWJsZVN1YlNlY3Rpb25zRXZlbnRzIiwib25QYWdlUmVhZHkiLCJzZXRGb2N1cyIsImlzSW5EaXNwbGF5TW9kZSIsIm9TZWxlY3RlZFNlY3Rpb24iLCJDb3JlIiwiZ2V0U2VsZWN0ZWRTZWN0aW9uIiwiYklzU3RpY2t5TW9kZSIsIm9BcHBDb21wb25lbnQiLCJnZXRTaGVsbFNlcnZpY2VzIiwic2V0QmFja05hdmlnYXRpb24iLCJnZXRBcHBTdGF0ZUhhbmRsZXIiLCJhcHBseUFwcFN0YXRlIiwiZm9yY2VGb2N1cyIsIkVycm9yIiwiX2NoZWNrRGF0YVBvaW50VGl0bGVGb3JFeHRlcm5hbE5hdmlnYXRpb24iLCJfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24iLCJvT2JqZWN0UGFnZVN1YnRpdGxlIiwib0N1c3RvbURhdGEiLCJnZXRLZXkiLCJ0aXRsZSIsInN1YnRpdGxlIiwiaW50ZW50IiwiaWNvbiIsIl9leGVjdXRlSGVhZGVyU2hvcnRjdXQiLCJzQnV0dG9uSWQiLCJvQnV0dG9uIiwib0VsZW1lbnQiLCJmaXJlQnV0dG9uUHJlc3MiLCJfZXhlY3V0ZUZvb3RlclNob3J0Y3V0IiwiZ2V0Rm9vdGVyIiwiZ2V0TmFtZSIsIl9leGVjdXRlVGFiU2hvcnRDdXQiLCJvRXhlY3V0aW9uIiwiaVNlY3Rpb25JbmRleE1heCIsInNDb21tYW5kIiwiZ2V0Q29tbWFuZCIsIm5ld1NlY3Rpb24iLCJpU2VsZWN0ZWRTZWN0aW9uSW5kZXgiLCJpbmRleE9mU2VjdGlvbiIsIl9nZXRGb290ZXJWaXNpYmlsaXR5Iiwic1ZpZXdJZCIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImdldE1lc3NhZ2VNYW5hZ2VyIiwiZ2V0TWVzc2FnZU1vZGVsIiwiZ2V0RGF0YSIsIm9NZXNzYWdlIiwidmFsaWRhdGlvbiIsInR5cGUiLCJ0YXJnZXQiLCJpbmRleE9mIiwib1JldCIsInJvb3RWaWV3Q29udHJvbGxlciIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImN1cnJlbnRQYWdlVmlldyIsImlzRmNsRW5hYmxlZCIsImdldFJpZ2h0bW9zdFZpZXciLCJnZXRSb290Q29udGFpbmVyIiwiZ2V0Q3VycmVudFBhZ2UiLCJvTWVzc2FnZUJ1dHRvbiIsImdldExlbmd0aCIsInNldFZpc2libGUiLCJvcGVuQnkiLCJCdXN5TG9ja2VyIiwibG9jayIsImVkaXREb2N1bWVudCIsImZpbmFsbHkiLCJ1bmxvY2siLCJnZXREcmFmdFJvb3RDb250ZXh0IiwiY29udGV4dCIsImRyYWZ0Um9vdENvbnRleHRQYXRoIiwiZ2V0RHJhZnRSb290UGF0aCIsInNpbXBsZURyYWZ0Um9vdENvbnRleHQiLCJleGlzdGluZ0JpbmRpbmdDb250ZXh0T25QYWdlIiwiZ2V0SW5zdGFuY2VkVmlld3MiLCJwYWdlVmlldyIsImludGVybmFsTW9kZWwiLCJtb2RlbCIsIm1ldGFNb2RlbCIsInNFbnRpdHlQYXRoIiwibURhdGFNb2RlbCIsIk1ldGFNb2RlbENvbnZlcnRlciIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsImJpbmRDb250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0IiwicmVxdWVzdFByb3BlcnR5IiwidGFyZ2V0RW50aXR5VHlwZSIsIm5hbWUiLCJfdmFsaWRhdGVEb2N1bWVudCIsImNvbnRyb2wiLCJnZXRDdXJyZW50Rm9jdXNlZENvbnRyb2xJZCIsImlzVHJhbnNpZW50Iiwic3luY1Rhc2siLCJhcHBDb21wb25lbnQiLCJzaWRlRWZmZWN0c1NlcnZpY2UiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJlbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwiZ2xvYmFsU2lkZUVmZmVjdHMiLCJnZXRHbG9iYWxPRGF0YUVudGl0eVNpZGVFZmZlY3RzIiwiUHJvbWlzZSIsImFsbCIsInNpZGVFZmZlY3RzIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwiZHJhZnRSb290Q29udGV4dCIsImV4ZWN1dGVEcmFmdFZhbGlkYXRpb24iLCJhV2FpdENyZWF0ZURvY3VtZW50cyIsImJFeGVjdXRlU2lkZUVmZmVjdHNPbkVycm9yIiwiY3JlYXRpb25Nb2RlIiwiY3JlYXRpb25Sb3ciLCJjcmVhdGVBdEVuZCIsImJDcmVhdGVEb2N1bWVudCIsImJTa2lwU2lkZUVmZmVjdHMiLCJjcmVhdGVEb2N1bWVudCIsImFCaW5kaW5ncyIsImJpbmRpbmdzIiwic2F2ZURvY3VtZW50IiwiaXNMb2NrZWQiLCJfbWFuYWdlQ29sbGFib3JhdGlvbiIsIm9wZW5NYW5hZ2VEaWFsb2ciLCJfc2hvd0NvbGxhYm9yYXRpb25Vc2VyRGV0YWlscyIsImV2ZW50Iiwic2hvd1VzZXJEZXRhaWxzIiwiX2NhbmNlbERvY3VtZW50IiwiY2FuY2VsQnV0dG9uIiwiY2FuY2VsRG9jdW1lbnQiLCJhcHBseURvY3VtZW50IiwicmVzb2x2ZVN0cmluZ3RvQm9vbGVhbiIsInVwZGF0ZVJlbGF0ZWRBcHBzRGV0YWlscyIsIl9maW5kQ29udHJvbEluU3ViU2VjdGlvbiIsImFQYXJlbnRFbGVtZW50IiwiYVN1YnNlY3Rpb24iLCJhQ29udHJvbHMiLCJiSXNDaGFydCIsImFTdWJTZWN0aW9uVGFibGVzIiwiZWxlbWVudCIsIm1BZ2dyZWdhdGlvbnMiLCJnZXRBZ2dyZWdhdGlvbiIsImFJdGVtcyIsIm9JdGVtIiwiZ2V0TWFpbkNvbnRlbnQiLCJncmlkVGFibGUiLCJoYXNTdHlsZUNsYXNzIiwiYWRkU3R5bGVDbGFzcyIsIl9nZXRBbGxTdWJTZWN0aW9ucyIsIl9nZXRBbGxCbG9ja3MiLCJnZXRNb3JlQmxvY2tzIiwiX2ZpbmRDaGFydHMiLCJhQ2hhcnRzIiwib0Jsb2NrIiwib0NvbnRlbnQiLCJzZXRTaG93U2lkZUNvbnRlbnQiLCJvQ2hhcnRDb250ZXh0Iiwic0NoYXJ0UGF0aCIsIm9Db250ZXh0RGF0YSIsIm9DaGFydENvbnRleHREYXRhIiwiX3Njcm9sbFRhYmxlc1RvUm93Iiwic1Jvd1BhdGgiLCJUYWJsZVNjcm9sbGVyIiwic2Nyb2xsVGFibGVUb1JvdyIsIl9tZXJnZU11bHRpcGxlQ29udGV4dHMiLCJvUGFnZUNvbnRleHQiLCJhTGluZUNvbnRleHQiLCJhQXR0cmlidXRlcyIsImFQYWdlQXR0cmlidXRlcyIsInNNZXRhUGF0aExpbmUiLCJzUGF0aExpbmUiLCJzUGFnZVBhdGgiLCJvTWV0YU1vZGVsIiwic01ldGFQYXRoUGFnZSIsIm9TaW5nbGVDb250ZXh0Iiwib1N1YkNoYXJ0Q29udGV4dERhdGEiLCJjb250ZXh0RGF0YSIsInJlbW92ZVNlbnNpdGl2ZURhdGEiLCJvUGFnZUxldmVsU1YiLCJhZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudCIsIlNlbGVjdGlvblZhcmlhbnQiLCJzZWxlY3Rpb25WYXJpYW50IiwiYXR0cmlidXRlcyIsIm9Db25maWd1cmF0aW9ucyIsImNvbnRyb2xDb25maWd1cmF0aW9uIiwiYUNvbmZpZ3VyYXRpb25zIiwib0NvbmZpZ3VyYXRpb24iLCJyZXF1ZXN0R3JvdXBJZCIsIl9zZXRCcmVhZGNydW1iTGlua3MiLCJhUHJvbWlzZXMiLCJhU2tpcFBhcmFtZXRlcml6ZWQiLCJzTmV3UGF0aCIsImFQYXRoUGFydHMiLCJzcGxpdCIsInNQYXRoIiwic2hpZnQiLCJzcGxpY2UiLCJzUGF0aFBhcnQiLCJvUm9vdFZpZXdDb250cm9sbGVyIiwic1BhcmFtZXRlclBhdGgiLCJiUmVzdWx0Q29udGV4dCIsImdldFRpdGxlSW5mb0Zyb21QYXRoIiwidGl0bGVIaWVyYXJjaHlJbmZvcyIsImlkeCIsImhpZXJhcmNoeVBvc2l0aW9uIiwib0xpbmsiLCJ0aXRsZUhpZXJhcmNoeUluZm8iLCJnZXRMaW5rcyIsIkxpbmsiLCJzZXRUZXh0Iiwic2V0SHJlZiIsImVuY29kZVVSSSIsImFkZExpbmsiLCJvRGF0YVBvaW50cyIsImdldEhlYWRlckZhY2V0SXRlbUNvbmZpZ0ZvckV4dGVybmFsTmF2aWdhdGlvbiIsImdldFJvdXRpbmdTZXJ2aWNlIiwiZ2V0T3V0Ym91bmRzIiwib1NoZWxsU2VydmljZXMiLCJyZXF1ZXN0T2JqZWN0IiwiZm5HZXRMaW5rcyIsImZuT25FcnJvciIsImZuU2V0TGlua0VuYWJsZW1lbnQiLCJpZCIsImFTdXBwb3J0ZWRMaW5rcyIsInNMaW5rSWQiLCJzdXBwb3J0ZWQiLCJvU3ViRGF0YVBvaW50cyIsIm9QYWdlRGF0YSIsIm9EYXRhUG9pbnQiLCJvTGlua0NvbnRleHQiLCJvTGlua0RhdGEiLCJvTWl4ZWRDb250ZXh0IiwibWVyZ2UiLCJvTWFwcGluZyIsInNNYWluUHJvcGVydHkiLCJzTWFwcGVkUHJvcGVydHkiLCJoYXNPd25Qcm9wZXJ0eSIsIm9OZXdNYXBwaW5nIiwiaXNOYXZpZ2F0aW9uU3VwcG9ydGVkIiwicGFyYW1zIiwiYUxpbmtzIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJPYmplY3RQYWdlQ29udHJvbGxlci5jb250cm9sbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIFJlc291cmNlQnVuZGxlIGZyb20gXCJzYXAvYmFzZS9pMThuL1Jlc291cmNlQnVuZGxlXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IEFjdGlvblJ1bnRpbWUgZnJvbSBcInNhcC9mZS9jb3JlL0FjdGlvblJ1bnRpbWVcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwic2FwL2ZlL2NvcmUvQ29tbW9uVXRpbHNcIjtcbmltcG9ydCBCdXN5TG9ja2VyIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9CdXN5TG9ja2VyXCI7XG5pbXBvcnQgeyBjb25uZWN0LCBkaXNjb25uZWN0LCBpc0Nvbm5lY3RlZCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL0FjdGl2aXR5U3luY1wiO1xuaW1wb3J0IHsgb3Blbk1hbmFnZURpYWxvZywgc2hvd1VzZXJEZXRhaWxzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2NvbGxhYm9yYXRpb24vTWFuYWdlXCI7XG5pbXBvcnQgRWRpdEZsb3cgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0VkaXRGbG93XCI7XG5pbXBvcnQgZHJhZnQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL2VkaXRGbG93L2RyYWZ0XCI7XG5pbXBvcnQgSW50ZW50QmFzZWROYXZpZ2F0aW9uIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlbnRCYXNlZE5hdmlnYXRpb25cIjtcbmltcG9ydCBJbnRlcm5hbEVkaXRGbG93IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbEVkaXRGbG93XCI7XG5pbXBvcnQgSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxSb3V0aW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCBNYXNzRWRpdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWFzc0VkaXRcIjtcbmltcG9ydCBNZXNzYWdlSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCBQYWdlUmVhZHkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BhZ2VSZWFkeVwiO1xuaW1wb3J0IFBhZ2luYXRvciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGFnaW5hdG9yXCI7XG5pbXBvcnQgUGxhY2Vob2xkZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BsYWNlaG9sZGVyXCI7XG5pbXBvcnQgU2hhcmUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NoYXJlXCI7XG5pbXBvcnQgVmlld1N0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCAqIGFzIE1ldGFNb2RlbENvbnZlcnRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uLCB1c2luZ0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDaGFydFJ1bnRpbWUgZnJvbSBcInNhcC9mZS9tYWNyb3MvY2hhcnQvQ2hhcnRSdW50aW1lXCI7XG5pbXBvcnQgQ29tbW9uSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL0NvbW1vbkhlbHBlclwiO1xuaW1wb3J0IERlbGVnYXRlVXRpbCBmcm9tIFwic2FwL2ZlL21hY3Jvcy9EZWxlZ2F0ZVV0aWxcIjtcbmltcG9ydCBUYWJsZVV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1V0aWxzXCI7XG5pbXBvcnQgU2VsZWN0aW9uVmFyaWFudCBmcm9tIFwic2FwL2ZlL25hdmlnYXRpb24vU2VsZWN0aW9uVmFyaWFudFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9iamVjdFBhZ2VFeHRlbnNpb25BUEkgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL0V4dGVuc2lvbkFQSVwiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBFeHRlbnNpb25BUEkgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL0V4dGVuc2lvbkFQSVwiO1xuaW1wb3J0IEVkaXRGbG93T3ZlcnJpZGVzIGZyb20gXCJzYXAvZmUvdGVtcGxhdGVzL1Jvb3RDb250YWluZXIvb3ZlcnJpZGVzL0VkaXRGbG93XCI7XG5pbXBvcnQgVGFibGVTY3JvbGxlciBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9UYWJsZVNjcm9sbGVyXCI7XG5pbXBvcnQgSW5zdGFuY2VNYW5hZ2VyIGZyb20gXCJzYXAvbS9JbnN0YW5jZU1hbmFnZXJcIjtcbmltcG9ydCBMaW5rIGZyb20gXCJzYXAvbS9MaW5rXCI7XG5pbXBvcnQgTWVzc2FnZUJveCBmcm9tIFwic2FwL20vTWVzc2FnZUJveFwiO1xuaW1wb3J0IHR5cGUgUG9wb3ZlciBmcm9tIFwic2FwL20vUG9wb3ZlclwiO1xuaW1wb3J0IENvcmUgZnJvbSBcInNhcC91aS9jb3JlL0NvcmVcIjtcbmltcG9ydCB0eXBlIE1lc3NhZ2UgZnJvbSBcInNhcC91aS9jb3JlL21lc3NhZ2UvTWVzc2FnZVwiO1xuaW1wb3J0IE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgdHlwZSBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IHR5cGUgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSBSZXNvdXJjZU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvcmVzb3VyY2UvUmVzb3VyY2VNb2RlbFwiO1xuaW1wb3J0IHR5cGUgQnJlYWRDcnVtYnMgZnJvbSBcInNhcC91eGFwL0JyZWFkQ3J1bWJzXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlIGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlTGF5b3V0IGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlTGF5b3V0XCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlU2VjdGlvbiBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZVNlY3Rpb25cIjtcbmltcG9ydCB0eXBlIE9iamVjdFBhZ2VTdWJTZWN0aW9uIGZyb20gXCJzYXAvdXhhcC9PYmplY3RQYWdlU3ViU2VjdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBPRGF0YUNvbnRleHRCaW5kaW5nRXgsIFY0Q29udGV4dCB9IGZyb20gXCJ0eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcbmltcG9ydCBJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSBmcm9tIFwiLi9vdmVycmlkZXMvSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxSb3V0aW5nT3ZlcnJpZGUgZnJvbSBcIi4vb3ZlcnJpZGVzL0ludGVybmFsUm91dGluZ1wiO1xuaW1wb3J0IE1lc3NhZ2VIYW5kbGVyT3ZlcnJpZGUgZnJvbSBcIi4vb3ZlcnJpZGVzL01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgUGFnaW5hdG9yT3ZlcnJpZGUgZnJvbSBcIi4vb3ZlcnJpZGVzL1BhZ2luYXRvclwiO1xuaW1wb3J0IFNoYXJlT3ZlcnJpZGVzIGZyb20gXCIuL292ZXJyaWRlcy9TaGFyZVwiO1xuaW1wb3J0IFZpZXdTdGF0ZU92ZXJyaWRlcyBmcm9tIFwiLi9vdmVycmlkZXMvVmlld1N0YXRlXCI7XG5cbkBkZWZpbmVVSTVDbGFzcyhcInNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlQ29udHJvbGxlclwiKVxuY2xhc3MgT2JqZWN0UGFnZUNvbnRyb2xsZXIgZXh0ZW5kcyBQYWdlQ29udHJvbGxlciB7XG5cdG9WaWV3ITogYW55O1xuXHRAdXNpbmdFeHRlbnNpb24oUGxhY2Vob2xkZXIpXG5cdHBsYWNlaG9sZGVyITogUGxhY2Vob2xkZXI7XG5cdEB1c2luZ0V4dGVuc2lvbihFZGl0Rmxvdylcblx0ZWRpdEZsb3chOiBFZGl0Rmxvdztcblx0QHVzaW5nRXh0ZW5zaW9uKFNoYXJlLm92ZXJyaWRlKFNoYXJlT3ZlcnJpZGVzKSlcblx0c2hhcmUhOiBTaGFyZTtcblx0QHVzaW5nRXh0ZW5zaW9uKEludGVybmFsRWRpdEZsb3cub3ZlcnJpZGUoRWRpdEZsb3dPdmVycmlkZXMpKVxuXHRfZWRpdEZsb3chOiBJbnRlcm5hbEVkaXRGbG93O1xuXHRAdXNpbmdFeHRlbnNpb24oSW50ZXJuYWxSb3V0aW5nLm92ZXJyaWRlKEludGVybmFsUm91dGluZ092ZXJyaWRlKSlcblx0X3JvdXRpbmchOiBJbnRlcm5hbFJvdXRpbmc7XG5cdEB1c2luZ0V4dGVuc2lvbihQYWdpbmF0b3Iub3ZlcnJpZGUoUGFnaW5hdG9yT3ZlcnJpZGUpKVxuXHRwYWdpbmF0b3IhOiBQYWdpbmF0b3I7XG5cdEB1c2luZ0V4dGVuc2lvbihNZXNzYWdlSGFuZGxlci5vdmVycmlkZShNZXNzYWdlSGFuZGxlck92ZXJyaWRlKSlcblx0bWVzc2FnZUhhbmRsZXIhOiBNZXNzYWdlSGFuZGxlcjtcblx0QHVzaW5nRXh0ZW5zaW9uKEludGVudEJhc2VkTmF2aWdhdGlvbi5vdmVycmlkZShJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSkpXG5cdGludGVudEJhc2VkTmF2aWdhdGlvbiE6IEludGVudEJhc2VkTmF2aWdhdGlvbjtcblx0QHVzaW5nRXh0ZW5zaW9uKFxuXHRcdEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uLm92ZXJyaWRlKHtcblx0XHRcdGdldE5hdmlnYXRpb25Nb2RlOiBmdW5jdGlvbiAodGhpczogSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdFx0Y29uc3QgYklzU3RpY2t5RWRpdE1vZGUgPVxuXHRcdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXIpLmdldFN0aWNreUVkaXRNb2RlICYmXG5cdFx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuZ2V0U3RpY2t5RWRpdE1vZGUoKTtcblx0XHRcdFx0cmV0dXJuIGJJc1N0aWNreUVkaXRNb2RlID8gXCJleHBsYWNlXCIgOiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fSlcblx0KVxuXHRfaW50ZW50QmFzZWROYXZpZ2F0aW9uITogSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb247XG5cdEB1c2luZ0V4dGVuc2lvbihWaWV3U3RhdGUub3ZlcnJpZGUoVmlld1N0YXRlT3ZlcnJpZGVzKSlcblx0dmlld1N0YXRlITogVmlld1N0YXRlO1xuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0UGFnZVJlYWR5Lm92ZXJyaWRlKHtcblx0XHRcdGlzQ29udGV4dEV4cGVjdGVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pXG5cdClcblx0cGFnZVJlYWR5ITogUGFnZVJlYWR5O1xuXHRAdXNpbmdFeHRlbnNpb24oTWFzc0VkaXQpXG5cdG1hc3NFZGl0ITogTWFzc0VkaXQ7XG5cdHByaXZhdGUgbUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzPzogUmVjb3JkPHN0cmluZywgT2JqZWN0UGFnZUV4dGVuc2lvbkFQST47XG5cdHByb3RlY3RlZCBleHRlbnNpb25BUEk/OiBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJO1xuXHRwcml2YXRlIG9SZXNvdXJjZUJ1bmRsZT86IFJlc291cmNlQnVuZGxlO1xuXHRwcml2YXRlIGJTZWN0aW9uTmF2aWdhdGVkPzogYm9vbGVhbjtcblx0cHJpdmF0ZSBzd2l0Y2hEcmFmdEFuZEFjdGl2ZVBvcE92ZXI/OiBQb3BvdmVyO1xuXHRwcml2YXRlIGN1cnJlbnRCaW5kaW5nPzogQmluZGluZztcblx0cHJpdmF0ZSBtZXNzYWdlQnV0dG9uOiBhbnk7XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldEV4dGVuc2lvbkFQSShzSWQ/OiBzdHJpbmcpOiBFeHRlbnNpb25BUEkge1xuXHRcdGlmIChzSWQpIHtcblx0XHRcdC8vIHRvIGFsbG93IGxvY2FsIElEIHVzYWdlIGZvciBjdXN0b20gcGFnZXMgd2UnbGwgY3JlYXRlL3JldHVybiBvd24gaW5zdGFuY2VzIGZvciBjdXN0b20gc2VjdGlvbnNcblx0XHRcdHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzID0gdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMgfHwge307XG5cblx0XHRcdGlmICghdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXSkge1xuXHRcdFx0XHR0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdID0gbmV3IEV4dGVuc2lvbkFQSSh0aGlzLCBzSWQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICghdGhpcy5leHRlbnNpb25BUEkpIHtcblx0XHRcdFx0dGhpcy5leHRlbnNpb25BUEkgPSBuZXcgRXh0ZW5zaW9uQVBJKHRoaXMpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9uQVBJO1xuXHRcdH1cblx0fVxuXG5cdG9uSW5pdCgpIHtcblx0XHRzdXBlci5vbkluaXQoKTtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cblx0XHQvLyBTZXR0aW5nIGRlZmF1bHRzIG9mIGludGVybmFsIG1vZGVsIGNvbnRleHRcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJleHRlcm5hbE5hdmlnYXRpb25Db250ZXh0XCIsIHsgXCJwYWdlXCI6IHRydWUgfSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcInJlbGF0ZWRBcHBzXCIsIHtcblx0XHRcdHZpc2liaWxpdHk6IGZhbHNlLFxuXHRcdFx0aXRlbXM6IG51bGxcblx0XHR9KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwiYmF0Y2hHcm91cHNcIiwgdGhpcy5fZ2V0QmF0Y2hHcm91cHNGb3JWaWV3KCkpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJlcnJvck5hdmlnYXRpb25TZWN0aW9uRmxhZ1wiLCBmYWxzZSk7XG5cdFx0aWYgKCEodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLnVzZU5ld0xhenlMb2FkaW5nICYmIChvT2JqZWN0UGFnZSBhcyBhbnkpLmdldEVuYWJsZUxhenlMb2FkaW5nKCkpIHtcblx0XHRcdC8vQXR0YWNoaW5nIHRoZSBldmVudCB0byBtYWtlIHRoZSBzdWJzZWN0aW9uIGNvbnRleHQgYmluZGluZyBhY3RpdmUgd2hlbiBpdCBpcyB2aXNpYmxlLlxuXHRcdFx0b09iamVjdFBhZ2UuYXR0YWNoRXZlbnQoXCJzdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0XCIsIHRoaXMuX2hhbmRsZVN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnQuYmluZCh0aGlzKSk7XG5cdFx0fVxuXHRcdHRoaXMubWVzc2FnZUJ1dHRvbiA9IHRoaXMuZ2V0VmlldygpLmJ5SWQoXCJmZTo6Rm9vdGVyQmFyOjpNZXNzYWdlQnV0dG9uXCIpO1xuXHRcdHRoaXMubWVzc2FnZUJ1dHRvbi5vSXRlbUJpbmRpbmcuYXR0YWNoQ2hhbmdlKHRoaXMuX2ZuU2hvd09QTWVzc2FnZSwgdGhpcyk7XG5cdH1cblxuXHRvbkV4aXQoKSB7XG5cdFx0aWYgKHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHNJZCBvZiBPYmplY3Qua2V5cyh0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcykpIHtcblx0XHRcdFx0aWYgKHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF0pIHtcblx0XHRcdFx0XHR0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdLmRlc3Ryb3koKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGVsZXRlIHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzO1xuXHRcdH1cblx0XHRpZiAodGhpcy5leHRlbnNpb25BUEkpIHtcblx0XHRcdHRoaXMuZXh0ZW5zaW9uQVBJLmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0ZGVsZXRlIHRoaXMuZXh0ZW5zaW9uQVBJO1xuXG5cdFx0Y29uc3Qgb01lc3NhZ2VQb3BvdmVyID0gdGhpcy5tZXNzYWdlQnV0dG9uID8gdGhpcy5tZXNzYWdlQnV0dG9uLm9NZXNzYWdlUG9wb3ZlciA6IG51bGw7XG5cdFx0aWYgKG9NZXNzYWdlUG9wb3ZlciAmJiBvTWVzc2FnZVBvcG92ZXIuaXNPcGVuKCkpIHtcblx0XHRcdG9NZXNzYWdlUG9wb3Zlci5jbG9zZSgpO1xuXHRcdH1cblx0XHQvL3doZW4gZXhpdGluZyB3ZSBzZXQga2VlcEFsaXZlIGNvbnRleHQgdG8gZmFsc2Vcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRpZiAob0NvbnRleHQgJiYgb0NvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKGZhbHNlKTtcblx0XHR9XG5cdFx0aWYgKGlzQ29ubmVjdGVkKHRoaXMuZ2V0VmlldygpKSkge1xuXHRcdFx0ZGlzY29ubmVjdCh0aGlzLmdldFZpZXcoKSk7IC8vIENsZWFudXAgY29sbGFib3JhdGlvbiBjb25uZWN0aW9uIHdoZW4gbGVhdmluZyB0aGUgYXBwXG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBzaG93IHRoZSBtZXNzYWdlIHN0cmlwIG9uIHRoZSBvYmplY3QgcGFnZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9mblNob3dPUE1lc3NhZ2UoKSB7XG5cdFx0Y29uc3QgZXh0ZW5zaW9uQVBJID0gdGhpcy5nZXRFeHRlbnNpb25BUEkoKTtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3QgbWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VCdXR0b24ub01lc3NhZ2VQb3BvdmVyXG5cdFx0XHQuZ2V0SXRlbXMoKVxuXHRcdFx0Lm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLmdldEJpbmRpbmdDb250ZXh0KFwibWVzc2FnZVwiKS5nZXRPYmplY3QoKSlcblx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IHtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpWzBdID09PSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKTtcblx0XHRcdH0pO1xuXG5cdFx0aWYgKGV4dGVuc2lvbkFQSSkge1xuXHRcdFx0ZXh0ZW5zaW9uQVBJLnNob3dNZXNzYWdlcyhtZXNzYWdlcyk7XG5cdFx0fVxuXHR9XG5cblx0X2dldFRhYmxlQmluZGluZyhvVGFibGU6IGFueSkge1xuXHRcdHJldHVybiBvVGFibGUgJiYgb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0fVxuXG5cdG9uQmVmb3JlUmVuZGVyaW5nKCkge1xuXHRcdFBhZ2VDb250cm9sbGVyLnByb3RvdHlwZS5vbkJlZm9yZVJlbmRlcmluZy5hcHBseSh0aGlzKTtcblx0XHQvLyBJbiB0aGUgcmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCBzY2VuYXJpbyB3ZSBuZWVkIHRvIGVuc3VyZSBpbiBjYXNlIG9mIHJlbG9hZC9yZWZyZXNoIHRoYXQgdGhlIG1ldGEgbW9kZWwgaW4gdGhlIG1ldGhvZGUgcmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCBvZiB0aGUgRmllbGRSdW50aW1lIGlzIGF2YWlsYWJsZVxuXHRcdGlmICh0aGlzLm9WaWV3Lm9WaWV3RGF0YT8ucmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCAmJiBDb21tb25IZWxwZXIuZ2V0TWV0YU1vZGVsKCkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Q29tbW9uSGVscGVyLnNldE1ldGFNb2RlbCh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldE1ldGFNb2RlbCgpKTtcblx0XHR9XG5cdH1cblxuXHRvbkFmdGVyUmVuZGVyaW5nKCkge1xuXHRcdCgodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKSBhcyBSZXNvdXJjZU1vZGVsKS5nZXRSZXNvdXJjZUJ1bmRsZSgpIGFzIFByb21pc2U8UmVzb3VyY2VCdW5kbGU+KVxuXHRcdFx0LnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcblx0XHRcdFx0dGhpcy5vUmVzb3VyY2VCdW5kbGUgPSByZXNwb25zZTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRfb25CZWZvcmVCaW5kaW5nKG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHQvLyBUT0RPOiB3ZSBzaG91bGQgY2hlY2sgaG93IHRoaXMgY29tZXMgdG9nZXRoZXIgd2l0aCB0aGUgdHJhbnNhY3Rpb24gaGVscGVyLCBzYW1lIHRvIHRoZSBjaGFuZ2UgaW4gdGhlIGFmdGVyQmluZGluZ1xuXHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9maW5kVGFibGVzKCksXG5cdFx0XHRvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCksXG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0b0ludGVybmFsTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbCxcblx0XHRcdGFCYXRjaEdyb3VwcyA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImJhdGNoR3JvdXBzXCIpLFxuXHRcdFx0aVZpZXdMZXZlbCA9ICh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkudmlld0xldmVsO1xuXHRcdGxldCBvRmFzdENyZWF0aW9uUm93O1xuXHRcdGFCYXRjaEdyb3Vwcy5wdXNoKFwiJGF1dG9cIik7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmJEcmFmdE5hdmlnYXRpb24gIT09IHRydWUpIHtcblx0XHRcdHRoaXMuX2Nsb3NlU2lkZUNvbnRlbnQoKTtcblx0XHR9XG5cdFx0Y29uc3Qgb3BDb250ZXh0ID0gb09iamVjdFBhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGlmIChcblx0XHRcdG9wQ29udGV4dCAmJlxuXHRcdFx0b3BDb250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkgJiZcblx0XHRcdCFhQmF0Y2hHcm91cHMuc29tZShvcENvbnRleHQuZ2V0TW9kZWwoKS5oYXNQZW5kaW5nQ2hhbmdlcy5iaW5kKG9wQ29udGV4dC5nZXRNb2RlbCgpKSlcblx0XHQpIHtcblx0XHRcdC8qIFx0SW4gY2FzZSB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzIGZvciB0aGUgY3JlYXRpb24gcm93IGFuZCBubyBvdGhlcnMgd2UgbmVlZCB0byByZXNldCB0aGUgY2hhbmdlc1xuICAgIFx0XHRcdFx0XHRcdFRPRE86IHRoaXMgaXMganVzdCBhIHF1aWNrIHNvbHV0aW9uLCB0aGlzIG5lZWRzIHRvIGJlIHJld29ya2VkXG4gICAgXHRcdFx0XHQgXHQqL1xuXG5cdFx0XHRvcENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblxuXHRcdC8vIEZvciBub3cgd2UgaGF2ZSB0byBzZXQgdGhlIGJpbmRpbmcgY29udGV4dCB0byBudWxsIGZvciBldmVyeSBmYXN0IGNyZWF0aW9uIHJvd1xuXHRcdC8vIFRPRE86IEdldCByaWQgb2YgdGhpcyBjb2Rpbmcgb3IgbW92ZSBpdCB0byBhbm90aGVyIGxheWVyIC0gdG8gYmUgZGlzY3Vzc2VkIHdpdGggTURDIGFuZCBtb2RlbFxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYVRhYmxlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0b0Zhc3RDcmVhdGlvblJvdyA9IGFUYWJsZXNbaV0uZ2V0Q3JlYXRpb25Sb3coKTtcblx0XHRcdGlmIChvRmFzdENyZWF0aW9uUm93KSB7XG5cdFx0XHRcdG9GYXN0Q3JlYXRpb25Sb3cuc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2Nyb2xsIHRvIHByZXNlbnQgU2VjdGlvbiBzbyB0aGF0IGJpbmRpbmdzIGFyZSBlbmFibGVkIGR1cmluZyBuYXZpZ2F0aW9uIHRocm91Z2ggcGFnaW5hdG9yIGJ1dHRvbnMsIGFzIHRoZXJlIGlzIG5vIHZpZXcgcmVyZW5kZXJpbmcvcmViaW5kXG5cdFx0Y29uc3QgZm5TY3JvbGxUb1ByZXNlbnRTZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKCEob09iamVjdFBhZ2UgYXMgYW55KS5pc0ZpcnN0UmVuZGVyaW5nKCkgJiYgIW1QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwpIHtcblx0XHRcdFx0b09iamVjdFBhZ2Uuc2V0U2VsZWN0ZWRTZWN0aW9uKG51bGwgYXMgYW55KTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdG9PYmplY3RQYWdlLmF0dGFjaEV2ZW50T25jZShcIm1vZGVsQ29udGV4dENoYW5nZVwiLCBmblNjcm9sbFRvUHJlc2VudFNlY3Rpb24pO1xuXG5cdFx0Ly8gaWYgdGhlIHN0cnVjdHVyZSBvZiB0aGUgT2JqZWN0UGFnZUxheW91dCBpcyBjaGFuZ2VkIHRoZW4gc2Nyb2xsIHRvIHByZXNlbnQgU2VjdGlvblxuXHRcdC8vIEZJWE1FIElzIHRoaXMgcmVhbGx5IHdvcmtpbmcgYXMgaW50ZW5kZWQgPyBJbml0aWFsbHkgdGhpcyB3YXMgb25CZWZvcmVSZW5kZXJpbmcsIGJ1dCBuZXZlciB0cmlnZ2VyZWQgb25CZWZvcmVSZW5kZXJpbmcgYmVjYXVzZSBpdCB3YXMgcmVnaXN0ZXJlZCBhZnRlciBpdFxuXHRcdGNvbnN0IG9EZWxlZ2F0ZU9uQmVmb3JlID0ge1xuXHRcdFx0b25BZnRlclJlbmRlcmluZzogZm5TY3JvbGxUb1ByZXNlbnRTZWN0aW9uXG5cdFx0fTtcblx0XHRvT2JqZWN0UGFnZS5hZGRFdmVudERlbGVnYXRlKG9EZWxlZ2F0ZU9uQmVmb3JlLCB0aGlzKTtcblx0XHR0aGlzLnBhZ2VSZWFkeS5hdHRhY2hFdmVudE9uY2UoXCJwYWdlUmVhZHlcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0b09iamVjdFBhZ2UucmVtb3ZlRXZlbnREZWxlZ2F0ZShvRGVsZWdhdGVPbkJlZm9yZSk7XG5cdFx0fSk7XG5cblx0XHQvL1NldCB0aGUgQmluZGluZyBmb3IgUGFnaW5hdG9ycyB1c2luZyBMaXN0QmluZGluZyBJRFxuXHRcdGlmIChpVmlld0xldmVsID4gMSkge1xuXHRcdFx0bGV0IG9CaW5kaW5nID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMubGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBvUGFnaW5hdG9yQ3VycmVudENvbnRleHQgPSBvSW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiKTtcblx0XHRcdGlmIChvUGFnaW5hdG9yQ3VycmVudENvbnRleHQpIHtcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdUb1VzZSA9IG9QYWdpbmF0b3JDdXJyZW50Q29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0XHRcdHRoaXMucGFnaW5hdG9yLmluaXRpYWxpemUob0JpbmRpbmdUb1VzZSwgb1BhZ2luYXRvckN1cnJlbnRDb250ZXh0KTtcblx0XHRcdFx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgbnVsbCk7XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nKSB7XG5cdFx0XHRcdGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRcdHRoaXMucGFnaW5hdG9yLmluaXRpYWxpemUob0JpbmRpbmcsIG9Db250ZXh0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBpZiB0aGUgYmluZGluZyB0eXBlIGlzIG5vdCBPRGF0YUxpc3RCaW5kaW5nIGJlY2F1c2Ugb2YgYSBkZWVwbGluayBuYXZpZ2F0aW9uIG9yIGEgcmVmcmVzaCBvZiB0aGUgcGFnZVxuXHRcdFx0XHRcdC8vIHdlIG5lZWQgdG8gY3JlYXRlIGl0XG5cdFx0XHRcdFx0Y29uc3Qgc0JpbmRpbmdQYXRoID0gb0JpbmRpbmcuZ2V0UGF0aCgpO1xuXHRcdFx0XHRcdGlmICgvXFwoW15cXCldKlxcKSQvLnRlc3Qoc0JpbmRpbmdQYXRoKSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIGN1cnJlbnQgYmluZGluZyBwYXRoIGVuZHMgd2l0aCAoeHh4KSwgc28gd2UgY3JlYXRlIHRoZSBsaXN0QmluZGluZyBieSByZW1vdmluZyAoeHh4KVxuXHRcdFx0XHRcdFx0Y29uc3Qgc0xpc3RCaW5kaW5nUGF0aCA9IHNCaW5kaW5nUGF0aC5yZXBsYWNlKC9cXChbXlxcKV0qXFwpJC8sIFwiXCIpO1xuXHRcdFx0XHRcdFx0b0JpbmRpbmcgPSBuZXcgKE9EYXRhTGlzdEJpbmRpbmcgYXMgYW55KShvQmluZGluZy5vTW9kZWwsIHNMaXN0QmluZGluZ1BhdGgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgX3NldExpc3RCaW5kaW5nQXN5bmMgPSAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChvQmluZGluZy5nZXRDb250ZXh0cygpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBhZ2luYXRvci5pbml0aWFsaXplKG9CaW5kaW5nLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0b0JpbmRpbmcuZGV0YWNoRXZlbnQoXCJjaGFuZ2VcIiwgX3NldExpc3RCaW5kaW5nQXN5bmMpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRvQmluZGluZy5nZXRDb250ZXh0cygwKTtcblx0XHRcdFx0XHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50KFwiY2hhbmdlXCIsIF9zZXRMaXN0QmluZGluZ0FzeW5jKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIGN1cnJlbnQgYmluZGluZyBkb2Vzbid0IGVuZCB3aXRoICh4eHgpIC0tPiB0aGUgbGFzdCBzZWdtZW50IGlzIGEgMS0xIG5hdmlnYXRpb24sIHNvIHdlIGRvbid0IGRpc3BsYXkgdGhlIHBhZ2luYXRvclxuXHRcdFx0XHRcdFx0dGhpcy5wYWdpbmF0b3IuaW5pdGlhbGl6ZSh1bmRlZmluZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoISh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkudXNlTmV3TGF6eUxvYWRpbmcgJiYgb09iamVjdFBhZ2UuZ2V0RW5hYmxlTGF6eUxvYWRpbmcoKSkge1xuXHRcdFx0Y29uc3QgYVNlY3Rpb25zID0gb09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKTtcblx0XHRcdGNvbnN0IGJVc2VJY29uVGFiQmFyID0gb09iamVjdFBhZ2UuZ2V0VXNlSWNvblRhYkJhcigpO1xuXHRcdFx0bGV0IGlTa2lwID0gMjtcblx0XHRcdGNvbnN0IGJJc0luRWRpdE1vZGUgPSBvT2JqZWN0UGFnZS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIik7XG5cdFx0XHRjb25zdCBiRWRpdGFibGVIZWFkZXIgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmVkaXRhYmxlSGVhZGVyQ29udGVudDtcblx0XHRcdGZvciAobGV0IGlTZWN0aW9uID0gMDsgaVNlY3Rpb24gPCBhU2VjdGlvbnMubGVuZ3RoOyBpU2VjdGlvbisrKSB7XG5cdFx0XHRcdGNvbnN0IG9TZWN0aW9uID0gYVNlY3Rpb25zW2lTZWN0aW9uXTtcblx0XHRcdFx0Y29uc3QgYVN1YlNlY3Rpb25zID0gb1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKTtcblx0XHRcdFx0Zm9yIChsZXQgaVN1YlNlY3Rpb24gPSAwOyBpU3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IGlTdWJTZWN0aW9uKyssIGlTa2lwLS0pIHtcblx0XHRcdFx0XHQvLyBJbiBJY29uVGFiQmFyIG1vZGUga2VlcCB0aGUgc2Vjb25kIHNlY3Rpb24gYm91bmQgaWYgdGhlcmUgaXMgYW4gZWRpdGFibGUgaGVhZGVyIGFuZCB3ZSBhcmUgc3dpdGNoaW5nIHRvIGRpc3BsYXkgbW9kZVxuXHRcdFx0XHRcdGlmIChpU2tpcCA8IDEgfHwgKGJVc2VJY29uVGFiQmFyICYmIChpU2VjdGlvbiA+IDEgfHwgKGlTZWN0aW9uID09PSAxICYmICFiRWRpdGFibGVIZWFkZXIgJiYgIWJJc0luRWRpdE1vZGUpKSkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9TdWJTZWN0aW9uID0gYVN1YlNlY3Rpb25zW2lTdWJTZWN0aW9uXTtcblx0XHRcdFx0XHRcdGlmIChvU3ViU2VjdGlvbi5kYXRhKCkuaXNWaXNpYmlsaXR5RHluYW1pYyAhPT0gXCJ0cnVlXCIpIHtcblx0XHRcdFx0XHRcdFx0b1N1YlNlY3Rpb24uc2V0QmluZGluZ0NvbnRleHQobnVsbCBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLnBsYWNlaG9sZGVyLmlzUGxhY2Vob2xkZXJFbmFibGVkKCkgJiYgbVBhcmFtZXRlcnMuc2hvd1BsYWNlaG9sZGVyKSB7XG5cdFx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0Y29uc3Qgb05hdkNvbnRhaW5lciA9IChvVmlldy5nZXRQYXJlbnQoKSBhcyBhbnkpLm9Db250YWluZXIuZ2V0UGFyZW50KCk7XG5cdFx0XHRpZiAob05hdkNvbnRhaW5lcikge1xuXHRcdFx0XHRvTmF2Q29udGFpbmVyLnNob3dQbGFjZWhvbGRlcih7fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2dldEZpcnN0Q2xpY2thYmxlRWxlbWVudChvT2JqZWN0UGFnZTogYW55KSB7XG5cdFx0bGV0IG9GaXJzdENsaWNrYWJsZUVsZW1lbnQ7XG5cdFx0Y29uc3QgYUFjdGlvbnMgPSBvT2JqZWN0UGFnZS5nZXRIZWFkZXJUaXRsZSgpICYmIG9PYmplY3RQYWdlLmdldEhlYWRlclRpdGxlKCkuZ2V0QWN0aW9ucygpO1xuXHRcdGlmIChhQWN0aW9ucyAmJiBhQWN0aW9ucy5sZW5ndGgpIHtcblx0XHRcdG9GaXJzdENsaWNrYWJsZUVsZW1lbnQgPSBhQWN0aW9ucy5maW5kKGZ1bmN0aW9uIChvQWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0Ly8gRHVlIHRvIHRoZSBsZWZ0IGFsaWdubWVudCBvZiB0aGUgRHJhZnQgc3dpdGNoIGFuZCB0aGUgY29sbGFib3JhdGl2ZSBkcmFmdCBhdmF0YXIgY29udHJvbHNcblx0XHRcdFx0Ly8gdGhlcmUgaXMgYSBUb29sYmFyU3BhY2VyIGluIHRoZSBhY3Rpb25zIGFnZ3JlZ2F0aW9uIHdoaWNoIHdlIG5lZWQgdG8gZXhjbHVkZSBoZXJlIVxuXHRcdFx0XHQvLyBEdWUgdG8gdGhlIEFDQyByZXBvcnQsIHdlIGFsc28gbmVlZCBub3QgdG8gY2hlY2sgZm9yIHRoZSBJbnZpc2libGVUZXh0IGVsZW1lbnRzXG5cdFx0XHRcdGlmIChvQWN0aW9uLmlzQShcInNhcC5mZS5tYWNyb3MuU2hhcmVBUElcIikpIHtcblx0XHRcdFx0XHQvLyBzaW5jZSBTaGFyZUFQSSBkb2VzIG5vdCBoYXZlIGEgZGlzYWJsZSBwcm9wZXJ0eVxuXHRcdFx0XHRcdC8vIGhlbmNlIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgZGlzYmFsZWQgb3Igbm90XG5cdFx0XHRcdFx0cmV0dXJuIG9BY3Rpb24uZ2V0VmlzaWJsZSgpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCFvQWN0aW9uLmlzQShcInNhcC51aS5jb3JlLkludmlzaWJsZVRleHRcIikgJiYgIW9BY3Rpb24uaXNBKFwic2FwLm0uVG9vbGJhclNwYWNlclwiKSkge1xuXHRcdFx0XHRcdHJldHVybiBvQWN0aW9uLmdldFZpc2libGUoKSAmJiBvQWN0aW9uLmdldEVuYWJsZWQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvRmlyc3RDbGlja2FibGVFbGVtZW50O1xuXHR9XG5cblx0X2dldEZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZEZyb21TdWJTZWN0aW9uKGFTdWJTZWN0aW9uczogYW55KSB7XG5cdFx0aWYgKGFTdWJTZWN0aW9ucykge1xuXHRcdFx0Zm9yIChsZXQgc3ViU2VjdGlvbiA9IDA7IHN1YlNlY3Rpb24gPCBhU3ViU2VjdGlvbnMubGVuZ3RoOyBzdWJTZWN0aW9uKyspIHtcblx0XHRcdFx0Y29uc3QgYUJsb2NrcyA9IGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXS5nZXRCbG9ja3MoKTtcblxuXHRcdFx0XHRpZiAoYUJsb2Nrcykge1xuXHRcdFx0XHRcdGZvciAobGV0IGJsb2NrID0gMDsgYmxvY2sgPCBhQmxvY2tzLmxlbmd0aDsgYmxvY2srKykge1xuXHRcdFx0XHRcdFx0bGV0IGFGb3JtQ29udGFpbmVycztcblxuXHRcdFx0XHRcdFx0aWYgKGFCbG9ja3NbYmxvY2tdLmlzQShcInNhcC51aS5sYXlvdXQuZm9ybS5Gb3JtXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGFGb3JtQ29udGFpbmVycyA9IGFCbG9ja3NbYmxvY2tdLmdldEZvcm1Db250YWluZXJzKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRhQmxvY2tzW2Jsb2NrXS5nZXRDb250ZW50ICYmXG5cdFx0XHRcdFx0XHRcdGFCbG9ja3NbYmxvY2tdLmdldENvbnRlbnQoKSAmJlxuXHRcdFx0XHRcdFx0XHRhQmxvY2tzW2Jsb2NrXS5nZXRDb250ZW50KCkuaXNBKFwic2FwLnVpLmxheW91dC5mb3JtLkZvcm1cIilcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRhRm9ybUNvbnRhaW5lcnMgPSBhQmxvY2tzW2Jsb2NrXS5nZXRDb250ZW50KCkuZ2V0Rm9ybUNvbnRhaW5lcnMoKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGFGb3JtQ29udGFpbmVycykge1xuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBmb3JtQ29udGFpbmVyID0gMDsgZm9ybUNvbnRhaW5lciA8IGFGb3JtQ29udGFpbmVycy5sZW5ndGg7IGZvcm1Db250YWluZXIrKykge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFGb3JtRWxlbWVudHMgPSBhRm9ybUNvbnRhaW5lcnNbZm9ybUNvbnRhaW5lcl0uZ2V0Rm9ybUVsZW1lbnRzKCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGFGb3JtRWxlbWVudHMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGZvcm1FbGVtZW50ID0gMDsgZm9ybUVsZW1lbnQgPCBhRm9ybUVsZW1lbnRzLmxlbmd0aDsgZm9ybUVsZW1lbnQrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhRmllbGRzID0gYUZvcm1FbGVtZW50c1tmb3JtRWxlbWVudF0uZ2V0RmllbGRzKCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIGZpcnN0IGZpZWxkIGlzIG5vdCBuZWNlc3NhcmlseSBhbiBJbnB1dEJhc2UgKGUuZy4gY291bGQgYmUgYSBUZXh0KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTbyB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgaXQgaGFzIGEgZ2V0UmVxdWlyZWQgbWV0aG9kXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFGaWVsZHNbMF0uZ2V0UmVxdWlyZWQgJiYgYUZpZWxkc1swXS5nZXRSZXF1aXJlZCgpICYmICFhRmllbGRzWzBdLmdldFZhbHVlKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBhRmllbGRzWzBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZGVidWcoYEVycm9yIHdoZW4gc2VhcmNoaW5nIGZvciBtYW5kYW90cnkgZW1wdHkgZmllbGQ6ICR7ZXJyb3J9YCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdF91cGRhdGVGb2N1c0luRWRpdE1vZGUoYVN1YlNlY3Rpb25zOiBhbnkpIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cblx0XHRjb25zdCBvTWFuZGF0b3J5RmllbGQgPSB0aGlzLl9nZXRGaXJzdEVtcHR5TWFuZGF0b3J5RmllbGRGcm9tU3ViU2VjdGlvbihhU3ViU2VjdGlvbnMpO1xuXHRcdGxldCBvRmllbGRUb0ZvY3VzOiBhbnk7XG5cdFx0aWYgKG9NYW5kYXRvcnlGaWVsZCkge1xuXHRcdFx0b0ZpZWxkVG9Gb2N1cyA9IG9NYW5kYXRvcnlGaWVsZC5jb250ZW50LmdldENvbnRlbnRFZGl0KClbMF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9GaWVsZFRvRm9jdXMgPSAob09iamVjdFBhZ2UgYXMgYW55KS5fZ2V0Rmlyc3RFZGl0YWJsZUlucHV0KCkgfHwgdGhpcy5fZ2V0Rmlyc3RDbGlja2FibGVFbGVtZW50KG9PYmplY3RQYWdlKTtcblx0XHR9XG5cblx0XHRpZiAob0ZpZWxkVG9Gb2N1cykge1xuXHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdC8vIFdlIHNldCB0aGUgZm9jdXMgaW4gYSB0aW1lZW91dCwgb3RoZXJ3aXNlIHRoZSBmb2N1cyBzb21ldGltZXMgZ29lcyB0byB0aGUgVGFiQmFyXG5cdFx0XHRcdG9GaWVsZFRvRm9jdXMuZm9jdXMoKTtcblx0XHRcdH0sIDApO1xuXHRcdH1cblx0fVxuXG5cdF9oYW5kbGVTdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0KG9FdmVudDogYW55KSB7XG5cdFx0Y29uc3Qgb1N1YlNlY3Rpb24gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3ViU2VjdGlvblwiKTtcblx0XHRvU3ViU2VjdGlvbi5zZXRCaW5kaW5nQ29udGV4dCh1bmRlZmluZWQpO1xuXHR9XG5cblx0X29uQmFja05hdmlnYXRpb25JbkRyYWZ0KG9Db250ZXh0OiBhbnkpIHtcblx0XHR0aGlzLm1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdGlmICh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkuY2hlY2tJZkJhY2tIYXNTYW1lQ29udGV4dCgpKSB7XG5cdFx0XHQvLyBCYWNrIG5hdiB3aWxsIGtlZXAgdGhlIHNhbWUgY29udGV4dCAtLT4gbm8gbmVlZCB0byBkaXNwbGF5IHRoZSBkaWFsb2dcblx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkcmFmdC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0ZHJhZnQuTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRfb25BZnRlckJpbmRpbmcob0JpbmRpbmdDb250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0Y29uc3QgYVRhYmxlcyA9IHRoaXMuX2ZpbmRUYWJsZXMoKTtcblxuXHRcdHRoaXMuX3NpZGVFZmZlY3RzLmNsZWFyUHJvcGVydGllc1N0YXR1cygpO1xuXG5cdFx0Ly8gVE9ETzogdGhpcyBpcyBvbmx5IGEgdGVtcCBzb2x1dGlvbiBhcyBsb25nIGFzIHRoZSBtb2RlbCBmaXggdGhlIGNhY2hlIGlzc3VlIGFuZCB3ZSB1c2UgdGhpcyBhZGRpdGlvbmFsXG5cdFx0Ly8gYmluZGluZyB3aXRoIG93blJlcXVlc3Rcblx0XHRvQmluZGluZ0NvbnRleHQgPSBvT2JqZWN0UGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0bGV0IGFJQk5BY3Rpb25zOiBhbnlbXSA9IFtdO1xuXHRcdG9PYmplY3RQYWdlLmdldFNlY3Rpb25zKCkuZm9yRWFjaChmdW5jdGlvbiAob1NlY3Rpb246IGFueSkge1xuXHRcdFx0b1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvU3ViU2VjdGlvbjogYW55KSB7XG5cdFx0XHRcdGFJQk5BY3Rpb25zID0gQ29tbW9uVXRpbHMuZ2V0SUJOQWN0aW9ucyhvU3ViU2VjdGlvbiwgYUlCTkFjdGlvbnMpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHQvLyBBc3NpZ24gaW50ZXJuYWwgYmluZGluZyBjb250ZXh0cyB0byBvRm9ybUNvbnRhaW5lcjpcblx0XHQvLyAxLiBJdCBpcyBub3QgcG9zc2libGUgdG8gYXNzaWduIHRoZSBpbnRlcm5hbCBiaW5kaW5nIGNvbnRleHQgdG8gdGhlIFhNTCBmcmFnbWVudFxuXHRcdC8vIChGb3JtQ29udGFpbmVyLmZyYWdtZW50LnhtbCkgeWV0IC0gaXQgaXMgdXNlZCBhbHJlYWR5IGZvciB0aGUgZGF0YS1zdHJ1Y3R1cmUuXG5cdFx0Ly8gMi4gQW5vdGhlciBwcm9ibGVtIGlzLCB0aGF0IEZvcm1Db250YWluZXJzIGFzc2lnbmVkIHRvIGEgJ01vcmVCbG9jaycgZG9lcyBub3QgaGF2ZSBhblxuXHRcdC8vIGludGVybmFsIG1vZGVsIGNvbnRleHQgYXQgYWxsLlxuXG5cdFx0YVRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiwge30pO1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dDdXN0b21WYWxpZGl0eVwiLCB7fSk7XG5cblx0XHRcdGFJQk5BY3Rpb25zID0gQ29tbW9uVXRpbHMuZ2V0SUJOQWN0aW9ucyhvVGFibGUsIGFJQk5BY3Rpb25zKTtcblx0XHRcdC8vIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBCQ1A6IDIwODAyMTgwMDRcblx0XHRcdC8vIE5lZWQgdG8gZml4IHdpdGggQkxJOiBGSU9SSVRFQ0hQMS0xNTI3NFxuXHRcdFx0Ly8gb25seSBmb3IgZWRpdCBtb2RlLCB3ZSBjbGVhciB0aGUgdGFibGUgY2FjaGVcblx0XHRcdC8vIFdvcmthcm91bmQgc3RhcnRzIGhlcmUhIVxuXHRcdFx0Y29uc3Qgb1RhYmxlUm93QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0XHRpZiAob1RhYmxlUm93QmluZGluZykge1xuXHRcdFx0XHRpZiAoTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG9UYWJsZVJvd0JpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSkpIHtcblx0XHRcdFx0XHQvLyBhcHBseSBmb3IgYm90aCBlZGl0IGFuZCBkaXNwbGF5IG1vZGUgaW4gc3RpY2t5XG5cdFx0XHRcdFx0b1RhYmxlUm93QmluZGluZy5yZW1vdmVDYWNoZXNBbmRNZXNzYWdlcyhcIlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gV29ya2Fyb3VuZCBlbmRzIGhlcmUhIVxuXG5cdFx0XHQvLyBVcGRhdGUgJ2VuYWJsZWQnIHByb3BlcnR5IG9mIERhdGFGaWVsZEZvckFjdGlvbiBidXR0b25zIG9uIHRhYmxlIHRvb2xiYXJcblx0XHRcdC8vIFRoZSBzYW1lIGlzIGFsc28gcGVyZm9ybWVkIG9uIFRhYmxlIHNlbGVjdGlvbkNoYW5nZSBldmVudFxuXHRcdFx0Y29uc3Qgb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCA9IEpTT04ucGFyc2UoXG5cdFx0XHRcdFx0Q29tbW9uSGVscGVyLnBhcnNlQ3VzdG9tRGF0YShEZWxlZ2F0ZVV0aWwuZ2V0Q3VzdG9tRGF0YShvVGFibGUsIFwib3BlcmF0aW9uQXZhaWxhYmxlTWFwXCIpKVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRhU2VsZWN0ZWRDb250ZXh0cyA9IG9UYWJsZS5nZXRTZWxlY3RlZENvbnRleHRzKCk7XG5cblx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChvSW50ZXJuYWxNb2RlbENvbnRleHQsIG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAsIGFTZWxlY3RlZENvbnRleHRzLCBcInRhYmxlXCIpO1xuXHRcdFx0Ly8gQ2xlYXIgdGhlIHNlbGVjdGlvbiBpbiB0aGUgdGFibGUsIG5lZWQgdG8gYmUgZml4ZWQgYW5kIHJldmlldyB3aXRoIEJMSTogRklPUklURUNIUDEtMjQzMThcblx0XHRcdG9UYWJsZS5jbGVhclNlbGVjdGlvbigpO1xuXHRcdH0pO1xuXHRcdENvbW1vblV0aWxzLmdldFNlbWFudGljVGFyZ2V0c0Zyb21QYWdlTW9kZWwodGhpcywgXCJfcGFnZU1vZGVsXCIpO1xuXHRcdC8vUmV0cmlldmUgT2JqZWN0IFBhZ2UgaGVhZGVyIGFjdGlvbnMgZnJvbSBPYmplY3QgUGFnZSB0aXRsZSBjb250cm9sXG5cdFx0Y29uc3Qgb09iamVjdFBhZ2VUaXRsZSA9IG9PYmplY3RQYWdlLmdldEhlYWRlclRpdGxlKCkgYXMgT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZTtcblx0XHRsZXQgYUlCTkhlYWRlckFjdGlvbnM6IGFueVtdID0gW107XG5cdFx0YUlCTkhlYWRlckFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9PYmplY3RQYWdlVGl0bGUsIGFJQk5IZWFkZXJBY3Rpb25zKTtcblx0XHRhSUJOQWN0aW9ucyA9IGFJQk5BY3Rpb25zLmNvbmNhdChhSUJOSGVhZGVyQWN0aW9ucyk7XG5cdFx0Q29tbW9uVXRpbHMudXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkoYUlCTkFjdGlvbnMsIHRoaXMuZ2V0VmlldygpKTtcblxuXHRcdGxldCBvTW9kZWw6IGFueSwgb0ZpbmFsVUlTdGF0ZTogYW55O1xuXG5cdFx0Ly8gVE9ETzogdGhpcyBzaG91bGQgYmUgbW92ZWQgaW50byBhbiBpbml0IGV2ZW50IG9mIHRoZSBNREMgdGFibGVzIChub3QgeWV0IGV4aXN0aW5nKSBhbmQgc2hvdWxkIGJlIHBhcnRcblx0XHQvLyBvZiBhbnkgY29udHJvbGxlciBleHRlbnNpb25cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gb1RhYmxlXG5cdFx0ICogQHBhcmFtIG9MaXN0QmluZGluZ1xuXHRcdCAqL1xuXHRcdGFzeW5jIGZ1bmN0aW9uIGVuYWJsZUZhc3RDcmVhdGlvblJvdyhvVGFibGU6IGFueSwgb0xpc3RCaW5kaW5nOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9GYXN0Q3JlYXRpb25Sb3cgPSBvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKTtcblx0XHRcdGxldCBvRmFzdENyZWF0aW9uTGlzdEJpbmRpbmcsIG9GYXN0Q3JlYXRpb25Db250ZXh0O1xuXG5cdFx0XHRpZiAob0Zhc3RDcmVhdGlvblJvdykge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGF3YWl0IG9GaW5hbFVJU3RhdGU7XG5cdFx0XHRcdFx0aWYgKG9GYXN0Q3JlYXRpb25Sb3cuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0XHRvRmFzdENyZWF0aW9uTGlzdEJpbmRpbmcgPSBvTW9kZWwuYmluZExpc3Qob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0xpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgW10sIFtdLCB7XG5cdFx0XHRcdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJkb05vdFN1Ym1pdFwiLFxuXHRcdFx0XHRcdFx0XHQkJGdyb3VwSWQ6IFwiZG9Ob3RTdWJtaXRcIlxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHQvLyBXb3JrYXJvdW5kIHN1Z2dlc3RlZCBieSBPRGF0YSBtb2RlbCB2NCBjb2xsZWFndWVzXG5cdFx0XHRcdFx0XHRvRmFzdENyZWF0aW9uTGlzdEJpbmRpbmcucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHQvKiBkbyBub3RoaW5nICovXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0b0Zhc3RDcmVhdGlvbkNvbnRleHQgPSBvRmFzdENyZWF0aW9uTGlzdEJpbmRpbmcuY3JlYXRlKCk7XG5cdFx0XHRcdFx0XHRvRmFzdENyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG9GYXN0Q3JlYXRpb25Db250ZXh0KTtcblxuXHRcdFx0XHRcdFx0Ly8gdGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgY29uc29sZSBlcnJvclxuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgb0Zhc3RDcmVhdGlvbkNvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgZmFzdCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNvbXB1dGluZyB0aGUgZmluYWwgVUkgc3RhdGVcIiwgb0Vycm9yKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQgYXQgdGhlIGFsbFxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSBvVGFibGVcblx0XHQgKi9cblx0XHRjb25zdCBoYW5kbGVUYWJsZU1vZGlmaWNhdGlvbnMgPSAob1RhYmxlOiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IG9CaW5kaW5nID0gdGhpcy5fZ2V0VGFibGVCaW5kaW5nKG9UYWJsZSksXG5cdFx0XHRcdGZuSGFuZGxlVGFibGVQYXRjaEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRlbmFibGVGYXN0Q3JlYXRpb25Sb3cob1RhYmxlLCBvQmluZGluZyk7XG5cdFx0XHRcdH07XG5cblx0XHRcdGlmICghb0JpbmRpbmcpIHtcblx0XHRcdFx0TG9nLmVycm9yKGBFeHBlY3RlZCBiaW5kaW5nIG1pc3NpbmcgZm9yIHRhYmxlOiAke29UYWJsZS5nZXRJZCgpfWApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvQmluZGluZy5vQ29udGV4dCkge1xuXHRcdFx0XHRmbkhhbmRsZVRhYmxlUGF0Y2hFdmVudHMoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGZuSGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGlmIChvQmluZGluZy5vQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0Zm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzKCk7XG5cdFx0XHRcdFx0XHRvQmluZGluZy5kZXRhY2hDaGFuZ2UoZm5IYW5kbGVDaGFuZ2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoQ2hhbmdlKGZuSGFuZGxlQ2hhbmdlKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0b01vZGVsID0gb0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCk7XG5cblx0XHRcdC8vIENvbXB1dGUgRWRpdCBNb2RlXG5cdFx0XHRvRmluYWxVSVN0YXRlID0gdGhpcy5fZWRpdEZsb3cuY29tcHV0ZUVkaXRNb2RlKG9CaW5kaW5nQ29udGV4dCk7XG5cblx0XHRcdGlmIChNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChvTW9kZWwuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRcdG9GaW5hbFVJU3RhdGVcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGNvbm5lY3QodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChpc0Nvbm5lY3RlZCh0aGlzLmdldFZpZXcoKSkpIHtcblx0XHRcdFx0XHRcdFx0ZGlzY29ubmVjdCh0aGlzLmdldFZpZXcoKSk7IC8vIENsZWFudXAgY29sbGFib3JhdGlvbiBjb25uZWN0aW9uIGluIGNhc2Ugd2Ugc3dpdGNoIHRvIGFub3RoZXIgZWxlbWVudCAoZS5nLiBpbiBGQ0wpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciB0aGUgZmluYWwgVUkgU3RhdGVcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gdXBkYXRlIHJlbGF0ZWQgYXBwcyBvbmNlIERhdGEgaXMgcmVjZWl2ZWQgaW4gY2FzZSBvZiBiaW5kaW5nIGNhY2hlIGlzIG5vdCBhdmFpbGFibGVcblx0XHRcdC8vIFRPRE86IHRoaXMgaXMgb25seSBhIHRlbXAgc29sdXRpb24gc2luY2Ugd2UgbmVlZCB0byBjYWxsIF91cGRhdGVSZWxhdGVkQXBwcyBtZXRob2Qgb25seSBhZnRlciBkYXRhIGZvciBPYmplY3QgUGFnZSBpcyByZWNlaXZlZCAoaWYgdGhlcmUgaXMgbm8gYmluZGluZylcblx0XHRcdGlmIChvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLm9DYWNoZSkge1xuXHRcdFx0XHR0aGlzLl91cGRhdGVSZWxhdGVkQXBwcygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgZm5VcGRhdGVSZWxhdGVkQXBwcyA9ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVSZWxhdGVkQXBwcygpO1xuXHRcdFx0XHRcdG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkuZGV0YWNoRGF0YVJlY2VpdmVkKGZuVXBkYXRlUmVsYXRlZEFwcHMpO1xuXHRcdFx0XHR9O1xuXHRcdFx0XHRvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLmF0dGFjaERhdGFSZWNlaXZlZChmblVwZGF0ZVJlbGF0ZWRBcHBzKTtcblx0XHRcdH1cblxuXHRcdFx0Ly9BdHRhY2ggdGhlIHBhdGNoIHNlbnQgYW5kIHBhdGNoIGNvbXBsZXRlZCBldmVudCB0byB0aGUgb2JqZWN0IHBhZ2UgYmluZGluZyBzbyB0aGF0IHdlIGNhbiByZWFjdFxuXHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSAob0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcgJiYgb0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKSkgfHwgb0JpbmRpbmdDb250ZXh0O1xuXG5cdFx0XHQvLyBBdHRhY2ggdGhlIGV2ZW50IGhhbmRsZXIgb25seSBvbmNlIHRvIHRoZSBzYW1lIGJpbmRpbmdcblx0XHRcdGlmICh0aGlzLmN1cnJlbnRCaW5kaW5nICE9PSBvQmluZGluZykge1xuXHRcdFx0XHRvQmluZGluZy5hdHRhY2hFdmVudChcInBhdGNoU2VudFwiLCB0aGlzLmVkaXRGbG93LmhhbmRsZVBhdGNoU2VudCwgdGhpcyk7XG5cdFx0XHRcdHRoaXMuY3VycmVudEJpbmRpbmcgPSBvQmluZGluZztcblx0XHRcdH1cblxuXHRcdFx0YVRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdFx0XHQvLyBhY2Nlc3MgYmluZGluZyBvbmx5IGFmdGVyIHRhYmxlIGlzIGJvdW5kXG5cdFx0XHRcdFRhYmxlVXRpbHMud2hlbkJvdW5kKG9UYWJsZSlcblx0XHRcdFx0XHQudGhlbihoYW5kbGVUYWJsZU1vZGlmaWNhdGlvbnMpXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgd2FpdGluZyBmb3IgdGhlIHRhYmxlIHRvIGJlIGJvdW5kXCIsIG9FcnJvcik7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKCEodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLnVzZU5ld0xhenlMb2FkaW5nKSB7XG5cdFx0XHRcdC8vIHNob3VsZCBiZSBjYWxsZWQgb25seSBhZnRlciBiaW5kaW5nIGlzIHJlYWR5IGhlbmNlIGNhbGxpbmcgaXQgaW4gb25BZnRlckJpbmRpbmdcblx0XHRcdFx0KG9PYmplY3RQYWdlIGFzIGFueSkuX3RyaWdnZXJWaXNpYmxlU3ViU2VjdGlvbnNFdmVudHMoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRAcHVibGljRXh0ZW5zaW9uKClcblx0QGV4dGVuc2libGUoT3ZlcnJpZGVFeGVjdXRpb24uQWZ0ZXIpXG5cdG9uUGFnZVJlYWR5KG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRjb25zdCBzZXRGb2N1cyA9ICgpID0+IHtcblx0XHRcdC8vIFNldCB0aGUgZm9jdXMgdG8gdGhlIGZpcnN0IGFjdGlvbiBidXR0b24sIG9yIHRvIHRoZSBmaXJzdCBlZGl0YWJsZSBpbnB1dCBpZiBpbiBlZGl0YWJsZSBtb2RlXG5cdFx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0XHRjb25zdCBpc0luRGlzcGxheU1vZGUgPSAhb09iamVjdFBhZ2UuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpO1xuXG5cdFx0XHRpZiAoaXNJbkRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNvbnN0IG9GaXJzdENsaWNrYWJsZUVsZW1lbnQgPSB0aGlzLl9nZXRGaXJzdENsaWNrYWJsZUVsZW1lbnQob09iamVjdFBhZ2UpO1xuXHRcdFx0XHRpZiAob0ZpcnN0Q2xpY2thYmxlRWxlbWVudCkge1xuXHRcdFx0XHRcdG9GaXJzdENsaWNrYWJsZUVsZW1lbnQuZm9jdXMoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgb1NlbGVjdGVkU2VjdGlvbjogYW55ID0gQ29yZS5ieUlkKG9PYmplY3RQYWdlLmdldFNlbGVjdGVkU2VjdGlvbigpKTtcblx0XHRcdFx0aWYgKG9TZWxlY3RlZFNlY3Rpb24pIHtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVGb2N1c0luRWRpdE1vZGUob1NlbGVjdGVkU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0Ly8gQXBwbHkgYXBwIHN0YXRlIG9ubHkgYWZ0ZXIgdGhlIHBhZ2UgaXMgcmVhZHkgd2l0aCB0aGUgZmlyc3Qgc2VjdGlvbiBzZWxlY3RlZFxuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdC8vU2hvdyBwb3B1cCB3aGlsZSBuYXZpZ2F0aW5nIGJhY2sgZnJvbSBvYmplY3QgcGFnZSBpbiBjYXNlIG9mIGRyYWZ0XG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0Y29uc3QgYklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCgob0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCkgYXMgT0RhdGFNb2RlbCkuZ2V0TWV0YU1vZGVsKCkpO1xuXHRcdFx0aWYgKCFiSXNTdGlja3lNb2RlKSB7XG5cdFx0XHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQob1ZpZXcpO1xuXHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldFNoZWxsU2VydmljZXMoKS5zZXRCYWNrTmF2aWdhdGlvbigoKSA9PiB0aGlzLl9vbkJhY2tOYXZpZ2F0aW9uSW5EcmFmdChvQmluZGluZ0NvbnRleHQpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0LmdldEFwcFN0YXRlSGFuZGxlcigpXG5cdFx0XHQuYXBwbHlBcHBTdGF0ZSgpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGlmIChtUGFyYW1ldGVycy5mb3JjZUZvY3VzKSB7XG5cdFx0XHRcdFx0c2V0Rm9jdXMoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbiAoRXJyb3IpIHtcblx0XHRcdFx0TG9nLmVycm9yKFwiRXJyb3Igd2hpbGUgc2V0dGluZyB0aGUgZm9jdXNcIiwgRXJyb3IpO1xuXHRcdFx0fSk7XG5cblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJlcnJvck5hdmlnYXRpb25TZWN0aW9uRmxhZ1wiLCBmYWxzZSk7XG5cdFx0dGhpcy5fY2hlY2tEYXRhUG9pbnRUaXRsZUZvckV4dGVybmFsTmF2aWdhdGlvbigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgc3RhdHVzIG9mIGVkaXQgbW9kZSBmb3Igc3RpY2t5IHNlc3Npb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIFRoZSBzdGF0dXMgb2YgZWRpdCBtb2RlIGZvciBzdGlja3kgc2Vzc2lvblxuXHQgKi9cblx0Z2V0U3RpY2t5RWRpdE1vZGUoKSB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQgJiYgKHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCk7XG5cdFx0bGV0IGJJc1N0aWNreUVkaXRNb2RlID0gZmFsc2U7XG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0Y29uc3QgYklzU3RpY2t5TW9kZSA9IE1vZGVsSGVscGVyLmlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZChvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0XHRpZiAoYklzU3RpY2t5TW9kZSkge1xuXHRcdFx0XHRiSXNTdGlja3lFZGl0TW9kZSA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGJJc1N0aWNreUVkaXRNb2RlO1xuXHR9XG5cblx0X2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCkge1xuXHRcdHJldHVybiB0aGlzLmJ5SWQoXCJmZTo6T2JqZWN0UGFnZVwiKSBhcyBPYmplY3RQYWdlTGF5b3V0O1xuXHR9XG5cblx0X2dldFBhZ2VUaXRsZUluZm9ybWF0aW9uKCkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRjb25zdCBvT2JqZWN0UGFnZVN1YnRpdGxlID0gb09iamVjdFBhZ2UuZ2V0Q3VzdG9tRGF0YSgpLmZpbmQoZnVuY3Rpb24gKG9DdXN0b21EYXRhOiBhbnkpIHtcblx0XHRcdHJldHVybiBvQ3VzdG9tRGF0YS5nZXRLZXkoKSA9PT0gXCJPYmplY3RQYWdlU3VidGl0bGVcIjtcblx0XHR9KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGl0bGU6IG9PYmplY3RQYWdlLmRhdGEoXCJPYmplY3RQYWdlVGl0bGVcIikgfHwgXCJcIixcblx0XHRcdHN1YnRpdGxlOiBvT2JqZWN0UGFnZVN1YnRpdGxlICYmIG9PYmplY3RQYWdlU3VidGl0bGUuZ2V0VmFsdWUoKSxcblx0XHRcdGludGVudDogXCJcIixcblx0XHRcdGljb246IFwiXCJcblx0XHR9O1xuXHR9XG5cblx0X2V4ZWN1dGVIZWFkZXJTaG9ydGN1dChzSWQ6IGFueSkge1xuXHRcdGNvbnN0IHNCdXR0b25JZCA9IGAke3RoaXMuZ2V0VmlldygpLmdldElkKCl9LS0ke3NJZH1gLFxuXHRcdFx0b0J1dHRvbiA9ICh0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLmdldEhlYWRlclRpdGxlKCkgYXMgT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZSlcblx0XHRcdFx0LmdldEFjdGlvbnMoKVxuXHRcdFx0XHQuZmluZChmdW5jdGlvbiAob0VsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRcdHJldHVybiBvRWxlbWVudC5nZXRJZCgpID09PSBzQnV0dG9uSWQ7XG5cdFx0XHRcdH0pO1xuXHRcdGlmIChvQnV0dG9uKSB7XG5cdFx0XHRDb21tb25VdGlscy5maXJlQnV0dG9uUHJlc3Mob0J1dHRvbik7XG5cdFx0fVxuXHR9XG5cblx0X2V4ZWN1dGVGb290ZXJTaG9ydGN1dChzSWQ6IGFueSkge1xuXHRcdGNvbnN0IHNCdXR0b25JZCA9IGAke3RoaXMuZ2V0VmlldygpLmdldElkKCl9LS0ke3NJZH1gLFxuXHRcdFx0b0J1dHRvbiA9ICh0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLmdldEZvb3RlcigpIGFzIGFueSkuZ2V0Q29udGVudCgpLmZpbmQoZnVuY3Rpb24gKG9FbGVtZW50OiBhbnkpIHtcblx0XHRcdFx0cmV0dXJuIG9FbGVtZW50LmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpID09PSBcInNhcC5tLkJ1dHRvblwiICYmIG9FbGVtZW50LmdldElkKCkgPT09IHNCdXR0b25JZDtcblx0XHRcdH0pO1xuXHRcdENvbW1vblV0aWxzLmZpcmVCdXR0b25QcmVzcyhvQnV0dG9uKTtcblx0fVxuXG5cdF9leGVjdXRlVGFiU2hvcnRDdXQob0V4ZWN1dGlvbjogYW55KSB7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpLFxuXHRcdFx0YVNlY3Rpb25zID0gb09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKSxcblx0XHRcdGlTZWN0aW9uSW5kZXhNYXggPSBhU2VjdGlvbnMubGVuZ3RoIC0gMSxcblx0XHRcdHNDb21tYW5kID0gb0V4ZWN1dGlvbi5vU291cmNlLmdldENvbW1hbmQoKTtcblx0XHRsZXQgbmV3U2VjdGlvbixcblx0XHRcdGlTZWxlY3RlZFNlY3Rpb25JbmRleCA9IG9PYmplY3RQYWdlLmluZGV4T2ZTZWN0aW9uKHRoaXMuYnlJZChvT2JqZWN0UGFnZS5nZXRTZWxlY3RlZFNlY3Rpb24oKSkgYXMgT2JqZWN0UGFnZVNlY3Rpb24pO1xuXHRcdGlmIChpU2VsZWN0ZWRTZWN0aW9uSW5kZXggIT09IC0xICYmIGlTZWN0aW9uSW5kZXhNYXggPiAwKSB7XG5cdFx0XHRpZiAoc0NvbW1hbmQgPT09IFwiTmV4dFRhYlwiKSB7XG5cdFx0XHRcdGlmIChpU2VsZWN0ZWRTZWN0aW9uSW5kZXggPD0gaVNlY3Rpb25JbmRleE1heCAtIDEpIHtcblx0XHRcdFx0XHRuZXdTZWN0aW9uID0gYVNlY3Rpb25zWysraVNlbGVjdGVkU2VjdGlvbkluZGV4XTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChpU2VsZWN0ZWRTZWN0aW9uSW5kZXggIT09IDApIHtcblx0XHRcdFx0Ly8gUHJldmlvdXNUYWJcblx0XHRcdFx0bmV3U2VjdGlvbiA9IGFTZWN0aW9uc1stLWlTZWxlY3RlZFNlY3Rpb25JbmRleF07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChuZXdTZWN0aW9uKSB7XG5cdFx0XHRcdG9PYmplY3RQYWdlLnNldFNlbGVjdGVkU2VjdGlvbihuZXdTZWN0aW9uKTtcblx0XHRcdFx0bmV3U2VjdGlvbi5mb2N1cygpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9nZXRGb290ZXJWaXNpYmlsaXR5KCkge1xuXHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0Y29uc3Qgc1ZpZXdJZCA9IHRoaXMuZ2V0VmlldygpLmdldElkKCk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIsIGZhbHNlKTtcblx0XHRzYXAudWlcblx0XHRcdC5nZXRDb3JlKClcblx0XHRcdC5nZXRNZXNzYWdlTWFuYWdlcigpXG5cdFx0XHQuZ2V0TWVzc2FnZU1vZGVsKClcblx0XHRcdC5nZXREYXRhKClcblx0XHRcdC5mb3JFYWNoKGZ1bmN0aW9uIChvTWVzc2FnZTogYW55KSB7XG5cdFx0XHRcdGlmIChvTWVzc2FnZS52YWxpZGF0aW9uICYmIG9NZXNzYWdlLnR5cGUgPT09IFwiRXJyb3JcIiAmJiBvTWVzc2FnZS50YXJnZXQuaW5kZXhPZihzVmlld0lkKSA+IC0xKSB7XG5cdFx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwibWVzc2FnZUZvb3RlckNvbnRhaW5zRXJyb3JzXCIsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdF9zaG93TWVzc2FnZVBvcG92ZXIoZXJyPzogYW55LCBvUmV0PzogYW55KSB7XG5cdFx0aWYgKGVycikge1xuXHRcdFx0TG9nLmVycm9yKGVycik7XG5cdFx0fVxuXHRcdGNvbnN0IHJvb3RWaWV3Q29udHJvbGxlciA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkgYXMgYW55O1xuXHRcdGNvbnN0IGN1cnJlbnRQYWdlVmlldyA9IHJvb3RWaWV3Q29udHJvbGxlci5pc0ZjbEVuYWJsZWQoKVxuXHRcdFx0PyByb290Vmlld0NvbnRyb2xsZXIuZ2V0UmlnaHRtb3N0VmlldygpXG5cdFx0XHQ6ICh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvb3RDb250YWluZXIoKSBhcyBhbnkpLmdldEN1cnJlbnRQYWdlKCk7XG5cdFx0aWYgKCFjdXJyZW50UGFnZVZpZXcuaXNBKFwic2FwLm0uTWVzc2FnZVBhZ2VcIikpIHtcblx0XHRcdGNvbnN0IG9NZXNzYWdlQnV0dG9uID0gdGhpcy5tZXNzYWdlQnV0dG9uLFxuXHRcdFx0XHRvTWVzc2FnZVBvcG92ZXIgPSBvTWVzc2FnZUJ1dHRvbi5vTWVzc2FnZVBvcG92ZXIsXG5cdFx0XHRcdG9JdGVtQmluZGluZyA9IG9NZXNzYWdlUG9wb3Zlci5nZXRCaW5kaW5nKFwiaXRlbXNcIik7XG5cblx0XHRcdGlmIChvSXRlbUJpbmRpbmcuZ2V0TGVuZ3RoKCkgPiAwICYmICFvTWVzc2FnZVBvcG92ZXIuaXNPcGVuKCkpIHtcblx0XHRcdFx0b01lc3NhZ2VCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTtcblx0XHRcdFx0Ly8gd29ya2Fyb3VuZCB0byBlbnN1cmUgdGhhdCBvTWVzc2FnZUJ1dHRvbiBpcyByZW5kZXJlZCB3aGVuIG9wZW5CeSBpcyBjYWxsZWRcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0b01lc3NhZ2VQb3BvdmVyLm9wZW5CeShvTWVzc2FnZUJ1dHRvbik7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb1JldDtcblx0fVxuXG5cdF9lZGl0RG9jdW1lbnQob0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIik7XG5cdFx0QnVzeUxvY2tlci5sb2NrKG9Nb2RlbCk7XG5cdFx0cmV0dXJuIHRoaXMuZWRpdEZsb3cuZWRpdERvY3VtZW50LmFwcGx5KHRoaXMuZWRpdEZsb3csIFtvQ29udGV4dF0pLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuXHRcdFx0QnVzeUxvY2tlci51bmxvY2sob01vZGVsKTtcblx0XHR9KTtcblx0fVxuXHQvKipcblx0ICogR2V0cyB0aGUgY29udGV4dCBvZiB0aGUgRHJhZnRSb290IHBhdGguXG5cdCAqIElmIGEgdmlldyBoYXMgYmVlbiBjcmVhdGVkIHdpdGggdGhlIGRyYWZ0IFJvb3QgUGF0aCwgdGhpcyBtZXRob2QgcmV0dXJucyBpdHMgYmluZGluZ0NvbnRleHQuXG5cdCAqIFdoZXJlIG5vIHZpZXcgaXMgZm91bmQgYSBuZXcgY3JlYXRlZCBjb250ZXh0IGlzIHJldHVybmVkLlxuXHQgKiBUaGUgbmV3IGNyZWF0ZWQgY29udGV4dCByZXF1ZXN0IHRoZSBrZXkgb2YgdGhlIGVudGl0eSBpbiBvcmRlciB0byBnZXQgdGhlIEV0YWcgb2YgdGhpcyBlbnRpdHkuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBnZXREcmFmdFJvb3RQYXRoXG5cdCAqIEByZXR1cm5zIFJldHVybnMgYSBQcm9taXNlXG5cdCAqL1xuXHRhc3luYyBnZXREcmFmdFJvb3RDb250ZXh0KCk6IFByb21pc2U8VjRDb250ZXh0IHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdGNvbnN0IGNvbnRleHQgPSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgVjRDb250ZXh0O1xuXHRcdGlmIChjb250ZXh0KSB7XG5cdFx0XHRjb25zdCBkcmFmdFJvb3RDb250ZXh0UGF0aCA9IE1vZGVsSGVscGVyLmdldERyYWZ0Um9vdFBhdGgoY29udGV4dCk7XG5cdFx0XHRsZXQgc2ltcGxlRHJhZnRSb290Q29udGV4dDogVjRDb250ZXh0O1xuXHRcdFx0aWYgKGRyYWZ0Um9vdENvbnRleHRQYXRoKSB7XG5cdFx0XHRcdC8vIENoZWNrIGlmIGEgdmlldyBtYXRjaGVzIHdpdGggdGhlIGRyYWZ0IHJvb3QgcGF0aFxuXHRcdFx0XHRjb25zdCBleGlzdGluZ0JpbmRpbmdDb250ZXh0T25QYWdlID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKVxuXHRcdFx0XHRcdC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKVxuXHRcdFx0XHRcdC5nZXRJbnN0YW5jZWRWaWV3cygpXG5cdFx0XHRcdFx0LmZpbmQoKHBhZ2VWaWV3OiBWaWV3KSA9PiBwYWdlVmlldy5nZXRCaW5kaW5nQ29udGV4dCgpPy5nZXRQYXRoKCkgPT09IGRyYWZ0Um9vdENvbnRleHRQYXRoKVxuXHRcdFx0XHRcdD8uZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBWNENvbnRleHQ7XG5cdFx0XHRcdGlmIChleGlzdGluZ0JpbmRpbmdDb250ZXh0T25QYWdlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGV4aXN0aW5nQmluZGluZ0NvbnRleHRPblBhZ2U7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxNb2RlbCA9IHZpZXcuZ2V0TW9kZWwoXCJpbnRlcm5hbFwiKSBhcyBKU09OTW9kZWw7XG5cdFx0XHRcdHNpbXBsZURyYWZ0Um9vdENvbnRleHQgPSBpbnRlcm5hbE1vZGVsLmdldFByb3BlcnR5KFwiL3NpbXBsZURyYWZ0Um9vdENvbnRleHRcIik7XG5cdFx0XHRcdGlmIChzaW1wbGVEcmFmdFJvb3RDb250ZXh0Py5nZXRQYXRoKCkgPT09IGRyYWZ0Um9vdENvbnRleHRQYXRoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHNpbXBsZURyYWZ0Um9vdENvbnRleHQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgbW9kZWwgPSBjb250ZXh0LmdldE1vZGVsKCk7XG5cdFx0XHRcdGNvbnN0IG1ldGFNb2RlbCA9IG1vZGVsLmdldE1ldGFNb2RlbCgpO1xuXHRcdFx0XHRjb25zdCBzRW50aXR5UGF0aCA9IG1ldGFNb2RlbC5nZXRNZXRhUGF0aChkcmFmdFJvb3RDb250ZXh0UGF0aCk7XG5cdFx0XHRcdGNvbnN0IG1EYXRhTW9kZWwgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFNb2RlbC5nZXRDb250ZXh0KHNFbnRpdHlQYXRoKSk7XG5cdFx0XHRcdHNpbXBsZURyYWZ0Um9vdENvbnRleHQgPSBtb2RlbC5iaW5kQ29udGV4dChkcmFmdFJvb3RDb250ZXh0UGF0aCkuZ2V0Qm91bmRDb250ZXh0KCk7XG5cdFx0XHRcdGF3YWl0IHNpbXBsZURyYWZ0Um9vdENvbnRleHQucmVxdWVzdFByb3BlcnR5KG1EYXRhTW9kZWwudGFyZ2V0RW50aXR5VHlwZS5rZXlzWzBdPy5uYW1lKTtcblx0XHRcdFx0Ly8gU3RvcmUgdGhpcyBuZXcgY3JlYXRlZCBjb250ZXh0IHRvIHVzZSBpdCBvbiB0aGUgbmV4dCBpdGVyYXRpb25zXG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2ltcGxlRHJhZnRSb290Q29udGV4dFwiLCBzaW1wbGVEcmFmdFJvb3RDb250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIHNpbXBsZURyYWZ0Um9vdENvbnRleHQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0YXN5bmMgX3ZhbGlkYXRlRG9jdW1lbnQoKTogUHJvbWlzZTx2b2lkIHwgYW55W10gfCBPRGF0YUNvbnRleHRCaW5kaW5nRXg+IHtcblx0XHRjb25zdCBjb250cm9sID0gQ29yZS5ieUlkKENvcmUuZ2V0Q3VycmVudEZvY3VzZWRDb250cm9sSWQoKSk7XG5cdFx0Y29uc3QgY29udGV4dCA9IGNvbnRyb2w/LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgVjRDb250ZXh0O1xuXHRcdGlmIChjb250ZXh0ICYmICFjb250ZXh0LmlzVHJhbnNpZW50KCkpIHtcblx0XHRcdC8vIFdhaXQgZm9yIHRoZSBwZW5kaW5nIGNoYW5nZXMgYmVmb3JlIHN0YXJ0aW5nIHRoaXMgdmFsaWRhdGlvblxuXHRcdFx0YXdhaXQgdGhpcy5fZWRpdEZsb3cuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0c1NlcnZpY2UgPSBhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0XHRjb25zdCBlbnRpdHlUeXBlID0gc2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChjb250ZXh0KTtcblx0XHRcdGNvbnN0IGdsb2JhbFNpZGVFZmZlY3RzID0gZW50aXR5VHlwZSA/IHNpZGVFZmZlY3RzU2VydmljZS5nZXRHbG9iYWxPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGUpIDogW107XG5cdFx0XHQvLyBJZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZ2xvYmFsIFNpZGVFZmZlY3RzIGZvciB0aGUgcmVsYXRlZCBlbnRpdHksIGV4ZWN1dGUgaXQvdGhlbVxuXHRcdFx0aWYgKGdsb2JhbFNpZGVFZmZlY3RzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoZ2xvYmFsU2lkZUVmZmVjdHMubWFwKChzaWRlRWZmZWN0cykgPT4gdGhpcy5fc2lkZUVmZmVjdHMucmVxdWVzdFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzLCBjb250ZXh0KSkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgZHJhZnRSb290Q29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0RHJhZnRSb290Q29udGV4dCgpO1xuXHRcdFx0XHQvL0V4ZWN1dGUgdGhlIGRyYWZ0VmFsaWRhdGlvbiBpZiB0aGVyZSBpcyBubyBnbG9iYWxTaWRlRWZmZWN0c1xuXHRcdFx0XHRpZiAoZHJhZnRSb290Q29udGV4dCkge1xuXHRcdFx0XHRcdHJldHVybiBkcmFmdC5leGVjdXRlRHJhZnRWYWxpZGF0aW9uKGRyYWZ0Um9vdENvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGFzeW5jIF9zYXZlRG9jdW1lbnQob0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIiksXG5cdFx0XHRhV2FpdENyZWF0ZURvY3VtZW50czogYW55W10gPSBbXTtcblx0XHQvLyBpbmRpY2F0ZXMgaWYgd2UgYXJlIGNyZWF0aW5nIGEgbmV3IHJvdyBpbiB0aGUgT1Bcblx0XHRsZXQgYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgPSBmYWxzZTtcblx0XHRCdXN5TG9ja2VyLmxvY2sob01vZGVsKTtcblx0XHR0aGlzLl9maW5kVGFibGVzKCkuZm9yRWFjaCgob1RhYmxlOiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IG9CaW5kaW5nID0gdGhpcy5fZ2V0VGFibGVCaW5kaW5nKG9UYWJsZSk7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVyczogYW55ID0ge1xuXHRcdFx0XHRjcmVhdGlvbk1vZGU6IG9UYWJsZS5kYXRhKFwiY3JlYXRpb25Nb2RlXCIpLFxuXHRcdFx0XHRjcmVhdGlvblJvdzogb1RhYmxlLmdldENyZWF0aW9uUm93KCksXG5cdFx0XHRcdGNyZWF0ZUF0RW5kOiBvVGFibGUuZGF0YShcImNyZWF0ZUF0RW5kXCIpID09PSBcInRydWVcIlxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IGJDcmVhdGVEb2N1bWVudCA9XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93ICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCkgJiZcblx0XHRcdFx0T2JqZWN0LmtleXMobVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRPYmplY3QoKSkubGVuZ3RoID4gMTtcblx0XHRcdGlmIChiQ3JlYXRlRG9jdW1lbnQpIHtcblx0XHRcdFx0Ly8gdGhlIGJTa2lwU2lkZUVmZmVjdHMgaXMgYSBwYXJhbWV0ZXIgY3JlYXRlZCB3aGVuIHdlIGNsaWNrIHRoZSBzYXZlIGtleS4gSWYgd2UgcHJlc3MgdGhpcyBrZXlcblx0XHRcdFx0Ly8gd2UgZG9uJ3QgZXhlY3V0ZSB0aGUgaGFuZGxlU2lkZUVmZmVjdHMgZnVuY2l0b24gdG8gYXZvaWQgYmF0Y2ggcmVkdW5kYW5jeVxuXHRcdFx0XHRtUGFyYW1ldGVycy5iU2tpcFNpZGVFZmZlY3RzID0gdHJ1ZTtcblx0XHRcdFx0YkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgPSB0cnVlO1xuXHRcdFx0XHRhV2FpdENyZWF0ZURvY3VtZW50cy5wdXNoKFxuXHRcdFx0XHRcdHRoaXMuZWRpdEZsb3cuY3JlYXRlRG9jdW1lbnQob0JpbmRpbmcsIG1QYXJhbWV0ZXJzKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQmluZGluZztcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGFCaW5kaW5ncyA9IGF3YWl0IFByb21pc2UuYWxsKGFXYWl0Q3JlYXRlRG9jdW1lbnRzKTtcblx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcjogYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IsXG5cdFx0XHRcdGJpbmRpbmdzOiBhQmluZGluZ3Ncblx0XHRcdH07XG5cdFx0XHQvLyBXZSBuZWVkIHRvIGVpdGhlciByZWplY3Qgb3IgcmVzb2x2ZSBhIHByb21pc2UgaGVyZSBhbmQgcmV0dXJuIGl0IHNpbmNlIHRoaXMgc2F2ZVxuXHRcdFx0Ly8gZnVuY3Rpb24gaXMgbm90IG9ubHkgY2FsbGVkIHdoZW4gcHJlc3NpbmcgdGhlIHNhdmUgYnV0dG9uIGluIHRoZSBmb290ZXIsIGJ1dCBhbHNvXG5cdFx0XHQvLyB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgY3JlYXRlIG9yIHNhdmUgaW4gYSBkYXRhbG9zcyBwb3B1cC5cblx0XHRcdC8vIFRoZSBsb2dpYyBvZiB0aGUgZGF0YWxvc3MgcG9wdXAgbmVlZHMgdG8gZGV0ZWN0IGlmIHRoZSBzYXZlIGhhZCBlcnJvcnMgb3Igbm90IGluIG9yZGVyXG5cdFx0XHQvLyB0byBkZWNpZGUgaWYgdGhlIHN1YnNlcXVlbnQgYWN0aW9uIC0gbGlrZSBhIGJhY2sgbmF2aWdhdGlvbiAtIGhhcyB0byBiZSBleGVjdXRlZCBvciBub3QuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmVkaXRGbG93LnNhdmVEb2N1bWVudChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHQvLyBJZiB0aGUgc2F2ZURvY3VtZW50IGluIGVkaXRGbG93IHJldHVybnMgZXJyb3JzIHdlIG5lZWRcblx0XHRcdFx0Ly8gdG8gc2hvdyB0aGUgbWVzc2FnZSBwb3BvdmVyIGhlcmUgYW5kIGVuc3VyZSB0aGF0IHRoZVxuXHRcdFx0XHQvLyBkYXRhbG9zcyBsb2dpYyBkb2VzIG5vdCBwZXJmb3JtIHRoZSBmb2xsb3cgdXAgZnVuY3Rpb25cblx0XHRcdFx0Ly8gbGlrZSBlLmcuIGEgYmFjayBuYXZpZ2F0aW9uIGhlbmNlIHdlIHJldHVybiBhIHByb21pc2UgYW5kIHJlamVjdCBpdFxuXHRcdFx0XHR0aGlzLl9zaG93TWVzc2FnZVBvcG92ZXIoZXJyb3IpO1xuXHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob01vZGVsKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTW9kZWwpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9tYW5hZ2VDb2xsYWJvcmF0aW9uKCkge1xuXHRcdG9wZW5NYW5hZ2VEaWFsb2codGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0X3Nob3dDb2xsYWJvcmF0aW9uVXNlckRldGFpbHMoZXZlbnQ6IGFueSkge1xuXHRcdHNob3dVc2VyRGV0YWlscyhldmVudCwgdGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0X2NhbmNlbERvY3VtZW50KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbik7IC8vdG8gZ2V0IHRoZSByZWZlcmVuY2Ugb2YgdGhlIGNhbmNlbCBidXR0b24gZnJvbSBjb21tYW5kIGV4ZWN1dGlvblxuXHRcdHJldHVybiB0aGlzLmVkaXRGbG93LmNhbmNlbERvY3VtZW50KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHRfYXBwbHlEb2N1bWVudChvQ29udGV4dDogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuZWRpdEZsb3cuYXBwbHlEb2N1bWVudChvQ29udGV4dCkuY2F0Y2goKCkgPT4gdGhpcy5fc2hvd01lc3NhZ2VQb3BvdmVyKCkpO1xuXHR9XG5cblx0X3VwZGF0ZVJlbGF0ZWRBcHBzKCkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRpZiAoQ29tbW9uVXRpbHMucmVzb2x2ZVN0cmluZ3RvQm9vbGVhbihvT2JqZWN0UGFnZS5kYXRhKFwic2hvd1JlbGF0ZWRBcHBzXCIpKSkge1xuXHRcdFx0Q29tbW9uVXRpbHMudXBkYXRlUmVsYXRlZEFwcHNEZXRhaWxzKG9PYmplY3RQYWdlKTtcblx0XHR9XG5cdH1cblxuXHRfZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVBhcmVudEVsZW1lbnQ6IGFueSwgYVN1YnNlY3Rpb246IGFueSwgYUNvbnRyb2xzOiBhbnksIGJJc0NoYXJ0PzogYm9vbGVhbikge1xuXHRcdGNvbnN0IGFTdWJTZWN0aW9uVGFibGVzID0gW107XG5cdFx0Zm9yIChsZXQgZWxlbWVudCA9IDA7IGVsZW1lbnQgPCBhUGFyZW50RWxlbWVudC5sZW5ndGg7IGVsZW1lbnQrKykge1xuXHRcdFx0bGV0IG9FbGVtZW50ID0gYVBhcmVudEVsZW1lbnRbZWxlbWVudF0uZ2V0Q29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIGFQYXJlbnRFbGVtZW50W2VsZW1lbnRdLmdldENvbnRlbnQoKTtcblx0XHRcdGlmIChiSXNDaGFydCkge1xuXHRcdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQubUFnZ3JlZ2F0aW9ucyAmJiBvRWxlbWVudC5nZXRBZ2dyZWdhdGlvbihcIml0ZW1zXCIpKSB7XG5cdFx0XHRcdFx0Y29uc3QgYUl0ZW1zID0gb0VsZW1lbnQuZ2V0QWdncmVnYXRpb24oXCJpdGVtc1wiKTtcblx0XHRcdFx0XHRhSXRlbXMuZm9yRWFjaChmdW5jdGlvbiAob0l0ZW06IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKG9JdGVtLmlzQShcInNhcC5mZS5tYWNyb3MuY2hhcnQuQ2hhcnRBUElcIikpIHtcblx0XHRcdFx0XHRcdFx0b0VsZW1lbnQgPSBvSXRlbTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50LmlzQSAmJiBvRWxlbWVudC5pc0EoXCJzYXAudWkubGF5b3V0LkR5bmFtaWNTaWRlQ29udGVudFwiKSkge1xuXHRcdFx0XHRvRWxlbWVudCA9IG9FbGVtZW50LmdldE1haW5Db250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb0VsZW1lbnQuZ2V0TWFpbkNvbnRlbnQoKTtcblx0XHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRvRWxlbWVudCA9IG9FbGVtZW50WzBdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQuaXNBICYmIG9FbGVtZW50LmlzQShcInNhcC5mZS5tYWNyb3MudGFibGUuVGFibGVBUElcIikpIHtcblx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudC5nZXRDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb0VsZW1lbnQuZ2V0Q29udGVudCgpO1xuXHRcdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9FbGVtZW50ID0gb0VsZW1lbnRbMF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRhQ29udHJvbHMucHVzaChvRWxlbWVudCk7XG5cdFx0XHRcdGFTdWJTZWN0aW9uVGFibGVzLnB1c2goe1xuXHRcdFx0XHRcdFwidGFibGVcIjogb0VsZW1lbnQsXG5cdFx0XHRcdFx0XCJncmlkVGFibGVcIjogb0VsZW1lbnQuZ2V0VHlwZSgpLmlzQShcInNhcC51aS5tZGMudGFibGUuR3JpZFRhYmxlVHlwZVwiKVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50LmlzQSAmJiBvRWxlbWVudC5pc0EoXCJzYXAuZmUubWFjcm9zLmNoYXJ0LkNoYXJ0QVBJXCIpKSB7XG5cdFx0XHRcdG9FbGVtZW50ID0gb0VsZW1lbnQuZ2V0Q29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIG9FbGVtZW50LmdldENvbnRlbnQoKTtcblx0XHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRvRWxlbWVudCA9IG9FbGVtZW50WzBdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQuaXNBICYmIG9FbGVtZW50LmlzQShcInNhcC51aS5tZGMuQ2hhcnRcIikpIHtcblx0XHRcdFx0YUNvbnRyb2xzLnB1c2gob0VsZW1lbnQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoXG5cdFx0XHRhU3ViU2VjdGlvblRhYmxlcy5sZW5ndGggPT09IDEgJiZcblx0XHRcdGFQYXJlbnRFbGVtZW50Lmxlbmd0aCA9PT0gMSAmJlxuXHRcdFx0YVN1YlNlY3Rpb25UYWJsZXNbMF0uZ3JpZFRhYmxlICYmXG5cdFx0XHQhYVN1YnNlY3Rpb24uaGFzU3R5bGVDbGFzcyhcInNhcFV4QVBPYmplY3RQYWdlU3ViU2VjdGlvbkZpdENvbnRhaW5lclwiKVxuXHRcdCkge1xuXHRcdFx0Ly9JbiBjYXNlIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgdGFibGUgaW4gYSBzZWN0aW9uIHdlIGZpdCB0aGF0IHRvIHRoZSB3aG9sZSBwYWdlIHNvIHRoYXQgdGhlIHNjcm9sbGJhciBjb21lcyBvbmx5IG9uIHRhYmxlIGFuZCBub3Qgb24gcGFnZVxuXHRcdFx0YVN1YnNlY3Rpb24uYWRkU3R5bGVDbGFzcyhcInNhcFV4QVBPYmplY3RQYWdlU3ViU2VjdGlvbkZpdENvbnRhaW5lclwiKTtcblx0XHR9XG5cdH1cblxuXHRfZ2V0QWxsU3ViU2VjdGlvbnMoKSB7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdGxldCBhU3ViU2VjdGlvbnM6IGFueVtdID0gW107XG5cdFx0b09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvU2VjdGlvbjogYW55KSB7XG5cdFx0XHRhU3ViU2VjdGlvbnMgPSBhU3ViU2VjdGlvbnMuY29uY2F0KG9TZWN0aW9uLmdldFN1YlNlY3Rpb25zKCkpO1xuXHRcdH0pO1xuXHRcdHJldHVybiBhU3ViU2VjdGlvbnM7XG5cdH1cblxuXHRfZ2V0QWxsQmxvY2tzKCkge1xuXHRcdGxldCBhQmxvY2tzOiBhbnlbXSA9IFtdO1xuXHRcdHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCkuZm9yRWFjaChmdW5jdGlvbiAob1N1YlNlY3Rpb246IGFueSkge1xuXHRcdFx0YUJsb2NrcyA9IGFCbG9ja3MuY29uY2F0KG9TdWJTZWN0aW9uLmdldEJsb2NrcygpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gYUJsb2Nrcztcblx0fVxuXG5cdF9maW5kVGFibGVzKCkge1xuXHRcdGNvbnN0IGFTdWJTZWN0aW9ucyA9IHRoaXMuX2dldEFsbFN1YlNlY3Rpb25zKCk7XG5cdFx0Y29uc3QgYVRhYmxlczogYW55W10gPSBbXTtcblx0XHRmb3IgKGxldCBzdWJTZWN0aW9uID0gMDsgc3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IHN1YlNlY3Rpb24rKykge1xuXHRcdFx0dGhpcy5fZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLmdldEJsb2NrcygpLCBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0sIGFUYWJsZXMpO1xuXHRcdFx0dGhpcy5fZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLmdldE1vcmVCbG9ja3MoKSwgYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLCBhVGFibGVzKTtcblx0XHR9XG5cdFx0cmV0dXJuIGFUYWJsZXM7XG5cdH1cblxuXHRfZmluZENoYXJ0cygpIHtcblx0XHRjb25zdCBhU3ViU2VjdGlvbnMgPSB0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpO1xuXHRcdGNvbnN0IGFDaGFydHM6IGFueVtdID0gW107XG5cdFx0Zm9yIChsZXQgc3ViU2VjdGlvbiA9IDA7IHN1YlNlY3Rpb24gPCBhU3ViU2VjdGlvbnMubGVuZ3RoOyBzdWJTZWN0aW9uKyspIHtcblx0XHRcdHRoaXMuX2ZpbmRDb250cm9sSW5TdWJTZWN0aW9uKGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXS5nZXRCbG9ja3MoKSwgYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLCBhQ2hhcnRzLCB0cnVlKTtcblx0XHRcdHRoaXMuX2ZpbmRDb250cm9sSW5TdWJTZWN0aW9uKGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXS5nZXRNb3JlQmxvY2tzKCksIGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXSwgYUNoYXJ0cywgdHJ1ZSk7XG5cdFx0fVxuXHRcdHJldHVybiBhQ2hhcnRzO1xuXHR9XG5cblx0X2Nsb3NlU2lkZUNvbnRlbnQoKSB7XG5cdFx0dGhpcy5fZ2V0QWxsQmxvY2tzKCkuZm9yRWFjaChmdW5jdGlvbiAob0Jsb2NrOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Db250ZW50ID0gb0Jsb2NrLmdldENvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBvQmxvY2suZ2V0Q29udGVudCgpO1xuXHRcdFx0aWYgKG9Db250ZW50ICYmIG9Db250ZW50LmlzQSAmJiBvQ29udGVudC5pc0EoXCJzYXAudWkubGF5b3V0LkR5bmFtaWNTaWRlQ29udGVudFwiKSkge1xuXHRcdFx0XHRpZiAob0NvbnRlbnQuc2V0U2hvd1NpZGVDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcblx0XHRcdFx0XHRvQ29udGVudC5zZXRTaG93U2lkZUNvbnRlbnQoZmFsc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhcnQgQ29udGV4dCBpcyByZXNvbHZlZCBmb3IgMTpuIG1pY3JvY2hhcnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gb0NoYXJ0Q29udGV4dCBUaGUgQ29udGV4dCBvZiB0aGUgTWljcm9DaGFydFxuXHQgKiBAcGFyYW0gc0NoYXJ0UGF0aCBUaGUgY29sbGVjdGlvblBhdGggb2YgdGhlIHRoZSBjaGFydFxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBBdHRyaWJ1dGVzIG9mIHRoZSBjaGFydCBDb250ZXh0XG5cdCAqL1xuXHRfZ2V0Q2hhcnRDb250ZXh0RGF0YShvQ2hhcnRDb250ZXh0OiBhbnksIHNDaGFydFBhdGg6IHN0cmluZykge1xuXHRcdGNvbnN0IG9Db250ZXh0RGF0YSA9IG9DaGFydENvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0bGV0IG9DaGFydENvbnRleHREYXRhID0gW29Db250ZXh0RGF0YV07XG5cdFx0aWYgKG9DaGFydENvbnRleHQgJiYgc0NoYXJ0UGF0aCkge1xuXHRcdFx0aWYgKG9Db250ZXh0RGF0YVtzQ2hhcnRQYXRoXSkge1xuXHRcdFx0XHRvQ2hhcnRDb250ZXh0RGF0YSA9IG9Db250ZXh0RGF0YVtzQ2hhcnRQYXRoXTtcblx0XHRcdFx0ZGVsZXRlIG9Db250ZXh0RGF0YVtzQ2hhcnRQYXRoXTtcblx0XHRcdFx0b0NoYXJ0Q29udGV4dERhdGEucHVzaChvQ29udGV4dERhdGEpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb0NoYXJ0Q29udGV4dERhdGE7XG5cdH1cblxuXHQvKipcblx0ICogU2Nyb2xsIHRoZSB0YWJsZXMgdG8gdGhlIHJvdyB3aXRoIHRoZSBzUGF0aFxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgc2FwLmZlLnRlbXBsYXRlcy5PYmplY3RQYWdlLk9iamVjdFBhZ2VDb250cm9sbGVyLmNvbnRyb2xsZXIjX3Njcm9sbFRhYmxlc1RvUm93XG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUm93UGF0aCAnc1BhdGggb2YgdGhlIHRhYmxlIHJvdydcblx0ICovXG5cblx0X3Njcm9sbFRhYmxlc1RvUm93KHNSb3dQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAodGhpcy5fZmluZFRhYmxlcyAmJiB0aGlzLl9maW5kVGFibGVzKCkubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3QgYVRhYmxlcyA9IHRoaXMuX2ZpbmRUYWJsZXMoKTtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYVRhYmxlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRUYWJsZVNjcm9sbGVyLnNjcm9sbFRhYmxlVG9Sb3coYVRhYmxlc1tpXSwgc1Jvd1BhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBNZXRob2QgdG8gbWVyZ2Ugc2VsZWN0ZWQgY29udGV4dHMgYW5kIGZpbHRlcnMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfbWVyZ2VNdWx0aXBsZUNvbnRleHRzXG5cdCAqIEBwYXJhbSBvUGFnZUNvbnRleHQgUGFnZSBjb250ZXh0XG5cdCAqIEBwYXJhbSBhTGluZUNvbnRleHQgU2VsZWN0ZWQgQ29udGV4dHNcblx0ICogQHBhcmFtIHNDaGFydFBhdGggQ29sbGVjdGlvbiBuYW1lIG9mIHRoZSBjaGFydFxuXHQgKiBAcmV0dXJucyBTZWxlY3Rpb24gVmFyaWFudCBPYmplY3Rcblx0ICovXG5cdF9tZXJnZU11bHRpcGxlQ29udGV4dHMob1BhZ2VDb250ZXh0OiBDb250ZXh0LCBhTGluZUNvbnRleHQ6IGFueVtdLCBzQ2hhcnRQYXRoOiBzdHJpbmcpIHtcblx0XHRsZXQgYUF0dHJpYnV0ZXM6IGFueVtdID0gW10sXG5cdFx0XHRhUGFnZUF0dHJpYnV0ZXMgPSBbXSxcblx0XHRcdG9Db250ZXh0LFxuXHRcdFx0c01ldGFQYXRoTGluZTogc3RyaW5nLFxuXHRcdFx0c1BhdGhMaW5lO1xuXG5cdFx0Y29uc3Qgc1BhZ2VQYXRoID0gb1BhZ2VDb250ZXh0LmdldFBhdGgoKTtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gb1BhZ2VDb250ZXh0ICYmIG9QYWdlQ29udGV4dC5nZXRNb2RlbCgpICYmIG9QYWdlQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IHNNZXRhUGF0aFBhZ2UgPSBvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhZ2VQYXRoKS5yZXBsYWNlKC9eXFwvKi8sIFwiXCIpO1xuXG5cdFx0Ly8gR2V0IHNpbmdsZSBsaW5lIGNvbnRleHQgaWYgbmVjZXNzYXJ5XG5cdFx0aWYgKGFMaW5lQ29udGV4dCAmJiBhTGluZUNvbnRleHQubGVuZ3RoKSB7XG5cdFx0XHRvQ29udGV4dCA9IGFMaW5lQ29udGV4dFswXTtcblx0XHRcdHNQYXRoTGluZSA9IG9Db250ZXh0LmdldFBhdGgoKTtcblx0XHRcdHNNZXRhUGF0aExpbmUgPSBvTWV0YU1vZGVsICYmIG9NZXRhTW9kZWwuZ2V0TWV0YVBhdGgoc1BhdGhMaW5lKS5yZXBsYWNlKC9eXFwvKi8sIFwiXCIpO1xuXG5cdFx0XHRhTGluZUNvbnRleHQuZm9yRWFjaCgob1NpbmdsZUNvbnRleHQ6IGFueSkgPT4ge1xuXHRcdFx0XHRpZiAoc0NoYXJ0UGF0aCkge1xuXHRcdFx0XHRcdGNvbnN0IG9DaGFydENvbnRleHREYXRhID0gdGhpcy5fZ2V0Q2hhcnRDb250ZXh0RGF0YShvU2luZ2xlQ29udGV4dCwgc0NoYXJ0UGF0aCk7XG5cdFx0XHRcdFx0aWYgKG9DaGFydENvbnRleHREYXRhKSB7XG5cdFx0XHRcdFx0XHRhQXR0cmlidXRlcyA9IG9DaGFydENvbnRleHREYXRhLm1hcChmdW5jdGlvbiAob1N1YkNoYXJ0Q29udGV4dERhdGE6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnRleHREYXRhOiBvU3ViQ2hhcnRDb250ZXh0RGF0YSxcblx0XHRcdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IGAke3NNZXRhUGF0aFBhZ2V9LyR7c0NoYXJ0UGF0aH1gXG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YUF0dHJpYnV0ZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRjb250ZXh0RGF0YTogb1NpbmdsZUNvbnRleHQuZ2V0T2JqZWN0KCksXG5cdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IHNNZXRhUGF0aExpbmVcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGFQYWdlQXR0cmlidXRlcy5wdXNoKHtcblx0XHRcdGNvbnRleHREYXRhOiBvUGFnZUNvbnRleHQuZ2V0T2JqZWN0KCksXG5cdFx0XHRlbnRpdHlTZXQ6IHNNZXRhUGF0aFBhZ2Vcblx0XHR9KTtcblx0XHQvLyBBZGRpbmcgUGFnZSBDb250ZXh0IHRvIHNlbGVjdGlvbiB2YXJpYW50XG5cdFx0YVBhZ2VBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbHMucmVtb3ZlU2Vuc2l0aXZlRGF0YShhUGFnZUF0dHJpYnV0ZXMsIG9NZXRhTW9kZWwpO1xuXHRcdGNvbnN0IG9QYWdlTGV2ZWxTViA9IENvbW1vblV0aWxzLmFkZFBhZ2VDb250ZXh0VG9TZWxlY3Rpb25WYXJpYW50KG5ldyBTZWxlY3Rpb25WYXJpYW50KCksIGFQYWdlQXR0cmlidXRlcywgdGhpcy5nZXRWaWV3KCkpO1xuXHRcdGFBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbHMucmVtb3ZlU2Vuc2l0aXZlRGF0YShhQXR0cmlidXRlcywgb01ldGFNb2RlbCk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnQ6IG9QYWdlTGV2ZWxTVixcblx0XHRcdGF0dHJpYnV0ZXM6IGFBdHRyaWJ1dGVzXG5cdFx0fTtcblx0fVxuXG5cdF9nZXRCYXRjaEdyb3Vwc0ZvclZpZXcoKSB7XG5cdFx0Y29uc3Qgb1ZpZXdEYXRhID0gdGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnksXG5cdFx0XHRvQ29uZmlndXJhdGlvbnMgPSBvVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24sXG5cdFx0XHRhQ29uZmlndXJhdGlvbnMgPSBvQ29uZmlndXJhdGlvbnMgJiYgT2JqZWN0LmtleXMob0NvbmZpZ3VyYXRpb25zKSxcblx0XHRcdGFCYXRjaEdyb3VwcyA9IFtcIiRhdXRvLkhlcm9lc1wiLCBcIiRhdXRvLkRlY29yYXRpb25cIiwgXCIkYXV0by5Xb3JrZXJzXCJdO1xuXG5cdFx0aWYgKGFDb25maWd1cmF0aW9ucyAmJiBhQ29uZmlndXJhdGlvbnMubGVuZ3RoID4gMCkge1xuXHRcdFx0YUNvbmZpZ3VyYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdFx0XHRjb25zdCBvQ29uZmlndXJhdGlvbiA9IG9Db25maWd1cmF0aW9uc1tzS2V5XTtcblx0XHRcdFx0aWYgKG9Db25maWd1cmF0aW9uLnJlcXVlc3RHcm91cElkID09PSBcIkxvbmdSdW5uZXJzXCIpIHtcblx0XHRcdFx0XHRhQmF0Y2hHcm91cHMucHVzaChcIiRhdXRvLkxvbmdSdW5uZXJzXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmV0dXJuIGFCYXRjaEdyb3Vwcztcblx0fVxuXG5cdC8qXG5cdCAqIFJlc2V0IEJyZWFkY3J1bWIgbGlua3Ncblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7c2FwLm0uQnJlYWRjcnVtYnN9IFtvU291cmNlXSBwYXJlbnQgY29udHJvbFxuXHQgKiBAZGVzY3JpcHRpb24gVXNlZCB3aGVuIGNvbnRleHQgb2YgdGhlIG9iamVjdCBwYWdlIGNoYW5nZXMuXG5cdCAqICAgICAgICAgICAgICBUaGlzIGV2ZW50IGNhbGxiYWNrIGlzIGF0dGFjaGVkIHRvIG1vZGVsQ29udGV4dENoYW5nZVxuXHQgKiAgICAgICAgICAgICAgZXZlbnQgb2YgdGhlIEJyZWFkY3J1bWIgY29udHJvbCB0byBjYXRjaCBjb250ZXh0IGNoYW5nZS5cblx0ICogICAgICAgICAgICAgIFRoZW4gZWxlbWVudCBiaW5kaW5nIGFuZCBocmVmcyBhcmUgdXBkYXRlZCBmb3IgZWFjaCBsaW5rLlxuXHQgKlxuXHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0ICogQGV4cGVyaW1lbnRhbFxuXHQgKi9cblx0YXN5bmMgX3NldEJyZWFkY3J1bWJMaW5rcyhvU291cmNlOiBCcmVhZENydW1icykge1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0b0FwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCksXG5cdFx0XHRhUHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdLFxuXHRcdFx0YVNraXBQYXJhbWV0ZXJpemVkOiBhbnlbXSA9IFtdLFxuXHRcdFx0c05ld1BhdGggPSBvQ29udGV4dD8uZ2V0UGF0aCgpLFxuXHRcdFx0YVBhdGhQYXJ0cyA9IHNOZXdQYXRoPy5zcGxpdChcIi9cIikgPz8gW10sXG5cdFx0XHRvTWV0YU1vZGVsID0gb0FwcENvbXBvbmVudCAmJiBvQXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpO1xuXHRcdGxldCBzUGF0aCA9IFwiXCI7XG5cdFx0dHJ5IHtcblx0XHRcdGFQYXRoUGFydHMuc2hpZnQoKTtcblx0XHRcdGFQYXRoUGFydHMuc3BsaWNlKC0xLCAxKTtcblx0XHRcdGFQYXRoUGFydHMuZm9yRWFjaChmdW5jdGlvbiAoc1BhdGhQYXJ0OiBhbnkpIHtcblx0XHRcdFx0c1BhdGggKz0gYC8ke3NQYXRoUGFydH1gO1xuXHRcdFx0XHRjb25zdCBvUm9vdFZpZXdDb250cm9sbGVyID0gb0FwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKTtcblx0XHRcdFx0Y29uc3Qgc1BhcmFtZXRlclBhdGggPSBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoKTtcblx0XHRcdFx0Y29uc3QgYlJlc3VsdENvbnRleHQgPSBvTWV0YU1vZGVsLmdldE9iamVjdChgJHtzUGFyYW1ldGVyUGF0aH0vQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5SZXN1bHRDb250ZXh0YCk7XG5cdFx0XHRcdGlmIChiUmVzdWx0Q29udGV4dCkge1xuXHRcdFx0XHRcdC8vIFdlIGRvbnQgbmVlZCB0byBjcmVhdGUgYSBicmVhZGNydW1iIGZvciBQYXJhbWV0ZXIgcGF0aFxuXHRcdFx0XHRcdGFTa2lwUGFyYW1ldGVyaXplZC5wdXNoKDEpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhU2tpcFBhcmFtZXRlcml6ZWQucHVzaCgwKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhUHJvbWlzZXMucHVzaChvUm9vdFZpZXdDb250cm9sbGVyLmdldFRpdGxlSW5mb0Zyb21QYXRoKHNQYXRoKSk7XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IHRpdGxlSGllcmFyY2h5SW5mb3M6IGFueVtdID0gYXdhaXQgUHJvbWlzZS5hbGwoYVByb21pc2VzKTtcblx0XHRcdGxldCBpZHgsIGhpZXJhcmNoeVBvc2l0aW9uLCBvTGluaztcblx0XHRcdGZvciAoY29uc3QgdGl0bGVIaWVyYXJjaHlJbmZvIG9mIHRpdGxlSGllcmFyY2h5SW5mb3MpIHtcblx0XHRcdFx0aGllcmFyY2h5UG9zaXRpb24gPSB0aXRsZUhpZXJhcmNoeUluZm9zLmluZGV4T2YodGl0bGVIaWVyYXJjaHlJbmZvKTtcblx0XHRcdFx0aWR4ID0gaGllcmFyY2h5UG9zaXRpb24gLSBhU2tpcFBhcmFtZXRlcml6ZWRbaGllcmFyY2h5UG9zaXRpb25dO1xuXHRcdFx0XHRvTGluayA9IG9Tb3VyY2UuZ2V0TGlua3MoKVtpZHhdID8gb1NvdXJjZS5nZXRMaW5rcygpW2lkeF0gOiBuZXcgTGluaygpO1xuXHRcdFx0XHQvL3NDdXJyZW50RW50aXR5IGlzIGEgZmFsbGJhY2sgdmFsdWUgaW4gY2FzZSBvZiBlbXB0eSB0aXRsZVxuXHRcdFx0XHRvTGluay5zZXRUZXh0KHRpdGxlSGllcmFyY2h5SW5mby5zdWJ0aXRsZSB8fCB0aXRsZUhpZXJhcmNoeUluZm8udGl0bGUpO1xuXHRcdFx0XHQvL1dlIGFwcGx5IGFuIGFkZGl0aW9uYWwgZW5jb2RlVVJJIGluIGNhc2Ugb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzIChpZSBcIi9cIikgdXNlZCBpbiB0aGUgdXJsIHRocm91Z2ggdGhlIHNlbWFudGljIGtleXNcblx0XHRcdFx0b0xpbmsuc2V0SHJlZihlbmNvZGVVUkkodGl0bGVIaWVyYXJjaHlJbmZvLmludGVudCkpO1xuXHRcdFx0XHRpZiAoIW9Tb3VyY2UuZ2V0TGlua3MoKVtpZHhdKSB7XG5cdFx0XHRcdFx0b1NvdXJjZS5hZGRMaW5rKG9MaW5rKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcblx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHNldHRpbmcgdGhlIGJyZWFkY3J1bWIgbGlua3M6XCIgKyBlcnJvcik7XG5cdFx0fVxuXHR9XG5cblx0X2NoZWNrRGF0YVBvaW50VGl0bGVGb3JFeHRlcm5hbE5hdmlnYXRpb24oKSB7XG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IG9EYXRhUG9pbnRzID0gQ29tbW9uVXRpbHMuZ2V0SGVhZGVyRmFjZXRJdGVtQ29uZmlnRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uKFxuXHRcdFx0b1ZpZXcuZ2V0Vmlld0RhdGEoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcblx0XHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um91dGluZ1NlcnZpY2UoKS5nZXRPdXRib3VuZHMoKVxuXHRcdCk7XG5cdFx0Y29uc3Qgb1NoZWxsU2VydmljZXMgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFNoZWxsU2VydmljZXMoKTtcblx0XHRjb25zdCBvUGFnZUNvbnRleHQgPSBvVmlldyAmJiAob1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJpc0hlYWRlckRQTGlua1Zpc2libGVcIiwge30pO1xuXHRcdGlmIChvUGFnZUNvbnRleHQpIHtcblx0XHRcdG9QYWdlQ29udGV4dFxuXHRcdFx0XHQucmVxdWVzdE9iamVjdCgpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uIChvRGF0YTogYW55KSB7XG5cdFx0XHRcdFx0Zm5HZXRMaW5rcyhvRGF0YVBvaW50cywgb0RhdGEpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0TG9nLmVycm9yKFwiQ2Fubm90IHJldHJpZXZlIHRoZSBsaW5rcyBmcm9tIHRoZSBzaGVsbCBzZXJ2aWNlXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSBvRXJyb3Jcblx0XHQgKi9cblx0XHRmdW5jdGlvbiBmbk9uRXJyb3Iob0Vycm9yOiBhbnkpIHtcblx0XHRcdExvZy5lcnJvcihvRXJyb3IpO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGZuU2V0TGlua0VuYWJsZW1lbnQoaWQ6IHN0cmluZywgYVN1cHBvcnRlZExpbmtzOiBhbnkpIHtcblx0XHRcdGNvbnN0IHNMaW5rSWQgPSBpZDtcblx0XHRcdC8vIHByb2Nlc3MgdmlhYmxlIGxpbmtzIGZyb20gZ2V0TGlua3MgZm9yIGFsbCBkYXRhcG9pbnRzIGhhdmluZyBvdXRib3VuZFxuXHRcdFx0aWYgKGFTdXBwb3J0ZWRMaW5rcyAmJiBhU3VwcG9ydGVkTGlua3MubGVuZ3RoID09PSAxICYmIGFTdXBwb3J0ZWRMaW5rc1swXS5zdXBwb3J0ZWQpIHtcblx0XHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KGBpc0hlYWRlckRQTGlua1Zpc2libGUvJHtzTGlua0lkfWAsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSBvU3ViRGF0YVBvaW50c1xuXHRcdCAqIEBwYXJhbSBvUGFnZURhdGFcblx0XHQgKi9cblx0XHRmdW5jdGlvbiBmbkdldExpbmtzKG9TdWJEYXRhUG9pbnRzOiBhbnksIG9QYWdlRGF0YTogYW55KSB7XG5cdFx0XHRmb3IgKGNvbnN0IHNJZCBpbiBvU3ViRGF0YVBvaW50cykge1xuXHRcdFx0XHRjb25zdCBvRGF0YVBvaW50ID0gb1N1YkRhdGFQb2ludHNbc0lkXTtcblx0XHRcdFx0Y29uc3Qgb1BhcmFtczogYW55ID0ge307XG5cdFx0XHRcdGNvbnN0IG9MaW5rID0gb1ZpZXcuYnlJZChzSWQpO1xuXHRcdFx0XHRpZiAoIW9MaW5rKSB7XG5cdFx0XHRcdFx0Ly8gZm9yIGRhdGEgcG9pbnRzIGNvbmZpZ3VyZWQgaW4gYXBwIGRlc2NyaXB0b3IgYnV0IG5vdCBhbm5vdGF0ZWQgaW4gdGhlIGhlYWRlclxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IG9MaW5rQ29udGV4dCA9IG9MaW5rLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0XHRcdGNvbnN0IG9MaW5rRGF0YTogYW55ID0gb0xpbmtDb250ZXh0ICYmIG9MaW5rQ29udGV4dC5nZXRPYmplY3QoKTtcblx0XHRcdFx0bGV0IG9NaXhlZENvbnRleHQ6IGFueSA9IG1lcmdlKHt9LCBvUGFnZURhdGEsIG9MaW5rRGF0YSk7XG5cdFx0XHRcdC8vIHByb2Nlc3Mgc2VtYW50aWMgb2JqZWN0IG1hcHBpbmdzXG5cdFx0XHRcdGlmIChvRGF0YVBvaW50LnNlbWFudGljT2JqZWN0TWFwcGluZykge1xuXHRcdFx0XHRcdGNvbnN0IGFTZW1hbnRpY09iamVjdE1hcHBpbmcgPSBvRGF0YVBvaW50LnNlbWFudGljT2JqZWN0TWFwcGluZztcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW0gaW4gYVNlbWFudGljT2JqZWN0TWFwcGluZykge1xuXHRcdFx0XHRcdFx0Y29uc3Qgb01hcHBpbmcgPSBhU2VtYW50aWNPYmplY3RNYXBwaW5nW2l0ZW1dO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc01haW5Qcm9wZXJ0eSA9IG9NYXBwaW5nW1wiTG9jYWxQcm9wZXJ0eVwiXVtcIiRQcm9wZXJ0eVBhdGhcIl07XG5cdFx0XHRcdFx0XHRjb25zdCBzTWFwcGVkUHJvcGVydHkgPSBvTWFwcGluZ1tcIlNlbWFudGljT2JqZWN0UHJvcGVydHlcIl07XG5cdFx0XHRcdFx0XHRpZiAoc01haW5Qcm9wZXJ0eSAhPT0gc01hcHBlZFByb3BlcnR5KSB7XG5cdFx0XHRcdFx0XHRcdGlmIChvTWl4ZWRDb250ZXh0Lmhhc093blByb3BlcnR5KHNNYWluUHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3Qgb05ld01hcHBpbmc6IGFueSA9IHt9O1xuXHRcdFx0XHRcdFx0XHRcdG9OZXdNYXBwaW5nW3NNYXBwZWRQcm9wZXJ0eV0gPSBvTWl4ZWRDb250ZXh0W3NNYWluUHJvcGVydHldO1xuXHRcdFx0XHRcdFx0XHRcdG9NaXhlZENvbnRleHQgPSBtZXJnZSh7fSwgb01peGVkQ29udGV4dCwgb05ld01hcHBpbmcpO1xuXHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSBvTWl4ZWRDb250ZXh0W3NNYWluUHJvcGVydHldO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKG9NaXhlZENvbnRleHQpIHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHNLZXkgaW4gb01peGVkQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0aWYgKHNLZXkuaW5kZXhPZihcIl9cIikgIT09IDAgJiYgc0tleS5pbmRleE9mKFwib2RhdGEuY29udGV4dFwiKSA9PT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0b1BhcmFtc1tzS2V5XSA9IG9NaXhlZENvbnRleHRbc0tleV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHZhbGlkYXRlIGlmIGEgbGluayBtdXN0IGJlIHJlbmRlcmVkXG5cdFx0XHRcdG9TaGVsbFNlcnZpY2VzXG5cdFx0XHRcdFx0LmlzTmF2aWdhdGlvblN1cHBvcnRlZChbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHRhcmdldDoge1xuXHRcdFx0XHRcdFx0XHRcdHNlbWFudGljT2JqZWN0OiBvRGF0YVBvaW50LnNlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdFx0XHRcdGFjdGlvbjogb0RhdGFQb2ludC5hY3Rpb25cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0cGFyYW1zOiBvUGFyYW1zXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XSlcblx0XHRcdFx0XHQudGhlbigoYUxpbmtzKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm5TZXRMaW5rRW5hYmxlbWVudChzSWQsIGFMaW5rcyk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZm5PbkVycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRoYW5kbGVycyA9IHtcblx0XHQvKipcblx0XHQgKiBJbnZva2VzIHRoZSBwYWdlIHByaW1hcnkgYWN0aW9uIG9uIHByZXNzIG9mIEN0cmwrRW50ZXIuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0gb0NvbnRyb2xsZXIgVGhlIHBhZ2UgY29udHJvbGxlclxuXHRcdCAqIEBwYXJhbSBvVmlld1xuXHRcdCAqIEBwYXJhbSBvQ29udGV4dCBDb250ZXh0IGZvciB3aGljaCB0aGUgYWN0aW9uIGlzIGNhbGxlZFxuXHRcdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHRcdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0XHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmNvbnRleHRzXSBNYW5kYXRvcnkgZm9yIGEgYm91bmQgYWN0aW9uLCBlaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyBjYWxsZWRcblx0XHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm1vZGVsXSBNYW5kYXRvcnkgZm9yIGFuIHVuYm91bmQgYWN0aW9uOyBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuXHRcdCAqIEBwYXJhbSBbbUNvbmRpdGlvbnNdIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0XHQgKiBAcGFyYW0gW21Db25kaXRpb25zLnBvc2l0aXZlQWN0aW9uVmlzaWJsZV0gVGhlIHZpc2liaWxpdHkgb2Ygc2VtYXRpYyBwb3NpdGl2ZSBhY3Rpb25cblx0XHQgKiBAcGFyYW0gW21Db25kaXRpb25zLnBvc2l0aXZlQWN0aW9uRW5hYmxlZF0gVGhlIGVuYWJsZW1lbnQgb2Ygc2VtYW50aWMgcG9zaXRpdmUgYWN0aW9uXG5cdFx0ICogQHBhcmFtIFttQ29uZGl0aW9ucy5lZGl0QWN0aW9uVmlzaWJsZV0gVGhlIEVkaXQgYnV0dG9uIHZpc2liaWxpdHlcblx0XHQgKiBAcGFyYW0gW21Db25kaXRpb25zLmVkaXRBY3Rpb25FbmFibGVkXSBUaGUgZW5hYmxlbWVudCBvZiBFZGl0IGJ1dHRvblxuXHRcdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHRcdCAqIEBmaW5hbFxuXHRcdCAqL1xuXHRcdG9uUHJpbWFyeUFjdGlvbihcblx0XHRcdG9Db250cm9sbGVyOiBPYmplY3RQYWdlQ29udHJvbGxlcixcblx0XHRcdG9WaWV3OiBWaWV3LFxuXHRcdFx0b0NvbnRleHQ6IENvbnRleHQsXG5cdFx0XHRzQWN0aW9uTmFtZTogc3RyaW5nLFxuXHRcdFx0bVBhcmFtZXRlcnM6IHVua25vd24sXG5cdFx0XHRtQ29uZGl0aW9uczoge1xuXHRcdFx0XHRwb3NpdGl2ZUFjdGlvblZpc2libGU6IGJvb2xlYW47XG5cdFx0XHRcdHBvc2l0aXZlQWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcblx0XHRcdFx0ZWRpdEFjdGlvblZpc2libGU6IGJvb2xlYW47XG5cdFx0XHRcdGVkaXRBY3Rpb25FbmFibGVkOiBib29sZWFuO1xuXHRcdFx0fVxuXHRcdCkge1xuXHRcdFx0Y29uc3QgaVZpZXdMZXZlbCA9IChvQ29udHJvbGxlci5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLnZpZXdMZXZlbCxcblx0XHRcdFx0b09iamVjdFBhZ2UgPSBvQ29udHJvbGxlci5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRcdGlmIChtQ29uZGl0aW9ucy5wb3NpdGl2ZUFjdGlvblZpc2libGUpIHtcblx0XHRcdFx0aWYgKG1Db25kaXRpb25zLnBvc2l0aXZlQWN0aW9uRW5hYmxlZCkge1xuXHRcdFx0XHRcdG9Db250cm9sbGVyLmhhbmRsZXJzLm9uQ2FsbEFjdGlvbihvVmlldywgc0FjdGlvbk5hbWUsIG1QYXJhbWV0ZXJzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChtQ29uZGl0aW9ucy5lZGl0QWN0aW9uVmlzaWJsZSAmJiBpVmlld0xldmVsID09PSAxKSB7XG5cdFx0XHRcdGlmIChtQ29uZGl0aW9ucy5lZGl0QWN0aW9uRW5hYmxlZCkge1xuXHRcdFx0XHRcdG9Db250cm9sbGVyLl9lZGl0RG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGlWaWV3TGV2ZWwgPT09IDEgJiYgb09iamVjdFBhZ2UuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpKSB7XG5cdFx0XHRcdG9Db250cm9sbGVyLl9zYXZlRG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdFx0fSBlbHNlIGlmIChvT2JqZWN0UGFnZS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIikpIHtcblx0XHRcdFx0b0NvbnRyb2xsZXIuX2FwcGx5RG9jdW1lbnQob0NvbnRleHQpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRvblRhYmxlQ29udGV4dENoYW5nZSh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdGNvbnN0IG9Tb3VyY2UgPSBvRXZlbnQuZ2V0U291cmNlKCk7XG5cdFx0XHRsZXQgb1RhYmxlOiBhbnk7XG5cdFx0XHR0aGlzLl9maW5kVGFibGVzKCkuc29tZShmdW5jdGlvbiAoX29UYWJsZTogYW55KSB7XG5cdFx0XHRcdGlmIChfb1RhYmxlLmdldFJvd0JpbmRpbmcoKSA9PT0gb1NvdXJjZSkge1xuXHRcdFx0XHRcdG9UYWJsZSA9IF9vVGFibGU7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IG9DdXJyZW50QWN0aW9uUHJvbWlzZSA9IHRoaXMuX2VkaXRGbG93LmdldEN1cnJlbnRBY3Rpb25Qcm9taXNlKCk7XG5cdFx0XHRpZiAob0N1cnJlbnRBY3Rpb25Qcm9taXNlKSB7XG5cdFx0XHRcdGxldCBhVGFibGVDb250ZXh0czogYW55O1xuXHRcdFx0XHRpZiAob1RhYmxlLmdldFR5cGUoKS5nZXRNZXRhZGF0YSgpLmlzQShcInNhcC51aS5tZGMudGFibGUuR3JpZFRhYmxlVHlwZVwiKSkge1xuXHRcdFx0XHRcdGFUYWJsZUNvbnRleHRzID0gb1NvdXJjZS5nZXRDb250ZXh0cygwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRhVGFibGVDb250ZXh0cyA9IG9Tb3VyY2UuZ2V0Q3VycmVudENvbnRleHRzKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly9pZiBjb250ZXh0cyBhcmUgbm90IGZ1bGx5IGxvYWRlZCB0aGUgZ2V0Y29udGV4dHMgZnVuY3Rpb24gYWJvdmUgd2lsbCB0cmlnZ2VyIGEgbmV3IGNoYW5nZSBldmVudCBjYWxsXG5cdFx0XHRcdGlmICghYVRhYmxlQ29udGV4dHNbMF0pIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0b0N1cnJlbnRBY3Rpb25Qcm9taXNlXG5cdFx0XHRcdFx0LnRoZW4oKG9BY3Rpb25SZXNwb25zZTogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoIW9BY3Rpb25SZXNwb25zZSB8fCBvQWN0aW9uUmVzcG9uc2UuY29udHJvbElkICE9PSBvVGFibGUuc0lkKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNvbnN0IG9BY3Rpb25EYXRhID0gb0FjdGlvblJlc3BvbnNlLm9EYXRhO1xuXHRcdFx0XHRcdFx0Y29uc3QgYUtleXMgPSBvQWN0aW9uUmVzcG9uc2Uua2V5cztcblx0XHRcdFx0XHRcdGxldCBpTmV3SXRlbXAgPSAtMTtcblx0XHRcdFx0XHRcdGFUYWJsZUNvbnRleHRzLmZpbmQoZnVuY3Rpb24gKG9UYWJsZUNvbnRleHQ6IGFueSwgaTogYW55KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9UYWJsZURhdGEgPSBvVGFibGVDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBiQ29tcGFyZSA9IGFLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gb1RhYmxlRGF0YVtzS2V5XSA9PT0gb0FjdGlvbkRhdGFbc0tleV07XG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRpZiAoYkNvbXBhcmUpIHtcblx0XHRcdFx0XHRcdFx0XHRpTmV3SXRlbXAgPSBpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiBiQ29tcGFyZTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0aWYgKGlOZXdJdGVtcCAhPT0gLTEpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYURpYWxvZ3MgPSBJbnN0YW5jZU1hbmFnZXIuZ2V0T3BlbkRpYWxvZ3MoKTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWxvZyA9XG5cdFx0XHRcdFx0XHRcdFx0YURpYWxvZ3MubGVuZ3RoID4gMCA/IGFEaWFsb2dzLmZpbmQoKGRpYWxvZykgPT4gZGlhbG9nLmRhdGEoXCJGdWxsU2NyZWVuRGlhbG9nXCIpICE9PSB0cnVlKSA6IG51bGw7XG5cdFx0XHRcdFx0XHRcdGlmIChvRGlhbG9nKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gYnkgZGVzaWduLCBhIHNhcC5tLmRpYWxvZyBzZXQgdGhlIGZvY3VzIHRvIHRoZSBwcmV2aW91cyBmb2N1c2VkIGVsZW1lbnQgd2hlbiBjbG9zaW5nLlxuXHRcdFx0XHRcdFx0XHRcdC8vIHdlIHNob3VsZCB3YWl0IGZvciB0aGUgZGlhbG9nIHRvIGJlIGNsb3NlIGJlZm9yZSB0byBmb2N1cyBhbm90aGVyIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRvRGlhbG9nLmF0dGFjaEV2ZW50T25jZShcImFmdGVyQ2xvc2VcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0b1RhYmxlLmZvY3VzUm93KGlOZXdJdGVtcCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0b1RhYmxlLmZvY3VzUm93KGlOZXdJdGVtcCwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGhpcy5fZWRpdEZsb3cuZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAoZXJyOiBhbnkpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihgQW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNjcm9sbGluZyB0byB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtOiAke2Vycn1gKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdC8vIGZpcmUgTW9kZWxDb250ZXh0Q2hhbmdlIG9uIHRoZSBtZXNzYWdlIGJ1dHRvbiB3aGVuZXZlciB0aGUgdGFibGUgY29udGV4dCBjaGFuZ2VzXG5cdFx0XHR0aGlzLm1lc3NhZ2VCdXR0b24uZmlyZU1vZGVsQ29udGV4dENoYW5nZSgpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBJbnZva2VzIGFuIGFjdGlvbiAtIGJvdW5kL3VuYm91bmQgYW5kIHNldHMgdGhlIHBhZ2UgZGlydHkuXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0gb1ZpZXdcblx0XHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0XHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdFx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jb250ZXh0c10gTWFuZGF0b3J5IGZvciBhIGJvdW5kIGFjdGlvbiwgZWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgY2FsbGVkXG5cdFx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5tb2RlbF0gTWFuZGF0b3J5IGZvciBhbiB1bmJvdW5kIGFjdGlvbjsgYW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWxcblx0XHQgKiBAcmV0dXJucyBUaGUgYWN0aW9uIHByb21pc2Vcblx0XHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0XHQgKiBAZmluYWxcblx0XHQgKi9cblx0XHRvbkNhbGxBY3Rpb24ob1ZpZXc6IGFueSwgc0FjdGlvbk5hbWU6IHN0cmluZywgbVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0NvbnRyb2xsZXIgPSBvVmlldy5nZXRDb250cm9sbGVyKCk7XG5cdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIuZWRpdEZsb3dcblx0XHRcdFx0Lmludm9rZUFjdGlvbihzQWN0aW9uTmFtZSwgbVBhcmFtZXRlcnMpXG5cdFx0XHRcdC50aGVuKG9Db250cm9sbGVyLl9zaG93TWVzc2FnZVBvcG92ZXIuYmluZChvQ29udHJvbGxlciwgdW5kZWZpbmVkKSlcblx0XHRcdFx0LmNhdGNoKG9Db250cm9sbGVyLl9zaG93TWVzc2FnZVBvcG92ZXIuYmluZChvQ29udHJvbGxlcikpO1xuXHRcdH0sXG5cdFx0b25EYXRhUG9pbnRUaXRsZVByZXNzZWQob0NvbnRyb2xsZXI6IGFueSwgb1NvdXJjZTogYW55LCBvTWFuaWZlc3RPdXRib3VuZDogYW55LCBzQ29udHJvbENvbmZpZzogYW55LCBzQ29sbGVjdGlvblBhdGg6IGFueSkge1xuXHRcdFx0b01hbmlmZXN0T3V0Ym91bmQgPSB0eXBlb2Ygb01hbmlmZXN0T3V0Ym91bmQgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKG9NYW5pZmVzdE91dGJvdW5kKSA6IG9NYW5pZmVzdE91dGJvdW5kO1xuXHRcdFx0Y29uc3Qgb1RhcmdldEluZm8gPSBvTWFuaWZlc3RPdXRib3VuZFtzQ29udHJvbENvbmZpZ10sXG5cdFx0XHRcdGFTZW1hbnRpY09iamVjdE1hcHBpbmcgPSBDb21tb25VdGlscy5nZXRTZW1hbnRpY09iamVjdE1hcHBpbmcob1RhcmdldEluZm8pLFxuXHRcdFx0XHRvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0ID0gb1NvdXJjZS5nZXRCaW5kaW5nQ29udGV4dCgpLFxuXHRcdFx0XHRzTWV0YVBhdGggPSBvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0XG5cdFx0XHRcdFx0LmdldE1vZGVsKClcblx0XHRcdFx0XHQuZ2V0TWV0YU1vZGVsKClcblx0XHRcdFx0XHQuZ2V0TWV0YVBhdGgob0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dC5nZXRQYXRoKCkpO1xuXHRcdFx0bGV0IGFOYXZpZ2F0aW9uRGF0YSA9IG9Db250cm9sbGVyLl9nZXRDaGFydENvbnRleHREYXRhKG9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHQsIHNDb2xsZWN0aW9uUGF0aCk7XG5cdFx0XHRsZXQgYWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzO1xuXG5cdFx0XHRhTmF2aWdhdGlvbkRhdGEgPSBhTmF2aWdhdGlvbkRhdGEubWFwKGZ1bmN0aW9uIChvTmF2aWdhdGlvbkRhdGE6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGRhdGE6IG9OYXZpZ2F0aW9uRGF0YSxcblx0XHRcdFx0XHRtZXRhUGF0aDogc01ldGFQYXRoICsgKHNDb2xsZWN0aW9uUGF0aCA/IGAvJHtzQ29sbGVjdGlvblBhdGh9YCA6IFwiXCIpXG5cdFx0XHRcdH07XG5cdFx0XHR9KTtcblx0XHRcdGlmIChvVGFyZ2V0SW5mbyAmJiBvVGFyZ2V0SW5mby5wYXJhbWV0ZXJzKSB7XG5cdFx0XHRcdGNvbnN0IG9QYXJhbXMgPSBvVGFyZ2V0SW5mby5wYXJhbWV0ZXJzICYmIG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24uZ2V0T3V0Ym91bmRQYXJhbXMob1RhcmdldEluZm8ucGFyYW1ldGVycyk7XG5cdFx0XHRcdGlmIChPYmplY3Qua2V5cyhvUGFyYW1zKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzID0gb1BhcmFtcztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9UYXJnZXRJbmZvICYmIG9UYXJnZXRJbmZvLnNlbWFudGljT2JqZWN0ICYmIG9UYXJnZXRJbmZvLmFjdGlvbikge1xuXHRcdFx0XHRvQ29udHJvbGxlci5faW50ZW50QmFzZWROYXZpZ2F0aW9uLm5hdmlnYXRlKG9UYXJnZXRJbmZvLnNlbWFudGljT2JqZWN0LCBvVGFyZ2V0SW5mby5hY3Rpb24sIHtcblx0XHRcdFx0XHRuYXZpZ2F0aW9uQ29udGV4dHM6IGFOYXZpZ2F0aW9uRGF0YSxcblx0XHRcdFx0XHRzZW1hbnRpY09iamVjdE1hcHBpbmc6IGFTZW1hbnRpY09iamVjdE1hcHBpbmcsXG5cdFx0XHRcdFx0YWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzOiBhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnNcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvKipcblx0XHQgKiBUcmlnZ2VycyBhbiBvdXRib3VuZCBuYXZpZ2F0aW9uIHdoZW4gYSB1c2VyIGNob29zZXMgdGhlIGNoZXZyb24uXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0gb0NvbnRyb2xsZXJcblx0XHQgKiBAcGFyYW0gc091dGJvdW5kVGFyZ2V0IE5hbWUgb2YgdGhlIG91dGJvdW5kIHRhcmdldCAobmVlZHMgdG8gYmUgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3QpXG5cdFx0ICogQHBhcmFtIG9Db250ZXh0IFRoZSBjb250ZXh0IHRoYXQgY29udGFpbnMgdGhlIGRhdGEgZm9yIHRoZSB0YXJnZXQgYXBwXG5cdFx0ICogQHBhcmFtIHNDcmVhdGVQYXRoIENyZWF0ZSBwYXRoIHdoZW4gdGhlIGNoZXZyb24gaXMgY3JlYXRlZC5cblx0XHQgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIGlzIHJlc29sdmVkIG9uY2UgdGhlIG5hdmlnYXRpb24gaXMgdHJpZ2dlcmVkICg/Pz8gbWF5YmUgb25seSBvbmNlIGZpbmlzaGVkPylcblx0XHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0XHQgKiBAZmluYWxcblx0XHQgKi9cblx0XHRvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQob0NvbnRyb2xsZXI6IE9iamVjdFBhZ2VDb250cm9sbGVyLCBzT3V0Ym91bmRUYXJnZXQ6IHN0cmluZywgb0NvbnRleHQ6IGFueSwgc0NyZWF0ZVBhdGg6IHN0cmluZykge1xuXHRcdFx0cmV0dXJuIG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ub25DaGV2cm9uUHJlc3NOYXZpZ2F0ZU91dEJvdW5kKG9Db250cm9sbGVyLCBzT3V0Ym91bmRUYXJnZXQsIG9Db250ZXh0LCBzQ3JlYXRlUGF0aCk7XG5cdFx0fSxcblxuXHRcdG9uTmF2aWdhdGVDaGFuZ2UodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIsIG9FdmVudDogYW55KSB7XG5cdFx0XHQvL3dpbGwgYmUgY2FsbGVkIGFsd2F5cyB3aGVuIHdlIGNsaWNrIG9uIGEgc2VjdGlvbiB0YWJcblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHRcdHRoaXMuYlNlY3Rpb25OYXZpZ2F0ZWQgPSB0cnVlO1xuXG5cdFx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRvT2JqZWN0UGFnZS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIikgJiZcblx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS5zZWN0aW9uTGF5b3V0ID09PSBcIlRhYnNcIiAmJlxuXHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuZ2V0UHJvcGVydHkoXCJlcnJvck5hdmlnYXRpb25TZWN0aW9uRmxhZ1wiKSA9PT0gZmFsc2Vcblx0XHRcdCkge1xuXHRcdFx0XHRjb25zdCBvU3ViU2VjdGlvbiA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJzdWJTZWN0aW9uXCIpO1xuXHRcdFx0XHR0aGlzLl91cGRhdGVGb2N1c0luRWRpdE1vZGUoW29TdWJTZWN0aW9uXSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvblZhcmlhbnRTZWxlY3RlZDogZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0fSxcblx0XHRvblZhcmlhbnRTYXZlZDogZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0XHQvL1RPRE86IFNob3VsZCByZW1vdmUgdGhpcyBzZXRUaW1lT3V0IG9uY2UgVmFyaWFudCBNYW5hZ2VtZW50IHByb3ZpZGVzIGFuIGFwaSB0byBmZXRjaCB0aGUgY3VycmVudCB2YXJpYW50IGtleSBvbiBzYXZlXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdFx0fSwgNTAwKTtcblx0XHR9LFxuXHRcdG5hdmlnYXRlVG9TdWJTZWN0aW9uOiBmdW5jdGlvbiAob0NvbnRyb2xsZXI6IE9iamVjdFBhZ2VDb250cm9sbGVyLCB2RGV0YWlsQ29uZmlnOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9EZXRhaWxDb25maWcgPSB0eXBlb2YgdkRldGFpbENvbmZpZyA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2UodkRldGFpbENvbmZpZykgOiB2RGV0YWlsQ29uZmlnO1xuXHRcdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuYnlJZChcImZlOjpPYmplY3RQYWdlXCIpIGFzIE9iamVjdFBhZ2VMYXlvdXQ7XG5cdFx0XHRsZXQgb1NlY3Rpb247XG5cdFx0XHRsZXQgb1N1YlNlY3Rpb247XG5cdFx0XHRpZiAob0RldGFpbENvbmZpZy5zZWN0aW9uSWQpIHtcblx0XHRcdFx0b1NlY3Rpb24gPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuYnlJZChvRGV0YWlsQ29uZmlnLnNlY3Rpb25JZCkgYXMgT2JqZWN0UGFnZVNlY3Rpb247XG5cdFx0XHRcdG9TdWJTZWN0aW9uID0gKFxuXHRcdFx0XHRcdG9EZXRhaWxDb25maWcuc3ViU2VjdGlvbklkXG5cdFx0XHRcdFx0XHQ/IG9Db250cm9sbGVyLmdldFZpZXcoKS5ieUlkKG9EZXRhaWxDb25maWcuc3ViU2VjdGlvbklkKVxuXHRcdFx0XHRcdFx0OiBvU2VjdGlvbiAmJiBvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpICYmIG9TZWN0aW9uLmdldFN1YlNlY3Rpb25zKClbMF1cblx0XHRcdFx0KSBhcyBPYmplY3RQYWdlU3ViU2VjdGlvbjtcblx0XHRcdH0gZWxzZSBpZiAob0RldGFpbENvbmZpZy5zdWJTZWN0aW9uSWQpIHtcblx0XHRcdFx0b1N1YlNlY3Rpb24gPSBvQ29udHJvbGxlci5nZXRWaWV3KCkuYnlJZChvRGV0YWlsQ29uZmlnLnN1YlNlY3Rpb25JZCkgYXMgT2JqZWN0UGFnZVN1YlNlY3Rpb247XG5cdFx0XHRcdG9TZWN0aW9uID0gb1N1YlNlY3Rpb24gJiYgKG9TdWJTZWN0aW9uLmdldFBhcmVudCgpIGFzIE9iamVjdFBhZ2VTZWN0aW9uKTtcblx0XHRcdH1cblx0XHRcdGlmICghb1NlY3Rpb24gfHwgIW9TdWJTZWN0aW9uIHx8ICFvU2VjdGlvbi5nZXRWaXNpYmxlKCkgfHwgIW9TdWJTZWN0aW9uLmdldFZpc2libGUoKSkge1xuXHRcdFx0XHQoKG9Db250cm9sbGVyLmdldFZpZXcoKS5nZXRNb2RlbChcInNhcC5mZS5pMThuXCIpIGFzIFJlc291cmNlTW9kZWwpLmdldFJlc291cmNlQnVuZGxlKCkgYXMgUHJvbWlzZTxSZXNvdXJjZUJ1bmRsZT4pXG5cdFx0XHRcdFx0LnRoZW4oZnVuY3Rpb24gKG9SZXNvdXJjZUJ1bmRsZSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc1RpdGxlID0gQ29tbW9uVXRpbHMuZ2V0VHJhbnNsYXRlZFRleHQoXG5cdFx0XHRcdFx0XHRcdFwiQ19ST1VUSU5HX05BVklHQVRJT05fRElTQUJMRURfVElUTEVcIixcblx0XHRcdFx0XHRcdFx0b1Jlc291cmNlQnVuZGxlLFxuXHRcdFx0XHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdChvQ29udHJvbGxlci5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmVudGl0eVNldFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihzVGl0bGUpO1xuXHRcdFx0XHRcdFx0TWVzc2FnZUJveC5lcnJvcihzVGl0bGUpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGVycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9PYmplY3RQYWdlLnNjcm9sbFRvU2VjdGlvbihvU3ViU2VjdGlvbi5nZXRJZCgpKTtcblx0XHRcdFx0Ly8gdHJpZ2dlciBpYXBwIHN0YXRlIGNoYW5nZVxuXHRcdFx0XHRvT2JqZWN0UGFnZS5maXJlTmF2aWdhdGUoe1xuXHRcdFx0XHRcdHNlY3Rpb246IG9TZWN0aW9uLFxuXHRcdFx0XHRcdHN1YlNlY3Rpb246IG9TdWJTZWN0aW9uXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0b25DaGFydFNlbGVjdGlvbkNoYW5nZWQ6IGZ1bmN0aW9uIChvRXZlbnQ6IGFueSkge1xuXHRcdFx0Q2hhcnRSdW50aW1lLmZuVXBkYXRlQ2hhcnQob0V2ZW50KTtcblx0XHR9LFxuXHRcdG9uU3RhdGVDaGFuZ2UodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIpIHtcblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHR9LFxuXHRcdGNsb3NlT1BNZXNzYWdlU3RyaXA6IGZ1bmN0aW9uICh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlcikge1xuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS5oaWRlTWVzc2FnZSgpO1xuXHRcdH1cblx0fTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgT2JqZWN0UGFnZUNvbnRyb2xsZXI7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBa2pCTyxnQkFBZ0JBLElBQWhCLEVBQXNCQyxPQUF0QixFQUErQjtJQUNyQyxJQUFJO01BQ0gsSUFBSUMsTUFBTSxHQUFHRixJQUFJLEVBQWpCO0lBQ0EsQ0FGRCxDQUVFLE9BQU1HLENBQU4sRUFBUztNQUNWLE9BQU9GLE9BQU8sQ0FBQ0UsQ0FBRCxDQUFkO0lBQ0E7O0lBQ0QsSUFBSUQsTUFBTSxJQUFJQSxNQUFNLENBQUNFLElBQXJCLEVBQTJCO01BQzFCLE9B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
|
|
1537
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJib2R5IiwicmVjb3ZlciIsInJlc3VsdCIsImUiLCJ0aGVuIiwiZmluYWxpemVyIiwiYmluZCIsIk9iamVjdFBhZ2VDb250cm9sbGVyIiwiZGVmaW5lVUk1Q2xhc3MiLCJ1c2luZ0V4dGVuc2lvbiIsIlBsYWNlaG9sZGVyIiwiU2hhcmUiLCJvdmVycmlkZSIsIlNoYXJlT3ZlcnJpZGVzIiwiSW50ZXJuYWxSb3V0aW5nIiwiSW50ZXJuYWxSb3V0aW5nT3ZlcnJpZGUiLCJQYWdpbmF0b3IiLCJQYWdpbmF0b3JPdmVycmlkZSIsIk1lc3NhZ2VIYW5kbGVyIiwiTWVzc2FnZUhhbmRsZXJPdmVycmlkZSIsIkludGVudEJhc2VkTmF2aWdhdGlvbiIsIkludGVudEJhc2VkTmF2aWdhdGlvbk92ZXJyaWRlIiwiSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJnZXROYXZpZ2F0aW9uTW9kZSIsImJJc1N0aWNreUVkaXRNb2RlIiwiZ2V0VmlldyIsImdldENvbnRyb2xsZXIiLCJnZXRTdGlja3lFZGl0TW9kZSIsInVuZGVmaW5lZCIsIlZpZXdTdGF0ZSIsIlZpZXdTdGF0ZU92ZXJyaWRlcyIsIlBhZ2VSZWFkeSIsImlzQ29udGV4dEV4cGVjdGVkIiwiTWFzc0VkaXQiLCJwdWJsaWNFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImV4dGVuc2libGUiLCJPdmVycmlkZUV4ZWN1dGlvbiIsIkFmdGVyIiwiaGFuZGxlcnMiLCJvblByaW1hcnlBY3Rpb24iLCJvQ29udHJvbGxlciIsIm9WaWV3Iiwib0NvbnRleHQiLCJzQWN0aW9uTmFtZSIsIm1QYXJhbWV0ZXJzIiwibUNvbmRpdGlvbnMiLCJpVmlld0xldmVsIiwiZ2V0Vmlld0RhdGEiLCJ2aWV3TGV2ZWwiLCJvT2JqZWN0UGFnZSIsIl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCIsInBvc2l0aXZlQWN0aW9uVmlzaWJsZSIsInBvc2l0aXZlQWN0aW9uRW5hYmxlZCIsIm9uQ2FsbEFjdGlvbiIsImVkaXRBY3Rpb25WaXNpYmxlIiwiZWRpdEFjdGlvbkVuYWJsZWQiLCJfZWRpdERvY3VtZW50IiwiZ2V0TW9kZWwiLCJnZXRQcm9wZXJ0eSIsIl9zYXZlRG9jdW1lbnQiLCJfYXBwbHlEb2N1bWVudCIsIm9uVGFibGVDb250ZXh0Q2hhbmdlIiwib0V2ZW50Iiwib1NvdXJjZSIsImdldFNvdXJjZSIsIm9UYWJsZSIsIl9maW5kVGFibGVzIiwic29tZSIsIl9vVGFibGUiLCJnZXRSb3dCaW5kaW5nIiwib0N1cnJlbnRBY3Rpb25Qcm9taXNlIiwiX2VkaXRGbG93IiwiZ2V0Q3VycmVudEFjdGlvblByb21pc2UiLCJhVGFibGVDb250ZXh0cyIsImdldFR5cGUiLCJnZXRNZXRhZGF0YSIsImlzQSIsImdldENvbnRleHRzIiwiZ2V0Q3VycmVudENvbnRleHRzIiwib0FjdGlvblJlc3BvbnNlIiwiY29udHJvbElkIiwic0lkIiwib0FjdGlvbkRhdGEiLCJvRGF0YSIsImFLZXlzIiwia2V5cyIsImlOZXdJdGVtcCIsImZpbmQiLCJvVGFibGVDb250ZXh0IiwiaSIsIm9UYWJsZURhdGEiLCJnZXRPYmplY3QiLCJiQ29tcGFyZSIsImV2ZXJ5Iiwic0tleSIsImFEaWFsb2dzIiwiSW5zdGFuY2VNYW5hZ2VyIiwiZ2V0T3BlbkRpYWxvZ3MiLCJvRGlhbG9nIiwibGVuZ3RoIiwiZGlhbG9nIiwiZGF0YSIsImF0dGFjaEV2ZW50T25jZSIsImZvY3VzUm93IiwiZGVsZXRlQ3VycmVudEFjdGlvblByb21pc2UiLCJjYXRjaCIsImVyciIsIkxvZyIsImVycm9yIiwibWVzc2FnZUJ1dHRvbiIsImZpcmVNb2RlbENvbnRleHRDaGFuZ2UiLCJlZGl0RmxvdyIsImludm9rZUFjdGlvbiIsIl9zaG93TWVzc2FnZVBvcG92ZXIiLCJvbkRhdGFQb2ludFRpdGxlUHJlc3NlZCIsIm9NYW5pZmVzdE91dGJvdW5kIiwic0NvbnRyb2xDb25maWciLCJzQ29sbGVjdGlvblBhdGgiLCJKU09OIiwicGFyc2UiLCJvVGFyZ2V0SW5mbyIsImFTZW1hbnRpY09iamVjdE1hcHBpbmciLCJDb21tb25VdGlscyIsImdldFNlbWFudGljT2JqZWN0TWFwcGluZyIsIm9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsInNNZXRhUGF0aCIsImdldE1ldGFNb2RlbCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImFOYXZpZ2F0aW9uRGF0YSIsIl9nZXRDaGFydENvbnRleHREYXRhIiwiYWRkaXRpb25hbE5hdmlnYXRpb25QYXJhbWV0ZXJzIiwibWFwIiwib05hdmlnYXRpb25EYXRhIiwibWV0YVBhdGgiLCJwYXJhbWV0ZXJzIiwib1BhcmFtcyIsIl9pbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJnZXRPdXRib3VuZFBhcmFtcyIsIk9iamVjdCIsInNlbWFudGljT2JqZWN0IiwiYWN0aW9uIiwibmF2aWdhdGUiLCJuYXZpZ2F0aW9uQ29udGV4dHMiLCJzZW1hbnRpY09iamVjdE1hcHBpbmciLCJvbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQiLCJzT3V0Ym91bmRUYXJnZXQiLCJzQ3JlYXRlUGF0aCIsIm9uTmF2aWdhdGVDaGFuZ2UiLCJnZXRFeHRlbnNpb25BUEkiLCJ1cGRhdGVBcHBTdGF0ZSIsImJTZWN0aW9uTmF2aWdhdGVkIiwib0ludGVybmFsTW9kZWxDb250ZXh0Iiwic2VjdGlvbkxheW91dCIsIm9TdWJTZWN0aW9uIiwiZ2V0UGFyYW1ldGVyIiwiX3VwZGF0ZUZvY3VzSW5FZGl0TW9kZSIsIm9uVmFyaWFudFNlbGVjdGVkIiwib25WYXJpYW50U2F2ZWQiLCJzZXRUaW1lb3V0IiwibmF2aWdhdGVUb1N1YlNlY3Rpb24iLCJ2RGV0YWlsQ29uZmlnIiwib0RldGFpbENvbmZpZyIsImJ5SWQiLCJvU2VjdGlvbiIsInNlY3Rpb25JZCIsInN1YlNlY3Rpb25JZCIsImdldFN1YlNlY3Rpb25zIiwiZ2V0UGFyZW50IiwiZ2V0VmlzaWJsZSIsImdldFJlc291cmNlQnVuZGxlIiwib1Jlc291cmNlQnVuZGxlIiwic1RpdGxlIiwiZ2V0VHJhbnNsYXRlZFRleHQiLCJlbnRpdHlTZXQiLCJNZXNzYWdlQm94Iiwic2Nyb2xsVG9TZWN0aW9uIiwiZ2V0SWQiLCJmaXJlTmF2aWdhdGUiLCJzZWN0aW9uIiwic3ViU2VjdGlvbiIsIm9uQ2hhcnRTZWxlY3Rpb25DaGFuZ2VkIiwiQ2hhcnRSdW50aW1lIiwiZm5VcGRhdGVDaGFydCIsIm9uU3RhdGVDaGFuZ2UiLCJjbG9zZU9QTWVzc2FnZVN0cmlwIiwiaGlkZU1lc3NhZ2UiLCJtQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMiLCJFeHRlbnNpb25BUEkiLCJleHRlbnNpb25BUEkiLCJvbkluaXQiLCJzZXRQcm9wZXJ0eSIsInBhZ2UiLCJ2aXNpYmlsaXR5IiwiaXRlbXMiLCJfZ2V0QmF0Y2hHcm91cHNGb3JWaWV3IiwidXNlTmV3TGF6eUxvYWRpbmciLCJnZXRFbmFibGVMYXp5TG9hZGluZyIsImF0dGFjaEV2ZW50IiwiX2hhbmRsZVN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnQiLCJvSXRlbUJpbmRpbmciLCJhdHRhY2hDaGFuZ2UiLCJfZm5TaG93T1BNZXNzYWdlIiwib25FeGl0IiwiZGVzdHJveSIsIm9NZXNzYWdlUG9wb3ZlciIsImlzT3BlbiIsImNsb3NlIiwiaXNLZWVwQWxpdmUiLCJzZXRLZWVwQWxpdmUiLCJpc0Nvbm5lY3RlZCIsImRpc2Nvbm5lY3QiLCJ2aWV3IiwibWVzc2FnZXMiLCJnZXRJdGVtcyIsIml0ZW0iLCJmaWx0ZXIiLCJtZXNzYWdlIiwiZ2V0VGFyZ2V0cyIsInNob3dNZXNzYWdlcyIsIl9nZXRUYWJsZUJpbmRpbmciLCJvbkJlZm9yZVJlbmRlcmluZyIsIlBhZ2VDb250cm9sbGVyIiwicHJvdG90eXBlIiwiYXBwbHkiLCJvVmlld0RhdGEiLCJyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IiwiQ29tbW9uSGVscGVyIiwic2V0TWV0YU1vZGVsIiwiZ2V0QXBwQ29tcG9uZW50Iiwib25BZnRlclJlbmRlcmluZyIsInJlc3BvbnNlIiwib0Vycm9yIiwiX29uQmVmb3JlQmluZGluZyIsImFUYWJsZXMiLCJvSW50ZXJuYWxNb2RlbCIsImFCYXRjaEdyb3VwcyIsIm9GYXN0Q3JlYXRpb25Sb3ciLCJwdXNoIiwiYkRyYWZ0TmF2aWdhdGlvbiIsIl9jbG9zZVNpZGVDb250ZW50Iiwib3BDb250ZXh0IiwiaGFzUGVuZGluZ0NoYW5nZXMiLCJnZXRCaW5kaW5nIiwicmVzZXRDaGFuZ2VzIiwiZ2V0Q3JlYXRpb25Sb3ciLCJzZXRCaW5kaW5nQ29udGV4dCIsImZuU2Nyb2xsVG9QcmVzZW50U2VjdGlvbiIsImlzRmlyc3RSZW5kZXJpbmciLCJiUGVyc2lzdE9QU2Nyb2xsIiwic2V0U2VsZWN0ZWRTZWN0aW9uIiwib0RlbGVnYXRlT25CZWZvcmUiLCJhZGRFdmVudERlbGVnYXRlIiwicGFnZVJlYWR5IiwicmVtb3ZlRXZlbnREZWxlZ2F0ZSIsIm9CaW5kaW5nIiwibGlzdEJpbmRpbmciLCJvUGFnaW5hdG9yQ3VycmVudENvbnRleHQiLCJvQmluZGluZ1RvVXNlIiwicGFnaW5hdG9yIiwiaW5pdGlhbGl6ZSIsInNCaW5kaW5nUGF0aCIsInRlc3QiLCJzTGlzdEJpbmRpbmdQYXRoIiwicmVwbGFjZSIsIk9EYXRhTGlzdEJpbmRpbmciLCJvTW9kZWwiLCJfc2V0TGlzdEJpbmRpbmdBc3luYyIsImRldGFjaEV2ZW50IiwiYVNlY3Rpb25zIiwiZ2V0U2VjdGlvbnMiLCJiVXNlSWNvblRhYkJhciIsImdldFVzZUljb25UYWJCYXIiLCJpU2tpcCIsImJJc0luRWRpdE1vZGUiLCJiRWRpdGFibGVIZWFkZXIiLCJlZGl0YWJsZUhlYWRlckNvbnRlbnQiLCJpU2VjdGlvbiIsImFTdWJTZWN0aW9ucyIsImlTdWJTZWN0aW9uIiwiaXNWaXNpYmlsaXR5RHluYW1pYyIsInBsYWNlaG9sZGVyIiwiaXNQbGFjZWhvbGRlckVuYWJsZWQiLCJzaG93UGxhY2Vob2xkZXIiLCJvTmF2Q29udGFpbmVyIiwib0NvbnRhaW5lciIsIl9nZXRGaXJzdENsaWNrYWJsZUVsZW1lbnQiLCJvRmlyc3RDbGlja2FibGVFbGVtZW50IiwiYUFjdGlvbnMiLCJnZXRIZWFkZXJUaXRsZSIsImdldEFjdGlvbnMiLCJvQWN0aW9uIiwiZ2V0RW5hYmxlZCIsIl9nZXRGaXJzdEVtcHR5TWFuZGF0b3J5RmllbGRGcm9tU3ViU2VjdGlvbiIsImFCbG9ja3MiLCJnZXRCbG9ja3MiLCJibG9jayIsImFGb3JtQ29udGFpbmVycyIsImdldEZvcm1Db250YWluZXJzIiwiZ2V0Q29udGVudCIsImZvcm1Db250YWluZXIiLCJhRm9ybUVsZW1lbnRzIiwiZ2V0Rm9ybUVsZW1lbnRzIiwiZm9ybUVsZW1lbnQiLCJhRmllbGRzIiwiZ2V0RmllbGRzIiwiZ2V0UmVxdWlyZWQiLCJnZXRWYWx1ZSIsImRlYnVnIiwib01hbmRhdG9yeUZpZWxkIiwib0ZpZWxkVG9Gb2N1cyIsImNvbnRlbnQiLCJnZXRDb250ZW50RWRpdCIsIl9nZXRGaXJzdEVkaXRhYmxlSW5wdXQiLCJmb2N1cyIsIl9vbkJhY2tOYXZpZ2F0aW9uSW5EcmFmdCIsIm1lc3NhZ2VIYW5kbGVyIiwicmVtb3ZlVHJhbnNpdGlvbk1lc3NhZ2VzIiwiZ2V0Um91dGVyUHJveHkiLCJjaGVja0lmQmFja0hhc1NhbWVDb250ZXh0IiwiaGlzdG9yeSIsImJhY2siLCJkcmFmdCIsInByb2Nlc3NEYXRhTG9zc09yRHJhZnREaXNjYXJkQ29uZmlybWF0aW9uIiwiRnVuY3Rpb24iLCJOYXZpZ2F0aW9uVHlwZSIsIkJhY2tOYXZpZ2F0aW9uIiwiX29uQWZ0ZXJCaW5kaW5nIiwib0JpbmRpbmdDb250ZXh0IiwiZW5hYmxlRmFzdENyZWF0aW9uUm93Iiwib0xpc3RCaW5kaW5nIiwib0Zhc3RDcmVhdGlvbkxpc3RCaW5kaW5nIiwib0Zhc3RDcmVhdGlvbkNvbnRleHQiLCJvRmluYWxVSVN0YXRlIiwiYmluZExpc3QiLCJnZXRDb250ZXh0IiwiJCR1cGRhdGVHcm91cElkIiwiJCRncm91cElkIiwicmVmcmVzaEludGVybmFsIiwiY3JlYXRlIiwiY3JlYXRlZCIsInRyYWNlIiwiX3NpZGVFZmZlY3RzIiwiY2xlYXJQcm9wZXJ0aWVzU3RhdHVzIiwiYUlCTkFjdGlvbnMiLCJmb3JFYWNoIiwiZ2V0SUJOQWN0aW9ucyIsIm9UYWJsZVJvd0JpbmRpbmciLCJNb2RlbEhlbHBlciIsImlzU3RpY2t5U2Vzc2lvblN1cHBvcnRlZCIsInJlbW92ZUNhY2hlc0FuZE1lc3NhZ2VzIiwib0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCIsInBhcnNlQ3VzdG9tRGF0YSIsIkRlbGVnYXRlVXRpbCIsImdldEN1c3RvbURhdGEiLCJhU2VsZWN0ZWRDb250ZXh0cyIsImdldFNlbGVjdGVkQ29udGV4dHMiLCJBY3Rpb25SdW50aW1lIiwic2V0QWN0aW9uRW5hYmxlbWVudCIsImNsZWFyU2VsZWN0aW9uIiwiZ2V0U2VtYW50aWNUYXJnZXRzRnJvbVBhZ2VNb2RlbCIsIm9PYmplY3RQYWdlVGl0bGUiLCJhSUJOSGVhZGVyQWN0aW9ucyIsImNvbmNhdCIsInVwZGF0ZURhdGFGaWVsZEZvcklCTkJ1dHRvbnNWaXNpYmlsaXR5IiwiaGFuZGxlVGFibGVNb2RpZmljYXRpb25zIiwiZm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzIiwiZm5IYW5kbGVDaGFuZ2UiLCJkZXRhY2hDaGFuZ2UiLCJjb21wdXRlRWRpdE1vZGUiLCJpc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZCIsImNvbm5lY3QiLCJvQ2FjaGUiLCJfdXBkYXRlUmVsYXRlZEFwcHMiLCJmblVwZGF0ZVJlbGF0ZWRBcHBzIiwiZGV0YWNoRGF0YVJlY2VpdmVkIiwiYXR0YWNoRGF0YVJlY2VpdmVkIiwiY3VycmVudEJpbmRpbmciLCJoYW5kbGVQYXRjaFNlbnQiLCJUYWJsZVV0aWxzIiwid2hlbkJvdW5kIiwiX3RyaWdnZXJWaXNpYmxlU3ViU2VjdGlvbnNFdmVudHMiLCJ1cGRhdGVFZGl0QnV0dG9uVmlzaWJpbGl0eUFuZEVuYWJsZW1lbnQiLCJvblBhZ2VSZWFkeSIsInNldEZvY3VzIiwiaXNJbkRpc3BsYXlNb2RlIiwib1NlbGVjdGVkU2VjdGlvbiIsIkNvcmUiLCJnZXRTZWxlY3RlZFNlY3Rpb24iLCJiSXNTdGlja3lNb2RlIiwib0FwcENvbXBvbmVudCIsImdldFNoZWxsU2VydmljZXMiLCJzZXRCYWNrTmF2aWdhdGlvbiIsInZpZXdJZCIsImdldEFwcFN0YXRlSGFuZGxlciIsImFwcGx5QXBwU3RhdGUiLCJmb3JjZUZvY3VzIiwiRXJyb3IiLCJfY2hlY2tEYXRhUG9pbnRUaXRsZUZvckV4dGVybmFsTmF2aWdhdGlvbiIsIl9nZXRQYWdlVGl0bGVJbmZvcm1hdGlvbiIsIm9PYmplY3RQYWdlU3VidGl0bGUiLCJvQ3VzdG9tRGF0YSIsImdldEtleSIsInRpdGxlIiwic3VidGl0bGUiLCJpbnRlbnQiLCJpY29uIiwiX2V4ZWN1dGVIZWFkZXJTaG9ydGN1dCIsInNCdXR0b25JZCIsIm9CdXR0b24iLCJvRWxlbWVudCIsImZpcmVCdXR0b25QcmVzcyIsIl9leGVjdXRlRm9vdGVyU2hvcnRjdXQiLCJnZXRGb290ZXIiLCJnZXROYW1lIiwiX2V4ZWN1dGVUYWJTaG9ydEN1dCIsIm9FeGVjdXRpb24iLCJpU2VjdGlvbkluZGV4TWF4Iiwic0NvbW1hbmQiLCJnZXRDb21tYW5kIiwibmV3U2VjdGlvbiIsImlTZWxlY3RlZFNlY3Rpb25JbmRleCIsImluZGV4T2ZTZWN0aW9uIiwiX2dldEZvb3RlclZpc2liaWxpdHkiLCJzVmlld0lkIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0TWVzc2FnZU1hbmFnZXIiLCJnZXRNZXNzYWdlTW9kZWwiLCJnZXREYXRhIiwib01lc3NhZ2UiLCJ2YWxpZGF0aW9uIiwidHlwZSIsInRhcmdldCIsImluZGV4T2YiLCJvUmV0Iiwicm9vdFZpZXdDb250cm9sbGVyIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiY3VycmVudFBhZ2VWaWV3IiwiaXNGY2xFbmFibGVkIiwiZ2V0UmlnaHRtb3N0VmlldyIsImdldFJvb3RDb250YWluZXIiLCJnZXRDdXJyZW50UGFnZSIsIm9NZXNzYWdlQnV0dG9uIiwiZ2V0TGVuZ3RoIiwic2V0VmlzaWJsZSIsIm9wZW5CeSIsIkJ1c3lMb2NrZXIiLCJsb2NrIiwiZWRpdERvY3VtZW50IiwiZmluYWxseSIsInVubG9jayIsImdldERyYWZ0Um9vdENvbnRleHQiLCJjb250ZXh0IiwiZHJhZnRSb290Q29udGV4dFBhdGgiLCJnZXREcmFmdFJvb3RQYXRoIiwic2ltcGxlRHJhZnRSb290Q29udGV4dCIsImV4aXN0aW5nQmluZGluZ0NvbnRleHRPblBhZ2UiLCJnZXRJbnN0YW5jZWRWaWV3cyIsInBhZ2VWaWV3IiwiaW50ZXJuYWxNb2RlbCIsIm1vZGVsIiwiYmluZENvbnRleHQiLCJnZXRCb3VuZENvbnRleHQiLCJ3YWl0Rm9yQ29udGV4dFJlcXVlc3RlZCIsIl92YWxpZGF0ZURvY3VtZW50IiwiY29udHJvbCIsImdldEN1cnJlbnRGb2N1c2VkQ29udHJvbElkIiwiaXNUcmFuc2llbnQiLCJzeW5jVGFzayIsImFwcENvbXBvbmVudCIsInNpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsImVudGl0eVR5cGUiLCJnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQiLCJnbG9iYWxTaWRlRWZmZWN0cyIsImdldEdsb2JhbE9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJQcm9taXNlIiwiYWxsIiwic2lkZUVmZmVjdHMiLCJyZXF1ZXN0U2lkZUVmZmVjdHMiLCJkcmFmdFJvb3RDb250ZXh0IiwiZXhlY3V0ZURyYWZ0VmFsaWRhdGlvbiIsImFXYWl0Q3JlYXRlRG9jdW1lbnRzIiwiYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IiLCJjcmVhdGlvbk1vZGUiLCJjcmVhdGlvblJvdyIsImNyZWF0ZUF0RW5kIiwiYkNyZWF0ZURvY3VtZW50IiwiYlNraXBTaWRlRWZmZWN0cyIsImNyZWF0ZURvY3VtZW50IiwiYUJpbmRpbmdzIiwiYmluZGluZ3MiLCJzYXZlRG9jdW1lbnQiLCJpc0xvY2tlZCIsIl9tYW5hZ2VDb2xsYWJvcmF0aW9uIiwib3Blbk1hbmFnZURpYWxvZyIsIl9zaG93Q29sbGFib3JhdGlvblVzZXJEZXRhaWxzIiwiZXZlbnQiLCJzaG93VXNlckRldGFpbHMiLCJfY2FuY2VsRG9jdW1lbnQiLCJjYW5jZWxCdXR0b24iLCJjYW5jZWxEb2N1bWVudCIsImFwcGx5RG9jdW1lbnQiLCJyZXNvbHZlU3RyaW5ndG9Cb29sZWFuIiwidXBkYXRlUmVsYXRlZEFwcHNEZXRhaWxzIiwiX2ZpbmRDb250cm9sSW5TdWJTZWN0aW9uIiwiYVBhcmVudEVsZW1lbnQiLCJhU3Vic2VjdGlvbiIsImFDb250cm9scyIsImJJc0NoYXJ0IiwiYVN1YlNlY3Rpb25UYWJsZXMiLCJlbGVtZW50IiwibUFnZ3JlZ2F0aW9ucyIsImdldEFnZ3JlZ2F0aW9uIiwiYUl0ZW1zIiwib0l0ZW0iLCJnZXRNYWluQ29udGVudCIsInRhYmxlIiwiZ3JpZFRhYmxlIiwiaGFzU3R5bGVDbGFzcyIsImFkZFN0eWxlQ2xhc3MiLCJfZ2V0QWxsU3ViU2VjdGlvbnMiLCJfZ2V0QWxsQmxvY2tzIiwiZ2V0TW9yZUJsb2NrcyIsIl9maW5kQ2hhcnRzIiwiYUNoYXJ0cyIsIm9CbG9jayIsIm9Db250ZW50Iiwic2V0U2hvd1NpZGVDb250ZW50Iiwib0NoYXJ0Q29udGV4dCIsInNDaGFydFBhdGgiLCJvQ29udGV4dERhdGEiLCJvQ2hhcnRDb250ZXh0RGF0YSIsIl9zY3JvbGxUYWJsZXNUb1JvdyIsInNSb3dQYXRoIiwiVGFibGVTY3JvbGxlciIsInNjcm9sbFRhYmxlVG9Sb3ciLCJfbWVyZ2VNdWx0aXBsZUNvbnRleHRzIiwib1BhZ2VDb250ZXh0IiwiYUxpbmVDb250ZXh0IiwiYUF0dHJpYnV0ZXMiLCJhUGFnZUF0dHJpYnV0ZXMiLCJzTWV0YVBhdGhMaW5lIiwic1BhdGhMaW5lIiwic1BhZ2VQYXRoIiwib01ldGFNb2RlbCIsInNNZXRhUGF0aFBhZ2UiLCJvU2luZ2xlQ29udGV4dCIsIm9TdWJDaGFydENvbnRleHREYXRhIiwiY29udGV4dERhdGEiLCJyZW1vdmVTZW5zaXRpdmVEYXRhIiwib1BhZ2VMZXZlbFNWIiwiYWRkUGFnZUNvbnRleHRUb1NlbGVjdGlvblZhcmlhbnQiLCJTZWxlY3Rpb25WYXJpYW50Iiwic2VsZWN0aW9uVmFyaWFudCIsImF0dHJpYnV0ZXMiLCJvQ29uZmlndXJhdGlvbnMiLCJjb250cm9sQ29uZmlndXJhdGlvbiIsImFDb25maWd1cmF0aW9ucyIsIm9Db25maWd1cmF0aW9uIiwicmVxdWVzdEdyb3VwSWQiLCJfc2V0QnJlYWRjcnVtYkxpbmtzIiwiYVByb21pc2VzIiwiYVNraXBQYXJhbWV0ZXJpemVkIiwic05ld1BhdGgiLCJhUGF0aFBhcnRzIiwic3BsaXQiLCJzUGF0aCIsInNoaWZ0Iiwic3BsaWNlIiwic1BhdGhQYXJ0Iiwib1Jvb3RWaWV3Q29udHJvbGxlciIsInNQYXJhbWV0ZXJQYXRoIiwiYlJlc3VsdENvbnRleHQiLCJnZXRUaXRsZUluZm9Gcm9tUGF0aCIsInRpdGxlSGllcmFyY2h5SW5mb3MiLCJpZHgiLCJoaWVyYXJjaHlQb3NpdGlvbiIsIm9MaW5rIiwidGl0bGVIaWVyYXJjaHlJbmZvIiwiZ2V0TGlua3MiLCJMaW5rIiwic2V0VGV4dCIsInNldEhyZWYiLCJlbmNvZGVVUkkiLCJhZGRMaW5rIiwib0RhdGFQb2ludHMiLCJnZXRIZWFkZXJGYWNldEl0ZW1Db25maWdGb3JFeHRlcm5hbE5hdmlnYXRpb24iLCJnZXRSb3V0aW5nU2VydmljZSIsImdldE91dGJvdW5kcyIsIm9TaGVsbFNlcnZpY2VzIiwicmVxdWVzdE9iamVjdCIsImZuR2V0TGlua3MiLCJmbk9uRXJyb3IiLCJmblNldExpbmtFbmFibGVtZW50IiwiaWQiLCJhU3VwcG9ydGVkTGlua3MiLCJzTGlua0lkIiwic3VwcG9ydGVkIiwib1N1YkRhdGFQb2ludHMiLCJvUGFnZURhdGEiLCJvRGF0YVBvaW50Iiwib0xpbmtDb250ZXh0Iiwib0xpbmtEYXRhIiwib01peGVkQ29udGV4dCIsIm1lcmdlIiwib01hcHBpbmciLCJzTWFpblByb3BlcnR5Iiwic01hcHBlZFByb3BlcnR5IiwiaGFzT3duUHJvcGVydHkiLCJvTmV3TWFwcGluZyIsImlzTmF2aWdhdGlvblN1cHBvcnRlZCIsInBhcmFtcyIsImFMaW5rcyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiT2JqZWN0UGFnZUNvbnRyb2xsZXIuY29udHJvbGxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBSZXNvdXJjZUJ1bmRsZSBmcm9tIFwic2FwL2Jhc2UvaTE4bi9SZXNvdXJjZUJ1bmRsZVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCBBY3Rpb25SdW50aW1lIGZyb20gXCJzYXAvZmUvY29yZS9BY3Rpb25SdW50aW1lXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcInNhcC9mZS9jb3JlL0NvbW1vblV0aWxzXCI7XG5pbXBvcnQgQnVzeUxvY2tlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvQnVzeUxvY2tlclwiO1xuaW1wb3J0IHsgY29ubmVjdCwgZGlzY29ubmVjdCwgaXNDb25uZWN0ZWQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvY29sbGFib3JhdGlvbi9BY3Rpdml0eVN5bmNcIjtcbmltcG9ydCB7IG9wZW5NYW5hZ2VEaWFsb2csIHNob3dVc2VyRGV0YWlscyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9jb2xsYWJvcmF0aW9uL01hbmFnZVwiO1xuaW1wb3J0IGRyYWZ0IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9lZGl0Rmxvdy9kcmFmdFwiO1xuaW1wb3J0IEludGVudEJhc2VkTmF2aWdhdGlvbiBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL0ludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uXCI7XG5pbXBvcnQgSW50ZXJuYWxSb3V0aW5nIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCBNYXNzRWRpdCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWFzc0VkaXRcIjtcbmltcG9ydCBNZXNzYWdlSGFuZGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCBQYWdlUmVhZHkgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BhZ2VSZWFkeVwiO1xuaW1wb3J0IFBhZ2luYXRvciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udHJvbGxlcmV4dGVuc2lvbnMvUGFnaW5hdG9yXCI7XG5pbXBvcnQgUGxhY2Vob2xkZXIgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1BsYWNlaG9sZGVyXCI7XG5pbXBvcnQgU2hhcmUgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zL1NoYXJlXCI7XG5pbXBvcnQgVmlld1N0YXRlIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9WaWV3U3RhdGVcIjtcbmltcG9ydCB7IGRlZmluZVVJNUNsYXNzLCBleHRlbnNpYmxlLCBmaW5hbEV4dGVuc2lvbiwgcHVibGljRXh0ZW5zaW9uLCB1c2luZ0V4dGVuc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgeyBJbnRlcm5hbE1vZGVsQ29udGV4dCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL01vZGVsSGVscGVyXCI7XG5pbXBvcnQgTW9kZWxIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvTW9kZWxIZWxwZXJcIjtcbmltcG9ydCBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCBDaGFydFJ1bnRpbWUgZnJvbSBcInNhcC9mZS9tYWNyb3MvY2hhcnQvQ2hhcnRSdW50aW1lXCI7XG5pbXBvcnQgQ29tbW9uSGVscGVyIGZyb20gXCJzYXAvZmUvbWFjcm9zL0NvbW1vbkhlbHBlclwiO1xuaW1wb3J0IERlbGVnYXRlVXRpbCBmcm9tIFwic2FwL2ZlL21hY3Jvcy9EZWxlZ2F0ZVV0aWxcIjtcbmltcG9ydCBUYWJsZVV0aWxzIGZyb20gXCJzYXAvZmUvbWFjcm9zL3RhYmxlL1V0aWxzXCI7XG5pbXBvcnQgU2VsZWN0aW9uVmFyaWFudCBmcm9tIFwic2FwL2ZlL25hdmlnYXRpb24vU2VsZWN0aW9uVmFyaWFudFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9iamVjdFBhZ2VFeHRlbnNpb25BUEkgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL0V4dGVuc2lvbkFQSVwiO1xuaW1wb3J0IHsgZGVmYXVsdCBhcyBFeHRlbnNpb25BUEkgfSBmcm9tIFwic2FwL2ZlL3RlbXBsYXRlcy9PYmplY3RQYWdlL0V4dGVuc2lvbkFQSVwiO1xuaW1wb3J0IFRhYmxlU2Nyb2xsZXIgZnJvbSBcInNhcC9mZS90ZW1wbGF0ZXMvVGFibGVTY3JvbGxlclwiO1xuaW1wb3J0IEluc3RhbmNlTWFuYWdlciBmcm9tIFwic2FwL20vSW5zdGFuY2VNYW5hZ2VyXCI7XG5pbXBvcnQgTGluayBmcm9tIFwic2FwL20vTGlua1wiO1xuaW1wb3J0IE1lc3NhZ2VCb3ggZnJvbSBcInNhcC9tL01lc3NhZ2VCb3hcIjtcbmltcG9ydCB0eXBlIFBvcG92ZXIgZnJvbSBcInNhcC9tL1BvcG92ZXJcIjtcbmltcG9ydCBDb3JlIGZyb20gXCJzYXAvdWkvY29yZS9Db3JlXCI7XG5pbXBvcnQgdHlwZSBNZXNzYWdlIGZyb20gXCJzYXAvdWkvY29yZS9tZXNzYWdlL01lc3NhZ2VcIjtcbmltcG9ydCBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0JpbmRpbmdcIjtcbmltcG9ydCB0eXBlIEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IE9EYXRhTGlzdEJpbmRpbmcgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YUxpc3RCaW5kaW5nXCI7XG5pbXBvcnQgdHlwZSBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgUmVzb3VyY2VNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL3Jlc291cmNlL1Jlc291cmNlTW9kZWxcIjtcbmltcG9ydCB0eXBlIEJyZWFkQ3J1bWJzIGZyb20gXCJzYXAvdXhhcC9CcmVhZENydW1ic1wiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZSBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZVwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZUxheW91dCBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZUxheW91dFwiO1xuaW1wb3J0IHR5cGUgT2JqZWN0UGFnZVNlY3Rpb24gZnJvbSBcInNhcC91eGFwL09iamVjdFBhZ2VTZWN0aW9uXCI7XG5pbXBvcnQgdHlwZSBPYmplY3RQYWdlU3ViU2VjdGlvbiBmcm9tIFwic2FwL3V4YXAvT2JqZWN0UGFnZVN1YlNlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgT0RhdGFDb250ZXh0QmluZGluZ0V4LCBWNENvbnRleHQgfSBmcm9tIFwidHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5pbXBvcnQgSW50ZW50QmFzZWROYXZpZ2F0aW9uT3ZlcnJpZGUgZnJvbSBcIi4vb3ZlcnJpZGVzL0ludGVudEJhc2VkTmF2aWdhdGlvblwiO1xuaW1wb3J0IEludGVybmFsUm91dGluZ092ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9JbnRlcm5hbFJvdXRpbmdcIjtcbmltcG9ydCBNZXNzYWdlSGFuZGxlck92ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9NZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IFBhZ2luYXRvck92ZXJyaWRlIGZyb20gXCIuL292ZXJyaWRlcy9QYWdpbmF0b3JcIjtcbmltcG9ydCBTaGFyZU92ZXJyaWRlcyBmcm9tIFwiLi9vdmVycmlkZXMvU2hhcmVcIjtcbmltcG9ydCBWaWV3U3RhdGVPdmVycmlkZXMgZnJvbSBcIi4vb3ZlcnJpZGVzL1ZpZXdTdGF0ZVwiO1xuXG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUudGVtcGxhdGVzLk9iamVjdFBhZ2UuT2JqZWN0UGFnZUNvbnRyb2xsZXJcIilcbmNsYXNzIE9iamVjdFBhZ2VDb250cm9sbGVyIGV4dGVuZHMgUGFnZUNvbnRyb2xsZXIge1xuXHRvVmlldyE6IGFueTtcblx0QHVzaW5nRXh0ZW5zaW9uKFBsYWNlaG9sZGVyKVxuXHRwbGFjZWhvbGRlciE6IFBsYWNlaG9sZGVyO1xuXHRAdXNpbmdFeHRlbnNpb24oU2hhcmUub3ZlcnJpZGUoU2hhcmVPdmVycmlkZXMpKVxuXHRzaGFyZSE6IFNoYXJlO1xuXHRAdXNpbmdFeHRlbnNpb24oSW50ZXJuYWxSb3V0aW5nLm92ZXJyaWRlKEludGVybmFsUm91dGluZ092ZXJyaWRlKSlcblx0X3JvdXRpbmchOiBJbnRlcm5hbFJvdXRpbmc7XG5cdEB1c2luZ0V4dGVuc2lvbihQYWdpbmF0b3Iub3ZlcnJpZGUoUGFnaW5hdG9yT3ZlcnJpZGUpKVxuXHRwYWdpbmF0b3IhOiBQYWdpbmF0b3I7XG5cdEB1c2luZ0V4dGVuc2lvbihNZXNzYWdlSGFuZGxlci5vdmVycmlkZShNZXNzYWdlSGFuZGxlck92ZXJyaWRlKSlcblx0bWVzc2FnZUhhbmRsZXIhOiBNZXNzYWdlSGFuZGxlcjtcblx0QHVzaW5nRXh0ZW5zaW9uKEludGVudEJhc2VkTmF2aWdhdGlvbi5vdmVycmlkZShJbnRlbnRCYXNlZE5hdmlnYXRpb25PdmVycmlkZSkpXG5cdGludGVudEJhc2VkTmF2aWdhdGlvbiE6IEludGVudEJhc2VkTmF2aWdhdGlvbjtcblx0QHVzaW5nRXh0ZW5zaW9uKFxuXHRcdEludGVybmFsSW50ZW50QmFzZWROYXZpZ2F0aW9uLm92ZXJyaWRlKHtcblx0XHRcdGdldE5hdmlnYXRpb25Nb2RlOiBmdW5jdGlvbiAodGhpczogSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb24pIHtcblx0XHRcdFx0Y29uc3QgYklzU3RpY2t5RWRpdE1vZGUgPVxuXHRcdFx0XHRcdCh0aGlzLmdldFZpZXcoKS5nZXRDb250cm9sbGVyKCkgYXMgT2JqZWN0UGFnZUNvbnRyb2xsZXIpLmdldFN0aWNreUVkaXRNb2RlICYmXG5cdFx0XHRcdFx0KHRoaXMuZ2V0VmlldygpLmdldENvbnRyb2xsZXIoKSBhcyBPYmplY3RQYWdlQ29udHJvbGxlcikuZ2V0U3RpY2t5RWRpdE1vZGUoKTtcblx0XHRcdFx0cmV0dXJuIGJJc1N0aWNreUVkaXRNb2RlID8gXCJleHBsYWNlXCIgOiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fSlcblx0KVxuXHRfaW50ZW50QmFzZWROYXZpZ2F0aW9uITogSW50ZXJuYWxJbnRlbnRCYXNlZE5hdmlnYXRpb247XG5cdEB1c2luZ0V4dGVuc2lvbihWaWV3U3RhdGUub3ZlcnJpZGUoVmlld1N0YXRlT3ZlcnJpZGVzKSlcblx0dmlld1N0YXRlITogVmlld1N0YXRlO1xuXHRAdXNpbmdFeHRlbnNpb24oXG5cdFx0UGFnZVJlYWR5Lm92ZXJyaWRlKHtcblx0XHRcdGlzQ29udGV4dEV4cGVjdGVkOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pXG5cdClcblx0cGFnZVJlYWR5ITogUGFnZVJlYWR5O1xuXHRAdXNpbmdFeHRlbnNpb24oTWFzc0VkaXQpXG5cdG1hc3NFZGl0ITogTWFzc0VkaXQ7XG5cdHByaXZhdGUgbUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzPzogUmVjb3JkPHN0cmluZywgT2JqZWN0UGFnZUV4dGVuc2lvbkFQST47XG5cdHByb3RlY3RlZCBleHRlbnNpb25BUEk/OiBPYmplY3RQYWdlRXh0ZW5zaW9uQVBJO1xuXHRwcml2YXRlIG9SZXNvdXJjZUJ1bmRsZT86IFJlc291cmNlQnVuZGxlO1xuXHRwcml2YXRlIGJTZWN0aW9uTmF2aWdhdGVkPzogYm9vbGVhbjtcblx0cHJpdmF0ZSBzd2l0Y2hEcmFmdEFuZEFjdGl2ZVBvcE92ZXI/OiBQb3BvdmVyO1xuXHRwcml2YXRlIGN1cnJlbnRCaW5kaW5nPzogQmluZGluZztcblx0cHJpdmF0ZSBtZXNzYWdlQnV0dG9uOiBhbnk7XG5cblx0QHB1YmxpY0V4dGVuc2lvbigpXG5cdEBmaW5hbEV4dGVuc2lvbigpXG5cdGdldEV4dGVuc2lvbkFQSShzSWQ/OiBzdHJpbmcpOiBFeHRlbnNpb25BUEkge1xuXHRcdGlmIChzSWQpIHtcblx0XHRcdC8vIHRvIGFsbG93IGxvY2FsIElEIHVzYWdlIGZvciBjdXN0b20gcGFnZXMgd2UnbGwgY3JlYXRlL3JldHVybiBvd24gaW5zdGFuY2VzIGZvciBjdXN0b20gc2VjdGlvbnNcblx0XHRcdHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzID0gdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXMgfHwge307XG5cblx0XHRcdGlmICghdGhpcy5tQ3VzdG9tU2VjdGlvbkV4dGVuc2lvbkFQSXNbc0lkXSkge1xuXHRcdFx0XHR0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdID0gbmV3IEV4dGVuc2lvbkFQSSh0aGlzLCBzSWQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICghdGhpcy5leHRlbnNpb25BUEkpIHtcblx0XHRcdFx0dGhpcy5leHRlbnNpb25BUEkgPSBuZXcgRXh0ZW5zaW9uQVBJKHRoaXMpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9uQVBJO1xuXHRcdH1cblx0fVxuXG5cdG9uSW5pdCgpIHtcblx0XHRzdXBlci5vbkluaXQoKTtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cblx0XHQvLyBTZXR0aW5nIGRlZmF1bHRzIG9mIGludGVybmFsIG1vZGVsIGNvbnRleHRcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJleHRlcm5hbE5hdmlnYXRpb25Db250ZXh0XCIsIHsgcGFnZTogdHJ1ZSB9KTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwicmVsYXRlZEFwcHNcIiwge1xuXHRcdFx0dmlzaWJpbGl0eTogZmFsc2UsXG5cdFx0XHRpdGVtczogbnVsbFxuXHRcdH0pO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJiYXRjaEdyb3Vwc1wiLCB0aGlzLl9nZXRCYXRjaEdyb3Vwc0ZvclZpZXcoKSk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0Py5zZXRQcm9wZXJ0eShcImVycm9yTmF2aWdhdGlvblNlY3Rpb25GbGFnXCIsIGZhbHNlKTtcblx0XHRpZiAoISh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkudXNlTmV3TGF6eUxvYWRpbmcgJiYgKG9PYmplY3RQYWdlIGFzIGFueSkuZ2V0RW5hYmxlTGF6eUxvYWRpbmcoKSkge1xuXHRcdFx0Ly9BdHRhY2hpbmcgdGhlIGV2ZW50IHRvIG1ha2UgdGhlIHN1YnNlY3Rpb24gY29udGV4dCBiaW5kaW5nIGFjdGl2ZSB3aGVuIGl0IGlzIHZpc2libGUuXG5cdFx0XHRvT2JqZWN0UGFnZS5hdHRhY2hFdmVudChcInN1YlNlY3Rpb25FbnRlcmVkVmlld1BvcnRcIiwgdGhpcy5faGFuZGxlU3ViU2VjdGlvbkVudGVyZWRWaWV3UG9ydC5iaW5kKHRoaXMpKTtcblx0XHR9XG5cdFx0dGhpcy5tZXNzYWdlQnV0dG9uID0gdGhpcy5nZXRWaWV3KCkuYnlJZChcImZlOjpGb290ZXJCYXI6Ok1lc3NhZ2VCdXR0b25cIik7XG5cdFx0dGhpcy5tZXNzYWdlQnV0dG9uLm9JdGVtQmluZGluZy5hdHRhY2hDaGFuZ2UodGhpcy5fZm5TaG93T1BNZXNzYWdlLCB0aGlzKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQ/LnNldFByb3BlcnR5KFwicm9vdEVkaXRFbmFibGVkXCIsIHRydWUpO1xuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dD8uc2V0UHJvcGVydHkoXCJyb290RWRpdFZpc2libGVcIiwgdHJ1ZSk7XG5cdH1cblxuXHRvbkV4aXQoKSB7XG5cdFx0aWYgKHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHNJZCBvZiBPYmplY3Qua2V5cyh0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJcykpIHtcblx0XHRcdFx0aWYgKHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzW3NJZF0pIHtcblx0XHRcdFx0XHR0aGlzLm1DdXN0b21TZWN0aW9uRXh0ZW5zaW9uQVBJc1tzSWRdLmRlc3Ryb3koKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGVsZXRlIHRoaXMubUN1c3RvbVNlY3Rpb25FeHRlbnNpb25BUElzO1xuXHRcdH1cblx0XHRpZiAodGhpcy5leHRlbnNpb25BUEkpIHtcblx0XHRcdHRoaXMuZXh0ZW5zaW9uQVBJLmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0ZGVsZXRlIHRoaXMuZXh0ZW5zaW9uQVBJO1xuXG5cdFx0Y29uc3Qgb01lc3NhZ2VQb3BvdmVyID0gdGhpcy5tZXNzYWdlQnV0dG9uID8gdGhpcy5tZXNzYWdlQnV0dG9uLm9NZXNzYWdlUG9wb3ZlciA6IG51bGw7XG5cdFx0aWYgKG9NZXNzYWdlUG9wb3ZlciAmJiBvTWVzc2FnZVBvcG92ZXIuaXNPcGVuKCkpIHtcblx0XHRcdG9NZXNzYWdlUG9wb3Zlci5jbG9zZSgpO1xuXHRcdH1cblx0XHQvL3doZW4gZXhpdGluZyB3ZSBzZXQga2VlcEFsaXZlIGNvbnRleHQgdG8gZmFsc2Vcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dDtcblx0XHRpZiAob0NvbnRleHQgJiYgb0NvbnRleHQuaXNLZWVwQWxpdmUoKSkge1xuXHRcdFx0b0NvbnRleHQuc2V0S2VlcEFsaXZlKGZhbHNlKTtcblx0XHR9XG5cdFx0aWYgKGlzQ29ubmVjdGVkKHRoaXMuZ2V0VmlldygpKSkge1xuXHRcdFx0ZGlzY29ubmVjdCh0aGlzLmdldFZpZXcoKSk7IC8vIENsZWFudXAgY29sbGFib3JhdGlvbiBjb25uZWN0aW9uIHdoZW4gbGVhdmluZyB0aGUgYXBwXG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCB0byBzaG93IHRoZSBtZXNzYWdlIHN0cmlwIG9uIHRoZSBvYmplY3QgcGFnZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9mblNob3dPUE1lc3NhZ2UoKSB7XG5cdFx0Y29uc3QgZXh0ZW5zaW9uQVBJID0gdGhpcy5nZXRFeHRlbnNpb25BUEkoKTtcblx0XHRjb25zdCB2aWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3QgbWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VCdXR0b24ub01lc3NhZ2VQb3BvdmVyXG5cdFx0XHQuZ2V0SXRlbXMoKVxuXHRcdFx0Lm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLmdldEJpbmRpbmdDb250ZXh0KFwibWVzc2FnZVwiKS5nZXRPYmplY3QoKSlcblx0XHRcdC5maWx0ZXIoKG1lc3NhZ2U6IE1lc3NhZ2UpID0+IHtcblx0XHRcdFx0cmV0dXJuIG1lc3NhZ2UuZ2V0VGFyZ2V0cygpWzBdID09PSB2aWV3LmdldEJpbmRpbmdDb250ZXh0KCk/LmdldFBhdGgoKTtcblx0XHRcdH0pO1xuXG5cdFx0aWYgKGV4dGVuc2lvbkFQSSkge1xuXHRcdFx0ZXh0ZW5zaW9uQVBJLnNob3dNZXNzYWdlcyhtZXNzYWdlcyk7XG5cdFx0fVxuXHR9XG5cblx0X2dldFRhYmxlQmluZGluZyhvVGFibGU6IGFueSkge1xuXHRcdHJldHVybiBvVGFibGUgJiYgb1RhYmxlLmdldFJvd0JpbmRpbmcoKTtcblx0fVxuXG5cdG9uQmVmb3JlUmVuZGVyaW5nKCkge1xuXHRcdFBhZ2VDb250cm9sbGVyLnByb3RvdHlwZS5vbkJlZm9yZVJlbmRlcmluZy5hcHBseSh0aGlzKTtcblx0XHQvLyBJbiB0aGUgcmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCBzY2VuYXJpbyB3ZSBuZWVkIHRvIGVuc3VyZSBpbiBjYXNlIG9mIHJlbG9hZC9yZWZyZXNoIHRoYXQgdGhlIG1ldGEgbW9kZWwgaW4gdGhlIG1ldGhvZGUgcmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCBvZiB0aGUgRmllbGRSdW50aW1lIGlzIGF2YWlsYWJsZVxuXHRcdGlmICh0aGlzLm9WaWV3Lm9WaWV3RGF0YT8ucmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCAmJiBDb21tb25IZWxwZXIuZ2V0TWV0YU1vZGVsKCkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Q29tbW9uSGVscGVyLnNldE1ldGFNb2RlbCh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldE1ldGFNb2RlbCgpKTtcblx0XHR9XG5cdH1cblxuXHRvbkFmdGVyUmVuZGVyaW5nKCkge1xuXHRcdCgodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJzYXAuZmUuaTE4blwiKSBhcyBSZXNvdXJjZU1vZGVsKS5nZXRSZXNvdXJjZUJ1bmRsZSgpIGFzIFByb21pc2U8UmVzb3VyY2VCdW5kbGU+KVxuXHRcdFx0LnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcblx0XHRcdFx0dGhpcy5vUmVzb3VyY2VCdW5kbGUgPSByZXNwb25zZTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIHJlc291cmNlIGJ1bmRsZVwiLCBvRXJyb3IpO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRfb25CZWZvcmVCaW5kaW5nKG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHQvLyBUT0RPOiB3ZSBzaG91bGQgY2hlY2sgaG93IHRoaXMgY29tZXMgdG9nZXRoZXIgd2l0aCB0aGUgdHJhbnNhY3Rpb24gaGVscGVyLCBzYW1lIHRvIHRoZSBjaGFuZ2UgaW4gdGhlIGFmdGVyQmluZGluZ1xuXHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9maW5kVGFibGVzKCksXG5cdFx0XHRvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCksXG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0LFxuXHRcdFx0b0ludGVybmFsTW9kZWwgPSB0aGlzLmdldFZpZXcoKS5nZXRNb2RlbChcImludGVybmFsXCIpIGFzIEpTT05Nb2RlbCxcblx0XHRcdGFCYXRjaEdyb3VwcyA9IG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImJhdGNoR3JvdXBzXCIpLFxuXHRcdFx0aVZpZXdMZXZlbCA9ICh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkudmlld0xldmVsO1xuXHRcdGxldCBvRmFzdENyZWF0aW9uUm93O1xuXHRcdGFCYXRjaEdyb3Vwcy5wdXNoKFwiJGF1dG9cIik7XG5cdFx0aWYgKG1QYXJhbWV0ZXJzLmJEcmFmdE5hdmlnYXRpb24gIT09IHRydWUpIHtcblx0XHRcdHRoaXMuX2Nsb3NlU2lkZUNvbnRlbnQoKTtcblx0XHR9XG5cdFx0Y29uc3Qgb3BDb250ZXh0ID0gb09iamVjdFBhZ2UuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0O1xuXHRcdGlmIChcblx0XHRcdG9wQ29udGV4dCAmJlxuXHRcdFx0b3BDb250ZXh0Lmhhc1BlbmRpbmdDaGFuZ2VzKCkgJiZcblx0XHRcdCFhQmF0Y2hHcm91cHMuc29tZShvcENvbnRleHQuZ2V0TW9kZWwoKS5oYXNQZW5kaW5nQ2hhbmdlcy5iaW5kKG9wQ29udGV4dC5nZXRNb2RlbCgpKSlcblx0XHQpIHtcblx0XHRcdC8qIFx0SW4gY2FzZSB0aGVyZSBhcmUgcGVuZGluZyBjaGFuZ2VzIGZvciB0aGUgY3JlYXRpb24gcm93IGFuZCBubyBvdGhlcnMgd2UgbmVlZCB0byByZXNldCB0aGUgY2hhbmdlc1xuICAgIFx0XHRcdFx0XHRcdFRPRE86IHRoaXMgaXMganVzdCBhIHF1aWNrIHNvbHV0aW9uLCB0aGlzIG5lZWRzIHRvIGJlIHJld29ya2VkXG4gICAgXHRcdFx0XHQgXHQqL1xuXG5cdFx0XHRvcENvbnRleHQuZ2V0QmluZGluZygpLnJlc2V0Q2hhbmdlcygpO1xuXHRcdH1cblxuXHRcdC8vIEZvciBub3cgd2UgaGF2ZSB0byBzZXQgdGhlIGJpbmRpbmcgY29udGV4dCB0byBudWxsIGZvciBldmVyeSBmYXN0IGNyZWF0aW9uIHJvd1xuXHRcdC8vIFRPRE86IEdldCByaWQgb2YgdGhpcyBjb2Rpbmcgb3IgbW92ZSBpdCB0byBhbm90aGVyIGxheWVyIC0gdG8gYmUgZGlzY3Vzc2VkIHdpdGggTURDIGFuZCBtb2RlbFxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYVRhYmxlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0b0Zhc3RDcmVhdGlvblJvdyA9IGFUYWJsZXNbaV0uZ2V0Q3JlYXRpb25Sb3coKTtcblx0XHRcdGlmIChvRmFzdENyZWF0aW9uUm93KSB7XG5cdFx0XHRcdG9GYXN0Q3JlYXRpb25Sb3cuc2V0QmluZGluZ0NvbnRleHQobnVsbCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2Nyb2xsIHRvIHByZXNlbnQgU2VjdGlvbiBzbyB0aGF0IGJpbmRpbmdzIGFyZSBlbmFibGVkIGR1cmluZyBuYXZpZ2F0aW9uIHRocm91Z2ggcGFnaW5hdG9yIGJ1dHRvbnMsIGFzIHRoZXJlIGlzIG5vIHZpZXcgcmVyZW5kZXJpbmcvcmViaW5kXG5cdFx0Y29uc3QgZm5TY3JvbGxUb1ByZXNlbnRTZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKCEob09iamVjdFBhZ2UgYXMgYW55KS5pc0ZpcnN0UmVuZGVyaW5nKCkgJiYgIW1QYXJhbWV0ZXJzLmJQZXJzaXN0T1BTY3JvbGwpIHtcblx0XHRcdFx0b09iamVjdFBhZ2Uuc2V0U2VsZWN0ZWRTZWN0aW9uKG51bGwgYXMgYW55KTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdG9PYmplY3RQYWdlLmF0dGFjaEV2ZW50T25jZShcIm1vZGVsQ29udGV4dENoYW5nZVwiLCBmblNjcm9sbFRvUHJlc2VudFNlY3Rpb24pO1xuXG5cdFx0Ly8gaWYgdGhlIHN0cnVjdHVyZSBvZiB0aGUgT2JqZWN0UGFnZUxheW91dCBpcyBjaGFuZ2VkIHRoZW4gc2Nyb2xsIHRvIHByZXNlbnQgU2VjdGlvblxuXHRcdC8vIEZJWE1FIElzIHRoaXMgcmVhbGx5IHdvcmtpbmcgYXMgaW50ZW5kZWQgPyBJbml0aWFsbHkgdGhpcyB3YXMgb25CZWZvcmVSZW5kZXJpbmcsIGJ1dCBuZXZlciB0cmlnZ2VyZWQgb25CZWZvcmVSZW5kZXJpbmcgYmVjYXVzZSBpdCB3YXMgcmVnaXN0ZXJlZCBhZnRlciBpdFxuXHRcdGNvbnN0IG9EZWxlZ2F0ZU9uQmVmb3JlID0ge1xuXHRcdFx0b25BZnRlclJlbmRlcmluZzogZm5TY3JvbGxUb1ByZXNlbnRTZWN0aW9uXG5cdFx0fTtcblx0XHRvT2JqZWN0UGFnZS5hZGRFdmVudERlbGVnYXRlKG9EZWxlZ2F0ZU9uQmVmb3JlLCB0aGlzKTtcblx0XHR0aGlzLnBhZ2VSZWFkeS5hdHRhY2hFdmVudE9uY2UoXCJwYWdlUmVhZHlcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0b09iamVjdFBhZ2UucmVtb3ZlRXZlbnREZWxlZ2F0ZShvRGVsZWdhdGVPbkJlZm9yZSk7XG5cdFx0fSk7XG5cblx0XHQvL1NldCB0aGUgQmluZGluZyBmb3IgUGFnaW5hdG9ycyB1c2luZyBMaXN0QmluZGluZyBJRFxuXHRcdGlmIChpVmlld0xldmVsID4gMSkge1xuXHRcdFx0bGV0IG9CaW5kaW5nID0gbVBhcmFtZXRlcnMgJiYgbVBhcmFtZXRlcnMubGlzdEJpbmRpbmc7XG5cdFx0XHRjb25zdCBvUGFnaW5hdG9yQ3VycmVudENvbnRleHQgPSBvSW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9wYWdpbmF0b3JDdXJyZW50Q29udGV4dFwiKTtcblx0XHRcdGlmIChvUGFnaW5hdG9yQ3VycmVudENvbnRleHQpIHtcblx0XHRcdFx0Y29uc3Qgb0JpbmRpbmdUb1VzZSA9IG9QYWdpbmF0b3JDdXJyZW50Q29udGV4dC5nZXRCaW5kaW5nKCk7XG5cdFx0XHRcdHRoaXMucGFnaW5hdG9yLmluaXRpYWxpemUob0JpbmRpbmdUb1VzZSwgb1BhZ2luYXRvckN1cnJlbnRDb250ZXh0KTtcblx0XHRcdFx0b0ludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvcGFnaW5hdG9yQ3VycmVudENvbnRleHRcIiwgbnVsbCk7XG5cdFx0XHR9IGVsc2UgaWYgKG9CaW5kaW5nKSB7XG5cdFx0XHRcdGlmIChvQmluZGluZy5pc0EoXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiKSkge1xuXHRcdFx0XHRcdHRoaXMucGFnaW5hdG9yLmluaXRpYWxpemUob0JpbmRpbmcsIG9Db250ZXh0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBpZiB0aGUgYmluZGluZyB0eXBlIGlzIG5vdCBPRGF0YUxpc3RCaW5kaW5nIGJlY2F1c2Ugb2YgYSBkZWVwbGluayBuYXZpZ2F0aW9uIG9yIGEgcmVmcmVzaCBvZiB0aGUgcGFnZVxuXHRcdFx0XHRcdC8vIHdlIG5lZWQgdG8gY3JlYXRlIGl0XG5cdFx0XHRcdFx0Y29uc3Qgc0JpbmRpbmdQYXRoID0gb0JpbmRpbmcuZ2V0UGF0aCgpO1xuXHRcdFx0XHRcdGlmICgvXFwoW15cXCldKlxcKSQvLnRlc3Qoc0JpbmRpbmdQYXRoKSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIGN1cnJlbnQgYmluZGluZyBwYXRoIGVuZHMgd2l0aCAoeHh4KSwgc28gd2UgY3JlYXRlIHRoZSBsaXN0QmluZGluZyBieSByZW1vdmluZyAoeHh4KVxuXHRcdFx0XHRcdFx0Y29uc3Qgc0xpc3RCaW5kaW5nUGF0aCA9IHNCaW5kaW5nUGF0aC5yZXBsYWNlKC9cXChbXlxcKV0qXFwpJC8sIFwiXCIpO1xuXHRcdFx0XHRcdFx0b0JpbmRpbmcgPSBuZXcgKE9EYXRhTGlzdEJpbmRpbmcgYXMgYW55KShvQmluZGluZy5vTW9kZWwsIHNMaXN0QmluZGluZ1BhdGgpO1xuXHRcdFx0XHRcdFx0Y29uc3QgX3NldExpc3RCaW5kaW5nQXN5bmMgPSAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChvQmluZGluZy5nZXRDb250ZXh0cygpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnBhZ2luYXRvci5pbml0aWFsaXplKG9CaW5kaW5nLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0b0JpbmRpbmcuZGV0YWNoRXZlbnQoXCJjaGFuZ2VcIiwgX3NldExpc3RCaW5kaW5nQXN5bmMpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRvQmluZGluZy5nZXRDb250ZXh0cygwKTtcblx0XHRcdFx0XHRcdG9CaW5kaW5nLmF0dGFjaEV2ZW50KFwiY2hhbmdlXCIsIF9zZXRMaXN0QmluZGluZ0FzeW5jKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Ly8gVGhlIGN1cnJlbnQgYmluZGluZyBkb2Vzbid0IGVuZCB3aXRoICh4eHgpIC0tPiB0aGUgbGFzdCBzZWdtZW50IGlzIGEgMS0xIG5hdmlnYXRpb24sIHNvIHdlIGRvbid0IGRpc3BsYXkgdGhlIHBhZ2luYXRvclxuXHRcdFx0XHRcdFx0dGhpcy5wYWdpbmF0b3IuaW5pdGlhbGl6ZSh1bmRlZmluZWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoISh0aGlzLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkudXNlTmV3TGF6eUxvYWRpbmcgJiYgb09iamVjdFBhZ2UuZ2V0RW5hYmxlTGF6eUxvYWRpbmcoKSkge1xuXHRcdFx0Y29uc3QgYVNlY3Rpb25zID0gb09iamVjdFBhZ2UuZ2V0U2VjdGlvbnMoKTtcblx0XHRcdGNvbnN0IGJVc2VJY29uVGFiQmFyID0gb09iamVjdFBhZ2UuZ2V0VXNlSWNvblRhYkJhcigpO1xuXHRcdFx0bGV0IGlTa2lwID0gMjtcblx0XHRcdGNvbnN0IGJJc0luRWRpdE1vZGUgPSBvT2JqZWN0UGFnZS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIik7XG5cdFx0XHRjb25zdCBiRWRpdGFibGVIZWFkZXIgPSAodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLmVkaXRhYmxlSGVhZGVyQ29udGVudDtcblx0XHRcdGZvciAobGV0IGlTZWN0aW9uID0gMDsgaVNlY3Rpb24gPCBhU2VjdGlvbnMubGVuZ3RoOyBpU2VjdGlvbisrKSB7XG5cdFx0XHRcdGNvbnN0IG9TZWN0aW9uID0gYVNlY3Rpb25zW2lTZWN0aW9uXTtcblx0XHRcdFx0Y29uc3QgYVN1YlNlY3Rpb25zID0gb1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKTtcblx0XHRcdFx0Zm9yIChsZXQgaVN1YlNlY3Rpb24gPSAwOyBpU3ViU2VjdGlvbiA8IGFTdWJTZWN0aW9ucy5sZW5ndGg7IGlTdWJTZWN0aW9uKyssIGlTa2lwLS0pIHtcblx0XHRcdFx0XHQvLyBJbiBJY29uVGFiQmFyIG1vZGUga2VlcCB0aGUgc2Vjb25kIHNlY3Rpb24gYm91bmQgaWYgdGhlcmUgaXMgYW4gZWRpdGFibGUgaGVhZGVyIGFuZCB3ZSBhcmUgc3dpdGNoaW5nIHRvIGRpc3BsYXkgbW9kZVxuXHRcdFx0XHRcdGlmIChpU2tpcCA8IDEgfHwgKGJVc2VJY29uVGFiQmFyICYmIChpU2VjdGlvbiA+IDEgfHwgKGlTZWN0aW9uID09PSAxICYmICFiRWRpdGFibGVIZWFkZXIgJiYgIWJJc0luRWRpdE1vZGUpKSkpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9TdWJTZWN0aW9uID0gYVN1YlNlY3Rpb25zW2lTdWJTZWN0aW9uXTtcblx0XHRcdFx0XHRcdGlmIChvU3ViU2VjdGlvbi5kYXRhKCkuaXNWaXNpYmlsaXR5RHluYW1pYyAhPT0gXCJ0cnVlXCIpIHtcblx0XHRcdFx0XHRcdFx0b1N1YlNlY3Rpb24uc2V0QmluZGluZ0NvbnRleHQobnVsbCBhcyBhbnkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLnBsYWNlaG9sZGVyLmlzUGxhY2Vob2xkZXJFbmFibGVkKCkgJiYgbVBhcmFtZXRlcnMuc2hvd1BsYWNlaG9sZGVyKSB7XG5cdFx0XHRjb25zdCBvVmlldyA9IHRoaXMuZ2V0VmlldygpO1xuXHRcdFx0Y29uc3Qgb05hdkNvbnRhaW5lciA9IChvVmlldy5nZXRQYXJlbnQoKSBhcyBhbnkpLm9Db250YWluZXIuZ2V0UGFyZW50KCk7XG5cdFx0XHRpZiAob05hdkNvbnRhaW5lcikge1xuXHRcdFx0XHRvTmF2Q29udGFpbmVyLnNob3dQbGFjZWhvbGRlcih7fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2dldEZpcnN0Q2xpY2thYmxlRWxlbWVudChvT2JqZWN0UGFnZTogYW55KSB7XG5cdFx0bGV0IG9GaXJzdENsaWNrYWJsZUVsZW1lbnQ7XG5cdFx0Y29uc3QgYUFjdGlvbnMgPSBvT2JqZWN0UGFnZS5nZXRIZWFkZXJUaXRsZSgpICYmIG9PYmplY3RQYWdlLmdldEhlYWRlclRpdGxlKCkuZ2V0QWN0aW9ucygpO1xuXHRcdGlmIChhQWN0aW9ucyAmJiBhQWN0aW9ucy5sZW5ndGgpIHtcblx0XHRcdG9GaXJzdENsaWNrYWJsZUVsZW1lbnQgPSBhQWN0aW9ucy5maW5kKGZ1bmN0aW9uIChvQWN0aW9uOiBhbnkpIHtcblx0XHRcdFx0Ly8gRHVlIHRvIHRoZSBsZWZ0IGFsaWdubWVudCBvZiB0aGUgRHJhZnQgc3dpdGNoIGFuZCB0aGUgY29sbGFib3JhdGl2ZSBkcmFmdCBhdmF0YXIgY29udHJvbHNcblx0XHRcdFx0Ly8gdGhlcmUgaXMgYSBUb29sYmFyU3BhY2VyIGluIHRoZSBhY3Rpb25zIGFnZ3JlZ2F0aW9uIHdoaWNoIHdlIG5lZWQgdG8gZXhjbHVkZSBoZXJlIVxuXHRcdFx0XHQvLyBEdWUgdG8gdGhlIEFDQyByZXBvcnQsIHdlIGFsc28gbmVlZCBub3QgdG8gY2hlY2sgZm9yIHRoZSBJbnZpc2libGVUZXh0IGVsZW1lbnRzXG5cdFx0XHRcdGlmIChvQWN0aW9uLmlzQShcInNhcC5mZS5tYWNyb3MuU2hhcmVBUElcIikpIHtcblx0XHRcdFx0XHQvLyBzaW5jZSBTaGFyZUFQSSBkb2VzIG5vdCBoYXZlIGEgZGlzYWJsZSBwcm9wZXJ0eVxuXHRcdFx0XHRcdC8vIGhlbmNlIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgZGlzYmFsZWQgb3Igbm90XG5cdFx0XHRcdFx0cmV0dXJuIG9BY3Rpb24uZ2V0VmlzaWJsZSgpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCFvQWN0aW9uLmlzQShcInNhcC51aS5jb3JlLkludmlzaWJsZVRleHRcIikgJiYgIW9BY3Rpb24uaXNBKFwic2FwLm0uVG9vbGJhclNwYWNlclwiKSkge1xuXHRcdFx0XHRcdHJldHVybiBvQWN0aW9uLmdldFZpc2libGUoKSAmJiBvQWN0aW9uLmdldEVuYWJsZWQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBvRmlyc3RDbGlja2FibGVFbGVtZW50O1xuXHR9XG5cblx0X2dldEZpcnN0RW1wdHlNYW5kYXRvcnlGaWVsZEZyb21TdWJTZWN0aW9uKGFTdWJTZWN0aW9uczogYW55KSB7XG5cdFx0aWYgKGFTdWJTZWN0aW9ucykge1xuXHRcdFx0Zm9yIChsZXQgc3ViU2VjdGlvbiA9IDA7IHN1YlNlY3Rpb24gPCBhU3ViU2VjdGlvbnMubGVuZ3RoOyBzdWJTZWN0aW9uKyspIHtcblx0XHRcdFx0Y29uc3QgYUJsb2NrcyA9IGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXS5nZXRCbG9ja3MoKTtcblxuXHRcdFx0XHRpZiAoYUJsb2Nrcykge1xuXHRcdFx0XHRcdGZvciAobGV0IGJsb2NrID0gMDsgYmxvY2sgPCBhQmxvY2tzLmxlbmd0aDsgYmxvY2srKykge1xuXHRcdFx0XHRcdFx0bGV0IGFGb3JtQ29udGFpbmVycztcblxuXHRcdFx0XHRcdFx0aWYgKGFCbG9ja3NbYmxvY2tdLmlzQShcInNhcC51aS5sYXlvdXQuZm9ybS5Gb3JtXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGFGb3JtQ29udGFpbmVycyA9IGFCbG9ja3NbYmxvY2tdLmdldEZvcm1Db250YWluZXJzKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRcdFx0XHRhQmxvY2tzW2Jsb2NrXS5nZXRDb250ZW50ICYmXG5cdFx0XHRcdFx0XHRcdGFCbG9ja3NbYmxvY2tdLmdldENvbnRlbnQoKSAmJlxuXHRcdFx0XHRcdFx0XHRhQmxvY2tzW2Jsb2NrXS5nZXRDb250ZW50KCkuaXNBKFwic2FwLnVpLmxheW91dC5mb3JtLkZvcm1cIilcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRhRm9ybUNvbnRhaW5lcnMgPSBhQmxvY2tzW2Jsb2NrXS5nZXRDb250ZW50KCkuZ2V0Rm9ybUNvbnRhaW5lcnMoKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGFGb3JtQ29udGFpbmVycykge1xuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBmb3JtQ29udGFpbmVyID0gMDsgZm9ybUNvbnRhaW5lciA8IGFGb3JtQ29udGFpbmVycy5sZW5ndGg7IGZvcm1Db250YWluZXIrKykge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGFGb3JtRWxlbWVudHMgPSBhRm9ybUNvbnRhaW5lcnNbZm9ybUNvbnRhaW5lcl0uZ2V0Rm9ybUVsZW1lbnRzKCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGFGb3JtRWxlbWVudHMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGZvcm1FbGVtZW50ID0gMDsgZm9ybUVsZW1lbnQgPCBhRm9ybUVsZW1lbnRzLmxlbmd0aDsgZm9ybUVsZW1lbnQrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zdCBhRmllbGRzID0gYUZvcm1FbGVtZW50c1tmb3JtRWxlbWVudF0uZ2V0RmllbGRzKCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gVGhlIGZpcnN0IGZpZWxkIGlzIG5vdCBuZWNlc3NhcmlseSBhbiBJbnB1dEJhc2UgKGUuZy4gY291bGQgYmUgYSBUZXh0KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTbyB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgaXQgaGFzIGEgZ2V0UmVxdWlyZWQgbWV0aG9kXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFGaWVsZHNbMF0uZ2V0UmVxdWlyZWQgJiYgYUZpZWxkc1swXS5nZXRSZXF1aXJlZCgpICYmICFhRmllbGRzWzBdLmdldFZhbHVlKCkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBhRmllbGRzWzBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRMb2cuZGVidWcoYEVycm9yIHdoZW4gc2VhcmNoaW5nIGZvciBtYW5kYW90cnkgZW1wdHkgZmllbGQ6ICR7ZXJyb3J9YCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdF91cGRhdGVGb2N1c0luRWRpdE1vZGUoYVN1YlNlY3Rpb25zOiBhbnkpIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cblx0XHRjb25zdCBvTWFuZGF0b3J5RmllbGQgPSB0aGlzLl9nZXRGaXJzdEVtcHR5TWFuZGF0b3J5RmllbGRGcm9tU3ViU2VjdGlvbihhU3ViU2VjdGlvbnMpO1xuXHRcdGxldCBvRmllbGRUb0ZvY3VzOiBhbnk7XG5cdFx0aWYgKG9NYW5kYXRvcnlGaWVsZCkge1xuXHRcdFx0b0ZpZWxkVG9Gb2N1cyA9IG9NYW5kYXRvcnlGaWVsZC5jb250ZW50LmdldENvbnRlbnRFZGl0KClbMF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG9GaWVsZFRvRm9jdXMgPSAob09iamVjdFBhZ2UgYXMgYW55KS5fZ2V0Rmlyc3RFZGl0YWJsZUlucHV0KCkgfHwgdGhpcy5fZ2V0Rmlyc3RDbGlja2FibGVFbGVtZW50KG9PYmplY3RQYWdlKTtcblx0XHR9XG5cblx0XHRpZiAob0ZpZWxkVG9Gb2N1cykge1xuXHRcdFx0c2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdC8vIFdlIHNldCB0aGUgZm9jdXMgaW4gYSB0aW1lZW91dCwgb3RoZXJ3aXNlIHRoZSBmb2N1cyBzb21ldGltZXMgZ29lcyB0byB0aGUgVGFiQmFyXG5cdFx0XHRcdG9GaWVsZFRvRm9jdXMuZm9jdXMoKTtcblx0XHRcdH0sIDApO1xuXHRcdH1cblx0fVxuXG5cdF9oYW5kbGVTdWJTZWN0aW9uRW50ZXJlZFZpZXdQb3J0KG9FdmVudDogYW55KSB7XG5cdFx0Y29uc3Qgb1N1YlNlY3Rpb24gPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwic3ViU2VjdGlvblwiKTtcblx0XHRvU3ViU2VjdGlvbi5zZXRCaW5kaW5nQ29udGV4dCh1bmRlZmluZWQpO1xuXHR9XG5cblx0X29uQmFja05hdmlnYXRpb25JbkRyYWZ0KG9Db250ZXh0OiBhbnkpIHtcblx0XHR0aGlzLm1lc3NhZ2VIYW5kbGVyLnJlbW92ZVRyYW5zaXRpb25NZXNzYWdlcygpO1xuXHRcdGlmICh0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRlclByb3h5KCkuY2hlY2tJZkJhY2tIYXNTYW1lQ29udGV4dCgpKSB7XG5cdFx0XHQvLyBCYWNrIG5hdiB3aWxsIGtlZXAgdGhlIHNhbWUgY29udGV4dCAtLT4gbm8gbmVlZCB0byBkaXNwbGF5IHRoZSBkaWFsb2dcblx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkcmFmdC5wcm9jZXNzRGF0YUxvc3NPckRyYWZ0RGlzY2FyZENvbmZpcm1hdGlvbihcblx0XHRcdFx0ZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGhpc3RvcnkuYmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRGdW5jdGlvbi5wcm90b3R5cGUsXG5cdFx0XHRcdG9Db250ZXh0LFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0ZHJhZnQuTmF2aWdhdGlvblR5cGUuQmFja05hdmlnYXRpb25cblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRfb25BZnRlckJpbmRpbmcob0JpbmRpbmdDb250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0Y29uc3QgYVRhYmxlcyA9IHRoaXMuX2ZpbmRUYWJsZXMoKTtcblxuXHRcdHRoaXMuX3NpZGVFZmZlY3RzLmNsZWFyUHJvcGVydGllc1N0YXR1cygpO1xuXG5cdFx0Ly8gVE9ETzogdGhpcyBpcyBvbmx5IGEgdGVtcCBzb2x1dGlvbiBhcyBsb25nIGFzIHRoZSBtb2RlbCBmaXggdGhlIGNhY2hlIGlzc3VlIGFuZCB3ZSB1c2UgdGhpcyBhZGRpdGlvbmFsXG5cdFx0Ly8gYmluZGluZyB3aXRoIG93blJlcXVlc3Rcblx0XHRvQmluZGluZ0NvbnRleHQgPSBvT2JqZWN0UGFnZS5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXG5cdFx0bGV0IGFJQk5BY3Rpb25zOiBhbnlbXSA9IFtdO1xuXHRcdG9PYmplY3RQYWdlLmdldFNlY3Rpb25zKCkuZm9yRWFjaChmdW5jdGlvbiAob1NlY3Rpb246IGFueSkge1xuXHRcdFx0b1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKS5mb3JFYWNoKGZ1bmN0aW9uIChvU3ViU2VjdGlvbjogYW55KSB7XG5cdFx0XHRcdGFJQk5BY3Rpb25zID0gQ29tbW9uVXRpbHMuZ2V0SUJOQWN0aW9ucyhvU3ViU2VjdGlvbiwgYUlCTkFjdGlvbnMpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHQvLyBBc3NpZ24gaW50ZXJuYWwgYmluZGluZyBjb250ZXh0cyB0byBvRm9ybUNvbnRhaW5lcjpcblx0XHQvLyAxLiBJdCBpcyBub3QgcG9zc2libGUgdG8gYXNzaWduIHRoZSBpbnRlcm5hbCBiaW5kaW5nIGNvbnRleHQgdG8gdGhlIFhNTCBmcmFnbWVudFxuXHRcdC8vIChGb3JtQ29udGFpbmVyLmZyYWdtZW50LnhtbCkgeWV0IC0gaXQgaXMgdXNlZCBhbHJlYWR5IGZvciB0aGUgZGF0YS1zdHJ1Y3R1cmUuXG5cdFx0Ly8gMi4gQW5vdGhlciBwcm9ibGVtIGlzLCB0aGF0IEZvcm1Db250YWluZXJzIGFzc2lnbmVkIHRvIGEgJ01vcmVCbG9jaycgZG9lcyBub3QgaGF2ZSBhblxuXHRcdC8vIGludGVybmFsIG1vZGVsIGNvbnRleHQgYXQgYWxsLlxuXG5cdFx0YVRhYmxlcy5mb3JFYWNoKGZ1bmN0aW9uIChvVGFibGU6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1RhYmxlLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIik7XG5cdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJjcmVhdGlvblJvd0ZpZWxkVmFsaWRpdHlcIiwge30pO1xuXHRcdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiY3JlYXRpb25Sb3dDdXN0b21WYWxpZGl0eVwiLCB7fSk7XG5cblx0XHRcdGFJQk5BY3Rpb25zID0gQ29tbW9uVXRpbHMuZ2V0SUJOQWN0aW9ucyhvVGFibGUsIGFJQk5BY3Rpb25zKTtcblx0XHRcdC8vIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBCQ1A6IDIwODAyMTgwMDRcblx0XHRcdC8vIE5lZWQgdG8gZml4IHdpdGggQkxJOiBGSU9SSVRFQ0hQMS0xNTI3NFxuXHRcdFx0Ly8gb25seSBmb3IgZWRpdCBtb2RlLCB3ZSBjbGVhciB0aGUgdGFibGUgY2FjaGVcblx0XHRcdC8vIFdvcmthcm91bmQgc3RhcnRzIGhlcmUhIVxuXHRcdFx0Y29uc3Qgb1RhYmxlUm93QmluZGluZyA9IG9UYWJsZS5nZXRSb3dCaW5kaW5nKCk7XG5cdFx0XHRpZiAob1RhYmxlUm93QmluZGluZykge1xuXHRcdFx0XHRpZiAoTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG9UYWJsZVJvd0JpbmRpbmcuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSkpIHtcblx0XHRcdFx0XHQvLyBhcHBseSBmb3IgYm90aCBlZGl0IGFuZCBkaXNwbGF5IG1vZGUgaW4gc3RpY2t5XG5cdFx0XHRcdFx0b1RhYmxlUm93QmluZGluZy5yZW1vdmVDYWNoZXNBbmRNZXNzYWdlcyhcIlwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0Ly8gV29ya2Fyb3VuZCBlbmRzIGhlcmUhIVxuXG5cdFx0XHQvLyBVcGRhdGUgJ2VuYWJsZWQnIHByb3BlcnR5IG9mIERhdGFGaWVsZEZvckFjdGlvbiBidXR0b25zIG9uIHRhYmxlIHRvb2xiYXJcblx0XHRcdC8vIFRoZSBzYW1lIGlzIGFsc28gcGVyZm9ybWVkIG9uIFRhYmxlIHNlbGVjdGlvbkNoYW5nZSBldmVudFxuXHRcdFx0Y29uc3Qgb0FjdGlvbk9wZXJhdGlvbkF2YWlsYWJsZU1hcCA9IEpTT04ucGFyc2UoXG5cdFx0XHRcdFx0Q29tbW9uSGVscGVyLnBhcnNlQ3VzdG9tRGF0YShEZWxlZ2F0ZVV0aWwuZ2V0Q3VzdG9tRGF0YShvVGFibGUsIFwib3BlcmF0aW9uQXZhaWxhYmxlTWFwXCIpKVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRhU2VsZWN0ZWRDb250ZXh0cyA9IG9UYWJsZS5nZXRTZWxlY3RlZENvbnRleHRzKCk7XG5cblx0XHRcdEFjdGlvblJ1bnRpbWUuc2V0QWN0aW9uRW5hYmxlbWVudChvSW50ZXJuYWxNb2RlbENvbnRleHQsIG9BY3Rpb25PcGVyYXRpb25BdmFpbGFibGVNYXAsIGFTZWxlY3RlZENvbnRleHRzLCBcInRhYmxlXCIpO1xuXHRcdFx0Ly8gQ2xlYXIgdGhlIHNlbGVjdGlvbiBpbiB0aGUgdGFibGUsIG5lZWQgdG8gYmUgZml4ZWQgYW5kIHJldmlldyB3aXRoIEJMSTogRklPUklURUNIUDEtMjQzMThcblx0XHRcdG9UYWJsZS5jbGVhclNlbGVjdGlvbigpO1xuXHRcdH0pO1xuXHRcdENvbW1vblV0aWxzLmdldFNlbWFudGljVGFyZ2V0c0Zyb21QYWdlTW9kZWwodGhpcywgXCJfcGFnZU1vZGVsXCIpO1xuXHRcdC8vUmV0cmlldmUgT2JqZWN0IFBhZ2UgaGVhZGVyIGFjdGlvbnMgZnJvbSBPYmplY3QgUGFnZSB0aXRsZSBjb250cm9sXG5cdFx0Y29uc3Qgb09iamVjdFBhZ2VUaXRsZSA9IG9PYmplY3RQYWdlLmdldEhlYWRlclRpdGxlKCkgYXMgT2JqZWN0UGFnZUR5bmFtaWNIZWFkZXJUaXRsZTtcblx0XHRsZXQgYUlCTkhlYWRlckFjdGlvbnM6IGFueVtdID0gW107XG5cdFx0YUlCTkhlYWRlckFjdGlvbnMgPSBDb21tb25VdGlscy5nZXRJQk5BY3Rpb25zKG9PYmplY3RQYWdlVGl0bGUsIGFJQk5IZWFkZXJBY3Rpb25zKTtcblx0XHRhSUJOQWN0aW9ucyA9IGFJQk5BY3Rpb25zLmNvbmNhdChhSUJOSGVhZGVyQWN0aW9ucyk7XG5cdFx0Q29tbW9uVXRpbHMudXBkYXRlRGF0YUZpZWxkRm9ySUJOQnV0dG9uc1Zpc2liaWxpdHkoYUlCTkFjdGlvbnMsIHRoaXMuZ2V0VmlldygpKTtcblxuXHRcdGxldCBvTW9kZWw6IGFueSwgb0ZpbmFsVUlTdGF0ZTogYW55O1xuXG5cdFx0Ly8gVE9ETzogdGhpcyBzaG91bGQgYmUgbW92ZWQgaW50byBhbiBpbml0IGV2ZW50IG9mIHRoZSBNREMgdGFibGVzIChub3QgeWV0IGV4aXN0aW5nKSBhbmQgc2hvdWxkIGJlIHBhcnRcblx0XHQvLyBvZiBhbnkgY29udHJvbGxlciBleHRlbnNpb25cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gb1RhYmxlXG5cdFx0ICogQHBhcmFtIG9MaXN0QmluZGluZ1xuXHRcdCAqL1xuXHRcdGFzeW5jIGZ1bmN0aW9uIGVuYWJsZUZhc3RDcmVhdGlvblJvdyhvVGFibGU6IGFueSwgb0xpc3RCaW5kaW5nOiBhbnkpIHtcblx0XHRcdGNvbnN0IG9GYXN0Q3JlYXRpb25Sb3cgPSBvVGFibGUuZ2V0Q3JlYXRpb25Sb3coKTtcblx0XHRcdGxldCBvRmFzdENyZWF0aW9uTGlzdEJpbmRpbmcsIG9GYXN0Q3JlYXRpb25Db250ZXh0O1xuXG5cdFx0XHRpZiAob0Zhc3RDcmVhdGlvblJvdykge1xuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGF3YWl0IG9GaW5hbFVJU3RhdGU7XG5cdFx0XHRcdFx0aWYgKG9GYXN0Q3JlYXRpb25Sb3cuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0XHRvRmFzdENyZWF0aW9uTGlzdEJpbmRpbmcgPSBvTW9kZWwuYmluZExpc3Qob0xpc3RCaW5kaW5nLmdldFBhdGgoKSwgb0xpc3RCaW5kaW5nLmdldENvbnRleHQoKSwgW10sIFtdLCB7XG5cdFx0XHRcdFx0XHRcdCQkdXBkYXRlR3JvdXBJZDogXCJkb05vdFN1Ym1pdFwiLFxuXHRcdFx0XHRcdFx0XHQkJGdyb3VwSWQ6IFwiZG9Ob3RTdWJtaXRcIlxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHQvLyBXb3JrYXJvdW5kIHN1Z2dlc3RlZCBieSBPRGF0YSBtb2RlbCB2NCBjb2xsZWFndWVzXG5cdFx0XHRcdFx0XHRvRmFzdENyZWF0aW9uTGlzdEJpbmRpbmcucmVmcmVzaEludGVybmFsID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHQvKiBkbyBub3RoaW5nICovXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0b0Zhc3RDcmVhdGlvbkNvbnRleHQgPSBvRmFzdENyZWF0aW9uTGlzdEJpbmRpbmcuY3JlYXRlKCk7XG5cdFx0XHRcdFx0XHRvRmFzdENyZWF0aW9uUm93LnNldEJpbmRpbmdDb250ZXh0KG9GYXN0Q3JlYXRpb25Db250ZXh0KTtcblxuXHRcdFx0XHRcdFx0Ly8gdGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgY29uc29sZSBlcnJvclxuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0YXdhaXQgb0Zhc3RDcmVhdGlvbkNvbnRleHQuY3JlYXRlZCgpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdFx0XHRMb2cudHJhY2UoXCJ0cmFuc2llbnQgZmFzdCBjcmVhdGlvbiBjb250ZXh0IGRlbGV0ZWRcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGNhdGNoIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIGNvbXB1dGluZyB0aGUgZmluYWwgVUkgc3RhdGVcIiwgb0Vycm9yKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIHRoaXMgc2hvdWxkIG5vdCBiZSBuZWVkZWQgYXQgdGhlIGFsbFxuXHRcdC8qKlxuXHRcdCAqIEBwYXJhbSBvVGFibGVcblx0XHQgKi9cblx0XHRjb25zdCBoYW5kbGVUYWJsZU1vZGlmaWNhdGlvbnMgPSAob1RhYmxlOiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IG9CaW5kaW5nID0gdGhpcy5fZ2V0VGFibGVCaW5kaW5nKG9UYWJsZSksXG5cdFx0XHRcdGZuSGFuZGxlVGFibGVQYXRjaEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRlbmFibGVGYXN0Q3JlYXRpb25Sb3cob1RhYmxlLCBvQmluZGluZyk7XG5cdFx0XHRcdH07XG5cblx0XHRcdGlmICghb0JpbmRpbmcpIHtcblx0XHRcdFx0TG9nLmVycm9yKGBFeHBlY3RlZCBiaW5kaW5nIG1pc3NpbmcgZm9yIHRhYmxlOiAke29UYWJsZS5nZXRJZCgpfWApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvQmluZGluZy5vQ29udGV4dCkge1xuXHRcdFx0XHRmbkhhbmRsZVRhYmxlUGF0Y2hFdmVudHMoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGZuSGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGlmIChvQmluZGluZy5vQ29udGV4dCkge1xuXHRcdFx0XHRcdFx0Zm5IYW5kbGVUYWJsZVBhdGNoRXZlbnRzKCk7XG5cdFx0XHRcdFx0XHRvQmluZGluZy5kZXRhY2hDaGFuZ2UoZm5IYW5kbGVDaGFuZ2UpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoQ2hhbmdlKGZuSGFuZGxlQ2hhbmdlKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0aWYgKG9CaW5kaW5nQ29udGV4dCkge1xuXHRcdFx0b01vZGVsID0gb0JpbmRpbmdDb250ZXh0LmdldE1vZGVsKCk7XG5cblx0XHRcdC8vIENvbXB1dGUgRWRpdCBNb2RlXG5cdFx0XHRvRmluYWxVSVN0YXRlID0gdGhpcy5fZWRpdEZsb3cuY29tcHV0ZUVkaXRNb2RlKG9CaW5kaW5nQ29udGV4dCk7XG5cblx0XHRcdGlmIChNb2RlbEhlbHBlci5pc0NvbGxhYm9yYXRpb25EcmFmdFN1cHBvcnRlZChvTW9kZWwuZ2V0TWV0YU1vZGVsKCkpKSB7XG5cdFx0XHRcdG9GaW5hbFVJU3RhdGVcblx0XHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGNvbm5lY3QodGhpcy5nZXRWaWV3KCkpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChpc0Nvbm5lY3RlZCh0aGlzLmdldFZpZXcoKSkpIHtcblx0XHRcdFx0XHRcdFx0ZGlzY29ubmVjdCh0aGlzLmdldFZpZXcoKSk7IC8vIENsZWFudXAgY29sbGFib3JhdGlvbiBjb25uZWN0aW9uIGluIGNhc2Ugd2Ugc3dpdGNoIHRvIGFub3RoZXIgZWxlbWVudCAoZS5nLiBpbiBGQ0wpXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKG9FcnJvcjogYW55KSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSB3YWl0aW5nIGZvciB0aGUgZmluYWwgVUkgU3RhdGVcIiwgb0Vycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdC8vIHVwZGF0ZSByZWxhdGVkIGFwcHMgb25jZSBEYXRhIGlzIHJlY2VpdmVkIGluIGNhc2Ugb2YgYmluZGluZyBjYWNoZSBpcyBub3QgYXZhaWxhYmxlXG5cdFx0XHQvLyBUT0RPOiB0aGlzIGlzIG9ubHkgYSB0ZW1wIHNvbHV0aW9uIHNpbmNlIHdlIG5lZWQgdG8gY2FsbCBfdXBkYXRlUmVsYXRlZEFwcHMgbWV0aG9kIG9ubHkgYWZ0ZXIgZGF0YSBmb3IgT2JqZWN0IFBhZ2UgaXMgcmVjZWl2ZWQgKGlmIHRoZXJlIGlzIG5vIGJpbmRpbmcpXG5cdFx0XHRpZiAob0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKS5vQ2FjaGUpIHtcblx0XHRcdFx0dGhpcy5fdXBkYXRlUmVsYXRlZEFwcHMoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGZuVXBkYXRlUmVsYXRlZEFwcHMgPSAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlUmVsYXRlZEFwcHMoKTtcblx0XHRcdFx0XHRvQmluZGluZ0NvbnRleHQuZ2V0QmluZGluZygpLmRldGFjaERhdGFSZWNlaXZlZChmblVwZGF0ZVJlbGF0ZWRBcHBzKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0b0JpbmRpbmdDb250ZXh0LmdldEJpbmRpbmcoKS5hdHRhY2hEYXRhUmVjZWl2ZWQoZm5VcGRhdGVSZWxhdGVkQXBwcyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vQXR0YWNoIHRoZSBwYXRjaCBzZW50IGFuZCBwYXRjaCBjb21wbGV0ZWQgZXZlbnQgdG8gdGhlIG9iamVjdCBwYWdlIGJpbmRpbmcgc28gdGhhdCB3ZSBjYW4gcmVhY3Rcblx0XHRcdGNvbnN0IG9CaW5kaW5nID0gKG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nICYmIG9CaW5kaW5nQ29udGV4dC5nZXRCaW5kaW5nKCkpIHx8IG9CaW5kaW5nQ29udGV4dDtcblxuXHRcdFx0Ly8gQXR0YWNoIHRoZSBldmVudCBoYW5kbGVyIG9ubHkgb25jZSB0byB0aGUgc2FtZSBiaW5kaW5nXG5cdFx0XHRpZiAodGhpcy5jdXJyZW50QmluZGluZyAhPT0gb0JpbmRpbmcpIHtcblx0XHRcdFx0b0JpbmRpbmcuYXR0YWNoRXZlbnQoXCJwYXRjaFNlbnRcIiwgdGhpcy5lZGl0Rmxvdy5oYW5kbGVQYXRjaFNlbnQsIHRoaXMpO1xuXHRcdFx0XHR0aGlzLmN1cnJlbnRCaW5kaW5nID0gb0JpbmRpbmc7XG5cdFx0XHR9XG5cblx0XHRcdGFUYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAob1RhYmxlOiBhbnkpIHtcblx0XHRcdFx0Ly8gYWNjZXNzIGJpbmRpbmcgb25seSBhZnRlciB0YWJsZSBpcyBib3VuZFxuXHRcdFx0XHRUYWJsZVV0aWxzLndoZW5Cb3VuZChvVGFibGUpXG5cdFx0XHRcdFx0LnRoZW4oaGFuZGxlVGFibGVNb2RpZmljYXRpb25zKVxuXHRcdFx0XHRcdC5jYXRjaChmdW5jdGlvbiAob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihcIkVycm9yIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSB0YWJsZSB0byBiZSBib3VuZFwiLCBvRXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmICghKHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS51c2VOZXdMYXp5TG9hZGluZykge1xuXHRcdFx0XHQvLyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgYmluZGluZyBpcyByZWFkeSBoZW5jZSBjYWxsaW5nIGl0IGluIG9uQWZ0ZXJCaW5kaW5nXG5cdFx0XHRcdChvT2JqZWN0UGFnZSBhcyBhbnkpLl90cmlnZ2VyVmlzaWJsZVN1YlNlY3Rpb25zRXZlbnRzKCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vVG8gQ29tcHV0ZSB0aGUgRWRpdCBCaW5kaW5nIG9mIHRoZSBzdWJPYmplY3QgcGFnZSB1c2luZyByb290IG9iamVjdCBwYWdlLCBjcmVhdGUgYSBjb250ZXh0IGZvciBkcmFmdCByb290IGFuZCB1cGRhdGUgdGhlIGVkaXQgYnV0dG9uIGluIHN1YiBPUCB1c2luZyB0aGUgY29udGV4dFxuXHRcdFx0QWN0aW9uUnVudGltZS51cGRhdGVFZGl0QnV0dG9uVmlzaWJpbGl0eUFuZEVuYWJsZW1lbnQodGhpcy5nZXRWaWV3KCkpO1xuXHRcdH1cblx0fVxuXG5cdEBwdWJsaWNFeHRlbnNpb24oKVxuXHRAZXh0ZW5zaWJsZShPdmVycmlkZUV4ZWN1dGlvbi5BZnRlcilcblx0b25QYWdlUmVhZHkobVBhcmFtZXRlcnM6IGFueSkge1xuXHRcdGNvbnN0IHNldEZvY3VzID0gKCkgPT4ge1xuXHRcdFx0Ly8gU2V0IHRoZSBmb2N1cyB0byB0aGUgZmlyc3QgYWN0aW9uIGJ1dHRvbiwgb3IgdG8gdGhlIGZpcnN0IGVkaXRhYmxlIGlucHV0IGlmIGluIGVkaXRhYmxlIG1vZGVcblx0XHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRcdGNvbnN0IGlzSW5EaXNwbGF5TW9kZSA9ICFvT2JqZWN0UGFnZS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIik7XG5cblx0XHRcdGlmIChpc0luRGlzcGxheU1vZGUpIHtcblx0XHRcdFx0Y29uc3Qgb0ZpcnN0Q2xpY2thYmxlRWxlbWVudCA9IHRoaXMuX2dldEZpcnN0Q2xpY2thYmxlRWxlbWVudChvT2JqZWN0UGFnZSk7XG5cdFx0XHRcdGlmIChvRmlyc3RDbGlja2FibGVFbGVtZW50KSB7XG5cdFx0XHRcdFx0b0ZpcnN0Q2xpY2thYmxlRWxlbWVudC5mb2N1cygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCBvU2VsZWN0ZWRTZWN0aW9uOiBhbnkgPSBDb3JlLmJ5SWQob09iamVjdFBhZ2UuZ2V0U2VsZWN0ZWRTZWN0aW9uKCkpO1xuXHRcdFx0XHRpZiAob1NlbGVjdGVkU2VjdGlvbikge1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZUZvY3VzSW5FZGl0TW9kZShvU2VsZWN0ZWRTZWN0aW9uLmdldFN1YlNlY3Rpb25zKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0XHQvLyBBcHBseSBhcHAgc3RhdGUgb25seSBhZnRlciB0aGUgcGFnZSBpcyByZWFkeSB3aXRoIHRoZSBmaXJzdCBzZWN0aW9uIHNlbGVjdGVkXG5cdFx0Y29uc3Qgb1ZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBvSW50ZXJuYWxNb2RlbENvbnRleHQgPSBvVmlldy5nZXRCaW5kaW5nQ29udGV4dChcImludGVybmFsXCIpIGFzIEludGVybmFsTW9kZWxDb250ZXh0O1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0Ly9TaG93IHBvcHVwIHdoaWxlIG5hdmlnYXRpbmcgYmFjayBmcm9tIG9iamVjdCBwYWdlIGluIGNhc2Ugb2YgZHJhZnRcblx0XHRpZiAob0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRjb25zdCBiSXNTdGlja3lNb2RlID0gTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKChvQmluZGluZ0NvbnRleHQuZ2V0TW9kZWwoKSBhcyBPRGF0YU1vZGVsKS5nZXRNZXRhTW9kZWwoKSk7XG5cdFx0XHRpZiAoIWJJc1N0aWNreU1vZGUpIHtcblx0XHRcdFx0Y29uc3Qgb0FwcENvbXBvbmVudCA9IENvbW1vblV0aWxzLmdldEFwcENvbXBvbmVudChvVmlldyk7XG5cdFx0XHRcdG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpLnNldEJhY2tOYXZpZ2F0aW9uKCgpID0+IHRoaXMuX29uQmFja05hdmlnYXRpb25JbkRyYWZ0KG9CaW5kaW5nQ29udGV4dCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRjb25zdCB2aWV3SWQgPSB0aGlzLmdldFZpZXcoKS5nZXRJZCgpO1xuXHRcdHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdC5nZXRBcHBTdGF0ZUhhbmRsZXIoKVxuXHRcdFx0LmFwcGx5QXBwU3RhdGUodmlld0lkLCB0aGlzLmdldFZpZXcoKSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0aWYgKG1QYXJhbWV0ZXJzLmZvcmNlRm9jdXMpIHtcblx0XHRcdFx0XHRzZXRGb2N1cygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChFcnJvcikge1xuXHRcdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBzZXR0aW5nIHRoZSBmb2N1c1wiLCBFcnJvcik7XG5cdFx0XHR9KTtcblxuXHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShcImVycm9yTmF2aWdhdGlvblNlY3Rpb25GbGFnXCIsIGZhbHNlKTtcblx0XHR0aGlzLl9jaGVja0RhdGFQb2ludFRpdGxlRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBzdGF0dXMgb2YgZWRpdCBtb2RlIGZvciBzdGlja3kgc2Vzc2lvbi5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIHN0YXR1cyBvZiBlZGl0IG1vZGUgZm9yIHN0aWNreSBzZXNzaW9uXG5cdCAqL1xuXHRnZXRTdGlja3lFZGl0TW9kZSgpIHtcblx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSB0aGlzLmdldFZpZXcoKS5nZXRCaW5kaW5nQ29udGV4dCAmJiAodGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoKSBhcyBDb250ZXh0KTtcblx0XHRsZXQgYklzU3RpY2t5RWRpdE1vZGUgPSBmYWxzZTtcblx0XHRpZiAob0JpbmRpbmdDb250ZXh0KSB7XG5cdFx0XHRjb25zdCBiSXNTdGlja3lNb2RlID0gTW9kZWxIZWxwZXIuaXNTdGlja3lTZXNzaW9uU3VwcG9ydGVkKG9CaW5kaW5nQ29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpKTtcblx0XHRcdGlmIChiSXNTdGlja3lNb2RlKSB7XG5cdFx0XHRcdGJJc1N0aWNreUVkaXRNb2RlID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKS5nZXRQcm9wZXJ0eShcIi9pc0VkaXRhYmxlXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gYklzU3RpY2t5RWRpdE1vZGU7XG5cdH1cblxuXHRfZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKSB7XG5cdFx0cmV0dXJuIHRoaXMuYnlJZChcImZlOjpPYmplY3RQYWdlXCIpIGFzIE9iamVjdFBhZ2VMYXlvdXQ7XG5cdH1cblxuXHRfZ2V0UGFnZVRpdGxlSW5mb3JtYXRpb24oKSB7XG5cdFx0Y29uc3Qgb09iamVjdFBhZ2UgPSB0aGlzLl9nZXRPYmplY3RQYWdlTGF5b3V0Q29udHJvbCgpO1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlU3VidGl0bGUgPSBvT2JqZWN0UGFnZS5nZXRDdXN0b21EYXRhKCkuZmluZChmdW5jdGlvbiAob0N1c3RvbURhdGE6IGFueSkge1xuXHRcdFx0cmV0dXJuIG9DdXN0b21EYXRhLmdldEtleSgpID09PSBcIk9iamVjdFBhZ2VTdWJ0aXRsZVwiO1xuXHRcdH0pO1xuXHRcdHJldHVybiB7XG5cdFx0XHR0aXRsZTogb09iamVjdFBhZ2UuZGF0YShcIk9iamVjdFBhZ2VUaXRsZVwiKSB8fCBcIlwiLFxuXHRcdFx0c3VidGl0bGU6IG9PYmplY3RQYWdlU3VidGl0bGUgJiYgb09iamVjdFBhZ2VTdWJ0aXRsZS5nZXRWYWx1ZSgpLFxuXHRcdFx0aW50ZW50OiBcIlwiLFxuXHRcdFx0aWNvbjogXCJcIlxuXHRcdH07XG5cdH1cblxuXHRfZXhlY3V0ZUhlYWRlclNob3J0Y3V0KHNJZDogYW55KSB7XG5cdFx0Y29uc3Qgc0J1dHRvbklkID0gYCR7dGhpcy5nZXRWaWV3KCkuZ2V0SWQoKX0tLSR7c0lkfWAsXG5cdFx0XHRvQnV0dG9uID0gKHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCkuZ2V0SGVhZGVyVGl0bGUoKSBhcyBPYmplY3RQYWdlRHluYW1pY0hlYWRlclRpdGxlKVxuXHRcdFx0XHQuZ2V0QWN0aW9ucygpXG5cdFx0XHRcdC5maW5kKGZ1bmN0aW9uIChvRWxlbWVudDogYW55KSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9FbGVtZW50LmdldElkKCkgPT09IHNCdXR0b25JZDtcblx0XHRcdFx0fSk7XG5cdFx0aWYgKG9CdXR0b24pIHtcblx0XHRcdENvbW1vblV0aWxzLmZpcmVCdXR0b25QcmVzcyhvQnV0dG9uKTtcblx0XHR9XG5cdH1cblxuXHRfZXhlY3V0ZUZvb3RlclNob3J0Y3V0KHNJZDogYW55KSB7XG5cdFx0Y29uc3Qgc0J1dHRvbklkID0gYCR7dGhpcy5nZXRWaWV3KCkuZ2V0SWQoKX0tLSR7c0lkfWAsXG5cdFx0XHRvQnV0dG9uID0gKHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCkuZ2V0Rm9vdGVyKCkgYXMgYW55KS5nZXRDb250ZW50KCkuZmluZChmdW5jdGlvbiAob0VsZW1lbnQ6IGFueSkge1xuXHRcdFx0XHRyZXR1cm4gb0VsZW1lbnQuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgPT09IFwic2FwLm0uQnV0dG9uXCIgJiYgb0VsZW1lbnQuZ2V0SWQoKSA9PT0gc0J1dHRvbklkO1xuXHRcdFx0fSk7XG5cdFx0Q29tbW9uVXRpbHMuZmlyZUJ1dHRvblByZXNzKG9CdXR0b24pO1xuXHR9XG5cblx0X2V4ZWN1dGVUYWJTaG9ydEN1dChvRXhlY3V0aW9uOiBhbnkpIHtcblx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCksXG5cdFx0XHRhU2VjdGlvbnMgPSBvT2JqZWN0UGFnZS5nZXRTZWN0aW9ucygpLFxuXHRcdFx0aVNlY3Rpb25JbmRleE1heCA9IGFTZWN0aW9ucy5sZW5ndGggLSAxLFxuXHRcdFx0c0NvbW1hbmQgPSBvRXhlY3V0aW9uLm9Tb3VyY2UuZ2V0Q29tbWFuZCgpO1xuXHRcdGxldCBuZXdTZWN0aW9uLFxuXHRcdFx0aVNlbGVjdGVkU2VjdGlvbkluZGV4ID0gb09iamVjdFBhZ2UuaW5kZXhPZlNlY3Rpb24odGhpcy5ieUlkKG9PYmplY3RQYWdlLmdldFNlbGVjdGVkU2VjdGlvbigpKSBhcyBPYmplY3RQYWdlU2VjdGlvbik7XG5cdFx0aWYgKGlTZWxlY3RlZFNlY3Rpb25JbmRleCAhPT0gLTEgJiYgaVNlY3Rpb25JbmRleE1heCA+IDApIHtcblx0XHRcdGlmIChzQ29tbWFuZCA9PT0gXCJOZXh0VGFiXCIpIHtcblx0XHRcdFx0aWYgKGlTZWxlY3RlZFNlY3Rpb25JbmRleCA8PSBpU2VjdGlvbkluZGV4TWF4IC0gMSkge1xuXHRcdFx0XHRcdG5ld1NlY3Rpb24gPSBhU2VjdGlvbnNbKytpU2VsZWN0ZWRTZWN0aW9uSW5kZXhdO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKGlTZWxlY3RlZFNlY3Rpb25JbmRleCAhPT0gMCkge1xuXHRcdFx0XHQvLyBQcmV2aW91c1RhYlxuXHRcdFx0XHRuZXdTZWN0aW9uID0gYVNlY3Rpb25zWy0taVNlbGVjdGVkU2VjdGlvbkluZGV4XTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG5ld1NlY3Rpb24pIHtcblx0XHRcdFx0b09iamVjdFBhZ2Uuc2V0U2VsZWN0ZWRTZWN0aW9uKG5ld1NlY3Rpb24pO1xuXHRcdFx0XHRuZXdTZWN0aW9uLmZvY3VzKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0X2dldEZvb3RlclZpc2liaWxpdHkoKSB7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gdGhpcy5nZXRWaWV3KCkuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCBzVmlld0lkID0gdGhpcy5nZXRWaWV3KCkuZ2V0SWQoKTtcblx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJtZXNzYWdlRm9vdGVyQ29udGFpbnNFcnJvcnNcIiwgZmFsc2UpO1xuXHRcdHNhcC51aVxuXHRcdFx0LmdldENvcmUoKVxuXHRcdFx0LmdldE1lc3NhZ2VNYW5hZ2VyKClcblx0XHRcdC5nZXRNZXNzYWdlTW9kZWwoKVxuXHRcdFx0LmdldERhdGEoKVxuXHRcdFx0LmZvckVhY2goZnVuY3Rpb24gKG9NZXNzYWdlOiBhbnkpIHtcblx0XHRcdFx0aWYgKG9NZXNzYWdlLnZhbGlkYXRpb24gJiYgb01lc3NhZ2UudHlwZSA9PT0gXCJFcnJvclwiICYmIG9NZXNzYWdlLnRhcmdldC5pbmRleE9mKHNWaWV3SWQpID4gLTEpIHtcblx0XHRcdFx0XHRvSW50ZXJuYWxNb2RlbENvbnRleHQuc2V0UHJvcGVydHkoXCJtZXNzYWdlRm9vdGVyQ29udGFpbnNFcnJvcnNcIiwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0X3Nob3dNZXNzYWdlUG9wb3ZlcihlcnI/OiBhbnksIG9SZXQ/OiBhbnkpIHtcblx0XHRpZiAoZXJyKSB7XG5cdFx0XHRMb2cuZXJyb3IoZXJyKTtcblx0XHR9XG5cdFx0Y29uc3Qgcm9vdFZpZXdDb250cm9sbGVyID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRSb290Vmlld0NvbnRyb2xsZXIoKSBhcyBhbnk7XG5cdFx0Y29uc3QgY3VycmVudFBhZ2VWaWV3ID0gcm9vdFZpZXdDb250cm9sbGVyLmlzRmNsRW5hYmxlZCgpXG5cdFx0XHQ/IHJvb3RWaWV3Q29udHJvbGxlci5nZXRSaWdodG1vc3RWaWV3KClcblx0XHRcdDogKHRoaXMuZ2V0QXBwQ29tcG9uZW50KCkuZ2V0Um9vdENvbnRhaW5lcigpIGFzIGFueSkuZ2V0Q3VycmVudFBhZ2UoKTtcblx0XHRpZiAoIWN1cnJlbnRQYWdlVmlldy5pc0EoXCJzYXAubS5NZXNzYWdlUGFnZVwiKSkge1xuXHRcdFx0Y29uc3Qgb01lc3NhZ2VCdXR0b24gPSB0aGlzLm1lc3NhZ2VCdXR0b24sXG5cdFx0XHRcdG9NZXNzYWdlUG9wb3ZlciA9IG9NZXNzYWdlQnV0dG9uLm9NZXNzYWdlUG9wb3Zlcixcblx0XHRcdFx0b0l0ZW1CaW5kaW5nID0gb01lc3NhZ2VQb3BvdmVyLmdldEJpbmRpbmcoXCJpdGVtc1wiKTtcblxuXHRcdFx0aWYgKG9JdGVtQmluZGluZy5nZXRMZW5ndGgoKSA+IDAgJiYgIW9NZXNzYWdlUG9wb3Zlci5pc09wZW4oKSkge1xuXHRcdFx0XHRvTWVzc2FnZUJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpO1xuXHRcdFx0XHQvLyB3b3JrYXJvdW5kIHRvIGVuc3VyZSB0aGF0IG9NZXNzYWdlQnV0dG9uIGlzIHJlbmRlcmVkIHdoZW4gb3BlbkJ5IGlzIGNhbGxlZFxuXHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRvTWVzc2FnZVBvcG92ZXIub3BlbkJ5KG9NZXNzYWdlQnV0dG9uKTtcblx0XHRcdFx0fSwgMCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvUmV0O1xuXHR9XG5cblx0X2VkaXREb2N1bWVudChvQ29udGV4dDogYW55KSB7XG5cdFx0Y29uc3Qgb01vZGVsID0gdGhpcy5nZXRWaWV3KCkuZ2V0TW9kZWwoXCJ1aVwiKTtcblx0XHRCdXN5TG9ja2VyLmxvY2sob01vZGVsKTtcblx0XHRyZXR1cm4gdGhpcy5lZGl0Rmxvdy5lZGl0RG9jdW1lbnQuYXBwbHkodGhpcy5lZGl0RmxvdywgW29Db250ZXh0XSkuZmluYWxseShmdW5jdGlvbiAoKSB7XG5cdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTW9kZWwpO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGNvbnRleHQgb2YgdGhlIERyYWZ0Um9vdCBwYXRoLlxuXHQgKiBJZiBhIHZpZXcgaGFzIGJlZW4gY3JlYXRlZCB3aXRoIHRoZSBkcmFmdCBSb290IFBhdGgsIHRoaXMgbWV0aG9kIHJldHVybnMgaXRzIGJpbmRpbmdDb250ZXh0LlxuXHQgKiBXaGVyZSBubyB2aWV3IGlzIGZvdW5kIGEgbmV3IGNyZWF0ZWQgY29udGV4dCBpcyByZXR1cm5lZC5cblx0ICogVGhlIG5ldyBjcmVhdGVkIGNvbnRleHQgcmVxdWVzdCB0aGUga2V5IG9mIHRoZSBlbnRpdHkgaW4gb3JkZXIgdG8gZ2V0IHRoZSBFdGFnIG9mIHRoaXMgZW50aXR5LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZ2V0RHJhZnRSb290UGF0aFxuXHQgKiBAcmV0dXJucyBSZXR1cm5zIGEgUHJvbWlzZVxuXHQgKi9cblx0YXN5bmMgZ2V0RHJhZnRSb290Q29udGV4dCgpOiBQcm9taXNlPFY0Q29udGV4dCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IHZpZXcgPSB0aGlzLmdldFZpZXcoKTtcblx0XHRjb25zdCBjb250ZXh0ID0gdmlldy5nZXRCaW5kaW5nQ29udGV4dCgpIGFzIFY0Q29udGV4dDtcblx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0Y29uc3QgZHJhZnRSb290Q29udGV4dFBhdGggPSBNb2RlbEhlbHBlci5nZXREcmFmdFJvb3RQYXRoKGNvbnRleHQpO1xuXHRcdFx0bGV0IHNpbXBsZURyYWZ0Um9vdENvbnRleHQ6IFY0Q29udGV4dDtcblx0XHRcdGlmIChkcmFmdFJvb3RDb250ZXh0UGF0aCkge1xuXHRcdFx0XHQvLyBDaGVjayBpZiBhIHZpZXcgbWF0Y2hlcyB3aXRoIHRoZSBkcmFmdCByb290IHBhdGhcblx0XHRcdFx0Y29uc3QgZXhpc3RpbmdCaW5kaW5nQ29udGV4dE9uUGFnZSA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KClcblx0XHRcdFx0XHQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKClcblx0XHRcdFx0XHQuZ2V0SW5zdGFuY2VkVmlld3MoKVxuXHRcdFx0XHRcdC5maW5kKChwYWdlVmlldzogVmlldykgPT4gcGFnZVZpZXcuZ2V0QmluZGluZ0NvbnRleHQoKT8uZ2V0UGF0aCgpID09PSBkcmFmdFJvb3RDb250ZXh0UGF0aClcblx0XHRcdFx0XHQ/LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgVjRDb250ZXh0O1xuXHRcdFx0XHRpZiAoZXhpc3RpbmdCaW5kaW5nQ29udGV4dE9uUGFnZSkge1xuXHRcdFx0XHRcdHJldHVybiBleGlzdGluZ0JpbmRpbmdDb250ZXh0T25QYWdlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IGludGVybmFsTW9kZWwgPSB2aWV3LmdldE1vZGVsKFwiaW50ZXJuYWxcIikgYXMgSlNPTk1vZGVsO1xuXHRcdFx0XHRzaW1wbGVEcmFmdFJvb3RDb250ZXh0ID0gaW50ZXJuYWxNb2RlbC5nZXRQcm9wZXJ0eShcIi9zaW1wbGVEcmFmdFJvb3RDb250ZXh0XCIpO1xuXHRcdFx0XHRpZiAoc2ltcGxlRHJhZnRSb290Q29udGV4dD8uZ2V0UGF0aCgpID09PSBkcmFmdFJvb3RDb250ZXh0UGF0aCkge1xuXHRcdFx0XHRcdHJldHVybiBzaW1wbGVEcmFmdFJvb3RDb250ZXh0O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IG1vZGVsID0gY29udGV4dC5nZXRNb2RlbCgpO1xuXHRcdFx0XHRzaW1wbGVEcmFmdFJvb3RDb250ZXh0ID0gbW9kZWwuYmluZENvbnRleHQoZHJhZnRSb290Q29udGV4dFBhdGgpLmdldEJvdW5kQ29udGV4dCgpO1xuXHRcdFx0XHRhd2FpdCBDb21tb25VdGlscy53YWl0Rm9yQ29udGV4dFJlcXVlc3RlZChzaW1wbGVEcmFmdFJvb3RDb250ZXh0KTtcblx0XHRcdFx0Ly8gU3RvcmUgdGhpcyBuZXcgY3JlYXRlZCBjb250ZXh0IHRvIHVzZSBpdCBvbiB0aGUgbmV4dCBpdGVyYXRpb25zXG5cdFx0XHRcdGludGVybmFsTW9kZWwuc2V0UHJvcGVydHkoXCIvc2ltcGxlRHJhZnRSb290Q29udGV4dFwiLCBzaW1wbGVEcmFmdFJvb3RDb250ZXh0KTtcblx0XHRcdFx0cmV0dXJuIHNpbXBsZURyYWZ0Um9vdENvbnRleHQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0YXN5bmMgX3ZhbGlkYXRlRG9jdW1lbnQoKTogUHJvbWlzZTx2b2lkIHwgYW55W10gfCBPRGF0YUNvbnRleHRCaW5kaW5nRXg+IHtcblx0XHRjb25zdCBjb250cm9sID0gQ29yZS5ieUlkKENvcmUuZ2V0Q3VycmVudEZvY3VzZWRDb250cm9sSWQoKSk7XG5cdFx0Y29uc3QgY29udGV4dCA9IGNvbnRyb2w/LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgVjRDb250ZXh0O1xuXHRcdGlmIChjb250ZXh0ICYmICFjb250ZXh0LmlzVHJhbnNpZW50KCkpIHtcblx0XHRcdC8vIFdhaXQgZm9yIHRoZSBwZW5kaW5nIGNoYW5nZXMgYmVmb3JlIHN0YXJ0aW5nIHRoaXMgdmFsaWRhdGlvblxuXHRcdFx0YXdhaXQgdGhpcy5fZWRpdEZsb3cuc3luY1Rhc2soKTtcblx0XHRcdGNvbnN0IGFwcENvbXBvbmVudCA9IHRoaXMuZ2V0QXBwQ29tcG9uZW50KCk7XG5cdFx0XHRjb25zdCBzaWRlRWZmZWN0c1NlcnZpY2UgPSBhcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cdFx0XHRjb25zdCBlbnRpdHlUeXBlID0gc2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChjb250ZXh0KTtcblx0XHRcdGNvbnN0IGdsb2JhbFNpZGVFZmZlY3RzID0gZW50aXR5VHlwZSA/IHNpZGVFZmZlY3RzU2VydmljZS5nZXRHbG9iYWxPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGUpIDogW107XG5cdFx0XHQvLyBJZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZ2xvYmFsIFNpZGVFZmZlY3RzIGZvciB0aGUgcmVsYXRlZCBlbnRpdHksIGV4ZWN1dGUgaXQvdGhlbVxuXHRcdFx0aWYgKGdsb2JhbFNpZGVFZmZlY3RzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoZ2xvYmFsU2lkZUVmZmVjdHMubWFwKChzaWRlRWZmZWN0cykgPT4gdGhpcy5fc2lkZUVmZmVjdHMucmVxdWVzdFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzLCBjb250ZXh0KSkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgZHJhZnRSb290Q29udGV4dCA9IGF3YWl0IHRoaXMuZ2V0RHJhZnRSb290Q29udGV4dCgpO1xuXHRcdFx0XHQvL0V4ZWN1dGUgdGhlIGRyYWZ0VmFsaWRhdGlvbiBpZiB0aGVyZSBpcyBubyBnbG9iYWxTaWRlRWZmZWN0c1xuXHRcdFx0XHRpZiAoZHJhZnRSb290Q29udGV4dCkge1xuXHRcdFx0XHRcdHJldHVybiBkcmFmdC5leGVjdXRlRHJhZnRWYWxpZGF0aW9uKGRyYWZ0Um9vdENvbnRleHQsIGFwcENvbXBvbmVudCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGFzeW5jIF9zYXZlRG9jdW1lbnQob0NvbnRleHQ6IGFueSkge1xuXHRcdGNvbnN0IG9Nb2RlbCA9IHRoaXMuZ2V0VmlldygpLmdldE1vZGVsKFwidWlcIiksXG5cdFx0XHRhV2FpdENyZWF0ZURvY3VtZW50czogYW55W10gPSBbXTtcblx0XHQvLyBpbmRpY2F0ZXMgaWYgd2UgYXJlIGNyZWF0aW5nIGEgbmV3IHJvdyBpbiB0aGUgT1Bcblx0XHRsZXQgYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgPSBmYWxzZTtcblx0XHRCdXN5TG9ja2VyLmxvY2sob01vZGVsKTtcblx0XHR0aGlzLl9maW5kVGFibGVzKCkuZm9yRWFjaCgob1RhYmxlOiBhbnkpID0+IHtcblx0XHRcdGNvbnN0IG9CaW5kaW5nID0gdGhpcy5fZ2V0VGFibGVCaW5kaW5nKG9UYWJsZSk7XG5cdFx0XHRjb25zdCBtUGFyYW1ldGVyczogYW55ID0ge1xuXHRcdFx0XHRjcmVhdGlvbk1vZGU6IG9UYWJsZS5kYXRhKFwiY3JlYXRpb25Nb2RlXCIpLFxuXHRcdFx0XHRjcmVhdGlvblJvdzogb1RhYmxlLmdldENyZWF0aW9uUm93KCksXG5cdFx0XHRcdGNyZWF0ZUF0RW5kOiBvVGFibGUuZGF0YShcImNyZWF0ZUF0RW5kXCIpID09PSBcInRydWVcIlxuXHRcdFx0fTtcblx0XHRcdGNvbnN0IGJDcmVhdGVEb2N1bWVudCA9XG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93ICYmXG5cdFx0XHRcdG1QYXJhbWV0ZXJzLmNyZWF0aW9uUm93LmdldEJpbmRpbmdDb250ZXh0KCkgJiZcblx0XHRcdFx0T2JqZWN0LmtleXMobVBhcmFtZXRlcnMuY3JlYXRpb25Sb3cuZ2V0QmluZGluZ0NvbnRleHQoKS5nZXRPYmplY3QoKSkubGVuZ3RoID4gMTtcblx0XHRcdGlmIChiQ3JlYXRlRG9jdW1lbnQpIHtcblx0XHRcdFx0Ly8gdGhlIGJTa2lwU2lkZUVmZmVjdHMgaXMgYSBwYXJhbWV0ZXIgY3JlYXRlZCB3aGVuIHdlIGNsaWNrIHRoZSBzYXZlIGtleS4gSWYgd2UgcHJlc3MgdGhpcyBrZXlcblx0XHRcdFx0Ly8gd2UgZG9uJ3QgZXhlY3V0ZSB0aGUgaGFuZGxlU2lkZUVmZmVjdHMgZnVuY2l0b24gdG8gYXZvaWQgYmF0Y2ggcmVkdW5kYW5jeVxuXHRcdFx0XHRtUGFyYW1ldGVycy5iU2tpcFNpZGVFZmZlY3RzID0gdHJ1ZTtcblx0XHRcdFx0YkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IgPSB0cnVlO1xuXHRcdFx0XHRhV2FpdENyZWF0ZURvY3VtZW50cy5wdXNoKFxuXHRcdFx0XHRcdHRoaXMuZWRpdEZsb3cuY3JlYXRlRG9jdW1lbnQob0JpbmRpbmcsIG1QYXJhbWV0ZXJzKS50aGVuKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiBvQmluZGluZztcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGFCaW5kaW5ncyA9IGF3YWl0IFByb21pc2UuYWxsKGFXYWl0Q3JlYXRlRG9jdW1lbnRzKTtcblx0XHRcdGNvbnN0IG1QYXJhbWV0ZXJzID0ge1xuXHRcdFx0XHRiRXhlY3V0ZVNpZGVFZmZlY3RzT25FcnJvcjogYkV4ZWN1dGVTaWRlRWZmZWN0c09uRXJyb3IsXG5cdFx0XHRcdGJpbmRpbmdzOiBhQmluZGluZ3Ncblx0XHRcdH07XG5cdFx0XHQvLyBXZSBuZWVkIHRvIGVpdGhlciByZWplY3Qgb3IgcmVzb2x2ZSBhIHByb21pc2UgaGVyZSBhbmQgcmV0dXJuIGl0IHNpbmNlIHRoaXMgc2F2ZVxuXHRcdFx0Ly8gZnVuY3Rpb24gaXMgbm90IG9ubHkgY2FsbGVkIHdoZW4gcHJlc3NpbmcgdGhlIHNhdmUgYnV0dG9uIGluIHRoZSBmb290ZXIsIGJ1dCBhbHNvXG5cdFx0XHQvLyB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgY3JlYXRlIG9yIHNhdmUgaW4gYSBkYXRhbG9zcyBwb3B1cC5cblx0XHRcdC8vIFRoZSBsb2dpYyBvZiB0aGUgZGF0YWxvc3MgcG9wdXAgbmVlZHMgdG8gZGV0ZWN0IGlmIHRoZSBzYXZlIGhhZCBlcnJvcnMgb3Igbm90IGluIG9yZGVyXG5cdFx0XHQvLyB0byBkZWNpZGUgaWYgdGhlIHN1YnNlcXVlbnQgYWN0aW9uIC0gbGlrZSBhIGJhY2sgbmF2aWdhdGlvbiAtIGhhcyB0byBiZSBleGVjdXRlZCBvciBub3QuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmVkaXRGbG93LnNhdmVEb2N1bWVudChvQ29udGV4dCwgbVBhcmFtZXRlcnMpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3I6IGFueSkge1xuXHRcdFx0XHQvLyBJZiB0aGUgc2F2ZURvY3VtZW50IGluIGVkaXRGbG93IHJldHVybnMgZXJyb3JzIHdlIG5lZWRcblx0XHRcdFx0Ly8gdG8gc2hvdyB0aGUgbWVzc2FnZSBwb3BvdmVyIGhlcmUgYW5kIGVuc3VyZSB0aGF0IHRoZVxuXHRcdFx0XHQvLyBkYXRhbG9zcyBsb2dpYyBkb2VzIG5vdCBwZXJmb3JtIHRoZSBmb2xsb3cgdXAgZnVuY3Rpb25cblx0XHRcdFx0Ly8gbGlrZSBlLmcuIGEgYmFjayBuYXZpZ2F0aW9uIGhlbmNlIHdlIHJldHVybiBhIHByb21pc2UgYW5kIHJlamVjdCBpdFxuXHRcdFx0XHR0aGlzLl9zaG93TWVzc2FnZVBvcG92ZXIoZXJyb3IpO1xuXHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdH1cblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0aWYgKEJ1c3lMb2NrZXIuaXNMb2NrZWQob01vZGVsKSkge1xuXHRcdFx0XHRCdXN5TG9ja2VyLnVubG9jayhvTW9kZWwpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdF9tYW5hZ2VDb2xsYWJvcmF0aW9uKCkge1xuXHRcdG9wZW5NYW5hZ2VEaWFsb2codGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0X3Nob3dDb2xsYWJvcmF0aW9uVXNlckRldGFpbHMoZXZlbnQ6IGFueSkge1xuXHRcdHNob3dVc2VyRGV0YWlscyhldmVudCwgdGhpcy5nZXRWaWV3KCkpO1xuXHR9XG5cblx0X2NhbmNlbERvY3VtZW50KG9Db250ZXh0OiBhbnksIG1QYXJhbWV0ZXJzOiBhbnkpIHtcblx0XHRtUGFyYW1ldGVycy5jYW5jZWxCdXR0b24gPSB0aGlzLmdldFZpZXcoKS5ieUlkKG1QYXJhbWV0ZXJzLmNhbmNlbEJ1dHRvbik7IC8vdG8gZ2V0IHRoZSByZWZlcmVuY2Ugb2YgdGhlIGNhbmNlbCBidXR0b24gZnJvbSBjb21tYW5kIGV4ZWN1dGlvblxuXHRcdHJldHVybiB0aGlzLmVkaXRGbG93LmNhbmNlbERvY3VtZW50KG9Db250ZXh0LCBtUGFyYW1ldGVycyk7XG5cdH1cblxuXHRfYXBwbHlEb2N1bWVudChvQ29udGV4dDogYW55KSB7XG5cdFx0cmV0dXJuIHRoaXMuZWRpdEZsb3cuYXBwbHlEb2N1bWVudChvQ29udGV4dCkuY2F0Y2goKCkgPT4gdGhpcy5fc2hvd01lc3NhZ2VQb3BvdmVyKCkpO1xuXHR9XG5cblx0X3VwZGF0ZVJlbGF0ZWRBcHBzKCkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRpZiAoQ29tbW9uVXRpbHMucmVzb2x2ZVN0cmluZ3RvQm9vbGVhbihvT2JqZWN0UGFnZS5kYXRhKFwic2hvd1JlbGF0ZWRBcHBzXCIpKSkge1xuXHRcdFx0Q29tbW9uVXRpbHMudXBkYXRlUmVsYXRlZEFwcHNEZXRhaWxzKG9PYmplY3RQYWdlKTtcblx0XHR9XG5cdH1cblxuXHRfZmluZENvbnRyb2xJblN1YlNlY3Rpb24oYVBhcmVudEVsZW1lbnQ6IGFueSwgYVN1YnNlY3Rpb246IGFueSwgYUNvbnRyb2xzOiBhbnksIGJJc0NoYXJ0PzogYm9vbGVhbikge1xuXHRcdGNvbnN0IGFTdWJTZWN0aW9uVGFibGVzID0gW107XG5cdFx0Zm9yIChsZXQgZWxlbWVudCA9IDA7IGVsZW1lbnQgPCBhUGFyZW50RWxlbWVudC5sZW5ndGg7IGVsZW1lbnQrKykge1xuXHRcdFx0bGV0IG9FbGVtZW50ID0gYVBhcmVudEVsZW1lbnRbZWxlbWVudF0uZ2V0Q29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uICYmIGFQYXJlbnRFbGVtZW50W2VsZW1lbnRdLmdldENvbnRlbnQoKTtcblx0XHRcdGlmIChiSXNDaGFydCkge1xuXHRcdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQubUFnZ3JlZ2F0aW9ucyAmJiBvRWxlbWVudC5nZXRBZ2dyZWdhdGlvbihcIml0ZW1zXCIpKSB7XG5cdFx0XHRcdFx0Y29uc3QgYUl0ZW1zID0gb0VsZW1lbnQuZ2V0QWdncmVnYXRpb24oXCJpdGVtc1wiKTtcblx0XHRcdFx0XHRhSXRlbXMuZm9yRWFjaChmdW5jdGlvbiAob0l0ZW06IGFueSkge1xuXHRcdFx0XHRcdFx0aWYgKG9JdGVtLmlzQShcInNhcC5mZS5tYWNyb3MuY2hhcnQuQ2hhcnRBUElcIikpIHtcblx0XHRcdFx0XHRcdFx0b0VsZW1lbnQgPSBvSXRlbTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50LmlzQSAmJiBvRWxlbWVudC5pc0EoXCJzYXAudWkubGF5b3V0LkR5bmFtaWNTaWRlQ29udGVudFwiKSkge1xuXHRcdFx0XHRvRWxlbWVudCA9IG9FbGVtZW50LmdldE1haW5Db250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb0VsZW1lbnQuZ2V0TWFpbkNvbnRlbnQoKTtcblx0XHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRvRWxlbWVudCA9IG9FbGVtZW50WzBdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQuaXNBICYmIG9FbGVtZW50LmlzQShcInNhcC5mZS5tYWNyb3MudGFibGUuVGFibGVBUElcIikpIHtcblx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudC5nZXRDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb0VsZW1lbnQuZ2V0Q29udGVudCgpO1xuXHRcdFx0XHRpZiAob0VsZW1lbnQgJiYgb0VsZW1lbnQubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdG9FbGVtZW50ID0gb0VsZW1lbnRbMF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBKFwic2FwLnVpLm1kYy5UYWJsZVwiKSkge1xuXHRcdFx0XHRhQ29udHJvbHMucHVzaChvRWxlbWVudCk7XG5cdFx0XHRcdGFTdWJTZWN0aW9uVGFibGVzLnB1c2goe1xuXHRcdFx0XHRcdHRhYmxlOiBvRWxlbWVudCxcblx0XHRcdFx0XHRncmlkVGFibGU6IG9FbGVtZW50LmdldFR5cGUoKS5pc0EoXCJzYXAudWkubWRjLnRhYmxlLkdyaWRUYWJsZVR5cGVcIilcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5pc0EgJiYgb0VsZW1lbnQuaXNBKFwic2FwLmZlLm1hY3Jvcy5jaGFydC5DaGFydEFQSVwiKSkge1xuXHRcdFx0XHRvRWxlbWVudCA9IG9FbGVtZW50LmdldENvbnRlbnQgaW5zdGFuY2VvZiBGdW5jdGlvbiAmJiBvRWxlbWVudC5nZXRDb250ZW50KCk7XG5cdFx0XHRcdGlmIChvRWxlbWVudCAmJiBvRWxlbWVudC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0b0VsZW1lbnQgPSBvRWxlbWVudFswXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG9FbGVtZW50ICYmIG9FbGVtZW50LmlzQSAmJiBvRWxlbWVudC5pc0EoXCJzYXAudWkubWRjLkNoYXJ0XCIpKSB7XG5cdFx0XHRcdGFDb250cm9scy5wdXNoKG9FbGVtZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKFxuXHRcdFx0YVN1YlNlY3Rpb25UYWJsZXMubGVuZ3RoID09PSAxICYmXG5cdFx0XHRhUGFyZW50RWxlbWVudC5sZW5ndGggPT09IDEgJiZcblx0XHRcdGFTdWJTZWN0aW9uVGFibGVzWzBdLmdyaWRUYWJsZSAmJlxuXHRcdFx0IWFTdWJzZWN0aW9uLmhhc1N0eWxlQ2xhc3MoXCJzYXBVeEFQT2JqZWN0UGFnZVN1YlNlY3Rpb25GaXRDb250YWluZXJcIilcblx0XHQpIHtcblx0XHRcdC8vSW4gY2FzZSB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHRhYmxlIGluIGEgc2VjdGlvbiB3ZSBmaXQgdGhhdCB0byB0aGUgd2hvbGUgcGFnZSBzbyB0aGF0IHRoZSBzY3JvbGxiYXIgY29tZXMgb25seSBvbiB0YWJsZSBhbmQgbm90IG9uIHBhZ2Vcblx0XHRcdGFTdWJzZWN0aW9uLmFkZFN0eWxlQ2xhc3MoXCJzYXBVeEFQT2JqZWN0UGFnZVN1YlNlY3Rpb25GaXRDb250YWluZXJcIik7XG5cdFx0fVxuXHR9XG5cblx0X2dldEFsbFN1YlNlY3Rpb25zKCkge1xuXHRcdGNvbnN0IG9PYmplY3RQYWdlID0gdGhpcy5fZ2V0T2JqZWN0UGFnZUxheW91dENvbnRyb2woKTtcblx0XHRsZXQgYVN1YlNlY3Rpb25zOiBhbnlbXSA9IFtdO1xuXHRcdG9PYmplY3RQYWdlLmdldFNlY3Rpb25zKCkuZm9yRWFjaChmdW5jdGlvbiAob1NlY3Rpb246IGFueSkge1xuXHRcdFx0YVN1YlNlY3Rpb25zID0gYVN1YlNlY3Rpb25zLmNvbmNhdChvU2VjdGlvbi5nZXRTdWJTZWN0aW9ucygpKTtcblx0XHR9KTtcblx0XHRyZXR1cm4gYVN1YlNlY3Rpb25zO1xuXHR9XG5cblx0X2dldEFsbEJsb2NrcygpIHtcblx0XHRsZXQgYUJsb2NrczogYW55W10gPSBbXTtcblx0XHR0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG9TdWJTZWN0aW9uOiBhbnkpIHtcblx0XHRcdGFCbG9ja3MgPSBhQmxvY2tzLmNvbmNhdChvU3ViU2VjdGlvbi5nZXRCbG9ja3MoKSk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGFCbG9ja3M7XG5cdH1cblxuXHRfZmluZFRhYmxlcygpIHtcblx0XHRjb25zdCBhU3ViU2VjdGlvbnMgPSB0aGlzLl9nZXRBbGxTdWJTZWN0aW9ucygpO1xuXHRcdGNvbnN0IGFUYWJsZXM6IGFueVtdID0gW107XG5cdFx0Zm9yIChsZXQgc3ViU2VjdGlvbiA9IDA7IHN1YlNlY3Rpb24gPCBhU3ViU2VjdGlvbnMubGVuZ3RoOyBzdWJTZWN0aW9uKyspIHtcblx0XHRcdHRoaXMuX2ZpbmRDb250cm9sSW5TdWJTZWN0aW9uKGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXS5nZXRCbG9ja3MoKSwgYVN1YlNlY3Rpb25zW3N1YlNlY3Rpb25dLCBhVGFibGVzKTtcblx0XHRcdHRoaXMuX2ZpbmRDb250cm9sSW5TdWJTZWN0aW9uKGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXS5nZXRNb3JlQmxvY2tzKCksIGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXSwgYVRhYmxlcyk7XG5cdFx0fVxuXHRcdHJldHVybiBhVGFibGVzO1xuXHR9XG5cblx0X2ZpbmRDaGFydHMoKSB7XG5cdFx0Y29uc3QgYVN1YlNlY3Rpb25zID0gdGhpcy5fZ2V0QWxsU3ViU2VjdGlvbnMoKTtcblx0XHRjb25zdCBhQ2hhcnRzOiBhbnlbXSA9IFtdO1xuXHRcdGZvciAobGV0IHN1YlNlY3Rpb24gPSAwOyBzdWJTZWN0aW9uIDwgYVN1YlNlY3Rpb25zLmxlbmd0aDsgc3ViU2VjdGlvbisrKSB7XG5cdFx0XHR0aGlzLl9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0QmxvY2tzKCksIGFTdWJTZWN0aW9uc1tzdWJTZWN0aW9uXSwgYUNoYXJ0cywgdHJ1ZSk7XG5cdFx0XHR0aGlzLl9maW5kQ29udHJvbEluU3ViU2VjdGlvbihhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0uZ2V0TW9yZUJsb2NrcygpLCBhU3ViU2VjdGlvbnNbc3ViU2VjdGlvbl0sIGFDaGFydHMsIHRydWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gYUNoYXJ0cztcblx0fVxuXG5cdF9jbG9zZVNpZGVDb250ZW50KCkge1xuXHRcdHRoaXMuX2dldEFsbEJsb2NrcygpLmZvckVhY2goZnVuY3Rpb24gKG9CbG9jazogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udGVudCA9IG9CbG9jay5nZXRDb250ZW50IGluc3RhbmNlb2YgRnVuY3Rpb24gJiYgb0Jsb2NrLmdldENvbnRlbnQoKTtcblx0XHRcdGlmIChvQ29udGVudCAmJiBvQ29udGVudC5pc0EgJiYgb0NvbnRlbnQuaXNBKFwic2FwLnVpLmxheW91dC5EeW5hbWljU2lkZUNvbnRlbnRcIikpIHtcblx0XHRcdFx0aWYgKG9Db250ZW50LnNldFNob3dTaWRlQ29udGVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG5cdFx0XHRcdFx0b0NvbnRlbnQuc2V0U2hvd1NpZGVDb250ZW50KGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYXJ0IENvbnRleHQgaXMgcmVzb2x2ZWQgZm9yIDE6biBtaWNyb2NoYXJ0cy5cblx0ICpcblx0ICogQHBhcmFtIG9DaGFydENvbnRleHQgVGhlIENvbnRleHQgb2YgdGhlIE1pY3JvQ2hhcnRcblx0ICogQHBhcmFtIHNDaGFydFBhdGggVGhlIGNvbGxlY3Rpb25QYXRoIG9mIHRoZSB0aGUgY2hhcnRcblx0ICogQHJldHVybnMgQXJyYXkgb2YgQXR0cmlidXRlcyBvZiB0aGUgY2hhcnQgQ29udGV4dFxuXHQgKi9cblx0X2dldENoYXJ0Q29udGV4dERhdGEob0NoYXJ0Q29udGV4dDogYW55LCBzQ2hhcnRQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBvQ29udGV4dERhdGEgPSBvQ2hhcnRDb250ZXh0LmdldE9iamVjdCgpO1xuXHRcdGxldCBvQ2hhcnRDb250ZXh0RGF0YSA9IFtvQ29udGV4dERhdGFdO1xuXHRcdGlmIChvQ2hhcnRDb250ZXh0ICYmIHNDaGFydFBhdGgpIHtcblx0XHRcdGlmIChvQ29udGV4dERhdGFbc0NoYXJ0UGF0aF0pIHtcblx0XHRcdFx0b0NoYXJ0Q29udGV4dERhdGEgPSBvQ29udGV4dERhdGFbc0NoYXJ0UGF0aF07XG5cdFx0XHRcdGRlbGV0ZSBvQ29udGV4dERhdGFbc0NoYXJ0UGF0aF07XG5cdFx0XHRcdG9DaGFydENvbnRleHREYXRhLnB1c2gob0NvbnRleHREYXRhKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9DaGFydENvbnRleHREYXRhO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNjcm9sbCB0aGUgdGFibGVzIHRvIHRoZSByb3cgd2l0aCB0aGUgc1BhdGhcblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHNhcC5mZS50ZW1wbGF0ZXMuT2JqZWN0UGFnZS5PYmplY3RQYWdlQ29udHJvbGxlci5jb250cm9sbGVyI19zY3JvbGxUYWJsZXNUb1Jvd1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1Jvd1BhdGggJ3NQYXRoIG9mIHRoZSB0YWJsZSByb3cnXG5cdCAqL1xuXG5cdF9zY3JvbGxUYWJsZXNUb1JvdyhzUm93UGF0aDogc3RyaW5nKSB7XG5cdFx0aWYgKHRoaXMuX2ZpbmRUYWJsZXMgJiYgdGhpcy5fZmluZFRhYmxlcygpLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IGFUYWJsZXMgPSB0aGlzLl9maW5kVGFibGVzKCk7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFUYWJsZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0VGFibGVTY3JvbGxlci5zY3JvbGxUYWJsZVRvUm93KGFUYWJsZXNbaV0sIHNSb3dQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHRvIG1lcmdlIHNlbGVjdGVkIGNvbnRleHRzIGFuZCBmaWx0ZXJzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX21lcmdlTXVsdGlwbGVDb250ZXh0c1xuXHQgKiBAcGFyYW0gb1BhZ2VDb250ZXh0IFBhZ2UgY29udGV4dFxuXHQgKiBAcGFyYW0gYUxpbmVDb250ZXh0IFNlbGVjdGVkIENvbnRleHRzXG5cdCAqIEBwYXJhbSBzQ2hhcnRQYXRoIENvbGxlY3Rpb24gbmFtZSBvZiB0aGUgY2hhcnRcblx0ICogQHJldHVybnMgU2VsZWN0aW9uIFZhcmlhbnQgT2JqZWN0XG5cdCAqL1xuXHRfbWVyZ2VNdWx0aXBsZUNvbnRleHRzKG9QYWdlQ29udGV4dDogQ29udGV4dCwgYUxpbmVDb250ZXh0OiBhbnlbXSwgc0NoYXJ0UGF0aDogc3RyaW5nKSB7XG5cdFx0bGV0IGFBdHRyaWJ1dGVzOiBhbnlbXSA9IFtdLFxuXHRcdFx0YVBhZ2VBdHRyaWJ1dGVzID0gW10sXG5cdFx0XHRvQ29udGV4dCxcblx0XHRcdHNNZXRhUGF0aExpbmU6IHN0cmluZyxcblx0XHRcdHNQYXRoTGluZTtcblxuXHRcdGNvbnN0IHNQYWdlUGF0aCA9IG9QYWdlQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9QYWdlQ29udGV4dCAmJiBvUGFnZUNvbnRleHQuZ2V0TW9kZWwoKSAmJiBvUGFnZUNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRjb25zdCBzTWV0YVBhdGhQYWdlID0gb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYWdlUGF0aCkucmVwbGFjZSgvXlxcLyovLCBcIlwiKTtcblxuXHRcdC8vIEdldCBzaW5nbGUgbGluZSBjb250ZXh0IGlmIG5lY2Vzc2FyeVxuXHRcdGlmIChhTGluZUNvbnRleHQgJiYgYUxpbmVDb250ZXh0Lmxlbmd0aCkge1xuXHRcdFx0b0NvbnRleHQgPSBhTGluZUNvbnRleHRbMF07XG5cdFx0XHRzUGF0aExpbmUgPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRzTWV0YVBhdGhMaW5lID0gb01ldGFNb2RlbCAmJiBvTWV0YU1vZGVsLmdldE1ldGFQYXRoKHNQYXRoTGluZSkucmVwbGFjZSgvXlxcLyovLCBcIlwiKTtcblxuXHRcdFx0YUxpbmVDb250ZXh0LmZvckVhY2goKG9TaW5nbGVDb250ZXh0OiBhbnkpID0+IHtcblx0XHRcdFx0aWYgKHNDaGFydFBhdGgpIHtcblx0XHRcdFx0XHRjb25zdCBvQ2hhcnRDb250ZXh0RGF0YSA9IHRoaXMuX2dldENoYXJ0Q29udGV4dERhdGEob1NpbmdsZUNvbnRleHQsIHNDaGFydFBhdGgpO1xuXHRcdFx0XHRcdGlmIChvQ2hhcnRDb250ZXh0RGF0YSkge1xuXHRcdFx0XHRcdFx0YUF0dHJpYnV0ZXMgPSBvQ2hhcnRDb250ZXh0RGF0YS5tYXAoZnVuY3Rpb24gKG9TdWJDaGFydENvbnRleHREYXRhOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRjb250ZXh0RGF0YTogb1N1YkNoYXJ0Q29udGV4dERhdGEsXG5cdFx0XHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBgJHtzTWV0YVBhdGhQYWdlfS8ke3NDaGFydFBhdGh9YFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFBdHRyaWJ1dGVzLnB1c2goe1xuXHRcdFx0XHRcdFx0Y29udGV4dERhdGE6IG9TaW5nbGVDb250ZXh0LmdldE9iamVjdCgpLFxuXHRcdFx0XHRcdFx0ZW50aXR5U2V0OiBzTWV0YVBhdGhMaW5lXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHRhUGFnZUF0dHJpYnV0ZXMucHVzaCh7XG5cdFx0XHRjb250ZXh0RGF0YTogb1BhZ2VDb250ZXh0LmdldE9iamVjdCgpLFxuXHRcdFx0ZW50aXR5U2V0OiBzTWV0YVBhdGhQYWdlXG5cdFx0fSk7XG5cdFx0Ly8gQWRkaW5nIFBhZ2UgQ29udGV4dCB0byBzZWxlY3Rpb24gdmFyaWFudFxuXHRcdGFQYWdlQXR0cmlidXRlcyA9IENvbW1vblV0aWxzLnJlbW92ZVNlbnNpdGl2ZURhdGEoYVBhZ2VBdHRyaWJ1dGVzLCBvTWV0YU1vZGVsKTtcblx0XHRjb25zdCBvUGFnZUxldmVsU1YgPSBDb21tb25VdGlscy5hZGRQYWdlQ29udGV4dFRvU2VsZWN0aW9uVmFyaWFudChuZXcgU2VsZWN0aW9uVmFyaWFudCgpLCBhUGFnZUF0dHJpYnV0ZXMsIHRoaXMuZ2V0VmlldygpKTtcblx0XHRhQXR0cmlidXRlcyA9IENvbW1vblV0aWxzLnJlbW92ZVNlbnNpdGl2ZURhdGEoYUF0dHJpYnV0ZXMsIG9NZXRhTW9kZWwpO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZWxlY3Rpb25WYXJpYW50OiBvUGFnZUxldmVsU1YsXG5cdFx0XHRhdHRyaWJ1dGVzOiBhQXR0cmlidXRlc1xuXHRcdH07XG5cdH1cblxuXHRfZ2V0QmF0Y2hHcm91cHNGb3JWaWV3KCkge1xuXHRcdGNvbnN0IG9WaWV3RGF0YSA9IHRoaXMuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55LFxuXHRcdFx0b0NvbmZpZ3VyYXRpb25zID0gb1ZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uLFxuXHRcdFx0YUNvbmZpZ3VyYXRpb25zID0gb0NvbmZpZ3VyYXRpb25zICYmIE9iamVjdC5rZXlzKG9Db25maWd1cmF0aW9ucyksXG5cdFx0XHRhQmF0Y2hHcm91cHMgPSBbXCIkYXV0by5IZXJvZXNcIiwgXCIkYXV0by5EZWNvcmF0aW9uXCIsIFwiJGF1dG8uV29ya2Vyc1wiXTtcblxuXHRcdGlmIChhQ29uZmlndXJhdGlvbnMgJiYgYUNvbmZpZ3VyYXRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdGFDb25maWd1cmF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5OiBhbnkpIHtcblx0XHRcdFx0Y29uc3Qgb0NvbmZpZ3VyYXRpb24gPSBvQ29uZmlndXJhdGlvbnNbc0tleV07XG5cdFx0XHRcdGlmIChvQ29uZmlndXJhdGlvbi5yZXF1ZXN0R3JvdXBJZCA9PT0gXCJMb25nUnVubmVyc1wiKSB7XG5cdFx0XHRcdFx0YUJhdGNoR3JvdXBzLnB1c2goXCIkYXV0by5Mb25nUnVubmVyc1wiKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdHJldHVybiBhQmF0Y2hHcm91cHM7XG5cdH1cblxuXHQvKlxuXHQgKiBSZXNldCBCcmVhZGNydW1iIGxpbmtzXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAcGFyYW0ge3NhcC5tLkJyZWFkY3J1bWJzfSBbb1NvdXJjZV0gcGFyZW50IGNvbnRyb2xcblx0ICogQGRlc2NyaXB0aW9uIFVzZWQgd2hlbiBjb250ZXh0IG9mIHRoZSBvYmplY3QgcGFnZSBjaGFuZ2VzLlxuXHQgKiAgICAgICAgICAgICAgVGhpcyBldmVudCBjYWxsYmFjayBpcyBhdHRhY2hlZCB0byBtb2RlbENvbnRleHRDaGFuZ2Vcblx0ICogICAgICAgICAgICAgIGV2ZW50IG9mIHRoZSBCcmVhZGNydW1iIGNvbnRyb2wgdG8gY2F0Y2ggY29udGV4dCBjaGFuZ2UuXG5cdCAqICAgICAgICAgICAgICBUaGVuIGVsZW1lbnQgYmluZGluZyBhbmQgaHJlZnMgYXJlIHVwZGF0ZWQgZm9yIGVhY2ggbGluay5cblx0ICpcblx0ICogQHVpNS1yZXN0cmljdGVkXG5cdCAqIEBleHBlcmltZW50YWxcblx0ICovXG5cdGFzeW5jIF9zZXRCcmVhZGNydW1iTGlua3Mob1NvdXJjZTogQnJlYWRDcnVtYnMpIHtcblx0XHRjb25zdCBvQ29udGV4dCA9IG9Tb3VyY2UuZ2V0QmluZGluZ0NvbnRleHQoKSxcblx0XHRcdG9BcHBDb21wb25lbnQgPSB0aGlzLmdldEFwcENvbXBvbmVudCgpLFxuXHRcdFx0YVByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXSxcblx0XHRcdGFTa2lwUGFyYW1ldGVyaXplZDogYW55W10gPSBbXSxcblx0XHRcdHNOZXdQYXRoID0gb0NvbnRleHQ/LmdldFBhdGgoKSxcblx0XHRcdGFQYXRoUGFydHMgPSBzTmV3UGF0aD8uc3BsaXQoXCIvXCIpID8/IFtdLFxuXHRcdFx0b01ldGFNb2RlbCA9IG9BcHBDb21wb25lbnQgJiYgb0FwcENvbXBvbmVudC5nZXRNZXRhTW9kZWwoKTtcblx0XHRsZXQgc1BhdGggPSBcIlwiO1xuXHRcdHRyeSB7XG5cdFx0XHRhUGF0aFBhcnRzLnNoaWZ0KCk7XG5cdFx0XHRhUGF0aFBhcnRzLnNwbGljZSgtMSwgMSk7XG5cdFx0XHRhUGF0aFBhcnRzLmZvckVhY2goZnVuY3Rpb24gKHNQYXRoUGFydDogYW55KSB7XG5cdFx0XHRcdHNQYXRoICs9IGAvJHtzUGF0aFBhcnR9YDtcblx0XHRcdFx0Y29uc3Qgb1Jvb3RWaWV3Q29udHJvbGxlciA9IG9BcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCk7XG5cdFx0XHRcdGNvbnN0IHNQYXJhbWV0ZXJQYXRoID0gb01ldGFNb2RlbC5nZXRNZXRhUGF0aChzUGF0aCk7XG5cdFx0XHRcdGNvbnN0IGJSZXN1bHRDb250ZXh0ID0gb01ldGFNb2RlbC5nZXRPYmplY3QoYCR7c1BhcmFtZXRlclBhdGh9L0Bjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuUmVzdWx0Q29udGV4dGApO1xuXHRcdFx0XHRpZiAoYlJlc3VsdENvbnRleHQpIHtcblx0XHRcdFx0XHQvLyBXZSBkb250IG5lZWQgdG8gY3JlYXRlIGEgYnJlYWRjcnVtYiBmb3IgUGFyYW1ldGVyIHBhdGhcblx0XHRcdFx0XHRhU2tpcFBhcmFtZXRlcml6ZWQucHVzaCgxKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0YVNraXBQYXJhbWV0ZXJpemVkLnB1c2goMCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YVByb21pc2VzLnB1c2gob1Jvb3RWaWV3Q29udHJvbGxlci5nZXRUaXRsZUluZm9Gcm9tUGF0aChzUGF0aCkpO1xuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCB0aXRsZUhpZXJhcmNoeUluZm9zOiBhbnlbXSA9IGF3YWl0IFByb21pc2UuYWxsKGFQcm9taXNlcyk7XG5cdFx0XHRsZXQgaWR4LCBoaWVyYXJjaHlQb3NpdGlvbiwgb0xpbms7XG5cdFx0XHRmb3IgKGNvbnN0IHRpdGxlSGllcmFyY2h5SW5mbyBvZiB0aXRsZUhpZXJhcmNoeUluZm9zKSB7XG5cdFx0XHRcdGhpZXJhcmNoeVBvc2l0aW9uID0gdGl0bGVIaWVyYXJjaHlJbmZvcy5pbmRleE9mKHRpdGxlSGllcmFyY2h5SW5mbyk7XG5cdFx0XHRcdGlkeCA9IGhpZXJhcmNoeVBvc2l0aW9uIC0gYVNraXBQYXJhbWV0ZXJpemVkW2hpZXJhcmNoeVBvc2l0aW9uXTtcblx0XHRcdFx0b0xpbmsgPSBvU291cmNlLmdldExpbmtzKClbaWR4XSA/IG9Tb3VyY2UuZ2V0TGlua3MoKVtpZHhdIDogbmV3IExpbmsoKTtcblx0XHRcdFx0Ly9zQ3VycmVudEVudGl0eSBpcyBhIGZhbGxiYWNrIHZhbHVlIGluIGNhc2Ugb2YgZW1wdHkgdGl0bGVcblx0XHRcdFx0b0xpbmsuc2V0VGV4dCh0aXRsZUhpZXJhcmNoeUluZm8uc3VidGl0bGUgfHwgdGl0bGVIaWVyYXJjaHlJbmZvLnRpdGxlKTtcblx0XHRcdFx0Ly9XZSBhcHBseSBhbiBhZGRpdGlvbmFsIGVuY29kZVVSSSBpbiBjYXNlIG9mIHNwZWNpYWwgY2hhcmFjdGVycyAoaWUgXCIvXCIpIHVzZWQgaW4gdGhlIHVybCB0aHJvdWdoIHRoZSBzZW1hbnRpYyBrZXlzXG5cdFx0XHRcdG9MaW5rLnNldEhyZWYoZW5jb2RlVVJJKHRpdGxlSGllcmFyY2h5SW5mby5pbnRlbnQpKTtcblx0XHRcdFx0aWYgKCFvU291cmNlLmdldExpbmtzKClbaWR4XSkge1xuXHRcdFx0XHRcdG9Tb3VyY2UuYWRkTGluayhvTGluayk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGNhdGNoIChlcnJvcjogYW55KSB7XG5cdFx0XHRMb2cuZXJyb3IoXCJFcnJvciB3aGlsZSBzZXR0aW5nIHRoZSBicmVhZGNydW1iIGxpbmtzOlwiICsgZXJyb3IpO1xuXHRcdH1cblx0fVxuXG5cdF9jaGVja0RhdGFQb2ludFRpdGxlRm9yRXh0ZXJuYWxOYXZpZ2F0aW9uKCkge1xuXHRcdGNvbnN0IG9WaWV3ID0gdGhpcy5nZXRWaWV3KCk7XG5cdFx0Y29uc3Qgb0ludGVybmFsTW9kZWxDb250ZXh0ID0gb1ZpZXcuZ2V0QmluZGluZ0NvbnRleHQoXCJpbnRlcm5hbFwiKSBhcyBJbnRlcm5hbE1vZGVsQ29udGV4dDtcblx0XHRjb25zdCBvRGF0YVBvaW50cyA9IENvbW1vblV0aWxzLmdldEhlYWRlckZhY2V0SXRlbUNvbmZpZ0ZvckV4dGVybmFsTmF2aWdhdGlvbihcblx0XHRcdG9WaWV3LmdldFZpZXdEYXRhKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdFx0XHR0aGlzLmdldEFwcENvbXBvbmVudCgpLmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0T3V0Ym91bmRzKClcblx0XHQpO1xuXHRcdGNvbnN0IG9TaGVsbFNlcnZpY2VzID0gdGhpcy5nZXRBcHBDb21wb25lbnQoKS5nZXRTaGVsbFNlcnZpY2VzKCk7XG5cdFx0Y29uc3Qgb1BhZ2VDb250ZXh0ID0gb1ZpZXcgJiYgKG9WaWV3LmdldEJpbmRpbmdDb250ZXh0KCkgYXMgQ29udGV4dCk7XG5cdFx0b0ludGVybmFsTW9kZWxDb250ZXh0LnNldFByb3BlcnR5KFwiaXNIZWFkZXJEUExpbmtWaXNpYmxlXCIsIHt9KTtcblx0XHRpZiAob1BhZ2VDb250ZXh0KSB7XG5cdFx0XHRvUGFnZUNvbnRleHRcblx0XHRcdFx0LnJlcXVlc3RPYmplY3QoKVxuXHRcdFx0XHQudGhlbihmdW5jdGlvbiAob0RhdGE6IGFueSkge1xuXHRcdFx0XHRcdGZuR2V0TGlua3Mob0RhdGFQb2ludHMsIG9EYXRhKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChvRXJyb3I6IGFueSkge1xuXHRcdFx0XHRcdExvZy5lcnJvcihcIkNhbm5vdCByZXRyaWV2ZSB0aGUgbGlua3MgZnJvbSB0aGUgc2hlbGwgc2VydmljZVwiLCBvRXJyb3IpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gb0Vycm9yXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gZm5PbkVycm9yKG9FcnJvcjogYW55KSB7XG5cdFx0XHRMb2cuZXJyb3Iob0Vycm9yKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBmblNldExpbmtFbmFibGVtZW50KGlkOiBzdHJpbmcsIGFTdXBwb3J0ZWRMaW5rczogYW55KSB7XG5cdFx0XHRjb25zdCBzTGlua0lkID0gaWQ7XG5cdFx0XHQvLyBwcm9jZXNzIHZpYWJsZSBsaW5rcyBmcm9tIGdldExpbmtzIGZvciBhbGwgZGF0YXBvaW50cyBoYXZpbmcgb3V0Ym91bmRcblx0XHRcdGlmIChhU3VwcG9ydGVkTGlua3MgJiYgYVN1cHBvcnRlZExpbmtzLmxlbmd0aCA9PT0gMSAmJiBhU3VwcG9ydGVkTGlua3NbMF0uc3VwcG9ydGVkKSB7XG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5zZXRQcm9wZXJ0eShgaXNIZWFkZXJEUExpbmtWaXNpYmxlLyR7c0xpbmtJZH1gLCB0cnVlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBAcGFyYW0gb1N1YkRhdGFQb2ludHNcblx0XHQgKiBAcGFyYW0gb1BhZ2VEYXRhXG5cdFx0ICovXG5cdFx0ZnVuY3Rpb24gZm5HZXRMaW5rcyhvU3ViRGF0YVBvaW50czogYW55LCBvUGFnZURhdGE6IGFueSkge1xuXHRcdFx0Zm9yIChjb25zdCBzSWQgaW4gb1N1YkRhdGFQb2ludHMpIHtcblx0XHRcdFx0Y29uc3Qgb0RhdGFQb2ludCA9IG9TdWJEYXRhUG9pbnRzW3NJZF07XG5cdFx0XHRcdGNvbnN0IG9QYXJhbXM6IGFueSA9IHt9O1xuXHRcdFx0XHRjb25zdCBvTGluayA9IG9WaWV3LmJ5SWQoc0lkKTtcblx0XHRcdFx0aWYgKCFvTGluaykge1xuXHRcdFx0XHRcdC8vIGZvciBkYXRhIHBvaW50cyBjb25maWd1cmVkIGluIGFwcCBkZXNjcmlwdG9yIGJ1dCBub3QgYW5ub3RhdGVkIGluIHRoZSBoZWFkZXJcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zdCBvTGlua0NvbnRleHQgPSBvTGluay5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdFx0XHRjb25zdCBvTGlua0RhdGE6IGFueSA9IG9MaW5rQ29udGV4dCAmJiBvTGlua0NvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdGxldCBvTWl4ZWRDb250ZXh0OiBhbnkgPSBtZXJnZSh7fSwgb1BhZ2VEYXRhLCBvTGlua0RhdGEpO1xuXHRcdFx0XHQvLyBwcm9jZXNzIHNlbWFudGljIG9iamVjdCBtYXBwaW5nc1xuXHRcdFx0XHRpZiAob0RhdGFQb2ludC5zZW1hbnRpY09iamVjdE1hcHBpbmcpIHtcblx0XHRcdFx0XHRjb25zdCBhU2VtYW50aWNPYmplY3RNYXBwaW5nID0gb0RhdGFQb2ludC5zZW1hbnRpY09iamVjdE1hcHBpbmc7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtIGluIGFTZW1hbnRpY09iamVjdE1hcHBpbmcpIHtcblx0XHRcdFx0XHRcdGNvbnN0IG9NYXBwaW5nID0gYVNlbWFudGljT2JqZWN0TWFwcGluZ1tpdGVtXTtcblx0XHRcdFx0XHRcdGNvbnN0IHNNYWluUHJvcGVydHkgPSBvTWFwcGluZ1tcIkxvY2FsUHJvcGVydHlcIl1bXCIkUHJvcGVydHlQYXRoXCJdO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc01hcHBlZFByb3BlcnR5ID0gb01hcHBpbmdbXCJTZW1hbnRpY09iamVjdFByb3BlcnR5XCJdO1xuXHRcdFx0XHRcdFx0aWYgKHNNYWluUHJvcGVydHkgIT09IHNNYXBwZWRQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdFx0XHRpZiAob01peGVkQ29udGV4dC5oYXNPd25Qcm9wZXJ0eShzTWFpblByb3BlcnR5KSkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG9OZXdNYXBwaW5nOiBhbnkgPSB7fTtcblx0XHRcdFx0XHRcdFx0XHRvTmV3TWFwcGluZ1tzTWFwcGVkUHJvcGVydHldID0gb01peGVkQ29udGV4dFtzTWFpblByb3BlcnR5XTtcblx0XHRcdFx0XHRcdFx0XHRvTWl4ZWRDb250ZXh0ID0gbWVyZ2Uoe30sIG9NaXhlZENvbnRleHQsIG9OZXdNYXBwaW5nKTtcblx0XHRcdFx0XHRcdFx0XHRkZWxldGUgb01peGVkQ29udGV4dFtzTWFpblByb3BlcnR5XTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChvTWl4ZWRDb250ZXh0KSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBzS2V5IGluIG9NaXhlZENvbnRleHQpIHtcblx0XHRcdFx0XHRcdGlmIChzS2V5LmluZGV4T2YoXCJfXCIpICE9PSAwICYmIHNLZXkuaW5kZXhPZihcIm9kYXRhLmNvbnRleHRcIikgPT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdG9QYXJhbXNbc0tleV0gPSBvTWl4ZWRDb250ZXh0W3NLZXldO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyB2YWxpZGF0ZSBpZiBhIGxpbmsgbXVzdCBiZSByZW5kZXJlZFxuXHRcdFx0XHRvU2hlbGxTZXJ2aWNlc1xuXHRcdFx0XHRcdC5pc05hdmlnYXRpb25TdXBwb3J0ZWQoW1xuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHR0YXJnZXQ6IHtcblx0XHRcdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogb0RhdGFQb2ludC5zZW1hbnRpY09iamVjdCxcblx0XHRcdFx0XHRcdFx0XHRhY3Rpb246IG9EYXRhUG9pbnQuYWN0aW9uXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHBhcmFtczogb1BhcmFtc1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF0pXG5cdFx0XHRcdFx0LnRoZW4oKGFMaW5rcykgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuU2V0TGlua0VuYWJsZW1lbnQoc0lkLCBhTGlua3MpO1xuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZuT25FcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aGFuZGxlcnMgPSB7XG5cdFx0LyoqXG5cdFx0ICogSW52b2tlcyB0aGUgcGFnZSBwcmltYXJ5IGFjdGlvbiBvbiBwcmVzcyBvZiBDdHJsK0VudGVyLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIG9Db250cm9sbGVyIFRoZSBwYWdlIGNvbnRyb2xsZXJcblx0XHQgKiBAcGFyYW0gb1ZpZXdcblx0XHQgKiBAcGFyYW0gb0NvbnRleHQgQ29udGV4dCBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyBjYWxsZWRcblx0XHQgKiBAcGFyYW0gc0FjdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBiZSBjYWxsZWRcblx0XHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzXSBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdFx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5jb250ZXh0c10gTWFuZGF0b3J5IGZvciBhIGJvdW5kIGFjdGlvbiwgZWl0aGVyIG9uZSBjb250ZXh0IG9yIGFuIGFycmF5IHdpdGggY29udGV4dHMgZm9yIHdoaWNoIHRoZSBhY3Rpb24gaXMgY2FsbGVkXG5cdFx0ICogQHBhcmFtIFttUGFyYW1ldGVycy5tb2RlbF0gTWFuZGF0b3J5IGZvciBhbiB1bmJvdW5kIGFjdGlvbjsgYW4gaW5zdGFuY2Ugb2YgYW4gT0RhdGEgVjQgbW9kZWxcblx0XHQgKiBAcGFyYW0gW21Db25kaXRpb25zXSBDb250YWlucyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG5cdFx0ICogQHBhcmFtIFttQ29uZGl0aW9ucy5wb3NpdGl2ZUFjdGlvblZpc2libGVdIFRoZSB2aXNpYmlsaXR5IG9mIHNlbWF0aWMgcG9zaXRpdmUgYWN0aW9uXG5cdFx0ICogQHBhcmFtIFttQ29uZGl0aW9ucy5wb3NpdGl2ZUFjdGlvbkVuYWJsZWRdIFRoZSBlbmFibGVtZW50IG9mIHNlbWFudGljIHBvc2l0aXZlIGFjdGlvblxuXHRcdCAqIEBwYXJhbSBbbUNvbmRpdGlvbnMuZWRpdEFjdGlvblZpc2libGVdIFRoZSBFZGl0IGJ1dHRvbiB2aXNpYmlsaXR5XG5cdFx0ICogQHBhcmFtIFttQ29uZGl0aW9ucy5lZGl0QWN0aW9uRW5hYmxlZF0gVGhlIGVuYWJsZW1lbnQgb2YgRWRpdCBidXR0b25cblx0XHQgKiBAdWk1LXJlc3RyaWN0ZWRcblx0XHQgKiBAZmluYWxcblx0XHQgKi9cblx0XHRvblByaW1hcnlBY3Rpb24oXG5cdFx0XHRvQ29udHJvbGxlcjogT2JqZWN0UGFnZUNvbnRyb2xsZXIsXG5cdFx0XHRvVmlldzogVmlldyxcblx0XHRcdG9Db250ZXh0OiBDb250ZXh0LFxuXHRcdFx0c0FjdGlvbk5hbWU6IHN0cmluZyxcblx0XHRcdG1QYXJhbWV0ZXJzOiB1bmtub3duLFxuXHRcdFx0bUNvbmRpdGlvbnM6IHtcblx0XHRcdFx0cG9zaXRpdmVBY3Rpb25WaXNpYmxlOiBib29sZWFuO1xuXHRcdFx0XHRwb3NpdGl2ZUFjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG5cdFx0XHRcdGVkaXRBY3Rpb25WaXNpYmxlOiBib29sZWFuO1xuXHRcdFx0XHRlZGl0QWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcblx0XHRcdH1cblx0XHQpIHtcblx0XHRcdGNvbnN0IGlWaWV3TGV2ZWwgPSAob0NvbnRyb2xsZXIuZ2V0VmlldygpLmdldFZpZXdEYXRhKCkgYXMgYW55KS52aWV3TGV2ZWwsXG5cdFx0XHRcdG9PYmplY3RQYWdlID0gb0NvbnRyb2xsZXIuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0XHRpZiAobUNvbmRpdGlvbnMucG9zaXRpdmVBY3Rpb25WaXNpYmxlKSB7XG5cdFx0XHRcdGlmIChtQ29uZGl0aW9ucy5wb3NpdGl2ZUFjdGlvbkVuYWJsZWQpIHtcblx0XHRcdFx0XHRvQ29udHJvbGxlci5oYW5kbGVycy5vbkNhbGxBY3Rpb24ob1ZpZXcsIHNBY3Rpb25OYW1lLCBtUGFyYW1ldGVycyk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAobUNvbmRpdGlvbnMuZWRpdEFjdGlvblZpc2libGUpIHtcblx0XHRcdFx0aWYgKG1Db25kaXRpb25zLmVkaXRBY3Rpb25FbmFibGVkKSB7XG5cdFx0XHRcdFx0b0NvbnRyb2xsZXIuX2VkaXREb2N1bWVudChvQ29udGV4dCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoaVZpZXdMZXZlbCA9PT0gMSAmJiBvT2JqZWN0UGFnZS5nZXRNb2RlbChcInVpXCIpLmdldFByb3BlcnR5KFwiL2lzRWRpdGFibGVcIikpIHtcblx0XHRcdFx0b0NvbnRyb2xsZXIuX3NhdmVEb2N1bWVudChvQ29udGV4dCk7XG5cdFx0XHR9IGVsc2UgaWYgKG9PYmplY3RQYWdlLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKSkge1xuXHRcdFx0XHRvQ29udHJvbGxlci5fYXBwbHlEb2N1bWVudChvQ29udGV4dCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdG9uVGFibGVDb250ZXh0Q2hhbmdlKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyLCBvRXZlbnQ6IGFueSkge1xuXHRcdFx0Y29uc3Qgb1NvdXJjZSA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblx0XHRcdGxldCBvVGFibGU6IGFueTtcblx0XHRcdHRoaXMuX2ZpbmRUYWJsZXMoKS5zb21lKGZ1bmN0aW9uIChfb1RhYmxlOiBhbnkpIHtcblx0XHRcdFx0aWYgKF9vVGFibGUuZ2V0Um93QmluZGluZygpID09PSBvU291cmNlKSB7XG5cdFx0XHRcdFx0b1RhYmxlID0gX29UYWJsZTtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3Qgb0N1cnJlbnRBY3Rpb25Qcm9taXNlID0gdGhpcy5fZWRpdEZsb3cuZ2V0Q3VycmVudEFjdGlvblByb21pc2UoKTtcblx0XHRcdGlmIChvQ3VycmVudEFjdGlvblByb21pc2UpIHtcblx0XHRcdFx0bGV0IGFUYWJsZUNvbnRleHRzOiBhbnk7XG5cdFx0XHRcdGlmIChvVGFibGUuZ2V0VHlwZSgpLmdldE1ldGFkYXRhKCkuaXNBKFwic2FwLnVpLm1kYy50YWJsZS5HcmlkVGFibGVUeXBlXCIpKSB7XG5cdFx0XHRcdFx0YVRhYmxlQ29udGV4dHMgPSBvU291cmNlLmdldENvbnRleHRzKDApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFUYWJsZUNvbnRleHRzID0gb1NvdXJjZS5nZXRDdXJyZW50Q29udGV4dHMoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvL2lmIGNvbnRleHRzIGFyZSBub3QgZnVsbHkgbG9hZGVkIHRoZSBnZXRjb250ZXh0cyBmdW5jdGlvbiBhYm92ZSB3aWxsIHRyaWdnZXIgYSBuZXcgY2hhbmdlIGV2ZW50IGNhbGxcblx0XHRcdFx0aWYgKCFhVGFibGVDb250ZXh0c1swXSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRvQ3VycmVudEFjdGlvblByb21pc2Vcblx0XHRcdFx0XHQudGhlbigob0FjdGlvblJlc3BvbnNlOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdGlmICghb0FjdGlvblJlc3BvbnNlIHx8IG9BY3Rpb25SZXNwb25zZS5jb250cm9sSWQgIT09IG9UYWJsZS5zSWQpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0Y29uc3Qgb0FjdGlvbkRhdGEgPSBvQWN0aW9uUmVzcG9uc2Uub0RhdGE7XG5cdFx0XHRcdFx0XHRjb25zdCBhS2V5cyA9IG9BY3Rpb25SZXNwb25zZS5rZXlzO1xuXHRcdFx0XHRcdFx0bGV0IGlOZXdJdGVtcCA9IC0xO1xuXHRcdFx0XHRcdFx0YVRhYmxlQ29udGV4dHMuZmluZChmdW5jdGlvbiAob1RhYmxlQ29udGV4dDogYW55LCBpOiBhbnkpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb1RhYmxlRGF0YSA9IG9UYWJsZUNvbnRleHQuZ2V0T2JqZWN0KCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJDb21wYXJlID0gYUtleXMuZXZlcnkoZnVuY3Rpb24gKHNLZXk6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvVGFibGVEYXRhW3NLZXldID09PSBvQWN0aW9uRGF0YVtzS2V5XTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdGlmIChiQ29tcGFyZSkge1xuXHRcdFx0XHRcdFx0XHRcdGlOZXdJdGVtcCA9IGk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIGJDb21wYXJlO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRpZiAoaU5ld0l0ZW1wICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhRGlhbG9ncyA9IEluc3RhbmNlTWFuYWdlci5nZXRPcGVuRGlhbG9ncygpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvRGlhbG9nID1cblx0XHRcdFx0XHRcdFx0XHRhRGlhbG9ncy5sZW5ndGggPiAwID8gYURpYWxvZ3MuZmluZCgoZGlhbG9nKSA9PiBkaWFsb2cuZGF0YShcIkZ1bGxTY3JlZW5EaWFsb2dcIikgIT09IHRydWUpIDogbnVsbDtcblx0XHRcdFx0XHRcdFx0aWYgKG9EaWFsb2cpIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBieSBkZXNpZ24sIGEgc2FwLm0uZGlhbG9nIHNldCB0aGUgZm9jdXMgdG8gdGhlIHByZXZpb3VzIGZvY3VzZWQgZWxlbWVudCB3aGVuIGNsb3NpbmcuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2Ugc2hvdWxkIHdhaXQgZm9yIHRoZSBkaWFsb2cgdG8gYmUgY2xvc2UgYmVmb3JlIHRvIGZvY3VzIGFub3RoZXIgZWxlbWVudFxuXHRcdFx0XHRcdFx0XHRcdG9EaWFsb2cuYXR0YWNoRXZlbnRPbmNlKFwiYWZ0ZXJDbG9zZVwiLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRvVGFibGUuZm9jdXNSb3coaU5ld0l0ZW1wLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRvVGFibGUuZm9jdXNSb3coaU5ld0l0ZW1wLCB0cnVlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0aGlzLl9lZGl0Rmxvdy5kZWxldGVDdXJyZW50QWN0aW9uUHJvbWlzZSgpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0LmNhdGNoKGZ1bmN0aW9uIChlcnI6IGFueSkge1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKGBBbiBlcnJvciBvY2N1cnMgd2hpbGUgc2Nyb2xsaW5nIHRvIHRoZSBuZXdseSBjcmVhdGVkIEl0ZW06ICR7ZXJyfWApO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0Ly8gZmlyZSBNb2RlbENvbnRleHRDaGFuZ2Ugb24gdGhlIG1lc3NhZ2UgYnV0dG9uIHdoZW5ldmVyIHRoZSB0YWJsZSBjb250ZXh0IGNoYW5nZXNcblx0XHRcdHRoaXMubWVzc2FnZUJ1dHRvbi5maXJlTW9kZWxDb250ZXh0Q2hhbmdlKCk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEludm9rZXMgYW4gYWN0aW9uIC0gYm91bmQvdW5ib3VuZCBhbmQgc2V0cyB0aGUgcGFnZSBkaXJ0eS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSBvVmlld1xuXHRcdCAqIEBwYXJhbSBzQWN0aW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZFxuXHRcdCAqIEBwYXJhbSBbbVBhcmFtZXRlcnNdIENvbnRhaW5zIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcblx0XHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLmNvbnRleHRzXSBNYW5kYXRvcnkgZm9yIGEgYm91bmQgYWN0aW9uLCBlaXRoZXIgb25lIGNvbnRleHQgb3IgYW4gYXJyYXkgd2l0aCBjb250ZXh0cyBmb3Igd2hpY2ggdGhlIGFjdGlvbiBpcyBjYWxsZWRcblx0XHQgKiBAcGFyYW0gW21QYXJhbWV0ZXJzLm1vZGVsXSBNYW5kYXRvcnkgZm9yIGFuIHVuYm91bmQgYWN0aW9uOyBhbiBpbnN0YW5jZSBvZiBhbiBPRGF0YSBWNCBtb2RlbFxuXHRcdCAqIEByZXR1cm5zIFRoZSBhY3Rpb24gcHJvbWlzZVxuXHRcdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHRcdCAqIEBmaW5hbFxuXHRcdCAqL1xuXHRcdG9uQ2FsbEFjdGlvbihvVmlldzogYW55LCBzQWN0aW9uTmFtZTogc3RyaW5nLCBtUGFyYW1ldGVyczogYW55KSB7XG5cdFx0XHRjb25zdCBvQ29udHJvbGxlciA9IG9WaWV3LmdldENvbnRyb2xsZXIoKTtcblx0XHRcdHJldHVybiBvQ29udHJvbGxlci5lZGl0Rmxvd1xuXHRcdFx0XHQuaW52b2tlQWN0aW9uKHNBY3Rpb25OYW1lLCBtUGFyYW1ldGVycylcblx0XHRcdFx0LnRoZW4ob0NvbnRyb2xsZXIuX3Nob3dNZXNzYWdlUG9wb3Zlci5iaW5kKG9Db250cm9sbGVyLCB1bmRlZmluZWQpKVxuXHRcdFx0XHQuY2F0Y2gob0NvbnRyb2xsZXIuX3Nob3dNZXNzYWdlUG9wb3Zlci5iaW5kKG9Db250cm9sbGVyKSk7XG5cdFx0fSxcblx0XHRvbkRhdGFQb2ludFRpdGxlUHJlc3NlZChvQ29udHJvbGxlcjogYW55LCBvU291cmNlOiBhbnksIG9NYW5pZmVzdE91dGJvdW5kOiBhbnksIHNDb250cm9sQ29uZmlnOiBhbnksIHNDb2xsZWN0aW9uUGF0aDogYW55KSB7XG5cdFx0XHRvTWFuaWZlc3RPdXRib3VuZCA9IHR5cGVvZiBvTWFuaWZlc3RPdXRib3VuZCA9PT0gXCJzdHJpbmdcIiA/IEpTT04ucGFyc2Uob01hbmlmZXN0T3V0Ym91bmQpIDogb01hbmlmZXN0T3V0Ym91bmQ7XG5cdFx0XHRjb25zdCBvVGFyZ2V0SW5mbyA9IG9NYW5pZmVzdE91dGJvdW5kW3NDb250cm9sQ29uZmlnXSxcblx0XHRcdFx0YVNlbWFudGljT2JqZWN0TWFwcGluZyA9IENvbW1vblV0aWxzLmdldFNlbWFudGljT2JqZWN0TWFwcGluZyhvVGFyZ2V0SW5mbyksXG5cdFx0XHRcdG9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHQgPSBvU291cmNlLmdldEJpbmRpbmdDb250ZXh0KCksXG5cdFx0XHRcdHNNZXRhUGF0aCA9IG9EYXRhUG9pbnRPckNoYXJ0QmluZGluZ0NvbnRleHRcblx0XHRcdFx0XHQuZ2V0TW9kZWwoKVxuXHRcdFx0XHRcdC5nZXRNZXRhTW9kZWwoKVxuXHRcdFx0XHRcdC5nZXRNZXRhUGF0aChvRGF0YVBvaW50T3JDaGFydEJpbmRpbmdDb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0XHRsZXQgYU5hdmlnYXRpb25EYXRhID0gb0NvbnRyb2xsZXIuX2dldENoYXJ0Q29udGV4dERhdGEob0RhdGFQb2ludE9yQ2hhcnRCaW5kaW5nQ29udGV4dCwgc0NvbGxlY3Rpb25QYXRoKTtcblx0XHRcdGxldCBhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnM7XG5cblx0XHRcdGFOYXZpZ2F0aW9uRGF0YSA9IGFOYXZpZ2F0aW9uRGF0YS5tYXAoZnVuY3Rpb24gKG9OYXZpZ2F0aW9uRGF0YTogYW55KSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0ZGF0YTogb05hdmlnYXRpb25EYXRhLFxuXHRcdFx0XHRcdG1ldGFQYXRoOiBzTWV0YVBhdGggKyAoc0NvbGxlY3Rpb25QYXRoID8gYC8ke3NDb2xsZWN0aW9uUGF0aH1gIDogXCJcIilcblx0XHRcdFx0fTtcblx0XHRcdH0pO1xuXHRcdFx0aWYgKG9UYXJnZXRJbmZvICYmIG9UYXJnZXRJbmZvLnBhcmFtZXRlcnMpIHtcblx0XHRcdFx0Y29uc3Qgb1BhcmFtcyA9IG9UYXJnZXRJbmZvLnBhcmFtZXRlcnMgJiYgb0NvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5nZXRPdXRib3VuZFBhcmFtcyhvVGFyZ2V0SW5mby5wYXJhbWV0ZXJzKTtcblx0XHRcdFx0aWYgKE9iamVjdC5rZXlzKG9QYXJhbXMpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnMgPSBvUGFyYW1zO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAob1RhcmdldEluZm8gJiYgb1RhcmdldEluZm8uc2VtYW50aWNPYmplY3QgJiYgb1RhcmdldEluZm8uYWN0aW9uKSB7XG5cdFx0XHRcdG9Db250cm9sbGVyLl9pbnRlbnRCYXNlZE5hdmlnYXRpb24ubmF2aWdhdGUob1RhcmdldEluZm8uc2VtYW50aWNPYmplY3QsIG9UYXJnZXRJbmZvLmFjdGlvbiwge1xuXHRcdFx0XHRcdG5hdmlnYXRpb25Db250ZXh0czogYU5hdmlnYXRpb25EYXRhLFxuXHRcdFx0XHRcdHNlbWFudGljT2JqZWN0TWFwcGluZzogYVNlbWFudGljT2JqZWN0TWFwcGluZyxcblx0XHRcdFx0XHRhZGRpdGlvbmFsTmF2aWdhdGlvblBhcmFtZXRlcnM6IGFkZGl0aW9uYWxOYXZpZ2F0aW9uUGFyYW1ldGVyc1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8qKlxuXHRcdCAqIFRyaWdnZXJzIGFuIG91dGJvdW5kIG5hdmlnYXRpb24gd2hlbiBhIHVzZXIgY2hvb3NlcyB0aGUgY2hldnJvbi5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSBvQ29udHJvbGxlclxuXHRcdCAqIEBwYXJhbSBzT3V0Ym91bmRUYXJnZXQgTmFtZSBvZiB0aGUgb3V0Ym91bmQgdGFyZ2V0IChuZWVkcyB0byBiZSBkZWZpbmVkIGluIHRoZSBtYW5pZmVzdClcblx0XHQgKiBAcGFyYW0gb0NvbnRleHQgVGhlIGNvbnRleHQgdGhhdCBjb250YWlucyB0aGUgZGF0YSBmb3IgdGhlIHRhcmdldCBhcHBcblx0XHQgKiBAcGFyYW0gc0NyZWF0ZVBhdGggQ3JlYXRlIHBhdGggd2hlbiB0aGUgY2hldnJvbiBpcyBjcmVhdGVkLlxuXHRcdCAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggaXMgcmVzb2x2ZWQgb25jZSB0aGUgbmF2aWdhdGlvbiBpcyB0cmlnZ2VyZWQgKD8/PyBtYXliZSBvbmx5IG9uY2UgZmluaXNoZWQ/KVxuXHRcdCAqIEB1aTUtcmVzdHJpY3RlZFxuXHRcdCAqIEBmaW5hbFxuXHRcdCAqL1xuXHRcdG9uQ2hldnJvblByZXNzTmF2aWdhdGVPdXRCb3VuZChvQ29udHJvbGxlcjogT2JqZWN0UGFnZUNvbnRyb2xsZXIsIHNPdXRib3VuZFRhcmdldDogc3RyaW5nLCBvQ29udGV4dDogYW55LCBzQ3JlYXRlUGF0aDogc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIuX2ludGVudEJhc2VkTmF2aWdhdGlvbi5vbkNoZXZyb25QcmVzc05hdmlnYXRlT3V0Qm91bmQob0NvbnRyb2xsZXIsIHNPdXRib3VuZFRhcmdldCwgb0NvbnRleHQsIHNDcmVhdGVQYXRoKTtcblx0XHR9LFxuXG5cdFx0b25OYXZpZ2F0ZUNoYW5nZSh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlciwgb0V2ZW50OiBhbnkpIHtcblx0XHRcdC8vd2lsbCBiZSBjYWxsZWQgYWx3YXlzIHdoZW4gd2UgY2xpY2sgb24gYSBzZWN0aW9uIHRhYlxuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdFx0dGhpcy5iU2VjdGlvbk5hdmlnYXRlZCA9IHRydWU7XG5cblx0XHRcdGNvbnN0IG9JbnRlcm5hbE1vZGVsQ29udGV4dCA9IHRoaXMuZ2V0VmlldygpLmdldEJpbmRpbmdDb250ZXh0KFwiaW50ZXJuYWxcIikgYXMgSW50ZXJuYWxNb2RlbENvbnRleHQ7XG5cdFx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IHRoaXMuX2dldE9iamVjdFBhZ2VMYXlvdXRDb250cm9sKCk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG9PYmplY3RQYWdlLmdldE1vZGVsKFwidWlcIikuZ2V0UHJvcGVydHkoXCIvaXNFZGl0YWJsZVwiKSAmJlxuXHRcdFx0XHQodGhpcy5nZXRWaWV3KCkuZ2V0Vmlld0RhdGEoKSBhcyBhbnkpLnNlY3Rpb25MYXlvdXQgPT09IFwiVGFic1wiICYmXG5cdFx0XHRcdG9JbnRlcm5hbE1vZGVsQ29udGV4dC5nZXRQcm9wZXJ0eShcImVycm9yTmF2aWdhdGlvblNlY3Rpb25GbGFnXCIpID09PSBmYWxzZVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnN0IG9TdWJTZWN0aW9uID0gb0V2ZW50LmdldFBhcmFtZXRlcihcInN1YlNlY3Rpb25cIik7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZUZvY3VzSW5FZGl0TW9kZShbb1N1YlNlY3Rpb25dKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdG9uVmFyaWFudFNlbGVjdGVkOiBmdW5jdGlvbiAodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIpIHtcblx0XHRcdHRoaXMuZ2V0RXh0ZW5zaW9uQVBJKCkudXBkYXRlQXBwU3RhdGUoKTtcblx0XHR9LFxuXHRcdG9uVmFyaWFudFNhdmVkOiBmdW5jdGlvbiAodGhpczogT2JqZWN0UGFnZUNvbnRyb2xsZXIpIHtcblx0XHRcdC8vVE9ETzogU2hvdWxkIHJlbW92ZSB0aGlzIHNldFRpbWVPdXQgb25jZSBWYXJpYW50IE1hbmFnZW1lbnQgcHJvdmlkZXMgYW4gYXBpIHRvIGZldGNoIHRoZSBjdXJyZW50IHZhcmlhbnQga2V5IG9uIHNhdmVcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLnVwZGF0ZUFwcFN0YXRlKCk7XG5cdFx0XHR9LCA1MDApO1xuXHRcdH0sXG5cdFx0bmF2aWdhdGVUb1N1YlNlY3Rpb246IGZ1bmN0aW9uIChvQ29udHJvbGxlcjogT2JqZWN0UGFnZUNvbnRyb2xsZXIsIHZEZXRhaWxDb25maWc6IGFueSkge1xuXHRcdFx0Y29uc3Qgb0RldGFpbENvbmZpZyA9IHR5cGVvZiB2RGV0YWlsQ29uZmlnID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZSh2RGV0YWlsQ29uZmlnKSA6IHZEZXRhaWxDb25maWc7XG5cdFx0XHRjb25zdCBvT2JqZWN0UGFnZSA9IG9Db250cm9sbGVyLmdldFZpZXcoKS5ieUlkKFwiZmU6Ok9iamVjdFBhZ2VcIikgYXMgT2JqZWN0UGFnZUxheW91dDtcblx0XHRcdGxldCBvU2VjdGlvbjtcblx0XHRcdGxldCBvU3ViU2VjdGlvbjtcblx0XHRcdGlmIChvRGV0YWlsQ29uZmlnLnNlY3Rpb25JZCkge1xuXHRcdFx0XHRvU2VjdGlvbiA9IG9Db250cm9sbGVyLmdldFZpZXcoKS5ieUlkKG9EZXRhaWxDb25maWcuc2VjdGlvbklkKSBhcyBPYmplY3RQYWdlU2VjdGlvbjtcblx0XHRcdFx0b1N1YlNlY3Rpb24gPSAoXG5cdFx0XHRcdFx0b0RldGFpbENvbmZpZy5zdWJTZWN0aW9uSWRcblx0XHRcdFx0XHRcdD8gb0NvbnRyb2xsZXIuZ2V0VmlldygpLmJ5SWQob0RldGFpbENvbmZpZy5zdWJTZWN0aW9uSWQpXG5cdFx0XHRcdFx0XHQ6IG9TZWN0aW9uICYmIG9TZWN0aW9uLmdldFN1YlNlY3Rpb25zKCkgJiYgb1NlY3Rpb24uZ2V0U3ViU2VjdGlvbnMoKVswXVxuXHRcdFx0XHQpIGFzIE9iamVjdFBhZ2VTdWJTZWN0aW9uO1xuXHRcdFx0fSBlbHNlIGlmIChvRGV0YWlsQ29uZmlnLnN1YlNlY3Rpb25JZCkge1xuXHRcdFx0XHRvU3ViU2VjdGlvbiA9IG9Db250cm9sbGVyLmdldFZpZXcoKS5ieUlkKG9EZXRhaWxDb25maWcuc3ViU2VjdGlvbklkKSBhcyBPYmplY3RQYWdlU3ViU2VjdGlvbjtcblx0XHRcdFx0b1NlY3Rpb24gPSBvU3ViU2VjdGlvbiAmJiAob1N1YlNlY3Rpb24uZ2V0UGFyZW50KCkgYXMgT2JqZWN0UGFnZVNlY3Rpb24pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFvU2VjdGlvbiB8fCAhb1N1YlNlY3Rpb24gfHwgIW9TZWN0aW9uLmdldFZpc2libGUoKSB8fCAhb1N1YlNlY3Rpb24uZ2V0VmlzaWJsZSgpKSB7XG5cdFx0XHRcdCgob0NvbnRyb2xsZXIuZ2V0VmlldygpLmdldE1vZGVsKFwic2FwLmZlLmkxOG5cIikgYXMgUmVzb3VyY2VNb2RlbCkuZ2V0UmVzb3VyY2VCdW5kbGUoKSBhcyBQcm9taXNlPFJlc291cmNlQnVuZGxlPilcblx0XHRcdFx0XHQudGhlbihmdW5jdGlvbiAob1Jlc291cmNlQnVuZGxlKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzVGl0bGUgPSBDb21tb25VdGlscy5nZXRUcmFuc2xhdGVkVGV4dChcblx0XHRcdFx0XHRcdFx0XCJDX1JPVVRJTkdfTkFWSUdBVElPTl9ESVNBQkxFRF9USVRMRVwiLFxuXHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VCdW5kbGUsXG5cdFx0XHRcdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdFx0KG9Db250cm9sbGVyLmdldFZpZXcoKS5nZXRWaWV3RGF0YSgpIGFzIGFueSkuZW50aXR5U2V0XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0TG9nLmVycm9yKHNUaXRsZSk7XG5cdFx0XHRcdFx0XHRNZXNzYWdlQm94LmVycm9yKHNUaXRsZSk7XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRMb2cuZXJyb3IoZXJyb3IpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b09iamVjdFBhZ2Uuc2Nyb2xsVG9TZWN0aW9uKG9TdWJTZWN0aW9uLmdldElkKCkpO1xuXHRcdFx0XHQvLyB0cmlnZ2VyIGlhcHAgc3RhdGUgY2hhbmdlXG5cdFx0XHRcdG9PYmplY3RQYWdlLmZpcmVOYXZpZ2F0ZSh7XG5cdFx0XHRcdFx0c2VjdGlvbjogb1NlY3Rpb24sXG5cdFx0XHRcdFx0c3ViU2VjdGlvbjogb1N1YlNlY3Rpb25cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRvbkNoYXJ0U2VsZWN0aW9uQ2hhbmdlZDogZnVuY3Rpb24gKG9FdmVudDogYW55KSB7XG5cdFx0XHRDaGFydFJ1bnRpbWUuZm5VcGRhdGVDaGFydChvRXZlbnQpO1xuXHRcdH0sXG5cdFx0b25TdGF0ZUNoYW5nZSh0aGlzOiBPYmplY3RQYWdlQ29udHJvbGxlcikge1xuXHRcdFx0dGhpcy5nZXRFeHRlbnNpb25BUEkoKS51cGRhdGVBcHBTdGF0ZSgpO1xuXHRcdH0sXG5cdFx0Y2xvc2VPUE1lc3NhZ2VTdHJpcDogZnVuY3Rpb24gKHRoaXM6IE9iamVjdFBhZ2VDb250cm9sbGVyKSB7XG5cdFx0XHR0aGlzLmdldEV4dGVuc2lvbkFQSSgpLmhpZGVNZXNzYWdlKCk7XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBPYmplY3RQYWdlQ29udHJvbGxlcjtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBa2pCTyxnQkFBZ0JBLElBQUksRUFBRUMsT0FBTyxFQUFFO0lBQ3JDLElBQUk7TUFDSCxJQUFJQyxNQUFNLEdBQUdGLElBQUksRUFBRTtJQUNwQixDQUFDLENBQUMsT0FBTUcsQ0FBQyxFQUFFO01BQ1YsT0FBT0YsT0FBTyxDQUFDRSxDQUFDLENBQUM7SUFDbEI7SUFDQSxJQUFJRCxNQUFNLElBQUlBLE1BQU0sQ0FBQ0UsSUFBSSxFQUFFO01BQzFCLE9BQU9GLE1BQU0sQ0FBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFSCxPQUFPLENBQUM7SUFDcEM7SUFDQSxPQUFPQyxNQUFNO0VBQ2Q7RUFHTywwQkFBMEJGLElBQUksRUFBRUssU0FBUyxFQUFFO0lBQ2pELElBQUk7TUFDSCxJQUFJSCxNQUFNLEdBQUdGLElBQUksRUFBRTtJQUNwQixDQUFDLENBQUMsT0FBT0csQ0FBQyxFQUFFO01BQ1gsT0FBT0UsU0FBUyxDQUFDLElBQUksRUFBRUYsQ0FBQyxDQUFDO0lBQzFCO0lBQ0EsSUFBSUQsTUFBTSxJQUFJQSxNQUFNLENBQUNFLElBQUksRUFBRTtNQUMxQixPQUFPRixNQUFNLENBQUNFLElBQUksQ0FBQ0MsU0FBUyxDQUFDQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFRCxTQUFTLENBQUNDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUU7SUFD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
|