@sapui5/sap.fe.core 1.121.2 → 1.123.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 +2 -2
- package/src/sap/fe/core/ActionRuntime.ts +1 -2
- package/src/sap/fe/core/CommonUtils.js +14 -171
- package/src/sap/fe/core/CommonUtils.ts +15 -221
- package/src/sap/fe/core/PageController.js +13 -1
- package/src/sap/fe/core/PageController.ts +16 -0
- package/src/sap/fe/core/TemplateComponent.js +6 -1
- package/src/sap/fe/core/TemplateComponent.ts +8 -0
- package/src/sap/fe/core/UIProvider.js +23 -0
- package/src/sap/fe/core/UIProvider.ts +38 -0
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.js +97 -43
- package/src/sap/fe/core/buildingBlocks/BuildingBlockBase.ts +120 -50
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.js +6 -3
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockSupport.ts +12 -18
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.js +2 -2
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor.ts +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase.ts +4 -3
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.js +1 -1
- package/src/sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlockFragment.ts +1 -0
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.js +42 -1
- package/src/sap/fe/core/controllerextensions/BaseControllerExtension.ts +40 -0
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.js +5 -2
- package/src/sap/fe/core/controllerextensions/CollaborativeDraft.ts +5 -3
- package/src/sap/fe/core/controllerextensions/EditFlow.js +151 -60
- package/src/sap/fe/core/controllerextensions/EditFlow.ts +165 -68
- package/src/sap/fe/core/controllerextensions/HookSupport.js +32 -14
- package/src/sap/fe/core/controllerextensions/HookSupport.ts +35 -14
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +5 -17
- package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.ts +0 -12
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +6 -6
- package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.ts +15 -10
- package/src/sap/fe/core/controllerextensions/InternalRouting.js +108 -287
- package/src/sap/fe/core/controllerextensions/InternalRouting.ts +117 -309
- package/src/sap/fe/core/controllerextensions/KPIManagement.js +2 -2
- package/src/sap/fe/core/controllerextensions/KPIManagement.ts +6 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.js +2 -2
- package/src/sap/fe/core/controllerextensions/MessageHandler.ts +1 -1
- package/src/sap/fe/core/controllerextensions/PageReady.js +6 -6
- package/src/sap/fe/core/controllerextensions/PageReady.ts +5 -4
- package/src/sap/fe/core/controllerextensions/Paginator.js +17 -110
- package/src/sap/fe/core/controllerextensions/Paginator.ts +13 -130
- package/src/sap/fe/core/controllerextensions/Placeholder.js +3 -3
- package/src/sap/fe/core/controllerextensions/Placeholder.ts +1 -2
- package/src/sap/fe/core/controllerextensions/Recommendations.js +36 -31
- package/src/sap/fe/core/controllerextensions/Recommendations.ts +32 -37
- package/src/sap/fe/core/controllerextensions/Share.js +7 -7
- package/src/sap/fe/core/controllerextensions/Share.ts +6 -6
- package/src/sap/fe/core/controllerextensions/SideEffects.js +52 -6
- package/src/sap/fe/core/controllerextensions/SideEffects.ts +56 -4
- package/src/sap/fe/core/controllerextensions/ViewState.js +32 -46
- package/src/sap/fe/core/controllerextensions/ViewState.ts +24 -31
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.js +42 -31
- package/src/sap/fe/core/controllerextensions/dialog/OperationsDialog.block.tsx +6 -0
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.js +168 -276
- package/src/sap/fe/core/controllerextensions/editFlow/TransactionHelper.ts +182 -310
- package/src/sap/fe/core/controllerextensions/editFlow/draft.js +3 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draft.ts +2 -2
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.js +4 -3
- package/src/sap/fe/core/controllerextensions/editFlow/draftDataLossPopup.ts +3 -2
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.js +74 -52
- package/src/sap/fe/core/controllerextensions/editFlow/operations/facade.ts +95 -55
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.js +3 -17
- package/src/sap/fe/core/controllerextensions/messageHandler/messageHandling.ts +10 -23
- package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.js +3 -3
- package/src/sap/fe/core/controllerextensions/recommendations/Telemetry.ts +2 -2
- package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.js +225 -0
- package/src/sap/fe/core/controllerextensions/routing/ContextPathHelper.ts +241 -0
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.js +69 -48
- package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DraftDataLossDialog.block.tsx +56 -33
- package/src/sap/fe/core/controls/FormElementWrapper.js +8 -11
- package/src/sap/fe/core/controls/FormElementWrapper.ts +9 -0
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.js +6 -14
- package/src/sap/fe/core/controls/Recommendations/ConfirmRecommendationDialog.block.tsx +12 -23
- package/src/sap/fe/core/converters/ConverterContext.js +17 -9
- package/src/sap/fe/core/converters/ConverterContext.ts +55 -41
- package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
- package/src/sap/fe/core/converters/ManifestSettings.ts +19 -5
- package/src/sap/fe/core/converters/ManifestWrapper.js +14 -4
- package/src/sap/fe/core/converters/ManifestWrapper.ts +21 -10
- package/src/sap/fe/core/converters/MetaModelConverter.js +402 -383
- package/src/sap/fe/core/converters/MetaModelConverter.ts +538 -338
- package/src/sap/fe/core/converters/TemplateConverter.js +4 -2
- package/src/sap/fe/core/converters/TemplateConverter.ts +18 -13
- package/src/sap/fe/core/converters/annotations/DataField.js +30 -28
- package/src/sap/fe/core/converters/annotations/DataField.ts +58 -35
- package/src/sap/fe/core/converters/common/AnnotationConverter.js +24 -23
- package/src/sap/fe/core/converters/controls/Common/Action.js +5 -4
- package/src/sap/fe/core/converters/controls/Common/Action.ts +34 -28
- package/src/sap/fe/core/converters/controls/Common/Chart.js +37 -33
- package/src/sap/fe/core/converters/controls/Common/Chart.ts +64 -46
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +15 -4
- package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +31 -15
- package/src/sap/fe/core/converters/controls/Common/Form.js +6 -4
- package/src/sap/fe/core/converters/controls/Common/Form.ts +23 -11
- package/src/sap/fe/core/converters/controls/Common/KPI.js +5 -3
- package/src/sap/fe/core/converters/controls/Common/KPI.ts +17 -11
- package/src/sap/fe/core/converters/controls/Common/Table.js +197 -101
- package/src/sap/fe/core/converters/controls/Common/Table.ts +393 -182
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +4 -5
- package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +38 -27
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +41 -11
- package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +112 -45
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +7 -7
- package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +18 -12
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/Avatar.ts +5 -4
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.js +1 -1
- package/src/sap/fe/core/converters/controls/ObjectPage/HeaderFacet.ts +19 -9
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +64 -63
- package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +109 -100
- package/src/sap/fe/core/converters/helpers/Aggregation.js +12 -11
- package/src/sap/fe/core/converters/helpers/Aggregation.ts +35 -30
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.js +4 -1
- package/src/sap/fe/core/converters/helpers/ConfigurableObject.ts +12 -9
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/DataFieldHelper.ts +1 -1
- package/src/sap/fe/core/converters/helpers/ID.js +1 -1
- package/src/sap/fe/core/converters/helpers/ID.ts +6 -6
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.js +3 -3
- package/src/sap/fe/core/converters/helpers/InsightsHelpers.ts +11 -6
- package/src/sap/fe/core/converters/helpers/Key.js +2 -2
- package/src/sap/fe/core/converters/helpers/Key.ts +4 -4
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.js +1 -1
- package/src/sap/fe/core/converters/helpers/SelectionVariantHelper.ts +2 -2
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.js +21 -19
- package/src/sap/fe/core/converters/objectPage/FormMenuActions.ts +43 -31
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +1 -1
- package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +16 -12
- package/src/sap/fe/core/converters/templates/ListReportConverter.js +8 -3
- package/src/sap/fe/core/converters/templates/ListReportConverter.ts +41 -21
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.js +5 -3
- package/src/sap/fe/core/converters/templates/ObjectPageConverter.ts +24 -19
- package/src/sap/fe/core/designtime/AppComponent.designtime.js +3 -2
- package/src/sap/fe/core/designtime/AppComponent.designtime.ts +2 -1
- package/src/sap/fe/core/filter/DraftEditState.fragment.xml +1 -1
- package/src/sap/fe/core/formatters/CollaborationFormatter.js +4 -6
- package/src/sap/fe/core/formatters/CollaborationFormatter.ts +5 -4
- package/src/sap/fe/core/formatters/FPMFormatter.js +5 -13
- package/src/sap/fe/core/formatters/FPMFormatter.ts +11 -10
- package/src/sap/fe/core/formatters/FiscalFormat.js +1 -1
- package/src/sap/fe/core/formatters/FiscalFormat.ts +1 -1
- package/src/sap/fe/core/formatters/KPIFormatter.js +4 -7
- package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/StandardFormatter.js +4 -7
- package/src/sap/fe/core/formatters/StandardFormatter.ts +3 -3
- package/src/sap/fe/core/formatters/ValueFormatter.js +35 -6
- package/src/sap/fe/core/formatters/ValueFormatter.ts +31 -3
- package/src/sap/fe/core/fpm/manifest.json +1 -1
- package/src/sap/fe/core/helpers/AppStartupHelper.js +54 -33
- package/src/sap/fe/core/helpers/AppStartupHelper.ts +62 -41
- package/src/sap/fe/core/helpers/BindingToolkit.js +17 -3
- package/src/sap/fe/core/helpers/BindingToolkit.ts +28 -6
- package/src/sap/fe/core/helpers/ClassSupport.js +32 -13
- package/src/sap/fe/core/helpers/ClassSupport.ts +35 -15
- package/src/sap/fe/core/helpers/DeleteHelper.js +71 -61
- package/src/sap/fe/core/helpers/DeleteHelper.ts +125 -103
- package/src/sap/fe/core/helpers/DraftEditState.js +5 -3
- package/src/sap/fe/core/helpers/DraftEditState.ts +3 -1
- package/src/sap/fe/core/helpers/FPMHelper.js +43 -46
- package/src/sap/fe/core/helpers/FPMHelper.ts +50 -56
- package/src/sap/fe/core/helpers/MetaModelFunction.js +77 -53
- package/src/sap/fe/core/helpers/MetaModelFunction.ts +78 -57
- package/src/sap/fe/core/helpers/ModelHelper.js +10 -4
- package/src/sap/fe/core/helpers/ModelHelper.ts +12 -6
- package/src/sap/fe/core/helpers/PasteHelper.js +194 -7
- package/src/sap/fe/core/helpers/PasteHelper.ts +265 -13
- package/src/sap/fe/core/helpers/PromiseKeeper.js +66 -0
- package/src/sap/fe/core/helpers/PromiseKeeper.ts +56 -0
- package/src/sap/fe/core/helpers/SemanticKeyHelper.js +30 -19
- package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +34 -22
- package/src/sap/fe/core/helpers/StableIdHelper.js +1 -1
- package/src/sap/fe/core/helpers/StableIdHelper.ts +7 -2
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.js +26 -52
- package/src/sap/fe/core/helpers/StandardRecommendationHelper.ts +37 -63
- package/src/sap/fe/core/helpers/TitleHelper.js +1 -1
- package/src/sap/fe/core/helpers/TitleHelper.ts +17 -14
- package/src/sap/fe/core/helpers/TypeGuards.js +27 -3
- package/src/sap/fe/core/helpers/TypeGuards.ts +37 -7
- package/src/sap/fe/core/jsx-runtime/jsx-xml.js +48 -8
- package/src/sap/fe/core/jsx-runtime/jsx-xml.ts +40 -9
- package/src/sap/fe/core/library.js +1 -1
- package/src/sap/fe/core/messagebundle.properties +5 -2
- package/src/sap/fe/core/messagebundle_da.properties +1 -1
- package/src/sap/fe/core/messagebundle_en.properties +267 -2
- package/src/sap/fe/core/messagebundle_sl.properties +1 -1
- package/src/sap/fe/core/operationsHelper.js +2 -1
- package/src/sap/fe/core/operationsHelper.ts +1 -0
- package/src/sap/fe/core/services/EnvironmentServiceFactory.js +3 -3
- package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +2 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.js +2 -2
- package/src/sap/fe/core/services/NavigationServiceFactory.ts +3 -2
- package/src/sap/fe/core/services/RoutingServiceFactory.js +27 -14
- package/src/sap/fe/core/services/RoutingServiceFactory.ts +27 -14
- package/src/sap/fe/core/services/ShellServicesFactory.js +49 -12
- package/src/sap/fe/core/services/ShellServicesFactory.ts +62 -13
- package/src/sap/fe/core/services/SideEffectsServiceFactory.js +156 -82
- package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +218 -100
- package/src/sap/fe/core/services/TelemetryServiceFactory.js +3 -3
- package/src/sap/fe/core/services/TelemetryServiceFactory.ts +6 -6
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.js +3 -2
- package/src/sap/fe/core/services/ValueHelpHistoryServiceFactory.ts +1 -1
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.js +1 -1
- package/src/sap/fe/core/services/collaborativeDraftServiceFactory.ts +2 -2
- package/src/sap/fe/core/services/view/TemplatingErrorPage.view.xml +1 -1
- package/src/sap/fe/core/templating/CommonFormatters.js +6 -3
- package/src/sap/fe/core/templating/CommonFormatters.ts +13 -12
- package/src/sap/fe/core/templating/CriticalityFormatters.js +2 -2
- package/src/sap/fe/core/templating/CriticalityFormatters.ts +37 -14
- package/src/sap/fe/core/templating/DataFieldFormatters.js +12 -11
- package/src/sap/fe/core/templating/DataFieldFormatters.ts +35 -24
- package/src/sap/fe/core/templating/DataModelPathHelper.js +22 -18
- package/src/sap/fe/core/templating/DataModelPathHelper.ts +61 -51
- package/src/sap/fe/core/templating/DisplayModeFormatter.js +1 -1
- package/src/sap/fe/core/templating/DisplayModeFormatter.ts +8 -3
- package/src/sap/fe/core/templating/EntityTypeHelper.js +1 -1
- package/src/sap/fe/core/templating/EntityTypeHelper.ts +1 -1
- package/src/sap/fe/core/templating/FieldControlHelper.js +3 -3
- package/src/sap/fe/core/templating/FieldControlHelper.ts +27 -8
- package/src/sap/fe/core/templating/FilterHelper.js +13 -10
- package/src/sap/fe/core/templating/FilterHelper.ts +80 -46
- package/src/sap/fe/core/templating/FilterTemplating.js +1 -1
- package/src/sap/fe/core/templating/FilterTemplating.ts +2 -2
- package/src/sap/fe/core/templating/PropertyFormatters.js +6 -8
- package/src/sap/fe/core/templating/PropertyFormatters.ts +11 -11
- package/src/sap/fe/core/templating/PropertyHelper.js +3 -3
- package/src/sap/fe/core/templating/PropertyHelper.ts +4 -4
- package/src/sap/fe/core/templating/SemanticObjectHelper.js +157 -13
- package/src/sap/fe/core/templating/SemanticObjectHelper.ts +182 -16
- package/src/sap/fe/core/templating/UIFormatters.js +23 -22
- package/src/sap/fe/core/templating/UIFormatters.ts +94 -66
- package/src/sap/fe/core/type/DateTimeWithTimezone.js +1 -1
- package/src/sap/fe/core/type/DateTimeWithTimezone.ts +2 -2
- package/src/sap/fe/core/type/EDM.js +1 -1
- package/src/sap/fe/core/type/EDM.ts +2 -2
- package/src/sap/fe/core/type/Email.js +1 -1
- package/src/sap/fe/core/type/Email.ts +1 -1
- package/src/sap/fe/core/type/FiscalDate.js +2 -2
- package/src/sap/fe/core/type/FiscalDate.ts +2 -2
|
@@ -16,7 +16,9 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
|
|
|
16
16
|
var ChannelType = WebSocket.ChannelType;
|
|
17
17
|
var isPropertyPathExpression = TypeGuards.isPropertyPathExpression;
|
|
18
18
|
var isProperty = TypeGuards.isProperty;
|
|
19
|
+
var isNavigationProperty = TypeGuards.isNavigationProperty;
|
|
19
20
|
var isEntityType = TypeGuards.isEntityType;
|
|
21
|
+
var isEntitySet = TypeGuards.isEntitySet;
|
|
20
22
|
var isComplexType = TypeGuards.isComplexType;
|
|
21
23
|
var getInvolvedDataModelObjects = MetaModelConverter.getInvolvedDataModelObjects;
|
|
22
24
|
var convertTypes = MetaModelConverter.convertTypes;
|
|
@@ -38,7 +40,10 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
|
|
|
38
40
|
this.sideEffectsRegistry = {
|
|
39
41
|
oData: {
|
|
40
42
|
entities: {},
|
|
41
|
-
actions: {
|
|
43
|
+
actions: {
|
|
44
|
+
boundActions: {},
|
|
45
|
+
unBoundActions: {}
|
|
46
|
+
}
|
|
42
47
|
},
|
|
43
48
|
control: {}
|
|
44
49
|
};
|
|
@@ -149,11 +154,14 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
|
|
|
149
154
|
* @param triggerAction Name of the action
|
|
150
155
|
* @param context Context
|
|
151
156
|
* @param groupId The group ID to be used for the request
|
|
152
|
-
* @returns A promise that is resolved without data or with a return value context when the action call
|
|
157
|
+
* @returns A promise that is resolved without data or with a return value context when the action call succeeds
|
|
153
158
|
*/;
|
|
154
159
|
_proto.executeAction = async function executeAction(triggerAction, context, groupId) {
|
|
155
160
|
const action = context.getModel().bindContext(`${triggerAction}(...)`, context);
|
|
156
|
-
|
|
161
|
+
groupId = groupId || context.getBinding().getUpdateGroupId();
|
|
162
|
+
// the triggerAction is executed in same $batch but different changeset
|
|
163
|
+
context.getModel().submitBatch(groupId);
|
|
164
|
+
await action.execute(groupId, true);
|
|
157
165
|
}
|
|
158
166
|
|
|
159
167
|
/**
|
|
@@ -228,8 +236,11 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
|
|
|
228
236
|
const entityType = this.getEntityTypeFromContext(context);
|
|
229
237
|
if (entityType) {
|
|
230
238
|
var _this$sideEffectsRegi;
|
|
231
|
-
return (_this$sideEffectsRegi = this.sideEffectsRegistry.oData.actions[entityType]) === null || _this$sideEffectsRegi === void 0 ? void 0 : _this$sideEffectsRegi[actionName];
|
|
239
|
+
return (_this$sideEffectsRegi = this.sideEffectsRegistry.oData.actions.boundActions[entityType]) === null || _this$sideEffectsRegi === void 0 ? void 0 : _this$sideEffectsRegi[actionName];
|
|
232
240
|
}
|
|
241
|
+
} else {
|
|
242
|
+
var _this$sideEffectsRegi2;
|
|
243
|
+
return (_this$sideEffectsRegi2 = this.sideEffectsRegistry.oData.actions.unBoundActions) === null || _this$sideEffectsRegi2 === void 0 ? void 0 : _this$sideEffectsRegi2[actionName];
|
|
233
244
|
}
|
|
234
245
|
return undefined;
|
|
235
246
|
}
|
|
@@ -255,9 +266,21 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
|
|
|
255
266
|
convertedMetaModel.entityTypes.forEach(entityType => {
|
|
256
267
|
this.mapFieldAnnotations(entityType);
|
|
257
268
|
this.sideEffectsRegistry.oData.entities[entityType.fullyQualifiedName] = this.retrieveODataEntitySideEffects(entityType);
|
|
258
|
-
this.sideEffectsRegistry.oData.actions[entityType.fullyQualifiedName] = this.retrieveODataActionsSideEffects(entityType); // only bound actions are analyzed since unbound ones don't get SideEffects
|
|
259
269
|
this.mapSideEffectSources(entityType, sideEffectSources);
|
|
260
270
|
});
|
|
271
|
+
convertedMetaModel.actions.forEach(action => {
|
|
272
|
+
if (action.isBound) {
|
|
273
|
+
this.sideEffectsRegistry.oData.actions.boundActions[action.sourceEntityType.fullyQualifiedName] = {
|
|
274
|
+
...this.sideEffectsRegistry.oData.actions.boundActions[action.sourceEntityType.fullyQualifiedName],
|
|
275
|
+
...this.retrieveODataActionsSideEffects(action)
|
|
276
|
+
};
|
|
277
|
+
} else {
|
|
278
|
+
this.sideEffectsRegistry.oData.actions.unBoundActions = {
|
|
279
|
+
...this.sideEffectsRegistry.oData.actions.unBoundActions,
|
|
280
|
+
...this.retrieveODataActionsSideEffects(action)
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
});
|
|
261
284
|
if (Object.keys(sideEffectSources.events).length > 0) {
|
|
262
285
|
this.initializeWebSocketConnection();
|
|
263
286
|
}
|
|
@@ -304,13 +327,20 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
|
|
|
304
327
|
const context = field.getBindingContext();
|
|
305
328
|
const propertyName = field.data().sourcePath.split("/").pop();
|
|
306
329
|
if (context) {
|
|
307
|
-
var
|
|
330
|
+
var _recommendationRolesF;
|
|
308
331
|
const metaModel = context === null || context === void 0 ? void 0 : context.getModel().getMetaModel();
|
|
309
332
|
const metaContext = metaModel === null || metaModel === void 0 ? void 0 : metaModel.getMetaContext(context.getPath());
|
|
310
333
|
const targetDataModelObject = MetaModelConverter.getInvolvedDataModelObjects(metaContext).targetObject;
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
334
|
+
let targetEntityTypeName;
|
|
335
|
+
if (isEntitySet(targetDataModelObject)) {
|
|
336
|
+
var _targetDataModelObjec;
|
|
337
|
+
targetEntityTypeName = (_targetDataModelObjec = targetDataModelObject.entityType) === null || _targetDataModelObjec === void 0 ? void 0 : _targetDataModelObjec.name;
|
|
338
|
+
} else if (isNavigationProperty(targetDataModelObject)) {
|
|
339
|
+
var _targetDataModelObjec2;
|
|
340
|
+
targetEntityTypeName = (_targetDataModelObjec2 = targetDataModelObject.targetType) === null || _targetDataModelObjec2 === void 0 ? void 0 : _targetDataModelObjec2.name;
|
|
341
|
+
}
|
|
342
|
+
const recommendationRolesForEntity = targetEntityTypeName && this.recommendationRegistry.roles[targetEntityTypeName];
|
|
343
|
+
if (recommendationRolesForEntity && recommendationRolesForEntity !== null && recommendationRolesForEntity !== void 0 && (_recommendationRolesF = recommendationRolesForEntity.input) !== null && _recommendationRolesF !== void 0 && _recommendationRolesF.includes(propertyName)) {
|
|
314
344
|
return true;
|
|
315
345
|
}
|
|
316
346
|
}
|
|
@@ -476,8 +506,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
|
|
|
476
506
|
let targetProperties = [];
|
|
477
507
|
let targetEntities = [];
|
|
478
508
|
sideEffects.forEach(sideEffect => {
|
|
479
|
-
var _this$
|
|
480
|
-
const annotation = (_this$
|
|
509
|
+
var _this$sideEffectsRegi3;
|
|
510
|
+
const annotation = (_this$sideEffectsRegi3 = this.sideEffectsRegistry.oData.entities[dataModel.targetEntityType.fullyQualifiedName]) === null || _this$sideEffectsRegi3 === void 0 ? void 0 : _this$sideEffectsRegi3[`${sideEffect.entity}@com.sap.vocabularies.Common.v1.SideEffects#${sideEffect.qualifier}`];
|
|
481
511
|
targetProperties = targetProperties.concat(annotation.targetProperties);
|
|
482
512
|
targetEntities = targetEntities.concat(annotation.targetEntities);
|
|
483
513
|
});
|
|
@@ -517,15 +547,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
|
|
|
517
547
|
return this.sourcesToSideEffectMappings.properties[propertyName] || [];
|
|
518
548
|
}
|
|
519
549
|
|
|
520
|
-
/**
|
|
521
|
-
* Adds the text properties required for SideEffects
|
|
522
|
-
* If a property has an associated text then this text needs to be added as targetProperties.
|
|
523
|
-
*
|
|
524
|
-
* @param sideEffectsTargets SideEffects Targets
|
|
525
|
-
* @param entityType Entity type
|
|
526
|
-
* @returns SideEffects definition with added text properties
|
|
527
|
-
*/
|
|
528
|
-
|
|
529
550
|
// check if can define whether callbacks are async. Otherwise comment
|
|
530
551
|
// only one callback for one target
|
|
531
552
|
;
|
|
@@ -540,38 +561,24 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
|
|
|
540
561
|
;
|
|
541
562
|
_proto.getRegisteredCallback = function getRegisteredCallback(target) {
|
|
542
563
|
return this.targetCallbacks[target];
|
|
543
|
-
}
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
/**
|
|
567
|
+
* Returns updated side effects definition with all text related properties.
|
|
568
|
+
*
|
|
569
|
+
* @param sideEffectsTargets The targets of the side effect
|
|
570
|
+
* @param entityType Name of the entity where the side effect is registered
|
|
571
|
+
* @returns Updated side effects' targets with added text properties or entities
|
|
572
|
+
*/;
|
|
544
573
|
_proto.addTextProperties = function addTextProperties(sideEffectsTargets, entityType) {
|
|
545
574
|
const setOfProperties = new Set(sideEffectsTargets.targetProperties);
|
|
546
575
|
const setOfEntities = new Set(sideEffectsTargets.targetEntities.map(target => target.$NavigationPropertyPath));
|
|
547
|
-
|
|
548
|
-
// Generate all dataModelPath for the properties to analyze (cover "*" and /*)
|
|
549
|
-
const propertiesToAnalyze = sideEffectsTargets.targetProperties.reduce((dataModelPropertyPaths, propertyPath) => {
|
|
550
|
-
return dataModelPropertyPaths.concat(this.getDataModelPropertiesFromAPath(propertyPath, entityType));
|
|
551
|
-
}, []);
|
|
552
|
-
|
|
553
576
|
// Generate all paths related to the text properties and not already covered by the SideEffects
|
|
554
|
-
for (const
|
|
555
|
-
const
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
const targetPath = getTargetObjectPath(dataModelTextPath, true);
|
|
560
|
-
if (isProperty(dataModelTextPath.targetObject) && !setOfProperties.has(targetPath) &&
|
|
561
|
-
// the property is already listed
|
|
562
|
-
!setOfProperties.has(`${relativeNavigation}${dataModelTextPath.navigationProperties.length ? "/" : ""}*`) &&
|
|
563
|
-
// the property is already listed thanks to the "*"
|
|
564
|
-
!setOfEntities.has(`${relativeNavigation}`) // the property is not part of a TargetEntities
|
|
565
|
-
) {
|
|
566
|
-
// The Text association is added as TargetEntities if
|
|
567
|
-
// - it's contained on a different entitySet than the SideEffects
|
|
568
|
-
// - and it's contained on a different entitySet than the sourced property
|
|
569
|
-
// Otherwise it's added as targetProperties
|
|
570
|
-
if (dataModelPropertyPath.targetEntitySet !== dataModelTextPath.targetEntitySet && dataModelTextPath.navigationProperties && dataModelTextPath.targetEntityType) {
|
|
571
|
-
setOfEntities.add(relativeNavigation);
|
|
572
|
-
} else {
|
|
573
|
-
setOfProperties.add(targetPath);
|
|
574
|
-
}
|
|
577
|
+
for (const propertyPath of sideEffectsTargets.targetProperties) {
|
|
578
|
+
for (const dataModelPropertyPath of this.getDataModelPropertiesFromAPath(propertyPath, entityType)) {
|
|
579
|
+
const associatedTextPath = getAssociatedTextPropertyPath(dataModelPropertyPath.targetObject);
|
|
580
|
+
if (associatedTextPath) {
|
|
581
|
+
this.addTextProperty(dataModelPropertyPath, propertyPath, associatedTextPath, setOfProperties, setOfEntities);
|
|
575
582
|
}
|
|
576
583
|
}
|
|
577
584
|
}
|
|
@@ -585,6 +592,64 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
|
|
|
585
592
|
};
|
|
586
593
|
}
|
|
587
594
|
|
|
595
|
+
/**
|
|
596
|
+
* Adds text related property to the side effects targets
|
|
597
|
+
* If the property has an associated text then this text needs to be added if it's not already reflected in the side effects definition:
|
|
598
|
+
* - as targetProperties if the property and its associated text are on the same entitySet
|
|
599
|
+
* - as targetEntities if they are defined on different entitySets.
|
|
600
|
+
*
|
|
601
|
+
* @param dataModelPropertyPath The model object path of the property
|
|
602
|
+
* @param propertyPath The property path
|
|
603
|
+
* @param associatedTextPath The associated text property path
|
|
604
|
+
* @param setOfProperties Set of existing sideEffect's target properties
|
|
605
|
+
* @param setOfEntities Set of existing sideEffect's target entities
|
|
606
|
+
*/;
|
|
607
|
+
_proto.addTextProperty = function addTextProperty(dataModelPropertyPath, propertyPath, associatedTextPath, setOfProperties, setOfEntities) {
|
|
608
|
+
var _dataModelPropertyPat, _dataModelTextPath$ta, _dataModelTextPath$ta2;
|
|
609
|
+
const dataModelTextPath = enhanceDataModelPath(dataModelPropertyPath, associatedTextPath);
|
|
610
|
+
const relativeNavigation = propertyPath.startsWith("/") && dataModelTextPath.targetEntitySet && dataModelTextPath.targetEntitySet.name !== ((_dataModelPropertyPat = dataModelPropertyPath.targetEntitySet) === null || _dataModelPropertyPat === void 0 ? void 0 : _dataModelPropertyPat.name) ? `/${(_dataModelTextPath$ta = dataModelTextPath.targetEntitySet) === null || _dataModelTextPath$ta === void 0 ? void 0 : _dataModelTextPath$ta.fullyQualifiedName}` : getTargetNavigationPath(dataModelTextPath, true);
|
|
611
|
+
const targetPath = propertyPath.startsWith("/") ? `/${(_dataModelTextPath$ta2 = dataModelTextPath.targetEntitySet) === null || _dataModelTextPath$ta2 === void 0 ? void 0 : _dataModelTextPath$ta2.fullyQualifiedName}/${dataModelTextPath.targetObject.name}` : getTargetObjectPath(dataModelTextPath, true);
|
|
612
|
+
if (this.isAssociatedTextListedInSideEffectTargets(dataModelTextPath, relativeNavigation, targetPath, setOfProperties, setOfEntities)) {
|
|
613
|
+
if (this.isPropertyAssociatedTextOnDifferentEntitySet(dataModelPropertyPath, dataModelTextPath)) {
|
|
614
|
+
setOfEntities.add(relativeNavigation);
|
|
615
|
+
} else {
|
|
616
|
+
setOfProperties.add(targetPath);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
/**
|
|
622
|
+
* Checks if the associated text property needs to be added if it's not already reflected in the side effects definition:
|
|
623
|
+
* - as targetProperties if the property and its associated text are on the same entitySet
|
|
624
|
+
* - as targetEntities if they are defined on different entitySets.
|
|
625
|
+
*
|
|
626
|
+
* @param dataModelTextPath The model object path of the associated text
|
|
627
|
+
* @param relativeNavigation The navigation to the text property
|
|
628
|
+
* @param targetPath The associated text property path
|
|
629
|
+
* @param setOfProperties Set of existing sideEffect's target properties
|
|
630
|
+
* @param setOfEntities Set of existing sideEffect's target entities
|
|
631
|
+
* @returns Updated side effects' targets with added text property or entity
|
|
632
|
+
*/;
|
|
633
|
+
_proto.isAssociatedTextListedInSideEffectTargets = function isAssociatedTextListedInSideEffectTargets(dataModelTextPath, relativeNavigation, targetPath, setOfProperties, setOfEntities) {
|
|
634
|
+
return isProperty(dataModelTextPath.targetObject) && !setOfProperties.has(targetPath) &&
|
|
635
|
+
// the property is already listed
|
|
636
|
+
!setOfProperties.has(`${relativeNavigation}${dataModelTextPath.navigationProperties.length ? "/" : ""}*`) &&
|
|
637
|
+
// the property is already listed thanks to the "*"
|
|
638
|
+
!setOfEntities.has(`${relativeNavigation}`) // the property is not part of a TargetEntities
|
|
639
|
+
;
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
/**
|
|
643
|
+
* Checks if the property and its associated text property are on different entitySet.
|
|
644
|
+
*
|
|
645
|
+
* @param dataModelPropertyPath The model object path of the property
|
|
646
|
+
* @param dataModelTextPath The model object path of the associated text property
|
|
647
|
+
* @returns True if the entitySet is different
|
|
648
|
+
*/;
|
|
649
|
+
_proto.isPropertyAssociatedTextOnDifferentEntitySet = function isPropertyAssociatedTextOnDifferentEntitySet(dataModelPropertyPath, dataModelTextPath) {
|
|
650
|
+
return dataModelPropertyPath.targetEntitySet !== dataModelTextPath.targetEntitySet && !!dataModelTextPath.navigationProperties && !!dataModelTextPath.targetEntityType;
|
|
651
|
+
}
|
|
652
|
+
|
|
588
653
|
/**
|
|
589
654
|
* Converts the SideEffects to expected format
|
|
590
655
|
* - Set TriggerAction as string
|
|
@@ -669,21 +734,35 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
|
|
|
669
734
|
* The path can be:
|
|
670
735
|
* - a path targeting a property on a complexType or an EntityType
|
|
671
736
|
* - a path with a star targeting all properties on a complexType or an EntityType.
|
|
737
|
+
* - absolute.
|
|
672
738
|
*
|
|
673
|
-
* @param
|
|
739
|
+
* @param propertyPath The path to analyze
|
|
674
740
|
* @param entityType Entity type
|
|
675
741
|
* @returns Array of dataModelObjectPath representing the properties
|
|
676
742
|
*/;
|
|
677
|
-
_proto.getDataModelPropertiesFromAPath = function getDataModelPropertiesFromAPath(
|
|
743
|
+
_proto.getDataModelPropertiesFromAPath = function getDataModelPropertiesFromAPath(propertyPath, entityType) {
|
|
678
744
|
let dataModelObjectPaths = [];
|
|
679
745
|
const convertedMetaModel = this.getConvertedMetaModel();
|
|
680
|
-
const
|
|
746
|
+
const containerName = convertedMetaModel.entityContainer.fullyQualifiedName;
|
|
747
|
+
let propertyRelativePath, testEntityTypeName, regexPattern, match;
|
|
748
|
+
if (propertyPath.startsWith(`/${containerName}/`)) {
|
|
749
|
+
regexPattern = new RegExp(`^\\/${containerName}\\/[^/]+\\/(.+)?$`);
|
|
750
|
+
match = propertyPath.match(regexPattern);
|
|
751
|
+
propertyRelativePath = match ? match[1] : undefined;
|
|
752
|
+
}
|
|
753
|
+
if (!entityType) {
|
|
754
|
+
regexPattern = new RegExp(`^/${containerName}/([^/]+)`);
|
|
755
|
+
match = propertyPath.match(regexPattern);
|
|
756
|
+
testEntityTypeName = match ? match[1] : undefined;
|
|
757
|
+
}
|
|
758
|
+
const testEntityType = entityType ?? (testEntityTypeName ? convertedMetaModel.resolvePath(`/${testEntityTypeName}/`).target : undefined);
|
|
759
|
+
const entitySet = convertedMetaModel.entitySets.find(relatedEntitySet => relatedEntitySet.entityType === testEntityType) ?? convertedMetaModel.singletons.find(singleton => singleton.entityType === testEntityType);
|
|
681
760
|
if (entitySet) {
|
|
682
761
|
const metaModel = this.getMetaModel(),
|
|
683
762
|
entitySetContext = metaModel.createBindingContext(`/${entitySet.name}`);
|
|
684
763
|
if (entitySetContext) {
|
|
685
764
|
const dataModelEntitySet = getInvolvedDataModelObjects(entitySetContext);
|
|
686
|
-
const dataModelObjectPath = enhanceDataModelPath(dataModelEntitySet,
|
|
765
|
+
const dataModelObjectPath = enhanceDataModelPath(dataModelEntitySet, (propertyRelativePath || propertyPath).replace("*", "") || "/"),
|
|
687
766
|
// "*" is replaced by "/" to target the current EntityType
|
|
688
767
|
targetObject = dataModelObjectPath.targetObject;
|
|
689
768
|
if (isProperty(targetObject)) {
|
|
@@ -702,7 +781,6 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
|
|
|
702
781
|
}
|
|
703
782
|
return dataModelObjectPaths.filter(dataModelObjectPath => dataModelObjectPath.targetObject);
|
|
704
783
|
}
|
|
705
|
-
|
|
706
784
|
/**
|
|
707
785
|
* Gets the Odata metamodel.
|
|
708
786
|
*
|
|
@@ -726,8 +804,8 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
|
|
|
726
804
|
const isSourceEntityType = isEntityType(source);
|
|
727
805
|
const entityType = isSourceEntityType ? source : source.sourceEntityType;
|
|
728
806
|
const commonAnnotation = (_source$annotations = source.annotations) === null || _source$annotations === void 0 ? void 0 : _source$annotations.Common;
|
|
729
|
-
if (
|
|
730
|
-
if (!isSourceEntityType) {
|
|
807
|
+
if (commonAnnotation) {
|
|
808
|
+
if (entityType && !isSourceEntityType) {
|
|
731
809
|
var _source$parameters;
|
|
732
810
|
const bindingParameter = (_source$parameters = source.parameters) === null || _source$parameters === void 0 ? void 0 : _source$parameters.find(parameter => parameter.type === entityType.fullyQualifiedName);
|
|
733
811
|
bindingAlias = (bindingParameter === null || bindingParameter === void 0 ? void 0 : bindingParameter.fullyQualifiedName.split("/")[1]) ?? "";
|
|
@@ -837,33 +915,29 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
|
|
|
837
915
|
* @param entityType Entity type
|
|
838
916
|
* @returns Entity type SideEffects dictionary
|
|
839
917
|
*/;
|
|
840
|
-
_proto.retrieveODataActionsSideEffects = function retrieveODataActionsSideEffects(
|
|
918
|
+
_proto.retrieveODataActionsSideEffects = function retrieveODataActionsSideEffects(action) {
|
|
919
|
+
var _action$fullyQualifie;
|
|
841
920
|
const sideEffects = {};
|
|
842
|
-
const
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
pathExpressions: [...sideEffectsTargets.targetProperties, ...sideEffectsTargets.targetEntities],
|
|
863
|
-
triggerActions: Array.from(triggerActions)
|
|
864
|
-
};
|
|
865
|
-
});
|
|
866
|
-
}
|
|
921
|
+
const triggerActions = new Set();
|
|
922
|
+
let targetProperties = [];
|
|
923
|
+
let targetEntities = [];
|
|
924
|
+
this.getSideEffectsFromSource(action).forEach(oDataSideEffect => {
|
|
925
|
+
const triggerAction = oDataSideEffect.triggerAction;
|
|
926
|
+
targetProperties = targetProperties.concat(oDataSideEffect.targetProperties);
|
|
927
|
+
targetEntities = targetEntities.concat(oDataSideEffect.targetEntities);
|
|
928
|
+
if (triggerAction) {
|
|
929
|
+
triggerActions.add(triggerAction);
|
|
930
|
+
}
|
|
931
|
+
});
|
|
932
|
+
const sideEffectsTargets = this.removeDuplicateTargets({
|
|
933
|
+
targetProperties,
|
|
934
|
+
targetEntities
|
|
935
|
+
});
|
|
936
|
+
const actionName = action.isBound ? (_action$fullyQualifie = action.fullyQualifiedName.match(/^[^(]+/)) === null || _action$fullyQualifie === void 0 ? void 0 : _action$fullyQualifie[0] : action.name;
|
|
937
|
+
sideEffects[actionName] = {
|
|
938
|
+
pathExpressions: [...sideEffectsTargets.targetProperties, ...sideEffectsTargets.targetEntities],
|
|
939
|
+
triggerActions: Array.from(triggerActions)
|
|
940
|
+
};
|
|
867
941
|
return sideEffects;
|
|
868
942
|
}
|
|
869
943
|
|
|
@@ -1008,4 +1082,4 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/converters/MetaModelConverter", "sap
|
|
|
1008
1082
|
}(ServiceFactory);
|
|
1009
1083
|
return SideEffectsServiceFactory;
|
|
1010
1084
|
}, false);
|
|
1011
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTaWRlRWZmZWN0c1NlcnZpY2UiLCJpbml0IiwiY29udGV4dCIsImdldENvbnRleHQiLCJhcHBDb21wb25lbnQiLCJzY29wZU9iamVjdCIsInNpZGVFZmZlY3RzUmVnaXN0cnkiLCJvRGF0YSIsImVudGl0aWVzIiwiYWN0aW9ucyIsImNvbnRyb2wiLCJyZWNvbW1lbmRhdGlvblJlZ2lzdHJ5Iiwicm9sZXMiLCJ0YXJnZXRDYWxsYmFja3MiLCJpbml0aWFsaXplV2ViU29ja2V0Q29ubmVjdGlvbiIsIm1vZGVsIiwiZ2V0TW9kZWwiLCJ1cmwiLCJnZXRXZWJTb2NrZXRCYXNlVXJsIiwiY2hhbm5lbCIsImdldFdlYlNvY2tldENoYW5uZWxVcmwiLCJDaGFubmVsVHlwZSIsIlNpZGVFZmZlY3RzRXZlbnRzIiwid2ViU29ja2V0IiwiY3JlYXRlV2ViU29ja2V0IiwiYXR0YWNoTWVzc2FnZSIsIm9uU2lkZUVmZmVjdHNFdmVudFJlY2VpdmVkIiwiYmluZCIsImV2ZW50IiwibWVzc2FnZSIsImdldFBhcmFtZXRlciIsInNlcnZlckFjdGlvbiIsInNpZGVFZmZlY3RFdmVudE5hbWUiLCJzaWRlRWZmZWN0U291cmNlIiwibWV0YVBhdGgiLCJnZXRNZXRhTW9kZWwiLCJnZXRNZXRhQ29udGV4dCIsImRhdGFNb2RlbCIsIk1ldGFNb2RlbENvbnZlcnRlciIsImdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyIsInJlbGV2YW50U2lkZUVmZmVjdHMiLCJnZXRTaWRlRWZmZWN0V2hlcmVFdmVudElzU291cmNlIiwidGFyZ2V0RW50aXR5VHlwZSIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsImxlbmd0aCIsInJlbGV2YW50UGFnZXMiLCJwYWdlcyIsImdldFJvb3RWaWV3Q29udHJvbGxlciIsImdldFZpc2libGVWaWV3cyIsInBhZ2UiLCJwYWdlQ29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJpc0EiLCJfc2lkZUVmZmVjdHMiLCJpc0RhdGFQYXRoUmVsZXZhbnQiLCJwdXNoIiwic2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uIiwiaW50ZXJhY3Rpb25UeXBlIiwiZ2V0TWFuaWZlc3RFbnRyeSIsImFwcCIsIl9zaWRlRWZmZWN0c0V2ZW50c0ludGVyYWN0aW9uVHlwZSIsImNvbmZpcm1EYXRhUmVmcmVzaCIsImVycm9yIiwibm90aWZ5RGF0YVJlZnJlc2giLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JFdmVudCIsImFkZENvbnRyb2xTaWRlRWZmZWN0cyIsImVudGl0eVR5cGUiLCJzaWRlRWZmZWN0Iiwic291cmNlQ29udHJvbElkIiwiY29udHJvbFNpZGVFZmZlY3QiLCJlbnRpdHlDb250cm9sU2lkZUVmZmVjdHMiLCJleGVjdXRlQWN0aW9uIiwidHJpZ2dlckFjdGlvbiIsImdyb3VwSWQiLCJhY3Rpb24iLCJiaW5kQ29udGV4dCIsImV4ZWN1dGUiLCJnZXRCaW5kaW5nIiwiZ2V0VXBkYXRlR3JvdXBJZCIsImdldENvbnZlcnRlZE1ldGFNb2RlbCIsImNvbnZlcnRUeXBlcyIsImNhcGFiaWxpdGllcyIsImdldEVudGl0eVR5cGVGcm9tQ29udGV4dCIsIm1ldGFNb2RlbCIsImdldE1ldGFQYXRoIiwiZ2V0UGF0aCIsImdldE9iamVjdCIsImdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJlbnRpdHlUeXBlTmFtZSIsImlzQ29udHJvbFNpZGVFZmZlY3RzIiwic2lkZUVmZmVjdHMiLCJnZXRHbG9iYWxPRGF0YUVudGl0eVNpZGVFZmZlY3RzIiwiZW50aXR5U2lkZUVmZmVjdHMiLCJnbG9iYWxTaWRlRWZmZWN0cyIsImtleSIsInNvdXJjZUVudGl0aWVzIiwic291cmNlUHJvcGVydGllcyIsInNvdXJjZUV2ZW50cyIsImdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMiLCJhY3Rpb25OYW1lIiwidW5kZWZpbmVkIiwiaW5pdGlhbGl6ZSIsInNpZGVFZmZlY3RTb3VyY2VzIiwicHJvcGVydGllcyIsImV2ZW50cyIsImVudmlyb25tZW50Q2FwYWJpbGl0aWVzU2VydmljZSIsImdldFNlcnZpY2UiLCJyZXF1ZXN0T2JqZWN0IiwiZ2V0Q2FwYWJpbGl0aWVzIiwiY29udmVydGVkTWV0YU1vZGVsIiwiZW50aXR5VHlwZXMiLCJmb3JFYWNoIiwibWFwRmllbGRBbm5vdGF0aW9ucyIsInJldHJpZXZlT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsInJldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMiLCJtYXBTaWRlRWZmZWN0U291cmNlcyIsIk9iamVjdCIsImtleXMiLCJzb3VyY2VzVG9TaWRlRWZmZWN0TWFwcGluZ3MiLCJzb3VyY2UiLCJhZGRSZWNvbW1lbmRhdGlvblJvbGVzIiwic291cmNlTmFtZSIsImhhc093blByb3BlcnR5IiwiaW5wdXQiLCJvdXRwdXQiLCJlbnRpdHlQcm9wZXJ0aWVzIiwicHJvcGVydHkiLCJjb21tb25Bbm5vIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJSZWNvbW1lbmRhdGlvblJvbGUiLCJyb2xlVHlwZSIsInZhbHVlT2YiLCJpbmNsdWRlcyIsIm5hbWUiLCJnZXRSZWNvbW1lbmRhdGlvbnNNYXBwaW5nIiwiY2hlY2tJZkZpZWxkSXNSZWNvbW1lbmRhdGlvblJlbGV2YW50IiwiZmllbGQiLCJnZXRCaW5kaW5nQ29udGV4dCIsInByb3BlcnR5TmFtZSIsImRhdGEiLCJzb3VyY2VQYXRoIiwic3BsaXQiLCJwb3AiLCJtZXRhQ29udGV4dCIsInRhcmdldERhdGFNb2RlbE9iamVjdCIsInRhcmdldE9iamVjdCIsInRhcmdldEVudGl0eVR5cGVOYW1lIiwidGFyZ2V0VHlwZSIsInJlY29tbWVuZGF0aW9uUm9sZXNGb3JFbnRpdHkiLCJnZXRSZWNvbW1lbmRhdGlvbk91dHB1dEZpZWxkcyIsInJlbW92ZUNvbnRyb2xTaWRlRWZmZWN0cyIsImNvbnRyb2xJZCIsInNFbnRpdHlUeXBlIiwicmVxdWVzdFNpZGVFZmZlY3RzIiwicGF0aEV4cHJlc3Npb25zIiwibG9nUmVxdWVzdCIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck9EYXRhQWN0aW9uIiwicHJvbWlzZXMiLCJ0cmlnZ2VyQWN0aW9ucyIsIm1hcCIsIlByb21pc2UiLCJhbGwiLCJyZXNvbHZlIiwicmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5IiwibmF2aWdhdGlvblByb3BlcnR5IiwiaWdub3JlVHJpZ2dlckFjdGlvbnMiLCJiYXNlRW50aXR5VHlwZSIsIm5hdmlnYXRpb25QYXRoIiwidGFyZ2V0UHJvcGVydGllcyIsInRhcmdldEVudGl0aWVzIiwic2lkZUVmZmVjdHNUYXJnZXRzIiwiZmlsdGVyIiwiYW5ub3RhdGlvbk5hbWUiLCJzb21lIiwibmF2aWdhdGlvbiIsIiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIiwicHJvcGVydHlQYXRoIiwic3RhcnRzV2l0aCIsInJlcGxhY2UiLCJzQW5ub3RhdGlvbk5hbWUiLCJjb25jYXQiLCJzaWRlRWZmZWN0c1RhcmdldERlZmluaXRpb24iLCJyZW1vdmVEdXBsaWNhdGVUYXJnZXRzIiwiY2F0Y2giLCJMb2ciLCJnZXRDb250cm9sRW50aXR5U2lkZUVmZmVjdHMiLCJnZXRTaWRlRWZmZWN0V2hlcmVFbnRpdHlJc1NvdXJjZSIsImV2ZW50TmFtZSIsImVudGl0eSIsImFubm90YXRpb24iLCJxdWFsaWZpZXIiLCJjb21wdXRlRmllbGRHcm91cElkcyIsInNvdXJjZUVudGl0eVR5cGUiLCJzb3VyY2VQcm9wZXJ0eSIsImVudGl0eUZpZWxkR3JvdXBJZHMiLCJzaWRlRWZmZWN0SW5mbyIsImdldEZpZWxkR3JvdXBJZEZvclNpZGVFZmZlY3QiLCJnZXRTaWRlRWZmZWN0V2hlcmVQcm9wZXJ0eUlzU291cmNlIiwicmVnaXN0ZXJUYXJnZXRDYWxsYmFjayIsInRhcmdldCIsImNhbGxiYWNrIiwiZGVyZWdpc3RlclRhcmdldENhbGxiYWNrIiwiZ2V0UmVnaXN0ZXJlZENhbGxiYWNrIiwiYWRkVGV4dFByb3BlcnRpZXMiLCJzZXRPZlByb3BlcnRpZXMiLCJTZXQiLCJzZXRPZkVudGl0aWVzIiwicHJvcGVydGllc1RvQW5hbHl6ZSIsInJlZHVjZSIsImRhdGFNb2RlbFByb3BlcnR5UGF0aHMiLCJnZXREYXRhTW9kZWxQcm9wZXJ0aWVzRnJvbUFQYXRoIiwiZGF0YU1vZGVsUHJvcGVydHlQYXRoIiwiYXNzb2NpYXRlZFRleHRQYXRoIiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgiLCJkYXRhTW9kZWxUZXh0UGF0aCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwicmVsYXRpdmVOYXZpZ2F0aW9uIiwiZ2V0VGFyZ2V0TmF2aWdhdGlvblBhdGgiLCJ0YXJnZXRQYXRoIiwiZ2V0VGFyZ2V0T2JqZWN0UGF0aCIsImlzUHJvcGVydHkiLCJoYXMiLCJuYXZpZ2F0aW9uUHJvcGVydGllcyIsInRhcmdldEVudGl0eVNldCIsImFkZCIsIkFycmF5IiwiZnJvbSIsImNvbnZlcnRTaWRlRWZmZWN0cyIsImJpbmRpbmdQYXJhbWV0ZXIiLCJUcmlnZ2VyQWN0aW9uIiwibmV3U2lkZUVmZmVjdHMiLCJjb252ZXJ0U2lkZUVmZmVjdHNGb3JtYXQiLCJyZW1vdmVCaW5kaW5nUGFyYW1ldGVyIiwiZm9ybWF0UHJvcGVydGllcyIsInBhdGgiLCJpc1Byb3BlcnR5UGF0aEV4cHJlc3Npb24iLCJ2YWx1ZSIsImZvcm1hdEVudGl0aWVzIiwidGFyZ2V0RW50aXR5IiwiU291cmNlUHJvcGVydGllcyIsIlNvdXJjZUVudGl0aWVzIiwiU291cmNlRXZlbnRzIiwiVGFyZ2V0UHJvcGVydGllcyIsIlRhcmdldEVudGl0aWVzIiwiZGF0YU1vZGVsT2JqZWN0UGF0aHMiLCJlbnRpdHlTZXQiLCJlbnRpdHlTZXRzIiwiZmluZCIsInJlbGF0ZWRFbnRpdHlTZXQiLCJzaW5nbGV0b25zIiwic2luZ2xldG9uIiwiZW50aXR5U2V0Q29udGV4dCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiZGF0YU1vZGVsRW50aXR5U2V0IiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsImlzQ29tcGxleFR5cGUiLCJpc0VudGl0eVR5cGUiLCJlbnRpdHlQcm9wZXJ0eSIsImRlc3Ryb3kiLCJnZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2UiLCJiaW5kaW5nQWxpYXMiLCJpc1NvdXJjZUVudGl0eVR5cGUiLCJjb21tb25Bbm5vdGF0aW9uIiwicGFyYW1ldGVycyIsInBhcmFtZXRlciIsInR5cGUiLCJnZXRTaWRlRWZmZWN0c0Fubm90YXRpb25Gcm9tU291cmNlIiwic2lkZUVmZmVjdEFubm8iLCJpc1NpZGVFZmZlY3RzQW5ub3RhdGlvbiIsIiRUeXBlIiwidGFyZ2V0UGF0aHMiLCJwYXRocyIsImRlYnVnIiwiYmluZGluZ1BhcmFtZXRlck5hbWUiLCJyZXBsYWNlQmluZGluZ1BhcmFtZXRlciIsIlJlZ0V4cCIsInRhcmdldFByb3BlcnR5IiwidGFyZ2V0RW50aXRpZXNQYXRocyIsInVuaXF1ZVRhcmdldGVkRW50aXRpZXNQYXRoIiwidW5pcXVlVGFyZ2V0UHJvcGVydGllcyIsInVuaXF1ZVRhcmdldGVkRW50aXRpZXMiLCJlbnRpdHlQYXRoIiwib0RhdGFTaWRlRWZmZWN0Iiwic2lkZUVmZmVjdHNTb3VyY2VzIiwic2lkZUVmZmVjdERlZmluaXRpb24iLCJtYXBTaWRlRWZmZWN0U291cmNlRW50aXRpZXMiLCJtYXBTaWRlRWZmZWN0U291cmNlUHJvcGVydGllcyIsIm1hcFNpZGVFZmZlY3RTb3VyY2VFdmVudHMiLCJzb3VyY2VFbnRpdHkiLCIkdGFyZ2V0IiwiaGFzVW5pcXVlU291cmNlUHJvcGVydHkiLCJzb3VyY2VFdmVudCIsInRvU3RyaW5nIiwiaXNJbW1lZGlhdGUiLCJzaWRlRWZmZWN0V2l0aFF1YWxpZmllciIsImdldEludGVyZmFjZSIsIlNlcnZpY2UiLCJTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5IiwiY3JlYXRlSW5zdGFuY2UiLCJvU2VydmljZUNvbnRleHQiLCJTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlIiwiU2VydmljZUZhY3RvcnkiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBY3Rpb24sIENvbnZlcnRlZE1ldGFkYXRhLCBFbnRpdHlUeXBlLCBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoLCBQcm9wZXJ0eVBhdGggfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCB0eXBlICogYXMgRWRtIGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy9FZG1cIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNUeXBlIGFzIENvbW1vblNpZGVFZmZlY3RzVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgeyBDb21tb25Bbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW1vblwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eUFubm90YXRpb25zX0NvbW1vbiB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uX0VkbVwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgdHlwZSBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB0eXBlIHsgRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCAqIGFzIE1ldGFNb2RlbENvbnZlcnRlciBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7IGNvbnZlcnRUeXBlcywgZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWV0YU1vZGVsQ29udmVydGVyXCI7XG5pbXBvcnQgeyBpc0NvbXBsZXhUeXBlLCBpc0VudGl0eVR5cGUsIGlzUHJvcGVydHksIGlzUHJvcGVydHlQYXRoRXhwcmVzc2lvbiB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB7IENoYW5uZWxUeXBlLCBjcmVhdGVXZWJTb2NrZXQsIGdldFdlYlNvY2tldEJhc2VVcmwsIGdldFdlYlNvY2tldENoYW5uZWxVcmwgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9XZWJTb2NrZXRcIjtcbmltcG9ydCB7IGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCB0eXBlIEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IFNlcnZpY2UgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZVwiO1xuaW1wb3J0IFNlcnZpY2VGYWN0b3J5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgdHlwZSBTYXBQY3BXZWJTb2NrZXQgZnJvbSBcInNhcC91aS9jb3JlL3dzL1NhcFBjcFdlYlNvY2tldFwiO1xuaW1wb3J0IHR5cGUgeyBXZWJTb2NrZXQkTWVzc2FnZUV2ZW50IH0gZnJvbSBcInNhcC91aS9jb3JlL3dzL1dlYlNvY2tldFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIENvbnRleHQgfSBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE9EYXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1vZGVsXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VDb250ZXh0IH0gZnJvbSBcInR5cGVzL21ldGFtb2RlbF90eXBlc1wiO1xuaW1wb3J0IHR5cGUgQXBwQ29tcG9uZW50IGZyb20gXCIuLi9BcHBDb21wb25lbnRcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCIuLi90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IGVuaGFuY2VEYXRhTW9kZWxQYXRoLCBnZXRUYXJnZXROYXZpZ2F0aW9uUGF0aCwgZ2V0VGFyZ2V0T2JqZWN0UGF0aCB9IGZyb20gXCIuLi90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgRW52aXJvbm1lbnRDYXBhYmlsaXRpZXNTZXJ2aWNlIH0gZnJvbSBcIi4vRW52aXJvbm1lbnRTZXJ2aWNlRmFjdG9yeVwiO1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eUFubm90YXRpb25zV2l0aFJlY29tbWVuZGF0aW9uID0gUHJvcGVydHlBbm5vdGF0aW9uc19Db21tb24gJiB7XG5cdFJlY29tbWVuZGF0aW9uUm9sZT86IHN0cmluZztcbn07XG5cbnR5cGUgU2lkZUVmZmVjdHNTZXR0aW5ncyA9IHt9O1xuXG5leHBvcnQgdHlwZSBTaWRlRWZmZWN0c0VudGl0eVR5cGUgPSB7XG5cdCROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgU2lkZUVmZmVjdHNUYXJnZXQgPSBTaWRlRWZmZWN0c0VudGl0eVR5cGUgfCBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSA9IHtcblx0dGFyZ2V0UHJvcGVydGllczogc3RyaW5nW107XG5cdHRhcmdldEVudGl0aWVzOiBTaWRlRWZmZWN0c0VudGl0eVR5cGVbXTtcbn07XG5cbnR5cGUgQmFzZVNpZGVFZmZlY3RzVHlwZSA9IHtcblx0c291cmNlUHJvcGVydGllcz86IHN0cmluZ1tdO1xuXHRzb3VyY2VFbnRpdGllcz86IFNpZGVFZmZlY3RzRW50aXR5VHlwZVtdO1xuXHRzb3VyY2VFdmVudHM/OiBzdHJpbmdbXTtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG59ICYgU2lkZUVmZmVjdHNUYXJnZXRUeXBlO1xuXG5leHBvcnQgdHlwZSBPRGF0YVNpZGVFZmZlY3RzVHlwZSA9IEJhc2VTaWRlRWZmZWN0c1R5cGUgJiB7XG5cdHRyaWdnZXJBY3Rpb24/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBY3Rpb25TaWRlRWZmZWN0c1R5cGUgPSB7XG5cdHBhdGhFeHByZXNzaW9ucz86IFNpZGVFZmZlY3RzVGFyZ2V0W107XG5cdHRyaWdnZXJBY3Rpb25zPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBDb250cm9sU2lkZUVmZmVjdHNUeXBlID0gUGFydGlhbDxCYXNlU2lkZUVmZmVjdHNUeXBlPiAmIHtcblx0ZnVsbHlRdWFsaWZpZWROYW1lOiBzdHJpbmc7XG5cdHNvdXJjZVByb3BlcnRpZXM6IHN0cmluZ1tdO1xuXHRzb3VyY2VDb250cm9sSWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RzVHlwZSA9IENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgfCBPRGF0YVNpZGVFZmZlY3RzVHlwZTtcblxuLy9UT0RPIGZpeCB0aGlzIHR5cGUgaW4gdGhlIHV4IHZvY2FidWxhcmllc1xuLy9UT0RPOiBTb3VyY2UgRXZlbnRzIGFyZSBzdGlsbCBleHBlcmltZW50YWwsIHJlbW92ZSBvbmNlIHB1YmxpY1xudHlwZSBDb21tb25TaWRlRWZmZWN0VHlwZVdpdGhRdWFsaWZpZXIgPSBDb21tb25TaWRlRWZmZWN0c1R5cGUgJiB7IHF1YWxpZmllcj86IHN0cmluZzsgU291cmNlRXZlbnRzPzogRWRtLlN0cmluZ1tdIH07XG5cbmV4cG9ydCB0eXBlIE9EYXRhU2lkZUVmZmVjdHNFbnRpdHlEaWN0aW9uYXJ5ID0gUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+O1xuZXhwb3J0IHR5cGUgT0RhdGFTaWRlRWZmZWN0c0FjdGlvbkRpY3Rpb25hcnkgPSBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+O1xuZXhwb3J0IHR5cGUgQ29udHJvbFNpZGVFZmZlY3RzRW50aXR5RGljdGlvbmFyeSA9IFJlY29yZDxzdHJpbmcsIENvbnRyb2xTaWRlRWZmZWN0c1R5cGU+O1xuXG5leHBvcnQgdHlwZSBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZSA9IHsgZW50aXR5OiBzdHJpbmc7IHF1YWxpZmllcj86IHN0cmluZzsgaGFzVW5pcXVlU291cmNlUHJvcGVydHk/OiBib29sZWFuIH07XG5cbnR5cGUgU2lkZUVmZmVjdHNPcmlnaW5SZWdpc3RyeSA9IHtcblx0b0RhdGE6IHtcblx0XHRlbnRpdGllczoge1xuXHRcdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+O1xuXHRcdH07XG5cdFx0YWN0aW9uczoge1xuXHRcdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPjtcblx0XHR9O1xuXHR9O1xuXHRjb250cm9sOiB7XG5cdFx0W2VudGl0eTogc3RyaW5nXTogUmVjb3JkPHN0cmluZywgQ29udHJvbFNpZGVFZmZlY3RzVHlwZT47XG5cdH07XG59O1xuXG50eXBlIFJlY29tbWVuZGF0aW9uc1JvbGVzID0ge1xuXHRpbnB1dDogc3RyaW5nW107XG5cdG91dHB1dDogc3RyaW5nW107XG5cdHJlcXVpcmVkPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBSZWNvbW1lbmRhdGlvbnNSZWdpc3RyeSA9IHtcblx0cm9sZXM6IFJlY29yZDxzdHJpbmcsIFJlY29tbWVuZGF0aW9uc1JvbGVzPjtcbn07XG5cbnR5cGUgV2ViU29ja2V0TWVzc2FnZSA9IHtcblx0c2VydmVyQWN0aW9uOiBcIlJhaXNlU2lkZUVmZmVjdFwiO1xuXHRzaWRlRWZmZWN0RXZlbnROYW1lOiBzdHJpbmc7XG5cdHNpZGVFZmZlY3RTb3VyY2U6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBTaWRlRWZmZWN0c1NlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlPFNpZGVFZmZlY3RzU2V0dGluZ3M+IHtcblx0YXBwQ29tcG9uZW50ITogQXBwQ29tcG9uZW50O1xuXG5cdHByaXZhdGUgc2lkZUVmZmVjdHNSZWdpc3RyeSE6IFNpZGVFZmZlY3RzT3JpZ2luUmVnaXN0cnk7XG5cblx0cHJpdmF0ZSByZWNvbW1lbmRhdGlvblJlZ2lzdHJ5ITogUmVjb21tZW5kYXRpb25zUmVnaXN0cnk7XG5cblx0cHJpdmF0ZSBjYXBhYmlsaXRpZXMhOiBFbnZpcm9ubWVudENhcGFiaWxpdGllcyB8IHVuZGVmaW5lZDtcblxuXHRwcml2YXRlIHNvdXJjZXNUb1NpZGVFZmZlY3RNYXBwaW5ncyE6IHtcblx0XHRlbnRpdGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0ZXZlbnRzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0fTtcblxuXHQvLyBDYWxsYmFjayBtZXRob2RzIHRvIGJlIGNhbGxlZCB3aGVuZXZlciBhIHNpZGUgZWZmZWN0IHRhcmdldCBpcyBoaXRcblx0cHJpdmF0ZSB0YXJnZXRDYWxsYmFja3MhOiBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj47XG5cblx0Ly8gV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gcmV0cmlldmUgU2lkZUVmZmVjdHMgZXZlbnRzXG5cdHByaXZhdGUgd2ViU29ja2V0PzogU2FwUGNwV2ViU29ja2V0O1xuXG5cdC8vICE6IG1lYW5zIHRoYXQgd2Uga25vdyBpdCB3aWxsIGJlIGFzc2lnbmVkIGJlZm9yZSB1c2FnZVxuXHRpbml0KCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblx0XHR0aGlzLmFwcENvbXBvbmVudCA9IGNvbnRleHQ/LnNjb3BlT2JqZWN0IGFzIEFwcENvbXBvbmVudDtcblx0XHR0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkgPSB7XG5cdFx0XHRvRGF0YToge1xuXHRcdFx0XHRlbnRpdGllczoge30sXG5cdFx0XHRcdGFjdGlvbnM6IHt9XG5cdFx0XHR9LFxuXHRcdFx0Y29udHJvbDoge31cblx0XHR9O1xuXG5cdFx0dGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5ID0ge1xuXHRcdFx0cm9sZXM6IHt9XG5cdFx0fTtcblx0XHR0aGlzLnRhcmdldENhbGxiYWNrcyA9IHt9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbm5lY3RzIHRvIGEgZ2l2ZW4gV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gcmV0cmlldmUgU2lkZUVmZmVjdHMgZXZlbnRzLlxuXHQgKlxuXHQgKi9cblx0aW5pdGlhbGl6ZVdlYlNvY2tldENvbm5lY3Rpb24oKTogdm9pZCB7XG5cdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmFwcENvbXBvbmVudC5nZXRNb2RlbCgpO1xuXHRcdGNvbnN0IHVybCA9IGdldFdlYlNvY2tldEJhc2VVcmwobW9kZWwpO1xuXHRcdGNvbnN0IGNoYW5uZWwgPSBnZXRXZWJTb2NrZXRDaGFubmVsVXJsKENoYW5uZWxUeXBlLlNpZGVFZmZlY3RzRXZlbnRzLCBtb2RlbCk7XG5cblx0XHRpZiAodXJsICYmIGNoYW5uZWwpIHtcblx0XHRcdHRoaXMud2ViU29ja2V0ID0gY3JlYXRlV2ViU29ja2V0KENoYW5uZWxUeXBlLlNpZGVFZmZlY3RzRXZlbnRzLCBtb2RlbCk7XG5cdFx0XHR0aGlzLndlYlNvY2tldC5hdHRhY2hNZXNzYWdlKHRoaXMub25TaWRlRWZmZWN0c0V2ZW50UmVjZWl2ZWQuYmluZCh0aGlzKSk7XG5cdFx0fVxuXHRcdHJldHVybjtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGNvbm5lY3RlZCBXZWJTb2NrZXQgc2VuZHMgYSBtZXNzYWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHdpdGggdGhlIHJlbGV2YW50IHNpZGVFZmZlY3QgaW5mb3JtYXRpb25cblx0ICovXG5cdGFzeW5jIG9uU2lkZUVmZmVjdHNFdmVudFJlY2VpdmVkKGV2ZW50OiBXZWJTb2NrZXQkTWVzc2FnZUV2ZW50ICYgRXZlbnQ8eyBwY3BGaWVsZHM/OiBXZWJTb2NrZXRNZXNzYWdlIH0+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3QgbWVzc2FnZSA9IGV2ZW50LmdldFBhcmFtZXRlcihcInBjcEZpZWxkc1wiKTtcblxuXHRcdGlmIChtZXNzYWdlPy5zZXJ2ZXJBY3Rpb24gIT09IFwiUmFpc2VTaWRlRWZmZWN0XCIgfHwgIW1lc3NhZ2Uuc2lkZUVmZmVjdEV2ZW50TmFtZSB8fCAhbWVzc2FnZS5zaWRlRWZmZWN0U291cmNlKSB7XG5cdFx0XHQvLyBtZXNzYWdlIGlzIG5vdCByZWxldmFudFxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1ldGFQYXRoID0gdGhpcy5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChtZXNzYWdlLnNpZGVFZmZlY3RTb3VyY2UpO1xuXHRcdGNvbnN0IGRhdGFNb2RlbCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YVBhdGgpO1xuXHRcdGNvbnN0IHJlbGV2YW50U2lkZUVmZmVjdHMgPSB0aGlzLmdldFNpZGVFZmZlY3RXaGVyZUV2ZW50SXNTb3VyY2UoXG5cdFx0XHRkYXRhTW9kZWwudGFyZ2V0RW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRtZXNzYWdlLnNpZGVFZmZlY3RFdmVudE5hbWVcblx0XHQpO1xuXG5cdFx0aWYgKHJlbGV2YW50U2lkZUVmZmVjdHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQvLyBubyBzaWRlIGVmZmVjdCBmb3IgdGhpcyBzb3VyY2Vcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCByZWxldmFudFBhZ2VzOiBQYWdlQ29udHJvbGxlcltdID0gW107XG5cdFx0Y29uc3QgcGFnZXMgPSB0aGlzLmFwcENvbXBvbmVudC5nZXRSb290Vmlld0NvbnRyb2xsZXIoKS5nZXRWaXNpYmxlVmlld3MoKTtcblx0XHRmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHtcblx0XHRcdGNvbnN0IHBhZ2VDb250cm9sbGVyID0gcGFnZS5nZXRDb250cm9sbGVyKCk7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHBhZ2VDb250cm9sbGVyLmlzQTxQYWdlQ29udHJvbGxlcj4oXCJzYXAuZmUuY29yZS5QYWdlQ29udHJvbGxlclwiKSAmJlxuXHRcdFx0XHRwYWdlQ29udHJvbGxlci5fc2lkZUVmZmVjdHMuaXNEYXRhUGF0aFJlbGV2YW50KG1lc3NhZ2Uuc2lkZUVmZmVjdFNvdXJjZSlcblx0XHRcdCkge1xuXHRcdFx0XHRyZWxldmFudFBhZ2VzLnB1c2gocGFnZUNvbnRyb2xsZXIpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChyZWxldmFudFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Ly8gbm8gcmVsZXZhbnQgcGFnZSBmb3VuZCBmb3IgdGhpcyBzb3VyY2Vcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyB3ZSBhc2sgdGhlIHVzZXIgdG8gY29uZmlybSB0aGUgcmVmcmVzaCBvciBub3RpZnkgdGhlIHVzZXIsIHdlIHVzZSB0aGUgbW9zdCBzcGVjaWZpYyBwYWdlXG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uID0gcmVsZXZhbnRQYWdlc1tyZWxldmFudFBhZ2VzLmxlbmd0aCAtIDFdLl9zaWRlRWZmZWN0cztcblx0XHRjb25zdCBpbnRlcmFjdGlvblR5cGUgPSB0aGlzLmFwcENvbXBvbmVudC5nZXRNYW5pZmVzdEVudHJ5KFwic2FwLmZlXCIpPy5hcHA/Ll9zaWRlRWZmZWN0c0V2ZW50c0ludGVyYWN0aW9uVHlwZSA/PyBcIk5vdGlmaWNhdGlvblwiO1xuXG5cdFx0c3dpdGNoIChpbnRlcmFjdGlvblR5cGUpIHtcblx0XHRcdGNhc2UgXCJDb25maXJtYXRpb25cIjpcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRhd2FpdCBzaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb24uY29uZmlybURhdGFSZWZyZXNoKCk7XG5cdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIk5vdGlmaWNhdGlvblwiOlxuXHRcdFx0XHRzaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb24ubm90aWZ5RGF0YVJlZnJlc2goKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTm9uZVwiOlxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHQvLyBub3cgcmVmcmVzaCB0aGUgcGFnZXMsIGZvcndhcmQgdGhpcyB0YXNrIHRvIHRoZSBzaWRlIGVmZmVjdHMgY29udHJvbGxlciBleHRlbnNpb25zIHRvIGFsbG93IG92ZXJyaWRpbmcgcGVyIHBhZ2UgKGkuZS4gTFIpXG5cdFx0Zm9yIChjb25zdCBwYWdlIG9mIHJlbGV2YW50UGFnZXMpIHtcblx0XHRcdGF3YWl0IHBhZ2UuX3NpZGVFZmZlY3RzLnJlcXVlc3RTaWRlRWZmZWN0c0ZvckV2ZW50KG1lc3NhZ2Uuc2lkZUVmZmVjdEV2ZW50TmFtZSwgbWVzc2FnZS5zaWRlRWZmZWN0U291cmNlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIFNpZGVFZmZlY3RzIGNvbnRyb2xcblx0ICogU2lkZUVmZmVjdHMgZGVmaW5pdGlvbiBpcyBhZGRlZCBieSBhIGNvbnRyb2wgdG8ga2VlcCBkYXRhIHVwIHRvIGRhdGVcblx0ICogVGhlc2UgU2lkZUVmZmVjdHMgZ2V0IGxpbWl0ZWQgc2NvcGUgY29tcGFyZWQgd2l0aCBTaWRlRWZmZWN0cyBjb21pbmcgZnJvbSBhbiBPRGF0YSBzZXJ2aWNlOlxuXHQgKiAtIE9ubHkgb25lIFNpZGVFZmZlY3RzIGRlZmluaXRpb24gY2FuIGJlIGRlZmluZWQgZm9yIHRoZSBjb21iaW5hdGlvbiBlbnRpdHkgdHlwZSAtIGNvbnRyb2wgSWRcblx0ICogLSBPbmx5IFNpZGVFZmZlY3RzIHNvdXJjZSBwcm9wZXJ0aWVzIGFyZSByZWNvZ25pemVkIGFuZCB1c2VkIHRvIHRyaWdnZXIgU2lkZUVmZmVjdHNcblx0ICpcblx0ICogRW5zdXJlIHRoZSBzb3VyY2VDb250cm9sSWQgbWF0Y2hlcyB0aGUgYXNzb2NpYXRlZCBTQVBVSTUgY29udHJvbCBJRC5cblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgTmFtZSBvZiB0aGUgZW50aXR5IHR5cGVcblx0ICogQHBhcmFtIHNpZGVFZmZlY3QgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHVibGljIGFkZENvbnRyb2xTaWRlRWZmZWN0cyhlbnRpdHlUeXBlOiBzdHJpbmcsIHNpZGVFZmZlY3Q6IE9taXQ8Q29udHJvbFNpZGVFZmZlY3RzVHlwZSwgXCJmdWxseVF1YWxpZmllZE5hbWVcIj4pOiB2b2lkIHtcblx0XHRpZiAoc2lkZUVmZmVjdC5zb3VyY2VDb250cm9sSWQpIHtcblx0XHRcdGNvbnN0IGNvbnRyb2xTaWRlRWZmZWN0OiBDb250cm9sU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRcdFx0XHQuLi5zaWRlRWZmZWN0LFxuXHRcdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IGAke2VudGl0eVR5cGV9L1NpZGVFZmZlY3RzRm9yQ29udHJvbC8ke3NpZGVFZmZlY3Quc291cmNlQ29udHJvbElkfWBcblx0XHRcdH07XG5cdFx0XHRjb25zdCBlbnRpdHlDb250cm9sU2lkZUVmZmVjdHMgPSB0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkuY29udHJvbFtlbnRpdHlUeXBlXSB8fCB7fTtcblx0XHRcdGVudGl0eUNvbnRyb2xTaWRlRWZmZWN0c1tjb250cm9sU2lkZUVmZmVjdC5zb3VyY2VDb250cm9sSWRdID0gY29udHJvbFNpZGVFZmZlY3Q7XG5cdFx0XHR0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkuY29udHJvbFtlbnRpdHlUeXBlXSA9IGVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cztcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRXhlY3V0ZXMgU2lkZUVmZmVjdHMgYWN0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gdHJpZ2dlckFjdGlvbiBOYW1lIG9mIHRoZSBhY3Rpb25cblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dFxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3Rcblx0ICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aG91dCBkYXRhIG9yIHdpdGggYSByZXR1cm4gdmFsdWUgY29udGV4dCB3aGVuIHRoZSBhY3Rpb24gY2FsbCBzdWNjZWVkZWRcblx0ICovXG5cdHB1YmxpYyBhc3luYyBleGVjdXRlQWN0aW9uKHRyaWdnZXJBY3Rpb246IHN0cmluZywgY29udGV4dDogQ29udGV4dCwgZ3JvdXBJZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGFjdGlvbiA9IGNvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChgJHt0cmlnZ2VyQWN0aW9ufSguLi4pYCwgY29udGV4dCk7XG5cdFx0YXdhaXQgYWN0aW9uLmV4ZWN1dGUoZ3JvdXBJZCB8fCBjb250ZXh0LmdldEJpbmRpbmcoKS5nZXRVcGRhdGVHcm91cElkKCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgY29udmVydGVkIE9EYXRhIG1ldGFNb2RlbC5cblx0ICpcblx0ICogQHJldHVybnMgQ29udmVydGVkIE9EYXRhIG1ldGFNb2RlbFxuXHQgKi9cblx0cHVibGljIGdldENvbnZlcnRlZE1ldGFNb2RlbCgpOiBDb252ZXJ0ZWRNZXRhZGF0YSB7XG5cdFx0cmV0dXJuIGNvbnZlcnRUeXBlcyh0aGlzLmdldE1ldGFNb2RlbCgpLCB0aGlzLmNhcGFiaWxpdGllcyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZW50aXR5IHR5cGUgb2YgYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0XG5cdCAqIEByZXR1cm5zIEVudGl0eSBUeXBlXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KGNvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKSxcblx0XHRcdGVudGl0eVR5cGUgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KG1ldGFQYXRoKVtcIiRUeXBlXCJdO1xuXHRcdHJldHVybiBlbnRpdHlUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIHNlcnZpY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRyZXR1cm4gdGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmVudGl0aWVzW2VudGl0eVR5cGVOYW1lXSB8fCB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJcyBhIFNpZGVFZmZlY3RzIGdlbmVyYXRlZCBieSBhIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0cyBUaGUgU2lkZUVmZmVjdHNcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgU2lkZUVmZmVjdHMgaXMgZ2VuZXJhdGVkIGJ5IGEgY29udHJvbCwgb3RoZXJ3aXNlIGZhbHNlXG5cdCAqL1xuXHRwdWJsaWMgaXNDb250cm9sU2lkZUVmZmVjdHMoc2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSk6IHNpZGVFZmZlY3RzIGlzIENvbnRyb2xTaWRlRWZmZWN0c1R5cGUge1xuXHRcdHJldHVybiAhIShzaWRlRWZmZWN0cyBhcyBDb250cm9sU2lkZUVmZmVjdHNUeXBlKS5zb3VyY2VDb250cm9sSWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZ2xvYmFsIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIHNlcnZpY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyBHbG9iYWwgU2lkZUVmZmVjdHNcblx0ICovXG5cdHB1YmxpYyBnZXRHbG9iYWxPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGVOYW1lOiBzdHJpbmcpOiBPRGF0YVNpZGVFZmZlY3RzVHlwZVtdIHtcblx0XHRjb25zdCBlbnRpdHlTaWRlRWZmZWN0cyA9IHRoaXMuZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlTmFtZSk7XG5cdFx0Y29uc3QgZ2xvYmFsU2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBlbnRpdHlTaWRlRWZmZWN0cykge1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHMgPSBlbnRpdHlTaWRlRWZmZWN0c1trZXldO1xuXHRcdFx0aWYgKCFzaWRlRWZmZWN0cy5zb3VyY2VFbnRpdGllcyAmJiAhc2lkZUVmZmVjdHMuc291cmNlUHJvcGVydGllcyAmJiAhc2lkZUVmZmVjdHMuc291cmNlRXZlbnRzKSB7XG5cdFx0XHRcdGdsb2JhbFNpZGVFZmZlY3RzLnB1c2goc2lkZUVmZmVjdHMpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZ2xvYmFsU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgc2VydmljZS5cblx0ICpcblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHRcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHVibGljIGdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoYWN0aW9uTmFtZTogc3RyaW5nLCBjb250ZXh0PzogQ29udGV4dCk6IEFjdGlvblNpZGVFZmZlY3RzVHlwZSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGNvbnRleHQpIHtcblx0XHRcdGNvbnN0IGVudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChjb250ZXh0KTtcblx0XHRcdGlmIChlbnRpdHlUeXBlKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuYWN0aW9uc1tlbnRpdHlUeXBlXT8uW2FjdGlvbk5hbWVdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyB0aGUgZGljdGlvbmFyeSBmb3IgdGhlIFNpZGVFZmZlY3RzLlxuXHQgKiAgQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgd2l0aCB0aGUgU2lkZUVmZmVjdHMgc2VydmljZSBvbmNlIGRhdGEgaGFzIGJlZW4gd3JpdHRlblxuXHQgKi9cblx0YXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHRoaXM+IHtcblx0XHRjb25zdCBzaWRlRWZmZWN0U291cmNlczoge1xuXHRcdFx0ZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRldmVudHM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdH0gPSB7XG5cdFx0XHRlbnRpdGllczoge30sXG5cdFx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRcdGV2ZW50czoge31cblx0XHR9O1xuXHRcdGNvbnN0IGVudmlyb25tZW50Q2FwYWJpbGl0aWVzU2VydmljZSA9IChhd2FpdCB0aGlzLmFwcENvbXBvbmVudC5nZXRTZXJ2aWNlKFxuXHRcdFx0XCJlbnZpcm9ubWVudENhcGFiaWxpdGllc1wiXG5cdFx0KSkgYXMgRW52aXJvbm1lbnRDYXBhYmlsaXRpZXNTZXJ2aWNlO1xuXHRcdGNvbnN0IG1vZGVsID0gdGhpcy5hcHBDb21wb25lbnQuZ2V0TW9kZWwoKTtcblx0XHRpZiAobW9kZWw/LmlzQT8uPE9EYXRhTW9kZWw+KFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWxcIikpIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIE1ldGFNb2RlbCB0byBiZSByZXF1ZXN0ZWRcblx0XHRcdGF3YWl0IG1vZGVsLmdldE1ldGFNb2RlbCgpLnJlcXVlc3RPYmplY3QoXCIvJEVudGl0eUNvbnRhaW5lci9cIik7XG5cdFx0XHR0aGlzLmNhcGFiaWxpdGllcyA9IGVudmlyb25tZW50Q2FwYWJpbGl0aWVzU2VydmljZS5nZXRDYXBhYmlsaXRpZXMoKTtcblxuXHRcdFx0Y29uc3QgY29udmVydGVkTWV0YU1vZGVsID0gdGhpcy5nZXRDb252ZXJ0ZWRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnZlcnRlZE1ldGFNb2RlbC5lbnRpdHlUeXBlcy5mb3JFYWNoKChlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKSA9PiB7XG5cdFx0XHRcdHRoaXMubWFwRmllbGRBbm5vdGF0aW9ucyhlbnRpdHlUeXBlKTtcblx0XHRcdFx0dGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmVudGl0aWVzW2VudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHRoaXMucmV0cmlldmVPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGUpO1xuXHRcdFx0XHR0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuYWN0aW9uc1tlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB0aGlzLnJldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMoZW50aXR5VHlwZSk7IC8vIG9ubHkgYm91bmQgYWN0aW9ucyBhcmUgYW5hbHl6ZWQgc2luY2UgdW5ib3VuZCBvbmVzIGRvbid0IGdldCBTaWRlRWZmZWN0c1xuXHRcdFx0XHR0aGlzLm1hcFNpZGVFZmZlY3RTb3VyY2VzKGVudGl0eVR5cGUsIHNpZGVFZmZlY3RTb3VyY2VzKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAoT2JqZWN0LmtleXMoc2lkZUVmZmVjdFNvdXJjZXMuZXZlbnRzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuaW5pdGlhbGl6ZVdlYlNvY2tldENvbm5lY3Rpb24oKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5zb3VyY2VzVG9TaWRlRWZmZWN0TWFwcGluZ3MgPSBzaWRlRWZmZWN0U291cmNlcztcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHByaXZhdGUgbWFwRmllbGRBbm5vdGF0aW9ucyhzb3VyY2U6IEVudGl0eVR5cGUpOiB2b2lkIHtcblx0XHRjb25zdCBhZGRSZWNvbW1lbmRhdGlvblJvbGVzID0gKHNvdXJjZU5hbWU6IHN0cmluZyk6IHZvaWQgPT4ge1xuXHRcdFx0aWYgKCF0aGlzLnJlY29tbWVuZGF0aW9uUmVnaXN0cnkucm9sZXMuaGFzT3duUHJvcGVydHkoYCR7c291cmNlTmFtZX1gKSkge1xuXHRcdFx0XHR0aGlzLnJlY29tbWVuZGF0aW9uUmVnaXN0cnkucm9sZXNbYCR7c291cmNlTmFtZX1gXSA9IHtcblx0XHRcdFx0XHRpbnB1dDogW10sXG5cdFx0XHRcdFx0b3V0cHV0OiBbXVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0c291cmNlLmVudGl0eVByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcblx0XHRcdGNvbnN0IGNvbW1vbkFubm8gPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24gYXMgUHJvcGVydHlBbm5vdGF0aW9uc1dpdGhSZWNvbW1lbmRhdGlvbjtcblx0XHRcdGlmIChjb21tb25Bbm5vPy5SZWNvbW1lbmRhdGlvblJvbGUpIHtcblx0XHRcdFx0Y29uc3Qgcm9sZVR5cGUgPSBjb21tb25Bbm5vLlJlY29tbWVuZGF0aW9uUm9sZTtcblx0XHRcdFx0aWYgKHJvbGVUeXBlLnZhbHVlT2YoKS5pbmNsdWRlcyhcIklucHV0XCIpKSB7XG5cdFx0XHRcdFx0YWRkUmVjb21tZW5kYXRpb25Sb2xlcyhgJHtzb3VyY2UubmFtZX1gKTtcblx0XHRcdFx0XHR0aGlzLnJlY29tbWVuZGF0aW9uUmVnaXN0cnkucm9sZXNbYCR7c291cmNlLm5hbWV9YF0uaW5wdXQucHVzaChwcm9wZXJ0eS5uYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocm9sZVR5cGUudmFsdWVPZigpLmluY2x1ZGVzKFwiT3V0cHV0XCIpKSB7XG5cdFx0XHRcdFx0YWRkUmVjb21tZW5kYXRpb25Sb2xlcyhgJHtzb3VyY2UubmFtZX1gKTtcblx0XHRcdFx0XHR0aGlzLnJlY29tbWVuZGF0aW9uUmVnaXN0cnkucm9sZXNbYCR7c291cmNlLm5hbWV9YF0ub3V0cHV0LnB1c2gocHJvcGVydHkubmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRSZWNvbW1lbmRhdGlvbnNNYXBwaW5nKCk6IFJlY29tbWVuZGF0aW9uc1JlZ2lzdHJ5IHtcblx0XHRyZXR1cm4gdGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSBpZiBmaWVsZCBpcyBwYXJ0IG9mIFJlY29tbWVuZGF0aW9uJ3MgaW5wdXQgbWFwcGluZyBhbmQgZnJvbSB0aGUgc2FtZSBlbnRpdHkuXG5cdCAqIE90aGVyd2lzZSByZXR1cm4gZmFsc2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBmaWVsZFxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGZpZWxkIGlzIGhhcyByZWNvbW1lbmRhdGlvbiByb2xlIC0gSW5wdXQgYW5ub3RhdGlvblxuXHQgKi9cblx0cHVibGljIGNoZWNrSWZGaWVsZElzUmVjb21tZW5kYXRpb25SZWxldmFudChmaWVsZDogQ29udHJvbCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGNvbnRleHQgPSBmaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IGZpZWxkLmRhdGEoKS5zb3VyY2VQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKTtcblx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dD8uZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gKG1ldGFNb2RlbCBhcyBPRGF0YU1ldGFNb2RlbCk/LmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IHRhcmdldERhdGFNb2RlbE9iamVjdCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YUNvbnRleHQpLnRhcmdldE9iamVjdDtcblx0XHRcdGNvbnN0IHRhcmdldEVudGl0eVR5cGVOYW1lID0gdGFyZ2V0RGF0YU1vZGVsT2JqZWN0LmVudGl0eVR5cGU/Lm5hbWUgfHwgdGFyZ2V0RGF0YU1vZGVsT2JqZWN0LnRhcmdldFR5cGU/Lm5hbWU7XG5cdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvblJvbGVzRm9yRW50aXR5ID0gdGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5LnJvbGVzW3RhcmdldEVudGl0eVR5cGVOYW1lXTtcblx0XHRcdGlmIChyZWNvbW1lbmRhdGlvblJvbGVzRm9yRW50aXR5Py5pbnB1dD8uaW5jbHVkZXMocHJvcGVydHlOYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1ldGhvZCByZXR1cm5zIHRoZSBwcm9wZXJ0aWVzIGluIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgd2hpY2ggYXJlIG1hcmtlZCBhcyBSZWNvbW1lbmRhdGlvblJvbGUgT3V0cHV0LlxuXHQgKlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZU5hbWUgRW50aXR5IHR5cGUgZm9yIHdoaWNoIHJlY29tbWVuZGF0aW9uIE91dHB1dCBmaWVsZHMgbmVlZHMgdG8gYmUgZmlndXJlZFxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyB3aGljaCBhcmUgbWFya2VkIFJlY29tbWVuZGF0aW9uUm9sZSBPdXRwdXRcblx0ICovXG5cdHB1YmxpYyBnZXRSZWNvbW1lbmRhdGlvbk91dHB1dEZpZWxkcyhlbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRcdC8vVE9ETzogV2UgaGF2ZSB0byBjb25zaWRlciAxOjEgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIGFzIHdlbGwuXG5cdFx0Y29uc3QgcmVjb21tZW5kYXRpb25Sb2xlc0ZvckVudGl0eSA9IHRoaXMucmVjb21tZW5kYXRpb25SZWdpc3RyeS5yb2xlc1tlbnRpdHlUeXBlTmFtZV07XG5cdFx0aWYgKHJlY29tbWVuZGF0aW9uUm9sZXNGb3JFbnRpdHk/Lm91dHB1dD8ubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIHJlY29tbWVuZGF0aW9uUm9sZXNGb3JFbnRpdHkub3V0cHV0O1xuXHRcdH1cblxuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgY29udHJvbC5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRyb2xJZCBDb250cm9sIElkXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlQ29udHJvbFNpZGVFZmZlY3RzKGNvbnRyb2xJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0T2JqZWN0LmtleXModGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5LmNvbnRyb2wpLmZvckVhY2goKHNFbnRpdHlUeXBlKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5LmNvbnRyb2xbc0VudGl0eVR5cGVdW2NvbnRyb2xJZF0pIHtcblx0XHRcdFx0ZGVsZXRlIHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5jb250cm9sW3NFbnRpdHlUeXBlXVtjb250cm9sSWRdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBTaWRlRWZmZWN0cyBvbiBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBwYXRoRXhwcmVzc2lvbnMgVGFyZ2V0cyBvZiBTaWRlRWZmZWN0cyB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG5cdCAqIEByZXR1cm5zIFByb21pc2Ugb24gU2lkZUVmZmVjdHMgcmVxdWVzdFxuXHQgKi9cblx0cHVibGljIGFzeW5jIHJlcXVlc3RTaWRlRWZmZWN0cyhwYXRoRXhwcmVzc2lvbnM6IFNpZGVFZmZlY3RzVGFyZ2V0W10sIGNvbnRleHQ6IENvbnRleHQsIGdyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR0aGlzLmxvZ1JlcXVlc3QocGF0aEV4cHJlc3Npb25zLCBjb250ZXh0KTtcblx0XHRhd2FpdCBjb250ZXh0LnJlcXVlc3RTaWRlRWZmZWN0cyhwYXRoRXhwcmVzc2lvbnMsIGdyb3VwSWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBTaWRlRWZmZWN0cyBmb3IgYW4gT0RhdGEgYWN0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHJldHVybnMgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0cyBhbmQgYWN0aW9uIGV4ZWN1dGlvblxuXHQgKi9cblx0cHVibGljIGFzeW5jIHJlcXVlc3RTaWRlRWZmZWN0c0Zvck9EYXRhQWN0aW9uKHNpZGVFZmZlY3RzOiBBY3Rpb25TaWRlRWZmZWN0c1R5cGUsIGNvbnRleHQ6IENvbnRleHQpOiBQcm9taXNlPCh2b2lkIHwgdW5kZWZpbmVkKVtdPiB7XG5cdFx0bGV0IHByb21pc2VzOiBQcm9taXNlPHZvaWQgfCB1bmRlZmluZWQ+W107XG5cblx0XHRpZiAoc2lkZUVmZmVjdHMudHJpZ2dlckFjdGlvbnM/Lmxlbmd0aCkge1xuXHRcdFx0cHJvbWlzZXMgPSBzaWRlRWZmZWN0cy50cmlnZ2VyQWN0aW9ucy5tYXAoYXN5bmMgKGFjdGlvbk5hbWUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZXhlY3V0ZUFjdGlvbihhY3Rpb25OYW1lLCBjb250ZXh0KTtcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9taXNlcyA9IFtdO1xuXHRcdH1cblxuXHRcdGlmIChzaWRlRWZmZWN0cy5wYXRoRXhwcmVzc2lvbnM/Lmxlbmd0aCkge1xuXHRcdFx0cHJvbWlzZXMucHVzaCh0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0cy5wYXRoRXhwcmVzc2lvbnMsIGNvbnRleHQpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvbWlzZXMubGVuZ3RoID8gUHJvbWlzZS5hbGwocHJvbWlzZXMpIDogUHJvbWlzZS5yZXNvbHZlKFtdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgU2lkZUVmZmVjdHMgZm9yIGEgbmF2aWdhdGlvbiBwcm9wZXJ0eSBvbiBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBuYXZpZ2F0aW9uUHJvcGVydHkgTmF2aWdhdGlvbiBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IHdoZXJlIFNpZGVFZmZlY3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWRcblx0ICogQHBhcmFtIGdyb3VwSWQgQmF0Y2ggZ3JvdXAgZm9yIHRoZSBxdWVyeVxuXHQgKiBAcGFyYW0gaWdub3JlVHJpZ2dlckFjdGlvbnMgSWYgdHJ1ZSwgd2UgZG8gbm90IHRyaWdnZXIgYWN0aW9ucyBkZWZpbmVkIGluIHRoZSBzaWRlIGVmZmVjdFxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyByZXF1ZXN0IG9uIFNBUFVJNSBjb250ZXh0XG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgcmVxdWVzdFNpZGVFZmZlY3RzRm9yTmF2aWdhdGlvblByb3BlcnR5KFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0eTogc3RyaW5nLFxuXHRcdGNvbnRleHQ6IENvbnRleHQsXG5cdFx0Z3JvdXBJZD86IHN0cmluZyxcblx0XHRpZ25vcmVUcmlnZ2VyQWN0aW9ucyA9IGZhbHNlXG5cdCk6IFByb21pc2U8dm9pZCB8IHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IGJhc2VFbnRpdHlUeXBlID0gdGhpcy5nZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQoY29udGV4dCk7XG5cdFx0aWYgKGJhc2VFbnRpdHlUeXBlKSB7XG5cdFx0XHRjb25zdCBuYXZpZ2F0aW9uUGF0aCA9IGAke25hdmlnYXRpb25Qcm9wZXJ0eX0vYDtcblx0XHRcdGNvbnN0IGVudGl0eVNpZGVFZmZlY3RzID0gdGhpcy5nZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGJhc2VFbnRpdHlUeXBlKTtcblx0XHRcdGxldCB0YXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0bGV0IHRhcmdldEVudGl0aWVzOiBTaWRlRWZmZWN0c0VudGl0eVR5cGVbXSA9IFtdO1xuXHRcdFx0bGV0IHNpZGVFZmZlY3RzVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRbXSA9IFtdO1xuXHRcdFx0T2JqZWN0LmtleXMoZW50aXR5U2lkZUVmZmVjdHMpXG5cdFx0XHRcdC5maWx0ZXIoXG5cdFx0XHRcdFx0Ly8gS2VlcCByZWxldmFudCBTaWRlRWZmZWN0c1xuXHRcdFx0XHRcdC8vIDEuIFNvdXJjZUVudGl0aWVzIG1hdGNoIE9SXG5cdFx0XHRcdFx0Ly8gMi4gT25seSAxIFNvdXJjZVByb3BlcnRpZXMgYW5kIG1hdGNoXG5cdFx0XHRcdFx0KGFubm90YXRpb25OYW1lKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBzaWRlRWZmZWN0czogT0RhdGFTaWRlRWZmZWN0c1R5cGUgPSBlbnRpdHlTaWRlRWZmZWN0c1thbm5vdGF0aW9uTmFtZV07XG5cdFx0XHRcdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHRcdFx0XHQoc2lkZUVmZmVjdHMuc291cmNlRW50aXRpZXMgfHwgW10pLnNvbWUoXG5cdFx0XHRcdFx0XHRcdFx0KG5hdmlnYXRpb24pID0+IG5hdmlnYXRpb24uJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGggPT09IG5hdmlnYXRpb25Qcm9wZXJ0eVxuXHRcdFx0XHRcdFx0XHQpIHx8XG5cdFx0XHRcdFx0XHRcdChzaWRlRWZmZWN0cy5zb3VyY2VQcm9wZXJ0aWVzPy5sZW5ndGggPT09IDEgJiZcblx0XHRcdFx0XHRcdFx0XHRzaWRlRWZmZWN0cy5zb3VyY2VQcm9wZXJ0aWVzLnNvbWUoXG5cdFx0XHRcdFx0XHRcdFx0XHQocHJvcGVydHlQYXRoKSA9PlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVBhdGguc3RhcnRzV2l0aChuYXZpZ2F0aW9uUGF0aCkgJiYgIXByb3BlcnR5UGF0aC5yZXBsYWNlKG5hdmlnYXRpb25QYXRoLCBcIlwiKS5pbmNsdWRlcyhcIi9cIilcblx0XHRcdFx0XHRcdFx0XHQpKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdClcblx0XHRcdFx0LmZvckVhY2goKHNBbm5vdGF0aW9uTmFtZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzID0gZW50aXR5U2lkZUVmZmVjdHNbc0Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRpZiAoc2lkZUVmZmVjdHMudHJpZ2dlckFjdGlvbiAmJiAhaWdub3JlVHJpZ2dlckFjdGlvbnMpIHtcblx0XHRcdFx0XHRcdHRoaXMuZXhlY3V0ZUFjdGlvbihzaWRlRWZmZWN0cy50cmlnZ2VyQWN0aW9uLCBjb250ZXh0LCBncm91cElkKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGFyZ2V0UHJvcGVydGllcyA9IHRhcmdldFByb3BlcnRpZXMuY29uY2F0KHNpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMpO1xuXHRcdFx0XHRcdHRhcmdldEVudGl0aWVzID0gdGFyZ2V0RW50aXRpZXMuY29uY2F0KHNpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzKTtcblx0XHRcdFx0fSk7XG5cdFx0XHQvLyBSZW1vdmUgZHVwbGljYXRlIHRhcmdldHNcblx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzVGFyZ2V0RGVmaW5pdGlvbiA9IHRoaXMucmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyh7XG5cdFx0XHRcdHRhcmdldFByb3BlcnRpZXM6IHRhcmdldFByb3BlcnRpZXMsXG5cdFx0XHRcdHRhcmdldEVudGl0aWVzOiB0YXJnZXRFbnRpdGllc1xuXHRcdFx0fSk7XG5cdFx0XHRzaWRlRWZmZWN0c1RhcmdldHMgPSBbLi4uc2lkZUVmZmVjdHNUYXJnZXREZWZpbml0aW9uLnRhcmdldFByb3BlcnRpZXMsIC4uLnNpZGVFZmZlY3RzVGFyZ2V0RGVmaW5pdGlvbi50YXJnZXRFbnRpdGllc107XG5cdFx0XHRpZiAoc2lkZUVmZmVjdHNUYXJnZXRzLmxlbmd0aCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0U2lkZUVmZmVjdHMoc2lkZUVmZmVjdHNUYXJnZXRzLCBjb250ZXh0LCBncm91cElkKS5jYXRjaCgoZXJyb3IpID0+XG5cdFx0XHRcdFx0TG9nLmVycm9yKGBTaWRlRWZmZWN0cyAtIEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgU2lkZUVmZmVjdHMgZm9yIE5hdmlnYXRpb24gUHJvcGVydHkgJHtuYXZpZ2F0aW9uUHJvcGVydHl9YCwgZXJyb3IpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyB0aGF0IGNvbWUgZnJvbSBjb250cm9scy5cblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVR5cGVOYW1lIEVudGl0eSB0eXBlIE5hbWVcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHVibGljIGdldENvbnRyb2xFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgQ29udHJvbFNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkuY29udHJvbFtlbnRpdHlUeXBlTmFtZV0gfHwge307XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cycgcXVhbGlmaWVyIGFuZCBvd25lciBlbnRpdHkgd2hlcmUgdGhpcyBlbnRpdHkgaXMgdXNlZCBhcyBzb3VyY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSBFbnRpdHkgdHlwZSBmdWxseSBxdWFsaWZpZWQgbmFtZVxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBzaWRlRWZmZWN0cyBpbmZvXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U2lkZUVmZmVjdFdoZXJlRW50aXR5SXNTb3VyY2UoZW50aXR5VHlwZU5hbWU6IHN0cmluZyk6IFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10ge1xuXHRcdHJldHVybiB0aGlzLnNvdXJjZXNUb1NpZGVFZmZlY3RNYXBwaW5ncy5lbnRpdGllc1tlbnRpdHlUeXBlTmFtZV0gfHwgW107XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cycgcXVhbGlmaWVycyB3aGVyZSB0aGlzIGV2ZW50IGlzIHVzZWQgYXMgc291cmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZU5hbWUgRW50aXR5IHR5cGUgZnVsbHkgcXVhbGlmaWVkXG5cdCAqIEBwYXJhbSBldmVudE5hbWUgU2lkZSBFZmZlY3QgZXZlbnQgbmFtZVxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBzaWRlRWZmZWN0cyBpbmZvXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U2lkZUVmZmVjdFdoZXJlRXZlbnRJc1NvdXJjZShlbnRpdHlUeXBlTmFtZTogc3RyaW5nLCBldmVudE5hbWU6IHN0cmluZyk6IFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10ge1xuXHRcdHJldHVybiB0aGlzLnNvdXJjZXNUb1NpZGVFZmZlY3RNYXBwaW5ncy5ldmVudHNbZXZlbnROYW1lXT8uZmlsdGVyKChldmVudCkgPT4gZXZlbnQuZW50aXR5ID09PSBlbnRpdHlUeXBlTmFtZSkgfHwgW107XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIFNpZGVFZmZlY3RzIGZvciBhIHNpZGVFZmZlY3QgZXZlbnQgb24gYSBzcGVjaWZpYyBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gZXZlbnQgU2lkZUVmZmVjdHMgZXZlbnQgd2hpY2ggc2hvdWxkIGJlXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3Rcblx0ICogQHJldHVybnMgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0XG5cdCAqL1xuXHRhc3luYyByZXF1ZXN0U2lkZUVmZmVjdHNGb3JFdmVudChldmVudDogc3RyaW5nLCBjb250ZXh0OiBDb250ZXh0LCBncm91cElkPzogc3RyaW5nKTogUHJvbWlzZTx1bmRlZmluZWQ+IHtcblx0XHRjb25zdCBtZXRhUGF0aCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKS5nZXRNZXRhQ29udGV4dChjb250ZXh0LmdldFBhdGgoKSk7XG5cdFx0Y29uc3QgZGF0YU1vZGVsID0gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFQYXRoKTtcblx0XHRjb25zdCBzaWRlRWZmZWN0cyA9IHRoaXMuZ2V0U2lkZUVmZmVjdFdoZXJlRXZlbnRJc1NvdXJjZShkYXRhTW9kZWwudGFyZ2V0RW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsIGV2ZW50KTtcblx0XHRsZXQgdGFyZ2V0UHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRsZXQgdGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzRW50aXR5VHlwZVtdID0gW107XG5cblx0XHRzaWRlRWZmZWN0cy5mb3JFYWNoKChzaWRlRWZmZWN0KSA9PiB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uID1cblx0XHRcdFx0dGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmVudGl0aWVzW2RhdGFNb2RlbC50YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0/Lltcblx0XHRcdFx0XHRgJHtzaWRlRWZmZWN0LmVudGl0eX1AY29tLnNhcC52b2NhYnVsYXJpZXMuQ29tbW9uLnYxLlNpZGVFZmZlY3RzIyR7c2lkZUVmZmVjdC5xdWFsaWZpZXJ9YFxuXHRcdFx0XHRdO1xuXHRcdFx0dGFyZ2V0UHJvcGVydGllcyA9IHRhcmdldFByb3BlcnRpZXMuY29uY2F0KGFubm90YXRpb24udGFyZ2V0UHJvcGVydGllcyk7XG5cdFx0XHR0YXJnZXRFbnRpdGllcyA9IHRhcmdldEVudGl0aWVzLmNvbmNhdChhbm5vdGF0aW9uLnRhcmdldEVudGl0aWVzKTtcblx0XHR9KTtcblxuXHRcdGNvbnN0IHNpZGVFZmZlY3RzVGFyZ2V0RGVmaW5pdGlvbiA9IHRoaXMucmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyh7XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiB0YXJnZXRQcm9wZXJ0aWVzLFxuXHRcdFx0dGFyZ2V0RW50aXRpZXM6IHRhcmdldEVudGl0aWVzXG5cdFx0fSk7XG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHNUYXJnZXRzID0gWy4uLnNpZGVFZmZlY3RzVGFyZ2V0RGVmaW5pdGlvbi50YXJnZXRQcm9wZXJ0aWVzLCAuLi5zaWRlRWZmZWN0c1RhcmdldERlZmluaXRpb24udGFyZ2V0RW50aXRpZXNdO1xuXHRcdGlmIChzaWRlRWZmZWN0c1RhcmdldHMubGVuZ3RoKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0c1RhcmdldHMsIGNvbnRleHQsIGdyb3VwSWQpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0TG9nLmVycm9yKGBTaWRlRWZmZWN0cyAtIEVycm9yIHdoaWxlIHByb2Nlc3NpbmcgU2lkZUVmZmVjdHMgZm9yIEV2ZW50ICR7ZXZlbnR9YCwgZXJyb3IgYXMgc3RyaW5nKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ29tbW9uIG1ldGhvZCB0byBnZXQgdGhlIGZpZWxkIGdyb3VwSWRzIGZvciBhIHNvdXJjZSBlbnRpdHkgYW5kIGEgc291cmNlIHByb3BlcnR5LlxuXHQgKlxuXHQgKiBAcGFyYW0gc291cmNlRW50aXR5VHlwZVxuXHQgKiBAcGFyYW0gc291cmNlUHJvcGVydHlcblx0ICogQHJldHVybnMgQSBjb2xsZWN0aW9uIG9mIGZpZWxkR3JvdXBJZHNcblx0ICovXG5cdHB1YmxpYyBjb21wdXRlRmllbGRHcm91cElkcyhzb3VyY2VFbnRpdHlUeXBlOiBzdHJpbmcsIHNvdXJjZVByb3BlcnR5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3QgZW50aXR5RmllbGRHcm91cElkcyA9IHRoaXMuZ2V0U2lkZUVmZmVjdFdoZXJlRW50aXR5SXNTb3VyY2Uoc291cmNlRW50aXR5VHlwZSkubWFwKChzaWRlRWZmZWN0SW5mbykgPT5cblx0XHRcdHRoaXMuZ2V0RmllbGRHcm91cElkRm9yU2lkZUVmZmVjdChzaWRlRWZmZWN0SW5mbywgdHJ1ZSlcblx0XHQpO1xuXHRcdHJldHVybiBlbnRpdHlGaWVsZEdyb3VwSWRzLmNvbmNhdChcblx0XHRcdHRoaXMuZ2V0U2lkZUVmZmVjdFdoZXJlUHJvcGVydHlJc1NvdXJjZShzb3VyY2VQcm9wZXJ0eSkubWFwKChzaWRlRWZmZWN0SW5mbykgPT5cblx0XHRcdFx0dGhpcy5nZXRGaWVsZEdyb3VwSWRGb3JTaWRlRWZmZWN0KHNpZGVFZmZlY3RJbmZvKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cycgcXVhbGlmaWVyIGFuZCBvd25lciBlbnRpdHkgd2hlcmUgdGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGFzIHNvdXJjZS5cblx0ICpcblx0ICogQHBhcmFtIHByb3BlcnR5TmFtZSBQcm9wZXJ0eSBmdWxseSBxdWFsaWZpZWQgbmFtZVxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBzaWRlRWZmZWN0cyBpbmZvXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U2lkZUVmZmVjdFdoZXJlUHJvcGVydHlJc1NvdXJjZShwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10ge1xuXHRcdHJldHVybiB0aGlzLnNvdXJjZXNUb1NpZGVFZmZlY3RNYXBwaW5ncy5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gfHwgW107XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyB0aGUgdGV4dCBwcm9wZXJ0aWVzIHJlcXVpcmVkIGZvciBTaWRlRWZmZWN0c1xuXHQgKiBJZiBhIHByb3BlcnR5IGhhcyBhbiBhc3NvY2lhdGVkIHRleHQgdGhlbiB0aGlzIHRleHQgbmVlZHMgdG8gYmUgYWRkZWQgYXMgdGFyZ2V0UHJvcGVydGllcy5cblx0ICpcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzVGFyZ2V0cyBTaWRlRWZmZWN0cyBUYXJnZXRzXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIGRlZmluaXRpb24gd2l0aCBhZGRlZCB0ZXh0IHByb3BlcnRpZXNcblx0ICovXG5cblx0Ly8gY2hlY2sgaWYgY2FuIGRlZmluZSB3aGV0aGVyIGNhbGxiYWNrcyBhcmUgYXN5bmMuIE90aGVyd2lzZSBjb21tZW50XG5cdC8vIG9ubHkgb25lIGNhbGxiYWNrIGZvciBvbmUgdGFyZ2V0XG5cdHB1YmxpYyByZWdpc3RlclRhcmdldENhbGxiYWNrKHRhcmdldDogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pOiB2b2lkIHtcblx0XHR0aGlzLnRhcmdldENhbGxiYWNrc1t0YXJnZXRdID0gY2FsbGJhY2s7XG5cdH1cblxuXHRwdWJsaWMgZGVyZWdpc3RlclRhcmdldENhbGxiYWNrKHRhcmdldDogc3RyaW5nKTogdm9pZCB7XG5cdFx0ZGVsZXRlIHRoaXMudGFyZ2V0Q2FsbGJhY2tzW3RhcmdldF07XG5cdH1cblxuXHQvLyBwYXNzIHBhcmFtZXRlclxuXHRwdWJsaWMgZ2V0UmVnaXN0ZXJlZENhbGxiYWNrKHRhcmdldDogc3RyaW5nKTogRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLnRhcmdldENhbGxiYWNrc1t0YXJnZXRdO1xuXHR9XG5cblx0cHJpdmF0ZSBhZGRUZXh0UHJvcGVydGllcyhzaWRlRWZmZWN0c1RhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSwgZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSB7XG5cdFx0Y29uc3Qgc2V0T2ZQcm9wZXJ0aWVzID0gbmV3IFNldChzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0UHJvcGVydGllcyk7XG5cdFx0Y29uc3Qgc2V0T2ZFbnRpdGllcyA9IG5ldyBTZXQoc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldEVudGl0aWVzLm1hcCgodGFyZ2V0KSA9PiB0YXJnZXQuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpKTtcblxuXHRcdC8vIEdlbmVyYXRlIGFsbCBkYXRhTW9kZWxQYXRoIGZvciB0aGUgcHJvcGVydGllcyB0byBhbmFseXplIChjb3ZlciBcIipcIiBhbmQgLyopXG5cdFx0Y29uc3QgcHJvcGVydGllc1RvQW5hbHl6ZSA9IHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRQcm9wZXJ0aWVzLnJlZHVjZShcblx0XHRcdChkYXRhTW9kZWxQcm9wZXJ0eVBhdGhzOiBEYXRhTW9kZWxPYmplY3RQYXRoW10sIHByb3BlcnR5UGF0aCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gZGF0YU1vZGVsUHJvcGVydHlQYXRocy5jb25jYXQodGhpcy5nZXREYXRhTW9kZWxQcm9wZXJ0aWVzRnJvbUFQYXRoKHByb3BlcnR5UGF0aCwgZW50aXR5VHlwZSkpO1xuXHRcdFx0fSxcblx0XHRcdFtdXG5cdFx0KTtcblxuXHRcdC8vIEdlbmVyYXRlIGFsbCBwYXRocyByZWxhdGVkIHRvIHRoZSB0ZXh0IHByb3BlcnRpZXMgYW5kIG5vdCBhbHJlYWR5IGNvdmVyZWQgYnkgdGhlIFNpZGVFZmZlY3RzXG5cdFx0Zm9yIChjb25zdCBkYXRhTW9kZWxQcm9wZXJ0eVBhdGggb2YgcHJvcGVydGllc1RvQW5hbHl6ZSkge1xuXHRcdFx0Y29uc3QgYXNzb2NpYXRlZFRleHRQYXRoID0gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgoZGF0YU1vZGVsUHJvcGVydHlQYXRoLnRhcmdldE9iamVjdCk7XG5cdFx0XHRpZiAoYXNzb2NpYXRlZFRleHRQYXRoKSB7XG5cdFx0XHRcdGNvbnN0IGRhdGFNb2RlbFRleHRQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGgoZGF0YU1vZGVsUHJvcGVydHlQYXRoLCBhc3NvY2lhdGVkVGV4dFBhdGgpO1xuXHRcdFx0XHRjb25zdCByZWxhdGl2ZU5hdmlnYXRpb24gPSBnZXRUYXJnZXROYXZpZ2F0aW9uUGF0aChkYXRhTW9kZWxUZXh0UGF0aCwgdHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IHRhcmdldFBhdGggPSBnZXRUYXJnZXRPYmplY3RQYXRoKGRhdGFNb2RlbFRleHRQYXRoLCB0cnVlKTtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdGlzUHJvcGVydHkoZGF0YU1vZGVsVGV4dFBhdGgudGFyZ2V0T2JqZWN0KSAmJlxuXHRcdFx0XHRcdCFzZXRPZlByb3BlcnRpZXMuaGFzKHRhcmdldFBhdGgpICYmIC8vIHRoZSBwcm9wZXJ0eSBpcyBhbHJlYWR5IGxpc3RlZFxuXHRcdFx0XHRcdCFzZXRPZlByb3BlcnRpZXMuaGFzKGAke3JlbGF0aXZlTmF2aWdhdGlvbn0ke2RhdGFNb2RlbFRleHRQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmxlbmd0aCA/IFwiL1wiIDogXCJcIn0qYCkgJiYgLy8gdGhlIHByb3BlcnR5IGlzIGFscmVhZHkgbGlzdGVkIHRoYW5rcyB0byB0aGUgXCIqXCJcblx0XHRcdFx0XHQhc2V0T2ZFbnRpdGllcy5oYXMoYCR7cmVsYXRpdmVOYXZpZ2F0aW9ufWApIC8vIHRoZSBwcm9wZXJ0eSBpcyBub3QgcGFydCBvZiBhIFRhcmdldEVudGl0aWVzXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdC8vIFRoZSBUZXh0IGFzc29jaWF0aW9uIGlzIGFkZGVkIGFzIFRhcmdldEVudGl0aWVzIGlmXG5cdFx0XHRcdFx0Ly8gIC0gaXQncyBjb250YWluZWQgb24gYSBkaWZmZXJlbnQgZW50aXR5U2V0IHRoYW4gdGhlIFNpZGVFZmZlY3RzXG5cdFx0XHRcdFx0Ly8gIC0gIGFuZCBpdCdzIGNvbnRhaW5lZCBvbiBhIGRpZmZlcmVudCBlbnRpdHlTZXQgdGhhbiB0aGUgc291cmNlZCBwcm9wZXJ0eVxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSBpdCdzIGFkZGVkIGFzIHRhcmdldFByb3BlcnRpZXNcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRkYXRhTW9kZWxQcm9wZXJ0eVBhdGgudGFyZ2V0RW50aXR5U2V0ICE9PSBkYXRhTW9kZWxUZXh0UGF0aC50YXJnZXRFbnRpdHlTZXQgJiZcblx0XHRcdFx0XHRcdGRhdGFNb2RlbFRleHRQYXRoLm5hdmlnYXRpb25Qcm9wZXJ0aWVzICYmXG5cdFx0XHRcdFx0XHRkYXRhTW9kZWxUZXh0UGF0aC50YXJnZXRFbnRpdHlUeXBlXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRzZXRPZkVudGl0aWVzLmFkZChyZWxhdGl2ZU5hdmlnYXRpb24pO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZXRPZlByb3BlcnRpZXMuYWRkKHRhcmdldFBhdGgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiBBcnJheS5mcm9tKHNldE9mUHJvcGVydGllcyksXG5cdFx0XHR0YXJnZXRFbnRpdGllczogQXJyYXkuZnJvbShzZXRPZkVudGl0aWVzKS5tYXAoKG5hdmlnYXRpb24pID0+IHtcblx0XHRcdFx0cmV0dXJuIHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IG5hdmlnYXRpb24gfTtcblx0XHRcdH0pXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyB0aGUgU2lkZUVmZmVjdHMgdG8gZXhwZWN0ZWQgZm9ybWF0XG5cdCAqICAtIFNldCBUcmlnZ2VyQWN0aW9uIGFzIHN0cmluZ1xuXHQgKiAgLSBDb252ZXJ0cyBTaWRlRWZmZWN0cyB0YXJnZXRzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBSZW1vdmVzIGJpbmRpbmcgcGFyYW1ldGVyIGZyb20gU2lkZUVmZmVjdHMgdGFyZ2V0cyBwcm9wZXJ0aWVzXG5cdCAqICAtIEFkZHMgdGhlIHRleHQgcHJvcGVydGllc1xuXHQgKiAgLSBSZXBsYWNlcyBUYXJnZXRQcm9wZXJ0aWVzIGhhdmluZyByZWZlcmVuY2UgdG8gU291cmNlIFByb3BlcnRpZXMgZm9yIGEgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSBiaW5kaW5nUGFyYW1ldGVyIE5hbWUgb2YgdGhlIGJpbmRpbmcgcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHByaXZhdGUgY29udmVydFNpZGVFZmZlY3RzKFxuXHRcdHNpZGVFZmZlY3RzOiBDb21tb25TaWRlRWZmZWN0c1R5cGUsXG5cdFx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0XHRiaW5kaW5nUGFyYW1ldGVyPzogc3RyaW5nXG5cdCk6IE9EYXRhU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRjb25zdCB0cmlnZ2VyQWN0aW9uID0gc2lkZUVmZmVjdHMuVHJpZ2dlckFjdGlvbiBhcyBzdHJpbmc7XG5cdFx0Y29uc3QgbmV3U2lkZUVmZmVjdHMgPSB0aGlzLmNvbnZlcnRTaWRlRWZmZWN0c0Zvcm1hdChzaWRlRWZmZWN0cyk7XG5cdFx0bGV0IHNpZGVFZmZlY3RzVGFyZ2V0cyA9IHsgdGFyZ2V0UHJvcGVydGllczogbmV3U2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcywgdGFyZ2V0RW50aXRpZXM6IG5ld1NpZGVFZmZlY3RzLnRhcmdldEVudGl0aWVzIH07XG5cdFx0c2lkZUVmZmVjdHNUYXJnZXRzID0gdGhpcy5yZW1vdmVCaW5kaW5nUGFyYW1ldGVyKHNpZGVFZmZlY3RzVGFyZ2V0cywgYmluZGluZ1BhcmFtZXRlcik7XG5cdFx0c2lkZUVmZmVjdHNUYXJnZXRzID0gdGhpcy5hZGRUZXh0UHJvcGVydGllcyhzaWRlRWZmZWN0c1RhcmdldHMsIGVudGl0eVR5cGUpO1xuXHRcdHNpZGVFZmZlY3RzVGFyZ2V0cyA9IHRoaXMucmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyhzaWRlRWZmZWN0c1RhcmdldHMpO1xuXHRcdHJldHVybiB7XG5cdFx0XHQuLi5uZXdTaWRlRWZmZWN0cyxcblx0XHRcdC4uLnsgdGFyZ2V0RW50aXRpZXM6IHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRFbnRpdGllcywgdGFyZ2V0UHJvcGVydGllczogc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldFByb3BlcnRpZXMsIHRyaWdnZXJBY3Rpb24gfVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgdGhlIFNpZGVFZmZlY3RzIHRhcmdldHMgKFRhcmdldEVudGl0aWVzIGFuZCBUYXJnZXRQcm9wZXJ0aWVzKSB0byBleHBlY3RlZCBmb3JtYXRcblx0ICogIC0gVGFyZ2V0UHJvcGVydGllcyBhcyBhcnJheSBvZiBzdHJpbmdcblx0ICogIC0gVGFyZ2V0RW50aXRpZXMgYXMgYXJyYXkgb2Ygb2JqZWN0IHdpdGggcHJvcGVydHkgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGguXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEByZXR1cm5zIENvbnZlcnRlZCBTaWRlRWZmZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBjb252ZXJ0U2lkZUVmZmVjdHNGb3JtYXQoc2lkZUVmZmVjdHM6IENvbW1vblNpZGVFZmZlY3RzVHlwZSk6IE9EYXRhU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRjb25zdCBmb3JtYXRQcm9wZXJ0aWVzID0gKHByb3BlcnRpZXM/OiAoc3RyaW5nIHwgUHJvcGVydHlQYXRoKVtdKTogc3RyaW5nW10gfCB1bmRlZmluZWQgPT4ge1xuXHRcdFx0cmV0dXJuIHByb3BlcnRpZXNcblx0XHRcdFx0PyBwcm9wZXJ0aWVzLnJlZHVjZSgodGFyZ2V0UHJvcGVydGllczogc3RyaW5nW10sIHRhcmdldCkgPT4ge1xuXHRcdFx0XHRcdFx0bGV0IHBhdGggPSBcIlwiO1xuXHRcdFx0XHRcdFx0aWYgKGlzUHJvcGVydHlQYXRoRXhwcmVzc2lvbih0YXJnZXQpKSB7XG5cdFx0XHRcdFx0XHRcdHBhdGggPSB0YXJnZXQudmFsdWU7XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRcdFx0cGF0aCA9IHRhcmdldDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChwYXRoKSB7XG5cdFx0XHRcdFx0XHRcdHRhcmdldFByb3BlcnRpZXMucHVzaChwYXRoKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdExvZy5lcnJvcihcblx0XHRcdFx0XHRcdFx0XHRgU2lkZUVmZmVjdHMgLSBFcnJvciB3aGlsZSBwcm9jZXNzaW5nIFRhcmdldFByb3BlcnRpZXMgZm9yIFNpZGVFZmZlY3RzICR7c2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lfWBcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJldHVybiB0YXJnZXRQcm9wZXJ0aWVzO1xuXHRcdFx0XHQgIH0sIFtdKVxuXHRcdFx0XHQ6IHByb3BlcnRpZXM7XG5cdFx0fTtcblx0XHRjb25zdCBmb3JtYXRFbnRpdGllcyA9IChlbnRpdGllcz86IE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGhbXSk6IHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZyB9W10gfCB1bmRlZmluZWQgPT4ge1xuXHRcdFx0cmV0dXJuIGVudGl0aWVzXG5cdFx0XHRcdD8gZW50aXRpZXMubWFwKCh0YXJnZXRFbnRpdHkpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiB0YXJnZXRFbnRpdHkudmFsdWUgfTtcblx0XHRcdFx0ICB9KVxuXHRcdFx0XHQ6IGVudGl0aWVzO1xuXHRcdH07XG5cblx0XHQvLyBUT0RPOiBTb3VyY2VFdmVudHMgYXJlIHN0aWxsIGV4cGVyaW1lbnRhbCwgcmVtb3ZlIG9uY2UgcHVibGljXG5cdFx0dHlwZSBDb21tb25TaWRlRWZmZWN0VHlwZVdpdGhTb3VyY2VFdmVudHMgPSBDb21tb25TaWRlRWZmZWN0c1R5cGUgJiB7IFNvdXJjZUV2ZW50cz86IEVkbS5TdHJpbmdbXSB9O1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGZ1bGx5UXVhbGlmaWVkTmFtZTogc2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0c291cmNlUHJvcGVydGllczogZm9ybWF0UHJvcGVydGllcyhzaWRlRWZmZWN0cy5Tb3VyY2VQcm9wZXJ0aWVzKSxcblx0XHRcdHNvdXJjZUVudGl0aWVzOiBmb3JtYXRFbnRpdGllcyhzaWRlRWZmZWN0cy5Tb3VyY2VFbnRpdGllcyksXG5cdFx0XHRzb3VyY2VFdmVudHM6IChzaWRlRWZmZWN0cyBhcyBDb21tb25TaWRlRWZmZWN0VHlwZVdpdGhTb3VyY2VFdmVudHMpLlNvdXJjZUV2ZW50cyBhcyBzdHJpbmdbXSxcblx0XHRcdHRhcmdldFByb3BlcnRpZXM6IGZvcm1hdFByb3BlcnRpZXMoc2lkZUVmZmVjdHMuVGFyZ2V0UHJvcGVydGllcyBhcyAoc3RyaW5nIHwgUHJvcGVydHlQYXRoKVtdKSA/PyBbXSxcblx0XHRcdHRhcmdldEVudGl0aWVzOiBmb3JtYXRFbnRpdGllcyhzaWRlRWZmZWN0cy5UYXJnZXRFbnRpdGllcykgPz8gW11cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgYWxsIGRhdGFNb2RlbE9iamVjdFBhdGggcmVsYXRlZCB0byBwcm9wZXJ0aWVzIGxpc3RlZCBieSBhIHBhdGhcblx0ICpcblx0ICogVGhlIHBhdGggY2FuIGJlOlxuXHQgKiAgLSBhIHBhdGggdGFyZ2V0aW5nIGEgcHJvcGVydHkgb24gYSBjb21wbGV4VHlwZSBvciBhbiBFbnRpdHlUeXBlXG5cdCAqICAtIGEgcGF0aCB3aXRoIGEgc3RhciB0YXJnZXRpbmcgYWxsIHByb3BlcnRpZXMgb24gYSBjb21wbGV4VHlwZSBvciBhbiBFbnRpdHlUeXBlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byBhbmFseXplXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIGRhdGFNb2RlbE9iamVjdFBhdGggcmVwcmVzZW50aW5nIHRoZSBwcm9wZXJ0aWVzXG5cdCAqL1xuXHRwcml2YXRlIGdldERhdGFNb2RlbFByb3BlcnRpZXNGcm9tQVBhdGgocGF0aDogc3RyaW5nLCBlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogRGF0YU1vZGVsT2JqZWN0UGF0aFtdIHtcblx0XHRsZXQgZGF0YU1vZGVsT2JqZWN0UGF0aHM6IERhdGFNb2RlbE9iamVjdFBhdGhbXSA9IFtdO1xuXHRcdGNvbnN0IGNvbnZlcnRlZE1ldGFNb2RlbCA9IHRoaXMuZ2V0Q29udmVydGVkTWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgZW50aXR5U2V0ID1cblx0XHRcdGNvbnZlcnRlZE1ldGFNb2RlbC5lbnRpdHlTZXRzLmZpbmQoKHJlbGF0ZWRFbnRpdHlTZXQpID0+IHJlbGF0ZWRFbnRpdHlTZXQuZW50aXR5VHlwZSA9PT0gZW50aXR5VHlwZSkgfHxcblx0XHRcdGNvbnZlcnRlZE1ldGFNb2RlbC5zaW5nbGV0b25zLmZpbmQoKHNpbmdsZXRvbikgPT4gc2luZ2xldG9uLmVudGl0eVR5cGUgPT09IGVudGl0eVR5cGUpO1xuXG5cdFx0aWYgKGVudGl0eVNldCkge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gdGhpcy5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdFx0ZW50aXR5U2V0Q29udGV4dCA9IG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgLyR7ZW50aXR5U2V0Lm5hbWV9YCk7XG5cdFx0XHRpZiAoZW50aXR5U2V0Q29udGV4dCkge1xuXHRcdFx0XHRjb25zdCBkYXRhTW9kZWxFbnRpdHlTZXQgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMoZW50aXR5U2V0Q29udGV4dCk7XG5cdFx0XHRcdGNvbnN0IGRhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aChkYXRhTW9kZWxFbnRpdHlTZXQsIHBhdGgucmVwbGFjZShcIipcIiwgXCJcIikgfHwgXCIvXCIpLCAvLyBcIipcIiBpcyByZXBsYWNlZCBieSBcIi9cIiB0byB0YXJnZXQgdGhlIGN1cnJlbnQgRW50aXR5VHlwZVxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRcdFx0XHRpZiAoaXNQcm9wZXJ0eSh0YXJnZXRPYmplY3QpKSB7XG5cdFx0XHRcdFx0aWYgKGlzQ29tcGxleFR5cGUodGFyZ2V0T2JqZWN0LnRhcmdldFR5cGUpKSB7XG5cdFx0XHRcdFx0XHRkYXRhTW9kZWxPYmplY3RQYXRocyA9IGRhdGFNb2RlbE9iamVjdFBhdGhzLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0dGFyZ2V0T2JqZWN0LnRhcmdldFR5cGUucHJvcGVydGllcy5tYXAoKHByb3BlcnR5KSA9PiBlbmhhbmNlRGF0YU1vZGVsUGF0aChkYXRhTW9kZWxPYmplY3RQYXRoLCBwcm9wZXJ0eS5uYW1lKSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGRhdGFNb2RlbE9iamVjdFBhdGhzLnB1c2goZGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGlzRW50aXR5VHlwZSh0YXJnZXRPYmplY3QpKSB7XG5cdFx0XHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aHMgPSBkYXRhTW9kZWxPYmplY3RQYXRocy5jb25jYXQoXG5cdFx0XHRcdFx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5tYXAoKGVudGl0eVByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBlbmhhbmNlRGF0YU1vZGVsUGF0aChkYXRhTW9kZWxPYmplY3RQYXRoLCBlbnRpdHlQcm9wZXJ0eS5uYW1lKTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbnRpdHlTZXRDb250ZXh0LmRlc3Ryb3koKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGRhdGFNb2RlbE9iamVjdFBhdGhzLmZpbHRlcigoZGF0YU1vZGVsT2JqZWN0UGF0aCkgPT4gZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIE9kYXRhIG1ldGFtb2RlbC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIE9EYXRhIG1ldGFtb2RlbFxuXHQgKi9cblx0cHJpdmF0ZSBnZXRNZXRhTW9kZWwoKTogT0RhdGFNZXRhTW9kZWwge1xuXHRcdHJldHVybiB0aGlzLmFwcENvbXBvbmVudC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYW4gZW50aXR5IHR5cGUgb3IgYWN0aW9uIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIFNlcnZpY2Vcblx0ICogSW50ZXJuYWwgcm91dGluZSB0byBnZXQsIGZyb20gY29udmVydGVkIG9EYXRhIG1ldGFNb2RlbCwgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhIHNwZWNpZmljIGVudGl0eSB0eXBlIG9yIGFjdGlvblxuXHQgKiBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoIGV4cGVjdGVkIGZvcm1hdC5cblx0ICpcblx0ICogQHBhcmFtIHNvdXJjZSBFbnRpdHkgdHlwZSBvciBhY3Rpb25cblx0ICogQHJldHVybnMgQXJyYXkgb2YgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgZ2V0U2lkZUVmZmVjdHNGcm9tU291cmNlKHNvdXJjZTogRW50aXR5VHlwZSB8IEFjdGlvbik6IE9EYXRhU2lkZUVmZmVjdHNUeXBlW10ge1xuXHRcdGxldCBiaW5kaW5nQWxpYXMgPSBcIlwiO1xuXHRcdGNvbnN0IGlzU291cmNlRW50aXR5VHlwZSA9IGlzRW50aXR5VHlwZShzb3VyY2UpO1xuXHRcdGNvbnN0IGVudGl0eVR5cGU6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQgPSBpc1NvdXJjZUVudGl0eVR5cGUgPyBzb3VyY2UgOiBzb3VyY2Uuc291cmNlRW50aXR5VHlwZTtcblx0XHRjb25zdCBjb21tb25Bbm5vdGF0aW9uID0gc291cmNlLmFubm90YXRpb25zPy5Db21tb24gYXMgdW5kZWZpbmVkIHwgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCBDb21tb25Bbm5vdGF0aW9uVHlwZXM+O1xuXHRcdGlmIChlbnRpdHlUeXBlICYmIGNvbW1vbkFubm90YXRpb24pIHtcblx0XHRcdGlmICghaXNTb3VyY2VFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdGNvbnN0IGJpbmRpbmdQYXJhbWV0ZXIgPSBzb3VyY2UucGFyYW1ldGVycz8uZmluZCgocGFyYW1ldGVyKSA9PiBwYXJhbWV0ZXIudHlwZSA9PT0gZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUpO1xuXHRcdFx0XHRiaW5kaW5nQWxpYXMgPSBiaW5kaW5nUGFyYW1ldGVyPy5mdWxseVF1YWxpZmllZE5hbWUuc3BsaXQoXCIvXCIpWzFdID8/IFwiXCI7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRTaWRlRWZmZWN0c0Fubm90YXRpb25Gcm9tU291cmNlKHNvdXJjZSkubWFwKChzaWRlRWZmZWN0QW5ubykgPT5cblx0XHRcdFx0dGhpcy5jb252ZXJ0U2lkZUVmZmVjdHMoc2lkZUVmZmVjdEFubm8sIGVudGl0eVR5cGUsIGJpbmRpbmdBbGlhcylcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGFuIGVudGl0eSB0eXBlIG9yIGFjdGlvbiB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBvciBhY3Rpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBzb3VyY2UgRW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIFNpZGVFZmZlY3RzXG5cdCAqL1xuXHRwcml2YXRlIGdldFNpZGVFZmZlY3RzQW5ub3RhdGlvbkZyb21Tb3VyY2Uoc291cmNlOiBFbnRpdHlUeXBlIHwgQWN0aW9uKTogQ29tbW9uU2lkZUVmZmVjdFR5cGVXaXRoUXVhbGlmaWVyW10ge1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzOiBDb21tb25TaWRlRWZmZWN0c1R5cGVbXSA9IFtdO1xuXHRcdGNvbnN0IGNvbW1vbkFubm90YXRpb24gPSBzb3VyY2UuYW5ub3RhdGlvbnM/LkNvbW1vbiBhcyB1bmRlZmluZWQgfCB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIENvbW1vblNpZGVFZmZlY3RUeXBlV2l0aFF1YWxpZmllcj47XG5cdFx0Zm9yIChjb25zdCBrZXkgaW4gY29tbW9uQW5ub3RhdGlvbikge1xuXHRcdFx0Y29uc3QgYW5ub3RhdGlvbiA9IGNvbW1vbkFubm90YXRpb25ba2V5XTtcblx0XHRcdGlmICh0aGlzLmlzU2lkZUVmZmVjdHNBbm5vdGF0aW9uKGFubm90YXRpb24pKSB7XG5cdFx0XHRcdHNpZGVFZmZlY3RzLnB1c2goYW5ub3RhdGlvbik7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBzaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIGFubm90YXRpb24gaXMgYSBTaWRlRWZmZWN0cyBhbm5vdGF0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gYW5ub3RhdGlvbiBBbm5vdGF0aW9uXG5cdCAqIEByZXR1cm5zIEJvb2xlYW5cblx0ICovXG5cdHByaXZhdGUgaXNTaWRlRWZmZWN0c0Fubm90YXRpb24oYW5ub3RhdGlvbjogdW5rbm93bik6IGFubm90YXRpb24gaXMgQ29tbW9uU2lkZUVmZmVjdHNUeXBlIHtcblx0XHRyZXR1cm4gKGFubm90YXRpb24gYXMgQ29tbW9uU2lkZUVmZmVjdHNUeXBlKT8uJFR5cGUgPT09IENvbW1vbkFubm90YXRpb25UeXBlcy5TaWRlRWZmZWN0c1R5cGU7XG5cdH1cblxuXHQvKipcblx0ICogTG9ncyB0aGUgU2lkZUVmZmVjdHMgcmVxdWVzdC5cblx0ICpcblx0ICogQHBhcmFtIHBhdGhFeHByZXNzaW9ucyBTaWRlRWZmZWN0cyB0YXJnZXRzXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHRcblx0ICovXG5cdHByaXZhdGUgbG9nUmVxdWVzdChwYXRoRXhwcmVzc2lvbnM6IFNpZGVFZmZlY3RzVGFyZ2V0W10sIGNvbnRleHQ6IENvbnRleHQpOiB2b2lkIHtcblx0XHRjb25zdCB0YXJnZXRQYXRocyA9IHBhdGhFeHByZXNzaW9ucy5yZWR1Y2UoZnVuY3Rpb24gKHBhdGhzLCB0YXJnZXQpIHtcblx0XHRcdHJldHVybiBgJHtwYXRoc31cXG5cXHRcXHQkeyh0YXJnZXQgYXMgU2lkZUVmZmVjdHNFbnRpdHlUeXBlKS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCB8fCB0YXJnZXQgfHwgXCJcIn1gO1xuXHRcdH0sIFwiXCIpO1xuXHRcdExvZy5kZWJ1ZyhgU2lkZUVmZmVjdHMgLSBSZXF1ZXN0OlxcblxcdENvbnRleHQgcGF0aCA6ICR7Y29udGV4dC5nZXRQYXRoKCl9XFxuXFx0UHJvcGVydHkgcGF0aHMgOiR7dGFyZ2V0UGF0aHN9YCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgbmFtZSBvZiB0aGUgYmluZGluZyBwYXJhbWV0ZXIgb24gdGhlIFNpZGVFZmZlY3RzIHRhcmdldHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1RhcmdldHMgU2lkZUVmZmVjdHMgVGFyZ2V0c1xuXHQgKiBAcGFyYW0gYmluZGluZ1BhcmFtZXRlck5hbWUgTmFtZSBvZiBiaW5kaW5nIHBhcmFtZXRlclxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqL1xuXHRwcml2YXRlIHJlbW92ZUJpbmRpbmdQYXJhbWV0ZXIoc2lkZUVmZmVjdHNUYXJnZXRzOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUsIGJpbmRpbmdQYXJhbWV0ZXJOYW1lPzogc3RyaW5nKTogU2lkZUVmZmVjdHNUYXJnZXRUeXBlIHtcblx0XHRpZiAoYmluZGluZ1BhcmFtZXRlck5hbWUpIHtcblx0XHRcdGNvbnN0IHJlcGxhY2VCaW5kaW5nUGFyYW1ldGVyID0gZnVuY3Rpb24gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeJHtiaW5kaW5nUGFyYW1ldGVyTmFtZX0vP2ApLCBcIlwiKTtcblx0XHRcdH07XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiBzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0UHJvcGVydGllcy5tYXAoKHRhcmdldFByb3BlcnR5KSA9PiByZXBsYWNlQmluZGluZ1BhcmFtZXRlcih0YXJnZXRQcm9wZXJ0eSkpLFxuXHRcdFx0XHR0YXJnZXRFbnRpdGllczogc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldEVudGl0aWVzLm1hcCgodGFyZ2V0RW50aXR5KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHJlcGxhY2VCaW5kaW5nUGFyYW1ldGVyKHRhcmdldEVudGl0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCkgfTtcblx0XHRcdFx0fSlcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiBzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0UHJvcGVydGllcyxcblx0XHRcdHRhcmdldEVudGl0aWVzOiBzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0RW50aXRpZXNcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZSBkdXBsaWNhdGVzIGluIFNpZGVFZmZlY3RzIHRhcmdldHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1RhcmdldHMgU2lkZUVmZmVjdHMgVGFyZ2V0c1xuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyB0YXJnZXRzIHdpdGhvdXQgZHVwbGljYXRlc1xuXHQgKi9cblx0cHJpdmF0ZSByZW1vdmVEdXBsaWNhdGVUYXJnZXRzKHNpZGVFZmZlY3RzVGFyZ2V0czogU2lkZUVmZmVjdHNUYXJnZXRUeXBlKTogU2lkZUVmZmVjdHNUYXJnZXRUeXBlIHtcblx0XHRjb25zdCB0YXJnZXRFbnRpdGllc1BhdGhzID0gc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldEVudGl0aWVzLm1hcCgodGFyZ2V0RW50aXR5KSA9PiB0YXJnZXRFbnRpdHkuJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGgpO1xuXHRcdGNvbnN0IHVuaXF1ZVRhcmdldGVkRW50aXRpZXNQYXRoID0gbmV3IFNldDxzdHJpbmc+KHRhcmdldEVudGl0aWVzUGF0aHMpO1xuXHRcdGNvbnN0IHVuaXF1ZVRhcmdldFByb3BlcnRpZXMgPSBuZXcgU2V0PHN0cmluZz4oc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldFByb3BlcnRpZXMpO1xuXG5cdFx0Y29uc3QgdW5pcXVlVGFyZ2V0ZWRFbnRpdGllcyA9IEFycmF5LmZyb20odW5pcXVlVGFyZ2V0ZWRFbnRpdGllc1BhdGgpLm1hcCgoZW50aXR5UGF0aCkgPT4ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IGVudGl0eVBhdGhcblx0XHRcdH07XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4geyB0YXJnZXRQcm9wZXJ0aWVzOiBBcnJheS5mcm9tKHVuaXF1ZVRhcmdldFByb3BlcnRpZXMpLCB0YXJnZXRFbnRpdGllczogdW5pcXVlVGFyZ2V0ZWRFbnRpdGllcyB9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgYWN0aW9uIHR5cGUgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyBvbiBhY3Rpb25zXG5cdCAqIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoXG5cdCAqIGV4cGVjdGVkIGZvcm1hdC5cblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMgRW50aXR5IHR5cGUgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHJpdmF0ZSByZXRyaWV2ZU9EYXRhQWN0aW9uc1NpZGVFZmZlY3RzKGVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRjb25zdCBzaWRlRWZmZWN0czogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPiA9IHt9O1xuXHRcdGNvbnN0IGFjdGlvbnMgPSBlbnRpdHlUeXBlLmFjdGlvbnM7XG5cdFx0aWYgKGFjdGlvbnMpIHtcblx0XHRcdE9iamVjdC5rZXlzKGFjdGlvbnMpLmZvckVhY2goKGFjdGlvbk5hbWUpID0+IHtcblx0XHRcdFx0Y29uc3QgYWN0aW9uID0gZW50aXR5VHlwZS5hY3Rpb25zW2FjdGlvbk5hbWVdO1xuXHRcdFx0XHRjb25zdCB0cmlnZ2VyQWN0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRcdFx0XHRsZXQgdGFyZ2V0UHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblx0XHRcdFx0bGV0IHRhcmdldEVudGl0aWVzOiBTaWRlRWZmZWN0c0VudGl0eVR5cGVbXSA9IFtdO1xuXG5cdFx0XHRcdHRoaXMuZ2V0U2lkZUVmZmVjdHNGcm9tU291cmNlKGFjdGlvbikuZm9yRWFjaCgob0RhdGFTaWRlRWZmZWN0KSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgdHJpZ2dlckFjdGlvbiA9IG9EYXRhU2lkZUVmZmVjdC50cmlnZ2VyQWN0aW9uO1xuXHRcdFx0XHRcdHRhcmdldFByb3BlcnRpZXMgPSB0YXJnZXRQcm9wZXJ0aWVzLmNvbmNhdChvRGF0YVNpZGVFZmZlY3QudGFyZ2V0UHJvcGVydGllcyk7XG5cdFx0XHRcdFx0dGFyZ2V0RW50aXRpZXMgPSB0YXJnZXRFbnRpdGllcy5jb25jYXQob0RhdGFTaWRlRWZmZWN0LnRhcmdldEVudGl0aWVzKTtcblx0XHRcdFx0XHRpZiAodHJpZ2dlckFjdGlvbikge1xuXHRcdFx0XHRcdFx0dHJpZ2dlckFjdGlvbnMuYWRkKHRyaWdnZXJBY3Rpb24pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzVGFyZ2V0cyA9IHRoaXMucmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyh7IHRhcmdldFByb3BlcnRpZXMsIHRhcmdldEVudGl0aWVzIH0pO1xuXHRcdFx0XHRzaWRlRWZmZWN0c1thY3Rpb25OYW1lXSA9IHtcblx0XHRcdFx0XHRwYXRoRXhwcmVzc2lvbnM6IFsuLi5zaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0UHJvcGVydGllcywgLi4uc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldEVudGl0aWVzXSxcblx0XHRcdFx0XHR0cmlnZ2VyQWN0aW9uczogQXJyYXkuZnJvbSh0cmlnZ2VyQWN0aW9ucylcblx0XHRcdFx0fTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gc2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cyBlbnRpdHkgdHlwZSB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzXG5cdCAqIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSBhbmQgdG8gY29udmVydCB0aGVzZSBTaWRlRWZmZWN0cyB3aXRoXG5cdCAqIGV4cGVjdGVkIGZvcm1hdC5cblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgRW50aXR5IHR5cGVcblx0ICogQHJldHVybnMgRW50aXR5IHR5cGUgU2lkZUVmZmVjdHMgZGljdGlvbmFyeVxuXHQgKi9cblx0cHJpdmF0ZSByZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMoZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0Y29uc3QgZW50aXR5U2lkZUVmZmVjdHM6IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPiA9IHt9O1xuXHRcdHRoaXMuZ2V0U2lkZUVmZmVjdHNGcm9tU291cmNlKGVudGl0eVR5cGUpLmZvckVhY2goKHNpZGVFZmZlY3RzKSA9PiB7XG5cdFx0XHRlbnRpdHlTaWRlRWZmZWN0c1tzaWRlRWZmZWN0cy5mdWxseVF1YWxpZmllZE5hbWVdID0gc2lkZUVmZmVjdHM7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGVudGl0eVNpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmluZXMgYSBtYXAgZm9yIHRoZSBTb3VyY2VzIG9mIHNpZGVFZmZlY3Qgb24gdGhlIGVudGl0eSB0byB0cmFjayB3aGVyZSB0aG9zZSBzb3VyY2VzIGFyZSB1c2VkIGluIFNpZGVFZmZlY3RzIGFubm90YXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHlUeXBlIHdlIGxvb2sgZm9yIHNpZGUgRWZmZWN0cyBhbm5vdGF0aW9uXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMgVGhlIG1hcHBpbmcgb2JqZWN0IGluIGNvbnN0cnVjdGlvblxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLmVudGl0aWVzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMucHJvcGVydGllc1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLmV2ZW50c1xuXHQgKi9cblx0cHJpdmF0ZSBtYXBTaWRlRWZmZWN0U291cmNlcyhcblx0XHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRcdHNpZGVFZmZlY3RzU291cmNlczoge1xuXHRcdFx0ZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRldmVudHM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdH1cblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBzaWRlRWZmZWN0RGVmaW5pdGlvbiBvZiB0aGlzLmdldFNpZGVFZmZlY3RzQW5ub3RhdGlvbkZyb21Tb3VyY2UoZW50aXR5VHlwZSkpIHtcblx0XHRcdHRoaXMubWFwU2lkZUVmZmVjdFNvdXJjZUVudGl0aWVzKGVudGl0eVR5cGUsIHNpZGVFZmZlY3RzU291cmNlcywgc2lkZUVmZmVjdERlZmluaXRpb24pO1xuXHRcdFx0dGhpcy5tYXBTaWRlRWZmZWN0U291cmNlUHJvcGVydGllcyhlbnRpdHlUeXBlLCBzaWRlRWZmZWN0c1NvdXJjZXMsIHNpZGVFZmZlY3REZWZpbml0aW9uKTtcblx0XHRcdHRoaXMubWFwU2lkZUVmZmVjdFNvdXJjZUV2ZW50cyhlbnRpdHlUeXBlLCBzaWRlRWZmZWN0c1NvdXJjZXMsIHNpZGVFZmZlY3REZWZpbml0aW9uKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRmlsbHMgdGhlIG1hcCBmb3IgdGhlIFNvdXJjZXMgb2Ygc2lkZUVmZmVjdCB3aXRoIHNvdXJjZSBlbnRpdGllcy5cblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eVR5cGUgd2UgbG9vayBmb3Igc2lkZSBFZmZlY3RzIGFubm90YXRpb25cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcyBUaGUgbWFwcGluZyBvYmplY3QgaW4gY29uc3RydWN0aW9uXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMuZW50aXRpZXNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5wcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMuZXZlbnRzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0RGVmaW5pdGlvbiBUaGUgc2lkZSBlZmZlY3QgZGVmaW5pdGlvbiB0byBiZSBldmFsdWF0ZWRcblx0ICovXG5cdHByaXZhdGUgbWFwU2lkZUVmZmVjdFNvdXJjZUVudGl0aWVzKFxuXHRcdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdFx0c2lkZUVmZmVjdHNTb3VyY2VzOiB7XG5cdFx0XHRlbnRpdGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRcdGV2ZW50czogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0fSxcblx0XHRzaWRlRWZmZWN0RGVmaW5pdGlvbjogQ29tbW9uU2lkZUVmZmVjdFR5cGVXaXRoUXVhbGlmaWVyXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3Qgc291cmNlRW50aXR5IG9mIHNpZGVFZmZlY3REZWZpbml0aW9uLlNvdXJjZUVudGl0aWVzID8/IFtdKSB7XG5cdFx0XHRjb25zdCB0YXJnZXRFbnRpdHlUeXBlID0gc291cmNlRW50aXR5LnZhbHVlID8gc291cmNlRW50aXR5LiR0YXJnZXQ/LnRhcmdldFR5cGUgOiBlbnRpdHlUeXBlO1xuXHRcdFx0aWYgKHRhcmdldEVudGl0eVR5cGUpIHtcblx0XHRcdFx0aWYgKCFzaWRlRWZmZWN0c1NvdXJjZXMuZW50aXRpZXNbdGFyZ2V0RW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdKSB7XG5cdFx0XHRcdFx0c2lkZUVmZmVjdHNTb3VyY2VzLmVudGl0aWVzW3RhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNpZGVFZmZlY3RzU291cmNlcy5lbnRpdGllc1t0YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0ucHVzaCh7XG5cdFx0XHRcdFx0ZW50aXR5OiBlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0XHRxdWFsaWZpZXI6IHNpZGVFZmZlY3REZWZpbml0aW9uLnF1YWxpZmllclxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRmlsbHMgdGhlIG1hcCBmb3IgdGhlIFNvdXJjZXMgb2Ygc2lkZUVmZmVjdCB3aXRoIHNvdXJjZSBwcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5VHlwZSB3ZSBsb29rIGZvciBzaWRlIEVmZmVjdHMgYW5ub3RhdGlvblxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzIFRoZSBtYXBwaW5nIG9iamVjdCBpbiBjb25zdHJ1Y3Rpb25cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5lbnRpdGllc1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5ldmVudHNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3REZWZpbml0aW9uIFRoZSBzaWRlIGVmZmVjdCBkZWZpbml0aW9uIHRvIGJlIGV2YWx1YXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBtYXBTaWRlRWZmZWN0U291cmNlUHJvcGVydGllcyhcblx0XHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRcdHNpZGVFZmZlY3RzU291cmNlczoge1xuXHRcdFx0ZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRldmVudHM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdH0sXG5cdFx0c2lkZUVmZmVjdERlZmluaXRpb246IENvbW1vblNpZGVFZmZlY3RUeXBlV2l0aFF1YWxpZmllclxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBoYXNVbmlxdWVTb3VyY2VQcm9wZXJ0eSA9IHNpZGVFZmZlY3REZWZpbml0aW9uLlNvdXJjZVByb3BlcnRpZXM/Lmxlbmd0aCA9PT0gMTtcblx0XHRmb3IgKGNvbnN0IHNvdXJjZVByb3BlcnR5IG9mIHNpZGVFZmZlY3REZWZpbml0aW9uLlNvdXJjZVByb3BlcnRpZXMgPz8gW10pIHtcblx0XHRcdGlmIChzb3VyY2VQcm9wZXJ0eS4kdGFyZ2V0KSB7XG5cdFx0XHRcdGlmICghc2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNbc291cmNlUHJvcGVydHkuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWVdKSB7XG5cdFx0XHRcdFx0c2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNbc291cmNlUHJvcGVydHkuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWVdID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0c2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNbc291cmNlUHJvcGVydHkuJHRhcmdldC5mdWxseVF1YWxpZmllZE5hbWVdLnB1c2goe1xuXHRcdFx0XHRcdGVudGl0eTogZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdFx0cXVhbGlmaWVyOiBzaWRlRWZmZWN0RGVmaW5pdGlvbi5xdWFsaWZpZXIsXG5cdFx0XHRcdFx0aGFzVW5pcXVlU291cmNlUHJvcGVydHlcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZpbGxzIHRoZSBtYXAgZm9yIHRoZSBTb3VyY2VzIG9mIHNpZGVFZmZlY3Qgd2l0aCBzb3VyY2UgZXZlbnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5VHlwZSB3ZSBsb29rIGZvciBzaWRlIEVmZmVjdHMgYW5ub3RhdGlvblxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzIFRoZSBtYXBwaW5nIG9iamVjdCBpbiBjb25zdHJ1Y3Rpb25cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5lbnRpdGllc1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5ldmVudHNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3REZWZpbml0aW9uIFRoZSBzaWRlIGVmZmVjdCBkZWZpbml0aW9uIHRvIGJlIGV2YWx1YXRlZFxuXHQgKi9cblx0cHJpdmF0ZSBtYXBTaWRlRWZmZWN0U291cmNlRXZlbnRzKFxuXHRcdGVudGl0eVR5cGU6IEVudGl0eVR5cGUsXG5cdFx0c2lkZUVmZmVjdHNTb3VyY2VzOiB7XG5cdFx0XHRlbnRpdGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRcdGV2ZW50czogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0fSxcblx0XHRzaWRlRWZmZWN0RGVmaW5pdGlvbjogQ29tbW9uU2lkZUVmZmVjdFR5cGVXaXRoUXVhbGlmaWVyXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3Qgc291cmNlRXZlbnQgb2Ygc2lkZUVmZmVjdERlZmluaXRpb24uU291cmNlRXZlbnRzID8/IFtdKSB7XG5cdFx0XHRpZiAoIXNpZGVFZmZlY3RzU291cmNlcy5ldmVudHNbc291cmNlRXZlbnQudG9TdHJpbmcoKV0pIHtcblx0XHRcdFx0c2lkZUVmZmVjdHNTb3VyY2VzLmV2ZW50c1tzb3VyY2VFdmVudC50b1N0cmluZygpXSA9IFtdO1xuXHRcdFx0fVxuXHRcdFx0c2lkZUVmZmVjdHNTb3VyY2VzLmV2ZW50c1tzb3VyY2VFdmVudC50b1N0cmluZygpXS5wdXNoKHtcblx0XHRcdFx0ZW50aXR5OiBlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdFx0cXVhbGlmaWVyOiBzaWRlRWZmZWN0RGVmaW5pdGlvbi5xdWFsaWZpZXJcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIGZpZWxkR3JvdXBJZCBiYXNlZCBvbiB0aGUgc3RvcmVkIGluZm9ybWF0aW9uIG9uIHRoIHNpZGUgZWZmZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdEluZm9cblx0ICogQHBhcmFtIGlzSW1tZWRpYXRlXG5cdCAqIEByZXR1cm5zIEEgc3RyaW5nIGZvciB0aGUgZmllbGRHcm91cElkLlxuXHQgKi9cblx0cHJpdmF0ZSBnZXRGaWVsZEdyb3VwSWRGb3JTaWRlRWZmZWN0KHNpZGVFZmZlY3RJbmZvOiBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZSwgaXNJbW1lZGlhdGUgPSBmYWxzZSk6IHN0cmluZyB7XG5cdFx0Y29uc3Qgc2lkZUVmZmVjdFdpdGhRdWFsaWZpZXIgPSBzaWRlRWZmZWN0SW5mby5xdWFsaWZpZXJcblx0XHRcdD8gYCR7c2lkZUVmZmVjdEluZm8uZW50aXR5fSMke3NpZGVFZmZlY3RJbmZvLnF1YWxpZmllcn1gXG5cdFx0XHQ6IHNpZGVFZmZlY3RJbmZvLmVudGl0eTtcblx0XHRyZXR1cm4gaXNJbW1lZGlhdGUgfHwgc2lkZUVmZmVjdEluZm8uaGFzVW5pcXVlU291cmNlUHJvcGVydHkgPT09IHRydWVcblx0XHRcdD8gYCR7c2lkZUVmZmVjdFdpdGhRdWFsaWZpZXJ9JCRJbW1lZGlhdGVSZXF1ZXN0YFxuXHRcdFx0OiBzaWRlRWZmZWN0V2l0aFF1YWxpZmllcjtcblx0fVxuXG5cdGdldEludGVyZmFjZSgpOiBTaWRlRWZmZWN0c1NlcnZpY2Uge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59XG5cbmNsYXNzIFNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkgZXh0ZW5kcyBTZXJ2aWNlRmFjdG9yeTxTaWRlRWZmZWN0c1NldHRpbmdzPiB7XG5cdGFzeW5jIGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8U2lkZUVmZmVjdHNTZXR0aW5ncz4pOiBQcm9taXNlPFNpZGVFZmZlY3RzU2VydmljZT4ge1xuXHRcdGNvbnN0IFNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UgPSBuZXcgU2lkZUVmZmVjdHNTZXJ2aWNlKG9TZXJ2aWNlQ29udGV4dCk7XG5cdFx0cmV0dXJuIFNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UuaW5pdGlhbGl6ZSgpO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNpZGVFZmZlY3RzU2VydmljZUZhY3Rvcnk7XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQTRHYUEsa0JBQWtCO0lBQUE7SUFBQTtNQUFBO0lBQUE7SUFBQTtJQUFBO0lBZTlCO0lBR0E7SUFHQTtJQUFBLE9BQ0FDLElBQUksR0FBSixnQkFBYTtNQUNaLE1BQU1DLE9BQU8sR0FBRyxJQUFJLENBQUNDLFVBQVUsRUFBRTtNQUNqQyxJQUFJLENBQUNDLFlBQVksR0FBR0YsT0FBTyxhQUFQQSxPQUFPLHVCQUFQQSxPQUFPLENBQUVHLFdBQTJCO01BQ3hELElBQUksQ0FBQ0MsbUJBQW1CLEdBQUc7UUFDMUJDLEtBQUssRUFBRTtVQUNOQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1VBQ1pDLE9BQU8sRUFBRSxDQUFDO1FBQ1gsQ0FBQztRQUNEQyxPQUFPLEVBQUUsQ0FBQztNQUNYLENBQUM7TUFFRCxJQUFJLENBQUNDLHNCQUFzQixHQUFHO1FBQzdCQyxLQUFLLEVBQUUsQ0FBQztNQUNULENBQUM7TUFDRCxJQUFJLENBQUNDLGVBQWUsR0FBRyxDQUFDLENBQUM7SUFD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
|
|
1085
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTaWRlRWZmZWN0c1NlcnZpY2UiLCJpbml0IiwiY29udGV4dCIsImdldENvbnRleHQiLCJhcHBDb21wb25lbnQiLCJzY29wZU9iamVjdCIsInNpZGVFZmZlY3RzUmVnaXN0cnkiLCJvRGF0YSIsImVudGl0aWVzIiwiYWN0aW9ucyIsImJvdW5kQWN0aW9ucyIsInVuQm91bmRBY3Rpb25zIiwiY29udHJvbCIsInJlY29tbWVuZGF0aW9uUmVnaXN0cnkiLCJyb2xlcyIsInRhcmdldENhbGxiYWNrcyIsImluaXRpYWxpemVXZWJTb2NrZXRDb25uZWN0aW9uIiwibW9kZWwiLCJnZXRNb2RlbCIsInVybCIsImdldFdlYlNvY2tldEJhc2VVcmwiLCJjaGFubmVsIiwiZ2V0V2ViU29ja2V0Q2hhbm5lbFVybCIsIkNoYW5uZWxUeXBlIiwiU2lkZUVmZmVjdHNFdmVudHMiLCJ3ZWJTb2NrZXQiLCJjcmVhdGVXZWJTb2NrZXQiLCJhdHRhY2hNZXNzYWdlIiwib25TaWRlRWZmZWN0c0V2ZW50UmVjZWl2ZWQiLCJiaW5kIiwiZXZlbnQiLCJtZXNzYWdlIiwiZ2V0UGFyYW1ldGVyIiwic2VydmVyQWN0aW9uIiwic2lkZUVmZmVjdEV2ZW50TmFtZSIsInNpZGVFZmZlY3RTb3VyY2UiLCJtZXRhUGF0aCIsImdldE1ldGFNb2RlbCIsImdldE1ldGFDb250ZXh0IiwiZGF0YU1vZGVsIiwiTWV0YU1vZGVsQ29udmVydGVyIiwiZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzIiwicmVsZXZhbnRTaWRlRWZmZWN0cyIsImdldFNpZGVFZmZlY3RXaGVyZUV2ZW50SXNTb3VyY2UiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZnVsbHlRdWFsaWZpZWROYW1lIiwibGVuZ3RoIiwicmVsZXZhbnRQYWdlcyIsInBhZ2VzIiwiZ2V0Um9vdFZpZXdDb250cm9sbGVyIiwiZ2V0VmlzaWJsZVZpZXdzIiwicGFnZSIsInBhZ2VDb250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsImlzQSIsIl9zaWRlRWZmZWN0cyIsImlzRGF0YVBhdGhSZWxldmFudCIsInB1c2giLCJzaWRlRWZmZWN0c0NvbnRyb2xsZXJFeHRlbnNpb24iLCJpbnRlcmFjdGlvblR5cGUiLCJnZXRNYW5pZmVzdEVudHJ5IiwiYXBwIiwiX3NpZGVFZmZlY3RzRXZlbnRzSW50ZXJhY3Rpb25UeXBlIiwiY29uZmlybURhdGFSZWZyZXNoIiwiZXJyb3IiLCJub3RpZnlEYXRhUmVmcmVzaCIsInJlcXVlc3RTaWRlRWZmZWN0c0ZvckV2ZW50IiwiYWRkQ29udHJvbFNpZGVFZmZlY3RzIiwiZW50aXR5VHlwZSIsInNpZGVFZmZlY3QiLCJzb3VyY2VDb250cm9sSWQiLCJjb250cm9sU2lkZUVmZmVjdCIsImVudGl0eUNvbnRyb2xTaWRlRWZmZWN0cyIsImV4ZWN1dGVBY3Rpb24iLCJ0cmlnZ2VyQWN0aW9uIiwiZ3JvdXBJZCIsImFjdGlvbiIsImJpbmRDb250ZXh0IiwiZ2V0QmluZGluZyIsImdldFVwZGF0ZUdyb3VwSWQiLCJzdWJtaXRCYXRjaCIsImV4ZWN1dGUiLCJnZXRDb252ZXJ0ZWRNZXRhTW9kZWwiLCJjb252ZXJ0VHlwZXMiLCJjYXBhYmlsaXRpZXMiLCJnZXRFbnRpdHlUeXBlRnJvbUNvbnRleHQiLCJtZXRhTW9kZWwiLCJnZXRNZXRhUGF0aCIsImdldFBhdGgiLCJnZXRPYmplY3QiLCJnZXRPRGF0YUVudGl0eVNpZGVFZmZlY3RzIiwiZW50aXR5VHlwZU5hbWUiLCJpc0NvbnRyb2xTaWRlRWZmZWN0cyIsInNpZGVFZmZlY3RzIiwiZ2V0R2xvYmFsT0RhdGFFbnRpdHlTaWRlRWZmZWN0cyIsImVudGl0eVNpZGVFZmZlY3RzIiwiZ2xvYmFsU2lkZUVmZmVjdHMiLCJrZXkiLCJzb3VyY2VFbnRpdGllcyIsInNvdXJjZVByb3BlcnRpZXMiLCJzb3VyY2VFdmVudHMiLCJnZXRPRGF0YUFjdGlvblNpZGVFZmZlY3RzIiwiYWN0aW9uTmFtZSIsInVuZGVmaW5lZCIsImluaXRpYWxpemUiLCJzaWRlRWZmZWN0U291cmNlcyIsInByb3BlcnRpZXMiLCJldmVudHMiLCJlbnZpcm9ubWVudENhcGFiaWxpdGllc1NlcnZpY2UiLCJnZXRTZXJ2aWNlIiwicmVxdWVzdE9iamVjdCIsImdldENhcGFiaWxpdGllcyIsImNvbnZlcnRlZE1ldGFNb2RlbCIsImVudGl0eVR5cGVzIiwiZm9yRWFjaCIsIm1hcEZpZWxkQW5ub3RhdGlvbnMiLCJyZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMiLCJtYXBTaWRlRWZmZWN0U291cmNlcyIsImlzQm91bmQiLCJzb3VyY2VFbnRpdHlUeXBlIiwicmV0cmlldmVPRGF0YUFjdGlvbnNTaWRlRWZmZWN0cyIsIk9iamVjdCIsImtleXMiLCJzb3VyY2VzVG9TaWRlRWZmZWN0TWFwcGluZ3MiLCJzb3VyY2UiLCJhZGRSZWNvbW1lbmRhdGlvblJvbGVzIiwic291cmNlTmFtZSIsImhhc093blByb3BlcnR5IiwiaW5wdXQiLCJvdXRwdXQiLCJlbnRpdHlQcm9wZXJ0aWVzIiwicHJvcGVydHkiLCJjb21tb25Bbm5vIiwiYW5ub3RhdGlvbnMiLCJDb21tb24iLCJSZWNvbW1lbmRhdGlvblJvbGUiLCJyb2xlVHlwZSIsInZhbHVlT2YiLCJpbmNsdWRlcyIsIm5hbWUiLCJnZXRSZWNvbW1lbmRhdGlvbnNNYXBwaW5nIiwiY2hlY2tJZkZpZWxkSXNSZWNvbW1lbmRhdGlvblJlbGV2YW50IiwiZmllbGQiLCJnZXRCaW5kaW5nQ29udGV4dCIsInByb3BlcnR5TmFtZSIsImRhdGEiLCJzb3VyY2VQYXRoIiwic3BsaXQiLCJwb3AiLCJtZXRhQ29udGV4dCIsInRhcmdldERhdGFNb2RlbE9iamVjdCIsInRhcmdldE9iamVjdCIsInRhcmdldEVudGl0eVR5cGVOYW1lIiwiaXNFbnRpdHlTZXQiLCJpc05hdmlnYXRpb25Qcm9wZXJ0eSIsInRhcmdldFR5cGUiLCJyZWNvbW1lbmRhdGlvblJvbGVzRm9yRW50aXR5IiwiZ2V0UmVjb21tZW5kYXRpb25PdXRwdXRGaWVsZHMiLCJyZW1vdmVDb250cm9sU2lkZUVmZmVjdHMiLCJjb250cm9sSWQiLCJzRW50aXR5VHlwZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInBhdGhFeHByZXNzaW9ucyIsImxvZ1JlcXVlc3QiLCJyZXF1ZXN0U2lkZUVmZmVjdHNGb3JPRGF0YUFjdGlvbiIsInByb21pc2VzIiwidHJpZ2dlckFjdGlvbnMiLCJtYXAiLCJQcm9taXNlIiwiYWxsIiwicmVzb2x2ZSIsInJlcXVlc3RTaWRlRWZmZWN0c0Zvck5hdmlnYXRpb25Qcm9wZXJ0eSIsIm5hdmlnYXRpb25Qcm9wZXJ0eSIsImlnbm9yZVRyaWdnZXJBY3Rpb25zIiwiYmFzZUVudGl0eVR5cGUiLCJuYXZpZ2F0aW9uUGF0aCIsInRhcmdldFByb3BlcnRpZXMiLCJ0YXJnZXRFbnRpdGllcyIsInNpZGVFZmZlY3RzVGFyZ2V0cyIsImZpbHRlciIsImFubm90YXRpb25OYW1lIiwic29tZSIsIm5hdmlnYXRpb24iLCIkTmF2aWdhdGlvblByb3BlcnR5UGF0aCIsInByb3BlcnR5UGF0aCIsInN0YXJ0c1dpdGgiLCJyZXBsYWNlIiwic0Fubm90YXRpb25OYW1lIiwiY29uY2F0Iiwic2lkZUVmZmVjdHNUYXJnZXREZWZpbml0aW9uIiwicmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyIsImNhdGNoIiwiTG9nIiwiZ2V0Q29udHJvbEVudGl0eVNpZGVFZmZlY3RzIiwiZ2V0U2lkZUVmZmVjdFdoZXJlRW50aXR5SXNTb3VyY2UiLCJldmVudE5hbWUiLCJlbnRpdHkiLCJhbm5vdGF0aW9uIiwicXVhbGlmaWVyIiwiY29tcHV0ZUZpZWxkR3JvdXBJZHMiLCJzb3VyY2VQcm9wZXJ0eSIsImVudGl0eUZpZWxkR3JvdXBJZHMiLCJzaWRlRWZmZWN0SW5mbyIsImdldEZpZWxkR3JvdXBJZEZvclNpZGVFZmZlY3QiLCJnZXRTaWRlRWZmZWN0V2hlcmVQcm9wZXJ0eUlzU291cmNlIiwicmVnaXN0ZXJUYXJnZXRDYWxsYmFjayIsInRhcmdldCIsImNhbGxiYWNrIiwiZGVyZWdpc3RlclRhcmdldENhbGxiYWNrIiwiZ2V0UmVnaXN0ZXJlZENhbGxiYWNrIiwiYWRkVGV4dFByb3BlcnRpZXMiLCJzZXRPZlByb3BlcnRpZXMiLCJTZXQiLCJzZXRPZkVudGl0aWVzIiwiZGF0YU1vZGVsUHJvcGVydHlQYXRoIiwiZ2V0RGF0YU1vZGVsUHJvcGVydGllc0Zyb21BUGF0aCIsImFzc29jaWF0ZWRUZXh0UGF0aCIsImdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoIiwiYWRkVGV4dFByb3BlcnR5IiwiQXJyYXkiLCJmcm9tIiwiZGF0YU1vZGVsVGV4dFBhdGgiLCJlbmhhbmNlRGF0YU1vZGVsUGF0aCIsInJlbGF0aXZlTmF2aWdhdGlvbiIsInRhcmdldEVudGl0eVNldCIsImdldFRhcmdldE5hdmlnYXRpb25QYXRoIiwidGFyZ2V0UGF0aCIsImdldFRhcmdldE9iamVjdFBhdGgiLCJpc0Fzc29jaWF0ZWRUZXh0TGlzdGVkSW5TaWRlRWZmZWN0VGFyZ2V0cyIsImlzUHJvcGVydHlBc3NvY2lhdGVkVGV4dE9uRGlmZmVyZW50RW50aXR5U2V0IiwiYWRkIiwiaXNQcm9wZXJ0eSIsImhhcyIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwiY29udmVydFNpZGVFZmZlY3RzIiwiYmluZGluZ1BhcmFtZXRlciIsIlRyaWdnZXJBY3Rpb24iLCJuZXdTaWRlRWZmZWN0cyIsImNvbnZlcnRTaWRlRWZmZWN0c0Zvcm1hdCIsInJlbW92ZUJpbmRpbmdQYXJhbWV0ZXIiLCJmb3JtYXRQcm9wZXJ0aWVzIiwicmVkdWNlIiwicGF0aCIsImlzUHJvcGVydHlQYXRoRXhwcmVzc2lvbiIsInZhbHVlIiwiZm9ybWF0RW50aXRpZXMiLCJ0YXJnZXRFbnRpdHkiLCJTb3VyY2VQcm9wZXJ0aWVzIiwiU291cmNlRW50aXRpZXMiLCJTb3VyY2VFdmVudHMiLCJUYXJnZXRQcm9wZXJ0aWVzIiwiVGFyZ2V0RW50aXRpZXMiLCJkYXRhTW9kZWxPYmplY3RQYXRocyIsImNvbnRhaW5lck5hbWUiLCJlbnRpdHlDb250YWluZXIiLCJwcm9wZXJ0eVJlbGF0aXZlUGF0aCIsInRlc3RFbnRpdHlUeXBlTmFtZSIsInJlZ2V4UGF0dGVybiIsIm1hdGNoIiwiUmVnRXhwIiwidGVzdEVudGl0eVR5cGUiLCJyZXNvbHZlUGF0aCIsImVudGl0eVNldCIsImVudGl0eVNldHMiLCJmaW5kIiwicmVsYXRlZEVudGl0eVNldCIsInNpbmdsZXRvbnMiLCJzaW5nbGV0b24iLCJlbnRpdHlTZXRDb250ZXh0IiwiY3JlYXRlQmluZGluZ0NvbnRleHQiLCJkYXRhTW9kZWxFbnRpdHlTZXQiLCJkYXRhTW9kZWxPYmplY3RQYXRoIiwiaXNDb21wbGV4VHlwZSIsImlzRW50aXR5VHlwZSIsImVudGl0eVByb3BlcnR5IiwiZGVzdHJveSIsImdldFNpZGVFZmZlY3RzRnJvbVNvdXJjZSIsImJpbmRpbmdBbGlhcyIsImlzU291cmNlRW50aXR5VHlwZSIsImNvbW1vbkFubm90YXRpb24iLCJwYXJhbWV0ZXJzIiwicGFyYW1ldGVyIiwidHlwZSIsImdldFNpZGVFZmZlY3RzQW5ub3RhdGlvbkZyb21Tb3VyY2UiLCJzaWRlRWZmZWN0QW5ubyIsImlzU2lkZUVmZmVjdHNBbm5vdGF0aW9uIiwiJFR5cGUiLCJ0YXJnZXRQYXRocyIsInBhdGhzIiwiZGVidWciLCJiaW5kaW5nUGFyYW1ldGVyTmFtZSIsInJlcGxhY2VCaW5kaW5nUGFyYW1ldGVyIiwidGFyZ2V0UHJvcGVydHkiLCJ0YXJnZXRFbnRpdGllc1BhdGhzIiwidW5pcXVlVGFyZ2V0ZWRFbnRpdGllc1BhdGgiLCJ1bmlxdWVUYXJnZXRQcm9wZXJ0aWVzIiwidW5pcXVlVGFyZ2V0ZWRFbnRpdGllcyIsImVudGl0eVBhdGgiLCJvRGF0YVNpZGVFZmZlY3QiLCJzaWRlRWZmZWN0c1NvdXJjZXMiLCJzaWRlRWZmZWN0RGVmaW5pdGlvbiIsIm1hcFNpZGVFZmZlY3RTb3VyY2VFbnRpdGllcyIsIm1hcFNpZGVFZmZlY3RTb3VyY2VQcm9wZXJ0aWVzIiwibWFwU2lkZUVmZmVjdFNvdXJjZUV2ZW50cyIsInNvdXJjZUVudGl0eSIsIiR0YXJnZXQiLCJoYXNVbmlxdWVTb3VyY2VQcm9wZXJ0eSIsInNvdXJjZUV2ZW50IiwidG9TdHJpbmciLCJpc0ltbWVkaWF0ZSIsInNpZGVFZmZlY3RXaXRoUXVhbGlmaWVyIiwiZ2V0SW50ZXJmYWNlIiwiU2VydmljZSIsIlNpZGVFZmZlY3RzU2VydmljZUZhY3RvcnkiLCJjcmVhdGVJbnN0YW5jZSIsIm9TZXJ2aWNlQ29udGV4dCIsIlNpZGVFZmZlY3RzU2VydmljZVNlcnZpY2UiLCJTZXJ2aWNlRmFjdG9yeSJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7XG5cdEFjdGlvbixcblx0Q29udmVydGVkTWV0YWRhdGEsXG5cdEVudGl0eVNldCxcblx0RW50aXR5VHlwZSxcblx0TmF2aWdhdGlvblByb3BlcnR5LFxuXHROYXZpZ2F0aW9uUHJvcGVydHlQYXRoLFxuXHRQcm9wZXJ0eSxcblx0UHJvcGVydHlQYXRoXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgKiBhcyBFZG0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL0VkbVwiO1xuaW1wb3J0IHR5cGUgeyBTaWRlRWZmZWN0c1R5cGUgYXMgQ29tbW9uU2lkZUVmZmVjdHNUeXBlIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25cIjtcbmltcG9ydCB7IENvbW1vbkFubm90YXRpb25UeXBlcyB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvQ29tbW9uXCI7XG5pbXBvcnQgdHlwZSB7IFByb3BlcnR5QW5ub3RhdGlvbnNfQ29tbW9uIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tb25fRWRtXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIFBhZ2VDb250cm9sbGVyIGZyb20gXCJzYXAvZmUvY29yZS9QYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHR5cGUgeyBFbnZpcm9ubWVudENhcGFiaWxpdGllcyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0ICogYXMgTWV0YU1vZGVsQ29udmVydGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB7XG5cdGlzQ29tcGxleFR5cGUsXG5cdGlzRW50aXR5U2V0LFxuXHRpc0VudGl0eVR5cGUsXG5cdGlzTmF2aWdhdGlvblByb3BlcnR5LFxuXHRpc1Byb3BlcnR5LFxuXHRpc1Byb3BlcnR5UGF0aEV4cHJlc3Npb25cbn0gZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvVHlwZUd1YXJkc1wiO1xuaW1wb3J0IHsgQ2hhbm5lbFR5cGUsIGNyZWF0ZVdlYlNvY2tldCwgZ2V0V2ViU29ja2V0QmFzZVVybCwgZ2V0V2ViU29ja2V0Q2hhbm5lbFVybCB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1dlYlNvY2tldFwiO1xuaW1wb3J0IHsgZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHR5cGUgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgU2VydmljZSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlXCI7XG5pbXBvcnQgU2VydmljZUZhY3RvcnkgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIFNhcFBjcFdlYlNvY2tldCBmcm9tIFwic2FwL3VpL2NvcmUvd3MvU2FwUGNwV2ViU29ja2V0XCI7XG5pbXBvcnQgdHlwZSB7IFdlYlNvY2tldCRNZXNzYWdlRXZlbnQgfSBmcm9tIFwic2FwL3VpL2NvcmUvd3MvV2ViU29ja2V0XCI7XG5pbXBvcnQgdHlwZSB7IGRlZmF1bHQgYXMgQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgT0RhdGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIHsgU2VydmljZUNvbnRleHQgfSBmcm9tIFwidHlwZXMvbWV0YW1vZGVsX3R5cGVzXCI7XG5pbXBvcnQgdHlwZSBBcHBDb21wb25lbnQgZnJvbSBcIi4uL0FwcENvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgZW5oYW5jZURhdGFNb2RlbFBhdGgsIGdldFRhcmdldE5hdmlnYXRpb25QYXRoLCBnZXRUYXJnZXRPYmplY3RQYXRoIH0gZnJvbSBcIi4uL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHR5cGUgeyBFbnZpcm9ubWVudENhcGFiaWxpdGllc1NlcnZpY2UgfSBmcm9tIFwiLi9FbnZpcm9ubWVudFNlcnZpY2VGYWN0b3J5XCI7XG5cbmV4cG9ydCB0eXBlIFByb3BlcnR5QW5ub3RhdGlvbnNXaXRoUmVjb21tZW5kYXRpb24gPSBQcm9wZXJ0eUFubm90YXRpb25zX0NvbW1vbiAmIHtcblx0UmVjb21tZW5kYXRpb25Sb2xlPzogc3RyaW5nO1xufTtcblxudHlwZSBTaWRlRWZmZWN0c1NldHRpbmdzID0ge307XG5cbmV4cG9ydCB0eXBlIFNpZGVFZmZlY3RzRW50aXR5VHlwZSA9IHtcblx0JE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBTaWRlRWZmZWN0c1RhcmdldCA9IFNpZGVFZmZlY3RzRW50aXR5VHlwZSB8IHN0cmluZztcblxuZXhwb3J0IHR5cGUgU2lkZUVmZmVjdHNUYXJnZXRUeXBlID0ge1xuXHR0YXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblx0dGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzRW50aXR5VHlwZVtdO1xufTtcblxudHlwZSBCYXNlU2lkZUVmZmVjdHNUeXBlID0ge1xuXHRzb3VyY2VQcm9wZXJ0aWVzPzogc3RyaW5nW107XG5cdHNvdXJjZUVudGl0aWVzPzogU2lkZUVmZmVjdHNFbnRpdHlUeXBlW107XG5cdHNvdXJjZUV2ZW50cz86IHN0cmluZ1tdO1xuXHRmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcbn0gJiBTaWRlRWZmZWN0c1RhcmdldFR5cGU7XG5cbmV4cG9ydCB0eXBlIE9EYXRhU2lkZUVmZmVjdHNUeXBlID0gQmFzZVNpZGVFZmZlY3RzVHlwZSAmIHtcblx0dHJpZ2dlckFjdGlvbj86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFjdGlvblNpZGVFZmZlY3RzVHlwZSA9IHtcblx0cGF0aEV4cHJlc3Npb25zPzogU2lkZUVmZmVjdHNUYXJnZXRbXTtcblx0dHJpZ2dlckFjdGlvbnM/OiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCB0eXBlIENvbnRyb2xTaWRlRWZmZWN0c1R5cGUgPSBQYXJ0aWFsPEJhc2VTaWRlRWZmZWN0c1R5cGU+ICYge1xuXHRmdWxseVF1YWxpZmllZE5hbWU6IHN0cmluZztcblx0c291cmNlUHJvcGVydGllczogc3RyaW5nW107XG5cdHNvdXJjZUNvbnRyb2xJZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU2lkZUVmZmVjdHNUeXBlID0gQ29udHJvbFNpZGVFZmZlY3RzVHlwZSB8IE9EYXRhU2lkZUVmZmVjdHNUeXBlO1xuXG4vL1RPRE8gZml4IHRoaXMgdHlwZSBpbiB0aGUgdXggdm9jYWJ1bGFyaWVzXG4vL1RPRE86IFNvdXJjZSBFdmVudHMgYXJlIHN0aWxsIGV4cGVyaW1lbnRhbCwgcmVtb3ZlIG9uY2UgcHVibGljXG50eXBlIENvbW1vblNpZGVFZmZlY3RUeXBlV2l0aFF1YWxpZmllciA9IENvbW1vblNpZGVFZmZlY3RzVHlwZSAmIHsgcXVhbGlmaWVyPzogc3RyaW5nOyBTb3VyY2VFdmVudHM/OiBFZG0uU3RyaW5nW10gfTtcblxuZXhwb3J0IHR5cGUgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2UgPSB7IGVudGl0eTogc3RyaW5nOyBxdWFsaWZpZXI/OiBzdHJpbmc7IGhhc1VuaXF1ZVNvdXJjZVByb3BlcnR5PzogYm9vbGVhbiB9O1xuXG50eXBlIFNpZGVFZmZlY3RzT3JpZ2luUmVnaXN0cnkgPSB7XG5cdG9EYXRhOiB7XG5cdFx0ZW50aXRpZXM6IHtcblx0XHRcdFtlbnRpdHk6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIE9EYXRhU2lkZUVmZmVjdHNUeXBlPjtcblx0XHR9O1xuXHRcdGFjdGlvbnM6IHtcblx0XHRcdGJvdW5kQWN0aW9uczoge1xuXHRcdFx0XHRbZW50aXR5OiBzdHJpbmddOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+O1xuXHRcdFx0fTtcblx0XHRcdHVuQm91bmRBY3Rpb25zOiB7XG5cdFx0XHRcdFthY3Rpb246IHN0cmluZ106IEFjdGlvblNpZGVFZmZlY3RzVHlwZTtcblx0XHRcdH07XG5cdFx0fTtcblx0fTtcblx0Y29udHJvbDoge1xuXHRcdFtlbnRpdHk6IHN0cmluZ106IFJlY29yZDxzdHJpbmcsIENvbnRyb2xTaWRlRWZmZWN0c1R5cGU+O1xuXHR9O1xufTtcblxudHlwZSBSZWNvbW1lbmRhdGlvbnNSb2xlcyA9IHtcblx0aW5wdXQ6IHN0cmluZ1tdO1xuXHRvdXRwdXQ6IHN0cmluZ1tdO1xuXHRyZXF1aXJlZD86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IHR5cGUgUmVjb21tZW5kYXRpb25zUmVnaXN0cnkgPSB7XG5cdHJvbGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvbW1lbmRhdGlvbnNSb2xlcz47XG59O1xuXG50eXBlIFdlYlNvY2tldE1lc3NhZ2UgPSB7XG5cdHNlcnZlckFjdGlvbjogXCJSYWlzZVNpZGVFZmZlY3RcIjtcblx0c2lkZUVmZmVjdEV2ZW50TmFtZTogc3RyaW5nO1xuXHRzaWRlRWZmZWN0U291cmNlOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgY2xhc3MgU2lkZUVmZmVjdHNTZXJ2aWNlIGV4dGVuZHMgU2VydmljZTxTaWRlRWZmZWN0c1NldHRpbmdzPiB7XG5cdGFwcENvbXBvbmVudCE6IEFwcENvbXBvbmVudDtcblxuXHRwcml2YXRlIHNpZGVFZmZlY3RzUmVnaXN0cnkhOiBTaWRlRWZmZWN0c09yaWdpblJlZ2lzdHJ5O1xuXG5cdHByaXZhdGUgcmVjb21tZW5kYXRpb25SZWdpc3RyeSE6IFJlY29tbWVuZGF0aW9uc1JlZ2lzdHJ5O1xuXG5cdHByaXZhdGUgY2FwYWJpbGl0aWVzITogRW52aXJvbm1lbnRDYXBhYmlsaXRpZXMgfCB1bmRlZmluZWQ7XG5cblx0cHJpdmF0ZSBzb3VyY2VzVG9TaWRlRWZmZWN0TWFwcGluZ3MhOiB7XG5cdFx0ZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdGV2ZW50czogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdH07XG5cblx0Ly8gQ2FsbGJhY2sgbWV0aG9kcyB0byBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBzaWRlIGVmZmVjdCB0YXJnZXQgaXMgaGl0XG5cdHByaXZhdGUgdGFyZ2V0Q2FsbGJhY2tzITogUmVjb3JkPHN0cmluZywgRnVuY3Rpb24+O1xuXG5cdC8vIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHJldHJpZXZlIFNpZGVFZmZlY3RzIGV2ZW50c1xuXHRwcml2YXRlIHdlYlNvY2tldD86IFNhcFBjcFdlYlNvY2tldDtcblxuXHQvLyAhOiBtZWFucyB0aGF0IHdlIGtub3cgaXQgd2lsbCBiZSBhc3NpZ25lZCBiZWZvcmUgdXNhZ2Vcblx0aW5pdCgpOiB2b2lkIHtcblx0XHRjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cdFx0dGhpcy5hcHBDb21wb25lbnQgPSBjb250ZXh0Py5zY29wZU9iamVjdCBhcyBBcHBDb21wb25lbnQ7XG5cdFx0dGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5ID0ge1xuXHRcdFx0b0RhdGE6IHtcblx0XHRcdFx0ZW50aXRpZXM6IHt9LFxuXHRcdFx0XHRhY3Rpb25zOiB7XG5cdFx0XHRcdFx0Ym91bmRBY3Rpb25zOiB7fSxcblx0XHRcdFx0XHR1bkJvdW5kQWN0aW9uczoge31cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGNvbnRyb2w6IHt9XG5cdFx0fTtcblxuXHRcdHRoaXMucmVjb21tZW5kYXRpb25SZWdpc3RyeSA9IHtcblx0XHRcdHJvbGVzOiB7fVxuXHRcdH07XG5cdFx0dGhpcy50YXJnZXRDYWxsYmFja3MgPSB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb25uZWN0cyB0byBhIGdpdmVuIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHJldHJpZXZlIFNpZGVFZmZlY3RzIGV2ZW50cy5cblx0ICpcblx0ICovXG5cdGluaXRpYWxpemVXZWJTb2NrZXRDb25uZWN0aW9uKCk6IHZvaWQge1xuXHRcdGNvbnN0IG1vZGVsID0gdGhpcy5hcHBDb21wb25lbnQuZ2V0TW9kZWwoKTtcblx0XHRjb25zdCB1cmwgPSBnZXRXZWJTb2NrZXRCYXNlVXJsKG1vZGVsKTtcblx0XHRjb25zdCBjaGFubmVsID0gZ2V0V2ViU29ja2V0Q2hhbm5lbFVybChDaGFubmVsVHlwZS5TaWRlRWZmZWN0c0V2ZW50cywgbW9kZWwpO1xuXG5cdFx0aWYgKHVybCAmJiBjaGFubmVsKSB7XG5cdFx0XHR0aGlzLndlYlNvY2tldCA9IGNyZWF0ZVdlYlNvY2tldChDaGFubmVsVHlwZS5TaWRlRWZmZWN0c0V2ZW50cywgbW9kZWwpO1xuXHRcdFx0dGhpcy53ZWJTb2NrZXQuYXR0YWNoTWVzc2FnZSh0aGlzLm9uU2lkZUVmZmVjdHNFdmVudFJlY2VpdmVkLmJpbmQodGhpcykpO1xuXHRcdH1cblx0XHRyZXR1cm47XG5cdH1cblxuXHQvKipcblx0ICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBjb25uZWN0ZWQgV2ViU29ja2V0IHNlbmRzIGEgbWVzc2FnZS5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB3aXRoIHRoZSByZWxldmFudCBzaWRlRWZmZWN0IGluZm9ybWF0aW9uXG5cdCAqL1xuXHRhc3luYyBvblNpZGVFZmZlY3RzRXZlbnRSZWNlaXZlZChldmVudDogV2ViU29ja2V0JE1lc3NhZ2VFdmVudCAmIEV2ZW50PHsgcGNwRmllbGRzPzogV2ViU29ja2V0TWVzc2FnZSB9Pik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG1lc3NhZ2UgPSBldmVudC5nZXRQYXJhbWV0ZXIoXCJwY3BGaWVsZHNcIik7XG5cblx0XHRpZiAobWVzc2FnZT8uc2VydmVyQWN0aW9uICE9PSBcIlJhaXNlU2lkZUVmZmVjdFwiIHx8ICFtZXNzYWdlLnNpZGVFZmZlY3RFdmVudE5hbWUgfHwgIW1lc3NhZ2Uuc2lkZUVmZmVjdFNvdXJjZSkge1xuXHRcdFx0Ly8gbWVzc2FnZSBpcyBub3QgcmVsZXZhbnRcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBtZXRhUGF0aCA9IHRoaXMuZ2V0TWV0YU1vZGVsKCkuZ2V0TWV0YUNvbnRleHQobWVzc2FnZS5zaWRlRWZmZWN0U291cmNlKTtcblx0XHRjb25zdCBkYXRhTW9kZWwgPSBNZXRhTW9kZWxDb252ZXJ0ZXIuZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzKG1ldGFQYXRoKTtcblx0XHRjb25zdCByZWxldmFudFNpZGVFZmZlY3RzID0gdGhpcy5nZXRTaWRlRWZmZWN0V2hlcmVFdmVudElzU291cmNlKFxuXHRcdFx0ZGF0YU1vZGVsLnRhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0bWVzc2FnZS5zaWRlRWZmZWN0RXZlbnROYW1lXG5cdFx0KTtcblxuXHRcdGlmIChyZWxldmFudFNpZGVFZmZlY3RzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Ly8gbm8gc2lkZSBlZmZlY3QgZm9yIHRoaXMgc291cmNlXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVsZXZhbnRQYWdlczogUGFnZUNvbnRyb2xsZXJbXSA9IFtdO1xuXHRcdGNvbnN0IHBhZ2VzID0gdGhpcy5hcHBDb21wb25lbnQuZ2V0Um9vdFZpZXdDb250cm9sbGVyKCkuZ2V0VmlzaWJsZVZpZXdzKCk7XG5cdFx0Zm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSB7XG5cdFx0XHRjb25zdCBwYWdlQ29udHJvbGxlciA9IHBhZ2UuZ2V0Q29udHJvbGxlcigpO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRwYWdlQ29udHJvbGxlci5pc0E8UGFnZUNvbnRyb2xsZXI+KFwic2FwLmZlLmNvcmUuUGFnZUNvbnRyb2xsZXJcIikgJiZcblx0XHRcdFx0cGFnZUNvbnRyb2xsZXIuX3NpZGVFZmZlY3RzLmlzRGF0YVBhdGhSZWxldmFudChtZXNzYWdlLnNpZGVFZmZlY3RTb3VyY2UpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmVsZXZhbnRQYWdlcy5wdXNoKHBhZ2VDb250cm9sbGVyKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAocmVsZXZhbnRQYWdlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIG5vIHJlbGV2YW50IHBhZ2UgZm91bmQgZm9yIHRoaXMgc291cmNlXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gd2UgYXNrIHRoZSB1c2VyIHRvIGNvbmZpcm0gdGhlIHJlZnJlc2ggb3Igbm90aWZ5IHRoZSB1c2VyLCB3ZSB1c2UgdGhlIG1vc3Qgc3BlY2lmaWMgcGFnZVxuXHRcdGNvbnN0IHNpZGVFZmZlY3RzQ29udHJvbGxlckV4dGVuc2lvbiA9IHJlbGV2YW50UGFnZXNbcmVsZXZhbnRQYWdlcy5sZW5ndGggLSAxXS5fc2lkZUVmZmVjdHM7XG5cdFx0Y29uc3QgaW50ZXJhY3Rpb25UeXBlID0gdGhpcy5hcHBDb21wb25lbnQuZ2V0TWFuaWZlc3RFbnRyeShcInNhcC5mZVwiKT8uYXBwPy5fc2lkZUVmZmVjdHNFdmVudHNJbnRlcmFjdGlvblR5cGUgPz8gXCJOb3RpZmljYXRpb25cIjtcblxuXHRcdHN3aXRjaCAoaW50ZXJhY3Rpb25UeXBlKSB7XG5cdFx0XHRjYXNlIFwiQ29uZmlybWF0aW9uXCI6XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0YXdhaXQgc2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uLmNvbmZpcm1EYXRhUmVmcmVzaCgpO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJOb3RpZmljYXRpb25cIjpcblx0XHRcdFx0c2lkZUVmZmVjdHNDb250cm9sbGVyRXh0ZW5zaW9uLm5vdGlmeURhdGFSZWZyZXNoKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIk5vbmVcIjpcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0Ly8gbm93IHJlZnJlc2ggdGhlIHBhZ2VzLCBmb3J3YXJkIHRoaXMgdGFzayB0byB0aGUgc2lkZSBlZmZlY3RzIGNvbnRyb2xsZXIgZXh0ZW5zaW9ucyB0byBhbGxvdyBvdmVycmlkaW5nIHBlciBwYWdlIChpLmUuIExSKVxuXHRcdGZvciAoY29uc3QgcGFnZSBvZiByZWxldmFudFBhZ2VzKSB7XG5cdFx0XHRhd2FpdCBwYWdlLl9zaWRlRWZmZWN0cy5yZXF1ZXN0U2lkZUVmZmVjdHNGb3JFdmVudChtZXNzYWdlLnNpZGVFZmZlY3RFdmVudE5hbWUsIG1lc3NhZ2Uuc2lkZUVmZmVjdFNvdXJjZSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBTaWRlRWZmZWN0cyBjb250cm9sXG5cdCAqIFNpZGVFZmZlY3RzIGRlZmluaXRpb24gaXMgYWRkZWQgYnkgYSBjb250cm9sIHRvIGtlZXAgZGF0YSB1cCB0byBkYXRlXG5cdCAqIFRoZXNlIFNpZGVFZmZlY3RzIGdldCBsaW1pdGVkIHNjb3BlIGNvbXBhcmVkIHdpdGggU2lkZUVmZmVjdHMgY29taW5nIGZyb20gYW4gT0RhdGEgc2VydmljZTpcblx0ICogLSBPbmx5IG9uZSBTaWRlRWZmZWN0cyBkZWZpbml0aW9uIGNhbiBiZSBkZWZpbmVkIGZvciB0aGUgY29tYmluYXRpb24gZW50aXR5IHR5cGUgLSBjb250cm9sIElkXG5cdCAqIC0gT25seSBTaWRlRWZmZWN0cyBzb3VyY2UgcHJvcGVydGllcyBhcmUgcmVjb2duaXplZCBhbmQgdXNlZCB0byB0cmlnZ2VyIFNpZGVFZmZlY3RzXG5cdCAqXG5cdCAqIEVuc3VyZSB0aGUgc291cmNlQ29udHJvbElkIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgU0FQVUk1IGNvbnRyb2wgSUQuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIE5hbWUgb2YgdGhlIGVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0IFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHB1YmxpYyBhZGRDb250cm9sU2lkZUVmZmVjdHMoZW50aXR5VHlwZTogc3RyaW5nLCBzaWRlRWZmZWN0OiBPbWl0PENvbnRyb2xTaWRlRWZmZWN0c1R5cGUsIFwiZnVsbHlRdWFsaWZpZWROYW1lXCI+KTogdm9pZCB7XG5cdFx0aWYgKHNpZGVFZmZlY3Quc291cmNlQ29udHJvbElkKSB7XG5cdFx0XHRjb25zdCBjb250cm9sU2lkZUVmZmVjdDogQ29udHJvbFNpZGVFZmZlY3RzVHlwZSA9IHtcblx0XHRcdFx0Li4uc2lkZUVmZmVjdCxcblx0XHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lOiBgJHtlbnRpdHlUeXBlfS9TaWRlRWZmZWN0c0ZvckNvbnRyb2wvJHtzaWRlRWZmZWN0LnNvdXJjZUNvbnRyb2xJZH1gXG5cdFx0XHR9O1xuXHRcdFx0Y29uc3QgZW50aXR5Q29udHJvbFNpZGVFZmZlY3RzID0gdGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5LmNvbnRyb2xbZW50aXR5VHlwZV0gfHwge307XG5cdFx0XHRlbnRpdHlDb250cm9sU2lkZUVmZmVjdHNbY29udHJvbFNpZGVFZmZlY3Quc291cmNlQ29udHJvbElkXSA9IGNvbnRyb2xTaWRlRWZmZWN0O1xuXHRcdFx0dGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5LmNvbnRyb2xbZW50aXR5VHlwZV0gPSBlbnRpdHlDb250cm9sU2lkZUVmZmVjdHM7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEV4ZWN1dGVzIFNpZGVFZmZlY3RzIGFjdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHRyaWdnZXJBY3Rpb24gTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHRcblx0ICogQHBhcmFtIGdyb3VwSWQgVGhlIGdyb3VwIElEIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG5cdCAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdpdGhvdXQgZGF0YSBvciB3aXRoIGEgcmV0dXJuIHZhbHVlIGNvbnRleHQgd2hlbiB0aGUgYWN0aW9uIGNhbGwgc3VjY2VlZHNcblx0ICovXG5cdHB1YmxpYyBhc3luYyBleGVjdXRlQWN0aW9uKHRyaWdnZXJBY3Rpb246IHN0cmluZywgY29udGV4dDogQ29udGV4dCwgZ3JvdXBJZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGFjdGlvbiA9IGNvbnRleHQuZ2V0TW9kZWwoKS5iaW5kQ29udGV4dChgJHt0cmlnZ2VyQWN0aW9ufSguLi4pYCwgY29udGV4dCk7XG5cdFx0Z3JvdXBJZCA9IGdyb3VwSWQgfHwgY29udGV4dC5nZXRCaW5kaW5nKCkuZ2V0VXBkYXRlR3JvdXBJZCgpO1xuXHRcdC8vIHRoZSB0cmlnZ2VyQWN0aW9uIGlzIGV4ZWN1dGVkIGluIHNhbWUgJGJhdGNoIGJ1dCBkaWZmZXJlbnQgY2hhbmdlc2V0XG5cdFx0Y29udGV4dC5nZXRNb2RlbCgpLnN1Ym1pdEJhdGNoKGdyb3VwSWQpO1xuXHRcdGF3YWl0IGFjdGlvbi5leGVjdXRlKGdyb3VwSWQsIHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgY29udmVydGVkIE9EYXRhIG1ldGFNb2RlbC5cblx0ICpcblx0ICogQHJldHVybnMgQ29udmVydGVkIE9EYXRhIG1ldGFNb2RlbFxuXHQgKi9cblx0cHVibGljIGdldENvbnZlcnRlZE1ldGFNb2RlbCgpOiBDb252ZXJ0ZWRNZXRhZGF0YSB7XG5cdFx0cmV0dXJuIGNvbnZlcnRUeXBlcyh0aGlzLmdldE1ldGFNb2RlbCgpLCB0aGlzLmNhcGFiaWxpdGllcyk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZW50aXR5IHR5cGUgb2YgYSBjb250ZXh0LlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0XG5cdCAqIEByZXR1cm5zIEVudGl0eSBUeXBlXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RW50aXR5VHlwZUZyb21Db250ZXh0KGNvbnRleHQ6IENvbnRleHQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IG1ldGFNb2RlbCA9IGNvbnRleHQuZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKSxcblx0XHRcdG1ldGFQYXRoID0gbWV0YU1vZGVsLmdldE1ldGFQYXRoKGNvbnRleHQuZ2V0UGF0aCgpKSxcblx0XHRcdGVudGl0eVR5cGUgPSBtZXRhTW9kZWwuZ2V0T2JqZWN0KG1ldGFQYXRoKVtcIiRUeXBlXCJdO1xuXHRcdHJldHVybiBlbnRpdHlUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIHNlcnZpY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgT0RhdGFTaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRyZXR1cm4gdGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmVudGl0aWVzW2VudGl0eVR5cGVOYW1lXSB8fCB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJcyBhIFNpZGVFZmZlY3RzIGdlbmVyYXRlZCBieSBhIGNvbnRyb2wuXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0cyBUaGUgU2lkZUVmZmVjdHNcblx0ICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgU2lkZUVmZmVjdHMgaXMgZ2VuZXJhdGVkIGJ5IGEgY29udHJvbCwgb3RoZXJ3aXNlIGZhbHNlXG5cdCAqL1xuXHRwdWJsaWMgaXNDb250cm9sU2lkZUVmZmVjdHMoc2lkZUVmZmVjdHM6IFNpZGVFZmZlY3RzVHlwZSk6IHNpZGVFZmZlY3RzIGlzIENvbnRyb2xTaWRlRWZmZWN0c1R5cGUge1xuXHRcdHJldHVybiAhIShzaWRlRWZmZWN0cyBhcyBDb250cm9sU2lkZUVmZmVjdHNUeXBlKS5zb3VyY2VDb250cm9sSWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgZ2xvYmFsIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIHNlcnZpY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyBHbG9iYWwgU2lkZUVmZmVjdHNcblx0ICovXG5cdHB1YmxpYyBnZXRHbG9iYWxPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGVOYW1lOiBzdHJpbmcpOiBPRGF0YVNpZGVFZmZlY3RzVHlwZVtdIHtcblx0XHRjb25zdCBlbnRpdHlTaWRlRWZmZWN0cyA9IHRoaXMuZ2V0T0RhdGFFbnRpdHlTaWRlRWZmZWN0cyhlbnRpdHlUeXBlTmFtZSk7XG5cdFx0Y29uc3QgZ2xvYmFsU2lkZUVmZmVjdHM6IE9EYXRhU2lkZUVmZmVjdHNUeXBlW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBlbnRpdHlTaWRlRWZmZWN0cykge1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHMgPSBlbnRpdHlTaWRlRWZmZWN0c1trZXldO1xuXHRcdFx0aWYgKCFzaWRlRWZmZWN0cy5zb3VyY2VFbnRpdGllcyAmJiAhc2lkZUVmZmVjdHMuc291cmNlUHJvcGVydGllcyAmJiAhc2lkZUVmZmVjdHMuc291cmNlRXZlbnRzKSB7XG5cdFx0XHRcdGdsb2JhbFNpZGVFZmZlY3RzLnB1c2goc2lkZUVmZmVjdHMpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZ2xvYmFsU2lkZUVmZmVjdHM7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgc2VydmljZS5cblx0ICpcblx0ICogQHBhcmFtIGFjdGlvbk5hbWUgTmFtZSBvZiB0aGUgYWN0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHRcblx0ICogQHJldHVybnMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKi9cblx0cHVibGljIGdldE9EYXRhQWN0aW9uU2lkZUVmZmVjdHMoYWN0aW9uTmFtZTogc3RyaW5nLCBjb250ZXh0PzogQ29udGV4dCk6IEFjdGlvblNpZGVFZmZlY3RzVHlwZSB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKGNvbnRleHQpIHtcblx0XHRcdGNvbnN0IGVudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChjb250ZXh0KTtcblx0XHRcdGlmIChlbnRpdHlUeXBlKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuYWN0aW9ucy5ib3VuZEFjdGlvbnNbZW50aXR5VHlwZV0/LlthY3Rpb25OYW1lXTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5vRGF0YS5hY3Rpb25zLnVuQm91bmRBY3Rpb25zPy5bYWN0aW9uTmFtZV07XG5cdFx0fVxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKipcblx0ICogR2VuZXJhdGVzIHRoZSBkaWN0aW9uYXJ5IGZvciB0aGUgU2lkZUVmZmVjdHMuXG5cdCAqICBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB3aXRoIHRoZSBTaWRlRWZmZWN0cyBzZXJ2aWNlIG9uY2UgZGF0YSBoYXMgYmVlbiB3cml0dGVuXG5cdCAqL1xuXHRhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dGhpcz4ge1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RTb3VyY2VzOiB7XG5cdFx0XHRlbnRpdGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRcdGV2ZW50czogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0fSA9IHtcblx0XHRcdGVudGl0aWVzOiB7fSxcblx0XHRcdHByb3BlcnRpZXM6IHt9LFxuXHRcdFx0ZXZlbnRzOiB7fVxuXHRcdH07XG5cdFx0Y29uc3QgZW52aXJvbm1lbnRDYXBhYmlsaXRpZXNTZXJ2aWNlID0gKGF3YWl0IHRoaXMuYXBwQ29tcG9uZW50LmdldFNlcnZpY2UoXG5cdFx0XHRcImVudmlyb25tZW50Q2FwYWJpbGl0aWVzXCJcblx0XHQpKSBhcyBFbnZpcm9ubWVudENhcGFiaWxpdGllc1NlcnZpY2U7XG5cdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmFwcENvbXBvbmVudC5nZXRNb2RlbCgpO1xuXHRcdGlmIChtb2RlbD8uaXNBPy48T0RhdGFNb2RlbD4oXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiKSkge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byB3YWl0IGZvciB0aGUgTWV0YU1vZGVsIHRvIGJlIHJlcXVlc3RlZFxuXHRcdFx0YXdhaXQgbW9kZWwuZ2V0TWV0YU1vZGVsKCkucmVxdWVzdE9iamVjdChcIi8kRW50aXR5Q29udGFpbmVyL1wiKTtcblx0XHRcdHRoaXMuY2FwYWJpbGl0aWVzID0gZW52aXJvbm1lbnRDYXBhYmlsaXRpZXNTZXJ2aWNlLmdldENhcGFiaWxpdGllcygpO1xuXG5cdFx0XHRjb25zdCBjb252ZXJ0ZWRNZXRhTW9kZWwgPSB0aGlzLmdldENvbnZlcnRlZE1ldGFNb2RlbCgpO1xuXHRcdFx0Y29udmVydGVkTWV0YU1vZGVsLmVudGl0eVR5cGVzLmZvckVhY2goKGVudGl0eVR5cGU6IEVudGl0eVR5cGUpID0+IHtcblx0XHRcdFx0dGhpcy5tYXBGaWVsZEFubm90YXRpb25zKGVudGl0eVR5cGUpO1xuXHRcdFx0XHR0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuZW50aXRpZXNbZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdID0gdGhpcy5yZXRyaWV2ZU9EYXRhRW50aXR5U2lkZUVmZmVjdHMoZW50aXR5VHlwZSk7XG5cdFx0XHRcdHRoaXMubWFwU2lkZUVmZmVjdFNvdXJjZXMoZW50aXR5VHlwZSwgc2lkZUVmZmVjdFNvdXJjZXMpO1xuXHRcdFx0fSk7XG5cdFx0XHRjb252ZXJ0ZWRNZXRhTW9kZWwuYWN0aW9ucy5mb3JFYWNoKChhY3Rpb246IEFjdGlvbikgPT4ge1xuXHRcdFx0XHRpZiAoYWN0aW9uLmlzQm91bmQpIHtcblx0XHRcdFx0XHR0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuYWN0aW9ucy5ib3VuZEFjdGlvbnNbYWN0aW9uLnNvdXJjZUVudGl0eVR5cGUhLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSB7XG5cdFx0XHRcdFx0XHQuLi50aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuYWN0aW9ucy5ib3VuZEFjdGlvbnNbYWN0aW9uLnNvdXJjZUVudGl0eVR5cGUhLmZ1bGx5UXVhbGlmaWVkTmFtZV0sXG5cdFx0XHRcdFx0XHQuLi50aGlzLnJldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMoYWN0aW9uKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5Lm9EYXRhLmFjdGlvbnMudW5Cb3VuZEFjdGlvbnMgPSB7XG5cdFx0XHRcdFx0XHQuLi50aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuYWN0aW9ucy51bkJvdW5kQWN0aW9ucyxcblx0XHRcdFx0XHRcdC4uLnRoaXMucmV0cmlldmVPRGF0YUFjdGlvbnNTaWRlRWZmZWN0cyhhY3Rpb24pXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRpZiAoT2JqZWN0LmtleXMoc2lkZUVmZmVjdFNvdXJjZXMuZXZlbnRzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuaW5pdGlhbGl6ZVdlYlNvY2tldENvbm5lY3Rpb24oKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5zb3VyY2VzVG9TaWRlRWZmZWN0TWFwcGluZ3MgPSBzaWRlRWZmZWN0U291cmNlcztcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHByaXZhdGUgbWFwRmllbGRBbm5vdGF0aW9ucyhzb3VyY2U6IEVudGl0eVR5cGUpOiB2b2lkIHtcblx0XHRjb25zdCBhZGRSZWNvbW1lbmRhdGlvblJvbGVzID0gKHNvdXJjZU5hbWU6IHN0cmluZyk6IHZvaWQgPT4ge1xuXHRcdFx0aWYgKCF0aGlzLnJlY29tbWVuZGF0aW9uUmVnaXN0cnkucm9sZXMuaGFzT3duUHJvcGVydHkoYCR7c291cmNlTmFtZX1gKSkge1xuXHRcdFx0XHR0aGlzLnJlY29tbWVuZGF0aW9uUmVnaXN0cnkucm9sZXNbYCR7c291cmNlTmFtZX1gXSA9IHtcblx0XHRcdFx0XHRpbnB1dDogW10sXG5cdFx0XHRcdFx0b3V0cHV0OiBbXVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0c291cmNlLmVudGl0eVByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcblx0XHRcdGNvbnN0IGNvbW1vbkFubm8gPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24gYXMgUHJvcGVydHlBbm5vdGF0aW9uc1dpdGhSZWNvbW1lbmRhdGlvbjtcblx0XHRcdGlmIChjb21tb25Bbm5vPy5SZWNvbW1lbmRhdGlvblJvbGUpIHtcblx0XHRcdFx0Y29uc3Qgcm9sZVR5cGUgPSBjb21tb25Bbm5vLlJlY29tbWVuZGF0aW9uUm9sZTtcblx0XHRcdFx0aWYgKHJvbGVUeXBlLnZhbHVlT2YoKS5pbmNsdWRlcyhcIklucHV0XCIpKSB7XG5cdFx0XHRcdFx0YWRkUmVjb21tZW5kYXRpb25Sb2xlcyhgJHtzb3VyY2UubmFtZX1gKTtcblx0XHRcdFx0XHR0aGlzLnJlY29tbWVuZGF0aW9uUmVnaXN0cnkucm9sZXNbYCR7c291cmNlLm5hbWV9YF0uaW5wdXQucHVzaChwcm9wZXJ0eS5uYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocm9sZVR5cGUudmFsdWVPZigpLmluY2x1ZGVzKFwiT3V0cHV0XCIpKSB7XG5cdFx0XHRcdFx0YWRkUmVjb21tZW5kYXRpb25Sb2xlcyhgJHtzb3VyY2UubmFtZX1gKTtcblx0XHRcdFx0XHR0aGlzLnJlY29tbWVuZGF0aW9uUmVnaXN0cnkucm9sZXNbYCR7c291cmNlLm5hbWV9YF0ub3V0cHV0LnB1c2gocHJvcGVydHkubmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRSZWNvbW1lbmRhdGlvbnNNYXBwaW5nKCk6IFJlY29tbWVuZGF0aW9uc1JlZ2lzdHJ5IHtcblx0XHRyZXR1cm4gdGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSBpZiBmaWVsZCBpcyBwYXJ0IG9mIFJlY29tbWVuZGF0aW9uJ3MgaW5wdXQgbWFwcGluZyBhbmQgZnJvbSB0aGUgc2FtZSBlbnRpdHkuXG5cdCAqIE90aGVyd2lzZSByZXR1cm4gZmFsc2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBmaWVsZFxuXHQgKiBAcmV0dXJucyBUcnVlIGlmIGZpZWxkIGlzIGhhcyByZWNvbW1lbmRhdGlvbiByb2xlIC0gSW5wdXQgYW5ub3RhdGlvblxuXHQgKi9cblx0cHVibGljIGNoZWNrSWZGaWVsZElzUmVjb21tZW5kYXRpb25SZWxldmFudChmaWVsZDogQ29udHJvbCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGNvbnRleHQgPSBmaWVsZC5nZXRCaW5kaW5nQ29udGV4dCgpO1xuXHRcdGNvbnN0IHByb3BlcnR5TmFtZSA9IGZpZWxkLmRhdGEoKS5zb3VyY2VQYXRoLnNwbGl0KFwiL1wiKS5wb3AoKTtcblx0XHRpZiAoY29udGV4dCkge1xuXHRcdFx0Y29uc3QgbWV0YU1vZGVsID0gY29udGV4dD8uZ2V0TW9kZWwoKS5nZXRNZXRhTW9kZWwoKTtcblx0XHRcdGNvbnN0IG1ldGFDb250ZXh0ID0gKG1ldGFNb2RlbCBhcyBPRGF0YU1ldGFNb2RlbCk/LmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRcdGNvbnN0IHRhcmdldERhdGFNb2RlbE9iamVjdCA9IE1ldGFNb2RlbENvbnZlcnRlci5nZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHM8RW50aXR5U2V0IHwgTmF2aWdhdGlvblByb3BlcnR5PihtZXRhQ29udGV4dClcblx0XHRcdFx0LnRhcmdldE9iamVjdCE7XG5cdFx0XHRsZXQgdGFyZ2V0RW50aXR5VHlwZU5hbWU7XG5cdFx0XHRpZiAoaXNFbnRpdHlTZXQodGFyZ2V0RGF0YU1vZGVsT2JqZWN0KSkge1xuXHRcdFx0XHR0YXJnZXRFbnRpdHlUeXBlTmFtZSA9IHRhcmdldERhdGFNb2RlbE9iamVjdC5lbnRpdHlUeXBlPy5uYW1lO1xuXHRcdFx0fSBlbHNlIGlmIChpc05hdmlnYXRpb25Qcm9wZXJ0eSh0YXJnZXREYXRhTW9kZWxPYmplY3QpKSB7XG5cdFx0XHRcdHRhcmdldEVudGl0eVR5cGVOYW1lID0gdGFyZ2V0RGF0YU1vZGVsT2JqZWN0LnRhcmdldFR5cGU/Lm5hbWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCByZWNvbW1lbmRhdGlvblJvbGVzRm9yRW50aXR5ID0gdGFyZ2V0RW50aXR5VHlwZU5hbWUgJiYgdGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5LnJvbGVzW3RhcmdldEVudGl0eVR5cGVOYW1lXTtcblx0XHRcdGlmIChyZWNvbW1lbmRhdGlvblJvbGVzRm9yRW50aXR5ICYmIHJlY29tbWVuZGF0aW9uUm9sZXNGb3JFbnRpdHk/LmlucHV0Py5pbmNsdWRlcyhwcm9wZXJ0eU5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogTWV0aG9kIHJldHVybnMgdGhlIHByb3BlcnRpZXMgaW4gYSBzcGVjaWZpYyBlbnRpdHkgdHlwZSB3aGljaCBhcmUgbWFya2VkIGFzIFJlY29tbWVuZGF0aW9uUm9sZSBPdXRwdXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSBFbnRpdHkgdHlwZSBmb3Igd2hpY2ggcmVjb21tZW5kYXRpb24gT3V0cHV0IGZpZWxkcyBuZWVkcyB0byBiZSBmaWd1cmVkXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHByb3BlcnR5IG5hbWVzIHdoaWNoIGFyZSBtYXJrZWQgUmVjb21tZW5kYXRpb25Sb2xlIE91dHB1dFxuXHQgKi9cblx0cHVibGljIGdldFJlY29tbWVuZGF0aW9uT3V0cHV0RmllbGRzKGVudGl0eVR5cGVOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdFx0Ly9UT0RPOiBXZSBoYXZlIHRvIGNvbnNpZGVyIDE6MSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgYXMgd2VsbC5cblx0XHRjb25zdCByZWNvbW1lbmRhdGlvblJvbGVzRm9yRW50aXR5ID0gdGhpcy5yZWNvbW1lbmRhdGlvblJlZ2lzdHJ5LnJvbGVzW2VudGl0eVR5cGVOYW1lXTtcblx0XHRpZiAocmVjb21tZW5kYXRpb25Sb2xlc0ZvckVudGl0eT8ub3V0cHV0Py5sZW5ndGggPiAwKSB7XG5cdFx0XHRyZXR1cm4gcmVjb21tZW5kYXRpb25Sb2xlc0ZvckVudGl0eS5vdXRwdXQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYWxsIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYSBjb250cm9sLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29udHJvbElkIENvbnRyb2wgSWRcblx0ICovXG5cdHB1YmxpYyByZW1vdmVDb250cm9sU2lkZUVmZmVjdHMoY29udHJvbElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRPYmplY3Qua2V5cyh0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkuY29udHJvbCkuZm9yRWFjaCgoc0VudGl0eVR5cGUpID0+IHtcblx0XHRcdGlmICh0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkuY29udHJvbFtzRW50aXR5VHlwZV1bY29udHJvbElkXSkge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5zaWRlRWZmZWN0c1JlZ2lzdHJ5LmNvbnRyb2xbc0VudGl0eVR5cGVdW2NvbnRyb2xJZF07XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIFNpZGVFZmZlY3RzIG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIHBhdGhFeHByZXNzaW9ucyBUYXJnZXRzIG9mIFNpZGVFZmZlY3RzIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBUaGUgZ3JvdXAgSUQgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3Rcblx0ICogQHJldHVybnMgUHJvbWlzZSBvbiBTaWRlRWZmZWN0cyByZXF1ZXN0XG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgcmVxdWVzdFNpZGVFZmZlY3RzKHBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSwgY29udGV4dDogQ29udGV4dCwgZ3JvdXBJZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRoaXMubG9nUmVxdWVzdChwYXRoRXhwcmVzc2lvbnMsIGNvbnRleHQpO1xuXHRcdGF3YWl0IGNvbnRleHQucmVxdWVzdFNpZGVFZmZlY3RzKHBhdGhFeHByZXNzaW9ucywgZ3JvdXBJZCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVxdWVzdHMgdGhlIFNpZGVFZmZlY3RzIGZvciBhbiBPRGF0YSBhY3Rpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIG9uIFNpZGVFZmZlY3RzIHJlcXVlc3RzIGFuZCBhY3Rpb24gZXhlY3V0aW9uXG5cdCAqL1xuXHRwdWJsaWMgYXN5bmMgcmVxdWVzdFNpZGVFZmZlY3RzRm9yT0RhdGFBY3Rpb24oc2lkZUVmZmVjdHM6IEFjdGlvblNpZGVFZmZlY3RzVHlwZSwgY29udGV4dDogQ29udGV4dCk6IFByb21pc2U8KHZvaWQgfCB1bmRlZmluZWQpW10+IHtcblx0XHRsZXQgcHJvbWlzZXM6IFByb21pc2U8dm9pZCB8IHVuZGVmaW5lZD5bXTtcblxuXHRcdGlmIChzaWRlRWZmZWN0cy50cmlnZ2VyQWN0aW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRwcm9taXNlcyA9IHNpZGVFZmZlY3RzLnRyaWdnZXJBY3Rpb25zLm1hcChhc3luYyAoYWN0aW9uTmFtZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5leGVjdXRlQWN0aW9uKGFjdGlvbk5hbWUsIGNvbnRleHQpO1xuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb21pc2VzID0gW107XG5cdFx0fVxuXG5cdFx0aWYgKHNpZGVFZmZlY3RzLnBhdGhFeHByZXNzaW9ucz8ubGVuZ3RoKSB7XG5cdFx0XHRwcm9taXNlcy5wdXNoKHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzLnBhdGhFeHByZXNzaW9ucywgY29udGV4dCkpO1xuXHRcdH1cblxuXHRcdHJldHVybiBwcm9taXNlcy5sZW5ndGggPyBQcm9taXNlLmFsbChwcm9taXNlcykgOiBQcm9taXNlLnJlc29sdmUoW10pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcXVlc3RzIHRoZSBTaWRlRWZmZWN0cyBmb3IgYSBuYXZpZ2F0aW9uIHByb3BlcnR5IG9uIGEgc3BlY2lmaWMgY29udGV4dC5cblx0ICpcblx0ICogQHBhcmFtIG5hdmlnYXRpb25Qcm9wZXJ0eSBOYXZpZ2F0aW9uIHByb3BlcnR5XG5cdCAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgd2hlcmUgU2lkZUVmZmVjdHMgbmVlZCB0byBiZSBleGVjdXRlZFxuXHQgKiBAcGFyYW0gZ3JvdXBJZCBCYXRjaCBncm91cCBmb3IgdGhlIHF1ZXJ5XG5cdCAqIEBwYXJhbSBpZ25vcmVUcmlnZ2VyQWN0aW9ucyBJZiB0cnVlLCB3ZSBkbyBub3QgdHJpZ2dlciBhY3Rpb25zIGRlZmluZWQgaW4gdGhlIHNpZGUgZWZmZWN0XG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIHJlcXVlc3Qgb24gU0FQVUk1IGNvbnRleHRcblx0ICovXG5cdHB1YmxpYyBhc3luYyByZXF1ZXN0U2lkZUVmZmVjdHNGb3JOYXZpZ2F0aW9uUHJvcGVydHkoXG5cdFx0bmF2aWdhdGlvblByb3BlcnR5OiBzdHJpbmcsXG5cdFx0Y29udGV4dDogQ29udGV4dCxcblx0XHRncm91cElkPzogc3RyaW5nLFxuXHRcdGlnbm9yZVRyaWdnZXJBY3Rpb25zID0gZmFsc2Vcblx0KTogUHJvbWlzZTx2b2lkIHwgdW5kZWZpbmVkPiB7XG5cdFx0Y29uc3QgYmFzZUVudGl0eVR5cGUgPSB0aGlzLmdldEVudGl0eVR5cGVGcm9tQ29udGV4dChjb250ZXh0KTtcblx0XHRpZiAoYmFzZUVudGl0eVR5cGUpIHtcblx0XHRcdGNvbnN0IG5hdmlnYXRpb25QYXRoID0gYCR7bmF2aWdhdGlvblByb3BlcnR5fS9gO1xuXHRcdFx0Y29uc3QgZW50aXR5U2lkZUVmZmVjdHMgPSB0aGlzLmdldE9EYXRhRW50aXR5U2lkZUVmZmVjdHMoYmFzZUVudGl0eVR5cGUpO1xuXHRcdFx0bGV0IHRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRsZXQgdGFyZ2V0RW50aXRpZXM6IFNpZGVFZmZlY3RzRW50aXR5VHlwZVtdID0gW107XG5cdFx0XHRsZXQgc2lkZUVmZmVjdHNUYXJnZXRzOiBTaWRlRWZmZWN0c1RhcmdldFtdID0gW107XG5cdFx0XHRPYmplY3Qua2V5cyhlbnRpdHlTaWRlRWZmZWN0cylcblx0XHRcdFx0LmZpbHRlcihcblx0XHRcdFx0XHQvLyBLZWVwIHJlbGV2YW50IFNpZGVFZmZlY3RzXG5cdFx0XHRcdFx0Ly8gMS4gU291cmNlRW50aXRpZXMgbWF0Y2ggT1Jcblx0XHRcdFx0XHQvLyAyLiBPbmx5IDEgU291cmNlUHJvcGVydGllcyBhbmQgbWF0Y2hcblx0XHRcdFx0XHQoYW5ub3RhdGlvbk5hbWUpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHNpZGVFZmZlY3RzOiBPRGF0YVNpZGVFZmZlY3RzVHlwZSA9IGVudGl0eVNpZGVFZmZlY3RzW2Fubm90YXRpb25OYW1lXTtcblx0XHRcdFx0XHRcdHJldHVybiAoXG5cdFx0XHRcdFx0XHRcdChzaWRlRWZmZWN0cy5zb3VyY2VFbnRpdGllcyB8fCBbXSkuc29tZShcblx0XHRcdFx0XHRcdFx0XHQobmF2aWdhdGlvbikgPT4gbmF2aWdhdGlvbi4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCA9PT0gbmF2aWdhdGlvblByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdCkgfHxcblx0XHRcdFx0XHRcdFx0KHNpZGVFZmZlY3RzLnNvdXJjZVByb3BlcnRpZXM/Lmxlbmd0aCA9PT0gMSAmJlxuXHRcdFx0XHRcdFx0XHRcdHNpZGVFZmZlY3RzLnNvdXJjZVByb3BlcnRpZXMuc29tZShcblx0XHRcdFx0XHRcdFx0XHRcdChwcm9wZXJ0eVBhdGgpID0+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5UGF0aC5zdGFydHNXaXRoKG5hdmlnYXRpb25QYXRoKSAmJiAhcHJvcGVydHlQYXRoLnJlcGxhY2UobmF2aWdhdGlvblBhdGgsIFwiXCIpLmluY2x1ZGVzKFwiL1wiKVxuXHRcdFx0XHRcdFx0XHRcdCkpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0KVxuXHRcdFx0XHQuZm9yRWFjaCgoc0Fubm90YXRpb25OYW1lKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHMgPSBlbnRpdHlTaWRlRWZmZWN0c1tzQW5ub3RhdGlvbk5hbWVdO1xuXHRcdFx0XHRcdGlmIChzaWRlRWZmZWN0cy50cmlnZ2VyQWN0aW9uICYmICFpZ25vcmVUcmlnZ2VyQWN0aW9ucykge1xuXHRcdFx0XHRcdFx0dGhpcy5leGVjdXRlQWN0aW9uKHNpZGVFZmZlY3RzLnRyaWdnZXJBY3Rpb24sIGNvbnRleHQsIGdyb3VwSWQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0YXJnZXRQcm9wZXJ0aWVzID0gdGFyZ2V0UHJvcGVydGllcy5jb25jYXQoc2lkZUVmZmVjdHMudGFyZ2V0UHJvcGVydGllcyk7XG5cdFx0XHRcdFx0dGFyZ2V0RW50aXRpZXMgPSB0YXJnZXRFbnRpdGllcy5jb25jYXQoc2lkZUVmZmVjdHMudGFyZ2V0RW50aXRpZXMpO1xuXHRcdFx0XHR9KTtcblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGUgdGFyZ2V0c1xuXHRcdFx0Y29uc3Qgc2lkZUVmZmVjdHNUYXJnZXREZWZpbml0aW9uID0gdGhpcy5yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKHtcblx0XHRcdFx0dGFyZ2V0UHJvcGVydGllczogdGFyZ2V0UHJvcGVydGllcyxcblx0XHRcdFx0dGFyZ2V0RW50aXRpZXM6IHRhcmdldEVudGl0aWVzXG5cdFx0XHR9KTtcblx0XHRcdHNpZGVFZmZlY3RzVGFyZ2V0cyA9IFsuLi5zaWRlRWZmZWN0c1RhcmdldERlZmluaXRpb24udGFyZ2V0UHJvcGVydGllcywgLi4uc2lkZUVmZmVjdHNUYXJnZXREZWZpbml0aW9uLnRhcmdldEVudGl0aWVzXTtcblx0XHRcdGlmIChzaWRlRWZmZWN0c1RhcmdldHMubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnJlcXVlc3RTaWRlRWZmZWN0cyhzaWRlRWZmZWN0c1RhcmdldHMsIGNvbnRleHQsIGdyb3VwSWQpLmNhdGNoKChlcnJvcikgPT5cblx0XHRcdFx0XHRMb2cuZXJyb3IoYFNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBTaWRlRWZmZWN0cyBmb3IgTmF2aWdhdGlvbiBQcm9wZXJ0eSAke25hdmlnYXRpb25Qcm9wZXJ0eX1gLCBlcnJvcilcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHRoYXQgY29tZSBmcm9tIGNvbnRyb2xzLlxuXHQgKlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZU5hbWUgRW50aXR5IHR5cGUgTmFtZVxuXHQgKiBAcmV0dXJucyBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q29udHJvbEVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGVOYW1lOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBDb250cm9sU2lkZUVmZmVjdHNUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuc2lkZUVmZmVjdHNSZWdpc3RyeS5jb250cm9sW2VudGl0eVR5cGVOYW1lXSB8fCB7fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIFNpZGVFZmZlY3RzJyBxdWFsaWZpZXIgYW5kIG93bmVyIGVudGl0eSB3aGVyZSB0aGlzIGVudGl0eSBpcyB1c2VkIGFzIHNvdXJjZS5cblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVR5cGVOYW1lIEVudGl0eSB0eXBlIGZ1bGx5IHF1YWxpZmllZCBuYW1lXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHNpZGVFZmZlY3RzIGluZm9cblx0ICovXG5cdHB1YmxpYyBnZXRTaWRlRWZmZWN0V2hlcmVFbnRpdHlJc1NvdXJjZShlbnRpdHlUeXBlTmFtZTogc3RyaW5nKTogU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXSB7XG5cdFx0cmV0dXJuIHRoaXMuc291cmNlc1RvU2lkZUVmZmVjdE1hcHBpbmdzLmVudGl0aWVzW2VudGl0eVR5cGVOYW1lXSB8fCBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIFNpZGVFZmZlY3RzJyBxdWFsaWZpZXJzIHdoZXJlIHRoaXMgZXZlbnQgaXMgdXNlZCBhcyBzb3VyY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlTmFtZSBFbnRpdHkgdHlwZSBmdWxseSBxdWFsaWZpZWRcblx0ICogQHBhcmFtIGV2ZW50TmFtZSBTaWRlIEVmZmVjdCBldmVudCBuYW1lXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHNpZGVFZmZlY3RzIGluZm9cblx0ICovXG5cdHB1YmxpYyBnZXRTaWRlRWZmZWN0V2hlcmVFdmVudElzU291cmNlKGVudGl0eVR5cGVOYW1lOiBzdHJpbmcsIGV2ZW50TmFtZTogc3RyaW5nKTogU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXSB7XG5cdFx0cmV0dXJuIHRoaXMuc291cmNlc1RvU2lkZUVmZmVjdE1hcHBpbmdzLmV2ZW50c1tldmVudE5hbWVdPy5maWx0ZXIoKGV2ZW50KSA9PiBldmVudC5lbnRpdHkgPT09IGVudGl0eVR5cGVOYW1lKSB8fCBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgU2lkZUVmZmVjdHMgZm9yIGEgc2lkZUVmZmVjdCBldmVudCBvbiBhIHNwZWNpZmljIGNvbnRleHQuXG5cdCAqXG5cdCAqIEBwYXJhbSBldmVudCBTaWRlRWZmZWN0cyBldmVudCB3aGljaCBzaG91bGQgYmVcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB3aGVyZSBTaWRlRWZmZWN0cyBuZWVkIHRvIGJlIGV4ZWN1dGVkXG5cdCAqIEBwYXJhbSBncm91cElkIFRoZSBncm91cCBJRCB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuXHQgKiBAcmV0dXJucyBQcm9taXNlIG9uIFNpZGVFZmZlY3RzIHJlcXVlc3Rcblx0ICovXG5cdGFzeW5jIHJlcXVlc3RTaWRlRWZmZWN0c0ZvckV2ZW50KGV2ZW50OiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQsIGdyb3VwSWQ/OiBzdHJpbmcpOiBQcm9taXNlPHVuZGVmaW5lZD4ge1xuXHRcdGNvbnN0IG1ldGFQYXRoID0gY29udGV4dC5nZXRNb2RlbCgpLmdldE1ldGFNb2RlbCgpLmdldE1ldGFDb250ZXh0KGNvbnRleHQuZ2V0UGF0aCgpKTtcblx0XHRjb25zdCBkYXRhTW9kZWwgPSBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMobWV0YVBhdGgpO1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzID0gdGhpcy5nZXRTaWRlRWZmZWN0V2hlcmVFdmVudElzU291cmNlKGRhdGFNb2RlbC50YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSwgZXZlbnQpO1xuXHRcdGxldCB0YXJnZXRQcm9wZXJ0aWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGxldCB0YXJnZXRFbnRpdGllczogU2lkZUVmZmVjdHNFbnRpdHlUeXBlW10gPSBbXTtcblxuXHRcdHNpZGVFZmZlY3RzLmZvckVhY2goKHNpZGVFZmZlY3QpID0+IHtcblx0XHRcdGNvbnN0IGFubm90YXRpb24gPVxuXHRcdFx0XHR0aGlzLnNpZGVFZmZlY3RzUmVnaXN0cnkub0RhdGEuZW50aXRpZXNbZGF0YU1vZGVsLnRhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXT8uW1xuXHRcdFx0XHRcdGAke3NpZGVFZmZlY3QuZW50aXR5fUBjb20uc2FwLnZvY2FidWxhcmllcy5Db21tb24udjEuU2lkZUVmZmVjdHMjJHtzaWRlRWZmZWN0LnF1YWxpZmllcn1gXG5cdFx0XHRcdF07XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzID0gdGFyZ2V0UHJvcGVydGllcy5jb25jYXQoYW5ub3RhdGlvbi50YXJnZXRQcm9wZXJ0aWVzKTtcblx0XHRcdHRhcmdldEVudGl0aWVzID0gdGFyZ2V0RW50aXRpZXMuY29uY2F0KGFubm90YXRpb24udGFyZ2V0RW50aXRpZXMpO1xuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHNUYXJnZXREZWZpbml0aW9uID0gdGhpcy5yZW1vdmVEdXBsaWNhdGVUYXJnZXRzKHtcblx0XHRcdHRhcmdldFByb3BlcnRpZXM6IHRhcmdldFByb3BlcnRpZXMsXG5cdFx0XHR0YXJnZXRFbnRpdGllczogdGFyZ2V0RW50aXRpZXNcblx0XHR9KTtcblx0XHRjb25zdCBzaWRlRWZmZWN0c1RhcmdldHMgPSBbLi4uc2lkZUVmZmVjdHNUYXJnZXREZWZpbml0aW9uLnRhcmdldFByb3BlcnRpZXMsIC4uLnNpZGVFZmZlY3RzVGFyZ2V0RGVmaW5pdGlvbi50YXJnZXRFbnRpdGllc107XG5cdFx0aWYgKHNpZGVFZmZlY3RzVGFyZ2V0cy5sZW5ndGgpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IHRoaXMucmVxdWVzdFNpZGVFZmZlY3RzKHNpZGVFZmZlY3RzVGFyZ2V0cywgY29udGV4dCwgZ3JvdXBJZCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRMb2cuZXJyb3IoYFNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBTaWRlRWZmZWN0cyBmb3IgRXZlbnQgJHtldmVudH1gLCBlcnJvciBhcyBzdHJpbmcpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb21tb24gbWV0aG9kIHRvIGdldCB0aGUgZmllbGQgZ3JvdXBJZHMgZm9yIGEgc291cmNlIGVudGl0eSBhbmQgYSBzb3VyY2UgcHJvcGVydHkuXG5cdCAqXG5cdCAqIEBwYXJhbSBzb3VyY2VFbnRpdHlUeXBlXG5cdCAqIEBwYXJhbSBzb3VyY2VQcm9wZXJ0eVxuXHQgKiBAcmV0dXJucyBBIGNvbGxlY3Rpb24gb2YgZmllbGRHcm91cElkc1xuXHQgKi9cblx0cHVibGljIGNvbXB1dGVGaWVsZEdyb3VwSWRzKHNvdXJjZUVudGl0eVR5cGU6IHN0cmluZywgc291cmNlUHJvcGVydHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0XHRjb25zdCBlbnRpdHlGaWVsZEdyb3VwSWRzID0gdGhpcy5nZXRTaWRlRWZmZWN0V2hlcmVFbnRpdHlJc1NvdXJjZShzb3VyY2VFbnRpdHlUeXBlKS5tYXAoKHNpZGVFZmZlY3RJbmZvKSA9PlxuXHRcdFx0dGhpcy5nZXRGaWVsZEdyb3VwSWRGb3JTaWRlRWZmZWN0KHNpZGVFZmZlY3RJbmZvLCB0cnVlKVxuXHRcdCk7XG5cdFx0cmV0dXJuIGVudGl0eUZpZWxkR3JvdXBJZHMuY29uY2F0KFxuXHRcdFx0dGhpcy5nZXRTaWRlRWZmZWN0V2hlcmVQcm9wZXJ0eUlzU291cmNlKHNvdXJjZVByb3BlcnR5KS5tYXAoKHNpZGVFZmZlY3RJbmZvKSA9PlxuXHRcdFx0XHR0aGlzLmdldEZpZWxkR3JvdXBJZEZvclNpZGVFZmZlY3Qoc2lkZUVmZmVjdEluZm8pXG5cdFx0XHQpXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIFNpZGVFZmZlY3RzJyBxdWFsaWZpZXIgYW5kIG93bmVyIGVudGl0eSB3aGVyZSB0aGlzIHByb3BlcnR5IGlzIHVzZWQgYXMgc291cmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFByb3BlcnR5IGZ1bGx5IHF1YWxpZmllZCBuYW1lXG5cdCAqIEByZXR1cm5zIEFycmF5IG9mIHNpZGVFZmZlY3RzIGluZm9cblx0ICovXG5cdHB1YmxpYyBnZXRTaWRlRWZmZWN0V2hlcmVQcm9wZXJ0eUlzU291cmNlKHByb3BlcnR5TmFtZTogc3RyaW5nKTogU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXSB7XG5cdFx0cmV0dXJuIHRoaXMuc291cmNlc1RvU2lkZUVmZmVjdE1hcHBpbmdzLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSB8fCBbXTtcblx0fVxuXG5cdC8vIGNoZWNrIGlmIGNhbiBkZWZpbmUgd2hldGhlciBjYWxsYmFja3MgYXJlIGFzeW5jLiBPdGhlcndpc2UgY29tbWVudFxuXHQvLyBvbmx5IG9uZSBjYWxsYmFjayBmb3Igb25lIHRhcmdldFxuXHRwdWJsaWMgcmVnaXN0ZXJUYXJnZXRDYWxsYmFjayh0YXJnZXQ6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKTogdm9pZCB7XG5cdFx0dGhpcy50YXJnZXRDYWxsYmFja3NbdGFyZ2V0XSA9IGNhbGxiYWNrO1xuXHR9XG5cblx0cHVibGljIGRlcmVnaXN0ZXJUYXJnZXRDYWxsYmFjayh0YXJnZXQ6IHN0cmluZyk6IHZvaWQge1xuXHRcdGRlbGV0ZSB0aGlzLnRhcmdldENhbGxiYWNrc1t0YXJnZXRdO1xuXHR9XG5cblx0Ly8gcGFzcyBwYXJhbWV0ZXJcblx0cHVibGljIGdldFJlZ2lzdGVyZWRDYWxsYmFjayh0YXJnZXQ6IHN0cmluZyk6IEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy50YXJnZXRDYWxsYmFja3NbdGFyZ2V0XTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHVwZGF0ZWQgc2lkZSBlZmZlY3RzIGRlZmluaXRpb24gd2l0aCBhbGwgdGV4dCByZWxhdGVkIHByb3BlcnRpZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1RhcmdldHMgVGhlIHRhcmdldHMgb2YgdGhlIHNpZGUgZWZmZWN0XG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIE5hbWUgb2YgdGhlIGVudGl0eSB3aGVyZSB0aGUgc2lkZSBlZmZlY3QgaXMgcmVnaXN0ZXJlZFxuXHQgKiBAcmV0dXJucyBVcGRhdGVkIHNpZGUgZWZmZWN0cycgdGFyZ2V0cyB3aXRoIGFkZGVkIHRleHQgcHJvcGVydGllcyBvciBlbnRpdGllc1xuXHQgKi9cblx0cHJpdmF0ZSBhZGRUZXh0UHJvcGVydGllcyhzaWRlRWZmZWN0c1RhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSwgZW50aXR5VHlwZT86IEVudGl0eVR5cGUpOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUge1xuXHRcdGNvbnN0IHNldE9mUHJvcGVydGllcyA9IG5ldyBTZXQoc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldFByb3BlcnRpZXMpO1xuXHRcdGNvbnN0IHNldE9mRW50aXRpZXMgPSBuZXcgU2V0KHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRFbnRpdGllcy5tYXAoKHRhcmdldCkgPT4gdGFyZ2V0LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSk7XG5cdFx0Ly8gR2VuZXJhdGUgYWxsIHBhdGhzIHJlbGF0ZWQgdG8gdGhlIHRleHQgcHJvcGVydGllcyBhbmQgbm90IGFscmVhZHkgY292ZXJlZCBieSB0aGUgU2lkZUVmZmVjdHNcblx0XHRmb3IgKGNvbnN0IHByb3BlcnR5UGF0aCBvZiBzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0UHJvcGVydGllcykge1xuXHRcdFx0Zm9yIChjb25zdCBkYXRhTW9kZWxQcm9wZXJ0eVBhdGggb2YgdGhpcy5nZXREYXRhTW9kZWxQcm9wZXJ0aWVzRnJvbUFQYXRoKHByb3BlcnR5UGF0aCwgZW50aXR5VHlwZSkpIHtcblx0XHRcdFx0Y29uc3QgYXNzb2NpYXRlZFRleHRQYXRoID0gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgoZGF0YU1vZGVsUHJvcGVydHlQYXRoLnRhcmdldE9iamVjdCk7XG5cdFx0XHRcdGlmIChhc3NvY2lhdGVkVGV4dFBhdGgpIHtcblx0XHRcdFx0XHR0aGlzLmFkZFRleHRQcm9wZXJ0eShkYXRhTW9kZWxQcm9wZXJ0eVBhdGgsIHByb3BlcnR5UGF0aCwgYXNzb2NpYXRlZFRleHRQYXRoLCBzZXRPZlByb3BlcnRpZXMsIHNldE9mRW50aXRpZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiBBcnJheS5mcm9tKHNldE9mUHJvcGVydGllcyksXG5cdFx0XHR0YXJnZXRFbnRpdGllczogQXJyYXkuZnJvbShzZXRPZkVudGl0aWVzKS5tYXAoKG5hdmlnYXRpb24pID0+IHtcblx0XHRcdFx0cmV0dXJuIHsgJE5hdmlnYXRpb25Qcm9wZXJ0eVBhdGg6IG5hdmlnYXRpb24gfTtcblx0XHRcdH0pXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIHRleHQgcmVsYXRlZCBwcm9wZXJ0eSB0byB0aGUgc2lkZSBlZmZlY3RzIHRhcmdldHNcblx0ICogSWYgdGhlIHByb3BlcnR5IGhhcyBhbiBhc3NvY2lhdGVkIHRleHQgdGhlbiB0aGlzIHRleHQgbmVlZHMgdG8gYmUgYWRkZWQgaWYgaXQncyBub3QgYWxyZWFkeSByZWZsZWN0ZWQgaW4gdGhlIHNpZGUgZWZmZWN0cyBkZWZpbml0aW9uOlxuXHQgKiAgLSBhcyB0YXJnZXRQcm9wZXJ0aWVzIGlmIHRoZSBwcm9wZXJ0eSBhbmQgaXRzIGFzc29jaWF0ZWQgdGV4dCBhcmUgb24gdGhlIHNhbWUgZW50aXR5U2V0XG5cdCAqICAtIGFzIHRhcmdldEVudGl0aWVzIGlmIHRoZXkgYXJlIGRlZmluZWQgb24gZGlmZmVyZW50IGVudGl0eVNldHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBkYXRhTW9kZWxQcm9wZXJ0eVBhdGggVGhlIG1vZGVsIG9iamVjdCBwYXRoIG9mIHRoZSBwcm9wZXJ0eVxuXHQgKiBAcGFyYW0gcHJvcGVydHlQYXRoIFRoZSBwcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSBhc3NvY2lhdGVkVGV4dFBhdGggVGhlIGFzc29jaWF0ZWQgdGV4dCBwcm9wZXJ0eSBwYXRoXG5cdCAqIEBwYXJhbSBzZXRPZlByb3BlcnRpZXMgU2V0IG9mIGV4aXN0aW5nIHNpZGVFZmZlY3QncyB0YXJnZXQgcHJvcGVydGllc1xuXHQgKiBAcGFyYW0gc2V0T2ZFbnRpdGllcyBTZXQgb2YgZXhpc3Rpbmcgc2lkZUVmZmVjdCdzIHRhcmdldCBlbnRpdGllc1xuXHQgKi9cblx0cHJpdmF0ZSBhZGRUZXh0UHJvcGVydHkoXG5cdFx0ZGF0YU1vZGVsUHJvcGVydHlQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0XHRwcm9wZXJ0eVBhdGg6IHN0cmluZyxcblx0XHRhc3NvY2lhdGVkVGV4dFBhdGg6IHN0cmluZyxcblx0XHRzZXRPZlByb3BlcnRpZXM6IFNldDxzdHJpbmc+LFxuXHRcdHNldE9mRW50aXRpZXM6IFNldDxzdHJpbmc+XG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGRhdGFNb2RlbFRleHRQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KGRhdGFNb2RlbFByb3BlcnR5UGF0aCwgYXNzb2NpYXRlZFRleHRQYXRoKTtcblx0XHRjb25zdCByZWxhdGl2ZU5hdmlnYXRpb24gPVxuXHRcdFx0cHJvcGVydHlQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpICYmXG5cdFx0XHRkYXRhTW9kZWxUZXh0UGF0aC50YXJnZXRFbnRpdHlTZXQgJiZcblx0XHRcdGRhdGFNb2RlbFRleHRQYXRoLnRhcmdldEVudGl0eVNldC5uYW1lICE9PSBkYXRhTW9kZWxQcm9wZXJ0eVBhdGgudGFyZ2V0RW50aXR5U2V0Py5uYW1lXG5cdFx0XHRcdD8gYC8ke2RhdGFNb2RlbFRleHRQYXRoLnRhcmdldEVudGl0eVNldD8uZnVsbHlRdWFsaWZpZWROYW1lfWBcblx0XHRcdFx0OiBnZXRUYXJnZXROYXZpZ2F0aW9uUGF0aChkYXRhTW9kZWxUZXh0UGF0aCwgdHJ1ZSk7XG5cdFx0Y29uc3QgdGFyZ2V0UGF0aCA9IHByb3BlcnR5UGF0aC5zdGFydHNXaXRoKFwiL1wiKVxuXHRcdFx0PyBgLyR7ZGF0YU1vZGVsVGV4dFBhdGgudGFyZ2V0RW50aXR5U2V0Py5mdWxseVF1YWxpZmllZE5hbWV9LyR7ZGF0YU1vZGVsVGV4dFBhdGgudGFyZ2V0T2JqZWN0IS5uYW1lfWBcblx0XHRcdDogZ2V0VGFyZ2V0T2JqZWN0UGF0aChkYXRhTW9kZWxUZXh0UGF0aCwgdHJ1ZSk7XG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5pc0Fzc29jaWF0ZWRUZXh0TGlzdGVkSW5TaWRlRWZmZWN0VGFyZ2V0cyhcblx0XHRcdFx0ZGF0YU1vZGVsVGV4dFBhdGgsXG5cdFx0XHRcdHJlbGF0aXZlTmF2aWdhdGlvbixcblx0XHRcdFx0dGFyZ2V0UGF0aCxcblx0XHRcdFx0c2V0T2ZQcm9wZXJ0aWVzLFxuXHRcdFx0XHRzZXRPZkVudGl0aWVzXG5cdFx0XHQpXG5cdFx0KSB7XG5cdFx0XHRpZiAodGhpcy5pc1Byb3BlcnR5QXNzb2NpYXRlZFRleHRPbkRpZmZlcmVudEVudGl0eVNldChkYXRhTW9kZWxQcm9wZXJ0eVBhdGgsIGRhdGFNb2RlbFRleHRQYXRoKSkge1xuXHRcdFx0XHRzZXRPZkVudGl0aWVzLmFkZChyZWxhdGl2ZU5hdmlnYXRpb24pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2V0T2ZQcm9wZXJ0aWVzLmFkZCh0YXJnZXRQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2tzIGlmIHRoZSBhc3NvY2lhdGVkIHRleHQgcHJvcGVydHkgbmVlZHMgdG8gYmUgYWRkZWQgaWYgaXQncyBub3QgYWxyZWFkeSByZWZsZWN0ZWQgaW4gdGhlIHNpZGUgZWZmZWN0cyBkZWZpbml0aW9uOlxuXHQgKiAgLSBhcyB0YXJnZXRQcm9wZXJ0aWVzIGlmIHRoZSBwcm9wZXJ0eSBhbmQgaXRzIGFzc29jaWF0ZWQgdGV4dCBhcmUgb24gdGhlIHNhbWUgZW50aXR5U2V0XG5cdCAqICAtIGFzIHRhcmdldEVudGl0aWVzIGlmIHRoZXkgYXJlIGRlZmluZWQgb24gZGlmZmVyZW50IGVudGl0eVNldHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBkYXRhTW9kZWxUZXh0UGF0aCBUaGUgbW9kZWwgb2JqZWN0IHBhdGggb2YgdGhlIGFzc29jaWF0ZWQgdGV4dFxuXHQgKiBAcGFyYW0gcmVsYXRpdmVOYXZpZ2F0aW9uIFRoZSBuYXZpZ2F0aW9uIHRvIHRoZSB0ZXh0IHByb3BlcnR5XG5cdCAqIEBwYXJhbSB0YXJnZXRQYXRoIFRoZSBhc3NvY2lhdGVkIHRleHQgcHJvcGVydHkgcGF0aFxuXHQgKiBAcGFyYW0gc2V0T2ZQcm9wZXJ0aWVzIFNldCBvZiBleGlzdGluZyBzaWRlRWZmZWN0J3MgdGFyZ2V0IHByb3BlcnRpZXNcblx0ICogQHBhcmFtIHNldE9mRW50aXRpZXMgU2V0IG9mIGV4aXN0aW5nIHNpZGVFZmZlY3QncyB0YXJnZXQgZW50aXRpZXNcblx0ICogQHJldHVybnMgVXBkYXRlZCBzaWRlIGVmZmVjdHMnIHRhcmdldHMgd2l0aCBhZGRlZCB0ZXh0IHByb3BlcnR5IG9yIGVudGl0eVxuXHQgKi9cblx0cHJpdmF0ZSBpc0Fzc29jaWF0ZWRUZXh0TGlzdGVkSW5TaWRlRWZmZWN0VGFyZ2V0cyhcblx0XHRkYXRhTW9kZWxUZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4sXG5cdFx0cmVsYXRpdmVOYXZpZ2F0aW9uOiBzdHJpbmcsXG5cdFx0dGFyZ2V0UGF0aDogc3RyaW5nLFxuXHRcdHNldE9mUHJvcGVydGllczogU2V0PHN0cmluZz4sXG5cdFx0c2V0T2ZFbnRpdGllczogU2V0PHN0cmluZz5cblx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGlzUHJvcGVydHkoZGF0YU1vZGVsVGV4dFBhdGgudGFyZ2V0T2JqZWN0KSAmJlxuXHRcdFx0IXNldE9mUHJvcGVydGllcy5oYXModGFyZ2V0UGF0aCkgJiYgLy8gdGhlIHByb3BlcnR5IGlzIGFscmVhZHkgbGlzdGVkXG5cdFx0XHQhc2V0T2ZQcm9wZXJ0aWVzLmhhcyhgJHtyZWxhdGl2ZU5hdmlnYXRpb259JHtkYXRhTW9kZWxUZXh0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcy5sZW5ndGggPyBcIi9cIiA6IFwiXCJ9KmApICYmIC8vIHRoZSBwcm9wZXJ0eSBpcyBhbHJlYWR5IGxpc3RlZCB0aGFua3MgdG8gdGhlIFwiKlwiXG5cdFx0XHQhc2V0T2ZFbnRpdGllcy5oYXMoYCR7cmVsYXRpdmVOYXZpZ2F0aW9ufWApIC8vIHRoZSBwcm9wZXJ0eSBpcyBub3QgcGFydCBvZiBhIFRhcmdldEVudGl0aWVzXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGVja3MgaWYgdGhlIHByb3BlcnR5IGFuZCBpdHMgYXNzb2NpYXRlZCB0ZXh0IHByb3BlcnR5IGFyZSBvbiBkaWZmZXJlbnQgZW50aXR5U2V0LlxuXHQgKlxuXHQgKiBAcGFyYW0gZGF0YU1vZGVsUHJvcGVydHlQYXRoIFRoZSBtb2RlbCBvYmplY3QgcGF0aCBvZiB0aGUgcHJvcGVydHlcblx0ICogQHBhcmFtIGRhdGFNb2RlbFRleHRQYXRoIFRoZSBtb2RlbCBvYmplY3QgcGF0aCBvZiB0aGUgYXNzb2NpYXRlZCB0ZXh0IHByb3BlcnR5XG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGVudGl0eVNldCBpcyBkaWZmZXJlbnRcblx0ICovXG5cdHByaXZhdGUgaXNQcm9wZXJ0eUFzc29jaWF0ZWRUZXh0T25EaWZmZXJlbnRFbnRpdHlTZXQoXG5cdFx0ZGF0YU1vZGVsUHJvcGVydHlQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pixcblx0XHRkYXRhTW9kZWxUZXh0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT5cblx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIChcblx0XHRcdGRhdGFNb2RlbFByb3BlcnR5UGF0aC50YXJnZXRFbnRpdHlTZXQgIT09IGRhdGFNb2RlbFRleHRQYXRoLnRhcmdldEVudGl0eVNldCAmJlxuXHRcdFx0ISFkYXRhTW9kZWxUZXh0UGF0aC5uYXZpZ2F0aW9uUHJvcGVydGllcyAmJlxuXHRcdFx0ISFkYXRhTW9kZWxUZXh0UGF0aC50YXJnZXRFbnRpdHlUeXBlXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyB0aGUgU2lkZUVmZmVjdHMgdG8gZXhwZWN0ZWQgZm9ybWF0XG5cdCAqICAtIFNldCBUcmlnZ2VyQWN0aW9uIGFzIHN0cmluZ1xuXHQgKiAgLSBDb252ZXJ0cyBTaWRlRWZmZWN0cyB0YXJnZXRzIHRvIGV4cGVjdGVkIGZvcm1hdFxuXHQgKiAgLSBSZW1vdmVzIGJpbmRpbmcgcGFyYW1ldGVyIGZyb20gU2lkZUVmZmVjdHMgdGFyZ2V0cyBwcm9wZXJ0aWVzXG5cdCAqICAtIEFkZHMgdGhlIHRleHQgcHJvcGVydGllc1xuXHQgKiAgLSBSZXBsYWNlcyBUYXJnZXRQcm9wZXJ0aWVzIGhhdmluZyByZWZlcmVuY2UgdG8gU291cmNlIFByb3BlcnRpZXMgZm9yIGEgU2lkZUVmZmVjdHMuXG5cdCAqXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0cyBTaWRlRWZmZWN0cyBkZWZpbml0aW9uXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEBwYXJhbSBiaW5kaW5nUGFyYW1ldGVyIE5hbWUgb2YgdGhlIGJpbmRpbmcgcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHByaXZhdGUgY29udmVydFNpZGVFZmZlY3RzKFxuXHRcdHNpZGVFZmZlY3RzOiBDb21tb25TaWRlRWZmZWN0c1R5cGUsXG5cdFx0ZW50aXR5VHlwZT86IEVudGl0eVR5cGUsXG5cdFx0YmluZGluZ1BhcmFtZXRlcj86IHN0cmluZ1xuXHQpOiBPRGF0YVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgdHJpZ2dlckFjdGlvbiA9IHNpZGVFZmZlY3RzLlRyaWdnZXJBY3Rpb24gYXMgc3RyaW5nO1xuXHRcdGNvbnN0IG5ld1NpZGVFZmZlY3RzID0gdGhpcy5jb252ZXJ0U2lkZUVmZmVjdHNGb3JtYXQoc2lkZUVmZmVjdHMpO1xuXHRcdGxldCBzaWRlRWZmZWN0c1RhcmdldHMgPSB7IHRhcmdldFByb3BlcnRpZXM6IG5ld1NpZGVFZmZlY3RzLnRhcmdldFByb3BlcnRpZXMsIHRhcmdldEVudGl0aWVzOiBuZXdTaWRlRWZmZWN0cy50YXJnZXRFbnRpdGllcyB9O1xuXHRcdHNpZGVFZmZlY3RzVGFyZ2V0cyA9IHRoaXMucmVtb3ZlQmluZGluZ1BhcmFtZXRlcihzaWRlRWZmZWN0c1RhcmdldHMsIGJpbmRpbmdQYXJhbWV0ZXIpO1xuXHRcdHNpZGVFZmZlY3RzVGFyZ2V0cyA9IHRoaXMuYWRkVGV4dFByb3BlcnRpZXMoc2lkZUVmZmVjdHNUYXJnZXRzLCBlbnRpdHlUeXBlKTtcblx0XHRzaWRlRWZmZWN0c1RhcmdldHMgPSB0aGlzLnJlbW92ZUR1cGxpY2F0ZVRhcmdldHMoc2lkZUVmZmVjdHNUYXJnZXRzKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Li4ubmV3U2lkZUVmZmVjdHMsXG5cdFx0XHQuLi57IHRhcmdldEVudGl0aWVzOiBzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0RW50aXRpZXMsIHRhcmdldFByb3BlcnRpZXM6IHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRQcm9wZXJ0aWVzLCB0cmlnZ2VyQWN0aW9uIH1cblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIHRoZSBTaWRlRWZmZWN0cyB0YXJnZXRzIChUYXJnZXRFbnRpdGllcyBhbmQgVGFyZ2V0UHJvcGVydGllcykgdG8gZXhwZWN0ZWQgZm9ybWF0XG5cdCAqICAtIFRhcmdldFByb3BlcnRpZXMgYXMgYXJyYXkgb2Ygc3RyaW5nXG5cdCAqICAtIFRhcmdldEVudGl0aWVzIGFzIGFycmF5IG9mIG9iamVjdCB3aXRoIHByb3BlcnR5ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoLlxuXHQgKlxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHMgU2lkZUVmZmVjdHMgZGVmaW5pdGlvblxuXHQgKiBAcmV0dXJucyBDb252ZXJ0ZWQgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgY29udmVydFNpZGVFZmZlY3RzRm9ybWF0KHNpZGVFZmZlY3RzOiBDb21tb25TaWRlRWZmZWN0c1R5cGUpOiBPRGF0YVNpZGVFZmZlY3RzVHlwZSB7XG5cdFx0Y29uc3QgZm9ybWF0UHJvcGVydGllcyA9IChwcm9wZXJ0aWVzPzogKHN0cmluZyB8IFByb3BlcnR5UGF0aClbXSk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0+IHtcblx0XHRcdHJldHVybiBwcm9wZXJ0aWVzXG5cdFx0XHRcdD8gcHJvcGVydGllcy5yZWR1Y2UoKHRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdLCB0YXJnZXQpID0+IHtcblx0XHRcdFx0XHRcdGxldCBwYXRoID0gXCJcIjtcblx0XHRcdFx0XHRcdGlmIChpc1Byb3BlcnR5UGF0aEV4cHJlc3Npb24odGFyZ2V0KSkge1xuXHRcdFx0XHRcdFx0XHRwYXRoID0gdGFyZ2V0LnZhbHVlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdFx0XHRcdHBhdGggPSB0YXJnZXQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAocGF0aCkge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXRQcm9wZXJ0aWVzLnB1c2gocGF0aCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRMb2cuZXJyb3IoXG5cdFx0XHRcdFx0XHRcdFx0YFNpZGVFZmZlY3RzIC0gRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBUYXJnZXRQcm9wZXJ0aWVzIGZvciBTaWRlRWZmZWN0cyAke3NpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZX1gXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGFyZ2V0UHJvcGVydGllcztcblx0XHRcdFx0ICB9LCBbXSlcblx0XHRcdFx0OiBwcm9wZXJ0aWVzO1xuXHRcdH07XG5cdFx0Y29uc3QgZm9ybWF0RW50aXRpZXMgPSAoZW50aXRpZXM/OiBOYXZpZ2F0aW9uUHJvcGVydHlQYXRoW10pOiB7ICROYXZpZ2F0aW9uUHJvcGVydHlQYXRoOiBzdHJpbmcgfVtdIHwgdW5kZWZpbmVkID0+IHtcblx0XHRcdHJldHVybiBlbnRpdGllc1xuXHRcdFx0XHQ/IGVudGl0aWVzLm1hcCgodGFyZ2V0RW50aXR5KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4geyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogdGFyZ2V0RW50aXR5LnZhbHVlIH07XG5cdFx0XHRcdCAgfSlcblx0XHRcdFx0OiBlbnRpdGllcztcblx0XHR9O1xuXG5cdFx0Ly8gVE9ETzogU291cmNlRXZlbnRzIGFyZSBzdGlsbCBleHBlcmltZW50YWwsIHJlbW92ZSBvbmNlIHB1YmxpY1xuXHRcdHR5cGUgQ29tbW9uU2lkZUVmZmVjdFR5cGVXaXRoU291cmNlRXZlbnRzID0gQ29tbW9uU2lkZUVmZmVjdHNUeXBlICYgeyBTb3VyY2VFdmVudHM/OiBFZG0uU3RyaW5nW10gfTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRmdWxseVF1YWxpZmllZE5hbWU6IHNpZGVFZmZlY3RzLmZ1bGx5UXVhbGlmaWVkTmFtZSxcblx0XHRcdHNvdXJjZVByb3BlcnRpZXM6IGZvcm1hdFByb3BlcnRpZXMoc2lkZUVmZmVjdHMuU291cmNlUHJvcGVydGllcyksXG5cdFx0XHRzb3VyY2VFbnRpdGllczogZm9ybWF0RW50aXRpZXMoc2lkZUVmZmVjdHMuU291cmNlRW50aXRpZXMpLFxuXHRcdFx0c291cmNlRXZlbnRzOiAoc2lkZUVmZmVjdHMgYXMgQ29tbW9uU2lkZUVmZmVjdFR5cGVXaXRoU291cmNlRXZlbnRzKS5Tb3VyY2VFdmVudHMgYXMgc3RyaW5nW10sXG5cdFx0XHR0YXJnZXRQcm9wZXJ0aWVzOiBmb3JtYXRQcm9wZXJ0aWVzKHNpZGVFZmZlY3RzLlRhcmdldFByb3BlcnRpZXMgYXMgKHN0cmluZyB8IFByb3BlcnR5UGF0aClbXSkgPz8gW10sXG5cdFx0XHR0YXJnZXRFbnRpdGllczogZm9ybWF0RW50aXRpZXMoc2lkZUVmZmVjdHMuVGFyZ2V0RW50aXRpZXMpID8/IFtdXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIGFsbCBkYXRhTW9kZWxPYmplY3RQYXRoIHJlbGF0ZWQgdG8gcHJvcGVydGllcyBsaXN0ZWQgYnkgYSBwYXRoXG5cdCAqXG5cdCAqIFRoZSBwYXRoIGNhbiBiZTpcblx0ICogIC0gYSBwYXRoIHRhcmdldGluZyBhIHByb3BlcnR5IG9uIGEgY29tcGxleFR5cGUgb3IgYW4gRW50aXR5VHlwZVxuXHQgKiAgLSBhIHBhdGggd2l0aCBhIHN0YXIgdGFyZ2V0aW5nIGFsbCBwcm9wZXJ0aWVzIG9uIGEgY29tcGxleFR5cGUgb3IgYW4gRW50aXR5VHlwZS5cblx0ICogIC0gYWJzb2x1dGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9wZXJ0eVBhdGggVGhlIHBhdGggdG8gYW5hbHl6ZVxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBkYXRhTW9kZWxPYmplY3RQYXRoIHJlcHJlc2VudGluZyB0aGUgcHJvcGVydGllc1xuXHQgKi9cblx0cHJpdmF0ZSBnZXREYXRhTW9kZWxQcm9wZXJ0aWVzRnJvbUFQYXRoKHByb3BlcnR5UGF0aDogc3RyaW5nLCBlbnRpdHlUeXBlPzogRW50aXR5VHlwZSk6IERhdGFNb2RlbE9iamVjdFBhdGg8UHJvcGVydHk+W10ge1xuXHRcdGxldCBkYXRhTW9kZWxPYmplY3RQYXRoczogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT5bXSA9IFtdO1xuXHRcdGNvbnN0IGNvbnZlcnRlZE1ldGFNb2RlbCA9IHRoaXMuZ2V0Q29udmVydGVkTWV0YU1vZGVsKCk7XG5cdFx0Y29uc3QgY29udGFpbmVyTmFtZSA9IGNvbnZlcnRlZE1ldGFNb2RlbC5lbnRpdHlDb250YWluZXIuZnVsbHlRdWFsaWZpZWROYW1lO1xuXHRcdGxldCBwcm9wZXJ0eVJlbGF0aXZlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRcdFx0dGVzdEVudGl0eVR5cGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdFx0XHRyZWdleFBhdHRlcm46IFJlZ0V4cCxcblx0XHRcdG1hdGNoOiBSZWdFeHBNYXRjaEFycmF5IHwgbnVsbDtcblx0XHRpZiAocHJvcGVydHlQYXRoLnN0YXJ0c1dpdGgoYC8ke2NvbnRhaW5lck5hbWV9L2ApKSB7XG5cdFx0XHRyZWdleFBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeXFxcXC8ke2NvbnRhaW5lck5hbWV9XFxcXC9bXi9dK1xcXFwvKC4rKT8kYCk7XG5cdFx0XHRtYXRjaCA9IHByb3BlcnR5UGF0aC5tYXRjaChyZWdleFBhdHRlcm4pO1xuXHRcdFx0cHJvcGVydHlSZWxhdGl2ZVBhdGggPSBtYXRjaCA/IG1hdGNoWzFdIDogdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIWVudGl0eVR5cGUpIHtcblx0XHRcdHJlZ2V4UGF0dGVybiA9IG5ldyBSZWdFeHAoYF4vJHtjb250YWluZXJOYW1lfS8oW14vXSspYCk7XG5cdFx0XHRtYXRjaCA9IHByb3BlcnR5UGF0aC5tYXRjaChyZWdleFBhdHRlcm4pO1xuXHRcdFx0dGVzdEVudGl0eVR5cGVOYW1lID0gbWF0Y2ggPyBtYXRjaFsxXSA6IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgdGVzdEVudGl0eVR5cGUgPVxuXHRcdFx0ZW50aXR5VHlwZSA/P1xuXHRcdFx0KCh0ZXN0RW50aXR5VHlwZU5hbWUgPyBjb252ZXJ0ZWRNZXRhTW9kZWwucmVzb2x2ZVBhdGgoYC8ke3Rlc3RFbnRpdHlUeXBlTmFtZX0vYCkudGFyZ2V0IDogdW5kZWZpbmVkKSBhcyBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkKTtcblx0XHRjb25zdCBlbnRpdHlTZXQgPVxuXHRcdFx0Y29udmVydGVkTWV0YU1vZGVsLmVudGl0eVNldHMuZmluZCgocmVsYXRlZEVudGl0eVNldCkgPT4gcmVsYXRlZEVudGl0eVNldC5lbnRpdHlUeXBlID09PSB0ZXN0RW50aXR5VHlwZSkgPz9cblx0XHRcdGNvbnZlcnRlZE1ldGFNb2RlbC5zaW5nbGV0b25zLmZpbmQoKHNpbmdsZXRvbikgPT4gc2luZ2xldG9uLmVudGl0eVR5cGUgPT09IHRlc3RFbnRpdHlUeXBlKTtcblx0XHRpZiAoZW50aXR5U2V0KSB7XG5cdFx0XHRjb25zdCBtZXRhTW9kZWwgPSB0aGlzLmdldE1ldGFNb2RlbCgpLFxuXHRcdFx0XHRlbnRpdHlTZXRDb250ZXh0ID0gbWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KGAvJHtlbnRpdHlTZXQubmFtZX1gKTtcblx0XHRcdGlmIChlbnRpdHlTZXRDb250ZXh0KSB7XG5cdFx0XHRcdGNvbnN0IGRhdGFNb2RlbEVudGl0eVNldCA9IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyhlbnRpdHlTZXRDb250ZXh0KTtcblx0XHRcdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5IHwgRW50aXR5VHlwZT4oXG5cdFx0XHRcdFx0XHRkYXRhTW9kZWxFbnRpdHlTZXQsXG5cdFx0XHRcdFx0XHQocHJvcGVydHlSZWxhdGl2ZVBhdGggfHwgcHJvcGVydHlQYXRoKS5yZXBsYWNlKFwiKlwiLCBcIlwiKSB8fCBcIi9cIlxuXHRcdFx0XHRcdCksIC8vIFwiKlwiIGlzIHJlcGxhY2VkIGJ5IFwiL1wiIHRvIHRhcmdldCB0aGUgY3VycmVudCBFbnRpdHlUeXBlXG5cdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q7XG5cdFx0XHRcdGlmIChpc1Byb3BlcnR5KHRhcmdldE9iamVjdCkpIHtcblx0XHRcdFx0XHRpZiAoaXNDb21wbGV4VHlwZSh0YXJnZXRPYmplY3QudGFyZ2V0VHlwZSkpIHtcblx0XHRcdFx0XHRcdGRhdGFNb2RlbE9iamVjdFBhdGhzID0gZGF0YU1vZGVsT2JqZWN0UGF0aHMuY29uY2F0KFxuXHRcdFx0XHRcdFx0XHR0YXJnZXRPYmplY3QudGFyZ2V0VHlwZS5wcm9wZXJ0aWVzLm1hcCgocHJvcGVydHkpID0+XG5cdFx0XHRcdFx0XHRcdFx0ZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KGRhdGFNb2RlbE9iamVjdFBhdGgsIHByb3BlcnR5Lm5hbWUpXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGRhdGFNb2RlbE9iamVjdFBhdGhzLnB1c2goZGF0YU1vZGVsT2JqZWN0UGF0aCBhcyBEYXRhTW9kZWxPYmplY3RQYXRoPFByb3BlcnR5Pik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGlzRW50aXR5VHlwZSh0YXJnZXRPYmplY3QpKSB7XG5cdFx0XHRcdFx0ZGF0YU1vZGVsT2JqZWN0UGF0aHMgPSBkYXRhTW9kZWxPYmplY3RQYXRocy5jb25jYXQoXG5cdFx0XHRcdFx0XHRkYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldEVudGl0eVR5cGUuZW50aXR5UHJvcGVydGllcy5tYXAoKGVudGl0eVByb3BlcnR5KSA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4oZGF0YU1vZGVsT2JqZWN0UGF0aCwgZW50aXR5UHJvcGVydHkubmFtZSk7XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZW50aXR5U2V0Q29udGV4dC5kZXN0cm95KCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBkYXRhTW9kZWxPYmplY3RQYXRocy5maWx0ZXIoKGRhdGFNb2RlbE9iamVjdFBhdGgpID0+IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0KTtcblx0fVxuXHQvKipcblx0ICogR2V0cyB0aGUgT2RhdGEgbWV0YW1vZGVsLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgT0RhdGEgbWV0YW1vZGVsXG5cdCAqL1xuXHRwcml2YXRlIGdldE1ldGFNb2RlbCgpOiBPRGF0YU1ldGFNb2RlbCB7XG5cdFx0cmV0dXJuIHRoaXMuYXBwQ29tcG9uZW50LmdldE1vZGVsKCkuZ2V0TWV0YU1vZGVsKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhbiBlbnRpdHkgdHlwZSBvciBhY3Rpb24gdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0cyByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgb3IgYWN0aW9uXG5cdCAqIGFuZCB0byBjb252ZXJ0IHRoZXNlIFNpZGVFZmZlY3RzIHdpdGggZXhwZWN0ZWQgZm9ybWF0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc291cmNlIEVudGl0eSB0eXBlIG9yIGFjdGlvblxuXHQgKiBAcmV0dXJucyBBcnJheSBvZiBTaWRlRWZmZWN0c1xuXHQgKi9cblx0cHJpdmF0ZSBnZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2Uoc291cmNlOiBFbnRpdHlUeXBlIHwgQWN0aW9uKTogT0RhdGFTaWRlRWZmZWN0c1R5cGVbXSB7XG5cdFx0bGV0IGJpbmRpbmdBbGlhcyA9IFwiXCI7XG5cdFx0Y29uc3QgaXNTb3VyY2VFbnRpdHlUeXBlID0gaXNFbnRpdHlUeXBlKHNvdXJjZSk7XG5cdFx0Y29uc3QgZW50aXR5VHlwZTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCA9IGlzU291cmNlRW50aXR5VHlwZSA/IHNvdXJjZSA6IHNvdXJjZS5zb3VyY2VFbnRpdHlUeXBlO1xuXHRcdGNvbnN0IGNvbW1vbkFubm90YXRpb24gPSBzb3VyY2UuYW5ub3RhdGlvbnM/LkNvbW1vbiBhcyB1bmRlZmluZWQgfCB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIENvbW1vbkFubm90YXRpb25UeXBlcz47XG5cdFx0aWYgKGNvbW1vbkFubm90YXRpb24pIHtcblx0XHRcdGlmIChlbnRpdHlUeXBlICYmICFpc1NvdXJjZUVudGl0eVR5cGUpIHtcblx0XHRcdFx0Y29uc3QgYmluZGluZ1BhcmFtZXRlciA9IHNvdXJjZS5wYXJhbWV0ZXJzPy5maW5kKChwYXJhbWV0ZXIpID0+IHBhcmFtZXRlci50eXBlID09PSBlbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHRcdGJpbmRpbmdBbGlhcyA9IGJpbmRpbmdQYXJhbWV0ZXI/LmZ1bGx5UXVhbGlmaWVkTmFtZS5zcGxpdChcIi9cIilbMV0gPz8gXCJcIjtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzLmdldFNpZGVFZmZlY3RzQW5ub3RhdGlvbkZyb21Tb3VyY2Uoc291cmNlKS5tYXAoKHNpZGVFZmZlY3RBbm5vKSA9PlxuXHRcdFx0XHR0aGlzLmNvbnZlcnRTaWRlRWZmZWN0cyhzaWRlRWZmZWN0QW5ubywgZW50aXR5VHlwZSwgYmluZGluZ0FsaWFzKVxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIFNpZGVFZmZlY3RzIHJlbGF0ZWQgdG8gYW4gZW50aXR5IHR5cGUgb3IgYWN0aW9uIHRoYXQgY29tZSBmcm9tIGFuIE9EYXRhIFNlcnZpY2Vcblx0ICogSW50ZXJuYWwgcm91dGluZSB0byBnZXQsIGZyb20gY29udmVydGVkIG9EYXRhIG1ldGFNb2RlbCwgU2lkZUVmZmVjdHMgcmVsYXRlZCB0byBhIHNwZWNpZmljIGVudGl0eSB0eXBlIG9yIGFjdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHNvdXJjZSBFbnRpdHkgdHlwZSBvciBhY3Rpb25cblx0ICogQHJldHVybnMgQXJyYXkgb2YgU2lkZUVmZmVjdHNcblx0ICovXG5cdHByaXZhdGUgZ2V0U2lkZUVmZmVjdHNBbm5vdGF0aW9uRnJvbVNvdXJjZShzb3VyY2U6IEVudGl0eVR5cGUgfCBBY3Rpb24pOiBDb21tb25TaWRlRWZmZWN0VHlwZVdpdGhRdWFsaWZpZXJbXSB7XG5cdFx0Y29uc3Qgc2lkZUVmZmVjdHM6IENvbW1vblNpZGVFZmZlY3RzVHlwZVtdID0gW107XG5cdFx0Y29uc3QgY29tbW9uQW5ub3RhdGlvbiA9IHNvdXJjZS5hbm5vdGF0aW9ucz8uQ29tbW9uIGFzIHVuZGVmaW5lZCB8IHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgQ29tbW9uU2lkZUVmZmVjdFR5cGVXaXRoUXVhbGlmaWVyPjtcblx0XHRmb3IgKGNvbnN0IGtleSBpbiBjb21tb25Bbm5vdGF0aW9uKSB7XG5cdFx0XHRjb25zdCBhbm5vdGF0aW9uID0gY29tbW9uQW5ub3RhdGlvbltrZXldO1xuXHRcdFx0aWYgKHRoaXMuaXNTaWRlRWZmZWN0c0Fubm90YXRpb24oYW5ub3RhdGlvbikpIHtcblx0XHRcdFx0c2lkZUVmZmVjdHMucHVzaChhbm5vdGF0aW9uKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHNpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgYW5ub3RhdGlvbiBpcyBhIFNpZGVFZmZlY3RzIGFubm90YXRpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBhbm5vdGF0aW9uIEFubm90YXRpb25cblx0ICogQHJldHVybnMgQm9vbGVhblxuXHQgKi9cblx0cHJpdmF0ZSBpc1NpZGVFZmZlY3RzQW5ub3RhdGlvbihhbm5vdGF0aW9uOiB1bmtub3duKTogYW5ub3RhdGlvbiBpcyBDb21tb25TaWRlRWZmZWN0c1R5cGUge1xuXHRcdHJldHVybiAoYW5ub3RhdGlvbiBhcyBDb21tb25TaWRlRWZmZWN0c1R5cGUpPy4kVHlwZSA9PT0gQ29tbW9uQW5ub3RhdGlvblR5cGVzLlNpZGVFZmZlY3RzVHlwZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2dzIHRoZSBTaWRlRWZmZWN0cyByZXF1ZXN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gcGF0aEV4cHJlc3Npb25zIFNpZGVFZmZlY3RzIHRhcmdldHNcblx0ICogQHBhcmFtIGNvbnRleHQgQ29udGV4dFxuXHQgKi9cblx0cHJpdmF0ZSBsb2dSZXF1ZXN0KHBhdGhFeHByZXNzaW9uczogU2lkZUVmZmVjdHNUYXJnZXRbXSwgY29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuXHRcdGNvbnN0IHRhcmdldFBhdGhzID0gcGF0aEV4cHJlc3Npb25zLnJlZHVjZShmdW5jdGlvbiAocGF0aHMsIHRhcmdldCkge1xuXHRcdFx0cmV0dXJuIGAke3BhdGhzfVxcblxcdFxcdCR7KHRhcmdldCBhcyBTaWRlRWZmZWN0c0VudGl0eVR5cGUpLiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoIHx8IHRhcmdldCB8fCBcIlwifWA7XG5cdFx0fSwgXCJcIik7XG5cdFx0TG9nLmRlYnVnKGBTaWRlRWZmZWN0cyAtIFJlcXVlc3Q6XFxuXFx0Q29udGV4dCBwYXRoIDogJHtjb250ZXh0LmdldFBhdGgoKX1cXG5cXHRQcm9wZXJ0eSBwYXRocyA6JHt0YXJnZXRQYXRoc31gKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSBuYW1lIG9mIHRoZSBiaW5kaW5nIHBhcmFtZXRlciBvbiB0aGUgU2lkZUVmZmVjdHMgdGFyZ2V0cy5cblx0ICpcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzVGFyZ2V0cyBTaWRlRWZmZWN0cyBUYXJnZXRzXG5cdCAqIEBwYXJhbSBiaW5kaW5nUGFyYW1ldGVyTmFtZSBOYW1lIG9mIGJpbmRpbmcgcGFyYW1ldGVyXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIGRlZmluaXRpb25cblx0ICovXG5cdHByaXZhdGUgcmVtb3ZlQmluZGluZ1BhcmFtZXRlcihzaWRlRWZmZWN0c1RhcmdldHM6IFNpZGVFZmZlY3RzVGFyZ2V0VHlwZSwgYmluZGluZ1BhcmFtZXRlck5hbWU/OiBzdHJpbmcpOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUge1xuXHRcdGlmIChiaW5kaW5nUGFyYW1ldGVyTmFtZSkge1xuXHRcdFx0Y29uc3QgcmVwbGFjZUJpbmRpbmdQYXJhbWV0ZXIgPSBmdW5jdGlvbiAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4ke2JpbmRpbmdQYXJhbWV0ZXJOYW1lfS8/YCksIFwiXCIpO1xuXHRcdFx0fTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHRhcmdldFByb3BlcnRpZXM6IHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRQcm9wZXJ0aWVzLm1hcCgodGFyZ2V0UHJvcGVydHkpID0+IHJlcGxhY2VCaW5kaW5nUGFyYW1ldGVyKHRhcmdldFByb3BlcnR5KSksXG5cdFx0XHRcdHRhcmdldEVudGl0aWVzOiBzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0RW50aXRpZXMubWFwKCh0YXJnZXRFbnRpdHkpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4geyAkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogcmVwbGFjZUJpbmRpbmdQYXJhbWV0ZXIodGFyZ2V0RW50aXR5LiROYXZpZ2F0aW9uUHJvcGVydHlQYXRoKSB9O1xuXHRcdFx0XHR9KVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRhcmdldFByb3BlcnRpZXM6IHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRQcm9wZXJ0aWVzLFxuXHRcdFx0dGFyZ2V0RW50aXRpZXM6IHNpZGVFZmZlY3RzVGFyZ2V0cy50YXJnZXRFbnRpdGllc1xuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIGR1cGxpY2F0ZXMgaW4gU2lkZUVmZmVjdHMgdGFyZ2V0cy5cblx0ICpcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzVGFyZ2V0cyBTaWRlRWZmZWN0cyBUYXJnZXRzXG5cdCAqIEByZXR1cm5zIFNpZGVFZmZlY3RzIHRhcmdldHMgd2l0aG91dCBkdXBsaWNhdGVzXG5cdCAqL1xuXHRwcml2YXRlIHJlbW92ZUR1cGxpY2F0ZVRhcmdldHMoc2lkZUVmZmVjdHNUYXJnZXRzOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUpOiBTaWRlRWZmZWN0c1RhcmdldFR5cGUge1xuXHRcdGNvbnN0IHRhcmdldEVudGl0aWVzUGF0aHMgPSBzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0RW50aXRpZXMubWFwKCh0YXJnZXRFbnRpdHkpID0+IHRhcmdldEVudGl0eS4kTmF2aWdhdGlvblByb3BlcnR5UGF0aCk7XG5cdFx0Y29uc3QgdW5pcXVlVGFyZ2V0ZWRFbnRpdGllc1BhdGggPSBuZXcgU2V0PHN0cmluZz4odGFyZ2V0RW50aXRpZXNQYXRocyk7XG5cdFx0Y29uc3QgdW5pcXVlVGFyZ2V0UHJvcGVydGllcyA9IG5ldyBTZXQ8c3RyaW5nPihzaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0UHJvcGVydGllcyk7XG5cblx0XHRjb25zdCB1bmlxdWVUYXJnZXRlZEVudGl0aWVzID0gQXJyYXkuZnJvbSh1bmlxdWVUYXJnZXRlZEVudGl0aWVzUGF0aCkubWFwKChlbnRpdHlQYXRoKSA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHQkTmF2aWdhdGlvblByb3BlcnR5UGF0aDogZW50aXR5UGF0aFxuXHRcdFx0fTtcblx0XHR9KTtcblxuXHRcdHJldHVybiB7IHRhcmdldFByb3BlcnRpZXM6IEFycmF5LmZyb20odW5pcXVlVGFyZ2V0UHJvcGVydGllcyksIHRhcmdldEVudGl0aWVzOiB1bmlxdWVUYXJnZXRlZEVudGl0aWVzIH07XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyBTaWRlRWZmZWN0cyBhY3Rpb24gdHlwZSB0aGF0IGNvbWUgZnJvbSBhbiBPRGF0YSBTZXJ2aWNlXG5cdCAqIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0LCBmcm9tIGNvbnZlcnRlZCBvRGF0YSBtZXRhTW9kZWwsIFNpZGVFZmZlY3RzIG9uIGFjdGlvbnNcblx0ICogcmVsYXRlZCB0byBhIHNwZWNpZmljIGVudGl0eSB0eXBlIGFuZCB0byBjb252ZXJ0IHRoZXNlIFNpZGVFZmZlY3RzIHdpdGhcblx0ICogZXhwZWN0ZWQgZm9ybWF0LlxuXHQgKlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBFbnRpdHkgdHlwZVxuXHQgKiBAcmV0dXJucyBFbnRpdHkgdHlwZSBTaWRlRWZmZWN0cyBkaWN0aW9uYXJ5XG5cdCAqL1xuXHRwcml2YXRlIHJldHJpZXZlT0RhdGFBY3Rpb25zU2lkZUVmZmVjdHMoYWN0aW9uOiBBY3Rpb24pOiBSZWNvcmQ8c3RyaW5nLCBBY3Rpb25TaWRlRWZmZWN0c1R5cGU+IHtcblx0XHRjb25zdCBzaWRlRWZmZWN0czogUmVjb3JkPHN0cmluZywgQWN0aW9uU2lkZUVmZmVjdHNUeXBlPiA9IHt9O1xuXHRcdGNvbnN0IHRyaWdnZXJBY3Rpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdFx0bGV0IHRhcmdldFByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cdFx0bGV0IHRhcmdldEVudGl0aWVzOiBTaWRlRWZmZWN0c0VudGl0eVR5cGVbXSA9IFtdO1xuXG5cdFx0dGhpcy5nZXRTaWRlRWZmZWN0c0Zyb21Tb3VyY2UoYWN0aW9uKS5mb3JFYWNoKChvRGF0YVNpZGVFZmZlY3QpID0+IHtcblx0XHRcdGNvbnN0IHRyaWdnZXJBY3Rpb24gPSBvRGF0YVNpZGVFZmZlY3QudHJpZ2dlckFjdGlvbjtcblx0XHRcdHRhcmdldFByb3BlcnRpZXMgPSB0YXJnZXRQcm9wZXJ0aWVzLmNvbmNhdChvRGF0YVNpZGVFZmZlY3QudGFyZ2V0UHJvcGVydGllcyk7XG5cdFx0XHR0YXJnZXRFbnRpdGllcyA9IHRhcmdldEVudGl0aWVzLmNvbmNhdChvRGF0YVNpZGVFZmZlY3QudGFyZ2V0RW50aXRpZXMpO1xuXHRcdFx0aWYgKHRyaWdnZXJBY3Rpb24pIHtcblx0XHRcdFx0dHJpZ2dlckFjdGlvbnMuYWRkKHRyaWdnZXJBY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RzVGFyZ2V0cyA9IHRoaXMucmVtb3ZlRHVwbGljYXRlVGFyZ2V0cyh7IHRhcmdldFByb3BlcnRpZXMsIHRhcmdldEVudGl0aWVzIH0pO1xuXHRcdGNvbnN0IGFjdGlvbk5hbWUgPSBhY3Rpb24uaXNCb3VuZCA/IGFjdGlvbi5mdWxseVF1YWxpZmllZE5hbWUubWF0Y2goL15bXihdKy8pPy5bMF0gOiBhY3Rpb24ubmFtZTtcblx0XHRzaWRlRWZmZWN0c1thY3Rpb25OYW1lIV0gPSB7XG5cdFx0XHRwYXRoRXhwcmVzc2lvbnM6IFsuLi5zaWRlRWZmZWN0c1RhcmdldHMudGFyZ2V0UHJvcGVydGllcywgLi4uc2lkZUVmZmVjdHNUYXJnZXRzLnRhcmdldEVudGl0aWVzXSxcblx0XHRcdHRyaWdnZXJBY3Rpb25zOiBBcnJheS5mcm9tKHRyaWdnZXJBY3Rpb25zKVxuXHRcdH07XG5cdFx0cmV0dXJuIHNpZGVFZmZlY3RzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgU2lkZUVmZmVjdHMgZW50aXR5IHR5cGUgdGhhdCBjb21lIGZyb20gYW4gT0RhdGEgU2VydmljZVxuXHQgKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCwgZnJvbSBjb252ZXJ0ZWQgb0RhdGEgbWV0YU1vZGVsLCBTaWRlRWZmZWN0c1xuXHQgKiByZWxhdGVkIHRvIGEgc3BlY2lmaWMgZW50aXR5IHR5cGUgYW5kIHRvIGNvbnZlcnQgdGhlc2UgU2lkZUVmZmVjdHMgd2l0aFxuXHQgKiBleHBlY3RlZCBmb3JtYXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIEVudGl0eSB0eXBlXG5cdCAqIEByZXR1cm5zIEVudGl0eSB0eXBlIFNpZGVFZmZlY3RzIGRpY3Rpb25hcnlcblx0ICovXG5cdHByaXZhdGUgcmV0cmlldmVPRGF0YUVudGl0eVNpZGVFZmZlY3RzKGVudGl0eVR5cGU6IEVudGl0eVR5cGUpOiBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT4ge1xuXHRcdGNvbnN0IGVudGl0eVNpZGVFZmZlY3RzOiBSZWNvcmQ8c3RyaW5nLCBPRGF0YVNpZGVFZmZlY3RzVHlwZT4gPSB7fTtcblx0XHR0aGlzLmdldFNpZGVFZmZlY3RzRnJvbVNvdXJjZShlbnRpdHlUeXBlKS5mb3JFYWNoKChzaWRlRWZmZWN0cykgPT4ge1xuXHRcdFx0ZW50aXR5U2lkZUVmZmVjdHNbc2lkZUVmZmVjdHMuZnVsbHlRdWFsaWZpZWROYW1lXSA9IHNpZGVFZmZlY3RzO1xuXHRcdH0pO1xuXHRcdHJldHVybiBlbnRpdHlTaWRlRWZmZWN0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIGEgbWFwIGZvciB0aGUgU291cmNlcyBvZiBzaWRlRWZmZWN0IG9uIHRoZSBlbnRpdHkgdG8gdHJhY2sgd2hlcmUgdGhvc2Ugc291cmNlcyBhcmUgdXNlZCBpbiBTaWRlRWZmZWN0cyBhbm5vdGF0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgZW50aXR5VHlwZSB3ZSBsb29rIGZvciBzaWRlIEVmZmVjdHMgYW5ub3RhdGlvblxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzIFRoZSBtYXBwaW5nIG9iamVjdCBpbiBjb25zdHJ1Y3Rpb25cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5lbnRpdGllc1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLnByb3BlcnRpZXNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5ldmVudHNcblx0ICovXG5cdHByaXZhdGUgbWFwU2lkZUVmZmVjdFNvdXJjZXMoXG5cdFx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0XHRzaWRlRWZmZWN0c1NvdXJjZXM6IHtcblx0XHRcdGVudGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRcdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0ZXZlbnRzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHR9XG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3Qgc2lkZUVmZmVjdERlZmluaXRpb24gb2YgdGhpcy5nZXRTaWRlRWZmZWN0c0Fubm90YXRpb25Gcm9tU291cmNlKGVudGl0eVR5cGUpKSB7XG5cdFx0XHR0aGlzLm1hcFNpZGVFZmZlY3RTb3VyY2VFbnRpdGllcyhlbnRpdHlUeXBlLCBzaWRlRWZmZWN0c1NvdXJjZXMsIHNpZGVFZmZlY3REZWZpbml0aW9uKTtcblx0XHRcdHRoaXMubWFwU2lkZUVmZmVjdFNvdXJjZVByb3BlcnRpZXMoZW50aXR5VHlwZSwgc2lkZUVmZmVjdHNTb3VyY2VzLCBzaWRlRWZmZWN0RGVmaW5pdGlvbik7XG5cdFx0XHR0aGlzLm1hcFNpZGVFZmZlY3RTb3VyY2VFdmVudHMoZW50aXR5VHlwZSwgc2lkZUVmZmVjdHNTb3VyY2VzLCBzaWRlRWZmZWN0RGVmaW5pdGlvbik7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZpbGxzIHRoZSBtYXAgZm9yIHRoZSBTb3VyY2VzIG9mIHNpZGVFZmZlY3Qgd2l0aCBzb3VyY2UgZW50aXRpZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBlbnRpdHlUeXBlIHdlIGxvb2sgZm9yIHNpZGUgRWZmZWN0cyBhbm5vdGF0aW9uXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMgVGhlIG1hcHBpbmcgb2JqZWN0IGluIGNvbnN0cnVjdGlvblxuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLmVudGl0aWVzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMucHJvcGVydGllc1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdHNTb3VyY2VzLmV2ZW50c1xuXHQgKiBAcGFyYW0gc2lkZUVmZmVjdERlZmluaXRpb24gVGhlIHNpZGUgZWZmZWN0IGRlZmluaXRpb24gdG8gYmUgZXZhbHVhdGVkXG5cdCAqL1xuXHRwcml2YXRlIG1hcFNpZGVFZmZlY3RTb3VyY2VFbnRpdGllcyhcblx0XHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRcdHNpZGVFZmZlY3RzU291cmNlczoge1xuXHRcdFx0ZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRldmVudHM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdH0sXG5cdFx0c2lkZUVmZmVjdERlZmluaXRpb246IENvbW1vblNpZGVFZmZlY3RUeXBlV2l0aFF1YWxpZmllclxuXHQpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IHNvdXJjZUVudGl0eSBvZiBzaWRlRWZmZWN0RGVmaW5pdGlvbi5Tb3VyY2VFbnRpdGllcyA/PyBbXSkge1xuXHRcdFx0Y29uc3QgdGFyZ2V0RW50aXR5VHlwZSA9IHNvdXJjZUVudGl0eS52YWx1ZSA/IHNvdXJjZUVudGl0eS4kdGFyZ2V0Py50YXJnZXRUeXBlIDogZW50aXR5VHlwZTtcblx0XHRcdGlmICh0YXJnZXRFbnRpdHlUeXBlKSB7XG5cdFx0XHRcdGlmICghc2lkZUVmZmVjdHNTb3VyY2VzLmVudGl0aWVzW3RhcmdldEVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lXSkge1xuXHRcdFx0XHRcdHNpZGVFZmZlY3RzU291cmNlcy5lbnRpdGllc1t0YXJnZXRFbnRpdHlUeXBlLmZ1bGx5UXVhbGlmaWVkTmFtZV0gPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzaWRlRWZmZWN0c1NvdXJjZXMuZW50aXRpZXNbdGFyZ2V0RW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWVdLnB1c2goe1xuXHRcdFx0XHRcdGVudGl0eTogZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdFx0cXVhbGlmaWVyOiBzaWRlRWZmZWN0RGVmaW5pdGlvbi5xdWFsaWZpZXJcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEZpbGxzIHRoZSBtYXAgZm9yIHRoZSBTb3VyY2VzIG9mIHNpZGVFZmZlY3Qgd2l0aCBzb3VyY2UgcHJvcGVydGllcy5cblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eVR5cGUgd2UgbG9vayBmb3Igc2lkZSBFZmZlY3RzIGFubm90YXRpb25cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcyBUaGUgbWFwcGluZyBvYmplY3QgaW4gY29uc3RydWN0aW9uXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMuZW50aXRpZXNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5wcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMuZXZlbnRzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0RGVmaW5pdGlvbiBUaGUgc2lkZSBlZmZlY3QgZGVmaW5pdGlvbiB0byBiZSBldmFsdWF0ZWRcblx0ICovXG5cdHByaXZhdGUgbWFwU2lkZUVmZmVjdFNvdXJjZVByb3BlcnRpZXMoXG5cdFx0ZW50aXR5VHlwZTogRW50aXR5VHlwZSxcblx0XHRzaWRlRWZmZWN0c1NvdXJjZXM6IHtcblx0XHRcdGVudGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHRcdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0ZXZlbnRzOiBSZWNvcmQ8c3RyaW5nLCBTaWRlRWZmZWN0SW5mb0ZvclNvdXJjZVtdPjtcblx0XHR9LFxuXHRcdHNpZGVFZmZlY3REZWZpbml0aW9uOiBDb21tb25TaWRlRWZmZWN0VHlwZVdpdGhRdWFsaWZpZXJcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgaGFzVW5pcXVlU291cmNlUHJvcGVydHkgPSBzaWRlRWZmZWN0RGVmaW5pdGlvbi5Tb3VyY2VQcm9wZXJ0aWVzPy5sZW5ndGggPT09IDE7XG5cdFx0Zm9yIChjb25zdCBzb3VyY2VQcm9wZXJ0eSBvZiBzaWRlRWZmZWN0RGVmaW5pdGlvbi5Tb3VyY2VQcm9wZXJ0aWVzID8/IFtdKSB7XG5cdFx0XHRpZiAoc291cmNlUHJvcGVydHkuJHRhcmdldCkge1xuXHRcdFx0XHRpZiAoIXNpZGVFZmZlY3RzU291cmNlcy5wcm9wZXJ0aWVzW3NvdXJjZVByb3BlcnR5LiR0YXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lXSkge1xuXHRcdFx0XHRcdHNpZGVFZmZlY3RzU291cmNlcy5wcm9wZXJ0aWVzW3NvdXJjZVByb3BlcnR5LiR0YXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lXSA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNpZGVFZmZlY3RzU291cmNlcy5wcm9wZXJ0aWVzW3NvdXJjZVByb3BlcnR5LiR0YXJnZXQuZnVsbHlRdWFsaWZpZWROYW1lXS5wdXNoKHtcblx0XHRcdFx0XHRlbnRpdHk6IGVudGl0eVR5cGUuZnVsbHlRdWFsaWZpZWROYW1lLFxuXHRcdFx0XHRcdHF1YWxpZmllcjogc2lkZUVmZmVjdERlZmluaXRpb24ucXVhbGlmaWVyLFxuXHRcdFx0XHRcdGhhc1VuaXF1ZVNvdXJjZVByb3BlcnR5XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBGaWxscyB0aGUgbWFwIGZvciB0aGUgU291cmNlcyBvZiBzaWRlRWZmZWN0IHdpdGggc291cmNlIGV2ZW50cy5cblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGVudGl0eVR5cGUgd2UgbG9vayBmb3Igc2lkZSBFZmZlY3RzIGFubm90YXRpb25cblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcyBUaGUgbWFwcGluZyBvYmplY3QgaW4gY29uc3RydWN0aW9uXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMuZW50aXRpZXNcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RzU291cmNlcy5wcm9wZXJ0aWVzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0c1NvdXJjZXMuZXZlbnRzXG5cdCAqIEBwYXJhbSBzaWRlRWZmZWN0RGVmaW5pdGlvbiBUaGUgc2lkZSBlZmZlY3QgZGVmaW5pdGlvbiB0byBiZSBldmFsdWF0ZWRcblx0ICovXG5cdHByaXZhdGUgbWFwU2lkZUVmZmVjdFNvdXJjZUV2ZW50cyhcblx0XHRlbnRpdHlUeXBlOiBFbnRpdHlUeXBlLFxuXHRcdHNpZGVFZmZlY3RzU291cmNlczoge1xuXHRcdFx0ZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdFx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2VbXT47XG5cdFx0XHRldmVudHM6IFJlY29yZDxzdHJpbmcsIFNpZGVFZmZlY3RJbmZvRm9yU291cmNlW10+O1xuXHRcdH0sXG5cdFx0c2lkZUVmZmVjdERlZmluaXRpb246IENvbW1vblNpZGVFZmZlY3RUeXBlV2l0aFF1YWxpZmllclxuXHQpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IHNvdXJjZUV2ZW50IG9mIHNpZGVFZmZlY3REZWZpbml0aW9uLlNvdXJjZUV2ZW50cyA/PyBbXSkge1xuXHRcdFx0aWYgKCFzaWRlRWZmZWN0c1NvdXJjZXMuZXZlbnRzW3NvdXJjZUV2ZW50LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRcdHNpZGVFZmZlY3RzU291cmNlcy5ldmVudHNbc291cmNlRXZlbnQudG9TdHJpbmcoKV0gPSBbXTtcblx0XHRcdH1cblx0XHRcdHNpZGVFZmZlY3RzU291cmNlcy5ldmVudHNbc291cmNlRXZlbnQudG9TdHJpbmcoKV0ucHVzaCh7XG5cdFx0XHRcdGVudGl0eTogZW50aXR5VHlwZS5mdWxseVF1YWxpZmllZE5hbWUsXG5cdFx0XHRcdHF1YWxpZmllcjogc2lkZUVmZmVjdERlZmluaXRpb24ucXVhbGlmaWVyXG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBmaWVsZEdyb3VwSWQgYmFzZWQgb24gdGhlIHN0b3JlZCBpbmZvcm1hdGlvbiBvbiB0aCBzaWRlIGVmZmVjdC5cblx0ICpcblx0ICogQHBhcmFtIHNpZGVFZmZlY3RJbmZvXG5cdCAqIEBwYXJhbSBpc0ltbWVkaWF0ZVxuXHQgKiBAcmV0dXJucyBBIHN0cmluZyBmb3IgdGhlIGZpZWxkR3JvdXBJZC5cblx0ICovXG5cdHByaXZhdGUgZ2V0RmllbGRHcm91cElkRm9yU2lkZUVmZmVjdChzaWRlRWZmZWN0SW5mbzogU2lkZUVmZmVjdEluZm9Gb3JTb3VyY2UsIGlzSW1tZWRpYXRlID0gZmFsc2UpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHNpZGVFZmZlY3RXaXRoUXVhbGlmaWVyID0gc2lkZUVmZmVjdEluZm8ucXVhbGlmaWVyXG5cdFx0XHQ/IGAke3NpZGVFZmZlY3RJbmZvLmVudGl0eX0jJHtzaWRlRWZmZWN0SW5mby5xdWFsaWZpZXJ9YFxuXHRcdFx0OiBzaWRlRWZmZWN0SW5mby5lbnRpdHk7XG5cdFx0cmV0dXJuIGlzSW1tZWRpYXRlIHx8IHNpZGVFZmZlY3RJbmZvLmhhc1VuaXF1ZVNvdXJjZVByb3BlcnR5ID09PSB0cnVlXG5cdFx0XHQ/IGAke3NpZGVFZmZlY3RXaXRoUXVhbGlmaWVyfSQkSW1tZWRpYXRlUmVxdWVzdGBcblx0XHRcdDogc2lkZUVmZmVjdFdpdGhRdWFsaWZpZXI7XG5cdH1cblxuXHRnZXRJbnRlcmZhY2UoKTogU2lkZUVmZmVjdHNTZXJ2aWNlIHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuXG5jbGFzcyBTaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5IGV4dGVuZHMgU2VydmljZUZhY3Rvcnk8U2lkZUVmZmVjdHNTZXR0aW5ncz4ge1xuXHRhc3luYyBjcmVhdGVJbnN0YW5jZShvU2VydmljZUNvbnRleHQ6IFNlcnZpY2VDb250ZXh0PFNpZGVFZmZlY3RzU2V0dGluZ3M+KTogUHJvbWlzZTxTaWRlRWZmZWN0c1NlcnZpY2U+IHtcblx0XHRjb25zdCBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlID0gbmV3IFNpZGVFZmZlY3RzU2VydmljZShvU2VydmljZUNvbnRleHQpO1xuXHRcdHJldHVybiBTaWRlRWZmZWN0c1NlcnZpY2VTZXJ2aWNlLmluaXRpYWxpemUoKTtcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBTaWRlRWZmZWN0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
|