@sapui5/sap.fe.core 1.99.0 → 1.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -2
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AnnotationHelper.js +1 -69
- package/src/sap/fe/core/AnnotationHelper.ts +0 -70
- package/src/sap/fe/core/AppComponent.js +388 -399
- package/src/sap/fe/core/AppComponent.ts +403 -0
- package/src/sap/fe/core/AppStateHandler.js +127 -158
- package/src/sap/fe/core/BaseController.js +82 -58
- package/src/sap/fe/core/BaseController.ts +68 -0
- package/src/sap/fe/core/CommonUtils.js +111 -20
- package/src/sap/fe/core/CommonUtils.ts +131 -32
- package/src/sap/fe/core/ExtensionAPI.js +278 -274
- package/src/sap/fe/core/ExtensionAPI.ts +250 -0
- package/src/sap/fe/core/PageController.js +157 -29
- package/src/sap/fe/core/PageController.ts +60 -32
- package/src/sap/fe/core/RouterProxy.js +694 -756
- package/src/sap/fe/core/RouterProxy.ts +11 -9
- package/src/sap/fe/core/Synchronization.js +21 -31
- package/src/sap/fe/core/TemplateComponent.js +1 -1
- package/src/sap/fe/core/TemplateComponent.ts +10 -3
- package/src/sap/fe/core/TemplateModel.js +20 -38
- package/src/sap/fe/core/TemplateModel.ts +1 -1
- package/src/sap/fe/core/TransactionHelper.js +1354 -1370
- package/src/sap/fe/core/TransactionHelper.ts +33 -22
- package/src/sap/fe/core/actions/collaboration/ActivitySync.js +392 -0
- package/src/sap/fe/core/actions/collaboration/ActivitySync.ts +355 -0
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.js +136 -0
- package/src/sap/fe/core/actions/collaboration/CollaborationCommon.ts +119 -0
- package/src/sap/fe/core/actions/collaboration/Manage.js +262 -0
- package/src/sap/fe/core/actions/collaboration/Manage.ts +244 -0
- package/src/sap/fe/core/actions/collaboration/ManageDialog.fragment.xml +103 -0
- package/src/sap/fe/core/actions/collaboration/UserDetails.fragment.xml +13 -0
- package/src/sap/fe/core/actions/draft.js +30 -68
- package/src/sap/fe/core/actions/draft.ts +44 -71
- package/src/sap/fe/core/actions/messageHandling.js +55 -36
- package/src/sap/fe/core/actions/messageHandling.ts +66 -46
- package/src/sap/fe/core/actions/operations.js +34 -15
- package/src/sap/fe/core/actions/operations.ts +48 -18
- package/src/sap/fe/core/actions/sticky.js +17 -4
- package/src/sap/fe/core/actions/sticky.ts +21 -4
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +69 -66
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.ts +65 -0
- package/src/sap/fe/core/controllerextensions/EditFlow.js +1593 -1669
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +1672 -0
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +79 -54
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +61 -0
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +718 -779
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.ts +783 -0
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +796 -816
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +803 -0
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +1004 -1005
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +978 -0
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +487 -521
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +2 -2
- package/src/sap/fe/core/controllerextensions/MassEdit.js +141 -169
- package/src/sap/fe/core/controllerextensions/MassEdit.ts +156 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +233 -244
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +225 -0
- package/src/sap/fe/core/controllerextensions/PageReady.js +301 -336
- package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -10
- package/src/sap/fe/core/controllerextensions/Paginator.js +188 -175
- package/src/sap/fe/core/controllerextensions/Paginator.ts +163 -0
- package/src/sap/fe/core/controllerextensions/Placeholder.js +157 -149
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +151 -0
- package/src/sap/fe/core/controllerextensions/Routing.js +144 -125
- package/src/sap/fe/core/controllerextensions/Routing.ts +132 -0
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +7 -6
- package/src/sap/fe/core/controllerextensions/RoutingListener.ts +3 -0
- package/src/sap/fe/core/controllerextensions/Share.js +230 -268
- package/src/sap/fe/core/controllerextensions/Share.ts +231 -0
- package/src/sap/fe/core/controllerextensions/SideEffects.js +592 -633
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +8 -7
- package/src/sap/fe/core/controllerextensions/ViewState.js +788 -806
- package/src/sap/fe/core/controllerextensions/ViewState.ts +805 -0
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -2
- package/src/sap/fe/core/controls/ActionPartial.fragment.xml +2 -2
- package/src/sap/fe/core/controls/CommandExecution.js +67 -66
- package/src/sap/fe/core/controls/CommandExecution.ts +72 -0
- package/src/sap/fe/core/controls/ConditionalWrapper.js +90 -75
- package/src/sap/fe/core/controls/ConditionalWrapper.ts +83 -0
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +130 -125
- package/src/sap/fe/core/controls/CustomQuickViewPage.ts +126 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +103 -112
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.ts +101 -0
- package/src/sap/fe/core/controls/FieldWrapper.js +122 -135
- package/src/sap/fe/core/controls/FieldWrapper.ts +115 -0
- package/src/sap/fe/core/controls/FilterBar.js +162 -159
- package/src/sap/fe/core/controls/FilterBar.ts +143 -0
- package/src/sap/fe/core/controls/FormElementWrapper.js +45 -39
- package/src/sap/fe/core/controls/FormElementWrapper.ts +40 -0
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +37 -42
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.ts +31 -0
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +126 -116
- package/src/sap/fe/core/controls/filterbar/FilterContainer.ts +98 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +241 -255
- package/src/sap/fe/core/controls/filterbar/VisualFilter.ts +245 -0
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +150 -141
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.ts +125 -0
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +335 -322
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.ts +337 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +74 -74
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.ts +70 -0
- package/src/sap/fe/core/converters/ConverterContext.js +348 -379
- package/src/sap/fe/core/converters/ConverterContext.ts +19 -16
- package/src/sap/fe/core/converters/ManifestSettings.js +12 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +12 -1
- package/src/sap/fe/core/converters/ManifestWrapper.js +354 -378
- package/src/sap/fe/core/converters/ManifestWrapper.ts +10 -0
- package/src/sap/fe/core/converters/MetaModelConverter.js +6 -4
- package/src/sap/fe/core/converters/MetaModelConverter.ts +5 -2
- package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
- package/src/sap/fe/core/converters/TemplateConverter.ts +2 -1
- package/src/sap/fe/core/converters/annotations/DataField.js +26 -12
- package/src/sap/fe/core/converters/annotations/DataField.ts +37 -13
- package/src/sap/fe/core/converters/controls/Common/Form.js +2 -2
- package/src/sap/fe/core/converters/controls/Common/Form.ts +4 -2
- package/src/sap/fe/core/converters/controls/Common/KPI.js +1 -1
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +3 -2
- package/src/sap/fe/core/converters/controls/Common/Table.js +130 -23
- package/src/sap/fe/core/converters/controls/Common/Table.ts +134 -29
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +118 -53
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +156 -93
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +161 -207
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +148 -206
- package/src/sap/fe/core/converters/helpers/Aggregation.js +115 -133
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +20 -6
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +16 -4
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +12 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +11 -0
- package/src/sap/fe/core/converters/helpers/Key.js +42 -57
- package/src/sap/fe/core/converters/helpers/Key.ts +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +25 -4
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +20 -3
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +10 -4
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +15 -4
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +7 -5
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +5 -1
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +92 -98
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +91 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +104 -0
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +60 -0
- package/src/sap/fe/core/formatters/TableFormatter.js +53 -2
- package/src/sap/fe/core/formatters/TableFormatter.ts +51 -0
- package/src/sap/fe/core/fpm/Component.js +50 -54
- package/src/sap/fe/core/fpm/Component.ts +48 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.js +323 -309
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +363 -337
- package/src/sap/fe/core/helpers/BindingExpression.js +7 -7
- package/src/sap/fe/core/helpers/BindingExpression.ts +7 -7
- package/src/sap/fe/core/helpers/ClassSupport.js +186 -62
- package/src/sap/fe/core/helpers/ClassSupport.ts +168 -52
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +5 -4
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +1 -5
- package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
- package/src/sap/fe/core/helpers/FPMHelper.ts +1 -1
- package/src/sap/fe/core/helpers/MassEditHelper.js +601 -684
- package/src/sap/fe/core/helpers/MassEditHelper.ts +699 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +25 -1
- package/src/sap/fe/core/helpers/ModelHelper.ts +23 -0
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +5 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.ts +4 -0
- package/src/sap/fe/core/library.js +426 -451
- package/src/sap/fe/core/library.support.js +22 -33
- package/src/sap/fe/core/library.support.ts +23 -0
- package/src/sap/fe/core/library.ts +420 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +5 -3
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +4 -1
- package/src/sap/fe/core/messagebundle.properties +22 -5
- package/src/sap/fe/core/messagebundle_ar.properties +27 -7
- package/src/sap/fe/core/messagebundle_bg.properties +27 -7
- package/src/sap/fe/core/messagebundle_ca.properties +27 -7
- package/src/sap/fe/core/messagebundle_cs.properties +27 -7
- package/src/sap/fe/core/messagebundle_cy.properties +27 -7
- package/src/sap/fe/core/messagebundle_da.properties +27 -7
- package/src/sap/fe/core/messagebundle_de.properties +27 -7
- package/src/sap/fe/core/messagebundle_el.properties +27 -7
- package/src/sap/fe/core/messagebundle_en.properties +27 -7
- package/src/sap/fe/core/messagebundle_en_GB.properties +27 -7
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +27 -7
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +27 -7
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +27 -7
- package/src/sap/fe/core/messagebundle_es.properties +27 -7
- package/src/sap/fe/core/messagebundle_es_MX.properties +27 -7
- package/src/sap/fe/core/messagebundle_et.properties +27 -7
- package/src/sap/fe/core/messagebundle_fi.properties +28 -8
- package/src/sap/fe/core/messagebundle_fr.properties +28 -8
- package/src/sap/fe/core/messagebundle_fr_CA.properties +29 -9
- package/src/sap/fe/core/messagebundle_hi.properties +27 -7
- package/src/sap/fe/core/messagebundle_hr.properties +27 -7
- package/src/sap/fe/core/messagebundle_hu.properties +27 -7
- package/src/sap/fe/core/messagebundle_id.properties +27 -7
- package/src/sap/fe/core/messagebundle_it.properties +27 -7
- package/src/sap/fe/core/messagebundle_iw.properties +27 -7
- package/src/sap/fe/core/messagebundle_ja.properties +26 -6
- package/src/sap/fe/core/messagebundle_kk.properties +27 -7
- package/src/sap/fe/core/messagebundle_ko.properties +27 -7
- package/src/sap/fe/core/messagebundle_lt.properties +27 -7
- package/src/sap/fe/core/messagebundle_lv.properties +28 -8
- package/src/sap/fe/core/messagebundle_ms.properties +27 -7
- package/src/sap/fe/core/messagebundle_nl.properties +27 -7
- package/src/sap/fe/core/messagebundle_no.properties +27 -7
- package/src/sap/fe/core/messagebundle_pl.properties +27 -7
- package/src/sap/fe/core/messagebundle_pt.properties +28 -8
- package/src/sap/fe/core/messagebundle_pt_PT.properties +27 -7
- package/src/sap/fe/core/messagebundle_ro.properties +27 -7
- package/src/sap/fe/core/messagebundle_ru.properties +27 -7
- package/src/sap/fe/core/messagebundle_sh.properties +27 -7
- package/src/sap/fe/core/messagebundle_sk.properties +27 -7
- package/src/sap/fe/core/messagebundle_sl.properties +27 -7
- package/src/sap/fe/core/messagebundle_sv.properties +27 -7
- package/src/sap/fe/core/messagebundle_th.properties +26 -6
- package/src/sap/fe/core/messagebundle_tr.properties +30 -10
- package/src/sap/fe/core/messagebundle_uk.properties +27 -7
- package/src/sap/fe/core/messagebundle_vi.properties +27 -7
- package/src/sap/fe/core/messagebundle_zh_CN.properties +27 -7
- package/src/sap/fe/core/messagebundle_zh_TW.properties +27 -7
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +45 -71
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +154 -192
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +4 -4
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +66 -92
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/NavigationServiceFactory.js +284 -339
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +10 -13
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +67 -102
- package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +5 -2
- package/src/sap/fe/core/services/RoutingServiceFactory.js +754 -814
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +13 -13
- package/src/sap/fe/core/services/ShellServicesFactory.js +649 -736
- package/src/sap/fe/core/services/ShellServicesFactory.ts +7 -4
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +567 -592
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +22 -3
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +354 -386
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +21 -14
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +1 -1
- package/src/sap/fe/core/support/CommonHelper.js +1 -1
- package/src/sap/fe/core/support/CommonHelper.ts +1 -1
- package/src/sap/fe/core/support/Diagnostics.js +36 -48
- package/src/sap/fe/core/templating/DataModelPathHelper.js +93 -85
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +104 -95
- package/src/sap/fe/core/templating/FilterHelper.js +25 -32
- package/src/sap/fe/core/templating/FilterHelper.ts +36 -35
- package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
- package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
- package/src/sap/fe/core/templating/UIFormatters.js +32 -26
- package/src/sap/fe/core/templating/UIFormatters.ts +37 -24
|
@@ -13,698 +13,657 @@ sap.ui.define(["sap/ui/core/mvc/ControllerExtension", "sap/fe/core/controllerext
|
|
|
13
13
|
var Override = ClassSupport.Override;
|
|
14
14
|
var UI5Class = ClassSupport.UI5Class;
|
|
15
15
|
|
|
16
|
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
17
|
-
|
|
18
|
-
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
19
|
-
|
|
20
|
-
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
|
21
|
-
|
|
22
16
|
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
|
|
23
17
|
|
|
24
18
|
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
25
19
|
|
|
26
|
-
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
|
27
|
-
|
|
28
|
-
function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
|
|
29
|
-
|
|
30
|
-
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
31
|
-
|
|
32
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
33
|
-
|
|
34
|
-
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
|
35
|
-
|
|
36
20
|
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; }
|
|
37
21
|
|
|
38
22
|
var SideEffectsControllerExtension = (_dec = UI5Class("sap.fe.core.controllerextensions.SideEffects", ControllerExtensionMetadata), _dec2 = Override(), _dec(_class = (_class2 = /*#__PURE__*/function (_ControllerExtension) {
|
|
39
23
|
_inherits(SideEffectsControllerExtension, _ControllerExtension);
|
|
40
24
|
|
|
41
|
-
var _super = _createSuper(SideEffectsControllerExtension);
|
|
42
|
-
|
|
43
25
|
function SideEffectsControllerExtension() {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return _super.apply(this, arguments);
|
|
26
|
+
return _ControllerExtension.apply(this, arguments) || this;
|
|
47
27
|
}
|
|
48
28
|
|
|
49
|
-
|
|
50
|
-
key: "onInit",
|
|
51
|
-
value: function onInit() {
|
|
52
|
-
this._oView = this.base.getView();
|
|
53
|
-
this._oAppComponent = CommonUtils.getAppComponent(this._oView);
|
|
54
|
-
this._oSideEffectsService = this._oAppComponent.getSideEffectsService();
|
|
55
|
-
this._mFieldGroupQueue = {};
|
|
56
|
-
this._aSourcePropertiesFailure = new Set();
|
|
57
|
-
this._mFailedSideEffects = {};
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Clear recorded validation status for all properties.
|
|
61
|
-
*
|
|
62
|
-
* @function
|
|
63
|
-
* @name clearPropertiesStatus
|
|
64
|
-
*/
|
|
65
|
-
|
|
66
|
-
}, {
|
|
67
|
-
key: "clearPropertiesStatus",
|
|
68
|
-
value: function clearPropertiesStatus() {
|
|
69
|
-
this._aSourcePropertiesFailure.clear();
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Gets failed SideEffects.
|
|
73
|
-
*
|
|
74
|
-
* @function
|
|
75
|
-
* @name getRegisteredFailedRequests
|
|
76
|
-
* @returns {object} Registered SideEffects requests that have failed
|
|
77
|
-
*/
|
|
78
|
-
|
|
79
|
-
}, {
|
|
80
|
-
key: "getRegisteredFailedRequests",
|
|
81
|
-
value: function getRegisteredFailedRequests() {
|
|
82
|
-
return this._mFailedSideEffects;
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Manages the workflow for SideEffects with related changes to a field
|
|
86
|
-
* The following scenarios are managed:
|
|
87
|
-
* - Execute: triggers immediate SideEffects requests if the promise for the field event is fulfilled
|
|
88
|
-
* - Register: caches deferred SideEffects that will be executed when the FieldGroup is unfocused.
|
|
89
|
-
*
|
|
90
|
-
* @function
|
|
91
|
-
* @name handleFieldChange
|
|
92
|
-
* @param {object} oEvent SAPUI5 event that comes from a field change
|
|
93
|
-
* @param {object} oFieldGroupPreRequisite Promise to be fulfilled before executing deferred SideEffects
|
|
94
|
-
* @returns {object} Promise on SideEffects request(s)
|
|
95
|
-
*/
|
|
96
|
-
|
|
97
|
-
}, {
|
|
98
|
-
key: "handleFieldChange",
|
|
99
|
-
value: function handleFieldChange(oEvent, oFieldGroupPreRequisite) {
|
|
100
|
-
var _this = this;
|
|
101
|
-
|
|
102
|
-
var mEventFieldProperties = this._getFieldProperties(oEvent),
|
|
103
|
-
aImmediateSideEffectsProperties = this._initializeFieldSideEffects(mEventFieldProperties, oFieldGroupPreRequisite);
|
|
104
|
-
|
|
105
|
-
var bIsImmediateTriggered = false;
|
|
106
|
-
return this._generateImmediatePromise(mEventFieldProperties).then(function () {
|
|
107
|
-
bIsImmediateTriggered = true;
|
|
108
|
-
return Promise.all(aImmediateSideEffectsProperties.map(function (mSideEffectsProperty) {
|
|
109
|
-
return _this.requestSideEffects(mSideEffectsProperty.sideEffects, mSideEffectsProperty.context);
|
|
110
|
-
}) || []);
|
|
111
|
-
}).catch(function (oError) {
|
|
112
|
-
if (bIsImmediateTriggered) {
|
|
113
|
-
Log.debug("Error while processing Field SideEffects", oError);
|
|
114
|
-
} else {
|
|
115
|
-
/**
|
|
116
|
-
* SideEffects have not been triggered since preRequisite validation fails so we need
|
|
117
|
-
* to keep previously failed request as Failed request (to be retrigger on next change)
|
|
118
|
-
*/
|
|
119
|
-
aImmediateSideEffectsProperties.filter(function (mImmediateSideEffects) {
|
|
120
|
-
return mImmediateSideEffects.previouslyFailed === true;
|
|
121
|
-
}).forEach(function (mImmediateSideEffects) {
|
|
122
|
-
return _this._addFailedSideEffects(mImmediateSideEffects.sideEffects, mImmediateSideEffects.context);
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Manages SideEffects with a related 'focus out' to a field group.
|
|
129
|
-
*
|
|
130
|
-
* @function
|
|
131
|
-
* @name handleFieldGroupChange
|
|
132
|
-
* @param {object} oEvent SAPUI5 Event
|
|
133
|
-
* @returns {object} Promise on SideEffects request(s)
|
|
134
|
-
*/
|
|
135
|
-
|
|
136
|
-
}, {
|
|
137
|
-
key: "handleFieldGroupChange",
|
|
138
|
-
value: function handleFieldGroupChange(oEvent) {
|
|
139
|
-
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
140
|
-
var that = this,
|
|
141
|
-
aDeferredSideEffects = [],
|
|
142
|
-
aFieldGroupIds = oEvent.getParameter("fieldGroupIds");
|
|
143
|
-
|
|
144
|
-
var getFieldGroupRequestPromise = function (oDeferredSideEffect) {
|
|
145
|
-
var bIsRequestsTriggered = false;
|
|
146
|
-
var oSideEffectProperty = oDeferredSideEffect.sideEffectProperty;
|
|
147
|
-
var oContext = oSideEffectProperty.context;
|
|
148
|
-
var sContextPath = oContext.getPath();
|
|
149
|
-
|
|
150
|
-
var sEntityType = that._oSideEffectsService.getEntityTypeFromContext(oContext);
|
|
151
|
-
|
|
152
|
-
var mEntityType = that._getEntityTypeFromFQN(sEntityType);
|
|
153
|
-
|
|
154
|
-
return Promise.all(oDeferredSideEffect.promises).then(function () {
|
|
155
|
-
bIsRequestsTriggered = true; //Deferred SideEffects are executed only if all sourceProperties have no registered failure.
|
|
156
|
-
|
|
157
|
-
if (mEntityType && oSideEffectProperty.sideEffects.SourceProperties.every(function (sourceProperty) {
|
|
158
|
-
if (sourceProperty.type === "PropertyPath") {
|
|
159
|
-
var sId = that._generateStatusIndex(mEntityType, sourceProperty.value, oContext);
|
|
160
|
-
|
|
161
|
-
if (sId) {
|
|
162
|
-
return !that._aSourcePropertiesFailure.has(sId);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
return true;
|
|
167
|
-
})) {
|
|
168
|
-
return that.requestSideEffects(oSideEffectProperty.sideEffects, oSideEffectProperty.context);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
return null;
|
|
172
|
-
}).catch(function (oError) {
|
|
173
|
-
if (bIsRequestsTriggered) {
|
|
174
|
-
Log.debug("Error while processing FieldGroup SideEffects on context " + sContextPath, oError);
|
|
175
|
-
}
|
|
176
|
-
}).finally(function () {
|
|
177
|
-
delete that._mFieldGroupQueue[oSideEffectProperty.name][sContextPath];
|
|
178
|
-
});
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
aFieldGroupIds.forEach(function (sFieldGroupId) {
|
|
182
|
-
var _that$_mFieldGroupQue;
|
|
29
|
+
var _proto = SideEffectsControllerExtension.prototype;
|
|
183
30
|
|
|
31
|
+
_proto.onInit = function onInit() {
|
|
32
|
+
this._oView = this.base.getView();
|
|
33
|
+
this._oAppComponent = CommonUtils.getAppComponent(this._oView);
|
|
34
|
+
this._oSideEffectsService = this._oAppComponent.getSideEffectsService();
|
|
35
|
+
this._mFieldGroupQueue = {};
|
|
36
|
+
this._aSourcePropertiesFailure = new Set();
|
|
37
|
+
this._mFailedSideEffects = {};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Clear recorded validation status for all properties.
|
|
41
|
+
*
|
|
42
|
+
* @function
|
|
43
|
+
* @name clearPropertiesStatus
|
|
44
|
+
*/
|
|
45
|
+
;
|
|
46
|
+
|
|
47
|
+
_proto.clearPropertiesStatus = function clearPropertiesStatus() {
|
|
48
|
+
this._aSourcePropertiesFailure.clear();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Gets failed SideEffects.
|
|
52
|
+
*
|
|
53
|
+
* @function
|
|
54
|
+
* @name getRegisteredFailedRequests
|
|
55
|
+
* @returns {object} Registered SideEffects requests that have failed
|
|
56
|
+
*/
|
|
57
|
+
;
|
|
58
|
+
|
|
59
|
+
_proto.getRegisteredFailedRequests = function getRegisteredFailedRequests() {
|
|
60
|
+
return this._mFailedSideEffects;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Manages the workflow for SideEffects with related changes to a field
|
|
64
|
+
* The following scenarios are managed:
|
|
65
|
+
* - Execute: triggers immediate SideEffects requests if the promise for the field event is fulfilled
|
|
66
|
+
* - Register: caches deferred SideEffects that will be executed when the FieldGroup is unfocused.
|
|
67
|
+
*
|
|
68
|
+
* @function
|
|
69
|
+
* @name handleFieldChange
|
|
70
|
+
* @param {object} oEvent SAPUI5 event that comes from a field change
|
|
71
|
+
* @param {object} oFieldGroupPreRequisite Promise to be fulfilled before executing deferred SideEffects
|
|
72
|
+
* @returns {object} Promise on SideEffects request(s)
|
|
73
|
+
*/
|
|
74
|
+
;
|
|
75
|
+
|
|
76
|
+
_proto.handleFieldChange = function handleFieldChange(oEvent, oFieldGroupPreRequisite) {
|
|
77
|
+
var _this = this;
|
|
78
|
+
|
|
79
|
+
var mEventFieldProperties = this._getFieldProperties(oEvent),
|
|
80
|
+
aImmediateSideEffectsProperties = this._initializeFieldSideEffects(mEventFieldProperties, oFieldGroupPreRequisite);
|
|
81
|
+
|
|
82
|
+
var bIsImmediateTriggered = false;
|
|
83
|
+
return this._generateImmediatePromise(mEventFieldProperties).then(function () {
|
|
84
|
+
bIsImmediateTriggered = true;
|
|
85
|
+
return Promise.all(aImmediateSideEffectsProperties.map(function (mSideEffectsProperty) {
|
|
86
|
+
return _this.requestSideEffects(mSideEffectsProperty.sideEffects, mSideEffectsProperty.context);
|
|
87
|
+
}) || []);
|
|
88
|
+
}).catch(function (oError) {
|
|
89
|
+
if (bIsImmediateTriggered) {
|
|
90
|
+
Log.debug("Error while processing Field SideEffects", oError);
|
|
91
|
+
} else {
|
|
184
92
|
/**
|
|
185
|
-
*
|
|
186
|
-
*
|
|
187
|
-
* be deferred (on field group focus out)
|
|
188
|
-
*
|
|
93
|
+
* SideEffects have not been triggered since preRequisite validation fails so we need
|
|
94
|
+
* to keep previously failed request as Failed request (to be retrigger on next change)
|
|
189
95
|
*/
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
96
|
+
aImmediateSideEffectsProperties.filter(function (mImmediateSideEffects) {
|
|
97
|
+
return mImmediateSideEffects.previouslyFailed === true;
|
|
98
|
+
}).forEach(function (mImmediateSideEffects) {
|
|
99
|
+
return _this._addFailedSideEffects(mImmediateSideEffects.sideEffects, mImmediateSideEffects.context);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Manages SideEffects with a related 'focus out' to a field group.
|
|
106
|
+
*
|
|
107
|
+
* @function
|
|
108
|
+
* @name handleFieldGroupChange
|
|
109
|
+
* @param {object} oEvent SAPUI5 Event
|
|
110
|
+
* @returns {object} Promise on SideEffects request(s)
|
|
111
|
+
*/
|
|
112
|
+
;
|
|
113
|
+
|
|
114
|
+
_proto.handleFieldGroupChange = function handleFieldGroupChange(oEvent) {
|
|
115
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
116
|
+
var that = this,
|
|
117
|
+
aDeferredSideEffects = [],
|
|
118
|
+
aFieldGroupIds = oEvent.getParameter("fieldGroupIds");
|
|
119
|
+
|
|
120
|
+
var getFieldGroupRequestPromise = function (oDeferredSideEffect) {
|
|
121
|
+
var bIsRequestsTriggered = false;
|
|
122
|
+
var oSideEffectProperty = oDeferredSideEffect.sideEffectProperty;
|
|
123
|
+
var oContext = oSideEffectProperty.context;
|
|
124
|
+
var sContextPath = oContext.getPath();
|
|
196
125
|
|
|
197
|
-
|
|
198
|
-
oDeferredSideEffect.processStarted = true;
|
|
199
|
-
aDeferredSideEffects.push(oDeferredSideEffect);
|
|
200
|
-
}
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
});
|
|
204
|
-
return Promise.all(aDeferredSideEffects.map(function (oDeferredSideEffect) {
|
|
205
|
-
return getFieldGroupRequestPromise(oDeferredSideEffect);
|
|
206
|
-
}));
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* Adds a SideEffects control.
|
|
210
|
-
*
|
|
211
|
-
* @function
|
|
212
|
-
* @name addControlSideEffects
|
|
213
|
-
* @param {string} sEntityType Name of the entity where the SideEffects control will be registered
|
|
214
|
-
* @param {object} oSideEffects SideEffects to register. Ensure the sourceControlId matches the associated SAPUI5 control ID.
|
|
215
|
-
*
|
|
216
|
-
*/
|
|
217
|
-
|
|
218
|
-
}, {
|
|
219
|
-
key: "addControlSideEffects",
|
|
220
|
-
value: function addControlSideEffects(sEntityType, oSideEffects) {
|
|
221
|
-
this._oSideEffectsService.addControlSideEffects(sEntityType, oSideEffects);
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* Removes the queue containing the failed SideEffects.
|
|
225
|
-
*
|
|
226
|
-
* @function
|
|
227
|
-
* @name removeFailedSideEffects
|
|
228
|
-
*/
|
|
229
|
-
|
|
230
|
-
}, {
|
|
231
|
-
key: "removeFailedSideEffects",
|
|
232
|
-
value: function removeFailedSideEffects() {
|
|
233
|
-
this._mFailedSideEffects = {};
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Request SideEffects on a specific context.
|
|
237
|
-
*
|
|
238
|
-
* @function
|
|
239
|
-
* @name requestSideEffects
|
|
240
|
-
* @param {object} oSideEffects SideEffects to be executed
|
|
241
|
-
* @param {object} oContext Context where SideEffects need to be executed
|
|
242
|
-
* @returns {object} SideEffects request on SAPUI5 context
|
|
243
|
-
*/
|
|
244
|
-
|
|
245
|
-
}, {
|
|
246
|
-
key: "requestSideEffects",
|
|
247
|
-
value: function requestSideEffects(oSideEffects, oContext) {
|
|
248
|
-
var _this2 = this;
|
|
249
|
-
|
|
250
|
-
var fResolver, fRejector;
|
|
251
|
-
var oPromise = new Promise(function (resolve, reject) {
|
|
252
|
-
fResolver = resolve;
|
|
253
|
-
fRejector = reject;
|
|
254
|
-
});
|
|
255
|
-
var aTargets = (oSideEffects.TargetEntities || []).concat(oSideEffects.TargetProperties || []),
|
|
256
|
-
sTriggerAction = oSideEffects.TriggerAction;
|
|
126
|
+
var sEntityType = that._oSideEffectsService.getEntityTypeFromContext(oContext);
|
|
257
127
|
|
|
258
|
-
|
|
259
|
-
this._oSideEffectsService.executeAction(sTriggerAction, oContext);
|
|
260
|
-
}
|
|
128
|
+
var mEntityType = that._getEntityTypeFromFQN(sEntityType);
|
|
261
129
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
}).catch(function (oError) {
|
|
265
|
-
_this2._addFailedSideEffects(oSideEffects, oContext);
|
|
130
|
+
return Promise.all(oDeferredSideEffect.promises).then(function () {
|
|
131
|
+
bIsRequestsTriggered = true; //Deferred SideEffects are executed only if all sourceProperties have no registered failure.
|
|
266
132
|
|
|
267
|
-
|
|
268
|
-
|
|
133
|
+
if (mEntityType && oSideEffectProperty.sideEffects.SourceProperties.every(function (sourceProperty) {
|
|
134
|
+
if (sourceProperty.type === "PropertyPath") {
|
|
135
|
+
var sId = that._generateStatusIndex(mEntityType, sourceProperty.value, oContext);
|
|
269
136
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
*
|
|
275
|
-
* @function
|
|
276
|
-
* @name removeControlSideEffects
|
|
277
|
-
* @param {object} oControl SAPUI5 Control
|
|
278
|
-
*/
|
|
279
|
-
|
|
280
|
-
}, {
|
|
281
|
-
key: "removeControlSideEffects",
|
|
282
|
-
value: function removeControlSideEffects(oControl) {
|
|
283
|
-
var sControlId = oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject") && oControl.getId();
|
|
284
|
-
|
|
285
|
-
if (sControlId) {
|
|
286
|
-
this._oSideEffectsService.removeControlSideEffects(sControlId);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
/**
|
|
290
|
-
* Adds SideEffects to the queue of the failed SideEffects
|
|
291
|
-
* The SideEffects will be retriggered on the next change on the same context.
|
|
292
|
-
*
|
|
293
|
-
* @function
|
|
294
|
-
* @name _addFailedSideEffects
|
|
295
|
-
* @param {object} oSideEffects SideEffects that need to be retriggered
|
|
296
|
-
* @param {object} oContext Context where SideEffects have failed
|
|
297
|
-
*/
|
|
298
|
-
|
|
299
|
-
}, {
|
|
300
|
-
key: "_addFailedSideEffects",
|
|
301
|
-
value: function _addFailedSideEffects(oSideEffects, oContext) {
|
|
302
|
-
var sContextPath = oContext.getPath();
|
|
303
|
-
this._mFailedSideEffects[sContextPath] = this._mFailedSideEffects[sContextPath] || [];
|
|
137
|
+
if (sId) {
|
|
138
|
+
return !that._aSourcePropertiesFailure.has(sId);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
304
141
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
142
|
+
return true;
|
|
143
|
+
})) {
|
|
144
|
+
return that.requestSideEffects(oSideEffectProperty.sideEffects, oSideEffectProperty.context);
|
|
145
|
+
}
|
|
308
146
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
* Generates the promise for the field group that is required before requesting SideEffects.
|
|
315
|
-
* If the promise is rejected and only the field requires the SideEffects on this context, the SideEffects are removed from the
|
|
316
|
-
* SideEffects queue.
|
|
317
|
-
*
|
|
318
|
-
* @function
|
|
319
|
-
* @name _generateFieldGroupPromise
|
|
320
|
-
* @param {object} mEventFieldProperties Field properties
|
|
321
|
-
* @returns {object} Promise to be used for the validation of the field
|
|
322
|
-
*/
|
|
323
|
-
|
|
324
|
-
}, {
|
|
325
|
-
key: "_generateFieldGroupPromise",
|
|
326
|
-
value: function _generateFieldGroupPromise(mEventFieldProperties) {
|
|
327
|
-
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
328
|
-
var that = this;
|
|
329
|
-
var bPromiseSuccess = true;
|
|
330
|
-
return mEventFieldProperties.promise.then(function () {
|
|
331
|
-
return bPromiseSuccess;
|
|
332
|
-
}).catch(function () {
|
|
333
|
-
bPromiseSuccess = false;
|
|
334
|
-
return bPromiseSuccess;
|
|
147
|
+
return null;
|
|
148
|
+
}).catch(function (oError) {
|
|
149
|
+
if (bIsRequestsTriggered) {
|
|
150
|
+
Log.debug("Error while processing FieldGroup SideEffects on context " + sContextPath, oError);
|
|
151
|
+
}
|
|
335
152
|
}).finally(function () {
|
|
336
|
-
|
|
337
|
-
* Need to store the status of properties related to this field for deferred SideEffects
|
|
338
|
-
* since all SourceProperties for this kind of SideEffects must be valid
|
|
339
|
-
*/
|
|
340
|
-
that._saveFieldPropertiesStatus(mEventFieldProperties.field, bPromiseSuccess);
|
|
153
|
+
delete that._mFieldGroupQueue[oSideEffectProperty.name][sContextPath];
|
|
341
154
|
});
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
aFieldGroupIds.forEach(function (sFieldGroupId) {
|
|
158
|
+
var _that$_mFieldGroupQue;
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* string "$$ImmediateRequest" is added to the SideEffects name during templating to know
|
|
162
|
+
* if this SideEffects must be immediately executed requested (on field change) or must
|
|
163
|
+
* be deferred (on field group focus out)
|
|
164
|
+
*
|
|
165
|
+
*/
|
|
166
|
+
var sSideEffectName = sFieldGroupId.replace("$$ImmediateRequest", "");
|
|
167
|
+
var mContextDeferredSideEffects = (_that$_mFieldGroupQue = that._mFieldGroupQueue) === null || _that$_mFieldGroupQue === void 0 ? void 0 : _that$_mFieldGroupQue[sSideEffectName];
|
|
168
|
+
|
|
169
|
+
if (mContextDeferredSideEffects) {
|
|
170
|
+
Object.keys(mContextDeferredSideEffects).forEach(function (sContextPath) {
|
|
171
|
+
var oDeferredSideEffect = mContextDeferredSideEffects[sContextPath];
|
|
172
|
+
|
|
173
|
+
if (!oDeferredSideEffect.processStarted) {
|
|
174
|
+
oDeferredSideEffect.processStarted = true;
|
|
175
|
+
aDeferredSideEffects.push(oDeferredSideEffect);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
return Promise.all(aDeferredSideEffects.map(function (oDeferredSideEffect) {
|
|
181
|
+
return getFieldGroupRequestPromise(oDeferredSideEffect);
|
|
182
|
+
}));
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Adds a SideEffects control.
|
|
186
|
+
*
|
|
187
|
+
* @function
|
|
188
|
+
* @name addControlSideEffects
|
|
189
|
+
* @param {string} sEntityType Name of the entity where the SideEffects control will be registered
|
|
190
|
+
* @param {object} oSideEffects SideEffects to register. Ensure the sourceControlId matches the associated SAPUI5 control ID.
|
|
191
|
+
*
|
|
192
|
+
*/
|
|
193
|
+
;
|
|
194
|
+
|
|
195
|
+
_proto.addControlSideEffects = function addControlSideEffects(sEntityType, oSideEffects) {
|
|
196
|
+
this._oSideEffectsService.addControlSideEffects(sEntityType, oSideEffects);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Removes the queue containing the failed SideEffects.
|
|
200
|
+
*
|
|
201
|
+
* @function
|
|
202
|
+
* @name removeFailedSideEffects
|
|
203
|
+
*/
|
|
204
|
+
;
|
|
205
|
+
|
|
206
|
+
_proto.removeFailedSideEffects = function removeFailedSideEffects() {
|
|
207
|
+
this._mFailedSideEffects = {};
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Request SideEffects on a specific context.
|
|
211
|
+
*
|
|
212
|
+
* @function
|
|
213
|
+
* @name requestSideEffects
|
|
214
|
+
* @param {object} oSideEffects SideEffects to be executed
|
|
215
|
+
* @param {object} oContext Context where SideEffects need to be executed
|
|
216
|
+
* @returns {object} SideEffects request on SAPUI5 context
|
|
217
|
+
*/
|
|
218
|
+
;
|
|
219
|
+
|
|
220
|
+
_proto.requestSideEffects = function requestSideEffects(oSideEffects, oContext) {
|
|
221
|
+
var _this2 = this;
|
|
222
|
+
|
|
223
|
+
var fResolver, fRejector;
|
|
224
|
+
var oPromise = new Promise(function (resolve, reject) {
|
|
225
|
+
fResolver = resolve;
|
|
226
|
+
fRejector = reject;
|
|
227
|
+
});
|
|
228
|
+
var aTargets = (oSideEffects.TargetEntities || []).concat(oSideEffects.TargetProperties || []),
|
|
229
|
+
sTriggerAction = oSideEffects.TriggerAction;
|
|
230
|
+
|
|
231
|
+
if (sTriggerAction) {
|
|
232
|
+
this._oSideEffectsService.executeAction(sTriggerAction, oContext);
|
|
342
233
|
}
|
|
343
|
-
/**
|
|
344
|
-
* Generates the promise for the field that is required before requesting immediate SideEffects.
|
|
345
|
-
*
|
|
346
|
-
* @function
|
|
347
|
-
* @name _generateImmediatePromise
|
|
348
|
-
* @param {object} mEventFieldProperties Field properties
|
|
349
|
-
* @returns {object} Promise to be used for the validation of the field
|
|
350
|
-
*/
|
|
351
|
-
|
|
352
|
-
}, {
|
|
353
|
-
key: "_generateImmediatePromise",
|
|
354
|
-
value: function _generateImmediatePromise(mEventFieldProperties) {
|
|
355
|
-
var oPromise = mEventFieldProperties.promise;
|
|
356
|
-
return oPromise.then(function () {
|
|
357
|
-
/**
|
|
358
|
-
* If the field gets a FieldHelper, we need to wait until all fields changed by this FieldHelper have been set.
|
|
359
|
-
* To achieve this, we ensure that all related bindings have been resolved.
|
|
360
|
-
*
|
|
361
|
-
* This resolution process is not managed by the Field Event Promise, so for fast user actions (like automation) it can lock the model
|
|
362
|
-
* and no request can be executed.
|
|
363
|
-
*/
|
|
364
|
-
var oField = mEventFieldProperties.field;
|
|
365
|
-
var sFieldHelperId = oField.getFieldHelp && oField.getFieldHelp();
|
|
366
234
|
|
|
367
|
-
|
|
368
|
-
|
|
235
|
+
this._oSideEffectsService.requestSideEffects(aTargets, oContext).then(function () {
|
|
236
|
+
return fResolver();
|
|
237
|
+
}).catch(function (oError) {
|
|
238
|
+
_this2._addFailedSideEffects(oSideEffects, oContext);
|
|
369
239
|
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
var oBinding = oOutParameter.getBinding("value");
|
|
373
|
-
return oBinding ? oBinding.requestValue() : Promise.resolve();
|
|
374
|
-
}));
|
|
375
|
-
}
|
|
376
|
-
}
|
|
240
|
+
fRejector(oError);
|
|
241
|
+
});
|
|
377
242
|
|
|
378
|
-
|
|
379
|
-
|
|
243
|
+
return oPromise;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Removes SideEffects created by a control.
|
|
247
|
+
*
|
|
248
|
+
* @function
|
|
249
|
+
* @name removeControlSideEffects
|
|
250
|
+
* @param {object} oControl SAPUI5 Control
|
|
251
|
+
*/
|
|
252
|
+
;
|
|
253
|
+
|
|
254
|
+
_proto.removeControlSideEffects = function removeControlSideEffects(oControl) {
|
|
255
|
+
var sControlId = oControl && oControl.isA && oControl.isA("sap.ui.base.ManagedObject") && oControl.getId();
|
|
256
|
+
|
|
257
|
+
if (sControlId) {
|
|
258
|
+
this._oSideEffectsService.removeControlSideEffects(sControlId);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Adds SideEffects to the queue of the failed SideEffects
|
|
263
|
+
* The SideEffects will be retriggered on the next change on the same context.
|
|
264
|
+
*
|
|
265
|
+
* @function
|
|
266
|
+
* @name _addFailedSideEffects
|
|
267
|
+
* @param {object} oSideEffects SideEffects that need to be retriggered
|
|
268
|
+
* @param {object} oContext Context where SideEffects have failed
|
|
269
|
+
*/
|
|
270
|
+
;
|
|
271
|
+
|
|
272
|
+
_proto._addFailedSideEffects = function _addFailedSideEffects(oSideEffects, oContext) {
|
|
273
|
+
var sContextPath = oContext.getPath();
|
|
274
|
+
this._mFailedSideEffects[sContextPath] = this._mFailedSideEffects[sContextPath] || [];
|
|
275
|
+
|
|
276
|
+
var bIsNotAlreadyListed = this._mFailedSideEffects[sContextPath].every(function (mFailedSideEffects) {
|
|
277
|
+
return oSideEffects.fullyQualifiedName !== mFailedSideEffects.fullyQualifiedName;
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
if (bIsNotAlreadyListed) {
|
|
281
|
+
this._mFailedSideEffects[sContextPath].push(oSideEffects);
|
|
380
282
|
}
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Generates the promise for the field group that is required before requesting SideEffects.
|
|
286
|
+
* If the promise is rejected and only the field requires the SideEffects on this context, the SideEffects are removed from the
|
|
287
|
+
* SideEffects queue.
|
|
288
|
+
*
|
|
289
|
+
* @function
|
|
290
|
+
* @name _generateFieldGroupPromise
|
|
291
|
+
* @param {object} mEventFieldProperties Field properties
|
|
292
|
+
* @returns {object} Promise to be used for the validation of the field
|
|
293
|
+
*/
|
|
294
|
+
;
|
|
295
|
+
|
|
296
|
+
_proto._generateFieldGroupPromise = function _generateFieldGroupPromise(mEventFieldProperties) {
|
|
297
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
298
|
+
var that = this;
|
|
299
|
+
var bPromiseSuccess = true;
|
|
300
|
+
return mEventFieldProperties.promise.then(function () {
|
|
301
|
+
return bPromiseSuccess;
|
|
302
|
+
}).catch(function () {
|
|
303
|
+
bPromiseSuccess = false;
|
|
304
|
+
return bPromiseSuccess;
|
|
305
|
+
}).finally(function () {
|
|
306
|
+
/**
|
|
307
|
+
* Need to store the status of properties related to this field for deferred SideEffects
|
|
308
|
+
* since all SourceProperties for this kind of SideEffects must be valid
|
|
309
|
+
*/
|
|
310
|
+
that._saveFieldPropertiesStatus(mEventFieldProperties.field, bPromiseSuccess);
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Generates the promise for the field that is required before requesting immediate SideEffects.
|
|
315
|
+
*
|
|
316
|
+
* @function
|
|
317
|
+
* @name _generateImmediatePromise
|
|
318
|
+
* @param {object} mEventFieldProperties Field properties
|
|
319
|
+
* @returns {object} Promise to be used for the validation of the field
|
|
320
|
+
*/
|
|
321
|
+
;
|
|
322
|
+
|
|
323
|
+
_proto._generateImmediatePromise = function _generateImmediatePromise(mEventFieldProperties) {
|
|
324
|
+
var oPromise = mEventFieldProperties.promise;
|
|
325
|
+
return oPromise.then(function () {
|
|
326
|
+
/**
|
|
327
|
+
* If the field gets a FieldHelper, we need to wait until all fields changed by this FieldHelper have been set.
|
|
328
|
+
* To achieve this, we ensure that all related bindings have been resolved.
|
|
329
|
+
*
|
|
330
|
+
* This resolution process is not managed by the Field Event Promise, so for fast user actions (like automation) it can lock the model
|
|
331
|
+
* and no request can be executed.
|
|
332
|
+
*/
|
|
333
|
+
var oField = mEventFieldProperties.field;
|
|
334
|
+
var sFieldHelperId = oField.getFieldHelp && oField.getFieldHelp();
|
|
335
|
+
|
|
336
|
+
if (sFieldHelperId) {
|
|
337
|
+
var oFilterHelp = sap.ui.getCore().byId(sFieldHelperId);
|
|
338
|
+
|
|
339
|
+
if (oFilterHelp) {
|
|
340
|
+
return Promise.all(oFilterHelp.getOutParameters().map(function (oOutParameter) {
|
|
341
|
+
var oBinding = oOutParameter.getBinding("value");
|
|
342
|
+
return oBinding ? oBinding.requestValue() : Promise.resolve();
|
|
343
|
+
}));
|
|
401
344
|
}
|
|
402
345
|
}
|
|
403
346
|
|
|
404
|
-
return
|
|
347
|
+
return Promise.all([]);
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Generates a status index.
|
|
352
|
+
*
|
|
353
|
+
* @function
|
|
354
|
+
* @name _generateStatusIndex
|
|
355
|
+
* @param {object} mEntityType The entity type
|
|
356
|
+
* @param {string} sPropertyPath The property path
|
|
357
|
+
* @param {object} oContext SAPUI5 Context
|
|
358
|
+
* @returns {string | undefined} Index
|
|
359
|
+
*/
|
|
360
|
+
;
|
|
361
|
+
|
|
362
|
+
_proto._generateStatusIndex = function _generateStatusIndex(mEntityType, sPropertyPath, oContext) {
|
|
363
|
+
var sContextPath = oContext === null || oContext === void 0 ? void 0 : oContext.getPath();
|
|
364
|
+
var mProperty = mEntityType.resolvePath(sPropertyPath);
|
|
365
|
+
|
|
366
|
+
if (mProperty) {
|
|
367
|
+
if (mProperty && mProperty._type === "Property") {
|
|
368
|
+
return [mProperty.fullyQualifiedName, sContextPath].join("__");
|
|
369
|
+
}
|
|
405
370
|
}
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
371
|
+
|
|
372
|
+
return undefined;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Gets the appropriate context on which SideEffects can be requested.
|
|
376
|
+
* The correct one must have the binding parameter $$patchWithoutSideEffects.
|
|
377
|
+
*
|
|
378
|
+
* @function
|
|
379
|
+
* @name _getContextForSideEffects
|
|
380
|
+
* @param {object} oSourceField Field
|
|
381
|
+
* @param {string} sSideEffectEntityType Target entity type of the SideEffects annotation
|
|
382
|
+
* @returns {object} SAPUI5 Context
|
|
383
|
+
*/
|
|
384
|
+
;
|
|
385
|
+
|
|
386
|
+
_proto._getContextForSideEffects = function _getContextForSideEffects(oSourceField, sSideEffectEntityType) {
|
|
387
|
+
var oBindingContext = oSourceField.getBindingContext();
|
|
388
|
+
|
|
389
|
+
var oContextForSideEffects = oBindingContext,
|
|
390
|
+
sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oBindingContext);
|
|
391
|
+
|
|
392
|
+
if (sSideEffectEntityType !== sEntityType) {
|
|
393
|
+
oContextForSideEffects = oBindingContext.getBinding().getContext();
|
|
394
|
+
|
|
395
|
+
if (oContextForSideEffects) {
|
|
396
|
+
sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oContextForSideEffects);
|
|
397
|
+
|
|
398
|
+
if (sSideEffectEntityType !== sEntityType) {
|
|
399
|
+
oContextForSideEffects = oContextForSideEffects.getBinding().getContext();
|
|
400
|
+
|
|
401
|
+
if (oContextForSideEffects) {
|
|
402
|
+
sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oContextForSideEffects);
|
|
403
|
+
|
|
404
|
+
if (sSideEffectEntityType !== sEntityType) {
|
|
405
|
+
return undefined;
|
|
440
406
|
}
|
|
441
407
|
}
|
|
442
408
|
}
|
|
443
409
|
}
|
|
444
|
-
|
|
445
|
-
return oContextForSideEffects || undefined;
|
|
446
410
|
}
|
|
447
|
-
/**
|
|
448
|
-
* Retrieves the EntityType based on its fully-qualified name.
|
|
449
|
-
*
|
|
450
|
-
* @param {string} sFullyQualifiedName The fully-qualified name
|
|
451
|
-
* @returns {object} The entity type
|
|
452
|
-
*/
|
|
453
|
-
|
|
454
|
-
}, {
|
|
455
|
-
key: "_getEntityTypeFromFQN",
|
|
456
|
-
value: function _getEntityTypeFromFQN(sFullyQualifiedName) {
|
|
457
|
-
var mEntityType = this._oSideEffectsService.getConvertedMetaModel().entityTypes.find(function (oEntityType) {
|
|
458
|
-
return oEntityType.fullyQualifiedName === sFullyQualifiedName;
|
|
459
|
-
});
|
|
460
411
|
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
412
|
+
return oContextForSideEffects || undefined;
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Retrieves the EntityType based on its fully-qualified name.
|
|
416
|
+
*
|
|
417
|
+
* @param {string} sFullyQualifiedName The fully-qualified name
|
|
418
|
+
* @returns {object} The entity type
|
|
419
|
+
*/
|
|
420
|
+
;
|
|
421
|
+
|
|
422
|
+
_proto._getEntityTypeFromFQN = function _getEntityTypeFromFQN(sFullyQualifiedName) {
|
|
423
|
+
var mEntityType = this._oSideEffectsService.getConvertedMetaModel().entityTypes.find(function (oEntityType) {
|
|
424
|
+
return oEntityType.fullyQualifiedName === sFullyQualifiedName;
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
return mEntityType;
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Gets the promise of the field validation that is required for the SideEffects process.
|
|
431
|
+
*
|
|
432
|
+
* @function
|
|
433
|
+
* @name _getFieldPromise
|
|
434
|
+
* @param {object} oEvent Field change event
|
|
435
|
+
* @returns {object} Field promise
|
|
436
|
+
*/
|
|
437
|
+
;
|
|
438
|
+
|
|
439
|
+
_proto._getFieldPromise = function _getFieldPromise(oEvent) {
|
|
440
|
+
var promise = oEvent.getParameter("promise") || Promise.resolve();
|
|
441
|
+
return promise.then(function () {
|
|
442
|
+
var oPromise = new Promise(function (resolve, reject) {
|
|
443
|
+
if (!FieldRuntime.getFieldStateOnChange(oEvent).state.validity) {
|
|
444
|
+
reject();
|
|
445
|
+
} else {
|
|
446
|
+
resolve(true);
|
|
447
|
+
}
|
|
448
|
+
});
|
|
449
|
+
return oPromise;
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Gets the properties of the field that are required for the SideEffects process.
|
|
454
|
+
*
|
|
455
|
+
* @function
|
|
456
|
+
* @name _getFieldProperties
|
|
457
|
+
* @param {object} oEvent Field change event
|
|
458
|
+
* @returns {object} Field properties (event change promise, field, SideEffects related to this field)
|
|
459
|
+
*/
|
|
460
|
+
;
|
|
461
|
+
|
|
462
|
+
_proto._getFieldProperties = function _getFieldProperties(oEvent) {
|
|
463
|
+
var oField = oEvent.getSource();
|
|
464
|
+
return {
|
|
465
|
+
promise: this._getFieldPromise(oEvent),
|
|
466
|
+
field: oField,
|
|
467
|
+
sideEffectsMap: this._getFieldSideEffectsMap(oField)
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Gets the SideEffects map
|
|
472
|
+
* These SideEffects are
|
|
473
|
+
* - listed into FieldGroupIds (coming from an OData Service)
|
|
474
|
+
* - generated by a control or controls and that configure this field as SourceProperties.
|
|
475
|
+
*
|
|
476
|
+
* @function
|
|
477
|
+
* @name _getFieldSideEffectsMap
|
|
478
|
+
* @param {object} oField Field
|
|
479
|
+
* @returns {object} SideEffects map
|
|
480
|
+
*/
|
|
481
|
+
;
|
|
482
|
+
|
|
483
|
+
_proto._getFieldSideEffectsMap = function _getFieldSideEffectsMap(oField) {
|
|
484
|
+
var _this3 = this;
|
|
485
|
+
|
|
486
|
+
var mSideEffectsMap = {},
|
|
487
|
+
aFieldGroupIds = oField.getFieldGroupIds(),
|
|
488
|
+
sViewEntitySetSetName = this._oView.getViewData().entitySet,
|
|
489
|
+
oViewEntitySet = this._oSideEffectsService.getConvertedMetaModel().entitySets.find(function (oEntitySet) {
|
|
490
|
+
return oEntitySet.name === sViewEntitySetSetName;
|
|
491
|
+
}); // SideEffects coming from an OData Service
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
aFieldGroupIds.forEach(function (sFieldGroupId) {
|
|
495
|
+
var _this3$_oSideEffectsS;
|
|
496
|
+
|
|
497
|
+
var bIsImmediate = sFieldGroupId.indexOf("$$ImmediateRequest") !== -1,
|
|
498
|
+
sName = sFieldGroupId.replace("$$ImmediateRequest", ""),
|
|
499
|
+
aSideEffectParts = sName.split("#"),
|
|
500
|
+
sSideEffectEntityType = aSideEffectParts[0],
|
|
501
|
+
sSideEffectPath = sSideEffectEntityType + "@com.sap.vocabularies.Common.v1.SideEffects" + (aSideEffectParts.length === 2 ? "#" + aSideEffectParts[1] : ""),
|
|
502
|
+
oSideEffect = (_this3$_oSideEffectsS = _this3._oSideEffectsService.getODataEntitySideEffects(sSideEffectEntityType)) === null || _this3$_oSideEffectsS === void 0 ? void 0 : _this3$_oSideEffectsS[sSideEffectPath],
|
|
503
|
+
oContext = _this3._getContextForSideEffects(oField, sSideEffectEntityType);
|
|
504
|
+
|
|
505
|
+
if (oSideEffect && oContext) {
|
|
506
|
+
mSideEffectsMap[sName] = {
|
|
507
|
+
name: sName,
|
|
508
|
+
immediate: bIsImmediate,
|
|
509
|
+
sideEffects: oSideEffect,
|
|
510
|
+
context: oContext
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
}); //SideEffects coming from control(s)
|
|
514
|
+
|
|
515
|
+
if (sViewEntitySetSetName && oViewEntitySet) {
|
|
516
|
+
var sViewEntityType = oViewEntitySet.entityType.fullyQualifiedName,
|
|
517
|
+
mFieldPath = oField.getAggregation("customData").find(function (oCustomData) {
|
|
518
|
+
return oCustomData.getKey() === "sourcePath";
|
|
519
|
+
}),
|
|
520
|
+
oContext = this._getContextForSideEffects(oField, sViewEntityType);
|
|
521
|
+
|
|
522
|
+
if (mFieldPath && oContext) {
|
|
523
|
+
var sFieldPath = mFieldPath.getValue().replace("/" + sViewEntitySetSetName + "/", ""),
|
|
524
|
+
mControlEntityType = this._oSideEffectsService.getControlEntitySideEffects(sViewEntityType);
|
|
525
|
+
|
|
526
|
+
Object.keys(mControlEntityType).forEach(function (sControlName) {
|
|
527
|
+
var oControlSideEffects = mControlEntityType[sControlName];
|
|
528
|
+
|
|
529
|
+
if (oControlSideEffects.SourceProperties.includes(sFieldPath)) {
|
|
530
|
+
var sName = sControlName + "::" + sViewEntityType;
|
|
531
|
+
mSideEffectsMap[sName] = {
|
|
532
|
+
name: sName,
|
|
533
|
+
immediate: true,
|
|
534
|
+
sideEffects: oControlSideEffects,
|
|
535
|
+
context: oContext
|
|
536
|
+
};
|
|
482
537
|
}
|
|
483
538
|
});
|
|
484
|
-
return oPromise;
|
|
485
|
-
});
|
|
486
|
-
}
|
|
487
|
-
/**
|
|
488
|
-
* Gets the properties of the field that are required for the SideEffects process.
|
|
489
|
-
*
|
|
490
|
-
* @function
|
|
491
|
-
* @name _getFieldProperties
|
|
492
|
-
* @param {object} oEvent Field change event
|
|
493
|
-
* @returns {object} Field properties (event change promise, field, SideEffects related to this field)
|
|
494
|
-
*/
|
|
495
|
-
|
|
496
|
-
}, {
|
|
497
|
-
key: "_getFieldProperties",
|
|
498
|
-
value: function _getFieldProperties(oEvent) {
|
|
499
|
-
var oField = oEvent.getSource();
|
|
500
|
-
return {
|
|
501
|
-
promise: this._getFieldPromise(oEvent),
|
|
502
|
-
field: oField,
|
|
503
|
-
sideEffectsMap: this._getFieldSideEffectsMap(oField)
|
|
504
|
-
};
|
|
505
|
-
}
|
|
506
|
-
/**
|
|
507
|
-
* Gets the SideEffects map
|
|
508
|
-
* These SideEffects are
|
|
509
|
-
* - listed into FieldGroupIds (coming from an OData Service)
|
|
510
|
-
* - generated by a control or controls and that configure this field as SourceProperties.
|
|
511
|
-
*
|
|
512
|
-
* @function
|
|
513
|
-
* @name _getFieldSideEffectsMap
|
|
514
|
-
* @param {object} oField Field
|
|
515
|
-
* @returns {object} SideEffects map
|
|
516
|
-
*/
|
|
517
|
-
|
|
518
|
-
}, {
|
|
519
|
-
key: "_getFieldSideEffectsMap",
|
|
520
|
-
value: function _getFieldSideEffectsMap(oField) {
|
|
521
|
-
var _this3 = this;
|
|
522
|
-
|
|
523
|
-
var mSideEffectsMap = {},
|
|
524
|
-
aFieldGroupIds = oField.getFieldGroupIds(),
|
|
525
|
-
sViewEntitySetSetName = this._oView.getViewData().entitySet,
|
|
526
|
-
oViewEntitySet = this._oSideEffectsService.getConvertedMetaModel().entitySets.find(function (oEntitySet) {
|
|
527
|
-
return oEntitySet.name === sViewEntitySetSetName;
|
|
528
|
-
}); // SideEffects coming from an OData Service
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
aFieldGroupIds.forEach(function (sFieldGroupId) {
|
|
532
|
-
var _this3$_oSideEffectsS;
|
|
533
|
-
|
|
534
|
-
var bIsImmediate = sFieldGroupId.indexOf("$$ImmediateRequest") !== -1,
|
|
535
|
-
sName = sFieldGroupId.replace("$$ImmediateRequest", ""),
|
|
536
|
-
aSideEffectParts = sName.split("#"),
|
|
537
|
-
sSideEffectEntityType = aSideEffectParts[0],
|
|
538
|
-
sSideEffectPath = sSideEffectEntityType + "@com.sap.vocabularies.Common.v1.SideEffects" + (aSideEffectParts.length === 2 ? "#" + aSideEffectParts[1] : ""),
|
|
539
|
-
oSideEffect = (_this3$_oSideEffectsS = _this3._oSideEffectsService.getODataEntitySideEffects(sSideEffectEntityType)) === null || _this3$_oSideEffectsS === void 0 ? void 0 : _this3$_oSideEffectsS[sSideEffectPath],
|
|
540
|
-
oContext = _this3._getContextForSideEffects(oField, sSideEffectEntityType);
|
|
541
|
-
|
|
542
|
-
if (oSideEffect && oContext) {
|
|
543
|
-
mSideEffectsMap[sName] = {
|
|
544
|
-
name: sName,
|
|
545
|
-
immediate: bIsImmediate,
|
|
546
|
-
sideEffects: oSideEffect,
|
|
547
|
-
context: oContext
|
|
548
|
-
};
|
|
549
|
-
}
|
|
550
|
-
}); //SideEffects coming from control(s)
|
|
551
|
-
|
|
552
|
-
if (sViewEntitySetSetName && oViewEntitySet) {
|
|
553
|
-
var sViewEntityType = oViewEntitySet.entityType.fullyQualifiedName,
|
|
554
|
-
mFieldPath = oField.getAggregation("customData").find(function (oCustomData) {
|
|
555
|
-
return oCustomData.getKey() === "sourcePath";
|
|
556
|
-
}),
|
|
557
|
-
oContext = this._getContextForSideEffects(oField, sViewEntityType);
|
|
558
|
-
|
|
559
|
-
if (mFieldPath && oContext) {
|
|
560
|
-
var sFieldPath = mFieldPath.getValue().replace("/" + sViewEntitySetSetName + "/", ""),
|
|
561
|
-
mControlEntityType = this._oSideEffectsService.getControlEntitySideEffects(sViewEntityType);
|
|
562
|
-
|
|
563
|
-
Object.keys(mControlEntityType).forEach(function (sControlName) {
|
|
564
|
-
var oControlSideEffects = mControlEntityType[sControlName];
|
|
565
|
-
|
|
566
|
-
if (oControlSideEffects.SourceProperties.includes(sFieldPath)) {
|
|
567
|
-
var sName = sControlName + "::" + sViewEntityType;
|
|
568
|
-
mSideEffectsMap[sName] = {
|
|
569
|
-
name: sName,
|
|
570
|
-
immediate: true,
|
|
571
|
-
sideEffects: oControlSideEffects,
|
|
572
|
-
context: oContext
|
|
573
|
-
};
|
|
574
|
-
}
|
|
575
|
-
});
|
|
576
|
-
}
|
|
577
539
|
}
|
|
578
|
-
|
|
579
|
-
return mSideEffectsMap;
|
|
580
540
|
}
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
541
|
+
|
|
542
|
+
return mSideEffectsMap;
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Manages the SideEffects with related changes to a field
|
|
546
|
+
* List: gets immediate SideEffects requests
|
|
547
|
+
* Register: caches deferred SideEffects that will be executed when the FieldGroup is unfocused.
|
|
548
|
+
*
|
|
549
|
+
* @function
|
|
550
|
+
* @name _initializeFieldSideEffects
|
|
551
|
+
* @param {object} mEventFieldProperties Field event properties
|
|
552
|
+
* @param {object} oFieldGroupPreRequisite Promise to be fulfilled before executing deferred SideEffects
|
|
553
|
+
* @returns {Array} Array of immediate SideEffects
|
|
554
|
+
*/
|
|
555
|
+
;
|
|
556
|
+
|
|
557
|
+
_proto._initializeFieldSideEffects = function _initializeFieldSideEffects(mEventFieldProperties, oFieldGroupPreRequisite) {
|
|
558
|
+
var _this4 = this;
|
|
559
|
+
|
|
560
|
+
var mFieldSideEffectsMap = mEventFieldProperties.sideEffectsMap,
|
|
561
|
+
oFieldPromiseForFieldGroup = this._generateFieldGroupPromise(mEventFieldProperties),
|
|
562
|
+
// Promise managing FieldGroup requests if Field promise fails
|
|
563
|
+
mFailedSideEffectsName = {},
|
|
564
|
+
aImmediateSideEffectsProperties = [];
|
|
565
|
+
|
|
566
|
+
oFieldGroupPreRequisite = oFieldGroupPreRequisite || Promise.resolve();
|
|
567
|
+
Object.keys(mFieldSideEffectsMap).forEach(function (sSideEffectName) {
|
|
568
|
+
var oSideEffectProperty = mFieldSideEffectsMap[sSideEffectName],
|
|
569
|
+
sSideEffectContextPath = oSideEffectProperty.context.getPath(),
|
|
570
|
+
aFailedSideEffects = _this4._mFailedSideEffects[sSideEffectContextPath]; // Check if there is any previously failed request for this context
|
|
571
|
+
|
|
572
|
+
if (aFailedSideEffects) {
|
|
573
|
+
delete _this4._mFailedSideEffects[sSideEffectContextPath];
|
|
574
|
+
mFailedSideEffectsName[sSideEffectContextPath] = {};
|
|
575
|
+
aFailedSideEffects.forEach(function (mFailedSideEffects) {
|
|
576
|
+
mFailedSideEffectsName[sSideEffectContextPath][mFailedSideEffects.fullyQualifiedName] = true;
|
|
577
|
+
aImmediateSideEffectsProperties.push({
|
|
578
|
+
name: sSideEffectName,
|
|
579
|
+
previouslyFailed: true,
|
|
580
|
+
sideEffects: mFailedSideEffects,
|
|
581
|
+
context: oSideEffectProperty.context
|
|
621
582
|
});
|
|
622
|
-
}
|
|
583
|
+
});
|
|
584
|
+
}
|
|
623
585
|
|
|
624
|
-
|
|
625
|
-
|
|
586
|
+
if (oSideEffectProperty.immediate) {
|
|
587
|
+
var _mFailedSideEffectsNa;
|
|
626
588
|
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
}
|
|
635
|
-
} else {
|
|
636
|
-
// Add deferred SideEffects to the related dictionary
|
|
637
|
-
_this4._mFieldGroupQueue[sSideEffectName] = _this4._mFieldGroupQueue[sSideEffectName] || {};
|
|
638
|
-
var mSideEffectContextPath = _this4._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] || {
|
|
639
|
-
promises: [],
|
|
640
|
-
sideEffectProperty: oSideEffectProperty,
|
|
641
|
-
processStarted: false
|
|
642
|
-
};
|
|
643
|
-
mSideEffectContextPath.promises = mSideEffectContextPath.promises.concat([oFieldPromiseForFieldGroup, oFieldGroupPreRequisite]);
|
|
644
|
-
_this4._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] = mSideEffectContextPath;
|
|
589
|
+
// SideEffects will be executed immediately after event promise validation
|
|
590
|
+
if (!((_mFailedSideEffectsNa = mFailedSideEffectsName[sSideEffectContextPath]) !== null && _mFailedSideEffectsNa !== void 0 && _mFailedSideEffectsNa[oSideEffectProperty.sideEffects.fullyQualifiedName])) {
|
|
591
|
+
aImmediateSideEffectsProperties.push({
|
|
592
|
+
name: sSideEffectName,
|
|
593
|
+
sideEffects: oSideEffectProperty.sideEffects,
|
|
594
|
+
context: oSideEffectProperty.context
|
|
595
|
+
});
|
|
645
596
|
}
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
597
|
+
} else {
|
|
598
|
+
// Add deferred SideEffects to the related dictionary
|
|
599
|
+
_this4._mFieldGroupQueue[sSideEffectName] = _this4._mFieldGroupQueue[sSideEffectName] || {};
|
|
600
|
+
var mSideEffectContextPath = _this4._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] || {
|
|
601
|
+
promises: [],
|
|
602
|
+
sideEffectProperty: oSideEffectProperty,
|
|
603
|
+
processStarted: false
|
|
604
|
+
};
|
|
605
|
+
mSideEffectContextPath.promises = mSideEffectContextPath.promises.concat([oFieldPromiseForFieldGroup, oFieldGroupPreRequisite]);
|
|
606
|
+
_this4._mFieldGroupQueue[sSideEffectName][sSideEffectContextPath] = mSideEffectContextPath;
|
|
607
|
+
}
|
|
608
|
+
});
|
|
609
|
+
return aImmediateSideEffectsProperties;
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* Saves the validation status of properties related to a field control.
|
|
613
|
+
*
|
|
614
|
+
* @param {object} oField Field
|
|
615
|
+
* @param {boolean} bSuccess Status of the field validation
|
|
616
|
+
*/
|
|
617
|
+
;
|
|
655
618
|
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
value: function _saveFieldPropertiesStatus(oField, bSuccess) {
|
|
659
|
-
var _this5 = this;
|
|
619
|
+
_proto._saveFieldPropertiesStatus = function _saveFieldPropertiesStatus(oField, bSuccess) {
|
|
620
|
+
var _this5 = this;
|
|
660
621
|
|
|
661
|
-
|
|
622
|
+
var oBindingContext = oField.getBindingContext();
|
|
662
623
|
|
|
663
|
-
|
|
624
|
+
var sEntityType = this._oSideEffectsService.getEntityTypeFromContext(oBindingContext);
|
|
664
625
|
|
|
665
|
-
|
|
626
|
+
var mEntityType = this._getEntityTypeFromFQN(sEntityType);
|
|
666
627
|
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
628
|
+
if (mEntityType) {
|
|
629
|
+
// Retrieves all properties used by the field
|
|
630
|
+
var oFieldBinding = this._getBindingForField(oField);
|
|
670
631
|
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
632
|
+
var aFieldPaths = oFieldBinding.isA("sap.ui.model.CompositeBinding") ? (oFieldBinding.getBindings() || []).map(function (oBinding) {
|
|
633
|
+
return oBinding.sPath;
|
|
634
|
+
}) : [oFieldBinding.getPath()]; // Stores status for all properties
|
|
674
635
|
|
|
675
|
-
|
|
676
|
-
|
|
636
|
+
aFieldPaths.forEach(function (sFieldPath) {
|
|
637
|
+
var sId = _this5._generateStatusIndex(mEntityType, sFieldPath, oBindingContext);
|
|
677
638
|
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
}
|
|
639
|
+
if (sId) {
|
|
640
|
+
_this5._aSourcePropertiesFailure[bSuccess ? "delete" : "add"](sId);
|
|
641
|
+
}
|
|
642
|
+
});
|
|
683
643
|
}
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
return oField.getBinding(sBindingName);
|
|
644
|
+
}
|
|
645
|
+
/**
|
|
646
|
+
* Retrieves the property binding to the value of the field.
|
|
647
|
+
*
|
|
648
|
+
* @param oField Field
|
|
649
|
+
* @returns {Binding} Binding to the value
|
|
650
|
+
*/
|
|
651
|
+
;
|
|
652
|
+
|
|
653
|
+
_proto._getBindingForField = function _getBindingForField(oField) {
|
|
654
|
+
var sBindingName = "value";
|
|
655
|
+
|
|
656
|
+
if (oField.isA("sap.m.CheckBox")) {
|
|
657
|
+
sBindingName = "selected";
|
|
658
|
+
} else if (oField.isA("sap.ui.unified.FileUploader")) {
|
|
659
|
+
sBindingName = "uploadUrl";
|
|
703
660
|
}
|
|
704
|
-
|
|
661
|
+
|
|
662
|
+
return oField.getBinding(sBindingName);
|
|
663
|
+
};
|
|
705
664
|
|
|
706
665
|
return SideEffectsControllerExtension;
|
|
707
666
|
}(ControllerExtension), (_applyDecoratedDescriptor(_class2.prototype, "onInit", [_dec2], Object.getOwnPropertyDescriptor(_class2.prototype, "onInit"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "clearPropertiesStatus", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "clearPropertiesStatus"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "getRegisteredFailedRequests", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "getRegisteredFailedRequests"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldChange", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "handleFieldGroupChange", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "handleFieldGroupChange"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "addControlSideEffects", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "addControlSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeFailedSideEffects", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "removeFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "requestSideEffects", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "requestSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "removeControlSideEffects", [Public, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "removeControlSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_addFailedSideEffects", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "_addFailedSideEffects"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "_getContextForSideEffects", [Private, Final], Object.getOwnPropertyDescriptor(_class2.prototype, "_getContextForSideEffects"), _class2.prototype)), _class2)) || _class);
|
|
708
667
|
return SideEffectsControllerExtension;
|
|
709
668
|
}, false);
|
|
710
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzLnRzIl0sIm5hbWVzIjpbIlNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiIsIlVJNUNsYXNzIiwiQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIiwiT3ZlcnJpZGUiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsIl9tRmllbGRHcm91cFF1ZXVlIiwiX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZSIsIlNldCIsIl9tRmFpbGVkU2lkZUVmZmVjdHMiLCJjbGVhciIsIm9FdmVudCIsIm9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlIiwibUV2ZW50RmllbGRQcm9wZXJ0aWVzIiwiX2dldEZpZWxkUHJvcGVydGllcyIsImFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMiLCJfaW5pdGlhbGl6ZUZpZWxkU2lkZUVmZmVjdHMiLCJiSXNJbW1lZGlhdGVUcmlnZ2VyZWQiLCJfZ2VuZXJhdGVJbW1lZGlhdGVQcm9taXNlIiwidGhlbiIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJtU2lkZUVmZmVjdHNQcm9wZXJ0eSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInNpZGVFZmZlY3RzIiwiY29udGV4dCIsImNhdGNoIiwib0Vycm9yIiwiTG9nIiwiZGVidWciLCJmaWx0ZXIiLCJtSW1tZWRpYXRlU2lkZUVmZmVjdHMiLCJwcmV2aW91c2x5RmFpbGVkIiwiZm9yRWFjaCIsIl9hZGRGYWlsZWRTaWRlRWZmZWN0cyIsInRoYXQiLCJhRGVmZXJyZWRTaWRlRWZmZWN0cyIsImFGaWVsZEdyb3VwSWRzIiwiZ2V0UGFyYW1ldGVyIiwiZ2V0RmllbGRHcm91cFJlcXVlc3RQcm9taXNlIiwib0RlZmVycmVkU2lkZUVmZmVjdCIsImJJc1JlcXVlc3RzVHJpZ2dlcmVkIiwib1NpZGVFZmZlY3RQcm9wZXJ0eSIsInNpZGVFZmZlY3RQcm9wZXJ0eSIsIm9Db250ZXh0Iiwic0NvbnRleHRQYXRoIiwiZ2V0UGF0aCIsInNFbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwibUVudGl0eVR5cGUiLCJfZ2V0RW50aXR5VHlwZUZyb21GUU4iLCJwcm9taXNlcyIsIlNvdXJjZVByb3BlcnRpZXMiLCJldmVyeSIsInNvdXJjZVByb3BlcnR5IiwidHlwZSIsInNJZCIsIl9nZW5lcmF0ZVN0YXR1c0luZGV4IiwidmFsdWUiLCJoYXMiLCJmaW5hbGx5IiwibmFtZSIsInNGaWVsZEdyb3VwSWQiLCJzU2lkZUVmZmVjdE5hbWUiLCJyZXBsYWNlIiwibUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzIiwiT2JqZWN0Iiwia2V5cyIsInByb2Nlc3NTdGFydGVkIiwicHVzaCIsIm9TaWRlRWZmZWN0cyIsImFkZENvbnRyb2xTaWRlRWZmZWN0cyIsImZSZXNvbHZlciIsImZSZWplY3RvciIsIm9Qcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImFUYXJnZXRzIiwiVGFyZ2V0RW50aXRpZXMiLCJjb25jYXQiLCJUYXJnZXRQcm9wZXJ0aWVzIiwic1RyaWdnZXJBY3Rpb24iLCJUcmlnZ2VyQWN0aW9uIiwiZXhlY3V0ZUFjdGlvbiIsIm9Db250cm9sIiwic0NvbnRyb2xJZCIsImlzQSIsImdldElkIiwicmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzIiwiYklzTm90QWxyZWFkeUxpc3RlZCIsIm1GYWlsZWRTaWRlRWZmZWN0cyIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImJQcm9taXNlU3VjY2VzcyIsInByb21pc2UiLCJfc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyIsImZpZWxkIiwib0ZpZWxkIiwic0ZpZWxkSGVscGVySWQiLCJnZXRGaWVsZEhlbHAiLCJvRmlsdGVySGVscCIsInNhcCIsInVpIiwiZ2V0Q29yZSIsImJ5SWQiLCJnZXRPdXRQYXJhbWV0ZXJzIiwib091dFBhcmFtZXRlciIsIm9CaW5kaW5nIiwiZ2V0QmluZGluZyIsInJlcXVlc3RWYWx1ZSIsInNQcm9wZXJ0eVBhdGgiLCJtUHJvcGVydHkiLCJyZXNvbHZlUGF0aCIsIl90eXBlIiwiam9pbiIsInVuZGVmaW5lZCIsIm9Tb3VyY2VGaWVsZCIsInNTaWRlRWZmZWN0RW50aXR5VHlwZSIsIm9CaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0Iiwib0NvbnRleHRGb3JTaWRlRWZmZWN0cyIsImdldENvbnRleHQiLCJzRnVsbHlRdWFsaWZpZWROYW1lIiwiZ2V0Q29udmVydGVkTWV0YU1vZGVsIiwiZW50aXR5VHlwZXMiLCJmaW5kIiwib0VudGl0eVR5cGUiLCJGaWVsZFJ1bnRpbWUiLCJnZXRGaWVsZFN0YXRlT25DaGFuZ2UiLCJzdGF0ZSIsInZhbGlkaXR5IiwiZ2V0U291cmNlIiwiX2dldEZpZWxkUHJvbWlzZSIsInNpZGVFZmZlY3RzTWFwIiwiX2dldEZpZWxkU2lkZUVmZmVjdHNNYXAiLCJtU2lkZUVmZmVjdHNNYXAiLCJnZXRGaWVsZEdyb3VwSWRzIiwic1ZpZXdFbnRpdHlTZXRTZXROYW1lIiwiZ2V0Vmlld0RhdGEiLCJlbnRpdHlTZXQiLCJvVmlld0VudGl0eVNldCIsImVudGl0eVNldHMiLCJvRW50aXR5U2V0IiwiYklzSW1tZWRpYXRlIiwiaW5kZXhPZiIsInNOYW1lIiwiYVNpZGVFZmZlY3RQYXJ0cyIsInNwbGl0Iiwic1NpZGVFZmZlY3RQYXRoIiwibGVuZ3RoIiwib1NpZGVFZmZlY3QiLCJnZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzIiwiX2dldENvbnRleHRGb3JTaWRlRWZmZWN0cyIsImltbWVkaWF0ZSIsInNWaWV3RW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJtRmllbGRQYXRoIiwiZ2V0QWdncmVnYXRpb24iLCJvQ3VzdG9tRGF0YSIsImdldEtleSIsInNGaWVsZFBhdGgiLCJnZXRWYWx1ZSIsIm1Db250cm9sRW50aXR5VHlwZSIsImdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyIsInNDb250cm9sTmFtZSIsIm9Db250cm9sU2lkZUVmZmVjdHMiLCJpbmNsdWRlcyIsIm1GaWVsZFNpZGVFZmZlY3RzTWFwIiwib0ZpZWxkUHJvbWlzZUZvckZpZWxkR3JvdXAiLCJfZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZSIsIm1GYWlsZWRTaWRlRWZmZWN0c05hbWUiLCJzU2lkZUVmZmVjdENvbnRleHRQYXRoIiwiYUZhaWxlZFNpZGVFZmZlY3RzIiwibVNpZGVFZmZlY3RDb250ZXh0UGF0aCIsImJTdWNjZXNzIiwib0ZpZWxkQmluZGluZyIsIl9nZXRCaW5kaW5nRm9yRmllbGQiLCJhRmllbGRQYXRocyIsImdldEJpbmRpbmdzIiwic1BhdGgiLCJzQmluZGluZ05hbWUiLCJDb250cm9sbGVyRXh0ZW5zaW9uIiwiUHVibGljIiwiRmluYWwiLCJQcml2YXRlIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01Bb0RNQSw4QixXQURMQyxRQUFRLENBQUMsOENBQUQsRUFBaURDLDJCQUFqRCxDLFVBU1BDLFFBQVEsRTs7Ozs7Ozs7Ozs7OzthQUFULGtCQUNnQjtBQUNmLGFBQUtDLE1BQUwsR0FBZSxJQUFELENBQWNDLElBQWQsQ0FBbUJDLE9BQW5CLEVBQWQ7QUFDQSxhQUFLQyxjQUFMLEdBQXNCQyxXQUFXLENBQUNDLGVBQVosQ0FBNEIsS0FBS0wsTUFBakMsQ0FBdEI7QUFDQSxhQUFLTSxvQkFBTCxHQUE2QixLQUFLSCxjQUFOLENBQTZCSSxxQkFBN0IsRUFBNUI7QUFDQSxhQUFLQyxpQkFBTCxHQUF5QixFQUF6QjtBQUNBLGFBQUtDLHlCQUFMLEdBQWlDLElBQUlDLEdBQUosRUFBakM7QUFDQSxhQUFLQyxtQkFBTCxHQUEyQixFQUEzQjtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O2FBQ0MsaUNBRXFDO0FBQ3BDLGFBQUtGLHlCQUFMLENBQStCRyxLQUEvQjtBQUNBO0FBRUQ7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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RyxXQUFmO0FBQ0E7O0FBQ0QsZUFBT25GLE1BQU0sQ0FBQ1csVUFBUCxDQUFrQndFLFlBQWxCLENBQVA7QUFDQTs7OztJQTVuQjJDQyxtQiw2TkF3QjNDQyxNLEVBQ0FDLEssaUxBWUFELE0sRUFDQUMsSyw2S0FpQkFELE0sRUFDQUMsSyx3S0E2Q0FELE0sRUFDQUMsSyw0S0FrRkFELE0sRUFDQUMsSyw2S0FXQUQsTSxFQUNBQyxLLDBLQWNBRCxNLEVBQ0FDLEssMktBZ0NBRCxNLEVBQ0FDLEssOEtBa0JBQyxPLEVBQ0FELEssK0tBOEdBQyxPLEVBQ0FELEs7U0F3UWE3TCw4QiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0JpbmRpbmdcIjtcbmltcG9ydCBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHsgQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnRyb2xsZXJleHRlbnNpb25zXCI7XG5pbXBvcnQgeyBVSTVDbGFzcywgT3ZlcnJpZGUsIFB1YmxpYywgRmluYWwsIFByaXZhdGUgfSBmcm9tIFwiLi4vaGVscGVycy9DbGFzc1N1cHBvcnRcIjtcbmltcG9ydCB7IEFwcENvbXBvbmVudCB9IGZyb20gXCJzYXAvZmUvY29yZVwiO1xuaW1wb3J0IENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB7XG5cdFNpZGVFZmZlY3RzVHlwZSxcblx0Q29udHJvbFNpZGVFZmZlY3RzVHlwZSxcblx0T0RhdGFTaWRlRWZmZWN0c1R5cGUsXG5cdENvbnRyb2xTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnlcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB7IEZpZWxkUnVudGltZSB9IGZyb20gXCJzYXAvZmUvbWFjcm9zL2ZpZWxkXCI7XG5pbXBvcnQgeyBDb252ZXJ0ZXJPdXRwdXQsIFByb3BlcnR5UGF0aCwgRW50aXR5VHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgQ29tbW9uVXRpbHMgZnJvbSBcIi4uL0NvbW1vblV0aWxzXCI7XG5cbnR5cGUgRmllbGRDb250cm9sID0gQ29udHJvbCAmIHtcblx0Z2V0RmllbGRIZWxwKCk6IHN0cmluZztcblx0Z2V0RmllbGRHcm91cElkcygpOiBzdHJpbmdbXTtcbn07XG5cbnR5cGUgRmllbGRFdmVudFByb3BlcnR5VHlwZSA9IHtcblx0cHJvbWlzZTogUHJvbWlzZTxhbnk+O1xuXHRmaWVsZDogRmllbGRDb250cm9sO1xuXHRzaWRlRWZmZWN0c01hcDogRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeTtcbn07XG5cbnR5cGUgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0ge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGltbWVkaWF0ZT86IGJvb2xlYW47XG5cdGNvbnRleHQ6IENvbnRleHQ7XG5cdHNpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGU7XG5cdHByZXZpb3VzbHlGYWlsZWQ/OiBib29sZWFuO1xufTtcblxudHlwZSBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlPjtcblxudHlwZSBGYWlsZWRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RzVHlwZVtdPjtcblxudHlwZSBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGUgPSB7XG5cdHByb21pc2VzOiBQcm9taXNlPGFueT5bXTtcblx0c2lkZUVmZmVjdFByb3BlcnR5OiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU7XG5cdHByb2Nlc3NTdGFydGVkPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgRmllbGRHcm91cFF1ZXVlTWFwVHlwZSA9IHtcblx0W3NpZGVFZmZlY3ROYW1lOiBzdHJpbmddOiB7XG5cdFx0W2NvbnRleHRQYXRoOiBzdHJpbmddOiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGU7XG5cdH07XG59O1xuXG5AVUk1Q2xhc3MoXCJzYXAuZmUuY29yZS5jb250cm9sbGVyZXh0ZW5zaW9ucy5TaWRlRWZmZWN0c1wiLCBDb250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGEpXG5jbGFzcyBTaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb24gZXh0ZW5kcyBDb250cm9sbGVyRXh0ZW5zaW9uIHtcblx0cHJpdmF0ZSBfb1ZpZXc6IGFueTtcblx0cHJpdmF0ZSBfb0FwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblx0cHJpdmF0ZSBfbUZpZWxkR3JvdXBRdWV1ZSE6IEZpZWxkR3JvdXBRdWV1ZU1hcFR5cGU7XG5cdHByaXZhdGUgX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZSE6IFNldDxzdHJpbmc+O1xuXHRwcml2YXRlIF9vU2lkZUVmZmVjdHNTZXJ2aWNlITogYW55O1xuXHRwcml2YXRlIF9tRmFpbGVkU2lkZUVmZmVjdHMhOiBGYWlsZWRTaWRlRWZmZWN0RGljdGlvbmFyeTtcblxuXHRAT3ZlcnJpZGUoKVxuXHRwdWJsaWMgb25Jbml0KCkge1xuXHRcdHRoaXMuX29WaWV3ID0gKHRoaXMgYXMgYW55KS5iYXNlLmdldFZpZXcoKTtcblx0XHR0aGlzLl9vQXBwQ29tcG9uZW50ID0gQ29tbW9uVXRpbHMuZ2V0QXBwQ29tcG9uZW50KHRoaXMuX29WaWV3KTtcblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlID0gKHRoaXMuX29BcHBDb21wb25lbnQgYXMgYW55KS5nZXRTaWRlRWZmZWN0c1NlcnZpY2UoKTtcblx0XHR0aGlzLl9tRmllbGRHcm91cFF1ZXVlID0ge307XG5cdFx0dGhpcy5fYVNvdXJjZVByb3BlcnRpZXNGYWlsdXJlID0gbmV3IFNldCgpO1xuXHRcdHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0cyA9IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENsZWFyIHJlY29yZGVkIHZhbGlkYXRpb24gc3RhdHVzIGZvciBhbGwgcHJvcGVydGllcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGNsZWFyUHJvcGVydGllc1N0YXR1c1xuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGNsZWFyUHJvcGVydGllc1N0YXR1cygpOiB2b2lkIHtcblx0XHR0aGlzLl9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUuY2xlYXIoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGZhaWxlZCBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGdldFJlZ2lzdGVyZWRGYWlsZWRSZXF1ZXN0c1xuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBSZWdpc3RlcmVkIFNpZGVFZmZlY3RzIHJlcXVlc3RzIHRoYXQgaGF2ZSBmYWlsZWRcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyBnZXRSZWdpc3RlcmVkRmFpbGVkUmVxdWVzdHMoKTogRmFpbGVkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdHJldHVybiB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogTWFuYWdlcyB0aGUgd29ya2Zsb3cgZm9yIFNpZGVFZmZlY3RzIHdpdGggcmVsYXRlZCBjaGFuZ2VzIHRvIGEgZmllbGRcblx0ICogVGhlIGZvbGxvd2luZyBzY2VuYXJpb3MgYXJlIG1hbmFnZWQ6XG5cdCAqICAtIEV4ZWN1dGU6IHRyaWdnZXJzIGltbWVkaWF0ZSBTaWRlRWZmZWN0cyByZXF1ZXN0cyBpZiB0aGUgcHJvbWlzZSBmb3IgdGhlIGZpZWxkIGV2ZW50IGlzIGZ1bGZpbGxlZFxuXHQgKiAgLSBSZWdpc3RlcjogY2FjaGVzIGRlZmVycmVkIFNpZGVFZmZlY3RzIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBGaWVsZEdyb3VwIGlzIHVuZm9jdXNlZC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGhhbmRsZUZpZWxkQ2hhbmdlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRXZlbnQgU0FQVUk1IGV2ZW50IHRoYXQgY29tZXMgZnJvbSBhIGZpZWxkIGNoYW5nZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgYmVmb3JlIGV4ZWN1dGluZyBkZWZlcnJlZCBTaWRlRWZmZWN0c1xuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSAgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0KHMpXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgaGFuZGxlRmllbGRDaGFuZ2Uob0V2ZW50OiBVSTVFdmVudCwgb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGU/OiBQcm9taXNlPGFueT4pOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG1FdmVudEZpZWxkUHJvcGVydGllcyA9IHRoaXMuX2dldEZpZWxkUHJvcGVydGllcyhvRXZlbnQpLFxuXHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllczogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlW10gPSB0aGlzLl9pbml0aWFsaXplRmllbGRTaWRlRWZmZWN0cyhcblx0XHRcdFx0bUV2ZW50RmllbGRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRvRmllbGRHcm91cFByZVJlcXVpc2l0ZVxuXHRcdFx0KTtcblxuXHRcdGxldCBiSXNJbW1lZGlhdGVUcmlnZ2VyZWQgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzLl9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRiSXNJbW1lZGlhdGVUcmlnZ2VyZWQgPSB0cnVlO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcy5tYXAobVNpZGVFZmZlY3RzUHJvcGVydHkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKG1TaWRlRWZmZWN0c1Byb3BlcnR5LnNpZGVFZmZlY3RzLCBtU2lkZUVmZmVjdHNQcm9wZXJ0eS5jb250ZXh0KTtcblx0XHRcdFx0XHR9KSB8fCBbXVxuXHRcdFx0XHQpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChvRXJyb3IgPT4ge1xuXHRcdFx0XHRpZiAoYklzSW1tZWRpYXRlVHJpZ2dlcmVkKSB7XG5cdFx0XHRcdFx0TG9nLmRlYnVnKFwiRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBGaWVsZCBTaWRlRWZmZWN0c1wiLCBvRXJyb3IpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8qKlxuXHRcdFx0XHRcdCAqIFNpZGVFZmZlY3RzIGhhdmUgbm90IGJlZW4gdHJpZ2dlcmVkIHNpbmNlIHByZVJlcXVpc2l0ZSB2YWxpZGF0aW9uIGZhaWxzIHNvIHdlIG5lZWRcblx0XHRcdFx0XHQgKiB0byBrZWVwIHByZXZpb3VzbHkgZmFpbGVkIHJlcXVlc3QgYXMgRmFpbGVkIHJlcXVlc3QgKHRvIGJlIHJldHJpZ2dlciBvbiBuZXh0IGNoYW5nZSlcblx0XHRcdFx0XHQgKi9cblxuXHRcdFx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXNcblx0XHRcdFx0XHRcdC5maWx0ZXIobUltbWVkaWF0ZVNpZGVFZmZlY3RzID0+IG1JbW1lZGlhdGVTaWRlRWZmZWN0cy5wcmV2aW91c2x5RmFpbGVkID09PSB0cnVlKVxuXHRcdFx0XHRcdFx0LmZvckVhY2gobUltbWVkaWF0ZVNpZGVFZmZlY3RzID0+XG5cdFx0XHRcdFx0XHRcdHRoaXMuX2FkZEZhaWxlZFNpZGVFZmZlY3RzKG1JbW1lZGlhdGVTaWRlRWZmZWN0cy5zaWRlRWZmZWN0cywgbUltbWVkaWF0ZVNpZGVFZmZlY3RzLmNvbnRleHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIFNpZGVFZmZlY3RzIHdpdGggYSByZWxhdGVkICdmb2N1cyBvdXQnIHRvIGEgZmllbGQgZ3JvdXAuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBoYW5kbGVGaWVsZEdyb3VwQ2hhbmdlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRXZlbnQgU0FQVUk1IEV2ZW50XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdChzKVxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGhhbmRsZUZpZWxkR3JvdXBDaGFuZ2Uob0V2ZW50OiBVSTVFdmVudCk6IFByb21pc2U8YW55PiB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG5cdFx0Y29uc3QgdGhhdCA9IHRoaXMsXG5cdFx0XHRhRGVmZXJyZWRTaWRlRWZmZWN0czogRmllbGRHcm91cFNpZGVFZmZlY3RUeXBlW10gPSBbXSxcblx0XHRcdGFGaWVsZEdyb3VwSWRzOiBzdHJpbmdbXSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJmaWVsZEdyb3VwSWRzXCIpO1xuXG5cdFx0Y29uc3QgZ2V0RmllbGRHcm91cFJlcXVlc3RQcm9taXNlID0gZnVuY3Rpb24ob0RlZmVycmVkU2lkZUVmZmVjdDogRmllbGRHcm91cFNpZGVFZmZlY3RUeXBlKSB7XG5cdFx0XHRsZXQgYklzUmVxdWVzdHNUcmlnZ2VyZWQgPSBmYWxzZTtcblx0XHRcdGNvbnN0IG9TaWRlRWZmZWN0UHJvcGVydHkgPSBvRGVmZXJyZWRTaWRlRWZmZWN0LnNpZGVFZmZlY3RQcm9wZXJ0eTtcblx0XHRcdGNvbnN0IG9Db250ZXh0ID0gb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0O1xuXHRcdFx0Y29uc3Qgc0NvbnRleHRQYXRoID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdFx0Y29uc3Qgc0VudGl0eVR5cGUgPSB0aGF0Ll9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dCk7XG5cdFx0XHRjb25zdCBtRW50aXR5VHlwZSA9IHRoYXQuX2dldEVudGl0eVR5cGVGcm9tRlFOKHNFbnRpdHlUeXBlKTtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKG9EZWZlcnJlZFNpZGVFZmZlY3QucHJvbWlzZXMpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGJJc1JlcXVlc3RzVHJpZ2dlcmVkID0gdHJ1ZTtcblxuXHRcdFx0XHRcdC8vRGVmZXJyZWQgU2lkZUVmZmVjdHMgYXJlIGV4ZWN1dGVkIG9ubHkgaWYgYWxsIHNvdXJjZVByb3BlcnRpZXMgaGF2ZSBubyByZWdpc3RlcmVkIGZhaWx1cmUuXG5cdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0bUVudGl0eVR5cGUgJiZcblx0XHRcdFx0XHRcdChvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLlNvdXJjZVByb3BlcnRpZXMgYXMgUHJvcGVydHlQYXRoW10pLmV2ZXJ5KHNvdXJjZVByb3BlcnR5ID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKHNvdXJjZVByb3BlcnR5LnR5cGUgPT09IFwiUHJvcGVydHlQYXRoXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzSWQgPSB0aGF0Ll9nZW5lcmF0ZVN0YXR1c0luZGV4KG1FbnRpdHlUeXBlLCBzb3VyY2VQcm9wZXJ0eS52YWx1ZSwgb0NvbnRleHQpO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzSWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiAhdGhhdC5fYVNvdXJjZVByb3BlcnRpZXNGYWlsdXJlLmhhcyhzSWQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhhdC5yZXF1ZXN0U2lkZUVmZmVjdHMob1NpZGVFZmZlY3RQcm9wZXJ0eS5zaWRlRWZmZWN0cywgb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChvRXJyb3IgPT4ge1xuXHRcdFx0XHRcdGlmIChiSXNSZXF1ZXN0c1RyaWdnZXJlZCkge1xuXHRcdFx0XHRcdFx0TG9nLmRlYnVnKFwiRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBGaWVsZEdyb3VwIFNpZGVFZmZlY3RzIG9uIGNvbnRleHQgXCIgKyBzQ29udGV4dFBhdGgsIG9FcnJvcik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdFx0ZGVsZXRlIHRoYXQuX21GaWVsZEdyb3VwUXVldWVbb1NpZGVFZmZlY3RQcm9wZXJ0eS5uYW1lXVtzQ29udGV4dFBhdGhdO1xuXHRcdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0YUZpZWxkR3JvdXBJZHMuZm9yRWFjaChzRmllbGRHcm91cElkID0+IHtcblx0XHRcdC8qKlxuXHRcdFx0ICogc3RyaW5nIFwiJCRJbW1lZGlhdGVSZXF1ZXN0XCIgaXMgYWRkZWQgdG8gdGhlIFNpZGVFZmZlY3RzIG5hbWUgZHVyaW5nIHRlbXBsYXRpbmcgdG8ga25vd1xuXHRcdFx0ICogaWYgdGhpcyBTaWRlRWZmZWN0cyBtdXN0IGJlIGltbWVkaWF0ZWx5IGV4ZWN1dGVkIHJlcXVlc3RlZCAob24gZmllbGQgY2hhbmdlKSBvciBtdXN0XG5cdFx0XHQgKiBiZSBkZWZlcnJlZCAob24gZmllbGQgZ3JvdXAgZm9jdXMgb3V0KVxuXHRcdFx0ICpcblx0XHRcdCAqL1xuXHRcdFx0Y29uc3Qgc1NpZGVFZmZlY3ROYW1lOiBzdHJpbmcgPSBzRmllbGRHcm91cElkLnJlcGxhY2UoXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiwgXCJcIik7XG5cdFx0XHRjb25zdCBtQ29udGV4dERlZmVycmVkU2lkZUVmZmVjdHMgPSB0aGF0Ll9tRmllbGRHcm91cFF1ZXVlPy5bc1NpZGVFZmZlY3ROYW1lXTtcblx0XHRcdGlmIChtQ29udGV4dERlZmVycmVkU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0T2JqZWN0LmtleXMobUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzKS5mb3JFYWNoKHNDb250ZXh0UGF0aCA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgb0RlZmVycmVkU2lkZUVmZmVjdCA9IG1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdO1xuXHRcdFx0XHRcdGlmICghb0RlZmVycmVkU2lkZUVmZmVjdC5wcm9jZXNzU3RhcnRlZCkge1xuXHRcdFx0XHRcdFx0b0RlZmVycmVkU2lkZUVmZmVjdC5wcm9jZXNzU3RhcnRlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRhRGVmZXJyZWRTaWRlRWZmZWN0cy5wdXNoKG9EZWZlcnJlZFNpZGVFZmZlY3QpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRhRGVmZXJyZWRTaWRlRWZmZWN0cy5tYXAob0RlZmVycmVkU2lkZUVmZmVjdCA9PiB7XG5cdFx0XHRcdHJldHVybiBnZXRGaWVsZEdyb3VwUmVxdWVzdFByb21pc2Uob0RlZmVycmVkU2lkZUVmZmVjdCk7XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIFNpZGVFZmZlY3RzIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBhZGRDb250cm9sU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNFbnRpdHlUeXBlIE5hbWUgb2YgdGhlIGVudGl0eSB3aGVyZSB0aGUgU2lkZUVmZmVjdHMgY29udHJvbCB3aWxsIGJlIHJlZ2lzdGVyZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9TaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyB0byByZWdpc3Rlci4gRW5zdXJlIHRoZSBzb3VyY2VDb250cm9sSWQgbWF0Y2hlcyB0aGUgYXNzb2NpYXRlZCBTQVBVSTUgY29udHJvbCBJRC5cblx0ICpcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyBhZGRDb250cm9sU2lkZUVmZmVjdHMoc0VudGl0eVR5cGU6IHN0cmluZywgb1NpZGVFZmZlY3RzOiBPbWl0PENvbnRyb2xTaWRlRWZmZWN0c1R5cGUsIFwiZnVsbHlRdWFsaWZpZWROYW1lXCI+KTogdm9pZCB7XG5cdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5hZGRDb250cm9sU2lkZUVmZmVjdHMoc0VudGl0eVR5cGUsIG9TaWRlRWZmZWN0cyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgcXVldWUgY29udGFpbmluZyB0aGUgZmFpbGVkIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVtb3ZlRmFpbGVkU2lkZUVmZmVjdHNcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyByZW1vdmVGYWlsZWRTaWRlRWZmZWN0cygpOiB2b2lkIHtcblx0XHR0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHMgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0IFNpZGVFZmZlY3RzIG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlcXVlc3RTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHJldHVybnMge29iamVjdH0gU2lkZUVmZmVjdHMgcmVxdWVzdCBvbiBTQVBVSTUgY29udGV4dFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIHJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSwgb0NvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPGFueT4ge1xuXHRcdGxldCBmUmVzb2x2ZXI6IGFueSwgZlJlamVjdG9yOiBhbnk7XG5cdFx0Y29uc3Qgb1Byb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGZSZXNvbHZlciA9IHJlc29sdmU7XG5cdFx0XHRmUmVqZWN0b3IgPSByZWplY3Q7XG5cdFx0fSk7XG5cdFx0Y29uc3QgYVRhcmdldHM6IGFueVtdID0gKChvU2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMgYXMgYW55W10pIHx8IFtdKS5jb25jYXQoKG9TaWRlRWZmZWN0cy5UYXJnZXRQcm9wZXJ0aWVzIGFzIGFueVtdKSB8fCBbXSksXG5cdFx0XHRzVHJpZ2dlckFjdGlvbjogU3RyaW5nIHwgdW5kZWZpbmVkID0gKG9TaWRlRWZmZWN0cyBhcyBPRGF0YVNpZGVFZmZlY3RzVHlwZSkuVHJpZ2dlckFjdGlvbjtcblxuXHRcdGlmIChzVHJpZ2dlckFjdGlvbikge1xuXHRcdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5leGVjdXRlQWN0aW9uKHNUcmlnZ2VyQWN0aW9uLCBvQ29udGV4dCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZVxuXHRcdFx0LnJlcXVlc3RTaWRlRWZmZWN0cyhhVGFyZ2V0cywgb0NvbnRleHQpXG5cdFx0XHQudGhlbigoKSA9PiBmUmVzb2x2ZXIoKSlcblx0XHRcdC5jYXRjaCgob0Vycm9yOiBhbnkpID0+IHtcblx0XHRcdFx0dGhpcy5fYWRkRmFpbGVkU2lkZUVmZmVjdHMob1NpZGVFZmZlY3RzLCBvQ29udGV4dCk7XG5cdFx0XHRcdGZSZWplY3RvcihvRXJyb3IpO1xuXHRcdFx0fSk7XG5cblx0XHRyZXR1cm4gb1Byb21pc2U7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBTaWRlRWZmZWN0cyBjcmVhdGVkIGJ5IGEgY29udHJvbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIHJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRyb2wgU0FQVUk1IENvbnRyb2xcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyByZW1vdmVDb250cm9sU2lkZUVmZmVjdHMob0NvbnRyb2w6IENvbnRyb2wpOiB2b2lkIHtcblx0XHRjb25zdCBzQ29udHJvbElkID0gb0NvbnRyb2wgJiYgb0NvbnRyb2wuaXNBICYmIG9Db250cm9sLmlzQShcInNhcC51aS5iYXNlLk1hbmFnZWRPYmplY3RcIikgJiYgb0NvbnRyb2wuZ2V0SWQoKTtcblxuXHRcdGlmIChzQ29udHJvbElkKSB7XG5cdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLnJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyhzQ29udHJvbElkKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBTaWRlRWZmZWN0cyB0byB0aGUgcXVldWUgb2YgdGhlIGZhaWxlZCBTaWRlRWZmZWN0c1xuXHQgKiBUaGUgU2lkZUVmZmVjdHMgd2lsbCBiZSByZXRyaWdnZXJlZCBvbiB0aGUgbmV4dCBjaGFuZ2Ugb24gdGhlIHNhbWUgY29udGV4dC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9hZGRGYWlsZWRTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRoYXQgbmVlZCB0byBiZSByZXRyaWdnZXJlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0NvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBoYXZlIGZhaWxlZFxuXHQgKi9cblx0QFByaXZhdGVcblx0QEZpbmFsXG5cdHByaXZhdGUgX2FkZEZhaWxlZFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlLCBvQ29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aDogc3RyaW5nID0gb0NvbnRleHQuZ2V0UGF0aCgpO1xuXHRcdHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdID0gdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0gfHwgW107XG5cdFx0Y29uc3QgYklzTm90QWxyZWFkeUxpc3RlZCA9IHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdLmV2ZXJ5KFxuXHRcdFx0bUZhaWxlZFNpZGVFZmZlY3RzID0+IG9TaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWUgIT09IG1GYWlsZWRTaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVcblx0XHQpO1xuXHRcdGlmIChiSXNOb3RBbHJlYWR5TGlzdGVkKSB7XG5cdFx0XHR0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbc0NvbnRleHRQYXRoXS5wdXNoKG9TaWRlRWZmZWN0cyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgcHJvbWlzZSBmb3IgdGhlIGZpZWxkIGdyb3VwIHRoYXQgaXMgcmVxdWlyZWQgYmVmb3JlIHJlcXVlc3RpbmcgU2lkZUVmZmVjdHMuXG5cdCAqIElmIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIGFuZCBvbmx5IHRoZSBmaWVsZCByZXF1aXJlcyB0aGUgU2lkZUVmZmVjdHMgb24gdGhpcyBjb250ZXh0LCB0aGUgU2lkZUVmZmVjdHMgYXJlIHJlbW92ZWQgZnJvbSB0aGVcblx0ICogU2lkZUVmZmVjdHMgcXVldWUuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUV2ZW50RmllbGRQcm9wZXJ0aWVzIEZpZWxkIHByb3BlcnRpZXNcblx0ICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSB0byBiZSB1c2VkIGZvciB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZmllbGRcblx0ICovXG5cdHByaXZhdGUgX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlKTogUHJvbWlzZTxhbnk+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcztcblxuXHRcdGxldCBiUHJvbWlzZVN1Y2Nlc3MgPSB0cnVlO1xuXHRcdHJldHVybiBtRXZlbnRGaWVsZFByb3BlcnRpZXMucHJvbWlzZVxuXHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBiUHJvbWlzZVN1Y2Nlc3M7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRiUHJvbWlzZVN1Y2Nlc3MgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIGJQcm9taXNlU3VjY2Vzcztcblx0XHRcdH0pXG5cdFx0XHQuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdC8qKlxuXHRcdFx0XHQgKiBOZWVkIHRvIHN0b3JlIHRoZSBzdGF0dXMgb2YgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoaXMgZmllbGQgZm9yIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdFx0XHRcdCAqIHNpbmNlIGFsbCBTb3VyY2VQcm9wZXJ0aWVzIGZvciB0aGlzIGtpbmQgb2YgU2lkZUVmZmVjdHMgbXVzdCBiZSB2YWxpZFxuXHRcdFx0XHQgKi9cblx0XHRcdFx0dGhhdC5fc2F2ZUZpZWxkUHJvcGVydGllc1N0YXR1cyhtRXZlbnRGaWVsZFByb3BlcnRpZXMuZmllbGQsIGJQcm9taXNlU3VjY2Vzcyk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgdGhlIHByb21pc2UgZm9yIHRoZSBmaWVsZCB0aGF0IGlzIHJlcXVpcmVkIGJlZm9yZSByZXF1ZXN0aW5nIGltbWVkaWF0ZSBTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG1FdmVudEZpZWxkUHJvcGVydGllcyBGaWVsZCBwcm9wZXJ0aWVzXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFByb21pc2UgdG8gYmUgdXNlZCBmb3IgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZpZWxkXG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBvUHJvbWlzZSA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5wcm9taXNlO1xuXHRcdHJldHVybiBvUHJvbWlzZS50aGVuKGZ1bmN0aW9uKCkge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBJZiB0aGUgZmllbGQgZ2V0cyBhIEZpZWxkSGVscGVyLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgYWxsIGZpZWxkcyBjaGFuZ2VkIGJ5IHRoaXMgRmllbGRIZWxwZXIgaGF2ZSBiZWVuIHNldC5cblx0XHRcdCAqIFRvIGFjaGlldmUgdGhpcywgd2UgZW5zdXJlIHRoYXQgYWxsIHJlbGF0ZWQgYmluZGluZ3MgaGF2ZSBiZWVuIHJlc29sdmVkLlxuXHRcdFx0ICpcblx0XHRcdCAqIFRoaXMgcmVzb2x1dGlvbiBwcm9jZXNzIGlzIG5vdCBtYW5hZ2VkIGJ5IHRoZSBGaWVsZCBFdmVudCBQcm9taXNlLCBzbyBmb3IgZmFzdCB1c2VyIGFjdGlvbnMgKGxpa2UgYXV0b21hdGlvbikgaXQgY2FuIGxvY2sgdGhlIG1vZGVsXG5cdFx0XHQgKiBhbmQgbm8gcmVxdWVzdCBjYW4gYmUgZXhlY3V0ZWQuXG5cdFx0XHQgKi9cblx0XHRcdGNvbnN0IG9GaWVsZCA9IG1FdmVudEZpZWxkUHJvcGVydGllcy5maWVsZDtcblx0XHRcdGNvbnN0IHNGaWVsZEhlbHBlcklkID0gb0ZpZWxkLmdldEZpZWxkSGVscCAmJiBvRmllbGQuZ2V0RmllbGRIZWxwKCk7XG5cdFx0XHRpZiAoc0ZpZWxkSGVscGVySWQpIHtcblx0XHRcdFx0Y29uc3Qgb0ZpbHRlckhlbHA6IGFueSA9IHNhcC51aS5nZXRDb3JlKCkuYnlJZChzRmllbGRIZWxwZXJJZCk7XG5cdFx0XHRcdGlmIChvRmlsdGVySGVscCkge1xuXHRcdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRcdChvRmlsdGVySGVscC5nZXRPdXRQYXJhbWV0ZXJzKCkgYXMgYW55W10pLm1hcChvT3V0UGFyYW1ldGVyID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0JpbmRpbmcgPSBvT3V0UGFyYW1ldGVyLmdldEJpbmRpbmcoXCJ2YWx1ZVwiKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9CaW5kaW5nID8gb0JpbmRpbmcucmVxdWVzdFZhbHVlKCkgOiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFtdKTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgYSBzdGF0dXMgaW5kZXguXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2VuZXJhdGVTdGF0dXNJbmRleFxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUVudGl0eVR5cGUgVGhlIGVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzUHJvcGVydHlQYXRoIFRoZSBwcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBTQVBVSTUgQ29udGV4dFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBJbmRleFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2VuZXJhdGVTdGF0dXNJbmRleChtRW50aXR5VHlwZTogRW50aXR5VHlwZSwgc1Byb3BlcnR5UGF0aDogc3RyaW5nLCBvQ29udGV4dD86IENvbnRleHQgfCBudWxsKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBvQ29udGV4dD8uZ2V0UGF0aCgpO1xuXHRcdGNvbnN0IG1Qcm9wZXJ0eSA9IG1FbnRpdHlUeXBlLnJlc29sdmVQYXRoKHNQcm9wZXJ0eVBhdGgpO1xuXHRcdGlmIChtUHJvcGVydHkpIHtcblx0XHRcdGlmIChtUHJvcGVydHkgJiYgbVByb3BlcnR5Ll90eXBlID09PSBcIlByb3BlcnR5XCIpIHtcblx0XHRcdFx0cmV0dXJuIFttUHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lLCBzQ29udGV4dFBhdGhdLmpvaW4oXCJfX1wiKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBhcHByb3ByaWF0ZSBjb250ZXh0IG9uIHdoaWNoIFNpZGVFZmZlY3RzIGNhbiBiZSByZXF1ZXN0ZWQuXG5cdCAqIFRoZSBjb3JyZWN0IG9uZSBtdXN0IGhhdmUgdGhlIGJpbmRpbmcgcGFyYW1ldGVyICQkcGF0Y2hXaXRob3V0U2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU291cmNlRmllbGQgRmllbGRcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNTaWRlRWZmZWN0RW50aXR5VHlwZSBUYXJnZXQgZW50aXR5IHR5cGUgb2YgdGhlIFNpZGVFZmZlY3RzIGFubm90YXRpb25cblx0ICogQHJldHVybnMge29iamVjdH0gU0FQVUk1IENvbnRleHRcblx0ICovXG5cdEBQcml2YXRlXG5cdEBGaW5hbFxuXHRwcml2YXRlIF9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHMob1NvdXJjZUZpZWxkOiBGaWVsZENvbnRyb2wsIHNTaWRlRWZmZWN0RW50aXR5VHlwZTogc3RyaW5nKTogQ29udGV4dCB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3Qgb0JpbmRpbmdDb250ZXh0ID0gb1NvdXJjZUZpZWxkLmdldEJpbmRpbmdDb250ZXh0KCk7XG5cdFx0bGV0IG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgPSBvQmluZGluZ0NvbnRleHQsXG5cdFx0XHRzRW50aXR5VHlwZSA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9CaW5kaW5nQ29udGV4dCk7XG5cblx0XHRpZiAoc1NpZGVFZmZlY3RFbnRpdHlUeXBlICE9PSBzRW50aXR5VHlwZSkge1xuXHRcdFx0b0NvbnRleHRGb3JTaWRlRWZmZWN0cyA9IChvQmluZGluZ0NvbnRleHQgYXMgYW55KS5nZXRCaW5kaW5nKCkuZ2V0Q29udGV4dCgpO1xuXHRcdFx0aWYgKG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0c0VudGl0eVR5cGUgPSB0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChvQ29udGV4dEZvclNpZGVFZmZlY3RzKTtcblx0XHRcdFx0aWYgKHNTaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0XHRvQ29udGV4dEZvclNpZGVFZmZlY3RzID0gKG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgYXMgYW55KS5nZXRCaW5kaW5nKCkuZ2V0Q29udGV4dCgpO1xuXHRcdFx0XHRcdGlmIChvQ29udGV4dEZvclNpZGVFZmZlY3RzKSB7XG5cdFx0XHRcdFx0XHRzRW50aXR5VHlwZSA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMpO1xuXHRcdFx0XHRcdFx0aWYgKHNTaWRlRWZmZWN0RW50aXR5VHlwZSAhPT0gc0VudGl0eVR5cGUpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb0NvbnRleHRGb3JTaWRlRWZmZWN0cyB8fCB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBFbnRpdHlUeXBlIGJhc2VkIG9uIGl0cyBmdWxseS1xdWFsaWZpZWQgbmFtZS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNGdWxseVF1YWxpZmllZE5hbWUgVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBlbnRpdHkgdHlwZVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RW50aXR5VHlwZUZyb21GUU4oc0Z1bGx5UXVhbGlmaWVkTmFtZTogc3RyaW5nKTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgbUVudGl0eVR5cGUgPSAodGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKSBhcyBDb252ZXJ0ZXJPdXRwdXQpLmVudGl0eVR5cGVzLmZpbmQob0VudGl0eVR5cGUgPT4ge1xuXHRcdFx0cmV0dXJuIG9FbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSA9PT0gc0Z1bGx5UXVhbGlmaWVkTmFtZTtcblx0XHR9KTtcblx0XHRyZXR1cm4gbUVudGl0eVR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgcHJvbWlzZSBvZiB0aGUgZmllbGQgdmFsaWRhdGlvbiB0aGF0IGlzIHJlcXVpcmVkIGZvciB0aGUgU2lkZUVmZmVjdHMgcHJvY2Vzcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRGaWVsZFByb21pc2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBGaWVsZCBjaGFuZ2UgZXZlbnRcblx0ICogQHJldHVybnMge29iamVjdH0gRmllbGQgcHJvbWlzZVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RmllbGRQcm9taXNlKG9FdmVudDogVUk1RXZlbnQpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IHByb21pc2UgPSBvRXZlbnQuZ2V0UGFyYW1ldGVyKFwicHJvbWlzZVwiKSB8fCBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdHJldHVybiBwcm9taXNlLnRoZW4oKCkgPT4ge1xuXHRcdFx0Y29uc3Qgb1Byb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdFx0aWYgKCFGaWVsZFJ1bnRpbWUuZ2V0RmllbGRTdGF0ZU9uQ2hhbmdlKG9FdmVudCkuc3RhdGUudmFsaWRpdHkpIHtcblx0XHRcdFx0XHRyZWplY3QoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiBvUHJvbWlzZTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBmaWVsZCB0aGF0IGFyZSByZXF1aXJlZCBmb3IgdGhlIFNpZGVFZmZlY3RzIHByb2Nlc3MuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0RmllbGRQcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRXZlbnQgRmllbGQgY2hhbmdlIGV2ZW50XG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IEZpZWxkIHByb3BlcnRpZXMgKGV2ZW50IGNoYW5nZSBwcm9taXNlLCBmaWVsZCwgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byB0aGlzIGZpZWxkKVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RmllbGRQcm9wZXJ0aWVzKG9FdmVudDogVUk1RXZlbnQpOiBGaWVsZEV2ZW50UHJvcGVydHlUeXBlIHtcblx0XHRjb25zdCBvRmllbGQ6IEZpZWxkQ29udHJvbCA9IG9FdmVudC5nZXRTb3VyY2UoKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRwcm9taXNlOiB0aGlzLl9nZXRGaWVsZFByb21pc2Uob0V2ZW50KSxcblx0XHRcdGZpZWxkOiBvRmllbGQsXG5cdFx0XHRzaWRlRWZmZWN0c01hcDogdGhpcy5fZ2V0RmllbGRTaWRlRWZmZWN0c01hcChvRmllbGQpXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyBtYXBcblx0ICogVGhlc2UgU2lkZUVmZmVjdHMgYXJlXG5cdCAqIC0gbGlzdGVkIGludG8gRmllbGRHcm91cElkcyAoY29taW5nIGZyb20gYW4gT0RhdGEgU2VydmljZSlcblx0ICogLSBnZW5lcmF0ZWQgYnkgYSBjb250cm9sIG9yIGNvbnRyb2xzIGFuZCB0aGF0IGNvbmZpZ3VyZSB0aGlzIGZpZWxkIGFzIFNvdXJjZVByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0RmllbGRTaWRlRWZmZWN0c01hcFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkIEZpZWxkXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIG1hcFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RmllbGRTaWRlRWZmZWN0c01hcChvRmllbGQ6IEZpZWxkQ29udHJvbCk6IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdGNvbnN0IG1TaWRlRWZmZWN0c01hcDogRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IHt9LFxuXHRcdFx0YUZpZWxkR3JvdXBJZHM6IHN0cmluZ1tdID0gb0ZpZWxkLmdldEZpZWxkR3JvdXBJZHMoKSxcblx0XHRcdHNWaWV3RW50aXR5U2V0U2V0TmFtZSA9IHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCkuZW50aXR5U2V0LFxuXHRcdFx0b1ZpZXdFbnRpdHlTZXQgPSAodGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKSBhcyBDb252ZXJ0ZXJPdXRwdXQpLmVudGl0eVNldHMuZmluZChvRW50aXR5U2V0ID0+IHtcblx0XHRcdFx0cmV0dXJuIG9FbnRpdHlTZXQubmFtZSA9PT0gc1ZpZXdFbnRpdHlTZXRTZXROYW1lO1xuXHRcdFx0fSk7XG5cblx0XHQvLyBTaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdFx0YUZpZWxkR3JvdXBJZHMuZm9yRWFjaChzRmllbGRHcm91cElkID0+IHtcblx0XHRcdGNvbnN0IGJJc0ltbWVkaWF0ZTogYm9vbGVhbiA9IHNGaWVsZEdyb3VwSWQuaW5kZXhPZihcIiQkSW1tZWRpYXRlUmVxdWVzdFwiKSAhPT0gLTEsXG5cdFx0XHRcdHNOYW1lOiBzdHJpbmcgPSBzRmllbGRHcm91cElkLnJlcGxhY2UoXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiwgXCJcIiksXG5cdFx0XHRcdGFTaWRlRWZmZWN0UGFydHM6IHN0cmluZ1tdID0gc05hbWUuc3BsaXQoXCIjXCIpLFxuXHRcdFx0XHRzU2lkZUVmZmVjdEVudGl0eVR5cGU6IHN0cmluZyA9IGFTaWRlRWZmZWN0UGFydHNbMF0sXG5cdFx0XHRcdHNTaWRlRWZmZWN0UGF0aDogc3RyaW5nID1cblx0XHRcdFx0XHRzU2lkZUVmZmVjdEVudGl0eVR5cGUgK1xuXHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TaWRlRWZmZWN0c1wiICtcblx0XHRcdFx0XHQoYVNpZGVFZmZlY3RQYXJ0cy5sZW5ndGggPT09IDIgPyBcIiNcIiArIGFTaWRlRWZmZWN0UGFydHNbMV0gOiBcIlwiKSxcblx0XHRcdFx0b1NpZGVFZmZlY3Q6IFNpZGVFZmZlY3RzVHlwZSB8IHVuZGVmaW5lZCA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhzU2lkZUVmZmVjdEVudGl0eVR5cGUpPy5bXG5cdFx0XHRcdFx0c1NpZGVFZmZlY3RQYXRoXG5cdFx0XHRcdF0sXG5cdFx0XHRcdG9Db250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkID0gdGhpcy5fZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzKG9GaWVsZCwgc1NpZGVFZmZlY3RFbnRpdHlUeXBlKTtcblx0XHRcdGlmIChvU2lkZUVmZmVjdCAmJiBvQ29udGV4dCkge1xuXHRcdFx0XHRtU2lkZUVmZmVjdHNNYXBbc05hbWVdID0ge1xuXHRcdFx0XHRcdG5hbWU6IHNOYW1lLFxuXHRcdFx0XHRcdGltbWVkaWF0ZTogYklzSW1tZWRpYXRlLFxuXHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvU2lkZUVmZmVjdCxcblx0XHRcdFx0XHRjb250ZXh0OiBvQ29udGV4dFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly9TaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBjb250cm9sKHMpXG5cdFx0aWYgKHNWaWV3RW50aXR5U2V0U2V0TmFtZSAmJiBvVmlld0VudGl0eVNldCkge1xuXHRcdFx0Y29uc3Qgc1ZpZXdFbnRpdHlUeXBlID0gb1ZpZXdFbnRpdHlTZXQuZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdG1GaWVsZFBhdGg6IGFueSA9IChvRmllbGQuZ2V0QWdncmVnYXRpb24oXCJjdXN0b21EYXRhXCIpIGFzIGFueVtdKS5maW5kKG9DdXN0b21EYXRhID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1c3RvbURhdGEuZ2V0S2V5KCkgPT09IFwic291cmNlUGF0aFwiO1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0b0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSB0aGlzLl9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHMob0ZpZWxkLCBzVmlld0VudGl0eVR5cGUpO1xuXG5cdFx0XHRpZiAobUZpZWxkUGF0aCAmJiBvQ29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBzRmllbGRQYXRoID0gbUZpZWxkUGF0aC5nZXRWYWx1ZSgpLnJlcGxhY2UoXCIvXCIgKyBzVmlld0VudGl0eVNldFNldE5hbWUgKyBcIi9cIiwgXCJcIiksXG5cdFx0XHRcdFx0bUNvbnRyb2xFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHMoXG5cdFx0XHRcdFx0XHRzVmlld0VudGl0eVR5cGVcblx0XHRcdFx0XHQpIGFzIENvbnRyb2xTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnk7XG5cdFx0XHRcdE9iamVjdC5rZXlzKG1Db250cm9sRW50aXR5VHlwZSkuZm9yRWFjaChzQ29udHJvbE5hbWUgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9Db250cm9sU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSA9IG1Db250cm9sRW50aXR5VHlwZVtzQ29udHJvbE5hbWVdO1xuXHRcdFx0XHRcdGlmICgob0NvbnRyb2xTaWRlRWZmZWN0cy5Tb3VyY2VQcm9wZXJ0aWVzIGFzIHN0cmluZ1tdKS5pbmNsdWRlcyhzRmllbGRQYXRoKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc05hbWUgPSBzQ29udHJvbE5hbWUgKyBcIjo6XCIgKyBzVmlld0VudGl0eVR5cGU7XG5cdFx0XHRcdFx0XHRtU2lkZUVmZmVjdHNNYXBbc05hbWVdID0ge1xuXHRcdFx0XHRcdFx0XHRuYW1lOiBzTmFtZSxcblx0XHRcdFx0XHRcdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRzaWRlRWZmZWN0czogb0NvbnRyb2xTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdFx0Y29udGV4dDogb0NvbnRleHRcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG1TaWRlRWZmZWN0c01hcDtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSBTaWRlRWZmZWN0cyB3aXRoIHJlbGF0ZWQgY2hhbmdlcyB0byBhIGZpZWxkXG5cdCAqIExpc3Q6IGdldHMgaW1tZWRpYXRlIFNpZGVFZmZlY3RzIHJlcXVlc3RzXG5cdCAqIFJlZ2lzdGVyOiBjYWNoZXMgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIEZpZWxkR3JvdXAgaXMgdW5mb2N1c2VkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRXZlbnRGaWVsZFByb3BlcnRpZXMgRmllbGQgZXZlbnQgcHJvcGVydGllc1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgYmVmb3JlIGV4ZWN1dGluZyBkZWZlcnJlZCBTaWRlRWZmZWN0c1xuXHQgKiBAcmV0dXJucyB7QXJyYXl9ICBBcnJheSBvZiBpbW1lZGlhdGUgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzKFxuXHRcdG1FdmVudEZpZWxkUHJvcGVydGllczogRmllbGRFdmVudFByb3BlcnR5VHlwZSxcblx0XHRvRmllbGRHcm91cFByZVJlcXVpc2l0ZT86IFByb21pc2U8YW55PlxuXHQpOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSB7XG5cdFx0Y29uc3QgbUZpZWxkU2lkZUVmZmVjdHNNYXAgPSBtRXZlbnRGaWVsZFByb3BlcnRpZXMuc2lkZUVmZmVjdHNNYXAsXG5cdFx0XHRvRmllbGRQcm9taXNlRm9yRmllbGRHcm91cCA9IHRoaXMuX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzKSwgLy8gUHJvbWlzZSBtYW5hZ2luZyBGaWVsZEdyb3VwIHJlcXVlc3RzIGlmIEZpZWxkIHByb21pc2UgZmFpbHNcblx0XHRcdG1GYWlsZWRTaWRlRWZmZWN0c05hbWU6IGFueSA9IHt9LFxuXHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllczogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlW10gPSBbXTtcblxuXHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlID0gb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0XHRPYmplY3Qua2V5cyhtRmllbGRTaWRlRWZmZWN0c01hcCkuZm9yRWFjaChzU2lkZUVmZmVjdE5hbWUgPT4ge1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RQcm9wZXJ0eTogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0gbUZpZWxkU2lkZUVmZmVjdHNNYXBbc1NpZGVFZmZlY3ROYW1lXSxcblx0XHRcdFx0c1NpZGVFZmZlY3RDb250ZXh0UGF0aCA9IG9TaWRlRWZmZWN0UHJvcGVydHkuY29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRcdGFGYWlsZWRTaWRlRWZmZWN0cyA9IHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzU2lkZUVmZmVjdENvbnRleHRQYXRoXTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlcmUgaXMgYW55IHByZXZpb3VzbHkgZmFpbGVkIHJlcXVlc3QgZm9yIHRoaXMgY29udGV4dFxuXHRcdFx0aWYgKGFGYWlsZWRTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdO1xuXHRcdFx0XHRtRmFpbGVkU2lkZUVmZmVjdHNOYW1lW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdID0ge307XG5cdFx0XHRcdGFGYWlsZWRTaWRlRWZmZWN0cy5mb3JFYWNoKG1GYWlsZWRTaWRlRWZmZWN0cyA9PiB7XG5cdFx0XHRcdFx0bUZhaWxlZFNpZGVFZmZlY3RzTmFtZVtzU2lkZUVmZmVjdENvbnRleHRQYXRoXVttRmFpbGVkU2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRydWU7XG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcy5wdXNoKHtcblx0XHRcdFx0XHRcdG5hbWU6IHNTaWRlRWZmZWN0TmFtZSxcblx0XHRcdFx0XHRcdHByZXZpb3VzbHlGYWlsZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRzaWRlRWZmZWN0czogbUZhaWxlZFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0Y29udGV4dDogb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9TaWRlRWZmZWN0UHJvcGVydHkuaW1tZWRpYXRlKSB7XG5cdFx0XHRcdC8vIFNpZGVFZmZlY3RzIHdpbGwgYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZXZlbnQgcHJvbWlzZSB2YWxpZGF0aW9uXG5cdFx0XHRcdGlmICghbUZhaWxlZFNpZGVFZmZlY3RzTmFtZVtzU2lkZUVmZmVjdENvbnRleHRQYXRoXT8uW29TaWRlRWZmZWN0UHJvcGVydHkuc2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXSkge1xuXHRcdFx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRuYW1lOiBzU2lkZUVmZmVjdE5hbWUsXG5cdFx0XHRcdFx0XHRzaWRlRWZmZWN0czogb1NpZGVFZmZlY3RQcm9wZXJ0eS5zaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdGNvbnRleHQ6IG9TaWRlRWZmZWN0UHJvcGVydHkuY29udGV4dFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBBZGQgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdG8gdGhlIHJlbGF0ZWQgZGljdGlvbmFyeVxuXHRcdFx0XHR0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV0gPSB0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV0gfHwge307XG5cdFx0XHRcdGNvbnN0IG1TaWRlRWZmZWN0Q29udGV4dFBhdGggPSB0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV1bc1NpZGVFZmZlY3RDb250ZXh0UGF0aF0gfHwge1xuXHRcdFx0XHRcdHByb21pc2VzOiBbXSxcblx0XHRcdFx0XHRzaWRlRWZmZWN0UHJvcGVydHk6IG9TaWRlRWZmZWN0UHJvcGVydHksXG5cdFx0XHRcdFx0cHJvY2Vzc1N0YXJ0ZWQ6IGZhbHNlXG5cdFx0XHRcdH07XG5cdFx0XHRcdG1TaWRlRWZmZWN0Q29udGV4dFBhdGgucHJvbWlzZXMgPSBtU2lkZUVmZmVjdENvbnRleHRQYXRoLnByb21pc2VzLmNvbmNhdChbXG5cdFx0XHRcdFx0b0ZpZWxkUHJvbWlzZUZvckZpZWxkR3JvdXAsXG5cdFx0XHRcdFx0b0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgYXMgUHJvbWlzZTxhbnk+XG5cdFx0XHRcdF0pO1xuXHRcdFx0XHR0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV1bc1NpZGVFZmZlY3RDb250ZXh0UGF0aF0gPSBtU2lkZUVmZmVjdENvbnRleHRQYXRoO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSB2YWxpZGF0aW9uIHN0YXR1cyBvZiBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gYSBmaWVsZCBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkIEZpZWxkXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYlN1Y2Nlc3MgU3RhdHVzIG9mIHRoZSBmaWVsZCB2YWxpZGF0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9zYXZlRmllbGRQcm9wZXJ0aWVzU3RhdHVzKG9GaWVsZDogRmllbGRDb250cm9sLCBiU3VjY2VzczogYm9vbGVhbik6IHZvaWQge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9GaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IHNFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0JpbmRpbmdDb250ZXh0KTtcblx0XHRjb25zdCBtRW50aXR5VHlwZSA9IHRoaXMuX2dldEVudGl0eVR5cGVGcm9tRlFOKHNFbnRpdHlUeXBlKTtcblx0XHRpZiAobUVudGl0eVR5cGUpIHtcblx0XHRcdC8vIFJldHJpZXZlcyBhbGwgcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBmaWVsZFxuXHRcdFx0Y29uc3Qgb0ZpZWxkQmluZGluZzogYW55ID0gdGhpcy5fZ2V0QmluZGluZ0ZvckZpZWxkKG9GaWVsZCk7XG5cdFx0XHRjb25zdCBhRmllbGRQYXRocyA9IG9GaWVsZEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLkNvbXBvc2l0ZUJpbmRpbmdcIilcblx0XHRcdFx0PyAob0ZpZWxkQmluZGluZy5nZXRCaW5kaW5ncygpIHx8IFtdKS5tYXAoKG9CaW5kaW5nOiBhbnkpID0+IG9CaW5kaW5nLnNQYXRoKVxuXHRcdFx0XHQ6IFtvRmllbGRCaW5kaW5nLmdldFBhdGgoKV07XG5cblx0XHRcdC8vIFN0b3JlcyBzdGF0dXMgZm9yIGFsbCBwcm9wZXJ0aWVzXG5cdFx0XHRhRmllbGRQYXRocy5mb3JFYWNoKChzRmllbGRQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0Y29uc3Qgc0lkID0gdGhpcy5fZ2VuZXJhdGVTdGF0dXNJbmRleChtRW50aXR5VHlwZSwgc0ZpZWxkUGF0aCwgb0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0aWYgKHNJZCkge1xuXHRcdFx0XHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZVtiU3VjY2VzcyA/IFwiZGVsZXRlXCIgOiBcImFkZFwiXShzSWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBwcm9wZXJ0eSBiaW5kaW5nIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRmllbGQgRmllbGRcblx0ICogQHJldHVybnMge0JpbmRpbmd9ICBCaW5kaW5nIHRvIHRoZSB2YWx1ZVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0QmluZGluZ0ZvckZpZWxkKG9GaWVsZDogRmllbGRDb250cm9sKTogQmluZGluZyB7XG5cdFx0bGV0IHNCaW5kaW5nTmFtZSA9IFwidmFsdWVcIjtcblx0XHRpZiAob0ZpZWxkLmlzQShcInNhcC5tLkNoZWNrQm94XCIpKSB7XG5cdFx0XHRzQmluZGluZ05hbWUgPSBcInNlbGVjdGVkXCI7XG5cdFx0fSBlbHNlIGlmIChvRmllbGQuaXNBKFwic2FwLnVpLnVuaWZpZWQuRmlsZVVwbG9hZGVyXCIpKSB7XG5cdFx0XHRzQmluZGluZ05hbWUgPSBcInVwbG9hZFVybFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gb0ZpZWxkLmdldEJpbmRpbmcoc0JpbmRpbmdOYW1lKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBTaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb247XG4iXX0=
|
|
669
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzLnRzIl0sIm5hbWVzIjpbIlNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiIsIlVJNUNsYXNzIiwiQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIiwiT3ZlcnJpZGUiLCJvbkluaXQiLCJfb1ZpZXciLCJiYXNlIiwiZ2V0VmlldyIsIl9vQXBwQ29tcG9uZW50IiwiQ29tbW9uVXRpbHMiLCJnZXRBcHBDb21wb25lbnQiLCJfb1NpZGVFZmZlY3RzU2VydmljZSIsImdldFNpZGVFZmZlY3RzU2VydmljZSIsIl9tRmllbGRHcm91cFF1ZXVlIiwiX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZSIsIlNldCIsIl9tRmFpbGVkU2lkZUVmZmVjdHMiLCJjbGVhclByb3BlcnRpZXNTdGF0dXMiLCJjbGVhciIsImdldFJlZ2lzdGVyZWRGYWlsZWRSZXF1ZXN0cyIsImhhbmRsZUZpZWxkQ2hhbmdlIiwib0V2ZW50Iiwib0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUiLCJtRXZlbnRGaWVsZFByb3BlcnRpZXMiLCJfZ2V0RmllbGRQcm9wZXJ0aWVzIiwiYUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcyIsIl9pbml0aWFsaXplRmllbGRTaWRlRWZmZWN0cyIsImJJc0ltbWVkaWF0ZVRyaWdnZXJlZCIsIl9nZW5lcmF0ZUltbWVkaWF0ZVByb21pc2UiLCJ0aGVuIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsIm1TaWRlRWZmZWN0c1Byb3BlcnR5IiwicmVxdWVzdFNpZGVFZmZlY3RzIiwic2lkZUVmZmVjdHMiLCJjb250ZXh0IiwiY2F0Y2giLCJvRXJyb3IiLCJMb2ciLCJkZWJ1ZyIsImZpbHRlciIsIm1JbW1lZGlhdGVTaWRlRWZmZWN0cyIsInByZXZpb3VzbHlGYWlsZWQiLCJmb3JFYWNoIiwiX2FkZEZhaWxlZFNpZGVFZmZlY3RzIiwiaGFuZGxlRmllbGRHcm91cENoYW5nZSIsInRoYXQiLCJhRGVmZXJyZWRTaWRlRWZmZWN0cyIsImFGaWVsZEdyb3VwSWRzIiwiZ2V0UGFyYW1ldGVyIiwiZ2V0RmllbGRHcm91cFJlcXVlc3RQcm9taXNlIiwib0RlZmVycmVkU2lkZUVmZmVjdCIsImJJc1JlcXVlc3RzVHJpZ2dlcmVkIiwib1NpZGVFZmZlY3RQcm9wZXJ0eSIsInNpZGVFZmZlY3RQcm9wZXJ0eSIsIm9Db250ZXh0Iiwic0NvbnRleHRQYXRoIiwiZ2V0UGF0aCIsInNFbnRpdHlUeXBlIiwiZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0IiwibUVudGl0eVR5cGUiLCJfZ2V0RW50aXR5VHlwZUZyb21GUU4iLCJwcm9taXNlcyIsIlNvdXJjZVByb3BlcnRpZXMiLCJldmVyeSIsInNvdXJjZVByb3BlcnR5IiwidHlwZSIsInNJZCIsIl9nZW5lcmF0ZVN0YXR1c0luZGV4IiwidmFsdWUiLCJoYXMiLCJmaW5hbGx5IiwibmFtZSIsInNGaWVsZEdyb3VwSWQiLCJzU2lkZUVmZmVjdE5hbWUiLCJyZXBsYWNlIiwibUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzIiwiT2JqZWN0Iiwia2V5cyIsInByb2Nlc3NTdGFydGVkIiwicHVzaCIsImFkZENvbnRyb2xTaWRlRWZmZWN0cyIsIm9TaWRlRWZmZWN0cyIsInJlbW92ZUZhaWxlZFNpZGVFZmZlY3RzIiwiZlJlc29sdmVyIiwiZlJlamVjdG9yIiwib1Byb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiYVRhcmdldHMiLCJUYXJnZXRFbnRpdGllcyIsImNvbmNhdCIsIlRhcmdldFByb3BlcnRpZXMiLCJzVHJpZ2dlckFjdGlvbiIsIlRyaWdnZXJBY3Rpb24iLCJleGVjdXRlQWN0aW9uIiwicmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzIiwib0NvbnRyb2wiLCJzQ29udHJvbElkIiwiaXNBIiwiZ2V0SWQiLCJiSXNOb3RBbHJlYWR5TGlzdGVkIiwibUZhaWxlZFNpZGVFZmZlY3RzIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwiX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2UiLCJiUHJvbWlzZVN1Y2Nlc3MiLCJwcm9taXNlIiwiX3NhdmVGaWVsZFByb3BlcnRpZXNTdGF0dXMiLCJmaWVsZCIsIm9GaWVsZCIsInNGaWVsZEhlbHBlcklkIiwiZ2V0RmllbGRIZWxwIiwib0ZpbHRlckhlbHAiLCJzYXAiLCJ1aSIsImdldENvcmUiLCJieUlkIiwiZ2V0T3V0UGFyYW1ldGVycyIsIm9PdXRQYXJhbWV0ZXIiLCJvQmluZGluZyIsImdldEJpbmRpbmciLCJyZXF1ZXN0VmFsdWUiLCJzUHJvcGVydHlQYXRoIiwibVByb3BlcnR5IiwicmVzb2x2ZVBhdGgiLCJfdHlwZSIsImpvaW4iLCJ1bmRlZmluZWQiLCJfZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzIiwib1NvdXJjZUZpZWxkIiwic1NpZGVFZmZlY3RFbnRpdHlUeXBlIiwib0JpbmRpbmdDb250ZXh0IiwiZ2V0QmluZGluZ0NvbnRleHQiLCJvQ29udGV4dEZvclNpZGVFZmZlY3RzIiwiZ2V0Q29udGV4dCIsInNGdWxseVF1YWxpZmllZE5hbWUiLCJnZXRDb252ZXJ0ZWRNZXRhTW9kZWwiLCJlbnRpdHlUeXBlcyIsImZpbmQiLCJvRW50aXR5VHlwZSIsIl9nZXRGaWVsZFByb21pc2UiLCJGaWVsZFJ1bnRpbWUiLCJnZXRGaWVsZFN0YXRlT25DaGFuZ2UiLCJzdGF0ZSIsInZhbGlkaXR5IiwiZ2V0U291cmNlIiwic2lkZUVmZmVjdHNNYXAiLCJfZ2V0RmllbGRTaWRlRWZmZWN0c01hcCIsIm1TaWRlRWZmZWN0c01hcCIsImdldEZpZWxkR3JvdXBJZHMiLCJzVmlld0VudGl0eVNldFNldE5hbWUiLCJnZXRWaWV3RGF0YSIsImVudGl0eVNldCIsIm9WaWV3RW50aXR5U2V0IiwiZW50aXR5U2V0cyIsIm9FbnRpdHlTZXQiLCJiSXNJbW1lZGlhdGUiLCJpbmRleE9mIiwic05hbWUiLCJhU2lkZUVmZmVjdFBhcnRzIiwic3BsaXQiLCJzU2lkZUVmZmVjdFBhdGgiLCJsZW5ndGgiLCJvU2lkZUVmZmVjdCIsImdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJpbW1lZGlhdGUiLCJzVmlld0VudGl0eVR5cGUiLCJlbnRpdHlUeXBlIiwibUZpZWxkUGF0aCIsImdldEFnZ3JlZ2F0aW9uIiwib0N1c3RvbURhdGEiLCJnZXRLZXkiLCJzRmllbGRQYXRoIiwiZ2V0VmFsdWUiLCJtQ29udHJvbEVudGl0eVR5cGUiLCJnZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHMiLCJzQ29udHJvbE5hbWUiLCJvQ29udHJvbFNpZGVFZmZlY3RzIiwiaW5jbHVkZXMiLCJtRmllbGRTaWRlRWZmZWN0c01hcCIsIm9GaWVsZFByb21pc2VGb3JGaWVsZEdyb3VwIiwibUZhaWxlZFNpZGVFZmZlY3RzTmFtZSIsInNTaWRlRWZmZWN0Q29udGV4dFBhdGgiLCJhRmFpbGVkU2lkZUVmZmVjdHMiLCJtU2lkZUVmZmVjdENvbnRleHRQYXRoIiwiYlN1Y2Nlc3MiLCJvRmllbGRCaW5kaW5nIiwiX2dldEJpbmRpbmdGb3JGaWVsZCIsImFGaWVsZFBhdGhzIiwiZ2V0QmluZGluZ3MiLCJzUGF0aCIsInNCaW5kaW5nTmFtZSIsIkNvbnRyb2xsZXJFeHRlbnNpb24iLCJQdWJsaWMiLCJGaW5hbCIsIlByaXZhdGUiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQXFETUEsOEIsV0FETEMsUUFBUSxDQUFDLDhDQUFELEVBQWlEQywyQkFBakQsQyxVQVNQQyxRQUFRLEU7Ozs7Ozs7OztXQUNGQyxNLEdBRFAsa0JBQ2dCO0FBQ2YsV0FBS0MsTUFBTCxHQUFlLElBQUQsQ0FBY0MsSUFBZCxDQUFtQkMsT0FBbkIsRUFBZDtBQUNBLFdBQUtDLGNBQUwsR0FBc0JDLFdBQVcsQ0FBQ0MsZUFBWixDQUE0QixLQUFLTCxNQUFqQyxDQUF0QjtBQUNBLFdBQUtNLG9CQUFMLEdBQTZCLEtBQUtILGNBQU4sQ0FBNkJJLHFCQUE3QixFQUE1QjtBQUNBLFdBQUtDLGlCQUFMLEdBQXlCLEVBQXpCO0FBQ0EsV0FBS0MseUJBQUwsR0FBaUMsSUFBSUMsR0FBSixFQUFqQztBQUNBLFdBQUtDLG1CQUFMLEdBQTJCLEVBQTNC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Q0Q7QUFFRDtBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztXQUNTd0gsbUIsR0FBUiw2QkFBNEI5RSxNQUE1QixFQUEyRDtBQUMxRCxVQUFJa0YsWUFBWSxHQUFHLE9BQW5COztBQUNBLFVBQUlsRixNQUFNLENBQUNWLEdBQVAsQ0FBVyxnQkFBWCxDQUFKLEVBQWtDO0FBQ2pDNEYsUUFBQUEsWUFBWSxHQUFHLFVBQWY7QUFDQSxPQUZELE1BRU8sSUFBSWxGLE1BQU0sQ0FBQ1YsR0FBUCxDQUFXLDZCQUFYLENBQUosRUFBK0M7QUFDckQ0RixRQUFBQSxZQUFZLEdBQUcsV0FBZjtBQUNBOztBQUNELGFBQU9sRixNQUFNLENBQUNXLFVBQVAsQ0FBa0J1RSxZQUFsQixDQUFQO0FBQ0EsSzs7O0lBNW5CMkNDLG1CLDZOQXdCM0NDLE0sRUFDQUMsSyxpTEFZQUQsTSxFQUNBQyxLLDZLQWlCQUQsTSxFQUNBQyxLLHdLQTZDQUQsTSxFQUNBQyxLLDRLQWtGQUQsTSxFQUNBQyxLLDZLQVdBRCxNLEVBQ0FDLEssMEtBY0FELE0sRUFDQUMsSywyS0FnQ0FELE0sRUFDQUMsSyw4S0FrQkFDLE8sRUFDQUQsSywrS0E4R0FDLE8sRUFDQUQsSztTQXdRYW5NLDhCIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvQmluZGluZ1wiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgQ29udHJvbGxlckV4dGVuc2lvbk1ldGFkYXRhIGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9Db250cm9sbGVyRXh0ZW5zaW9uTWV0YWRhdGFcIjtcbmltcG9ydCB7IFVJNUNsYXNzLCBPdmVycmlkZSwgUHVibGljLCBGaW5hbCwgUHJpdmF0ZSB9IGZyb20gXCIuLi9oZWxwZXJzL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHtcblx0U2lkZUVmZmVjdHNUeXBlLFxuXHRDb250cm9sU2lkZUVmZmVjdHNUeXBlLFxuXHRPRGF0YVNpZGVFZmZlY3RzVHlwZSxcblx0Q29udHJvbFNpZGVFZmZlY3RzRW50aXR5RGljdGlvbmFyeVxufSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHsgRmllbGRSdW50aW1lIH0gZnJvbSBcInNhcC9mZS9tYWNyb3MvZmllbGRcIjtcbmltcG9ydCB7IENvbnZlcnRlck91dHB1dCwgUHJvcGVydHlQYXRoLCBFbnRpdHlUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBDb21tb25VdGlscyBmcm9tIFwiLi4vQ29tbW9uVXRpbHNcIjtcblxudHlwZSBGaWVsZENvbnRyb2wgPSBDb250cm9sICYge1xuXHRnZXRGaWVsZEhlbHAoKTogc3RyaW5nO1xuXHRnZXRGaWVsZEdyb3VwSWRzKCk6IHN0cmluZ1tdO1xufTtcblxudHlwZSBGaWVsZEV2ZW50UHJvcGVydHlUeXBlID0ge1xuXHRwcm9taXNlOiBQcm9taXNlPGFueT47XG5cdGZpZWxkOiBGaWVsZENvbnRyb2w7XG5cdHNpZGVFZmZlY3RzTWFwOiBGaWVsZFNpZGVFZmZlY3REaWN0aW9uYXJ5O1xufTtcblxudHlwZSBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGUgPSB7XG5cdG5hbWU6IHN0cmluZztcblx0aW1tZWRpYXRlPzogYm9vbGVhbjtcblx0Y29udGV4dDogQ29udGV4dDtcblx0c2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZTtcblx0cHJldmlvdXNseUZhaWxlZD86IGJvb2xlYW47XG59O1xuXG50eXBlIEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGU+O1xuXG50eXBlIEZhaWxlZFNpZGVFZmZlY3REaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdHNUeXBlW10+O1xuXG50eXBlIEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZSA9IHtcblx0cHJvbWlzZXM6IFByb21pc2U8YW55PltdO1xuXHRzaWRlRWZmZWN0UHJvcGVydHk6IEZpZWxkU2lkZUVmZmVjdFByb3BlcnR5VHlwZTtcblx0cHJvY2Vzc1N0YXJ0ZWQ/OiBib29sZWFuO1xufTtcblxudHlwZSBGaWVsZEdyb3VwUXVldWVNYXBUeXBlID0ge1xuXHRbc2lkZUVmZmVjdE5hbWU6IHN0cmluZ106IHtcblx0XHRbY29udGV4dFBhdGg6IHN0cmluZ106IEZpZWxkR3JvdXBTaWRlRWZmZWN0VHlwZTtcblx0fTtcbn07XG5cbkBVSTVDbGFzcyhcInNhcC5mZS5jb3JlLmNvbnRyb2xsZXJleHRlbnNpb25zLlNpZGVFZmZlY3RzXCIsIENvbnRyb2xsZXJFeHRlbnNpb25NZXRhZGF0YSlcbmNsYXNzIFNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiBleHRlbmRzIENvbnRyb2xsZXJFeHRlbnNpb24ge1xuXHRwcml2YXRlIF9vVmlldzogYW55O1xuXHRwcml2YXRlIF9vQXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXHRwcml2YXRlIF9tRmllbGRHcm91cFF1ZXVlITogRmllbGRHcm91cFF1ZXVlTWFwVHlwZTtcblx0cHJpdmF0ZSBfYVNvdXJjZVByb3BlcnRpZXNGYWlsdXJlITogU2V0PHN0cmluZz47XG5cdHByaXZhdGUgX29TaWRlRWZmZWN0c1NlcnZpY2UhOiBhbnk7XG5cdHByaXZhdGUgX21GYWlsZWRTaWRlRWZmZWN0cyE6IEZhaWxlZFNpZGVFZmZlY3REaWN0aW9uYXJ5O1xuXG5cdEBPdmVycmlkZSgpXG5cdHB1YmxpYyBvbkluaXQoKSB7XG5cdFx0dGhpcy5fb1ZpZXcgPSAodGhpcyBhcyBhbnkpLmJhc2UuZ2V0VmlldygpO1xuXHRcdHRoaXMuX29BcHBDb21wb25lbnQgPSBDb21tb25VdGlscy5nZXRBcHBDb21wb25lbnQodGhpcy5fb1ZpZXcpO1xuXHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UgPSAodGhpcy5fb0FwcENvbXBvbmVudCBhcyBhbnkpLmdldFNpZGVFZmZlY3RzU2VydmljZSgpO1xuXHRcdHRoaXMuX21GaWVsZEdyb3VwUXVldWUgPSB7fTtcblx0XHR0aGlzLl9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUgPSBuZXcgU2V0KCk7XG5cdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzID0ge307XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYXIgcmVjb3JkZWQgdmFsaWRhdGlvbiBzdGF0dXMgZm9yIGFsbCBwcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgY2xlYXJQcm9wZXJ0aWVzU3RhdHVzXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgY2xlYXJQcm9wZXJ0aWVzU3RhdHVzKCk6IHZvaWQge1xuXHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZS5jbGVhcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgZmFpbGVkIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgZ2V0UmVnaXN0ZXJlZEZhaWxlZFJlcXVlc3RzXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFJlZ2lzdGVyZWQgU2lkZUVmZmVjdHMgcmVxdWVzdHMgdGhhdCBoYXZlIGZhaWxlZFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGdldFJlZ2lzdGVyZWRGYWlsZWRSZXF1ZXN0cygpOiBGYWlsZWRTaWRlRWZmZWN0RGljdGlvbmFyeSB7XG5cdFx0cmV0dXJuIHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSB3b3JrZmxvdyBmb3IgU2lkZUVmZmVjdHMgd2l0aCByZWxhdGVkIGNoYW5nZXMgdG8gYSBmaWVsZFxuXHQgKiBUaGUgZm9sbG93aW5nIHNjZW5hcmlvcyBhcmUgbWFuYWdlZDpcblx0ICogIC0gRXhlY3V0ZTogdHJpZ2dlcnMgaW1tZWRpYXRlIFNpZGVFZmZlY3RzIHJlcXVlc3RzIGlmIHRoZSBwcm9taXNlIGZvciB0aGUgZmllbGQgZXZlbnQgaXMgZnVsZmlsbGVkXG5cdCAqICAtIFJlZ2lzdGVyOiBjYWNoZXMgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIEZpZWxkR3JvdXAgaXMgdW5mb2N1c2VkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgaGFuZGxlRmllbGRDaGFuZ2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBTQVBVSTUgZXZlbnQgdGhhdCBjb21lcyBmcm9tIGEgZmllbGQgY2hhbmdlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvRmllbGRHcm91cFByZVJlcXVpc2l0ZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZCBiZWZvcmUgZXhlY3V0aW5nIGRlZmVycmVkIFNpZGVFZmZlY3RzXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9ICBQcm9taXNlIG9uIFNpZGVFZmZlY3RzIHJlcXVlc3Qocylcblx0ICovXG5cdEBQdWJsaWNcblx0QEZpbmFsXG5cdHB1YmxpYyBoYW5kbGVGaWVsZENoYW5nZShvRXZlbnQ6IEV2ZW50LCBvRmllbGRHcm91cFByZVJlcXVpc2l0ZT86IFByb21pc2U8YW55Pik6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgbUV2ZW50RmllbGRQcm9wZXJ0aWVzID0gdGhpcy5fZ2V0RmllbGRQcm9wZXJ0aWVzKG9FdmVudCksXG5cdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSA9IHRoaXMuX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzKFxuXHRcdFx0XHRtRXZlbnRGaWVsZFByb3BlcnRpZXMsXG5cdFx0XHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlXG5cdFx0XHQpO1xuXG5cdFx0bGV0IGJJc0ltbWVkaWF0ZVRyaWdnZXJlZCA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2dlbmVyYXRlSW1tZWRpYXRlUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXMpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdGJJc0ltbWVkaWF0ZVRyaWdnZXJlZCA9IHRydWU7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdFx0XHRhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzLm1hcChtU2lkZUVmZmVjdHNQcm9wZXJ0eSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHMobVNpZGVFZmZlY3RzUHJvcGVydHkuc2lkZUVmZmVjdHMsIG1TaWRlRWZmZWN0c1Byb3BlcnR5LmNvbnRleHQpO1xuXHRcdFx0XHRcdH0pIHx8IFtdXG5cdFx0XHRcdCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKG9FcnJvciA9PiB7XG5cdFx0XHRcdGlmIChiSXNJbW1lZGlhdGVUcmlnZ2VyZWQpIHtcblx0XHRcdFx0XHRMb2cuZGVidWcoXCJFcnJvciB3aGlsZSBwcm9jZXNzaW5nIEZpZWxkIFNpZGVFZmZlY3RzXCIsIG9FcnJvcik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogU2lkZUVmZmVjdHMgaGF2ZSBub3QgYmVlbiB0cmlnZ2VyZWQgc2luY2UgcHJlUmVxdWlzaXRlIHZhbGlkYXRpb24gZmFpbHMgc28gd2UgbmVlZFxuXHRcdFx0XHRcdCAqIHRvIGtlZXAgcHJldmlvdXNseSBmYWlsZWQgcmVxdWVzdCBhcyBGYWlsZWQgcmVxdWVzdCAodG8gYmUgcmV0cmlnZ2VyIG9uIG5leHQgY2hhbmdlKVxuXHRcdFx0XHRcdCAqL1xuXG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllc1xuXHRcdFx0XHRcdFx0LmZpbHRlcihtSW1tZWRpYXRlU2lkZUVmZmVjdHMgPT4gbUltbWVkaWF0ZVNpZGVFZmZlY3RzLnByZXZpb3VzbHlGYWlsZWQgPT09IHRydWUpXG5cdFx0XHRcdFx0XHQuZm9yRWFjaChtSW1tZWRpYXRlU2lkZUVmZmVjdHMgPT5cblx0XHRcdFx0XHRcdFx0dGhpcy5fYWRkRmFpbGVkU2lkZUVmZmVjdHMobUltbWVkaWF0ZVNpZGVFZmZlY3RzLnNpZGVFZmZlY3RzLCBtSW1tZWRpYXRlU2lkZUVmZmVjdHMuY29udGV4dClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hbmFnZXMgU2lkZUVmZmVjdHMgd2l0aCBhIHJlbGF0ZWQgJ2ZvY3VzIG91dCcgdG8gYSBmaWVsZCBncm91cC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGhhbmRsZUZpZWxkR3JvdXBDaGFuZ2Vcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBTQVBVSTUgRXZlbnRcblx0ICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0KHMpXG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgaGFuZGxlRmllbGRHcm91cENoYW5nZShvRXZlbnQ6IEV2ZW50KTogUHJvbWlzZTxhbnk+IHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcblx0XHRjb25zdCB0aGF0ID0gdGhpcyxcblx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzOiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGVbXSA9IFtdLFxuXHRcdFx0YUZpZWxkR3JvdXBJZHM6IHN0cmluZ1tdID0gb0V2ZW50LmdldFBhcmFtZXRlcihcImZpZWxkR3JvdXBJZHNcIik7XG5cblx0XHRjb25zdCBnZXRGaWVsZEdyb3VwUmVxdWVzdFByb21pc2UgPSBmdW5jdGlvbihvRGVmZXJyZWRTaWRlRWZmZWN0OiBGaWVsZEdyb3VwU2lkZUVmZmVjdFR5cGUpIHtcblx0XHRcdGxldCBiSXNSZXF1ZXN0c1RyaWdnZXJlZCA9IGZhbHNlO1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RQcm9wZXJ0eSA9IG9EZWZlcnJlZFNpZGVFZmZlY3Quc2lkZUVmZmVjdFByb3BlcnR5O1xuXHRcdFx0Y29uc3Qgb0NvbnRleHQgPSBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHQ7XG5cdFx0XHRjb25zdCBzQ29udGV4dFBhdGggPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0XHRjb25zdCBzRW50aXR5VHlwZSA9IHRoYXQuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0KTtcblx0XHRcdGNvbnN0IG1FbnRpdHlUeXBlID0gdGhhdC5fZ2V0RW50aXR5VHlwZUZyb21GUU4oc0VudGl0eVR5cGUpO1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwob0RlZmVycmVkU2lkZUVmZmVjdC5wcm9taXNlcylcblx0XHRcdFx0LnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0YklzUmVxdWVzdHNUcmlnZ2VyZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Ly9EZWZlcnJlZCBTaWRlRWZmZWN0cyBhcmUgZXhlY3V0ZWQgb25seSBpZiBhbGwgc291cmNlUHJvcGVydGllcyBoYXZlIG5vIHJlZ2lzdGVyZWQgZmFpbHVyZS5cblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRtRW50aXR5VHlwZSAmJlxuXHRcdFx0XHRcdFx0KG9TaWRlRWZmZWN0UHJvcGVydHkuc2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyBhcyBQcm9wZXJ0eVBhdGhbXSkuZXZlcnkoc291cmNlUHJvcGVydHkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoc291cmNlUHJvcGVydHkudHlwZSA9PT0gXCJQcm9wZXJ0eVBhdGhcIikge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHNJZCA9IHRoYXQuX2dlbmVyYXRlU3RhdHVzSW5kZXgobUVudGl0eVR5cGUsIHNvdXJjZVByb3BlcnR5LnZhbHVlLCBvQ29udGV4dCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNJZCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuICF0aGF0Ll9hU291cmNlUHJvcGVydGllc0ZhaWx1cmUuaGFzKHNJZCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGF0LnJlcXVlc3RTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdFByb3BlcnR5LnNpZGVFZmZlY3RzLCBvU2lkZUVmZmVjdFByb3BlcnR5LmNvbnRleHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fSlcblx0XHRcdFx0LmNhdGNoKG9FcnJvciA9PiB7XG5cdFx0XHRcdFx0aWYgKGJJc1JlcXVlc3RzVHJpZ2dlcmVkKSB7XG5cdFx0XHRcdFx0XHRMb2cuZGVidWcoXCJFcnJvciB3aGlsZSBwcm9jZXNzaW5nIEZpZWxkR3JvdXAgU2lkZUVmZmVjdHMgb24gY29udGV4dCBcIiArIHNDb250ZXh0UGF0aCwgb0Vycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhhdC5fbUZpZWxkR3JvdXBRdWV1ZVtvU2lkZUVmZmVjdFByb3BlcnR5Lm5hbWVdW3NDb250ZXh0UGF0aF07XG5cdFx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHRhRmllbGRHcm91cElkcy5mb3JFYWNoKHNGaWVsZEdyb3VwSWQgPT4ge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBzdHJpbmcgXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiBpcyBhZGRlZCB0byB0aGUgU2lkZUVmZmVjdHMgbmFtZSBkdXJpbmcgdGVtcGxhdGluZyB0byBrbm93XG5cdFx0XHQgKiBpZiB0aGlzIFNpZGVFZmZlY3RzIG11c3QgYmUgaW1tZWRpYXRlbHkgZXhlY3V0ZWQgcmVxdWVzdGVkIChvbiBmaWVsZCBjaGFuZ2UpIG9yIG11c3Rcblx0XHRcdCAqIGJlIGRlZmVycmVkIChvbiBmaWVsZCBncm91cCBmb2N1cyBvdXQpXG5cdFx0XHQgKlxuXHRcdFx0ICovXG5cdFx0XHRjb25zdCBzU2lkZUVmZmVjdE5hbWU6IHN0cmluZyA9IHNGaWVsZEdyb3VwSWQucmVwbGFjZShcIiQkSW1tZWRpYXRlUmVxdWVzdFwiLCBcIlwiKTtcblx0XHRcdGNvbnN0IG1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0cyA9IHRoYXQuX21GaWVsZEdyb3VwUXVldWU/LltzU2lkZUVmZmVjdE5hbWVdO1xuXHRcdFx0aWYgKG1Db250ZXh0RGVmZXJyZWRTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRPYmplY3Qua2V5cyhtQ29udGV4dERlZmVycmVkU2lkZUVmZmVjdHMpLmZvckVhY2goc0NvbnRleHRQYXRoID0+IHtcblx0XHRcdFx0XHRjb25zdCBvRGVmZXJyZWRTaWRlRWZmZWN0ID0gbUNvbnRleHREZWZlcnJlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF07XG5cdFx0XHRcdFx0aWYgKCFvRGVmZXJyZWRTaWRlRWZmZWN0LnByb2Nlc3NTdGFydGVkKSB7XG5cdFx0XHRcdFx0XHRvRGVmZXJyZWRTaWRlRWZmZWN0LnByb2Nlc3NTdGFydGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzLnB1c2gob0RlZmVycmVkU2lkZUVmZmVjdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBQcm9taXNlLmFsbChcblx0XHRcdGFEZWZlcnJlZFNpZGVFZmZlY3RzLm1hcChvRGVmZXJyZWRTaWRlRWZmZWN0ID0+IHtcblx0XHRcdFx0cmV0dXJuIGdldEZpZWxkR3JvdXBSZXF1ZXN0UHJvbWlzZShvRGVmZXJyZWRTaWRlRWZmZWN0KTtcblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgU2lkZUVmZmVjdHMgY29udHJvbC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIGFkZENvbnRyb2xTaWRlRWZmZWN0c1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0VudGl0eVR5cGUgTmFtZSBvZiB0aGUgZW50aXR5IHdoZXJlIHRoZSBTaWRlRWZmZWN0cyBjb250cm9sIHdpbGwgYmUgcmVnaXN0ZXJlZFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb1NpZGVFZmZlY3RzIFNpZGVFZmZlY3RzIHRvIHJlZ2lzdGVyLiBFbnN1cmUgdGhlIHNvdXJjZUNvbnRyb2xJZCBtYXRjaGVzIHRoZSBhc3NvY2lhdGVkIFNBUFVJNSBjb250cm9sIElELlxuXHQgKlxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIGFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZTogc3RyaW5nLCBvU2lkZUVmZmVjdHM6IE9taXQ8Q29udHJvbFNpZGVFZmZlY3RzVHlwZSwgXCJmdWxseVF1YWxpZmllZE5hbWVcIj4pOiB2b2lkIHtcblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmFkZENvbnRyb2xTaWRlRWZmZWN0cyhzRW50aXR5VHlwZSwgb1NpZGVFZmZlY3RzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSBxdWV1ZSBjb250YWluaW5nIHRoZSBmYWlsZWQgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSByZW1vdmVGYWlsZWRTaWRlRWZmZWN0c1xuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIHJlbW92ZUZhaWxlZFNpZGVFZmZlY3RzKCk6IHZvaWQge1xuXHRcdHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0cyA9IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3QgU2lkZUVmZmVjdHMgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVxdWVzdFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTaWRlRWZmZWN0cyByZXF1ZXN0IG9uIFNBUFVJNSBjb250ZXh0XG5cdCAqL1xuXHRAUHVibGljXG5cdEBGaW5hbFxuXHRwdWJsaWMgcmVxdWVzdFNpZGVFZmZlY3RzKG9TaWRlRWZmZWN0czogU2lkZUVmZmVjdHNUeXBlLCBvQ29udGV4dDogQ29udGV4dCk6IFByb21pc2U8YW55PiB7XG5cdFx0bGV0IGZSZXNvbHZlcjogYW55LCBmUmVqZWN0b3I6IGFueTtcblx0XHRjb25zdCBvUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0ZlJlc29sdmVyID0gcmVzb2x2ZTtcblx0XHRcdGZSZWplY3RvciA9IHJlamVjdDtcblx0XHR9KTtcblx0XHRjb25zdCBhVGFyZ2V0czogYW55W10gPSAoKG9TaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcyBhcyBhbnlbXSkgfHwgW10pLmNvbmNhdCgob1NpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMgYXMgYW55W10pIHx8IFtdKSxcblx0XHRcdHNUcmlnZ2VyQWN0aW9uOiBTdHJpbmcgfCB1bmRlZmluZWQgPSAob1NpZGVFZmZlY3RzIGFzIE9EYXRhU2lkZUVmZmVjdHNUeXBlKS5UcmlnZ2VyQWN0aW9uO1xuXG5cdFx0aWYgKHNUcmlnZ2VyQWN0aW9uKSB7XG5cdFx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmV4ZWN1dGVBY3Rpb24oc1RyaWdnZXJBY3Rpb24sIG9Db250ZXh0KTtcblx0XHR9XG5cblx0XHR0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlXG5cdFx0XHQucmVxdWVzdFNpZGVFZmZlY3RzKGFUYXJnZXRzLCBvQ29udGV4dClcblx0XHRcdC50aGVuKCgpID0+IGZSZXNvbHZlcigpKVxuXHRcdFx0LmNhdGNoKChvRXJyb3I6IGFueSkgPT4ge1xuXHRcdFx0XHR0aGlzLl9hZGRGYWlsZWRTaWRlRWZmZWN0cyhvU2lkZUVmZmVjdHMsIG9Db250ZXh0KTtcblx0XHRcdFx0ZlJlamVjdG9yKG9FcnJvcik7XG5cdFx0XHR9KTtcblxuXHRcdHJldHVybiBvUHJvbWlzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIFNpZGVFZmZlY3RzIGNyZWF0ZWQgYnkgYSBjb250cm9sLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgcmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udHJvbCBTQVBVSTUgQ29udHJvbFxuXHQgKi9cblx0QFB1YmxpY1xuXHRARmluYWxcblx0cHVibGljIHJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyhvQ29udHJvbDogQ29udHJvbCk6IHZvaWQge1xuXHRcdGNvbnN0IHNDb250cm9sSWQgPSBvQ29udHJvbCAmJiBvQ29udHJvbC5pc0EgJiYgb0NvbnRyb2wuaXNBKFwic2FwLnVpLmJhc2UuTWFuYWdlZE9iamVjdFwiKSAmJiBvQ29udHJvbC5nZXRJZCgpO1xuXG5cdFx0aWYgKHNDb250cm9sSWQpIHtcblx0XHRcdHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UucmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzKHNDb250cm9sSWQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIFNpZGVFZmZlY3RzIHRvIHRoZSBxdWV1ZSBvZiB0aGUgZmFpbGVkIFNpZGVFZmZlY3RzXG5cdCAqIFRoZSBTaWRlRWZmZWN0cyB3aWxsIGJlIHJldHJpZ2dlcmVkIG9uIHRoZSBuZXh0IGNoYW5nZSBvbiB0aGUgc2FtZSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2FkZEZhaWxlZFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvU2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgdGhhdCBuZWVkIHRvIGJlIHJldHJpZ2dlcmVkXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvQ29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIGhhdmUgZmFpbGVkXG5cdCAqL1xuXHRAUHJpdmF0ZVxuXHRARmluYWxcblx0cHJpdmF0ZSBfYWRkRmFpbGVkU2lkZUVmZmVjdHMob1NpZGVFZmZlY3RzOiBTaWRlRWZmZWN0c1R5cGUsIG9Db250ZXh0OiBDb250ZXh0KTogdm9pZCB7XG5cdFx0Y29uc3Qgc0NvbnRleHRQYXRoOiBzdHJpbmcgPSBvQ29udGV4dC5nZXRQYXRoKCk7XG5cdFx0dGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0gPSB0aGlzLl9tRmFpbGVkU2lkZUVmZmVjdHNbc0NvbnRleHRQYXRoXSB8fCBbXTtcblx0XHRjb25zdCBiSXNOb3RBbHJlYWR5TGlzdGVkID0gdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NDb250ZXh0UGF0aF0uZXZlcnkoXG5cdFx0XHRtRmFpbGVkU2lkZUVmZmVjdHMgPT4gb1NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZSAhPT0gbUZhaWxlZFNpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZVxuXHRcdCk7XG5cdFx0aWYgKGJJc05vdEFscmVhZHlMaXN0ZWQpIHtcblx0XHRcdHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzQ29udGV4dFBhdGhdLnB1c2gob1NpZGVFZmZlY3RzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBwcm9taXNlIGZvciB0aGUgZmllbGQgZ3JvdXAgdGhhdCBpcyByZXF1aXJlZCBiZWZvcmUgcmVxdWVzdGluZyBTaWRlRWZmZWN0cy5cblx0ICogSWYgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgYW5kIG9ubHkgdGhlIGZpZWxkIHJlcXVpcmVzIHRoZSBTaWRlRWZmZWN0cyBvbiB0aGlzIGNvbnRleHQsIHRoZSBTaWRlRWZmZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZVxuXHQgKiBTaWRlRWZmZWN0cyBxdWV1ZS5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZUZpZWxkR3JvdXBQcm9taXNlXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRXZlbnRGaWVsZFByb3BlcnRpZXMgRmllbGQgcHJvcGVydGllc1xuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBQcm9taXNlIHRvIGJlIHVzZWQgZm9yIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBmaWVsZFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2VuZXJhdGVGaWVsZEdyb3VwUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXM6IEZpZWxkRXZlbnRQcm9wZXJ0eVR5cGUpOiBQcm9taXNlPGFueT4ge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzO1xuXG5cdFx0bGV0IGJQcm9taXNlU3VjY2VzcyA9IHRydWU7XG5cdFx0cmV0dXJuIG1FdmVudEZpZWxkUHJvcGVydGllcy5wcm9taXNlXG5cdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIGJQcm9taXNlU3VjY2Vzcztcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGJQcm9taXNlU3VjY2VzcyA9IGZhbHNlO1xuXHRcdFx0XHRyZXR1cm4gYlByb21pc2VTdWNjZXNzO1xuXHRcdFx0fSlcblx0XHRcdC5maW5hbGx5KCgpID0+IHtcblx0XHRcdFx0LyoqXG5cdFx0XHRcdCAqIE5lZWQgdG8gc3RvcmUgdGhlIHN0YXR1cyBvZiBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gdGhpcyBmaWVsZCBmb3IgZGVmZXJyZWQgU2lkZUVmZmVjdHNcblx0XHRcdFx0ICogc2luY2UgYWxsIFNvdXJjZVByb3BlcnRpZXMgZm9yIHRoaXMga2luZCBvZiBTaWRlRWZmZWN0cyBtdXN0IGJlIHZhbGlkXG5cdFx0XHRcdCAqL1xuXHRcdFx0XHR0aGF0Ll9zYXZlRmllbGRQcm9wZXJ0aWVzU3RhdHVzKG1FdmVudEZpZWxkUHJvcGVydGllcy5maWVsZCwgYlByb21pc2VTdWNjZXNzKTtcblx0XHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgcHJvbWlzZSBmb3IgdGhlIGZpZWxkIHRoYXQgaXMgcmVxdWlyZWQgYmVmb3JlIHJlcXVlc3RpbmcgaW1tZWRpYXRlIFNpZGVFZmZlY3RzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dlbmVyYXRlSW1tZWRpYXRlUHJvbWlzZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gbUV2ZW50RmllbGRQcm9wZXJ0aWVzIEZpZWxkIHByb3BlcnRpZXNcblx0ICogQHJldHVybnMge29iamVjdH0gUHJvbWlzZSB0byBiZSB1c2VkIGZvciB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZmllbGRcblx0ICovXG5cdHByaXZhdGUgX2dlbmVyYXRlSW1tZWRpYXRlUHJvbWlzZShtRXZlbnRGaWVsZFByb3BlcnRpZXM6IEZpZWxkRXZlbnRQcm9wZXJ0eVR5cGUpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IG9Qcm9taXNlID0gbUV2ZW50RmllbGRQcm9wZXJ0aWVzLnByb21pc2U7XG5cdFx0cmV0dXJuIG9Qcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHQvKipcblx0XHRcdCAqIElmIHRoZSBmaWVsZCBnZXRzIGEgRmllbGRIZWxwZXIsIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBhbGwgZmllbGRzIGNoYW5nZWQgYnkgdGhpcyBGaWVsZEhlbHBlciBoYXZlIGJlZW4gc2V0LlxuXHRcdFx0ICogVG8gYWNoaWV2ZSB0aGlzLCB3ZSBlbnN1cmUgdGhhdCBhbGwgcmVsYXRlZCBiaW5kaW5ncyBoYXZlIGJlZW4gcmVzb2x2ZWQuXG5cdFx0XHQgKlxuXHRcdFx0ICogVGhpcyByZXNvbHV0aW9uIHByb2Nlc3MgaXMgbm90IG1hbmFnZWQgYnkgdGhlIEZpZWxkIEV2ZW50IFByb21pc2UsIHNvIGZvciBmYXN0IHVzZXIgYWN0aW9ucyAobGlrZSBhdXRvbWF0aW9uKSBpdCBjYW4gbG9jayB0aGUgbW9kZWxcblx0XHRcdCAqIGFuZCBubyByZXF1ZXN0IGNhbiBiZSBleGVjdXRlZC5cblx0XHRcdCAqL1xuXHRcdFx0Y29uc3Qgb0ZpZWxkID0gbUV2ZW50RmllbGRQcm9wZXJ0aWVzLmZpZWxkO1xuXHRcdFx0Y29uc3Qgc0ZpZWxkSGVscGVySWQgPSBvRmllbGQuZ2V0RmllbGRIZWxwICYmIG9GaWVsZC5nZXRGaWVsZEhlbHAoKTtcblx0XHRcdGlmIChzRmllbGRIZWxwZXJJZCkge1xuXHRcdFx0XHRjb25zdCBvRmlsdGVySGVscDogYW55ID0gc2FwLnVpLmdldENvcmUoKS5ieUlkKHNGaWVsZEhlbHBlcklkKTtcblx0XHRcdFx0aWYgKG9GaWx0ZXJIZWxwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKFxuXHRcdFx0XHRcdFx0KG9GaWx0ZXJIZWxwLmdldE91dFBhcmFtZXRlcnMoKSBhcyBhbnlbXSkubWFwKG9PdXRQYXJhbWV0ZXIgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvQmluZGluZyA9IG9PdXRQYXJhbWV0ZXIuZ2V0QmluZGluZyhcInZhbHVlXCIpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb0JpbmRpbmcgPyBvQmluZGluZy5yZXF1ZXN0VmFsdWUoKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoW10pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyBhIHN0YXR1cyBpbmRleC5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZW5lcmF0ZVN0YXR1c0luZGV4XG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRW50aXR5VHlwZSBUaGUgZW50aXR5IHR5cGVcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNQcm9wZXJ0eVBhdGggVGhlIHByb3BlcnR5IHBhdGhcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Db250ZXh0IFNBUFVJNSBDb250ZXh0XG5cdCAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IEluZGV4XG5cdCAqL1xuXHRwcml2YXRlIF9nZW5lcmF0ZVN0YXR1c0luZGV4KG1FbnRpdHlUeXBlOiBFbnRpdHlUeXBlLCBzUHJvcGVydHlQYXRoOiBzdHJpbmcsIG9Db250ZXh0PzogQ29udGV4dCB8IG51bGwpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IHNDb250ZXh0UGF0aCA9IG9Db250ZXh0Py5nZXRQYXRoKCk7XG5cdFx0Y29uc3QgbVByb3BlcnR5ID0gbUVudGl0eVR5cGUucmVzb2x2ZVBhdGgoc1Byb3BlcnR5UGF0aCk7XG5cdFx0aWYgKG1Qcm9wZXJ0eSkge1xuXHRcdFx0aWYgKG1Qcm9wZXJ0eSAmJiBtUHJvcGVydHkuX3R5cGUgPT09IFwiUHJvcGVydHlcIikge1xuXHRcdFx0XHRyZXR1cm4gW21Qcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWUsIHNDb250ZXh0UGF0aF0uam9pbihcIl9fXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGFwcHJvcHJpYXRlIGNvbnRleHQgb24gd2hpY2ggU2lkZUVmZmVjdHMgY2FuIGJlIHJlcXVlc3RlZC5cblx0ICogVGhlIGNvcnJlY3Qgb25lIG11c3QgaGF2ZSB0aGUgYmluZGluZyBwYXJhbWV0ZXIgJCRwYXRjaFdpdGhvdXRTaWRlRWZmZWN0cy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9Tb3VyY2VGaWVsZCBGaWVsZFxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc1NpZGVFZmZlY3RFbnRpdHlUeXBlIFRhcmdldCBlbnRpdHkgdHlwZSBvZiB0aGUgU2lkZUVmZmVjdHMgYW5ub3RhdGlvblxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBTQVBVSTUgQ29udGV4dFxuXHQgKi9cblx0QFByaXZhdGVcblx0QEZpbmFsXG5cdHByaXZhdGUgX2dldENvbnRleHRGb3JTaWRlRWZmZWN0cyhvU291cmNlRmllbGQ6IEZpZWxkQ29udHJvbCwgc1NpZGVFZmZlY3RFbnRpdHlUeXBlOiBzdHJpbmcpOiBDb250ZXh0IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBvQmluZGluZ0NvbnRleHQgPSBvU291cmNlRmllbGQuZ2V0QmluZGluZ0NvbnRleHQoKTtcblx0XHRsZXQgb0NvbnRleHRGb3JTaWRlRWZmZWN0cyA9IG9CaW5kaW5nQ29udGV4dCxcblx0XHRcdHNFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0JpbmRpbmdDb250ZXh0KTtcblxuXHRcdGlmIChzU2lkZUVmZmVjdEVudGl0eVR5cGUgIT09IHNFbnRpdHlUeXBlKSB7XG5cdFx0XHRvQ29udGV4dEZvclNpZGVFZmZlY3RzID0gKG9CaW5kaW5nQ29udGV4dCBhcyBhbnkpLmdldEJpbmRpbmcoKS5nZXRDb250ZXh0KCk7XG5cdFx0XHRpZiAob0NvbnRleHRGb3JTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRzRW50aXR5VHlwZSA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMpO1xuXHRcdFx0XHRpZiAoc1NpZGVFZmZlY3RFbnRpdHlUeXBlICE9PSBzRW50aXR5VHlwZSkge1xuXHRcdFx0XHRcdG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMgPSAob0NvbnRleHRGb3JTaWRlRWZmZWN0cyBhcyBhbnkpLmdldEJpbmRpbmcoKS5nZXRDb250ZXh0KCk7XG5cdFx0XHRcdFx0aWYgKG9Db250ZXh0Rm9yU2lkZUVmZmVjdHMpIHtcblx0XHRcdFx0XHRcdHNFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0NvbnRleHRGb3JTaWRlRWZmZWN0cyk7XG5cdFx0XHRcdFx0XHRpZiAoc1NpZGVFZmZlY3RFbnRpdHlUeXBlICE9PSBzRW50aXR5VHlwZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvQ29udGV4dEZvclNpZGVFZmZlY3RzIHx8IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIEVudGl0eVR5cGUgYmFzZWQgb24gaXRzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc0Z1bGx5UXVhbGlmaWVkTmFtZSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWVcblx0ICogQHJldHVybnMge29iamVjdH0gVGhlIGVudGl0eSB0eXBlXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRFbnRpdHlUeXBlRnJvbUZRTihzRnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmcpOiBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBtRW50aXR5VHlwZSA9ICh0aGlzLl9vU2lkZUVmZmVjdHNTZXJ2aWNlLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpIGFzIENvbnZlcnRlck91dHB1dCkuZW50aXR5VHlwZXMuZmluZChvRW50aXR5VHlwZSA9PiB7XG5cdFx0XHRyZXR1cm4gb0VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lID09PSBzRnVsbHlRdWFsaWZpZWROYW1lO1xuXHRcdH0pO1xuXHRcdHJldHVybiBtRW50aXR5VHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBwcm9taXNlIG9mIHRoZSBmaWVsZCB2YWxpZGF0aW9uIHRoYXQgaXMgcmVxdWlyZWQgZm9yIHRoZSBTaWRlRWZmZWN0cyBwcm9jZXNzLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2dldEZpZWxkUHJvbWlzZVxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0V2ZW50IEZpZWxkIGNoYW5nZSBldmVudFxuXHQgKiBAcmV0dXJucyB7b2JqZWN0fSBGaWVsZCBwcm9taXNlXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRGaWVsZFByb21pc2Uob0V2ZW50OiBFdmVudCk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgcHJvbWlzZSA9IG9FdmVudC5nZXRQYXJhbWV0ZXIoXCJwcm9taXNlXCIpIHx8IFByb21pc2UucmVzb2x2ZSgpO1xuXG5cdFx0cmV0dXJuIHByb21pc2UudGhlbigoKSA9PiB7XG5cdFx0XHRjb25zdCBvUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXHRcdFx0XHRpZiAoIUZpZWxkUnVudGltZS5nZXRGaWVsZFN0YXRlT25DaGFuZ2Uob0V2ZW50KS5zdGF0ZS52YWxpZGl0eSkge1xuXHRcdFx0XHRcdHJlamVjdCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJlc29sdmUodHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuIG9Qcm9taXNlO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGZpZWxkIHRoYXQgYXJlIHJlcXVpcmVkIGZvciB0aGUgU2lkZUVmZmVjdHMgcHJvY2Vzcy5cblx0ICpcblx0ICogQGZ1bmN0aW9uXG5cdCAqIEBuYW1lIF9nZXRGaWVsZFByb3BlcnRpZXNcblx0ICogQHBhcmFtIHtvYmplY3R9IG9FdmVudCBGaWVsZCBjaGFuZ2UgZXZlbnRcblx0ICogQHJldHVybnMge29iamVjdH0gRmllbGQgcHJvcGVydGllcyAoZXZlbnQgY2hhbmdlIHByb21pc2UsIGZpZWxkLCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIHRoaXMgZmllbGQpXG5cdCAqL1xuXHRwcml2YXRlIF9nZXRGaWVsZFByb3BlcnRpZXMob0V2ZW50OiBFdmVudCk6IEZpZWxkRXZlbnRQcm9wZXJ0eVR5cGUge1xuXHRcdGNvbnN0IG9GaWVsZDogRmllbGRDb250cm9sID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIEZpZWxkQ29udHJvbDtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRwcm9taXNlOiB0aGlzLl9nZXRGaWVsZFByb21pc2Uob0V2ZW50KSxcblx0XHRcdGZpZWxkOiBvRmllbGQsXG5cdFx0XHRzaWRlRWZmZWN0c01hcDogdGhpcy5fZ2V0RmllbGRTaWRlRWZmZWN0c01hcChvRmllbGQpXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyBtYXBcblx0ICogVGhlc2UgU2lkZUVmZmVjdHMgYXJlXG5cdCAqIC0gbGlzdGVkIGludG8gRmllbGRHcm91cElkcyAoY29taW5nIGZyb20gYW4gT0RhdGEgU2VydmljZSlcblx0ICogLSBnZW5lcmF0ZWQgYnkgYSBjb250cm9sIG9yIGNvbnRyb2xzIGFuZCB0aGF0IGNvbmZpZ3VyZSB0aGlzIGZpZWxkIGFzIFNvdXJjZVByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBmdW5jdGlvblxuXHQgKiBAbmFtZSBfZ2V0RmllbGRTaWRlRWZmZWN0c01hcFxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkIEZpZWxkXG5cdCAqIEByZXR1cm5zIHtvYmplY3R9IFNpZGVFZmZlY3RzIG1hcFxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0RmllbGRTaWRlRWZmZWN0c01hcChvRmllbGQ6IEZpZWxkQ29udHJvbCk6IEZpZWxkU2lkZUVmZmVjdERpY3Rpb25hcnkge1xuXHRcdGNvbnN0IG1TaWRlRWZmZWN0c01hcDogRmllbGRTaWRlRWZmZWN0RGljdGlvbmFyeSA9IHt9LFxuXHRcdFx0YUZpZWxkR3JvdXBJZHM6IHN0cmluZ1tdID0gb0ZpZWxkLmdldEZpZWxkR3JvdXBJZHMoKSxcblx0XHRcdHNWaWV3RW50aXR5U2V0U2V0TmFtZSA9IHRoaXMuX29WaWV3LmdldFZpZXdEYXRhKCkuZW50aXR5U2V0LFxuXHRcdFx0b1ZpZXdFbnRpdHlTZXQgPSAodGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKSBhcyBDb252ZXJ0ZXJPdXRwdXQpLmVudGl0eVNldHMuZmluZChvRW50aXR5U2V0ID0+IHtcblx0XHRcdFx0cmV0dXJuIG9FbnRpdHlTZXQubmFtZSA9PT0gc1ZpZXdFbnRpdHlTZXRTZXROYW1lO1xuXHRcdFx0fSk7XG5cblx0XHQvLyBTaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdFx0YUZpZWxkR3JvdXBJZHMuZm9yRWFjaChzRmllbGRHcm91cElkID0+IHtcblx0XHRcdGNvbnN0IGJJc0ltbWVkaWF0ZTogYm9vbGVhbiA9IHNGaWVsZEdyb3VwSWQuaW5kZXhPZihcIiQkSW1tZWRpYXRlUmVxdWVzdFwiKSAhPT0gLTEsXG5cdFx0XHRcdHNOYW1lOiBzdHJpbmcgPSBzRmllbGRHcm91cElkLnJlcGxhY2UoXCIkJEltbWVkaWF0ZVJlcXVlc3RcIiwgXCJcIiksXG5cdFx0XHRcdGFTaWRlRWZmZWN0UGFydHM6IHN0cmluZ1tdID0gc05hbWUuc3BsaXQoXCIjXCIpLFxuXHRcdFx0XHRzU2lkZUVmZmVjdEVudGl0eVR5cGU6IHN0cmluZyA9IGFTaWRlRWZmZWN0UGFydHNbMF0sXG5cdFx0XHRcdHNTaWRlRWZmZWN0UGF0aDogc3RyaW5nID1cblx0XHRcdFx0XHRzU2lkZUVmZmVjdEVudGl0eVR5cGUgK1xuXHRcdFx0XHRcdFwiQGNvbS5zYXAudm9jYWJ1bGFyaWVzLkNvbW1vbi52MS5TaWRlRWZmZWN0c1wiICtcblx0XHRcdFx0XHQoYVNpZGVFZmZlY3RQYXJ0cy5sZW5ndGggPT09IDIgPyBcIiNcIiArIGFTaWRlRWZmZWN0UGFydHNbMV0gOiBcIlwiKSxcblx0XHRcdFx0b1NpZGVFZmZlY3Q6IFNpZGVFZmZlY3RzVHlwZSB8IHVuZGVmaW5lZCA9IHRoaXMuX29TaWRlRWZmZWN0c1NlcnZpY2UuZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhzU2lkZUVmZmVjdEVudGl0eVR5cGUpPy5bXG5cdFx0XHRcdFx0c1NpZGVFZmZlY3RQYXRoXG5cdFx0XHRcdF0sXG5cdFx0XHRcdG9Db250ZXh0OiBDb250ZXh0IHwgdW5kZWZpbmVkID0gdGhpcy5fZ2V0Q29udGV4dEZvclNpZGVFZmZlY3RzKG9GaWVsZCwgc1NpZGVFZmZlY3RFbnRpdHlUeXBlKTtcblx0XHRcdGlmIChvU2lkZUVmZmVjdCAmJiBvQ29udGV4dCkge1xuXHRcdFx0XHRtU2lkZUVmZmVjdHNNYXBbc05hbWVdID0ge1xuXHRcdFx0XHRcdG5hbWU6IHNOYW1lLFxuXHRcdFx0XHRcdGltbWVkaWF0ZTogYklzSW1tZWRpYXRlLFxuXHRcdFx0XHRcdHNpZGVFZmZlY3RzOiBvU2lkZUVmZmVjdCxcblx0XHRcdFx0XHRjb250ZXh0OiBvQ29udGV4dFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly9TaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBjb250cm9sKHMpXG5cdFx0aWYgKHNWaWV3RW50aXR5U2V0U2V0TmFtZSAmJiBvVmlld0VudGl0eVNldCkge1xuXHRcdFx0Y29uc3Qgc1ZpZXdFbnRpdHlUeXBlID0gb1ZpZXdFbnRpdHlTZXQuZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdG1GaWVsZFBhdGg6IGFueSA9IChvRmllbGQuZ2V0QWdncmVnYXRpb24oXCJjdXN0b21EYXRhXCIpIGFzIGFueVtdKS5maW5kKG9DdXN0b21EYXRhID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gb0N1c3RvbURhdGEuZ2V0S2V5KCkgPT09IFwic291cmNlUGF0aFwiO1xuXHRcdFx0XHR9KSxcblx0XHRcdFx0b0NvbnRleHQ6IENvbnRleHQgfCB1bmRlZmluZWQgPSB0aGlzLl9nZXRDb250ZXh0Rm9yU2lkZUVmZmVjdHMob0ZpZWxkLCBzVmlld0VudGl0eVR5cGUpO1xuXG5cdFx0XHRpZiAobUZpZWxkUGF0aCAmJiBvQ29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBzRmllbGRQYXRoID0gbUZpZWxkUGF0aC5nZXRWYWx1ZSgpLnJlcGxhY2UoXCIvXCIgKyBzVmlld0VudGl0eVNldFNldE5hbWUgKyBcIi9cIiwgXCJcIiksXG5cdFx0XHRcdFx0bUNvbnRyb2xFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHMoXG5cdFx0XHRcdFx0XHRzVmlld0VudGl0eVR5cGVcblx0XHRcdFx0XHQpIGFzIENvbnRyb2xTaWRlRWZmZWN0c0VudGl0eURpY3Rpb25hcnk7XG5cdFx0XHRcdE9iamVjdC5rZXlzKG1Db250cm9sRW50aXR5VHlwZSkuZm9yRWFjaChzQ29udHJvbE5hbWUgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG9Db250cm9sU2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSA9IG1Db250cm9sRW50aXR5VHlwZVtzQ29udHJvbE5hbWVdO1xuXHRcdFx0XHRcdGlmICgob0NvbnRyb2xTaWRlRWZmZWN0cy5Tb3VyY2VQcm9wZXJ0aWVzIGFzIHN0cmluZ1tdKS5pbmNsdWRlcyhzRmllbGRQYXRoKSkge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc05hbWUgPSBzQ29udHJvbE5hbWUgKyBcIjo6XCIgKyBzVmlld0VudGl0eVR5cGU7XG5cdFx0XHRcdFx0XHRtU2lkZUVmZmVjdHNNYXBbc05hbWVdID0ge1xuXHRcdFx0XHRcdFx0XHRuYW1lOiBzTmFtZSxcblx0XHRcdFx0XHRcdFx0aW1tZWRpYXRlOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRzaWRlRWZmZWN0czogb0NvbnRyb2xTaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdFx0Y29udGV4dDogb0NvbnRleHRcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG1TaWRlRWZmZWN0c01hcDtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYW5hZ2VzIHRoZSBTaWRlRWZmZWN0cyB3aXRoIHJlbGF0ZWQgY2hhbmdlcyB0byBhIGZpZWxkXG5cdCAqIExpc3Q6IGdldHMgaW1tZWRpYXRlIFNpZGVFZmZlY3RzIHJlcXVlc3RzXG5cdCAqIFJlZ2lzdGVyOiBjYWNoZXMgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIEZpZWxkR3JvdXAgaXMgdW5mb2N1c2VkLlxuXHQgKlxuXHQgKiBAZnVuY3Rpb25cblx0ICogQG5hbWUgX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBtRXZlbnRGaWVsZFByb3BlcnRpZXMgRmllbGQgZXZlbnQgcHJvcGVydGllc1xuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWQgYmVmb3JlIGV4ZWN1dGluZyBkZWZlcnJlZCBTaWRlRWZmZWN0c1xuXHQgKiBAcmV0dXJucyB7QXJyYXl9ICBBcnJheSBvZiBpbW1lZGlhdGUgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgX2luaXRpYWxpemVGaWVsZFNpZGVFZmZlY3RzKFxuXHRcdG1FdmVudEZpZWxkUHJvcGVydGllczogRmllbGRFdmVudFByb3BlcnR5VHlwZSxcblx0XHRvRmllbGRHcm91cFByZVJlcXVpc2l0ZT86IFByb21pc2U8YW55PlxuXHQpOiBGaWVsZFNpZGVFZmZlY3RQcm9wZXJ0eVR5cGVbXSB7XG5cdFx0Y29uc3QgbUZpZWxkU2lkZUVmZmVjdHNNYXAgPSBtRXZlbnRGaWVsZFByb3BlcnRpZXMuc2lkZUVmZmVjdHNNYXAsXG5cdFx0XHRvRmllbGRQcm9taXNlRm9yRmllbGRHcm91cCA9IHRoaXMuX2dlbmVyYXRlRmllbGRHcm91cFByb21pc2UobUV2ZW50RmllbGRQcm9wZXJ0aWVzKSwgLy8gUHJvbWlzZSBtYW5hZ2luZyBGaWVsZEdyb3VwIHJlcXVlc3RzIGlmIEZpZWxkIHByb21pc2UgZmFpbHNcblx0XHRcdG1GYWlsZWRTaWRlRWZmZWN0c05hbWU6IGFueSA9IHt9LFxuXHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllczogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlW10gPSBbXTtcblxuXHRcdG9GaWVsZEdyb3VwUHJlUmVxdWlzaXRlID0gb0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgfHwgUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0XHRPYmplY3Qua2V5cyhtRmllbGRTaWRlRWZmZWN0c01hcCkuZm9yRWFjaChzU2lkZUVmZmVjdE5hbWUgPT4ge1xuXHRcdFx0Y29uc3Qgb1NpZGVFZmZlY3RQcm9wZXJ0eTogRmllbGRTaWRlRWZmZWN0UHJvcGVydHlUeXBlID0gbUZpZWxkU2lkZUVmZmVjdHNNYXBbc1NpZGVFZmZlY3ROYW1lXSxcblx0XHRcdFx0c1NpZGVFZmZlY3RDb250ZXh0UGF0aCA9IG9TaWRlRWZmZWN0UHJvcGVydHkuY29udGV4dC5nZXRQYXRoKCksXG5cdFx0XHRcdGFGYWlsZWRTaWRlRWZmZWN0cyA9IHRoaXMuX21GYWlsZWRTaWRlRWZmZWN0c1tzU2lkZUVmZmVjdENvbnRleHRQYXRoXTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgdGhlcmUgaXMgYW55IHByZXZpb3VzbHkgZmFpbGVkIHJlcXVlc3QgZm9yIHRoaXMgY29udGV4dFxuXHRcdFx0aWYgKGFGYWlsZWRTaWRlRWZmZWN0cykge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5fbUZhaWxlZFNpZGVFZmZlY3RzW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdO1xuXHRcdFx0XHRtRmFpbGVkU2lkZUVmZmVjdHNOYW1lW3NTaWRlRWZmZWN0Q29udGV4dFBhdGhdID0ge307XG5cdFx0XHRcdGFGYWlsZWRTaWRlRWZmZWN0cy5mb3JFYWNoKG1GYWlsZWRTaWRlRWZmZWN0cyA9PiB7XG5cdFx0XHRcdFx0bUZhaWxlZFNpZGVFZmZlY3RzTmFtZVtzU2lkZUVmZmVjdENvbnRleHRQYXRoXVttRmFpbGVkU2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRydWU7XG5cdFx0XHRcdFx0YUltbWVkaWF0ZVNpZGVFZmZlY3RzUHJvcGVydGllcy5wdXNoKHtcblx0XHRcdFx0XHRcdG5hbWU6IHNTaWRlRWZmZWN0TmFtZSxcblx0XHRcdFx0XHRcdHByZXZpb3VzbHlGYWlsZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRzaWRlRWZmZWN0czogbUZhaWxlZFNpZGVFZmZlY3RzLFxuXHRcdFx0XHRcdFx0Y29udGV4dDogb1NpZGVFZmZlY3RQcm9wZXJ0eS5jb250ZXh0XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9TaWRlRWZmZWN0UHJvcGVydHkuaW1tZWRpYXRlKSB7XG5cdFx0XHRcdC8vIFNpZGVFZmZlY3RzIHdpbGwgYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZXZlbnQgcHJvbWlzZSB2YWxpZGF0aW9uXG5cdFx0XHRcdGlmICghbUZhaWxlZFNpZGVFZmZlY3RzTmFtZVtzU2lkZUVmZmVjdENvbnRleHRQYXRoXT8uW29TaWRlRWZmZWN0UHJvcGVydHkuc2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXSkge1xuXHRcdFx0XHRcdGFJbW1lZGlhdGVTaWRlRWZmZWN0c1Byb3BlcnRpZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRuYW1lOiBzU2lkZUVmZmVjdE5hbWUsXG5cdFx0XHRcdFx0XHRzaWRlRWZmZWN0czogb1NpZGVFZmZlY3RQcm9wZXJ0eS5zaWRlRWZmZWN0cyxcblx0XHRcdFx0XHRcdGNvbnRleHQ6IG9TaWRlRWZmZWN0UHJvcGVydHkuY29udGV4dFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBBZGQgZGVmZXJyZWQgU2lkZUVmZmVjdHMgdG8gdGhlIHJlbGF0ZWQgZGljdGlvbmFyeVxuXHRcdFx0XHR0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV0gPSB0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV0gfHwge307XG5cdFx0XHRcdGNvbnN0IG1TaWRlRWZmZWN0Q29udGV4dFBhdGggPSB0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV1bc1NpZGVFZmZlY3RDb250ZXh0UGF0aF0gfHwge1xuXHRcdFx0XHRcdHByb21pc2VzOiBbXSxcblx0XHRcdFx0XHRzaWRlRWZmZWN0UHJvcGVydHk6IG9TaWRlRWZmZWN0UHJvcGVydHksXG5cdFx0XHRcdFx0cHJvY2Vzc1N0YXJ0ZWQ6IGZhbHNlXG5cdFx0XHRcdH07XG5cdFx0XHRcdG1TaWRlRWZmZWN0Q29udGV4dFBhdGgucHJvbWlzZXMgPSBtU2lkZUVmZmVjdENvbnRleHRQYXRoLnByb21pc2VzLmNvbmNhdChbXG5cdFx0XHRcdFx0b0ZpZWxkUHJvbWlzZUZvckZpZWxkR3JvdXAsXG5cdFx0XHRcdFx0b0ZpZWxkR3JvdXBQcmVSZXF1aXNpdGUgYXMgUHJvbWlzZTxhbnk+XG5cdFx0XHRcdF0pO1xuXHRcdFx0XHR0aGlzLl9tRmllbGRHcm91cFF1ZXVlW3NTaWRlRWZmZWN0TmFtZV1bc1NpZGVFZmZlY3RDb250ZXh0UGF0aF0gPSBtU2lkZUVmZmVjdENvbnRleHRQYXRoO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiBhSW1tZWRpYXRlU2lkZUVmZmVjdHNQcm9wZXJ0aWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNhdmVzIHRoZSB2YWxpZGF0aW9uIHN0YXR1cyBvZiBwcm9wZXJ0aWVzIHJlbGF0ZWQgdG8gYSBmaWVsZCBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0ge29iamVjdH0gb0ZpZWxkIEZpZWxkXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gYlN1Y2Nlc3MgU3RhdHVzIG9mIHRoZSBmaWVsZCB2YWxpZGF0aW9uXG5cdCAqL1xuXHRwcml2YXRlIF9zYXZlRmllbGRQcm9wZXJ0aWVzU3RhdHVzKG9GaWVsZDogRmllbGRDb250cm9sLCBiU3VjY2VzczogYm9vbGVhbik6IHZvaWQge1xuXHRcdGNvbnN0IG9CaW5kaW5nQ29udGV4dCA9IG9GaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IHNFbnRpdHlUeXBlID0gdGhpcy5fb1NpZGVFZmZlY3RzU2VydmljZS5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQob0JpbmRpbmdDb250ZXh0KTtcblx0XHRjb25zdCBtRW50aXR5VHlwZSA9IHRoaXMuX2dldEVudGl0eVR5cGVGcm9tRlFOKHNFbnRpdHlUeXBlKTtcblx0XHRpZiAobUVudGl0eVR5cGUpIHtcblx0XHRcdC8vIFJldHJpZXZlcyBhbGwgcHJvcGVydGllcyB1c2VkIGJ5IHRoZSBmaWVsZFxuXHRcdFx0Y29uc3Qgb0ZpZWxkQmluZGluZzogYW55ID0gdGhpcy5fZ2V0QmluZGluZ0ZvckZpZWxkKG9GaWVsZCk7XG5cdFx0XHRjb25zdCBhRmllbGRQYXRocyA9IG9GaWVsZEJpbmRpbmcuaXNBKFwic2FwLnVpLm1vZGVsLkNvbXBvc2l0ZUJpbmRpbmdcIilcblx0XHRcdFx0PyAob0ZpZWxkQmluZGluZy5nZXRCaW5kaW5ncygpIHx8IFtdKS5tYXAoKG9CaW5kaW5nOiBhbnkpID0+IG9CaW5kaW5nLnNQYXRoKVxuXHRcdFx0XHQ6IFtvRmllbGRCaW5kaW5nLmdldFBhdGgoKV07XG5cblx0XHRcdC8vIFN0b3JlcyBzdGF0dXMgZm9yIGFsbCBwcm9wZXJ0aWVzXG5cdFx0XHRhRmllbGRQYXRocy5mb3JFYWNoKChzRmllbGRQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0Y29uc3Qgc0lkID0gdGhpcy5fZ2VuZXJhdGVTdGF0dXNJbmRleChtRW50aXR5VHlwZSwgc0ZpZWxkUGF0aCwgb0JpbmRpbmdDb250ZXh0KTtcblx0XHRcdFx0aWYgKHNJZCkge1xuXHRcdFx0XHRcdHRoaXMuX2FTb3VyY2VQcm9wZXJ0aWVzRmFpbHVyZVtiU3VjY2VzcyA/IFwiZGVsZXRlXCIgOiBcImFkZFwiXShzSWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBwcm9wZXJ0eSBiaW5kaW5nIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG5cdCAqXG5cdCAqIEBwYXJhbSBvRmllbGQgRmllbGRcblx0ICogQHJldHVybnMge0JpbmRpbmd9ICBCaW5kaW5nIHRvIHRoZSB2YWx1ZVxuXHQgKi9cblx0cHJpdmF0ZSBfZ2V0QmluZGluZ0ZvckZpZWxkKG9GaWVsZDogRmllbGRDb250cm9sKTogQmluZGluZyB7XG5cdFx0bGV0IHNCaW5kaW5nTmFtZSA9IFwidmFsdWVcIjtcblx0XHRpZiAob0ZpZWxkLmlzQShcInNhcC5tLkNoZWNrQm94XCIpKSB7XG5cdFx0XHRzQmluZGluZ05hbWUgPSBcInNlbGVjdGVkXCI7XG5cdFx0fSBlbHNlIGlmIChvRmllbGQuaXNBKFwic2FwLnVpLnVuaWZpZWQuRmlsZVVwbG9hZGVyXCIpKSB7XG5cdFx0XHRzQmluZGluZ05hbWUgPSBcInVwbG9hZFVybFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gb0ZpZWxkLmdldEJpbmRpbmcoc0JpbmRpbmdOYW1lKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBTaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb247XG4iXX0=
|