Author |
Message
|
mehedi |
Posted: Tue Apr 30, 2013 10:46 am Post subject: MRM - to read 5 records at a time from a file |
|
|
Centurion
Joined: 11 Nov 2001 Posts: 102 Location: PSTech
|
I am trying to create a message model(MRM) to
read 5 or less records at a time from the file.
A record is fixed lenght and delimited by <CR><LF>. See sample below.
Steps in creating the msd
1. Created the complex type
2. Created a sequence local group , set group terminator to <CR><LF>
3. Add local elemets to the above group
The parse does not work as expected. The <CR><LF> is being parsed as part of the data.
Code: |
<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="complexType">
<xsd:sequence>
<xsd:sequence maxOccurs="5">
<xsd:annotation>
<xsd:appinfo source="WMQI_APPINFO">
<tdsStructRep groupTerminator="<CR><LF>" messageSetDefaultRep="Text1"/>
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="CITY" type="xsd:string">
<xsd:annotation>
<xsd:appinfo source="WMQI_APPINFO">
<tdsElemRep encodingNull="NullPadFill" messageSetDefaultRep="Text1" precision="-1"/>
<cwfInclRep messageSetDefaultRep="Binary1">
<cwfSimpleRep encodingNull="NullPadFill" mrLengthEncoding="fixedLength" paddingCharacter="SPACE" stringJustification="leftJustify" typeName="MRCWFStringRep" width="20"/>
</cwfInclRep>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:element name="ST" type="xsd:string">
<xsd:annotation>
<xsd:appinfo source="WMQI_APPINFO">
<tdsElemRep encodingNull="NullPadFill" messageSetDefaultRep="Text1" precision="-1"/>
<cwfInclRep messageSetDefaultRep="Binary1">
<cwfSimpleRep encodingNull="NullPadFill" mrLengthEncoding="fixedLength" paddingCharacter="SPACE" stringJustification="leftJustify" typeName="MRCWFStringRep" width="2"/>
</cwfInclRep>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="complexType1">
<xsd:sequence/>
</xsd:complexType>
<xsd:element name="message1" type="complexType1">
<xsd:annotation>
<xsd:appinfo source="WMQI_APPINFO">
<MRMessage messageDefinition="/0/message1;XSDElementDeclaration$MRObject"/>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:schema>
|
Sample Data
PHILADELPHIA PA<CR><LF>
PHILADELPHIA PA<CR><LF>
PHILADELPHIA PA<CR><LF>
PHILADELPHIA PA<CR><LF>
PHILADELPHIA PA<CR><LF>
contact admin TN<CR><LF>
contact admin TN<CR><LF>
contact admin TN<CR><LF>
contact admin TN<CR><LF>
contact admin TN<CR><LF>
CHARLOTTE NC<CR><LF>
CHARLOTTE NC<CR><LF>
CHARLOTTE NC<CR><LF>
Thanks
Mehedi |
|
Back to top |
|
 |
mehedi |
Posted: Tue Apr 30, 2013 10:49 am Post subject: Trace file showing the parse |
|
|
Centurion
Joined: 11 Nov 2001 Posts: 102 Location: PSTech
|
Code: |
( ['GENERICROOT' : 0xebb550]
(0x01000000:Name ):Properties = ( ['GENERICPROPERTYPARSER' : 0xce79d20]
(0x03000000:NameValue):MessageSet = 'POCMS2' (CHARACTER)
(0x03000000:NameValue):MessageType = '{}:message4' (CHARACTER)
(0x03000000:NameValue):MessageFormat = 'Binary1' (CHARACTER)
(0x03000000:NameValue):Encoding = 546 (INTEGER)
(0x03000000:NameValue):CodedCharSetId = 437 (INTEGER)
(0x03000000:NameValue):Transactional = FALSE (BOOLEAN)
(0x03000000:NameValue):Persistence = FALSE (BOOLEAN)
(0x03000000:NameValue):CreationTime = GMTTIMESTAMP '2013-04-30 18:48:42.973' (GMTTIMESTAMP)
(0x03000000:NameValue):ExpirationTime = -1 (INTEGER)
(0x03000000:NameValue):Priority = 0 (INTEGER)
(0x03000000:NameValue):ReplyIdentifier = X'' (BLOB)
(0x03000000:NameValue):ReplyProtocol = 'ADAPTOR' (CHARACTER)
(0x03000000:NameValue):Topic = NULL
(0x03000000:NameValue):ContentType = '' (CHARACTER)
(0x03000000:NameValue):IdentitySourceType = '' (CHARACTER)
(0x03000000:NameValue):IdentitySourceToken = '' (CHARACTER)
(0x03000000:NameValue):IdentitySourcePassword = '' (CHARACTER)
(0x03000000:NameValue):IdentitySourceIssuedBy = '' (CHARACTER)
(0x03000000:NameValue):IdentityMappedType = '' (CHARACTER)
(0x03000000:NameValue):IdentityMappedToken = '' (CHARACTER)
(0x03000000:NameValue):IdentityMappedPassword = '' (CHARACTER)
(0x03000000:NameValue):IdentityMappedIssuedBy = '' (CHARACTER)
)
(0x01000021:Name+):MRM = ( ['mrm' : 0xce7a710]
(0x0300000B:NameValue+):CITYX = 'PHILADELPHIA' (CHARACTER)
(0x0300000B:NameValue+):STX = 'PA' (CHARACTER)
(0x0300000B:NameValue+):CITYX = '
PHILADELPHIA' (CHARACTER)
(0x0300000B:NameValue+):STX = '' (CHARACTER)
(0x0300000B:NameValue+):CITYX = 'PA
PHILADELPHIA' (CHARACTER)
(0x0300000B:NameValue+):STX = '' (CHARACTER)
(0x0300000B:NameValue+):CITYX = ' PA
PHILADELPHIA' (CHARACTER)
(0x0300000B:NameValue+):STX = '' (CHARACTER)
(0x0300000B:NameValue+):CITYX = ' PA
PHILADELPHIA' (CHARACTER)
(0x0300000B:NameValue+):STX = '' (CHARACTER)
)
)
( ['MQROOT' : 0x47fa90]
(0x01000000:Name):File = (
(0x03000000:NameValue):Directory = 'C:\gsco\input2' (CHARACTER)
(0x03000000:NameValue):Name = 'CITYST.txt' (CHARACTER)
(0x03000000:NameValue):LastModified = GMTTIMESTAMP '2013-04-29 20:10:27.684' (GMTTIMESTAMP)
(0x03000000:NameValue):TimeStamp = '20130430_184842_945028' (CHARACTER)
(0x03000000:NameValue):Offset = 0 (INTEGER)
(0x03000000:NameValue):Record = 1 (INTEGER)
(0x03000000:NameValue):Delimiter = NULL
(0x03000000:NameValue):IsEmpty = FALSE (BOOLEAN)
)
(0x01000000:Name):Wildcard = (
(0x03000000:NameValue):WildcardMatch = 'CITYST.txt' (CHARACTER)
)
)
2013-04-30 14:48:42.989379
( ['GENERICROOT' : 0xebb550]
(0x01000000:Name ):Properties = ( ['GENERICPROPERTYPARSER' : 0xce79d20]
(0x03000000:NameValue):MessageSet = 'POCMS2' (CHARACTER)
(0x03000000:NameValue):MessageType = '{}:message4' (CHARACTER)
(0x03000000:NameValue):MessageFormat = 'Binary1' (CHARACTER)
(0x03000000:NameValue):Encoding = 546 (INTEGER)
(0x03000000:NameValue):CodedCharSetId = 437 (INTEGER)
(0x03000000:NameValue):Transactional = FALSE (BOOLEAN)
(0x03000000:NameValue):Persistence = FALSE (BOOLEAN)
(0x03000000:NameValue):CreationTime = GMTTIMESTAMP '2013-04-30 18:48:42.988998' (GMTTIMESTAMP)
(0x03000000:NameValue):ExpirationTime = -1 (INTEGER)
(0x03000000:NameValue):Priority = 0 (INTEGER)
(0x03000000:NameValue):ReplyIdentifier = X'' (BLOB)
(0x03000000:NameValue):ReplyProtocol = 'ADAPTOR' (CHARACTER)
(0x03000000:NameValue):Topic = NULL
(0x03000000:NameValue):ContentType = '' (CHARACTER)
(0x03000000:NameValue):IdentitySourceType = '' (CHARACTER)
(0x03000000:NameValue):IdentitySourceToken = '' (CHARACTER)
(0x03000000:NameValue):IdentitySourcePassword = '' (CHARACTER)
(0x03000000:NameValue):IdentitySourceIssuedBy = '' (CHARACTER)
(0x03000000:NameValue):IdentityMappedType = '' (CHARACTER)
(0x03000000:NameValue):IdentityMappedToken = '' (CHARACTER)
(0x03000000:NameValue):IdentityMappedPassword = '' (CHARACTER)
(0x03000000:NameValue):IdentityMappedIssuedBy = '' (CHARACTER)
)
(0x01000021:Name+):MRM = ( ['mrm' : 0xce7a710]
(0x0300000B:NameValue+):CITYX = ' PA
contact admin' (CHARACTER)
(0x0300000B:NameValue+):STX = '' (CHARACTER)
(0x0300000B:NameValue+):CITYX = ' TN
contact admin' (CHARACTER)
(0x0300000B:NameValue+):STX = 'E' (CHARACTER)
(0x0300000B:NameValue+):CITYX = ' TN
contact admin' (CHARACTER)
(0x0300000B:NameValue+):STX = 'LL' (CHARACTER)
(0x0300000B:NameValue+):CITYX = 'E TN
contact admin' (CHARACTER)
(0x0300000B:NameValue+):STX = 'VI' (CHARACTER)
(0x0300000B:NameValue+):CITYX = 'LLE TN
NA' (CHARACTER)
(0x0300000B:NameValue+):STX = 'SH' (CHARACTER)
)
)
( ['MQROOT' : 0x47fa90]
(0x01000000:Name):File = (
(0x03000000:NameValue):Directory = 'C:\gsco\input2' (CHARACTER)
(0x03000000:NameValue):Name = 'CITYST.txt' (CHARACTER)
(0x03000000:NameValue):LastModified = GMTTIMESTAMP '2013-04-29 20:10:27.684' (GMTTIMESTAMP)
(0x03000000:NameValue):TimeStamp = '20130430_184842_945028' (CHARACTER)
(0x03000000:NameValue):Offset = 110 (INTEGER)
(0x03000000:NameValue):Record = 2 (INTEGER)
(0x03000000:NameValue):Delimiter = NULL
(0x03000000:NameValue):IsEmpty = FALSE (BOOLEAN)
)
(0x01000000:Name):Wildcard = (
(0x03000000:NameValue):WildcardMatch = 'CITYST.txt' (CHARACTER)
)
)
2013-04-30 14:48:42.991019
( ['GENERICROOT' : 0xebb550]
(0x01000000:Name ):Properties = ( ['GENERICPROPERTYPARSER' : 0xce79d20]
(0x03000000:NameValue):MessageSet = 'POCMS2' (CHARACTER)
(0x03000000:NameValue):MessageType = '{}:message4' (CHARACTER)
(0x03000000:NameValue):MessageFormat = 'Binary1' (CHARACTER)
(0x03000000:NameValue):Encoding = 546 (INTEGER)
(0x03000000:NameValue):CodedCharSetId = 437 (INTEGER)
(0x03000000:NameValue):Transactional = FALSE (BOOLEAN)
(0x03000000:NameValue):Persistence = FALSE (BOOLEAN)
(0x03000000:NameValue):CreationTime = GMTTIMESTAMP '2013-04-30 18:48:42.990002' (GMTTIMESTAMP)
(0x03000000:NameValue):ExpirationTime = -1 (INTEGER)
(0x03000000:NameValue):Priority = 0 (INTEGER)
(0x03000000:NameValue):ReplyIdentifier = X'' (BLOB)
(0x03000000:NameValue):ReplyProtocol = 'ADAPTOR' (CHARACTER)
(0x03000000:NameValue):Topic = NULL
(0x03000000:NameValue):ContentType = '' (CHARACTER)
(0x03000000:NameValue):IdentitySourceType = '' (CHARACTER)
(0x03000000:NameValue):IdentitySourceToken = '' (CHARACTER)
(0x03000000:NameValue):IdentitySourcePassword = '' (CHARACTER)
(0x03000000:NameValue):IdentitySourceIssuedBy = '' (CHARACTER)
(0x03000000:NameValue):IdentityMappedType = '' (CHARACTER)
(0x03000000:NameValue):IdentityMappedToken = '' (CHARACTER)
(0x03000000:NameValue):IdentityMappedPassword = '' (CHARACTER)
(0x03000000:NameValue):IdentityMappedIssuedBy = '' (CHARACTER)
)
(0x01000021:Name+):MRM = ( ['mrm' : 0xce7a710]
2013-04-30 14:48:42.994856
( ['GENERICROOT' : 0xebb550]
(0x01000000:Name):Properties = ( ['GENERICPROPERTYPARSER' : 0xce79d20]
(0x03000000:NameValue):MessageSet = 'POCMS2' (CHARACTER)
(0x03000000:NameValue):MessageType = '{}:message4' (CHARACTER)
(0x03000000:NameValue):MessageFormat = 'Binary1' (CHARACTER)
(0x03000000:NameValue):Encoding = 546 (INTEGER)
(0x03000000:NameValue):CodedCharSetId = 437 (INTEGER)
(0x03000000:NameValue):Transactional = FALSE (BOOLEAN)
(0x03000000:NameValue):Persistence = FALSE (BOOLEAN)
(0x03000000:NameValue):CreationTime = GMTTIMESTAMP '2013-04-30 18:48:42.993999' (GMTTIMESTAMP)
(0x03000000:NameValue):ExpirationTime = -1 (INTEGER)
(0x03000000:NameValue):Priority = 0 (INTEGER)
(0x03000000:NameValue):ReplyIdentifier = X'' (BLOB)
(0x03000000:NameValue):ReplyProtocol = 'ADAPTOR' (CHARACTER)
(0x03000000:NameValue):Topic = NULL
(0x03000000:NameValue):ContentType = '' (CHARACTER)
(0x03000000:NameValue):IdentitySourceType = '' (CHARACTER)
(0x03000000:NameValue):IdentitySourceToken = '' (CHARACTER)
(0x03000000:NameValue):IdentitySourcePassword = '' (CHARACTER)
(0x03000000:NameValue):IdentitySourceIssuedBy = '' (CHARACTER)
(0x03000000:NameValue):IdentityMappedType = '' (CHARACTER)
(0x03000000:NameValue):IdentityMappedToken = '' (CHARACTER)
(0x03000000:NameValue):IdentityMappedPassword = '' (CHARACTER)
(0x03000000:NameValue):IdentityMappedIssuedBy = '' (CHARACTER)
)
(0x01000000:Name):BLOB = ( ['none' : 0xce78cb0]
(0x03000000:NameValue):UnknownParserName = 'NONE' (CHARACTER)
(0x03000000:NameValue):BLOB = X'' (BLOB)
)
)
( ['MQROOT' : 0x47fa90]
(0x01000000:Name):File = (
(0x03000000:NameValue):Directory = 'C:\gsco\input2' (CHARACTER)
(0x03000000:NameValue):Name = 'CITYST.txt' (CHARACTER)
(0x03000000:NameValue):LastModified = GMTTIMESTAMP '2013-04-29 20:10:27.684' (GMTTIMESTAMP)
(0x03000000:NameValue):TimeStamp = '20130430_184842_945028' (CHARACTER)
(0x03000000:NameValue):Offset = 312 (INTEGER)
(0x03000000:NameValue):Record = 3 (INTEGER)
(0x03000000:NameValue):Delimiter = NULL
(0x03000000:NameValue):IsEmpty = TRUE (BOOLEAN)
)
(0x01000000:Name):Wildcard = (
(0x03000000:NameValue):WildcardMatch = 'CITYST.txt' (CHARACTER)
)
)
|
|
|
Back to top |
|
 |
kimbert |
Posted: Tue Apr 30, 2013 12:22 pm Post subject: |
|
|
 Jedi Council
Joined: 29 Jul 2003 Posts: 5542 Location: Southampton
|
It doesn't look like fixed length data to me. Here is your data, displayed using [c o d e] tags to show what I mean:
Code: |
PHILADELPHIA PA<CR><LF>
PHILADELPHIA PA<CR><LF>
PHILADELPHIA PA<CR><LF>
PHILADELPHIA PA<CR><LF>
PHILADELPHIA PA<CR><LF>
contact admin TN<CR><LF>
contact admin TN<CR><LF>
contact admin TN<CR><LF>
contact admin TN<CR><LF>
contact admin TN<CR><LF>
CHARLOTTE NC<CR><LF>
CHARLOTTE NC<CR><LF>
CHARLOTTE NC<CR><LF> |
Other points to note:
- You have both CWF and TDS annotations in your mxsd file. Which are you using? CWF or TDS?
- Are you sure that your input data is correct? It is *meant* to be fixed-length?
- If the first field ends with a space, then you should set Data Element Separation to 'All elements delimited' on the sequence group. And set the 'Delimiter' to <SPACE>. But your 'contact admin' records suggest that it might be more complicated than that.
Sorry to ask so many questions. It is impossible to help without this information. |
|
Back to top |
|
 |
mqjeff |
Posted: Tue Apr 30, 2013 12:32 pm Post subject: |
|
|
Grand Master
Joined: 25 Jun 2008 Posts: 17447
|
yeah, you should be using delimited records, not fixed length records.
You might have fixed length fields within that delimited record. |
|
Back to top |
|
 |
mehedi |
Posted: Tue Apr 30, 2013 1:44 pm Post subject: |
|
|
Centurion
Joined: 11 Nov 2001 Posts: 102 Location: PSTech
|
I redid the Message Set to TDS format , and now the <CR><LF> is parsed correctly , and it does the two read and gets the first ten records. The third read with 3 records remaing fails , will post the exception messages in the next post .
About the sample data previously posted
The "contact admin TN" should actually be "contact admin TN".
Some check on the mqseries.net site automatically converted"contact admin TN" to "contact admin ..". (Try it out on preview)
Mehedi |
|
Back to top |
|
 |
mehedi |
Posted: Tue Apr 30, 2013 1:51 pm Post subject: |
|
|
Centurion
Joined: 11 Nov 2001 Posts: 102 Location: PSTech
|
When posting on the mqseries.net site ,
any post with the name of capital of Tennesse is converted to "contact Admin" . You can chek this out in the preview |
|
Back to top |
|
 |
mehedi |
Posted: Tue Apr 30, 2013 2:03 pm Post subject: |
|
|
Centurion
Joined: 11 Nov 2001 Posts: 102 Location: PSTech
|
The data is fixed length, which can occur upto 5 times(maxOccurs=5).
As mentioned earlier , i am trying to get the FileInput Node to Read upto 5 records from a file, the records are fixed length. The End of line for each record is <CR><LF>.
With the below message defintion, the first two reads (of 10 records) is successful, then the third read of 3 records fails with "Not enough data in bitstream".
How should i model this - For the "Local Group" the "Data Element Separation" is set to fixed length, the "Group Delimiter" to <CR><LF> , and maxOccurs to '5'.
This output is from a cobol program.
CITY(20 bytes length), ST(2 bytes lenght)
New Message Set with TDS format
Code: |
<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="complexType">
<xsd:sequence>
<xsd:sequence maxOccurs="5">
<xsd:annotation>
<xsd:appinfo source="WMQI_APPINFO">
<tdsStructRep groupTerminator="<CR><LF>" messageSetDefaultRep="Text1"/>
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="CITY" type="xsd:string">
<xsd:annotation>
<xsd:appinfo source="WMQI_APPINFO">
<tdsElemRep encodingNull="NullPadFill" length="20" messageSetDefaultRep="Text1" precision="-1"/>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:element name="ST" type="xsd:string">
<xsd:annotation>
<xsd:appinfo source="WMQI_APPINFO">
<tdsElemRep encodingNull="NullPadFill" length="2" messageSetDefaultRep="Text1" precision="-1"/>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="complexType1">
<xsd:sequence/>
</xsd:complexType>
<xsd:element name="message1" type="complexType">
<xsd:annotation>
<xsd:appinfo source="WMQI_APPINFO">
<MRMessage messageDefinition="/0/message1;XSDElementDeclaration$MRObject"/>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:schema>
|
Exception List
Code: |
ExceptionList
RecoverableException
File:CHARACTER:F:\build\slot1\S800_P\src\DataFlowEngine\ImbDataFlowNode.cpp
Line:INTEGER:1154
Function:CHARACTER:ImbDataFlowNode::createExceptionList
Type:CHARACTER:ComIbmFileInputNode
Name:CHARACTER:ReadasperMM#FCMComposite_1_1
Label:CHARACTER:ReadasperMM.File Input
Catalog:CHARACTER:BIPmsgs
Severity:INTEGER:3
Number:INTEGER:2230
Text:CHARACTER:Node throwing exception
ParserException
File:CHARACTER:F:\build\slot1\S800_P\src\MTI\MTIforBroker\MtiImbParser2\MtiImbParser.cpp
Line:INTEGER:774
Function:CHARACTER:MtiImbParser::parseRightSibling
Type:CHARACTER:ComIbmFileInputNode
Name:CHARACTER:ReadasperMM#FCMComposite_1_1
Label:CHARACTER:ReadasperMM.File Input
Catalog:CHARACTER:BIPmsgs
Severity:INTEGER:3
Number:INTEGER:5285
Text:CHARACTER:ImbRecoverableException caught from worker->parseNext.
Insert
Type:INTEGER:5
Text:CHARACTER:POCTDS
Insert
Type:INTEGER:2
Text:CHARACTER:1
Insert
Type:INTEGER:5
Text:CHARACTER:Text1
Insert
Type:INTEGER:5
Text:CHARACTER:/message1/ST
ParserException
File:CHARACTER:F:\build\slot1\S800_P\src\cpi\pwf\nxd\nxdworker.cpp
Line:INTEGER:511
Function:CHARACTER:NXDWorker::parseNext
Type:CHARACTER:
Name:CHARACTER:
Label:CHARACTER:
Catalog:CHARACTER:BIPmsgs
Severity:INTEGER:3
Number:INTEGER:5421
Text:CHARACTER:TDS General Error
Insert
Type:INTEGER:5
Text:CHARACTER:message1
Insert
Type:INTEGER:5
Text:CHARACTER:/message1/[SEQUENCE](4 of 5)/CITY
Insert
Type:INTEGER:2
Text:CHARACTER:72
ParserException
File:CHARACTER:F:\build\slot1\S800_P\src\cpi\pwf\nxd\nxdscanner.cpp
Line:INTEGER:109
Function:CHARACTER:NXDScanner::extractFixedLengthData
Type:CHARACTER:
Name:CHARACTER:
Label:CHARACTER:
Catalog:CHARACTER:BIPmsgs
Severity:INTEGER:3
Number:INTEGER:5426
Text:CHARACTER:Not enough data in bitstream
|
|
|
Back to top |
|
 |
mqjeff |
Posted: Wed May 01, 2013 3:33 am Post subject: |
|
|
Grand Master
Joined: 25 Jun 2008 Posts: 17447
|
presumably you now have it saying that there must be exactly 5 records in each group, rather than saying that there must be no more than 5 records in each group. |
|
Back to top |
|
 |
Esa |
Posted: Wed May 01, 2013 11:23 pm Post subject: |
|
|
 Grand Master
Joined: 22 May 2008 Posts: 1387 Location: Finland
|
mehedi wrote: |
When posting on the mqseries.net site ,
any post with the name of capital of Tennesse is converted to "contact Admin" . You can chek this out in the preview |
so do I-n-A-s-s-e-m-b-l-y and g-y-m-n-a-s-t-i-c-s.
They guy who wrote the content filter must have a wild imagination...  |
|
Back to top |
|
 |
|