// @(#)root/xml:$Id$
// Author: Sergey Linev, Rene Brun  10.05.2004

/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//________________________________________________________________________
//
// Class for xml code generation
// It should be used for generation of xml steramers, which could be used outside root
// environment. This means, that with help of such streamers user can read and write
// objects from/to xml file, which later can be accepted by ROOT.
//
// At the moment supported only classes, which are not inherited from TObject
// and which not contains any TObject members.
//
// To generate xml code:
//
// 1. ROOT library with required classes should be created.
//    In general, without such library non of user objects can be stored and
//    retrived from any ROOT file
//
// 2. Generate xml streamers by root script like:
//
//    void generate() {
//      gSystem->Load("libRXML.so");   // load ROOT xml library
//      gSystem->Load("libuser.so");   // load user ROOT library
//
//      TList lst;
//      lst.Add(TClass::GetClass("TUserClass1"));
//      lst.Add(TClass::GetClass("TUserClass2"));
//      ...
//      TXMLPlayer player;
//      player.ProduceCode(&lst, "streamers");    // create xml streamers
//    }
//
//  3. Copy "streamers.h", "streamers.cxx", "TXmlFile.h", "TXmlFile.cxx" files
//     to user project and compile them. TXmlFile class implementation can be taken
//     from http://www-linux.gsi.de/~linev/xmlfile.tar.gz
//
// TXMLPlayer class generates one function per class, which called class streamer.
// Name of such function for class TExample will be TExample_streamer.
//
// Following data members for streamed classes are supported:
//  - simple data types (int, double, float)
//  - array of simple types (int[5], double[5][6])
//  - dynamic array of simple types (int* with comment field // [fSize])
//  - const char*
//  - object of any nonROOT class
//  - pointer on object
//  - array of objects
//  - array of pointers on objects
//  - stl string
//  - stl vector, list, deque, set, multiset, map, multimap
//  - allowed arguments for stl containers are: simple data types, string, object, pointer on object
//  Any other data member can not be (yet) read from xml file and write to xml file.
//
// If data member of class is private or protected, it can not be accessed via
// member name. Two alternative way is supported. First, if for class member fValue
// exists function GetValue(), it will be used to get value from the class, and if
// exists SetValue(), it will be used to set apropriate data member. Names of setter
// and getter methods can be specified in comments filed like:
//
//     int  fValue;   // *OPTION={GetMethod="GetV";SetMethod="SetV"}
//
// If getter or setter methods does not available, address to data member will be
// calculated as predefined offeset to object start address. In that case generated code
// should be used only on the same platform (OS + compiler), where it was generated.
//
// Generated streamers resolve inheritance tree for given class. This allows to have
// array (or vector) of object pointers on some basic class, while objects of derived
// class(es) are used.
//
// To access data from xml files, user should use TXmlFile class, which is different from
// ROOT TXMLFile, but provides very similar functionality. For example, to read
// object from xml file:
//
//        TXmlFile file("test.xml");             // open xml file
//        file.ls();                             // show list of keys in file
//        TExample* ex1 = (TExample*) file.Get("ex1", TExample_streamer); // get object
//        file.Close();
//
// To write object to file:
//
//        TXmlFile outfile("test2.xml", "recreate");    // create xml file
//        TExample* ex1 = new TExample;
//        outfile.Write(ex1, "ex1", TExample_streamer);   // write object to file
//        outfile.Close();
//
// Complete example for generating and using of external xml streamers can be taken from
// http://www-linux.gsi.de/~linev/xmlreader.tar.gz
//
// Any bug reports and requests for additional functionality are welcome.
//
// Sergey Linev, S.Linev@gsi.de
//
//________________________________________________________________________

#include "TXMLPlayer.h"

#include "Riostream.h"
#include "TROOT.h"
#include "TClass.h"
#include "TVirtualStreamerInfo.h"
#include "TStreamerElement.h"
#include "TObjArray.h"
#include "TObjString.h"
#include "TDataMember.h"
#include "TMethod.h"
#include "TDataType.h"
#include "TMethodCall.h"
#include "TFunction.h"
#include "TVirtualCollectionProxy.h"
#include "TClassEdit.h"
#include <string>
#include <vector>

const char* tab1 = "   ";
const char* tab2 = "      ";
const char* tab3 = "         ";
const char* tab4 = "            ";

const char* names_xmlfileclass = "TXmlFile";

ClassImp(TXMLPlayer);

//______________________________________________________________________________
TXMLPlayer::TXMLPlayer() : TObject()
{
   // default constructor
}

//______________________________________________________________________________
TXMLPlayer::~TXMLPlayer()
{
   // destructor of TXMLPlayer object
}

//______________________________________________________________________________
TString TXMLPlayer::GetStreamerName(TClass* cl)
{
   // returns streamer function name for given class

   if (cl==0) return "";
   TString res = cl->GetName();
   res += "_streamer";
   return res;
}

//______________________________________________________________________________
Bool_t TXMLPlayer::ProduceCode(TList* cllist, const char* filename)
{
   // Produce streamers for provide class list
   // TList should include list of classes, for which code should be generated.
   // filename specify name of file (without extension), where streamers should be
   // created. Function produces two files: header file and source file.
   // For instance, if filename is "streamers", files "streamers.h" and "streamers.cxx"
   // will be created.

   if ((cllist==0) || (filename==0)) return kFALSE;

   std::ofstream fh(TString(filename)+".h");
   std::ofstream fs(TString(filename)+".cxx");

   fh << "// generated header file" << std::endl << std::endl;
   fh << "#ifndef " << filename << "_h" << std::endl;
   fh << "#define " << filename << "_h" << std::endl << std::endl;

   fh << "#include \"" << names_xmlfileclass << ".h\"" << std::endl << std::endl;

   fs << "// generated source file" << std::endl << std::endl;
   fs << "#include \"" << filename << ".h\"" << std::endl << std::endl;

   // produce appropriate include for all classes

   TObjArray inclfiles;
   TIter iter(cllist);
   TClass* cl = 0;
   while ((cl = (TClass*) iter()) != 0) {
      if (inclfiles.FindObject(cl->GetDeclFileName())==0) {
         fs << "#include \"" << cl->GetDeclFileName() << "\"" << std::endl;
         inclfiles.Add(new TNamed(cl->GetDeclFileName(),""));
      }
   }
   inclfiles.Delete();

   fh << std::endl;
   fs << std::endl;

   // produce streamers declarations and implementations

   iter.Reset();

   while ((cl = (TClass*) iter()) != 0) {

      fh << "extern void* " << GetStreamerName(cl) << "("
         << names_xmlfileclass << " &buf, void* ptr = 0, bool checktypes = true);" << std::endl << std::endl;

      ProduceStreamerSource(fs, cl, cllist);
   }

   fh << "#endif" << std::endl << std::endl;
   fs << std::endl << std::endl;

   return kTRUE;
}

//______________________________________________________________________________
TString TXMLPlayer::GetMemberTypeName(TDataMember* member)
{
   // returns name of simple data type for given data member

   if (member==0) return "int";

   if (member->IsBasic())
   switch (member->GetDataType()->GetType()) {
      case kChar_t:     return "char";
      case kShort_t:    return "short";
      case kInt_t:      return "int";
      case kLong_t:     return "long";
      case kLong64_t:   return "long long";
      case kFloat16_t:
      case kFloat_t:    return "float";
      case kDouble32_t:
      case kDouble_t:   return "double";
      case kUChar_t:    {
         char first = member->GetDataType()->GetTypeName()[0];
         if ((first=='B') || (first=='b')) return "bool";
         return "unsigned char";
      }
      case kBool_t:     return "bool";
      case kUShort_t:   return "unsigned short";
      case kUInt_t:     return "unsigned int";
      case kULong_t:    return "unsigned long";
      case kULong64_t:  return "unsigned long long";
   }

   if (member->IsEnum()) return "int";

   return member->GetTypeName();
}

//______________________________________________________________________________
TString TXMLPlayer::GetBasicTypeName(TStreamerElement* el)
{
   // return simple data types for given TStreamerElement object

   if (el->GetType() == TVirtualStreamerInfo::kCounter) return "int";

   switch (el->GetType() % 20) {
      case TVirtualStreamerInfo::kChar:     return "char";
      case TVirtualStreamerInfo::kShort:    return "short";
      case TVirtualStreamerInfo::kInt:      return "int";
      case TVirtualStreamerInfo::kLong:     return "long";
      case TVirtualStreamerInfo::kLong64:   return "long long";
      case TVirtualStreamerInfo::kFloat16:
      case TVirtualStreamerInfo::kFloat:    return "float";
      case TVirtualStreamerInfo::kDouble32:
      case TVirtualStreamerInfo::kDouble:   return "double";
      case TVirtualStreamerInfo::kUChar: {
         char first = el->GetTypeNameBasic()[0];
         if ((first=='B') || (first=='b')) return "bool";
         return "unsigned char";
      }
      case TVirtualStreamerInfo::kBool:     return "bool";
      case TVirtualStreamerInfo::kUShort:   return "unsigned short";
      case TVirtualStreamerInfo::kUInt:     return "unsigned int";
      case TVirtualStreamerInfo::kULong:    return "unsigned long";
      case TVirtualStreamerInfo::kULong64:  return "unsigned long long";
   }
   return "int";
}

//______________________________________________________________________________
TString TXMLPlayer::GetBasicTypeReaderMethodName(Int_t type, const char* realname)
{
   // return functions name to read simple data type from xml file

   if (type == TVirtualStreamerInfo::kCounter) return "ReadInt";

   switch (type % 20) {
      case TVirtualStreamerInfo::kChar:     return "ReadChar";
      case TVirtualStreamerInfo::kShort:    return "ReadShort";
      case TVirtualStreamerInfo::kInt:      return "ReadInt";
      case TVirtualStreamerInfo::kLong:     return "ReadLong";
      case TVirtualStreamerInfo::kLong64:   return "ReadLong64";
      case TVirtualStreamerInfo::kFloat16:
      case TVirtualStreamerInfo::kFloat:    return "ReadFloat";
      case TVirtualStreamerInfo::kDouble32:
      case TVirtualStreamerInfo::kDouble:   return "ReadDouble";
      case TVirtualStreamerInfo::kUChar: {
         Bool_t isbool = false;
         if (realname!=0)
            isbool = (TString(realname).Index("bool",0, TString::kIgnoreCase)>=0);
         if (isbool) return "ReadBool";
         return "ReadUChar";
      }
      case TVirtualStreamerInfo::kBool:     return "ReadBool";
      case TVirtualStreamerInfo::kUShort:   return "ReadUShort";
      case TVirtualStreamerInfo::kUInt:     return "ReadUInt";
      case TVirtualStreamerInfo::kULong:    return "ReadULong";
      case TVirtualStreamerInfo::kULong64:  return "ReadULong64";
   }
   return "ReadValue";
}

//______________________________________________________________________________
const char* TXMLPlayer::ElementGetter(TClass* cl, const char* membername, int specials)
{
   // produce code to access member of given class.
   // Parameter specials has following meaning:
   //    0 - nothing special
   //    1 - cast to data type
   //    2 - produce pointer on given member
   //    3 - skip casting when produce pointer by buf.P() function

   TClass* membercl = cl ? cl->GetBaseDataMember(membername) : 0;
   TDataMember* member = membercl ? membercl->GetDataMember(membername) : 0;
   TMethodCall* mgetter = member ? member->GetterMethod(0) : 0;

   if ((mgetter!=0) && (mgetter->GetMethod()->Property() & kIsPublic)) {
      fGetterName = "obj->";
      fGetterName += mgetter->GetMethodName();
      fGetterName += "()";
   } else
   if ((member==0) || ((member->Property() & kIsPublic) != 0)) {
      fGetterName = "obj->";
      fGetterName += membername;
   } else {
      fGetterName = "";
      Bool_t deref = (member->GetArrayDim()==0) && (specials!=2);
      if (deref) fGetterName += "*(";
      if (specials!=3) {
         fGetterName += "(";
         if (member->Property() & kIsConstant) fGetterName += "const ";
         fGetterName += GetMemberTypeName(member);
         if (member->IsaPointer()) fGetterName+="*";
         fGetterName += "*) ";
      }
      fGetterName += "buf.P(obj,";
      fGetterName += member->GetOffset();
      fGetterName += ")";
      if (deref) fGetterName += ")";
      specials = 0;
   }

   if ((specials==1) && (member!=0)) {
      TString cast = "(";
      cast += GetMemberTypeName(member);
      if (member->IsaPointer() || (member->GetArrayDim()>0)) cast += "*";
      cast += ") ";
      cast += fGetterName;
      fGetterName = cast;
   }

   if ((specials==2) && (member!=0)) {
      TString buf = "&(";
      buf += fGetterName;
      buf += ")";
      fGetterName = buf;
   }

   return fGetterName.Data();
}

//______________________________________________________________________________
const char* TXMLPlayer::ElementSetter(TClass* cl, const char* membername, char* endch)
{
   // Produce code to set value to given data member.
   // endch should be output after value is specified.

   strcpy(endch,"");

   TClass* membercl = cl ? cl->GetBaseDataMember(membername) : 0;
   TDataMember* member = membercl ? membercl->GetDataMember(membername) : 0;
   TMethodCall* msetter = member ? member->SetterMethod(cl) : 0;

   if ((msetter!=0) && (msetter->GetMethod()->Property() & kIsPublic)) {
      fSetterName = "obj->";
      fSetterName += msetter->GetMethodName();
      fSetterName += "(";
      strcpy(endch,")");
   } else
   if ((member==0) || (member->Property() & kIsPublic) != 0) {
      fSetterName = "obj->";
      fSetterName += membername;
      fSetterName += " = ";
   } else {
      fSetterName = "";
      if (member->GetArrayDim()==0) fSetterName += "*";
      fSetterName += "((";
      if (member->Property() & kIsConstant) fSetterName += "const ";
      fSetterName += GetMemberTypeName(member);
      if (member->IsaPointer()) fSetterName += "*";
      fSetterName += "*) buf.P(obj,";
      fSetterName += member->GetOffset();
      fSetterName += ")) = ";
   }
   return fSetterName.Data();
}

//______________________________________________________________________________
void TXMLPlayer::ProduceStreamerSource(std::ostream& fs, TClass* cl, TList* cllist)
{
   // Produce source code of streamer function for specified class

   if (cl==0) return;
   TVirtualStreamerInfo* info = cl->GetStreamerInfo();
   TObjArray* elements = info->GetElements();
   if (elements==0) return;

   fs << "//__________________________________________________________________________" << std::endl;
   fs << "void* " << GetStreamerName(cl) << "("
         << names_xmlfileclass << " &buf, void* ptr, bool checktypes)" << std::endl;
   fs << "{" << std::endl;
   fs << tab1 << cl->GetName() << " *obj = (" << cl->GetName() << "*) ptr;" << std::endl;

   fs << tab1 << "if (buf.IsReading()) { " << std::endl;

   TIter iter(cllist);
   TClass* c1 = 0;
   Bool_t firstchild = true;

   while ((c1 = (TClass*) iter()) != 0) {
      if (c1==cl) continue;
      if (c1->GetListOfBases()->FindObject(cl->GetName())==0) continue;
      if (firstchild) {
         fs << tab2 << "if (checktypes) {" << std::endl;
         fs << tab3 << "void* ";
         firstchild = false;
      } else
         fs << tab3;
      fs << "res = " << GetStreamerName(c1)
         << "(buf, dynamic_cast<" << c1->GetName() << "*>(obj));" << std::endl;
      fs << tab3 << "if (res) return dynamic_cast<" << cl->GetName()
         << "*>(("<< c1->GetName() << " *) res);" << std::endl;
   }
   if (!firstchild) fs << tab2 << "}" << std::endl;

   fs << tab2 << "if (!buf.CheckClassNode(\"" << cl->GetName() << "\", "
              << info->GetClassVersion() << ")) return 0;" << std::endl;

   fs << tab2 << "if (obj==0) obj = new " << cl->GetName() << ";" << std::endl;

   int n;
   for (n=0;n<=elements->GetLast();n++) {

      TStreamerElement* el = dynamic_cast<TStreamerElement*> (elements->At(n));
      if (el==0) continue;

      Int_t typ = el->GetType();

      switch (typ) {
         // basic types
         case TVirtualStreamerInfo::kBool:
         case TVirtualStreamerInfo::kChar:
         case TVirtualStreamerInfo::kShort:
         case TVirtualStreamerInfo::kInt:
         case TVirtualStreamerInfo::kLong:
         case TVirtualStreamerInfo::kLong64:
         case TVirtualStreamerInfo::kFloat:
         case TVirtualStreamerInfo::kFloat16:
         case TVirtualStreamerInfo::kDouble:
         case TVirtualStreamerInfo::kUChar:
         case TVirtualStreamerInfo::kUShort:
         case TVirtualStreamerInfo::kUInt:
         case TVirtualStreamerInfo::kULong:
         case TVirtualStreamerInfo::kULong64:
         case TVirtualStreamerInfo::kDouble32:
         case TVirtualStreamerInfo::kCounter: {
            char endch[5];
            fs << tab2 << ElementSetter(cl, el->GetName(), endch);
            fs << "buf." << GetBasicTypeReaderMethodName(el->GetType(), 0)
               << "(\"" << el->GetName() << "\")" << endch << ";" << std::endl;
            continue;
         }

         // array of basic types like bool[10]
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kBool:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kChar:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kShort:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kInt:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kLong:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kLong64:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kFloat:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kFloat16:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kDouble:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kUChar:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kUShort:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kUInt:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kULong:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kULong64:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kDouble32: {
            fs << tab2 << "buf.ReadArray("
                       << ElementGetter(cl, el->GetName(), (el->GetArrayDim()>1) ? 1 : 0);
            fs         << ", " << el->GetArrayLength()
                       << ", \"" << el->GetName() << "\");" << std::endl;
            continue;
         }

         // array of basic types like bool[n]
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kBool:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kChar:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kShort:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kInt:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kLong:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kLong64:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kFloat:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kFloat16:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kDouble:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kUChar:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kUShort:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kUInt:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kULong:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kULong64:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kDouble32: {
            TStreamerBasicPointer* elp = dynamic_cast<TStreamerBasicPointer*> (el);
            if (elp==0) {
               std::cout << "fatal error with TStreamerBasicPointer" << std::endl;
               continue;
            }
            char endch[5];

            fs << tab2 << ElementSetter(cl, el->GetName(), endch);
            fs         << "buf.ReadArray(" << ElementGetter(cl, el->GetName());
            fs         << ", " << ElementGetter(cl, elp->GetCountName());
            fs         << ", \"" << el->GetName() << "\", true)" << endch << ";" << std::endl;
            continue;
         }

         case TVirtualStreamerInfo::kCharStar: {
            char endch[5];
            fs << tab2 << ElementSetter(cl, el->GetName(), endch);
            fs         << "buf.ReadCharStar(" << ElementGetter(cl, el->GetName());
            fs         << ", \"" << el->GetName() << "\")" << endch << ";" << std::endl;
            continue;
         }

         case TVirtualStreamerInfo::kBase: {
            fs << tab2 << GetStreamerName(el->GetClassPointer())
               << "(buf, dynamic_cast<" << el->GetClassPointer()->GetName()
               << "*>(obj), false);" << std::endl;
            continue;
         }

         // Class*   Class not derived from TObject and with comment field //->
         case TVirtualStreamerInfo::kAnyp:
         case TVirtualStreamerInfo::kAnyp    + TVirtualStreamerInfo::kOffsetL: {
            if (el->GetArrayLength()>0) {
               fs << tab2 << "buf.ReadObjectArr(" << ElementGetter(cl, el->GetName());
               fs         << ", " << el->GetArrayLength() << ", -1"
                          << ", \"" << el->GetName() << "\", "
                          << GetStreamerName(el->GetClassPointer()) << ");" << std::endl;
            } else {
               fs << tab2 << "buf.ReadObject(" << ElementGetter(cl, el->GetName());
               fs         << ", \"" << el->GetName() << "\", "
                          << GetStreamerName(el->GetClassPointer()) << ");" << std::endl;
            }
            continue;
         }

         // Class*   Class not derived from TObject and no comment
         case TVirtualStreamerInfo::kAnyP:
         case TVirtualStreamerInfo::kAnyP + TVirtualStreamerInfo::kOffsetL: {
            if (el->GetArrayLength()>0) {
               fs << tab2 << "for (int n=0;n<" << el->GetArrayLength() << ";n++) "
                          << "delete (" << ElementGetter(cl, el->GetName()) << ")[n];" << std::endl;
               fs << tab2 << "buf.ReadObjectPtrArr((void**) " << ElementGetter(cl, el->GetName(), 3);
               fs         << ", " << el->GetArrayLength()
                          << ", \"" << el->GetName() << "\", "
                          << GetStreamerName(el->GetClassPointer()) << ");" << std::endl;
            } else {
               char endch[5];

               fs << tab2 << "delete " << ElementGetter(cl, el->GetName()) << ";" << std::endl;
               fs << tab2 << ElementSetter(cl, el->GetName(), endch);
               fs         << "(" << el->GetClassPointer()->GetName()
                          << "*) buf.ReadObjectPtr(\"" << el->GetName() << "\", "
                          << GetStreamerName(el->GetClassPointer())
                          << ")" <<endch << ";" << std::endl;
            }
            continue;
         }

         // Class  NOT derived from TObject
         case TVirtualStreamerInfo::kAny: {
            fs << tab2 << "buf.ReadObject(" << ElementGetter(cl, el->GetName(), 2);
            fs         << ", \"" << el->GetName() << "\", "
                       << GetStreamerName(el->GetClassPointer()) << ");" << std::endl;
            continue;
         }

         // Class  NOT derived from TObject, array
         case TVirtualStreamerInfo::kAny + TVirtualStreamerInfo::kOffsetL: {
            fs << tab2 << "buf.ReadObjectArr(" << ElementGetter(cl, el->GetName());
            fs         << ", " << el->GetArrayLength()
                       << ", sizeof(" << el->GetClassPointer()->GetName()
                       << "), \"" << el->GetName() << "\", "
                       << GetStreamerName(el->GetClassPointer()) << ");" << std::endl;
            continue;
         }

         // container with no virtual table (stl) and no comment
         case TVirtualStreamerInfo::kSTLp:
         case TVirtualStreamerInfo::kSTL:
         case TVirtualStreamerInfo::kSTLp + TVirtualStreamerInfo::kOffsetL:
         case TVirtualStreamerInfo::kSTL + TVirtualStreamerInfo::kOffsetL: {
            TStreamerSTL* elstl = dynamic_cast<TStreamerSTL*> (el);
            if (elstl==0) break; // to make skip

            if (ProduceSTLstreamer(fs, cl, elstl, false)) continue;

            fs << tab2 << "// STL type = " << elstl->GetSTLtype() << std::endl;
            break;
         }
      }
      fs << tab2 << "buf.SkipMember(\"" << el->GetName()
         << "\");   // sinfo type " << el->GetType()
         << " of class " << el->GetClassPointer()->GetName()
         << " not supported" << std::endl;
   }

   fs << tab2 << "buf.EndClassNode();" << std::endl;

   fs << tab1 << "} else {" << std::endl;

   // generation of writing part of class streamer

   fs << tab2 << "if (obj==0) return 0;" << std::endl;

   firstchild = true;
   iter.Reset();
   while ((c1 = (TClass*) iter()) != 0) {
      if (c1==cl) continue;
      if (c1->GetListOfBases()->FindObject(cl->GetName())==0) continue;
      if (firstchild) {
         firstchild = false;
         fs << tab2 << "if (checktypes) {" << std::endl;
      }
      fs << tab3 << "if (dynamic_cast<" << c1->GetName() << "*>(obj))" << std::endl;
      fs << tab4 << "return " << GetStreamerName(c1) << "(buf, dynamic_cast<" << c1->GetName() << "*>(obj));" << std::endl;
   }
   if (!firstchild) fs << tab2 << "}" << std::endl;

   fs << tab2 << "buf.StartClassNode(\"" << cl->GetName() << "\", "
              << info->GetClassVersion() << ");" << std::endl;

   for (n=0;n<=elements->GetLast();n++) {

      TStreamerElement* el = dynamic_cast<TStreamerElement*> (elements->At(n));
      if (el==0) continue;

      Int_t typ = el->GetType();

      switch (typ) {
         // write basic types
         case TVirtualStreamerInfo::kBool:
         case TVirtualStreamerInfo::kChar:
         case TVirtualStreamerInfo::kShort:
         case TVirtualStreamerInfo::kInt:
         case TVirtualStreamerInfo::kLong:
         case TVirtualStreamerInfo::kLong64:
         case TVirtualStreamerInfo::kFloat:
         case TVirtualStreamerInfo::kFloat16:
         case TVirtualStreamerInfo::kDouble:
         case TVirtualStreamerInfo::kUChar:
         case TVirtualStreamerInfo::kUShort:
         case TVirtualStreamerInfo::kUInt:
         case TVirtualStreamerInfo::kULong:
         case TVirtualStreamerInfo::kULong64:
         case TVirtualStreamerInfo::kDouble32:
         case TVirtualStreamerInfo::kCounter: {
            fs << tab2 << "buf.WriteValue(";
            if (typ==TVirtualStreamerInfo::kUChar)
               fs <<"(unsigned char) " << ElementGetter(cl, el->GetName());
            else
               fs << ElementGetter(cl, el->GetName());
            fs << ", \"" << el->GetName() << "\");" << std::endl;
            continue;
         }

         // array of basic types
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kBool:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kChar:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kShort:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kInt:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kLong:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kLong64:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kFloat:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kFloat16:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kDouble:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kUChar:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kUShort:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kUInt:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kULong:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kULong64:
         case TVirtualStreamerInfo::kOffsetL + TVirtualStreamerInfo::kDouble32: {
            fs << tab2 << "buf.WriteArray("
                       << ElementGetter(cl, el->GetName(), (el->GetArrayDim()>1) ? 1 : 0);
            fs         << ", " << el->GetArrayLength()
                       << ", \"" << el->GetName() << "\");" << std::endl;
            continue;
         }

         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kBool:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kChar:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kShort:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kInt:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kLong:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kLong64:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kFloat:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kFloat16:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kDouble:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kUChar:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kUShort:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kUInt:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kULong:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kULong64:
         case TVirtualStreamerInfo::kOffsetP + TVirtualStreamerInfo::kDouble32: {
            TStreamerBasicPointer* elp = dynamic_cast<TStreamerBasicPointer*> (el);
            if (elp==0) {
               std::cout << "fatal error with TStreamerBasicPointer" << std::endl;
               continue;
            }
            fs << tab2 << "buf.WriteArray(" << ElementGetter(cl, el->GetName());
            fs         << ", " << ElementGetter(cl, elp->GetCountName())
                       << ", \"" << el->GetName() << "\", true);" << std::endl;
            continue;
         }

         case TVirtualStreamerInfo::kCharStar: {
            fs << tab2 << "buf.WriteCharStar(" << ElementGetter(cl, el->GetName())
                       << ", \"" << el->GetName() << "\");" << std::endl;
            continue;
         }

         case TVirtualStreamerInfo::kBase: {
            fs << tab2 << GetStreamerName(el->GetClassPointer())
               << "(buf, dynamic_cast<" << el->GetClassPointer()->GetName()
               << "*>(obj), false);" << std::endl;
            continue;
         }

         // Class*   Class not derived from TObject and with comment field //->
         case TVirtualStreamerInfo::kAnyp:
         case TVirtualStreamerInfo::kAnyp    + TVirtualStreamerInfo::kOffsetL: {
            if (el->GetArrayLength()>0) {
               fs << tab2 << "buf.WriteObjectArr(" << ElementGetter(cl, el->GetName());
               fs         << ", " << el->GetArrayLength() << ", -1"
                          << ", \"" << el->GetName() << "\", "
                          << GetStreamerName(el->GetClassPointer()) << ");" << std::endl;
            } else {
               fs << tab2 << "buf.WriteObject(" << ElementGetter(cl, el->GetName());
               fs         << ", \"" << el->GetName() << "\", "
                          << GetStreamerName(el->GetClassPointer()) << ");" << std::endl;
            }
            continue;
         }

         // Class*   Class not derived from TObject and no comment
         case TVirtualStreamerInfo::kAnyP:
         case TVirtualStreamerInfo::kAnyP + TVirtualStreamerInfo::kOffsetL: {
            if (el->GetArrayLength()>0) {
               fs << tab2 << "buf.WriteObjectPtrArr((void**) " << ElementGetter(cl, el->GetName(), 3);
               fs         << ", " << el->GetArrayLength()
                          << ", \"" << el->GetName() << "\", "
                          << GetStreamerName(el->GetClassPointer()) << ");" << std::endl;
            } else {
               fs << tab2 << "buf.WriteObjectPtr(" << ElementGetter(cl, el->GetName());
               fs         << ", \"" << el->GetName() << "\", "
                          << GetStreamerName(el->GetClassPointer()) << ");" << std::endl;
            }
            continue;
         }

         case TVirtualStreamerInfo::kAny: {    // Class  NOT derived from TObject
            fs << tab2 << "buf.WriteObject(" << ElementGetter(cl, el->GetName(), 2);
            fs         << ", \"" << el->GetName() << "\", "
                       << GetStreamerName(el->GetClassPointer()) << ");" << std::endl;
            continue;
         }

         case TVirtualStreamerInfo::kAny    + TVirtualStreamerInfo::kOffsetL: {
            fs << tab2 << "buf.WriteObjectArr(" << ElementGetter(cl, el->GetName());
            fs         << ", " << el->GetArrayLength()
                       << ", sizeof(" << el->GetClassPointer()->GetName()
                       << "), \"" << el->GetName() << "\", "
                       << GetStreamerName(el->GetClassPointer()) << ");" << std::endl;
            continue;
         }

         // container with no virtual table (stl) and no comment
         case TVirtualStreamerInfo::kSTLp + TVirtualStreamerInfo::kOffsetL:
         case TVirtualStreamerInfo::kSTL + TVirtualStreamerInfo::kOffsetL:
         case TVirtualStreamerInfo::kSTLp:
         case TVirtualStreamerInfo::kSTL: {
            TStreamerSTL* elstl = dynamic_cast<TStreamerSTL*> (el);
            if (elstl==0) break; // to make skip

            if (ProduceSTLstreamer(fs, cl, elstl, true)) continue;
            fs << tab2 << "// STL type = " << elstl->GetSTLtype() << std::endl;
            break;
         }

      }
      fs << tab2 << "buf.MakeEmptyMember(\"" << el->GetName()
                 << "\");   // sinfo type " << el->GetType()
                 << " of class " << el->GetClassPointer()->GetName()
                 << " not supported" << std::endl;
   }

   fs << tab2 << "buf.EndClassNode();" << std::endl;

   fs << tab1 << "}" << std::endl;
   fs << tab1 << "return obj;" << std::endl;
   fs << "}" << std::endl << std::endl;
}

//______________________________________________________________________________
void TXMLPlayer::ReadSTLarg(std::ostream& fs,
                            TString& argname,
                            int argtyp,
                            Bool_t isargptr,
                            TClass* argcl,
                            TString& tname,
                            TString& ifcond)
{
   // Produce code to read argument of stl container from xml file

   switch(argtyp) {
      case TVirtualStreamerInfo::kBool:
      case TVirtualStreamerInfo::kChar:
      case TVirtualStreamerInfo::kShort:
      case TVirtualStreamerInfo::kInt:
      case TVirtualStreamerInfo::kLong:
      case TVirtualStreamerInfo::kLong64:
      case TVirtualStreamerInfo::kFloat:
      case TVirtualStreamerInfo::kFloat16:
      case TVirtualStreamerInfo::kDouble:
      case TVirtualStreamerInfo::kUChar:
      case TVirtualStreamerInfo::kUShort:
      case TVirtualStreamerInfo::kUInt:
      case TVirtualStreamerInfo::kULong:
      case TVirtualStreamerInfo::kULong64:
      case TVirtualStreamerInfo::kDouble32:
      case TVirtualStreamerInfo::kCounter: {
         fs << tname << " " << argname << " = buf."
            << GetBasicTypeReaderMethodName(argtyp, tname.Data()) << "(0);" << std::endl;
         break;
      }

      case TVirtualStreamerInfo::kObject: {
         fs << tname << (isargptr ? " ": " *") << argname << " = "
            << "(" << argcl->GetName() << "*)"
            << "buf.ReadObjectPtr(0, "
            << GetStreamerName(argcl) << ");" << std::endl;
         if (!isargptr) {
            if (ifcond.Length()>0) ifcond+=" && ";
            ifcond += argname;
            TString buf = "*";
            buf += argname;
            argname = buf;
         }
         break;
      }

      case TVirtualStreamerInfo::kSTLstring: {
         fs << "string *" << argname << " = "
            << "buf.ReadSTLstring();" << std::endl;
         if (!isargptr) {
            if (ifcond.Length()>0) ifcond+=" && ";
            ifcond += argname;
            TString buf = "*";
            buf += argname;
            argname = buf;
         }
         break;
      }

      default:
         fs << "/* argument " << argname << " not supported */";
   }
}

//______________________________________________________________________________
void TXMLPlayer::WriteSTLarg(std::ostream& fs, const char* accname, int argtyp, Bool_t isargptr, TClass* argcl)
{
   // Produce code to write argument of stl container to xml file

   switch(argtyp) {
      case TVirtualStreamerInfo::kBool:
      case TVirtualStreamerInfo::kChar:
      case TVirtualStreamerInfo::kShort:
      case TVirtualStreamerInfo::kInt:
      case TVirtualStreamerInfo::kLong:
      case TVirtualStreamerInfo::kLong64:
      case TVirtualStreamerInfo::kFloat:
      case TVirtualStreamerInfo::kFloat16:
      case TVirtualStreamerInfo::kDouble:
      case TVirtualStreamerInfo::kUChar:
      case TVirtualStreamerInfo::kUShort:
      case TVirtualStreamerInfo::kUInt:
      case TVirtualStreamerInfo::kULong:
      case TVirtualStreamerInfo::kULong64:
      case TVirtualStreamerInfo::kDouble32:
      case TVirtualStreamerInfo::kCounter: {
         fs << "buf.WriteValue(" << accname << ", 0);" << std::endl;
         break;
      }

      case TVirtualStreamerInfo::kObject: {
         fs << "buf.WriteObjectPtr(";
         if (isargptr)
            fs << accname;
         else
            fs << "&(" << accname << ")";
         fs << ", 0, " <<  GetStreamerName(argcl) << ");" << std::endl;
         break;
      }

      case TVirtualStreamerInfo::kSTLstring: {
         fs << "buf.WriteSTLstring(";
         if (isargptr)
            fs << accname;
         else
            fs << "&(" << accname << ")";
         fs << ");" << std::endl;
         break;
      }

      default:
         fs << "/* argument not supported */" << std::endl;
   }
}

//______________________________________________________________________________
Bool_t TXMLPlayer::ProduceSTLstreamer(std::ostream& fs, TClass* cl, TStreamerSTL* el, Bool_t isWriting)
{
   // Produce code of xml streamer for data member of stl type

   if ((cl==0) || (el==0)) return false;

   TClass* contcl = el->GetClassPointer();

   Bool_t isstr = (el->GetSTLtype() == ROOT::kSTLstring);
   Bool_t isptr = el->IsaPointer();
   Bool_t isarr = (el->GetArrayLength()>0);
   Bool_t isparent = (strcmp(el->GetName(), contcl->GetName())==0);

   int stltyp = -1;
   int narg = 0;
   int argtype[2];
   Bool_t isargptr[2];
   TClass* argcl[2];
   TString argtname[2];

   if (!isstr && contcl->GetCollectionType() != ROOT::kNotSTL) {
         int nestedLoc = 0;
         std::vector<std::string> splitName;
         TClassEdit::GetSplit(contcl->GetName(), splitName, nestedLoc);

         stltyp = contcl->GetCollectionType();
         switch (stltyp) {
            case ROOT::kSTLvector            : narg = 1; break;
            case ROOT::kSTLlist              : narg = 1; break;
            case ROOT::kSTLforwardlist       : narg = 1; break;
            case ROOT::kSTLdeque             : narg = 1; break;
            case ROOT::kSTLmap               : narg = 2; break;
            case ROOT::kSTLmultimap          : narg = 2; break;
            case ROOT::kSTLset               : narg = 1; break;
            case ROOT::kSTLmultiset          : narg = 1; break;
            case ROOT::kSTLunorderedset      : narg = 1; break;
            case ROOT::kSTLunorderedmultiset : narg = 1; break;
            case ROOT::kSTLunorderedmap      : narg = 2; break;
            case ROOT::kSTLunorderedmultimap : narg = 2; break;

            default: return false;
         }

         for(int n=0;n<narg;n++) {
            argtype[n] = -1;
            isargptr[n] = false;
            argcl[n] = 0;
            argtname[n] = "";

            TString buf = splitName[n+1];

            argtname[n] = buf;

            // nested STL containers not yet supported
            if (TClassEdit::IsSTLCont(buf.Data())) return false;

            int pstar = buf.Index("*");

            if (pstar>0) {
               isargptr[n] = true;
               pstar--;
               while ((pstar>0) && (buf[pstar]==' ')) pstar--;
               buf.Remove(pstar+1);
            } else
               isargptr[n] = false;

            if (buf.Index("const ")==0) {
               buf.Remove(0,6);
               while ((buf.Length()>0) && (buf[0]==' ')) buf.Remove(0,1);
            }

            TDataType *dt = (TDataType*)gROOT->GetListOfTypes()->FindObject(buf);
            if (dt) argtype[n] = dt->GetType(); else
            if (buf=="string")
               argtype[n] = TVirtualStreamerInfo::kSTLstring;
            else {
               argcl[n] = TClass::GetClass(buf);
               if (argcl[n]!=0) argtype[n]=TVirtualStreamerInfo::kObject;
            }
            if (argtype[n]<0) stltyp = -1;
         } // for narg

      if (stltyp<0) return false;
   }

   Bool_t akaarrayaccess = (narg==1) && (argtype[0]<20);

   char tabs[30], tabs2[30];

   if (isWriting) {

      fs << tab2 << "if (buf.StartSTLnode(\""
                 << fXmlSetup.XmlGetElementName(el) << "\")) {" << std::endl;

      fs << tab3 << contcl->GetName() << " ";

      TString accname;
      if (isptr) {
         if (isarr) { fs << "**cont"; accname = "(*cont)->"; }
            else { fs << "*cont"; accname = "cont->"; }
      } else
      if (isarr) { fs << "*cont"; accname = "cont->"; }
         else { fs << "&cont"; accname = "cont."; }

      fs << " = ";

      if (isparent)
         fs << "*dynamic_cast<" << contcl->GetName() << "*>(obj);" << std::endl;
      else
         fs << ElementGetter(cl, el->GetName()) << ";" << std::endl;

      if (isarr && el->GetArrayLength()) {
         strlcpy(tabs, tab4, sizeof(tabs));
         fs << tab3 << "for(int n=0;n<" << el->GetArrayLength() << ";n++) {" << std::endl;
      } else
         strlcpy(tabs, tab3, sizeof(tabs));

      strlcpy(tabs2, tabs, sizeof(tabs2));

      if (isptr) {
         strlcat(tabs2, tab1, sizeof(tabs2));
         fs << tabs << "if (" << (isarr ? "*cont" : "cont") << "==0) {" << std::endl;
         fs << tabs2 << "buf.WriteSTLsize(0" << (isstr ? ",true);" : ");") << std::endl;
         fs << tabs << "} else {" << std::endl;
      }

      fs << tabs2 << "buf.WriteSTLsize(" << accname
                  << (isstr ? "length(), true);" : "size());") << std::endl;

      if (isstr) {
         fs << tabs2 << "buf.WriteSTLstringData(" << accname << "c_str());" << std::endl;
      } else {
         if (akaarrayaccess) {
            fs << tabs2 << argtname[0] << "* arr = new " << argtname[0]
                                       << "[" << accname << "size()];" << std::endl;
            fs << tabs2 << "int k = 0;" << std::endl;
         }

         fs << tabs2 << contcl->GetName() << "::const_iterator iter;" << std::endl;
         fs << tabs2 << "for (iter = " << accname << "begin(); iter != "
                    << accname << "end(); iter++)";
         if (akaarrayaccess) {
            fs << std::endl << tabs2 << tab1 << "arr[k++] = *iter;" << std::endl;
            fs << tabs2 << "buf.WriteArray(arr, " << accname << "size(), 0, false);" << std::endl;
            fs << tabs2 << "delete[] arr;" << std::endl;
         } else
         if (narg==1) {
            fs << std::endl << tabs2 << tab1;
            WriteSTLarg(fs, "*iter", argtype[0], isargptr[0], argcl[0]);
         } else
         if (narg==2) {
            fs << " {" << std::endl;
            fs << tabs2 << tab1;
            WriteSTLarg(fs, "iter->first", argtype[0], isargptr[0], argcl[0]);
            fs << tabs2 << tab1;
            WriteSTLarg(fs, "iter->second", argtype[1], isargptr[1], argcl[1]);
            fs << tabs2 << "}" << std::endl;
         }
      } // if (isstr)

      if (isptr) fs << tabs << "}" << std::endl;

      if (isarr && el->GetArrayLength()) {
         if (isptr)
            fs << tabs << "cont++;" << std::endl;
         else
            fs << tabs << "(void*) cont = (char*) cont + sizeof(" << contcl->GetName() << ");" << std::endl;
         fs << tab3 << "}" << std::endl;
      }

      fs << tab3 << "buf.EndSTLnode();" << std::endl;
      fs << tab2 << "}" << std::endl;

   } else {


      fs << tab2 << "if (buf.VerifySTLnode(\""
                 << fXmlSetup.XmlGetElementName(el) << "\")) {" << std::endl;

      fs << tab3 << contcl->GetName() << " ";
      TString accname, accptr;
      if (isptr) {
         if (isarr) { fs << "**cont"; accname = "(*cont)->"; accptr = "*cont"; }
            else { fs << "*cont"; accname = "cont->"; accptr = "cont"; }
      } else
      if (isarr) { fs << "*cont"; accname = "cont->"; }
         else { fs << "&cont"; accname = "cont."; }

      fs << " = ";

      if (isparent)
         fs << "*dynamic_cast<" << contcl->GetName() << "*>(obj);" << std::endl;
      else
         fs << ElementGetter(cl, el->GetName()) << ";" << std::endl;

      if (isarr && el->GetArrayLength()) {
         strlcpy(tabs, tab4, sizeof(tabs));
         fs << tab3 << "for(int n=0;n<" << el->GetArrayLength() << ";n++) {" << std::endl;
      } else
         strlcpy(tabs, tab3, sizeof(tabs));

      fs << tabs << "int size = buf.ReadSTLsize(" << (isstr ? "true);" : ");") << std::endl;

      if (isptr) {
         fs << tabs << "delete " << accptr << ";" << std::endl;
         fs << tabs << "if (size==0) " << accptr << " = 0;" << std::endl;
         fs << tabs << "        else " << accptr << " = new " << contcl->GetName() << ";" << std::endl;
         if (!isarr) {
            char endch[5];
            fs << tabs << ElementSetter(cl, el->GetName(), endch);
            fs         << "cont" << endch << ";" << std::endl;
         }
      } else {
         fs << tabs << accname << (isstr ? "erase();" : "clear();") << std::endl;
      }

      if (isstr) {
         fs << tabs << "if (size>0) " << accname << "assign(buf.ReadSTLstringData(size));" << std::endl;
      } else {
         if (akaarrayaccess) {
            fs << tabs << argtname[0] << "* arr = new " << argtname[0] << "[size];" << std::endl;
            fs << tabs << "buf.ReadArray(arr, size, 0, false);" << std::endl;
         }

         fs << tabs << "for(int k=0;k<size;k++)";

         if (akaarrayaccess) {
            fs << std::endl << tabs << tab1 << accname;
            if ((stltyp==ROOT::kSTLset) || (stltyp==ROOT::kSTLmultiset))
               fs << "insert"; else fs << "push_back";
            fs << "(arr[k]);" << std::endl;
            fs << tabs << "delete[] arr;" << std::endl;
         } else
         if (narg==1) {
            TString arg1("arg"), ifcond;
            fs << " {" << std::endl << tabs << tab1;
            ReadSTLarg(fs, arg1, argtype[0], isargptr[0], argcl[0], argtname[0], ifcond);
            fs << tabs << tab1;
            if (ifcond.Length()>0) fs << "if (" << ifcond << ") ";
            fs << accname;
            if ((stltyp==ROOT::kSTLset) || (stltyp==ROOT::kSTLmultiset))
               fs << "insert";
            else
               fs << "push_back";
            fs << "(" << arg1 << ");" << std::endl;
            fs << tabs << "}" << std::endl;
         } else
         if (narg==2) {
            TString arg1("arg1"), arg2("arg2"), ifcond;
            fs << " {" << std::endl << tabs << tab1;
            ReadSTLarg(fs, arg1, argtype[0], isargptr[0], argcl[0], argtname[0], ifcond);
            fs << tabs << tab1;
            ReadSTLarg(fs, arg2, argtype[1], isargptr[1], argcl[1], argtname[1], ifcond);
            fs << tabs << tab1;
            if (ifcond.Length()>0) fs << "if (" << ifcond << ") ";
            fs << accname << "insert(make_pair("
               << arg1 << ", " << arg2 << "));" << std::endl;
            fs << tabs << "}" << std::endl;
         }
      }

      if (isarr && el->GetArrayLength()) {
         if (isptr) fs << tabs << "cont++;" << std::endl;
         else fs << tabs << "(void*) cont = (char*) cont + sizeof(" << contcl->GetName() << ");" << std::endl;
         fs << tab3 << "}" << std::endl;
      }

      fs << tab3 << "buf.EndSTLnode();" << std::endl;
      fs << tab2 << "}" << std::endl;
   }
   return true;
}
 TXMLPlayer.cxx:1
 TXMLPlayer.cxx:2
 TXMLPlayer.cxx:3
 TXMLPlayer.cxx:4
 TXMLPlayer.cxx:5
 TXMLPlayer.cxx:6
 TXMLPlayer.cxx:7
 TXMLPlayer.cxx:8
 TXMLPlayer.cxx:9
 TXMLPlayer.cxx:10
 TXMLPlayer.cxx:11
 TXMLPlayer.cxx:12
 TXMLPlayer.cxx:13
 TXMLPlayer.cxx:14
 TXMLPlayer.cxx:15
 TXMLPlayer.cxx:16
 TXMLPlayer.cxx:17
 TXMLPlayer.cxx:18
 TXMLPlayer.cxx:19
 TXMLPlayer.cxx:20
 TXMLPlayer.cxx:21
 TXMLPlayer.cxx:22
 TXMLPlayer.cxx:23
 TXMLPlayer.cxx:24
 TXMLPlayer.cxx:25
 TXMLPlayer.cxx:26
 TXMLPlayer.cxx:27
 TXMLPlayer.cxx:28
 TXMLPlayer.cxx:29
 TXMLPlayer.cxx:30
 TXMLPlayer.cxx:31
 TXMLPlayer.cxx:32
 TXMLPlayer.cxx:33
 TXMLPlayer.cxx:34
 TXMLPlayer.cxx:35
 TXMLPlayer.cxx:36
 TXMLPlayer.cxx:37
 TXMLPlayer.cxx:38
 TXMLPlayer.cxx:39
 TXMLPlayer.cxx:40
 TXMLPlayer.cxx:41
 TXMLPlayer.cxx:42
 TXMLPlayer.cxx:43
 TXMLPlayer.cxx:44
 TXMLPlayer.cxx:45
 TXMLPlayer.cxx:46
 TXMLPlayer.cxx:47
 TXMLPlayer.cxx:48
 TXMLPlayer.cxx:49
 TXMLPlayer.cxx:50
 TXMLPlayer.cxx:51
 TXMLPlayer.cxx:52
 TXMLPlayer.cxx:53
 TXMLPlayer.cxx:54
 TXMLPlayer.cxx:55
 TXMLPlayer.cxx:56
 TXMLPlayer.cxx:57
 TXMLPlayer.cxx:58
 TXMLPlayer.cxx:59
 TXMLPlayer.cxx:60
 TXMLPlayer.cxx:61
 TXMLPlayer.cxx:62
 TXMLPlayer.cxx:63
 TXMLPlayer.cxx:64
 TXMLPlayer.cxx:65
 TXMLPlayer.cxx:66
 TXMLPlayer.cxx:67
 TXMLPlayer.cxx:68
 TXMLPlayer.cxx:69
 TXMLPlayer.cxx:70
 TXMLPlayer.cxx:71
 TXMLPlayer.cxx:72
 TXMLPlayer.cxx:73
 TXMLPlayer.cxx:74
 TXMLPlayer.cxx:75
 TXMLPlayer.cxx:76
 TXMLPlayer.cxx:77
 TXMLPlayer.cxx:78
 TXMLPlayer.cxx:79
 TXMLPlayer.cxx:80
 TXMLPlayer.cxx:81
 TXMLPlayer.cxx:82
 TXMLPlayer.cxx:83
 TXMLPlayer.cxx:84
 TXMLPlayer.cxx:85
 TXMLPlayer.cxx:86
 TXMLPlayer.cxx:87
 TXMLPlayer.cxx:88
 TXMLPlayer.cxx:89
 TXMLPlayer.cxx:90
 TXMLPlayer.cxx:91
 TXMLPlayer.cxx:92
 TXMLPlayer.cxx:93
 TXMLPlayer.cxx:94
 TXMLPlayer.cxx:95
 TXMLPlayer.cxx:96
 TXMLPlayer.cxx:97
 TXMLPlayer.cxx:98
 TXMLPlayer.cxx:99
 TXMLPlayer.cxx:100
 TXMLPlayer.cxx:101
 TXMLPlayer.cxx:102
 TXMLPlayer.cxx:103
 TXMLPlayer.cxx:104
 TXMLPlayer.cxx:105
 TXMLPlayer.cxx:106
 TXMLPlayer.cxx:107
 TXMLPlayer.cxx:108
 TXMLPlayer.cxx:109
 TXMLPlayer.cxx:110
 TXMLPlayer.cxx:111
 TXMLPlayer.cxx:112
 TXMLPlayer.cxx:113
 TXMLPlayer.cxx:114
 TXMLPlayer.cxx:115
 TXMLPlayer.cxx:116
 TXMLPlayer.cxx:117
 TXMLPlayer.cxx:118
 TXMLPlayer.cxx:119
 TXMLPlayer.cxx:120
 TXMLPlayer.cxx:121
 TXMLPlayer.cxx:122
 TXMLPlayer.cxx:123
 TXMLPlayer.cxx:124
 TXMLPlayer.cxx:125
 TXMLPlayer.cxx:126
 TXMLPlayer.cxx:127
 TXMLPlayer.cxx:128
 TXMLPlayer.cxx:129
 TXMLPlayer.cxx:130
 TXMLPlayer.cxx:131
 TXMLPlayer.cxx:132
 TXMLPlayer.cxx:133
 TXMLPlayer.cxx:134
 TXMLPlayer.cxx:135
 TXMLPlayer.cxx:136
 TXMLPlayer.cxx:137
 TXMLPlayer.cxx:138
 TXMLPlayer.cxx:139
 TXMLPlayer.cxx:140
 TXMLPlayer.cxx:141
 TXMLPlayer.cxx:142
 TXMLPlayer.cxx:143
 TXMLPlayer.cxx:144
 TXMLPlayer.cxx:145
 TXMLPlayer.cxx:146
 TXMLPlayer.cxx:147
 TXMLPlayer.cxx:148
 TXMLPlayer.cxx:149
 TXMLPlayer.cxx:150
 TXMLPlayer.cxx:151
 TXMLPlayer.cxx:152
 TXMLPlayer.cxx:153
 TXMLPlayer.cxx:154
 TXMLPlayer.cxx:155
 TXMLPlayer.cxx:156
 TXMLPlayer.cxx:157
 TXMLPlayer.cxx:158
 TXMLPlayer.cxx:159
 TXMLPlayer.cxx:160
 TXMLPlayer.cxx:161
 TXMLPlayer.cxx:162
 TXMLPlayer.cxx:163
 TXMLPlayer.cxx:164
 TXMLPlayer.cxx:165
 TXMLPlayer.cxx:166
 TXMLPlayer.cxx:167
 TXMLPlayer.cxx:168
 TXMLPlayer.cxx:169
 TXMLPlayer.cxx:170
 TXMLPlayer.cxx:171
 TXMLPlayer.cxx:172
 TXMLPlayer.cxx:173
 TXMLPlayer.cxx:174
 TXMLPlayer.cxx:175
 TXMLPlayer.cxx:176
 TXMLPlayer.cxx:177
 TXMLPlayer.cxx:178
 TXMLPlayer.cxx:179
 TXMLPlayer.cxx:180
 TXMLPlayer.cxx:181
 TXMLPlayer.cxx:182
 TXMLPlayer.cxx:183
 TXMLPlayer.cxx:184
 TXMLPlayer.cxx:185
 TXMLPlayer.cxx:186
 TXMLPlayer.cxx:187
 TXMLPlayer.cxx:188
 TXMLPlayer.cxx:189
 TXMLPlayer.cxx:190
 TXMLPlayer.cxx:191
 TXMLPlayer.cxx:192
 TXMLPlayer.cxx:193
 TXMLPlayer.cxx:194
 TXMLPlayer.cxx:195
 TXMLPlayer.cxx:196
 TXMLPlayer.cxx:197
 TXMLPlayer.cxx:198
 TXMLPlayer.cxx:199
 TXMLPlayer.cxx:200
 TXMLPlayer.cxx:201
 TXMLPlayer.cxx:202
 TXMLPlayer.cxx:203
 TXMLPlayer.cxx:204
 TXMLPlayer.cxx:205
 TXMLPlayer.cxx:206
 TXMLPlayer.cxx:207
 TXMLPlayer.cxx:208
 TXMLPlayer.cxx:209
 TXMLPlayer.cxx:210
 TXMLPlayer.cxx:211
 TXMLPlayer.cxx:212
 TXMLPlayer.cxx:213
 TXMLPlayer.cxx:214
 TXMLPlayer.cxx:215
 TXMLPlayer.cxx:216
 TXMLPlayer.cxx:217
 TXMLPlayer.cxx:218
 TXMLPlayer.cxx:219
 TXMLPlayer.cxx:220
 TXMLPlayer.cxx:221
 TXMLPlayer.cxx:222
 TXMLPlayer.cxx:223
 TXMLPlayer.cxx:224
 TXMLPlayer.cxx:225
 TXMLPlayer.cxx:226
 TXMLPlayer.cxx:227
 TXMLPlayer.cxx:228
 TXMLPlayer.cxx:229
 TXMLPlayer.cxx:230
 TXMLPlayer.cxx:231
 TXMLPlayer.cxx:232
 TXMLPlayer.cxx:233
 TXMLPlayer.cxx:234
 TXMLPlayer.cxx:235
 TXMLPlayer.cxx:236
 TXMLPlayer.cxx:237
 TXMLPlayer.cxx:238
 TXMLPlayer.cxx:239
 TXMLPlayer.cxx:240
 TXMLPlayer.cxx:241
 TXMLPlayer.cxx:242
 TXMLPlayer.cxx:243
 TXMLPlayer.cxx:244
 TXMLPlayer.cxx:245
 TXMLPlayer.cxx:246
 TXMLPlayer.cxx:247
 TXMLPlayer.cxx:248
 TXMLPlayer.cxx:249
 TXMLPlayer.cxx:250
 TXMLPlayer.cxx:251
 TXMLPlayer.cxx:252
 TXMLPlayer.cxx:253
 TXMLPlayer.cxx:254
 TXMLPlayer.cxx:255
 TXMLPlayer.cxx:256
 TXMLPlayer.cxx:257
 TXMLPlayer.cxx:258
 TXMLPlayer.cxx:259
 TXMLPlayer.cxx:260
 TXMLPlayer.cxx:261
 TXMLPlayer.cxx:262
 TXMLPlayer.cxx:263
 TXMLPlayer.cxx:264
 TXMLPlayer.cxx:265
 TXMLPlayer.cxx:266
 TXMLPlayer.cxx:267
 TXMLPlayer.cxx:268
 TXMLPlayer.cxx:269
 TXMLPlayer.cxx:270
 TXMLPlayer.cxx:271
 TXMLPlayer.cxx:272
 TXMLPlayer.cxx:273
 TXMLPlayer.cxx:274
 TXMLPlayer.cxx:275
 TXMLPlayer.cxx:276
 TXMLPlayer.cxx:277
 TXMLPlayer.cxx:278
 TXMLPlayer.cxx:279
 TXMLPlayer.cxx:280
 TXMLPlayer.cxx:281
 TXMLPlayer.cxx:282
 TXMLPlayer.cxx:283
 TXMLPlayer.cxx:284
 TXMLPlayer.cxx:285
 TXMLPlayer.cxx:286
 TXMLPlayer.cxx:287
 TXMLPlayer.cxx:288
 TXMLPlayer.cxx:289
 TXMLPlayer.cxx:290
 TXMLPlayer.cxx:291
 TXMLPlayer.cxx:292
 TXMLPlayer.cxx:293
 TXMLPlayer.cxx:294
 TXMLPlayer.cxx:295
 TXMLPlayer.cxx:296
 TXMLPlayer.cxx:297
 TXMLPlayer.cxx:298
 TXMLPlayer.cxx:299
 TXMLPlayer.cxx:300
 TXMLPlayer.cxx:301
 TXMLPlayer.cxx:302
 TXMLPlayer.cxx:303
 TXMLPlayer.cxx:304
 TXMLPlayer.cxx:305
 TXMLPlayer.cxx:306
 TXMLPlayer.cxx:307
 TXMLPlayer.cxx:308
 TXMLPlayer.cxx:309
 TXMLPlayer.cxx:310
 TXMLPlayer.cxx:311
 TXMLPlayer.cxx:312
 TXMLPlayer.cxx:313
 TXMLPlayer.cxx:314
 TXMLPlayer.cxx:315
 TXMLPlayer.cxx:316
 TXMLPlayer.cxx:317
 TXMLPlayer.cxx:318
 TXMLPlayer.cxx:319
 TXMLPlayer.cxx:320
 TXMLPlayer.cxx:321
 TXMLPlayer.cxx:322
 TXMLPlayer.cxx:323
 TXMLPlayer.cxx:324
 TXMLPlayer.cxx:325
 TXMLPlayer.cxx:326
 TXMLPlayer.cxx:327
 TXMLPlayer.cxx:328
 TXMLPlayer.cxx:329
 TXMLPlayer.cxx:330
 TXMLPlayer.cxx:331
 TXMLPlayer.cxx:332
 TXMLPlayer.cxx:333
 TXMLPlayer.cxx:334
 TXMLPlayer.cxx:335
 TXMLPlayer.cxx:336
 TXMLPlayer.cxx:337
 TXMLPlayer.cxx:338
 TXMLPlayer.cxx:339
 TXMLPlayer.cxx:340
 TXMLPlayer.cxx:341
 TXMLPlayer.cxx:342
 TXMLPlayer.cxx:343
 TXMLPlayer.cxx:344
 TXMLPlayer.cxx:345
 TXMLPlayer.cxx:346
 TXMLPlayer.cxx:347
 TXMLPlayer.cxx:348
 TXMLPlayer.cxx:349
 TXMLPlayer.cxx:350
 TXMLPlayer.cxx:351
 TXMLPlayer.cxx:352
 TXMLPlayer.cxx:353
 TXMLPlayer.cxx:354
 TXMLPlayer.cxx:355
 TXMLPlayer.cxx:356
 TXMLPlayer.cxx:357
 TXMLPlayer.cxx:358
 TXMLPlayer.cxx:359
 TXMLPlayer.cxx:360
 TXMLPlayer.cxx:361
 TXMLPlayer.cxx:362
 TXMLPlayer.cxx:363
 TXMLPlayer.cxx:364
 TXMLPlayer.cxx:365
 TXMLPlayer.cxx:366
 TXMLPlayer.cxx:367
 TXMLPlayer.cxx:368
 TXMLPlayer.cxx:369
 TXMLPlayer.cxx:370
 TXMLPlayer.cxx:371
 TXMLPlayer.cxx:372
 TXMLPlayer.cxx:373
 TXMLPlayer.cxx:374
 TXMLPlayer.cxx:375
 TXMLPlayer.cxx:376
 TXMLPlayer.cxx:377
 TXMLPlayer.cxx:378
 TXMLPlayer.cxx:379
 TXMLPlayer.cxx:380
 TXMLPlayer.cxx:381
 TXMLPlayer.cxx:382
 TXMLPlayer.cxx:383
 TXMLPlayer.cxx:384
 TXMLPlayer.cxx:385
 TXMLPlayer.cxx:386
 TXMLPlayer.cxx:387
 TXMLPlayer.cxx:388
 TXMLPlayer.cxx:389
 TXMLPlayer.cxx:390
 TXMLPlayer.cxx:391
 TXMLPlayer.cxx:392
 TXMLPlayer.cxx:393
 TXMLPlayer.cxx:394
 TXMLPlayer.cxx:395
 TXMLPlayer.cxx:396
 TXMLPlayer.cxx:397
 TXMLPlayer.cxx:398
 TXMLPlayer.cxx:399
 TXMLPlayer.cxx:400
 TXMLPlayer.cxx:401
 TXMLPlayer.cxx:402
 TXMLPlayer.cxx:403
 TXMLPlayer.cxx:404
 TXMLPlayer.cxx:405
 TXMLPlayer.cxx:406
 TXMLPlayer.cxx:407
 TXMLPlayer.cxx:408
 TXMLPlayer.cxx:409
 TXMLPlayer.cxx:410
 TXMLPlayer.cxx:411
 TXMLPlayer.cxx:412
 TXMLPlayer.cxx:413
 TXMLPlayer.cxx:414
 TXMLPlayer.cxx:415
 TXMLPlayer.cxx:416
 TXMLPlayer.cxx:417
 TXMLPlayer.cxx:418
 TXMLPlayer.cxx:419
 TXMLPlayer.cxx:420
 TXMLPlayer.cxx:421
 TXMLPlayer.cxx:422
 TXMLPlayer.cxx:423
 TXMLPlayer.cxx:424
 TXMLPlayer.cxx:425
 TXMLPlayer.cxx:426
 TXMLPlayer.cxx:427
 TXMLPlayer.cxx:428
 TXMLPlayer.cxx:429
 TXMLPlayer.cxx:430
 TXMLPlayer.cxx:431
 TXMLPlayer.cxx:432
 TXMLPlayer.cxx:433
 TXMLPlayer.cxx:434
 TXMLPlayer.cxx:435
 TXMLPlayer.cxx:436
 TXMLPlayer.cxx:437
 TXMLPlayer.cxx:438
 TXMLPlayer.cxx:439
 TXMLPlayer.cxx:440
 TXMLPlayer.cxx:441
 TXMLPlayer.cxx:442
 TXMLPlayer.cxx:443
 TXMLPlayer.cxx:444
 TXMLPlayer.cxx:445
 TXMLPlayer.cxx:446
 TXMLPlayer.cxx:447
 TXMLPlayer.cxx:448
 TXMLPlayer.cxx:449
 TXMLPlayer.cxx:450
 TXMLPlayer.cxx:451
 TXMLPlayer.cxx:452
 TXMLPlayer.cxx:453
 TXMLPlayer.cxx:454
 TXMLPlayer.cxx:455
 TXMLPlayer.cxx:456
 TXMLPlayer.cxx:457
 TXMLPlayer.cxx:458
 TXMLPlayer.cxx:459
 TXMLPlayer.cxx:460
 TXMLPlayer.cxx:461
 TXMLPlayer.cxx:462
 TXMLPlayer.cxx:463
 TXMLPlayer.cxx:464
 TXMLPlayer.cxx:465
 TXMLPlayer.cxx:466
 TXMLPlayer.cxx:467
 TXMLPlayer.cxx:468
 TXMLPlayer.cxx:469
 TXMLPlayer.cxx:470
 TXMLPlayer.cxx:471
 TXMLPlayer.cxx:472
 TXMLPlayer.cxx:473
 TXMLPlayer.cxx:474
 TXMLPlayer.cxx:475
 TXMLPlayer.cxx:476
 TXMLPlayer.cxx:477
 TXMLPlayer.cxx:478
 TXMLPlayer.cxx:479
 TXMLPlayer.cxx:480
 TXMLPlayer.cxx:481
 TXMLPlayer.cxx:482
 TXMLPlayer.cxx:483
 TXMLPlayer.cxx:484
 TXMLPlayer.cxx:485
 TXMLPlayer.cxx:486
 TXMLPlayer.cxx:487
 TXMLPlayer.cxx:488
 TXMLPlayer.cxx:489
 TXMLPlayer.cxx:490
 TXMLPlayer.cxx:491
 TXMLPlayer.cxx:492
 TXMLPlayer.cxx:493
 TXMLPlayer.cxx:494
 TXMLPlayer.cxx:495
 TXMLPlayer.cxx:496
 TXMLPlayer.cxx:497
 TXMLPlayer.cxx:498
 TXMLPlayer.cxx:499
 TXMLPlayer.cxx:500
 TXMLPlayer.cxx:501
 TXMLPlayer.cxx:502
 TXMLPlayer.cxx:503
 TXMLPlayer.cxx:504
 TXMLPlayer.cxx:505
 TXMLPlayer.cxx:506
 TXMLPlayer.cxx:507
 TXMLPlayer.cxx:508
 TXMLPlayer.cxx:509
 TXMLPlayer.cxx:510
 TXMLPlayer.cxx:511
 TXMLPlayer.cxx:512
 TXMLPlayer.cxx:513
 TXMLPlayer.cxx:514
 TXMLPlayer.cxx:515
 TXMLPlayer.cxx:516
 TXMLPlayer.cxx:517
 TXMLPlayer.cxx:518
 TXMLPlayer.cxx:519
 TXMLPlayer.cxx:520
 TXMLPlayer.cxx:521
 TXMLPlayer.cxx:522
 TXMLPlayer.cxx:523
 TXMLPlayer.cxx:524
 TXMLPlayer.cxx:525
 TXMLPlayer.cxx:526
 TXMLPlayer.cxx:527
 TXMLPlayer.cxx:528
 TXMLPlayer.cxx:529
 TXMLPlayer.cxx:530
 TXMLPlayer.cxx:531
 TXMLPlayer.cxx:532
 TXMLPlayer.cxx:533
 TXMLPlayer.cxx:534
 TXMLPlayer.cxx:535
 TXMLPlayer.cxx:536
 TXMLPlayer.cxx:537
 TXMLPlayer.cxx:538
 TXMLPlayer.cxx:539
 TXMLPlayer.cxx:540
 TXMLPlayer.cxx:541
 TXMLPlayer.cxx:542
 TXMLPlayer.cxx:543
 TXMLPlayer.cxx:544
 TXMLPlayer.cxx:545
 TXMLPlayer.cxx:546
 TXMLPlayer.cxx:547
 TXMLPlayer.cxx:548
 TXMLPlayer.cxx:549
 TXMLPlayer.cxx:550
 TXMLPlayer.cxx:551
 TXMLPlayer.cxx:552
 TXMLPlayer.cxx:553
 TXMLPlayer.cxx:554
 TXMLPlayer.cxx:555
 TXMLPlayer.cxx:556
 TXMLPlayer.cxx:557
 TXMLPlayer.cxx:558
 TXMLPlayer.cxx:559
 TXMLPlayer.cxx:560
 TXMLPlayer.cxx:561
 TXMLPlayer.cxx:562
 TXMLPlayer.cxx:563
 TXMLPlayer.cxx:564
 TXMLPlayer.cxx:565
 TXMLPlayer.cxx:566
 TXMLPlayer.cxx:567
 TXMLPlayer.cxx:568
 TXMLPlayer.cxx:569
 TXMLPlayer.cxx:570
 TXMLPlayer.cxx:571
 TXMLPlayer.cxx:572
 TXMLPlayer.cxx:573
 TXMLPlayer.cxx:574
 TXMLPlayer.cxx:575
 TXMLPlayer.cxx:576
 TXMLPlayer.cxx:577
 TXMLPlayer.cxx:578
 TXMLPlayer.cxx:579
 TXMLPlayer.cxx:580
 TXMLPlayer.cxx:581
 TXMLPlayer.cxx:582
 TXMLPlayer.cxx:583
 TXMLPlayer.cxx:584
 TXMLPlayer.cxx:585
 TXMLPlayer.cxx:586
 TXMLPlayer.cxx:587
 TXMLPlayer.cxx:588
 TXMLPlayer.cxx:589
 TXMLPlayer.cxx:590
 TXMLPlayer.cxx:591
 TXMLPlayer.cxx:592
 TXMLPlayer.cxx:593
 TXMLPlayer.cxx:594
 TXMLPlayer.cxx:595
 TXMLPlayer.cxx:596
 TXMLPlayer.cxx:597
 TXMLPlayer.cxx:598
 TXMLPlayer.cxx:599
 TXMLPlayer.cxx:600
 TXMLPlayer.cxx:601
 TXMLPlayer.cxx:602
 TXMLPlayer.cxx:603
 TXMLPlayer.cxx:604
 TXMLPlayer.cxx:605
 TXMLPlayer.cxx:606
 TXMLPlayer.cxx:607
 TXMLPlayer.cxx:608
 TXMLPlayer.cxx:609
 TXMLPlayer.cxx:610
 TXMLPlayer.cxx:611
 TXMLPlayer.cxx:612
 TXMLPlayer.cxx:613
 TXMLPlayer.cxx:614
 TXMLPlayer.cxx:615
 TXMLPlayer.cxx:616
 TXMLPlayer.cxx:617
 TXMLPlayer.cxx:618
 TXMLPlayer.cxx:619
 TXMLPlayer.cxx:620
 TXMLPlayer.cxx:621
 TXMLPlayer.cxx:622
 TXMLPlayer.cxx:623
 TXMLPlayer.cxx:624
 TXMLPlayer.cxx:625
 TXMLPlayer.cxx:626
 TXMLPlayer.cxx:627
 TXMLPlayer.cxx:628
 TXMLPlayer.cxx:629
 TXMLPlayer.cxx:630
 TXMLPlayer.cxx:631
 TXMLPlayer.cxx:632
 TXMLPlayer.cxx:633
 TXMLPlayer.cxx:634
 TXMLPlayer.cxx:635
 TXMLPlayer.cxx:636
 TXMLPlayer.cxx:637
 TXMLPlayer.cxx:638
 TXMLPlayer.cxx:639
 TXMLPlayer.cxx:640
 TXMLPlayer.cxx:641
 TXMLPlayer.cxx:642
 TXMLPlayer.cxx:643
 TXMLPlayer.cxx:644
 TXMLPlayer.cxx:645
 TXMLPlayer.cxx:646
 TXMLPlayer.cxx:647
 TXMLPlayer.cxx:648
 TXMLPlayer.cxx:649
 TXMLPlayer.cxx:650
 TXMLPlayer.cxx:651
 TXMLPlayer.cxx:652
 TXMLPlayer.cxx:653
 TXMLPlayer.cxx:654
 TXMLPlayer.cxx:655
 TXMLPlayer.cxx:656
 TXMLPlayer.cxx:657
 TXMLPlayer.cxx:658
 TXMLPlayer.cxx:659
 TXMLPlayer.cxx:660
 TXMLPlayer.cxx:661
 TXMLPlayer.cxx:662
 TXMLPlayer.cxx:663
 TXMLPlayer.cxx:664
 TXMLPlayer.cxx:665
 TXMLPlayer.cxx:666
 TXMLPlayer.cxx:667
 TXMLPlayer.cxx:668
 TXMLPlayer.cxx:669
 TXMLPlayer.cxx:670
 TXMLPlayer.cxx:671
 TXMLPlayer.cxx:672
 TXMLPlayer.cxx:673
 TXMLPlayer.cxx:674
 TXMLPlayer.cxx:675
 TXMLPlayer.cxx:676
 TXMLPlayer.cxx:677
 TXMLPlayer.cxx:678
 TXMLPlayer.cxx:679
 TXMLPlayer.cxx:680
 TXMLPlayer.cxx:681
 TXMLPlayer.cxx:682
 TXMLPlayer.cxx:683
 TXMLPlayer.cxx:684
 TXMLPlayer.cxx:685
 TXMLPlayer.cxx:686
 TXMLPlayer.cxx:687
 TXMLPlayer.cxx:688
 TXMLPlayer.cxx:689
 TXMLPlayer.cxx:690
 TXMLPlayer.cxx:691
 TXMLPlayer.cxx:692
 TXMLPlayer.cxx:693
 TXMLPlayer.cxx:694
 TXMLPlayer.cxx:695
 TXMLPlayer.cxx:696
 TXMLPlayer.cxx:697
 TXMLPlayer.cxx:698
 TXMLPlayer.cxx:699
 TXMLPlayer.cxx:700
 TXMLPlayer.cxx:701
 TXMLPlayer.cxx:702
 TXMLPlayer.cxx:703
 TXMLPlayer.cxx:704
 TXMLPlayer.cxx:705
 TXMLPlayer.cxx:706
 TXMLPlayer.cxx:707
 TXMLPlayer.cxx:708
 TXMLPlayer.cxx:709
 TXMLPlayer.cxx:710
 TXMLPlayer.cxx:711
 TXMLPlayer.cxx:712
 TXMLPlayer.cxx:713
 TXMLPlayer.cxx:714
 TXMLPlayer.cxx:715
 TXMLPlayer.cxx:716
 TXMLPlayer.cxx:717
 TXMLPlayer.cxx:718
 TXMLPlayer.cxx:719
 TXMLPlayer.cxx:720
 TXMLPlayer.cxx:721
 TXMLPlayer.cxx:722
 TXMLPlayer.cxx:723
 TXMLPlayer.cxx:724
 TXMLPlayer.cxx:725
 TXMLPlayer.cxx:726
 TXMLPlayer.cxx:727
 TXMLPlayer.cxx:728
 TXMLPlayer.cxx:729
 TXMLPlayer.cxx:730
 TXMLPlayer.cxx:731
 TXMLPlayer.cxx:732
 TXMLPlayer.cxx:733
 TXMLPlayer.cxx:734
 TXMLPlayer.cxx:735
 TXMLPlayer.cxx:736
 TXMLPlayer.cxx:737
 TXMLPlayer.cxx:738
 TXMLPlayer.cxx:739
 TXMLPlayer.cxx:740
 TXMLPlayer.cxx:741
 TXMLPlayer.cxx:742
 TXMLPlayer.cxx:743
 TXMLPlayer.cxx:744
 TXMLPlayer.cxx:745
 TXMLPlayer.cxx:746
 TXMLPlayer.cxx:747
 TXMLPlayer.cxx:748
 TXMLPlayer.cxx:749
 TXMLPlayer.cxx:750
 TXMLPlayer.cxx:751
 TXMLPlayer.cxx:752
 TXMLPlayer.cxx:753
 TXMLPlayer.cxx:754
 TXMLPlayer.cxx:755
 TXMLPlayer.cxx:756
 TXMLPlayer.cxx:757
 TXMLPlayer.cxx:758
 TXMLPlayer.cxx:759
 TXMLPlayer.cxx:760
 TXMLPlayer.cxx:761
 TXMLPlayer.cxx:762
 TXMLPlayer.cxx:763
 TXMLPlayer.cxx:764
 TXMLPlayer.cxx:765
 TXMLPlayer.cxx:766
 TXMLPlayer.cxx:767
 TXMLPlayer.cxx:768
 TXMLPlayer.cxx:769
 TXMLPlayer.cxx:770
 TXMLPlayer.cxx:771
 TXMLPlayer.cxx:772
 TXMLPlayer.cxx:773
 TXMLPlayer.cxx:774
 TXMLPlayer.cxx:775
 TXMLPlayer.cxx:776
 TXMLPlayer.cxx:777
 TXMLPlayer.cxx:778
 TXMLPlayer.cxx:779
 TXMLPlayer.cxx:780
 TXMLPlayer.cxx:781
 TXMLPlayer.cxx:782
 TXMLPlayer.cxx:783
 TXMLPlayer.cxx:784
 TXMLPlayer.cxx:785
 TXMLPlayer.cxx:786
 TXMLPlayer.cxx:787
 TXMLPlayer.cxx:788
 TXMLPlayer.cxx:789
 TXMLPlayer.cxx:790
 TXMLPlayer.cxx:791
 TXMLPlayer.cxx:792
 TXMLPlayer.cxx:793
 TXMLPlayer.cxx:794
 TXMLPlayer.cxx:795
 TXMLPlayer.cxx:796
 TXMLPlayer.cxx:797
 TXMLPlayer.cxx:798
 TXMLPlayer.cxx:799
 TXMLPlayer.cxx:800
 TXMLPlayer.cxx:801
 TXMLPlayer.cxx:802
 TXMLPlayer.cxx:803
 TXMLPlayer.cxx:804
 TXMLPlayer.cxx:805
 TXMLPlayer.cxx:806
 TXMLPlayer.cxx:807
 TXMLPlayer.cxx:808
 TXMLPlayer.cxx:809
 TXMLPlayer.cxx:810
 TXMLPlayer.cxx:811
 TXMLPlayer.cxx:812
 TXMLPlayer.cxx:813
 TXMLPlayer.cxx:814
 TXMLPlayer.cxx:815
 TXMLPlayer.cxx:816
 TXMLPlayer.cxx:817
 TXMLPlayer.cxx:818
 TXMLPlayer.cxx:819
 TXMLPlayer.cxx:820
 TXMLPlayer.cxx:821
 TXMLPlayer.cxx:822
 TXMLPlayer.cxx:823
 TXMLPlayer.cxx:824
 TXMLPlayer.cxx:825
 TXMLPlayer.cxx:826
 TXMLPlayer.cxx:827
 TXMLPlayer.cxx:828
 TXMLPlayer.cxx:829
 TXMLPlayer.cxx:830
 TXMLPlayer.cxx:831
 TXMLPlayer.cxx:832
 TXMLPlayer.cxx:833
 TXMLPlayer.cxx:834
 TXMLPlayer.cxx:835
 TXMLPlayer.cxx:836
 TXMLPlayer.cxx:837
 TXMLPlayer.cxx:838
 TXMLPlayer.cxx:839
 TXMLPlayer.cxx:840
 TXMLPlayer.cxx:841
 TXMLPlayer.cxx:842
 TXMLPlayer.cxx:843
 TXMLPlayer.cxx:844
 TXMLPlayer.cxx:845
 TXMLPlayer.cxx:846
 TXMLPlayer.cxx:847
 TXMLPlayer.cxx:848
 TXMLPlayer.cxx:849
 TXMLPlayer.cxx:850
 TXMLPlayer.cxx:851
 TXMLPlayer.cxx:852
 TXMLPlayer.cxx:853
 TXMLPlayer.cxx:854
 TXMLPlayer.cxx:855
 TXMLPlayer.cxx:856
 TXMLPlayer.cxx:857
 TXMLPlayer.cxx:858
 TXMLPlayer.cxx:859
 TXMLPlayer.cxx:860
 TXMLPlayer.cxx:861
 TXMLPlayer.cxx:862
 TXMLPlayer.cxx:863
 TXMLPlayer.cxx:864
 TXMLPlayer.cxx:865
 TXMLPlayer.cxx:866
 TXMLPlayer.cxx:867
 TXMLPlayer.cxx:868
 TXMLPlayer.cxx:869
 TXMLPlayer.cxx:870
 TXMLPlayer.cxx:871
 TXMLPlayer.cxx:872
 TXMLPlayer.cxx:873
 TXMLPlayer.cxx:874
 TXMLPlayer.cxx:875
 TXMLPlayer.cxx:876
 TXMLPlayer.cxx:877
 TXMLPlayer.cxx:878
 TXMLPlayer.cxx:879
 TXMLPlayer.cxx:880
 TXMLPlayer.cxx:881
 TXMLPlayer.cxx:882
 TXMLPlayer.cxx:883
 TXMLPlayer.cxx:884
 TXMLPlayer.cxx:885
 TXMLPlayer.cxx:886
 TXMLPlayer.cxx:887
 TXMLPlayer.cxx:888
 TXMLPlayer.cxx:889
 TXMLPlayer.cxx:890
 TXMLPlayer.cxx:891
 TXMLPlayer.cxx:892
 TXMLPlayer.cxx:893
 TXMLPlayer.cxx:894
 TXMLPlayer.cxx:895
 TXMLPlayer.cxx:896
 TXMLPlayer.cxx:897
 TXMLPlayer.cxx:898
 TXMLPlayer.cxx:899
 TXMLPlayer.cxx:900
 TXMLPlayer.cxx:901
 TXMLPlayer.cxx:902
 TXMLPlayer.cxx:903
 TXMLPlayer.cxx:904
 TXMLPlayer.cxx:905
 TXMLPlayer.cxx:906
 TXMLPlayer.cxx:907
 TXMLPlayer.cxx:908
 TXMLPlayer.cxx:909
 TXMLPlayer.cxx:910
 TXMLPlayer.cxx:911
 TXMLPlayer.cxx:912
 TXMLPlayer.cxx:913
 TXMLPlayer.cxx:914
 TXMLPlayer.cxx:915
 TXMLPlayer.cxx:916
 TXMLPlayer.cxx:917
 TXMLPlayer.cxx:918
 TXMLPlayer.cxx:919
 TXMLPlayer.cxx:920
 TXMLPlayer.cxx:921
 TXMLPlayer.cxx:922
 TXMLPlayer.cxx:923
 TXMLPlayer.cxx:924
 TXMLPlayer.cxx:925
 TXMLPlayer.cxx:926
 TXMLPlayer.cxx:927
 TXMLPlayer.cxx:928
 TXMLPlayer.cxx:929
 TXMLPlayer.cxx:930
 TXMLPlayer.cxx:931
 TXMLPlayer.cxx:932
 TXMLPlayer.cxx:933
 TXMLPlayer.cxx:934
 TXMLPlayer.cxx:935
 TXMLPlayer.cxx:936
 TXMLPlayer.cxx:937
 TXMLPlayer.cxx:938
 TXMLPlayer.cxx:939
 TXMLPlayer.cxx:940
 TXMLPlayer.cxx:941
 TXMLPlayer.cxx:942
 TXMLPlayer.cxx:943
 TXMLPlayer.cxx:944
 TXMLPlayer.cxx:945
 TXMLPlayer.cxx:946
 TXMLPlayer.cxx:947
 TXMLPlayer.cxx:948
 TXMLPlayer.cxx:949
 TXMLPlayer.cxx:950
 TXMLPlayer.cxx:951
 TXMLPlayer.cxx:952
 TXMLPlayer.cxx:953
 TXMLPlayer.cxx:954
 TXMLPlayer.cxx:955
 TXMLPlayer.cxx:956
 TXMLPlayer.cxx:957
 TXMLPlayer.cxx:958
 TXMLPlayer.cxx:959
 TXMLPlayer.cxx:960
 TXMLPlayer.cxx:961
 TXMLPlayer.cxx:962
 TXMLPlayer.cxx:963
 TXMLPlayer.cxx:964
 TXMLPlayer.cxx:965
 TXMLPlayer.cxx:966
 TXMLPlayer.cxx:967
 TXMLPlayer.cxx:968
 TXMLPlayer.cxx:969
 TXMLPlayer.cxx:970
 TXMLPlayer.cxx:971
 TXMLPlayer.cxx:972
 TXMLPlayer.cxx:973
 TXMLPlayer.cxx:974
 TXMLPlayer.cxx:975
 TXMLPlayer.cxx:976
 TXMLPlayer.cxx:977
 TXMLPlayer.cxx:978
 TXMLPlayer.cxx:979
 TXMLPlayer.cxx:980
 TXMLPlayer.cxx:981
 TXMLPlayer.cxx:982
 TXMLPlayer.cxx:983
 TXMLPlayer.cxx:984
 TXMLPlayer.cxx:985
 TXMLPlayer.cxx:986
 TXMLPlayer.cxx:987
 TXMLPlayer.cxx:988
 TXMLPlayer.cxx:989
 TXMLPlayer.cxx:990
 TXMLPlayer.cxx:991
 TXMLPlayer.cxx:992
 TXMLPlayer.cxx:993
 TXMLPlayer.cxx:994
 TXMLPlayer.cxx:995
 TXMLPlayer.cxx:996
 TXMLPlayer.cxx:997
 TXMLPlayer.cxx:998
 TXMLPlayer.cxx:999
 TXMLPlayer.cxx:1000
 TXMLPlayer.cxx:1001
 TXMLPlayer.cxx:1002
 TXMLPlayer.cxx:1003
 TXMLPlayer.cxx:1004
 TXMLPlayer.cxx:1005
 TXMLPlayer.cxx:1006
 TXMLPlayer.cxx:1007
 TXMLPlayer.cxx:1008
 TXMLPlayer.cxx:1009
 TXMLPlayer.cxx:1010
 TXMLPlayer.cxx:1011
 TXMLPlayer.cxx:1012
 TXMLPlayer.cxx:1013
 TXMLPlayer.cxx:1014
 TXMLPlayer.cxx:1015
 TXMLPlayer.cxx:1016
 TXMLPlayer.cxx:1017
 TXMLPlayer.cxx:1018
 TXMLPlayer.cxx:1019
 TXMLPlayer.cxx:1020
 TXMLPlayer.cxx:1021
 TXMLPlayer.cxx:1022
 TXMLPlayer.cxx:1023
 TXMLPlayer.cxx:1024
 TXMLPlayer.cxx:1025
 TXMLPlayer.cxx:1026
 TXMLPlayer.cxx:1027
 TXMLPlayer.cxx:1028
 TXMLPlayer.cxx:1029
 TXMLPlayer.cxx:1030
 TXMLPlayer.cxx:1031
 TXMLPlayer.cxx:1032
 TXMLPlayer.cxx:1033
 TXMLPlayer.cxx:1034
 TXMLPlayer.cxx:1035
 TXMLPlayer.cxx:1036
 TXMLPlayer.cxx:1037
 TXMLPlayer.cxx:1038
 TXMLPlayer.cxx:1039
 TXMLPlayer.cxx:1040
 TXMLPlayer.cxx:1041
 TXMLPlayer.cxx:1042
 TXMLPlayer.cxx:1043
 TXMLPlayer.cxx:1044
 TXMLPlayer.cxx:1045
 TXMLPlayer.cxx:1046
 TXMLPlayer.cxx:1047
 TXMLPlayer.cxx:1048
 TXMLPlayer.cxx:1049
 TXMLPlayer.cxx:1050
 TXMLPlayer.cxx:1051
 TXMLPlayer.cxx:1052
 TXMLPlayer.cxx:1053
 TXMLPlayer.cxx:1054
 TXMLPlayer.cxx:1055
 TXMLPlayer.cxx:1056
 TXMLPlayer.cxx:1057
 TXMLPlayer.cxx:1058
 TXMLPlayer.cxx:1059
 TXMLPlayer.cxx:1060
 TXMLPlayer.cxx:1061
 TXMLPlayer.cxx:1062
 TXMLPlayer.cxx:1063
 TXMLPlayer.cxx:1064
 TXMLPlayer.cxx:1065
 TXMLPlayer.cxx:1066
 TXMLPlayer.cxx:1067
 TXMLPlayer.cxx:1068
 TXMLPlayer.cxx:1069
 TXMLPlayer.cxx:1070
 TXMLPlayer.cxx:1071
 TXMLPlayer.cxx:1072
 TXMLPlayer.cxx:1073
 TXMLPlayer.cxx:1074
 TXMLPlayer.cxx:1075
 TXMLPlayer.cxx:1076
 TXMLPlayer.cxx:1077
 TXMLPlayer.cxx:1078
 TXMLPlayer.cxx:1079
 TXMLPlayer.cxx:1080
 TXMLPlayer.cxx:1081
 TXMLPlayer.cxx:1082
 TXMLPlayer.cxx:1083
 TXMLPlayer.cxx:1084
 TXMLPlayer.cxx:1085
 TXMLPlayer.cxx:1086
 TXMLPlayer.cxx:1087
 TXMLPlayer.cxx:1088
 TXMLPlayer.cxx:1089
 TXMLPlayer.cxx:1090
 TXMLPlayer.cxx:1091
 TXMLPlayer.cxx:1092
 TXMLPlayer.cxx:1093
 TXMLPlayer.cxx:1094
 TXMLPlayer.cxx:1095
 TXMLPlayer.cxx:1096
 TXMLPlayer.cxx:1097
 TXMLPlayer.cxx:1098
 TXMLPlayer.cxx:1099
 TXMLPlayer.cxx:1100
 TXMLPlayer.cxx:1101
 TXMLPlayer.cxx:1102
 TXMLPlayer.cxx:1103
 TXMLPlayer.cxx:1104
 TXMLPlayer.cxx:1105
 TXMLPlayer.cxx:1106
 TXMLPlayer.cxx:1107
 TXMLPlayer.cxx:1108
 TXMLPlayer.cxx:1109
 TXMLPlayer.cxx:1110
 TXMLPlayer.cxx:1111
 TXMLPlayer.cxx:1112
 TXMLPlayer.cxx:1113
 TXMLPlayer.cxx:1114
 TXMLPlayer.cxx:1115
 TXMLPlayer.cxx:1116
 TXMLPlayer.cxx:1117
 TXMLPlayer.cxx:1118
 TXMLPlayer.cxx:1119
 TXMLPlayer.cxx:1120
 TXMLPlayer.cxx:1121
 TXMLPlayer.cxx:1122
 TXMLPlayer.cxx:1123
 TXMLPlayer.cxx:1124
 TXMLPlayer.cxx:1125
 TXMLPlayer.cxx:1126
 TXMLPlayer.cxx:1127
 TXMLPlayer.cxx:1128
 TXMLPlayer.cxx:1129
 TXMLPlayer.cxx:1130
 TXMLPlayer.cxx:1131
 TXMLPlayer.cxx:1132
 TXMLPlayer.cxx:1133
 TXMLPlayer.cxx:1134
 TXMLPlayer.cxx:1135
 TXMLPlayer.cxx:1136
 TXMLPlayer.cxx:1137
 TXMLPlayer.cxx:1138
 TXMLPlayer.cxx:1139
 TXMLPlayer.cxx:1140
 TXMLPlayer.cxx:1141
 TXMLPlayer.cxx:1142
 TXMLPlayer.cxx:1143
 TXMLPlayer.cxx:1144
 TXMLPlayer.cxx:1145
 TXMLPlayer.cxx:1146
 TXMLPlayer.cxx:1147
 TXMLPlayer.cxx:1148
 TXMLPlayer.cxx:1149
 TXMLPlayer.cxx:1150
 TXMLPlayer.cxx:1151
 TXMLPlayer.cxx:1152
 TXMLPlayer.cxx:1153
 TXMLPlayer.cxx:1154
 TXMLPlayer.cxx:1155
 TXMLPlayer.cxx:1156
 TXMLPlayer.cxx:1157
 TXMLPlayer.cxx:1158
 TXMLPlayer.cxx:1159
 TXMLPlayer.cxx:1160
 TXMLPlayer.cxx:1161
 TXMLPlayer.cxx:1162
 TXMLPlayer.cxx:1163
 TXMLPlayer.cxx:1164
 TXMLPlayer.cxx:1165
 TXMLPlayer.cxx:1166
 TXMLPlayer.cxx:1167
 TXMLPlayer.cxx:1168
 TXMLPlayer.cxx:1169
 TXMLPlayer.cxx:1170
 TXMLPlayer.cxx:1171
 TXMLPlayer.cxx:1172
 TXMLPlayer.cxx:1173
 TXMLPlayer.cxx:1174
 TXMLPlayer.cxx:1175
 TXMLPlayer.cxx:1176
 TXMLPlayer.cxx:1177
 TXMLPlayer.cxx:1178
 TXMLPlayer.cxx:1179
 TXMLPlayer.cxx:1180
 TXMLPlayer.cxx:1181
 TXMLPlayer.cxx:1182
 TXMLPlayer.cxx:1183
 TXMLPlayer.cxx:1184
 TXMLPlayer.cxx:1185
 TXMLPlayer.cxx:1186
 TXMLPlayer.cxx:1187
 TXMLPlayer.cxx:1188
 TXMLPlayer.cxx:1189
 TXMLPlayer.cxx:1190
 TXMLPlayer.cxx:1191
 TXMLPlayer.cxx:1192
 TXMLPlayer.cxx:1193
 TXMLPlayer.cxx:1194
 TXMLPlayer.cxx:1195
 TXMLPlayer.cxx:1196
 TXMLPlayer.cxx:1197
 TXMLPlayer.cxx:1198
 TXMLPlayer.cxx:1199
 TXMLPlayer.cxx:1200
 TXMLPlayer.cxx:1201
 TXMLPlayer.cxx:1202
 TXMLPlayer.cxx:1203
 TXMLPlayer.cxx:1204
 TXMLPlayer.cxx:1205
 TXMLPlayer.cxx:1206
 TXMLPlayer.cxx:1207
 TXMLPlayer.cxx:1208
 TXMLPlayer.cxx:1209
 TXMLPlayer.cxx:1210
 TXMLPlayer.cxx:1211
 TXMLPlayer.cxx:1212
 TXMLPlayer.cxx:1213