@sapui5/sap.fe.core 1.135.0 → 1.136.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/sap/fe/core/.library +1 -1
- package/src/sap/fe/core/ActionRuntime.js +3 -2
- package/src/sap/fe/core/ActionRuntime.ts +3 -1
- package/src/sap/fe/core/AppComponent.js +6 -4
- package/src/sap/fe/core/AppComponent.ts +3 -1
- package/src/sap/fe/core/AppStateHandler.js +8 -6
- package/src/sap/fe/core/AppStateHandler.ts +7 -5
- package/src/sap/fe/core/CommonUtils.js +4 -1
- package/src/sap/fe/core/CommonUtils.ts +12 -2
- package/src/sap/fe/core/ExtensionAPI.js +5 -3
- package/src/sap/fe/core/ExtensionAPI.ts +4 -2
- package/src/sap/fe/core/PageController.js +13 -1
- package/src/sap/fe/core/PageController.ts +13 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.js +13 -5
- package/src/sap/fe/core/buildingBlocks/BuildingBlock.ts +19 -6
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +4 -2
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +3 -1
- package/src/sap/fe/core/controllerextensions/EditFlow.js +58 -14
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +71 -11
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.js +184 -17
- package/src/sap/fe/core/controllerextensions/InlineEditFlow.ts +204 -12
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +12 -3
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +11 -1
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +35 -5
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +41 -1
- package/src/sap/fe/core/controllerextensions/Routing.js +6 -6
- package/src/sap/fe/core/controllerextensions/Routing.ts +2 -2
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.js +3 -11
- package/src/sap/fe/core/controllerextensions/collaboration/ActivityBase.ts +2 -10
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.js +11 -1
- package/src/sap/fe/core/controllerextensions/collaboration/CollaborationCommon.ts +12 -0
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +21 -6
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +19 -5
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +17 -14
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +19 -17
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +4 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.js +10 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataOperation.ts +8 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.js +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/ODataStrictHandling.ts +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.js +1 -1
- package/src/sap/fe/core/controllerextensions/editFlow/operations/Operation.ts +33 -31
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +3 -3
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.js +4 -1
- package/src/sap/fe/core/controllerextensions/editFlow/sticky.ts +2 -1
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.js +2 -2
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.tsx +8 -1
- package/src/sap/fe/core/controls/HideFormGroupAutomatically.js +4 -3
- package/src/sap/fe/core/controls/HideFormGroupAutomatically.ts +7 -2
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.js +68 -0
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeActionDialog.tsx +52 -0
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.js +144 -0
- package/src/sap/fe/core/controls/inlineEditFlow/BeforeNavigationDialog.tsx +128 -0
- package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.js +53 -0
- package/src/sap/fe/core/controls/inlineEditFlow/DraftExistsDialog.tsx +39 -0
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +18 -8
- package/src/sap/fe/core/converters/controls/Common/Action.js +54 -5
- package/src/sap/fe/core/converters/controls/Common/Action.ts +59 -3
- package/src/sap/fe/core/converters/controls/Common/Chart.js +22 -4
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +23 -4
- package/src/sap/fe/core/converters/controls/Common/Form.js +13 -4
- package/src/sap/fe/core/converters/controls/Common/Form.ts +13 -3
- package/src/sap/fe/core/converters/controls/Common/Table.js +29 -9
- package/src/sap/fe/core/converters/controls/Common/Table.ts +38 -8
- package/src/sap/fe/core/converters/controls/Common/table/Columns.js +14 -16
- package/src/sap/fe/core/converters/controls/Common/table/Columns.ts +61 -96
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +62 -13
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +75 -13
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +4 -33
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +4 -44
- package/src/sap/fe/core/converters/controls/ListReport/FilterField.js +106 -0
- package/src/sap/fe/core/converters/controls/ListReport/FilterField.ts +129 -0
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +9 -4
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +8 -3
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +7 -2
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +5 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +29 -7
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +40 -16
- package/src/sap/fe/core/designtime/AnnotationBasedChanges.js +34 -16
- package/src/sap/fe/core/designtime/AnnotationBasedChanges.ts +35 -16
- package/src/sap/fe/core/designtime/messagebundle_ar.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_bg.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ca.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_cnr.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_cs.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_cy.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_da.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_de.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_el.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_en.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_en_GB.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_es.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_es_MX.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_et.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_fi.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_fr.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_fr_CA.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_hi.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_hr.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_hu.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_id.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_it.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_iw.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ja.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_kk.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ko.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_lt.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_lv.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_mk.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ms.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_nl.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_no.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_pl.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_pt.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_pt_PT.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ro.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_ru.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_sh.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_sk.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_sl.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_sr.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_sv.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_th.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_tr.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_uk.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_vi.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_zh_CN.properties +7 -0
- package/src/sap/fe/core/designtime/messagebundle_zh_TW.properties +7 -0
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +24 -3
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +28 -2
- package/src/sap/fe/core/helpers/BindingHelper.js +3 -2
- package/src/sap/fe/core/helpers/BindingHelper.ts +2 -1
- package/src/sap/fe/core/helpers/DeleteHelper.js +4 -9
- package/src/sap/fe/core/helpers/DeleteHelper.ts +3 -8
- package/src/sap/fe/core/helpers/ModelHelper.js +14 -4
- package/src/sap/fe/core/helpers/ModelHelper.ts +15 -4
- package/src/sap/fe/core/helpers/PasteHelper.js +38 -39
- package/src/sap/fe/core/helpers/PasteHelper.ts +49 -51
- package/src/sap/fe/core/helpers/WebSocket.js +10 -1
- package/src/sap/fe/core/helpers/WebSocket.ts +8 -0
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/messagebundle.properties +41 -2
- package/src/sap/fe/core/messagebundle_ar.properties +23 -2
- package/src/sap/fe/core/messagebundle_bg.properties +23 -2
- package/src/sap/fe/core/messagebundle_ca.properties +21 -0
- package/src/sap/fe/core/messagebundle_cnr.properties +23 -2
- package/src/sap/fe/core/messagebundle_cs.properties +21 -0
- package/src/sap/fe/core/messagebundle_cy.properties +21 -0
- package/src/sap/fe/core/messagebundle_da.properties +23 -2
- package/src/sap/fe/core/messagebundle_de.properties +23 -2
- package/src/sap/fe/core/messagebundle_el.properties +21 -0
- package/src/sap/fe/core/messagebundle_en.properties +23 -2
- package/src/sap/fe/core/messagebundle_en_GB.properties +23 -2
- package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +23 -2
- package/src/sap/fe/core/messagebundle_es.properties +21 -0
- package/src/sap/fe/core/messagebundle_es_MX.properties +21 -0
- package/src/sap/fe/core/messagebundle_et.properties +21 -0
- package/src/sap/fe/core/messagebundle_fi.properties +21 -0
- package/src/sap/fe/core/messagebundle_fr.properties +22 -1
- package/src/sap/fe/core/messagebundle_fr_CA.properties +21 -0
- package/src/sap/fe/core/messagebundle_hi.properties +22 -1
- package/src/sap/fe/core/messagebundle_hr.properties +24 -3
- package/src/sap/fe/core/messagebundle_hu.properties +21 -0
- package/src/sap/fe/core/messagebundle_id.properties +21 -0
- package/src/sap/fe/core/messagebundle_it.properties +23 -2
- package/src/sap/fe/core/messagebundle_iw.properties +21 -0
- package/src/sap/fe/core/messagebundle_ja.properties +21 -0
- package/src/sap/fe/core/messagebundle_kk.properties +21 -0
- package/src/sap/fe/core/messagebundle_ko.properties +21 -0
- package/src/sap/fe/core/messagebundle_lt.properties +21 -0
- package/src/sap/fe/core/messagebundle_lv.properties +23 -2
- package/src/sap/fe/core/messagebundle_mk.properties +21 -0
- package/src/sap/fe/core/messagebundle_ms.properties +22 -1
- package/src/sap/fe/core/messagebundle_nl.properties +21 -0
- package/src/sap/fe/core/messagebundle_no.properties +21 -0
- package/src/sap/fe/core/messagebundle_pl.properties +23 -2
- package/src/sap/fe/core/messagebundle_pt.properties +23 -2
- package/src/sap/fe/core/messagebundle_pt_PT.properties +21 -0
- package/src/sap/fe/core/messagebundle_ro.properties +23 -2
- package/src/sap/fe/core/messagebundle_ru.properties +22 -1
- package/src/sap/fe/core/messagebundle_sh.properties +23 -2
- package/src/sap/fe/core/messagebundle_sk.properties +21 -0
- package/src/sap/fe/core/messagebundle_sl.properties +23 -2
- package/src/sap/fe/core/messagebundle_sr.properties +23 -2
- package/src/sap/fe/core/messagebundle_sv.properties +21 -0
- package/src/sap/fe/core/messagebundle_th.properties +21 -0
- package/src/sap/fe/core/messagebundle_tr.properties +21 -0
- package/src/sap/fe/core/messagebundle_uk.properties +23 -2
- package/src/sap/fe/core/messagebundle_vi.properties +23 -2
- package/src/sap/fe/core/messagebundle_zh_CN.properties +23 -2
- package/src/sap/fe/core/messagebundle_zh_TW.properties +21 -0
- package/src/sap/fe/core/rootView/Fcl.controller.js +5 -5
- package/src/sap/fe/core/rootView/Fcl.controller.ts +10 -4
- package/src/sap/fe/core/rootView/NavContainer.controller.js +2 -2
- package/src/sap/fe/core/rootView/NavContainer.controller.ts +1 -1
- package/src/sap/fe/core/rootView/RootViewBaseController.js +61 -9
- package/src/sap/fe/core/rootView/RootViewBaseController.ts +70 -7
- package/src/sap/fe/core/services/CollaborationManagerServiceFactory.js +28 -12
- package/src/sap/fe/core/services/CollaborationManagerServiceFactory.ts +27 -13
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +7 -1
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +6 -0
- package/src/sap/fe/core/services/RoutingServiceFactory.js +3 -2
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +2 -1
- package/src/sap/fe/core/services/ShellServicesFactory.js +4 -3
- package/src/sap/fe/core/services/ShellServicesFactory.ts +5 -3
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +27 -3
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +32 -3
- package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
- package/src/sap/fe/core/templating/EntitySetHelper.js +198 -58
- package/src/sap/fe/core/templating/EntitySetHelper.ts +221 -61
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +6 -7
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +9 -7
|
@@ -21,6 +21,7 @@ import type {
|
|
|
21
21
|
} from "sap/fe/core/converters/ManifestSettings";
|
|
22
22
|
import * as MetaModelConverter from "sap/fe/core/converters/MetaModelConverter";
|
|
23
23
|
import { convertTypes, getInvolvedDataModelObjects } from "sap/fe/core/converters/MetaModelConverter";
|
|
24
|
+
import { getResourceModel } from "sap/fe/core/helpers/ResourceModelHelper";
|
|
24
25
|
import {
|
|
25
26
|
isComplexType,
|
|
26
27
|
isEntitySet,
|
|
@@ -29,14 +30,15 @@ import {
|
|
|
29
30
|
isProperty,
|
|
30
31
|
isPropertyPathExpression
|
|
31
32
|
} from "sap/fe/core/helpers/TypeGuards";
|
|
32
|
-
import { ChannelType, createWebSocket, getWebSocketBaseUrl, getWebSocketChannelUrl } from "sap/fe/core/helpers/WebSocket";
|
|
33
|
+
import { ChannelType, WEBSOCKET_STATUS, createWebSocket, getWebSocketBaseUrl, getWebSocketChannelUrl } from "sap/fe/core/helpers/WebSocket";
|
|
33
34
|
import { getAssociatedTextPropertyPath } from "sap/fe/core/templating/PropertyHelper";
|
|
35
|
+
import MessageBox from "sap/m/MessageBox";
|
|
34
36
|
import type Event from "sap/ui/base/Event";
|
|
35
37
|
import type Control from "sap/ui/core/Control";
|
|
36
38
|
import Service from "sap/ui/core/service/Service";
|
|
37
39
|
import ServiceFactory from "sap/ui/core/service/ServiceFactory";
|
|
38
40
|
import type SapPcpWebSocket from "sap/ui/core/ws/SapPcpWebSocket";
|
|
39
|
-
import type { WebSocket$MessageEvent } from "sap/ui/core/ws/WebSocket";
|
|
41
|
+
import type { WebSocket$CloseEvent, WebSocket$MessageEvent } from "sap/ui/core/ws/WebSocket";
|
|
40
42
|
import type { default as Context } from "sap/ui/model/odata/v4/Context";
|
|
41
43
|
import type ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
|
|
42
44
|
import type ODataModel from "sap/ui/model/odata/v4/ODataModel";
|
|
@@ -154,6 +156,7 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
|
|
|
154
156
|
|
|
155
157
|
private entityTypeRegexPattern!: RegExp;
|
|
156
158
|
|
|
159
|
+
private webSocketStatus!: WEBSOCKET_STATUS;
|
|
157
160
|
// Interaction type for SideEffects events
|
|
158
161
|
private interactionTypeDefinition?: SideEffectsEventsInteractionManifestSetting;
|
|
159
162
|
|
|
@@ -190,8 +193,34 @@ export class SideEffectsService extends Service<SideEffectsSettings> {
|
|
|
190
193
|
if (url && channel) {
|
|
191
194
|
this.webSocket = createWebSocket(ChannelType.SideEffectsEvents, model);
|
|
192
195
|
this.webSocket.attachMessage(this.onSideEffectsEventReceived.bind(this));
|
|
196
|
+
this.webSocketStatus = WEBSOCKET_STATUS.CONNECTED;
|
|
197
|
+
|
|
198
|
+
const showConnectionLostDialog = (): void => {
|
|
199
|
+
if ([WEBSOCKET_STATUS.CLOSED, WEBSOCKET_STATUS.ERROR].includes(this.webSocketStatus)) {
|
|
200
|
+
const resourceModel = getResourceModel(this.appComponent);
|
|
201
|
+
const lostOfConnectionText = resourceModel.getText("C_SIDEEFFECT_CONNECTION_LOST");
|
|
202
|
+
|
|
203
|
+
MessageBox.warning(lostOfConnectionText, {
|
|
204
|
+
actions: [MessageBox.Action.OK],
|
|
205
|
+
emphasizedAction: MessageBox.Action.OK
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
this.webSocket.attachError(() => {
|
|
211
|
+
this.webSocketStatus = WEBSOCKET_STATUS.ERROR;
|
|
212
|
+
showConnectionLostDialog();
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
this.webSocket.attachClose((evt: WebSocket$CloseEvent) => {
|
|
216
|
+
this.webSocketStatus = WEBSOCKET_STATUS.CLOSED;
|
|
217
|
+
// RFC 6455 defines the status codes when closing an established connection : https://datatracker.ietf.org/doc/html/rfc6455#section-7.4
|
|
218
|
+
// status code 1000 means normal closure
|
|
219
|
+
if ((evt.getParameter("code") as number | undefined) !== 1000) {
|
|
220
|
+
showConnectionLostDialog();
|
|
221
|
+
}
|
|
222
|
+
});
|
|
193
223
|
}
|
|
194
|
-
return;
|
|
195
224
|
}
|
|
196
225
|
|
|
197
226
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<mvc:View xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m" controllerName="sap.fe.core.services.view.TemplatingErrorPage">
|
|
2
2
|
<Page showHeader="false">
|
|
3
3
|
<IllustratedMessage
|
|
4
|
-
illustrationType="sapIllus-
|
|
4
|
+
illustrationType="sapIllus-UnableToLoad"
|
|
5
5
|
title="{sap.fe.i18n>T_TEMPLATING_ERROR_PAGE_SAPFE_APPSTART_TEMPLATING_FAILED}"
|
|
6
6
|
description="{= ${error>/message} ? ${error>/message} : ''}"
|
|
7
7
|
/>
|
|
@@ -2,96 +2,236 @@
|
|
|
2
2
|
* SAP UI development toolkit for HTML5 (SAPUI5)
|
|
3
3
|
* (c) Copyright 2009-2025 SAP SE. All rights reserved
|
|
4
4
|
*/
|
|
5
|
-
sap.ui.define(["sap/fe/core/helpers/TypeGuards"], function (TypeGuards) {
|
|
5
|
+
sap.ui.define(["sap/fe/core/helpers/TypeGuards", "./DataModelPathHelper"], function (TypeGuards, DataModelPathHelper) {
|
|
6
6
|
"use strict";
|
|
7
7
|
|
|
8
8
|
var _exports = {};
|
|
9
|
+
var getTargetEntitySetInfo = DataModelPathHelper.getTargetEntitySetInfo;
|
|
9
10
|
var isEntitySet = TypeGuards.isEntitySet;
|
|
10
11
|
/**
|
|
11
|
-
*
|
|
12
|
+
* Reads all FilterRestrictions of the main entity and the navigation restrictions.
|
|
13
|
+
* We get the restrictions first on the navigation property (most precise definition), and if not available, then we get the restrictions on the entitySet.
|
|
14
|
+
* In case of containment, we only get the restrictions on the navigation property of the parent entitySet.
|
|
12
15
|
* @param entitySet Entity set to be analyzed
|
|
16
|
+
* @param targetEntitySet The target entity set, if available. Not used in the case of containment.
|
|
17
|
+
* @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
|
|
13
18
|
* @returns Array containing the property names of all non-filterable properties
|
|
14
19
|
*/
|
|
15
|
-
const getNonFilterablePropertiesRestrictions = function (entitySet) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
const getNonFilterablePropertiesRestrictions = function (entitySet, targetEntitySet, parentNavigationPath) {
|
|
21
|
+
const filterRestrictionsFromNavigationRestrictions = getFilterRestrictionsfromNavigationRestrictions(entitySet, targetEntitySet, parentNavigationPath);
|
|
22
|
+
const directFilterRestrictions = getDirectFilterRestrictions(entitySet, targetEntitySet, parentNavigationPath);
|
|
23
|
+
// Merge two filter restrictions found on the navigation property and directly from the entity set
|
|
24
|
+
return Array.from(new Set([...filterRestrictionsFromNavigationRestrictions, ...directFilterRestrictions]));
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Reads all SortRestrictions of the main entity and the navigation restrictions.
|
|
29
|
+
* We retrieve the restrictions first on the navigation property (most precise definition), and if not available, then we get the restrictions on the entitySet
|
|
30
|
+
* In case of containment, we only get the restrictions on the navigation property of the parent entitySet.
|
|
31
|
+
* @param entitySet Entity set to be analyzed
|
|
32
|
+
* @param targetEntitySet The target entity set, if available. Not used in the case of containment.
|
|
33
|
+
* @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
|
|
34
|
+
* @returns Array containing the property names of all non-sortable properties
|
|
35
|
+
*/
|
|
36
|
+
_exports.getNonFilterablePropertiesRestrictions = getNonFilterablePropertiesRestrictions;
|
|
37
|
+
const getNonSortablePropertiesRestrictions = function (entitySet, targetEntitySet, parentNavigationPath) {
|
|
38
|
+
const sortRestrictionsFromNavigationRestrictions = getSortRestrictionsfromNavigationRestrictions(entitySet, targetEntitySet, parentNavigationPath);
|
|
39
|
+
const directSortRestrictions = getDirectSortRestrictions(entitySet, targetEntitySet, parentNavigationPath);
|
|
40
|
+
// Merge two sort restrictions found on the navigation property and directly from the entity set
|
|
41
|
+
return Array.from(new Set([...sortRestrictionsFromNavigationRestrictions, ...directSortRestrictions]));
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Gets all SortRestrictions and FilterRestrictions for a given context.
|
|
46
|
+
* @param converterContext The converter context.
|
|
47
|
+
* @returns Object containing all property names of restrictions separated by sortable and filterable capabilities.
|
|
48
|
+
*/
|
|
49
|
+
_exports.getNonSortablePropertiesRestrictions = getNonSortablePropertiesRestrictions;
|
|
50
|
+
const getRestrictionsOnProperties = function (converterContext) {
|
|
51
|
+
let propertiesRestrictions = {
|
|
52
|
+
nonSortableProperties: [],
|
|
53
|
+
nonFilterableProperties: []
|
|
54
|
+
};
|
|
55
|
+
const dataModelObjectPath = converterContext.getDataModelObjectPath();
|
|
56
|
+
const {
|
|
57
|
+
parentEntitySet,
|
|
58
|
+
targetEntitySet,
|
|
59
|
+
parentNavigationPath
|
|
60
|
+
} = getTargetEntitySetInfo(dataModelObjectPath);
|
|
61
|
+
if (isEntitySet(targetEntitySet)) {
|
|
62
|
+
if (parentEntitySet && isEntitySet(parentEntitySet)) {
|
|
63
|
+
propertiesRestrictions = {
|
|
64
|
+
nonSortableProperties: getNonSortablePropertiesRestrictions(parentEntitySet, targetEntitySet),
|
|
65
|
+
nonFilterableProperties: getNonFilterablePropertiesRestrictions(parentEntitySet, targetEntitySet)
|
|
66
|
+
};
|
|
67
|
+
if (propertiesRestrictions.nonSortableProperties.length || propertiesRestrictions.nonFilterableProperties.length) {
|
|
68
|
+
return propertiesRestrictions;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
nonSortableProperties: getNonSortablePropertiesRestrictions(targetEntitySet),
|
|
73
|
+
nonFilterableProperties: getNonFilterablePropertiesRestrictions(targetEntitySet)
|
|
74
|
+
};
|
|
75
|
+
} else if (parentEntitySet && isEntitySet(parentEntitySet)) {
|
|
76
|
+
// Find the restrictions on the parent entity set, this applies also for containment as there isn't an entity set on the OP
|
|
77
|
+
return {
|
|
78
|
+
nonSortableProperties: getNonSortablePropertiesRestrictions(parentEntitySet, undefined, parentNavigationPath),
|
|
79
|
+
nonFilterableProperties: getNonFilterablePropertiesRestrictions(parentEntitySet, undefined, parentNavigationPath)
|
|
80
|
+
};
|
|
22
81
|
}
|
|
82
|
+
return propertiesRestrictions;
|
|
83
|
+
};
|
|
23
84
|
|
|
24
|
-
|
|
85
|
+
/**
|
|
86
|
+
* Gets the sort restrictions from the navigation restrictions.
|
|
87
|
+
* @param entitySet Entity set to be analyzed.
|
|
88
|
+
* @param targetEntitySet The target entity set, if available. Not used in the case of containment.
|
|
89
|
+
* @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
|
|
90
|
+
* @returns Array containing the property names of all non-sortable properties from navigation restrictions.
|
|
91
|
+
*/
|
|
92
|
+
_exports.getRestrictionsOnProperties = getRestrictionsOnProperties;
|
|
93
|
+
function getSortRestrictionsfromNavigationRestrictions(entitySet, targetEntitySet, parentNavigationPath) {
|
|
94
|
+
const sortRestrictionsFromNavigationRestrictions = [];
|
|
25
95
|
entitySet.annotations.Capabilities?.NavigationRestrictions?.RestrictedProperties?.forEach(navigationRestriction => {
|
|
26
|
-
//
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
96
|
+
// if containment enabled get only the sort restrictions of the related navigation path
|
|
97
|
+
if (parentNavigationPath && parentNavigationPath !== navigationRestriction?.NavigationProperty?.value) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (navigationRestriction?.SortRestrictions?.Sortable === false) {
|
|
101
|
+
// find correct navigation property
|
|
102
|
+
const navigationProperty = entitySet.entityType.navigationProperties.by_name(navigationRestriction?.NavigationProperty?.value);
|
|
103
|
+
if (navigationProperty) {
|
|
104
|
+
// add all properties of the navigation property to the nonSortableProperties
|
|
105
|
+
if (parentNavigationPath) {
|
|
106
|
+
sortRestrictionsFromNavigationRestrictions.push(...navigationProperty.targetType.entityProperties.map(property => property.name));
|
|
107
|
+
} else {
|
|
108
|
+
sortRestrictionsFromNavigationRestrictions.push(...navigationProperty.targetType.entityProperties.map(property => `${navigationProperty.name}/${property.name}`));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
} else {
|
|
112
|
+
const nonSortableNavigationProperties = navigationRestriction?.SortRestrictions?.NonSortableProperties?.map(property => {
|
|
113
|
+
// We need the property name from the navigation restriction definition when the targetEntitySet is available
|
|
114
|
+
if ((targetEntitySet || parentNavigationPath) && property.$target?.name) {
|
|
115
|
+
return property.$target?.name;
|
|
116
|
+
} else {
|
|
117
|
+
// leave the property path unchanged (it is relative to the annotation target!)
|
|
118
|
+
return property.value;
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
if (nonSortableNavigationProperties?.length) {
|
|
122
|
+
sortRestrictionsFromNavigationRestrictions.push(...nonSortableNavigationProperties);
|
|
123
|
+
}
|
|
30
124
|
}
|
|
31
125
|
});
|
|
32
|
-
return
|
|
33
|
-
}
|
|
126
|
+
return sortRestrictionsFromNavigationRestrictions;
|
|
127
|
+
}
|
|
34
128
|
|
|
35
129
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* @param
|
|
39
|
-
* @
|
|
130
|
+
* Gets the sort restrictions directly from the entity set.
|
|
131
|
+
* @param entitySet Entity set to be analyzed.
|
|
132
|
+
* @param targetEntitySet The target entity set, if available. Not used in the case of containment.
|
|
133
|
+
* @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
|
|
134
|
+
* @returns Array containing the property names of all non-sortable properties.
|
|
40
135
|
*/
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
let nonSortableProperties = [];
|
|
44
|
-
// Check annotations for main entity
|
|
136
|
+
function getDirectSortRestrictions(entitySet, targetEntitySet, parentNavigationPath) {
|
|
137
|
+
const sortRestrictionsOnEntitySet = [];
|
|
45
138
|
if (entitySet.annotations.Capabilities?.SortRestrictions?.Sortable === false) {
|
|
46
|
-
// add all properties of the entity to the nonSortableProperties
|
|
47
|
-
|
|
139
|
+
// add all properties of the entity set to the nonSortableProperties
|
|
140
|
+
sortRestrictionsOnEntitySet.push(...entitySet.entityType.entityProperties.map(property => property.name));
|
|
48
141
|
} else {
|
|
49
|
-
nonSortableProperties =
|
|
142
|
+
const nonSortableProperties = [];
|
|
143
|
+
entitySet.annotations.Capabilities?.SortRestrictions?.NonSortableProperties?.forEach(property => {
|
|
144
|
+
if (parentNavigationPath && !property.value.includes(parentNavigationPath)) {
|
|
145
|
+
// skip the non sortable property if it doesn't belong to the parent navigation path in case of containment
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if ((targetEntitySet || parentNavigationPath) && property.$target?.name) {
|
|
149
|
+
nonSortableProperties.push(property.$target?.name);
|
|
150
|
+
} else {
|
|
151
|
+
nonSortableProperties.push(property.value);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
if (nonSortableProperties?.length) {
|
|
155
|
+
sortRestrictionsOnEntitySet.push(...nonSortableProperties);
|
|
156
|
+
}
|
|
50
157
|
}
|
|
51
|
-
|
|
158
|
+
return sortRestrictionsOnEntitySet;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Gets the filter restrictions from the navigation restrictions.
|
|
163
|
+
* @param entitySet Entity set to be analyzed.
|
|
164
|
+
* @param targetEntitySet The target entity set, if available. Not used in the case of containment.
|
|
165
|
+
* @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
|
|
166
|
+
* @returns Array containing the property names of all non-filterable properties from navigation restrictions.
|
|
167
|
+
*/
|
|
168
|
+
function getFilterRestrictionsfromNavigationRestrictions(entitySet, targetEntitySet, parentNavigationPath) {
|
|
169
|
+
const filterRestrictionsFromNavigationRestrictions = [];
|
|
52
170
|
entitySet.annotations.Capabilities?.NavigationRestrictions?.RestrictedProperties?.forEach(navigationRestriction => {
|
|
53
|
-
if
|
|
171
|
+
// if containment enabled get only the filter restrictions of the related navigation path
|
|
172
|
+
if (parentNavigationPath && parentNavigationPath !== navigationRestriction?.NavigationProperty?.value) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (navigationRestriction?.FilterRestrictions?.Filterable === false) {
|
|
54
176
|
// find correct navigation property
|
|
55
177
|
const navigationProperty = entitySet.entityType.navigationProperties.by_name(navigationRestriction?.NavigationProperty?.value);
|
|
56
178
|
if (navigationProperty) {
|
|
57
|
-
// add all properties of the navigation property to the
|
|
58
|
-
|
|
179
|
+
// add all properties of the navigation property to the nonFilterableProperties
|
|
180
|
+
if (parentNavigationPath) {
|
|
181
|
+
filterRestrictionsFromNavigationRestrictions.push(...navigationProperty.targetType.entityProperties.map(property => property.name));
|
|
182
|
+
} else {
|
|
183
|
+
filterRestrictionsFromNavigationRestrictions.push(...navigationProperty.targetType.entityProperties.map(property => `${navigationProperty.name}/${property.name}`));
|
|
184
|
+
}
|
|
59
185
|
}
|
|
60
186
|
} else {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
187
|
+
const nonFilterableNavigationProperties = navigationRestriction?.FilterRestrictions?.NonFilterableProperties?.map(property => {
|
|
188
|
+
// we need the property name from the navigation restriction definition when the targetEntitySet is available and it's not a containment scenario
|
|
189
|
+
if ((targetEntitySet || parentNavigationPath) && property.$target?.name) {
|
|
190
|
+
return property.$target?.name;
|
|
191
|
+
} else {
|
|
192
|
+
// leave the property path unchanged (it is relative to the annotation target!)
|
|
193
|
+
return property.value;
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
if (nonFilterableNavigationProperties?.length) {
|
|
197
|
+
filterRestrictionsFromNavigationRestrictions.push(...nonFilterableNavigationProperties);
|
|
65
198
|
}
|
|
66
199
|
}
|
|
67
200
|
});
|
|
68
|
-
return
|
|
69
|
-
}
|
|
201
|
+
return filterRestrictionsFromNavigationRestrictions;
|
|
202
|
+
}
|
|
70
203
|
|
|
71
204
|
/**
|
|
72
|
-
* Gets
|
|
73
|
-
*
|
|
74
|
-
* @param
|
|
75
|
-
* @
|
|
205
|
+
* Gets the filter restrictions directly from the entity set.
|
|
206
|
+
* @param entitySet Entity set to be analyzed.
|
|
207
|
+
* @param targetEntitySet The target entity set, if available. Not used in the case of containment.
|
|
208
|
+
* @param parentNavigationPath The parent navigation path, specific for containment scenario to get the correct property based on the parent navigation path.
|
|
209
|
+
* @returns Array containing the property names of all non-filterable properties.
|
|
76
210
|
*/
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
};
|
|
83
|
-
// Check annotations for main entity
|
|
84
|
-
if (!isEntitySet(entitySet)) {
|
|
85
|
-
return propertiesRestrictions;
|
|
211
|
+
function getDirectFilterRestrictions(entitySet, targetEntitySet, parentNavigationPath) {
|
|
212
|
+
const filterRestrictionsOnEntitySet = [];
|
|
213
|
+
if (entitySet.annotations.Capabilities?.FilterRestrictions?.Filterable === false) {
|
|
214
|
+
// add all properties of the entity set to the nonFilterableProperties
|
|
215
|
+
filterRestrictionsOnEntitySet.push(...entitySet.entityType.entityProperties.map(property => property.name));
|
|
86
216
|
} else {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
217
|
+
const nonFilterableProperties = [];
|
|
218
|
+
entitySet.annotations.Capabilities?.FilterRestrictions?.NonFilterableProperties?.forEach(property => {
|
|
219
|
+
if (parentNavigationPath && !property.value.includes(parentNavigationPath)) {
|
|
220
|
+
// skip the non filterable property if it doesn't belong to the parent navigation path in case of containment
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
if ((targetEntitySet || parentNavigationPath) && property.$target?.name) {
|
|
224
|
+
nonFilterableProperties.push(property.$target?.name);
|
|
225
|
+
} else {
|
|
226
|
+
nonFilterableProperties.push(property.value);
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
if (nonFilterableProperties?.length) {
|
|
230
|
+
filterRestrictionsOnEntitySet.push(...nonFilterableProperties);
|
|
231
|
+
}
|
|
92
232
|
}
|
|
93
|
-
|
|
94
|
-
|
|
233
|
+
return filterRestrictionsOnEntitySet;
|
|
234
|
+
}
|
|
95
235
|
return _exports;
|
|
96
236
|
}, false);
|
|
97
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXROb25GaWx0ZXJhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsImVudGl0eVNldCIsIm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiYW5ub3RhdGlvbnMiLCJDYXBhYmlsaXRpZXMiLCJGaWx0ZXJSZXN0cmljdGlvbnMiLCJGaWx0ZXJhYmxlIiwicHVzaCIsImVudGl0eVR5cGUiLCJlbnRpdHlQcm9wZXJ0aWVzIiwibWFwIiwicHJvcGVydHkiLCJuYW1lIiwiTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMiLCJ2YWx1ZSIsIk5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJSZXN0cmljdGVkUHJvcGVydGllcyIsImZvckVhY2giLCJuYXZpZ2F0aW9uUmVzdHJpY3Rpb24iLCJub25GaWx0ZXJhYmxlTmF2aWdhdGlvblByb3BlcnRpZXMiLCJfZXhwb3J0cyIsImdldE5vblNvcnRhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsIm5vblNvcnRhYmxlUHJvcGVydGllcyIsIlNvcnRSZXN0cmljdGlvbnMiLCJTb3J0YWJsZSIsIk5vblNvcnRhYmxlUHJvcGVydGllcyIsIm5hdmlnYXRpb25Qcm9wZXJ0eSIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiYnlfbmFtZSIsIk5hdmlnYXRpb25Qcm9wZXJ0eSIsInRhcmdldFR5cGUiLCJub25Tb3J0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiZ2V0UmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzIiwicHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsImlzRW50aXR5U2V0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJFbnRpdHlTZXRIZWxwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBFbnRpdHlTZXQsIFNpbmdsZXRvbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHsgaXNFbnRpdHlTZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5cbmV4cG9ydCB0eXBlIFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IHtcblx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0bm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IHN0cmluZ1tdO1xufTtcblxudHlwZSBjdXJyZW50RW50aXR5U2V0ID0gRW50aXR5U2V0IHwgU2luZ2xldG9uIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEdldHMgTm9uRmlsdGVyYWJsZVByb3BlcnRpZXMgb24gRmlsdGVyUmVzdHJpY3Rpb25zIG9mIHRoZSBtYWluIGVudGl0eS5cbiAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5IHNldCB0byBiZSBhbmFseXplZFxuICogQHJldHVybnMgQXJyYXkgY29udGFpbmluZyB0aGUgcHJvcGVydHkgbmFtZXMgb2YgYWxsIG5vbi1maWx0ZXJhYmxlIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zID0gZnVuY3Rpb24gKGVudGl0eVNldDogRW50aXR5U2V0KTogc3RyaW5nW10ge1xuXHRsZXQgbm9uRmlsdGVyYWJsZVByb3BlcnRpZXMgPSBbXTtcblx0aWYgKGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlclJlc3RyaWN0aW9ucz8uRmlsdGVyYWJsZSA9PT0gZmFsc2UpIHtcblx0XHQvLyBhZGQgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSB0byB0aGUgbm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcblx0XHRub25GaWx0ZXJhYmxlUHJvcGVydGllcy5wdXNoKC4uLmVudGl0eVNldC5lbnRpdHlUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSkpO1xuXHR9IGVsc2Uge1xuXHRcdG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzID1cblx0XHRcdGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlclJlc3RyaWN0aW9ucz8uTm9uRmlsdGVyYWJsZVByb3BlcnRpZXM/Lm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5LnZhbHVlKSB8fCBbXTtcblx0fVxuXG5cdC8vIENoZWNrIGZvciBldmVyeSBuYXZpZ2F0aW9uUmVzdHJpY3Rpb24gaWYgaXQgaGFzIEZpbHRlclJlc3RyaWN0aW9uc1xuXHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zPy5SZXN0cmljdGVkUHJvcGVydGllcz8uZm9yRWFjaCgobmF2aWdhdGlvblJlc3RyaWN0aW9uKSA9PiB7XG5cdFx0Ly8gbGVhdmUgdGhlIHByb3BlcnR5IHBhdGggdW5jaGFuZ2VkIChpdCBpcyByZWxhdGl2ZSB0byB0aGUgYW5ub3RhdGlvbiB0YXJnZXQhKVxuXHRcdGNvbnN0IG5vbkZpbHRlcmFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyA9IG5hdmlnYXRpb25SZXN0cmljdGlvbj8uRmlsdGVyUmVzdHJpY3Rpb25zPy5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcz8ubWFwKFxuXHRcdFx0KHByb3BlcnR5KSA9PiBwcm9wZXJ0eS52YWx1ZVxuXHRcdCk7XG5cdFx0aWYgKG5vbkZpbHRlcmFibGVOYXZpZ2F0aW9uUHJvcGVydGllcykge1xuXHRcdFx0bm9uRmlsdGVyYWJsZVByb3BlcnRpZXMucHVzaCguLi5ub25GaWx0ZXJhYmxlTmF2aWdhdGlvblByb3BlcnRpZXMpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBub25GaWx0ZXJhYmxlUHJvcGVydGllcztcbn07XG5cbi8qKlxuICogUmVhZHMgYWxsIFNvcnRSZXN0cmljdGlvbnMgb2YgdGhlIG1haW4gZW50aXR5IGFuZCB0aGUgKGZpcnN0IGxldmVsKSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbiAqIFRoaXMgZG9lcyBub3Qgd29yayBmb3IgbW9yZSB0aGFuIG9uZSBsZXZlbCBvZiBuYXZpZ2F0aW9uLlxuICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHkgc2V0IHRvIGJlIGFuYWx5emVkXG4gKiBAcmV0dXJucyBBcnJheSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbGwgbm9uLXNvcnRhYmxlIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE5vblNvcnRhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyA9IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IEVudGl0eVNldCk6IHN0cmluZ1tdIHtcblx0bGV0IG5vblNvcnRhYmxlUHJvcGVydGllcyA9IFtdO1xuXHQvLyBDaGVjayBhbm5vdGF0aW9ucyBmb3IgbWFpbiBlbnRpdHlcblx0aWYgKGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LlNvcnRSZXN0cmljdGlvbnM/LlNvcnRhYmxlID09PSBmYWxzZSkge1xuXHRcdC8vIGFkZCBhbGwgcHJvcGVydGllcyBvZiB0aGUgZW50aXR5IHRvIHRoZSBub25Tb3J0YWJsZVByb3BlcnRpZXNcblx0XHRub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaCguLi5lbnRpdHlTZXQuZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpKTtcblx0fSBlbHNlIHtcblx0XHRub25Tb3J0YWJsZVByb3BlcnRpZXMgPVxuXHRcdFx0ZW50aXR5U2V0LmFubm90YXRpb25zLkNhcGFiaWxpdGllcz8uU29ydFJlc3RyaWN0aW9ucz8uTm9uU29ydGFibGVQcm9wZXJ0aWVzPy5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS52YWx1ZSkgfHwgW107XG5cdH1cblx0Ly8gQ2hlY2sgZm9yIGV2ZXJ5IG5hdmlnYXRpb25SZXN0cmljdGlvbiBpZiBpdCBoYXMgc29ydFJlc3RyaWN0aW9uc1xuXHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zPy5SZXN0cmljdGVkUHJvcGVydGllcz8uZm9yRWFjaCgobmF2aWdhdGlvblJlc3RyaWN0aW9uKSA9PiB7XG5cdFx0aWYgKG5hdmlnYXRpb25SZXN0cmljdGlvbj8uU29ydFJlc3RyaWN0aW9ucz8uU29ydGFibGUgPT09IGZhbHNlKSB7XG5cdFx0XHQvLyBmaW5kIGNvcnJlY3QgbmF2aWdhdGlvbiBwcm9wZXJ0eVxuXHRcdFx0Y29uc3QgbmF2aWdhdGlvblByb3BlcnR5ID0gZW50aXR5U2V0LmVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuYnlfbmFtZShuYXZpZ2F0aW9uUmVzdHJpY3Rpb24/Lk5hdmlnYXRpb25Qcm9wZXJ0eT8udmFsdWUpO1xuXHRcdFx0aWYgKG5hdmlnYXRpb25Qcm9wZXJ0eSkge1xuXHRcdFx0XHQvLyBhZGQgYWxsIHByb3BlcnRpZXMgb2YgdGhlIG5hdmlnYXRpb24gcHJvcGVydHkgdG8gdGhlIG5vblNvcnRhYmxlUHJvcGVydGllc1xuXHRcdFx0XHRub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaChcblx0XHRcdFx0XHQuLi5uYXZpZ2F0aW9uUHJvcGVydHkudGFyZ2V0VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IGAke25hdmlnYXRpb25Qcm9wZXJ0eS5uYW1lfS8ke3Byb3BlcnR5Lm5hbWV9YClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gbGVhdmUgdGhlIHByb3BlcnR5IHBhdGggdW5jaGFuZ2VkIChpdCBpcyByZWxhdGl2ZSB0byB0aGUgYW5ub3RhdGlvbiB0YXJnZXQhKVxuXHRcdFx0Y29uc3Qgbm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyA9IG5hdmlnYXRpb25SZXN0cmljdGlvbj8uU29ydFJlc3RyaWN0aW9ucz8uTm9uU29ydGFibGVQcm9wZXJ0aWVzPy5tYXAoXG5cdFx0XHRcdChwcm9wZXJ0eSkgPT4gcHJvcGVydHkudmFsdWVcblx0XHRcdCk7XG5cdFx0XHRpZiAobm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcykge1xuXHRcdFx0XHRub25Tb3J0YWJsZVByb3BlcnRpZXMucHVzaCguLi5ub25Tb3J0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gbm9uU29ydGFibGVQcm9wZXJ0aWVzO1xufTtcblxuLyoqXG4gKiBHZXRzIGFsbCBTb3J0UmVzdHJpY3Rpb25zIGFuZCBGaWx0ZXJSZXN0cmljdGlvbiBvZiB0aGUgbWFpbiBlbnRpdHkgYW5kIHRoZSAoZmlyc3QgbGV2ZWwpIG5hdmlnYXRpb24gcmVzdHJpY3Rpb25zLlxuICogVGhpcyBkb2VzIG5vdCB3b3JrIGZvciBtb3JlIHRoYW4gb25lIGxldmVsIG9mIG5hdmlnYXRpb24uXG4gKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eSBzZXQgdG8gYmUgYW5hbHl6ZWRcbiAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIGFsbCBwcm9wZXJ0eSBuYW1lcyB3aXRoIHJlc3RyaWN0aW9ucyBzZXBhcmF0ZWQgYnkgc29ydGFibGUgYW5kIGZpbHRlcmFibGUgY2FwYWJpbGl0aWVzXG4gKi9cblxuZXhwb3J0IGNvbnN0IGdldFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IGZ1bmN0aW9uIChlbnRpdHlTZXQ6IGN1cnJlbnRFbnRpdHlTZXQpOiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXMge1xuXHRsZXQgcHJvcGVydGllc1Jlc3RyaWN0aW9uczogUmVzdHJpY3Rpb25zT25Qcm9wZXJ0aWVzID0geyBub25Tb3J0YWJsZVByb3BlcnRpZXM6IFtdLCBub25GaWx0ZXJhYmxlUHJvcGVydGllczogW10gfTtcblx0Ly8gQ2hlY2sgYW5ub3RhdGlvbnMgZm9yIG1haW4gZW50aXR5XG5cdGlmICghaXNFbnRpdHlTZXQoZW50aXR5U2V0KSkge1xuXHRcdHJldHVybiBwcm9wZXJ0aWVzUmVzdHJpY3Rpb25zO1xuXHR9IGVsc2Uge1xuXHRcdHByb3BlcnRpZXNSZXN0cmljdGlvbnMgPSB7XG5cdFx0XHRub25Tb3J0YWJsZVByb3BlcnRpZXM6IGdldE5vblNvcnRhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyhlbnRpdHlTZXQpLFxuXHRcdFx0bm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IGdldE5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zKGVudGl0eVNldClcblx0XHR9O1xuXHRcdHJldHVybiBwcm9wZXJ0aWVzUmVzdHJpY3Rpb25zO1xuXHR9XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7RUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sTUFBTUEsc0NBQXNDLEdBQUcsU0FBQUEsQ0FBVUMsU0FBb0IsRUFBWTtJQUMvRixJQUFJQyx1QkFBdUIsR0FBRyxFQUFFO0lBQ2hDLElBQUlELFNBQVMsQ0FBQ0UsV0FBVyxDQUFDQyxZQUFZLEVBQUVDLGtCQUFrQixFQUFFQyxVQUFVLEtBQUssS0FBSyxFQUFFO01BQ2pGO01BQ0FKLHVCQUF1QixDQUFDSyxJQUFJLENBQUMsR0FBR04sU0FBUyxDQUFDTyxVQUFVLENBQUNDLGdCQUFnQixDQUFDQyxHQUFHLENBQUVDLFFBQVEsSUFBS0EsUUFBUSxDQUFDQyxJQUFJLENBQUMsQ0FBQztJQUN4RyxDQUFDLE1BQU07TUFDTlYsdUJBQXVCLEdBQ3RCRCxTQUFTLENBQUNFLFdBQVcsQ0FBQ0MsWUFBWSxFQUFFQyxrQkFBa0IsRUFBRVEsdUJBQXVCLEVBQUVILEdBQUcsQ0FBRUMsUUFBUSxJQUFLQSxRQUFRLENBQUNHLEtBQUssQ0FBQyxJQUFJLEVBQUU7SUFDMUg7O0lBRUE7SUFDQWIsU0FBUyxDQUFDRSxXQUFXLENBQUNDLFlBQVksRUFBRVcsc0JBQXNCLEVBQUVDLG9CQUFvQixFQUFFQyxPQUFPLENBQUVDLHFCQUFxQixJQUFLO01BQ3BIO01BQ0EsTUFBTUMsaUNBQWlDLEdBQUdELHFCQUFxQixFQUFFYixrQkFBa0IsRUFBRVEsdUJBQXVCLEVBQUVILEdBQUcsQ0FDL0dDLFFBQVEsSUFBS0EsUUFBUSxDQUFDRyxLQUN4QixDQUFDO01BQ0QsSUFBSUssaUNBQWlDLEVBQUU7UUFDdENqQix1QkFBdUIsQ0FBQ0ssSUFBSSxDQUFD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
|
|
237
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXROb25GaWx0ZXJhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsImVudGl0eVNldCIsInRhcmdldEVudGl0eVNldCIsInBhcmVudE5hdmlnYXRpb25QYXRoIiwiZmlsdGVyUmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJnZXRGaWx0ZXJSZXN0cmljdGlvbnNmcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyIsImRpcmVjdEZpbHRlclJlc3RyaWN0aW9ucyIsImdldERpcmVjdEZpbHRlclJlc3RyaWN0aW9ucyIsIkFycmF5IiwiZnJvbSIsIlNldCIsIl9leHBvcnRzIiwiZ2V0Tm9uU29ydGFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zIiwic29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiZ2V0U29ydFJlc3RyaWN0aW9uc2Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zIiwiZGlyZWN0U29ydFJlc3RyaWN0aW9ucyIsImdldERpcmVjdFNvcnRSZXN0cmljdGlvbnMiLCJnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMiLCJjb252ZXJ0ZXJDb250ZXh0IiwicHJvcGVydGllc1Jlc3RyaWN0aW9ucyIsIm5vblNvcnRhYmxlUHJvcGVydGllcyIsIm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGgiLCJwYXJlbnRFbnRpdHlTZXQiLCJnZXRUYXJnZXRFbnRpdHlTZXRJbmZvIiwiaXNFbnRpdHlTZXQiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJhbm5vdGF0aW9ucyIsIkNhcGFiaWxpdGllcyIsIk5hdmlnYXRpb25SZXN0cmljdGlvbnMiLCJSZXN0cmljdGVkUHJvcGVydGllcyIsImZvckVhY2giLCJuYXZpZ2F0aW9uUmVzdHJpY3Rpb24iLCJOYXZpZ2F0aW9uUHJvcGVydHkiLCJ2YWx1ZSIsIlNvcnRSZXN0cmljdGlvbnMiLCJTb3J0YWJsZSIsIm5hdmlnYXRpb25Qcm9wZXJ0eSIsImVudGl0eVR5cGUiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsImJ5X25hbWUiLCJwdXNoIiwidGFyZ2V0VHlwZSIsImVudGl0eVByb3BlcnRpZXMiLCJtYXAiLCJwcm9wZXJ0eSIsIm5hbWUiLCJub25Tb3J0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiTm9uU29ydGFibGVQcm9wZXJ0aWVzIiwiJHRhcmdldCIsInNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldCIsImluY2x1ZGVzIiwiRmlsdGVyUmVzdHJpY3Rpb25zIiwiRmlsdGVyYWJsZSIsIm5vbkZpbHRlcmFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyIsIk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzIiwiZmlsdGVyUmVzdHJpY3Rpb25zT25FbnRpdHlTZXQiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkVudGl0eVNldEhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVudGl0eVNldCB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBpc0VudGl0eVNldCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB7IGdldFRhcmdldEVudGl0eVNldEluZm8gfSBmcm9tIFwiLi9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5cbmV4cG9ydCB0eXBlIFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyA9IHtcblx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0bm9uRmlsdGVyYWJsZVByb3BlcnRpZXM6IHN0cmluZ1tdO1xufTtcblxuLyoqXG4gKiBSZWFkcyBhbGwgRmlsdGVyUmVzdHJpY3Rpb25zIG9mIHRoZSBtYWluIGVudGl0eSBhbmQgdGhlIG5hdmlnYXRpb24gcmVzdHJpY3Rpb25zLlxuICogV2UgZ2V0IHRoZSByZXN0cmljdGlvbnMgZmlyc3Qgb24gdGhlIG5hdmlnYXRpb24gcHJvcGVydHkgKG1vc3QgcHJlY2lzZSBkZWZpbml0aW9uKSwgYW5kIGlmIG5vdCBhdmFpbGFibGUsIHRoZW4gd2UgZ2V0IHRoZSByZXN0cmljdGlvbnMgb24gdGhlIGVudGl0eVNldC5cbiAqIEluIGNhc2Ugb2YgY29udGFpbm1lbnQsIHdlIG9ubHkgZ2V0IHRoZSByZXN0cmljdGlvbnMgb24gdGhlIG5hdmlnYXRpb24gcHJvcGVydHkgb2YgdGhlIHBhcmVudCBlbnRpdHlTZXQuXG4gKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eSBzZXQgdG8gYmUgYW5hbHl6ZWRcbiAqIEBwYXJhbSB0YXJnZXRFbnRpdHlTZXQgVGhlIHRhcmdldCBlbnRpdHkgc2V0LCBpZiBhdmFpbGFibGUuICBOb3QgdXNlZCBpbiB0aGUgY2FzZSBvZiBjb250YWlubWVudC5cbiAqIEBwYXJhbSBwYXJlbnROYXZpZ2F0aW9uUGF0aCBUaGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aCwgc3BlY2lmaWMgZm9yIGNvbnRhaW5tZW50IHNjZW5hcmlvIHRvIGdldCB0aGUgY29ycmVjdCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aC5cbiAqIEByZXR1cm5zIEFycmF5IGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5IG5hbWVzIG9mIGFsbCBub24tZmlsdGVyYWJsZSBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBjb25zdCBnZXROb25GaWx0ZXJhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyA9IGZ1bmN0aW9uIChcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdHRhcmdldEVudGl0eVNldD86IEVudGl0eVNldCxcblx0cGFyZW50TmF2aWdhdGlvblBhdGg/OiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcblx0Y29uc3QgZmlsdGVyUmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMgPSBnZXRGaWx0ZXJSZXN0cmljdGlvbnNmcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyhcblx0XHRlbnRpdHlTZXQsXG5cdFx0dGFyZ2V0RW50aXR5U2V0LFxuXHRcdHBhcmVudE5hdmlnYXRpb25QYXRoXG5cdCk7XG5cdGNvbnN0IGRpcmVjdEZpbHRlclJlc3RyaWN0aW9ucyA9IGdldERpcmVjdEZpbHRlclJlc3RyaWN0aW9ucyhlbnRpdHlTZXQsIHRhcmdldEVudGl0eVNldCwgcGFyZW50TmF2aWdhdGlvblBhdGgpO1xuXHQvLyBNZXJnZSB0d28gZmlsdGVyIHJlc3RyaWN0aW9ucyBmb3VuZCBvbiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBhbmQgZGlyZWN0bHkgZnJvbSB0aGUgZW50aXR5IHNldFxuXHRyZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5maWx0ZXJSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucywgLi4uZGlyZWN0RmlsdGVyUmVzdHJpY3Rpb25zXSkpO1xufTtcblxuLyoqXG4gKiBSZWFkcyBhbGwgU29ydFJlc3RyaWN0aW9ucyBvZiB0aGUgbWFpbiBlbnRpdHkgYW5kIHRoZSBuYXZpZ2F0aW9uIHJlc3RyaWN0aW9ucy5cbiAqIFdlIHJldHJpZXZlIHRoZSByZXN0cmljdGlvbnMgZmlyc3Qgb24gdGhlIG5hdmlnYXRpb24gcHJvcGVydHkgKG1vc3QgcHJlY2lzZSBkZWZpbml0aW9uKSwgYW5kIGlmIG5vdCBhdmFpbGFibGUsIHRoZW4gd2UgZ2V0IHRoZSByZXN0cmljdGlvbnMgb24gdGhlIGVudGl0eVNldFxuICogSW4gY2FzZSBvZiBjb250YWlubWVudCwgd2Ugb25seSBnZXQgdGhlIHJlc3RyaWN0aW9ucyBvbiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSBvZiB0aGUgcGFyZW50IGVudGl0eVNldC5cbiAqIEBwYXJhbSBlbnRpdHlTZXQgRW50aXR5IHNldCB0byBiZSBhbmFseXplZFxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gTm90IHVzZWQgaW4gdGhlIGNhc2Ugb2YgY29udGFpbm1lbnQuXG4gKiBAcGFyYW0gcGFyZW50TmF2aWdhdGlvblBhdGggVGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGgsIHNwZWNpZmljIGZvciBjb250YWlubWVudCBzY2VuYXJpbyB0byBnZXQgdGhlIGNvcnJlY3QgcHJvcGVydHkgYmFzZWQgb24gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGguXG4gKiBAcmV0dXJucyBBcnJheSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbGwgbm9uLXNvcnRhYmxlIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE5vblNvcnRhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyA9IGZ1bmN0aW9uIChcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdHRhcmdldEVudGl0eVNldD86IEVudGl0eVNldCxcblx0cGFyZW50TmF2aWdhdGlvblBhdGg/OiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcblx0Y29uc3Qgc29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zID0gZ2V0U29ydFJlc3RyaWN0aW9uc2Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zKFxuXHRcdGVudGl0eVNldCxcblx0XHR0YXJnZXRFbnRpdHlTZXQsXG5cdFx0cGFyZW50TmF2aWdhdGlvblBhdGhcblx0KTtcblx0Y29uc3QgZGlyZWN0U29ydFJlc3RyaWN0aW9ucyA9IGdldERpcmVjdFNvcnRSZXN0cmljdGlvbnMoZW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoKTtcblx0Ly8gTWVyZ2UgdHdvIHNvcnQgcmVzdHJpY3Rpb25zIGZvdW5kIG9uIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IGFuZCBkaXJlY3RseSBmcm9tIHRoZSBlbnRpdHkgc2V0XG5cdHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLnNvcnRSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucywgLi4uZGlyZWN0U29ydFJlc3RyaWN0aW9uc10pKTtcbn07XG5cbi8qKlxuICogR2V0cyBhbGwgU29ydFJlc3RyaWN0aW9ucyBhbmQgRmlsdGVyUmVzdHJpY3Rpb25zIGZvciBhIGdpdmVuIGNvbnRleHQuXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHQuXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBhbGwgcHJvcGVydHkgbmFtZXMgb2YgcmVzdHJpY3Rpb25zIHNlcGFyYXRlZCBieSBzb3J0YWJsZSBhbmQgZmlsdGVyYWJsZSBjYXBhYmlsaXRpZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRSZXN0cmljdGlvbnNPblByb3BlcnRpZXMgPSBmdW5jdGlvbiAoY29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCk6IFJlc3RyaWN0aW9uc09uUHJvcGVydGllcyB7XG5cdGxldCBwcm9wZXJ0aWVzUmVzdHJpY3Rpb25zOiBSZXN0cmljdGlvbnNPblByb3BlcnRpZXMgPSB7IG5vblNvcnRhYmxlUHJvcGVydGllczogW10sIG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBbXSB9O1xuXHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXREYXRhTW9kZWxPYmplY3RQYXRoKCk7XG5cdGNvbnN0IHsgcGFyZW50RW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoIH0gPSBnZXRUYXJnZXRFbnRpdHlTZXRJbmZvKGRhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRpZiAoaXNFbnRpdHlTZXQodGFyZ2V0RW50aXR5U2V0KSkge1xuXHRcdGlmIChwYXJlbnRFbnRpdHlTZXQgJiYgaXNFbnRpdHlTZXQocGFyZW50RW50aXR5U2V0KSkge1xuXHRcdFx0cHJvcGVydGllc1Jlc3RyaWN0aW9ucyA9IHtcblx0XHRcdFx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBnZXROb25Tb3J0YWJsZVByb3BlcnRpZXNSZXN0cmljdGlvbnMocGFyZW50RW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQpLFxuXHRcdFx0XHRub25GaWx0ZXJhYmxlUHJvcGVydGllczogZ2V0Tm9uRmlsdGVyYWJsZVByb3BlcnRpZXNSZXN0cmljdGlvbnMocGFyZW50RW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQpXG5cdFx0XHR9O1xuXHRcdFx0aWYgKHByb3BlcnRpZXNSZXN0cmljdGlvbnMubm9uU29ydGFibGVQcm9wZXJ0aWVzLmxlbmd0aCB8fCBwcm9wZXJ0aWVzUmVzdHJpY3Rpb25zLm5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gcHJvcGVydGllc1Jlc3RyaWN0aW9ucztcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5vblNvcnRhYmxlUHJvcGVydGllczogZ2V0Tm9uU29ydGFibGVQcm9wZXJ0aWVzUmVzdHJpY3Rpb25zKHRhcmdldEVudGl0eVNldCksXG5cdFx0XHRub25GaWx0ZXJhYmxlUHJvcGVydGllczogZ2V0Tm9uRmlsdGVyYWJsZVByb3BlcnRpZXNSZXN0cmljdGlvbnModGFyZ2V0RW50aXR5U2V0KVxuXHRcdH07XG5cdH0gZWxzZSBpZiAocGFyZW50RW50aXR5U2V0ICYmIGlzRW50aXR5U2V0KHBhcmVudEVudGl0eVNldCkpIHtcblx0XHQvLyBGaW5kIHRoZSByZXN0cmljdGlvbnMgb24gdGhlIHBhcmVudCBlbnRpdHkgc2V0LCB0aGlzIGFwcGxpZXMgYWxzbyBmb3IgY29udGFpbm1lbnQgYXMgdGhlcmUgaXNuJ3QgYW4gZW50aXR5IHNldCBvbiB0aGUgT1Bcblx0XHRyZXR1cm4ge1xuXHRcdFx0bm9uU29ydGFibGVQcm9wZXJ0aWVzOiBnZXROb25Tb3J0YWJsZVByb3BlcnRpZXNSZXN0cmljdGlvbnMocGFyZW50RW50aXR5U2V0LCB1bmRlZmluZWQsIHBhcmVudE5hdmlnYXRpb25QYXRoKSxcblx0XHRcdG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzOiBnZXROb25GaWx0ZXJhYmxlUHJvcGVydGllc1Jlc3RyaWN0aW9ucyhwYXJlbnRFbnRpdHlTZXQsIHVuZGVmaW5lZCwgcGFyZW50TmF2aWdhdGlvblBhdGgpXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gcHJvcGVydGllc1Jlc3RyaWN0aW9ucztcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgc29ydCByZXN0cmljdGlvbnMgZnJvbSB0aGUgbmF2aWdhdGlvbiByZXN0cmljdGlvbnMuXG4gKiBAcGFyYW0gZW50aXR5U2V0IEVudGl0eSBzZXQgdG8gYmUgYW5hbHl6ZWQuXG4gKiBAcGFyYW0gdGFyZ2V0RW50aXR5U2V0IFRoZSB0YXJnZXQgZW50aXR5IHNldCwgaWYgYXZhaWxhYmxlLiBOb3QgdXNlZCBpbiB0aGUgY2FzZSBvZiBjb250YWlubWVudC5cbiAqIEBwYXJhbSBwYXJlbnROYXZpZ2F0aW9uUGF0aCBUaGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aCwgc3BlY2lmaWMgZm9yIGNvbnRhaW5tZW50IHNjZW5hcmlvIHRvIGdldCB0aGUgY29ycmVjdCBwcm9wZXJ0eSBiYXNlZCBvbiB0aGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aC5cbiAqIEByZXR1cm5zIEFycmF5IGNvbnRhaW5pbmcgdGhlIHByb3BlcnR5IG5hbWVzIG9mIGFsbCBub24tc29ydGFibGUgcHJvcGVydGllcyBmcm9tIG5hdmlnYXRpb24gcmVzdHJpY3Rpb25zLlxuICovXG5mdW5jdGlvbiBnZXRTb3J0UmVzdHJpY3Rpb25zZnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMoXG5cdGVudGl0eVNldDogRW50aXR5U2V0LFxuXHR0YXJnZXRFbnRpdHlTZXQ/OiBFbnRpdHlTZXQsXG5cdHBhcmVudE5hdmlnYXRpb25QYXRoPzogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG5cdGNvbnN0IHNvcnRSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9uczogc3RyaW5nW10gPSBbXTtcblx0ZW50aXR5U2V0LmFubm90YXRpb25zLkNhcGFiaWxpdGllcz8uTmF2aWdhdGlvblJlc3RyaWN0aW9ucz8uUmVzdHJpY3RlZFByb3BlcnRpZXM/LmZvckVhY2goKG5hdmlnYXRpb25SZXN0cmljdGlvbikgPT4ge1xuXHRcdC8vIGlmIGNvbnRhaW5tZW50IGVuYWJsZWQgZ2V0IG9ubHkgdGhlIHNvcnQgcmVzdHJpY3Rpb25zIG9mIHRoZSByZWxhdGVkIG5hdmlnYXRpb24gcGF0aFxuXHRcdGlmIChwYXJlbnROYXZpZ2F0aW9uUGF0aCAmJiBwYXJlbnROYXZpZ2F0aW9uUGF0aCAhPT0gbmF2aWdhdGlvblJlc3RyaWN0aW9uPy5OYXZpZ2F0aW9uUHJvcGVydHk/LnZhbHVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChuYXZpZ2F0aW9uUmVzdHJpY3Rpb24/LlNvcnRSZXN0cmljdGlvbnM/LlNvcnRhYmxlID09PSBmYWxzZSkge1xuXHRcdFx0Ly8gZmluZCBjb3JyZWN0IG5hdmlnYXRpb24gcHJvcGVydHlcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25Qcm9wZXJ0eSA9IGVudGl0eVNldC5lbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmJ5X25hbWUobmF2aWdhdGlvblJlc3RyaWN0aW9uPy5OYXZpZ2F0aW9uUHJvcGVydHk/LnZhbHVlKTtcblx0XHRcdGlmIChuYXZpZ2F0aW9uUHJvcGVydHkpIHtcblx0XHRcdFx0Ly8gYWRkIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHRvIHRoZSBub25Tb3J0YWJsZVByb3BlcnRpZXNcblx0XHRcdFx0aWYgKHBhcmVudE5hdmlnYXRpb25QYXRoKSB7XG5cdFx0XHRcdFx0c29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0XHQuLi5uYXZpZ2F0aW9uUHJvcGVydHkudGFyZ2V0VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzb3J0UmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMucHVzaChcblx0XHRcdFx0XHRcdC4uLm5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gYCR7bmF2aWdhdGlvblByb3BlcnR5Lm5hbWV9LyR7cHJvcGVydHkubmFtZX1gKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3Qgbm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyA9IG5hdmlnYXRpb25SZXN0cmljdGlvbj8uU29ydFJlc3RyaWN0aW9ucz8uTm9uU29ydGFibGVQcm9wZXJ0aWVzPy5tYXAoKHByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdC8vIFdlIG5lZWQgdGhlIHByb3BlcnR5IG5hbWUgZnJvbSB0aGUgbmF2aWdhdGlvbiByZXN0cmljdGlvbiBkZWZpbml0aW9uIHdoZW4gdGhlIHRhcmdldEVudGl0eVNldCBpcyBhdmFpbGFibGVcblx0XHRcdFx0aWYgKCh0YXJnZXRFbnRpdHlTZXQgfHwgcGFyZW50TmF2aWdhdGlvblBhdGgpICYmIHByb3BlcnR5LiR0YXJnZXQ/Lm5hbWUpIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvcGVydHkuJHRhcmdldD8ubmFtZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBsZWF2ZSB0aGUgcHJvcGVydHkgcGF0aCB1bmNoYW5nZWQgKGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBhbm5vdGF0aW9uIHRhcmdldCEpXG5cdFx0XHRcdFx0cmV0dXJuIHByb3BlcnR5LnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGlmIChub25Tb3J0YWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzPy5sZW5ndGgpIHtcblx0XHRcdFx0c29ydFJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLnB1c2goLi4ubm9uU29ydGFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0cmV0dXJuIHNvcnRSZXN0cmljdGlvbnNGcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBzb3J0IHJlc3RyaWN0aW9ucyBkaXJlY3RseSBmcm9tIHRoZSBlbnRpdHkgc2V0LlxuICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHkgc2V0IHRvIGJlIGFuYWx5emVkLlxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gTm90IHVzZWQgaW4gdGhlIGNhc2Ugb2YgY29udGFpbm1lbnQuXG4gKiBAcGFyYW0gcGFyZW50TmF2aWdhdGlvblBhdGggVGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGgsIHNwZWNpZmljIGZvciBjb250YWlubWVudCBzY2VuYXJpbyB0byBnZXQgdGhlIGNvcnJlY3QgcHJvcGVydHkgYmFzZWQgb24gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGguXG4gKiBAcmV0dXJucyBBcnJheSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbGwgbm9uLXNvcnRhYmxlIHByb3BlcnRpZXMuXG4gKi9cbmZ1bmN0aW9uIGdldERpcmVjdFNvcnRSZXN0cmljdGlvbnMoZW50aXR5U2V0OiBFbnRpdHlTZXQsIHRhcmdldEVudGl0eVNldD86IEVudGl0eVNldCwgcGFyZW50TmF2aWdhdGlvblBhdGg/OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdGNvbnN0IHNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldDogc3RyaW5nW10gPSBbXTtcblx0aWYgKGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LlNvcnRSZXN0cmljdGlvbnM/LlNvcnRhYmxlID09PSBmYWxzZSkge1xuXHRcdC8vIGFkZCBhbGwgcHJvcGVydGllcyBvZiB0aGUgZW50aXR5IHNldCB0byB0aGUgbm9uU29ydGFibGVQcm9wZXJ0aWVzXG5cdFx0c29ydFJlc3RyaWN0aW9uc09uRW50aXR5U2V0LnB1c2goLi4uZW50aXR5U2V0LmVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lKSk7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3Qgbm9uU29ydGFibGVQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LlNvcnRSZXN0cmljdGlvbnM/Lk5vblNvcnRhYmxlUHJvcGVydGllcz8uZm9yRWFjaCgocHJvcGVydHkpID0+IHtcblx0XHRcdGlmIChwYXJlbnROYXZpZ2F0aW9uUGF0aCAmJiAhcHJvcGVydHkudmFsdWUuaW5jbHVkZXMocGFyZW50TmF2aWdhdGlvblBhdGgpKSB7XG5cdFx0XHRcdC8vIHNraXAgdGhlIG5vbiBzb3J0YWJsZSBwcm9wZXJ0eSBpZiBpdCBkb2Vzbid0IGJlbG9uZyB0byB0aGUgcGFyZW50IG5hdmlnYXRpb24gcGF0aCBpbiBjYXNlIG9mIGNvbnRhaW5tZW50XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmICgodGFyZ2V0RW50aXR5U2V0IHx8IHBhcmVudE5hdmlnYXRpb25QYXRoKSAmJiBwcm9wZXJ0eS4kdGFyZ2V0Py5uYW1lKSB7XG5cdFx0XHRcdG5vblNvcnRhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5LiR0YXJnZXQ/Lm5hbWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bm9uU29ydGFibGVQcm9wZXJ0aWVzLnB1c2gocHJvcGVydHkudmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGlmIChub25Tb3J0YWJsZVByb3BlcnRpZXM/Lmxlbmd0aCkge1xuXHRcdFx0c29ydFJlc3RyaWN0aW9uc09uRW50aXR5U2V0LnB1c2goLi4ubm9uU29ydGFibGVQcm9wZXJ0aWVzKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHNvcnRSZXN0cmljdGlvbnNPbkVudGl0eVNldDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBmaWx0ZXIgcmVzdHJpY3Rpb25zIGZyb20gdGhlIG5hdmlnYXRpb24gcmVzdHJpY3Rpb25zLlxuICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHkgc2V0IHRvIGJlIGFuYWx5emVkLlxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gTm90IHVzZWQgaW4gdGhlIGNhc2Ugb2YgY29udGFpbm1lbnQuXG4gKiBAcGFyYW0gcGFyZW50TmF2aWdhdGlvblBhdGggVGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGgsIHNwZWNpZmljIGZvciBjb250YWlubWVudCBzY2VuYXJpbyB0byBnZXQgdGhlIGNvcnJlY3QgcHJvcGVydHkgYmFzZWQgb24gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGguXG4gKiBAcmV0dXJucyBBcnJheSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbGwgbm9uLWZpbHRlcmFibGUgcHJvcGVydGllcyBmcm9tIG5hdmlnYXRpb24gcmVzdHJpY3Rpb25zLlxuICovXG5mdW5jdGlvbiBnZXRGaWx0ZXJSZXN0cmljdGlvbnNmcm9tTmF2aWdhdGlvblJlc3RyaWN0aW9ucyhcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdHRhcmdldEVudGl0eVNldD86IEVudGl0eVNldCxcblx0cGFyZW50TmF2aWdhdGlvblBhdGg/OiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcblx0Y29uc3QgZmlsdGVyUmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnM6IHN0cmluZ1tdID0gW107XG5cdGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/Lk5hdmlnYXRpb25SZXN0cmljdGlvbnM/LlJlc3RyaWN0ZWRQcm9wZXJ0aWVzPy5mb3JFYWNoKChuYXZpZ2F0aW9uUmVzdHJpY3Rpb24pID0+IHtcblx0XHQvLyBpZiBjb250YWlubWVudCBlbmFibGVkIGdldCBvbmx5IHRoZSBmaWx0ZXIgcmVzdHJpY3Rpb25zIG9mIHRoZSByZWxhdGVkIG5hdmlnYXRpb24gcGF0aFxuXHRcdGlmIChwYXJlbnROYXZpZ2F0aW9uUGF0aCAmJiBwYXJlbnROYXZpZ2F0aW9uUGF0aCAhPT0gbmF2aWdhdGlvblJlc3RyaWN0aW9uPy5OYXZpZ2F0aW9uUHJvcGVydHk/LnZhbHVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChuYXZpZ2F0aW9uUmVzdHJpY3Rpb24/LkZpbHRlclJlc3RyaWN0aW9ucz8uRmlsdGVyYWJsZSA9PT0gZmFsc2UpIHtcblx0XHRcdC8vIGZpbmQgY29ycmVjdCBuYXZpZ2F0aW9uIHByb3BlcnR5XG5cdFx0XHRjb25zdCBuYXZpZ2F0aW9uUHJvcGVydHkgPSBlbnRpdHlTZXQuZW50aXR5VHlwZS5uYXZpZ2F0aW9uUHJvcGVydGllcy5ieV9uYW1lKG5hdmlnYXRpb25SZXN0cmljdGlvbj8uTmF2aWdhdGlvblByb3BlcnR5Py52YWx1ZSk7XG5cdFx0XHRpZiAobmF2aWdhdGlvblByb3BlcnR5KSB7XG5cdFx0XHRcdC8vIGFkZCBhbGwgcHJvcGVydGllcyBvZiB0aGUgbmF2aWdhdGlvbiBwcm9wZXJ0eSB0byB0aGUgbm9uRmlsdGVyYWJsZVByb3BlcnRpZXNcblx0XHRcdFx0aWYgKHBhcmVudE5hdmlnYXRpb25QYXRoKSB7XG5cdFx0XHRcdFx0ZmlsdGVyUmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnMucHVzaChcblx0XHRcdFx0XHRcdC4uLm5hdmlnYXRpb25Qcm9wZXJ0eS50YXJnZXRUeXBlLmVudGl0eVByb3BlcnRpZXMubWFwKChwcm9wZXJ0eSkgPT4gcHJvcGVydHkubmFtZSlcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZpbHRlclJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0XHQuLi5uYXZpZ2F0aW9uUHJvcGVydHkudGFyZ2V0VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IGAke25hdmlnYXRpb25Qcm9wZXJ0eS5uYW1lfS8ke3Byb3BlcnR5Lm5hbWV9YClcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IG5vbkZpbHRlcmFibGVOYXZpZ2F0aW9uUHJvcGVydGllcyA9IG5hdmlnYXRpb25SZXN0cmljdGlvbj8uRmlsdGVyUmVzdHJpY3Rpb25zPy5Ob25GaWx0ZXJhYmxlUHJvcGVydGllcz8ubWFwKFxuXHRcdFx0XHQocHJvcGVydHkpID0+IHtcblx0XHRcdFx0XHQvLyB3ZSBuZWVkIHRoZSBwcm9wZXJ0eSBuYW1lIGZyb20gdGhlIG5hdmlnYXRpb24gcmVzdHJpY3Rpb24gZGVmaW5pdGlvbiB3aGVuIHRoZSB0YXJnZXRFbnRpdHlTZXQgaXMgYXZhaWxhYmxlIGFuZCBpdCdzIG5vdCBhIGNvbnRhaW5tZW50IHNjZW5hcmlvXG5cdFx0XHRcdFx0aWYgKCh0YXJnZXRFbnRpdHlTZXQgfHwgcGFyZW50TmF2aWdhdGlvblBhdGgpICYmIHByb3BlcnR5LiR0YXJnZXQ/Lm5hbWUpIHtcblx0XHRcdFx0XHRcdHJldHVybiBwcm9wZXJ0eS4kdGFyZ2V0Py5uYW1lO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyBsZWF2ZSB0aGUgcHJvcGVydHkgcGF0aCB1bmNoYW5nZWQgKGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBhbm5vdGF0aW9uIHRhcmdldCEpXG5cdFx0XHRcdFx0XHRyZXR1cm4gcHJvcGVydHkudmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHRcdFx0aWYgKG5vbkZpbHRlcmFibGVOYXZpZ2F0aW9uUHJvcGVydGllcz8ubGVuZ3RoKSB7XG5cdFx0XHRcdGZpbHRlclJlc3RyaWN0aW9uc0Zyb21OYXZpZ2F0aW9uUmVzdHJpY3Rpb25zLnB1c2goLi4ubm9uRmlsdGVyYWJsZU5hdmlnYXRpb25Qcm9wZXJ0aWVzKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRyZXR1cm4gZmlsdGVyUmVzdHJpY3Rpb25zRnJvbU5hdmlnYXRpb25SZXN0cmljdGlvbnM7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZmlsdGVyIHJlc3RyaWN0aW9ucyBkaXJlY3RseSBmcm9tIHRoZSBlbnRpdHkgc2V0LlxuICogQHBhcmFtIGVudGl0eVNldCBFbnRpdHkgc2V0IHRvIGJlIGFuYWx5emVkLlxuICogQHBhcmFtIHRhcmdldEVudGl0eVNldCBUaGUgdGFyZ2V0IGVudGl0eSBzZXQsIGlmIGF2YWlsYWJsZS4gTm90IHVzZWQgaW4gdGhlIGNhc2Ugb2YgY29udGFpbm1lbnQuXG4gKiBAcGFyYW0gcGFyZW50TmF2aWdhdGlvblBhdGggVGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGgsIHNwZWNpZmljIGZvciBjb250YWlubWVudCBzY2VuYXJpbyB0byBnZXQgdGhlIGNvcnJlY3QgcHJvcGVydHkgYmFzZWQgb24gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGguXG4gKiBAcmV0dXJucyBBcnJheSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbGwgbm9uLWZpbHRlcmFibGUgcHJvcGVydGllcy5cbiAqL1xuZnVuY3Rpb24gZ2V0RGlyZWN0RmlsdGVyUmVzdHJpY3Rpb25zKGVudGl0eVNldDogRW50aXR5U2V0LCB0YXJnZXRFbnRpdHlTZXQ/OiBFbnRpdHlTZXQsIHBhcmVudE5hdmlnYXRpb25QYXRoPzogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRjb25zdCBmaWx0ZXJSZXN0cmljdGlvbnNPbkVudGl0eVNldDogc3RyaW5nW10gPSBbXTtcblx0aWYgKGVudGl0eVNldC5hbm5vdGF0aW9ucy5DYXBhYmlsaXRpZXM/LkZpbHRlclJlc3RyaWN0aW9ucz8uRmlsdGVyYWJsZSA9PT0gZmFsc2UpIHtcblx0XHQvLyBhZGQgYWxsIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSBzZXQgdG8gdGhlIG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzXG5cdFx0ZmlsdGVyUmVzdHJpY3Rpb25zT25FbnRpdHlTZXQucHVzaCguLi5lbnRpdHlTZXQuZW50aXR5VHlwZS5lbnRpdHlQcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpKTtcblx0fSBlbHNlIHtcblx0XHRjb25zdCBub25GaWx0ZXJhYmxlUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRlbnRpdHlTZXQuYW5ub3RhdGlvbnMuQ2FwYWJpbGl0aWVzPy5GaWx0ZXJSZXN0cmljdGlvbnM/Lk5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzPy5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xuXHRcdFx0aWYgKHBhcmVudE5hdmlnYXRpb25QYXRoICYmICFwcm9wZXJ0eS52YWx1ZS5pbmNsdWRlcyhwYXJlbnROYXZpZ2F0aW9uUGF0aCkpIHtcblx0XHRcdFx0Ly8gc2tpcCB0aGUgbm9uIGZpbHRlcmFibGUgcHJvcGVydHkgaWYgaXQgZG9lc24ndCBiZWxvbmcgdG8gdGhlIHBhcmVudCBuYXZpZ2F0aW9uIHBhdGggaW4gY2FzZSBvZiBjb250YWlubWVudFxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoKHRhcmdldEVudGl0eVNldCB8fCBwYXJlbnROYXZpZ2F0aW9uUGF0aCkgJiYgcHJvcGVydHkuJHRhcmdldD8ubmFtZSkge1xuXHRcdFx0XHRub25GaWx0ZXJhYmxlUHJvcGVydGllcy5wdXNoKHByb3BlcnR5LiR0YXJnZXQ/Lm5hbWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bm9uRmlsdGVyYWJsZVByb3BlcnRpZXMucHVzaChwcm9wZXJ0eS52YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0aWYgKG5vbkZpbHRlcmFibGVQcm9wZXJ0aWVzPy5sZW5ndGgpIHtcblx0XHRcdGZpbHRlclJlc3RyaWN0aW9uc09uRW50aXR5U2V0LnB1c2goLi4ubm9uRmlsdGVyYWJsZVByb3BlcnRpZXMpO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZmlsdGVyUmVzdHJpY3Rpb25zT25FbnRpdHlTZXQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7RUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxNQUFNQSxzQ0FBc0MsR0FBRyxTQUFBQSxDQUNyREMsU0FBb0IsRUFDcEJDLGVBQTJCLEVBQzNCQyxvQkFBNkIsRUFDbEI7SUFDWCxNQUFNQyw0Q0FBNEMsR0FBR0MsK0NBQStDLENBQ25HSixTQUFTLEVBQ1RDLGVBQWUsRUFDZkMsb0JBQ0QsQ0FBQztJQUNELE1BQU1HLHdCQUF3QixHQUFHQywyQkFBMkIsQ0FBQ04sU0FBUyxFQUFFQyxlQUFlLEVBQUVDLG9CQUFvQixDQUFDO0lBQzlHO0lBQ0EsT0FBT0ssS0FBSyxDQUFDQyxJQUFJLENBQUMsSUFBSUMsR0FBRyxDQUFDLENBQUMsR0FBR04sNENBQTRDLEVBQUUsR0FBR0Usd0JBQXdCLENBQUMsQ0FBQyxDQUFDO0VBQzNHLENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBUkFLLFFBQUEsQ0FBQVgsc0NBQUEsR0FBQUEsc0NBQUE7RUFTTyxNQUFNWSxvQ0FBb0MsR0FBRyxTQUFBQSxDQUNuRFgsU0FBb0IsRUFDcEJDLGVBQTJCLEVBQzNCQyxvQkFBNkIsRUFDbEI7SUFDWCxNQUFNVSwwQ0FBMEMsR0FBR0MsNkNBQTZDLENBQy9GYixTQUFTLEVBQ1RDLGVBQWUsRUFDZkMsb0JBQ0QsQ0FBQztJQUNELE1BQU1ZLHNCQUFzQixHQUFHQyx5QkFBeUIsQ0FBQ2YsU0FBUyxFQUFFQyxlQUFlLEVBQUVDLG9CQUFvQixDQUFDO0lBQzFHO0lBQ0EsT0FBT0ssS0FBSyxDQUFDQyxJQUFJLENBQUMsSUFBSUMsR0FBRyxDQUFDLENBQUMsR0FBR0csMENBQTBDLEVBQUUsR0FBR0Usc0JBQXNCLENBQUMsQ0FBQyxDQUFDO0VBQ3ZHLENBQUM7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
|