// @(#)root/g3d:$Id$
// Author: Nenad Buncic   29/09/95

/*************************************************************************
 * 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.             *
 *************************************************************************/

#include "TPCON.h"
#include "TNode.h"
#include "TMath.h"
#include "TVirtualPad.h"
#include "TBuffer3D.h"
#include "TBuffer3DTypes.h"
#include "TGeometry.h"
#include "TClass.h"

ClassImp(TPCON)


//______________________________________________________________________________
// Begin_Html <P ALIGN=CENTER> <IMG SRC="gif/pcon.gif"> </P> End_Html
// PCON is a polycone. It has the following parameters:
//
//     - name       name of the shape
//     - title      shape's title
//     - material  (see TMaterial)
//     - phi1       the azimuthal angle phi at which the volume begins (angles
//                  are counted counterclockwise)
//     - dphi       opening angle of the volume, which extends from
//                  phi1 to phi1+dphi
//     - nz         number of planes perpendicular to the z axis where
//                  the dimension of the section is given -- this number
//                  should be at least 2
//     - rmin       array of dimension nz with minimum radius at a given plane
//     - rmax       array of dimension nz with maximum radius at a given plane
//     - z          array of dimension nz with z position of given plane


//______________________________________________________________________________
TPCON::TPCON()
{
   // PCON shape default constructor

   fRmin  = 0;
   fRmax  = 0;
   fDz    = 0;
   fCoTab = 0;
   fSiTab = 0;
   fPhi1  = 0.;
   fDphi1 = 0.;
   fNz    = 0;
   fNdiv  = 0;
}


//______________________________________________________________________________
TPCON::TPCON(const char *name, const char *title, const char *material, Float_t phi1, Float_t dphi1, Int_t nz)
      : TShape(name, title,material)
{
   // PCON shape normal constructor
   //
   // Parameters of the nz positions must be entered via TPCON::DefineSection.

   if (nz < 2 ) {
      Error(name, "number of z planes for %s must be at least two !", name);
      return;
   }
   fPhi1  = phi1;
   fDphi1 = dphi1;
   fNz    = nz;
   fNdiv  = 0;
   fRmin  = new Float_t [nz+1];
   fRmax  = new Float_t [nz+1];
   fDz    = new Float_t [nz+1];

   fCoTab = 0;
   fSiTab = 0;

   while (fDphi1 > 360) fDphi1 -= 360;

   MakeTableOfCoSin();
}

//______________________________________________________________________________
TPCON::TPCON(const TPCON& pc) :
  TShape(pc),
  fSiTab(pc.fSiTab),
  fCoTab(pc.fCoTab),
  fPhi1(pc.fPhi1),
  fDphi1(pc.fDphi1),
  fNdiv(pc.fNdiv),
  fNz(pc.fNz),
  fRmin(pc.fRmin),
  fRmax(pc.fRmax),
  fDz(pc.fDz)
{
   //copy constructor
}

//______________________________________________________________________________
TPCON& TPCON::operator=(const TPCON& pc)
{
   //assignement operator
   if(this!=&pc) {
      TShape::operator=(pc);
      fSiTab=pc.fSiTab;
      fCoTab=pc.fCoTab;
      fPhi1=pc.fPhi1;
      fDphi1=pc.fDphi1;
      fNdiv=pc.fNdiv;
      fNz=pc.fNz;
      fRmin=pc.fRmin;
      fRmax=pc.fRmax;
      fDz=pc.fDz;
   }
   return *this;
}

//______________________________________________________________________________
void TPCON::MakeTableOfCoSin() const
{
   // Make table of cosine and sine

   const Double_t pi  = TMath::ATan(1) * 4.0;
   const Double_t ragrad  = pi/180.0;

   Int_t n = GetNumberOfDivisions () + 1;
   if (fCoTab)
      delete [] fCoTab; // Delete the old tab if any
      fCoTab = new Double_t [n];
   if (!fCoTab ) return;

   if (fSiTab)
      delete [] fSiTab; // Delete the old tab if any
   fSiTab = new Double_t [n];
   if (!fSiTab ) return;

   Double_t range   = Double_t(fDphi1 * ragrad);
   Double_t phi1    = Double_t(fPhi1  * ragrad);
   Double_t angstep = range/(n-1);

   FillTableOfCoSin(phi1,angstep,n);
}


//______________________________________________________________________________
TPCON::~TPCON()
{
   // PCON shape default destructor

   if (fRmin) delete [] fRmin;
   if (fRmax) delete [] fRmax;
   if (fDz)   delete [] fDz;
   if (fSiTab) delete [] fSiTab;
   if (fCoTab) delete [] fCoTab;

   fRmin = 0;
   fRmax = 0;
   fDz   = 0;
   fCoTab = 0;
   fSiTab = 0;
}


//______________________________________________________________________________
void TPCON::DefineSection(Int_t secNum, Float_t z, Float_t rmin, Float_t rmax)
{
   // Defines section secNum of the polycone
   //
   //     - rmin  radius of the inner circle in the cross-section
   //
   //     - rmax  radius of the outer circle in the cross-section
   //
   //     - z     z coordinate of the section

   if ((secNum < 0) || (secNum >= fNz)) return;

   fRmin[secNum] = rmin;
   fRmax[secNum] = rmax;
   fDz[secNum]   = z;
}


//______________________________________________________________________________
Int_t TPCON::DistancetoPrimitive(Int_t px, Int_t py)
{
   // Compute distance from point px,py to a PCON
   //
   // Compute the closest distance of approach from point px,py to each
   // computed outline point of the PCON.

   Int_t n = GetNumberOfDivisions()+1;
   Int_t numPoints = fNz*2*n;
   return ShapeDistancetoPrimitive(numPoints,px,py);
}


//______________________________________________________________________________
void  TPCON::FillTableOfCoSin(Double_t phi, Double_t angstep,Int_t n) const
{
   // Fill the table of cos and sin to prepare drawing

   Double_t ph = phi-angstep;
   for (Int_t j = 0; j < n; j++) {
      ph += angstep;
      fCoTab[j] = TMath::Cos(ph);
      fSiTab[j] = TMath::Sin(ph);
   }
}


//______________________________________________________________________________
void TPCON::SetNumberOfDivisions (Int_t p)
{
   // Set number of divisions.

   if (GetNumberOfDivisions () == p) return;
   fNdiv=p;
   MakeTableOfCoSin();
}


//______________________________________________________________________________
void TPCON::SetPoints(Double_t *points) const
{
   // Create PCON points

   Int_t i, j;
   Int_t indx = 0;

   Int_t n = GetNumberOfDivisions()+1;

   if (points) {
      if (!fCoTab) MakeTableOfCoSin();
      for (i = 0; i < fNz; i++) {
         for (j = 0; j < n; j++) {
            points[indx++] = fRmin[i] * fCoTab[j];
            points[indx++] = fRmin[i] * fSiTab[j];
            points[indx++] = fDz[i];
         }
         for (j = 0; j < n; j++) {
            points[indx++] = fRmax[i] * fCoTab[j];
            points[indx++] = fRmax[i] * fSiTab[j];
            points[indx++] = fDz[i];
         }
      }
   }
}


//______________________________________________________________________________
void TPCON::Sizeof3D() const
{
   // Return total X3D needed by TNode::ls (when called with option "x")

   Int_t n;

   n = GetNumberOfDivisions()+1;

   gSize3D.numPoints += fNz*2*n;
   gSize3D.numSegs   += 4*(fNz*n-1+(fDphi1 == 360));
   gSize3D.numPolys  += 2*(fNz*n-1+(fDphi1 == 360));
}


//______________________________________________________________________________
void TPCON::Streamer(TBuffer &b)
{
   // Stream a class object

   if (b.IsReading()) {
      UInt_t R__s, R__c;
      Version_t R__v = b.ReadVersion(&R__s, &R__c);
      if (R__v > 1) {
         b.ReadClassBuffer(TPCON::Class(), this, R__v, R__s, R__c);
         return;
      }
      //====process old versions before automatic schema evolution
      TShape::Streamer(b);
      b >> fPhi1;
      b >> fDphi1;
      b >> fNz;
      fRmin  = new Float_t [fNz];
      fRmax  = new Float_t [fNz];
      fDz    = new Float_t [fNz];
      b.ReadArray(fRmin);
      b.ReadArray(fRmax);
      b.ReadArray(fDz);
      b >> fNdiv;
      b.CheckByteCount(R__s, R__c, TPCON::IsA());
      //====end of old versions

   } else {
      b.WriteClassBuffer(TPCON::Class(),this);
   }
}


//______________________________________________________________________________
const TBuffer3D & TPCON::GetBuffer3D(Int_t reqSections) const
{
   // Get buffer 3d.

   static TBuffer3D buffer(TBuffer3DTypes::kGeneric);

   TShape::FillBuffer3D(buffer, reqSections);

   // No kShapeSpecific or kBoundingBox

   if (reqSections & TBuffer3D::kRawSizes)
   {
      const Int_t n = GetNumberOfDivisions()+1;
      Int_t nbPnts = fNz*2*n;
      Bool_t specialCase = (fDphi1 == 360);
      Int_t nbSegs = 4*(fNz*n-1+(specialCase == kTRUE));
      Int_t nbPols = 2*(fNz*n-1+(specialCase == kTRUE));

      if (buffer.SetRawSizes(nbPnts, 3*nbPnts, nbSegs, 3*nbSegs, nbPols, 6*nbPols)) {
         buffer.SetSectionsValid(TBuffer3D::kRawSizes);
      }
   }
   if ((reqSections & TBuffer3D::kRaw) && buffer.SectionsValid(TBuffer3D::kRawSizes))
   {
      // Points
      SetPoints(buffer.fPnts);
      if (!buffer.fLocalFrame) {
         TransformPoints(buffer.fPnts, buffer.NbPnts());
      }

      // Segments and Polygons
      if (SetSegsAndPols(buffer))
      {
         buffer.SetSectionsValid(TBuffer3D::kRaw);
      }
   }
   return buffer;
}


//______________________________________________________________________________
Bool_t TPCON::SetSegsAndPols(TBuffer3D & buffer) const
{
   // Set segments and polygons.

   if (fNz < 2) return kFALSE;
   const Int_t n = GetNumberOfDivisions()+1;
   Bool_t specialCase = (fDphi1 == 360);

   Int_t c = GetBasicColor();

   Int_t i, j, k;
   Int_t indx = 0;
   Int_t indx2 = 0;

   //inside & outside circles, number of segments: 2*fNz*(n-1)
   //             special case number of segments: 2*fNz*n
   for (i = 0; i < fNz*2; i++) {
      indx2 = i*n;
      for (j = 1; j < n; j++) {
         buffer.fSegs[indx++] = c;
         buffer.fSegs[indx++] = indx2+j-1;
         buffer.fSegs[indx++] = indx2+j;
      }
      if (specialCase) {
         buffer.fSegs[indx++] = c;
         buffer.fSegs[indx++] = indx2+j-1;
         buffer.fSegs[indx++] = indx2;
      }
   }

   //bottom & top lines, number of segments: 2*n
   for (i = 0; i < 2; i++) {
      indx2 = i*(fNz-1)*2*n;
      for (j = 0; j < n; j++) {
         buffer.fSegs[indx++] = c;
         buffer.fSegs[indx++] = indx2+j;
         buffer.fSegs[indx++] = indx2+n+j;
      }
   }

   //inside & outside cilindres, number of segments: 2*(fNz-1)*n
   for (i = 0; i < (fNz-1); i++) {

      //inside cilinder
      indx2 = i*n*2;
      for (j = 0; j < n; j++) {
         buffer.fSegs[indx++] = c+2;
         buffer.fSegs[indx++] = indx2+j;
         buffer.fSegs[indx++] = indx2+n*2+j;
      }
      //outside cilinder
      indx2 = i*n*2+n;
      for (j = 0; j < n; j++) {
         buffer.fSegs[indx++] = c+3;
         buffer.fSegs[indx++] = indx2+j;
         buffer.fSegs[indx++] = indx2+n*2+j;
      }
   }

   //left & right sections, number of segments: 2*(fNz-2)
   //          special case number of segments: 0
   if (!specialCase) {
      for (i = 1; i < (fNz-1); i++) {
         for (j = 0; j < 2; j++) {
            buffer.fSegs[indx++] = c;
            buffer.fSegs[indx++] =  2*i    * n + j*(n-1);
            buffer.fSegs[indx++] = (2*i+1) * n + j*(n-1);
         }
      }
   }

   Int_t m = n - 1 + (specialCase == kTRUE);
   indx = 0;

   //bottom & top, number of polygons: 2*(n-1)
   // special case number of polygons: 2*n
   for (j = 0; j < n-1; j++) {
      buffer.fPols[indx++] = c+3;
      buffer.fPols[indx++] = 4;
      buffer.fPols[indx++] = 2*fNz*m+j;
      buffer.fPols[indx++] = m+j;
      buffer.fPols[indx++] = 2*fNz*m+j+1;
      buffer.fPols[indx++] = j;
   }
   for (j = 0; j < n-1; j++) {
      buffer.fPols[indx++] = c+3;
      buffer.fPols[indx++] = 4;
      buffer.fPols[indx++] = 2*fNz*m+n+j;
      buffer.fPols[indx++] = (fNz*2-2)*m+j;
      buffer.fPols[indx++] = 2*fNz*m+n+j+1;
      buffer.fPols[indx++] = (fNz*2-2)*m+m+j;
   }
   if (specialCase) {
      buffer.fPols[indx++] = c+3;
      buffer.fPols[indx++] = 4;
      buffer.fPols[indx++] = 2*fNz*m+j;
      buffer.fPols[indx++] = m+j;
      buffer.fPols[indx++] = 2*fNz*m;
      buffer.fPols[indx++] = j;

      buffer.fPols[indx++] = c+3;
      buffer.fPols[indx++] = 4;
      buffer.fPols[indx++] = 2*fNz*m+n+j;
      buffer.fPols[indx++] = (fNz*2-2)*m+j;
      buffer.fPols[indx++] = 2*fNz*m+n;
      buffer.fPols[indx++] = (fNz*2-2)*m+m+j;
   }
   for (k = 0; k < (fNz-1); k++) {
      for (j = 0; j < n-1; j++) {
         buffer.fPols[indx++] = c;
         buffer.fPols[indx++] = 4;
         buffer.fPols[indx++] = 2*k*m+j;
         buffer.fPols[indx++] = fNz*2*m+(2*k+2)*n+j+1;
         buffer.fPols[indx++] = (2*k+2)*m+j;
         buffer.fPols[indx++] = fNz*2*m+(2*k+2)*n+j;
      }
      for (j = 0; j < n-1; j++) {
         buffer.fPols[indx++] = c+1;
         buffer.fPols[indx++] = 4;
         buffer.fPols[indx++] = (2*k+1)*m+j;
         buffer.fPols[indx++] = fNz*2*m+(2*k+3)*n+j;
         buffer.fPols[indx++] = (2*k+3)*m+j;
         buffer.fPols[indx++] = fNz*2*m+(2*k+3)*n+j+1;
      }

      if (specialCase) {
         buffer.fPols[indx++] = c;
         buffer.fPols[indx++] = 4;
         buffer.fPols[indx++] = 2*k*m+j;
         buffer.fPols[indx++] = fNz*2*m+(2*k+2)*n;
         buffer.fPols[indx++] = (2*k+2)*m+j;
         buffer.fPols[indx++] = fNz*2*m+(2*k+2)*n+j;

         buffer.fPols[indx++] = c+1;
         buffer.fPols[indx++] = 4;
         buffer.fPols[indx++] = (2*k+1)*m+j;
         buffer.fPols[indx++] = fNz*2*m+(2*k+3)*n+j;
         buffer.fPols[indx++] = (2*k+3)*m+j;
         buffer.fPols[indx++] = fNz*2*m+(2*k+3)*n;
      }
   }

   if (!specialCase) {
      indx2 = fNz*2*(n-1);
      for (k = 0; k < (fNz-1); k++) {
         buffer.fPols[indx++] = c+2;
         buffer.fPols[indx++] = 4;
         buffer.fPols[indx++] = k==0 ? indx2 : indx2+2*fNz*n+2*(k-1);
         buffer.fPols[indx++] = indx2+2*(k+1)*n;
         buffer.fPols[indx++] = indx2+2*fNz*n+2*k;
         buffer.fPols[indx++] = indx2+(2*k+3)*n;

         buffer.fPols[indx++] = c+2;
         buffer.fPols[indx++] = 4;
         buffer.fPols[indx++] = k==0 ? indx2+n-1 : indx2+2*fNz*n+2*(k-1)+1;
         buffer.fPols[indx++] = indx2+(2*k+3)*n+n-1;
         buffer.fPols[indx++] = indx2+2*fNz*n+2*k+1;
         buffer.fPols[indx++] = indx2+2*(k+1)*n+n-1;
      }
      buffer.fPols[indx-8] = indx2+n;
      buffer.fPols[indx-2] = indx2+2*n-1;
   }

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