From 49c34e7c74a32b2576646d7e57a73f440e3adc7e Mon Sep 17 00:00:00 2001
From: "VKMTHD\\franzjosefkober" <franz.josef.kober@ivt.tugraz.at>
Date: Fri, 4 Jun 2021 18:16:47 +0200
Subject: [PATCH] added hash calculation at primary vehicle report

---
 .../VectoCommon/Models/AlternatorType.cs      |  16 ++
 .../Resources/XMLNames.Designer.cs            | 135 +++++++++++
 .../VectoCommon/Resources/XMLNames.resx       |  45 ++++
 .../OutputData/XML/XMLPrimaryVehicleReport.cs | 226 ++++++++++++------
 4 files changed, 351 insertions(+), 71 deletions(-)

diff --git a/VectoCommon/VectoCommon/Models/AlternatorType.cs b/VectoCommon/VectoCommon/Models/AlternatorType.cs
index e216758a7c..5419938e1c 100644
--- a/VectoCommon/VectoCommon/Models/AlternatorType.cs
+++ b/VectoCommon/VectoCommon/Models/AlternatorType.cs
@@ -11,6 +11,22 @@ namespace TUGraz.VectoCommon.Models
 
 	public static class AlternatorTypeHelper
 	{
+
+		public static string ToXMLFormat(this AlternatorType type)
+		{
+			switch (type)
+			{
+				case AlternatorType.Conventional:
+					return "conventional";
+				case AlternatorType.Smart:
+					return "smart";
+				case AlternatorType.None:
+					return "no alternator";
+				default:
+					throw new ArgumentOutOfRangeException(nameof(type), type, null);
+			};
+		}
+
 		public static string GetLabel(this AlternatorType type)
 		{
 			switch (type) {
diff --git a/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs b/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs
index 796ce51d7b..6e87b019a0 100644
--- a/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs
+++ b/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs
@@ -1023,6 +1023,96 @@ namespace TUGraz.VectoCommon.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Battery.
+        /// </summary>
+        public static string BusAux_ElectricSystem_Battery {
+            get {
+                return ResourceManager.GetString("BusAux_ElectricSystem_Battery", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to BatteryTechnology.
+        /// </summary>
+        public static string BusAux_ElectricSystem_BatteryTechnology {
+            get {
+                return ResourceManager.GetString("BusAux_ElectricSystem_BatteryTechnology", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Capacitor.
+        /// </summary>
+        public static string BusAux_ElectricSystem_Capacitor {
+            get {
+                return ResourceManager.GetString("BusAux_ElectricSystem_Capacitor", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to CapacitorTechnology.
+        /// </summary>
+        public static string BusAux_ElectricSystem_CapacitorTechnology {
+            get {
+                return ResourceManager.GetString("BusAux_ElectricSystem_CapacitorTechnology", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to NominalVoltage.
+        /// </summary>
+        public static string BusAux_ElectricSystem_NominalVoltage {
+            get {
+                return ResourceManager.GetString("BusAux_ElectricSystem_NominalVoltage", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to RatedCapacitance.
+        /// </summary>
+        public static string BusAux_ElectricSystem_RatedCapacitance {
+            get {
+                return ResourceManager.GetString("BusAux_ElectricSystem_RatedCapacitance", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to RatedCapacity.
+        /// </summary>
+        public static string BusAux_ElectricSystem_RatedCapacity {
+            get {
+                return ResourceManager.GetString("BusAux_ElectricSystem_RatedCapacity", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to RatedCurrent.
+        /// </summary>
+        public static string BusAux_ElectricSystem_RatedCurrent {
+            get {
+                return ResourceManager.GetString("BusAux_ElectricSystem_RatedCurrent", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to RatedVoltage.
+        /// </summary>
+        public static string BusAux_ElectricSystem_RatedRatedVoltage {
+            get {
+                return ResourceManager.GetString("BusAux_ElectricSystem_RatedRatedVoltage", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to RatedVoltage.
+        /// </summary>
+        public static string BusAux_ElectricSystem_RatedVoltage {
+            get {
+                return ResourceManager.GetString("BusAux_ElectricSystem_RatedVoltage", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to ResultCards.
         /// </summary>
@@ -1032,6 +1122,15 @@ namespace TUGraz.VectoCommon.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to SmartAlternator.
+        /// </summary>
+        public static string BusAux_ElectricSystem_SmartAlternator {
+            get {
+                return ResourceManager.GetString("BusAux_ElectricSystem_SmartAlternator", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to SmartElectrics.
         /// </summary>
@@ -1041,6 +1140,24 @@ namespace TUGraz.VectoCommon.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to SupplyFromHEVPossible.
+        /// </summary>
+        public static string BusAux_ElectricSystem_SupplyFromHEVPossible {
+            get {
+                return ResourceManager.GetString("BusAux_ElectricSystem_SupplyFromHEVPossible", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Fan.
+        /// </summary>
+        public static string BusAux_Fan {
+            get {
+                return ResourceManager.GetString("BusAux_Fan", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to HVAC.
         /// </summary>
@@ -1176,6 +1293,24 @@ namespace TUGraz.VectoCommon.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to SteeringPump.
+        /// </summary>
+        public static string BusAux_SteeringPump {
+            get {
+                return ResourceManager.GetString("BusAux_SteeringPump", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Technology.
+        /// </summary>
+        public static string BusAux_Technology {
+            get {
+                return ResourceManager.GetString("BusAux_Technology", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to AirDrag.
         /// </summary>
diff --git a/VectoCommon/VectoCommon/Resources/XMLNames.resx b/VectoCommon/VectoCommon/Resources/XMLNames.resx
index d795c59690..a5029ad819 100644
--- a/VectoCommon/VectoCommon/Resources/XMLNames.resx
+++ b/VectoCommon/VectoCommon/Resources/XMLNames.resx
@@ -1527,4 +1527,49 @@
   <data name="Bus_NumberPassengersStandingUpperDeck" xml:space="preserve">
     <value>NumberPassengersStandingUpperDeck</value>
   </data>
+  <data name="BusAux_ElectricSystem_Battery" xml:space="preserve">
+    <value>Battery</value>
+  </data>
+  <data name="BusAux_ElectricSystem_BatteryTechnology" xml:space="preserve">
+    <value>BatteryTechnology</value>
+  </data>
+  <data name="BusAux_ElectricSystem_Capacitor" xml:space="preserve">
+    <value>Capacitor</value>
+  </data>
+  <data name="BusAux_ElectricSystem_CapacitorTechnology" xml:space="preserve">
+    <value>CapacitorTechnology</value>
+  </data>
+  <data name="BusAux_ElectricSystem_NominalVoltage" xml:space="preserve">
+    <value>NominalVoltage</value>
+  </data>
+  <data name="BusAux_ElectricSystem_RatedCapacitance" xml:space="preserve">
+    <value>RatedCapacitance</value>
+  </data>
+  <data name="BusAux_ElectricSystem_RatedCapacity" xml:space="preserve">
+    <value>RatedCapacity</value>
+  </data>
+  <data name="BusAux_ElectricSystem_RatedCurrent" xml:space="preserve">
+    <value>RatedCurrent</value>
+  </data>
+  <data name="BusAux_ElectricSystem_RatedRatedVoltage" xml:space="preserve">
+    <value>RatedVoltage</value>
+  </data>
+  <data name="BusAux_ElectricSystem_RatedVoltage" xml:space="preserve">
+    <value>RatedVoltage</value>
+  </data>
+  <data name="BusAux_ElectricSystem_SmartAlternator" xml:space="preserve">
+    <value>SmartAlternator</value>
+  </data>
+  <data name="BusAux_ElectricSystem_SupplyFromHEVPossible" xml:space="preserve">
+    <value>SupplyFromHEVPossible</value>
+  </data>
+  <data name="BusAux_Fan" xml:space="preserve">
+    <value>Fan</value>
+  </data>
+  <data name="BusAux_SteeringPump" xml:space="preserve">
+    <value>SteeringPump</value>
+  </data>
+  <data name="BusAux_Technology" xml:space="preserve">
+    <value>Technology</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs b/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs
index 77f77735f5..1f3a724259 100644
--- a/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs
+++ b/VectoCore/VectoCore/OutputData/XML/XMLPrimaryVehicleReport.cs
@@ -1,15 +1,17 @@
 using System;
 using System.Collections.Generic;
-using System.Data;
+using System.IO;
 using System.Linq;
-using System.Security.Cryptography;
-using System.Text;
 using System.Xml;
 using System.Xml.Linq;
+using TUGraz.VectoCommon.BusAuxiliaries;
+using TUGraz.VectoCommon.Exceptions;
 using TUGraz.VectoCommon.Hashing;
+using TUGraz.VectoCommon.InputData;
 using TUGraz.VectoCommon.Models;
 using TUGraz.VectoCommon.Resources;
 using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.InputData.Impl;
 using TUGraz.VectoCore.InputData.Reader.ComponentData;
 using TUGraz.VectoCore.Models.Declaration;
 using TUGraz.VectoCore.Models.Simulation.Data;
@@ -17,6 +19,7 @@ using TUGraz.VectoCore.Models.Simulation.Impl;
 using TUGraz.VectoCore.Models.SimulationComponent.Data;
 using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
 using TUGraz.VectoCore.Utils;
+using TUGraz.VectoHashing;
 
 namespace TUGraz.VectoCore.OutputData.XML
 {
@@ -52,11 +55,6 @@ namespace TUGraz.VectoCore.OutputData.XML
 		public void GenerateReport(XElement resultSignature)
 		{
 			var retVal = new XDocument();
-			var results = new XElement(Results);
-			results.AddFirst(new XElement(tns + XMLNames.Report_Result_Status, _allSuccess ? "success" : "error"));
-
-			var vehicleId = $"{VectoComponents.Vehicle.HashIdPrefix()}{GetGUID()}";
-
 			retVal.Add(
 				new XElement(XMLNames.VectoOutputMultistage,
 					new XAttribute("xmlns", tns),
@@ -68,29 +66,46 @@ namespace TUGraz.VectoCore.OutputData.XML
 					new XAttribute(XNamespace.Xmlns + "v2.6", v26),
 					new XAttribute(XNamespace.Xmlns + "v2.8", v28),
 					new XAttribute(xsi + "schemaLocation", $"{tns.NamespaceName} "+ @"V:\VectoCore\VectoCore\Resources\XSD/VectoOutputMultistage.0.1.xsd"),
-
-					new XElement(XMLNames.Bus_PrimaryVehicle,
-						new XElement(tns + XMLNames.Report_DataWrap,
-							new XAttribute(XMLNames.Component_ID_Attr, vehicleId),
-							new XAttribute(xsi + "type", "PrimaryVehicleDataType"),
-							 VehiclePart,
-							InputDataIntegrity,
-							new XElement(tns + "ManufacturerRecordSignature", resultSignature),
-							results,
-							GetApplicationInfo()),
-						GetInputdataSignature(vehicleId))
-					)
+					
+					GeneratePrimaryVehicle(resultSignature))
 				);
 
-				//var stream = new MemoryStream();
-				//var writer = new StreamWriter(stream);
-				//writer.Write(retVal);
-				//writer.Flush();
-				//stream.Seek(0, SeekOrigin.Begin);
+			Report = retVal;
+		}
+		
+		private XElement GeneratePrimaryVehicle(XElement resultSignature)
+		{
+			var results = new XElement(Results);
+			results.AddFirst(new XElement(tns + XMLNames.Report_Result_Status, _allSuccess ? "success" : "error"));
+			var vehicleId = $"{VectoComponents.Vehicle.HashIdPrefix()}{GetGUID()}";
+
+			var primaryVehicle = new XElement( tns + XMLNames.Bus_PrimaryVehicle,
+				new XElement(tns + XMLNames.Report_DataWrap,
+					new XAttribute(XMLNames.Component_ID_Attr, vehicleId),
+					new XAttribute(xsi + "type", "PrimaryVehicleDataType"),
+					VehiclePart,
+					InputDataIntegrity,
+					new XElement(tns + "ManufacturerRecordSignature", resultSignature),
+					results,
+					GetApplicationInfo())
+			);
+
+			var sigXElement = GetSignatureElement(primaryVehicle);
+			primaryVehicle.LastNode.Parent.Add(sigXElement);
+			return primaryVehicle;
+		}
+
+		private XElement GetSignatureElement(XElement stage)
+		{
+			var stream = new MemoryStream();
+			var writer = new StreamWriter(stream);
+			writer.Write(stage);
+			writer.Flush();
+			stream.Seek(0, SeekOrigin.Begin);
 
-				//var h = VectoHash.Load(stream);
-				//Report = h.AddHash();
-				Report = retVal;
+			return new XElement(tns + XMLNames.DI_Signature,
+				VectoHash.Load(stream).ComputeXmlHash
+					(VectoHash.DefaultCanonicalizationMethod, VectoHash.DefaultDigestMethod));
 		}
 
 		private XElement GetApplicationInfo()
@@ -236,31 +251,126 @@ namespace TUGraz.VectoCore.OutputData.XML
 
 		private XElement GetAuxiliariesDescription(VectoRunData modelData)
 		{
-			var busAuxiliaries = modelData.BusAuxiliaries;
-			var busAuxXML = busAuxiliaries.InputData.XMLSource;
-
-			var dataElement = new XElement(tns+ XMLNames.ComponentDataWrapper,
-				new XAttribute(xsi + "type", "AuxiliaryDataPIFType"),
-				new XAttribute("xmlns", tns.NamespaceName),
+			var aux = modelData.BusAuxiliaries.InputData;
+			var supplyHevPossible = XmlConvert.ToBoolean(
+				aux.XMLSource.SelectSingleNode(
+					$".//*[local-name()='{XMLNames.BusAux_ElectricSystem_SupplyFromHEVPossible}']")?.InnerText);
 
-				XElement.Parse(busAuxXML.InnerXml).Elements());
-			dataElement = RemoveNamespace(dataElement);			
 
-			
 			return new XElement(tns + XMLNames.Component_Auxiliaries,
-				 dataElement );
+				new XElement(tns + XMLNames.ComponentDataWrapper,
+					new XAttribute(xsi + "type", "AuxiliaryDataPIFType"),
+					new XAttribute("xmlns", tns.NamespaceName),
+					new XElement(tns + XMLNames.BusAux_Fan, new XElement(tns + XMLNames.BusAux_Technology,  aux.FanTechnology)),
+					GetSteeringPumpElement(aux.SteeringPumpTechnology),
+					GetElectricSystem(aux.ElectricSupply, supplyHevPossible),
+					GetPneumaticSystem(aux.PneumaticSupply, aux.PneumaticConsumers),
+					GetHvac(aux.HVACAux))
+				);
 		}
 
 
-		private XElement RemoveNamespace(XElement elements)
+		private XElement GetSteeringPumpElement(IList<string> steeringPumps)
 		{
-			foreach (XElement e in elements.DescendantsAndSelf())
+			var technologies = new List<XElement>();
+
+			for (int i = 0; i < steeringPumps.Count; i++)
 			{
-				if (e.Name.Namespace != XNamespace.None)
-					e.Name = e.Name.LocalName;
+				var technology = new XElement(tns + XMLNames.BusAux_Technology,
+					new XAttribute(XMLNames.AxleWheels_Axles_Axle_AxleNumber_Attr, i + 1), steeringPumps[i]);
+				technologies.Add(technology);
 			}
 
-			return elements;
+			return new XElement(tns + XMLNames.BusAux_SteeringPump,
+				technologies
+			);
+		}
+
+		private XElement GetElectricSystem(IElectricSupplyDeclarationData electricSupply, bool supplyHevPossible)
+		{
+			var alternatorTech = new XElement(tns + XMLNames.Bus_AlternatorTechnology, electricSupply.AlternatorTechnology.ToXMLFormat());
+
+			List<XElement> smartAlternators = null;
+			List<XElement> auxBattery = null;
+			List<XElement> auxCapacitor = null;
+
+			if (electricSupply.Alternators?.Any() == true) {
+				smartAlternators = new List<XElement>();
+
+				foreach (var alternator in electricSupply.Alternators) {
+					smartAlternators.Add(new XElement(tns + XMLNames.BusAux_ElectricSystem_SmartAlternator,
+									new XElement(tns + XMLNames.BusAux_ElectricSystem_RatedCurrent, alternator.RatedCurrent.Value()),
+									new XElement(tns + XMLNames.BusAux_ElectricSystem_RatedRatedVoltage, alternator.RatedVoltage.Value())));
+				}
+			}
+
+			if (electricSupply.ElectricStorage?.Any() == true) {
+				auxBattery = new List<XElement>();
+				auxCapacitor = new List<XElement>();
+
+				foreach (var electricStorage in electricSupply.ElectricStorage) {
+					if (electricStorage is BusAuxBatteryInputData) {
+						var battery = electricStorage as BusAuxBatteryInputData;
+						auxBattery.Add(new XElement(tns + XMLNames.BusAux_ElectricSystem_Battery,
+							new XElement(tns + XMLNames.BusAux_ElectricSystem_BatteryTechnology, battery.Technology),
+							new XElement(tns + XMLNames.BusAux_ElectricSystem_RatedCapacity, battery.Capacity.AsAmpHour),
+							new XElement(tns + XMLNames.BusAux_ElectricSystem_NominalVoltage, battery.Voltage.Value())));
+					}
+					else if (electricStorage is BusAuxCapacitorInputData) {
+						var capacitor = electricStorage as BusAuxCapacitorInputData;
+						auxCapacitor.Add(new XElement(tns + XMLNames.BusAux_ElectricSystem_Capacitor,
+							new XElement(tns + XMLNames.BusAux_ElectricSystem_CapacitorTechnology, capacitor.Technology),
+							new XElement(tns + XMLNames.BusAux_ElectricSystem_RatedCapacitance, capacitor.Capacity.Value()),
+							new XElement(tns + XMLNames.BusAux_ElectricSystem_RatedVoltage, capacitor.Voltage.Value())));
+					}
+				}
+
+				auxBattery = auxBattery.Any() ? auxBattery : null;
+				auxCapacitor = auxCapacitor.Any() ? auxCapacitor : null;
+			}
+			
+			return new XElement(tns + XMLNames.BusAux_ElectricSystem,
+						alternatorTech,
+						smartAlternators,
+						auxBattery,
+						auxCapacitor,
+						new XElement(tns + XMLNames.BusAux_ElectricSystem_SupplyFromHEVPossible, supplyHevPossible)
+			);
+		}
+
+
+		private XElement GetPneumaticSystem(IPneumaticSupplyDeclarationData supply, IPneumaticConsumersDeclarationData consumer)
+		{
+			return new XElement(tns + XMLNames.BusAux_PneumaticSystem,
+					new XElement(tns + XMLNames.Bus_SizeOfAirSupply, supply.CompressorSize),
+					new XElement(tns + XMLNames.CompressorDrive, supply.CompressorDrive.GetLabel()),
+					new XElement(tns + XMLNames.Vehicle_Clutch, supply.Clutch),
+					new XElement(tns + XMLNames.Bus_CompressorRatio, supply.Ratio.ToMinSignificantDigits(3)),
+					new XElement(tns + XMLNames.Bus_SmartCompressionSystem, supply.SmartAirCompression),
+					new XElement(tns + XMLNames.Bus_SmartRegenerationSystem, supply.SmartRegeneration),
+					new XElement(tns + XMLNames.Bus_AirsuspensionControl, GetXMLAirsuspensionControl(consumer.AirsuspensionControl)),
+					new XElement(tns + XMLNames.BusAux_PneumaticSystem_SCRReagentDosing, consumer.AdBlueDosing == ConsumerTechnology.Pneumatically)
+				);
+		}
+
+		private string GetXMLAirsuspensionControl(ConsumerTechnology airsuspensionControl)
+		{
+			switch (airsuspensionControl) {
+				case ConsumerTechnology.Electrically:
+					return "electronically";
+				case ConsumerTechnology.Mechanically:
+					return "mechanically";
+				default:
+					throw new VectoException("Unknown AirsuspensionControl!");
+			}
+		}
+
+
+		private XElement GetHvac(IHVACBusAuxiliariesDeclarationData hvac)
+		{
+			return new XElement(new XElement(tns + XMLNames.BusAux_HVAC,
+				new XElement(tns + XMLNames.Bus_AdjustableCoolantThermostat, hvac.AdjustableCoolantThermostat),
+				new XElement(tns + XMLNames.Bus_EngineWasteGasHeatExchanger, hvac.EngineWasteGasHeatExchanger)));
 		}
 
 
@@ -331,7 +441,7 @@ namespace TUGraz.VectoCore.OutputData.XML
 							)),
 						new XElement(
 							tns + "Fuels",
-							mode.Fuels.Select(x => new XElement(tns + "FuelType", x.FuelType.ToXMLFormat())))
+							mode.Fuels.Select(x => new XElement(tns + XMLNames.Engine_FuelType, x.FuelType.ToXMLFormat())))
 					)
 				);
 			}
@@ -484,37 +594,11 @@ namespace TUGraz.VectoCore.OutputData.XML
 
 			return retVal.Cast<object>().ToArray();
 		}
-
-
-		private XElement GetInputdataSignature(string multistageId)
-		{
-			return new XElement(tns + XMLNames.DI_Signature,
-				new XElement(di + XMLNames.DI_Signature_Reference,
-					new XAttribute(XMLNames.DI_Signature_Reference_URI_Attr, $"#{multistageId}"),
-					new XElement(di + XMLNames.DI_Signature_Reference_Transforms,
-						new XElement(di + XMLNames.DI_Signature_Reference_Transforms_Transform,
-							new XAttribute(XMLNames.DI_Signature_Algorithm_Attr, "urn:vecto:xml:2017:canonicalization")),
-						new XElement(di + XMLNames.DI_Signature_Reference_Transforms_Transform,
-							new XAttribute(XMLNames.DI_Signature_Algorithm_Attr, "http://www.w3.org/2001/10/xml-exc-c14n#"))
-					),
-					new XElement(di + XMLNames.DI_Signature_Reference_DigestMethod,
-						new XAttribute(XMLNames.DI_Signature_Algorithm_Attr, "http://www.w3.org/2001/04/xmlenc#sha256")),
-					new XElement(di + XMLNames.DI_Signature_Reference_DigestValue, GetDigestValue(multistageId)))
-			);
-		}
-
+		
 		private string GetGUID()
 		{
 			return Guid.NewGuid().ToString("n").Substring(0, 20);
 		}
-
-		private string GetDigestValue(string multistageId)
-		{
-			var alg = SHA256.Create();
-			alg.ComputeHash(Encoding.UTF8.GetBytes(multistageId));
-			return Convert.ToBase64String(alg.Hash);
-		}
-
 	}
 
 }
-- 
GitLab