/////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2017-2018  Ericsson AB
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v2.0
// which accompanies this distribution, and is available at
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
/////////////////////////////////////////////////////////////////////////////////////
// Contributors:
// Akos Makovics
//
//  File:         UpcUa_Message_Templates.ttcn
//  Rev:          <RnXnn>
//  Prodnr:       CNL113861
/////////////////////////////////////////////////////////////////////////////////////

module OpcUa_Message_Templates {

  import from OpcUa_Types_Binary all;
  import from OpcUa_Templates_Binary all;

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                       General                           //
  //                                                         //
  /////////////////////////////////////////////////////////////

  template MessageChunk tr_baseResponseMessage := {
    header := ?,
    transportMessage := *,
    securityChannelId := *,
    securePolicyUri := *,
    senderCertificate := *,
    receiverCertificateThumbprint := *,
    securityTokenId := *,
    sequenceHeader := *,
    body := *
  }

  const RequestHeader reqHeader := {
    authenticationToken := {
      mask := 0,
	  namespaceUriBit := 0,
	  serverIndexBit := 0,
      reservedBit1 := 0,
	  reservedBit2 := 0,
	  IdType := {
	    twoByte := {
	      nodeValue := 0
	    }
      }
    },
    timestamp := 131556452504050000,
    requestHandle := 4,
    returnDiagnostics := 0,
    auditEntryId := { nullString := { arrayLength := -2147483647 } },
    timeoutHint := 0,
    additionalHeader := {
      typeId := {
        node := {
	      mask := 0,
	      namespaceUriBit := 0,
	  	  serverIndexBit := 0,
		  reservedBit1 := 0,
		  reservedBit2 := 0,
		  IdType := {
		    twoByte := {
		      nodeValue := 0
	        }
	      }
	    },
	    namespaceUri := omit,
	    serverIndex := omit
	  },
	  Value := 0
    }
  }

  const RequestHeader reqHeaderFourByte := {
    authenticationToken := {
      mask := 5,
      namespaceUriBit := 0,
      serverIndexBit := 0,
      reservedBit1 := 0,
      reservedBit2 := 0,
      IdType := {
        byteString := {
          nameSpace := 0,
          nodeValue := {
            realByteString := {
		      lengthValue := 16,
			  byteStringValue := { 213, 222, 175, 58, 50, 191, 56, 110, 161, 40, 190, 206, 46, 98, 162, 70 }
            }
		  }
        }
      }
    },
    timestamp := 131556452504610000,
    requestHandle := 4,
    returnDiagnostics := 0,
    auditEntryId := {
      realString := {
        stringLength := 0,
        stringValue := ""
      }
    },
    timeoutHint := 0,
    additionalHeader := {
      typeId := {
        node := {
          mask := 0,
          namespaceUriBit := 0,
          serverIndexBit := 0,
          reservedBit1 := 0,
          reservedBit2 := 0,
          IdType := {
            twoByte := {
              nodeValue := 0
            }
          }
        },
        namespaceUri := omit,
        serverIndex := omit
      },
      Value := 0
    }
  }

  const ResponseHeader respHeader := {
    timestamp := 131563360189870000,
    requestHandle := 1,
    serviceResult := 0,
    serviceDiagnostics := {
      symbolicIdBit := 0,
      namespaceUriBit := 0,
      localeBit := 0,
      localisedTextBit := 0,
      additionalInfoBit := 0,
      innerStatusCodeBit := 0,
      innerDiagnosticInfoBit := 0,
      reserveBit := 0,
      symbolicId := omit,
      namespaceUri := omit,
      locale := omit,
      localisedText := omit,
      additionalInfo := omit,
      innerStatusCode := omit,
      innerDiagnosticInfo := omit
    },
    stringTable := {
      realArray := {
        arrayLength := 0,
        arrayValues := { }
      }
    },
    additionalHeader := {
      typeId := {
        node := {
          mask := 0,
          namespaceUriBit := 0,
          serverIndexBit := 0,
          reservedBit1 := 0,
          reservedBit2 := 0,
          IdType := {
            twoByte := {
              nodeValue := 0
            }
          }
        },
        namespaceUri := omit,
        serverIndex := omit
      },
      Value := 0
    }
  }

  template UserTokenPolicy userTokenPolicy := {
      policyId := valueof(tr_String("username_basic256")),
      tokenType := USERNAME_1,
      issuedTokenType := valueof(tr_StringNull),
      issuerEndpointUrl := valueof(tr_StringNull),
      securityPolicyUri := valueof(tr_String("http://opcfoundation.org/UA/SecurityPolicy#Basic256"))
    }

  template EndpointDescription endpointDesc := {
    endpointUrl := valueof(tr_String("opc.tcp://zmakako-VirtualBox:4334/UA/MyLittleServer")),
    server := {
      applicationUri := valueof(tr_String("urn:NodeOPCUA-Server-default")),
      productUri := valueof(tr_String("NodeOPCUA-Server")),
      applicationName := {
        localeBit := 0,
        textBit := 1,
        spareBit1 := 0,
        spareBit2 := 0,
        spareBit3 := 0,
        spareBit4 := 0,
        spareBit5 := 0,
        spareBit6 := 0,
        locale := omit,
        text := valueof(tr_String("NodeOPCUA"))
      },
      applicationType := SERVER_0,
      gatewayServerUri := valueof(tr_String("")),
      discoveryProfileUri := valueof(tr_String("")),
      discoveryUrls := valueof(tr_ListOfString( {} ))
    },
    serverCertificate := valueof(tr_ByteString( {48, 130, 4} )),
    securityMode := NONE_1,
    securityPolicyUri := valueof(tr_String("http://opcfoundation.org/UA/SecurityPolicy#None")),
    userIdentityTokens := valueof(tr_ListOfUserTokenPolicy( {valueof(userTokenPolicy)} )),
    transportProfileUri := valueof(tr_String("http://opcfoundation.org/UA-Profile/Transport/uatcp-uasc-uabinary")),
    securityLevel := 3
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                     Hello Message                       //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetHelloMessage() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderHello);

    var HelloMessage v_body := {
      version := 0,
      receiveBufferSize := 655360,
      sendBufferSize := 655360,
      maxMessageSize := 0,
      maxChunkCount := 0,
      endPointUrl := valueof(tr_String("opc.tcp://zmakako-VirtualBox:4334/UA/MyLittleServer"))
    }

    var MessageChunk v_msg := valueof(tr_MessageHello(v_header, v_body));

    return enc_MessageChunk (v_msg);
  }



  /////////////////////////////////////////////////////////////
  //                                                         //
  //                      Ack Message                        //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetAckMessage() return template MessageChunk {

    template MessageChunk responseChunk modifies tr_baseResponseMessage := {
      header := {
        messageType := AckHeaderMsgType,
        chunkType := FinalChunk,
        messageSize := ?
      }
    }

    return responseChunk;
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                OpenSecureChannelRequest                 //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetOpenSecureChannelRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderOpenSecureChannel);

    var UInt32 v_securityChannelId := 0;
    var ListOfByte v_securePolicyUri := valueof(tr_ListOfByte({ 104, 116, 116, 112, 58, 47, 47, 111, 112, 99, 102, 111, 117, 110, 100, 97, 116, 105, 111, 110, 46, 111, 114, 103, 47, 85, 65, 47, 83, 101, 99, 117, 114, 105, 116, 121, 80, 111, 108, 105, 99, 121, 35, 78, 111, 110, 101 }));
    var ListOfByte v_senderCertificate := valueof(tr_ListOfByteNull);
    var ListOfByte v_receiverCertificateThumbprint := valueof(tr_ListOfByteNull);
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 1,
      RequestId := 1
    }

    var OpenSecureChannelRequest v_openSecReq := {
      requestHeader := reqHeader,
      clientProtocolVersion := 0,
      requestType := ISSUE_0,
      securityMode := NONE_1,
      clientNonce := valueof(tr_ByteStringNull),
      requestedLifetime := 600000
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        OpenSecureChannelRequest := v_openSecReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);

    var MessageChunk v_msg := valueof(tr_MessageOpenSecureChannel(v_header, v_securityChannelId, v_securePolicyUri, v_senderCertificate, v_receiverCertificateThumbprint, v_sequenceHeader, v_encodedBody));
    return enc_MessageChunk (v_msg);
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                OpenSecureChannelResponse                //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetOpenSecureChannelResponse() return template MessageChunk {

    template MessageChunk responseChunk modifies tr_baseResponseMessage := {
      header := {
        messageType := OpenSecureChannelMsgType,
        chunkType := FinalChunk,
        messageSize := ?
      }
    }

    return responseChunk;
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                    GetEndpointsRequest                  //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetEndpointsRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderService);

    var UInt32 v_securityChannelId := 1;
    var UInt32 v_securityTokenId := 1
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 2,
      RequestId := 2
    }

    var GetEndpointsRequest v_getEndpointsReq := {
      requestHeader := reqHeader,
      endpointUrl := valueof(tr_String( "" )),
      localeIds := valueof(tr_ListOfLocaleId ( {} )),
      profileUris := valueof(tr_ListOfString ( {} ))
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        GetEndpointsRequest := v_getEndpointsReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);
    var MessageChunk v_msg := valueof(tr_MessageCloseSecureChannel(v_header, v_securityChannelId, v_securityTokenId, v_sequenceHeader, v_encodedBody));
    return enc_MessageChunk (v_msg);
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                 CreateSessionRequest                    //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetCreateSessionRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderService);

    var UInt32 v_securityChannelId := 1;
    var UInt32 v_securityTokenId := 1
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 3,
      RequestId := 3
    }

    var CreateSessionRequest v_createSessionReq := {
      requestHeader := reqHeader,
      clientDescription := {
        applicationUri := valueof(tr_String( "urn:zmakako-VirtualBox:Node-OPCUA-Server" )),
        productUri := valueof(tr_String( "NodeOPCUA-Client" )),
        applicationName := {
          localeBit := 0,
          textBit := 1,
          spareBit1 := 0,
          spareBit2 := 0,
          spareBit3 := 0,
          spareBit4 := 0,
          spareBit5 := 0,
          spareBit6 := 0,
          locale := omit,
          text := valueof(tr_String( "NodeOPCUA-Client" ))
        },
        applicationType := CLIENT_1,
        gatewayServerUri := valueof(tr_String( "" )),
        discoveryProfileUri := valueof(tr_String( "" )),
        discoveryUrls := valueof(tr_ListOfString({}))
      },
      serverUri := valueof(tr_String( "urn:NodeOPCUA-Server-default" )),
      endpointUrl := valueof(tr_String( "opc.tcp://zmakako-VirtualBox:4334/UA/MyLittleServer" )),
      sessionName := valueof(tr_String( "Session1" )),
      clientNonce := valueof(tr_ByteString( {103, 70, 147, 188, 171, 213, 166, 143, 188, 174, 139, 130, 248, 135, 93, 222, 115, 134, 67, 84, 89, 51, 182, 246, 95, 47, 244, 69, 162, 87, 120, 54} )),
      clientCertificate := valueof(tr_ByteString( { 48, 130, 4, 172, 48, 130, 3, 148, 160, 3, 2, 1, 2, 2, 9, 0, 193, 232, 116, 99, 18, 62, 6, 87, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 48, 88, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 70, 82, 49, 12, 48, 10, 6, 3, 85, 4, 8, 19, 3, 73, 68, 70, 49, 14, 48, 12, 6, 3, 85, 4, 7, 19, 5, 80, 97, 114, 105, 115, 49, 18, 48, 16, 6, 3, 85, 4, 10, 19, 9, 78, 111, 100, 101, 79, 80, 67, 85, 65, 49, 23, 48, 21, 6, 3, 85, 4, 3, 19, 14, 78, 111, 100, 101, 79, 80, 67, 85, 65, 45, 84, 69, 83, 84, 48, 30, 23, 13, 49, 55, 49, 48, 49, 57, 48, 57, 50, 53, 51, 50, 90, 23, 13, 51, 50, 49, 48, 49, 53, 48, 57, 50, 53, 51, 50, 90, 48, 88, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 70, 82, 49, 12, 48, 10, 6, 3, 85, 4, 8, 19, 3, 73, 68, 70, 49, 14, 48, 12, 6, 3, 85, 4, 7, 19, 5, 80, 97, 114, 105, 115, 49, 18, 48, 16, 6, 3, 85, 4, 10, 19, 9, 78, 111, 100, 101, 79, 80, 67, 85, 65, 49, 23, 48, 21, 6, 3, 85, 4, 3, 19, 14, 78, 111, 100, 101, 79, 80, 67, 85, 65, 45, 84, 69, 83, 84, 48, 130, 1, 34, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0, 162, 249, 118, 193, 122, 59, 9, 123, 20, 81, 132, 230, 222, 31, 81, 153, 95, 230, 235, 165, 119, 149, 47, 216, 100, 87, 85, 235, 155, 201, 46, 49, 153, 192, 135, 198, 208, 239, 3, 173, 127, 215, 133, 117, 6, 21, 120, 154, 177, 14, 220, 215, 143, 17, 104, 15, 105, 187, 57, 59, 145, 222, 79, 62, 112, 222, 116, 40, 83, 121, 96, 179, 7, 77, 67, 70, 91, 253, 110, 243, 2, 81, 104, 228, 225, 144, 127, 148, 248, 156, 216, 58, 197, 3, 51, 50, 199, 161, 26, 172, 237, 196, 225, 4, 6, 119, 147, 181, 126, 190, 36, 200, 233, 199, 193, 65, 191, 36, 90, 76, 127, 20, 121, 206, 146, 82, 191, 69, 5, 49, 212, 72, 182, 75, 41, 131, 110, 194, 181, 235, 28, 96, 205, 132, 150, 179, 171, 90, 170, 66, 190, 90, 141, 117, 180, 203, 175, 232, 36, 50, 221, 64, 115, 64, 13, 0, 84, 195, 97, 154, 52, 5, 156, 114, 95, 30, 192, 69, 179, 74, 148, 67, 181, 216, 51, 129, 195, 120, 211, 1, 114, 14, 148, 139, 211, 231, 91, 128, 26, 63, 36, 99, 193, 148, 251, 251, 76, 231, 95, 84, 68, 212, 235, 101, 119, 68, 15, 238, 199, 232, 239, 3, 228, 124, 41, 133, 193, 108, 180, 218, 49, 13, 140, 13, 43, 187, 108, 60, 6, 163, 251, 202, 53, 180, 177, 141, 114, 45, 39, 236, 196, 248, 61, 33, 142, 215, 2, 3, 1, 0, 1, 163, 130, 1, 119, 48, 130, 1, 115, 48, 29, 6, 3, 85, 29, 14, 4, 22, 4, 20, 17, 124, 191, 30, 233, 154, 127, 115, 204, 254, 168, 65, 112, 82, 167, 146, 191, 42, 85, 25, 48, 129, 137, 6, 3, 85, 29, 35, 4, 129, 129, 48, 127, 128, 20, 17, 124, 191, 30, 233, 154, 127, 115, 204, 254, 168, 65, 112, 82, 167, 146, 191, 42, 85, 25, 161, 92, 164, 90, 48, 88, 49, 11, 48, 9, 6, 3, 85, 4, 6, 19, 2, 70, 82, 49, 12, 48, 10, 6, 3, 85, 4, 8, 19, 3, 73, 68, 70, 49, 14, 48, 12, 6, 3, 85, 4, 7, 19, 5, 80, 97, 114, 105, 115, 49, 18, 48, 16, 6, 3, 85, 4, 10, 19, 9, 78, 111, 100, 101, 79, 80, 67, 85, 65, 49, 23, 48, 21, 6, 3, 85, 4, 3, 19, 14, 78, 111, 100, 101, 79, 80, 67, 85, 65, 45, 84, 69, 83, 84, 130, 9, 0, 193, 232, 116, 99, 18, 62, 6, 87, 48, 12, 6, 3, 85, 29, 19, 4, 5, 48, 3, 1, 1, 255, 48, 14, 6, 3, 85, 29, 15, 1, 1, 255, 4, 4, 3, 2, 1, 6, 48, 95, 6, 9, 96, 134, 72, 1, 134, 248, 66, 1, 13, 4, 82, 22, 80, 83, 101, 108, 102, 83, 105, 103, 110, 101, 100, 32, 67, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 32, 103, 101, 110, 101, 114, 97, 116, 101, 100, 32, 98, 121, 32, 78, 111, 100, 101, 45, 79, 80, 67, 85, 65, 32, 67, 101, 114, 116, 105, 102, 105, 99, 97, 116, 101, 32, 117, 116, 105, 108, 105, 116, 121, 32, 117, 115, 105, 110, 103, 32, 111, 112, 101, 110, 115, 115, 108, 48, 71, 6, 3, 85, 29, 17, 4, 64, 48, 62, 134, 40, 117, 114, 110, 58, 122, 109, 97, 107, 97, 107, 111, 45, 86, 105, 114, 116, 117, 97, 108, 66, 111, 120, 58, 78, 111, 100, 101, 45, 79, 80, 67, 85, 65, 45, 83, 101, 114, 118, 101, 114, 130, 18, 122, 109, 97, 107, 97, 107, 111, 45, 86, 105, 114, 116, 117, 97, 108, 66, 111, 120, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 11, 5, 0, 3, 130, 1, 1, 0, 22, 137, 144, 225, 128, 121, 63, 231, 142, 198, 56, 192, 141, 111, 226, 217, 215, 23, 136, 6, 246, 32, 201, 216, 83, 191, 107, 116, 101, 236, 227, 174, 40, 89, 16, 196, 106, 206, 58, 44, 57, 190, 231, 202, 222, 55, 3, 168, 5, 103, 54, 33, 245, 247, 158, 62, 14, 112, 252, 208, 199, 100, 88, 213, 165, 102, 115, 74, 184, 43, 25, 9, 189, 163, 137, 161, 77, 181, 46, 144, 124, 165, 161, 118, 16, 41, 139, 181, 209, 148, 149, 224, 171, 144, 145, 100, 226, 44, 24, 66, 28, 51, 227, 20, 25, 83, 242, 103, 94, 196, 143, 192, 51, 243, 186, 84, 113, 168, 82, 52, 244, 119, 221, 183, 151, 180, 112, 254, 132, 85, 243, 150, 149, 132, 233, 19, 190, 98, 178, 166, 90, 4, 136, 187, 43, 107, 11, 96, 124, 28, 0, 114, 9, 225, 161, 234, 23, 18, 67, 210, 67, 62, 65, 72, 55, 22, 82, 33, 147, 226, 174, 198, 179, 177, 213, 77, 54, 146, 15, 11, 109, 169, 116, 143, 70, 183, 213, 36, 114, 114, 131, 3, 164, 221, 35, 226, 221, 20, 11, 15, 248, 241, 151, 61, 229, 12, 151, 80, 69, 33, 56, 204, 248, 42, 78, 185, 61, 146, 254, 196, 188, 51, 129, 226, 133, 167, 193, 58, 159, 148, 222, 249, 96, 143, 122, 178, 30, 201, 40, 197, 240, 101, 58, 71, 87, 229, 138, 96, 24, 191, 194, 35, 23, 123, 136, 20} )),
      requestedSessionTimeout := 60000.0,
      maxResponseMessageSize := 800000
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        CreateSessionRequest := v_createSessionReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);
    var MessageChunk v_msg := valueof(tr_MessageCloseSecureChannel(v_header, v_securityChannelId, v_securityTokenId, v_sequenceHeader, v_encodedBody));

    return enc_MessageChunk (v_msg);
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                ActivateSessionRequest                   //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetActivateSessionRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderService);

    var UInt32 v_securityChannelId := 1;
    var UInt32 v_securityTokenId := 1
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 4,
      RequestId := 4
    }

    var ActivateSessionRequest v_activateSessionReq := {
      requestHeader := reqHeaderFourByte,
      clientSignature := {
        algorithm := valueof(tr_StringNull),
        Signature := valueof(tr_ByteStringNull)
      },
      clientSoftwareCertificates := valueof(tr_ListOfSignedSoftwareCertificate({})),
      localeIds := valueof(tr_ListOfLocaleId({})),
      userIdentityToken := {
        encodingByte := 1,
        twoByteNodeValue := omit,
        namespaceIndex := 0,
        fourByteNodeValue := 321,
        encoding := 1,
        parameterLength := 13,
        extensibleParameterBody := {
          anonymousIdentityToken := {
            policyId := valueof(tr_String( "anonymous"))
          }
        }
      },
      userTokenSignature := {
        algorithm := valueof(tr_StringNull),
        Signature := valueof(tr_ByteStringNull)
      }
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        ActivateSessionRequest := v_activateSessionReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);
    var MessageChunk v_msg := valueof(tr_MessageCloseSecureChannel(v_header, v_securityChannelId, v_securityTokenId, v_sequenceHeader, v_encodedBody));


    var octetstring res := enc_MessageChunk (v_msg);
    log (lengthof(res));
    log("=======================");

    return enc_MessageChunk (v_msg);
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                    BrowseRequest                        //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetBrowseRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderService);

    var UInt32 v_securityChannelId := 1;
    var UInt32 v_securityTokenId := 1
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 5,
      RequestId := 5
    }

    var BrowseRequest v_browseReq := {
      requestHeader := {
        authenticationToken := {
          mask := 5,
          namespaceUriBit := 0,
          serverIndexBit := 0,
          reservedBit1 := 0,
          reservedBit2 := 0,
          IdType := {
            byteString := {
              nameSpace := 0,
              nodeValue := {
                realByteString := {
                  lengthValue := 16,
                  byteStringValue := {
                    213,
                    222,
                    175,
                    58,
                    50,
                    191,
                    56,
                    110,
                    161,
                    40,
                    190,
                    206,
                    46,
                    98,
                    162,
                    70
                  }
                }
              }
            }
          }
        },
        timestamp := 131556452505810000,
        requestHandle := 5,
        returnDiagnostics := 0,
        auditEntryId := {
          realString := {
            stringLength := 0,
            stringValue := ""
          }
        },
        timeoutHint := 0,
        additionalHeader := {
          typeId := {
            node := {
              mask := 0,
              namespaceUriBit := 0,
              serverIndexBit := 0,
              reservedBit1 := 0,
              reservedBit2 := 0,
              IdType := {
                twoByte := {
                  nodeValue := 0
                }
              }
            },
            namespaceUri := omit,
            serverIndex := omit
          },
          Value := 0
        }
      },
      view := {
        viewId := {
          mask := 0,
          namespaceUriBit := 0,
          serverIndexBit := 0,
          reservedBit1 := 0,
          reservedBit2 := 0,
          IdType := {
            twoByte := {
              nodeValue := 0
            }
          }
        },
        timestamp := 0,
        viewVersion := 0
      },
      requestedMaxReferencesPerNode := 10000,
      nodesToBrowse := {
        realArray := {
          arrayLength := 1,
          arrayValues := {
            {
              nodeId := {
                mask := 0,
                namespaceUriBit := 0,
                serverIndexBit := 0,
                reservedBit1 := 0,
                reservedBit2 := 0,
                IdType := {
                  twoByte := {
                    nodeValue := 84
                  }
                }
              },
              browseDirection := BOTH_2,
              referenceTypeId := {
                mask := 0,
                namespaceUriBit := 0,
                serverIndexBit := 0,
                reservedBit1 := 0,
                reservedBit2 := 0,
                IdType := {
                  twoByte := {
                    nodeValue := 0
                  }
                }
              },
              includeSubtypes := 1,
              nodeClassMask := 0,
              resultMask := 63
            }
          }
        }
      }
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        BrowseRequest := v_browseReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);
    var MessageChunk v_msg := valueof(tr_MessageCloseSecureChannel(v_header, v_securityChannelId, v_securityTokenId, v_sequenceHeader, v_encodedBody));

    return enc_MessageChunk (v_msg);
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                     ReadRequest                         //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetReadRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderService);

    var UInt32 v_securityChannelId := 1;
    var UInt32 v_securityTokenId := 1
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 6,
      RequestId := 6
    }

    var ReadRequest v_readReq := {
      requestHeader := {
        authenticationToken := {
          mask := 5,
          namespaceUriBit := 0,
          serverIndexBit := 0,
          reservedBit1 := 0,
          reservedBit2 := 0,
          IdType := {
            byteString := {
              nameSpace := 0,
              nodeValue := valueof(tr_ByteString( { 213, 222, 175, 58, 50, 191, 56, 110, 161, 40, 190, 206, 46, 98, 162, 70 } ))
            }
          }
        },
        timestamp := 131556452505980000,
        requestHandle := 7,
        returnDiagnostics := 0,
        auditEntryId := {
          realString := {
            stringLength := 0,
            stringValue := ""
          }
        },
        timeoutHint := 0,
        additionalHeader := {
          typeId := {
            node := {
              mask := 0,
              namespaceUriBit := 0,
              serverIndexBit := 0,
              reservedBit1 := 0,
              reservedBit2 := 0,
              IdType := {
                twoByte := {
                  nodeValue := 0
                }
              }
            },
            namespaceUri := omit,
            serverIndex := omit
          },
          Value := 0
        }
      },
      maxAge := 0.0,
      timestampsToReturn := BOTH_2,
      nodesToRead := {
        realArray := {
          arrayLength := 1,
          arrayValues := {
            {
              nodeId := {
                mask := 3,
                namespaceUriBit := 0,
                serverIndexBit := 0,
                reservedBit1 := 0,
                reservedBit2 := 0,
                IdType := {
                  string := {
                    nameSpace := 1,
                    nodeValue :=  valueof (tr_String("free_memory"))
                  }
                }
              },
              attributeId := 13,
              indexRange := valueof(tr_StringNull),
              dataEncoding := {
                namespaceIndex := 0,
                name :=  valueof(tr_StringNull)
              }
            }
          }
        }
      }
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        ReadRequest := v_readReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);
    var MessageChunk v_msg := valueof(tr_MessageCloseSecureChannel(v_header, v_securityChannelId, v_securityTokenId, v_sequenceHeader, v_encodedBody));

    return enc_MessageChunk (v_msg);
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //               CreateSubscriptionRequest                 //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetCreateSubscRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderService);

    var UInt32 v_securityChannelId := 1;
    var UInt32 v_securityTokenId := 1
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 6,
      RequestId := 6
    }

    var CreateSubscriptionRequest v_createSubsReq := {
      requestHeader := {
        authenticationToken := {
          mask := 5,
          namespaceUriBit := 0,
          serverIndexBit := 0,
          reservedBit1 := 0,
          reservedBit2 := 0,
          IdType := {
            byteString := {
              nameSpace := 0,
              nodeValue := {
                realByteString := {
                  lengthValue := 16,
                  byteStringValue := {
                    213,
                    222,
                    175,
                    58,
                    50,
                    191,
                    56,
                    110,
                    161,
                    40,
                    190,
                    206,
                    46,
                    98,
                    162,
                    70
                  }
                }
              }
            }
          }
        },
        timestamp := 131556452506070000,
        requestHandle := 8,
        returnDiagnostics := 0,
        auditEntryId := {
          realString := {
            stringLength := 0,
            stringValue := ""
          }
        },
        timeoutHint := 0,
        additionalHeader := {
          typeId := {
            node := {
              mask := 0,
              namespaceUriBit := 0,
              serverIndexBit := 0,
              reservedBit1 := 0,
              reservedBit2 := 0,
              IdType := {
                twoByte := {
                  nodeValue := 0
                }
              }
            },
            namespaceUri := omit,
            serverIndex := omit
          },
          Value := 0
        }
      },
      requestedPublishingInterval := 100.0,
      requestedLifetimeCount := 10,
      requestedMaxKeepAliveCount := 2,
      maxNotificationsPerPublish := 10,
      publishingEnabled := 1,
      priorityInt32 := 10
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        CreateSubscriptionRequest := v_createSubsReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);
    var MessageChunk v_msg := valueof(tr_MessageCloseSecureChannel(v_header, v_securityChannelId, v_securityTokenId, v_sequenceHeader, v_encodedBody));

    return enc_MessageChunk (v_msg);
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                   ServiceResponse                       //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetServiceResponse() return template MessageChunk {

    template MessageChunk responseChunk modifies tr_baseResponseMessage := {
      header := {
        messageType := ServicesMsgType,
        chunkType := FinalChunk,
        messageSize := ?
      }
    }

    return responseChunk;
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                   CloseSessionRequest                   //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetCloseSessionRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderService);

    var UInt32 v_securityChannelId := 1;
    var UInt32 v_securityTokenId := 1
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 21,
      RequestId := 21
    }

    var CloseSessionRequest v_closeSessionReq := {
      requestHeader := {
        authenticationToken := {
          mask := 5,
          namespaceUriBit := 0,
          serverIndexBit := 0,
          reservedBit1 := 0,
          reservedBit2 := 0,
          IdType := {
            byteString := {
              nameSpace := 0,
              nodeValue := {
                realByteString := {
                  lengthValue := 16,
                  byteStringValue := {
                    213,
                    222,
                    175,
                    58,
                    50,
                    191,
                    56,
                    110,
                    161,
                    40,
                    190,
                    206,
                    46,
                    98,
                    162,
                    70
                  }
                }
              }
            }
          }
        },
        timestamp := 131556452556620000,
        requestHandle := 20,
        returnDiagnostics := 0,
        auditEntryId := {
          realString := {
            stringLength := 0,
            stringValue := ""
          }
        },
        timeoutHint := 0,
        additionalHeader := {
          typeId := {
            node := {
              mask := 0,
              namespaceUriBit := 0,
              serverIndexBit := 0,
              reservedBit1 := 0,
              reservedBit2 := 0,
              IdType := {
                twoByte := {
                  nodeValue := 0
                }
              }
            },
            namespaceUri := omit,
            serverIndex := omit
          },
          Value := 0
        }
      },
      deleteSubscriptions := 1
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        CloseSessionRequest := v_closeSessionReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);
    var MessageChunk v_msg := valueof(tr_MessageCloseSecureChannel(v_header, v_securityChannelId, v_securityTokenId, v_sequenceHeader, v_encodedBody));

    return enc_MessageChunk(v_msg);
  }

  /////////////////////////////////////////////////////////////
  //                                                         //
  //                CloseSecureChannelRequest                //
  //                                                         //
  /////////////////////////////////////////////////////////////

  function f_GetCloseSecureChannelRequest() return octetstring {
    var MessageHeader v_header := valueof(tr_HeaderCloseSecureChannel);

    var UInt32 v_securityChannelId := 1;
    var UInt32 v_securityTokenId := 1
    var SequenceHeader v_sequenceHeader := {
      SequenceNumber := 21,
      RequestId := 21
    }

    var CloseSecureChannelRequest v_closeSecReq := {
      requestHeader := reqHeader
    }

    var ServiceBody v_service := {
      encodingByte := 1,
      namespaceIndex := 0,
      nodeValue := 0,
      list := {
        CloseSecureChannelRequest := v_closeSecReq
      }
    }

    var octetstring v_encodedBody := enc_ServiceBody(v_service);
    var MessageChunk v_msg := valueof(tr_MessageCloseSecureChannel(v_header, v_securityChannelId, v_securityTokenId, v_sequenceHeader, v_encodedBody));

    return enc_MessageChunk(v_msg);
  }
}
