Files
Marc Schier 81f200c9d2 Align WoT conversion and runtime with Binding 1.1 (#4375)
## Summary

Align the generic WoT/NodeSet converter, WoT Connectivity registry, and
runtime
binding implementation with the OPC UA WoT Binding 1.1 draft.

### Conversion and preservation

- fix the standard placeholder ModellingRule NodeIds;
- make every produced/restored NodeSet importable by completing required
aliases;
- support `ua:ComponentOf`, arbitrary companion ReferenceTypes,
BrowseNames,
  InverseNames, symmetric references, and exact direction;
- enforce the projection annotation allowlist and deterministic total
order;
- emit and consume Method argument schemas, EventType data, Alarms &
Conditions,
  event severity, engineering units/ranges, localization, ValueRank, and
  ArrayDimensions;
- preserve unsupported content through JSON residue/native projection
rather than
  silently dropping it;
- compare residue conflicts with RFC 8785 canonical equality while
retaining
  byte-exact residue digests;
- stamp generated documents with `uav:bindingVersion: "1.1"`.

### Runtime bindings

- resolve an EventType Thing Model referenced with `tm:ref`, recursively
derive
  its `data` fields as the baseline selection, and overlay explicit
  `uav:eventSelectClauses` that also reference EventType TMs;
- pre-resolve EventType links asynchronously through the bounded
sibling-document
  resolver before synchronous protocol planning;
- retain read compatibility with legacy implementation-specific
`uav:eventFields`;
- expose nested event `data` matching the TD while retaining the flat
transport
  field index for compatibility;
- apply minimum-security constraints through deterministic endpoint
selection and
  fail-closed session verification;
- use one Unicode code-point comparer for projection membership and
endpoint ties.

### Validation and fixtures

- add strict, profile-aware validation while keeping default parsing
permissive and
  residue-preserving;
- pin 27 normative examples byte-for-byte to the specification
repository, with an
  offline SHA-256 manifest and regeneration test;
- regenerate checked-in WoT documents with the final canonical writer
and binding
  version;
- document the generic converter separately from the legacy OPC 10100-1
asset path.

## Notable compatibility changes

- converted NodeSets may gain a completed `<Aliases>` table so standard
  ReferenceType names can be imported;
- previously inverted/dangling placeholder ModellingRules are corrected;
- generated documents gain binding-version, localization,
rank/dimension, and exact
  ReferenceType metadata;
- event data now has the nested shape described by the binding;
- the former NodeId-based `uav:typeDefinitionId` clause is removed;
event
  selections now use EventType-TM `tm:ref` links;
- `uav:eventFields` remains readable but new documents use
  `uav:eventSelectClauses`;
- unknown well-formed future revision/profile claims produce unsupported
warnings
  rather than strict rejection.

## Generated files

Most of the 621-file diff is deterministic regeneration: 517 checked-in
WoT
documents gain the binding version and final canonical spelling.
Regeneration was
run twice and is byte-idempotent.

## Validation

- `dotnet restore UA.slnx`;
- `dotnet build UA.slnx -c Release` across all configured TFMs;
- `Opc.Ua.Types.Tests`: 9,215 net10.0; 9,208 net48; 9,208 net472;
- `Opc.Ua.WotCon.Bindings.Tests`: 611 each on net10.0, net9.0, and
net8.0;
- `Opc.Ua.WotCon.Tests`: 1,136 net10.0;
- `Opc.Ua.WotCon.Samples.Tests`: 14 net10.0;
- NativeAOT test executable: 136/136;
- all 27 strict fixture conversion/import checks;
- formatting, analyzers, `git diff --check`, and regeneration
idempotence.

The full net48 run retains one unrelated existing MAX_PATH failure in

`FileWotRegistryStoreTests.MultiLevelDirectoryCreationSyncsEveryModifiedParentInOrder`.
Solution-wide stress runs also include an intentional 60-minute soak and
unrelated
locale-sensitive/flaky tests; all affected WoT projects and tests pass.

## Specification

Depends on OPCF-Members/spec-drafts#31.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6a9f41b1-72f0-4c74-bd7f-26fa531e5738
2026-09-02 00:09:36 +00:00

942 lines
44 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- ========================================================================
Kitchen-sink NodeSet2 for issue #4251.
This model deliberately flips every knob defined by UANodeSet.xsd so both
the source-generation pipeline (<AdditionalFiles ModelSourceGeneratorPrefix
="Opc.Ua.CoverageTest">) and the runtime import pipeline
(RuntimeNodeSetNodeManagerFactory / AddRuntimeNodeSet) can be validated
node-by-node, attribute-by-attribute and reference-by-reference and then
cross-checked for structural equivalence.
Every owned node lives in the primary model namespace
(http://opcfoundation.org/UA/CoverageTest/). A secondary namespace is
declared so the namespace table carries a cross-namespace entry, and a
ServerUri feeds server-index-bearing ExpandedNodeIds.
The concrete NodeId/BrowseName catalogue is duplicated in
CoverageTestCatalogue.cs and Opc.Ua.CoverageTest.NodeSet2.csv.
======================================================================== -->
<UANodeSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:uax="http://opcfoundation.org/UA/2008/02/Types.xsd"
xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd">
<NamespaceUris>
<Uri>http://opcfoundation.org/UA/CoverageTest/</Uri>
</NamespaceUris>
<ServerUris>
<Uri>urn:opcfoundation.org:CoverageTest:Server</Uri>
</ServerUris>
<Models>
<Model ModelUri="http://opcfoundation.org/UA/CoverageTest/"
Version="1.2.3"
PublicationDate="2024-06-01T00:00:00Z"
ModelVersion="1.2.3"
AccessRestrictions="1">
<RequiredModel ModelUri="http://opcfoundation.org/UA/"
PublicationDate="2023-12-15T00:00:00Z"
Version="1.05.03" />
<RolePermissions>
<RolePermission Permissions="63">i=15644</RolePermission>
</RolePermissions>
</Model>
</Models>
<Aliases>
<Alias Alias="Boolean">i=1</Alias>
<Alias Alias="SByte">i=2</Alias>
<Alias Alias="Byte">i=3</Alias>
<Alias Alias="Int16">i=4</Alias>
<Alias Alias="UInt16">i=5</Alias>
<Alias Alias="Int32">i=6</Alias>
<Alias Alias="UInt32">i=7</Alias>
<Alias Alias="Int64">i=8</Alias>
<Alias Alias="UInt64">i=9</Alias>
<Alias Alias="Float">i=10</Alias>
<Alias Alias="Double">i=11</Alias>
<Alias Alias="String">i=12</Alias>
<Alias Alias="DateTime">i=13</Alias>
<Alias Alias="Guid">i=14</Alias>
<Alias Alias="ByteString">i=15</Alias>
<Alias Alias="NodeId">i=17</Alias>
<Alias Alias="LocalizedText">i=21</Alias>
<Alias Alias="Structure">i=22</Alias>
<Alias Alias="Enumeration">i=29</Alias>
<Alias Alias="Number">i=26</Alias>
<Alias Alias="Argument">i=296</Alias>
<Alias Alias="EnumValueType">i=7594</Alias>
<Alias Alias="Organizes">i=35</Alias>
<Alias Alias="HasEventSource">i=36</Alias>
<Alias Alias="HasModellingRule">i=37</Alias>
<Alias Alias="HasEncoding">i=38</Alias>
<Alias Alias="HasDescription">i=39</Alias>
<Alias Alias="HasTypeDefinition">i=40</Alias>
<Alias Alias="GeneratesEvent">i=41</Alias>
<Alias Alias="HasSubtype">i=45</Alias>
<Alias Alias="HasProperty">i=46</Alias>
<Alias Alias="HasComponent">i=47</Alias>
<Alias Alias="HasNotifier">i=48</Alias>
<Alias Alias="HasOrderedComponent">i=49</Alias>
<Alias Alias="FromState">i=51</Alias>
<Alias Alias="ToState">i=52</Alias>
<Alias Alias="HasCause">i=53</Alias>
<Alias Alias="HasEffect">i=54</Alias>
<Alias Alias="HasSubStateMachine">i=117</Alias>
<Alias Alias="AlwaysGeneratesEvent">i=3065</Alias>
<Alias Alias="HasTrueSubState">i=9004</Alias>
<Alias Alias="HasFalseSubState">i=9005</Alias>
<Alias Alias="HasCondition">i=9006</Alias>
<Alias Alias="HasDictionaryEntry">i=17597</Alias>
<Alias Alias="HasInterface">i=17603</Alias>
<Alias Alias="HasAddIn">i=17604</Alias>
</Aliases>
<!-- ================= document-level Extensions ======================= -->
<Extensions>
<Extension>
<ct:DocumentNote xmlns:ct="http://opcfoundation.org/UA/CoverageTest/ext">kitchen-sink</ct:DocumentNote>
</Extension>
</Extensions>
<!-- ================= 1. Reference types =============================== -->
<UAReferenceType NodeId="ns=1;i=5001" BrowseName="1:CoverageHierarchicalReference" Symmetric="false">
<DisplayName>CoverageHierarchicalReference</DisplayName>
<Description>Custom asymmetric hierarchical reference type.</Description>
<InverseName>IsCoverageChildOf</InverseName>
<References>
<Reference ReferenceType="HasSubtype" IsForward="false">i=33</Reference>
</References>
</UAReferenceType>
<UAReferenceType NodeId="ns=1;i=5002" BrowseName="1:CoverageSymmetricReference" Symmetric="true">
<DisplayName>CoverageSymmetricReference</DisplayName>
<Description>Custom symmetric non-hierarchical reference type.</Description>
<References>
<Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
</References>
</UAReferenceType>
<UAReferenceType NodeId="ns=1;i=5003" BrowseName="1:CoverageAbstractReference" IsAbstract="true" Symmetric="false">
<DisplayName>CoverageAbstractReference</DisplayName>
<Description>Abstract custom reference type; parent of a concrete subtype.</Description>
<InverseName>CoverageAbstractReferenceInverse</InverseName>
<References>
<Reference ReferenceType="HasSubtype" IsForward="false">i=32</Reference>
</References>
</UAReferenceType>
<UAReferenceType NodeId="ns=1;i=5004" BrowseName="1:CoverageConcreteReference" Symmetric="false">
<DisplayName>CoverageConcreteReference</DisplayName>
<Description>Concrete subtype of the abstract custom reference type.</Description>
<InverseName>CoverageConcreteReferenceInverse</InverseName>
<References>
<Reference ReferenceType="HasSubtype" IsForward="false">ns=1;i=5003</Reference>
</References>
</UAReferenceType>
<!-- ================= 2. Data types ==================================== -->
<!-- Enumeration with explicit values and per-field DisplayName/Description -->
<UADataType NodeId="ns=1;i=5100" BrowseName="1:CoverageEnumeration">
<DisplayName>CoverageEnumeration</DisplayName>
<Description>Enumeration exercising explicit values and per-field metadata.</Description>
<References>
<Reference ReferenceType="HasProperty">ns=1;i=5101</Reference>
<Reference ReferenceType="HasSubtype" IsForward="false">i=29</Reference>
</References>
<Definition Name="1:CoverageEnumeration">
<Field Name="Idle" Value="0">
<DisplayName>Idle</DisplayName>
<Description>Nothing is happening.</Description>
</Field>
<Field Name="Running" Value="1">
<DisplayName>Running</DisplayName>
<Description>Work in progress.</Description>
</Field>
<Field Name="Faulted" Value="2">
<DisplayName>Faulted</DisplayName>
<Description>An error occurred.</Description>
</Field>
</Definition>
</UADataType>
<UAVariable NodeId="ns=1;i=5101" BrowseName="EnumValues" ParentNodeId="ns=1;i=5100"
DataType="EnumValueType" ValueRank="1" ArrayDimensions="3">
<DisplayName>EnumValues</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=68</Reference>
<Reference ReferenceType="HasProperty" IsForward="false">ns=1;i=5100</Reference>
</References>
<Value>
<uax:ListOfExtensionObject>
<uax:ExtensionObject>
<uax:TypeId><uax:Identifier>i=7616</uax:Identifier></uax:TypeId>
<uax:Body><uax:EnumValueType><uax:Value>0</uax:Value><uax:DisplayName><uax:Text>Idle</uax:Text></uax:DisplayName></uax:EnumValueType></uax:Body>
</uax:ExtensionObject>
<uax:ExtensionObject>
<uax:TypeId><uax:Identifier>i=7616</uax:Identifier></uax:TypeId>
<uax:Body><uax:EnumValueType><uax:Value>1</uax:Value><uax:DisplayName><uax:Text>Running</uax:Text></uax:DisplayName></uax:EnumValueType></uax:Body>
</uax:ExtensionObject>
<uax:ExtensionObject>
<uax:TypeId><uax:Identifier>i=7616</uax:Identifier></uax:TypeId>
<uax:Body><uax:EnumValueType><uax:Value>2</uax:Value><uax:DisplayName><uax:Text>Faulted</uax:Text></uax:DisplayName></uax:EnumValueType></uax:Body>
</uax:ExtensionObject>
</uax:ListOfExtensionObject>
</Value>
</UAVariable>
<!-- OptionSet with bit fields -->
<UADataType NodeId="ns=1;i=5110" BrowseName="1:CoverageOptionSet">
<DisplayName>CoverageOptionSet</DisplayName>
<Description>OptionSet exercising IsOptionSet bit fields.</Description>
<References>
<Reference ReferenceType="HasProperty">ns=1;i=5111</Reference>
<Reference ReferenceType="HasSubtype" IsForward="false">i=12755</Reference>
</References>
<Definition Name="1:CoverageOptionSet" IsOptionSet="true">
<Field Name="OptionA" Value="0">
<Description>First option bit.</Description>
</Field>
<Field Name="OptionB" Value="1">
<Description>Second option bit.</Description>
</Field>
<Field Name="OptionC" Value="2">
<Description>Third option bit.</Description>
</Field>
</Definition>
</UADataType>
<UAVariable NodeId="ns=1;i=5111" BrowseName="OptionSetValues" ParentNodeId="ns=1;i=5110"
DataType="LocalizedText" ValueRank="1" ArrayDimensions="3">
<DisplayName>OptionSetValues</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=68</Reference>
<Reference ReferenceType="HasProperty" IsForward="false">ns=1;i=5110</Reference>
</References>
<Value>
<uax:ListOfLocalizedText>
<uax:LocalizedText><uax:Text>OptionA</uax:Text></uax:LocalizedText>
<uax:LocalizedText><uax:Text>OptionB</uax:Text></uax:LocalizedText>
<uax:LocalizedText><uax:Text>OptionC</uax:Text></uax:LocalizedText>
</uax:ListOfLocalizedText>
</Value>
</UAVariable>
<!-- Abstract data type used as an AllowSubTypes field target. -->
<UADataType NodeId="ns=1;i=5120" BrowseName="1:CoverageAbstractStructure" IsAbstract="true">
<DisplayName>CoverageAbstractStructure</DisplayName>
<Description>Abstract structure used as an AllowSubTypes field target.</Description>
<References>
<Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
</References>
<Definition Name="1:CoverageAbstractStructure">
<Field Name="Tag" DataType="String" />
</Definition>
</UADataType>
<!-- Plain structure: scalar/array/matrix ranks, MaxStringLength, AllowSubTypes -->
<UADataType NodeId="ns=1;i=5130" BrowseName="1:CoverageStructure">
<DisplayName>CoverageStructure</DisplayName>
<Description>Structure exercising scalar/array/matrix fields and AllowSubTypes.</Description>
<References>
<Reference ReferenceType="HasEncoding">ns=1;i=5131</Reference>
<Reference ReferenceType="HasEncoding">ns=1;i=5132</Reference>
<Reference ReferenceType="HasEncoding">ns=1;i=5133</Reference>
<Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
</References>
<Definition Name="1:CoverageStructure">
<Field Name="ScalarInt" DataType="Int32" />
<Field Name="ArrayDouble" DataType="Double" ValueRank="1" />
<Field Name="MatrixFloat" DataType="Float" ValueRank="2" ArrayDimensions="2,2" />
<Field Name="BoundedString" DataType="String" MaxStringLength="64" />
<Field Name="AnyBase" DataType="ns=1;i=5120" AllowSubTypes="true" />
</Definition>
</UADataType>
<UAObject NodeId="ns=1;i=5131" BrowseName="Default Binary" SymbolicName="DefaultBinary">
<DisplayName>Default Binary</DisplayName>
<References>
<Reference ReferenceType="HasEncoding" IsForward="false">ns=1;i=5130</Reference>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
</References>
</UAObject>
<UAObject NodeId="ns=1;i=5132" BrowseName="Default XML" SymbolicName="DefaultXml">
<DisplayName>Default XML</DisplayName>
<References>
<Reference ReferenceType="HasEncoding" IsForward="false">ns=1;i=5130</Reference>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
</References>
</UAObject>
<UAObject NodeId="ns=1;i=5133" BrowseName="Default JSON" SymbolicName="DefaultJson">
<DisplayName>Default JSON</DisplayName>
<References>
<Reference ReferenceType="HasEncoding" IsForward="false">ns=1;i=5130</Reference>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
</References>
</UAObject>
<!-- Structure with an optional field; non-default Purpose -->
<UADataType NodeId="ns=1;i=5140" BrowseName="1:CoverageOptionalStructure" Purpose="ServicesOnly">
<DisplayName>CoverageOptionalStructure</DisplayName>
<Description>Structure exercising an optional field and a non-default Purpose.</Description>
<References>
<Reference ReferenceType="HasEncoding">ns=1;i=5141</Reference>
<Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
</References>
<Definition Name="1:CoverageOptionalStructure">
<Field Name="Required" DataType="Int32" />
<Field Name="Optional" DataType="String" IsOptional="true" />
</Definition>
</UADataType>
<UAObject NodeId="ns=1;i=5141" BrowseName="Default Binary" SymbolicName="DefaultBinary">
<DisplayName>Default Binary</DisplayName>
<References>
<Reference ReferenceType="HasEncoding" IsForward="false">ns=1;i=5140</Reference>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
</References>
</UAObject>
<!-- Union -->
<UADataType NodeId="ns=1;i=5150" BrowseName="1:CoverageUnion">
<DisplayName>CoverageUnion</DisplayName>
<Description>Union data type.</Description>
<References>
<Reference ReferenceType="HasEncoding">ns=1;i=5151</Reference>
<Reference ReferenceType="HasSubtype" IsForward="false">i=12756</Reference>
</References>
<Definition Name="1:CoverageUnion" IsUnion="true">
<Field Name="AsInteger" DataType="Int32" />
<Field Name="AsText" DataType="String" />
</Definition>
</UADataType>
<UAObject NodeId="ns=1;i=5151" BrowseName="Default Binary" SymbolicName="DefaultBinary">
<DisplayName>Default Binary</DisplayName>
<References>
<Reference ReferenceType="HasEncoding" IsForward="false">ns=1;i=5150</Reference>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
</References>
</UAObject>
<!-- Plain structure (simple scalar fields) that the runtime complex-type
loader can materialise into a stand-in encodeable, mirroring the
ComplexTypesLoadedViaDefaultServerPath scenario. -->
<UADataType NodeId="ns=1;i=5160" BrowseName="1:CoveragePlainStructure">
<DisplayName>CoveragePlainStructure</DisplayName>
<Description>Plain structure with simple scalar fields.</Description>
<References>
<Reference ReferenceType="HasEncoding">ns=1;i=5161</Reference>
<Reference ReferenceType="HasSubtype" IsForward="false">i=22</Reference>
</References>
<Definition Name="1:CoveragePlainStructure">
<Field Name="Count" DataType="Int32" />
<Field Name="Label" DataType="String" />
<Field Name="Ratio" DataType="Double" />
</Definition>
</UADataType>
<UAObject NodeId="ns=1;i=5161" BrowseName="Default Binary" SymbolicName="DefaultBinary">
<DisplayName>Default Binary</DisplayName>
<References>
<Reference ReferenceType="HasEncoding" IsForward="false">ns=1;i=5160</Reference>
<Reference ReferenceType="HasTypeDefinition">i=76</Reference>
</References>
</UAObject>
<!-- ================= type dictionary + descriptions ==================
Type dictionaries / DataTypeDescription nodes are intentionally NOT
authored: the source generator regenerates the binary/XML schema from
the DataTypeDefinitions rather than emitting DataTypeDictionary nodes
into the address space, so hand-authored dictionary nodes would make the
two pipelines diverge. The HasEncoding/DataTypeDefinition coverage above
exercises the complex-type surface both pipelines share. -->
<!-- ================= 3. Object / variable / event / interface types == -->
<UAObjectType NodeId="ns=1;i=5200" BrowseName="1:CoverageAbstractObjectType" IsAbstract="true">
<DisplayName>CoverageAbstractObjectType</DisplayName>
<Description>Abstract base object type.</Description>
<References>
<Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference>
</References>
</UAObjectType>
<UAObjectType NodeId="ns=1;i=5210" BrowseName="1:CoverageObjectType">
<DisplayName>CoverageObjectType</DisplayName>
<Description>Concrete object type with a full instance-declaration subtree.</Description>
<References>
<Reference ReferenceType="HasComponent">ns=1;i=5211</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5212</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5213</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5214</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5215</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5216</Reference>
<Reference ReferenceType="HasInterface">ns=1;i=5240</Reference>
<Reference ReferenceType="GeneratesEvent">ns=1;i=5230</Reference>
<Reference ReferenceType="HasSubtype" IsForward="false">ns=1;i=5200</Reference>
</References>
</UAObjectType>
<UAVariable NodeId="ns=1;i=5211" BrowseName="1:MandatoryVariable" ParentNodeId="ns=1;i=5210" DataType="Double">
<DisplayName>MandatoryVariable</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasModellingRule">i=78</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5210</Reference>
</References>
</UAVariable>
<UAVariable NodeId="ns=1;i=5212" BrowseName="1:OptionalVariable" ParentNodeId="ns=1;i=5210" DataType="Int32">
<DisplayName>OptionalVariable</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasModellingRule">i=80</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5210</Reference>
</References>
</UAVariable>
<UAObject NodeId="ns=1;i=5213" BrowseName="1:MandatoryPlaceholder" ParentNodeId="ns=1;i=5210">
<DisplayName>MandatoryPlaceholder</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=58</Reference>
<Reference ReferenceType="HasModellingRule">i=11510</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5210</Reference>
</References>
</UAObject>
<UAObject NodeId="ns=1;i=5214" BrowseName="1:OptionalPlaceholder" ParentNodeId="ns=1;i=5210">
<DisplayName>OptionalPlaceholder</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=58</Reference>
<Reference ReferenceType="HasModellingRule">i=11508</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5210</Reference>
</References>
</UAObject>
<UAVariable NodeId="ns=1;i=5215" BrowseName="1:ExposesArrayVariable" ParentNodeId="ns=1;i=5210"
DataType="Double" ValueRank="1" ArrayDimensions="0">
<DisplayName>ExposesArrayVariable</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasModellingRule">i=83</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5210</Reference>
</References>
</UAVariable>
<UAMethod NodeId="ns=1;i=5216" BrowseName="1:MandatoryMethod" ParentNodeId="ns=1;i=5210">
<DisplayName>MandatoryMethod</DisplayName>
<References>
<Reference ReferenceType="HasProperty">ns=1;i=5217</Reference>
<Reference ReferenceType="HasProperty">ns=1;i=5218</Reference>
<Reference ReferenceType="HasModellingRule">i=78</Reference>
<Reference ReferenceType="AlwaysGeneratesEvent">ns=1;i=5230</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5210</Reference>
</References>
</UAMethod>
<UAVariable NodeId="ns=1;i=5217" BrowseName="InputArguments" ParentNodeId="ns=1;i=5216"
DataType="Argument" ValueRank="1" ArrayDimensions="1">
<DisplayName>InputArguments</DisplayName>
<References>
<Reference ReferenceType="HasModellingRule">i=78</Reference>
<Reference ReferenceType="HasProperty" IsForward="false">ns=1;i=5216</Reference>
<Reference ReferenceType="HasTypeDefinition">i=68</Reference>
</References>
<Value>
<uax:ListOfExtensionObject>
<uax:ExtensionObject>
<uax:TypeId><uax:Identifier>i=297</uax:Identifier></uax:TypeId>
<uax:Body>
<uax:Argument>
<uax:Name>Factor</uax:Name>
<uax:DataType><uax:Identifier>i=11</uax:Identifier></uax:DataType>
<uax:ValueRank>-1</uax:ValueRank>
<uax:ArrayDimensions />
<uax:Description><uax:Locale>en</uax:Locale><uax:Text>The multiplication factor.</uax:Text></uax:Description>
</uax:Argument>
</uax:Body>
</uax:ExtensionObject>
</uax:ListOfExtensionObject>
</Value>
</UAVariable>
<UAVariable NodeId="ns=1;i=5218" BrowseName="OutputArguments" ParentNodeId="ns=1;i=5216"
DataType="Argument" ValueRank="1" ArrayDimensions="1">
<DisplayName>OutputArguments</DisplayName>
<References>
<Reference ReferenceType="HasModellingRule">i=78</Reference>
<Reference ReferenceType="HasProperty" IsForward="false">ns=1;i=5216</Reference>
<Reference ReferenceType="HasTypeDefinition">i=68</Reference>
</References>
<Value>
<uax:ListOfExtensionObject>
<uax:ExtensionObject>
<uax:TypeId><uax:Identifier>i=297</uax:Identifier></uax:TypeId>
<uax:Body>
<uax:Argument>
<uax:Name>Product</uax:Name>
<uax:DataType><uax:Identifier>i=11</uax:Identifier></uax:DataType>
<uax:ValueRank>-1</uax:ValueRank>
<uax:ArrayDimensions />
<uax:Description><uax:Locale>en</uax:Locale><uax:Text>The resulting product.</uax:Text></uax:Description>
</uax:Argument>
</uax:Body>
</uax:ExtensionObject>
</uax:ListOfExtensionObject>
</Value>
</UAVariable>
<UAObjectType NodeId="ns=1;i=5230" BrowseName="1:CoverageEventType">
<DisplayName>CoverageEventType</DisplayName>
<Description>Custom event type generated by the object type / method.</Description>
<References>
<Reference ReferenceType="HasSubtype" IsForward="false">i=2041</Reference>
</References>
</UAObjectType>
<UAObjectType NodeId="ns=1;i=5240" BrowseName="1:CoverageInterfaceType" IsAbstract="true">
<DisplayName>CoverageInterfaceType</DisplayName>
<Description>Custom interface type composed via HasInterface.</Description>
<References>
<Reference ReferenceType="HasSubtype" IsForward="false">i=17602</Reference>
</References>
</UAObjectType>
<UAVariableType NodeId="ns=1;i=5300" BrowseName="1:CoverageVariableType"
DataType="Double" ValueRank="1" ArrayDimensions="3">
<DisplayName>CoverageVariableType</DisplayName>
<Description>Variable type with a type-level default value.</Description>
<References>
<Reference ReferenceType="HasSubtype" IsForward="false">i=63</Reference>
</References>
<Value>
<uax:ListOfDouble>
<uax:Double>1.5</uax:Double>
<uax:Double>2.5</uax:Double>
<uax:Double>3.5</uax:Double>
</uax:ListOfDouble>
</Value>
</UAVariableType>
<!-- ================= 4. Instances ==================================== -->
<!-- Root container, organised from the Objects folder -->
<UAObject NodeId="ns=1;i=5400" BrowseName="1:CoverageRoot" SymbolicName="CoverageRoot"
WriteMask="2097151" UserWriteMask="2097151" AccessRestrictions="1">
<DisplayName>CoverageRoot</DisplayName>
<Description>Root folder for coverage instances.</Description>
<Category>CoverageCategoryA</Category>
<Category>CoverageCategoryB</Category>
<Documentation>https://example.org/coverage</Documentation>
<References>
<Reference ReferenceType="HasTypeDefinition">i=61</Reference>
<Reference ReferenceType="Organizes" IsForward="false">i=85</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5402</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5410</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5420</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5421</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5422</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5423</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5424</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5425</Reference>
<Reference ReferenceType="HasOrderedComponent">ns=1;i=5426</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5450</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5451</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5470</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5490</Reference>
<Reference ReferenceType="ns=1;i=5001">ns=1;i=5420</Reference>
<Reference ReferenceType="ns=1;i=5002">ns=1;i=5421</Reference>
<Reference ReferenceType="ns=1;i=5004">ns=1;i=5422</Reference>
</References>
<RolePermissions>
<RolePermission Permissions="63">i=15644</RolePermission>
</RolePermissions>
<Extensions>
<Extension>
<ct:NodeNote xmlns:ct="http://opcfoundation.org/UA/CoverageTest/ext">root</ct:NodeNote>
</Extension>
</Extensions>
</UAObject>
<!-- Instance of the custom object type with its mandatory members -->
<UAObject NodeId="ns=1;i=5402" BrowseName="1:TypedObject" ParentNodeId="ns=1;i=5400"
ReleaseStatus="Released">
<DisplayName>TypedObject</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">ns=1;i=5210</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5403</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5404</Reference>
<Reference ReferenceType="HasInterface">ns=1;i=5240</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5400</Reference>
</References>
</UAObject>
<UAVariable NodeId="ns=1;i=5403" BrowseName="1:MandatoryVariable" ParentNodeId="ns=1;i=5402" DataType="Double">
<DisplayName>MandatoryVariable</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5402</Reference>
</References>
<Value>
<uax:Double>42.5</uax:Double>
</Value>
</UAVariable>
<UAMethod NodeId="ns=1;i=5404" BrowseName="1:MandatoryMethod" ParentNodeId="ns=1;i=5402"
MethodDeclarationId="ns=1;i=5216">
<DisplayName>MandatoryMethod</DisplayName>
<References>
<Reference ReferenceType="HasProperty">ns=1;i=5405</Reference>
<Reference ReferenceType="HasProperty">ns=1;i=5406</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5402</Reference>
</References>
</UAMethod>
<UAVariable NodeId="ns=1;i=5405" BrowseName="InputArguments" ParentNodeId="ns=1;i=5404"
DataType="Argument" ValueRank="1" ArrayDimensions="1">
<DisplayName>InputArguments</DisplayName>
<References>
<Reference ReferenceType="HasProperty" IsForward="false">ns=1;i=5404</Reference>
<Reference ReferenceType="HasTypeDefinition">i=68</Reference>
</References>
<Value>
<uax:ListOfExtensionObject>
<uax:ExtensionObject>
<uax:TypeId><uax:Identifier>i=297</uax:Identifier></uax:TypeId>
<uax:Body>
<uax:Argument>
<uax:Name>Factor</uax:Name>
<uax:DataType><uax:Identifier>i=11</uax:Identifier></uax:DataType>
<uax:ValueRank>-1</uax:ValueRank>
<uax:ArrayDimensions />
<uax:Description><uax:Locale>en</uax:Locale><uax:Text>The multiplication factor.</uax:Text></uax:Description>
</uax:Argument>
</uax:Body>
</uax:ExtensionObject>
</uax:ListOfExtensionObject>
</Value>
</UAVariable>
<UAVariable NodeId="ns=1;i=5406" BrowseName="OutputArguments" ParentNodeId="ns=1;i=5404"
DataType="Argument" ValueRank="1" ArrayDimensions="1">
<DisplayName>OutputArguments</DisplayName>
<References>
<Reference ReferenceType="HasProperty" IsForward="false">ns=1;i=5404</Reference>
<Reference ReferenceType="HasTypeDefinition">i=68</Reference>
</References>
<Value>
<uax:ListOfExtensionObject>
<uax:ExtensionObject>
<uax:TypeId><uax:Identifier>i=297</uax:Identifier></uax:TypeId>
<uax:Body>
<uax:Argument>
<uax:Name>Product</uax:Name>
<uax:DataType><uax:Identifier>i=11</uax:Identifier></uax:DataType>
<uax:ValueRank>-1</uax:ValueRank>
<uax:ArrayDimensions />
<uax:Description><uax:Locale>en</uax:Locale><uax:Text>The resulting product.</uax:Text></uax:Description>
</uax:Argument>
</uax:Body>
</uax:ExtensionObject>
</uax:ListOfExtensionObject>
</Value>
</UAVariable>
<!-- Event-source object: EventNotifier + HasNotifier/HasEventSource + HasCondition -->
<UAObject NodeId="ns=1;i=5410" BrowseName="1:EventSource" ParentNodeId="ns=1;i=5400"
EventNotifier="1" ReleaseStatus="Draft">
<DisplayName>EventSource</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=58</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5400</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5412</Reference>
<Reference ReferenceType="HasNotifier">ns=1;i=5411</Reference>
<Reference ReferenceType="HasEventSource">ns=1;i=5411</Reference>
<Reference ReferenceType="HasCondition">ns=1;i=5412</Reference>
</References>
</UAObject>
<UAObject NodeId="ns=1;i=5411" BrowseName="1:SubNotifier" ParentNodeId="ns=1;i=5410" EventNotifier="1">
<DisplayName>SubNotifier</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=58</Reference>
<Reference ReferenceType="HasNotifier" IsForward="false">ns=1;i=5410</Reference>
</References>
</UAObject>
<UAObject NodeId="ns=1;i=5412" BrowseName="1:CoverageCondition" ParentNodeId="ns=1;i=5410">
<DisplayName>CoverageCondition</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=2782</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5410</Reference>
<Reference ReferenceType="HasCondition" IsForward="false">ns=1;i=5410</Reference>
</References>
</UAObject>
<!-- Built-in value variables. HasNoPermissions on the boolean one. -->
<UAVariable NodeId="ns=1;i=5420" BrowseName="1:BooleanValue" ParentNodeId="ns=1;i=5400"
DataType="Boolean" AccessLevel="3" UserAccessLevel="3"
MinimumSamplingInterval="100" Historizing="true" HasNoPermissions="true">
<DisplayName Locale="en">BooleanValue</DisplayName>
<Description Locale="en">A boolean value.</Description>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5400</Reference>
</References>
<Value>
<uax:Boolean>true</uax:Boolean>
</Value>
</UAVariable>
<UAVariable NodeId="ns=1;i=5421" BrowseName="1:Int32Value" ParentNodeId="ns=1;i=5400"
DataType="Int32" AccessLevel="3" UserAccessLevel="1">
<DisplayName>Int32Value</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5400</Reference>
</References>
<Value>
<uax:Int32>-12345</uax:Int32>
</Value>
</UAVariable>
<UAVariable NodeId="ns=1;i=5422" BrowseName="1:StringArrayValue" ParentNodeId="ns=1;i=5400"
DataType="String" ValueRank="1" ArrayDimensions="2">
<DisplayName>StringArrayValue</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5400</Reference>
</References>
<Value>
<uax:ListOfString>
<uax:String>alpha</uax:String>
<uax:String>beta</uax:String>
</uax:ListOfString>
</Value>
</UAVariable>
<UAVariable NodeId="ns=1;i=5423" BrowseName="1:DoubleMatrixValue" ParentNodeId="ns=1;i=5400"
DataType="Double" ValueRank="2" ArrayDimensions="2,2">
<DisplayName>DoubleMatrixValue</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5400</Reference>
</References>
<Value>
<uax:Matrix>
<uax:Dimensions>
<uax:Int32>2</uax:Int32>
<uax:Int32>2</uax:Int32>
</uax:Dimensions>
<uax:Elements>
<uax:Double>1</uax:Double>
<uax:Double>2</uax:Double>
<uax:Double>3</uax:Double>
<uax:Double>4</uax:Double>
</uax:Elements>
</uax:Matrix>
</Value>
</UAVariable>
<UAVariable NodeId="ns=1;i=5424" BrowseName="1:DateTimeValue" ParentNodeId="ns=1;i=5400" DataType="DateTime">
<DisplayName>DateTimeValue</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5400</Reference>
</References>
<Value>
<uax:DateTime>2024-06-01T12:00:00Z</uax:DateTime>
</Value>
</UAVariable>
<UAVariable NodeId="ns=1;i=5425" BrowseName="1:EnumerationValue" ParentNodeId="ns=1;i=5400"
DataType="ns=1;i=5100">
<DisplayName>EnumerationValue</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5400</Reference>
</References>
<Value>
<uax:Int32>1</uax:Int32>
</Value>
</UAVariable>
<UAVariable NodeId="ns=1;i=5426" BrowseName="1:OrderedValue" ParentNodeId="ns=1;i=5400"
DataType="ByteString" ReleaseStatus="Deprecated">
<DisplayName>OrderedValue</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasOrderedComponent" IsForward="false">ns=1;i=5400</Reference>
</References>
<Value>
<uax:ByteString>AQIDBA==</uax:ByteString>
</Value>
</UAVariable>
<!-- Callable method instance; MethodDeclarationId to the type-level method -->
<UAMethod NodeId="ns=1;i=5450" BrowseName="1:AddNumbers" ParentNodeId="ns=1;i=5400">
<DisplayName>AddNumbers</DisplayName>
<Description>Adds two numbers and returns the sum.</Description>
<References>
<Reference ReferenceType="HasProperty">ns=1;i=5452</Reference>
<Reference ReferenceType="HasProperty">ns=1;i=5453</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5400</Reference>
</References>
</UAMethod>
<UAMethod NodeId="ns=1;i=5451" BrowseName="1:LockedMethod" ParentNodeId="ns=1;i=5400"
Executable="false" UserExecutable="false">
<DisplayName>LockedMethod</DisplayName>
<Description>A method that is not executable.</Description>
<References>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5400</Reference>
</References>
</UAMethod>
<UAVariable NodeId="ns=1;i=5452" BrowseName="InputArguments" ParentNodeId="ns=1;i=5450"
DataType="Argument" ValueRank="1" ArrayDimensions="2">
<DisplayName>InputArguments</DisplayName>
<References>
<Reference ReferenceType="HasProperty" IsForward="false">ns=1;i=5450</Reference>
<Reference ReferenceType="HasTypeDefinition">i=68</Reference>
</References>
<Value>
<uax:ListOfExtensionObject>
<uax:ExtensionObject>
<uax:TypeId><uax:Identifier>i=297</uax:Identifier></uax:TypeId>
<uax:Body>
<uax:Argument>
<uax:Name>A</uax:Name>
<uax:DataType><uax:Identifier>i=6</uax:Identifier></uax:DataType>
<uax:ValueRank>-1</uax:ValueRank>
<uax:ArrayDimensions />
<uax:Description><uax:Locale>en</uax:Locale><uax:Text>First addend.</uax:Text></uax:Description>
</uax:Argument>
</uax:Body>
</uax:ExtensionObject>
<uax:ExtensionObject>
<uax:TypeId><uax:Identifier>i=297</uax:Identifier></uax:TypeId>
<uax:Body>
<uax:Argument>
<uax:Name>B</uax:Name>
<uax:DataType><uax:Identifier>i=6</uax:Identifier></uax:DataType>
<uax:ValueRank>-1</uax:ValueRank>
<uax:ArrayDimensions />
<uax:Description><uax:Locale>en</uax:Locale><uax:Text>Second addend.</uax:Text></uax:Description>
</uax:Argument>
</uax:Body>
</uax:ExtensionObject>
</uax:ListOfExtensionObject>
</Value>
</UAVariable>
<UAVariable NodeId="ns=1;i=5453" BrowseName="OutputArguments" ParentNodeId="ns=1;i=5450"
DataType="Argument" ValueRank="1" ArrayDimensions="1">
<DisplayName>OutputArguments</DisplayName>
<References>
<Reference ReferenceType="HasProperty" IsForward="false">ns=1;i=5450</Reference>
<Reference ReferenceType="HasTypeDefinition">i=68</Reference>
</References>
<Value>
<uax:ListOfExtensionObject>
<uax:ExtensionObject>
<uax:TypeId><uax:Identifier>i=297</uax:Identifier></uax:TypeId>
<uax:Body>
<uax:Argument>
<uax:Name>Sum</uax:Name>
<uax:DataType><uax:Identifier>i=6</uax:Identifier></uax:DataType>
<uax:ValueRank>-1</uax:ValueRank>
<uax:ArrayDimensions />
<uax:Description><uax:Locale>en</uax:Locale><uax:Text>The sum of A and B.</uax:Text></uax:Description>
</uax:Argument>
</uax:Body>
</uax:ExtensionObject>
</uax:ListOfExtensionObject>
</Value>
</UAVariable>
<!-- View over selected members -->
<UAView NodeId="ns=1;i=5460" BrowseName="1:CoverageView" ContainsNoLoops="true" EventNotifier="1"
SymbolicName="CoverageView">
<DisplayName>CoverageView</DisplayName>
<Description>A view that organizes selected coverage members.</Description>
<References>
<Reference ReferenceType="Organizes">ns=1;i=5400</Reference>
<Reference ReferenceType="Organizes">ns=1;i=5420</Reference>
<Reference ReferenceType="Organizes" IsForward="false">i=87</Reference>
</References>
</UAView>
<!-- Small finite state machine to light up state-machine references -->
<UAObject NodeId="ns=1;i=5470" BrowseName="1:CoverageStateMachine" ParentNodeId="ns=1;i=5400"
DesignToolOnly="true">
<DisplayName>CoverageStateMachine</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=2771</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5471</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5472</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5473</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5400</Reference>
</References>
</UAObject>
<UAObject NodeId="ns=1;i=5471" BrowseName="1:StateA" ParentNodeId="ns=1;i=5470">
<DisplayName>StateA</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=2307</Reference>
<Reference ReferenceType="HasTrueSubState">ns=1;i=5472</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5470</Reference>
</References>
</UAObject>
<UAObject NodeId="ns=1;i=5472" BrowseName="1:StateB" ParentNodeId="ns=1;i=5470">
<DisplayName>StateB</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=2307</Reference>
<Reference ReferenceType="HasFalseSubState" IsForward="false">ns=1;i=5471</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5470</Reference>
</References>
</UAObject>
<UAObject NodeId="ns=1;i=5473" BrowseName="1:TransitionAB" ParentNodeId="ns=1;i=5470">
<DisplayName>TransitionAB</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=2310</Reference>
<Reference ReferenceType="FromState">ns=1;i=5471</Reference>
<Reference ReferenceType="ToState">ns=1;i=5472</Reference>
<Reference ReferenceType="HasCause">ns=1;i=5450</Reference>
<Reference ReferenceType="HasEffect">ns=1;i=5230</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5470</Reference>
</References>
</UAObject>
<!-- Deep, branching instance tree (depth 4 with two branches) to exercise
nested HasComponent hierarchies in both pipelines. -->
<UAObject NodeId="ns=1;i=5490" BrowseName="1:TreeRoot" ParentNodeId="ns=1;i=5400">
<DisplayName>TreeRoot</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=61</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5491</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5495</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5400</Reference>
</References>
</UAObject>
<UAObject NodeId="ns=1;i=5491" BrowseName="1:BranchA" ParentNodeId="ns=1;i=5490">
<DisplayName>BranchA</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=58</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5492</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5493</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5490</Reference>
</References>
</UAObject>
<UAVariable NodeId="ns=1;i=5492" BrowseName="1:LeafA1" ParentNodeId="ns=1;i=5491" DataType="Int32">
<DisplayName>LeafA1</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5491</Reference>
</References>
<Value>
<uax:Int32>11</uax:Int32>
</Value>
</UAVariable>
<UAObject NodeId="ns=1;i=5493" BrowseName="1:SubBranchA" ParentNodeId="ns=1;i=5491">
<DisplayName>SubBranchA</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=58</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5494</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5491</Reference>
</References>
</UAObject>
<UAVariable NodeId="ns=1;i=5494" BrowseName="1:LeafA2" ParentNodeId="ns=1;i=5493" DataType="Int32">
<DisplayName>LeafA2</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5493</Reference>
</References>
<Value>
<uax:Int32>12</uax:Int32>
</Value>
</UAVariable>
<UAObject NodeId="ns=1;i=5495" BrowseName="1:BranchB" ParentNodeId="ns=1;i=5490">
<DisplayName>BranchB</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=58</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5496</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5490</Reference>
</References>
</UAObject>
<UAVariable NodeId="ns=1;i=5496" BrowseName="1:LeafB1" ParentNodeId="ns=1;i=5495" DataType="Int32">
<DisplayName>LeafB1</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5495</Reference>
</References>
<Value>
<uax:Int32>21</uax:Int32>
</Value>
</UAVariable>
</UANodeSet>