@veeroute/lss-studio-angular 7.33.3222 → 7.35.3290
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/cfg/entity_error_type.yaml +9 -9
- package/cfg/table_settings.json +11 -20
- package/fesm2022/veeroute-lss-studio-angular.mjs +220 -159
- package/fesm2022/veeroute-lss-studio-angular.mjs.map +1 -1
- package/package.json +5 -6
- package/types/veeroute-lss-studio-angular.d.ts +13407 -0
- package/api/api.d.ts +0 -46
- package/api/backupsService.d.ts +0 -56
- package/api/backupsServiceInterface.d.ts +0 -35
- package/api/customFieldsService.d.ts +0 -145
- package/api/customFieldsServiceInterface.d.ts +0 -70
- package/api/customIconsService.d.ts +0 -144
- package/api/customIconsServiceInterface.d.ts +0 -69
- package/api/experimentsService.d.ts +0 -546
- package/api/experimentsServiceInterface.d.ts +0 -272
- package/api/explorerService.d.ts +0 -279
- package/api/explorerServiceInterface.d.ts +0 -132
- package/api/externalRoutingService.d.ts +0 -101
- package/api/externalRoutingServiceInterface.d.ts +0 -55
- package/api/factsService.d.ts +0 -213
- package/api/factsServiceInterface.d.ts +0 -119
- package/api/hardlinksService.d.ts +0 -213
- package/api/hardlinksServiceInterface.d.ts +0 -119
- package/api/locationsService.d.ts +0 -192
- package/api/locationsServiceInterface.d.ts +0 -112
- package/api/ordersService.d.ts +0 -236
- package/api/ordersServiceInterface.d.ts +0 -132
- package/api/performersService.d.ts +0 -236
- package/api/performersServiceInterface.d.ts +0 -132
- package/api/systemService.d.ts +0 -78
- package/api/systemServiceInterface.d.ts +0 -37
- package/api/transportsService.d.ts +0 -236
- package/api/transportsServiceInterface.d.ts +0 -132
- package/api/tripsService.d.ts +0 -372
- package/api/tripsServiceInterface.d.ts +0 -218
- package/api/userService.d.ts +0 -162
- package/api/userServiceInterface.d.ts +0 -79
- package/api.base.service.d.ts +0 -21
- package/api.module.d.ts +0 -11
- package/configuration.d.ts +0 -106
- package/encoder.d.ts +0 -11
- package/esm2022/api/api.mjs +0 -47
- package/esm2022/api/backupsService.mjs +0 -135
- package/esm2022/api/backupsServiceInterface.mjs +0 -2
- package/esm2022/api/customFieldsService.mjs +0 -312
- package/esm2022/api/customFieldsServiceInterface.mjs +0 -2
- package/esm2022/api/customIconsService.mjs +0 -313
- package/esm2022/api/customIconsServiceInterface.mjs +0 -2
- package/esm2022/api/experimentsService.mjs +0 -1163
- package/esm2022/api/experimentsServiceInterface.mjs +0 -2
- package/esm2022/api/explorerService.mjs +0 -594
- package/esm2022/api/explorerServiceInterface.mjs +0 -2
- package/esm2022/api/externalRoutingService.mjs +0 -227
- package/esm2022/api/externalRoutingServiceInterface.mjs +0 -2
- package/esm2022/api/factsService.mjs +0 -509
- package/esm2022/api/factsServiceInterface.mjs +0 -2
- package/esm2022/api/hardlinksService.mjs +0 -509
- package/esm2022/api/hardlinksServiceInterface.mjs +0 -2
- package/esm2022/api/locationsService.mjs +0 -459
- package/esm2022/api/locationsServiceInterface.mjs +0 -2
- package/esm2022/api/ordersService.mjs +0 -565
- package/esm2022/api/ordersServiceInterface.mjs +0 -2
- package/esm2022/api/performersService.mjs +0 -565
- package/esm2022/api/performersServiceInterface.mjs +0 -2
- package/esm2022/api/systemService.mjs +0 -149
- package/esm2022/api/systemServiceInterface.mjs +0 -2
- package/esm2022/api/transportsService.mjs +0 -565
- package/esm2022/api/transportsServiceInterface.mjs +0 -2
- package/esm2022/api/tripsService.mjs +0 -900
- package/esm2022/api/tripsServiceInterface.mjs +0 -2
- package/esm2022/api/userService.mjs +0 -312
- package/esm2022/api/userServiceInterface.mjs +0 -2
- package/esm2022/api.base.service.mjs +0 -79
- package/esm2022/api.module.mjs +0 -40
- package/esm2022/configuration.mjs +0 -145
- package/esm2022/encoder.mjs +0 -19
- package/esm2022/index.mjs +0 -8
- package/esm2022/model/actualizeSettings.mjs +0 -11
- package/esm2022/model/assignedPerformer.mjs +0 -2
- package/esm2022/model/assignedTransport.mjs +0 -2
- package/esm2022/model/attribute.mjs +0 -11
- package/esm2022/model/basicProcess.mjs +0 -19
- package/esm2022/model/basicState.mjs +0 -20
- package/esm2022/model/box.mjs +0 -2
- package/esm2022/model/boxCompatibilities.mjs +0 -11
- package/esm2022/model/boxLimits.mjs +0 -2
- package/esm2022/model/break.mjs +0 -11
- package/esm2022/model/breakRules.mjs +0 -7
- package/esm2022/model/calculationHistoryElement.mjs +0 -2
- package/esm2022/model/calculationInfo.mjs +0 -2
- package/esm2022/model/calculationSettings.mjs +0 -11
- package/esm2022/model/calculationState.mjs +0 -2
- package/esm2022/model/calculationStatus.mjs +0 -24
- package/esm2022/model/capacity.mjs +0 -11
- package/esm2022/model/capacityCost.mjs +0 -11
- package/esm2022/model/capacityLimit.mjs +0 -11
- package/esm2022/model/capacityMultiplier.mjs +0 -11
- package/esm2022/model/capacityStatisticsLoad.mjs +0 -11
- package/esm2022/model/capacityStatisticsRatio.mjs +0 -11
- package/esm2022/model/capacityStatisticsSum.mjs +0 -11
- package/esm2022/model/cargo.mjs +0 -2
- package/esm2022/model/cargoAction.mjs +0 -2
- package/esm2022/model/cargoActionType.mjs +0 -18
- package/esm2022/model/cargoCompatibilities.mjs +0 -2
- package/esm2022/model/cargoInvoice.mjs +0 -2
- package/esm2022/model/cargoInvoiceDetail.mjs +0 -2
- package/esm2022/model/cargoInvoiceHonestSign.mjs +0 -11
- package/esm2022/model/cargoInvoiceReceipt.mjs +0 -11
- package/esm2022/model/cargoInvoiceTax.mjs +0 -28
- package/esm2022/model/cargoRotationType.mjs +0 -20
- package/esm2022/model/checkResult.mjs +0 -11
- package/esm2022/model/compatibilityPenalty.mjs +0 -11
- package/esm2022/model/customfieldConvertRule.mjs +0 -2
- package/esm2022/model/customfieldEntityType.mjs +0 -28
- package/esm2022/model/customfieldsSettings.mjs +0 -2
- package/esm2022/model/demand.mjs +0 -2
- package/esm2022/model/demandExtraDuration.mjs +0 -11
- package/esm2022/model/demandType.mjs +0 -21
- package/esm2022/model/entityError.mjs +0 -2
- package/esm2022/model/entityErrorType.mjs +0 -36
- package/esm2022/model/entityPath.mjs +0 -2
- package/esm2022/model/entityType.mjs +0 -44
- package/esm2022/model/entityWarning.mjs +0 -2
- package/esm2022/model/entityWarningType.mjs +0 -58
- package/esm2022/model/experiment.mjs +0 -2
- package/esm2022/model/experimentCheck.mjs +0 -2
- package/esm2022/model/experimentList.mjs +0 -2
- package/esm2022/model/experimentNeighbors.mjs +0 -11
- package/esm2022/model/experimentSettings.mjs +0 -2
- package/esm2022/model/experimentStatistics.mjs +0 -2
- package/esm2022/model/extensionSettings.mjs +0 -11
- package/esm2022/model/fact.mjs +0 -2
- package/esm2022/model/factEssences.mjs +0 -2
- package/esm2022/model/factStatus.mjs +0 -19
- package/esm2022/model/factType.mjs +0 -25
- package/esm2022/model/featureLifetime.mjs +0 -2
- package/esm2022/model/fileNamePath.mjs +0 -11
- package/esm2022/model/fileSpecification.mjs +0 -11
- package/esm2022/model/filesystem.mjs +0 -2
- package/esm2022/model/filesystemColumnType.mjs +0 -23
- package/esm2022/model/filesystemCounters.mjs +0 -2
- package/esm2022/model/filesystemPath.mjs +0 -2
- package/esm2022/model/folder.mjs +0 -2
- package/esm2022/model/folderCounters.mjs +0 -11
- package/esm2022/model/folderSpecification.mjs +0 -2
- package/esm2022/model/folderType.mjs +0 -18
- package/esm2022/model/general400.mjs +0 -2
- package/esm2022/model/general402.mjs +0 -2
- package/esm2022/model/general403.mjs +0 -2
- package/esm2022/model/general404.mjs +0 -2
- package/esm2022/model/general404Detail.mjs +0 -2
- package/esm2022/model/general429.mjs +0 -2
- package/esm2022/model/general500.mjs +0 -2
- package/esm2022/model/generalStatistics.mjs +0 -2
- package/esm2022/model/geoSettings.mjs +0 -2
- package/esm2022/model/geopoint.mjs +0 -11
- package/esm2022/model/hardlink.mjs +0 -2
- package/esm2022/model/hardlinkElement.mjs +0 -2
- package/esm2022/model/hardlinkElementType.mjs +0 -19
- package/esm2022/model/importSample.mjs +0 -18
- package/esm2022/model/importSource.mjs +0 -18
- package/esm2022/model/linkedEssence.mjs +0 -23
- package/esm2022/model/loadStatistics.mjs +0 -2
- package/esm2022/model/location.mjs +0 -2
- package/esm2022/model/locationCargosLimit.mjs +0 -2
- package/esm2022/model/locationCompatibilities.mjs +0 -11
- package/esm2022/model/locationLimit.mjs +0 -2
- package/esm2022/model/locationLimitStatistics.mjs +0 -2
- package/esm2022/model/locationStatistics.mjs +0 -2
- package/esm2022/model/locationTimetableElement.mjs +0 -2
- package/esm2022/model/locationTransportsLimit.mjs +0 -11
- package/esm2022/model/measurements.mjs +0 -2
- package/esm2022/model/models.mjs +0 -261
- package/esm2022/model/order.mjs +0 -2
- package/esm2022/model/orderCompatibilities.mjs +0 -11
- package/esm2022/model/performer.mjs +0 -2
- package/esm2022/model/performerCompatibilities.mjs +0 -2
- package/esm2022/model/performerLimits.mjs +0 -2
- package/esm2022/model/performerShift.mjs +0 -2
- package/esm2022/model/performerTariff.mjs +0 -2
- package/esm2022/model/performerTariffConstraint.mjs +0 -11
- package/esm2022/model/planSettings.mjs +0 -2
- package/esm2022/model/planStatistics.mjs +0 -2
- package/esm2022/model/possibleEvent.mjs +0 -2
- package/esm2022/model/quality.mjs +0 -2
- package/esm2022/model/removedItems.mjs +0 -11
- package/esm2022/model/replanSettings.mjs +0 -2
- package/esm2022/model/replanStrategy.mjs +0 -11
- package/esm2022/model/rest.mjs +0 -11
- package/esm2022/model/restRules.mjs +0 -2
- package/esm2022/model/roundtripStatistics.mjs +0 -2
- package/esm2022/model/routingMatrix.mjs +0 -2
- package/esm2022/model/routingMatrixWaypoint.mjs +0 -2
- package/esm2022/model/routingTransportMatrix.mjs +0 -2
- package/esm2022/model/schemaError.mjs +0 -11
- package/esm2022/model/service.mjs +0 -26
- package/esm2022/model/settingsKeyList.mjs +0 -11
- package/esm2022/model/stopDemand.mjs +0 -2
- package/esm2022/model/stopStatistics.mjs +0 -2
- package/esm2022/model/tableCustomfields.mjs +0 -11
- package/esm2022/model/tableCustomfieldsColumnType.mjs +0 -76
- package/esm2022/model/tableDataStats.mjs +0 -11
- package/esm2022/model/tableExperimentColumnType.mjs +0 -21
- package/esm2022/model/tableFact.mjs +0 -2
- package/esm2022/model/tableFactColumnType.mjs +0 -27
- package/esm2022/model/tableFactFields.mjs +0 -6
- package/esm2022/model/tableFactFilter.mjs +0 -2
- package/esm2022/model/tableFactFilterList.mjs +0 -2
- package/esm2022/model/tableFactList.mjs +0 -2
- package/esm2022/model/tableFactMetrics.mjs +0 -2
- package/esm2022/model/tableFactMetricsFilterList.mjs +0 -2
- package/esm2022/model/tableFilterBoolList.mjs +0 -11
- package/esm2022/model/tableFilterDatetimeRange.mjs +0 -11
- package/esm2022/model/tableFilterDurationRange.mjs +0 -11
- package/esm2022/model/tableFilterEnumList.mjs +0 -11
- package/esm2022/model/tableFilterFloatRange.mjs +0 -11
- package/esm2022/model/tableFilterIntRange.mjs +0 -11
- package/esm2022/model/tableFilterStringList.mjs +0 -11
- package/esm2022/model/tableFilterStringSearch.mjs +0 -11
- package/esm2022/model/tableFilterType.mjs +0 -24
- package/esm2022/model/tableHardlink.mjs +0 -2
- package/esm2022/model/tableHardlinkColumnType.mjs +0 -24
- package/esm2022/model/tableHardlinkFields.mjs +0 -7
- package/esm2022/model/tableHardlinkFilter.mjs +0 -2
- package/esm2022/model/tableHardlinkFilterList.mjs +0 -2
- package/esm2022/model/tableHardlinkList.mjs +0 -2
- package/esm2022/model/tableHardlinkMetrics.mjs +0 -2
- package/esm2022/model/tableHardlinkMetricsFilterList.mjs +0 -2
- package/esm2022/model/tableListCounters.mjs +0 -2
- package/esm2022/model/tableListCountersDetail.mjs +0 -11
- package/esm2022/model/tableLocation.mjs +0 -2
- package/esm2022/model/tableLocationColumnType.mjs +0 -23
- package/esm2022/model/tableLocationFields.mjs +0 -7
- package/esm2022/model/tableLocationFilter.mjs +0 -2
- package/esm2022/model/tableLocationFilterList.mjs +0 -2
- package/esm2022/model/tableLocationList.mjs +0 -2
- package/esm2022/model/tableLocationMetrics.mjs +0 -2
- package/esm2022/model/tableLocationMetricsFilterList.mjs +0 -2
- package/esm2022/model/tableOrder.mjs +0 -2
- package/esm2022/model/tableOrderColumnType.mjs +0 -49
- package/esm2022/model/tableOrderFields.mjs +0 -7
- package/esm2022/model/tableOrderFilter.mjs +0 -2
- package/esm2022/model/tableOrderFilterList.mjs +0 -2
- package/esm2022/model/tableOrderList.mjs +0 -2
- package/esm2022/model/tableOrderMetrics.mjs +0 -2
- package/esm2022/model/tableOrderMetricsFilterList.mjs +0 -2
- package/esm2022/model/tablePerformer.mjs +0 -2
- package/esm2022/model/tablePerformerColumnType.mjs +0 -31
- package/esm2022/model/tablePerformerFields.mjs +0 -7
- package/esm2022/model/tablePerformerFilter.mjs +0 -2
- package/esm2022/model/tablePerformerFilterList.mjs +0 -2
- package/esm2022/model/tablePerformerList.mjs +0 -2
- package/esm2022/model/tablePerformerMetrics.mjs +0 -2
- package/esm2022/model/tablePerformerMetricsFilterList.mjs +0 -2
- package/esm2022/model/tableRoundtrip.mjs +0 -2
- package/esm2022/model/tableRoundtripColumnType.mjs +0 -51
- package/esm2022/model/tableRoundtripFields.mjs +0 -7
- package/esm2022/model/tableRoundtripFilter.mjs +0 -2
- package/esm2022/model/tableRoundtripFilterList.mjs +0 -2
- package/esm2022/model/tableRoundtripList.mjs +0 -2
- package/esm2022/model/tableRoundtripMetrics.mjs +0 -2
- package/esm2022/model/tableRoundtripMetricsFilterList.mjs +0 -2
- package/esm2022/model/tableTransport.mjs +0 -2
- package/esm2022/model/tableTransportColumnType.mjs +0 -37
- package/esm2022/model/tableTransportFields.mjs +0 -7
- package/esm2022/model/tableTransportFilter.mjs +0 -2
- package/esm2022/model/tableTransportFilterList.mjs +0 -2
- package/esm2022/model/tableTransportList.mjs +0 -2
- package/esm2022/model/tableTransportMetrics.mjs +0 -2
- package/esm2022/model/tableTransportMetricsFilterList.mjs +0 -2
- package/esm2022/model/tableTrip.mjs +0 -2
- package/esm2022/model/tableTripColumnType.mjs +0 -53
- package/esm2022/model/tableTripFields.mjs +0 -7
- package/esm2022/model/tableTripFilter.mjs +0 -2
- package/esm2022/model/tableTripFilterList.mjs +0 -2
- package/esm2022/model/tableTripList.mjs +0 -2
- package/esm2022/model/tableTripMetrics.mjs +0 -2
- package/esm2022/model/tableTripMetricsFilterList.mjs +0 -2
- package/esm2022/model/tableTripStop.mjs +0 -2
- package/esm2022/model/tableTripStopColumnType.mjs +0 -33
- package/esm2022/model/tableTripStopFields.mjs +0 -7
- package/esm2022/model/tableTripStopFilter.mjs +0 -2
- package/esm2022/model/tableTripStopFilterList.mjs +0 -2
- package/esm2022/model/tableTripStopList.mjs +0 -2
- package/esm2022/model/taskStatistics.mjs +0 -2
- package/esm2022/model/timeWindow.mjs +0 -11
- package/esm2022/model/timeWindowViolationDetail.mjs +0 -11
- package/esm2022/model/timeWindowViolations.mjs +0 -2
- package/esm2022/model/tracedata.mjs +0 -2
- package/esm2022/model/track.mjs +0 -2
- package/esm2022/model/trackList.mjs +0 -2
- package/esm2022/model/trackListCustom.mjs +0 -2
- package/esm2022/model/trackType.mjs +0 -19
- package/esm2022/model/trackpoint.mjs +0 -11
- package/esm2022/model/translations.mjs +0 -11
- package/esm2022/model/transport.mjs +0 -2
- package/esm2022/model/transportCapacityMultiplier.mjs +0 -2
- package/esm2022/model/transportCompatibilities.mjs +0 -2
- package/esm2022/model/transportLimits.mjs +0 -2
- package/esm2022/model/transportLoad.mjs +0 -2
- package/esm2022/model/transportShift.mjs +0 -2
- package/esm2022/model/transportSpeedMultiplier.mjs +0 -2
- package/esm2022/model/transportTariff.mjs +0 -2
- package/esm2022/model/transportTariffConstraint.mjs +0 -11
- package/esm2022/model/transportType.mjs +0 -32
- package/esm2022/model/trip.mjs +0 -2
- package/esm2022/model/tripAssumptions.mjs +0 -2
- package/esm2022/model/tripExpectations.mjs +0 -2
- package/esm2022/model/tripPenalties.mjs +0 -2
- package/esm2022/model/tripStartTimeStrategy.mjs +0 -18
- package/esm2022/model/tripState.mjs +0 -2
- package/esm2022/model/tripStateFlag.mjs +0 -30
- package/esm2022/model/tripStatistics.mjs +0 -2
- package/esm2022/model/tripStatus.mjs +0 -25
- package/esm2022/model/tripsSettings.mjs +0 -2
- package/esm2022/model/universal400WithErrorsAndWarnings.mjs +0 -2
- package/esm2022/model/universalData.mjs +0 -2
- package/esm2022/model/unplannedItems.mjs +0 -11
- package/esm2022/model/versionResult.mjs +0 -11
- package/esm2022/model/webFact.mjs +0 -2
- package/esm2022/model/webHardlink.mjs +0 -2
- package/esm2022/model/webLocation.mjs +0 -2
- package/esm2022/model/webLocationGeopoint.mjs +0 -2
- package/esm2022/model/webLocationGeopointList.mjs +0 -2
- package/esm2022/model/webOrder.mjs +0 -2
- package/esm2022/model/webOrderGeopoint.mjs +0 -2
- package/esm2022/model/webOrderGeopointList.mjs +0 -2
- package/esm2022/model/webPerformer.mjs +0 -2
- package/esm2022/model/webPerformerGeopoint.mjs +0 -7
- package/esm2022/model/webPerformerGeopointList.mjs +0 -2
- package/esm2022/model/webTransport.mjs +0 -2
- package/esm2022/model/webTransportGeopoint.mjs +0 -7
- package/esm2022/model/webTransportGeopointList.mjs +0 -2
- package/esm2022/model/webTrip.mjs +0 -2
- package/esm2022/model/webTripChart.mjs +0 -2
- package/esm2022/model/webTripChartDemand.mjs +0 -2
- package/esm2022/model/webTripChartList.mjs +0 -2
- package/esm2022/model/workAndRestRules.mjs +0 -2
- package/esm2022/param.mjs +0 -2
- package/esm2022/provide-api.mjs +0 -15
- package/esm2022/variables.mjs +0 -9
- package/esm2022/veeroute-lss-studio-angular.mjs +0 -5
- package/index.d.ts +0 -7
- package/model/actualizeSettings.d.ts +0 -23
- package/model/assignedPerformer.d.ts +0 -25
- package/model/assignedTransport.d.ts +0 -25
- package/model/attribute.d.ts +0 -23
- package/model/basicProcess.d.ts +0 -17
- package/model/basicState.d.ts +0 -18
- package/model/box.d.ts +0 -30
- package/model/boxCompatibilities.d.ts +0 -31
- package/model/boxLimits.d.ts +0 -17
- package/model/break.d.ts +0 -27
- package/model/breakRules.d.ts +0 -29
- package/model/calculationHistoryElement.d.ts +0 -21
- package/model/calculationInfo.d.ts +0 -49
- package/model/calculationSettings.d.ts +0 -39
- package/model/calculationState.d.ts +0 -23
- package/model/calculationStatus.d.ts +0 -22
- package/model/capacity.d.ts +0 -35
- package/model/capacityCost.d.ts +0 -35
- package/model/capacityLimit.d.ts +0 -35
- package/model/capacityMultiplier.d.ts +0 -35
- package/model/capacityStatisticsLoad.d.ts +0 -35
- package/model/capacityStatisticsRatio.d.ts +0 -35
- package/model/capacityStatisticsSum.d.ts +0 -35
- package/model/cargo.d.ts +0 -34
- package/model/cargoAction.d.ts +0 -25
- package/model/cargoActionType.d.ts +0 -16
- package/model/cargoCompatibilities.d.ts +0 -44
- package/model/cargoInvoice.d.ts +0 -30
- package/model/cargoInvoiceDetail.d.ts +0 -55
- package/model/cargoInvoiceHonestSign.d.ts +0 -23
- package/model/cargoInvoiceReceipt.d.ts +0 -27
- package/model/cargoInvoiceTax.d.ts +0 -26
- package/model/cargoRotationType.d.ts +0 -18
- package/model/checkResult.d.ts +0 -19
- package/model/compatibilityPenalty.d.ts +0 -23
- package/model/customfieldConvertRule.d.ts +0 -25
- package/model/customfieldEntityType.d.ts +0 -26
- package/model/customfieldsSettings.d.ts +0 -20
- package/model/demand.d.ts +0 -47
- package/model/demandExtraDuration.d.ts +0 -23
- package/model/demandType.d.ts +0 -19
- package/model/entityError.d.ts +0 -26
- package/model/entityErrorType.d.ts +0 -34
- package/model/entityPath.d.ts +0 -22
- package/model/entityType.d.ts +0 -42
- package/model/entityWarning.d.ts +0 -26
- package/model/entityWarningType.d.ts +0 -56
- package/model/experiment.d.ts +0 -49
- package/model/experimentCheck.d.ts +0 -25
- package/model/experimentList.d.ts +0 -22
- package/model/experimentNeighbors.d.ts +0 -23
- package/model/experimentSettings.d.ts +0 -21
- package/model/experimentStatistics.d.ts +0 -31
- package/model/extensionSettings.d.ts +0 -35
- package/model/fact.d.ts +0 -58
- package/model/factEssences.d.ts +0 -20
- package/model/factStatus.d.ts +0 -17
- package/model/factType.d.ts +0 -23
- package/model/featureLifetime.d.ts +0 -24
- package/model/fileNamePath.d.ts +0 -23
- package/model/fileSpecification.d.ts +0 -27
- package/model/filesystem.d.ts +0 -23
- package/model/filesystemColumnType.d.ts +0 -21
- package/model/filesystemCounters.d.ts +0 -24
- package/model/filesystemPath.d.ts +0 -20
- package/model/folder.d.ts +0 -60
- package/model/folderCounters.d.ts +0 -23
- package/model/folderSpecification.d.ts +0 -40
- package/model/folderType.d.ts +0 -16
- package/model/general400.d.ts +0 -26
- package/model/general402.d.ts +0 -21
- package/model/general403.d.ts +0 -21
- package/model/general404.d.ts +0 -21
- package/model/general404Detail.d.ts +0 -17
- package/model/general429.d.ts +0 -21
- package/model/general500.d.ts +0 -21
- package/model/generalStatistics.d.ts +0 -96
- package/model/geoSettings.d.ts +0 -40
- package/model/geopoint.d.ts +0 -23
- package/model/hardlink.d.ts +0 -29
- package/model/hardlinkElement.d.ts +0 -21
- package/model/hardlinkElementType.d.ts +0 -17
- package/model/importSample.d.ts +0 -16
- package/model/importSource.d.ts +0 -16
- package/model/linkedEssence.d.ts +0 -34
- package/model/loadStatistics.d.ts +0 -28
- package/model/location.d.ts +0 -49
- package/model/locationCargosLimit.d.ts +0 -25
- package/model/locationCompatibilities.d.ts +0 -19
- package/model/locationLimit.d.ts +0 -42
- package/model/locationLimitStatistics.d.ts +0 -33
- package/model/locationStatistics.d.ts +0 -40
- package/model/locationTimetableElement.d.ts +0 -25
- package/model/locationTransportsLimit.d.ts +0 -23
- package/model/measurements.d.ts +0 -53
- package/model/models.d.ts +0 -260
- package/model/order.d.ts +0 -40
- package/model/orderCompatibilities.d.ts +0 -31
- package/model/performer.d.ts +0 -42
- package/model/performerCompatibilities.d.ts +0 -28
- package/model/performerLimits.d.ts +0 -24
- package/model/performerShift.d.ts +0 -57
- package/model/performerTariff.d.ts +0 -28
- package/model/performerTariffConstraint.d.ts +0 -23
- package/model/planSettings.d.ts +0 -23
- package/model/planStatistics.d.ts +0 -31
- package/model/possibleEvent.d.ts +0 -42
- package/model/quality.d.ts +0 -28
- package/model/removedItems.d.ts +0 -63
- package/model/replanSettings.d.ts +0 -17
- package/model/replanStrategy.d.ts +0 -27
- package/model/rest.d.ts +0 -27
- package/model/restRules.d.ts +0 -20
- package/model/roundtripStatistics.d.ts +0 -24
- package/model/routingMatrix.d.ts +0 -28
- package/model/routingMatrixWaypoint.d.ts +0 -21
- package/model/routingTransportMatrix.d.ts +0 -19
- package/model/schemaError.d.ts +0 -23
- package/model/service.d.ts +0 -24
- package/model/settingsKeyList.d.ts +0 -23
- package/model/stopDemand.d.ts +0 -28
- package/model/stopStatistics.d.ts +0 -60
- package/model/tableCustomfields.d.ts +0 -255
- package/model/tableCustomfieldsColumnType.d.ts +0 -74
- package/model/tableDataStats.d.ts +0 -47
- package/model/tableExperimentColumnType.d.ts +0 -19
- package/model/tableFact.d.ts +0 -21
- package/model/tableFactColumnType.d.ts +0 -25
- package/model/tableFactFields.d.ts +0 -68
- package/model/tableFactFilter.d.ts +0 -37
- package/model/tableFactFilterList.d.ts +0 -20
- package/model/tableFactList.d.ts +0 -22
- package/model/tableFactMetrics.d.ts +0 -26
- package/model/tableFactMetricsFilterList.d.ts +0 -24
- package/model/tableFilterBoolList.d.ts +0 -19
- package/model/tableFilterDatetimeRange.d.ts +0 -23
- package/model/tableFilterDurationRange.d.ts +0 -23
- package/model/tableFilterEnumList.d.ts +0 -19
- package/model/tableFilterFloatRange.d.ts +0 -23
- package/model/tableFilterIntRange.d.ts +0 -23
- package/model/tableFilterStringList.d.ts +0 -23
- package/model/tableFilterStringSearch.d.ts +0 -23
- package/model/tableFilterType.d.ts +0 -22
- package/model/tableHardlink.d.ts +0 -21
- package/model/tableHardlinkColumnType.d.ts +0 -22
- package/model/tableHardlinkFields.d.ts +0 -57
- package/model/tableHardlinkFilter.d.ts +0 -37
- package/model/tableHardlinkFilterList.d.ts +0 -20
- package/model/tableHardlinkList.d.ts +0 -22
- package/model/tableHardlinkMetrics.d.ts +0 -26
- package/model/tableHardlinkMetricsFilterList.d.ts +0 -24
- package/model/tableListCounters.d.ts +0 -24
- package/model/tableListCountersDetail.d.ts +0 -19
- package/model/tableLocation.d.ts +0 -21
- package/model/tableLocationColumnType.d.ts +0 -21
- package/model/tableLocationFields.d.ts +0 -47
- package/model/tableLocationFilter.d.ts +0 -37
- package/model/tableLocationFilterList.d.ts +0 -20
- package/model/tableLocationList.d.ts +0 -22
- package/model/tableLocationMetrics.d.ts +0 -26
- package/model/tableLocationMetricsFilterList.d.ts +0 -24
- package/model/tableOrder.d.ts +0 -21
- package/model/tableOrderColumnType.d.ts +0 -47
- package/model/tableOrderFields.d.ts +0 -137
- package/model/tableOrderFilter.d.ts +0 -37
- package/model/tableOrderFilterList.d.ts +0 -20
- package/model/tableOrderList.d.ts +0 -22
- package/model/tableOrderMetrics.d.ts +0 -26
- package/model/tableOrderMetricsFilterList.d.ts +0 -24
- package/model/tablePerformer.d.ts +0 -21
- package/model/tablePerformerColumnType.d.ts +0 -29
- package/model/tablePerformerFields.d.ts +0 -76
- package/model/tablePerformerFilter.d.ts +0 -37
- package/model/tablePerformerFilterList.d.ts +0 -20
- package/model/tablePerformerList.d.ts +0 -22
- package/model/tablePerformerMetrics.d.ts +0 -26
- package/model/tablePerformerMetricsFilterList.d.ts +0 -24
- package/model/tableRoundtrip.d.ts +0 -21
- package/model/tableRoundtripColumnType.d.ts +0 -49
- package/model/tableRoundtripFields.d.ts +0 -159
- package/model/tableRoundtripFilter.d.ts +0 -37
- package/model/tableRoundtripFilterList.d.ts +0 -20
- package/model/tableRoundtripList.d.ts +0 -22
- package/model/tableRoundtripMetrics.d.ts +0 -26
- package/model/tableRoundtripMetricsFilterList.d.ts +0 -24
- package/model/tableTransport.d.ts +0 -21
- package/model/tableTransportColumnType.d.ts +0 -35
- package/model/tableTransportFields.d.ts +0 -101
- package/model/tableTransportFilter.d.ts +0 -37
- package/model/tableTransportFilterList.d.ts +0 -20
- package/model/tableTransportList.d.ts +0 -22
- package/model/tableTransportMetrics.d.ts +0 -26
- package/model/tableTransportMetricsFilterList.d.ts +0 -24
- package/model/tableTrip.d.ts +0 -21
- package/model/tableTripColumnType.d.ts +0 -51
- package/model/tableTripFields.d.ts +0 -165
- package/model/tableTripFilter.d.ts +0 -37
- package/model/tableTripFilterList.d.ts +0 -20
- package/model/tableTripList.d.ts +0 -22
- package/model/tableTripMetrics.d.ts +0 -26
- package/model/tableTripMetricsFilterList.d.ts +0 -24
- package/model/tableTripStop.d.ts +0 -21
- package/model/tableTripStopColumnType.d.ts +0 -31
- package/model/tableTripStopFields.d.ts +0 -90
- package/model/tableTripStopFilter.d.ts +0 -37
- package/model/tableTripStopFilterList.d.ts +0 -20
- package/model/tableTripStopList.d.ts +0 -22
- package/model/taskStatistics.d.ts +0 -20
- package/model/timeWindow.d.ts +0 -23
- package/model/timeWindowViolationDetail.d.ts +0 -23
- package/model/timeWindowViolations.d.ts +0 -24
- package/model/tracedata.d.ts +0 -49
- package/model/track.d.ts +0 -44
- package/model/trackList.d.ts +0 -22
- package/model/trackListCustom.d.ts +0 -20
- package/model/trackType.d.ts +0 -17
- package/model/trackpoint.d.ts +0 -27
- package/model/translations.d.ts +0 -23
- package/model/transport.d.ts +0 -44
- package/model/transportCapacityMultiplier.d.ts +0 -19
- package/model/transportCompatibilities.d.ts +0 -28
- package/model/transportLimits.d.ts +0 -21
- package/model/transportLoad.d.ts +0 -21
- package/model/transportShift.d.ts +0 -43
- package/model/transportSpeedMultiplier.d.ts +0 -21
- package/model/transportTariff.d.ts +0 -26
- package/model/transportTariffConstraint.d.ts +0 -23
- package/model/transportType.d.ts +0 -30
- package/model/trip.d.ts +0 -41
- package/model/tripAssumptions.d.ts +0 -45
- package/model/tripExpectations.d.ts +0 -26
- package/model/tripPenalties.d.ts +0 -24
- package/model/tripStartTimeStrategy.d.ts +0 -16
- package/model/tripState.d.ts +0 -66
- package/model/tripStateFlag.d.ts +0 -28
- package/model/tripStatistics.d.ts +0 -41
- package/model/tripStatus.d.ts +0 -23
- package/model/tripsSettings.d.ts +0 -25
- package/model/universal400WithErrorsAndWarnings.d.ts +0 -36
- package/model/universalData.d.ts +0 -67
- package/model/unplannedItems.d.ts +0 -47
- package/model/versionResult.d.ts +0 -27
- package/model/webFact.d.ts +0 -24
- package/model/webHardlink.d.ts +0 -24
- package/model/webLocation.d.ts +0 -26
- package/model/webLocationGeopoint.d.ts +0 -33
- package/model/webLocationGeopointList.d.ts +0 -30
- package/model/webOrder.d.ts +0 -24
- package/model/webOrderGeopoint.d.ts +0 -43
- package/model/webOrderGeopointList.d.ts +0 -30
- package/model/webPerformer.d.ts +0 -24
- package/model/webPerformerGeopoint.d.ts +0 -45
- package/model/webPerformerGeopointList.d.ts +0 -30
- package/model/webTransport.d.ts +0 -24
- package/model/webTransportGeopoint.d.ts +0 -45
- package/model/webTransportGeopointList.d.ts +0 -30
- package/model/webTrip.d.ts +0 -26
- package/model/webTripChart.d.ts +0 -22
- package/model/webTripChartDemand.d.ts +0 -21
- package/model/webTripChartList.d.ts +0 -22
- package/model/workAndRestRules.d.ts +0 -27
- package/param.d.ts +0 -37
- package/provide-api.d.ts +0 -3
- package/variables.d.ts +0 -8
|
@@ -1,509 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* VRt.Studio [ST]
|
|
3
|
-
*
|
|
4
|
-
* The version of the OpenAPI document: 7.33.3222
|
|
5
|
-
* Contact: support@veeroute.com
|
|
6
|
-
*
|
|
7
|
-
* NOTE: This class is auto generated by OpenAPI Generator.
|
|
8
|
-
* Do not edit the class manually.
|
|
9
|
-
*/
|
|
10
|
-
/* tslint:disable:no-unused-variable member-ordering */
|
|
11
|
-
import { Inject, Injectable, Optional } from '@angular/core';
|
|
12
|
-
import { HttpParams, HttpContext } from '@angular/common/http';
|
|
13
|
-
// @ts-ignore
|
|
14
|
-
import { BASE_PATH } from '../variables';
|
|
15
|
-
import { BaseService } from '../api.base.service';
|
|
16
|
-
import * as i0 from "@angular/core";
|
|
17
|
-
import * as i1 from "@angular/common/http";
|
|
18
|
-
import * as i2 from "../configuration";
|
|
19
|
-
export class FactsService extends BaseService {
|
|
20
|
-
httpClient;
|
|
21
|
-
constructor(httpClient, basePath, configuration) {
|
|
22
|
-
super(basePath, configuration);
|
|
23
|
-
this.httpClient = httpClient;
|
|
24
|
-
}
|
|
25
|
-
createFact(requestParameters, observe = 'body', reportProgress = false, options) {
|
|
26
|
-
const fileKey = requestParameters?.fileKey;
|
|
27
|
-
if (fileKey === null || fileKey === undefined) {
|
|
28
|
-
throw new Error('Required parameter fileKey was null or undefined when calling createFact.');
|
|
29
|
-
}
|
|
30
|
-
const factStudio = requestParameters?.factStudio;
|
|
31
|
-
if (factStudio === null || factStudio === undefined) {
|
|
32
|
-
throw new Error('Required parameter factStudio was null or undefined when calling createFact.');
|
|
33
|
-
}
|
|
34
|
-
let localVarHeaders = this.defaultHeaders;
|
|
35
|
-
// authentication (ApiKeyAuth) required
|
|
36
|
-
localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
|
|
37
|
-
const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
|
|
38
|
-
'application/json'
|
|
39
|
-
]);
|
|
40
|
-
if (localVarHttpHeaderAcceptSelected !== undefined) {
|
|
41
|
-
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
|
|
42
|
-
}
|
|
43
|
-
const localVarHttpContext = options?.context ?? new HttpContext();
|
|
44
|
-
const localVarTransferCache = options?.transferCache ?? true;
|
|
45
|
-
// to determine the Content-Type header
|
|
46
|
-
const consumes = [
|
|
47
|
-
'application/json'
|
|
48
|
-
];
|
|
49
|
-
const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
|
|
50
|
-
if (httpContentTypeSelected !== undefined) {
|
|
51
|
-
localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
|
|
52
|
-
}
|
|
53
|
-
let responseType_ = 'json';
|
|
54
|
-
if (localVarHttpHeaderAcceptSelected) {
|
|
55
|
-
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
|
|
56
|
-
responseType_ = 'text';
|
|
57
|
-
}
|
|
58
|
-
else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
|
|
59
|
-
responseType_ = 'json';
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
responseType_ = 'blob';
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/facts`;
|
|
66
|
-
const { basePath, withCredentials } = this.configuration;
|
|
67
|
-
return this.httpClient.request('post', `${basePath}${localVarPath}`, {
|
|
68
|
-
context: localVarHttpContext,
|
|
69
|
-
body: factStudio,
|
|
70
|
-
responseType: responseType_,
|
|
71
|
-
...(withCredentials ? { withCredentials } : {}),
|
|
72
|
-
headers: localVarHeaders,
|
|
73
|
-
observe: observe,
|
|
74
|
-
transferCache: localVarTransferCache,
|
|
75
|
-
reportProgress: reportProgress
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
deleteFact(requestParameters, observe = 'body', reportProgress = false, options) {
|
|
79
|
-
const fileKey = requestParameters?.fileKey;
|
|
80
|
-
if (fileKey === null || fileKey === undefined) {
|
|
81
|
-
throw new Error('Required parameter fileKey was null or undefined when calling deleteFact.');
|
|
82
|
-
}
|
|
83
|
-
const essenceKey = requestParameters?.essenceKey;
|
|
84
|
-
if (essenceKey === null || essenceKey === undefined) {
|
|
85
|
-
throw new Error('Required parameter essenceKey was null or undefined when calling deleteFact.');
|
|
86
|
-
}
|
|
87
|
-
let localVarHeaders = this.defaultHeaders;
|
|
88
|
-
// authentication (ApiKeyAuth) required
|
|
89
|
-
localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
|
|
90
|
-
const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
|
|
91
|
-
'application/json'
|
|
92
|
-
]);
|
|
93
|
-
if (localVarHttpHeaderAcceptSelected !== undefined) {
|
|
94
|
-
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
|
|
95
|
-
}
|
|
96
|
-
const localVarHttpContext = options?.context ?? new HttpContext();
|
|
97
|
-
const localVarTransferCache = options?.transferCache ?? true;
|
|
98
|
-
let responseType_ = 'json';
|
|
99
|
-
if (localVarHttpHeaderAcceptSelected) {
|
|
100
|
-
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
|
|
101
|
-
responseType_ = 'text';
|
|
102
|
-
}
|
|
103
|
-
else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
|
|
104
|
-
responseType_ = 'json';
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
responseType_ = 'blob';
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/facts/${this.configuration.encodeParam({ name: "essenceKey", value: essenceKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined })}`;
|
|
111
|
-
const { basePath, withCredentials } = this.configuration;
|
|
112
|
-
return this.httpClient.request('delete', `${basePath}${localVarPath}`, {
|
|
113
|
-
context: localVarHttpContext,
|
|
114
|
-
responseType: responseType_,
|
|
115
|
-
...(withCredentials ? { withCredentials } : {}),
|
|
116
|
-
headers: localVarHeaders,
|
|
117
|
-
observe: observe,
|
|
118
|
-
transferCache: localVarTransferCache,
|
|
119
|
-
reportProgress: reportProgress
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
deleteFactsBatch(requestParameters, observe = 'body', reportProgress = false, options) {
|
|
123
|
-
const fileKey = requestParameters?.fileKey;
|
|
124
|
-
if (fileKey === null || fileKey === undefined) {
|
|
125
|
-
throw new Error('Required parameter fileKey was null or undefined when calling deleteFactsBatch.');
|
|
126
|
-
}
|
|
127
|
-
const requestBody = requestParameters?.requestBody;
|
|
128
|
-
if (requestBody === null || requestBody === undefined) {
|
|
129
|
-
throw new Error('Required parameter requestBody was null or undefined when calling deleteFactsBatch.');
|
|
130
|
-
}
|
|
131
|
-
let localVarHeaders = this.defaultHeaders;
|
|
132
|
-
// authentication (ApiKeyAuth) required
|
|
133
|
-
localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
|
|
134
|
-
const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
|
|
135
|
-
'application/json'
|
|
136
|
-
]);
|
|
137
|
-
if (localVarHttpHeaderAcceptSelected !== undefined) {
|
|
138
|
-
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
|
|
139
|
-
}
|
|
140
|
-
const localVarHttpContext = options?.context ?? new HttpContext();
|
|
141
|
-
const localVarTransferCache = options?.transferCache ?? true;
|
|
142
|
-
// to determine the Content-Type header
|
|
143
|
-
const consumes = [
|
|
144
|
-
'application/json'
|
|
145
|
-
];
|
|
146
|
-
const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
|
|
147
|
-
if (httpContentTypeSelected !== undefined) {
|
|
148
|
-
localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
|
|
149
|
-
}
|
|
150
|
-
let responseType_ = 'json';
|
|
151
|
-
if (localVarHttpHeaderAcceptSelected) {
|
|
152
|
-
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
|
|
153
|
-
responseType_ = 'text';
|
|
154
|
-
}
|
|
155
|
-
else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
|
|
156
|
-
responseType_ = 'json';
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
responseType_ = 'blob';
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/facts/batch/table`;
|
|
163
|
-
const { basePath, withCredentials } = this.configuration;
|
|
164
|
-
return this.httpClient.request('delete', `${basePath}${localVarPath}`, {
|
|
165
|
-
context: localVarHttpContext,
|
|
166
|
-
body: requestBody,
|
|
167
|
-
responseType: responseType_,
|
|
168
|
-
...(withCredentials ? { withCredentials } : {}),
|
|
169
|
-
headers: localVarHeaders,
|
|
170
|
-
observe: observe,
|
|
171
|
-
transferCache: localVarTransferCache,
|
|
172
|
-
reportProgress: reportProgress
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
disableFactsBatch(requestParameters, observe = 'body', reportProgress = false, options) {
|
|
176
|
-
const fileKey = requestParameters?.fileKey;
|
|
177
|
-
if (fileKey === null || fileKey === undefined) {
|
|
178
|
-
throw new Error('Required parameter fileKey was null or undefined when calling disableFactsBatch.');
|
|
179
|
-
}
|
|
180
|
-
const requestBody = requestParameters?.requestBody;
|
|
181
|
-
if (requestBody === null || requestBody === undefined) {
|
|
182
|
-
throw new Error('Required parameter requestBody was null or undefined when calling disableFactsBatch.');
|
|
183
|
-
}
|
|
184
|
-
let localVarHeaders = this.defaultHeaders;
|
|
185
|
-
// authentication (ApiKeyAuth) required
|
|
186
|
-
localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
|
|
187
|
-
const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
|
|
188
|
-
'application/json'
|
|
189
|
-
]);
|
|
190
|
-
if (localVarHttpHeaderAcceptSelected !== undefined) {
|
|
191
|
-
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
|
|
192
|
-
}
|
|
193
|
-
const localVarHttpContext = options?.context ?? new HttpContext();
|
|
194
|
-
const localVarTransferCache = options?.transferCache ?? true;
|
|
195
|
-
// to determine the Content-Type header
|
|
196
|
-
const consumes = [
|
|
197
|
-
'application/json'
|
|
198
|
-
];
|
|
199
|
-
const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
|
|
200
|
-
if (httpContentTypeSelected !== undefined) {
|
|
201
|
-
localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
|
|
202
|
-
}
|
|
203
|
-
let responseType_ = 'json';
|
|
204
|
-
if (localVarHttpHeaderAcceptSelected) {
|
|
205
|
-
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
|
|
206
|
-
responseType_ = 'text';
|
|
207
|
-
}
|
|
208
|
-
else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
|
|
209
|
-
responseType_ = 'json';
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
responseType_ = 'blob';
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/facts/batch/ability`;
|
|
216
|
-
const { basePath, withCredentials } = this.configuration;
|
|
217
|
-
return this.httpClient.request('delete', `${basePath}${localVarPath}`, {
|
|
218
|
-
context: localVarHttpContext,
|
|
219
|
-
body: requestBody,
|
|
220
|
-
responseType: responseType_,
|
|
221
|
-
...(withCredentials ? { withCredentials } : {}),
|
|
222
|
-
headers: localVarHeaders,
|
|
223
|
-
observe: observe,
|
|
224
|
-
transferCache: localVarTransferCache,
|
|
225
|
-
reportProgress: reportProgress
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
enableFactsBatch(requestParameters, observe = 'body', reportProgress = false, options) {
|
|
229
|
-
const fileKey = requestParameters?.fileKey;
|
|
230
|
-
if (fileKey === null || fileKey === undefined) {
|
|
231
|
-
throw new Error('Required parameter fileKey was null or undefined when calling enableFactsBatch.');
|
|
232
|
-
}
|
|
233
|
-
const requestBody = requestParameters?.requestBody;
|
|
234
|
-
if (requestBody === null || requestBody === undefined) {
|
|
235
|
-
throw new Error('Required parameter requestBody was null or undefined when calling enableFactsBatch.');
|
|
236
|
-
}
|
|
237
|
-
let localVarHeaders = this.defaultHeaders;
|
|
238
|
-
// authentication (ApiKeyAuth) required
|
|
239
|
-
localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
|
|
240
|
-
const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
|
|
241
|
-
'application/json'
|
|
242
|
-
]);
|
|
243
|
-
if (localVarHttpHeaderAcceptSelected !== undefined) {
|
|
244
|
-
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
|
|
245
|
-
}
|
|
246
|
-
const localVarHttpContext = options?.context ?? new HttpContext();
|
|
247
|
-
const localVarTransferCache = options?.transferCache ?? true;
|
|
248
|
-
// to determine the Content-Type header
|
|
249
|
-
const consumes = [
|
|
250
|
-
'application/json'
|
|
251
|
-
];
|
|
252
|
-
const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
|
|
253
|
-
if (httpContentTypeSelected !== undefined) {
|
|
254
|
-
localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
|
|
255
|
-
}
|
|
256
|
-
let responseType_ = 'json';
|
|
257
|
-
if (localVarHttpHeaderAcceptSelected) {
|
|
258
|
-
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
|
|
259
|
-
responseType_ = 'text';
|
|
260
|
-
}
|
|
261
|
-
else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
|
|
262
|
-
responseType_ = 'json';
|
|
263
|
-
}
|
|
264
|
-
else {
|
|
265
|
-
responseType_ = 'blob';
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/facts/batch/ability`;
|
|
269
|
-
const { basePath, withCredentials } = this.configuration;
|
|
270
|
-
return this.httpClient.request('put', `${basePath}${localVarPath}`, {
|
|
271
|
-
context: localVarHttpContext,
|
|
272
|
-
body: requestBody,
|
|
273
|
-
responseType: responseType_,
|
|
274
|
-
...(withCredentials ? { withCredentials } : {}),
|
|
275
|
-
headers: localVarHeaders,
|
|
276
|
-
observe: observe,
|
|
277
|
-
transferCache: localVarTransferCache,
|
|
278
|
-
reportProgress: reportProgress
|
|
279
|
-
});
|
|
280
|
-
}
|
|
281
|
-
readFact(requestParameters, observe = 'body', reportProgress = false, options) {
|
|
282
|
-
const fileKey = requestParameters?.fileKey;
|
|
283
|
-
if (fileKey === null || fileKey === undefined) {
|
|
284
|
-
throw new Error('Required parameter fileKey was null or undefined when calling readFact.');
|
|
285
|
-
}
|
|
286
|
-
const essenceKey = requestParameters?.essenceKey;
|
|
287
|
-
if (essenceKey === null || essenceKey === undefined) {
|
|
288
|
-
throw new Error('Required parameter essenceKey was null or undefined when calling readFact.');
|
|
289
|
-
}
|
|
290
|
-
let localVarHeaders = this.defaultHeaders;
|
|
291
|
-
// authentication (ApiKeyAuth) required
|
|
292
|
-
localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
|
|
293
|
-
const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
|
|
294
|
-
'application/json'
|
|
295
|
-
]);
|
|
296
|
-
if (localVarHttpHeaderAcceptSelected !== undefined) {
|
|
297
|
-
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
|
|
298
|
-
}
|
|
299
|
-
const localVarHttpContext = options?.context ?? new HttpContext();
|
|
300
|
-
const localVarTransferCache = options?.transferCache ?? true;
|
|
301
|
-
let responseType_ = 'json';
|
|
302
|
-
if (localVarHttpHeaderAcceptSelected) {
|
|
303
|
-
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
|
|
304
|
-
responseType_ = 'text';
|
|
305
|
-
}
|
|
306
|
-
else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
|
|
307
|
-
responseType_ = 'json';
|
|
308
|
-
}
|
|
309
|
-
else {
|
|
310
|
-
responseType_ = 'blob';
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/facts/${this.configuration.encodeParam({ name: "essenceKey", value: essenceKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined })}`;
|
|
314
|
-
const { basePath, withCredentials } = this.configuration;
|
|
315
|
-
return this.httpClient.request('get', `${basePath}${localVarPath}`, {
|
|
316
|
-
context: localVarHttpContext,
|
|
317
|
-
responseType: responseType_,
|
|
318
|
-
...(withCredentials ? { withCredentials } : {}),
|
|
319
|
-
headers: localVarHeaders,
|
|
320
|
-
observe: observe,
|
|
321
|
-
transferCache: localVarTransferCache,
|
|
322
|
-
reportProgress: reportProgress
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
readFactsMetrics(requestParameters, observe = 'body', reportProgress = false, options) {
|
|
326
|
-
const fileKey = requestParameters?.fileKey;
|
|
327
|
-
if (fileKey === null || fileKey === undefined) {
|
|
328
|
-
throw new Error('Required parameter fileKey was null or undefined when calling readFactsMetrics.');
|
|
329
|
-
}
|
|
330
|
-
const tableFactMetricsFilterListStudio = requestParameters?.tableFactMetricsFilterListStudio;
|
|
331
|
-
if (tableFactMetricsFilterListStudio === null || tableFactMetricsFilterListStudio === undefined) {
|
|
332
|
-
throw new Error('Required parameter tableFactMetricsFilterListStudio was null or undefined when calling readFactsMetrics.');
|
|
333
|
-
}
|
|
334
|
-
let localVarHeaders = this.defaultHeaders;
|
|
335
|
-
// authentication (ApiKeyAuth) required
|
|
336
|
-
localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
|
|
337
|
-
const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
|
|
338
|
-
'application/json'
|
|
339
|
-
]);
|
|
340
|
-
if (localVarHttpHeaderAcceptSelected !== undefined) {
|
|
341
|
-
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
|
|
342
|
-
}
|
|
343
|
-
const localVarHttpContext = options?.context ?? new HttpContext();
|
|
344
|
-
const localVarTransferCache = options?.transferCache ?? true;
|
|
345
|
-
// to determine the Content-Type header
|
|
346
|
-
const consumes = [
|
|
347
|
-
'application/json'
|
|
348
|
-
];
|
|
349
|
-
const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
|
|
350
|
-
if (httpContentTypeSelected !== undefined) {
|
|
351
|
-
localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
|
|
352
|
-
}
|
|
353
|
-
let responseType_ = 'json';
|
|
354
|
-
if (localVarHttpHeaderAcceptSelected) {
|
|
355
|
-
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
|
|
356
|
-
responseType_ = 'text';
|
|
357
|
-
}
|
|
358
|
-
else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
|
|
359
|
-
responseType_ = 'json';
|
|
360
|
-
}
|
|
361
|
-
else {
|
|
362
|
-
responseType_ = 'blob';
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/facts/batch/metrics`;
|
|
366
|
-
const { basePath, withCredentials } = this.configuration;
|
|
367
|
-
return this.httpClient.request('post', `${basePath}${localVarPath}`, {
|
|
368
|
-
context: localVarHttpContext,
|
|
369
|
-
body: tableFactMetricsFilterListStudio,
|
|
370
|
-
responseType: responseType_,
|
|
371
|
-
...(withCredentials ? { withCredentials } : {}),
|
|
372
|
-
headers: localVarHeaders,
|
|
373
|
-
observe: observe,
|
|
374
|
-
transferCache: localVarTransferCache,
|
|
375
|
-
reportProgress: reportProgress
|
|
376
|
-
});
|
|
377
|
-
}
|
|
378
|
-
readFactsTable(requestParameters, observe = 'body', reportProgress = false, options) {
|
|
379
|
-
const fileKey = requestParameters?.fileKey;
|
|
380
|
-
if (fileKey === null || fileKey === undefined) {
|
|
381
|
-
throw new Error('Required parameter fileKey was null or undefined when calling readFactsTable.');
|
|
382
|
-
}
|
|
383
|
-
const offset = requestParameters?.offset;
|
|
384
|
-
const limit = requestParameters?.limit;
|
|
385
|
-
const sortField = requestParameters?.sortField;
|
|
386
|
-
const sortCustomfield = requestParameters?.sortCustomfield;
|
|
387
|
-
const sortDirection = requestParameters?.sortDirection;
|
|
388
|
-
const tableFactFilterListStudio = requestParameters?.tableFactFilterListStudio;
|
|
389
|
-
let localVarQueryParameters = new HttpParams({ encoder: this.encoder });
|
|
390
|
-
localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, offset, 'offset');
|
|
391
|
-
localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, limit, 'limit');
|
|
392
|
-
localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, sortField, 'sort_field');
|
|
393
|
-
localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, sortCustomfield, 'sort_customfield');
|
|
394
|
-
localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, sortDirection, 'sort_direction');
|
|
395
|
-
let localVarHeaders = this.defaultHeaders;
|
|
396
|
-
// authentication (ApiKeyAuth) required
|
|
397
|
-
localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
|
|
398
|
-
const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
|
|
399
|
-
'application/json'
|
|
400
|
-
]);
|
|
401
|
-
if (localVarHttpHeaderAcceptSelected !== undefined) {
|
|
402
|
-
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
|
|
403
|
-
}
|
|
404
|
-
const localVarHttpContext = options?.context ?? new HttpContext();
|
|
405
|
-
const localVarTransferCache = options?.transferCache ?? true;
|
|
406
|
-
// to determine the Content-Type header
|
|
407
|
-
const consumes = [
|
|
408
|
-
'application/json'
|
|
409
|
-
];
|
|
410
|
-
const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
|
|
411
|
-
if (httpContentTypeSelected !== undefined) {
|
|
412
|
-
localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
|
|
413
|
-
}
|
|
414
|
-
let responseType_ = 'json';
|
|
415
|
-
if (localVarHttpHeaderAcceptSelected) {
|
|
416
|
-
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
|
|
417
|
-
responseType_ = 'text';
|
|
418
|
-
}
|
|
419
|
-
else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
|
|
420
|
-
responseType_ = 'json';
|
|
421
|
-
}
|
|
422
|
-
else {
|
|
423
|
-
responseType_ = 'blob';
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/facts/batch/table`;
|
|
427
|
-
const { basePath, withCredentials } = this.configuration;
|
|
428
|
-
return this.httpClient.request('post', `${basePath}${localVarPath}`, {
|
|
429
|
-
context: localVarHttpContext,
|
|
430
|
-
body: tableFactFilterListStudio,
|
|
431
|
-
params: localVarQueryParameters,
|
|
432
|
-
responseType: responseType_,
|
|
433
|
-
...(withCredentials ? { withCredentials } : {}),
|
|
434
|
-
headers: localVarHeaders,
|
|
435
|
-
observe: observe,
|
|
436
|
-
transferCache: localVarTransferCache,
|
|
437
|
-
reportProgress: reportProgress
|
|
438
|
-
});
|
|
439
|
-
}
|
|
440
|
-
updateFact(requestParameters, observe = 'body', reportProgress = false, options) {
|
|
441
|
-
const fileKey = requestParameters?.fileKey;
|
|
442
|
-
if (fileKey === null || fileKey === undefined) {
|
|
443
|
-
throw new Error('Required parameter fileKey was null or undefined when calling updateFact.');
|
|
444
|
-
}
|
|
445
|
-
const factStudio = requestParameters?.factStudio;
|
|
446
|
-
if (factStudio === null || factStudio === undefined) {
|
|
447
|
-
throw new Error('Required parameter factStudio was null or undefined when calling updateFact.');
|
|
448
|
-
}
|
|
449
|
-
let localVarHeaders = this.defaultHeaders;
|
|
450
|
-
// authentication (ApiKeyAuth) required
|
|
451
|
-
localVarHeaders = this.configuration.addCredentialToHeaders('ApiKeyAuth', 'Authorization', localVarHeaders, 'Bearer ');
|
|
452
|
-
const localVarHttpHeaderAcceptSelected = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
|
|
453
|
-
'application/json'
|
|
454
|
-
]);
|
|
455
|
-
if (localVarHttpHeaderAcceptSelected !== undefined) {
|
|
456
|
-
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
|
|
457
|
-
}
|
|
458
|
-
const localVarHttpContext = options?.context ?? new HttpContext();
|
|
459
|
-
const localVarTransferCache = options?.transferCache ?? true;
|
|
460
|
-
// to determine the Content-Type header
|
|
461
|
-
const consumes = [
|
|
462
|
-
'application/json'
|
|
463
|
-
];
|
|
464
|
-
const httpContentTypeSelected = this.configuration.selectHeaderContentType(consumes);
|
|
465
|
-
if (httpContentTypeSelected !== undefined) {
|
|
466
|
-
localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
|
|
467
|
-
}
|
|
468
|
-
let responseType_ = 'json';
|
|
469
|
-
if (localVarHttpHeaderAcceptSelected) {
|
|
470
|
-
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
|
|
471
|
-
responseType_ = 'text';
|
|
472
|
-
}
|
|
473
|
-
else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
|
|
474
|
-
responseType_ = 'json';
|
|
475
|
-
}
|
|
476
|
-
else {
|
|
477
|
-
responseType_ = 'blob';
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
let localVarPath = `/studio/experiments/${this.configuration.encodeParam({ name: "fileKey", value: fileKey, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: "uuid" })}/facts`;
|
|
481
|
-
const { basePath, withCredentials } = this.configuration;
|
|
482
|
-
return this.httpClient.request('put', `${basePath}${localVarPath}`, {
|
|
483
|
-
context: localVarHttpContext,
|
|
484
|
-
body: factStudio,
|
|
485
|
-
responseType: responseType_,
|
|
486
|
-
...(withCredentials ? { withCredentials } : {}),
|
|
487
|
-
headers: localVarHeaders,
|
|
488
|
-
observe: observe,
|
|
489
|
-
transferCache: localVarTransferCache,
|
|
490
|
-
reportProgress: reportProgress
|
|
491
|
-
});
|
|
492
|
-
}
|
|
493
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FactsService, deps: [{ token: i1.HttpClient }, { token: BASE_PATH, optional: true }, { token: i2.Configuration, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
494
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FactsService, providedIn: 'root' });
|
|
495
|
-
}
|
|
496
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FactsService, decorators: [{
|
|
497
|
-
type: Injectable,
|
|
498
|
-
args: [{
|
|
499
|
-
providedIn: 'root'
|
|
500
|
-
}]
|
|
501
|
-
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{
|
|
502
|
-
type: Optional
|
|
503
|
-
}, {
|
|
504
|
-
type: Inject,
|
|
505
|
-
args: [BASE_PATH]
|
|
506
|
-
}] }, { type: i2.Configuration, decorators: [{
|
|
507
|
-
type: Optional
|
|
508
|
-
}] }] });
|
|
509
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdHNTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vYXBpL2ZhY3RzU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUNILHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBMkIsZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBMkIsVUFBVSxFQUNVLFdBQVcsRUFDeEQsTUFBWSxzQkFBc0IsQ0FBQztBQWlDNUMsYUFBYTtBQUNiLE9BQU8sRUFBRSxTQUFTLEVBQXNCLE1BQTBCLGNBQWMsQ0FBQztBQUVqRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7QUFtQmxELE1BQU0sT0FBTyxZQUFhLFNBQVEsV0FBVztJQUVuQjtJQUF0QixZQUFzQixVQUFzQixFQUFpQyxRQUF5QixFQUFjLGFBQTZCO1FBQzdJLEtBQUssQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFEYixlQUFVLEdBQVYsVUFBVSxDQUFZO0lBRTVDLENBQUM7SUFZTSxVQUFVLENBQUMsaUJBQTBDLEVBQUUsVUFBZSxNQUFNLEVBQUUsaUJBQTBCLEtBQUssRUFBRSxPQUFpRztRQUNuTixNQUFNLE9BQU8sR0FBRyxpQkFBaUIsRUFBRSxPQUFPLENBQUM7UUFDM0MsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLDJFQUEyRSxDQUFDLENBQUM7UUFDakcsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLGlCQUFpQixFQUFFLFVBQVUsQ0FBQztRQUNqRCxJQUFJLFVBQVUsS0FBSyxJQUFJLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2xELE1BQU0sSUFBSSxLQUFLLENBQUMsOEVBQThFLENBQUMsQ0FBQztRQUNwRyxDQUFDO1FBRUQsSUFB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aEIsWUFBWSxFQUFPLGFBQWE7WUFDaEMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQy9DLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLGFBQWEsRUFBRSxxQkFBcUI7WUFDcEMsY0FBYyxFQUFFLGNBQWM7U0FDakMsQ0FDSixDQUFDO0lBQ04sQ0FBQzt3R0FocEJRLFlBQVksNENBRTZDLFNBQVM7NEdBRmxFLFlBQVksY0FGWCxNQUFNOzs0RkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBR2tELFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsU0FBUzs7MEJBQThCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZSdC5TdHVkaW8gW1NUXVxuICpcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPcGVuQVBJIGRvY3VtZW50OiA3LjMzLjMyMjJcbiAqIENvbnRhY3Q6IHN1cHBvcnRAdmVlcm91dGUuY29tXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvci5cbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlIG1lbWJlci1vcmRlcmluZyAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gICAgICAgICAgICAgICAgICAgICAgZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyxcbiAgICAgICAgIEh0dHBSZXNwb25zZSwgSHR0cEV2ZW50LCBIdHRwUGFyYW1ldGVyQ29kZWMsIEh0dHBDb250ZXh0IFxuICAgICAgICB9ICAgICAgIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEN1c3RvbUh0dHBQYXJhbWV0ZXJDb2RlYyB9ICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi9lbmNvZGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdyeGpzJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgRmFjdFN0dWRpbyB9IGZyb20gJy4uL21vZGVsL2ZhY3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgR2VuZXJhbDQwMFN0dWRpbyB9IGZyb20gJy4uL21vZGVsL2dlbmVyYWw0MDAnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgR2VuZXJhbDQwMlN0dWRpbyB9IGZyb20gJy4uL21vZGVsL2dlbmVyYWw0MDInO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgR2VuZXJhbDQwM1N0dWRpbyB9IGZyb20gJy4uL21vZGVsL2dlbmVyYWw0MDMnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgR2VuZXJhbDQwNFN0dWRpbyB9IGZyb20gJy4uL21vZGVsL2dlbmVyYWw0MDQnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgR2VuZXJhbDQyOVN0dWRpbyB9IGZyb20gJy4uL21vZGVsL2dlbmVyYWw0MjknO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgR2VuZXJhbDUwMFN0dWRpbyB9IGZyb20gJy4uL21vZGVsL2dlbmVyYWw1MDAnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVGFibGVDdXN0b21maWVsZHNDb2x1bW5UeXBlU3R1ZGlvIH0gZnJvbSAnLi4vbW9kZWwvdGFibGVDdXN0b21maWVsZHNDb2x1bW5UeXBlJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFRhYmxlRmFjdENvbHVtblR5cGVTdHVkaW8gfSBmcm9tICcuLi9tb2RlbC90YWJsZUZhY3RDb2x1bW5UeXBlJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFRhYmxlRmFjdEZpbHRlckxpc3RTdHVkaW8gfSBmcm9tICcuLi9tb2RlbC90YWJsZUZhY3RGaWx0ZXJMaXN0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFRhYmxlRmFjdExpc3RTdHVkaW8gfSBmcm9tICcuLi9tb2RlbC90YWJsZUZhY3RMaXN0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFRhYmxlRmFjdE1ldHJpY3NGaWx0ZXJMaXN0U3R1ZGlvIH0gZnJvbSAnLi4vbW9kZWwvdGFibGVGYWN0TWV0cmljc0ZpbHRlckxpc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVGFibGVGYWN0TWV0cmljc1N0dWRpbyB9IGZyb20gJy4uL21vZGVsL3RhYmxlRmFjdE1ldHJpY3MnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgV2ViRmFjdFN0dWRpbyB9IGZyb20gJy4uL21vZGVsL3dlYkZhY3QnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBCQVNFX1BBVEgsIENPTExFQ1RJT05fRk9STUFUUyB9ICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vdmFyaWFibGVzJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb24gfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IEJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpLmJhc2Uuc2VydmljZSc7XG5pbXBvcnQge1xuICAgIEZhY3RzU2VydmljZUludGVyZmFjZSxcbiAgICBDcmVhdGVGYWN0UmVxdWVzdFBhcmFtcyxcbiAgICBEZWxldGVGYWN0UmVxdWVzdFBhcmFtcyxcbiAgICBEZWxldGVGYWN0c0JhdGNoUmVxdWVzdFBhcmFtcyxcbiAgICBEaXNhYmxlRmFjdHNCYXRjaFJlcXVlc3RQYXJhbXMsXG4gICAgRW5hYmxlRmFjdHNCYXRjaFJlcXVlc3RQYXJhbXMsXG4gICAgUmVhZEZhY3RSZXF1ZXN0UGFyYW1zLFxuICAgIFJlYWRGYWN0c01ldHJpY3NSZXF1ZXN0UGFyYW1zLFxuICAgIFJlYWRGYWN0c1RhYmxlUmVxdWVzdFBhcmFtcyxcbiAgICBVcGRhdGVGYWN0UmVxdWVzdFBhcmFtc1xufSBmcm9tICcuL2ZhY3RzU2VydmljZUludGVyZmFjZSc7XG5cblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBGYWN0c1NlcnZpY2UgZXh0ZW5kcyBCYXNlU2VydmljZSBpbXBsZW1lbnRzIEZhY3RzU2VydmljZUludGVyZmFjZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaHR0cENsaWVudDogSHR0cENsaWVudCwgQE9wdGlvbmFsKCkgQEluamVjdChCQVNFX1BBVEgpIGJhc2VQYXRoOiBzdHJpbmd8c3RyaW5nW10sIEBPcHRpb25hbCgpIGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIHN1cGVyKGJhc2VQYXRoLCBjb25maWd1cmF0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZmFjdFxuICAgICAqIENyZWF0aW5nIGEgZmFjdC4gWW91IGNhbiBvbmx5IGNyZWF0ZSBhIG5ldyBmYWN0IHdpdGggdGhlIFxcJiMzOTtORVdcXCYjMzk7IHN0YXR1cy4gXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUZhY3QocmVxdWVzdFBhcmFtZXRlcnM6IENyZWF0ZUZhY3RSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFdlYkZhY3RTdHVkaW8+O1xuICAgIHB1YmxpYyBjcmVhdGVGYWN0KHJlcXVlc3RQYXJhbWV0ZXJzOiBDcmVhdGVGYWN0UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFdlYkZhY3RTdHVkaW8+PjtcbiAgICBwdWJsaWMgY3JlYXRlRmFjdChyZXF1ZXN0UGFyYW1ldGVyczogQ3JlYXRlRmFjdFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8V2ViRmFjdFN0dWRpbz4+O1xuICAgIHB1YmxpYyBjcmVhdGVGYWN0KHJlcXVlc3RQYXJhbWV0ZXJzOiBDcmVhdGVGYWN0UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3QgZmlsZUtleSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5maWxlS2V5O1xuICAgICAgICBpZiAoZmlsZUtleSA9PT0gbnVsbCB8fCBmaWxlS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGZpbGVLZXkgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVGYWN0LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZhY3RTdHVkaW8gPSByZXF1ZXN0UGFyYW1ldGVycz8uZmFjdFN0dWRpbztcbiAgICAgICAgaWYgKGZhY3RTdHVkaW8gPT09IG51bGwgfHwgZmFjdFN0dWRpbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBmYWN0U3R1ZGlvIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY3JlYXRlRmFjdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChBcGlLZXlBdXRoKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkQ3JlZGVudGlhbFRvSGVhZGVycygnQXBpS2V5QXV0aCcsICdBdXRob3JpemF0aW9uJywgbG9jYWxWYXJIZWFkZXJzLCAnQmVhcmVyICcpO1xuXG4gICAgICAgIGNvbnN0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zPy5odHRwSGVhZGVyQWNjZXB0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgPSBvcHRpb25zPy5jb250ZXh0ID8/IG5ldyBIdHRwQ29udGV4dCgpO1xuXG4gICAgICAgIGNvbnN0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiA9IG9wdGlvbnM/LnRyYW5zZmVyQ2FjaGUgPz8gdHJ1ZTtcblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvc3R1ZGlvL2V4cGVyaW1lbnRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImZpbGVLZXlcIiwgdmFsdWU6IGZpbGVLZXksIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogXCJ1dWlkXCJ9KX0vZmFjdHNgO1xuICAgICAgICBjb25zdCB7IGJhc2VQYXRoLCB3aXRoQ3JlZGVudGlhbHMgfSA9IHRoaXMuY29uZmlndXJhdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFdlYkZhY3RTdHVkaW8+KCdwb3N0JywgYCR7YmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IGZhY3RTdHVkaW8sXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgLi4uKHdpdGhDcmVkZW50aWFscyA/IHsgd2l0aENyZWRlbnRpYWxzIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0aW5nIG9uZSBmYWN0XG4gICAgICogUmVtb3ZpbmcgYSBmYWN0IGJ5IGtleS5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlRmFjdChyZXF1ZXN0UGFyYW1ldGVyczogRGVsZXRlRmFjdFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PjtcbiAgICBwdWJsaWMgZGVsZXRlRmFjdChyZXF1ZXN0UGFyYW1ldGVyczogRGVsZXRlRmFjdFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxhbnk+PjtcbiAgICBwdWJsaWMgZGVsZXRlRmFjdChyZXF1ZXN0UGFyYW1ldGVyczogRGVsZXRlRmFjdFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj47XG4gICAgcHVibGljIGRlbGV0ZUZhY3QocmVxdWVzdFBhcmFtZXRlcnM6IERlbGV0ZUZhY3RSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBmaWxlS2V5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbGVLZXk7XG4gICAgICAgIGlmIChmaWxlS2V5ID09PSBudWxsIHx8IGZpbGVLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZmlsZUtleSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlbGV0ZUZhY3QuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXNzZW5jZUtleSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5lc3NlbmNlS2V5O1xuICAgICAgICBpZiAoZXNzZW5jZUtleSA9PT0gbnVsbCB8fCBlc3NlbmNlS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGVzc2VuY2VLZXkgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWxldGVGYWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEFwaUtleUF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFySGVhZGVycyA9IHRoaXMuY29uZmlndXJhdGlvbi5hZGRDcmVkZW50aWFsVG9IZWFkZXJzKCdBcGlLZXlBdXRoJywgJ0F1dGhvcml6YXRpb24nLCBsb2NhbFZhckhlYWRlcnMsICdCZWFyZXIgJyk7XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnM/Lmh0dHBIZWFkZXJBY2NlcHQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCA9IG9wdGlvbnM/LmNvbnRleHQgPz8gbmV3IEh0dHBDb250ZXh0KCk7XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuID0gb3B0aW9ucz8udHJhbnNmZXJDYWNoZSA/PyB0cnVlO1xuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3N0dWRpby9leHBlcmltZW50cy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJmaWxlS2V5XCIsIHZhbHVlOiBmaWxlS2V5LCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IFwidXVpZFwifSl9L2ZhY3RzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImVzc2VuY2VLZXlcIiwgdmFsdWU6IGVzc2VuY2VLZXksIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9YDtcbiAgICAgICAgY29uc3QgeyBiYXNlUGF0aCwgd2l0aENyZWRlbnRpYWxzIH0gPSB0aGlzLmNvbmZpZ3VyYXRpb247XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxhbnk+KCdkZWxldGUnLCBgJHtiYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgLi4uKHdpdGhDcmVkZW50aWFscyA/IHsgd2l0aENyZWRlbnRpYWxzIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBmYWN0cyAoYmF0Y2gpXG4gICAgICogUmVtb3ZpbmcgZmFjdHMgZnJvbSB0aGUgZmlsZS5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlRmFjdHNCYXRjaChyZXF1ZXN0UGFyYW1ldGVyczogRGVsZXRlRmFjdHNCYXRjaFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PjtcbiAgICBwdWJsaWMgZGVsZXRlRmFjdHNCYXRjaChyZXF1ZXN0UGFyYW1ldGVyczogRGVsZXRlRmFjdHNCYXRjaFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxhbnk+PjtcbiAgICBwdWJsaWMgZGVsZXRlRmFjdHNCYXRjaChyZXF1ZXN0UGFyYW1ldGVyczogRGVsZXRlRmFjdHNCYXRjaFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj47XG4gICAgcHVibGljIGRlbGV0ZUZhY3RzQmF0Y2gocmVxdWVzdFBhcmFtZXRlcnM6IERlbGV0ZUZhY3RzQmF0Y2hSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBmaWxlS2V5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbGVLZXk7XG4gICAgICAgIGlmIChmaWxlS2V5ID09PSBudWxsIHx8IGZpbGVLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZmlsZUtleSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlbGV0ZUZhY3RzQmF0Y2guJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSByZXF1ZXN0UGFyYW1ldGVycz8ucmVxdWVzdEJvZHk7XG4gICAgICAgIGlmIChyZXF1ZXN0Qm9keSA9PT0gbnVsbCB8fCByZXF1ZXN0Qm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciByZXF1ZXN0Qm9keSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlbGV0ZUZhY3RzQmF0Y2guJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQXBpS2V5QXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5jb25maWd1cmF0aW9uLmFkZENyZWRlbnRpYWxUb0hlYWRlcnMoJ0FwaUtleUF1dGgnLCAnQXV0aG9yaXphdGlvbicsIGxvY2FsVmFySGVhZGVycywgJ0JlYXJlciAnKTtcblxuICAgICAgICBjb25zdCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucz8uaHR0cEhlYWRlckFjY2VwdCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdKTtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0ID0gb3B0aW9ucz8uY29udGV4dCA/PyBuZXcgSHR0cENvbnRleHQoKTtcblxuICAgICAgICBjb25zdCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gPSBvcHRpb25zPy50cmFuc2ZlckNhY2hlID8/IHRydWU7XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL3N0dWRpby9leHBlcmltZW50cy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJmaWxlS2V5XCIsIHZhbHVlOiBmaWxlS2V5LCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IFwidXVpZFwifSl9L2ZhY3RzL2JhdGNoL3RhYmxlYDtcbiAgICAgICAgY29uc3QgeyBiYXNlUGF0aCwgd2l0aENyZWRlbnRpYWxzIH0gPSB0aGlzLmNvbmZpZ3VyYXRpb247XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxhbnk+KCdkZWxldGUnLCBgJHtiYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogcmVxdWVzdEJvZHksXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgLi4uKHdpdGhDcmVkZW50aWFscyA/IHsgd2l0aENyZWRlbnRpYWxzIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc2FibGUgZmFjdHNcbiAgICAgKiBEaXNhYmxlIGZhY3RzIGluIHRoZSBjYWxjdWxhdGlvbi5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzYWJsZUZhY3RzQmF0Y2gocmVxdWVzdFBhcmFtZXRlcnM6IERpc2FibGVGYWN0c0JhdGNoUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIHB1YmxpYyBkaXNhYmxlRmFjdHNCYXRjaChyZXF1ZXN0UGFyYW1ldGVyczogRGlzYWJsZUZhY3RzQmF0Y2hSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8YW55Pj47XG4gICAgcHVibGljIGRpc2FibGVGYWN0c0JhdGNoKHJlcXVlc3RQYXJhbWV0ZXJzOiBEaXNhYmxlRmFjdHNCYXRjaFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj47XG4gICAgcHVibGljIGRpc2FibGVGYWN0c0JhdGNoKHJlcXVlc3RQYXJhbWV0ZXJzOiBEaXNhYmxlRmFjdHNCYXRjaFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGZpbGVLZXkgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsZUtleTtcbiAgICAgICAgaWYgKGZpbGVLZXkgPT09IG51bGwgfHwgZmlsZUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBmaWxlS2V5IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGlzYWJsZUZhY3RzQmF0Y2guJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSByZXF1ZXN0UGFyYW1ldGVycz8ucmVxdWVzdEJvZHk7XG4gICAgICAgIGlmIChyZXF1ZXN0Qm9keSA9PT0gbnVsbCB8fCByZXF1ZXN0Qm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciByZXF1ZXN0Qm9keSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRpc2FibGVGYWN0c0JhdGNoLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEFwaUtleUF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFySGVhZGVycyA9IHRoaXMuY29uZmlndXJhdGlvbi5hZGRDcmVkZW50aWFsVG9IZWFkZXJzKCdBcGlLZXlBdXRoJywgJ0F1dGhvcml6YXRpb24nLCBsb2NhbFZhckhlYWRlcnMsICdCZWFyZXIgJyk7XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnM/Lmh0dHBIZWFkZXJBY2NlcHQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCA9IG9wdGlvbnM/LmNvbnRleHQgPz8gbmV3IEh0dHBDb250ZXh0KCk7XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuID0gb3B0aW9ucz8udHJhbnNmZXJDYWNoZSA/PyB0cnVlO1xuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9zdHVkaW8vZXhwZXJpbWVudHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZmlsZUtleVwiLCB2YWx1ZTogZmlsZUtleSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiBcInV1aWRcIn0pfS9mYWN0cy9iYXRjaC9hYmlsaXR5YDtcbiAgICAgICAgY29uc3QgeyBiYXNlUGF0aCwgd2l0aENyZWRlbnRpYWxzIH0gPSB0aGlzLmNvbmZpZ3VyYXRpb247XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxhbnk+KCdkZWxldGUnLCBgJHtiYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogcmVxdWVzdEJvZHksXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgLi4uKHdpdGhDcmVkZW50aWFscyA/IHsgd2l0aENyZWRlbnRpYWxzIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSBmYWN0c1xuICAgICAqIEVuYWJsZSBmYWN0cyBpbiB0aGUgY2FsY3VsYXRpb24uXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGVuYWJsZUZhY3RzQmF0Y2gocmVxdWVzdFBhcmFtZXRlcnM6IEVuYWJsZUZhY3RzQmF0Y2hSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT47XG4gICAgcHVibGljIGVuYWJsZUZhY3RzQmF0Y2gocmVxdWVzdFBhcmFtZXRlcnM6IEVuYWJsZUZhY3RzQmF0Y2hSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8YW55Pj47XG4gICAgcHVibGljIGVuYWJsZUZhY3RzQmF0Y2gocmVxdWVzdFBhcmFtZXRlcnM6IEVuYWJsZUZhY3RzQmF0Y2hSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+O1xuICAgIHB1YmxpYyBlbmFibGVGYWN0c0JhdGNoKHJlcXVlc3RQYXJhbWV0ZXJzOiBFbmFibGVGYWN0c0JhdGNoUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3QgZmlsZUtleSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5maWxlS2V5O1xuICAgICAgICBpZiAoZmlsZUtleSA9PT0gbnVsbCB8fCBmaWxlS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGZpbGVLZXkgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBlbmFibGVGYWN0c0JhdGNoLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnJlcXVlc3RCb2R5O1xuICAgICAgICBpZiAocmVxdWVzdEJvZHkgPT09IG51bGwgfHwgcmVxdWVzdEJvZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgcmVxdWVzdEJvZHkgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBlbmFibGVGYWN0c0JhdGNoLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEFwaUtleUF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFySGVhZGVycyA9IHRoaXMuY29uZmlndXJhdGlvbi5hZGRDcmVkZW50aWFsVG9IZWFkZXJzKCdBcGlLZXlBdXRoJywgJ0F1dGhvcml6YXRpb24nLCBsb2NhbFZhckhlYWRlcnMsICdCZWFyZXIgJyk7XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnM/Lmh0dHBIZWFkZXJBY2NlcHQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCA9IG9wdGlvbnM/LmNvbnRleHQgPz8gbmV3IEh0dHBDb250ZXh0KCk7XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuID0gb3B0aW9ucz8udHJhbnNmZXJDYWNoZSA/PyB0cnVlO1xuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9zdHVkaW8vZXhwZXJpbWVudHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZmlsZUtleVwiLCB2YWx1ZTogZmlsZUtleSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiBcInV1aWRcIn0pfS9mYWN0cy9iYXRjaC9hYmlsaXR5YDtcbiAgICAgICAgY29uc3QgeyBiYXNlUGF0aCwgd2l0aENyZWRlbnRpYWxzIH0gPSB0aGlzLmNvbmZpZ3VyYXRpb247XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxhbnk+KCdwdXQnLCBgJHtiYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogcmVxdWVzdEJvZHksXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgLi4uKHdpdGhDcmVkZW50aWFscyA/IHsgd2l0aENyZWRlbnRpYWxzIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYWQgZmFjdFxuICAgICAqIEdldHRpbmcgZmFjdCBpbmZvcm1hdGlvbiBieSBrZXkuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRGYWN0KHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkRmFjdFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8V2ViRmFjdFN0dWRpbz47XG4gICAgcHVibGljIHJlYWRGYWN0KHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkRmFjdFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxXZWJGYWN0U3R1ZGlvPj47XG4gICAgcHVibGljIHJlYWRGYWN0KHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkRmFjdFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8V2ViRmFjdFN0dWRpbz4+O1xuICAgIHB1YmxpYyByZWFkRmFjdChyZXF1ZXN0UGFyYW1ldGVyczogUmVhZEZhY3RSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBmaWxlS2V5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbGVLZXk7XG4gICAgICAgIGlmIChmaWxlS2V5ID09PSBudWxsIHx8IGZpbGVLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZmlsZUtleSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHJlYWRGYWN0LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVzc2VuY2VLZXkgPSByZXF1ZXN0UGFyYW1ldGVycz8uZXNzZW5jZUtleTtcbiAgICAgICAgaWYgKGVzc2VuY2VLZXkgPT09IG51bGwgfHwgZXNzZW5jZUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBlc3NlbmNlS2V5IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcmVhZEZhY3QuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQXBpS2V5QXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5jb25maWd1cmF0aW9uLmFkZENyZWRlbnRpYWxUb0hlYWRlcnMoJ0FwaUtleUF1dGgnLCAnQXV0aG9yaXphdGlvbicsIGxvY2FsVmFySGVhZGVycywgJ0JlYXJlciAnKTtcblxuICAgICAgICBjb25zdCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucz8uaHR0cEhlYWRlckFjY2VwdCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdKTtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0ID0gb3B0aW9ucz8uY29udGV4dCA/PyBuZXcgSHR0cENvbnRleHQoKTtcblxuICAgICAgICBjb25zdCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gPSBvcHRpb25zPy50cmFuc2ZlckNhY2hlID8/IHRydWU7XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvc3R1ZGlvL2V4cGVyaW1lbnRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImZpbGVLZXlcIiwgdmFsdWU6IGZpbGVLZXksIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogXCJ1dWlkXCJ9KX0vZmFjdHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZXNzZW5jZUtleVwiLCB2YWx1ZTogZXNzZW5jZUtleSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX1gO1xuICAgICAgICBjb25zdCB7IGJhc2VQYXRoLCB3aXRoQ3JlZGVudGlhbHMgfSA9IHRoaXMuY29uZmlndXJhdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFdlYkZhY3RTdHVkaW8+KCdnZXQnLCBgJHtiYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgLi4uKHdpdGhDcmVkZW50aWFscyA/IHsgd2l0aENyZWRlbnRpYWxzIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZhY3QgbWV0cmljc1xuICAgICAqIENhbGN1bGF0ZSBnZW5lcmFsIG1ldHJpY3MgZm9yIHNlbGVjdGVkIGZhY3RzLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkRmFjdHNNZXRyaWNzKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkRmFjdHNNZXRyaWNzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxUYWJsZUZhY3RNZXRyaWNzU3R1ZGlvPjtcbiAgICBwdWJsaWMgcmVhZEZhY3RzTWV0cmljcyhyZXF1ZXN0UGFyYW1ldGVyczogUmVhZEZhY3RzTWV0cmljc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxUYWJsZUZhY3RNZXRyaWNzU3R1ZGlvPj47XG4gICAgcHVibGljIHJlYWRGYWN0c01ldHJpY3MocmVxdWVzdFBhcmFtZXRlcnM6IFJlYWRGYWN0c01ldHJpY3NSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFRhYmxlRmFjdE1ldHJpY3NTdHVkaW8+PjtcbiAgICBwdWJsaWMgcmVhZEZhY3RzTWV0cmljcyhyZXF1ZXN0UGFyYW1ldGVyczogUmVhZEZhY3RzTWV0cmljc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGZpbGVLZXkgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsZUtleTtcbiAgICAgICAgaWYgKGZpbGVLZXkgPT09IG51bGwgfHwgZmlsZUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBmaWxlS2V5IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcmVhZEZhY3RzTWV0cmljcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZUZhY3RNZXRyaWNzRmlsdGVyTGlzdFN0dWRpbyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy50YWJsZUZhY3RNZXRyaWNzRmlsdGVyTGlzdFN0dWRpbztcbiAgICAgICAgaWYgKHRhYmxlRmFjdE1ldHJpY3NGaWx0ZXJMaXN0U3R1ZGlvID09PSBudWxsIHx8IHRhYmxlRmFjdE1ldHJpY3NGaWx0ZXJMaXN0U3R1ZGlvID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHRhYmxlRmFjdE1ldHJpY3NGaWx0ZXJMaXN0U3R1ZGlvIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcmVhZEZhY3RzTWV0cmljcy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChBcGlLZXlBdXRoKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmNvbmZpZ3VyYXRpb24uYWRkQ3JlZGVudGlhbFRvSGVhZGVycygnQXBpS2V5QXV0aCcsICdBdXRob3JpemF0aW9uJywgbG9jYWxWYXJIZWFkZXJzLCAnQmVhcmVyICcpO1xuXG4gICAgICAgIGNvbnN0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zPy5odHRwSGVhZGVyQWNjZXB0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgPSBvcHRpb25zPy5jb250ZXh0ID8/IG5ldyBIdHRwQ29udGV4dCgpO1xuXG4gICAgICAgIGNvbnN0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiA9IG9wdGlvbnM/LnRyYW5zZmVyQ2FjaGUgPz8gdHJ1ZTtcblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvc3R1ZGlvL2V4cGVyaW1lbnRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImZpbGVLZXlcIiwgdmFsdWU6IGZpbGVLZXksIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogXCJ1dWlkXCJ9KX0vZmFjdHMvYmF0Y2gvbWV0cmljc2A7XG4gICAgICAgIGNvbnN0IHsgYmFzZVBhdGgsIHdpdGhDcmVkZW50aWFscyB9ID0gdGhpcy5jb25maWd1cmF0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VGFibGVGYWN0TWV0cmljc1N0dWRpbz4oJ3Bvc3QnLCBgJHtiYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogdGFibGVGYWN0TWV0cmljc0ZpbHRlckxpc3RTdHVkaW8sXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgLi4uKHdpdGhDcmVkZW50aWFscyA/IHsgd2l0aENyZWRlbnRpYWxzIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZmFjdHNcbiAgICAgKiBHZXR0aW5nIGEgZmFjdHMgbGlzdC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZEZhY3RzVGFibGUocmVxdWVzdFBhcmFtZXRlcnM6IFJlYWRGYWN0c1RhYmxlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxUYWJsZUZhY3RMaXN0U3R1ZGlvPjtcbiAgICBwdWJsaWMgcmVhZEZhY3RzVGFibGUocmVxdWVzdFBhcmFtZXRlcnM6IFJlYWRGYWN0c1RhYmxlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFRhYmxlRmFjdExpc3RTdHVkaW8+PjtcbiAgICBwdWJsaWMgcmVhZEZhY3RzVGFibGUocmVxdWVzdFBhcmFtZXRlcnM6IFJlYWRGYWN0c1RhYmxlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxUYWJsZUZhY3RMaXN0U3R1ZGlvPj47XG4gICAgcHVibGljIHJlYWRGYWN0c1RhYmxlKHJlcXVlc3RQYXJhbWV0ZXJzOiBSZWFkRmFjdHNUYWJsZVJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IGZpbGVLZXkgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsZUtleTtcbiAgICAgICAgaWYgKGZpbGVLZXkgPT09IG51bGwgfHwgZmlsZUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBmaWxlS2V5IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcmVhZEZhY3RzVGFibGUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm9mZnNldDtcbiAgICAgICAgY29uc3QgbGltaXQgPSByZXF1ZXN0UGFyYW1ldGVycz8ubGltaXQ7XG4gICAgICAgIGNvbnN0IHNvcnRGaWVsZCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zb3J0RmllbGQ7XG4gICAgICAgIGNvbnN0IHNvcnRDdXN0b21maWVsZCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zb3J0Q3VzdG9tZmllbGQ7XG4gICAgICAgIGNvbnN0IHNvcnREaXJlY3Rpb24gPSByZXF1ZXN0UGFyYW1ldGVycz8uc29ydERpcmVjdGlvbjtcbiAgICAgICAgY29uc3QgdGFibGVGYWN0RmlsdGVyTGlzdFN0dWRpbyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy50YWJsZUZhY3RGaWx0ZXJMaXN0U3R1ZGlvO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICA8YW55Pm9mZnNldCwgJ29mZnNldCcpO1xuICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgIDxhbnk+bGltaXQsICdsaW1pdCcpO1xuICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgIDxhbnk+c29ydEZpZWxkLCAnc29ydF9maWVsZCcpO1xuICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgIDxhbnk+c29ydEN1c3RvbWZpZWxkLCAnc29ydF9jdXN0b21maWVsZCcpO1xuICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgIDxhbnk+c29ydERpcmVjdGlvbiwgJ3NvcnRfZGlyZWN0aW9uJyk7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEFwaUtleUF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFySGVhZGVycyA9IHRoaXMuY29uZmlndXJhdGlvbi5hZGRDcmVkZW50aWFsVG9IZWFkZXJzKCdBcGlLZXlBdXRoJywgJ0F1dGhvcml6YXRpb24nLCBsb2NhbFZhckhlYWRlcnMsICdCZWFyZXIgJyk7XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnM/Lmh0dHBIZWFkZXJBY2NlcHQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCA9IG9wdGlvbnM/LmNvbnRleHQgPz8gbmV3IEh0dHBDb250ZXh0KCk7XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuID0gb3B0aW9ucz8udHJhbnNmZXJDYWNoZSA/PyB0cnVlO1xuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9zdHVkaW8vZXhwZXJpbWVudHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZmlsZUtleVwiLCB2YWx1ZTogZmlsZUtleSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiBcInV1aWRcIn0pfS9mYWN0cy9iYXRjaC90YWJsZWA7XG4gICAgICAgIGNvbnN0IHsgYmFzZVBhdGgsIHdpdGhDcmVkZW50aWFscyB9ID0gdGhpcy5jb25maWd1cmF0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VGFibGVGYWN0TGlzdFN0dWRpbz4oJ3Bvc3QnLCBgJHtiYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogdGFibGVGYWN0RmlsdGVyTGlzdFN0dWRpbyxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIC4uLih3aXRoQ3JlZGVudGlhbHMgPyB7IHdpdGhDcmVkZW50aWFscyB9IDoge30pLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgZmFjdFxuICAgICAqIFVwZGF0aW5nIHRoZSBmYWN0IGJ5IGtleS5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlRmFjdChyZXF1ZXN0UGFyYW1ldGVyczogVXBkYXRlRmFjdFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8V2ViRmFjdFN0dWRpbz47XG4gICAgcHVibGljIHVwZGF0ZUZhY3QocmVxdWVzdFBhcmFtZXRlcnM6IFVwZGF0ZUZhY3RSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8V2ViRmFjdFN0dWRpbz4+O1xuICAgIHB1YmxpYyB1cGRhdGVGYWN0KHJlcXVlc3RQYXJhbWV0ZXJzOiBVcGRhdGVGYWN0UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxXZWJGYWN0U3R1ZGlvPj47XG4gICAgcHVibGljIHVwZGF0ZUZhY3QocmVxdWVzdFBhcmFtZXRlcnM6IFVwZGF0ZUZhY3RSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBmaWxlS2V5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbGVLZXk7XG4gICAgICAgIGlmIChmaWxlS2V5ID09PSBudWxsIHx8IGZpbGVLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZmlsZUtleSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwZGF0ZUZhY3QuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmFjdFN0dWRpbyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5mYWN0U3R1ZGlvO1xuICAgICAgICBpZiAoZmFjdFN0dWRpbyA9PT0gbnVsbCB8fCBmYWN0U3R1ZGlvID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGZhY3RTdHVkaW8gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cGRhdGVGYWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEFwaUtleUF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFySGVhZGVycyA9IHRoaXMuY29uZmlndXJhdGlvbi5hZGRDcmVkZW50aWFsVG9IZWFkZXJzKCdBcGlLZXlBdXRoJywgJ0F1dGhvcml6YXRpb24nLCBsb2NhbFZhckhlYWRlcnMsICdCZWFyZXIgJyk7XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnM/Lmh0dHBIZWFkZXJBY2NlcHQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCA9IG9wdGlvbnM/LmNvbnRleHQgPz8gbmV3IEh0dHBDb250ZXh0KCk7XG5cbiAgICAgICAgY29uc3QgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuID0gb3B0aW9ucz8udHJhbnNmZXJDYWNoZSA/PyB0cnVlO1xuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9zdHVkaW8vZXhwZXJpbWVudHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZmlsZUtleVwiLCB2YWx1ZTogZmlsZUtleSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiBcInV1aWRcIn0pfS9mYWN0c2A7XG4gICAgICAgIGNvbnN0IHsgYmFzZVBhdGgsIHdpdGhDcmVkZW50aWFscyB9ID0gdGhpcy5jb25maWd1cmF0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8V2ViRmFjdFN0dWRpbz4oJ3B1dCcsIGAke2Jhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiBmYWN0U3R1ZGlvLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIC4uLih3aXRoQ3JlZGVudGlhbHMgPyB7IHdpdGhDcmVkZW50aWFscyB9IDoge30pLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbn1cbiJdfQ==
|