//  Format of StreamerInfo record in release 3.02.06.
//  It is probably not accessed by its key, but from its offset given in the file header.
//  The StreamerInfo record DATA consists of a TList (list) object containing elements
//  of class TStreamerInfo.  
//	----------TKey-(never compressed)----------------------
//  byte 0->3  Nbytes    = Number of bytes in compressed record (TKey+data)	TKey::fNbytes
//       4->5  Version   = TKey class version identifier			TKey::fVersion
//       6->9  ObjLen    = Number of bytes of uncompressed data			TKey::fObjLen
//      10->13 Datime    = Date and time when record was written to file	TKey::fDatime
//               	| (year-1995)<<26|month<<22|day<<17|hour<<12|minute<<6|second
//      14->15 KeyLen    = Number of bytes in key structure (TKey) (64)		TKey::fKeyLen
//      16->17 Cycle     = Cycle of key						TKey::fCycle
//      18->21 SeekKey   = Byte offset of record itself (consistency check)	TKey::fSeekKey
//      22->25 SeekPdir  = Byte offset of parent directory record (TFile)	TKey::fSeekPdir
//      26->26 lname     = Number of bytes in the class name (5)		TKey::fClassName
//      27->31 ClassName = Object Class Name ("TList")				TKey::fClassName
//      32->32 lname     = Number of bytes in the object name (12)		TNamed::fName
//      33->44 Name      = lName bytes with the name of the object ("StreamerInfo") TNamed::fName
//      45->45 lTitle    = Number of bytes in the object title (18)		TNamed::fTitle
//      46->63 Title     = lTitle bytes with the title of the object		TNamed::fTitle
//               	| ("Doubly linked list")
//	----------TList-(always compressed at level 1 (even if compression level 0))----
//	The DATA is a TList collection object containing TStreamerInfo objects.
//	Below is the format of this TList data.
//
//	Here is the format of a TList object in Release 3.02.06.
//	Comments and offsets refer specifically to its use in the StreamerInfo record.
//--------
//      0->3  ByteCount = Number of remaining bytes in TList object (uncompressed)
//			|   OR'd with kByteCountMask (0x40000000)
//	4->5  Version   = Version of TList Class
//	6->15           = TObject object (a base class of TList) (see tobject.txt).
//			|   Objects in StreamerInfo record are not referenced.
//			|   Would be two bytes longer (6->17) if object were referenced.
//     16->16 fName     = Number of bytes in name of TList object, followed by the
//              	|   name itself.  (TCollection::fName).  The TList object in
//              	|   StreamerInfo record is unnamed, so byte contains 0.
//     17->20 nObjects  = Number of objects in list.
//     21->.. objects   = Sequentially, TStreamerInfo Objects in the list.
//			| In the StreamerInfo record, the objects in the list are
//			|   TStreamerInfo objects.  There will be one TStreamerInfo
//			|   object for every class used in data records other than
//			|   core records and the the StreamerInfo record itself.
//-------
//	Here is the format of a TStreamerInfo object in Release 3.02.06.
//	Note: Although TStreamerInfo does not use the default streamer, it has the same
//		format as if it did.  (compare with dobject.txt)
//      0->3  ByteCount = Number of remaining bytes in TStreamerInfo object (uncompressed)
//			|   OR'd with kByteCountMask (0x40000000)
//	4->.. ClassInfo = Information about TStreamerInfo class
//	        	| If this is the first occurrence of a TStreamerInfo object in the record
//              	|  4->7  -1        = New class tag (constant kNewClassTag = 0xffffffff)
//              	|  8->21 Classname = Object Class Name "TStreamerInfo" (null terminated)
//			| Otherwise
//			|  4->7 clIdx      = Byte offset of new class tag in record, plus 2.
//			| OR'd with kClassMask (0x80000000)
//	0->3  ByteCount = Number of remaining bytes in TStreamerInfo object (uncompressed)
//			|   OR'd with kByteCountMask (0x40000000)
//	4->5  Version   = Version of TStreamerInfo Class
// -Begin TNamed object (Base class of TStreamerInfo)
//	6->9  ByteCount = Number of remaining bytes in TNamed object
//			|   OR'd with kByteCountMask (0x40000000)
//     10->11 Version   = Version of TNamed Class
//     12->21           = TObject object (Base class of TNamed) (see tobject.txt).
//			|   Objects in StreamerInfo record are not referenced.
//			|   Would be two bytes longer (12->23) if object were referenced.
//     22->.. fName     = Number of bytes in name of class that this TStreamerInfo object
//			|   describes, followed by the class name itself.  (TNamed::fName).
//	0->.. fTitle    = Number of bytes in title of class that this TStreamerInfo object
//			|   describes, followed by the class title itself.  (TNamed::fTitle).
//			|  (Class title may be zero length)
// -End TNamed object
//	0->3  fCheckSum = Check sum for class that this TStreamerInfo object describes.
//			|  This checksum is over all base classes and all persistent
//			|  non-static data members.  It is computed by TClass::GetCheckSum().
//                      |  (TStreamerInfo::fCheckSum)
//	4->7  fClassVersion = Version of class that this TStreamerInfo object describes.
//                      |   (TStreamerInfo::fClassVersion)
// -Begin TObjArray object (Data member of TStreamerInfo)
//      0->3  ByteCount = Number of remaining bytes in TObjArray object (uncompressed)
//			|   OR'd with kByteCountMask (0x40000000)
//	4->.. ClassInfo = Information about TObjArray class
//	        	| If this is the first occurrence of a TObjArray object in the record
//              	|  4->7  -1        = New class tag (constant kNewClassTag = 0xffffffff)
//              	|  8->17 Classname = Object Class Name "TObjArray" (null terminated)
//			| Otherwise
//			|  4->7 clIdx      = Byte offset of new class tag in record, plus 2.
//			| OR'd with kClassMask (0x80000000)
//      0->3  ByteCount = Number of remaining bytes in TObjArray object (uncompressed)
//			|   OR'd with kByteCountMask (0x40000000)
//	4->5  Version   = Version of TObjArray Class
//	6->15           = TObject object (a base class of TObjArray) (see tobject.txt).
//			|   Objects in StreamerInfo record are not referenced.
//			|   Would be two bytes longer (6->17) if object were referenced.
//     16->16 fName     = Number of bytes in name of TObjArray object, followed by the
//              	|   name itself.  (TCollection::fName).  TObjArray objects in
//              	|   StreamerInfo record are unnamed, so byte contains 0.
//     17->20 nObjects  = Number of objects (derived from TStreamerElement) in array.
//     21->24 fLowerBound = Lower bound of array.  Will always be 0 in StreamerInfo record.
//     25->.. objects   = Sequentially, TStreamerElement objects in the array.
//			| In a TStreamerInfo object, the objects in the TObjArray are
//			|   of various types (described below), all of which inherit
//			|   directly from TStreamerElement objects.  There will be one
//			|   such object for every base class of the class that the
//			|   TStreamerInfo object describes, and also one such object for
//                      |   each persistent non-static data member of the class that the
//                      |   TStreamerInfo object describes.
// -End TObjArray object and TStreamerInfo object
//-------
//  The objects stored in the TObjectArray in TStreamerInfo are of various classes, each of
//     which inherits directly from the TStreamerElement class.  The possible classes (which
//     we refer to collectively as TStreamer<XXX>) are:
//
//  TStreamerBase:          Used for a base class.  All others below used for data members.
//  TStreamerBasicType:     For a basic type
//  TStreamerString:        For type TString
//  TStreamerBasicPointer:  For pointer to array of basic types
//  TStreamerObject:        For an object derived from TObject
//  TStreamerObjectPointer: For pointer to an object derived from TObject
//  TStreamerLoop:          For pointer to an array of objects
//  TStreamerObjectAny:     For an object not derived from TObject
//  TStreamerSTL:           For an STL container (not yet used??)
//  TStreamerSTLString:     For an STL string (not yet used??)
//-------
//	Here is the format of a TStreamer<XXX> object in Release 3.02.06.
//	In description below, 
//	0->3  ByteCount = Number of remaining bytes in TStreamer<XXX> object (uncompressed)
//			|   OR'd with kByteCountMask (0x40000000)
//	4->.. ClassInfo = Information about the specific TStreamer<XXX> class
//	        	| If this is the first occurrence of a TStreamerXXX object in the record
//              	|  4->7  -1        = New class tag (constant kNewClassTag = 0xffffffff)
//              	|  8->.. Classname = Object Class Name "TStreamer<XXX>" (null terminated)
//			| Otherwise
//			|  4->7 clIdx      = Byte offset of new class tag in record, plus 2.
//			| OR'd with kClassMask (0x80000000)
//	0->3  ByteCount = Number of remaining bytes in TStreamer<XXX> object (uncompressed)
//			|   OR'd with kByteCountMask (0x40000000)
//	4->5  Version   = Version of TStreamer<XXX> Class
// -Begin TStreamerElement object (Base class of TStreamerXXX)
//	0->3  ByteCount = Number of remaining bytes in TStreamerElement object (uncompressed)
//			|   OR'd with kByteCountMask (0x40000000)
//	4->5  Version   = Version of TStreamerElement Class
// -Begin TNamed object (Base class of TStreamerElement)
//	6->9  ByteCount = Number of remaining bytes in TNamed object
//			|   OR'd with kByteCountMask (0x40000000)
//     10->11 Version   = Version of TNamed Class
//     12->21           = TObject object (Base class of TNamed) (see tobject.txt).
//			|   Objects in StreamerInfo record are not referenced.
//			|   Would be two bytes longer (12->23) if object were referenced.
//     22->.. fName     = Number of bytes in class name of base class or member name of
//                      | data member that this TStreamerElement object describes,
//                      | followed by the name itself. (TNamed::fName).
//      0->.. fTitle    = Number of bytes in title of base class or data member that this
//                      | TStreamerElement object describes, followed by the title itself.
//                      |  (TNamed::fTitle).
// -End TNamed object
//	0->3  fType     = Type of data described by this TStreamerElement.
//                      |   (TStreamerElement::fType)
//                      |   Built in types:
//                      |   1:char, 2:short, 3:int, 4:long, 5:float, 8:double 
//                      |   11, 12, 13, 14:unsigned char, short, int, long respectively
//                      |   6: an array dimension (counter)
//                      |   15: bit mask (used for fBits field)
//                      |
//                      |   Pointers to built in types:
//                      |   40 + fType of built in type (e.g. 43: pointer to int)
//                      |
//			|   Objects:
//			|   65:TString, 66:TObject, 67:TNamed
//			|   0: base class (other than TObject or TNamed)
//			|   61: object data member derived from TObject (other than TObject or TNamed)
//			|   62: object data member not derived from TObject
//			|   63: pointer to object derived from TObject (pointer can't be null)
//			|   64: pointer to object derived from TObject (pointer may be null)
//			|   501: pointer to an array of objects
//                      |   500: an STL string or container
//                      |
//			|   Arrays:
//                      |   20 + fType of array element (e.g. 23: array of int)
//                      |
//	4->7  fSize     = Size of built in type or of pointer to built in type. 0 otherwise.
//                      |  (TStreamerElement::fSize).
//	8->11 fArrayLength = Size of array (0 if not array)
//                      |  (TStreamerElement::fArrayLength).
//     12->15 fArrayDim = Number of dimensions of array (0 if not an array)
//                      |  (TStreamerElement::fArrayDim).
//     16->35 fMaxIndex = Five integers giving the array dimensions (0 if not applicable)
//                      |  (TStreamerElement::fMaxIndex).
//     36->.. fTypeName = Number of bytes in name of the data type of the data member that
//                      |  the TStreamerElement object describes, followed by the name
//                      |  itself.  If this TStreamerElement object defines a base class
//                      |  rather than a data member, the name used is 'BASE'.
//                      |  (TStreamerElement::fTypeName).
// -End TStreamerElement object
//     The remaining data is specific to the type of TStreamer<XXX> class.
//      For TStreamerInfoBase:
//      0->3  fBaseVersion   = Version of base class that this TStreamerElement describes.
//      For TStreamerBasicType:
//            No specific data
//      For TStreamerString:
//            No specific data
//      For TStreamerBasicPointer:
//      0->3  fCountVersion = Version of class with the count (array dimension) 
//      4->.. fCountName= Number of bytes in the name of the data member holding
//                      | the count, followed by the name itself.
//      0->.. fCountName= Number of bytes in the name of the class holding the
//                      | count, followed by the name itself.
//      For TStreamerObject:
//            No specific data
//      For TStreamerObjectPointer:
//            No specific data
//      For TStreamerLoop:
//      0->3  fCountVersion = Version of class with the count (array dimension) 
//      4->.. fCountName= Number of bytes in the name of the data member holding
//                      | the count, followed by the name itself.
//      0->.. fCountClass= Number of bytes in the name of the class holding the
//                      | count, followed by the name itself.
//      For TStreamerObjectAny:
//            No specific data
//      For TStreamerSTL:
//      0->3  fSTLtype  = Type of STL container:
//                      | 1:vector, 2:list, 3:deque, 4:map, 5:set, 6:multimap, 7:multiset
//      4->7  fCType    = Type contained in STL container:
//                      | Same values as for fType above, with one addition: 365:STL string 
//      For TStreamerSTLString:
//            No specific data
