diff --git a/Directory.Packages.props b/Directory.Packages.props
index f6b55b29..fb0afb2c 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -21,7 +21,7 @@
-
+
@@ -45,7 +45,7 @@
-
+
@@ -57,7 +57,7 @@
-
+
diff --git a/docfx/articles/compiler/ADDED_MEMBERS.md b/docfx/articles/compiler/ADDED_MEMBERS.md
index 74dbd930..850e03bc 100644
--- a/docfx/articles/compiler/ADDED_MEMBERS.md
+++ b/docfx/articles/compiler/ADDED_MEMBERS.md
@@ -176,3 +176,109 @@ When the application tries to write to the variable it first validates that the
AttributeToolTip allows you to describe the variable or an object. These can be then used to give short hints to the user in the application. This attribute can be localized.
+## Typed Enum Accessor Properties
+
+### Overview
+
+For properties that store enumeration values (either PLC enums or named value types with integral backing types), the AXSharp compiler automatically generates typed enum accessor properties. These properties provide a convenient way to access the enum value cast to a strongly-typed C# enum, without requiring explicit casting.
+
+### When Generated
+
+Typed enum accessor properties are generated for:
+- Properties based on PLC `ENUM` types
+- Properties based on **named value types with integral backing types** (BYTE, USINT, SINT, INT, UINT, WORD, DINT, DWORD, UDINT, LINT, LWORD, ULINT)
+
+### Naming Convention
+
+For a property named `Status` of enum type `Color`, the compiler generates an accessor property named `StatusEnum`.
+
+### Example
+
+**PLC code:**
+~~~iecst
+{S7.extern=ReadWrite}
+TYPE Color : DINT
+ Black := 0;
+ White := 1;
+ Red := 2;
+END_TYPE
+
+CLASS PUBLIC MyClass
+ VAR PUBLIC
+ Status : Color;
+ END_VAR
+END_CLASS
+~~~
+
+**Generated C# code:**
+~~~C#
+public partial class MyClass : AXSharp.Connector.ITwinObject
+{
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Color))]
+ public OnlinerInt Status { get; }
+
+ public Color StatusEnum { get => (Color)Status.LastValue; }
+}
+~~~
+
+### Usage
+
+Instead of manually casting, you can use the generated typed accessor:
+
+~~~C#
+// Without typed accessor - requires casting
+var statusValue = (Color)myObject.Status.LastValue;
+
+// With typed accessor - automatic casting
+var statusValue = myObject.StatusEnum;
+~~~
+
+### Important: Reading the Backing Property First
+
+**The typed enum accessor properties read from the `LastValue` of the backing property.** This means that **the backing property must be read from the PLC first** for the accessor to return a valid value.
+
+The accessor does **not** perform any I/O operation itself—it simply casts the last read value.
+
+#### Example Scenario
+
+~~~C#
+// INCORRECT - StatusEnum will return default/zero value
+var status = myObject.StatusEnum; // Invalid! No read was performed yet
+
+// CORRECT - Read the backing property first
+await myObject.Status.GetAsync(); // Read from PLC
+var status = myObject.StatusEnum; // Now valid with the read value
+
+// CORRECT - Bulk read on the object
+myObject.Read(); // Cyclic read of all properties
+var status = myObject.StatusEnum; // Valid after read/polling
+~~~
+
+#### Polling/Cyclic Scenario
+
+When using a read loop that executes periodically (polling):
+
+~~~C#
+// Polling loop
+while (isRunning)
+{
+ myObject.Read(); // Reads all properties including Status
+
+ // Now all typed accessors have valid data
+ var status = myObject.StatusEnum;
+ var color = (Color)status;
+
+ await Task.Delay(100); // Update interval
+}
+~~~
+
+### EnumeratorDiscriminatorAttribute
+
+All properties with typed enum accessors are marked with `[EnumeratorDiscriminatorAttribute]`. This attribute identifies the corresponding enum type and is used internally by the framework for serialization and UI support.
+
+You can also see this marking on POCO (Plain Old CLR Object) versions of your types, where it helps maintain enum type information:
+
+~~~C#
+[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Color))]
+public Color Status { get; set; }
+~~~
diff --git a/docfx/articles/compiler/README.md b/docfx/articles/compiler/README.md
index 00d80a63..165313bd 100644
--- a/docfx/articles/compiler/README.md
+++ b/docfx/articles/compiler/README.md
@@ -80,7 +80,7 @@ Entry.Plc.weather.GeoLocation.Write();
~~~
- [Attributes](ATTRIBUTES.md)
-- [Added members](ADDED_MEMBERS.md)
+- [Added members](ADDED_MEMBERS.md) - including typed enum accessor properties
- [Config file](CONFIG_FILE.md)
- [Packaging and dependency management](PACKAGING.md)
diff --git a/src/AXSharp.blazor/src/AXSharp.Presentation.Blazor.Controls/package-lock.json b/src/AXSharp.blazor/src/AXSharp.Presentation.Blazor.Controls/package-lock.json
index 848d958b..eaf7cbe6 100644
--- a/src/AXSharp.blazor/src/AXSharp.Presentation.Blazor.Controls/package-lock.json
+++ b/src/AXSharp.blazor/src/AXSharp.Presentation.Blazor.Controls/package-lock.json
@@ -1058,4 +1058,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Helpers/CsHelpers.cs b/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Helpers/CsHelpers.cs
index 8615e7ee..b1b682fd 100644
--- a/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Helpers/CsHelpers.cs
+++ b/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Helpers/CsHelpers.cs
@@ -7,6 +7,7 @@
using System.Text;
using AX.ST.Semantic.Model.Declarations;
+using AX.ST.Semantic.Model.Declarations.Types;
using AX.ST.Syntax.Tree;
using AXSharp.Connector;
@@ -14,6 +15,21 @@ namespace AXSharp.Compiler.Cs.Helpers;
internal static class CsHelpers
{
+ private static readonly HashSet IntegralIecTypes = new(StringComparer.OrdinalIgnoreCase)
+ {
+ "BYTE", "USINT", "SINT", "INT", "UINT", "WORD",
+ "DINT", "DWORD", "UDINT", "LINT", "LWORD", "ULINT"
+ };
+
+ ///
+ /// Determines whether the backing type of a named value type is integral
+ /// and thus valid as a C# enum base type.
+ ///
+ public static bool HasIntegralBackingType(this INamedValueTypeDeclaration namedValueType)
+ {
+ return IntegralIecTypes.Contains(namedValueType.ValueTypeAccess.Type.Name.Trim());
+ }
+
public static string Transform(this IAccessModifierSyntax syntax)
{
return $"{syntax.ModifierKeyword.Text.ToLower()} ";
diff --git a/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Onliner/CsOnlinerMemberBuilder.cs b/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Onliner/CsOnlinerMemberBuilder.cs
index aa425448..3fd3e137 100644
--- a/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Onliner/CsOnlinerMemberBuilder.cs
+++ b/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Onliner/CsOnlinerMemberBuilder.cs
@@ -65,6 +65,7 @@ public void CreateFieldDeclaration(IFieldDeclaration fieldDeclaration, IxNodeVis
AddToSource("OnlinerInt");
AddToSource($" {fieldDeclaration.Name}");
AddToSource("{get;}");
+ AddToSource($"{fieldDeclaration.AccessModifier.Transform()} {@enum.GetQualifiedName()} {fieldDeclaration.Name}Enum {{ get => ({@enum.GetQualifiedName()}){fieldDeclaration.Name}.LastValue; }}");
break;
case INamedValueTypeDeclaration namedValue:
AddToSource(
@@ -74,6 +75,8 @@ public void CreateFieldDeclaration(IFieldDeclaration fieldDeclaration, IxNodeVis
//fieldDeclaration.Type.Accept(visitor, this);
AddToSource($" {fieldDeclaration.Name}");
AddToSource("{get;}");
+ if (namedValue.HasIntegralBackingType())
+ AddToSource($"{fieldDeclaration.AccessModifier.Transform()} {namedValue.GetQualifiedName()} {fieldDeclaration.Name}Enum {{ get => ({namedValue.GetQualifiedName()}){fieldDeclaration.Name}.LastValue; }}");
break;
case IArrayTypeDeclaration array:
var arrayEligibility = array.IsEligibleForTranspile(SourceBuilder, warnMissingOrInconsistent: true);
@@ -159,6 +162,7 @@ public void CreateVariableDeclaration(IVariableDeclaration semantics, IxNodeVisi
AddToSource("OnlinerInt");
AddToSource($" {semantics.Name}");
AddToSource("{get;}");
+ AddToSource($"public {@enum.GetQualifiedName()} {semantics.Name}Enum {{ get => ({@enum.GetQualifiedName()}){semantics.Name}.LastValue; }}");
break;
case INamedValueTypeDeclaration namedValue:
AddToSource(
@@ -168,6 +172,8 @@ public void CreateVariableDeclaration(IVariableDeclaration semantics, IxNodeVisi
//semantics.Type.Accept(visitor, this);
AddToSource($" {semantics.Name}");
AddToSource("{get;}");
+ if (namedValue.HasIntegralBackingType())
+ AddToSource($"public {namedValue.GetQualifiedName()} {semantics.Name}Enum {{ get => ({namedValue.GetQualifiedName()}){semantics.Name}.LastValue; }}");
break;
case IArrayTypeDeclaration array:
var arrayEligible = array.IsEligibleForTranspile(SourceBuilder, warnMissingOrInconsistent: true);
diff --git a/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Plain/CsPlainSourceBuilder.cs b/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Plain/CsPlainSourceBuilder.cs
index 14cb102d..c32ceb5c 100644
--- a/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Plain/CsPlainSourceBuilder.cs
+++ b/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Plain/CsPlainSourceBuilder.cs
@@ -1,4 +1,4 @@
-// AXSharp.Compiler.Cs
+// AXSharp.Compiler.Cs
// Copyright (c) 2023 MTS spol. s r.o., and Contributors. All Rights Reserved.
// Contributors: https://github.com/inxton/axsharp/graphs/contributors
// See the LICENSE file in the repository root for more information.
@@ -145,9 +145,14 @@ public void CreateFieldDeclaration(IFieldDeclaration fieldDeclaration, IxNodeVis
AddPropertyDeclaration(fieldDeclaration, fieldDeclaration, visitor);
AddToSource(" = string.Empty;");
break;
- case INamedValueTypeDeclaration namedValueType:
+ case IEnumTypeDeclaration @enum:
+ AddToSource($"[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::{@enum.GetQualifiedName()}))]");
AddPropertyDeclaration(fieldDeclaration, fieldDeclaration, visitor);
break;
+ case INamedValueTypeDeclaration namedValueType:
+ AddToSource($"[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::{namedValueType.GetQualifiedName()}))]");
+ AddPropertyDeclaration(fieldDeclaration, fieldDeclaration, visitor);
+ break;
case IScalarTypeDeclaration scalar:
AddPropertyDeclaration(fieldDeclaration, fieldDeclaration, visitor);
AddToSource(scalar.CreateScalarInitializer(this.Project?.CompilerOptions?.TargetPlatfromMoniker));
@@ -312,7 +317,12 @@ public void CreateVariableDeclaration(IVariableDeclaration fieldDeclaration, IxN
AddPropertyDeclaration(fieldDeclaration, fieldDeclaration, visitor);
AddToSource(" = string.Empty;");
break;
+ case IEnumTypeDeclaration @enum:
+ AddToSource($"[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof({@enum.GetQualifiedName()}))]");
+ AddPropertyDeclaration(fieldDeclaration, fieldDeclaration, visitor);
+ break;
case INamedValueTypeDeclaration namedValueType:
+ AddToSource($"[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::{namedValueType.GetQualifiedName()}))]");
AddPropertyDeclaration(fieldDeclaration, fieldDeclaration.Type, visitor);
break;
case IScalarTypeDeclaration scalar:
@@ -439,4 +449,4 @@ private static string ShortedQualifiedIfPossible(IDeclaration semantics)
? semantics.Type.FullyQualifiedName.Remove(0, semantics.ContainingNamespace.FullyQualifiedName.Length + 1)
: semantics.Type.FullyQualifiedName;
}
-}
\ No newline at end of file
+}
diff --git a/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Pragmas/PragmaExtensions.cs b/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Pragmas/PragmaExtensions.cs
index b1e7f529..34f80fe9 100644
--- a/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Pragmas/PragmaExtensions.cs
+++ b/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Pragmas/PragmaExtensions.cs
@@ -1,4 +1,4 @@
-// AXSharp.Compiler.Cs
+// AXSharp.Compiler.Cs
// Copyright (c) 2023 MTS spol. s r.o., and Contributors. All Rights Reserved.
// Contributors: https://github.com/inxton/axsharp/graphs/contributors
// See the LICENSE file in the repository root for more information.
@@ -147,13 +147,27 @@ public static string SetProperties(this ITypeDeclaration typeDeclaration)
///
public static string GetPropertyValue(this IDeclaration declaration, string propertyName, string memberName = "")
{
- var propertyValue = declaration.Pragmas.FirstOrDefault(p =>
- p.Content.Replace(" ", string.Empty).StartsWith($"{PRAGMA_PROPERTY_SET_SIGNATURE}{propertyName}"))
- ?.Content.Split('=');
+ try
+ {
+ // This is only to check for malformed pragmas, if there is any, exception will be thrown and caught in catch block and empty string will be returned.
+ string.Join("\r\n",
+ declaration.Pragmas.Where(p => p.Content.StartsWith(PRAGMA_PROPERTY_SET_SIGNATURE))
+ .Select(p => Pragmas.PragmaParser.PragmaCompiler.Compile(p).Product));
- if (propertyValue is { Length: > 0 }) return propertyValue[1].Replace("\"", string.Empty).Trim();
+ var propertyValue = declaration.Pragmas.FirstOrDefault(p =>
+ p.Content.Replace(" ", string.Empty).StartsWith($"{PRAGMA_PROPERTY_SET_SIGNATURE}{propertyName}"))
+ ?.Content.Split('=');
- return memberName;
+ if (propertyValue is { Length: > 0 }) return propertyValue[1].Replace("\"", string.Empty).Trim();
+
+ return memberName;
+ }
+ catch (MalformedPragmaException ex)
+ {
+ // swallow
+ }
+
+ return string.Empty;
}
///
diff --git a/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Pragmas/PragmaParser/PragmaCompiler.cs b/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Pragmas/PragmaParser/PragmaCompiler.cs
index 782dffd3..b28535cc 100644
--- a/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Pragmas/PragmaParser/PragmaCompiler.cs
+++ b/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Pragmas/PragmaParser/PragmaCompiler.cs
@@ -1,4 +1,4 @@
-// AXSharp.Compiler.Cs
+// AXSharp.Compiler.Cs
// Copyright (c) 2023 MTS spol. s r.o., and Contributors. All Rights Reserved.
// Contributors: https://github.com/inxton/axsharp/graphs/contributors
// See the LICENSE file in the repository root for more information.
@@ -60,7 +60,7 @@ private static VisitorProduct Compile(IPragma pragma, Parser parser)
if (pragma.Location != null)
{
diagMessage =
- $"[Error]: {pragma.Location.GetLineSpan().Filename}:{pragma.Location.GetLineSpan().StartLinePosition.Line}, {pragma.Location.GetLineSpan().StartLinePosition.Character} {malformedPragmaException.Message}";
+ $"[Error]: {pragma.Location.GetLineSpan().Filename}:{pragma.Location.GetLineSpan().StartLinePosition.Line + 1}, {pragma.Location.GetLineSpan().StartLinePosition.Character} {malformedPragmaException.Message}";
}
Log.Logger.Error(diagMessage);
diff --git a/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Pragmas/PragmaParser/PragmaGrammar.cs b/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Pragmas/PragmaParser/PragmaGrammar.cs
index 15af93e2..771f6dfd 100644
--- a/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Pragmas/PragmaParser/PragmaGrammar.cs
+++ b/src/AXSharp.compiler/src/AXSharp.Cs.Compiler/Pragmas/PragmaParser/PragmaGrammar.cs
@@ -1,4 +1,4 @@
-// AXSharp.Compiler.Cs
+// AXSharp.Compiler.Cs
// Copyright (c) 2023 MTS spol. s r.o., and Contributors. All Rights Reserved.
// Contributors: https://github.com/inxton/axsharp/graphs/contributors
// See the LICENSE file in the repository root for more information.
@@ -130,7 +130,7 @@ public PragmaGrammar()
AddedPropertySetter.Rule =
ix_set + colon + AddedPropertyIdentifier + assing + AddedPropertyInitializer;
- Pragmas.Rule = AddedPropertyDeclaration | DeclarationAttribute | AddedPropertySetter | GenericAttribute;
+ Pragmas.Rule = AddedPropertyDeclaration | AddedPropertySetter | DeclarationAttribute | GenericAttribute;
Root = Pragmas;
@@ -145,4 +145,4 @@ public override void BuildAst(LanguageData language, ParseTree parseTree)
var astBuilder = new AstBuilder(astContext);
astBuilder.BuildAst(parseTree);
}
-}
\ No newline at end of file
+}
diff --git a/src/AXSharp.compiler/src/ixc/Properties/launchSettings.json b/src/AXSharp.compiler/src/ixc/Properties/launchSettings.json
index aec971df..324ff584 100644
--- a/src/AXSharp.compiler/src/ixc/Properties/launchSettings.json
+++ b/src/AXSharp.compiler/src/ixc/Properties/launchSettings.json
@@ -73,6 +73,11 @@
"ixc_data": {
"commandName": "Project",
"workingDirectory": "D:\\github\\Inxton\\axopen\\src\\data\\tests\\AXOpen.Data.Tests_L1\\ax"
+ },
+ "honolulu": {
+ "commandName": "Project",
+ "commandLineArgs": "--skip-deps",
+ "workingDirectory": "c:\\W\\Develop\\gh\\inxton\\simatic-ax\\axopen.templates\\axopen.template.simple\\ax\\"
}
}
-}
\ No newline at end of file
+}
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/Pragmas/PragmaParserTests.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/Pragmas/PragmaParserTests.cs
new file mode 100644
index 00000000..674802cd
--- /dev/null
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/Pragmas/PragmaParserTests.cs
@@ -0,0 +1,657 @@
+// AXSharp.Compiler.CsTests
+// Copyright (c) 2023 MTS spol. s r.o., and Contributors. All Rights Reserved.
+// Contributors: https://github.com/inxton/axsharp/graphs/contributors
+// See the LICENSE file in the repository root for more information.
+// https://github.com/inxton/axsharp/blob/dev/LICENSE
+// Third party licenses: https://github.com/inxton/axsharp/blob/master/notices.md
+
+using System.Collections.ObjectModel;
+using AX.ST.Semantic.Model.Declarations;
+using AX.ST.Semantic.Pragmas;
+using AXSharp.Compiler.Cs.Pragmas.PragmaParser;
+using NSubstitute;
+
+namespace AXSharp.Compiler.CsTests.Pragmas;
+
+public class PragmaParserTests
+{
+ private IPragma CreatePragma(string content)
+ {
+ return new PragmaMock(content);
+ }
+
+ private IDeclaration CreateDeclaration(string name = "TestMember")
+ {
+ var declaration = Substitute.For();
+ declaration.Name.Returns(name);
+ return declaration;
+ }
+
+ #region Added Property Declaration Tests
+
+ [Fact]
+ public void Should_Parse_Simple_Property_Declaration()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-prop:public int MyProperty");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("MyProperty", result.Product);
+ Assert.Contains("public", result.Product);
+ Assert.Contains("int", result.Product);
+ Assert.Contains("get;", result.Product);
+ Assert.Contains("set;", result.Product);
+ }
+
+ [Fact]
+ public void Should_Parse_Property_Declaration_With_String_Type()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-prop:public string DisplayName");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ // String properties have special handling with interpolation and localization
+ Assert.Contains("DisplayName", result.Product);
+ Assert.Contains("_DisplayName", result.Product);
+ Assert.Contains("Interpolate", result.Product);
+ Assert.Contains("SymbolTail", result.Product);
+ Assert.Contains("GetDisplayName", result.Product);
+ Assert.Contains("DisplayName_raw", result.Product);
+ }
+
+ [Fact]
+ public void Should_Parse_Property_Declaration_With_WString_Type()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-prop:public WSTRING Description");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ // WSTRING has the same special handling as STRING
+ Assert.Contains("Description", result.Product);
+ Assert.Contains("_Description", result.Product);
+ Assert.Contains("Interpolate", result.Product);
+ Assert.Contains("SymbolTail", result.Product);
+ }
+
+ [Fact]
+ public void Should_Parse_Property_Declaration_With_Protected_Modifier()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-prop:protected bool IsEnabled");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("protected", result.Product);
+ Assert.Contains("bool", result.Product);
+ Assert.Contains("IsEnabled", result.Product);
+ }
+
+ [Fact]
+ public void Should_Parse_Property_Declaration_With_Private_Modifier()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-prop:private decimal Price");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("private", result.Product);
+ Assert.Contains("decimal", result.Product);
+ Assert.Contains("Price", result.Product);
+ }
+
+ [Fact]
+ public void Should_Parse_Property_Declaration_With_Complex_Type()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-prop:public Dictionary Tags");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("Dictionary", result.Product);
+ Assert.Contains("Tags", result.Product);
+ }
+
+ #endregion
+
+ #region Attribute Declaration Tests
+
+ [Fact]
+ public void Should_Parse_Attribute_Declaration_With_Simple_Attribute()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-attr:[ReadOnly()]");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Equal("[ReadOnly()]", result.Product);
+ }
+
+ [Fact]
+ public void Should_Parse_Attribute_Declaration_With_Attribute_Parameters()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-attr:[Container(Layout.Wrap)]");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Equal("[Container(Layout.Wrap)]", result.Product);
+ }
+
+ [Fact]
+ public void Should_Parse_Attribute_Declaration_With_Multiple_Parameters()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-attr:[Group(\"General\", Layout.GroupBox)]");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("[Group(", result.Product);
+ Assert.Contains("General", result.Product);
+ Assert.Contains("Layout.GroupBox", result.Product);
+ }
+
+ [Fact]
+ public void Should_Parse_Attribute_Declaration_With_Numeric_Parameters()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-attr:[FieldSize(500)]");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Equal("[FieldSize(500)]", result.Product);
+ }
+
+ #endregion
+
+ #region Property Setter Tests
+
+ [Fact]
+ public void Should_Parse_Property_Setter_With_String_Value()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-set:Title = \"My Title\"");
+ var declaration = CreateDeclaration("myField");
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("Title", result.Product);
+ Assert.Contains("@\"My Title\"", result.Product);
+ Assert.Contains("myField.Title", result.Product);
+ Assert.Equal(("Title", "@\"My Title\""), result.Property);
+ }
+
+ [Fact]
+ public void Should_Parse_Property_Setter_With_Numeric_Value()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-set:MinValue = 100");
+ var declaration = CreateDeclaration("myField");
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("MinValue", result.Product);
+ Assert.Contains("100", result.Product);
+ Assert.Contains("myField.MinValue", result.Product);
+ Assert.Equal(("MinValue", "100"), result.Property);
+ }
+
+ [Fact]
+ public void Should_Parse_Property_Setter_With_Float_Value()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-set:Scale = 2.5");
+ var declaration = CreateDeclaration("myField");
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("Scale", result.Product);
+ Assert.Contains("2.5", result.Product);
+ Assert.Equal(("Scale", "2.5"), result.Property);
+ }
+
+ [Fact]
+ public void Should_Parse_Property_Setter_With_Boolean_Value()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-set:IsVisible = True");
+ var declaration = CreateDeclaration("myField");
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("IsVisible", result.Product);
+ Assert.Contains("True", result.Product);
+ Assert.Equal(("IsVisible", "True"), result.Property);
+ }
+
+ [Fact]
+ public void Should_Parse_Property_Setter_With_Enum_Value()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-set:Alignment = TextAlignment.Center");
+ var declaration = CreateDeclaration("myField");
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("Alignment", result.Product);
+ Assert.Contains("TextAlignment.Center", result.Product);
+ Assert.Equal(("Alignment", "TextAlignment.Center"), result.Property);
+ }
+
+ [Fact]
+ public void Should_Parse_Property_Setter_With_String_And_Maintain_Quotes()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-set:Name = \"Test Name With Spaces\"");
+ var declaration = CreateDeclaration("myField");
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Property);
+ var (propertyName, value) = result.Property;
+ Assert.Equal("Name", propertyName);
+ Assert.StartsWith("@\"", value);
+ Assert.Contains("Test Name With Spaces", value);
+ }
+
+ #endregion
+
+ #region Generic Declaration Tests
+
+ [Fact]
+ public void Should_Parse_Simple_Generic_Declaration()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-generic:");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("", result.Product);
+ Assert.NotNull(result.GenericTypes);
+ Assert.Contains("T", result.GenericTypes);
+ }
+
+ [Fact]
+ public void Should_Parse_Multiple_Generic_Parameters()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-generic:");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("T", result.Product);
+ Assert.Contains("U", result.Product);
+ Assert.Contains("V", result.Product);
+ Assert.NotNull(result.GenericTypes);
+ Assert.Contains("T", result.GenericTypes);
+ Assert.Contains("U", result.GenericTypes);
+ Assert.Contains("V", result.GenericTypes);
+ }
+
+ [Fact]
+ public void Should_Parse_Generic_Declaration_With_Constraints()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-generic: where T : IComparable");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("T", result.Product);
+ Assert.Contains("where", result.GenericConstrains);
+ Assert.Contains("IComparable", result.GenericConstrains);
+ }
+
+ [Fact]
+ public void Should_Parse_Generic_Declaration_With_Multiple_Constraints()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-generic: where T : class where U : struct");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.GenericConstrains);
+ Assert.Contains("where T : class", result.GenericConstrains);
+ Assert.Contains("where U : struct", result.GenericConstrains);
+ }
+
+ [Fact]
+ public void Should_Parse_Generic_Type_Assignment_With_AsKeyword()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-generic:T as POCO");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result.GenericTypeAssignment);
+ }
+
+ #endregion
+
+ #region Error Handling Tests
+
+ [Fact]
+ public void Should_Throw_MalformedPragmaException_For_Invalid_Property_Pragma()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-prop:invalid syntax");
+ var declaration = CreateDeclaration();
+
+ // Act & Assert
+ Assert.Throws(() => PragmaCompiler.Compile(pragma, declaration));
+ }
+
+ [Fact]
+ public void Should_Throw_MalformedPragmaException_For_Empty_Pragma()
+ {
+ // Arrange
+ var pragma = CreatePragma("");
+ var declaration = CreateDeclaration();
+
+ // Act & Assert
+ Assert.Throws(() => PragmaCompiler.Compile(pragma, declaration));
+ }
+
+ [Fact]
+ public void Should_Throw_MalformedPragmaException_For_Unknown_Pragma_Type()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-unknown:something");
+ var declaration = CreateDeclaration();
+
+ // Act & Assert
+ Assert.Throws(() => PragmaCompiler.Compile(pragma, declaration));
+ }
+
+ [Fact]
+ public void Should_Throw_MalformedPragmaException_For_Malformed_Attribute()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-attr:[Incomplete(");
+ var declaration = CreateDeclaration();
+
+ // Act & Assert
+ Assert.Throws(() => PragmaCompiler.Compile(pragma, declaration));
+ }
+
+ [Fact]
+ public void Should_Throw_MalformedPragmaException_For_Missing_Colon()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-prop public int MyProperty");
+ var declaration = CreateDeclaration();
+
+ // Act & Assert
+ Assert.Throws(() => PragmaCompiler.Compile(pragma, declaration));
+ }
+
+ #endregion
+
+ #region Edge Cases Tests
+
+ [Fact]
+ public void Should_Parse_Property_Declaration_With_Underscores_In_Name()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-prop:public string My_Property_Name");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("My_Property_Name", result.Product);
+ }
+
+ [Fact]
+ public void Should_Parse_Property_Declaration_With_Numbers_In_Name()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-prop:public int Property123");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("Property123", result.Product);
+ }
+
+ [Fact]
+ public void Should_Parse_Attribute_With_Complex_Content()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-attr:[CustomAttribute(\"param1\", 123, true, SomeEnum.Value)]");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("[CustomAttribute(", result.Product);
+ Assert.Contains("param1", result.Product);
+ Assert.Contains("123", result.Product);
+ Assert.Contains("true", result.Product);
+ Assert.Contains("SomeEnum.Value", result.Product);
+ }
+
+ [Fact]
+ public void Should_Compile_Pragma_Without_Declaration()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-prop:public string Title");
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("Title", result.Product);
+ }
+
+ [Fact]
+ public void Should_Parse_Property_Setter_With_Empty_String()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-set:Value = \"\"");
+ var declaration = CreateDeclaration("myField");
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("Value", result.Product);
+ Assert.Contains("@\"\"", result.Product);
+ }
+
+ #endregion
+
+ #region Integration Tests
+
+ [Fact]
+ public void Should_Preserve_Case_Sensitivity_In_Property_Names()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-prop:public string MyPropName");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result);
+ Assert.NotNull(result.Product);
+ Assert.Contains("MyPropName", result.Product);
+ Assert.DoesNotContain("mypropname", result.Product);
+ }
+
+ [Fact]
+ public void Should_Handle_String_Type_Case_Insensitive()
+ {
+ // Arrange - using lowercase "string"
+ var pragma1 = CreatePragma("#ix-prop:public string Name");
+ var pragma2 = CreatePragma("#ix-prop:public STRING Name");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result1 = PragmaCompiler.Compile(pragma1, declaration);
+ var result2 = PragmaCompiler.Compile(pragma2, declaration);
+
+ // Assert - both should have the special string handling
+ Assert.Contains("_Name", result1.Product);
+ Assert.Contains("_Name", result2.Product);
+ Assert.Contains("Interpolate", result1.Product);
+ Assert.Contains("Interpolate", result2.Product);
+ }
+
+ [Fact]
+ public void Should_Generate_Property_With_Getter_Setter_For_Non_String_Types()
+ {
+ // Arrange
+ var pragma = CreatePragma("#ix-prop:public int Count");
+ var declaration = CreateDeclaration();
+
+ // Act
+ var result = PragmaCompiler.Compile(pragma, declaration);
+
+ // Assert
+ Assert.NotNull(result.Product);
+ // Should be a simple auto-property
+ Assert.Matches(@"Count\s*\{\s*get;\s*set;\s*\}", result.Product);
+ Assert.DoesNotContain("Interpolate", result.Product);
+ }
+
+ #endregion
+}
+
+///
+/// Mock implementation of IPragma for testing purposes.
+///
+public class PragmaMock : IPragma
+{
+ public PragmaMock(string content)
+ {
+ Content = content;
+ }
+
+ public string Content { get; }
+
+ public AX.Text.Location Location => null;
+
+ public IEnumerable ChildNodes => throw new NotImplementedException();
+
+ public TResult Accept(AX.ST.Semantic.Tree.ISemanticNodeVisitor visitor, TContext data)
+ {
+ throw new NotImplementedException();
+ }
+
+ public IEnumerable GetDescendentNodes()
+ {
+ throw new NotImplementedException();
+ }
+}
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Configurations.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Configurations.g.cs
index 17dc6c6f..c8759fe4 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Configurations.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Configurations.g.cs
@@ -51,18 +51,22 @@ public partial class unitsTwinController : ITwinController
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Colorss))]
public OnlinerInt Colorss { get; }
+ public Colorss ColorssEnum { get => (Colorss)Colorss.LastValue; }
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Colorsss))]
public OnlinerULInt Colorsss { get; }
+ public Colorsss ColorsssEnum { get => (Colorsss)Colorsss.LastValue; }
[CompilerOmitsAttribute("POCO")]
public OnlinerBool _must_be_omitted_in_poco { get; }
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Colorss))]
public OnlinerInt Colorss2 { get; }
+ public Colorss Colorss2Enum { get => (Colorss)Colorss2.LastValue; }
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Colorsss))]
public OnlinerULInt Colorsss2 { get; }
+ public Colorsss Colorsss2Enum { get => (Colorsss)Colorsss2.LastValue; }
public OnlinerBool MotorOn { get; }
public OnlinerInt MotorState { get; }
public Motor Motor1 { get; }
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/compileromitsattribute.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/compileromitsattribute.g.cs
index b302f337..056e16e0 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/compileromitsattribute.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/compileromitsattribute.g.cs
@@ -473,6 +473,7 @@ public partial class ClassWithEnums : AXSharp.Connector.ITwinObject
{
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Enums.Colors))]
public OnlinerInt colors { get; }
+ public Enums.Colors colorsEnum { get => (Enums.Colors)colors.LastValue; }
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Enums.NamedValuesColors))]
public OnlinerString NamedValuesColors { get; }
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/misc.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/misc.g.cs
index 0ad24a32..28431527 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/misc.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/misc.g.cs
@@ -11,6 +11,7 @@ public partial class ClassWithEnums : AXSharp.Connector.ITwinObject
{
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Enums.Colors))]
public OnlinerInt colors { get; }
+ public Enums.Colors colorsEnum { get => (Enums.Colors)colors.LastValue; }
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Enums.NamedValuesColors))]
public OnlinerString NamedValuesColors { get; }
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/type_named_values.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/type_named_values.g.cs
index 13a8bca3..b6cfa6a4 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/type_named_values.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/type_named_values.g.cs
@@ -18,6 +18,7 @@ public partial class using_type_named_values : AXSharp.Connector.ITwinObject
{
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(NamedValuesNamespace.LightColors))]
public OnlinerInt LColors { get; }
+ public NamedValuesNamespace.LightColors LColorsEnum { get => (NamedValuesNamespace.LightColors)LColors.LastValue; }
partial void PreConstruct(AXSharp.Connector.ITwinObject parent, string readableTail, string symbolTail);
partial void PostConstruct(AXSharp.Connector.ITwinObject parent, string readableTail, string symbolTail);
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/type_named_values_literals.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/type_named_values_literals.g.cs
index 343ca703..ce28fd00 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/type_named_values_literals.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/type_named_values_literals.g.cs
@@ -20,6 +20,7 @@ public partial class using_type_named_values : AXSharp.Connector.ITwinObject
{
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Simatic.Ax.StateFramework.StateControllerStatus))]
public OnlinerWord LColors { get; }
+ public Simatic.Ax.StateFramework.StateControllerStatus LColorsEnum { get => (Simatic.Ax.StateFramework.StateControllerStatus)LColors.LastValue; }
partial void PreConstruct(AXSharp.Connector.ITwinObject parent, string readableTail, string symbolTail);
partial void PostConstruct(AXSharp.Connector.ITwinObject parent, string readableTail, string symbolTail);
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/type_with_enum.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/type_with_enum.g.cs
index 21d4caed..859bc965 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/type_with_enum.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/Onliners/type_with_enum.g.cs
@@ -30,6 +30,7 @@ public partial class CompareGuardLint : AXSharp.Connector.ITwinObject, IGuard
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Simatic.Ax.StateFramework.Condition))]
public OnlinerInt Condition { get; }
+ public Simatic.Ax.StateFramework.Condition ConditionEnum { get => (Simatic.Ax.StateFramework.Condition)Condition.LastValue; }
partial void PreConstruct(AXSharp.Connector.ITwinObject parent, string readableTail, string symbolTail);
partial void PostConstruct(AXSharp.Connector.ITwinObject parent, string readableTail, string symbolTail);
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/compileromitsattribute.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/compileromitsattribute.g.cs
index 2e89b94c..b3b73385 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/compileromitsattribute.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/compileromitsattribute.g.cs
@@ -35,7 +35,10 @@ public ClassWithEnums()
{
}
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::Enums.Colors))]
public global::Enums.Colors colors { get; set; }
+
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::Enums.NamedValuesColors))]
public String NamedValuesColors { get; set; }
}
}
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/misc.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/misc.g.cs
index 1eae7fcb..989e1686 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/misc.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/misc.g.cs
@@ -12,7 +12,10 @@ public ClassWithEnums()
{
}
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::Enums.Colors))]
public global::Enums.Colors colors { get; set; }
+
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::Enums.NamedValuesColors))]
public String NamedValuesColors { get; set; }
}
}
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/type_named_values.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/type_named_values.g.cs
index a5e6936b..6f2360d4 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/type_named_values.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/type_named_values.g.cs
@@ -12,6 +12,7 @@ public using_type_named_values()
{
}
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::NamedValuesNamespace.LightColors))]
public Int16 LColors { get; set; }
}
}
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/type_named_values_literals.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/type_named_values_literals.g.cs
index 14b4df59..c41ecffb 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/type_named_values_literals.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/type_named_values_literals.g.cs
@@ -12,6 +12,7 @@ public using_type_named_values()
{
}
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::Simatic.Ax.StateFramework.StateControllerStatus))]
public UInt16 LColors { get; set; }
}
}
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/type_with_enum.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/type_with_enum.g.cs
index 14b70914..b6cff650 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/type_with_enum.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/.g/POCO/type_with_enum.g.cs
@@ -20,6 +20,8 @@ public CompareGuardLint()
}
public Int64 CompareToValue { get; set; }
+
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::Simatic.Ax.StateFramework.Condition))]
public global::Simatic.Ax.StateFramework.Condition Condition { get; set; }
}
}
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/units.csproj b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/units.csproj
index 2cb3c2ea..121cd732 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/units.csproj
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/ax/units.csproj
@@ -6,8 +6,8 @@
-
-
+
+
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Configurations.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Configurations.g.cs
index 17dc6c6f..c8759fe4 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Configurations.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Configurations.g.cs
@@ -51,18 +51,22 @@ public partial class unitsTwinController : ITwinController
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Colorss))]
public OnlinerInt Colorss { get; }
+ public Colorss ColorssEnum { get => (Colorss)Colorss.LastValue; }
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Colorsss))]
public OnlinerULInt Colorsss { get; }
+ public Colorsss ColorsssEnum { get => (Colorsss)Colorsss.LastValue; }
[CompilerOmitsAttribute("POCO")]
public OnlinerBool _must_be_omitted_in_poco { get; }
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Colorss))]
public OnlinerInt Colorss2 { get; }
+ public Colorss Colorss2Enum { get => (Colorss)Colorss2.LastValue; }
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Colorsss))]
public OnlinerULInt Colorsss2 { get; }
+ public Colorsss Colorsss2Enum { get => (Colorsss)Colorsss2.LastValue; }
public OnlinerBool MotorOn { get; }
public OnlinerInt MotorState { get; }
public Motor Motor1 { get; }
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/compileromitsattribute.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/compileromitsattribute.g.cs
index b302f337..056e16e0 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/compileromitsattribute.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/compileromitsattribute.g.cs
@@ -473,6 +473,7 @@ public partial class ClassWithEnums : AXSharp.Connector.ITwinObject
{
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Enums.Colors))]
public OnlinerInt colors { get; }
+ public Enums.Colors colorsEnum { get => (Enums.Colors)colors.LastValue; }
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Enums.NamedValuesColors))]
public OnlinerString NamedValuesColors { get; }
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/misc.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/misc.g.cs
index 0ad24a32..28431527 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/misc.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/misc.g.cs
@@ -11,6 +11,7 @@ public partial class ClassWithEnums : AXSharp.Connector.ITwinObject
{
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Enums.Colors))]
public OnlinerInt colors { get; }
+ public Enums.Colors colorsEnum { get => (Enums.Colors)colors.LastValue; }
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Enums.NamedValuesColors))]
public OnlinerString NamedValuesColors { get; }
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/type_named_values.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/type_named_values.g.cs
index 13a8bca3..b6cfa6a4 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/type_named_values.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/type_named_values.g.cs
@@ -18,6 +18,7 @@ public partial class using_type_named_values : AXSharp.Connector.ITwinObject
{
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(NamedValuesNamespace.LightColors))]
public OnlinerInt LColors { get; }
+ public NamedValuesNamespace.LightColors LColorsEnum { get => (NamedValuesNamespace.LightColors)LColors.LastValue; }
partial void PreConstruct(AXSharp.Connector.ITwinObject parent, string readableTail, string symbolTail);
partial void PostConstruct(AXSharp.Connector.ITwinObject parent, string readableTail, string symbolTail);
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/type_named_values_literals.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/type_named_values_literals.g.cs
index 343ca703..ce28fd00 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/type_named_values_literals.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/type_named_values_literals.g.cs
@@ -20,6 +20,7 @@ public partial class using_type_named_values : AXSharp.Connector.ITwinObject
{
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Simatic.Ax.StateFramework.StateControllerStatus))]
public OnlinerWord LColors { get; }
+ public Simatic.Ax.StateFramework.StateControllerStatus LColorsEnum { get => (Simatic.Ax.StateFramework.StateControllerStatus)LColors.LastValue; }
partial void PreConstruct(AXSharp.Connector.ITwinObject parent, string readableTail, string symbolTail);
partial void PostConstruct(AXSharp.Connector.ITwinObject parent, string readableTail, string symbolTail);
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/type_with_enum.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/type_with_enum.g.cs
index 21d4caed..859bc965 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/type_with_enum.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/Onliners/type_with_enum.g.cs
@@ -30,6 +30,7 @@ public partial class CompareGuardLint : AXSharp.Connector.ITwinObject, IGuard
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(Simatic.Ax.StateFramework.Condition))]
public OnlinerInt Condition { get; }
+ public Simatic.Ax.StateFramework.Condition ConditionEnum { get => (Simatic.Ax.StateFramework.Condition)Condition.LastValue; }
partial void PreConstruct(AXSharp.Connector.ITwinObject parent, string readableTail, string symbolTail);
partial void PostConstruct(AXSharp.Connector.ITwinObject parent, string readableTail, string symbolTail);
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/compileromitsattribute.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/compileromitsattribute.g.cs
index 2e89b94c..b3b73385 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/compileromitsattribute.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/compileromitsattribute.g.cs
@@ -35,7 +35,10 @@ public ClassWithEnums()
{
}
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::Enums.Colors))]
public global::Enums.Colors colors { get; set; }
+
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::Enums.NamedValuesColors))]
public String NamedValuesColors { get; set; }
}
}
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/misc.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/misc.g.cs
index 1eae7fcb..989e1686 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/misc.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/misc.g.cs
@@ -12,7 +12,10 @@ public ClassWithEnums()
{
}
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::Enums.Colors))]
public global::Enums.Colors colors { get; set; }
+
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::Enums.NamedValuesColors))]
public String NamedValuesColors { get; set; }
}
}
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/type_named_values.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/type_named_values.g.cs
index a5e6936b..6f2360d4 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/type_named_values.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/type_named_values.g.cs
@@ -12,6 +12,7 @@ public using_type_named_values()
{
}
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::NamedValuesNamespace.LightColors))]
public Int16 LColors { get; set; }
}
}
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/type_named_values_literals.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/type_named_values_literals.g.cs
index 14b4df59..c41ecffb 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/type_named_values_literals.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/type_named_values_literals.g.cs
@@ -12,6 +12,7 @@ public using_type_named_values()
{
}
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::Simatic.Ax.StateFramework.StateControllerStatus))]
public UInt16 LColors { get; set; }
}
}
diff --git a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/type_with_enum.g.cs b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/type_with_enum.g.cs
index 14b70914..b6cff650 100644
--- a/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/type_with_enum.g.cs
+++ b/src/AXSharp.compiler/tests/AXSharp.Compiler.CsTests/samples/units/expected/tia/.g/POCO/type_with_enum.g.cs
@@ -20,6 +20,8 @@ public CompareGuardLint()
}
public Int64 CompareToValue { get; set; }
+
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::Simatic.Ax.StateFramework.Condition))]
public global::Simatic.Ax.StateFramework.Condition Condition { get; set; }
}
}
diff --git a/src/AXSharp.connectors/src/AXSharp.Connector/Identity/TwinIdentityProvider.cs b/src/AXSharp.connectors/src/AXSharp.Connector/Identity/TwinIdentityProvider.cs
index e14d8a27..a305af45 100644
--- a/src/AXSharp.connectors/src/AXSharp.Connector/Identity/TwinIdentityProvider.cs
+++ b/src/AXSharp.connectors/src/AXSharp.Connector/Identity/TwinIdentityProvider.cs
@@ -1,4 +1,4 @@
-// AXSharp.Connector
+// AXSharp.Connector
// Copyright (c) 2023 MTS spol. s r.o., and Contributors. All Rights Reserved.
// Contributors: https://github.com/inxton/axsharp/graphs/contributors
// See the LICENSE file in the repository root for more information.
@@ -238,7 +238,7 @@ public async Task WriteIdentities(IEnumerable identitiesToWrite)
///
public async Task ConstructIdentitiesAsync(Func identityProvider = null)
{
- await WriteIdentities(AssignIdentities(await ReadIdentitiesAsync(), identityProvider));
+ await WriteIdentities(AssignIdentities(_identitiesTags, identityProvider));
await SortIdentitiesAsync();
}
@@ -247,13 +247,17 @@ public async Task ConstructIdentitiesAsync(Func identityPro
///
internal async Task SortIdentitiesAsync()
{
- await Task.Run(() =>
+ await Task.Run(async () =>
{
_connector?.Logger.Information("Sorting identities...");
+ if (_connector != null)
+ {
+ await _connector?.ReadBatchAsync(_identities.Select(p => p.Key), eAccessPriority.High);
+ }
_sortedIdentities.Clear();
foreach (var identity in _identities)
{
- var key = identity.Key.LastValue == 0 ? identity.Key.GetAsync().Result : identity.Key.LastValue;
+ var key = identity.Key.LastValue;
if (!_sortedIdentities.ContainsKey(key))
{
_sortedIdentities.Add(key, identity.Value);
@@ -280,4 +284,4 @@ public class DuplicateIdentityException : Exception
public DuplicateIdentityException(string message) : base(message)
{
}
-}
\ No newline at end of file
+}
diff --git a/src/AXSharp.connectors/tests/ax-test-project/hwc/hwc.gen/plc_line.SecurityConfiguration.json b/src/AXSharp.connectors/tests/ax-test-project/hwc/hwc.gen/plc_line.SecurityConfiguration.json
index 869d1542..cdfd9bec 100644
--- a/src/AXSharp.connectors/tests/ax-test-project/hwc/hwc.gen/plc_line.SecurityConfiguration.json
+++ b/src/AXSharp.connectors/tests/ax-test-project/hwc/hwc.gen/plc_line.SecurityConfiguration.json
@@ -1,9 +1,9 @@
{
- "PKIData": "AQAAAAAAAAAAAAAAAAAAAAEBAewdAAAAAAAAAAAAAAAAAwAAAN8ALS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUhvd0ZBWUhLb1pJemowQ0FRWUpLeVFEQXdJSUFRRUxBMklBQkFYOGc3a3I0QU5rQ0N5TXJ3Sy9Rem9xL3NpNgpUaXZhOUJLVko2Z3VXQmJqODhFWS9DdVh5eG1tZ2h0S0FhS0Z5bno5U0pFeWY3V0VxdVdnamZ6RFNNN1BPNHdaCmtabWdMRjI3WVpVaUZqeVY5WEFqU2krUzUwS0FVNUZzVTMzaDV3PT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCnsBAQACAAAnEAAgj6pb1Nhdi/uu8oTrbzfGaV/tlDOm55SNjxEW0Tl70/ABACAADAAQHF+jeXlKuXBE27yS5cj0lQEAAAE2W989SJQ2soB2fzxq6d1fop1+mZIkclCSZhGOPO43/KOnQx7VV6JJG8PaO+xU5RfZAz2vbHd8m4+QfC6aaKuyl6bcxikxLlHMNY2HrDTIyudJaXaa/4ATf9wPEvtt8ExEZp23L2AcT62ce70rh7HMDLX5bdE3WSpZQRYNtK8MqLeYqLKiZfm2gXooL3xUdv0QWO/+V9xv49eYgvOSKSiWQ3+yfwPyPcQPNuP35OK1ihR9Y/7gR79m0p/uvjU2aIWf92HO7sPaz1MZwUEY0xT5cPJZ/F/n60jP0JB9mcsPoATMet/7pw3OdxWXuUOovhRqgbWu9k+MGHcsAKPD3IfXEkuIynSWr5hrDYlAvUE/NfRSYtXE0GGzN/R85T7EyMELQWvVYyBP7WXq4/gNkOcQl3N8aCWdPQIAFENvbW1vbk5hbWVPckhvc3RuYW1lAQAAAAAAAAABAAAAAgAAAAAAAAAUAAnrm3TVFTnrmUh/f9zjkaK/yQL8cAUBAAVsLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpNSUlEeURDQ0FyQ2dBd0lCQWdJVVVpL2lwR01vT3FHeFNuOGRoaGhQaDBySWlJUXdEUVlKS29aSWh2Y05BUUVMQlFBd2dZWXhDekFKDQpCZ05WQkFZVEFsaFlNUkl3RUFZRFZRUUlEQWxUZEdGMFpVNWhiV1V4RVRBUEJnTlZCQWNNQ0VOcGRIbE9ZVzFsTVJRd0VnWURWUVFLDQpEQXREYjIxd1lXNTVUbUZ0WlRFYk1Ca0dBMVVFQ3d3U1EyOXRjR0Z1ZVZObFkzUnBiMjVPWVcxbE1SMHdHd1lEVlFRRERCUkRiMjF0DQpiMjVPWVcxbFQzSkliM04wYm1GdFpUQWVGdzB5TlRBMU16QXdPRFEzTWpCYUZ3MHlOakExTXpBd09EUTNNakJhTUlHR01Rc3dDUVlEDQpWUVFHRXdKWVdERVNNQkFHQTFVRUNBd0pVM1JoZEdWT1lXMWxNUkV3RHdZRFZRUUhEQWhEYVhSNVRtRnRaVEVVTUJJR0ExVUVDZ3dMDQpRMjl0Y0dGdWVVNWhiV1V4R3pBWkJnTlZCQXNNRWtOdmJYQmhibmxUWldOMGFXOXVUbUZ0WlRFZE1Cc0dBMVVFQXd3VVEyOXRiVzl1DQpUbUZ0WlU5eVNHOXpkRzVoYldVd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM0Z3BJNVg2aDJmY3ZjDQpDWGt4RmpQbi9RL2RXYnFZaEtBb3VvQkV1QWhtS2J5QlFvU0VqSGw2WFM2YmU0QzU2ZWx2cnlHQ3lxNGUyUW5VYkhnTDM0Y2xUTFJQDQpwaWhqUk5BR2x1YkJUbndYeEJ3ZmNVMXM4T0lrRkhRUXNML3hPZ1QrbWhtQis0MU9mMDFoZnd5MUdVd292b1QxbTdXZEdTUEl4Y1ZyDQpGZjI3bS95Qm82cDZwQ2VaRndQOEVMYlh2VnptaDZ1c1g5eno1WTVkeHIrSjlnTVN2NGZvUUZQMWRiMEx5d3Q1OHNjM2MyWGd2ZFJSDQpDa1A3RlRrTFluK3ZrMUl5b01aVHQxWWQ0T1lLa2g2MlVyN3RiWjBWSGxTWlczSzVRLzNCSmo1VGlhZW12RHBGUXBZWHIxcU1GMXZoDQpiWENoSktlcER2Z216Rm5GY1huVG9zT1JBZ01CQUFHakxEQXFNQWtHQTFVZEV3UUNNQUF3SFFZRFZSME9CQllFRkVMT0I5eWI3WWduDQo0cVpmSm50aFpBeXloU2QvTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCMkl0WGVQQklVaGJ6cW1raUpXakdBalhzYXo4aVMrNlBnDQpLMzY1N0JnMkp6cWhsOGlWM2lPTkgzV003bXVycUxsemhTcmM2dkUxVWtiUkhTazR6QXp1Q3pndXBRL0dUSnFLbW5SSjVSZ21EaHFyDQpJSlgycmcrY242NUYzNzBhbndwUzRsTGI5Q1pBQmowOGRBNEVURktCV2tJMHd0dzJZMXRxSkh2U293SkVHRXUrYUc1OXY0WUVnVVZjDQp5UjZ1ekJnbndFN1V3dUtpTmhsQzM3YjVmamxNSk0rSkpwTEtJNFB2RGl5aE53cjlzTlB4OEF0VExUOEhqUWRCeFZwTUVBMndFRkJsDQpDTGFMZGlZU3FkMnljbVdnc1RvTWVyYnJoeHFxUlF1N01HcTJ3RWNxbVNTZkpBNGdqNEN5RXhUQlVkY1RyVElJRVN1K2Y1SnA1MThsDQptTG9sDQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tDQoLCAEAALMBAAIAfDB6MBQGByqGSM49AgEGCSskAwMCCAEBCwNiAARTA/Qv5B9MnZpFeHOwXZW53SIh/xgGNcjT1TPevyQA6pSNBc+H7WJqVEBp1kP9EQxNR2npPKkzTm+ctoiI3KaGPFMvjm9f36+WW27HgNI0D8/2qViWTGsdlVLEe6r9U0yTH5PPdzV2wrpsIq9TYH0IACCjI4mi085WOT+deW4xYakgwPLYJ3Hc5zRS4pSzNHcpMwdSLS0tLS1CRUdJTiBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQpNSUlGTFRCWEJna3Foa2lHOXcwQkJRMHdTakFwQmdrcWhraUc5dzBCQlF3d0hBUUlKQ09IMFhpQ3NMSUNBZ2dBCk1Bd0dDQ3FHU0liM0RRSUpCUUF3SFFZSllJWklBV1VEQkFFcUJCQlZ4Q2RBZkZ0ZDZxNHVjdGVXdDNQSUJJSUUKME9CME1GQ2VFb2U4aXkyV1NPSWZsdkNtc2FmNEQxUHN0dnh1cmIwVmd6QmtWYTZMMEdhQms1QkdkWlM1K2JYdwpzYjh6WndCVFZhMy9ObWFobnFPRkg5dFJxSGJwalgxRXd0YVVYeFBIUHZUdmwrcTk4dWZpU2M1N3AvL3dnZ2huCkRSYnhLUjlndHpUdTJIOXFSTDU3S3BWRGx3YUo0Q1M4TTFYblVMdWNUUXZiNzg1N2xRZ1p6NlZBeUludVpGcFoKdUZLUWJLOVFQK1dUUlgvS1ZjYjFGOFdpOWZjNkt2cHZCWXhQd3VBS2todzdjRC9pT2o0QW9YU1NrdWFPR0JCQQpXMVZYZHFUNU50emJseUhHVFk0NnRMVFAxS3RpdnpaWnBHZ29OUVVaL2NPRHkyeTNCMXNDVGdsd2NXejhIM2M2CkprbmIwbFlnckNjdDVsUDB3L2hsaVZPWG9zbC94T3d5a0w4Y0pDRldERGRKMFh4Q1U0S3ZSSWZGaWJQa0tXOHYKL0JKeStDWWx0WEgycXNUR045S0dpSVZ1UmhlLzVNN0lhYjB6aEN2TTJhd2RGWkxyc25TanZkV2RlVGRjSzZpQgpLQjNWUVBiZDZ2RkRPR05mY3NleEJPUW05dlMvL001VWdJWkp0MTE5Q3kvcFQ1WVM3MWNkaFBJN2JTVU5UTlJ4CmhWeUZ0d0Z4OWJuc2VsNHBhK2UwRWk3d3pmME5KZXF3cmJtYlBhUE5qdDVvYzVlMmQySGFZSFQ4ZFM2UVVDS1IKZy9iRWNUWkM2TEZMWWpqQzBZYmZZbVhKQXFxMk1mV2tmQUdlWlorOHRVTVhoUVRvMW5mbHVhTmwrTUNSbW5zUwpMS3RnNFV1MnJ3cTNDeEJiamlHVmQxUXM5M084VE5zNitPT01MQkttMCtVM2ZzZHRpeG5GNk9GalZ3azd5UWVRCnNqRll2dHF0MVhCUDE4bmdVaENDZGRMbnJ3NVRWUlBFQ3RseTdiK1pBQ0dDL05EdG01aXNxQ2tKYVRyRU1BenQKMzZraGI3U0lqYVl6V1RKN25aVWs1WEJqandoNGVTTUFNUDBueDVIRGhmYThCZmFDanRkRUNyMEJpY3JhekNWdQoxZ2tGU3RCYk1VbmUyR2ovL0UzOFR6R1FhaTJLelBOdnA0bDdSTDBnc0dncjhRZVZXaXU0Skg3QkxUNkdYTTNICnNreU12MzN6emxRdThjYjNrTVVSREVCQXEySXEyODZGUHlxNWcrT3VwcEYvMHpJOWdYOStoOEpRRGNSdWhNNk4KNm4weU9oUi94MmVqSzlSNHZXUDFodS91cWlseExyQnJqUC9EU1U4RmoyWHBTb2pCTGZOY3RLdDR4MGtINE5hbwpZdVlEdWx0U0ZKeFE0bTVudUNGZ1ZhdkZCVmVWNUF1QURPRGloTC9ET1BESkJSNTh3NW1IRW5ZOFEzYmFZNGlICnVWSUJ2SXQ5YVZqR2EvaE5leW85YncxS0V6VCtoVDREa1ZnbnMrN2VNU3AxS1FZTDZDS1hncitsZVg0ZlpJUzAKV05McVNkT0xpMkJhRmZ5YUs1dW0veTViTWZhUDYxUDJHYncxMFl0Z1g0Slc2OVRSRENTQ0l4Z2NDdnRrU09CawowcGxVcUNmbjd6UzZpTGh2TGNWQUFXN3JCNEt0bXZlUEREWC8zWHY4U2tjTXMxbXFDMkE2cFdPL2g2dEtmUnB6CnRxRHJKeWpTT2J6eE1YZm5jaE1jTVAzdVdzYkY2UmFkeU1KajN2M1F4SUtwcWY3RlpPRVR6N3dqUjg3bGdsWGYKdndTRUdhcTdJNGpQazd4VDN4ai9PbzdzOFJ4a3VkWWRXQnErU3pJZG5JRWdGdjJmMEJ2bGlYVzcxd2I5ajBTQwppMVUwdkVkemE1bWFEcmtMbGFacUR4MjR2RFZvMlhSdDNPLzJyTXplVEF5M0lnUWF5NWRDRVlUSjFHKzdlSndCCjZXVFlWeEhPVGVLa09lZXUzYXkzdjl3SXV3NnBCS04zbGJMM1dZa3Z3QVAyODJndjFnd1F2VmxPWFd3eG9YOFkKOXp3VDB1OHE5QjU4dHZ3TW9wQWZsOVIxbEhkYy91bnM5OUZRbVp2c3M5NnBuUXMwZVBUaGhOSFV4SzRNd2luOQpvTlZacVM3cTJPblpqd0xRRDVpcmNpYlRVdUZYR05pZXhScU1BTExhbmU1MQotLS0tLUVORCBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQoAFENvbW1vbk5hbWVPckhvc3RuYW1lAgAAAAAAAAABAAAAAgAAAAAAAAAUAAnrm3TVFTnrmUh/f9zjkaK/yQL8cAUBAAVsLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpNSUlEeURDQ0FyQ2dBd0lCQWdJVVVpL2lwR01vT3FHeFNuOGRoaGhQaDBySWlJUXdEUVlKS29aSWh2Y05BUUVMQlFBd2dZWXhDekFKDQpCZ05WQkFZVEFsaFlNUkl3RUFZRFZRUUlEQWxUZEdGMFpVNWhiV1V4RVRBUEJnTlZCQWNNQ0VOcGRIbE9ZVzFsTVJRd0VnWURWUVFLDQpEQXREYjIxd1lXNTVUbUZ0WlRFYk1Ca0dBMVVFQ3d3U1EyOXRjR0Z1ZVZObFkzUnBiMjVPWVcxbE1SMHdHd1lEVlFRRERCUkRiMjF0DQpiMjVPWVcxbFQzSkliM04wYm1GdFpUQWVGdzB5TlRBMU16QXdPRFEzTWpCYUZ3MHlOakExTXpBd09EUTNNakJhTUlHR01Rc3dDUVlEDQpWUVFHRXdKWVdERVNNQkFHQTFVRUNBd0pVM1JoZEdWT1lXMWxNUkV3RHdZRFZRUUhEQWhEYVhSNVRtRnRaVEVVTUJJR0ExVUVDZ3dMDQpRMjl0Y0dGdWVVNWhiV1V4R3pBWkJnTlZCQXNNRWtOdmJYQmhibmxUWldOMGFXOXVUbUZ0WlRFZE1Cc0dBMVVFQXd3VVEyOXRiVzl1DQpUbUZ0WlU5eVNHOXpkRzVoYldVd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM0Z3BJNVg2aDJmY3ZjDQpDWGt4RmpQbi9RL2RXYnFZaEtBb3VvQkV1QWhtS2J5QlFvU0VqSGw2WFM2YmU0QzU2ZWx2cnlHQ3lxNGUyUW5VYkhnTDM0Y2xUTFJQDQpwaWhqUk5BR2x1YkJUbndYeEJ3ZmNVMXM4T0lrRkhRUXNML3hPZ1QrbWhtQis0MU9mMDFoZnd5MUdVd292b1QxbTdXZEdTUEl4Y1ZyDQpGZjI3bS95Qm82cDZwQ2VaRndQOEVMYlh2VnptaDZ1c1g5eno1WTVkeHIrSjlnTVN2NGZvUUZQMWRiMEx5d3Q1OHNjM2MyWGd2ZFJSDQpDa1A3RlRrTFluK3ZrMUl5b01aVHQxWWQ0T1lLa2g2MlVyN3RiWjBWSGxTWlczSzVRLzNCSmo1VGlhZW12RHBGUXBZWHIxcU1GMXZoDQpiWENoSktlcER2Z216Rm5GY1huVG9zT1JBZ01CQUFHakxEQXFNQWtHQTFVZEV3UUNNQUF3SFFZRFZSME9CQllFRkVMT0I5eWI3WWduDQo0cVpmSm50aFpBeXloU2QvTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCMkl0WGVQQklVaGJ6cW1raUpXakdBalhzYXo4aVMrNlBnDQpLMzY1N0JnMkp6cWhsOGlWM2lPTkgzV003bXVycUxsemhTcmM2dkUxVWtiUkhTazR6QXp1Q3pndXBRL0dUSnFLbW5SSjVSZ21EaHFyDQpJSlgycmcrY242NUYzNzBhbndwUzRsTGI5Q1pBQmowOGRBNEVURktCV2tJMHd0dzJZMXRxSkh2U293SkVHRXUrYUc1OXY0WUVnVVZjDQp5UjZ1ekJnbndFN1V3dUtpTmhsQzM3YjVmamxNSk0rSkpwTEtJNFB2RGl5aE53cjlzTlB4OEF0VExUOEhqUWRCeFZwTUVBMndFRkJsDQpDTGFMZGlZU3FkMnljbVdnc1RvTWVyYnJoeHFxUlF1N01HcTJ3RWNxbVNTZkpBNGdqNEN5RXhUQlVkY1RyVElJRVN1K2Y1SnA1MThsDQptTG9sDQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tDQoLCAEAALMBAAIAfDB6MBQGByqGSM49AgEGCSskAwMCCAEBCwNiAASE6lA1E4I5D+zqc3KdJbYX7atQd44rSZtsM1f3uC2TLLZ0qXeMJSm6LDYns0Dq5uR8ou5Xz3S1norcNANvCoCxNvC0sNNhScpOYbNQfOB45E36jMFnzuzkGImG+9RwHjOGbI3MhOdoJ1j64D+ngMhnACBPQ0f7Iq4ljEjHr1wTj1W8lUs/LcxABZ7iiJbh9dj9IAdSLS0tLS1CRUdJTiBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQpNSUlGTFRCWEJna3Foa2lHOXcwQkJRMHdTakFwQmdrcWhraUc5dzBCQlF3d0hBUUlBZXBmZ2pRZVF0SUNBZ2dBCk1Bd0dDQ3FHU0liM0RRSUpCUUF3SFFZSllJWklBV1VEQkFFcUJCRGZCK3RkRFRLQXRMUTZYTnNldTk1a0JJSUUKMEM2KzJEYVk0eFgzZ3U4MjRiaFVIbGNmcHo1NnY4MkhiT0gvTEJSRmI5amtWdU9jTHk3ZUk0RHoybkdkRFo2cQpzbjgrZ1d2bTVTaElMOWY4N2FqcGZ1VkZHOTRYZE1mQzBSMDNpSzNoRnNuWEJXTDRXTHNIZXFNUEdJOE9FclBQCmVYY0duNnJJOVZ3QmR0aVZzWTRtN1hLR0VaSGdiOXA0S2Y3bTZDUlhBemN1MDYyN2g3a1VJa09ZZU1HT1VNSkYKN05pRWZnRDR1NkpHTU4zNzRCblZNVjhBSktuZ09SUFJ5Z0hsZXJhTkRFSGZsZzBYb2txbmpITjk5ZnpUa1dINwp3SmxFdnFKL3NLaWxaSnBSN1l6ZVZmNTRYdmpNbHg1d05XSTZPY3dybFVick9QUUxOUmlwK0xBdVY2SjFPQm8rCmtQcGhETVkxNmw3d1p6Qnc0R1VVWE1qdFJVWFFZSUd6c05zYUw0czlDREx6RTBjTFE3NTlSZE15SVJ6UHRLengKa2dDbnVzR201eUExOGxSNTRWWFptWUhwYmVKdlNLMFZ3SnhubHdMUTRMREZHcWpOU1hreGw3VEVDeUVvbVpRZQpqUVhyRXB4UE9JWmNDUUlUMnppU3Z0UFdHZjhZUzFKL0xSWlZob2tVRENPTHhEMEVpY0FYYXhnY2FXUVcwL3BtCi9OM3dtRTFBdjc4Ym9WbFpXbFhkbkhjektGVDZiRkpZRFZCaXZOY3M3TlRaL3AvWUlsMGFPMjlpUnhZSVpWeEIKTCtQSkxrejVGU2U1Tzg4VjJSTm9zNyt6TWdhVjNIdmtka2hFR0J2bi9RWEhsQXZOUEhOakdmL0laQi9jMERGcAplS1drQmpPa29Wa0k4elcvT09EVDlkMzdLamYyRTZLZk1adWNSdlJ5OHVlZWFKVTI3QUZEMVlucHlsQTVkTUh1Cm5abW1rcmRLYmFrYUFpT1VKMGUxdmJuY3lOaE1XR1RTZXpneCtvVmtEd3ZHRk9qQ0NETGdZcDF0dmJKdmNuQ3AKZ0p4ZEptbFVKeXFFSkVKZ01RQXNkYjEvMndDbW5aTDlsVUQ4NC9SeGZDY0xCbFQ2cTdkY3NDeWpOK1pwRHM0bQp4RGxCYnJjTjUvYU83QjMxYlZ6a0VRQUF4SS9YWnI3QkRnMmtIdUNmZUd5N1VvYks4eW5ZM1AyUDFRWWZKVXJsCmVqandnNTdEY3NRVkdpbFF5cThOZ1pMM0tacjk2dnpPZU9wcEdtb1ZlenJFRkF5ZEh1VURjQ2RTS25BcjZRbWUKZjZBZHRnck93V3RIZ0p5VFZmTFNHYnRKNHcwaVFiV041aEgvcVVjMlZWcjlxVnMrejd2NWNlVExoRFBJampFdgpmUS9MUlVsYWhGaCswOE9HNkNrSmk1MGMwMmFvZzJGaHNDOWtEUXR3NVdNS09wNkVrb0tEUG5mK3pseWNQSm5OCno0Z09aMTRLRkc4dTdueGNZOUh4NkQ5eDJnM0dJQWN5dFZnWWhWaVFWYnlFQUNkNGpXV2h2SFZDd21FMG95ajMKUUJ3d1Z2NTgwT29GeHZVeFRza0JIbUk4TVprYmR0U3BhSHNvcXhMVFB4ZW1HOFlibmxiNFVWWGp2M1NqSUozdApFd3JjbVppZ1JFNjE1M2V3cHFYM3E4MVM0TFFEcElnMGNLbUZFTmloZzZIcGhpQ2NwT3cvakdESUdSdVFBTlFuCklNVk8yZDRxZEMyU0lIdWFTWDBmZTFRRzJHa01ZbnJiUzZqQXdzUFloL016L3d6NGI3MDVaaTB5RGFVZmdVeDMKNHpKMnZLYjFJNUV2N0R1UEZGeHNmcDBUR2xVZHhsTlBpWTVOeGgzUSt0Nlk1aGF4TGg3MWFNYTE1QTRIQUc5SQp2bHJhbjdoY1M1dExzY0paTlp4Qmw2cUo1WkVZcHBRZFpoNU1OaWwzbmpHSVFzbktVdXRlbFdMaE0zbElsUUhuClF5MWZNVTJJVUpWK0hvUGQyR1VueVh6Q2hTeXQ1MlNNMVNkQWdEVTVWZ2pyNUJkSTBXRjRicGlvVStPZkZjNDcKOTlCYmpzTHdUY1dOWnpRYlFvNXNQUWVFRndBUnVSYWZ2amdYNFRXVS9VR0JOYkJxVElFSmlNaTVkSkM3Vjk4cgpST00vU093cW1tUWtHRytjMzFUZDI1bFIweFJrbDZHY3A4Y2cvdlA4cm4zSwotLS0tLUVORCBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQoA",
- "UserData": "AgAAAAAAAAAAAAAAAAAAAAEAAAADAGFkbXQAAAABAAABAQABBQAAJxAAAAAgS+Q9So1GhrWY6kSz22sV8gen4Fni6JNriJketIvFkCAAAABA2mspsyV+a6aX1Mtr/t9dl+7Uf8uM4tIape5E6F6Ho4xAItM5s7QJBdsskEDsqwLhhLJltScYZCSCa/wUSNV6uAA=",
+ "PKIData": "AQAAAAAAAAAAAAAAAAAAAAEBAewdAAAAAAAAAAAAAAAAAwAAAN8ALS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUhvd0ZBWUhLb1pJemowQ0FRWUpLeVFEQXdJSUFRRUxBMklBQkYxNStvV09HUGduQ2J1elNWSlJka0ZXZ2h2VAo4c0xFczg0ZjdlK2YxZ1VIOGpwTS9xM08vRUNpdTVPOHMyL3kxamdFa0JGMDlNRXZsYzZndkEvMG1LWkJiWHczCmhmenQ0MzFBZVVoRnlQa3dBVmwxNFFlRnBleHBBZk1VSVVTQlFRPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCnsBAQACAAAnEAAgJtIKIbKNxTandrwhu+mnvJT0yy79k79H/3NThepNS7MBACAADAAQo+eaVmLqDo+3pWlRIS13zQEAAAE2xyja0v/8rqiNUV+u9aruA8hkXVgg1sPTZcy98Dlf5hVX/RX3efdlq8lgxW/FmNQTX5wnTzsH3vC8+y4y435Uu2W3D3ykggwAvN/rYH7AWOdSRJ9wYNT/Sm3ex2SFI4Dj0NYfnobJB5qBxImSNFnKe/6kUN7ooaiTE9oa46sv+29fmcMbyIzVn8NpxQZrj8gEy6khhcLSiWsq4GaUAt7sDAdViLRuRzHtbS3XHzQsyY7ZD/M7ul9V+pPc3C8BM2hDfSpMMpDoo1OyTqXdmLZ406Ww9llZFYa+rBZcLi1tgi5rs31UU2YLJKtUYscW9Zege0uL1W9yfFuPS9cmdFw41cW07zdPs3VU6boJ86BnNi06lH28hhtCuzK5FZ4gbeAwAuxGsVs1PDW76Y3ThyCMTU0XgQb7tQIAFENvbW1vbk5hbWVPckhvc3RuYW1lAQAAAAAAAAABAAAAAgAAAAAAAAAUAAnrm3TVFTnrmUh/f9zjkaK/yQL8cAUBAAVsLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpNSUlEeURDQ0FyQ2dBd0lCQWdJVVVpL2lwR01vT3FHeFNuOGRoaGhQaDBySWlJUXdEUVlKS29aSWh2Y05BUUVMQlFBd2dZWXhDekFKDQpCZ05WQkFZVEFsaFlNUkl3RUFZRFZRUUlEQWxUZEdGMFpVNWhiV1V4RVRBUEJnTlZCQWNNQ0VOcGRIbE9ZVzFsTVJRd0VnWURWUVFLDQpEQXREYjIxd1lXNTVUbUZ0WlRFYk1Ca0dBMVVFQ3d3U1EyOXRjR0Z1ZVZObFkzUnBiMjVPWVcxbE1SMHdHd1lEVlFRRERCUkRiMjF0DQpiMjVPWVcxbFQzSkliM04wYm1GdFpUQWVGdzB5TlRBMU16QXdPRFEzTWpCYUZ3MHlOakExTXpBd09EUTNNakJhTUlHR01Rc3dDUVlEDQpWUVFHRXdKWVdERVNNQkFHQTFVRUNBd0pVM1JoZEdWT1lXMWxNUkV3RHdZRFZRUUhEQWhEYVhSNVRtRnRaVEVVTUJJR0ExVUVDZ3dMDQpRMjl0Y0dGdWVVNWhiV1V4R3pBWkJnTlZCQXNNRWtOdmJYQmhibmxUWldOMGFXOXVUbUZ0WlRFZE1Cc0dBMVVFQXd3VVEyOXRiVzl1DQpUbUZ0WlU5eVNHOXpkRzVoYldVd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM0Z3BJNVg2aDJmY3ZjDQpDWGt4RmpQbi9RL2RXYnFZaEtBb3VvQkV1QWhtS2J5QlFvU0VqSGw2WFM2YmU0QzU2ZWx2cnlHQ3lxNGUyUW5VYkhnTDM0Y2xUTFJQDQpwaWhqUk5BR2x1YkJUbndYeEJ3ZmNVMXM4T0lrRkhRUXNML3hPZ1QrbWhtQis0MU9mMDFoZnd5MUdVd292b1QxbTdXZEdTUEl4Y1ZyDQpGZjI3bS95Qm82cDZwQ2VaRndQOEVMYlh2VnptaDZ1c1g5eno1WTVkeHIrSjlnTVN2NGZvUUZQMWRiMEx5d3Q1OHNjM2MyWGd2ZFJSDQpDa1A3RlRrTFluK3ZrMUl5b01aVHQxWWQ0T1lLa2g2MlVyN3RiWjBWSGxTWlczSzVRLzNCSmo1VGlhZW12RHBGUXBZWHIxcU1GMXZoDQpiWENoSktlcER2Z216Rm5GY1huVG9zT1JBZ01CQUFHakxEQXFNQWtHQTFVZEV3UUNNQUF3SFFZRFZSME9CQllFRkVMT0I5eWI3WWduDQo0cVpmSm50aFpBeXloU2QvTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCMkl0WGVQQklVaGJ6cW1raUpXakdBalhzYXo4aVMrNlBnDQpLMzY1N0JnMkp6cWhsOGlWM2lPTkgzV003bXVycUxsemhTcmM2dkUxVWtiUkhTazR6QXp1Q3pndXBRL0dUSnFLbW5SSjVSZ21EaHFyDQpJSlgycmcrY242NUYzNzBhbndwUzRsTGI5Q1pBQmowOGRBNEVURktCV2tJMHd0dzJZMXRxSkh2U293SkVHRXUrYUc1OXY0WUVnVVZjDQp5UjZ1ekJnbndFN1V3dUtpTmhsQzM3YjVmamxNSk0rSkpwTEtJNFB2RGl5aE53cjlzTlB4OEF0VExUOEhqUWRCeFZwTUVBMndFRkJsDQpDTGFMZGlZU3FkMnljbVdnc1RvTWVyYnJoeHFxUlF1N01HcTJ3RWNxbVNTZkpBNGdqNEN5RXhUQlVkY1RyVElJRVN1K2Y1SnA1MThsDQptTG9sDQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tDQoLCAEAALMBAAIAfDB6MBQGByqGSM49AgEGCSskAwMCCAEBCwNiAAQedARKGbv37Zt28PXicGE6fhkik97K5+B4lJUVBBaMDSemsM2H22Z05chHzvyVPpSHF2km1EPyUnGTSALr5F6B5BJKg0OClIZ1+vJGc5bqtTZgzmllvQ4kOz/eif4SU5PTZ+2/o3fcCYOQhoSyJvcsACBc4K40kZdIocUn/R9tixlvAkKUZkhurYi7mPaDPA4V2AdSLS0tLS1CRUdJTiBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQpNSUlGTFRCWEJna3Foa2lHOXcwQkJRMHdTakFwQmdrcWhraUc5dzBCQlF3d0hBUUl2akRvYnhkRmVjY0NBZ2dBCk1Bd0dDQ3FHU0liM0RRSUpCUUF3SFFZSllJWklBV1VEQkFFcUJCQzIzUmd5cDc0bnViOWxrU2FmT1VQMEJJSUUKMEc0VUY5cXNTTnJVRnBCb1Ftc3JUZ1l2SmdOTVYxSUxlaGtkOGpETlBPYnc0RHltS0krb29zVnNmb3pJY0Z3Tgp3NHBUa0dvYW5HeTloSWtnRkphUzBsUFVsZjBzUFpldXJhZ2J1VlZPeDd4dUdkV0tEQlcxZ0RmOHQ4T3J3aTZSClJKSVF3RGFoY0R2SThsNDg5SUxiY2pVckpYM0dtUjBNbkhaRTJ4YXg1V3QvaDBEVUx5V2h3VU9NNlNmdlJTWVMKS3RaUDgyQzVQT1g5K09CWWdZRElMenpPcTNmdmkrZ2diOGxSejE2RHVDV1gyZ203Q2RyOE5LaEduMGh4QUtZNQphdTNGZ0dqMy9ieVZQR2ZNZ3RzTzZza2JsMlNiekhWRzJ0bjVvT01reGxTVUxHRzFuSmdrZk82c29SR1VlSjl1Cm9rL1FTTnRXUkZBTGhHQTlRcXNkZlZmdWdkRCszR1RKOGdsMExqVnVWMTRLMDNBdENxTEJkMW93Q09XbEJVOTIKdjBiTC9zUSt6cUNFeFlWQTlOVTB4QmpybkdXWHNQUFJwT1RMbTlqSm9yUWlXVDlKdldkcDVqSTU1Qy9VbGJMRgo4TkFERGwrS3Q5V1VZeDhaeGs3eC9GQVEvL0JHdnRnT2NCcWNzemQ5OURvc2hId1B3ZlRoZEVCNngvRVlma1JCCjk5c0g3eG9xNXkydFNNakJCNkpGVEc3Y1hBZWRuZXNIS2tuK2p0OVdWYklRR3dKQmVKOHJUTERQaUZKdmtYVXgKcTIrWFJnZ3BUMXpuUVNlMEZBOVNiTzhRZlJNYVNxeWl4bVgyVmxEdjF1L3htSXM2RkdtMG5RL3RkbDJUYWV1RwpGdVl2N3RPOVMzZExBcTNLN2EraXB1aGJnam0weHQ5NkxZazR6MEdSdVJxVTlUZ0dQWDZPcVkrWHZyemZPZmRiCmJnSlhoL2pZTFk3RFJ4bEh2Nk54RDI1aVl1OVFBZ1RLMDRRNVZCb3cwMlRSNHJIWFNFWkd4VzlnUXM0RGplVDgKWG1Kc2M3ZjRRb2liaFVma1N5QzJ3NW44anFHM3k0dU5IZUFQdi9lZUdFek5BTWkyaVlVY1FFVzY2NlNxZmczdQo2R2ZXMWtSVm1USkliZE1kOW8yb0J5SXZkQWROV3BGb3d3ZFRKbUNla1NXSmN1QTdrK294SVErRncwdkhSNWpGCnZ4djI3Mmg0Z0taNVpsQkN4Z0ZqVEFNRGh3bHZwemg0Unk5Z3R4SzV2M1pHYWhsMjdCdVpXNkJyNk4yVkh3REoKemtxUU4va2laMW85ZWFza3d2YjN5aUdTaWdDVXhCOEJQQ3V6dGs0VFFibjBacTRaa0RkS2FxSlY0V2dOUytKNAp2TWhscXBLNSsxZ1p4MHdFc3ZRZ1AraUVWd2pMUGlYWWp5N1FwTzRLcmRMWk5nbStoQi93aFV2bzh2eDVwRjRLCjNROElFTHJMNzR5TzFvUnNlNVc2K3d0K2tvb2hRTHhLbUd6em4xSnRaWlBOLzFiZit5ZGsrQWNLZUNhUjZvMnEKb1R3WVlWOXdPRlhUTlMveU90MklqYk9xNlc1T2dwdEVla1FpR1pHR0xRRXUrVDNWeXVvZ0FRMGZkeW90THZMSwpNQlREMGU4VWdQc1B6OUFnMS9CanlqS2NNczViTTROZUdiM2hVb29ORGs1MHBPUFRpZG9FU0pKcmZXUVBzazloClVIalZycFg5RGhtTG5VSmI0Z0xaODEzSFBncjZmWG9EVENuN0htWTQxbk5YYnZCbHY2RU5laG1sM1hXWTA5RnAKSjJ2TStuL3o3RDNlaW9uTThYQURybDVzcXFNZ3BnWFlZYTByeE10aHF4dTc4eEJWL0VZWEp1T0V0YzUvei93TwpxZGQ5SXF4aUI5eVY1T05nUTJ5QzdyT2tzbTZKMVdrcDdGSkVSUUpDUHRRdUxjYlFaUWZNenIyd014S1ZCejJJCm1wSnp3UlV4dXI2YlNMVEx1M0cxLytkOXZadVR6SVZmUnN5Z00xRjU4RDVsYWVzdy9tNHhkWUdHV0VuMks5ZFAKdDdZOEVRK0xDdm1maXhNc01XcHhoUWlDQWo4WTk2bmY2RHRYK25PeGttdnFwZmJYWVIyck1FbG02REowR1g1UApuVFJaK0lRQThPR1liNzJJZ3BibU56OGZUSzN2Y2FZQ25PZXRoOTZhZFA3dgotLS0tLUVORCBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQoAFENvbW1vbk5hbWVPckhvc3RuYW1lAgAAAAAAAAABAAAAAgAAAAAAAAAUAAnrm3TVFTnrmUh/f9zjkaK/yQL8cAUBAAVsLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpNSUlEeURDQ0FyQ2dBd0lCQWdJVVVpL2lwR01vT3FHeFNuOGRoaGhQaDBySWlJUXdEUVlKS29aSWh2Y05BUUVMQlFBd2dZWXhDekFKDQpCZ05WQkFZVEFsaFlNUkl3RUFZRFZRUUlEQWxUZEdGMFpVNWhiV1V4RVRBUEJnTlZCQWNNQ0VOcGRIbE9ZVzFsTVJRd0VnWURWUVFLDQpEQXREYjIxd1lXNTVUbUZ0WlRFYk1Ca0dBMVVFQ3d3U1EyOXRjR0Z1ZVZObFkzUnBiMjVPWVcxbE1SMHdHd1lEVlFRRERCUkRiMjF0DQpiMjVPWVcxbFQzSkliM04wYm1GdFpUQWVGdzB5TlRBMU16QXdPRFEzTWpCYUZ3MHlOakExTXpBd09EUTNNakJhTUlHR01Rc3dDUVlEDQpWUVFHRXdKWVdERVNNQkFHQTFVRUNBd0pVM1JoZEdWT1lXMWxNUkV3RHdZRFZRUUhEQWhEYVhSNVRtRnRaVEVVTUJJR0ExVUVDZ3dMDQpRMjl0Y0dGdWVVNWhiV1V4R3pBWkJnTlZCQXNNRWtOdmJYQmhibmxUWldOMGFXOXVUbUZ0WlRFZE1Cc0dBMVVFQXd3VVEyOXRiVzl1DQpUbUZ0WlU5eVNHOXpkRzVoYldVd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM0Z3BJNVg2aDJmY3ZjDQpDWGt4RmpQbi9RL2RXYnFZaEtBb3VvQkV1QWhtS2J5QlFvU0VqSGw2WFM2YmU0QzU2ZWx2cnlHQ3lxNGUyUW5VYkhnTDM0Y2xUTFJQDQpwaWhqUk5BR2x1YkJUbndYeEJ3ZmNVMXM4T0lrRkhRUXNML3hPZ1QrbWhtQis0MU9mMDFoZnd5MUdVd292b1QxbTdXZEdTUEl4Y1ZyDQpGZjI3bS95Qm82cDZwQ2VaRndQOEVMYlh2VnptaDZ1c1g5eno1WTVkeHIrSjlnTVN2NGZvUUZQMWRiMEx5d3Q1OHNjM2MyWGd2ZFJSDQpDa1A3RlRrTFluK3ZrMUl5b01aVHQxWWQ0T1lLa2g2MlVyN3RiWjBWSGxTWlczSzVRLzNCSmo1VGlhZW12RHBGUXBZWHIxcU1GMXZoDQpiWENoSktlcER2Z216Rm5GY1huVG9zT1JBZ01CQUFHakxEQXFNQWtHQTFVZEV3UUNNQUF3SFFZRFZSME9CQllFRkVMT0I5eWI3WWduDQo0cVpmSm50aFpBeXloU2QvTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCMkl0WGVQQklVaGJ6cW1raUpXakdBalhzYXo4aVMrNlBnDQpLMzY1N0JnMkp6cWhsOGlWM2lPTkgzV003bXVycUxsemhTcmM2dkUxVWtiUkhTazR6QXp1Q3pndXBRL0dUSnFLbW5SSjVSZ21EaHFyDQpJSlgycmcrY242NUYzNzBhbndwUzRsTGI5Q1pBQmowOGRBNEVURktCV2tJMHd0dzJZMXRxSkh2U293SkVHRXUrYUc1OXY0WUVnVVZjDQp5UjZ1ekJnbndFN1V3dUtpTmhsQzM3YjVmamxNSk0rSkpwTEtJNFB2RGl5aE53cjlzTlB4OEF0VExUOEhqUWRCeFZwTUVBMndFRkJsDQpDTGFMZGlZU3FkMnljbVdnc1RvTWVyYnJoeHFxUlF1N01HcTJ3RWNxbVNTZkpBNGdqNEN5RXhUQlVkY1RyVElJRVN1K2Y1SnA1MThsDQptTG9sDQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tDQoLCAEAALMBAAIAfDB6MBQGByqGSM49AgEGCSskAwMCCAEBCwNiAASFJXJiMhEOc6JXmLW9sTA4aJlT3gh5bYc5lj8OlN1f7mEUmEH88lwuufjgc/0zGxJEta3Qf2gJmCq18mOdLB8dXsxno0oSvXVwY+JcPp6mISxUJTzn5aYu039r0G1BFQlb4FV/EB9AAyYSHcURjRlzACBsJGsHqwPwgmP/THQOlvZXTFBXgeBfHCl5HxivLfKMXQdSLS0tLS1CRUdJTiBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQpNSUlGTFRCWEJna3Foa2lHOXcwQkJRMHdTakFwQmdrcWhraUc5dzBCQlF3d0hBUUllWTdaNmF0VFU1UUNBZ2dBCk1Bd0dDQ3FHU0liM0RRSUpCUUF3SFFZSllJWklBV1VEQkFFcUJCQTIyMk5JVitrS1BNbStDaWlXWkZVMEJJSUUKMEd6T3lZUGw2cGtEa1FDSWl5S0NmYmtqaXFtMm5nWFBzU08rZmQzOE4rYzQvZUY1bkUvbC90azRyRTFYQmdSUwpuT0ZNTjdjK0V5TUx2b3pFRTB0S0tSU1AweDcyRmZYdTlZYkZ6WGVGMXFmMHVoQndicEQ3Wk5XVytOUDhFTEhPCmFKR0g4d3FiZXR1NjVLeFl3a29icDhKc2M5eThrTEREbDZTMVIzUmR2L21MWURYWkpPd0E5d0tmMWpUbXFvMGQKT0s0L2R4NGxOcXRJME9SK3RnUk9KamJoS2dPd1FIN3lSWlVKeXhrSjQxanNuSTk0VHNzTEJNS0ZFcS9UV2FDTApaWWpuanpWZGJSZ2YwUXdTVHZwSWV1ODljc1dwakZPMjJqdEdGRHdBOGRBNno0cTRkSjVrb2UyR0Q0eWdsZHZICm80N3QzODNjc3RlLzVnQUEyWUJOSGM3Mlh1YmFsUWZGbTBXYkhES0tUa2lyUUY0T3cwVEROYlNOUEhhbnFJN0IKTXpHL0Q1OVlXcFovMzlnaTk5TlFrZkdZTEk3MnNtWXFhUVRtQnZoZlA5dHMyR2VsZUVtZnh4dERZZDI5QTVYcwpqYzR5bkw3cFdWelhIU2ZDNmZ2R1hMdlNTOTdrWElCNVdsc21YRWZJMU44QkRaeTVYSld4ZnJSbUg1d0V0UklYCnlZazQ2SnJ1ZWlxVW1UdWk5ZklXQXZvZ050NVVvekxwZU9SeEZmc21tc2h4Q0Nxd1JHSmVGSm1FTFdLdVhud1MKNDFSc1lsTHZaMkFFTS9YbTU5ZlhURS9FSW03Y2IwZ0hWeDB5MHU3d20zL096VnFMUUo0WXdTdVJra2xNbVhGdAp3RjhUTXJYa291eUFwbFBpeEk5TUtMMUZzZlZvSGJZTnFHeDltT2VpeUxGS0J5UWh6Znp1UklsMEVhb01JajhjCnhsNTd3SU1tZmhTQlJRM0hVcDZSeFlIR3o3U0JpakRYMkgyZlBhZjZYSWxwSW5jM3l3b1dibjBnbTFpbkFlT2MKU1pBbkJLbmJEcGdDS2VIZ1FQdTgyUk43UUVTeTJjTWg0RWhMVElQRVJnRzJoQVRxYU9ZRnpwb1J6SXlod1RFOApTY0l3QTM4VWVVUFZoUmVudFFXSU5rZW42aVN3Tnl5VVJxVkJja2EwYm5EVzg1MElKTnBFZ1hCa1FFa1FnSGtGCmY1eFp1bTJsOENMcEVpWG1ERjZ4RTlCVzdwYUdUaW9WZFNiTG5UT2ZTSXZ1MndZSGdXRmlSVFdONjFWRTBUSWsKSkpXRmZOWFozNWV1ZTR1MkdiUmRHRUNHVU9EbjRxUmM3dzluQ0tyODRmZXNJa1lDQWRzYkp6RzhiSFczQWxBQgpvbVVobjhTekdiQVVIZlRNdnFvaFRjcFpJdVovK0ZuMVUyQlE3eTVCN3JDT2haR09GbDExT2VGN0Ird0tXaGliCi9KTVVyNmM2N3ZsRkpvNGZoL1VSVzQyVUpmcHRBd1hwd3NDL1E4d0EvK0RDWmNySjdxMDhkNWtDcUJxOWl1N0QKc0ExR3djMGhqZTdjMCs5Y3VDcjgraVpLSzQ4RGlhNXRjUHZEZ2gwSGhLRFVIVE9GL3FTeFdwZTBVNkVTL2FVcQpZaDA0TW5STWpFMlZkZjFPc1hHTFdla1VFOU1WM3JiaGFwRElHVEpuUTJ3VTFRb3kvbytNUkVOWFRxZGxTS2dWCjlWc1NPdXBRUFcxVTdpY0xCeFVFWXJHbHBXNUF1b0E5dW82NzJzZERrZ1JmZEs0RW5GNkxWQnlOUUd3aEhuTmIKVVFCMkl5TlIwWXVjWVdhUWhtM1hCbU4wSGFud1F2c2x4QlEzdmNFZ21jUk0yVzZUVkNKRzhmVmQ4Vm9tWW4yUwpTbjJwejNBcWM5OVpHKzREalgvUy9SajRybFpld3VPOVZPcUNxWmMzeE02SUxmdmlWMU5paHlnb01BZ3BDU1dxCjMxUFd2UjdRd2NPdS9nc0diN1VIaDladTZrbU9RRk5oZVNWRlUrcDVJZ01wbGVuOHM3WlVUckN3UlhDbFVHa2YKYUxQSld1MGdZTW1WbVdvb0dzdnVuUlJhZzZBaDQycWtYbVJ2OXBZSzlOTDhndG5zQytyaEEwM29iaWdzRWd0NQpNeXlIMXJMczNnNUx0aVByRzFlMjFRenpITzQzb2syYzZiYzM0M0JhS0J5TwotLS0tLUVORCBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQoA",
+ "UserData": "AgAAAAAAAAAAAAAAAAAAAAEAAAADAGFkbXQAAAABAAABAQABBQAAJxAAAAAgS81lRK8OAXJBUEgtWoMmy6UNAmeHEA4giSRM8iVRVKgAAABADSm4fQkTvnIDojucWOeFausFgsbzkXkYIEhBSmf1DrWIJLf9MnqspgtR0uISn901AyItPlPqpOu4QOMduWPnBAA=",
"CertificateAssignments": {
"TLS": 1,
"WebServer": 2
},
- "AccessProtectionData": "AQAAAAAAAAAAAAAAAAAAAAABAABQAAAAAAEBAAAAAgDQBwAAIAB4Z66EcflCTTVBFTw4YnCylXynaPhDyQVFgwSGXZ5lMSAAjteWhbDVmjOLGZh5AepCREDKOPz3+oxPLyAa8PwCughQAAAAAAEBAAAAAgDQBwAAIAB4Z66EcflCTTVBFTw4YnCylXynaPhDyQVFgwSGXZ5lMSAArvJb+L6KpxXsvHwTBZ1m+kBbbdykDMW2XDV3vjyaG+lQAAAAAAEBAAAAAgDQBwAAIAB4Z66EcflCTTVBFTw4YnCylXynaPhDyQVFgwSGXZ5lMSAAjteWhbDVmjOLGZh5AepCREDKOPz3+oxPLyAa8PwCughQAAAAAAEBAAAAAgDQBwAAIAB4Z66EcflCTTVBFTw4YnCylXynaPhDyQVFgwSGXZ5lMSAAjteWhbDVmjOLGZh5AepCREDKOPz3+oxPLyAa8PwCugggAAAAeGeuhHH5Qk01QRU8OGJwspV8p2j4Q8kFRYMEhl2eZTE="
+ "AccessProtectionData": "AQAAAAAAAAAAAAAAAAAAAAABAABQAAAAAAEBAAAAAgDQBwAAIACv8u95bKZx5SZwIGjCvCXpXaonqJP+s75fZOP6ysNwqSAAREwI+lw4UFDjyJPAkCNfnlXkwtlL0S51U9Mwp+wmmwZQAAAAAAEBAAAAAgDQBwAAIACv8u95bKZx5SZwIGjCvCXpXaonqJP+s75fZOP6ysNwqSAALMxFlRDYX2eBI6Jyr5/IVDKix0teAeg8Fq8TMwu/zwxQAAAAAAEBAAAAAgDQBwAAIACv8u95bKZx5SZwIGjCvCXpXaonqJP+s75fZOP6ysNwqSAAREwI+lw4UFDjyJPAkCNfnlXkwtlL0S51U9Mwp+wmmwZQAAAAAAEBAAAAAgDQBwAAIACv8u95bKZx5SZwIGjCvCXpXaonqJP+s75fZOP6ysNwqSAAREwI+lw4UFDjyJPAkCNfnlXkwtlL0S51U9Mwp+wmmwYgAAAAr/LveWymceUmcCBowrwl6V2qJ6iT/rO+X2Tj+srDcKk="
}
\ No newline at end of file
diff --git a/src/apax/apax-lock.json b/src/apax/apax-lock.json
index bed62ad5..937f7efa 100644
--- a/src/apax/apax-lock.json
+++ b/src/apax/apax-lock.json
@@ -7,32 +7,32 @@
"name": "s",
"version": "0.0.0",
"devDependencies": {
- "@ax/stc": "11.1.55"
+ "@ax/stc": "11.3.46"
}
},
"packages": {
"@ax/st-docs": {
"name": "@ax/st-docs",
- "version": "11.1.55",
- "integrity": "sha512-zHxPk+/FpaL/pXZqwlKDMUWmieSzMQpIPLnfs7Uer51S4gV+5xvwKrc5/9QR050ZcgzDV8MiqzJPFH+Cnz49gQ==",
- "resolved": "https://registry.simatic-ax.siemens.io/@ax/st-docs/-/st-docs-11.1.55.tgz",
+ "version": "11.3.46",
+ "integrity": "sha512-JkEFV3LrMpWAzpcHn5X3nfliJj8WsycBKD2qY239TjTVOnJfQ1uw7AdHj5MIXVJUeuA6EehAep7otX02GtitUQ==",
+ "resolved": "https://registry.simatic-ax.siemens.io/@ax/st-docs/-/st-docs-11.3.46.tgz",
"dependencies": {}
},
"@ax/stc": {
"name": "@ax/stc",
- "version": "11.1.55",
- "integrity": "sha512-F24/kidxvVPkdFz1DCzk0kuLzhE21Hl/OZ53hedk4Ut+vkqtyWpk0zzqazMl+0cio8cayfW0kDGr/byyESUS2A==",
- "resolved": "https://registry.simatic-ax.siemens.io/@ax/stc/-/stc-11.1.55.tgz",
+ "version": "11.3.46",
+ "integrity": "sha512-ESqk0kVLf/vviWjJJ7v2r1sSigt5FH63qdhdHj+HZzheTniiwrorWLpgqcenbSTSBbk5Nhn3b9LyzpEOOkhtfQ==",
+ "resolved": "https://registry.simatic-ax.siemens.io/@ax/stc/-/stc-11.3.46.tgz",
"dependencies": {
- "@ax/stc-linux-x64": "11.1.55",
- "@ax/stc-win-x64": "11.1.55"
+ "@ax/stc-linux-x64": "11.3.46",
+ "@ax/stc-win-x64": "11.3.46"
}
},
"@ax/stc-linux-x64": {
"name": "@ax/stc-linux-x64",
- "version": "11.1.55",
- "integrity": "sha512-HacfsylKTabNefS95J3Iu0R4D/qm374OythdVgCnVdD21qy3kZMNZCWpfJkjwW4pao1CGlA7IxPTY4ip081/Hg==",
- "resolved": "https://registry.simatic-ax.siemens.io/@ax/stc-linux-x64/-/stc-linux-x64-11.1.55.tgz",
+ "version": "11.3.46",
+ "integrity": "sha512-4K4qho/9/hqAPaYjAZoUxjcz9HIxC+9Vjfkv+SZlQ8VqVIt4P2Qjt8am8qCkfMduoUF5lATcvj7UQi0UfcH5hA==",
+ "resolved": "https://registry.simatic-ax.siemens.io/@ax/stc-linux-x64/-/stc-linux-x64-11.3.46.tgz",
"os": [
"linux"
],
@@ -40,14 +40,14 @@
"x64"
],
"dependencies": {
- "@ax/st-docs": "11.1.55"
+ "@ax/st-docs": "11.3.46"
}
},
"@ax/stc-win-x64": {
"name": "@ax/stc-win-x64",
- "version": "11.1.55",
- "integrity": "sha512-Iqy5dWiHjz6ff3iwPhPtmr528r+F5sBiQm0CRZCGiiCMrr74GveNIlyQFdeXbVFWcgNwc8piHBXE84CbbXvftg==",
- "resolved": "https://registry.simatic-ax.siemens.io/@ax/stc-win-x64/-/stc-win-x64-11.1.55.tgz",
+ "version": "11.3.46",
+ "integrity": "sha512-jbyyrwCOGhyyJSd4X7OzHEGAkrrcIwOz5a3ZjaEuTPTsAegDY9Q8gTUtco5vexMGxNs5pW9c1hrnb8XH/L2G/w==",
+ "resolved": "https://registry.simatic-ax.siemens.io/@ax/stc-win-x64/-/stc-win-x64-11.3.46.tgz",
"os": [
"win32"
],
@@ -55,7 +55,7 @@
"x64"
],
"dependencies": {
- "@ax/st-docs": "11.1.55"
+ "@ax/st-docs": "11.3.46"
}
}
},
diff --git a/src/apax/apax.yml b/src/apax/apax.yml
index 1b796fad..f38395bc 100644
--- a/src/apax/apax.yml
+++ b/src/apax/apax.yml
@@ -4,6 +4,6 @@ type: app
targets:
- "1500"
devDependencies:
- "@ax/stc": 11.1.55
+ "@ax/stc": 11.3.46
installStrategy: strict
apaxVersion: 3.1.1
diff --git a/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/measurement.g.cs b/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/measurement.g.cs
index a46b7250..071f6ca2 100644
--- a/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/measurement.g.cs
+++ b/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/measurement.g.cs
@@ -22,6 +22,7 @@ public Measurement()
public Single Max { get; set; }
[AXSharp.Connector.AddedPropertiesAttribute("AttributeName", @"Measurement Result")]
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::MeasurementExample.Result))]
public Int16 Result { get; set; }
}
diff --git a/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/test/border.g.cs b/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/test/border.g.cs
index 8247f433..8cac2f5f 100644
--- a/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/test/border.g.cs
+++ b/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/test/border.g.cs
@@ -44,6 +44,7 @@ public border()
public TimeSpan TestTimeOfDay { get; set; } = default(TimeSpan);
[AXSharp.Connector.AddedPropertiesAttribute("AttributeName", @"<#ENUM Station status#>")]
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::enumStationStatus))]
public global::enumStationStatus Status { get; set; }
}
}
\ No newline at end of file
diff --git a/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/test/groupbox.g.cs b/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/test/groupbox.g.cs
index f022f59b..e3ab0ba4 100644
--- a/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/test/groupbox.g.cs
+++ b/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/test/groupbox.g.cs
@@ -44,6 +44,7 @@ public groupbox()
public TimeSpan TestTimeOfDay { get; set; } = default(TimeSpan);
[AXSharp.Connector.AddedPropertiesAttribute("AttributeName", @"<#ENUM Station status#>")]
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::enumStationStatus))]
public global::enumStationStatus Status { get; set; }
}
}
\ No newline at end of file
diff --git a/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/test/test_primitive.g.cs b/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/test/test_primitive.g.cs
index d99b6607..45f9be54 100644
--- a/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/test/test_primitive.g.cs
+++ b/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/test/test_primitive.g.cs
@@ -44,6 +44,7 @@ public test_primitive()
public TimeSpan TestTimeOfDay { get; set; } = default(TimeSpan);
[AXSharp.Connector.AddedPropertiesAttribute("AttributeName", @"<#ENUM Station status#>")]
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::enumStationStatus))]
public global::enumStationStatus Status { get; set; }
}
}
\ No newline at end of file
diff --git a/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/weather.g.cs b/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/weather.g.cs
index 8c3db9b6..0e4f36d6 100644
--- a/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/weather.g.cs
+++ b/src/sanbox/integration/ix-integration-plc/ix/.g/POCO/weather.g.cs
@@ -15,6 +15,8 @@ public weather()
public Single Humidity { get; set; }
public string Location { get; set; } = string.Empty;
public Single ChillFactor { get; set; }
+
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::Feeling))]
public global::Feeling Feeling { get; set; }
}
diff --git a/src/scripts/check_requisites_apax.sh b/src/scripts/check_requisites_apax.sh
index 25edcd40..083342fb 100644
--- a/src/scripts/check_requisites_apax.sh
+++ b/src/scripts/check_requisites_apax.sh
@@ -1,5 +1,5 @@
apaxUrl="https://console.simatic-ax.siemens.io/"
-expectedApaxVersion="4.0.0"
+expectedApaxVersion="4.2.0"
export GREEN='\033[0;32m'
export RED='\033[0;31m'
diff --git a/src/tests.integrations/integrated/src/integrated.twin/.g/Onliners/dataswapping/all_primitives.g.cs b/src/tests.integrations/integrated/src/integrated.twin/.g/Onliners/dataswapping/all_primitives.g.cs
index 25cef870..743df266 100644
--- a/src/tests.integrations/integrated/src/integrated.twin/.g/Onliners/dataswapping/all_primitives.g.cs
+++ b/src/tests.integrations/integrated/src/integrated.twin/.g/Onliners/dataswapping/all_primitives.g.cs
@@ -32,6 +32,7 @@ public partial class all_primitives : AXSharp.Connector.ITwinObject
[AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(myEnum))]
public OnlinerInt myEnum { get; }
+ public myEnum myEnumEnum { get => (myEnum)myEnum.LastValue; }
partial void PreConstruct(AXSharp.Connector.ITwinObject parent, string readableTail, string symbolTail);
partial void PostConstruct(AXSharp.Connector.ITwinObject parent, string readableTail, string symbolTail);
diff --git a/src/tests.integrations/integrated/src/integrated.twin/.g/POCO/dataswapping/all_primitives.g.cs b/src/tests.integrations/integrated/src/integrated.twin/.g/POCO/dataswapping/all_primitives.g.cs
index 2ec39e46..4e409e38 100644
--- a/src/tests.integrations/integrated/src/integrated.twin/.g/POCO/dataswapping/all_primitives.g.cs
+++ b/src/tests.integrations/integrated/src/integrated.twin/.g/POCO/dataswapping/all_primitives.g.cs
@@ -32,6 +32,8 @@ public all_primitives()
public DateTime myDATE_AND_TIME { get; set; } = new DateTime(1970, 1, 1);
public string mySTRING { get; set; } = string.Empty;
public string myWSTRING { get; set; } = string.Empty;
+
+ [AXSharp.Connector.EnumeratorDiscriminatorAttribute(typeof(global::myEnum))]
public global::myEnum myEnum { get; set; }
}
}
\ No newline at end of file