// @(#)root/base:$Id$
// Author: Andreas-Joachim Peters   20/9/2005

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TFileInfo                                                            //
//                                                                      //
// Class describing a generic file including meta information.          //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "Riostream.h"
#include "TFileInfo.h"
#include "TRegexp.h"
#include "TSystem.h"
#include "TClass.h"


ClassImp(TFileInfo)
ClassImp(TFileInfoMeta)

//______________________________________________________________________________
TFileInfo::TFileInfo(const char *in, Long64_t size, const char *uuid,
                     const char *md5, TObject *meta)
   : fCurrentUrl(0), fUrlList(0), fSize(-1), fUUID(0), fMD5(0),
     fMetaDataList(0), fIndex(-1)
{
   // Constructor.

   // Get initializations form the input string: this will set at least the
   // current URL; but it may set more: see TFileInfo::ParseInput(). Please note
   // that MD5 sum should be provided as a string in md5ascii form.
   ParseInput(in);

   // Now also honour the input arguments: the size
   if (size > -1) fSize = size;
   // The UUID
   if (uuid) {
      SafeDelete(fUUID);
      fUUID = new TUUID(uuid);
   } else if (!fUUID) {
      fUUID = new TUUID;
   }
   // The MD5
   if (md5) {
      SafeDelete(fMD5);
      fMD5 = new TMD5();
      fMD5->SetDigest(md5);  // sets digest from md5ascii representation
   }
   // The meta information
   if (meta) {
      RemoveMetaData(meta->GetName());
      AddMetaData(meta);
   }

   // Now set the name from the UUID
   SetName(fUUID->AsString());
   SetTitle("TFileInfo");

   // By default we ignore the index
   ResetBit(TFileInfo::kSortWithIndex);
}

//______________________________________________________________________________
TFileInfo::TFileInfo(const TFileInfo &fi) : TNamed(fi.GetName(), fi.GetTitle()),
                                            fCurrentUrl(0), fUrlList(0),
                                            fSize(fi.fSize), fUUID(0), fMD5(0),
                                            fMetaDataList(0), fIndex(fi.fIndex)
{
   // Copy constructor.

   if (fi.fUrlList) {
      fUrlList = new TList;
      fUrlList->SetOwner();
      TIter nxu(fi.fUrlList);
      TUrl *u = 0;
      while ((u = (TUrl *)nxu())) {
         fUrlList->Add(new TUrl(u->GetUrl(), kTRUE));
      }
      ResetUrl();
   }
   fSize = fi.fSize;

   if (fi.fUUID)
      fUUID = new TUUID(fi.fUUID->AsString());

   if (fi.fMD5)
      fMD5 = new TMD5(*(fi.fMD5));

   // Staged and corrupted bits
   ResetBit(TFileInfo::kStaged);
   ResetBit(TFileInfo::kCorrupted);
   if (fi.TestBit(TFileInfo::kStaged)) SetBit(TFileInfo::kStaged);
   if (fi.TestBit(TFileInfo::kCorrupted)) SetBit(TFileInfo::kCorrupted);

   if (fi.fMetaDataList) {
      fMetaDataList = new TList;
      fMetaDataList->SetOwner();
      TIter nxm(fi.fMetaDataList);
      TFileInfoMeta *fim = 0;
      while ((fim = (TFileInfoMeta *)nxm())) {
         fMetaDataList->Add(new TFileInfoMeta(*fim));
      }
   }

   // By default we ignore the index
   ResetBit(TFileInfo::kSortWithIndex);
}

//______________________________________________________________________________
TFileInfo::~TFileInfo()
{
   // Destructor.

   SafeDelete(fMetaDataList);
   SafeDelete(fUUID);
   SafeDelete(fMD5);
   SafeDelete(fUrlList);
}

//______________________________________________________________________________
void TFileInfo::ParseInput(const char *in)
{
   // Parse the input line to extract init information from 'in'; the input
   // string is tokenized on ' '; the tokens can be prefixed by the following
   // keys:
   //
   //   url:<url1>,<url2>,...     URLs for the file; stored in the order given
   //   sz:<size>                 size of the file in bytes
   //   md5:<md5_ascii>           MD5 sum of the file in ASCII form
   //   uuid:<uuid>               UUID of the file
   //
   //   tree:<name>,<entries>,<first>,<last>
   //                             meta-information about a tree in the file; the
   //                             should be in the form <subdir>/tree-name;'entries' is
   //                             the number of entries in the tree; 'first' and 'last'
   //                             define the entry range.
   //
   //   obj:<name>,<class>,<entries>
   //                             meta-information about a generic object in the file;
   //                             the should be in the form <subdir>/obj-name; 'class'
   //                             is the object class; 'entries' is the number of occurences
   //                             for this object.
   //
   //   idx:<index>               Index of this file if sorting with index
   //
   // Multiple occurences of 'tree:' or 'obj:' can be specified.
   // The initializations done via the input string are superseeded by the ones by other
   // parameters in the constructor, if any.
   // If no key is given, the token is interpreted as URL(s).

   // Nothing to do if the string is empty
   if (!in || strlen(in) <= 0) return;

   TString sin(in), t;
   Int_t f1 = 0;
   while (sin.Tokenize(t, f1, " ")) {
      if (t.BeginsWith("sz:")) {
         // The size
         t.Replace(0, 3, "");
         if (t.IsDigit()) sscanf(t.Data(), "%lld", &fSize);
      } else if (t.BeginsWith("md5:")) {
         // The MD5
         t.Replace(0, 4, "");
         if (t.Length() >= 32) {
            fMD5 = new TMD5;
            if (fMD5->SetDigest(t) != 0)
               SafeDelete(fMD5);
         }
      } else if (t.BeginsWith("uuid:")) {
         // The UUID
         t.Replace(0, 5, "");
         if (t.Length() > 0) fUUID = new TUUID(t);
      } else if (t.BeginsWith("tree:")) {
         // A tree
         t.Replace(0, 5, "");
         TString nm, se, sf, sl;
         Long64_t ent = -1, fst= -1, lst = -1;
         Int_t f2 = 0;
         if (t.Tokenize(nm, f2, ","))
            if (t.Tokenize(se, f2, ","))
               if (t.Tokenize(sf, f2, ","))
                  t.Tokenize(sl, f2, ",");
         if (!(nm.IsNull())) {
            if (se.IsDigit()) sscanf(se.Data(), "%lld", &ent);
            if (sf.IsDigit()) sscanf(sf.Data(), "%lld", &fst);
            if (sl.IsDigit()) sscanf(sl.Data(), "%lld", &lst);
            TFileInfoMeta *meta = new TFileInfoMeta(nm, "TTree", ent, fst, lst);
            RemoveMetaData(meta->GetName());
            AddMetaData(meta);
         }
      } else if (t.BeginsWith("obj:")) {
         // A generic object
         t.Replace(0, 4, "");
         TString nm, cl, se;
         Long64_t ent = -1;
         Int_t f2 = 0;
         if (t.Tokenize(nm, f2, ","))
            if (t.Tokenize(cl, f2, ","))
               t.Tokenize(se, f2, ",");
         if (cl.IsNull()) cl = "TObject";
         if (!(nm.IsNull())) {
            if (se.IsDigit()) sscanf(se.Data(), "%lld", &ent);
            TFileInfoMeta *meta = new TFileInfoMeta(nm, cl, ent);
            AddMetaData(meta);
         }
      } else if (t.BeginsWith("idx:")) {
         // The size
         t.Replace(0, 4, "");
         if (t.IsDigit()) sscanf(t.Data(), "%d", &fIndex);
      } else {
         // A (set of) URL(s)
         if (t.BeginsWith("url:")) t.Replace(0, 4, "");
         TString u;
         Int_t f2 = 0;
         while (t.Tokenize(u, f2, ",")) {
            if (!(u.IsNull())) AddUrl(u);
         }
      }
   }
}

//______________________________________________________________________________
void TFileInfo::SetUUID(const char *uuid)
{
   // Set the UUID to the value associated to the string 'uuid'. This is
   // useful to set the UUID to the one of the ROOT file during verification.
   // NB: we do not change the name in here, because this would screw up lists
   //     of these objects hashed on the name. Those lists need to be rebuild.
   //     TFileCollection does that in RemoveDuplicates.

   if (uuid) {
      if (fUUID) delete fUUID;
      fUUID = new TUUID(uuid);
   }
}

//______________________________________________________________________________
TUrl *TFileInfo::GetCurrentUrl() const
{
   // Return the current url.

   if (!fCurrentUrl)
      const_cast<TFileInfo*>(this)->ResetUrl();
   return fCurrentUrl;
}

//______________________________________________________________________________
TUrl *TFileInfo::NextUrl()
{
   // Iterator function, start iteration by calling ResetUrl().
   // The first call to NextUrl() will return the 1st element,
   // the seconde the 2nd element etc. Returns 0 in case no more urls.

   if (!fUrlList)
      return 0;

   TUrl *returl = fCurrentUrl;

   if (fCurrentUrl)
      fCurrentUrl = (TUrl*)fUrlList->After(fCurrentUrl);

   return returl;
}

//______________________________________________________________________________
TUrl *TFileInfo::FindByUrl(const char *url, Bool_t withDeflt)
{
   // Find an element from a URL. Returns 0 if not found.

   TIter nextUrl(fUrlList);
   TUrl *urlelement;

   TRegexp rg(url);
   while  ((urlelement = (TUrl*) nextUrl())) {
      if (TString(urlelement->GetUrl(withDeflt)).Index(rg) != kNPOS) {
         return urlelement;
      }
   }
   return 0;
}

//______________________________________________________________________________
Bool_t TFileInfo::AddUrl(const char *url, Bool_t infront)
{
   // Add a new URL. If 'infront' is TRUE the new url is pushed at the beginning
   // of the list; otherwise is pushed back.
   // Returns kTRUE if successful, kFALSE otherwise.

   if (FindByUrl(url))
      return kFALSE;

   if (!fUrlList) {
      fUrlList = new TList;
      fUrlList->SetOwner();
   }

   TUrl *newurl = new TUrl(url, kTRUE);
   // We set the current Url to the first url added
   if (fUrlList->GetSize() == 0)
      fCurrentUrl = newurl;

   if (infront)
      fUrlList->AddFirst(newurl);
   else
      fUrlList->Add(newurl);
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TFileInfo::RemoveUrl(const char *url)
{
   // Remove an URL. Returns kTRUE if successful, kFALSE otherwise.

   TUrl *lurl;
   if ((lurl = FindByUrl(url))) {
      fUrlList->Remove(lurl);
      if (lurl == fCurrentUrl)
         ResetUrl();
      delete lurl;
      return kTRUE;
   }
   return kFALSE;
}

//______________________________________________________________________________
Bool_t TFileInfo::RemoveUrlAt(Int_t i)
{
   // Remove URL at given position. Returns kTRUE on success, kFALSE on error.

   TUrl *tUrl;
   if ((tUrl = dynamic_cast<TUrl *>(fUrlList->At(i))) != NULL) {
      fUrlList->Remove(tUrl);
      if (tUrl == fCurrentUrl)
         ResetUrl();
      delete tUrl;
      return kTRUE;
   }

   return kFALSE;
}

//______________________________________________________________________________
Bool_t TFileInfo::SetCurrentUrl(const char *url)
{
   // Set 'url' as current URL, if in the list
   // Return kFALSE if not in the list

   TUrl *lurl;
   if ((lurl = FindByUrl(url))) {
      fCurrentUrl = lurl;
      return kTRUE;
   }
   return kFALSE;
}

//______________________________________________________________________________
Bool_t TFileInfo::SetCurrentUrl(TUrl *url)
{
   // Set 'url' as current URL, if in the list
   // Return kFALSE if not in the list

   if (url && fUrlList && fUrlList->FindObject(url)) {
      fCurrentUrl = url;
      return kTRUE;
   }
   return kFALSE;
}

//______________________________________________________________________________
Bool_t TFileInfo::AddMetaData(TObject *meta)
{
   // Add's a meta data object to the file info object. The object will be
   // adopted by the TFileInfo and should not be deleted by the user.
   // Typically objects of class TFileInfoMeta or derivatives should be added,
   // but any class is accepted.
   // Returns kTRUE if successful, kFALSE otherwise.

   if (meta) {
      if (!fMetaDataList) {
         fMetaDataList = new TList;
         fMetaDataList->SetOwner();
      }
      fMetaDataList->Add(meta);
      return kTRUE;
   }
   return kFALSE;
}

//______________________________________________________________________________
Bool_t TFileInfo::RemoveMetaData(const char *meta)
{
   // Remove the metadata obeject. If meta is 0 remove all meta data objects.
   // Returns kTRUE if successful, kFALSE otherwise.

   if (fMetaDataList) {
      if (!meta || strlen(meta) <= 0) {
         SafeDelete(fMetaDataList);
         return kTRUE;
      } else {
         TObject *o = fMetaDataList->FindObject(meta);
         if (o) {
            fMetaDataList->Remove(o);
            delete o;
            return kTRUE;
         }
      }
   }
   return kFALSE;
}

//______________________________________________________________________________
TFileInfoMeta *TFileInfo::GetMetaData(const char *meta) const
{
   // Get meta data object with specified name. If meta is 0
   // get first meta data object. Returns 0 in case no
   // suitable meta data object is found.

   if (fMetaDataList) {
      TFileInfoMeta *m;
      if (!meta || strlen(meta) <= 0)
         m = (TFileInfoMeta *) fMetaDataList->First();
      else
         m = (TFileInfoMeta *) fMetaDataList->FindObject(meta);
      if (m) {
         TClass *c = m->IsA();
         return (c && c->InheritsFrom(TFileInfoMeta::Class())) ? m : 0;
      }
   }
   return 0;
}

//______________________________________________________________________________
Int_t TFileInfo::Compare(const TObject *obj) const
{
   // Compare TFileInfo object by their first urls.

   Int_t rc = 0;
   if (TestBit(TFileInfo::kSortWithIndex)) {
      const TFileInfo *fi = dynamic_cast<const TFileInfo *>(obj);
      if (!fi) {
         rc = -1;
      } else {
         if (fIndex < fi->fIndex) {
            rc = -1;
         } else if (fIndex > fi->fIndex) {
            rc = 1;
         }
      }
   } else {
      if (this == obj) { 
         rc = 0;
      } else if (TFileInfo::Class() != obj->IsA()) {
         rc = -1;
      } else {
         rc = (GetFirstUrl()->Compare(((TFileInfo*)obj)->GetFirstUrl()));
      }
   }
   // Done
   return rc;
}

//______________________________________________________________________________
void TFileInfo::Print(Option_t *option) const
{
   // Print information about this object. If option contains 'L' a long listing
   // will be printed (on multiple lines). Otherwise one line is printed with the
   // following information: current url, default tree name|class|entries, md5;
   // the default tree name is passed via the option ("T:<default_tree>") by the
   // owning TFileCollection.

   if (GetMD5()) GetMD5()->Final();
   TString opt(option);
   if (opt.Contains("L", TString::kIgnoreCase)) {

      Printf("UUID: %s\nMD5:  %s\nSize: %lld\nIndex: %d",
             GetUUID() ? GetUUID()->AsString() : "undef",
             GetMD5() ? GetMD5()->AsString() : "undef",
             GetSize(), GetIndex());

      TIter next(fUrlList);
      TUrl *u;
      Printf(" === URLs ===");
      while ((u = (TUrl*)next()))
         Printf(" URL:  %s", u->GetUrl());

      TIter nextm(fMetaDataList);
      TObject *m = 0;   // can be any TObject not only TFileInfoMeta
      while ((m = (TObject*) nextm())) {
         Printf(" === Meta Data Object ===");
         m->Print();
      }
   } else {
      TString out("current-url-undef -|-|- md5-undef");
      if (GetCurrentUrl()) out.ReplaceAll("current-url-undef", GetCurrentUrl()->GetUrl());
      // Extract the default tree name, if any
      TString deft;
      if (opt.Contains("T:")) deft = opt(opt.Index("T:")+2, opt.Length());
      TFileInfoMeta *meta = 0;
      if (fMetaDataList && !deft.IsNull()) meta = (TFileInfoMeta *) fMetaDataList->FindObject(deft);
      if (fMetaDataList && !meta) meta = (TFileInfoMeta *) fMetaDataList->First();
      if (meta) out.ReplaceAll("-|-|-", TString::Format("%s|%s|%lld", meta->GetName(),
                                        meta->GetTitle(), meta->GetEntries()));
      if (GetMD5())
         out.ReplaceAll("md5-undef", TString::Format("%s", GetMD5()->AsString()));
      Printf("%s", out.Data());
   }
}


//______________________________________________________________________________
TFileInfoMeta::TFileInfoMeta(const char *objPath, const char *objClass,
                             Long64_t entries, Long64_t first, Long64_t last,
                             Long64_t totbytes, Long64_t zipbytes)
              : TNamed(objPath, objClass), fEntries(entries), fFirst(first),
                fLast(last), fTotBytes(totbytes), fZipBytes(zipbytes)
{
   // Create file meta data object.

   TString p = objPath;
   if (!p.BeginsWith("/")) {
      p.Prepend("/");
      SetName(p);
   }

   TClass *c = TClass::GetClass(objClass);
   fIsTree = (c && c->InheritsFrom("TTree")) ? kTRUE : kFALSE;
   ResetBit(TFileInfoMeta::kExternal);
}

//______________________________________________________________________________
TFileInfoMeta::TFileInfoMeta(const char *objPath, const char *objDir,
                             const char *objClass, Long64_t entries,
                             Long64_t first, Long64_t last,
                             Long64_t totbytes, Long64_t zipbytes)
              : TNamed(objPath, objClass), fEntries(entries), fFirst(first),
                fLast(last), fTotBytes(totbytes), fZipBytes(zipbytes)
{
   // Create file meta data object.

   TString sdir = objDir;
   if (!sdir.BeginsWith("/"))
      sdir.Prepend("/");
   if (!sdir.EndsWith("/"))
      sdir += "/";
   sdir += objPath;
   SetName(sdir);

   TClass *c = TClass::GetClass(objClass);
   fIsTree = (c && c->InheritsFrom("TTree")) ? kTRUE : kFALSE;
   ResetBit(TFileInfoMeta::kExternal);
}

//______________________________________________________________________________
TFileInfoMeta::TFileInfoMeta(const TFileInfoMeta &m)
              : TNamed(m.GetName(), m.GetTitle())
{
   // Copy constructor

   fEntries = m.fEntries;
   fFirst = m.fFirst;
   fLast = m.fLast;
   fIsTree = m.fIsTree;
   fTotBytes = m.fTotBytes;
   fZipBytes = m.fZipBytes;
   ResetBit(TFileInfoMeta::kExternal);
   if (m.TestBit(TFileInfoMeta::kExternal)) SetBit(TFileInfoMeta::kExternal);
}

//______________________________________________________________________________
const char *TFileInfoMeta::GetDirectory() const
{
   // Get the object's directory in the ROOT file.

   return gSystem->DirName(GetName());
}

//______________________________________________________________________________
const char *TFileInfoMeta::GetObject() const
{
   // Get the object name, with path stripped off. For full path
   // use GetName().

   return gSystem->BaseName(GetName());
}

//______________________________________________________________________________
void TFileInfoMeta::Print(Option_t * /* option */) const
{
   // Print information about this object.

   Printf(" Name:    %s\n Class:   %s\n Entries: %lld\n"
          " First:   %lld\n Last:    %lld",
          fName.Data(), fTitle.Data(), fEntries, fFirst, fLast);
}
 TFileInfo.cxx:1
 TFileInfo.cxx:2
 TFileInfo.cxx:3
 TFileInfo.cxx:4
 TFileInfo.cxx:5
 TFileInfo.cxx:6
 TFileInfo.cxx:7
 TFileInfo.cxx:8
 TFileInfo.cxx:9
 TFileInfo.cxx:10
 TFileInfo.cxx:11
 TFileInfo.cxx:12
 TFileInfo.cxx:13
 TFileInfo.cxx:14
 TFileInfo.cxx:15
 TFileInfo.cxx:16
 TFileInfo.cxx:17
 TFileInfo.cxx:18
 TFileInfo.cxx:19
 TFileInfo.cxx:20
 TFileInfo.cxx:21
 TFileInfo.cxx:22
 TFileInfo.cxx:23
 TFileInfo.cxx:24
 TFileInfo.cxx:25
 TFileInfo.cxx:26
 TFileInfo.cxx:27
 TFileInfo.cxx:28
 TFileInfo.cxx:29
 TFileInfo.cxx:30
 TFileInfo.cxx:31
 TFileInfo.cxx:32
 TFileInfo.cxx:33
 TFileInfo.cxx:34
 TFileInfo.cxx:35
 TFileInfo.cxx:36
 TFileInfo.cxx:37
 TFileInfo.cxx:38
 TFileInfo.cxx:39
 TFileInfo.cxx:40
 TFileInfo.cxx:41
 TFileInfo.cxx:42
 TFileInfo.cxx:43
 TFileInfo.cxx:44
 TFileInfo.cxx:45
 TFileInfo.cxx:46
 TFileInfo.cxx:47
 TFileInfo.cxx:48
 TFileInfo.cxx:49
 TFileInfo.cxx:50
 TFileInfo.cxx:51
 TFileInfo.cxx:52
 TFileInfo.cxx:53
 TFileInfo.cxx:54
 TFileInfo.cxx:55
 TFileInfo.cxx:56
 TFileInfo.cxx:57
 TFileInfo.cxx:58
 TFileInfo.cxx:59
 TFileInfo.cxx:60
 TFileInfo.cxx:61
 TFileInfo.cxx:62
 TFileInfo.cxx:63
 TFileInfo.cxx:64
 TFileInfo.cxx:65
 TFileInfo.cxx:66
 TFileInfo.cxx:67
 TFileInfo.cxx:68
 TFileInfo.cxx:69
 TFileInfo.cxx:70
 TFileInfo.cxx:71
 TFileInfo.cxx:72
 TFileInfo.cxx:73
 TFileInfo.cxx:74
 TFileInfo.cxx:75
 TFileInfo.cxx:76
 TFileInfo.cxx:77
 TFileInfo.cxx:78
 TFileInfo.cxx:79
 TFileInfo.cxx:80
 TFileInfo.cxx:81
 TFileInfo.cxx:82
 TFileInfo.cxx:83
 TFileInfo.cxx:84
 TFileInfo.cxx:85
 TFileInfo.cxx:86
 TFileInfo.cxx:87
 TFileInfo.cxx:88
 TFileInfo.cxx:89
 TFileInfo.cxx:90
 TFileInfo.cxx:91
 TFileInfo.cxx:92
 TFileInfo.cxx:93
 TFileInfo.cxx:94
 TFileInfo.cxx:95
 TFileInfo.cxx:96
 TFileInfo.cxx:97
 TFileInfo.cxx:98
 TFileInfo.cxx:99
 TFileInfo.cxx:100
 TFileInfo.cxx:101
 TFileInfo.cxx:102
 TFileInfo.cxx:103
 TFileInfo.cxx:104
 TFileInfo.cxx:105
 TFileInfo.cxx:106
 TFileInfo.cxx:107
 TFileInfo.cxx:108
 TFileInfo.cxx:109
 TFileInfo.cxx:110
 TFileInfo.cxx:111
 TFileInfo.cxx:112
 TFileInfo.cxx:113
 TFileInfo.cxx:114
 TFileInfo.cxx:115
 TFileInfo.cxx:116
 TFileInfo.cxx:117
 TFileInfo.cxx:118
 TFileInfo.cxx:119
 TFileInfo.cxx:120
 TFileInfo.cxx:121
 TFileInfo.cxx:122
 TFileInfo.cxx:123
 TFileInfo.cxx:124
 TFileInfo.cxx:125
 TFileInfo.cxx:126
 TFileInfo.cxx:127
 TFileInfo.cxx:128
 TFileInfo.cxx:129
 TFileInfo.cxx:130
 TFileInfo.cxx:131
 TFileInfo.cxx:132
 TFileInfo.cxx:133
 TFileInfo.cxx:134
 TFileInfo.cxx:135
 TFileInfo.cxx:136
 TFileInfo.cxx:137
 TFileInfo.cxx:138
 TFileInfo.cxx:139
 TFileInfo.cxx:140
 TFileInfo.cxx:141
 TFileInfo.cxx:142
 TFileInfo.cxx:143
 TFileInfo.cxx:144
 TFileInfo.cxx:145
 TFileInfo.cxx:146
 TFileInfo.cxx:147
 TFileInfo.cxx:148
 TFileInfo.cxx:149
 TFileInfo.cxx:150
 TFileInfo.cxx:151
 TFileInfo.cxx:152
 TFileInfo.cxx:153
 TFileInfo.cxx:154
 TFileInfo.cxx:155
 TFileInfo.cxx:156
 TFileInfo.cxx:157
 TFileInfo.cxx:158
 TFileInfo.cxx:159
 TFileInfo.cxx:160
 TFileInfo.cxx:161
 TFileInfo.cxx:162
 TFileInfo.cxx:163
 TFileInfo.cxx:164
 TFileInfo.cxx:165
 TFileInfo.cxx:166
 TFileInfo.cxx:167
 TFileInfo.cxx:168
 TFileInfo.cxx:169
 TFileInfo.cxx:170
 TFileInfo.cxx:171
 TFileInfo.cxx:172
 TFileInfo.cxx:173
 TFileInfo.cxx:174
 TFileInfo.cxx:175
 TFileInfo.cxx:176
 TFileInfo.cxx:177
 TFileInfo.cxx:178
 TFileInfo.cxx:179
 TFileInfo.cxx:180
 TFileInfo.cxx:181
 TFileInfo.cxx:182
 TFileInfo.cxx:183
 TFileInfo.cxx:184
 TFileInfo.cxx:185
 TFileInfo.cxx:186
 TFileInfo.cxx:187
 TFileInfo.cxx:188
 TFileInfo.cxx:189
 TFileInfo.cxx:190
 TFileInfo.cxx:191
 TFileInfo.cxx:192
 TFileInfo.cxx:193
 TFileInfo.cxx:194
 TFileInfo.cxx:195
 TFileInfo.cxx:196
 TFileInfo.cxx:197
 TFileInfo.cxx:198
 TFileInfo.cxx:199
 TFileInfo.cxx:200
 TFileInfo.cxx:201
 TFileInfo.cxx:202
 TFileInfo.cxx:203
 TFileInfo.cxx:204
 TFileInfo.cxx:205
 TFileInfo.cxx:206
 TFileInfo.cxx:207
 TFileInfo.cxx:208
 TFileInfo.cxx:209
 TFileInfo.cxx:210
 TFileInfo.cxx:211
 TFileInfo.cxx:212
 TFileInfo.cxx:213
 TFileInfo.cxx:214
 TFileInfo.cxx:215
 TFileInfo.cxx:216
 TFileInfo.cxx:217
 TFileInfo.cxx:218
 TFileInfo.cxx:219
 TFileInfo.cxx:220
 TFileInfo.cxx:221
 TFileInfo.cxx:222
 TFileInfo.cxx:223
 TFileInfo.cxx:224
 TFileInfo.cxx:225
 TFileInfo.cxx:226
 TFileInfo.cxx:227
 TFileInfo.cxx:228
 TFileInfo.cxx:229
 TFileInfo.cxx:230
 TFileInfo.cxx:231
 TFileInfo.cxx:232
 TFileInfo.cxx:233
 TFileInfo.cxx:234
 TFileInfo.cxx:235
 TFileInfo.cxx:236
 TFileInfo.cxx:237
 TFileInfo.cxx:238
 TFileInfo.cxx:239
 TFileInfo.cxx:240
 TFileInfo.cxx:241
 TFileInfo.cxx:242
 TFileInfo.cxx:243
 TFileInfo.cxx:244
 TFileInfo.cxx:245
 TFileInfo.cxx:246
 TFileInfo.cxx:247
 TFileInfo.cxx:248
 TFileInfo.cxx:249
 TFileInfo.cxx:250
 TFileInfo.cxx:251
 TFileInfo.cxx:252
 TFileInfo.cxx:253
 TFileInfo.cxx:254
 TFileInfo.cxx:255
 TFileInfo.cxx:256
 TFileInfo.cxx:257
 TFileInfo.cxx:258
 TFileInfo.cxx:259
 TFileInfo.cxx:260
 TFileInfo.cxx:261
 TFileInfo.cxx:262
 TFileInfo.cxx:263
 TFileInfo.cxx:264
 TFileInfo.cxx:265
 TFileInfo.cxx:266
 TFileInfo.cxx:267
 TFileInfo.cxx:268
 TFileInfo.cxx:269
 TFileInfo.cxx:270
 TFileInfo.cxx:271
 TFileInfo.cxx:272
 TFileInfo.cxx:273
 TFileInfo.cxx:274
 TFileInfo.cxx:275
 TFileInfo.cxx:276
 TFileInfo.cxx:277
 TFileInfo.cxx:278
 TFileInfo.cxx:279
 TFileInfo.cxx:280
 TFileInfo.cxx:281
 TFileInfo.cxx:282
 TFileInfo.cxx:283
 TFileInfo.cxx:284
 TFileInfo.cxx:285
 TFileInfo.cxx:286
 TFileInfo.cxx:287
 TFileInfo.cxx:288
 TFileInfo.cxx:289
 TFileInfo.cxx:290
 TFileInfo.cxx:291
 TFileInfo.cxx:292
 TFileInfo.cxx:293
 TFileInfo.cxx:294
 TFileInfo.cxx:295
 TFileInfo.cxx:296
 TFileInfo.cxx:297
 TFileInfo.cxx:298
 TFileInfo.cxx:299
 TFileInfo.cxx:300
 TFileInfo.cxx:301
 TFileInfo.cxx:302
 TFileInfo.cxx:303
 TFileInfo.cxx:304
 TFileInfo.cxx:305
 TFileInfo.cxx:306
 TFileInfo.cxx:307
 TFileInfo.cxx:308
 TFileInfo.cxx:309
 TFileInfo.cxx:310
 TFileInfo.cxx:311
 TFileInfo.cxx:312
 TFileInfo.cxx:313
 TFileInfo.cxx:314
 TFileInfo.cxx:315
 TFileInfo.cxx:316
 TFileInfo.cxx:317
 TFileInfo.cxx:318
 TFileInfo.cxx:319
 TFileInfo.cxx:320
 TFileInfo.cxx:321
 TFileInfo.cxx:322
 TFileInfo.cxx:323
 TFileInfo.cxx:324
 TFileInfo.cxx:325
 TFileInfo.cxx:326
 TFileInfo.cxx:327
 TFileInfo.cxx:328
 TFileInfo.cxx:329
 TFileInfo.cxx:330
 TFileInfo.cxx:331
 TFileInfo.cxx:332
 TFileInfo.cxx:333
 TFileInfo.cxx:334
 TFileInfo.cxx:335
 TFileInfo.cxx:336
 TFileInfo.cxx:337
 TFileInfo.cxx:338
 TFileInfo.cxx:339
 TFileInfo.cxx:340
 TFileInfo.cxx:341
 TFileInfo.cxx:342
 TFileInfo.cxx:343
 TFileInfo.cxx:344
 TFileInfo.cxx:345
 TFileInfo.cxx:346
 TFileInfo.cxx:347
 TFileInfo.cxx:348
 TFileInfo.cxx:349
 TFileInfo.cxx:350
 TFileInfo.cxx:351
 TFileInfo.cxx:352
 TFileInfo.cxx:353
 TFileInfo.cxx:354
 TFileInfo.cxx:355
 TFileInfo.cxx:356
 TFileInfo.cxx:357
 TFileInfo.cxx:358
 TFileInfo.cxx:359
 TFileInfo.cxx:360
 TFileInfo.cxx:361
 TFileInfo.cxx:362
 TFileInfo.cxx:363
 TFileInfo.cxx:364
 TFileInfo.cxx:365
 TFileInfo.cxx:366
 TFileInfo.cxx:367
 TFileInfo.cxx:368
 TFileInfo.cxx:369
 TFileInfo.cxx:370
 TFileInfo.cxx:371
 TFileInfo.cxx:372
 TFileInfo.cxx:373
 TFileInfo.cxx:374
 TFileInfo.cxx:375
 TFileInfo.cxx:376
 TFileInfo.cxx:377
 TFileInfo.cxx:378
 TFileInfo.cxx:379
 TFileInfo.cxx:380
 TFileInfo.cxx:381
 TFileInfo.cxx:382
 TFileInfo.cxx:383
 TFileInfo.cxx:384
 TFileInfo.cxx:385
 TFileInfo.cxx:386
 TFileInfo.cxx:387
 TFileInfo.cxx:388
 TFileInfo.cxx:389
 TFileInfo.cxx:390
 TFileInfo.cxx:391
 TFileInfo.cxx:392
 TFileInfo.cxx:393
 TFileInfo.cxx:394
 TFileInfo.cxx:395
 TFileInfo.cxx:396
 TFileInfo.cxx:397
 TFileInfo.cxx:398
 TFileInfo.cxx:399
 TFileInfo.cxx:400
 TFileInfo.cxx:401
 TFileInfo.cxx:402
 TFileInfo.cxx:403
 TFileInfo.cxx:404
 TFileInfo.cxx:405
 TFileInfo.cxx:406
 TFileInfo.cxx:407
 TFileInfo.cxx:408
 TFileInfo.cxx:409
 TFileInfo.cxx:410
 TFileInfo.cxx:411
 TFileInfo.cxx:412
 TFileInfo.cxx:413
 TFileInfo.cxx:414
 TFileInfo.cxx:415
 TFileInfo.cxx:416
 TFileInfo.cxx:417
 TFileInfo.cxx:418
 TFileInfo.cxx:419
 TFileInfo.cxx:420
 TFileInfo.cxx:421
 TFileInfo.cxx:422
 TFileInfo.cxx:423
 TFileInfo.cxx:424
 TFileInfo.cxx:425
 TFileInfo.cxx:426
 TFileInfo.cxx:427
 TFileInfo.cxx:428
 TFileInfo.cxx:429
 TFileInfo.cxx:430
 TFileInfo.cxx:431
 TFileInfo.cxx:432
 TFileInfo.cxx:433
 TFileInfo.cxx:434
 TFileInfo.cxx:435
 TFileInfo.cxx:436
 TFileInfo.cxx:437
 TFileInfo.cxx:438
 TFileInfo.cxx:439
 TFileInfo.cxx:440
 TFileInfo.cxx:441
 TFileInfo.cxx:442
 TFileInfo.cxx:443
 TFileInfo.cxx:444
 TFileInfo.cxx:445
 TFileInfo.cxx:446
 TFileInfo.cxx:447
 TFileInfo.cxx:448
 TFileInfo.cxx:449
 TFileInfo.cxx:450
 TFileInfo.cxx:451
 TFileInfo.cxx:452
 TFileInfo.cxx:453
 TFileInfo.cxx:454
 TFileInfo.cxx:455
 TFileInfo.cxx:456
 TFileInfo.cxx:457
 TFileInfo.cxx:458
 TFileInfo.cxx:459
 TFileInfo.cxx:460
 TFileInfo.cxx:461
 TFileInfo.cxx:462
 TFileInfo.cxx:463
 TFileInfo.cxx:464
 TFileInfo.cxx:465
 TFileInfo.cxx:466
 TFileInfo.cxx:467
 TFileInfo.cxx:468
 TFileInfo.cxx:469
 TFileInfo.cxx:470
 TFileInfo.cxx:471
 TFileInfo.cxx:472
 TFileInfo.cxx:473
 TFileInfo.cxx:474
 TFileInfo.cxx:475
 TFileInfo.cxx:476
 TFileInfo.cxx:477
 TFileInfo.cxx:478
 TFileInfo.cxx:479
 TFileInfo.cxx:480
 TFileInfo.cxx:481
 TFileInfo.cxx:482
 TFileInfo.cxx:483
 TFileInfo.cxx:484
 TFileInfo.cxx:485
 TFileInfo.cxx:486
 TFileInfo.cxx:487
 TFileInfo.cxx:488
 TFileInfo.cxx:489
 TFileInfo.cxx:490
 TFileInfo.cxx:491
 TFileInfo.cxx:492
 TFileInfo.cxx:493
 TFileInfo.cxx:494
 TFileInfo.cxx:495
 TFileInfo.cxx:496
 TFileInfo.cxx:497
 TFileInfo.cxx:498
 TFileInfo.cxx:499
 TFileInfo.cxx:500
 TFileInfo.cxx:501
 TFileInfo.cxx:502
 TFileInfo.cxx:503
 TFileInfo.cxx:504
 TFileInfo.cxx:505
 TFileInfo.cxx:506
 TFileInfo.cxx:507
 TFileInfo.cxx:508
 TFileInfo.cxx:509
 TFileInfo.cxx:510
 TFileInfo.cxx:511
 TFileInfo.cxx:512
 TFileInfo.cxx:513
 TFileInfo.cxx:514
 TFileInfo.cxx:515
 TFileInfo.cxx:516
 TFileInfo.cxx:517
 TFileInfo.cxx:518
 TFileInfo.cxx:519
 TFileInfo.cxx:520
 TFileInfo.cxx:521
 TFileInfo.cxx:522
 TFileInfo.cxx:523
 TFileInfo.cxx:524
 TFileInfo.cxx:525
 TFileInfo.cxx:526
 TFileInfo.cxx:527
 TFileInfo.cxx:528
 TFileInfo.cxx:529
 TFileInfo.cxx:530
 TFileInfo.cxx:531
 TFileInfo.cxx:532
 TFileInfo.cxx:533
 TFileInfo.cxx:534
 TFileInfo.cxx:535
 TFileInfo.cxx:536
 TFileInfo.cxx:537
 TFileInfo.cxx:538
 TFileInfo.cxx:539
 TFileInfo.cxx:540
 TFileInfo.cxx:541
 TFileInfo.cxx:542
 TFileInfo.cxx:543
 TFileInfo.cxx:544
 TFileInfo.cxx:545
 TFileInfo.cxx:546
 TFileInfo.cxx:547
 TFileInfo.cxx:548
 TFileInfo.cxx:549
 TFileInfo.cxx:550
 TFileInfo.cxx:551
 TFileInfo.cxx:552
 TFileInfo.cxx:553
 TFileInfo.cxx:554
 TFileInfo.cxx:555
 TFileInfo.cxx:556
 TFileInfo.cxx:557
 TFileInfo.cxx:558
 TFileInfo.cxx:559
 TFileInfo.cxx:560
 TFileInfo.cxx:561
 TFileInfo.cxx:562
 TFileInfo.cxx:563
 TFileInfo.cxx:564
 TFileInfo.cxx:565
 TFileInfo.cxx:566
 TFileInfo.cxx:567
 TFileInfo.cxx:568
 TFileInfo.cxx:569
 TFileInfo.cxx:570
 TFileInfo.cxx:571
 TFileInfo.cxx:572
 TFileInfo.cxx:573
 TFileInfo.cxx:574
 TFileInfo.cxx:575
 TFileInfo.cxx:576
 TFileInfo.cxx:577
 TFileInfo.cxx:578
 TFileInfo.cxx:579
 TFileInfo.cxx:580
 TFileInfo.cxx:581
 TFileInfo.cxx:582
 TFileInfo.cxx:583
 TFileInfo.cxx:584
 TFileInfo.cxx:585
 TFileInfo.cxx:586
 TFileInfo.cxx:587
 TFileInfo.cxx:588
 TFileInfo.cxx:589
 TFileInfo.cxx:590
 TFileInfo.cxx:591
 TFileInfo.cxx:592
 TFileInfo.cxx:593
 TFileInfo.cxx:594
 TFileInfo.cxx:595
 TFileInfo.cxx:596
 TFileInfo.cxx:597
 TFileInfo.cxx:598
 TFileInfo.cxx:599
 TFileInfo.cxx:600
 TFileInfo.cxx:601
 TFileInfo.cxx:602
 TFileInfo.cxx:603