@sapui5/sap.fe.core 1.95.0 → 1.98.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 +5 -5
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/AnnotationHelper.js +3 -3
- package/src/sap/fe/core/AppComponent.js +9 -44
- package/src/sap/fe/core/AppStateHandler.js +2 -2
- package/src/sap/fe/core/BaseController.js +1 -1
- package/src/sap/fe/core/BusyLocker.js +13 -1
- package/src/sap/fe/core/CommonUtils.js +129 -219
- package/src/sap/fe/core/ExtensionAPI.js +14 -6
- package/src/sap/fe/core/PageController.js +9 -35
- package/src/sap/fe/core/RouterProxy.js +79 -75
- package/src/sap/fe/core/Synchronization.js +1 -1
- package/src/sap/fe/core/TemplateComponent.js +16 -7
- package/src/sap/fe/core/TemplateModel.js +1 -1
- package/src/sap/fe/core/TransactionHelper.js +183 -65
- package/src/sap/fe/core/actions/draft.js +50 -23
- package/src/sap/fe/core/actions/messageHandling.js +86 -7
- package/src/sap/fe/core/actions/nonDraft.js +1 -1
- package/src/sap/fe/core/actions/operations.js +75 -33
- package/src/sap/fe/core/actions/sticky.js +1 -1
- package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +1 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +276 -122
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +1 -1
- package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +14 -6
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +90 -46
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +234 -232
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +539 -209
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +550 -213
- package/src/sap/fe/core/controllerextensions/MassEdit.js +79 -0
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +227 -103
- package/src/sap/fe/core/controllerextensions/PageReady.js +2 -2
- package/src/sap/fe/core/controllerextensions/PageReady.ts +3 -7
- package/src/sap/fe/core/controllerextensions/Paginator.js +38 -12
- package/src/sap/fe/core/controllerextensions/Placeholder.js +16 -19
- package/src/sap/fe/core/controllerextensions/Routing.js +17 -2
- package/src/sap/fe/core/controllerextensions/RoutingListener.js +1 -1
- package/src/sap/fe/core/controllerextensions/Share.js +20 -7
- package/src/sap/fe/core/controllerextensions/SideEffects.js +8 -9
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +19 -17
- package/src/sap/fe/core/controllerextensions/ViewState.js +54 -9
- package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +40 -34
- package/src/sap/fe/core/controls/ActionParameterDialogValueHelp.fragment.xml +35 -0
- package/src/sap/fe/core/controls/CommandExecution.js +1 -1
- package/src/sap/fe/core/controls/ConditionalWrapper.js +1 -1
- package/src/sap/fe/core/controls/CustomQuickViewPage.js +110 -109
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +7 -4
- package/src/sap/fe/core/controls/FieldWrapper.js +10 -4
- package/src/sap/fe/core/controls/FilterBar.js +1 -1
- package/src/sap/fe/core/controls/FormElementWrapper.js +1 -6
- package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +45 -0
- package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +1 -1
- package/src/sap/fe/core/controls/filterbar/FilterContainer.js +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilter.js +1 -1
- package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +1 -1
- package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +1 -1
- package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
- package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +78 -0
- package/src/sap/fe/core/converters/ConverterContext.js +13 -1
- package/src/sap/fe/core/converters/ConverterContext.ts +10 -0
- package/src/sap/fe/core/converters/ManifestSettings.js +2 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +7 -1
- package/src/sap/fe/core/converters/ManifestWrapper.js +18 -7
- package/src/sap/fe/core/converters/ManifestWrapper.ts +15 -6
- package/src/sap/fe/core/converters/MetaModelConverter.js +920 -882
- package/src/sap/fe/core/converters/MetaModelConverter.ts +829 -853
- package/src/sap/fe/core/converters/annotations/DataField.js +54 -4
- package/src/sap/fe/core/converters/annotations/DataField.ts +53 -3
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +83 -48
- package/src/sap/fe/core/converters/controls/Common/Action.js +15 -3
- package/src/sap/fe/core/converters/controls/Common/Action.ts +12 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.js +1 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +0 -2
- package/src/sap/fe/core/converters/controls/Common/Form.js +68 -21
- package/src/sap/fe/core/converters/controls/Common/Form.ts +60 -16
- package/src/sap/fe/core/converters/controls/Common/KPI.js +331 -248
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +355 -287
- package/src/sap/fe/core/converters/controls/Common/Table.js +426 -332
- package/src/sap/fe/core/converters/controls/Common/Table.ts +516 -383
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +468 -0
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +609 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +30 -13
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +31 -12
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +15 -7
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +27 -6
- package/src/sap/fe/core/converters/helpers/Aggregation.js +8 -1
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +9 -1
- package/src/sap/fe/core/converters/helpers/BindingHelper.js +3 -2
- package/src/sap/fe/core/converters/helpers/BindingHelper.ts +2 -2
- package/src/sap/fe/core/converters/helpers/ID.js +9 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +6 -2
- package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -5
- package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -4
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +2 -2
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +1 -1
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +34 -4
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +36 -7
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +2 -5
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +1 -2
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -2
- package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
- package/src/sap/fe/core/formatters/FPMFormatter.ts +8 -3
- package/src/sap/fe/core/formatters/TableFormatter.js +27 -4
- package/src/sap/fe/core/formatters/TableFormatter.ts +20 -3
- package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
- package/src/sap/fe/core/formatters/ValueFormatter.ts +25 -3
- package/src/sap/fe/core/fpm/Component.js +2 -2
- package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +388 -0
- package/src/sap/fe/core/helpers/BindingExpression.js +199 -111
- package/src/sap/fe/core/helpers/BindingExpression.ts +193 -102
- package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +1 -1
- package/src/sap/fe/core/helpers/EditState.js +1 -1
- package/src/sap/fe/core/helpers/ExcelFormatHelper.js +1 -3
- package/src/sap/fe/core/helpers/FPMHelper.js +1 -1
- package/src/sap/fe/core/helpers/KeepAliveHelper.js +211 -0
- package/src/sap/fe/core/helpers/KeepAliveHelper.ts +202 -0
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.js +32 -0
- package/src/sap/fe/core/helpers/KeepAliveRefreshTypes.ts +36 -0
- package/src/sap/fe/core/helpers/MassEditHelper.js +678 -0
- package/src/sap/fe/core/helpers/ModelHelper.js +64 -1
- package/src/sap/fe/core/helpers/PasteHelper.js +7 -1
- package/src/sap/fe/core/helpers/SemanticDateOperators.js +1 -1
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.js +2 -2
- package/src/sap/fe/core/helpers/StableIdHelper.ts +1 -1
- package/src/sap/fe/core/library.js +28 -2
- package/src/sap/fe/core/library.support.js +10 -4
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
- package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
- package/src/sap/fe/core/messagebundle.properties +67 -3
- package/src/sap/fe/core/messagebundle_ar.properties +40 -3
- package/src/sap/fe/core/messagebundle_bg.properties +40 -3
- package/src/sap/fe/core/messagebundle_ca.properties +41 -4
- package/src/sap/fe/core/messagebundle_cs.properties +41 -4
- package/src/sap/fe/core/messagebundle_cy.properties +40 -3
- package/src/sap/fe/core/messagebundle_da.properties +40 -3
- package/src/sap/fe/core/messagebundle_de.properties +40 -3
- package/src/sap/fe/core/messagebundle_el.properties +40 -3
- package/src/sap/fe/core/messagebundle_en.properties +37 -0
- package/src/sap/fe/core/messagebundle_en_GB.properties +37 -0
- package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +37 -0
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +46 -2
- package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +44 -0
- package/src/sap/fe/core/messagebundle_es.properties +40 -3
- package/src/sap/fe/core/messagebundle_es_MX.properties +41 -4
- package/src/sap/fe/core/messagebundle_et.properties +40 -3
- package/src/sap/fe/core/messagebundle_fi.properties +40 -3
- package/src/sap/fe/core/messagebundle_fr.properties +41 -4
- package/src/sap/fe/core/messagebundle_fr_CA.properties +40 -3
- package/src/sap/fe/core/messagebundle_hi.properties +40 -3
- package/src/sap/fe/core/messagebundle_hr.properties +40 -3
- package/src/sap/fe/core/messagebundle_hu.properties +41 -4
- package/src/sap/fe/core/messagebundle_id.properties +42 -5
- package/src/sap/fe/core/messagebundle_it.properties +40 -3
- package/src/sap/fe/core/messagebundle_iw.properties +40 -3
- package/src/sap/fe/core/messagebundle_ja.properties +49 -12
- package/src/sap/fe/core/messagebundle_kk.properties +40 -3
- package/src/sap/fe/core/messagebundle_ko.properties +40 -3
- package/src/sap/fe/core/messagebundle_lt.properties +40 -3
- package/src/sap/fe/core/messagebundle_lv.properties +40 -3
- package/src/sap/fe/core/messagebundle_ms.properties +40 -3
- package/src/sap/fe/core/messagebundle_nl.properties +40 -3
- package/src/sap/fe/core/messagebundle_no.properties +40 -3
- package/src/sap/fe/core/messagebundle_pl.properties +40 -3
- package/src/sap/fe/core/messagebundle_pt.properties +42 -5
- package/src/sap/fe/core/messagebundle_pt_PT.properties +40 -3
- package/src/sap/fe/core/messagebundle_ro.properties +40 -3
- package/src/sap/fe/core/messagebundle_ru.properties +40 -3
- package/src/sap/fe/core/messagebundle_sh.properties +40 -3
- package/src/sap/fe/core/messagebundle_sk.properties +40 -3
- package/src/sap/fe/core/messagebundle_sl.properties +40 -3
- package/src/sap/fe/core/messagebundle_sv.properties +41 -4
- package/src/sap/fe/core/messagebundle_th.properties +40 -3
- package/src/sap/fe/core/messagebundle_tr.properties +40 -3
- package/src/sap/fe/core/messagebundle_uk.properties +40 -3
- package/src/sap/fe/core/messagebundle_vi.properties +40 -3
- package/src/sap/fe/core/messagebundle_zh_CN.properties +40 -3
- package/src/sap/fe/core/messagebundle_zh_TW.properties +40 -3
- package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +1 -1
- package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +1 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +3 -0
- package/src/sap/fe/core/services/NavigationServiceFactory.js +1 -1
- package/src/sap/fe/core/services/ResourceModelServiceFactory.js +1 -1
- package/src/sap/fe/core/services/RoutingServiceFactory.js +98 -328
- package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
- package/src/sap/fe/core/services/ShellServicesFactory.ts +30 -1
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +8 -5
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +11 -6
- package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +14 -5
- package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +1 -1
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
- package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
- package/src/sap/fe/core/templating/DataModelPathHelper.js +8 -37
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +13 -33
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
- package/src/sap/fe/core/templating/EntitySetHelper.js +86 -3
- package/src/sap/fe/core/templating/EntitySetHelper.ts +44 -0
- package/src/sap/fe/core/templating/FilterHelper.js +10 -7
- package/src/sap/fe/core/templating/FilterHelper.ts +8 -6
- 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 +47 -107
- package/src/sap/fe/core/templating/UIFormatters.ts +76 -72
|
@@ -16,303 +16,386 @@ sap.ui.define(["../../helpers/ID", "sap/fe/core/templating/PropertyHelper", "sap
|
|
|
16
16
|
var isPathExpression = PropertyHelper.isPathExpression;
|
|
17
17
|
var KPIID = ID.KPIID;
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
19
|
+
var DeviationIndicatorFromTrendType = {
|
|
20
|
+
"UI.TrendType/StrongUp": "Up",
|
|
21
|
+
"UI.TrendType/Up": "Up",
|
|
22
|
+
"UI.TrendType/StrongDown": "Down",
|
|
23
|
+
"UI.TrendType/Down": "Down",
|
|
24
|
+
"UI.TrendType/Sideways": "None"
|
|
25
|
+
};
|
|
26
|
+
var KPIChartTypeFromUI = {
|
|
27
|
+
"UI.ChartType/ColumnStacked": "StackedColumn",
|
|
28
|
+
"UI.ChartType/BarStacked": "StackedBar",
|
|
29
|
+
"UI.ChartType/Donut": "Donut",
|
|
30
|
+
"UI.ChartType/Line": "Line",
|
|
31
|
+
"UI.ChartType/Bubble": "bubble",
|
|
32
|
+
"UI.ChartType/Column": "column",
|
|
33
|
+
"UI.ChartType/Bar": "bar",
|
|
34
|
+
"UI.ChartType/VerticalBullet": "vertical_bullet",
|
|
35
|
+
"UI.ChartType/Combination": "combination",
|
|
36
|
+
"UI.ChartType/Scatter": "scatter"
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
function convertKPIChart(chartAnnotation, presentationVariantAnnotation) {
|
|
40
|
+
var _presentationVariantA, _presentationVariantA2;
|
|
41
|
+
|
|
42
|
+
if (chartAnnotation.Measures === undefined) {
|
|
43
|
+
// We need at least 1 measure (but no dimension is allowed, e.g. for bubble chart)
|
|
44
|
+
return undefined;
|
|
41
45
|
}
|
|
42
46
|
|
|
43
|
-
|
|
47
|
+
var charDimensions = chartAnnotation.Dimensions ? chartAnnotation.Dimensions.map(function (propertyPath) {
|
|
48
|
+
var _chartAnnotation$Dime, _propertyPath$$target, _propertyPath$$target2, _dimAttribute$Role;
|
|
49
|
+
|
|
50
|
+
var dimAttribute = (_chartAnnotation$Dime = chartAnnotation.DimensionAttributes) === null || _chartAnnotation$Dime === void 0 ? void 0 : _chartAnnotation$Dime.find(function (attribute) {
|
|
51
|
+
var _attribute$Dimension;
|
|
52
|
+
|
|
53
|
+
return ((_attribute$Dimension = attribute.Dimension) === null || _attribute$Dimension === void 0 ? void 0 : _attribute$Dimension.value) === propertyPath.value;
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
name: propertyPath.value,
|
|
57
|
+
label: ((_propertyPath$$target = propertyPath.$target.annotations.Common) === null || _propertyPath$$target === void 0 ? void 0 : (_propertyPath$$target2 = _propertyPath$$target.Label) === null || _propertyPath$$target2 === void 0 ? void 0 : _propertyPath$$target2.toString()) || propertyPath.value,
|
|
58
|
+
role: dimAttribute === null || dimAttribute === void 0 ? void 0 : (_dimAttribute$Role = dimAttribute.Role) === null || _dimAttribute$Role === void 0 ? void 0 : _dimAttribute$Role.replace("UI.ChartDimensionRoleType/", "")
|
|
59
|
+
};
|
|
60
|
+
}) : [];
|
|
61
|
+
var chartMeasures = chartAnnotation.Measures.map(function (propertyPath) {
|
|
62
|
+
var _chartAnnotation$Meas, _propertyPath$$target3, _propertyPath$$target4, _measureAttribute$Rol;
|
|
63
|
+
|
|
64
|
+
var measureAttribute = (_chartAnnotation$Meas = chartAnnotation.MeasureAttributes) === null || _chartAnnotation$Meas === void 0 ? void 0 : _chartAnnotation$Meas.find(function (attribute) {
|
|
65
|
+
var _attribute$Measure;
|
|
66
|
+
|
|
67
|
+
return ((_attribute$Measure = attribute.Measure) === null || _attribute$Measure === void 0 ? void 0 : _attribute$Measure.value) === propertyPath.value;
|
|
68
|
+
});
|
|
69
|
+
return {
|
|
70
|
+
name: propertyPath.value,
|
|
71
|
+
label: ((_propertyPath$$target3 = propertyPath.$target.annotations.Common) === null || _propertyPath$$target3 === void 0 ? void 0 : (_propertyPath$$target4 = _propertyPath$$target3.Label) === null || _propertyPath$$target4 === void 0 ? void 0 : _propertyPath$$target4.toString()) || propertyPath.value,
|
|
72
|
+
role: measureAttribute === null || measureAttribute === void 0 ? void 0 : (_measureAttribute$Rol = measureAttribute.Role) === null || _measureAttribute$Rol === void 0 ? void 0 : _measureAttribute$Rol.replace("UI.ChartMeasureRoleType/", "")
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
return {
|
|
76
|
+
chartType: KPIChartTypeFromUI[chartAnnotation.ChartType] || "Line",
|
|
77
|
+
dimensions: charDimensions,
|
|
78
|
+
measures: chartMeasures,
|
|
79
|
+
sortOrder: presentationVariantAnnotation === null || presentationVariantAnnotation === void 0 ? void 0 : (_presentationVariantA = presentationVariantAnnotation.SortOrder) === null || _presentationVariantA === void 0 ? void 0 : _presentationVariantA.map(function (sortOrder) {
|
|
80
|
+
var _sortOrder$Property;
|
|
81
|
+
|
|
82
|
+
return {
|
|
83
|
+
name: ((_sortOrder$Property = sortOrder.Property) === null || _sortOrder$Property === void 0 ? void 0 : _sortOrder$Property.value) || "",
|
|
84
|
+
descending: !!sortOrder.Descending
|
|
85
|
+
};
|
|
86
|
+
}),
|
|
87
|
+
maxItems: presentationVariantAnnotation === null || presentationVariantAnnotation === void 0 ? void 0 : (_presentationVariantA2 = presentationVariantAnnotation.MaxItems) === null || _presentationVariantA2 === void 0 ? void 0 : _presentationVariantA2.valueOf()
|
|
88
|
+
};
|
|
44
89
|
}
|
|
45
90
|
|
|
46
|
-
function
|
|
47
|
-
var
|
|
91
|
+
function updateCurrency(datapointAnnotation, kpiDef) {
|
|
92
|
+
var _targetValueProperty$, _targetValueProperty$3;
|
|
48
93
|
|
|
49
|
-
|
|
50
|
-
var chart = presentationVariantAnnotation === null || presentationVariantAnnotation === void 0 ? void 0 : (_presentationVariantA = presentationVariantAnnotation.Visualizations) === null || _presentationVariantA === void 0 ? void 0 : _presentationVariantA.find(function (viz) {
|
|
51
|
-
return viz.$target.$Type === "com.sap.vocabularies.UI.v1.ChartDefinitionType";
|
|
52
|
-
});
|
|
94
|
+
var targetValueProperty = datapointAnnotation.Value.$target;
|
|
53
95
|
|
|
54
|
-
if (
|
|
55
|
-
var
|
|
56
|
-
var chartType;
|
|
96
|
+
if ((_targetValueProperty$ = targetValueProperty.annotations.Measures) !== null && _targetValueProperty$ !== void 0 && _targetValueProperty$.ISOCurrency) {
|
|
97
|
+
var _targetValueProperty$2;
|
|
57
98
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
99
|
+
var currency = (_targetValueProperty$2 = targetValueProperty.annotations.Measures) === null || _targetValueProperty$2 === void 0 ? void 0 : _targetValueProperty$2.ISOCurrency;
|
|
100
|
+
|
|
101
|
+
if (isPathExpression(currency)) {
|
|
102
|
+
kpiDef.datapoint.unit = {
|
|
103
|
+
value: currency.$target.name,
|
|
104
|
+
isCurrency: true,
|
|
105
|
+
isPath: true
|
|
106
|
+
};
|
|
107
|
+
} else {
|
|
108
|
+
kpiDef.datapoint.unit = {
|
|
109
|
+
value: currency.toString(),
|
|
110
|
+
isCurrency: true,
|
|
111
|
+
isPath: false
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
} else if ((_targetValueProperty$3 = targetValueProperty.annotations.Measures) !== null && _targetValueProperty$3 !== void 0 && _targetValueProperty$3.Unit) {
|
|
115
|
+
var _targetValueProperty$4;
|
|
116
|
+
|
|
117
|
+
var unit = (_targetValueProperty$4 = targetValueProperty.annotations.Measures) === null || _targetValueProperty$4 === void 0 ? void 0 : _targetValueProperty$4.Unit;
|
|
118
|
+
|
|
119
|
+
if (isPathExpression(unit)) {
|
|
120
|
+
kpiDef.datapoint.unit = {
|
|
121
|
+
value: unit.$target.name,
|
|
122
|
+
isCurrency: false,
|
|
123
|
+
isPath: true
|
|
124
|
+
};
|
|
125
|
+
} else {
|
|
126
|
+
kpiDef.datapoint.unit = {
|
|
127
|
+
value: unit.toString(),
|
|
128
|
+
isCurrency: false,
|
|
129
|
+
isPath: false
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
62
134
|
|
|
63
|
-
|
|
64
|
-
|
|
135
|
+
function updateCriticality(datapointAnnotation, aggregationHelper, kpiDef) {
|
|
136
|
+
if (datapointAnnotation.Criticality) {
|
|
137
|
+
if (typeof datapointAnnotation.Criticality === "object") {
|
|
138
|
+
// Criticality is a path --> check if the corresponding property is aggregatable
|
|
139
|
+
var criticalityProperty = datapointAnnotation.Criticality.$target;
|
|
140
|
+
|
|
141
|
+
if (aggregationHelper.isPropertyAggregatable(criticalityProperty)) {
|
|
142
|
+
kpiDef.datapoint.criticalityPath = datapointAnnotation.Criticality.path;
|
|
143
|
+
} else {
|
|
144
|
+
// The property isn't aggregatable --> we ignore it
|
|
145
|
+
kpiDef.datapoint.criticalityValue = MessageType.None;
|
|
146
|
+
}
|
|
147
|
+
} else {
|
|
148
|
+
// Criticality is an enum Value --> get the corresponding static value
|
|
149
|
+
kpiDef.datapoint.criticalityValue = getMessageTypeFromCriticalityType(datapointAnnotation.Criticality);
|
|
150
|
+
}
|
|
151
|
+
} else if (datapointAnnotation.CriticalityCalculation) {
|
|
152
|
+
kpiDef.datapoint.criticalityCalculationMode = datapointAnnotation.CriticalityCalculation.ImprovementDirection;
|
|
153
|
+
kpiDef.datapoint.criticalityCalculationThresholds = [];
|
|
154
|
+
|
|
155
|
+
switch (kpiDef.datapoint.criticalityCalculationMode) {
|
|
156
|
+
case "UI.ImprovementDirectionType/Target":
|
|
157
|
+
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.DeviationRangeLowValue);
|
|
158
|
+
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.ToleranceRangeLowValue);
|
|
159
|
+
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.AcceptanceRangeLowValue);
|
|
160
|
+
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.AcceptanceRangeHighValue);
|
|
161
|
+
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.ToleranceRangeHighValue);
|
|
162
|
+
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.DeviationRangeHighValue);
|
|
65
163
|
break;
|
|
66
164
|
|
|
67
|
-
case "UI.
|
|
68
|
-
|
|
165
|
+
case "UI.ImprovementDirectionType/Minimize":
|
|
166
|
+
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.AcceptanceRangeHighValue);
|
|
167
|
+
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.ToleranceRangeHighValue);
|
|
168
|
+
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.DeviationRangeHighValue);
|
|
69
169
|
break;
|
|
70
170
|
|
|
171
|
+
case "UI.ImprovementDirectionType/Maximize":
|
|
71
172
|
default:
|
|
72
|
-
|
|
173
|
+
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.DeviationRangeLowValue);
|
|
174
|
+
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.ToleranceRangeLowValue);
|
|
175
|
+
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.AcceptanceRangeLowValue);
|
|
73
176
|
}
|
|
177
|
+
} else {
|
|
178
|
+
kpiDef.datapoint.criticalityValue = MessageType.None;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
74
181
|
|
|
75
|
-
|
|
76
|
-
|
|
182
|
+
function updateTrend(datapointAnnotation, aggregationHelper, kpiDef) {
|
|
183
|
+
if (datapointAnnotation.Trend) {
|
|
184
|
+
if (typeof datapointAnnotation.Trend === "object") {
|
|
185
|
+
// Trend is a path --> check if the corresponding property is aggregatable
|
|
186
|
+
var trendProperty = datapointAnnotation.Trend.$target;
|
|
187
|
+
|
|
188
|
+
if (aggregationHelper.isPropertyAggregatable(trendProperty)) {
|
|
189
|
+
kpiDef.datapoint.trendPath = datapointAnnotation.Trend.path;
|
|
190
|
+
} else {
|
|
191
|
+
// The property isn't aggregatable --> we ignore it
|
|
192
|
+
kpiDef.datapoint.trendValue = "None";
|
|
193
|
+
}
|
|
77
194
|
} else {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
};
|
|
102
|
-
})
|
|
103
|
-
}
|
|
104
|
-
};
|
|
195
|
+
// Trend is an enum Value --> get the corresponding static value
|
|
196
|
+
kpiDef.datapoint.trendValue = DeviationIndicatorFromTrendType[datapointAnnotation.Trend] || "None";
|
|
197
|
+
}
|
|
198
|
+
} else if (datapointAnnotation.TrendCalculation) {
|
|
199
|
+
kpiDef.datapoint.trendCalculationIsRelative = datapointAnnotation.TrendCalculation.IsRelativeDifference ? true : false;
|
|
200
|
+
|
|
201
|
+
if (datapointAnnotation.TrendCalculation.ReferenceValue.$target) {
|
|
202
|
+
// Reference value is a path --> check if the corresponding property is aggregatable
|
|
203
|
+
var referenceProperty = datapointAnnotation.TrendCalculation.ReferenceValue.$target;
|
|
204
|
+
|
|
205
|
+
if (aggregationHelper.isPropertyAggregatable(referenceProperty)) {
|
|
206
|
+
kpiDef.datapoint.trendCalculationReferencePath = datapointAnnotation.TrendCalculation.ReferenceValue.path;
|
|
207
|
+
} else {
|
|
208
|
+
// The property isn't aggregatable --> we ignore it and switch back to trend 'None'
|
|
209
|
+
kpiDef.datapoint.trendValue = "None";
|
|
210
|
+
}
|
|
211
|
+
} else {
|
|
212
|
+
// Reference value is a static value
|
|
213
|
+
kpiDef.datapoint.trendCalculationReferenceValue = datapointAnnotation.TrendCalculation.ReferenceValue;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if (kpiDef.datapoint.trendCalculationReferencePath !== undefined || kpiDef.datapoint.trendCalculationReferenceValue !== undefined) {
|
|
217
|
+
kpiDef.datapoint.trendCalculationTresholds = [datapointAnnotation.TrendCalculation.StrongDownDifference.valueOf(), datapointAnnotation.TrendCalculation.DownDifference.valueOf(), datapointAnnotation.TrendCalculation.UpDifference.valueOf(), datapointAnnotation.TrendCalculation.StrongUpDifference.valueOf()];
|
|
105
218
|
}
|
|
106
219
|
} else {
|
|
107
|
-
|
|
220
|
+
kpiDef.datapoint.trendValue = "None";
|
|
108
221
|
}
|
|
109
222
|
}
|
|
110
223
|
|
|
111
|
-
function
|
|
112
|
-
|
|
224
|
+
function updateTarget(datapointAnnotation, aggregationHelper, kpiDef) {
|
|
225
|
+
if (datapointAnnotation.TargetValue) {
|
|
226
|
+
if (datapointAnnotation.TargetValue.$target) {
|
|
227
|
+
// Target value is a path --> check if the corresponding property is aggregatable (otherwise ignore)
|
|
228
|
+
var targetProperty = datapointAnnotation.TargetValue.$target;
|
|
113
229
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
230
|
+
if (aggregationHelper.isPropertyAggregatable(targetProperty)) {
|
|
231
|
+
kpiDef.datapoint.targetPath = datapointAnnotation.TargetValue.path;
|
|
232
|
+
}
|
|
233
|
+
} else {
|
|
234
|
+
// Target value is a static value
|
|
235
|
+
kpiDef.datapoint.targetValue = datapointAnnotation.TargetValue;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
120
239
|
|
|
121
|
-
|
|
122
|
-
|
|
240
|
+
function getNavigationInfoFromProperty(property) {
|
|
241
|
+
var annotations = property.annotations["Common"] || {}; // Look for the semanticObject annotation (if any)
|
|
123
242
|
|
|
124
|
-
|
|
243
|
+
var semanticObjectAnnotation;
|
|
244
|
+
Object.keys(annotations).forEach(function (annotationKey) {
|
|
245
|
+
var annotation = annotations[annotationKey];
|
|
125
246
|
|
|
126
|
-
|
|
127
|
-
|
|
247
|
+
if (annotation.term === "com.sap.vocabularies.Common.v1.SemanticObject") {
|
|
248
|
+
if (!annotation.qualifier || !semanticObjectAnnotation) {
|
|
249
|
+
// We always take the annotation without qualifier if there's one, otherwise we take the first one
|
|
250
|
+
semanticObjectAnnotation = annotation;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
});
|
|
128
254
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
} //
|
|
255
|
+
if (semanticObjectAnnotation) {
|
|
256
|
+
var result = {
|
|
257
|
+
semanticObject: semanticObjectAnnotation.toString(),
|
|
258
|
+
unavailableActions: []
|
|
259
|
+
}; // Look for the unavailable actions (if any)
|
|
134
260
|
|
|
261
|
+
var annotationKey = Object.keys(annotations).find(function (key) {
|
|
262
|
+
var _semanticObjectAnnota;
|
|
135
263
|
|
|
136
|
-
|
|
264
|
+
return annotations[key].term === "com.sap.vocabularies.Common.v1.SemanticObjectUnavailableActions" && annotations[key].qualifier === ((_semanticObjectAnnota = semanticObjectAnnotation) === null || _semanticObjectAnnota === void 0 ? void 0 : _semanticObjectAnnota.qualifier);
|
|
265
|
+
});
|
|
137
266
|
|
|
138
|
-
if (
|
|
139
|
-
|
|
140
|
-
converterContext.getDiagnostics().addIssue(IssueCategory.Annotation, IssueSeverity.Medium, IssueType.KPI_ISSUES.NO_CHART_VISUALIZATION + kpiConfig.qualifier);
|
|
141
|
-
return undefined;
|
|
267
|
+
if (annotationKey) {
|
|
268
|
+
result.unavailableActions = annotations[annotationKey];
|
|
142
269
|
}
|
|
143
270
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
annotationPath: kpiConverterContext.getEntitySetBasedAnnotationPath(datapointAnnotation.fullyQualifiedName),
|
|
150
|
-
title: (_datapointAnnotation$ = datapointAnnotation.Title) === null || _datapointAnnotation$ === void 0 ? void 0 : _datapointAnnotation$.toString(),
|
|
151
|
-
description: (_datapointAnnotation$2 = datapointAnnotation.Description) === null || _datapointAnnotation$2 === void 0 ? void 0 : _datapointAnnotation$2.toString()
|
|
152
|
-
},
|
|
153
|
-
selectionVariantFilterDefinitions: targetKPI.SelectionVariant ? getFilterDefinitionsFromSelectionVariant(targetKPI.SelectionVariant) : undefined,
|
|
154
|
-
card: cardDef
|
|
155
|
-
}; // Unit or currency
|
|
156
|
-
|
|
157
|
-
var targetValueProperty = datapointAnnotation.Value.$target;
|
|
158
|
-
|
|
159
|
-
if ((_targetValueProperty$ = targetValueProperty.annotations.Measures) !== null && _targetValueProperty$ !== void 0 && _targetValueProperty$.ISOCurrency) {
|
|
160
|
-
var _targetValueProperty$2;
|
|
161
|
-
|
|
162
|
-
var currency = (_targetValueProperty$2 = targetValueProperty.annotations.Measures) === null || _targetValueProperty$2 === void 0 ? void 0 : _targetValueProperty$2.ISOCurrency;
|
|
163
|
-
|
|
164
|
-
if (isPathExpression(currency)) {
|
|
165
|
-
kpiDef.datapoint.unit = {
|
|
166
|
-
value: currency.$target.name,
|
|
167
|
-
isCurrency: true,
|
|
168
|
-
isPath: true
|
|
169
|
-
};
|
|
170
|
-
} else {
|
|
171
|
-
kpiDef.datapoint.unit = {
|
|
172
|
-
value: currency.toString(),
|
|
173
|
-
isCurrency: true,
|
|
174
|
-
isPath: false
|
|
175
|
-
};
|
|
176
|
-
}
|
|
177
|
-
} else if ((_targetValueProperty$3 = targetValueProperty.annotations.Measures) !== null && _targetValueProperty$3 !== void 0 && _targetValueProperty$3.Unit) {
|
|
178
|
-
var _targetValueProperty$4;
|
|
271
|
+
return result;
|
|
272
|
+
} else {
|
|
273
|
+
return undefined;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
179
276
|
|
|
180
|
-
|
|
277
|
+
function createKPIDefinition(kpiName, kpiConfig, converterContext) {
|
|
278
|
+
var _datapointAnnotation$, _datapointAnnotation$2;
|
|
181
279
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
value: unit.$target.name,
|
|
185
|
-
isCurrency: false,
|
|
186
|
-
isPath: true
|
|
187
|
-
};
|
|
188
|
-
} else {
|
|
189
|
-
kpiDef.datapoint.unit = {
|
|
190
|
-
value: unit.toString(),
|
|
191
|
-
isCurrency: false,
|
|
192
|
-
isPath: false
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
} // Criticality
|
|
280
|
+
var kpiConverterContext = converterContext.getConverterContextFor("/" + kpiConfig.entitySet);
|
|
281
|
+
var aggregationHelper = new AggregationHelper(kpiConverterContext.getEntityType(), kpiConverterContext);
|
|
196
282
|
|
|
283
|
+
if (!aggregationHelper.isAnalyticsSupported()) {
|
|
284
|
+
// The entity doesn't support analytical queries
|
|
285
|
+
converterContext.getDiagnostics().addIssue(IssueCategory.Annotation, IssueSeverity.Medium, IssueType.KPI_ISSUES.NO_ANALYTICS + kpiConfig.entitySet);
|
|
286
|
+
return undefined;
|
|
287
|
+
}
|
|
197
288
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
289
|
+
var selectionVariantAnnotation;
|
|
290
|
+
var datapointAnnotation;
|
|
291
|
+
var presentationVariantAnnotation;
|
|
292
|
+
var chartAnnotation;
|
|
293
|
+
var navigationInfo; // Search for a KPI with the qualifier frmo the manifest
|
|
202
294
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
kpiDef.datapoint.criticalityValue = MessageType.None;
|
|
208
|
-
}
|
|
209
|
-
} else {
|
|
210
|
-
// Criticality is an enum Value --> get the corresponding static value
|
|
211
|
-
kpiDef.datapoint.criticalityValue = getMessageTypeFromCriticalityType(datapointAnnotation.Criticality);
|
|
212
|
-
}
|
|
213
|
-
} else if (datapointAnnotation.CriticalityCalculation) {
|
|
214
|
-
kpiDef.datapoint.criticalityCalculationMode = datapointAnnotation.CriticalityCalculation.ImprovementDirection;
|
|
215
|
-
kpiDef.datapoint.criticalityCalculationThresholds = [];
|
|
216
|
-
|
|
217
|
-
switch (kpiDef.datapoint.criticalityCalculationMode) {
|
|
218
|
-
case "UI.ImprovementDirectionType/Target":
|
|
219
|
-
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.DeviationRangeLowValue);
|
|
220
|
-
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.ToleranceRangeLowValue);
|
|
221
|
-
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.AcceptanceRangeLowValue);
|
|
222
|
-
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.AcceptanceRangeHighValue);
|
|
223
|
-
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.ToleranceRangeHighValue);
|
|
224
|
-
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.DeviationRangeHighValue);
|
|
225
|
-
break;
|
|
226
|
-
|
|
227
|
-
case "UI.ImprovementDirectionType/Minimize":
|
|
228
|
-
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.AcceptanceRangeHighValue);
|
|
229
|
-
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.ToleranceRangeHighValue);
|
|
230
|
-
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.DeviationRangeHighValue);
|
|
231
|
-
break;
|
|
232
|
-
|
|
233
|
-
case "UI.ImprovementDirectionType/Maximize":
|
|
234
|
-
default:
|
|
235
|
-
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.DeviationRangeLowValue);
|
|
236
|
-
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.ToleranceRangeLowValue);
|
|
237
|
-
kpiDef.datapoint.criticalityCalculationThresholds.push(datapointAnnotation.CriticalityCalculation.AcceptanceRangeLowValue);
|
|
238
|
-
}
|
|
239
|
-
} else {
|
|
240
|
-
kpiDef.datapoint.criticalityValue = MessageType.None;
|
|
241
|
-
} // Trend
|
|
295
|
+
var aKPIAnnotations = kpiConverterContext.getAnnotationsByTerm("UI", "com.sap.vocabularies.UI.v1.KPI");
|
|
296
|
+
var targetKPI = aKPIAnnotations.find(function (kpi) {
|
|
297
|
+
return kpi.qualifier === kpiConfig.qualifier;
|
|
298
|
+
});
|
|
242
299
|
|
|
300
|
+
if (targetKPI) {
|
|
301
|
+
var _targetKPI$Detail, _presentationVariantA3, _presentationVariantA4, _presentationVariantA5, _targetKPI$Detail2;
|
|
243
302
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
303
|
+
datapointAnnotation = targetKPI.DataPoint;
|
|
304
|
+
selectionVariantAnnotation = targetKPI.SelectionVariant;
|
|
305
|
+
presentationVariantAnnotation = (_targetKPI$Detail = targetKPI.Detail) === null || _targetKPI$Detail === void 0 ? void 0 : _targetKPI$Detail.DefaultPresentationVariant;
|
|
306
|
+
chartAnnotation = (_presentationVariantA3 = presentationVariantAnnotation) === null || _presentationVariantA3 === void 0 ? void 0 : (_presentationVariantA4 = _presentationVariantA3.Visualizations) === null || _presentationVariantA4 === void 0 ? void 0 : (_presentationVariantA5 = _presentationVariantA4.find(function (viz) {
|
|
307
|
+
return viz.$target.$Type === "com.sap.vocabularies.UI.v1.ChartDefinitionType";
|
|
308
|
+
})) === null || _presentationVariantA5 === void 0 ? void 0 : _presentationVariantA5.$target;
|
|
248
309
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
} else {
|
|
252
|
-
// The property isn't aggregatable --> we ignore it
|
|
253
|
-
kpiDef.datapoint.trendValue = "None";
|
|
254
|
-
}
|
|
255
|
-
} else {
|
|
256
|
-
// Trend is an enum Value --> get the corresponding static value
|
|
257
|
-
kpiDef.datapoint.trendValue = getDeviationIndicatorFromTrendType(datapointAnnotation.Trend);
|
|
258
|
-
}
|
|
259
|
-
} else if (datapointAnnotation.TrendCalculation) {
|
|
260
|
-
kpiDef.datapoint.trendCalculationIsRelative = datapointAnnotation.TrendCalculation.IsRelativeDifference ? true : false;
|
|
261
|
-
|
|
262
|
-
if (datapointAnnotation.TrendCalculation.ReferenceValue.$target) {
|
|
263
|
-
// Reference value is a path --> check if the corresponding property is aggregatable
|
|
264
|
-
var referenceProperty = datapointAnnotation.TrendCalculation.ReferenceValue.$target;
|
|
265
|
-
|
|
266
|
-
if (aggregationHelper.isPropertyAggregatable(referenceProperty)) {
|
|
267
|
-
kpiDef.datapoint.trendCalculationReferencePath = datapointAnnotation.TrendCalculation.ReferenceValue.path;
|
|
268
|
-
} else {
|
|
269
|
-
// The property isn't aggregatable --> we ignore it and switch back to trend 'None'
|
|
270
|
-
kpiDef.datapoint.trendValue = "None";
|
|
271
|
-
}
|
|
272
|
-
} else {
|
|
273
|
-
// Reference value is a static value
|
|
274
|
-
kpiDef.datapoint.trendCalculationReferenceValue = datapointAnnotation.TrendCalculation.ReferenceValue;
|
|
275
|
-
}
|
|
310
|
+
if ((_targetKPI$Detail2 = targetKPI.Detail) !== null && _targetKPI$Detail2 !== void 0 && _targetKPI$Detail2.SemanticObject) {
|
|
311
|
+
var _targetKPI$Detail$Act;
|
|
276
312
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
313
|
+
navigationInfo = {
|
|
314
|
+
semanticObject: targetKPI.Detail.SemanticObject.toString(),
|
|
315
|
+
action: (_targetKPI$Detail$Act = targetKPI.Detail.Action) === null || _targetKPI$Detail$Act === void 0 ? void 0 : _targetKPI$Detail$Act.toString(),
|
|
316
|
+
unavailableActions: []
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
} else {
|
|
320
|
+
// Fallback: try to find a SPV with the same qualifier
|
|
321
|
+
var aSPVAnnotations = kpiConverterContext.getAnnotationsByTerm("UI", "com.sap.vocabularies.UI.v1.SelectionPresentationVariant");
|
|
322
|
+
var targetSPV = aSPVAnnotations.find(function (spv) {
|
|
323
|
+
return spv.qualifier === kpiConfig.qualifier;
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
if (targetSPV) {
|
|
327
|
+
var _presentationVariantA6, _presentationVariantA7, _presentationVariantA8, _presentationVariantA9, _presentationVariantA10, _presentationVariantA11;
|
|
328
|
+
|
|
329
|
+
selectionVariantAnnotation = targetSPV.SelectionVariant;
|
|
330
|
+
presentationVariantAnnotation = targetSPV.PresentationVariant;
|
|
331
|
+
datapointAnnotation = (_presentationVariantA6 = presentationVariantAnnotation) === null || _presentationVariantA6 === void 0 ? void 0 : (_presentationVariantA7 = _presentationVariantA6.Visualizations) === null || _presentationVariantA7 === void 0 ? void 0 : (_presentationVariantA8 = _presentationVariantA7.find(function (viz) {
|
|
332
|
+
return viz.$target.$Type === "com.sap.vocabularies.UI.v1.DataPointType";
|
|
333
|
+
})) === null || _presentationVariantA8 === void 0 ? void 0 : _presentationVariantA8.$target;
|
|
334
|
+
chartAnnotation = (_presentationVariantA9 = presentationVariantAnnotation) === null || _presentationVariantA9 === void 0 ? void 0 : (_presentationVariantA10 = _presentationVariantA9.Visualizations) === null || _presentationVariantA10 === void 0 ? void 0 : (_presentationVariantA11 = _presentationVariantA10.find(function (viz) {
|
|
335
|
+
return viz.$target.$Type === "com.sap.vocabularies.UI.v1.ChartDefinitionType";
|
|
336
|
+
})) === null || _presentationVariantA11 === void 0 ? void 0 : _presentationVariantA11.$target;
|
|
280
337
|
} else {
|
|
281
|
-
|
|
282
|
-
|
|
338
|
+
// Couldn't find a KPI or a SPV annotation with the qualifier from the manifest
|
|
339
|
+
converterContext.getDiagnostics().addIssue(IssueCategory.Annotation, IssueSeverity.Medium, IssueType.KPI_ISSUES.KPI_NOT_FOUND + kpiConfig.qualifier);
|
|
340
|
+
return undefined;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
if (!presentationVariantAnnotation || !datapointAnnotation || !chartAnnotation) {
|
|
345
|
+
// Couldn't find a chart or datapoint definition
|
|
346
|
+
converterContext.getDiagnostics().addIssue(IssueCategory.Annotation, IssueSeverity.Medium, IssueType.KPI_ISSUES.KPI_DETAIL_NOT_FOUND + kpiConfig.qualifier);
|
|
347
|
+
return undefined;
|
|
348
|
+
}
|
|
283
349
|
|
|
350
|
+
var datapointProperty = datapointAnnotation.Value.$target;
|
|
284
351
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
352
|
+
if (!aggregationHelper.isPropertyAggregatable(datapointProperty)) {
|
|
353
|
+
// The main property of the KPI is not aggregatable --> We can't calculate its value so we ignore the KPI
|
|
354
|
+
converterContext.getDiagnostics().addIssue(IssueCategory.Annotation, IssueSeverity.Medium, IssueType.KPI_ISSUES.MAIN_PROPERTY_NOT_AGGREGATABLE + kpiConfig.qualifier);
|
|
355
|
+
return undefined;
|
|
356
|
+
} // Chart definition
|
|
289
357
|
|
|
290
|
-
if (aggregationHelper.isPropertyAggregatable(targetProperty)) {
|
|
291
|
-
kpiDef.datapoint.targetPath = datapointAnnotation.TargetValue.path;
|
|
292
|
-
}
|
|
293
|
-
} else {
|
|
294
|
-
// Target value is a static value
|
|
295
|
-
kpiDef.datapoint.targetValue = datapointAnnotation.TargetValue;
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
358
|
|
|
299
|
-
|
|
300
|
-
} else {
|
|
301
|
-
var _targetKPI$Detail2;
|
|
359
|
+
var chartDef = convertKPIChart(chartAnnotation, presentationVariantAnnotation);
|
|
302
360
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
361
|
+
if (!chartDef) {
|
|
362
|
+
return undefined;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
var kpiDef = {
|
|
366
|
+
id: KPIID(kpiName),
|
|
367
|
+
entitySet: kpiConfig.entitySet,
|
|
368
|
+
datapoint: {
|
|
369
|
+
propertyPath: datapointAnnotation.Value.path,
|
|
370
|
+
annotationPath: kpiConverterContext.getEntitySetBasedAnnotationPath(datapointAnnotation.fullyQualifiedName),
|
|
371
|
+
title: (_datapointAnnotation$ = datapointAnnotation.Title) === null || _datapointAnnotation$ === void 0 ? void 0 : _datapointAnnotation$.toString(),
|
|
372
|
+
description: (_datapointAnnotation$2 = datapointAnnotation.Description) === null || _datapointAnnotation$2 === void 0 ? void 0 : _datapointAnnotation$2.toString()
|
|
373
|
+
},
|
|
374
|
+
selectionVariantFilterDefinitions: selectionVariantAnnotation ? getFilterDefinitionsFromSelectionVariant(selectionVariantAnnotation) : undefined,
|
|
375
|
+
chart: chartDef
|
|
376
|
+
}; // Navigation
|
|
377
|
+
|
|
378
|
+
if (!navigationInfo) {
|
|
379
|
+
// No navigationInfo was found in the KPI annotation --> try the outbound navigation from the manifest
|
|
380
|
+
if (kpiConfig.detailNavigation) {
|
|
381
|
+
navigationInfo = {
|
|
382
|
+
outboundNavigation: kpiConfig.detailNavigation
|
|
383
|
+
};
|
|
309
384
|
} else {
|
|
310
|
-
//
|
|
311
|
-
|
|
385
|
+
// No outbound navigation in the manifest --> try the semantic object on the Datapoint value
|
|
386
|
+
navigationInfo = getNavigationInfoFromProperty(datapointProperty);
|
|
312
387
|
}
|
|
388
|
+
}
|
|
313
389
|
|
|
314
|
-
|
|
390
|
+
if (navigationInfo) {
|
|
391
|
+
kpiDef.navigation = navigationInfo;
|
|
315
392
|
}
|
|
393
|
+
|
|
394
|
+
updateCurrency(datapointAnnotation, kpiDef);
|
|
395
|
+
updateCriticality(datapointAnnotation, aggregationHelper, kpiDef);
|
|
396
|
+
updateTrend(datapointAnnotation, aggregationHelper, kpiDef);
|
|
397
|
+
updateTarget(datapointAnnotation, aggregationHelper, kpiDef);
|
|
398
|
+
return kpiDef;
|
|
316
399
|
}
|
|
317
400
|
/**
|
|
318
401
|
* Creates the KPI definitions from the manifest and the annotations.
|
|
@@ -338,4 +421,4 @@ sap.ui.define(["../../helpers/ID", "sap/fe/core/templating/PropertyHelper", "sap
|
|
|
338
421
|
_exports.getKPIDefinitions = getKPIDefinitions;
|
|
339
422
|
return _exports;
|
|
340
423
|
}, false);
|
|
341
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIktQSS50cyJdLCJuYW1lcyI6WyJnZXREZXZpYXRpb25JbmRpY2F0b3JGcm9tVHJlbmRUeXBlIiwidHJlbmRFbnVtIiwiZGV2aWF0aW9uSW5kaWNhdG9yIiwiY29udmVydEtQSUNhcmRDb250ZW50IiwiZGF0YXBvaW50QW5ub3RhdGlvbiIsInByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwiY2hhcnQiLCJWaXN1YWxpemF0aW9ucyIsImZpbmQiLCJ2aXoiLCIkdGFyZ2V0IiwiJFR5cGUiLCJjaGFydEFubm90YXRpb24iLCJjaGFydFR5cGUiLCJDaGFydFR5cGUiLCJEaW1lbnNpb25zIiwiTWVhc3VyZXMiLCJ1bmRlZmluZWQiLCJkaW1lbnNpb25zIiwibWFwIiwicHJvcGVydHlQYXRoIiwidmFsdWUiLCJtZWFzdXJlcyIsImNhcmRDb250ZW50TWFuaWZlc3QiLCJsYWJlbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiTGFiZWwiLCJ0b1N0cmluZyIsImNyZWF0ZUtQSURlZmluaXRpb24iLCJrcGlOYW1lIiwia3BpQ29uZmlnIiwiY29udmVydGVyQ29udGV4dCIsImtwaUNvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yIiwiZW50aXR5U2V0IiwiYUtQSUFubm90YXRpb25zIiwiZ2V0QW5ub3RhdGlvbnNCeVRlcm0iLCJ0YXJnZXRLUEkiLCJrcGkiLCJxdWFsaWZpZXIiLCJhZ2dyZWdhdGlvbkhlbHBlciIsIkFnZ3JlZ2F0aW9uSGVscGVyIiwiZ2V0RW50aXR5VHlwZSIsIkRldGFpbCIsIkRlZmF1bHRQcmVzZW50YXRpb25WYXJpYW50IiwiaXNBbmFseXRpY3NTdXBwb3J0ZWQiLCJrcGlJRCIsIktQSUlEIiwiRGF0YVBvaW50IiwiZGF0YXBvaW50UHJvcGVydHkiLCJWYWx1ZSIsImlzUHJvcGVydHlBZ2dyZWdhdGFibGUiLCJnZXREaWFnbm9zdGljcyIsImFkZElzc3VlIiwiSXNzdWVDYXRlZ29yeSIsIkFubm90YXRpb24iLCJJc3N1ZVNldmVyaXR5IiwiTWVkaXVtIiwiSXNzdWVUeXBlIiwiS1BJX0lTU1VFUyIsIk1BSU5fUFJPUEVSVFlfTk9UX0FHR1JFR0FUQUJMRSIsImNhcmREZWYiLCJOT19DSEFSVF9WSVNVQUxJWkFUSU9OIiwia3BpRGVmIiwiaWQiLCJkYXRhcG9pbnQiLCJwYXRoIiwiYW5ub3RhdGlvblBhdGgiLCJnZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwidGl0bGUiLCJUaXRsZSIsImRlc2NyaXB0aW9uIiwiRGVzY3JpcHRpb24iLCJzZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnMiLCJTZWxlY3Rpb25WYXJpYW50IiwiZ2V0RmlsdGVyRGVmaW5pdGlvbnNGcm9tU2VsZWN0aW9uVmFyaWFudCIsImNhcmQiLCJ0YXJnZXRWYWx1ZVByb3BlcnR5IiwiSVNPQ3VycmVuY3kiLCJjdXJyZW5jeSIsImlzUGF0aEV4cHJlc3Npb24iLCJ1bml0IiwibmFtZSIsImlzQ3VycmVuY3kiLCJpc1BhdGgiLCJVbml0IiwiQ3JpdGljYWxpdHkiLCJjcml0aWNhbGl0eVByb3BlcnR5IiwiY3JpdGljYWxpdHlQYXRoIiwiY3JpdGljYWxpdHlWYWx1ZSIsIk1lc3NhZ2VUeXBlIiwiTm9uZSIsImdldE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5VHlwZSIsIkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24iLCJjcml0aWNhbGl0eUNhbGN1bGF0aW9uTW9kZSIsIkltcHJvdmVtZW50RGlyZWN0aW9uIiwiY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMiLCJwdXNoIiwiRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZSIsIlRvbGVyYW5jZVJhbmdlTG93VmFsdWUiLCJBY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZSIsIkFjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZSIsIlRvbGVyYW5jZVJhbmdlSGlnaFZhbHVlIiwiRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWUiLCJUcmVuZCIsInRyZW5kUHJvcGVydHkiLCJ0cmVuZFBhdGgiLCJ0cmVuZFZhbHVlIiwiVHJlbmRDYWxjdWxhdGlvbiIsInRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlIiwiSXNSZWxhdGl2ZURpZmZlcmVuY2UiLCJSZWZlcmVuY2VWYWx1ZSIsInJlZmVyZW5jZVByb3BlcnR5IiwidHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGgiLCJ0cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWUiLCJ0cmVuZENhbGN1bGF0aW9uVHJlc2hvbGRzIiwiU3Ryb25nRG93bkRpZmZlcmVuY2UiLCJ2YWx1ZU9mIiwiRG93bkRpZmZlcmVuY2UiLCJVcERpZmZlcmVuY2UiLCJTdHJvbmdVcERpZmZlcmVuY2UiLCJUYXJnZXRWYWx1ZSIsInRhcmdldFByb3BlcnR5IiwidGFyZ2V0UGF0aCIsInRhcmdldFZhbHVlIiwiS1BJX05PVF9GT1VORCIsIktQSV9ERVRBSUxfTk9UX0ZPVU5EIiwiTk9fQU5BTFlUSUNTIiwiZ2V0S1BJRGVmaW5pdGlvbnMiLCJrcGlDb25maWdzIiwiZ2V0TWFuaWZlc3RXcmFwcGVyIiwiZ2V0S1BJQ29uZmlndXJhdGlvbiIsImtwaURlZnMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsIm9EZWYiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQTBEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFTQSxrQ0FBVCxDQUE0Q0MsU0FBNUMsRUFBMEU7QUFDekUsUUFBSUMsa0JBQUo7O0FBQ0EsWUFBUUQsU0FBUjtBQUNDLFdBQUssdUJBQUw7QUFDQSxXQUFLLGlCQUFMO0FBQ0NDLFFBQUFBLGtCQUFrQixHQUFHLElBQXJCO0FBQ0E7O0FBQ0QsV0FBSyx5QkFBTDtBQUNBLFdBQUssbUJBQUw7QUFDQ0EsUUFBQUEsa0JBQWtCLEdBQUcsTUFBckI7QUFDQTs7QUFDRDtBQUNDQSxRQUFBQSxrQkFBa0IsR0FBRyxNQUFyQjtBQVZGOztBQVlBLFdBQU9BLGtCQUFQO0FBQ0E7O0FBRUQs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dXJhdGlvbiB9IGZyb20gXCIuLi8uLi9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQge1xuXHRBbm5vdGF0aW9uVGVybSxcblx0VUlBbm5vdGF0aW9uVGVybXMsXG5cdFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0Q3JpdGljYWxpdHlUeXBlLFxuXHRJbXByb3ZlbWVudERpcmVjdGlvblR5cGVcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgeyBLUElUeXBlLCBQcmVzZW50YXRpb25WYXJpYW50LCBDaGFydERlZmluaXRpb25UeXBlVHlwZXMsIERhdGFQb2ludCwgVHJlbmRUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL1VJXCI7XG5pbXBvcnQgeyBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvZGlzdC9FZG1cIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7IEtQSUlEIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvSURcIjtcbmltcG9ydCB7IGlzUGF0aEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvZm9ybWF0dGVycy9UYWJsZUZvcm1hdHRlclR5cGVzXCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGlvbkhlbHBlciB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL0FnZ3JlZ2F0aW9uXCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZVNldmVyaXR5LCBJc3N1ZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IHsgZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlIH0gZnJvbSBcIi4vQ3JpdGljYWxpdHlcIjtcbmltcG9ydCB7IGdldEZpbHRlckRlZmluaXRpb25zRnJvbVNlbGVjdGlvblZhcmlhbnQsIEZpbHRlckRlZmluaXRpb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL1NlbGVjdGlvblZhcmlhbnRIZWxwZXJcIjtcblxudHlwZSBLUElDYXJkRGVmaW5pdGlvbiA9IHtcblx0ZGltZW5zaW9uczogc3RyaW5nW107XG5cdG1lYXN1cmVzOiBzdHJpbmdbXTtcblx0Y2FyZENvbnRlbnRNYW5pZmVzdDoge1xuXHRcdGNoYXJ0VHlwZTogc3RyaW5nO1xuXHRcdGRpbWVuc2lvbnM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W107XG5cdFx0bWVhc3VyZXM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W107XG5cdH07XG59O1xuXG5leHBvcnQgdHlwZSBLUElEZWZpbml0aW9uID0ge1xuXHRpZDogc3RyaW5nO1xuXHRlbnRpdHlTZXQ6IHN0cmluZztcblx0ZGF0YXBvaW50OiB7XG5cdFx0YW5ub3RhdGlvblBhdGg6IHN0cmluZztcblx0XHRwcm9wZXJ0eVBhdGg6IHN0cmluZztcblx0XHR1bml0Pzoge1xuXHRcdFx0dmFsdWU6IHN0cmluZztcblx0XHRcdGlzUGF0aDogYm9vbGVhbjtcblx0XHRcdGlzQ3VycmVuY3k6IGJvb2xlYW47XG5cdFx0fTtcblx0XHRjcml0aWNhbGl0eVBhdGg/OiBzdHJpbmc7XG5cdFx0Y3JpdGljYWxpdHlWYWx1ZT86IE1lc3NhZ2VUeXBlO1xuXHRcdGNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlPzogSW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlO1xuXHRcdGNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzPzogKG51bWJlciB8IHVuZGVmaW5lZCB8IG51bGwpW107XG5cdFx0dGl0bGU/OiBzdHJpbmc7XG5cdFx0ZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cdFx0dHJlbmRQYXRoPzogc3RyaW5nO1xuXHRcdHRyZW5kVmFsdWU/OiBzdHJpbmc7XG5cdFx0dHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlPzogbnVtYmVyO1xuXHRcdHRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VQYXRoPzogc3RyaW5nO1xuXHRcdHRyZW5kQ2FsY3VsYXRpb25UcmVzaG9sZHM/OiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXTtcblx0XHR0cmVuZENhbGN1bGF0aW9uSXNSZWxhdGl2ZT86IGJvb2xlYW47XG5cdFx0dGFyZ2V0VmFsdWU/OiBudW1iZXI7XG5cdFx0dGFyZ2V0UGF0aD86IHN0cmluZztcblx0fTtcblx0Y2FyZDogS1BJQ2FyZERlZmluaXRpb247XG5cdHNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9ucz86IEZpbHRlckRlZmluaXRpb25bXTtcbn07XG5cbi8qKlxuICogR2V0cyBhIERldmlhdGlvbkluZGljYXRvciBlbnVtIHZhbHVlIGZyb20gYSBUcmVuZFR5cGUgZW51bSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1RyZW5kVHlwZX0gdHJlbmRFbnVtIFRoZSB0cmVuZCBlbnVtIHZhbHVlXG4gKiBAcmV0dXJucyB7RGV2aWF0aW9uSW5kaWNhdG9yfSBSZXR1cm5zIHRoZSBEZXZpYXRpb25JbmRpY2F0b3IgZW51bSB2YWx1ZVxuICovXG5mdW5jdGlvbiBnZXREZXZpYXRpb25JbmRpY2F0b3JGcm9tVHJlbmRUeXBlKHRyZW5kRW51bTogVHJlbmRUeXBlKTogc3RyaW5nIHtcblx0bGV0IGRldmlhdGlvbkluZGljYXRvcjogc3RyaW5nO1xuXHRzd2l0Y2ggKHRyZW5kRW51bSkge1xuXHRcdGNhc2UgXCJVSS5UcmVuZFR5cGUvU3Ryb25nVXBcIjpcblx0XHRjYXNlIFwiVUkuVHJlbmRUeXBlL1VwXCI6XG5cdFx0XHRkZXZpYXRpb25JbmRpY2F0b3IgPSBcIlVwXCI7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlIFwiVUkuVHJlbmRUeXBlL1N0cm9uZ0Rvd25cIjpcblx0XHRjYXNlIFwiVUkuVHJlbmRUeXBlL0Rvd25cIjpcblx0XHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiRG93blwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdGRldmlhdGlvbkluZGljYXRvciA9IFwiTm9uZVwiO1xuXHR9XG5cdHJldHVybiBkZXZpYXRpb25JbmRpY2F0b3I7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRLUElDYXJkQ29udGVudChcblx0ZGF0YXBvaW50QW5ub3RhdGlvbjogRGF0YVBvaW50LFxuXHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj86IFByZXNlbnRhdGlvblZhcmlhbnRcbik6IEtQSUNhcmREZWZpbml0aW9uIHwgdW5kZWZpbmVkIHtcblx0Ly8gRmluZCB0aGUgY2hhcnQgdmlzdWFsaXphdGlvblxuXHRjb25zdCBjaGFydCA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5WaXN1YWxpemF0aW9ucz8uZmluZCgodml6OiBhbnkpID0+IHtcblx0XHRyZXR1cm4gdml6LiR0YXJnZXQuJFR5cGUgPT09IFwiY29tLnNhcC52b2NhYnVsYXJpZXMuVUkudjEuQ2hhcnREZWZpbml0aW9uVHlwZVwiO1xuXHR9KTtcblxuXHRpZiAoY2hhcnQpIHtcblx0XHRjb25zdCBjaGFydEFubm90YXRpb24gPSBjaGFydC4kdGFyZ2V0IGFzIENoYXJ0RGVmaW5pdGlvblR5cGVUeXBlcztcblxuXHRcdGxldCBjaGFydFR5cGU6IHN0cmluZztcblx0XHRzd2l0Y2ggKGNoYXJ0QW5ub3RhdGlvbi5DaGFydFR5cGUpIHtcblx0XHRcdGNhc2UgXCJVSS5DaGFydFR5cGUvQ29sdW1uU3RhY2tlZFwiOlxuXHRcdFx0XHRjaGFydFR5cGUgPSBcIlN0YWNrZWRDb2x1bW5cIjtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJVSS5DaGFydFR5cGUvQmFyU3RhY2tlZFwiOlxuXHRcdFx0XHRjaGFydFR5cGUgPSBcIlN0YWNrZWRCYXJcIjtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJVSS5DaGFydFR5cGUvRG9udXRcIjpcblx0XHRcdFx0Y2hhcnRUeXBlID0gXCJEb251dFwiO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0Y2hhcnRUeXBlID0gXCJMaW5lXCI7XG5cdFx0fVxuXG5cdFx0aWYgKCFjaGFydEFubm90YXRpb24uRGltZW5zaW9ucyB8fCAhY2hhcnRBbm5vdGF0aW9uLk1lYXN1cmVzKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkaW1lbnNpb25zOiAoY2hhcnRBbm5vdGF0aW9uLkRpbWVuc2lvbnMgYXMgUHJvcGVydHlQYXRoW10pLm1hcChwcm9wZXJ0eVBhdGggPT4gcHJvcGVydHlQYXRoLnZhbHVlKSxcblx0XHRcdFx0bWVhc3VyZXM6IChjaGFydEFubm90YXRpb24uTWVhc3VyZXMgYXMgUHJvcGVydHlQYXRoW10pLm1hcChwcm9wZXJ0eVBhdGggPT4gcHJvcGVydHlQYXRoLnZhbHVlKSxcblx0XHRcdFx0Y2FyZENvbnRlbnRNYW5pZmVzdDoge1xuXHRcdFx0XHRcdGNoYXJ0VHlwZTogY2hhcnRUeXBlLFxuXHRcdFx0XHRcdGRpbWVuc2lvbnM6IChjaGFydEFubm90YXRpb24uRGltZW5zaW9ucyBhcyBQcm9wZXJ0eVBhdGhbXSkubWFwKHByb3BlcnR5UGF0aCA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRsYWJlbDogcHJvcGVydHlQYXRoLiR0YXJnZXQuYW5ub3RhdGlvbnMuQ29tbW9uPy5MYWJlbD8udG9TdHJpbmcoKSB8fCBwcm9wZXJ0eVBhdGgudmFsdWUsXG5cdFx0XHRcdFx0XHRcdHZhbHVlOiBcIntcIiArIHByb3BlcnR5UGF0aC52YWx1ZSArIFwifVwiXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdG1lYXN1cmVzOiAoY2hhcnRBbm5vdGF0aW9uLk1lYXN1cmVzIGFzIFByb3BlcnR5UGF0aFtdKS5tYXAocHJvcGVydHlQYXRoID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdGxhYmVsOiBwcm9wZXJ0eVBhdGguJHRhcmdldC5hbm5vdGF0aW9ucy5Db21tb24/LkxhYmVsPy50b1N0cmluZygpIHx8IHByb3BlcnR5UGF0aC52YWx1ZSxcblx0XHRcdFx0XHRcdFx0dmFsdWU6IFwie1wiICsgcHJvcGVydHlQYXRoLnZhbHVlICsgXCJ9XCJcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSlcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuXG5mdW5jdGlvbiBjcmVhdGVLUElEZWZpbml0aW9uKGtwaU5hbWU6IHN0cmluZywga3BpQ29uZmlnOiBLUElDb25maWd1cmF0aW9uLCBjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0KTogS1BJRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGtwaUNvbnZlcnRlckNvbnRleHQgPSBjb252ZXJ0ZXJDb250ZXh0LmdldENvbnZlcnRlckNvbnRleHRGb3IoXCIvXCIgKyBrcGlDb25maWcuZW50aXR5U2V0KTtcblx0Y29uc3QgYUtQSUFubm90YXRpb25zID0ga3BpQ29udmVydGVyQ29udGV4dC5nZXRBbm5vdGF0aW9uc0J5VGVybShcIlVJXCIsIFVJQW5ub3RhdGlvblRlcm1zLktQSSkgYXMgQW5ub3RhdGlvblRlcm08S1BJVHlwZT5bXTtcblx0Y29uc3QgdGFyZ2V0S1BJID0gYUtQSUFubm90YXRpb25zLmZpbmQoa3BpID0+IHtcblx0XHRyZXR1cm4ga3BpLnF1YWxpZmllciA9PT0ga3BpQ29uZmlnLnF1YWxpZmllcjtcblx0fSk7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGtwaUNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBrcGlDb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRpZiAodGFyZ2V0S1BJICYmIHRhcmdldEtQSS5EZXRhaWw/LkRlZmF1bHRQcmVzZW50YXRpb25WYXJpYW50ICYmIGFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkpIHtcblx0XHRjb25zdCBrcGlJRCA9IEtQSUlEKGtwaU5hbWUpO1xuXG5cdFx0Ly8gRGF0YXBvaW50XG5cdFx0Y29uc3QgZGF0YXBvaW50QW5ub3RhdGlvbiA9IHRhcmdldEtQSS5EYXRhUG9pbnQ7XG5cdFx0Y29uc3QgZGF0YXBvaW50UHJvcGVydHkgPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlZhbHVlLiR0YXJnZXQgYXMgUHJvcGVydHk7XG5cdFx0aWYgKCFhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5QWdncmVnYXRhYmxlKGRhdGFwb2ludFByb3BlcnR5KSkge1xuXHRcdFx0Ly8gVGhlIG1haW4gcHJvcGVydHkgb2YgdGhlIEtQSSBpcyBub3QgYWdncmVnYXRhYmxlIC0tPiBXZSBjYW4ndCBjYWxjdWxhdGUgaXRzIHZhbHVlIHNvIHdlIGlnbm9yZSB0aGUgS1BJXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHRcdC5hZGRJc3N1ZShcblx0XHRcdFx0XHRJc3N1ZUNhdGVnb3J5LkFubm90YXRpb24sXG5cdFx0XHRcdFx0SXNzdWVTZXZlcml0eS5NZWRpdW0sXG5cdFx0XHRcdFx0SXNzdWVUeXBlLktQSV9JU1NVRVMuTUFJTl9QUk9QRVJUWV9OT1RfQUdHUkVHQVRBQkxFICsga3BpQ29uZmlnLnF1YWxpZmllclxuXHRcdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBDaGFydFxuXHRcdGNvbnN0IGNhcmREZWYgPSBjb252ZXJ0S1BJQ2FyZENvbnRlbnQoZGF0YXBvaW50QW5ub3RhdGlvbiwgdGFyZ2V0S1BJLkRldGFpbC5EZWZhdWx0UHJlc2VudGF0aW9uVmFyaWFudCk7XG5cdFx0aWYgKCFjYXJkRGVmKSB7XG5cdFx0XHQvLyBDYW4ndCBmaW5kIGluZm8gZm9yIHRoZSBjaGFydFxuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHQuYWRkSXNzdWUoXG5cdFx0XHRcdFx0SXNzdWVDYXRlZ29yeS5Bbm5vdGF0aW9uLFxuXHRcdFx0XHRcdElzc3VlU2V2ZXJpdHkuTWVkaXVtLFxuXHRcdFx0XHRcdElzc3VlVHlwZS5LUElfSVNTVUVTLk5PX0NIQVJUX1ZJU1VBTElaQVRJT04gKyBrcGlDb25maWcucXVhbGlmaWVyXG5cdFx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtwaURlZjogS1BJRGVmaW5pdGlvbiA9IHtcblx0XHRcdGlkOiBrcGlJRCxcblx0XHRcdGVudGl0eVNldDoga3BpQ29uZmlnLmVudGl0eVNldCxcblx0XHRcdGRhdGFwb2ludDoge1xuXHRcdFx0XHRwcm9wZXJ0eVBhdGg6IGRhdGFwb2ludEFubm90YXRpb24uVmFsdWUucGF0aCxcblx0XHRcdFx0YW5ub3RhdGlvblBhdGg6IGtwaUNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChkYXRhcG9pbnRBbm5vdGF0aW9uLmZ1bGx5UXVhbGlmaWVkTmFtZSksXG5cdFx0XHRcdHRpdGxlOiBkYXRhcG9pbnRBbm5vdGF0aW9uLlRpdGxlPy50b1N0cmluZygpLFxuXHRcdFx0XHRkZXNjcmlwdGlvbjogZGF0YXBvaW50QW5ub3RhdGlvbi5EZXNjcmlwdGlvbj8udG9TdHJpbmcoKVxuXHRcdFx0fSxcblx0XHRcdHNlbGVjdGlvblZhcmlhbnRGaWx0ZXJEZWZpbml0aW9uczogdGFyZ2V0S1BJLlNlbGVjdGlvblZhcmlhbnRcblx0XHRcdFx0PyBnZXRGaWx0ZXJEZWZpbml0aW9uc0Zyb21TZWxlY3Rpb25WYXJpYW50KHRhcmdldEtQSS5TZWxlY3Rpb25WYXJpYW50KVxuXHRcdFx0XHQ6IHVuZGVmaW5lZCxcblx0XHRcdGNhcmQ6IGNhcmREZWZcblx0XHR9O1xuXG5cdFx0Ly8gVW5pdCBvciBjdXJyZW5jeVxuXHRcdGNvbnN0IHRhcmdldFZhbHVlUHJvcGVydHkgPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlZhbHVlLiR0YXJnZXQgYXMgUHJvcGVydHk7XG5cdFx0aWYgKHRhcmdldFZhbHVlUHJvcGVydHkuYW5ub3RhdGlvbnMuTWVhc3VyZXM/LklTT0N1cnJlbmN5KSB7XG5cdFx0XHRjb25zdCBjdXJyZW5jeSA9IHRhcmdldFZhbHVlUHJvcGVydHkuYW5ub3RhdGlvbnMuTWVhc3VyZXM/LklTT0N1cnJlbmN5O1xuXHRcdFx0aWYgKGlzUGF0aEV4cHJlc3Npb24oY3VycmVuY3kpKSB7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudW5pdCA9IHtcblx0XHRcdFx0XHR2YWx1ZTogKChjdXJyZW5jeS4kdGFyZ2V0IGFzIHVua25vd24pIGFzIFByb3BlcnR5KS5uYW1lLFxuXHRcdFx0XHRcdGlzQ3VycmVuY3k6IHRydWUsXG5cdFx0XHRcdFx0aXNQYXRoOiB0cnVlXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LnVuaXQgPSB7XG5cdFx0XHRcdFx0dmFsdWU6IGN1cnJlbmN5LnRvU3RyaW5nKCksXG5cdFx0XHRcdFx0aXNDdXJyZW5jeTogdHJ1ZSxcblx0XHRcdFx0XHRpc1BhdGg6IGZhbHNlXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0YXJnZXRWYWx1ZVByb3BlcnR5LmFubm90YXRpb25zLk1lYXN1cmVzPy5Vbml0KSB7XG5cdFx0XHRjb25zdCB1bml0ID0gdGFyZ2V0VmFsdWVQcm9wZXJ0eS5hbm5vdGF0aW9ucy5NZWFzdXJlcz8uVW5pdDtcblx0XHRcdGlmIChpc1BhdGhFeHByZXNzaW9uKHVuaXQpKSB7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudW5pdCA9IHtcblx0XHRcdFx0XHR2YWx1ZTogKCh1bml0LiR0YXJnZXQgYXMgdW5rbm93bikgYXMgUHJvcGVydHkpLm5hbWUsXG5cdFx0XHRcdFx0aXNDdXJyZW5jeTogZmFsc2UsXG5cdFx0XHRcdFx0aXNQYXRoOiB0cnVlXG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LnVuaXQgPSB7XG5cdFx0XHRcdFx0dmFsdWU6IHVuaXQudG9TdHJpbmcoKSxcblx0XHRcdFx0XHRpc0N1cnJlbmN5OiBmYWxzZSxcblx0XHRcdFx0XHRpc1BhdGg6IGZhbHNlXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ3JpdGljYWxpdHlcblx0XHRpZiAoZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eSkge1xuXHRcdFx0aWYgKHR5cGVvZiBkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdC8vIENyaXRpY2FsaXR5IGlzIGEgcGF0aCAtLT4gY2hlY2sgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgYWdncmVnYXRhYmxlXG5cdFx0XHRcdGNvbnN0IGNyaXRpY2FsaXR5UHJvcGVydHkgPSAoZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eSBhcyBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248Q3JpdGljYWxpdHlUeXBlPilcblx0XHRcdFx0XHQuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0XHRcdFx0aWYgKGFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlBZ2dyZWdhdGFibGUoY3JpdGljYWxpdHlQcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5UGF0aCA9IChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5IGFzIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxDcml0aWNhbGl0eVR5cGU+KS5wYXRoO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIFRoZSBwcm9wZXJ0eSBpc24ndCBhZ2dyZWdhdGFibGUgLS0+IHdlIGlnbm9yZSBpdFxuXHRcdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlWYWx1ZSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIENyaXRpY2FsaXR5IGlzIGFuIGVudW0gVmFsdWUgLS0+IGdldCB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdmFsdWVcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eVZhbHVlID0gZ2V0TWVzc2FnZVR5cGVGcm9tQ3JpdGljYWxpdHlUeXBlKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHkpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uKSB7XG5cdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlID0gZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLkltcHJvdmVtZW50RGlyZWN0aW9uO1xuXHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcyA9IFtdO1xuXHRcdFx0c3dpdGNoIChrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25Nb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvVGFyZ2V0XCI6XG5cdFx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKFxuXHRcdFx0XHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLkRldmlhdGlvblJhbmdlTG93VmFsdWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChcblx0XHRcdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5Ub2xlcmFuY2VSYW5nZUxvd1ZhbHVlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzLnB1c2goXG5cdFx0XHRcdFx0XHRkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uQWNjZXB0YW5jZVJhbmdlTG93VmFsdWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChcblx0XHRcdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5BY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChcblx0XHRcdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5Ub2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKFxuXHRcdFx0XHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLkRldmlhdGlvblJhbmdlSGlnaFZhbHVlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiVUkuSW1wcm92ZW1lbnREaXJlY3Rpb25UeXBlL01pbmltaXplXCI6XG5cdFx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKFxuXHRcdFx0XHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLkFjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKFxuXHRcdFx0XHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLlRvbGVyYW5jZVJhbmdlSGlnaFZhbHVlXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzLnB1c2goXG5cdFx0XHRcdFx0XHRkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvTWF4aW1pemVcIjpcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzLnB1c2goXG5cdFx0XHRcdFx0XHRkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKFxuXHRcdFx0XHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLlRvbGVyYW5jZVJhbmdlTG93VmFsdWVcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChcblx0XHRcdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5BY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlWYWx1ZSA9IE1lc3NhZ2VUeXBlLk5vbmU7XG5cdFx0fVxuXG5cdFx0Ly8gVHJlbmRcblx0XHRpZiAoZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRcdC8vIFRyZW5kIGlzIGEgcGF0aCAtLT4gY2hlY2sgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgYWdncmVnYXRhYmxlXG5cdFx0XHRcdGNvbnN0IHRyZW5kUHJvcGVydHkgPSAoZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZCBhcyBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248VHJlbmRUeXBlPikuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0XHRcdFx0aWYgKGFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlBZ2dyZWdhdGFibGUodHJlbmRQcm9wZXJ0eSkpIHtcblx0XHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LnRyZW5kUGF0aCA9IChkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kIGFzIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxUcmVuZFR5cGU+KS5wYXRoO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIFRoZSBwcm9wZXJ0eSBpc24ndCBhZ2dyZWdhdGFibGUgLS0+IHdlIGlnbm9yZSBpdFxuXHRcdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRWYWx1ZSA9IFwiTm9uZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBUcmVuZCBpcyBhbiBlbnVtIFZhbHVlIC0tPiBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHZhbHVlXG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRWYWx1ZSA9IGdldERldmlhdGlvbkluZGljYXRvckZyb21UcmVuZFR5cGUoZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24pIHtcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvbklzUmVsYXRpdmUgPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uSXNSZWxhdGl2ZURpZmZlcmVuY2UgPyB0cnVlIDogZmFsc2U7XG5cdFx0XHRpZiAoZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZENhbGN1bGF0aW9uLlJlZmVyZW5jZVZhbHVlLiR0YXJnZXQpIHtcblx0XHRcdFx0Ly8gUmVmZXJlbmNlIHZhbHVlIGlzIGEgcGF0aCAtLT4gY2hlY2sgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgYWdncmVnYXRhYmxlXG5cdFx0XHRcdGNvbnN0IHJlZmVyZW5jZVByb3BlcnR5ID0gZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZENhbGN1bGF0aW9uLlJlZmVyZW5jZVZhbHVlLiR0YXJnZXQgYXMgUHJvcGVydHk7XG5cdFx0XHRcdGlmIChhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5QWdncmVnYXRhYmxlKHJlZmVyZW5jZVByb3BlcnR5KSkge1xuXHRcdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGggPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uUmVmZXJlbmNlVmFsdWUucGF0aDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBUaGUgcHJvcGVydHkgaXNuJ3QgYWdncmVnYXRhYmxlIC0tPiB3ZSBpZ25vcmUgaXQgYW5kIHN3aXRjaCBiYWNrIHRvIHRyZW5kICdOb25lJ1xuXHRcdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRWYWx1ZSA9IFwiTm9uZVwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBSZWZlcmVuY2UgdmFsdWUgaXMgYSBzdGF0aWMgdmFsdWVcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWUgPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uUmVmZXJlbmNlVmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGggIT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25SZWZlcmVuY2VWYWx1ZSAhPT0gdW5kZWZpbmVkXG5cdFx0XHQpIHtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uVHJlc2hvbGRzID0gW1xuXHRcdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5TdHJvbmdEb3duRGlmZmVyZW5jZS52YWx1ZU9mKCkgYXMgbnVtYmVyLFxuXHRcdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5Eb3duRGlmZmVyZW5jZS52YWx1ZU9mKCkgYXMgbnVtYmVyLFxuXHRcdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5VcERpZmZlcmVuY2UudmFsdWVPZigpIGFzIG51bWJlcixcblx0XHRcdFx0XHRkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uU3Ryb25nVXBEaWZmZXJlbmNlLnZhbHVlT2YoKSBhcyBudW1iZXJcblx0XHRcdFx0XTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0a3BpRGVmLmRhdGFwb2ludC50cmVuZFZhbHVlID0gXCJOb25lXCI7XG5cdFx0fVxuXG5cdFx0Ly8gVGFyZ2V0IHZhbHVlXG5cdFx0aWYgKGRhdGFwb2ludEFubm90YXRpb24uVGFyZ2V0VmFsdWUpIHtcblx0XHRcdGlmIChkYXRhcG9pbnRBbm5vdGF0aW9uLlRhcmdldFZhbHVlLiR0YXJnZXQpIHtcblx0XHRcdFx0Ly8gVGFyZ2V0IHZhbHVlIGlzIGEgcGF0aCAtLT4gY2hlY2sgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgYWdncmVnYXRhYmxlIChvdGhlcndpc2UgaWdub3JlKVxuXHRcdFx0XHRjb25zdCB0YXJnZXRQcm9wZXJ0eSA9IGRhdGFwb2ludEFubm90YXRpb24uVGFyZ2V0VmFsdWUuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0XHRcdFx0aWYgKGFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlBZ2dyZWdhdGFibGUodGFyZ2V0UHJvcGVydHkpKSB7XG5cdFx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC50YXJnZXRQYXRoID0gZGF0YXBvaW50QW5ub3RhdGlvbi5UYXJnZXRWYWx1ZS5wYXRoO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBUYXJnZXQgdmFsdWUgaXMgYSBzdGF0aWMgdmFsdWVcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC50YXJnZXRWYWx1ZSA9IGRhdGFwb2ludEFubm90YXRpb24uVGFyZ2V0VmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGtwaURlZjtcblx0fSBlbHNlIHtcblx0XHRpZiAoIXRhcmdldEtQSSkge1xuXHRcdFx0Ly8gQ291bGRuJ3QgZmluZCBhIEtQSSB3aXRoIHRoZSBxdWFsaWZpZXIgc3BlY2lmaWVkIGluIHRoZSBtYW5pZmVzdFxuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHQuYWRkSXNzdWUoSXNzdWVDYXRlZ29yeS5Bbm5vdGF0aW9uLCBJc3N1ZVNldmVyaXR5Lk1lZGl1bSwgSXNzdWVUeXBlLktQSV9JU1NVRVMuS1BJX05PVF9GT1VORCArIGtwaUNvbmZpZy5xdWFsaWZpZXIpO1xuXHRcdH0gZWxzZSBpZiAoIXRhcmdldEtQSS5EZXRhaWw/LkRlZmF1bHRQcmVzZW50YXRpb25WYXJpYW50KSB7XG5cdFx0XHQvLyBObyBLUEkgZGV0YWlsL2RlZmF1bHQgcHJlc2VudGF0aW9uIHZhcmlhbnRcblx0XHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdFx0LmdldERpYWdub3N0aWNzKClcblx0XHRcdFx0LmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuQW5ub3RhdGlvbiwgSXNzdWVTZXZlcml0eS5NZWRpdW0sIElzc3VlVHlwZS5LUElfSVNTVUVTLktQSV9ERVRBSUxfTk9UX0ZPVU5EICsga3BpQ29uZmlnLnF1YWxpZmllcik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIEVudGl0eSBkb2Vzbid0IHN1cHBvcnQgYW5hbHl0aWNzXG5cdFx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHRcdC5hZGRJc3N1ZShJc3N1ZUNhdGVnb3J5LkFubm90YXRpb24sIElzc3VlU2V2ZXJpdHkuTWVkaXVtLCBJc3N1ZVR5cGUuS1BJX0lTU1VFUy5OT19BTkFMWVRJQ1MgKyBrcGlDb25maWcuZW50aXR5U2V0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIEtQSSBkZWZpbml0aW9ucyBmcm9tIHRoZSBtYW5pZmVzdCBhbmQgdGhlIGFubm90YXRpb25zLlxuICpcbiAqIEBwYXJhbSB7Q29udmVydGVyQ29udGV4dH0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQgZm9yIHRoZSBwYWdlXG4gKiBAcmV0dXJucyB7S1BJRGVmaW5pdGlvbltdfSBSZXR1cm5zIGFuIGFycmF5IG9mIEtQSSBkZWZpbml0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0S1BJRGVmaW5pdGlvbnMoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IEtQSURlZmluaXRpb25bXSB7XG5cdGNvbnN0IGtwaUNvbmZpZ3MgPSBjb252ZXJ0ZXJDb250ZXh0LmdldE1hbmlmZXN0V3JhcHBlcigpLmdldEtQSUNvbmZpZ3VyYXRpb24oKSxcblx0XHRrcGlEZWZzOiBLUElEZWZpbml0aW9uW10gPSBbXTtcblxuXHRPYmplY3Qua2V5cyhrcGlDb25maWdzKS5mb3JFYWNoKGtwaU5hbWUgPT4ge1xuXHRcdGNvbnN0IG9EZWYgPSBjcmVhdGVLUElEZWZpbml0aW9uKGtwaU5hbWUsIGtwaUNvbmZpZ3Nba3BpTmFtZV0sIGNvbnZlcnRlckNvbnRleHQpO1xuXHRcdGlmIChvRGVmKSB7XG5cdFx0XHRrcGlEZWZzLnB1c2gob0RlZik7XG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4ga3BpRGVmcztcbn1cbiJdfQ==
|
|
424
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIktQSS50cyJdLCJuYW1lcyI6WyJEZXZpYXRpb25JbmRpY2F0b3JGcm9tVHJlbmRUeXBlIiwiS1BJQ2hhcnRUeXBlRnJvbVVJIiwiY29udmVydEtQSUNoYXJ0IiwiY2hhcnRBbm5vdGF0aW9uIiwicHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24iLCJNZWFzdXJlcyIsInVuZGVmaW5lZCIsImNoYXJEaW1lbnNpb25zIiwiRGltZW5zaW9ucyIsIm1hcCIsInByb3BlcnR5UGF0aCIsImRpbUF0dHJpYnV0ZSIsIkRpbWVuc2lvbkF0dHJpYnV0ZXMiLCJmaW5kIiwiYXR0cmlidXRlIiwiRGltZW5zaW9uIiwidmFsdWUiLCJuYW1lIiwibGFiZWwiLCIkdGFyZ2V0IiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJMYWJlbCIsInRvU3RyaW5nIiwicm9sZSIsIlJvbGUiLCJyZXBsYWNlIiwiY2hhcnRNZWFzdXJlcyIsIm1lYXN1cmVBdHRyaWJ1dGUiLCJNZWFzdXJlQXR0cmlidXRlcyIsIk1lYXN1cmUiLCJjaGFydFR5cGUiLCJDaGFydFR5cGUiLCJkaW1lbnNpb25zIiwibWVhc3VyZXMiLCJzb3J0T3JkZXIiLCJTb3J0T3JkZXIiLCJQcm9wZXJ0eSIsImRlc2NlbmRpbmciLCJEZXNjZW5kaW5nIiwibWF4SXRlbXMiLCJNYXhJdGVtcyIsInZhbHVlT2YiLCJ1cGRhdGVDdXJyZW5jeSIsImRhdGFwb2ludEFubm90YXRpb24iLCJrcGlEZWYiLCJ0YXJnZXRWYWx1ZVByb3BlcnR5IiwiVmFsdWUiLCJJU09DdXJyZW5jeSIsImN1cnJlbmN5IiwiaXNQYXRoRXhwcmVzc2lvbiIsImRhdGFwb2ludCIsInVuaXQiLCJpc0N1cnJlbmN5IiwiaXNQYXRoIiwiVW5pdCIsInVwZGF0ZUNyaXRpY2FsaXR5IiwiYWdncmVnYXRpb25IZWxwZXIiLCJDcml0aWNhbGl0eSIsImNyaXRpY2FsaXR5UHJvcGVydHkiLCJpc1Byb3BlcnR5QWdncmVnYXRhYmxlIiwiY3JpdGljYWxpdHlQYXRoIiwicGF0aCIsImNyaXRpY2FsaXR5VmFsdWUiLCJNZXNzYWdlVHlwZSIsIk5vbmUiLCJnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUiLCJDcml0aWNhbGl0eUNhbGN1bGF0aW9uIiwiY3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGUiLCJJbXByb3ZlbWVudERpcmVjdGlvbiIsImNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzIiwicHVzaCIsIkRldmlhdGlvblJhbmdlTG93VmFsdWUiLCJUb2xlcmFuY2VSYW5nZUxvd1ZhbHVlIiwiQWNjZXB0YW5jZVJhbmdlTG93VmFsdWUiLCJBY2NlcHRhbmNlUmFuZ2VIaWdoVmFsdWUiLCJUb2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZSIsIkRldmlhdGlvblJhbmdlSGlnaFZhbHVlIiwidXBkYXRlVHJlbmQiLCJUcmVuZCIsInRyZW5kUHJvcGVydHkiLCJ0cmVuZFBhdGgiLCJ0cmVuZFZhbHVlIiwiVHJlbmRDYWxjdWxhdGlvbiIsInRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlIiwiSXNSZWxhdGl2ZURpZmZlcmVuY2UiLCJSZWZlcmVuY2VWYWx1ZSIsInJlZmVyZW5jZVByb3BlcnR5IiwidHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGgiLCJ0cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWUiLCJ0cmVuZENhbGN1bGF0aW9uVHJlc2hvbGRzIiwiU3Ryb25nRG93bkRpZmZlcmVuY2UiLCJEb3duRGlmZmVyZW5jZSIsIlVwRGlmZmVyZW5jZSIsIlN0cm9uZ1VwRGlmZmVyZW5jZSIsInVwZGF0ZVRhcmdldCIsIlRhcmdldFZhbHVlIiwidGFyZ2V0UHJvcGVydHkiLCJ0YXJnZXRQYXRoIiwidGFyZ2V0VmFsdWUiLCJnZXROYXZpZ2F0aW9uSW5mb0Zyb21Qcm9wZXJ0eSIsInByb3BlcnR5Iiwic2VtYW50aWNPYmplY3RBbm5vdGF0aW9uIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJhbm5vdGF0aW9uS2V5IiwiYW5ub3RhdGlvbiIsInRlcm0iLCJxdWFsaWZpZXIiLCJyZXN1bHQiLCJzZW1hbnRpY09iamVjdCIsInVuYXZhaWxhYmxlQWN0aW9ucyIsImtleSIsImNyZWF0ZUtQSURlZmluaXRpb24iLCJrcGlOYW1lIiwia3BpQ29uZmlnIiwiY29udmVydGVyQ29udGV4dCIsImtwaUNvbnZlcnRlckNvbnRleHQiLCJnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yIiwiZW50aXR5U2V0IiwiQWdncmVnYXRpb25IZWxwZXIiLCJnZXRFbnRpdHlUeXBlIiwiaXNBbmFseXRpY3NTdXBwb3J0ZWQiLCJnZXREaWFnbm9zdGljcyIsImFkZElzc3VlIiwiSXNzdWVDYXRlZ29yeSIsIkFubm90YXRpb24iLCJJc3N1ZVNldmVyaXR5IiwiTWVkaXVtIiwiSXNzdWVUeXBlIiwiS1BJX0lTU1VFUyIsIk5PX0FOQUxZVElDUyIsInNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uIiwibmF2aWdhdGlvbkluZm8iLCJhS1BJQW5ub3RhdGlvbnMiLCJnZXRBbm5vdGF0aW9uc0J5VGVybSIsInRhcmdldEtQSSIsImtwaSIsIkRhdGFQb2ludCIsIlNlbGVjdGlvblZhcmlhbnQiLCJEZXRhaWwiLCJEZWZhdWx0UHJlc2VudGF0aW9uVmFyaWFudCIsIlZpc3VhbGl6YXRpb25zIiwidml6IiwiJFR5cGUiLCJTZW1hbnRpY09iamVjdCIsImFjdGlvbiIsIkFjdGlvbiIsImFTUFZBbm5vdGF0aW9ucyIsInRhcmdldFNQViIsInNwdiIsIlByZXNlbnRhdGlvblZhcmlhbnQiLCJLUElfTk9UX0ZPVU5EIiwiS1BJX0RFVEFJTF9OT1RfRk9VTkQiLCJkYXRhcG9pbnRQcm9wZXJ0eSIsIk1BSU5fUFJPUEVSVFlfTk9UX0FHR1JFR0FUQUJMRSIsImNoYXJ0RGVmIiwiaWQiLCJLUElJRCIsImFubm90YXRpb25QYXRoIiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsInRpdGxlIiwiVGl0bGUiLCJkZXNjcmlwdGlvbiIsIkRlc2NyaXB0aW9uIiwic2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zIiwiZ2V0RmlsdGVyRGVmaW5pdGlvbnNGcm9tU2VsZWN0aW9uVmFyaWFudCIsImNoYXJ0IiwiZGV0YWlsTmF2aWdhdGlvbiIsIm91dGJvdW5kTmF2aWdhdGlvbiIsIm5hdmlnYXRpb24iLCJnZXRLUElEZWZpbml0aW9ucyIsImtwaUNvbmZpZ3MiLCJnZXRNYW5pZmVzdFdyYXBwZXIiLCJnZXRLUElDb25maWd1cmF0aW9uIiwia3BpRGVmcyIsIm9EZWYiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQTBFQSxNQUFNQSwrQkFBdUQsR0FBRztBQUMvRCw2QkFBeUIsSUFEc0M7QUFFL0QsdUJBQW1CLElBRjRDO0FBRy9ELCtCQUEyQixNQUhvQztBQUkvRCx5QkFBcUIsTUFKMEM7QUFLL0QsNkJBQXlCO0FBTHNDLEdBQWhFO0FBUUEsTUFBTUMsa0JBQTBDLEdBQUc7QUFDbEQsa0NBQThCLGVBRG9CO0FBRWxELCtCQUEyQixZQUZ1QjtBQUdsRCwwQkFBc0IsT0FINEI7QUFJbEQseUJBQXFCLE1BSjZCO0FBS2xELDJCQUF1QixRQUwyQjtBQU1sRCwyQkFBdUIsUUFOMkI7QUFPbEQsd0JBQW9CLEtBUDhCO0FBUWxELG1DQUErQixpQkFSbUI7QUFTbEQsZ0NBQTRCLGFBVHNCO0FBVWxELDRCQUF3QjtBQVYwQixHQUFuRDs7QUFhQSxXQUFTQyxlQUFULENBQXlCQyxlQUF6QixFQUFpREMsNkJBQWpELEVBQXFJO0FBQUE7O0FBQ3BJLFFBQUlELGVBQWUsQ0FBQ0UsUUFBaEIsS0FBNkJDLFNBQWpDLEVBQTRDO0FBQzNDO0FBQ0EsYUFBT0EsU0FBUDtBQUNBOztBQUVELFFBQU1DLGNBQWMsR0FBR0osZUFBZSxDQUFDSyxVQUFoQixHQUNuQkwsZUFBZSxDQUFDSyxVQUFqQixDQUErQ0MsR0FBL0MsQ0FBbUQsVUFBQUMsWUFBWSxFQUFJO0FBQUE7O0FBQ25FLFVBQU1DLFlBQVksNEJBQUdSLGVBQWUsQ0FBQ1MsbUJBQW5C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O0FBQ0E7QUFDRCxLQUxEO0FBT0EsV0FBT0QsT0FBUDtBQUNBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBLUElDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4uLy4uL01hbmlmZXN0U2V0dGluZ3NcIjtcbmltcG9ydCB7IFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXJcIjtcbmltcG9ydCB7XG5cdEFubm90YXRpb25UZXJtLFxuXHRVSUFubm90YXRpb25UZXJtcyxcblx0VUlBbm5vdGF0aW9uVHlwZXMsXG5cdFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbixcblx0Q3JpdGljYWxpdHlUeXBlLFxuXHRJbXByb3ZlbWVudERpcmVjdGlvblR5cGVcbn0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQge1xuXHRLUElUeXBlLFxuXHRTZWxlY3Rpb25QcmVzZW50YXRpb25WYXJpYW50VHlwZSxcblx0UHJlc2VudGF0aW9uVmFyaWFudCxcblx0U2VsZWN0aW9uVmFyaWFudCxcblx0RGF0YVBvaW50LFxuXHRDaGFydCxcblx0VHJlbmRUeXBlXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9kaXN0L2dlbmVyYXRlZC9VSVwiO1xuaW1wb3J0IHsgUHJvcGVydHlQYXRoIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvRWRtXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBLUElJRCB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL0lEXCI7XG5pbXBvcnQgeyBpc1BhdGhFeHByZXNzaW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCB7IE1lc3NhZ2VUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2Zvcm1hdHRlcnMvVGFibGVGb3JtYXR0ZXJUeXBlc1wiO1xuaW1wb3J0IHsgQWdncmVnYXRpb25IZWxwZXIgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9BZ2dyZWdhdGlvblwiO1xuaW1wb3J0IHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVTZXZlcml0eSwgSXNzdWVUeXBlIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB7IGdldE1lc3NhZ2VUeXBlRnJvbUNyaXRpY2FsaXR5VHlwZSB9IGZyb20gXCIuL0NyaXRpY2FsaXR5XCI7XG5pbXBvcnQgeyBnZXRGaWx0ZXJEZWZpbml0aW9uc0Zyb21TZWxlY3Rpb25WYXJpYW50LCBGaWx0ZXJEZWZpbml0aW9uIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9TZWxlY3Rpb25WYXJpYW50SGVscGVyXCI7XG5pbXBvcnQgeyBDb21tb25Bbm5vdGF0aW9uVGVybXMsIFNlbWFudGljT2JqZWN0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL2Rpc3QvZ2VuZXJhdGVkL0NvbW1vblwiO1xuXG5leHBvcnQgdHlwZSBOYXZpZ2F0aW9uSW5mbyA9IHtcblx0c2VtYW50aWNPYmplY3Q/OiBzdHJpbmc7XG5cdGFjdGlvbj86IHN0cmluZztcblx0dW5hdmFpbGFibGVBY3Rpb25zPzogc3RyaW5nW107XG5cdG91dGJvdW5kTmF2aWdhdGlvbj86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEtQSUNoYXJ0RGVmaW5pdGlvbiA9IHtcblx0Y2hhcnRUeXBlOiBzdHJpbmc7XG5cdGRpbWVuc2lvbnM6IHsgbmFtZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyByb2xlPzogc3RyaW5nIH1bXTtcblx0bWVhc3VyZXM6IHsgbmFtZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyByb2xlPzogc3RyaW5nIH1bXTtcblx0c29ydE9yZGVyPzogeyBuYW1lOiBzdHJpbmc7IGRlc2NlbmRpbmc6IGJvb2xlYW4gfVtdO1xuXHRtYXhJdGVtcz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEtQSURlZmluaXRpb24gPSB7XG5cdGlkOiBzdHJpbmc7XG5cdGVudGl0eVNldDogc3RyaW5nO1xuXHRkYXRhcG9pbnQ6IHtcblx0XHRhbm5vdGF0aW9uUGF0aDogc3RyaW5nO1xuXHRcdHByb3BlcnR5UGF0aDogc3RyaW5nO1xuXHRcdHVuaXQ/OiB7XG5cdFx0XHR2YWx1ZTogc3RyaW5nO1xuXHRcdFx0aXNQYXRoOiBib29sZWFuO1xuXHRcdFx0aXNDdXJyZW5jeTogYm9vbGVhbjtcblx0XHR9O1xuXHRcdGNyaXRpY2FsaXR5UGF0aD86IHN0cmluZztcblx0XHRjcml0aWNhbGl0eVZhbHVlPzogTWVzc2FnZVR5cGU7XG5cdFx0Y3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGU/OiBJbXByb3ZlbWVudERpcmVjdGlvblR5cGU7XG5cdFx0Y3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHM/OiAobnVtYmVyIHwgdW5kZWZpbmVkIHwgbnVsbClbXTtcblx0XHR0aXRsZT86IHN0cmluZztcblx0XHRkZXNjcmlwdGlvbj86IHN0cmluZztcblx0XHR0cmVuZFBhdGg/OiBzdHJpbmc7XG5cdFx0dHJlbmRWYWx1ZT86IHN0cmluZztcblx0XHR0cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlVmFsdWU/OiBudW1iZXI7XG5cdFx0dHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGg/OiBzdHJpbmc7XG5cdFx0dHJlbmRDYWxjdWxhdGlvblRyZXNob2xkcz86IChudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsKVtdO1xuXHRcdHRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlPzogYm9vbGVhbjtcblx0XHR0YXJnZXRWYWx1ZT86IG51bWJlcjtcblx0XHR0YXJnZXRQYXRoPzogc3RyaW5nO1xuXHR9O1xuXHRjaGFydDogS1BJQ2hhcnREZWZpbml0aW9uO1xuXHRzZWxlY3Rpb25WYXJpYW50RmlsdGVyRGVmaW5pdGlvbnM/OiBGaWx0ZXJEZWZpbml0aW9uW107XG5cdG5hdmlnYXRpb24/OiBOYXZpZ2F0aW9uSW5mbztcbn07XG5cbmNvbnN0IERldmlhdGlvbkluZGljYXRvckZyb21UcmVuZFR5cGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG5cdFwiVUkuVHJlbmRUeXBlL1N0cm9uZ1VwXCI6IFwiVXBcIixcblx0XCJVSS5UcmVuZFR5cGUvVXBcIjogXCJVcFwiLFxuXHRcIlVJLlRyZW5kVHlwZS9TdHJvbmdEb3duXCI6IFwiRG93blwiLFxuXHRcIlVJLlRyZW5kVHlwZS9Eb3duXCI6IFwiRG93blwiLFxuXHRcIlVJLlRyZW5kVHlwZS9TaWRld2F5c1wiOiBcIk5vbmVcIlxufTtcblxuY29uc3QgS1BJQ2hhcnRUeXBlRnJvbVVJOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuXHRcIlVJLkNoYXJ0VHlwZS9Db2x1bW5TdGFja2VkXCI6IFwiU3RhY2tlZENvbHVtblwiLFxuXHRcIlVJLkNoYXJ0VHlwZS9CYXJTdGFja2VkXCI6IFwiU3RhY2tlZEJhclwiLFxuXHRcIlVJLkNoYXJ0VHlwZS9Eb251dFwiOiBcIkRvbnV0XCIsXG5cdFwiVUkuQ2hhcnRUeXBlL0xpbmVcIjogXCJMaW5lXCIsXG5cdFwiVUkuQ2hhcnRUeXBlL0J1YmJsZVwiOiBcImJ1YmJsZVwiLFxuXHRcIlVJLkNoYXJ0VHlwZS9Db2x1bW5cIjogXCJjb2x1bW5cIixcblx0XCJVSS5DaGFydFR5cGUvQmFyXCI6IFwiYmFyXCIsXG5cdFwiVUkuQ2hhcnRUeXBlL1ZlcnRpY2FsQnVsbGV0XCI6IFwidmVydGljYWxfYnVsbGV0XCIsXG5cdFwiVUkuQ2hhcnRUeXBlL0NvbWJpbmF0aW9uXCI6IFwiY29tYmluYXRpb25cIixcblx0XCJVSS5DaGFydFR5cGUvU2NhdHRlclwiOiBcInNjYXR0ZXJcIlxufTtcblxuZnVuY3Rpb24gY29udmVydEtQSUNoYXJ0KGNoYXJ0QW5ub3RhdGlvbjogQ2hhcnQsIHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50KTogS1BJQ2hhcnREZWZpbml0aW9uIHwgdW5kZWZpbmVkIHtcblx0aWYgKGNoYXJ0QW5ub3RhdGlvbi5NZWFzdXJlcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gV2UgbmVlZCBhdCBsZWFzdCAxIG1lYXN1cmUgKGJ1dCBubyBkaW1lbnNpb24gaXMgYWxsb3dlZCwgZS5nLiBmb3IgYnViYmxlIGNoYXJ0KVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRjb25zdCBjaGFyRGltZW5zaW9ucyA9IGNoYXJ0QW5ub3RhdGlvbi5EaW1lbnNpb25zXG5cdFx0PyAoY2hhcnRBbm5vdGF0aW9uLkRpbWVuc2lvbnMgYXMgUHJvcGVydHlQYXRoW10pLm1hcChwcm9wZXJ0eVBhdGggPT4ge1xuXHRcdFx0XHRjb25zdCBkaW1BdHRyaWJ1dGUgPSBjaGFydEFubm90YXRpb24uRGltZW5zaW9uQXR0cmlidXRlcz8uZmluZChhdHRyaWJ1dGUgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBhdHRyaWJ1dGUuRGltZW5zaW9uPy52YWx1ZSA9PT0gcHJvcGVydHlQYXRoLnZhbHVlO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRuYW1lOiBwcm9wZXJ0eVBhdGgudmFsdWUsXG5cdFx0XHRcdFx0bGFiZWw6IHByb3BlcnR5UGF0aC4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbj8uTGFiZWw/LnRvU3RyaW5nKCkgfHwgcHJvcGVydHlQYXRoLnZhbHVlLFxuXHRcdFx0XHRcdHJvbGU6IGRpbUF0dHJpYnV0ZT8uUm9sZT8ucmVwbGFjZShcIlVJLkNoYXJ0RGltZW5zaW9uUm9sZVR5cGUvXCIsIFwiXCIpXG5cdFx0XHRcdH07XG5cdFx0ICB9KVxuXHRcdDogW107XG5cblx0Y29uc3QgY2hhcnRNZWFzdXJlcyA9IChjaGFydEFubm90YXRpb24uTWVhc3VyZXMgYXMgUHJvcGVydHlQYXRoW10pLm1hcChwcm9wZXJ0eVBhdGggPT4ge1xuXHRcdGNvbnN0IG1lYXN1cmVBdHRyaWJ1dGUgPSBjaGFydEFubm90YXRpb24uTWVhc3VyZUF0dHJpYnV0ZXM/LmZpbmQoYXR0cmlidXRlID0+IHtcblx0XHRcdHJldHVybiBhdHRyaWJ1dGUuTWVhc3VyZT8udmFsdWUgPT09IHByb3BlcnR5UGF0aC52YWx1ZTtcblx0XHR9KTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bmFtZTogcHJvcGVydHlQYXRoLnZhbHVlLFxuXHRcdFx0bGFiZWw6IHByb3BlcnR5UGF0aC4kdGFyZ2V0LmFubm90YXRpb25zLkNvbW1vbj8uTGFiZWw/LnRvU3RyaW5nKCkgfHwgcHJvcGVydHlQYXRoLnZhbHVlLFxuXHRcdFx0cm9sZTogbWVhc3VyZUF0dHJpYnV0ZT8uUm9sZT8ucmVwbGFjZShcIlVJLkNoYXJ0TWVhc3VyZVJvbGVUeXBlL1wiLCBcIlwiKVxuXHRcdH07XG5cdH0pO1xuXG5cdHJldHVybiB7XG5cdFx0Y2hhcnRUeXBlOiBLUElDaGFydFR5cGVGcm9tVUlbY2hhcnRBbm5vdGF0aW9uLkNoYXJ0VHlwZV0gfHwgXCJMaW5lXCIsXG5cdFx0ZGltZW5zaW9uczogY2hhckRpbWVuc2lvbnMsXG5cdFx0bWVhc3VyZXM6IGNoYXJ0TWVhc3VyZXMsXG5cdFx0c29ydE9yZGVyOiBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uU29ydE9yZGVyPy5tYXAoc29ydE9yZGVyID0+IHtcblx0XHRcdHJldHVybiB7IG5hbWU6IHNvcnRPcmRlci5Qcm9wZXJ0eT8udmFsdWUgfHwgXCJcIiwgZGVzY2VuZGluZzogISFzb3J0T3JkZXIuRGVzY2VuZGluZyB9O1xuXHRcdH0pLFxuXHRcdG1heEl0ZW1zOiBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uTWF4SXRlbXM/LnZhbHVlT2YoKSBhcyBudW1iZXJcblx0fTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ3VycmVuY3koZGF0YXBvaW50QW5ub3RhdGlvbjogRGF0YVBvaW50LCBrcGlEZWY6IEtQSURlZmluaXRpb24pOiB2b2lkIHtcblx0Y29uc3QgdGFyZ2V0VmFsdWVQcm9wZXJ0eSA9IGRhdGFwb2ludEFubm90YXRpb24uVmFsdWUuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0aWYgKHRhcmdldFZhbHVlUHJvcGVydHkuYW5ub3RhdGlvbnMuTWVhc3VyZXM/LklTT0N1cnJlbmN5KSB7XG5cdFx0Y29uc3QgY3VycmVuY3kgPSB0YXJnZXRWYWx1ZVByb3BlcnR5LmFubm90YXRpb25zLk1lYXN1cmVzPy5JU09DdXJyZW5jeTtcblx0XHRpZiAoaXNQYXRoRXhwcmVzc2lvbihjdXJyZW5jeSkpIHtcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQudW5pdCA9IHtcblx0XHRcdFx0dmFsdWU6ICgoY3VycmVuY3kuJHRhcmdldCBhcyB1bmtub3duKSBhcyBQcm9wZXJ0eSkubmFtZSxcblx0XHRcdFx0aXNDdXJyZW5jeTogdHJ1ZSxcblx0XHRcdFx0aXNQYXRoOiB0cnVlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRrcGlEZWYuZGF0YXBvaW50LnVuaXQgPSB7XG5cdFx0XHRcdHZhbHVlOiBjdXJyZW5jeS50b1N0cmluZygpLFxuXHRcdFx0XHRpc0N1cnJlbmN5OiB0cnVlLFxuXHRcdFx0XHRpc1BhdGg6IGZhbHNlXG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIGlmICh0YXJnZXRWYWx1ZVByb3BlcnR5LmFubm90YXRpb25zLk1lYXN1cmVzPy5Vbml0KSB7XG5cdFx0Y29uc3QgdW5pdCA9IHRhcmdldFZhbHVlUHJvcGVydHkuYW5ub3RhdGlvbnMuTWVhc3VyZXM/LlVuaXQ7XG5cdFx0aWYgKGlzUGF0aEV4cHJlc3Npb24odW5pdCkpIHtcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQudW5pdCA9IHtcblx0XHRcdFx0dmFsdWU6ICgodW5pdC4kdGFyZ2V0IGFzIHVua25vd24pIGFzIFByb3BlcnR5KS5uYW1lLFxuXHRcdFx0XHRpc0N1cnJlbmN5OiBmYWxzZSxcblx0XHRcdFx0aXNQYXRoOiB0cnVlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRrcGlEZWYuZGF0YXBvaW50LnVuaXQgPSB7XG5cdFx0XHRcdHZhbHVlOiB1bml0LnRvU3RyaW5nKCksXG5cdFx0XHRcdGlzQ3VycmVuY3k6IGZhbHNlLFxuXHRcdFx0XHRpc1BhdGg6IGZhbHNlXG5cdFx0XHR9O1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiB1cGRhdGVDcml0aWNhbGl0eShkYXRhcG9pbnRBbm5vdGF0aW9uOiBEYXRhUG9pbnQsIGFnZ3JlZ2F0aW9uSGVscGVyOiBBZ2dyZWdhdGlvbkhlbHBlciwga3BpRGVmOiBLUElEZWZpbml0aW9uKTogdm9pZCB7XG5cdGlmIChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5KSB7XG5cdFx0aWYgKHR5cGVvZiBkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0XHQvLyBDcml0aWNhbGl0eSBpcyBhIHBhdGggLS0+IGNoZWNrIGlmIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IGlzIGFnZ3JlZ2F0YWJsZVxuXHRcdFx0Y29uc3QgY3JpdGljYWxpdHlQcm9wZXJ0eSA9IChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5IGFzIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxDcml0aWNhbGl0eVR5cGU+KS4kdGFyZ2V0IGFzIFByb3BlcnR5O1xuXHRcdFx0aWYgKGFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlBZ2dyZWdhdGFibGUoY3JpdGljYWxpdHlQcm9wZXJ0eSkpIHtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eVBhdGggPSAoZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eSBhcyBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248Q3JpdGljYWxpdHlUeXBlPikucGF0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFRoZSBwcm9wZXJ0eSBpc24ndCBhZ2dyZWdhdGFibGUgLS0+IHdlIGlnbm9yZSBpdFxuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5VmFsdWUgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBDcml0aWNhbGl0eSBpcyBhbiBlbnVtIFZhbHVlIC0tPiBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHZhbHVlXG5cdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5VmFsdWUgPSBnZXRNZXNzYWdlVHlwZUZyb21Dcml0aWNhbGl0eVR5cGUoZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eSk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbikge1xuXHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvbk1vZGUgPSBkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uSW1wcm92ZW1lbnREaXJlY3Rpb247XG5cdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcyA9IFtdO1xuXHRcdHN3aXRjaCAoa3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uTW9kZSkge1xuXHRcdFx0Y2FzZSBcIlVJLkltcHJvdmVtZW50RGlyZWN0aW9uVHlwZS9UYXJnZXRcIjpcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5EZXZpYXRpb25SYW5nZUxvd1ZhbHVlKTtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5Ub2xlcmFuY2VSYW5nZUxvd1ZhbHVlKTtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5BY2NlcHRhbmNlUmFuZ2VMb3dWYWx1ZSk7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uQWNjZXB0YW5jZVJhbmdlSGlnaFZhbHVlKTtcblx0XHRcdFx0a3BpRGVmLmRhdGFwb2ludC5jcml0aWNhbGl0eUNhbGN1bGF0aW9uVGhyZXNob2xkcy5wdXNoKGRhdGFwb2ludEFubm90YXRpb24uQ3JpdGljYWxpdHlDYWxjdWxhdGlvbi5Ub2xlcmFuY2VSYW5nZUhpZ2hWYWx1ZSk7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uRGV2aWF0aW9uUmFuZ2VIaWdoVmFsdWUpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcIlVJLkltcHJvdmVtZW50RGlyZWN0aW9uVHlwZS9NaW5pbWl6ZVwiOlxuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzLnB1c2goZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLkFjY2VwdGFuY2VSYW5nZUhpZ2hWYWx1ZSk7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uVG9sZXJhbmNlUmFuZ2VIaWdoVmFsdWUpO1xuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5Q2FsY3VsYXRpb25UaHJlc2hvbGRzLnB1c2goZGF0YXBvaW50QW5ub3RhdGlvbi5Dcml0aWNhbGl0eUNhbGN1bGF0aW9uLkRldmlhdGlvblJhbmdlSGlnaFZhbHVlKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJVSS5JbXByb3ZlbWVudERpcmVjdGlvblR5cGUvTWF4aW1pemVcIjpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uRGV2aWF0aW9uUmFuZ2VMb3dWYWx1ZSk7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uVG9sZXJhbmNlUmFuZ2VMb3dWYWx1ZSk7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQuY3JpdGljYWxpdHlDYWxjdWxhdGlvblRocmVzaG9sZHMucHVzaChkYXRhcG9pbnRBbm5vdGF0aW9uLkNyaXRpY2FsaXR5Q2FsY3VsYXRpb24uQWNjZXB0YW5jZVJhbmdlTG93VmFsdWUpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRrcGlEZWYuZGF0YXBvaW50LmNyaXRpY2FsaXR5VmFsdWUgPSBNZXNzYWdlVHlwZS5Ob25lO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVRyZW5kKGRhdGFwb2ludEFubm90YXRpb246IERhdGFQb2ludCwgYWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLCBrcGlEZWY6IEtQSURlZmluaXRpb24pOiB2b2lkIHtcblx0aWYgKGRhdGFwb2ludEFubm90YXRpb24uVHJlbmQpIHtcblx0XHRpZiAodHlwZW9mIGRhdGFwb2ludEFubm90YXRpb24uVHJlbmQgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdC8vIFRyZW5kIGlzIGEgcGF0aCAtLT4gY2hlY2sgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgYWdncmVnYXRhYmxlXG5cdFx0XHRjb25zdCB0cmVuZFByb3BlcnR5ID0gKGRhdGFwb2ludEFubm90YXRpb24uVHJlbmQgYXMgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPFRyZW5kVHlwZT4pLiR0YXJnZXQgYXMgUHJvcGVydHk7XG5cdFx0XHRpZiAoYWdncmVnYXRpb25IZWxwZXIuaXNQcm9wZXJ0eUFnZ3JlZ2F0YWJsZSh0cmVuZFByb3BlcnR5KSkge1xuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LnRyZW5kUGF0aCA9IChkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kIGFzIFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxUcmVuZFR5cGU+KS5wYXRoO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gVGhlIHByb3BlcnR5IGlzbid0IGFnZ3JlZ2F0YWJsZSAtLT4gd2UgaWdub3JlIGl0XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRWYWx1ZSA9IFwiTm9uZVwiO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUcmVuZCBpcyBhbiBlbnVtIFZhbHVlIC0tPiBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHZhbHVlXG5cdFx0XHRrcGlEZWYuZGF0YXBvaW50LnRyZW5kVmFsdWUgPSBEZXZpYXRpb25JbmRpY2F0b3JGcm9tVHJlbmRUeXBlW2RhdGFwb2ludEFubm90YXRpb24uVHJlbmRdIHx8IFwiTm9uZVwiO1xuXHRcdH1cblx0fSBlbHNlIGlmIChkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24pIHtcblx0XHRrcGlEZWYuZGF0YXBvaW50LnRyZW5kQ2FsY3VsYXRpb25Jc1JlbGF0aXZlID0gZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZENhbGN1bGF0aW9uLklzUmVsYXRpdmVEaWZmZXJlbmNlID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdGlmIChkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uUmVmZXJlbmNlVmFsdWUuJHRhcmdldCkge1xuXHRcdFx0Ly8gUmVmZXJlbmNlIHZhbHVlIGlzIGEgcGF0aCAtLT4gY2hlY2sgaWYgdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgaXMgYWdncmVnYXRhYmxlXG5cdFx0XHRjb25zdCByZWZlcmVuY2VQcm9wZXJ0eSA9IGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5SZWZlcmVuY2VWYWx1ZS4kdGFyZ2V0IGFzIFByb3BlcnR5O1xuXHRcdFx0aWYgKGFnZ3JlZ2F0aW9uSGVscGVyLmlzUHJvcGVydHlBZ2dyZWdhdGFibGUocmVmZXJlbmNlUHJvcGVydHkpKSB7XG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVBhdGggPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uUmVmZXJlbmNlVmFsdWUucGF0aDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFRoZSBwcm9wZXJ0eSBpc24ndCBhZ2dyZWdhdGFibGUgLS0+IHdlIGlnbm9yZSBpdCBhbmQgc3dpdGNoIGJhY2sgdG8gdHJlbmQgJ05vbmUnXG5cdFx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRWYWx1ZSA9IFwiTm9uZVwiO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBSZWZlcmVuY2UgdmFsdWUgaXMgYSBzdGF0aWMgdmFsdWVcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlID0gZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZENhbGN1bGF0aW9uLlJlZmVyZW5jZVZhbHVlO1xuXHRcdH1cblx0XHRpZiAoa3BpRGVmLmRhdGFwb2ludC50cmVuZENhbGN1bGF0aW9uUmVmZXJlbmNlUGF0aCAhPT0gdW5kZWZpbmVkIHx8IGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblJlZmVyZW5jZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGtwaURlZi5kYXRhcG9pbnQudHJlbmRDYWxjdWxhdGlvblRyZXNob2xkcyA9IFtcblx0XHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbi5UcmVuZENhbGN1bGF0aW9uLlN0cm9uZ0Rvd25EaWZmZXJlbmNlLnZhbHVlT2YoKSBhcyBudW1iZXIsXG5cdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5Eb3duRGlmZmVyZW5jZS52YWx1ZU9mKCkgYXMgbnVtYmVyLFxuXHRcdFx0XHRkYXRhcG9pbnRBbm5vdGF0aW9uLlRyZW5kQ2FsY3VsYXRpb24uVXBEaWZmZXJlbmNlLnZhbHVlT2YoKSBhcyBudW1iZXIsXG5cdFx0XHRcdGRhdGFwb2ludEFubm90YXRpb24uVHJlbmRDYWxjdWxhdGlvbi5TdHJvbmdVcERpZmZlcmVuY2UudmFsdWVPZigpIGFzIG51bWJlclxuXHRcdFx0XTtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0a3BpRGVmLmRhdGFwb2ludC50cmVuZFZhbHVlID0gXCJOb25lXCI7XG5cdH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlVGFyZ2V0KGRhdGFwb2ludEFubm90YXRpb246IERhdGFQb2ludCwgYWdncmVnYXRpb25IZWxwZXI6IEFnZ3JlZ2F0aW9uSGVscGVyLCBrcGlEZWY6IEtQSURlZmluaXRpb24pOiB2b2lkIHtcblx0aWYgKGRhdGFwb2ludEFubm90YXRpb24uVGFyZ2V0VmFsdWUpIHtcblx0XHRpZiAoZGF0YXBvaW50QW5ub3RhdGlvbi5UYXJnZXRWYWx1ZS4kdGFyZ2V0KSB7XG5cdFx0XHQvLyBUYXJnZXQgdmFsdWUgaXMgYSBwYXRoIC0tPiBjaGVjayBpZiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBpcyBhZ2dyZWdhdGFibGUgKG90aGVyd2lzZSBpZ25vcmUpXG5cdFx0XHRjb25zdCB0YXJnZXRQcm9wZXJ0eSA9IGRhdGFwb2ludEFubm90YXRpb24uVGFyZ2V0VmFsdWUuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0XHRcdGlmIChhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5QWdncmVnYXRhYmxlKHRhcmdldFByb3BlcnR5KSkge1xuXHRcdFx0XHRrcGlEZWYuZGF0YXBvaW50LnRhcmdldFBhdGggPSBkYXRhcG9pbnRBbm5vdGF0aW9uLlRhcmdldFZhbHVlLnBhdGg7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRhcmdldCB2YWx1ZSBpcyBhIHN0YXRpYyB2YWx1ZVxuXHRcdFx0a3BpRGVmLmRhdGFwb2ludC50YXJnZXRWYWx1ZSA9IGRhdGFwb2ludEFubm90YXRpb24uVGFyZ2V0VmFsdWU7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGdldE5hdmlnYXRpb25JbmZvRnJvbVByb3BlcnR5KHByb3BlcnR5OiBQcm9wZXJ0eSk6IE5hdmlnYXRpb25JbmZvIHwgdW5kZWZpbmVkIHtcblx0Y29uc3QgYW5ub3RhdGlvbnM6IFJlY29yZDxzdHJpbmcsIEFubm90YXRpb25UZXJtPGFueT4+ID0gcHJvcGVydHkuYW5ub3RhdGlvbnNbXCJDb21tb25cIl0gfHwge307XG5cblx0Ly8gTG9vayBmb3IgdGhlIHNlbWFudGljT2JqZWN0IGFubm90YXRpb24gKGlmIGFueSlcblx0bGV0IHNlbWFudGljT2JqZWN0QW5ub3RhdGlvbjogQW5ub3RhdGlvblRlcm08U2VtYW50aWNPYmplY3Q+IHwgdW5kZWZpbmVkO1xuXHRPYmplY3Qua2V5cyhhbm5vdGF0aW9ucykuZm9yRWFjaChhbm5vdGF0aW9uS2V5ID0+IHtcblx0XHRjb25zdCBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbnNbYW5ub3RhdGlvbktleV07XG5cdFx0aWYgKGFubm90YXRpb24udGVybSA9PT0gQ29tbW9uQW5ub3RhdGlvblRlcm1zLlNlbWFudGljT2JqZWN0KSB7XG5cdFx0XHRpZiAoIWFubm90YXRpb24ucXVhbGlmaWVyIHx8ICFzZW1hbnRpY09iamVjdEFubm90YXRpb24pIHtcblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHRha2UgdGhlIGFubm90YXRpb24gd2l0aG91dCBxdWFsaWZpZXIgaWYgdGhlcmUncyBvbmUsIG90aGVyd2lzZSB3ZSB0YWtlIHRoZSBmaXJzdCBvbmVcblx0XHRcdFx0c2VtYW50aWNPYmplY3RBbm5vdGF0aW9uID0gYW5ub3RhdGlvbjtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdGlmIChzZW1hbnRpY09iamVjdEFubm90YXRpb24pIHtcblx0XHRjb25zdCByZXN1bHQgPSB7XG5cdFx0XHRzZW1hbnRpY09iamVjdDogc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uLnRvU3RyaW5nKCksXG5cdFx0XHR1bmF2YWlsYWJsZUFjdGlvbnM6IFtdXG5cdFx0fTtcblxuXHRcdC8vIExvb2sgZm9yIHRoZSB1bmF2YWlsYWJsZSBhY3Rpb25zIChpZiBhbnkpXG5cdFx0Y29uc3QgYW5ub3RhdGlvbktleSA9IE9iamVjdC5rZXlzKGFubm90YXRpb25zKS5maW5kKGtleSA9PiB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRhbm5vdGF0aW9uc1trZXldLnRlcm0gPT09IENvbW1vbkFubm90YXRpb25UZXJtcy5TZW1hbnRpY09iamVjdFVuYXZhaWxhYmxlQWN0aW9ucyAmJlxuXHRcdFx0XHRhbm5vdGF0aW9uc1trZXldLnF1YWxpZmllciA9PT0gc2VtYW50aWNPYmplY3RBbm5vdGF0aW9uPy5xdWFsaWZpZXJcblx0XHRcdCk7XG5cdFx0fSk7XG5cdFx0aWYgKGFubm90YXRpb25LZXkpIHtcblx0XHRcdHJlc3VsdC51bmF2YWlsYWJsZUFjdGlvbnMgPSBhbm5vdGF0aW9uc1thbm5vdGF0aW9uS2V5XTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlS1BJRGVmaW5pdGlvbihrcGlOYW1lOiBzdHJpbmcsIGtwaUNvbmZpZzogS1BJQ29uZmlndXJhdGlvbiwgY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IEtQSURlZmluaXRpb24gfCB1bmRlZmluZWQge1xuXHRjb25zdCBrcGlDb252ZXJ0ZXJDb250ZXh0ID0gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKFwiL1wiICsga3BpQ29uZmlnLmVudGl0eVNldCk7XG5cdGNvbnN0IGFnZ3JlZ2F0aW9uSGVscGVyID0gbmV3IEFnZ3JlZ2F0aW9uSGVscGVyKGtwaUNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5VHlwZSgpLCBrcGlDb252ZXJ0ZXJDb250ZXh0KTtcblxuXHRpZiAoIWFnZ3JlZ2F0aW9uSGVscGVyLmlzQW5hbHl0aWNzU3VwcG9ydGVkKCkpIHtcblx0XHQvLyBUaGUgZW50aXR5IGRvZXNuJ3Qgc3VwcG9ydCBhbmFseXRpY2FsIHF1ZXJpZXNcblx0XHRjb252ZXJ0ZXJDb250ZXh0XG5cdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0LmFkZElzc3VlKElzc3VlQ2F0ZWdvcnkuQW5ub3RhdGlvbiwgSXNzdWVTZXZlcml0eS5NZWRpdW0sIElzc3VlVHlwZS5LUElfSVNTVUVTLk5PX0FOQUxZVElDUyArIGtwaUNvbmZpZy5lbnRpdHlTZXQpO1xuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGxldCBzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvbjogU2VsZWN0aW9uVmFyaWFudCB8IHVuZGVmaW5lZDtcblx0bGV0IGRhdGFwb2ludEFubm90YXRpb246IERhdGFQb2ludCB8IHVuZGVmaW5lZDtcblx0bGV0IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uOiBQcmVzZW50YXRpb25WYXJpYW50IHwgdW5kZWZpbmVkO1xuXHRsZXQgY2hhcnRBbm5vdGF0aW9uOiBDaGFydCB8IHVuZGVmaW5lZDtcblx0bGV0IG5hdmlnYXRpb25JbmZvOiBOYXZpZ2F0aW9uSW5mbyB8IHVuZGVmaW5lZDtcblxuXHQvLyBTZWFyY2ggZm9yIGEgS1BJIHdpdGggdGhlIHF1YWxpZmllciBmcm1vIHRoZSBtYW5pZmVzdFxuXHRjb25zdCBhS1BJQW5ub3RhdGlvbnMgPSBrcGlDb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFwiVUlcIiwgVUlBbm5vdGF0aW9uVGVybXMuS1BJKSBhcyBBbm5vdGF0aW9uVGVybTxLUElUeXBlPltdO1xuXHRjb25zdCB0YXJnZXRLUEkgPSBhS1BJQW5ub3RhdGlvbnMuZmluZChrcGkgPT4ge1xuXHRcdHJldHVybiBrcGkucXVhbGlmaWVyID09PSBrcGlDb25maWcucXVhbGlmaWVyO1xuXHR9KTtcblx0aWYgKHRhcmdldEtQSSkge1xuXHRcdGRhdGFwb2ludEFubm90YXRpb24gPSB0YXJnZXRLUEkuRGF0YVBvaW50O1xuXHRcdHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uID0gdGFyZ2V0S1BJLlNlbGVjdGlvblZhcmlhbnQ7XG5cdFx0cHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gPSB0YXJnZXRLUEkuRGV0YWlsPy5EZWZhdWx0UHJlc2VudGF0aW9uVmFyaWFudDtcblx0XHRjaGFydEFubm90YXRpb24gPSBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbj8uVmlzdWFsaXphdGlvbnM/LmZpbmQoKHZpejogYW55KSA9PiB7XG5cdFx0XHRyZXR1cm4gdml6LiR0YXJnZXQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkNoYXJ0RGVmaW5pdGlvblR5cGU7XG5cdFx0fSk/LiR0YXJnZXQgYXMgQ2hhcnQ7XG5cblx0XHRpZiAodGFyZ2V0S1BJLkRldGFpbD8uU2VtYW50aWNPYmplY3QpIHtcblx0XHRcdG5hdmlnYXRpb25JbmZvID0ge1xuXHRcdFx0XHRzZW1hbnRpY09iamVjdDogdGFyZ2V0S1BJLkRldGFpbC5TZW1hbnRpY09iamVjdC50b1N0cmluZygpLFxuXHRcdFx0XHRhY3Rpb246IHRhcmdldEtQSS5EZXRhaWwuQWN0aW9uPy50b1N0cmluZygpLFxuXHRcdFx0XHR1bmF2YWlsYWJsZUFjdGlvbnM6IFtdXG5cdFx0XHR9O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBGYWxsYmFjazogdHJ5IHRvIGZpbmQgYSBTUFYgd2l0aCB0aGUgc2FtZSBxdWFsaWZpZXJcblx0XHRjb25zdCBhU1BWQW5ub3RhdGlvbnMgPSBrcGlDb252ZXJ0ZXJDb250ZXh0LmdldEFubm90YXRpb25zQnlUZXJtKFxuXHRcdFx0XCJVSVwiLFxuXHRcdFx0VUlBbm5vdGF0aW9uVGVybXMuU2VsZWN0aW9uUHJlc2VudGF0aW9uVmFyaWFudFxuXHRcdCkgYXMgQW5ub3RhdGlvblRlcm08U2VsZWN0aW9uUHJlc2VudGF0aW9uVmFyaWFudFR5cGU+W107XG5cdFx0Y29uc3QgdGFyZ2V0U1BWID0gYVNQVkFubm90YXRpb25zLmZpbmQoc3B2ID0+IHtcblx0XHRcdHJldHVybiBzcHYucXVhbGlmaWVyID09PSBrcGlDb25maWcucXVhbGlmaWVyO1xuXHRcdH0pO1xuXHRcdGlmICh0YXJnZXRTUFYpIHtcblx0XHRcdHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uID0gdGFyZ2V0U1BWLlNlbGVjdGlvblZhcmlhbnQ7XG5cdFx0XHRwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbiA9IHRhcmdldFNQVi5QcmVzZW50YXRpb25WYXJpYW50O1xuXHRcdFx0ZGF0YXBvaW50QW5ub3RhdGlvbiA9IHByZXNlbnRhdGlvblZhcmlhbnRBbm5vdGF0aW9uPy5WaXN1YWxpemF0aW9ucz8uZmluZCgodml6OiBhbnkpID0+IHtcblx0XHRcdFx0cmV0dXJuIHZpei4kdGFyZ2V0LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlO1xuXHRcdFx0fSk/LiR0YXJnZXQgYXMgRGF0YVBvaW50O1xuXHRcdFx0Y2hhcnRBbm5vdGF0aW9uID0gcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24/LlZpc3VhbGl6YXRpb25zPy5maW5kKCh2aXo6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdml6LiR0YXJnZXQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkNoYXJ0RGVmaW5pdGlvblR5cGU7XG5cdFx0XHR9KT8uJHRhcmdldCBhcyBDaGFydDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gQ291bGRuJ3QgZmluZCBhIEtQSSBvciBhIFNQViBhbm5vdGF0aW9uIHdpdGggdGhlIHF1YWxpZmllciBmcm9tIHRoZSBtYW5pZmVzdFxuXHRcdFx0Y29udmVydGVyQ29udGV4dFxuXHRcdFx0XHQuZ2V0RGlhZ25vc3RpY3MoKVxuXHRcdFx0XHQuYWRkSXNzdWUoSXNzdWVDYXRlZ29yeS5Bbm5vdGF0aW9uLCBJc3N1ZVNldmVyaXR5Lk1lZGl1bSwgSXNzdWVUeXBlLktQSV9JU1NVRVMuS1BJX05PVF9GT1VORCArIGtwaUNvbmZpZy5xdWFsaWZpZXIpO1xuXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdGlmICghcHJlc2VudGF0aW9uVmFyaWFudEFubm90YXRpb24gfHwgIWRhdGFwb2ludEFubm90YXRpb24gfHwgIWNoYXJ0QW5ub3RhdGlvbikge1xuXHRcdC8vIENvdWxkbid0IGZpbmQgYSBjaGFydCBvciBkYXRhcG9pbnQgZGVmaW5pdGlvblxuXHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHQuYWRkSXNzdWUoSXNzdWVDYXRlZ29yeS5Bbm5vdGF0aW9uLCBJc3N1ZVNldmVyaXR5Lk1lZGl1bSwgSXNzdWVUeXBlLktQSV9JU1NVRVMuS1BJX0RFVEFJTF9OT1RfRk9VTkQgKyBrcGlDb25maWcucXVhbGlmaWVyKTtcblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRjb25zdCBkYXRhcG9pbnRQcm9wZXJ0eSA9IGRhdGFwb2ludEFubm90YXRpb24uVmFsdWUuJHRhcmdldCBhcyBQcm9wZXJ0eTtcblx0aWYgKCFhZ2dyZWdhdGlvbkhlbHBlci5pc1Byb3BlcnR5QWdncmVnYXRhYmxlKGRhdGFwb2ludFByb3BlcnR5KSkge1xuXHRcdC8vIFRoZSBtYWluIHByb3BlcnR5IG9mIHRoZSBLUEkgaXMgbm90IGFnZ3JlZ2F0YWJsZSAtLT4gV2UgY2FuJ3QgY2FsY3VsYXRlIGl0cyB2YWx1ZSBzbyB3ZSBpZ25vcmUgdGhlIEtQSVxuXHRcdGNvbnZlcnRlckNvbnRleHRcblx0XHRcdC5nZXREaWFnbm9zdGljcygpXG5cdFx0XHQuYWRkSXNzdWUoXG5cdFx0XHRcdElzc3VlQ2F0ZWdvcnkuQW5ub3RhdGlvbixcblx0XHRcdFx0SXNzdWVTZXZlcml0eS5NZWRpdW0sXG5cdFx0XHRcdElzc3VlVHlwZS5LUElfSVNTVUVTLk1BSU5fUFJPUEVSVFlfTk9UX0FHR1JFR0FUQUJMRSArIGtwaUNvbmZpZy5xdWFsaWZpZXJcblx0XHRcdCk7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdC8vIENoYXJ0IGRlZmluaXRpb25cblx0Y29uc3QgY2hhcnREZWYgPSBjb252ZXJ0S1BJQ2hhcnQoY2hhcnRBbm5vdGF0aW9uLCBwcmVzZW50YXRpb25WYXJpYW50QW5ub3RhdGlvbik7XG5cdGlmICghY2hhcnREZWYpIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Y29uc3Qga3BpRGVmOiBLUElEZWZpbml0aW9uID0ge1xuXHRcdGlkOiBLUElJRChrcGlOYW1lKSxcblx0XHRlbnRpdHlTZXQ6IGtwaUNvbmZpZy5lbnRpdHlTZXQsXG5cdFx0ZGF0YXBvaW50OiB7XG5cdFx0XHRwcm9wZXJ0eVBhdGg6IGRhdGFwb2ludEFubm90YXRpb24uVmFsdWUucGF0aCxcblx0XHRcdGFubm90YXRpb25QYXRoOiBrcGlDb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgoZGF0YXBvaW50QW5ub3RhdGlvbi5mdWxseVF1YWxpZmllZE5hbWUpLFxuXHRcdFx0dGl0bGU6IGRhdGFwb2ludEFubm90YXRpb24uVGl0bGU/LnRvU3RyaW5nKCksXG5cdFx0XHRkZXNjcmlwdGlvbjogZGF0YXBvaW50QW5ub3RhdGlvbi5EZXNjcmlwdGlvbj8udG9TdHJpbmcoKVxuXHRcdH0sXG5cdFx0c2VsZWN0aW9uVmFyaWFudEZpbHRlckRlZmluaXRpb25zOiBzZWxlY3Rpb25WYXJpYW50QW5ub3RhdGlvblxuXHRcdFx0PyBnZXRGaWx0ZXJEZWZpbml0aW9uc0Zyb21TZWxlY3Rpb25WYXJpYW50KHNlbGVjdGlvblZhcmlhbnRBbm5vdGF0aW9uKVxuXHRcdFx0OiB1bmRlZmluZWQsXG5cdFx0Y2hhcnQ6IGNoYXJ0RGVmXG5cdH07XG5cblx0Ly8gTmF2aWdhdGlvblxuXHRpZiAoIW5hdmlnYXRpb25JbmZvKSB7XG5cdFx0Ly8gTm8gbmF2aWdhdGlvbkluZm8gd2FzIGZvdW5kIGluIHRoZSBLUEkgYW5ub3RhdGlvbiAtLT4gdHJ5IHRoZSBvdXRib3VuZCBuYXZpZ2F0aW9uIGZyb20gdGhlIG1hbmlmZXN0XG5cdFx0aWYgKGtwaUNvbmZpZy5kZXRhaWxOYXZpZ2F0aW9uKSB7XG5cdFx0XHRuYXZpZ2F0aW9uSW5mbyA9IHtcblx0XHRcdFx0b3V0Ym91bmROYXZpZ2F0aW9uOiBrcGlDb25maWcuZGV0YWlsTmF2aWdhdGlvblxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gTm8gb3V0Ym91bmQgbmF2aWdhdGlvbiBpbiB0aGUgbWFuaWZlc3QgLS0+IHRyeSB0aGUgc2VtYW50aWMgb2JqZWN0IG9uIHRoZSBEYXRhcG9pbnQgdmFsdWVcblx0XHRcdG5hdmlnYXRpb25JbmZvID0gZ2V0TmF2aWdhdGlvbkluZm9Gcm9tUHJvcGVydHkoZGF0YXBvaW50UHJvcGVydHkpO1xuXHRcdH1cblx0fVxuXHRpZiAobmF2aWdhdGlvbkluZm8pIHtcblx0XHRrcGlEZWYubmF2aWdhdGlvbiA9IG5hdmlnYXRpb25JbmZvO1xuXHR9XG5cblx0dXBkYXRlQ3VycmVuY3koZGF0YXBvaW50QW5ub3RhdGlvbiwga3BpRGVmKTtcblx0dXBkYXRlQ3JpdGljYWxpdHkoZGF0YXBvaW50QW5ub3RhdGlvbiwgYWdncmVnYXRpb25IZWxwZXIsIGtwaURlZik7XG5cdHVwZGF0ZVRyZW5kKGRhdGFwb2ludEFubm90YXRpb24sIGFnZ3JlZ2F0aW9uSGVscGVyLCBrcGlEZWYpO1xuXHR1cGRhdGVUYXJnZXQoZGF0YXBvaW50QW5ub3RhdGlvbiwgYWdncmVnYXRpb25IZWxwZXIsIGtwaURlZik7XG5cblx0cmV0dXJuIGtwaURlZjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBLUEkgZGVmaW5pdGlvbnMgZnJvbSB0aGUgbWFuaWZlc3QgYW5kIHRoZSBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0NvbnZlcnRlckNvbnRleHR9IGNvbnZlcnRlckNvbnRleHQgVGhlIGNvbnZlcnRlciBjb250ZXh0IGZvciB0aGUgcGFnZVxuICogQHJldHVybnMge0tQSURlZmluaXRpb25bXX0gUmV0dXJucyBhbiBhcnJheSBvZiBLUEkgZGVmaW5pdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEtQSURlZmluaXRpb25zKGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQpOiBLUElEZWZpbml0aW9uW10ge1xuXHRjb25zdCBrcGlDb25maWdzID0gY29udmVydGVyQ29udGV4dC5nZXRNYW5pZmVzdFdyYXBwZXIoKS5nZXRLUElDb25maWd1cmF0aW9uKCksXG5cdFx0a3BpRGVmczogS1BJRGVmaW5pdGlvbltdID0gW107XG5cblx0T2JqZWN0LmtleXMoa3BpQ29uZmlncykuZm9yRWFjaChrcGlOYW1lID0+IHtcblx0XHRjb25zdCBvRGVmID0gY3JlYXRlS1BJRGVmaW5pdGlvbihrcGlOYW1lLCBrcGlDb25maWdzW2twaU5hbWVdLCBjb252ZXJ0ZXJDb250ZXh0KTtcblx0XHRpZiAob0RlZikge1xuXHRcdFx0a3BpRGVmcy5wdXNoKG9EZWYpO1xuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIGtwaURlZnM7XG59XG4iXX0=
|