ROOT logo
//_HADES_CLASS_DESCRIPTION
/////////////////////////////////////////////////////////////
//
//  HRich700Trb3Unpacker
//
//  Class for unpacking TRB3 data and filling
//    the Start2 Raw category
//
//  Basic subevent decoding and eventual TDC corrections are
//  performed by decode function in the base class
//  see: /base/datasource/htrb3unpacker.h
//
//  JoF (j.foertsch@uni-wuppertal.de) updated 18-Dec-2018
/////////////////////////////////////////////////////////////

#include "hades.h"
#include "hcategory.h"
#include "hdebug.h"
#include "hevent.h"
#include "heventheader.h"
#include "hldsource.h"
#include "hldsubevt.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hrichdetector.h"
#include "hrich700raw.h"
#include "hrichcal.h"
#include "hrichcalsim.h"

#include "hrich700trb3unpacker.h"
#include "hrich700trb3lookup.h"
#include "hrich700thresholdpar.h"
#include "hrich700digipar.h"



#include "htrbnetunpacker.h"
#include "richdef.h"


#include <iostream>


using namespace std;

ClassImp(HRich700Trb3Unpacker)


// #define RICH700_NO_TIME_CUT 1


Bool_t HRich700Trb3Unpacker::fHasPrintedTDC = kFALSE;

HRich700Trb3Unpacker::HRich700Trb3Unpacker(vector<UInt_t> &ids)
    : HTrb3TdcUnpacker(ids)
{
  // constructor

  setHUBId(0x9000); // TODO : how to configure the hub and cts ids here?
  setCTSId(0xC001);
  fCalCat = NULL;
  pRawCat = NULL;
  fTimeRef = kTRUE;
  fLookup = NULL;
  fThresholds = NULL;
  fDoTimeCut = kFALSE;
  fDoToTCut  = kTRUE;
  fFillCal   = kFALSE;

}

Bool_t HRich700Trb3Unpacker::init(void)
{
  // creates the raw category and gets the pointer to the TRB3 lookup table

  HRichDetector* det = (HRichDetector*)gHades->getSetup()->getDetector("Rich");
  if (!det) {
    Error("init", "No Rich Detector found.");
    return kFALSE;
  }

  pRawCat = gHades->getCurrentEvent()->getCategory(catRich700Raw);
  if (NULL == pRawCat) {
    pRawCat = det->buildCategory(catRich700Raw);
    if (NULL == pRawCat) {
      Error("init", "Pointer to HRich700Raw category is NULL");
      return kFALSE;
    }
    else {
      gHades->getCurrentEvent()->addCategory(catRich700Raw, pRawCat, "Rich");
    }
  }

  if(fFillCal){
      fCalCat = gHades->getCurrentEvent()->getCategory(catRichCal);
      if (NULL == fCalCat) {

	  if(gHades->getEmbeddingMode() == 0) {
	      fCalCat = det->buildCategory(catRichCal);
	      if (NULL == fCalCat) {
		  Error("init", "Pointer to HRichCal category is NULL");
		  return kFALSE;
	      } else {
		  gHades->getCurrentEvent()->addCategory(catRichCal, fCalCat, "Rich");
	      }
	  } else {

	      fCalCat = det->buildMatrixCat("HRichCalSim", 1);
	      if (NULL == fCalCat) {
		  Error("init", "Can not build output category catRichCalSim, returning...");
		  return kFALSE;
	      } else {
		  gHades->getCurrentEvent()->addCategory(catRichCal, fCalCat, "Rich");
	      }
	  }

      }
  }
  fRawLoc.set(2, 0, 0);
  fCalLoc.set(3, 0, 0,0);

  fLookup = (HRich700Trb3Lookup*)(gHades->getRuntimeDb()
      ->getContainer("Rich700Trb3Lookup"));
  if (!fLookup) {
    Error("init", "No Pointer to parameter container Rich700Trb3Lookup.");
    return kFALSE;
  }


  // here second parameter to supress hits outside time and tot cuts per channel!
  fThresholds = (HRich700ThresholdPar*)(gHades->getRuntimeDb()->getContainer("Rich700ThresholdPar"));
  if (!fThresholds) {
      Error("init", "No Pointer to parameter container Rich700ThresholdPar.");
      return kFALSE;
  }

  fDigiPar = (HRich700DigiPar*)(gHades->getRuntimeDb()
      ->getContainer("Rich700DigiPar"));
  if (!fDigiPar) {
    Error("init", "No Pointer to parameter container Rich700DigiPar.");
    return kFALSE;
  }
  ////////////////////////////////////////////////////////////////
  ///////////////////////////////////////////////////////////////

  if (NULL == trbNetUnpacker) {
    if (gHades->getDataSource()) {
      HDataSource* source = gHades->getDataSource();
      if (source->InheritsFrom("HldSource")) {
        trbNetUnpacker = ((HldSource *)gHades->getDataSource())
            ->getTrbNetUnpacker();
      }
      else {
      Warning("init", "DataSource not inherited from HldSource! trbNetUnpacker == 0 ");
      }
    }
    else {
      Warning("init", "Could not retrieve DataSource! trbNetUnpacker == 0 ");
    }
  }
  if (!trbNetUnpacker->init()) {
    Error("init", "Failed to initialize HTrbNetUnpacker!");
    return kFALSE;
  }


  return kTRUE;
}

// Called in the beginning of each run, used here to initialize TDC unpacker
// if TDCs processors are not yet created, use parameter to instantiate them
// if auto register TDC feature is used in setup of unpackers (by setting
// setMinAddress()+setMaxAddress() manually)
Bool_t HRich700Trb3Unpacker::reinit(void)
{
  // configure the tdcs only the first time we come here:
  if (numTDC() == 0) {
    if (fMinAddress == 0 && fMaxAddress == 0) {

      // here evaluate which subevents are configured in lookup table:
      Int_t numslots = fLookup->getSize();
      fLookup->resetTdcIterator();
      for (Int_t slot = 0; slot < numslots; ++slot) {
        Int_t trbnetaddress = fLookup->getNextTdcAddress();
        if (trbnetaddress) {
          Int_t tindex=addTDC(trbnetaddress, RICH700_MAX_TDCCHANNELS+1);
          if(!fHasPrintedTDC) {
            Info("reinit",
                "Added TDC 0x%04x with %d channels from HRich700Trb3Lookup to map index %d",
                trbnetaddress, RICH700_MAX_TDCCHANNELS+1,tindex);
          }
        }
      }

      // here set the expected range for the automatic adding of TDC structures:
      setMinAddress(fLookup->getArrayOffset());
      setMaxAddress(fLookup->getArrayOffset() + fLookup->getSize());
      nCalSrc=3; // just in case this parameter will be used someday
      fUseTDCFromLookup = kTRUE; // do not use auto register if set in
      fHasPrintedTDC = kTRUE;
    }
    else {
      Info("reinit",
          "TDCs will be added in auto register mode between min address 0x%04x and max address 0x%04x!"
          ,fMinAddress,fMaxAddress);
    }
  }
  // we do not call reinit of superclass, since we do not use tdc calibration parameters in hydra anymore!
  return kTRUE;
}


Int_t HRich700Trb3Unpacker::execute(void)
{
  //calibration event
  if (gHades->isCalibration()) {
    return 1;
  }
  //scaler event
  if (gHades->getCurrentEvent()->getHeader()->getId() == 0xe) {
    return 1;
  }

  // if there is no data, do not try to analyze it
  // pSubEvt - make sure that there is something for decoding
  if (!pSubEvt){ return 1; }

  Int_t nEvt = gHades->getCurrentEvent()->getHeader()->getEventSeqNumber();

  // decodes the subevent and fill arrays, see: htrb3unpacker.h
  if (!decode()) {
    Error("decode", "subsubevent decoding failed!!! Evt Nr : %i SubEvtId: %x"
        , nEvt, getSubEvtId());
    return -1;
  }


  // correct for reference time here!
  if (fTimeRef) {
#ifdef USE_FILLED_TDC
    for (UInt_t n = 0; n < numFilledTDC(); ++n) {
      HTrb3TdcUnpacker::TDC* tdc = getFilledTDC(n);
#else
    for (UInt_t n = 0; n < numActiveTDC(); ++n) {
      HTrb3TdcUnpacker::TDC* tdc = getActiveTDC(n);
#endif
      if (debugFlag > 0) {
        Warning("execute", "JJJ try to correct reftime for tdc %04x, tdcindex:%d  Evt Nr : %i SubEvtId: %x",
            (UInt_t) tdc->getTrbAddr(), n, nEvt, getSubEvtId());
      }
       // JAM todo: may configure other reference channel than 0 here?
       if (!tdc->correctRefTimeCh(REFCHAN)) {
          if (debugFlag > 0) {
            Warning("execute", "time-correction for tdc %04x failed!!! Evt Nr : %i SubEvtId: %x",
                (UInt_t) tdc->getTrbAddr(), nEvt, getSubEvtId());
          }
       }
    }
  }

  if (debugFlag > 0) Warning("execute", "JJJJJ has cleared hits.");

  // now loop over all known tdcs
#ifdef USE_FILLED_TDC
  for (UInt_t ntdc = 0; ntdc < numFilledTDC(); ntdc++) {
    HTrb3TdcUnpacker::TDC* tdc = getFilledTDC(ntdc);
#else
  for (UInt_t ntdc = 0; ntdc < numActiveTDC(); ntdc++) {
    HTrb3TdcUnpacker::TDC* tdc = getActiveTDC(ntdc);
#endif
    // check the fLookup table
    HRich700Trb3LookupTdc *board = fLookup->getTdc(tdc->getTrbAddr());
    if (!board) {
      Warning("execute", "Evt Nr : %i  SubEvId: %x (%i) unpacked but TDC Board 0x%x not in lookup table",
          nEvt, getSubEvtId(), getSubEvtId(), tdc->getTrbAddr());
      continue;
    }
    if (debugFlag > 0){
      Warning("execute", "JJJJJ Evt Nr : %i  SubEvId: %x (%i) unpacking TDC Board 0x%x...",
          nEvt, getSubEvtId(), getSubEvtId(), tdc->getTrbAddr());
    }
    //cout<<"###############################################################"<<endl;
    // fill the raw category for RICH700 detector
#ifdef USE_FILLED_TDC
    for (UInt_t j = 0; j < tdc->chanList.size(); ++j) {
      UInt_t i = tdc->chanList[j];
      HTrb3TdcUnpacker::ChannelRec& theRecord = tdc->getCh(i);
#else
    for (UInt_t i = 0; i < tdc->numChannels(); ++i) {
      if(REFCHAN == i) { continue; }
      HTrb3TdcUnpacker::ChannelRec& theRecord = tdc->getCh(i);
      if(!theRecord.hasData) { continue; }
#endif
         // first check that tdc channel exists in lookup table at all
         HRich700Trb3LookupChan *chan = board->getChannel(i);
         if (chan==0){
            continue;
         }
         // than check that address in lookup-table is not empty
         chan->getAddress(fRawLoc[0], fRawLoc[1]); // pmt, pixel
         if (fRawLoc[0] < 0) {
            Warning("execute", "Skip  pmt=%i, pixel=%i", fRawLoc[0], fRawLoc[1] );
            continue;
         }
         // now the location identifier is ready. We use it to retrieve data element when we accept a hit.

         if (debugFlag > 1) Warning("execute", "JJJJ Processing catRich700Raw Slot for  pmt=%i, pixel=%i", fRawLoc[0], fRawLoc[1] );


         // JAM here get pixel thresholds from parameter container:
         Double_t tmin=0, tmax=1.0e-6, totmin=1e-9, totmax=1e-8; // units here seconds like in the trb3 unpacker messages!
         HRich700PixelThreshold* pthres =fThresholds->getObject(fRawLoc);
         if(pthres) {
            if(pthres->getFlag() != 0)
            {
               if (debugFlag > 0)
                  Warning("execute", "Skipping invalid pixel - pmt=%i, pixel=%ie",
                     fRawLoc[0], fRawLoc[1]);
               continue;
	    }

	    //JoF: As there can not be no time cut for the first LE, the read in parameters
	    // need to be discarded if no cut shall be applied
            tmin   = pthres->getT_Min(); // use  units ns from parameter container.
            tmax   = pthres->getT_Max();
            totmin = pthres->getTot_Min();
            totmax = pthres->getTot_Max();

	 }else{
            Error("execute()", "Can't get threshold parameter for  pmt=%i, pixel=%i, using precompileddefaults!", fRawLoc[0], fRawLoc[1]);
         }

         if (debugFlag > 1) Warning("execute", "JJJJ Record of channel %d has multiplicities -  rising:%d falling:%d \n",
                           i, (Int_t)theRecord.rising_mult, (Int_t) theRecord.falling_mult);

         Int_t loc[3] = {-1,-1,-1};
         fDigiPar->pmtIdPixelToColRowSec(fRawLoc[0],fRawLoc[1],loc[0],loc[1],loc[2],kFALSE);
         if(loc[0]<0)
            continue;

         UInt_t falling_it=0;
         for(UInt_t rising_it=0; rising_it<theRecord.rising_mult; ++rising_it){
            Double_t tm0 = theRecord.rising_tm[rising_it]*1e9;

	    if(fDoTimeCut && ( tm0<tmin || tm0>tmax )) { continue; }

	    if(falling_it>=theRecord.falling_mult) {
		addRawHit(tm0,0,0,loc[0],loc[1],loc[2],0b01);
	    }

	    for(;falling_it<theRecord.falling_mult;++falling_it){
               Double_t tm1 = theRecord.falling_tm[falling_it]*1e9;
               Double_t tot=tm1-tm0;

               if(tot<totmin){//JoF: This cut needs to stay outside of the '#ifndef', as it discards singular trailing-edges
                  addRawHit(0,tm1,tot,loc[0],loc[1],loc[2],0b10);
               }
	       else if(fDoToTCut && tot>totmax){
                  addRawHit(tm0,0,tot,loc[0],loc[1],loc[2],0b01);
                  break;
               }
	       //JoF: If the next rising edge is existing and this falling edge is after
	       // the next rising edge, the current rising edge is singular
               else if(!fDoToTCut && ( rising_it+1<theRecord.rising_mult && tot>(theRecord.rising_tm[rising_it+1]*1e9-tm0) ) ){
		   addRawHit(tm0,0,tot,loc[0],loc[1],loc[2],0b01);
		   break;
               }
	       else
	       {
                  addRawHit(tm0,tm1,tot,loc[0],loc[1],loc[2],0b11);
		  if(fFillCal) {
		      addCalHitCharge(loc[0],loc[1],loc[2],tm0,tot); //JoF: Here one could derive the charge of the hit from the ToT via ToTmin/max
		  }
		  falling_it++;
                  break;
               }
            }
         }
         //JoF: Finally iterate over all leftover falling edges
         for(;falling_it<theRecord.falling_mult;++falling_it){
            Double_t tm1 = theRecord.falling_tm[falling_it]*1e9;

	    if(fDoTimeCut && ( tm1<tmin || tm1>tmax )) { continue; }

	    addRawHit(0,tm1,0,loc[0],loc[1],loc[2],0b01);
         }
      }
   }
   return 1; // kTRUE
}



//////////////////// Some helper functions below: /////////////////////////////



Int_t HRich700Trb3Unpacker::addRawHit(Double_t t_leading, Double_t t_trailing,
				      Double_t tot, Int_t sec, Int_t col, Int_t row, UInt_t flag)
{
   HRich700Raw* raw =  static_cast<HRich700Raw*> (pRawCat->getObject(fRawLoc));
   if (!raw) {
      raw = (HRich700Raw *) pRawCat->getSlot(fRawLoc);
      if (raw) {
         raw = new (raw) HRich700Raw;
         raw->setAddress(fRawLoc[0], fRawLoc[1],sec,col,row);
      } else {

         if (debugFlag > 0)
         Warning("addRawHit()", "Can't get slot pmt=%i, pixel=%i",
            fRawLoc[0], fRawLoc[1]);
         return -1;
      }
   }
   raw->addHit(t_leading, t_trailing, tot, flag);
   if (debugFlag > 1)
      Warning("addRawHit",
         "JJJJ ADDING hit for pmt:%d pixel:%d tm0:%e tm1:%e tot:%e",
         fRawLoc[0], fRawLoc[1], t_leading, t_trailing, tot
      );
   return 0;
}

Int_t HRich700Trb3Unpacker::addCalHitCharge(Int_t sector, Int_t col, Int_t row,
					    Float_t time, Float_t tot)
{
   fCalLoc[0] = sector;
   fCalLoc[1] = row;
   fCalLoc[2] = col;

   // from old rich unpacker:
   // loc.setOffset(col);
   // loc.setIndex(1, row);
   // loc.setIndex(0, fDataWord.sector);
   //////////////


   if (debugFlag > 1)
   Warning("addCalHitCharge",
      "JJJJ ADDING cal hit for sector:%d row:%d col:%d ",
      fCalLoc[0], fCalLoc[1],  fCalLoc[2]);

   HRichCalSim* calsim = 0;
   HRichCal* cal = static_cast<HRichCal*>(fCalCat->getObject(fCalLoc));
   if (NULL == cal) {
      cal = static_cast<HRichCal*>(fCalCat->getSlot(fCalLoc));
      if (NULL != cal) {
	  // fill empty slot with new data instance:
	  if(gHades->getEmbeddingMode() != 0){
	      cal = new (cal) HRichCalSim;
	      calsim = static_cast<HRichCalSim*> (cal);
	      if(!calsim->checkTrackId(gHades->getEmbeddingRealTrackId())) calsim->addTrackId(gHades->getEmbeddingRealTrackId());
	  }  else {
	      cal = new (cal) HRichCal;
	  }

	  cal->setMult(0);
	  cal->setSector(fCalLoc[0]);
	  cal->setRow(fCalLoc[1]);
	  cal->setCol(fCalLoc[2]);
	  cal->setTime(time);
      } else {
	  if (debugFlag > 0)
	      Warning("addCalHit()",
		      "Can't get slot sector=%i, row=%i, col=%i", fCalLoc[0],
		      fCalLoc[1], fCalLoc[2]);
	  return -1;
      }
   }
   // now increment the "charge" field by another hit:
   cal->addToT(tot);
   cal->increaseMult();
   return 0;
}
 hrich700trb3unpacker.cc:1
 hrich700trb3unpacker.cc:2
 hrich700trb3unpacker.cc:3
 hrich700trb3unpacker.cc:4
 hrich700trb3unpacker.cc:5
 hrich700trb3unpacker.cc:6
 hrich700trb3unpacker.cc:7
 hrich700trb3unpacker.cc:8
 hrich700trb3unpacker.cc:9
 hrich700trb3unpacker.cc:10
 hrich700trb3unpacker.cc:11
 hrich700trb3unpacker.cc:12
 hrich700trb3unpacker.cc:13
 hrich700trb3unpacker.cc:14
 hrich700trb3unpacker.cc:15
 hrich700trb3unpacker.cc:16
 hrich700trb3unpacker.cc:17
 hrich700trb3unpacker.cc:18
 hrich700trb3unpacker.cc:19
 hrich700trb3unpacker.cc:20
 hrich700trb3unpacker.cc:21
 hrich700trb3unpacker.cc:22
 hrich700trb3unpacker.cc:23
 hrich700trb3unpacker.cc:24
 hrich700trb3unpacker.cc:25
 hrich700trb3unpacker.cc:26
 hrich700trb3unpacker.cc:27
 hrich700trb3unpacker.cc:28
 hrich700trb3unpacker.cc:29
 hrich700trb3unpacker.cc:30
 hrich700trb3unpacker.cc:31
 hrich700trb3unpacker.cc:32
 hrich700trb3unpacker.cc:33
 hrich700trb3unpacker.cc:34
 hrich700trb3unpacker.cc:35
 hrich700trb3unpacker.cc:36
 hrich700trb3unpacker.cc:37
 hrich700trb3unpacker.cc:38
 hrich700trb3unpacker.cc:39
 hrich700trb3unpacker.cc:40
 hrich700trb3unpacker.cc:41
 hrich700trb3unpacker.cc:42
 hrich700trb3unpacker.cc:43
 hrich700trb3unpacker.cc:44
 hrich700trb3unpacker.cc:45
 hrich700trb3unpacker.cc:46
 hrich700trb3unpacker.cc:47
 hrich700trb3unpacker.cc:48
 hrich700trb3unpacker.cc:49
 hrich700trb3unpacker.cc:50
 hrich700trb3unpacker.cc:51
 hrich700trb3unpacker.cc:52
 hrich700trb3unpacker.cc:53
 hrich700trb3unpacker.cc:54
 hrich700trb3unpacker.cc:55
 hrich700trb3unpacker.cc:56
 hrich700trb3unpacker.cc:57
 hrich700trb3unpacker.cc:58
 hrich700trb3unpacker.cc:59
 hrich700trb3unpacker.cc:60
 hrich700trb3unpacker.cc:61
 hrich700trb3unpacker.cc:62
 hrich700trb3unpacker.cc:63
 hrich700trb3unpacker.cc:64
 hrich700trb3unpacker.cc:65
 hrich700trb3unpacker.cc:66
 hrich700trb3unpacker.cc:67
 hrich700trb3unpacker.cc:68
 hrich700trb3unpacker.cc:69
 hrich700trb3unpacker.cc:70
 hrich700trb3unpacker.cc:71
 hrich700trb3unpacker.cc:72
 hrich700trb3unpacker.cc:73
 hrich700trb3unpacker.cc:74
 hrich700trb3unpacker.cc:75
 hrich700trb3unpacker.cc:76
 hrich700trb3unpacker.cc:77
 hrich700trb3unpacker.cc:78
 hrich700trb3unpacker.cc:79
 hrich700trb3unpacker.cc:80
 hrich700trb3unpacker.cc:81
 hrich700trb3unpacker.cc:82
 hrich700trb3unpacker.cc:83
 hrich700trb3unpacker.cc:84
 hrich700trb3unpacker.cc:85
 hrich700trb3unpacker.cc:86
 hrich700trb3unpacker.cc:87
 hrich700trb3unpacker.cc:88
 hrich700trb3unpacker.cc:89
 hrich700trb3unpacker.cc:90
 hrich700trb3unpacker.cc:91
 hrich700trb3unpacker.cc:92
 hrich700trb3unpacker.cc:93
 hrich700trb3unpacker.cc:94
 hrich700trb3unpacker.cc:95
 hrich700trb3unpacker.cc:96
 hrich700trb3unpacker.cc:97
 hrich700trb3unpacker.cc:98
 hrich700trb3unpacker.cc:99
 hrich700trb3unpacker.cc:100
 hrich700trb3unpacker.cc:101
 hrich700trb3unpacker.cc:102
 hrich700trb3unpacker.cc:103
 hrich700trb3unpacker.cc:104
 hrich700trb3unpacker.cc:105
 hrich700trb3unpacker.cc:106
 hrich700trb3unpacker.cc:107
 hrich700trb3unpacker.cc:108
 hrich700trb3unpacker.cc:109
 hrich700trb3unpacker.cc:110
 hrich700trb3unpacker.cc:111
 hrich700trb3unpacker.cc:112
 hrich700trb3unpacker.cc:113
 hrich700trb3unpacker.cc:114
 hrich700trb3unpacker.cc:115
 hrich700trb3unpacker.cc:116
 hrich700trb3unpacker.cc:117
 hrich700trb3unpacker.cc:118
 hrich700trb3unpacker.cc:119
 hrich700trb3unpacker.cc:120
 hrich700trb3unpacker.cc:121
 hrich700trb3unpacker.cc:122
 hrich700trb3unpacker.cc:123
 hrich700trb3unpacker.cc:124
 hrich700trb3unpacker.cc:125
 hrich700trb3unpacker.cc:126
 hrich700trb3unpacker.cc:127
 hrich700trb3unpacker.cc:128
 hrich700trb3unpacker.cc:129
 hrich700trb3unpacker.cc:130
 hrich700trb3unpacker.cc:131
 hrich700trb3unpacker.cc:132
 hrich700trb3unpacker.cc:133
 hrich700trb3unpacker.cc:134
 hrich700trb3unpacker.cc:135
 hrich700trb3unpacker.cc:136
 hrich700trb3unpacker.cc:137
 hrich700trb3unpacker.cc:138
 hrich700trb3unpacker.cc:139
 hrich700trb3unpacker.cc:140
 hrich700trb3unpacker.cc:141
 hrich700trb3unpacker.cc:142
 hrich700trb3unpacker.cc:143
 hrich700trb3unpacker.cc:144
 hrich700trb3unpacker.cc:145
 hrich700trb3unpacker.cc:146
 hrich700trb3unpacker.cc:147
 hrich700trb3unpacker.cc:148
 hrich700trb3unpacker.cc:149
 hrich700trb3unpacker.cc:150
 hrich700trb3unpacker.cc:151
 hrich700trb3unpacker.cc:152
 hrich700trb3unpacker.cc:153
 hrich700trb3unpacker.cc:154
 hrich700trb3unpacker.cc:155
 hrich700trb3unpacker.cc:156
 hrich700trb3unpacker.cc:157
 hrich700trb3unpacker.cc:158
 hrich700trb3unpacker.cc:159
 hrich700trb3unpacker.cc:160
 hrich700trb3unpacker.cc:161
 hrich700trb3unpacker.cc:162
 hrich700trb3unpacker.cc:163
 hrich700trb3unpacker.cc:164
 hrich700trb3unpacker.cc:165
 hrich700trb3unpacker.cc:166
 hrich700trb3unpacker.cc:167
 hrich700trb3unpacker.cc:168
 hrich700trb3unpacker.cc:169
 hrich700trb3unpacker.cc:170
 hrich700trb3unpacker.cc:171
 hrich700trb3unpacker.cc:172
 hrich700trb3unpacker.cc:173
 hrich700trb3unpacker.cc:174
 hrich700trb3unpacker.cc:175
 hrich700trb3unpacker.cc:176
 hrich700trb3unpacker.cc:177
 hrich700trb3unpacker.cc:178
 hrich700trb3unpacker.cc:179
 hrich700trb3unpacker.cc:180
 hrich700trb3unpacker.cc:181
 hrich700trb3unpacker.cc:182
 hrich700trb3unpacker.cc:183
 hrich700trb3unpacker.cc:184
 hrich700trb3unpacker.cc:185
 hrich700trb3unpacker.cc:186
 hrich700trb3unpacker.cc:187
 hrich700trb3unpacker.cc:188
 hrich700trb3unpacker.cc:189
 hrich700trb3unpacker.cc:190
 hrich700trb3unpacker.cc:191
 hrich700trb3unpacker.cc:192
 hrich700trb3unpacker.cc:193
 hrich700trb3unpacker.cc:194
 hrich700trb3unpacker.cc:195
 hrich700trb3unpacker.cc:196
 hrich700trb3unpacker.cc:197
 hrich700trb3unpacker.cc:198
 hrich700trb3unpacker.cc:199
 hrich700trb3unpacker.cc:200
 hrich700trb3unpacker.cc:201
 hrich700trb3unpacker.cc:202
 hrich700trb3unpacker.cc:203
 hrich700trb3unpacker.cc:204
 hrich700trb3unpacker.cc:205
 hrich700trb3unpacker.cc:206
 hrich700trb3unpacker.cc:207
 hrich700trb3unpacker.cc:208
 hrich700trb3unpacker.cc:209
 hrich700trb3unpacker.cc:210
 hrich700trb3unpacker.cc:211
 hrich700trb3unpacker.cc:212
 hrich700trb3unpacker.cc:213
 hrich700trb3unpacker.cc:214
 hrich700trb3unpacker.cc:215
 hrich700trb3unpacker.cc:216
 hrich700trb3unpacker.cc:217
 hrich700trb3unpacker.cc:218
 hrich700trb3unpacker.cc:219
 hrich700trb3unpacker.cc:220
 hrich700trb3unpacker.cc:221
 hrich700trb3unpacker.cc:222
 hrich700trb3unpacker.cc:223
 hrich700trb3unpacker.cc:224
 hrich700trb3unpacker.cc:225
 hrich700trb3unpacker.cc:226
 hrich700trb3unpacker.cc:227
 hrich700trb3unpacker.cc:228
 hrich700trb3unpacker.cc:229
 hrich700trb3unpacker.cc:230
 hrich700trb3unpacker.cc:231
 hrich700trb3unpacker.cc:232
 hrich700trb3unpacker.cc:233
 hrich700trb3unpacker.cc:234
 hrich700trb3unpacker.cc:235
 hrich700trb3unpacker.cc:236
 hrich700trb3unpacker.cc:237
 hrich700trb3unpacker.cc:238
 hrich700trb3unpacker.cc:239
 hrich700trb3unpacker.cc:240
 hrich700trb3unpacker.cc:241
 hrich700trb3unpacker.cc:242
 hrich700trb3unpacker.cc:243
 hrich700trb3unpacker.cc:244
 hrich700trb3unpacker.cc:245
 hrich700trb3unpacker.cc:246
 hrich700trb3unpacker.cc:247
 hrich700trb3unpacker.cc:248
 hrich700trb3unpacker.cc:249
 hrich700trb3unpacker.cc:250
 hrich700trb3unpacker.cc:251
 hrich700trb3unpacker.cc:252
 hrich700trb3unpacker.cc:253
 hrich700trb3unpacker.cc:254
 hrich700trb3unpacker.cc:255
 hrich700trb3unpacker.cc:256
 hrich700trb3unpacker.cc:257
 hrich700trb3unpacker.cc:258
 hrich700trb3unpacker.cc:259
 hrich700trb3unpacker.cc:260
 hrich700trb3unpacker.cc:261
 hrich700trb3unpacker.cc:262
 hrich700trb3unpacker.cc:263
 hrich700trb3unpacker.cc:264
 hrich700trb3unpacker.cc:265
 hrich700trb3unpacker.cc:266
 hrich700trb3unpacker.cc:267
 hrich700trb3unpacker.cc:268
 hrich700trb3unpacker.cc:269
 hrich700trb3unpacker.cc:270
 hrich700trb3unpacker.cc:271
 hrich700trb3unpacker.cc:272
 hrich700trb3unpacker.cc:273
 hrich700trb3unpacker.cc:274
 hrich700trb3unpacker.cc:275
 hrich700trb3unpacker.cc:276
 hrich700trb3unpacker.cc:277
 hrich700trb3unpacker.cc:278
 hrich700trb3unpacker.cc:279
 hrich700trb3unpacker.cc:280
 hrich700trb3unpacker.cc:281
 hrich700trb3unpacker.cc:282
 hrich700trb3unpacker.cc:283
 hrich700trb3unpacker.cc:284
 hrich700trb3unpacker.cc:285
 hrich700trb3unpacker.cc:286
 hrich700trb3unpacker.cc:287
 hrich700trb3unpacker.cc:288
 hrich700trb3unpacker.cc:289
 hrich700trb3unpacker.cc:290
 hrich700trb3unpacker.cc:291
 hrich700trb3unpacker.cc:292
 hrich700trb3unpacker.cc:293
 hrich700trb3unpacker.cc:294
 hrich700trb3unpacker.cc:295
 hrich700trb3unpacker.cc:296
 hrich700trb3unpacker.cc:297
 hrich700trb3unpacker.cc:298
 hrich700trb3unpacker.cc:299
 hrich700trb3unpacker.cc:300
 hrich700trb3unpacker.cc:301
 hrich700trb3unpacker.cc:302
 hrich700trb3unpacker.cc:303
 hrich700trb3unpacker.cc:304
 hrich700trb3unpacker.cc:305
 hrich700trb3unpacker.cc:306
 hrich700trb3unpacker.cc:307
 hrich700trb3unpacker.cc:308
 hrich700trb3unpacker.cc:309
 hrich700trb3unpacker.cc:310
 hrich700trb3unpacker.cc:311
 hrich700trb3unpacker.cc:312
 hrich700trb3unpacker.cc:313
 hrich700trb3unpacker.cc:314
 hrich700trb3unpacker.cc:315
 hrich700trb3unpacker.cc:316
 hrich700trb3unpacker.cc:317
 hrich700trb3unpacker.cc:318
 hrich700trb3unpacker.cc:319
 hrich700trb3unpacker.cc:320
 hrich700trb3unpacker.cc:321
 hrich700trb3unpacker.cc:322
 hrich700trb3unpacker.cc:323
 hrich700trb3unpacker.cc:324
 hrich700trb3unpacker.cc:325
 hrich700trb3unpacker.cc:326
 hrich700trb3unpacker.cc:327
 hrich700trb3unpacker.cc:328
 hrich700trb3unpacker.cc:329
 hrich700trb3unpacker.cc:330
 hrich700trb3unpacker.cc:331
 hrich700trb3unpacker.cc:332
 hrich700trb3unpacker.cc:333
 hrich700trb3unpacker.cc:334
 hrich700trb3unpacker.cc:335
 hrich700trb3unpacker.cc:336
 hrich700trb3unpacker.cc:337
 hrich700trb3unpacker.cc:338
 hrich700trb3unpacker.cc:339
 hrich700trb3unpacker.cc:340
 hrich700trb3unpacker.cc:341
 hrich700trb3unpacker.cc:342
 hrich700trb3unpacker.cc:343
 hrich700trb3unpacker.cc:344
 hrich700trb3unpacker.cc:345
 hrich700trb3unpacker.cc:346
 hrich700trb3unpacker.cc:347
 hrich700trb3unpacker.cc:348
 hrich700trb3unpacker.cc:349
 hrich700trb3unpacker.cc:350
 hrich700trb3unpacker.cc:351
 hrich700trb3unpacker.cc:352
 hrich700trb3unpacker.cc:353
 hrich700trb3unpacker.cc:354
 hrich700trb3unpacker.cc:355
 hrich700trb3unpacker.cc:356
 hrich700trb3unpacker.cc:357
 hrich700trb3unpacker.cc:358
 hrich700trb3unpacker.cc:359
 hrich700trb3unpacker.cc:360
 hrich700trb3unpacker.cc:361
 hrich700trb3unpacker.cc:362
 hrich700trb3unpacker.cc:363
 hrich700trb3unpacker.cc:364
 hrich700trb3unpacker.cc:365
 hrich700trb3unpacker.cc:366
 hrich700trb3unpacker.cc:367
 hrich700trb3unpacker.cc:368
 hrich700trb3unpacker.cc:369
 hrich700trb3unpacker.cc:370
 hrich700trb3unpacker.cc:371
 hrich700trb3unpacker.cc:372
 hrich700trb3unpacker.cc:373
 hrich700trb3unpacker.cc:374
 hrich700trb3unpacker.cc:375
 hrich700trb3unpacker.cc:376
 hrich700trb3unpacker.cc:377
 hrich700trb3unpacker.cc:378
 hrich700trb3unpacker.cc:379
 hrich700trb3unpacker.cc:380
 hrich700trb3unpacker.cc:381
 hrich700trb3unpacker.cc:382
 hrich700trb3unpacker.cc:383
 hrich700trb3unpacker.cc:384
 hrich700trb3unpacker.cc:385
 hrich700trb3unpacker.cc:386
 hrich700trb3unpacker.cc:387
 hrich700trb3unpacker.cc:388
 hrich700trb3unpacker.cc:389
 hrich700trb3unpacker.cc:390
 hrich700trb3unpacker.cc:391
 hrich700trb3unpacker.cc:392
 hrich700trb3unpacker.cc:393
 hrich700trb3unpacker.cc:394
 hrich700trb3unpacker.cc:395
 hrich700trb3unpacker.cc:396
 hrich700trb3unpacker.cc:397
 hrich700trb3unpacker.cc:398
 hrich700trb3unpacker.cc:399
 hrich700trb3unpacker.cc:400
 hrich700trb3unpacker.cc:401
 hrich700trb3unpacker.cc:402
 hrich700trb3unpacker.cc:403
 hrich700trb3unpacker.cc:404
 hrich700trb3unpacker.cc:405
 hrich700trb3unpacker.cc:406
 hrich700trb3unpacker.cc:407
 hrich700trb3unpacker.cc:408
 hrich700trb3unpacker.cc:409
 hrich700trb3unpacker.cc:410
 hrich700trb3unpacker.cc:411
 hrich700trb3unpacker.cc:412
 hrich700trb3unpacker.cc:413
 hrich700trb3unpacker.cc:414
 hrich700trb3unpacker.cc:415
 hrich700trb3unpacker.cc:416
 hrich700trb3unpacker.cc:417
 hrich700trb3unpacker.cc:418
 hrich700trb3unpacker.cc:419
 hrich700trb3unpacker.cc:420
 hrich700trb3unpacker.cc:421
 hrich700trb3unpacker.cc:422
 hrich700trb3unpacker.cc:423
 hrich700trb3unpacker.cc:424
 hrich700trb3unpacker.cc:425
 hrich700trb3unpacker.cc:426
 hrich700trb3unpacker.cc:427
 hrich700trb3unpacker.cc:428
 hrich700trb3unpacker.cc:429
 hrich700trb3unpacker.cc:430
 hrich700trb3unpacker.cc:431
 hrich700trb3unpacker.cc:432
 hrich700trb3unpacker.cc:433
 hrich700trb3unpacker.cc:434
 hrich700trb3unpacker.cc:435
 hrich700trb3unpacker.cc:436
 hrich700trb3unpacker.cc:437
 hrich700trb3unpacker.cc:438
 hrich700trb3unpacker.cc:439
 hrich700trb3unpacker.cc:440
 hrich700trb3unpacker.cc:441
 hrich700trb3unpacker.cc:442
 hrich700trb3unpacker.cc:443
 hrich700trb3unpacker.cc:444
 hrich700trb3unpacker.cc:445
 hrich700trb3unpacker.cc:446
 hrich700trb3unpacker.cc:447
 hrich700trb3unpacker.cc:448
 hrich700trb3unpacker.cc:449
 hrich700trb3unpacker.cc:450
 hrich700trb3unpacker.cc:451
 hrich700trb3unpacker.cc:452
 hrich700trb3unpacker.cc:453
 hrich700trb3unpacker.cc:454
 hrich700trb3unpacker.cc:455
 hrich700trb3unpacker.cc:456
 hrich700trb3unpacker.cc:457
 hrich700trb3unpacker.cc:458
 hrich700trb3unpacker.cc:459
 hrich700trb3unpacker.cc:460
 hrich700trb3unpacker.cc:461
 hrich700trb3unpacker.cc:462
 hrich700trb3unpacker.cc:463
 hrich700trb3unpacker.cc:464
 hrich700trb3unpacker.cc:465
 hrich700trb3unpacker.cc:466
 hrich700trb3unpacker.cc:467
 hrich700trb3unpacker.cc:468
 hrich700trb3unpacker.cc:469
 hrich700trb3unpacker.cc:470
 hrich700trb3unpacker.cc:471
 hrich700trb3unpacker.cc:472
 hrich700trb3unpacker.cc:473
 hrich700trb3unpacker.cc:474