Cloned library of VTK-5.0.0 with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1912 lines
88 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkSynchronizedTemplates3D.cxx,v $
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include "vtkSynchronizedTemplates3D.h"
#include "vtkCellArray.h"
#include "vtkCellData.h"
#include "vtkCharArray.h"
#include "vtkDoubleArray.h"
#include "vtkExtentTranslator.h"
#include "vtkFloatArray.h"
#include "vtkInformation.h"
#include "vtkInformationVector.h"
#include "vtkIntArray.h"
#include "vtkLongArray.h"
#include "vtkMath.h"
#include "vtkObjectFactory.h"
#include "vtkPointData.h"
#include "vtkPolyData.h"
#include "vtkShortArray.h"
#include "vtkStreamingDemandDrivenPipeline.h"
#include "vtkStructuredPoints.h"
#include "vtkUnsignedCharArray.h"
#include "vtkUnsignedIntArray.h"
#include "vtkUnsignedLongArray.h"
#include "vtkUnsignedShortArray.h"
#include <math.h>
vtkCxxRevisionMacro(vtkSynchronizedTemplates3D, "$Revision: 1.9 $");
vtkStandardNewMacro(vtkSynchronizedTemplates3D);
//----------------------------------------------------------------------------
// Description:
// Construct object with initial scalar range (0,1) and single contour value
// of 0.0. The ImageRange are set to extract the first k-plane.
vtkSynchronizedTemplates3D::vtkSynchronizedTemplates3D()
{
this->ContourValues = vtkContourValues::New();
this->ComputeNormals = 1;
this->ComputeGradients = 0;
this->ComputeScalars = 1;
this->ExecuteExtent[0] = this->ExecuteExtent[1]
= this->ExecuteExtent[2] = this->ExecuteExtent[3]
= this->ExecuteExtent[4] = this->ExecuteExtent[5] = 0;
this->ArrayComponent = 0;
// by default process active point scalars
this->SetInputArrayToProcess(0,0,0,vtkDataObject::FIELD_ASSOCIATION_POINTS,
vtkDataSetAttributes::SCALARS);
}
//----------------------------------------------------------------------------
vtkSynchronizedTemplates3D::~vtkSynchronizedTemplates3D()
{
this->ContourValues->Delete();
}
//----------------------------------------------------------------------------
// Overload standard modified time function. If contour values are modified,
// then this object is modified as well.
unsigned long vtkSynchronizedTemplates3D::GetMTime()
{
unsigned long mTime=this->Superclass::GetMTime();
unsigned long mTime2=this->ContourValues->GetMTime();
mTime = ( mTime2 > mTime ? mTime2 : mTime );
return mTime;
}
//----------------------------------------------------------------------------
void vtkSynchronizedTemplates3DInitializeOutput(
int *ext,vtkImageData *input,
vtkPolyData *o, vtkFloatArray *scalars, vtkFloatArray *normals,
vtkFloatArray *gradients, vtkDataArray *inScalars)
{
vtkPoints *newPts;
vtkCellArray *newPolys;
long estimatedSize;
estimatedSize = (int) pow ((double)
((ext[1]-ext[0]+1)*(ext[3]-ext[2]+1)*(ext[5]-ext[4]+1)), .75);
if (estimatedSize < 1024)
{
estimatedSize = 1024;
}
newPts = vtkPoints::New();
newPts->Allocate(estimatedSize,estimatedSize);
newPolys = vtkCellArray::New();
newPolys->Allocate(newPolys->EstimateSize(estimatedSize,3));
o->GetPointData()->CopyAllOn();
// It is more efficient to just create the scalar array
// rather than redundantly interpolate the scalars.
if (input->GetPointData()->GetScalars() == inScalars)
{
o->GetPointData()->CopyScalarsOff();
}
else
{
o->GetPointData()->CopyFieldOff(inScalars->GetName());
}
if (normals)
{
normals->SetNumberOfComponents(3);
normals->Allocate(3*estimatedSize,3*estimatedSize/2);
normals->SetName("Normals");
}
if (gradients)
{
gradients->SetNumberOfComponents(3);
gradients->Allocate(3*estimatedSize,3*estimatedSize/2);
gradients->SetName("Gradients");
}
if (scalars)
{
// A temporary name.
scalars->SetName("Scalars");
}
o->GetPointData()->InterpolateAllocate(input->GetPointData(),
estimatedSize,estimatedSize/2);
o->GetCellData()->CopyAllocate(input->GetCellData(),
estimatedSize,estimatedSize/2);
o->SetPoints(newPts);
newPts->Delete();
o->SetPolys(newPolys);
newPolys->Delete();
}
//----------------------------------------------------------------------------
// Calculate the gradient using central difference.
template <class T>
void vtkSTComputePointGradient(int i, int j, int k, T *s, int *wholeExt,
int xInc, int yInc, int zInc,
double *spacing, double n[3])
{
double sp, sm;
// x-direction
if ( i == wholeExt[0] )
{
sp = *(s+xInc);
sm = *s;
n[0] = (sp - sm) / spacing[0];
}
else if ( i == wholeExt[1] )
{
sp = *s;
sm = *(s-xInc);
n[0] = (sp - sm) / spacing[0];
}
else
{
sp = *(s+xInc);
sm = *(s-xInc);
n[0] = 0.5 * (sp - sm) / spacing[0];
}
// y-direction
if ( j == wholeExt[2] )
{
sp = *(s+yInc);
sm = *s;
n[1] = (sp - sm) / spacing[1];
}
else if ( j == wholeExt[3] )
{
sp = *s;
sm = *(s-yInc);
n[1] = (sp - sm) / spacing[1];
}
else
{
sp = *(s+yInc);
sm = *(s-yInc);
n[1] = 0.5 * (sp - sm) / spacing[1];
}
// z-direction
if ( k == wholeExt[4] )
{
sp = *(s+zInc);
sm = *s;
n[2] = (sp - sm) / spacing[2];
}
else if ( k == wholeExt[5] )
{
sp = *s;
sm = *(s-zInc);
n[2] = (sp - sm) / spacing[2];
}
else
{
sp = *(s+zInc);
sm = *(s-zInc);
n[2] = 0.5 * (sp - sm) / spacing[2];
}
}
//----------------------------------------------------------------------------
#define VTK_CSP3PA(i2,j2,k2,s) \
if (NeedGradients) \
{ \
if (!g0) \
{ \
vtkSTComputePointGradient(i, j, k, s0, wholeExt, xInc, yInc, zInc, spacing, n0); \
g0 = 1; \
} \
vtkSTComputePointGradient(i2, j2, k2, s, wholeExt, xInc, yInc, zInc, spacing, n1); \
for (jj=0; jj<3; jj++) \
{ \
n[jj] = n0[jj] + t * (n1[jj] - n0[jj]); \
} \
if (ComputeGradients) \
{ \
newGradients->InsertNextTuple(n); \
} \
if (ComputeNormals) \
{ \
vtkMath::Normalize(n); \
n[0] = -n[0]; n[1] = -n[1]; n[2] = -n[2]; \
newNormals->InsertNextTuple(n); \
} \
} \
if (ComputeScalars) \
{ \
newScalars->InsertNextTuple(&value); \
}
//----------------------------------------------------------------------------
//
// Contouring filter specialized for images
//
template <class T>
void ContourImage(vtkSynchronizedTemplates3D *self, int *exExt,
vtkInformation *inInfo,
vtkImageData *data, vtkPolyData *output, T *ptr,
vtkDataArray *inScalars)
{
int *inExt = data->GetExtent();
int xdim = exExt[1] - exExt[0] + 1;
int ydim = exExt[3] - exExt[2] + 1;
double *values = self->GetValues();
int numContours = self->GetNumberOfContours();
T *inPtrX, *inPtrY, *inPtrZ;
T *s0, *s1, *s2, *s3;
int xMin, xMax, yMin, yMax, zMin, zMax;
int xInc, yInc, zInc;
double *origin = data->GetOrigin();
double *spacing = data->GetSpacing();
int *isect1Ptr, *isect2Ptr;
double y, z, t;
int i, j, k;
int zstep, yisectstep;
int offsets[12];
int ComputeNormals = self->GetComputeNormals();
int ComputeGradients = self->GetComputeGradients();
int ComputeScalars = self->GetComputeScalars();
int NeedGradients = ComputeGradients || ComputeNormals;
double n[3], n0[3], n1[3];
int jj, g0;
int *tablePtr;
int idx, vidx;
double x[3], xz[3];
int v0, v1, v2, v3;
vtkIdType ptIds[3];
double value;
int *wholeExt;
// We need to know the edgePointId's for interpolating attributes.
int edgePtId, inCellId, outCellId;
vtkPointData *inPD = data->GetPointData();
vtkCellData *inCD = data->GetCellData();
vtkPointData *outPD = output->GetPointData();
vtkCellData *outCD = output->GetCellData();
// Use to be arguments
vtkFloatArray *newScalars = NULL;
vtkFloatArray *newNormals = NULL;
vtkFloatArray *newGradients = NULL;
vtkPoints *newPts;
vtkCellArray *newPolys;
ptr += self->GetArrayComponent();
if (ComputeScalars)
{
newScalars = vtkFloatArray::New();
}
if (ComputeNormals)
{
newNormals = vtkFloatArray::New();
}
if (ComputeGradients)
{
newGradients = vtkFloatArray::New();
}
vtkSynchronizedTemplates3DInitializeOutput(exExt,
data, output,
newScalars, newNormals,
newGradients, inScalars);
newPts = output->GetPoints();
newPolys = output->GetPolys();
// this is an exploded execute extent.
xMin = exExt[0];
xMax = exExt[1];
yMin = exExt[2];
yMax = exExt[3];
zMin = exExt[4];
zMax = exExt[5];
// increments to move through scalars. Compute these ourself because
// we may be contouring an array other than scalars.
xInc = inScalars->GetNumberOfComponents();
yInc = xInc*(inExt[1]-inExt[0]+1);
zInc = yInc*(inExt[3]-inExt[2]+1);
wholeExt = inInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT());
// Kens increments, probably to do with edge array
zstep = xdim*ydim;
yisectstep = xdim*3;
// compute offsets probably how to get to the edges in the edge array.
offsets[0] = -xdim*3;
offsets[1] = -xdim*3 + 1;
offsets[2] = -xdim*3 + 2;
offsets[3] = -xdim*3 + 4;
offsets[4] = -xdim*3 + 5;
offsets[5] = 0;
offsets[6] = 2;
offsets[7] = 5;
offsets[8] = (zstep - xdim)*3;
offsets[9] = (zstep - xdim)*3 + 1;
offsets[10] = (zstep - xdim)*3 + 4;
offsets[11] = zstep*3;
// allocate storage array
int *isect1 = new int [xdim*ydim*3*2];
// set impossible edges to -1
for (i = 0; i < ydim; i++)
{
isect1[(i+1)*xdim*3-3] = -1;
isect1[(i+1)*xdim*3*2-3] = -1;
}
for (i = 0; i < xdim; i++)
{
isect1[((ydim-1)*xdim + i)*3 + 1] = -1;
isect1[((ydim-1)*xdim + i)*3*2 + 1] = -1;
}
// for each contour
for (vidx = 0; vidx < numContours; vidx++)
{
value = values[vidx];
inPtrZ = ptr;
//==================================================================
for (k = zMin; k <= zMax; k++)
{
self->UpdateProgress((double)vidx/numContours +
(k-zMin)/((zMax - zMin+1.0)*numContours));
z = origin[2] + spacing[2]*k;
x[2] = z;
// swap the buffers
if (k%2)
{
offsets[8] = (zstep - xdim)*3;
offsets[9] = (zstep - xdim)*3 + 1;
offsets[10] = (zstep - xdim)*3 + 4;
offsets[11] = zstep*3;
isect1Ptr = isect1;
isect2Ptr = isect1 + xdim*ydim*3;
}
else
{
offsets[8] = (-zstep - xdim)*3;
offsets[9] = (-zstep - xdim)*3 + 1;
offsets[10] = (-zstep - xdim)*3 + 4;
offsets[11] = -zstep*3;
isect1Ptr = isect1 + xdim*ydim*3;
isect2Ptr = isect1;
}
inPtrY = inPtrZ;
for (j = yMin; j <= yMax; j++)
{
// Should not impact perfomance here/
edgePtId = (j-inExt[2])*yInc + (k-inExt[4])*zInc;
// Increments are different for cells. Since the cells are not
// contoured until the second row of templates, subtract 1 from
// i,j,and k. Note: first cube is formed when i=0, j=1, and k=1.
inCellId =
(xMin-inExt[0]) + (inExt[1]-inExt[0])*
( (j-inExt[2]-1) + (k-inExt[4]-1)*(inExt[3]-inExt[2]) );
y = origin[1] + j*spacing[1];
xz[1] = y;
s1 = inPtrY;
v1 = (*s1 < value ? 0 : 1);
inPtrX = inPtrY;
for (i = xMin; i <= xMax; i++)
{
s0 = s1;
v0 = v1;
// this flag keeps up from computing gradient for grid point 0 twice.
g0 = 0;
*isect2Ptr = -1;
*(isect2Ptr + 1) = -1;
*(isect2Ptr + 2) = -1;
if (i < xMax)
{
s1 = (inPtrX + xInc);
v1 = (*s1 < value ? 0 : 1);
if (v0 ^ v1)
{
// watch for degenerate points
if (*s0 == value)
{
if (i > xMin && *(isect2Ptr-3) > -1)
{
*isect2Ptr = *(isect2Ptr-3);
}
else if (j > yMin && *(isect2Ptr - yisectstep + 1) > -1)
{
*isect2Ptr = *(isect2Ptr - yisectstep + 1);
}
else if (k > zMin && *(isect1Ptr+2) > -1)
{
*isect2Ptr = *(isect1Ptr+2);
}
}
else if (*s1 == value)
{
if (j > yMin && *(isect2Ptr - yisectstep +4) > -1)
{
*isect2Ptr = *(isect2Ptr - yisectstep + 4);
}
else if (k > zMin && i < xMax && *(isect1Ptr + 5) > -1)
{
*isect2Ptr = *(isect1Ptr + 5);
}
}
// if the edge has not been set yet then it is a new point
if (*isect2Ptr == -1)
{
t = (value - (double)(*s0)) / ((double)(*s1) - (double)(*s0));
x[0] = origin[0] + spacing[0]*(i+t);
x[1] = y;
*isect2Ptr = newPts->InsertNextPoint(x);
VTK_CSP3PA(i+1,j,k,s1);
outPD->InterpolateEdge(inPD, *isect2Ptr, edgePtId, edgePtId+1, t);
}
}
}
if (j < yMax)
{
s2 = (inPtrX + yInc);
v2 = (*s2 < value ? 0 : 1);
if (v0 ^ v2)
{
if (*s0 == value)
{
if (*isect2Ptr > -1)
{
*(isect2Ptr + 1) = *isect2Ptr;
}
else if (i > xMin && *(isect2Ptr-3) > -1)
{
*(isect2Ptr + 1) = *(isect2Ptr-3);
}
else if (j > yMin && *(isect2Ptr - yisectstep + 1) > -1)
{
*(isect2Ptr + 1) = *(isect2Ptr - yisectstep + 1);
}
else if (k > zMin && *(isect1Ptr+2) > -1)
{
*(isect2Ptr + 1) = *(isect1Ptr+2);
}
}
else if (*s2 == value && k > zMin && *(isect1Ptr + yisectstep + 2) > -1)
{
*(isect2Ptr+1) = *(isect1Ptr + yisectstep + 2);
}
// if the edge has not been set yet then it is a new point
if (*(isect2Ptr + 1) == -1)
{
t = (value - (double)(*s0)) / ((double)(*s2) - (double)(*s0));
x[0] = origin[0] + spacing[0]*i;
x[1] = y + spacing[1]*t;
*(isect2Ptr + 1) = newPts->InsertNextPoint(x);
VTK_CSP3PA(i,j+1,k,s2);
outPD->InterpolateEdge(inPD, *(isect2Ptr+1), edgePtId, edgePtId+yInc, t);
}
}
}
if (k < zMax)
{
s3 = (inPtrX + zInc);
v3 = (*s3 < value ? 0 : 1);
if (v0 ^ v3)
{
if (*s0 == value)
{
if (*isect2Ptr > -1)
{
*(isect2Ptr + 2) = *isect2Ptr;
}
else if (*(isect2Ptr+1) > -1)
{
*(isect2Ptr + 2) = *(isect2Ptr+1);
}
else if (i > xMin && *(isect2Ptr-3) > -1)
{
*(isect2Ptr + 2) = *(isect2Ptr-3);
}
else if (j > yMin && *(isect2Ptr - yisectstep + 1) > -1)
{
*(isect2Ptr + 2) = *(isect2Ptr - yisectstep + 1);
}
else if (k > zMin && *(isect1Ptr+2) > -1)
{
*(isect2Ptr + 2) = *(isect1Ptr+2);
}
}
if (*(isect2Ptr + 2) == -1)
{
t = (value - (double)(*s0)) / ((double)(*s3) - (double)(*s0));
xz[0] = origin[0] + spacing[0]*i;
xz[2] = z + spacing[2]*t;
*(isect2Ptr + 2) = newPts->InsertNextPoint(xz);
VTK_CSP3PA(i,j,k+1,s3);
outPD->InterpolateEdge(inPD, *(isect2Ptr+2), edgePtId, edgePtId+zInc, t);
}
}
}
// To keep track of ids for interpolating attributes.
++edgePtId;
// now add any polys that need to be added
// basically look at the isect values,
// form an index and lookup the polys
if (j > yMin && i < xMax && k > zMin)
{
idx = (v0 ? 4096 : 0);
idx = idx + (*(isect1Ptr - yisectstep) > -1 ? 2048 : 0);
idx = idx + (*(isect1Ptr -yisectstep +1) > -1 ? 1024 : 0);
idx = idx + (*(isect1Ptr -yisectstep +2) > -1 ? 512 : 0);
idx = idx + (*(isect1Ptr -yisectstep +4) > -1 ? 256 : 0);
idx = idx + (*(isect1Ptr -yisectstep +5) > -1 ? 128 : 0);
idx = idx + (*(isect1Ptr) > -1 ? 64 : 0);
idx = idx + (*(isect1Ptr + 2) > -1 ? 32 : 0);
idx = idx + (*(isect1Ptr + 5) > -1 ? 16 : 0);
idx = idx + (*(isect2Ptr -yisectstep) > -1 ? 8 : 0);
idx = idx + (*(isect2Ptr -yisectstep +1) > -1 ? 4 : 0);
idx = idx + (*(isect2Ptr -yisectstep +4) > -1 ? 2 : 0);
idx = idx + (*(isect2Ptr) > -1 ? 1 : 0);
tablePtr = VTK_SYNCHRONIZED_TEMPLATES_3D_TABLE_2
+ VTK_SYNCHRONIZED_TEMPLATES_3D_TABLE_1[idx];
while (*tablePtr != -1)
{
ptIds[0] = *(isect1Ptr + offsets[*tablePtr]);
tablePtr++;
ptIds[1] = *(isect1Ptr + offsets[*tablePtr]);
tablePtr++;
ptIds[2] = *(isect1Ptr + offsets[*tablePtr]);
tablePtr++;
if (ptIds[0] != ptIds[1] &&
ptIds[0] != ptIds[2] &&
ptIds[1] != ptIds[2])
{
outCellId = newPolys->InsertNextCell(3,ptIds);
outCD->CopyData(inCD, inCellId, outCellId);
}
}
}
inPtrX += xInc;
isect2Ptr += 3;
isect1Ptr += 3;
// To keep track of ids for copying cell attributes..
++inCellId;
}
inPtrY += yInc;
}
inPtrZ += zInc;
}
}
delete [] isect1;
if (newScalars)
{
// Lets set the name of the scalars here.
if (inScalars)
{
newScalars->SetName(inScalars->GetName());
}
idx = output->GetPointData()->AddArray(newScalars);
output->GetPointData()->SetActiveAttribute(idx, vtkDataSetAttributes::SCALARS);
newScalars->Delete();
newScalars = NULL;
}
if (newGradients)
{
output->GetPointData()->SetVectors(newGradients);
newGradients->Delete();
newGradients = NULL;
}
if (newNormals)
{
output->GetPointData()->SetNormals(newNormals);
newNormals->Delete();
newNormals = NULL;
}
}
//----------------------------------------------------------------------------
void vtkSynchronizedTemplates3D::SetInputMemoryLimit(
unsigned long vtkNotUsed(limit) )
{
vtkErrorMacro( << "This filter no longer supports a memory limit." );
vtkErrorMacro( << "This filter no longer initiates streaming." );
vtkErrorMacro( << "Please use a vtkPolyDataStreamer after this filter to achieve similar functionality." );
}
//----------------------------------------------------------------------------
unsigned long vtkSynchronizedTemplates3D::GetInputMemoryLimit()
{
vtkErrorMacro( << "This filter no longer supports a memory limit." );
vtkErrorMacro( << "This filter no longer initiates streaming." );
vtkErrorMacro( << "Please use a vtkPolyDataStreamer after this filter to achieve similar functionality." );
return 0;
}
//----------------------------------------------------------------------------
//
// Contouring filter specialized for images (or slices from images)
//
void vtkSynchronizedTemplates3D::ThreadedExecute(vtkImageData *data,
vtkInformation *inInfo,
vtkInformation *outInfo,
int *exExt, vtkDataArray *inScalars)
{
void *ptr;
vtkPolyData *output;
vtkDebugMacro(<< "Executing 3D structured contour");
output = vtkPolyData::SafeDownCast(outInfo->Get(vtkDataObject::DATA_OBJECT()));
if ( exExt[0] >= exExt[1] || exExt[2] >= exExt[3] || exExt[4] >= exExt[5] )
{
vtkDebugMacro(<<"3D structured contours requires 3D data");
return;
}
//
// Check data type and execute appropriate function
//
if (inScalars == NULL)
{
vtkDebugMacro("No scalars for contouring.");
return;
}
int numComps = inScalars->GetNumberOfComponents();
if (this->ArrayComponent >= numComps)
{
vtkErrorMacro("Scalars have " << numComps << " components. "
"ArrayComponent must be smaller than " << numComps);
return;
}
ptr = data->GetArrayPointerForExtent(inScalars, exExt);
switch (inScalars->GetDataType())
{
vtkTemplateMacro(
ContourImage(this, exExt, inInfo, data, output,
(VTK_TT *)ptr, inScalars));
}
}
//----------------------------------------------------------------------------
int vtkSynchronizedTemplates3D::RequestData(
vtkInformation *request,
vtkInformationVector **inputVector,
vtkInformationVector *outputVector)
{
// get the info objects
vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
vtkInformation *outInfo = outputVector->GetInformationObject(0);
// get the input and ouptut
vtkImageData *input = vtkImageData::SafeDownCast(
inInfo->Get(vtkDataObject::DATA_OBJECT()));
vtkPolyData *output = vtkPolyData::SafeDownCast(
outInfo->Get(vtkDataObject::DATA_OBJECT()));
// to be safe recompute the
this->RequestUpdateExtent(request,inputVector,outputVector);
vtkDataArray *inScalars = this->GetInputArrayToProcess(0,inputVector);
// Just call the threaded execute directly.
this->ThreadedExecute(input, inInfo, outInfo, this->ExecuteExtent, inScalars);
output->Squeeze();
return 1;
}
//----------------------------------------------------------------------------
int vtkSynchronizedTemplates3D::RequestUpdateExtent(
vtkInformation *vtkNotUsed(request),
vtkInformationVector **inputVector,
vtkInformationVector *outputVector)
{
// get the info objects
vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
vtkInformation *outInfo = outputVector->GetInformationObject(0);
int piece, numPieces;
int *wholeExt;
int ext[6];
vtkExtentTranslator *translator = vtkExtentTranslator::SafeDownCast(
inInfo->Get(vtkStreamingDemandDrivenPipeline::EXTENT_TRANSLATOR()));
wholeExt =
inInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT());
// Get request from output
piece =
outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_PIECE_NUMBER());
numPieces =
outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_NUMBER_OF_PIECES());
// Start with the whole grid.
inInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), ext);
// get the extent associated with the piece.
if (translator == NULL)
{
// Default behavior
if (piece != 0)
{
ext[0] = ext[2] = ext[4] = 0;
ext[1] = ext[3] = ext[5] = -1;
}
}
else
{
translator->PieceToExtentThreadSafe(piece, numPieces, 0, wholeExt, ext,
translator->GetSplitMode(),0);
}
// As a side product of this call, ExecuteExtent is set.
// This is the region that we are really updating, although
// we may require a larger input region in order to generate
// it if normals / gradients are being computed
this->ExecuteExtent[0] = ext[0];
this->ExecuteExtent[1] = ext[1];
this->ExecuteExtent[2] = ext[2];
this->ExecuteExtent[3] = ext[3];
this->ExecuteExtent[4] = ext[4];
this->ExecuteExtent[5] = ext[5];
// expand if we need to compute gradients
if (this->ComputeGradients || this->ComputeNormals)
{
ext[0] -= 1;
if (ext[0] < wholeExt[0])
{
ext[0] = wholeExt[0];
}
ext[1] += 1;
if (ext[1] > wholeExt[1])
{
ext[1] = wholeExt[1];
}
ext[2] -= 1;
if (ext[2] < wholeExt[2])
{
ext[2] = wholeExt[2];
}
ext[3] += 1;
if (ext[3] > wholeExt[3])
{
ext[3] = wholeExt[3];
}
ext[4] -= 1;
if (ext[4] < wholeExt[4])
{
ext[4] = wholeExt[4];
}
ext[5] += 1;
if (ext[5] > wholeExt[5])
{
ext[5] = wholeExt[5];
}
}
// Set the update extent of the input.
inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), ext, 6);
return 1;
}
//----------------------------------------------------------------------------
int vtkSynchronizedTemplates3D::FillInputPortInformation(int, vtkInformation *info)
{
info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkImageData");
return 1;
}
//----------------------------------------------------------------------------
void vtkSynchronizedTemplates3D::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os,indent);
this->ContourValues->PrintSelf(os,indent.GetNextIndent());
os << indent << "Compute Normals: " << (this->ComputeNormals ? "On\n" : "Off\n");
os << indent << "Compute Gradients: " << (this->ComputeGradients ? "On\n" : "Off\n");
os << indent << "Compute Scalars: " << (this->ComputeScalars ? "On\n" : "Off\n");
os << indent << "ArrayComponent: " << this->ArrayComponent << endl;
}
// template table.
int VTK_SYNCHRONIZED_TEMPLATES_3D_TABLE_1[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 592,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1312, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 585, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 260, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 948, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 935, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 250, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 620, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 16, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 530, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1263, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 988, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 288, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 201, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 874, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 106, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 746, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1119, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
404, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 414, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1126, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 736, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 99, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 786, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
134, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 355, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1064,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1172, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 448, 0, 0, 0, 0, 0, 0, 0,
0, 0, 62, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 687, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1211, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
484, 0, 0, 0, 0, 0, 0, 0, 0, 0,
44, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 660,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 822, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 161, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 328, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1028, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 441, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1162, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 700, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 72, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
124, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 773,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1080,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 368, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1018,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 315, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 174, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 838, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 647, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 34, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 494, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1218, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 278, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 975, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 890,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 214, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 610,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1276, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 540, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1011, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 305, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 181, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 848, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 637, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 27, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 504, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1231, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 271, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 965,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 903, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 224, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 5, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 603, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1292,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 553, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1201,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 471, 0, 0, 0,
0, 0, 0, 0, 0, 0, 48, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 667, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 809, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
151, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 335, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1038,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 431, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1149, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 710, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 79, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 117, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 763, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1093, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 378, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 110, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 753, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1109, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
391, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 421, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1136, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 723, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 89, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 796, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
141, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 345, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1051,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1185, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 458, 0, 0, 0, 0, 0, 0, 0,
0, 0, 55, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 677, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 596, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1299, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 569, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 264, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 955, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 919,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 237, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 627, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
20, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 517, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1247, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 998, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 295, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 191, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 861, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 2036, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1316, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2040, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 2404, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1641,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1648, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 2408, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1993,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 2696, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 2080, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1344,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1592, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2361, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 2460, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1688, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2594, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1837,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1470,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 2218, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 2211, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1460, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1850, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 2598, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1776, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 2557, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2270, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1510, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1411, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 2168, 0,
0, 0, 0, 0, 0, 0, 0, 0, 2632, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1896, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1384,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 2132, 0, 0, 0,
0, 0, 0, 0, 0, 0, 2662, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1941, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1740, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2512, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 2315, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1546,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 2184, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1424, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1886, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 2625, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 2564, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1792, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1497, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 2254, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1562, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 2322, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2499, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1724,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1954, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2666, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 2116, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1371, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 2374, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1602, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1675, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 2444, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 2700, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 2000, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1334, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2067, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1572, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 2335, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 2489, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1711, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1967,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 2676, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 2103, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1361,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2384, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1615, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1665, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2431, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 2707, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 2016, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1327, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 2057, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1391, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 2142, 0, 0, 0, 0, 0, 0, 0,
0, 0, 2655, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1925, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1750, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 2525, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2299, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1533, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 2191, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1434, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1873, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2615, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 2574, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1805, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1487, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 2241, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2587, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1821,
0, 0, 0, 0, 0, 0, 0, 0, 0, 1477,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 2228, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 2201, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1447, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1860, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 2605, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1763, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 2541, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2283, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1520, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1401, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 2155, 0,
0, 0, 0, 0, 0, 0, 0, 0, 2642, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1909, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2711, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 2029,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1320, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 2047, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 2391, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1625, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1655, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 2418, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1977, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 2683, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 2090, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1351, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1579, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 2345, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 2473, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1698 };
int VTK_SYNCHRONIZED_TEMPLATES_3D_TABLE_2[] = {
-1, 0, 1, 2, -1, 0, 4, 3, -1, 3, 1, 2,
4, 3, 2, -1, 3, 7, 5, -1, 0, 1, 2, 3,
7, 5, -1, 4, 7, 5, 0, 4, 5, -1, 5, 1,
2, 5, 2, 7, 7, 2, 4, -1, 1, 5, 6, -1,
0, 5, 6, 2, 0, 6, -1, 3, 0, 4, 5, 6,
1, -1, 3, 5, 6, 3, 6, 4, 4, 6, 2, -1,
1, 3, 7, 6, 1, 7, -1, 0, 3, 7, 0, 7,
2, 2, 7, 6, -1, 1, 0, 4, 1, 4, 6, 6,
4, 7, -1, 4, 7, 2, 7, 6, 2, -1, 8, 2,
9, -1, 8, 0, 1, 9, 8, 1, -1, 0, 4, 3,
2, 9, 8, -1, 8, 4, 3, 8, 3, 9, 9, 3,
1, -1, 3, 7, 5, 2, 9, 8, -1, 1, 9, 8,
1, 8, 0, 3, 7, 5, -1, 4, 7, 5, 4, 5,
0, 2, 9, 8, -1, 5, 4, 7, 5, 9, 4, 5,
1, 9, 9, 8, 4, -1, 2, 9, 8, 1, 5, 6,
-1, 6, 9, 8, 6, 8, 5, 5, 8, 0, -1, 4,
3, 0, 2, 9, 8, 5, 6, 1, -1, 8, 6, 9,
4, 6, 8, 4, 5, 6, 4, 3, 5, -1, 1, 3,
7, 1, 7, 6, 9, 8, 2, -1, 3, 7, 6, 3,
6, 8, 3, 8, 0, 9, 8, 6, -1, 8, 2, 9,
4, 6, 0, 4, 7, 6, 6, 1, 0, -1, 8, 6,
9, 8, 4, 6, 4, 7, 6, -1, 4, 8, 10, -1,
4, 8, 10, 0, 1, 2, -1, 0, 8, 10, 3, 0,
10, -1, 2, 8, 10, 2, 10, 1, 1, 10, 3, -1,
3, 7, 5, 4, 8, 10, -1, 1, 2, 0, 3, 7,
5, 8, 10, 4, -1, 10, 7, 5, 10, 5, 8, 8,
5, 0, -1, 5, 10, 7, 1, 10, 5, 1, 8, 10,
1, 2, 8, -1, 4, 8, 10, 5, 6, 1, -1, 0,
5, 6, 0, 6, 2, 8, 10, 4, -1, 0, 8, 10,
0, 10, 3, 5, 6, 1, -1, 5, 10, 3, 5, 2,
10, 5, 6, 2, 8, 10, 2, -1, 7, 6, 1, 7,
1, 3, 4, 8, 10, -1, 8, 10, 4, 0, 3, 2,
2, 3, 7, 2, 7, 6, -1, 10, 0, 8, 10, 6,
0, 10, 7, 6, 6, 1, 0, -1, 10, 2, 8, 10,
7, 2, 7, 6, 2, -1, 4, 2, 9, 10, 4, 9,
-1, 4, 0, 1, 4, 1, 10, 10, 1, 9, -1, 0,
2, 9, 0, 9, 3, 3, 9, 10, -1, 3, 1, 10,
1, 9, 10, -1, 4, 2, 9, 4, 9, 10, 7, 5,
3, -1, 7, 5, 3, 4, 0, 10, 10, 0, 1, 10,
1, 9, -1, 2, 5, 0, 2, 10, 5, 2, 9, 10,
7, 5, 10, -1, 5, 10, 7, 5, 1, 10, 1, 9,
10, -1, 9, 10, 4, 9, 4, 2, 1, 5, 6, -1,
4, 9, 10, 4, 5, 9, 4, 0, 5, 5, 6, 9,
-1, 5, 6, 1, 0, 2, 3, 3, 2, 9, 3, 9,
10, -1, 6, 3, 5, 6, 9, 3, 9, 10, 3, -1,
4, 2, 10, 2, 9, 10, 7, 1, 3, 7, 6, 1,
-1, 10, 0, 9, 10, 4, 0, 9, 0, 6, 3, 7,
0, 6, 0, 7, -1, 6, 0, 7, 6, 1, 0, 7,
0, 10, 2, 9, 0, 10, 0, 9, -1, 6, 10, 7,
9, 10, 6, -1, 7, 10, 11, -1, 0, 1, 2, 10,
11, 7, -1, 4, 3, 0, 10, 11, 7, -1, 3, 1,
2, 3, 2, 4, 10, 11, 7, -1, 3, 10, 11, 5,
3, 11, -1, 3, 10, 11, 3, 11, 5, 1, 2, 0,
-1, 4, 10, 11, 4, 11, 0, 0, 11, 5, -1, 10,
2, 4, 10, 5, 2, 10, 11, 5, 1, 2, 5, -1,
5, 6, 1, 7, 10, 11, -1, 6, 2, 0, 6, 0,
5, 7, 10, 11, -1, 0, 4, 3, 5, 6, 1, 10,
11, 7, -1, 10, 11, 7, 3, 5, 4, 4, 5, 6,
4, 6, 2, -1, 11, 6, 1, 11, 1, 10, 10, 1,
3, -1, 0, 6, 2, 0, 10, 6, 0, 3, 10, 10,
11, 6, -1, 1, 11, 6, 0, 11, 1, 0, 10, 11,
0, 4, 10, -1, 11, 4, 10, 11, 6, 4, 6, 2,
4, -1, 10, 11, 7, 8, 2, 9, -1, 8, 0, 1,
8, 1, 9, 11, 7, 10, -1, 3, 0, 4, 10, 11,
7, 2, 9, 8, -1, 7, 10, 11, 3, 9, 4, 3,
1, 9, 9, 8, 4, -1, 11, 5, 3, 11, 3, 10,
8, 2, 9, -1, 3, 10, 5, 10, 11, 5, 1, 8,
0, 1, 9, 8, -1, 2, 9, 8, 4, 10, 0, 0,
10, 11, 0, 11, 5, -1, 9, 4, 1, 9, 8, 4,
1, 4, 5, 10, 11, 4, 5, 4, 11, -1, 1, 5,
6, 9, 8, 2, 7, 10, 11, -1, 10, 11, 7, 8,
5, 9, 8, 0, 5, 5, 6, 9, -1, 0, 4, 3,
8, 2, 9, 5, 6, 1, 10, 11, 7, -1, 4, 3,
5, 4, 5, 6, 4, 6, 8, 9, 8, 6, 10, 11,
7, -1, 2, 9, 8, 1, 10, 6, 1, 3, 10, 10,
11, 6, -1, 10, 6, 3, 10, 11, 6, 3, 6, 0,
9, 8, 6, 0, 6, 8, -1, 0, 4, 10, 0, 10,
11, 0, 11, 1, 6, 1, 11, 2, 9, 8, -1, 11,
4, 10, 11, 6, 4, 8, 4, 9, 9, 4, 6, -1,
7, 4, 8, 11, 7, 8, -1, 8, 11, 7, 8, 7,
4, 0, 1, 2, -1, 7, 3, 0, 7, 0, 11, 11,
0, 8, -1, 2, 3, 1, 2, 11, 3, 2, 8, 11,
11, 7, 3, -1, 3, 4, 8, 3, 8, 5, 5, 8,
11, -1, 1, 2, 0, 3, 4, 5, 5, 4, 8, 5,
8, 11, -1, 0, 8, 5, 8, 11, 5, -1, 2, 5,
1, 2, 8, 5, 8, 11, 5, -1, 7, 4, 8, 7,
8, 11, 6, 1, 5, -1, 0, 5, 2, 5, 6, 2,
8, 7, 4, 8, 11, 7, -1, 1, 5, 6, 0, 11,
3, 0, 8, 11, 11, 7, 3, -1, 11, 3, 8, 11,
7, 3, 8, 3, 2, 5, 6, 3, 2, 3, 6, -1,
4, 8, 11, 4, 11, 1, 4, 1, 3, 6, 1, 11,
-1, 2, 3, 6, 2, 0, 3, 6, 3, 11, 4, 8,
3, 11, 3, 8, -1, 1, 11, 6, 1, 0, 11, 0,
8, 11, -1, 11, 2, 8, 6, 2, 11, -1, 9, 11,
7, 9, 7, 2, 2, 7, 4, -1, 0, 1, 9, 0,
9, 7, 0, 7, 4, 11, 7, 9, -1, 7, 9, 11,
3, 9, 7, 3, 2, 9, 3, 0, 2, -1, 7, 9,
11, 7, 3, 9, 3, 1, 9, -1, 3, 11, 5, 3,
2, 11, 3, 4, 2, 2, 9, 11, -1, 5, 4, 11,
5, 3, 4, 11, 4, 9, 0, 1, 4, 9, 4, 1,
-1, 9, 0, 2, 9, 11, 0, 11, 5, 0, -1, 9,
5, 1, 11, 5, 9, -1, 5, 6, 1, 7, 2, 11,
7, 4, 2, 2, 9, 11, -1, 5, 9, 0, 5, 6,
9, 0, 9, 4, 11, 7, 9, 4, 9, 7, -1, 3,
0, 2, 3, 2, 9, 3, 9, 7, 11, 7, 9, 5,
6, 1, -1, 6, 3, 5, 6, 9, 3, 7, 3, 11,
11, 3, 9, -1, 2, 11, 4, 2, 9, 11, 4, 11,
3, 6, 1, 11, 3, 11, 1, -1, 0, 3, 4, 6,
9, 11, -1, 9, 0, 2, 9, 11, 0, 1, 0, 6,
6, 0, 11, -1, 9, 11, 6, -1, 9, 6, 11, -1,
1, 2, 0, 6, 11, 9, -1, 0, 4, 3, 6, 11,
9, -1, 2, 4, 3, 2, 3, 1, 6, 11, 9, -1,
7, 5, 3, 11, 9, 6, -1, 3, 7, 5, 1, 2,
0, 11, 9, 6, -1, 5, 0, 4, 5, 4, 7, 11,
9, 6, -1, 11, 9, 6, 5, 1, 7, 7, 1, 2,
7, 2, 4, -1, 9, 1, 5, 11, 9, 5, -1, 9,
2, 0, 9, 0, 11, 11, 0, 5, -1, 5, 11, 9,
5, 9, 1, 0, 4, 3, -1, 3, 5, 11, 3, 11,
2, 3, 2, 4, 2, 11, 9, -1, 7, 11, 9, 7,
9, 3, 3, 9, 1, -1, 7, 11, 9, 3, 7, 9,
3, 9, 2, 3, 2, 0, -1, 0, 9, 1, 0, 7,
9, 0, 4, 7, 11, 9, 7, -1, 9, 7, 11, 9,
2, 7, 2, 4, 7, -1, 11, 8, 2, 6, 11, 2,
-1, 1, 6, 11, 1, 11, 0, 0, 11, 8, -1, 2,
6, 11, 2, 11, 8, 4, 3, 0, -1, 4, 11, 8,
4, 1, 11, 4, 3, 1, 6, 11, 1, -1, 11, 8,
2, 11, 2, 6, 5, 3, 7, -1, 3, 7, 5, 1,
6, 0, 0, 6, 11, 0, 11, 8, -1, 8, 2, 6,
8, 6, 11, 0, 4, 5, 5, 4, 7, -1, 7, 1,
4, 7, 5, 1, 4, 1, 8, 6, 11, 1, 8, 1,
11, -1, 2, 1, 5, 2, 5, 8, 8, 5, 11, -1,
0, 5, 8, 8, 5, 11, -1, 3, 0, 4, 5, 8,
1, 5, 11, 8, 8, 2, 1, -1, 3, 8, 4, 3,
5, 8, 5, 11, 8, -1, 2, 1, 3, 2, 3, 11,
2, 11, 8, 11, 3, 7, -1, 7, 0, 3, 7, 11,
0, 11, 8, 0, -1, 8, 1, 11, 8, 2, 1, 11,
1, 7, 0, 4, 1, 7, 1, 4, -1, 7, 8, 4,
11, 8, 7, -1, 8, 10, 4, 9, 6, 11, -1, 0,
1, 2, 8, 10, 4, 6, 11, 9, -1, 10, 3, 0,
10, 0, 8, 9, 6, 11, -1, 6, 11, 9, 2, 8,
1, 1, 8, 10, 1, 10, 3, -1, 4, 8, 10, 7,
5, 3, 9, 6, 11, -1, 11, 9, 6, 3, 7, 5,
0, 1, 2, 8, 10, 4, -1, 9, 6, 11, 10, 7,
8, 8, 7, 5, 8, 5, 0, -1, 1, 2, 8, 1,
8, 10, 1, 10, 5, 7, 5, 10, 6, 11, 9, -1,
9, 1, 5, 9, 5, 11, 10, 4, 8, -1, 4, 8,
10, 0, 11, 2, 0, 5, 11, 11, 9, 2, -1, 1,
5, 11, 1, 11, 9, 3, 0, 10, 10, 0, 8, -1,
11, 2, 5, 11, 9, 2, 5, 2, 3, 8, 10, 2,
3, 2, 10, -1, 4, 8, 10, 7, 11, 3, 3, 11,
9, 3, 9, 1, -1, 3, 7, 11, 3, 11, 9, 3,
9, 0, 2, 0, 9, 4, 8, 10, -1, 8, 7, 0,
8, 10, 7, 0, 7, 1, 11, 9, 7, 1, 7, 9,
-1, 9, 7, 11, 9, 2, 7, 10, 7, 8, 8, 7,
2, -1, 11, 10, 4, 11, 4, 6, 6, 4, 2, -1,
1, 6, 11, 0, 1, 11, 0, 11, 10, 0, 10, 4,
-1, 0, 2, 6, 0, 6, 10, 0, 10, 3, 10, 6,
11, -1, 11, 1, 6, 11, 10, 1, 10, 3, 1, -1,
3, 7, 5, 4, 6, 10, 4, 2, 6, 6, 11, 10,
-1, 0, 1, 6, 0, 6, 11, 0, 11, 4, 10, 4,
11, 3, 7, 5, -1, 6, 10, 2, 6, 11, 10, 2,
10, 0, 7, 5, 10, 0, 10, 5, -1, 11, 1, 6,
11, 10, 1, 5, 1, 7, 7, 1, 10, -1, 10, 4,
2, 10, 2, 5, 10, 5, 11, 1, 5, 2, -1, 4,
11, 10, 4, 0, 11, 0, 5, 11, -1, 3, 2, 10,
3, 0, 2, 10, 2, 11, 1, 5, 2, 11, 2, 5,
-1, 3, 11, 10, 5, 11, 3, -1, 3, 11, 1, 3,
7, 11, 1, 11, 2, 10, 4, 11, 2, 11, 4, -1,
7, 0, 3, 7, 11, 0, 4, 0, 10, 10, 0, 11,
-1, 0, 2, 1, 10, 7, 11, -1, 7, 11, 10, -1,
6, 7, 10, 9, 6, 10, -1, 6, 7, 10, 6, 10,
9, 2, 0, 1, -1, 10, 9, 6, 10, 6, 7, 3,
0, 4, -1, 7, 10, 9, 7, 9, 6, 4, 3, 2,
2, 3, 1, -1, 6, 5, 3, 6, 3, 9, 9, 3,
10, -1, 0, 1, 2, 3, 9, 5, 3, 10, 9, 9,
6, 5, -1, 4, 10, 9, 4, 9, 5, 4, 5, 0,
5, 9, 6, -1, 9, 5, 10, 9, 6, 5, 10, 5,
4, 1, 2, 5, 4, 5, 2, -1, 5, 7, 10, 5,
10, 1, 1, 10, 9, -1, 2, 0, 5, 2, 5, 10,
2, 10, 9, 7, 10, 5, -1, 4, 3, 0, 10, 1,
7, 10, 9, 1, 1, 5, 7, -1, 4, 5, 2, 4,
3, 5, 2, 5, 9, 7, 10, 5, 9, 5, 10, -1,
3, 10, 1, 1, 10, 9, -1, 0, 9, 2, 0, 3,
9, 3, 10, 9, -1, 4, 1, 0, 4, 10, 1, 10,
9, 1, -1, 4, 9, 2, 10, 9, 4, -1, 10, 8,
2, 10, 2, 7, 7, 2, 6, -1, 10, 8, 0, 10,
0, 6, 10, 6, 7, 6, 0, 1, -1, 0, 4, 3,
2, 7, 8, 2, 6, 7, 7, 10, 8, -1, 7, 8,
6, 7, 10, 8, 6, 8, 1, 4, 3, 8, 1, 8,
3, -1, 5, 3, 10, 5, 10, 2, 5, 2, 6, 8,
2, 10, -1, 0, 6, 8, 0, 1, 6, 8, 6, 10,
5, 3, 6, 10, 6, 3, -1, 0, 10, 5, 0, 4,
10, 5, 10, 6, 8, 2, 10, 6, 10, 2, -1, 4,
10, 8, 5, 1, 6, -1, 5, 7, 10, 1, 5, 10,
1, 10, 8, 1, 8, 2, -1, 10, 5, 7, 10, 8,
5, 8, 0, 5, -1, 1, 5, 7, 1, 7, 10, 1,
10, 2, 8, 2, 10, 0, 4, 3, -1, 10, 5, 7,
10, 8, 5, 3, 5, 4, 4, 5, 8, -1, 2, 10,
8, 2, 1, 10, 1, 3, 10, -1, 0, 10, 8, 3,
10, 0, -1, 2, 10, 8, 2, 1, 10, 4, 10, 0,
0, 10, 1, -1, 4, 10, 8, -1, 8, 9, 6, 8,
6, 4, 4, 6, 7, -1, 0, 1, 2, 8, 9, 4,
4, 9, 6, 4, 6, 7, -1, 3, 6, 7, 3, 8,
6, 3, 0, 8, 9, 6, 8, -1, 1, 8, 3, 1,
2, 8, 3, 8, 7, 9, 6, 8, 7, 8, 6, -1,
8, 9, 6, 4, 8, 6, 4, 6, 5, 4, 5, 3,
-1, 4, 8, 9, 4, 9, 6, 4, 6, 3, 5, 3,
6, 0, 1, 2, -1, 6, 8, 9, 6, 5, 8, 5,
0, 8, -1, 6, 8, 9, 6, 5, 8, 2, 8, 1,
1, 8, 5, -1, 5, 7, 4, 5, 4, 9, 5, 9,
1, 9, 4, 8, -1, 4, 9, 7, 4, 8, 9, 7,
9, 5, 2, 0, 9, 5, 9, 0, -1, 1, 7, 9,
1, 5, 7, 9, 7, 8, 3, 0, 7, 8, 7, 0,
-1, 3, 5, 7, 2, 8, 9, -1, 8, 3, 4, 8,
9, 3, 9, 1, 3, -1, 8, 3, 4, 8, 9, 3,
0, 3, 2, 2, 3, 9, -1, 8, 1, 0, 9, 1,
8, -1, 8, 9, 2, -1, 4, 2, 7, 7, 2, 6,
-1, 1, 4, 0, 1, 6, 4, 6, 7, 4, -1, 0,
7, 3, 0, 2, 7, 2, 6, 7, -1, 1, 7, 3,
6, 7, 1, -1, 3, 6, 5, 3, 4, 6, 4, 2,
6, -1, 1, 4, 0, 1, 6, 4, 3, 4, 5, 5,
4, 6, -1, 0, 6, 5, 2, 6, 0, -1, 1, 6,
5, -1, 5, 2, 1, 5, 7, 2, 7, 4, 2, -1,
4, 5, 7, 0, 5, 4, -1, 5, 2, 1, 5, 7,
2, 0, 2, 3, 3, 2, 7, -1, 3, 5, 7, -1,
3, 2, 1, 4, 2, 3, -1, 0, 3, 4, -1, 0,
2, 1, -1 };