diff --git a/Common/CommandLine.cpp b/Common/CommandLine.cpp index 39873e7f8948fbf66ae067d6505c9deb27962ef3..657db5ce90ef3398c7e21561c533e79f63772f76 100644 --- a/Common/CommandLine.cpp +++ b/Common/CommandLine.cpp @@ -1129,10 +1129,6 @@ void GetOptions(int argc, char *argv[]) else Msg::Fatal("Missing argument"); } - else if(!strcmp(argv[i] + 1, "showCompounds")) { - CTX::instance()->geom.hideCompounds = 0; - i++; - } #endif #if defined(__APPLE__) else if(!strncmp(argv[i] + 1, "psn", 3)) { diff --git a/Common/Context.cpp b/Common/Context.cpp index 2fbfe7d5b762d5e770c5791b295402134278acb7..3b149fb555a1c02b5388f08b8893c8e356044de8 100644 --- a/Common/Context.cpp +++ b/Common/Context.cpp @@ -79,7 +79,6 @@ CTX::CTX() : gamepad(0) // need to initialize these too, since the corresponding opt_XXX routines use // the current value to detect changes - geom.hideCompounds = 1; mesh.changed = 0; mesh.qualityInf = mesh.qualitySup = mesh.qualityType = 0; mesh.radiusInf = mesh.radiusSup = 0; diff --git a/Common/Context.h b/Common/Context.h index b34a23fb508980450620d25193ba7b2ae15b0f7b..c5c361aebb8d519c56f0eac3fa43161c1c74135b 100644 --- a/Common/Context.h +++ b/Common/Context.h @@ -80,7 +80,7 @@ struct contextGeometryOptions { double occScaling; int copyMeshingMethod, exactExtrusion; int matchGeomAndMesh; - int hideCompounds, orientedPhysicals, doubleClickedEntityTag; + int orientedPhysicals, doubleClickedEntityTag; int reparamOnFaceRobust; std::string doubleClickedPointCommand, doubleClickedLineCommand; std::string doubleClickedSurfaceCommand, doubleClickedVolumeCommand; diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h index b46b59db529f3aa31221a8e84b5ae2ea5eda32e3..ffe67a003ff4b06ed14ef47627538b7fd9ae7b29 100644 --- a/Common/DefaultOptions.h +++ b/Common/DefaultOptions.h @@ -836,8 +836,6 @@ StringXNumber GeometryOptions_Number[] = { { F|O, "ExtrudeSplinePoints" , opt_geometry_extrude_spline_points, 5. , "Number of control points for splines created during extrusion" }, - { F|O, "HideCompounds" , opt_geometry_hide_compounds, 1. , - "Hide entities that make up compound entities?" }, { F|O, "HighlightOrphans" , opt_geometry_highlight_orphans, 0. , "Highlight orphan entities (lines connected to a single surface, etc.)?" }, diff --git a/Common/OpenFile.cpp b/Common/OpenFile.cpp index 3d27cbcc645ea550eef605924efaf45dbedd6d93..1be10f3bc3dc6967047b213f261770738a877d8a 100644 --- a/Common/OpenFile.cpp +++ b/Common/OpenFile.cpp @@ -745,7 +745,6 @@ void OpenProject(const std::string &fileName) FlGui::instance()->updateViews(true, false); FlGui::instance()->updateFields(); GModel::current()->setSelection(0); - GModel::current()->setCompoundVisibility(); } #endif } diff --git a/Common/Options.cpp b/Common/Options.cpp index 0dad09c0637618c86705c0bf2311bc22563bddb0..a99ba9bdec715dec004cb7d33e4e380f4f8bbfcb 100644 --- a/Common/Options.cpp +++ b/Common/Options.cpp @@ -4399,28 +4399,6 @@ double opt_geometry_auto_coherence(OPT_ARGS_NUM) return CTX::instance()->geom.autoCoherence; } -double opt_geometry_hide_compounds(OPT_ARGS_NUM) -{ - if(action & GMSH_SET){ - int old = CTX::instance()->geom.hideCompounds; - CTX::instance()->geom.hideCompounds = (int)val; - if(old != (int)val){ - GModel::current()->setCompoundVisibility(); - CTX::instance()->mesh.changed = ENT_ALL; -#if defined(HAVE_FLTK) - if(FlGui::available()) FlGui::instance()->resetVisibility(); -#endif - } - } -#if defined(HAVE_FLTK) - if(FlGui::available() && (action & GMSH_GUI)){ - FlGui::instance()->options->geo.butt[17]->value - (CTX::instance()->geom.hideCompounds); - } -#endif - return CTX::instance()->geom.hideCompounds; -} - double opt_geometry_oriented_physicals(OPT_ARGS_NUM) { if(action & GMSH_SET) diff --git a/Common/Options.h b/Common/Options.h index 95436360dd5dc95b2be5e4345f81d84e16db041a..5cb13d5a000c53e076a3003fc84248fa5721898a 100644 --- a/Common/Options.h +++ b/Common/Options.h @@ -360,7 +360,6 @@ double opt_geometry_offset0(OPT_ARGS_NUM); double opt_geometry_offset1(OPT_ARGS_NUM); double opt_geometry_offset2(OPT_ARGS_NUM); double opt_geometry_auto_coherence(OPT_ARGS_NUM); -double opt_geometry_hide_compounds(OPT_ARGS_NUM); double opt_geometry_oriented_physicals(OPT_ARGS_NUM); double opt_geometry_highlight_orphans(OPT_ARGS_NUM); double opt_geometry_tolerance(OPT_ARGS_NUM); diff --git a/Fltk/optionWindow.cpp b/Fltk/optionWindow.cpp index e2358c070dbbf896caa71cdb692e4f854238cacb..7c0d6e920567ad62e2adab546f0cd5caad74419a 100644 --- a/Fltk/optionWindow.cpp +++ b/Fltk/optionWindow.cpp @@ -429,7 +429,6 @@ static void geometry_options_ok_cb(Fl_Widget *w, void *data) opt_geometry_occ_scaling(0, GMSH_SET, o->geo.value[20]->value()); opt_geometry_light_two_side(0, GMSH_SET, o->geo.butt[14]->value()); - opt_geometry_hide_compounds(0, GMSH_SET, o->geo.butt[17]->value()); opt_geometry_normals(0, GMSH_SET, o->geo.value[0]->value()); opt_geometry_tangents(0, GMSH_SET, o->geo.value[1]->value()); diff --git a/Geo/CMakeLists.txt b/Geo/CMakeLists.txt index 2dff8ae7b53c33b1854a6afcbc1985e42f738224..d627e60f8a97f0b8c7ff86f540806b5891a7932d 100644 --- a/Geo/CMakeLists.txt +++ b/Geo/CMakeLists.txt @@ -9,17 +9,14 @@ set(SRC intersectCurveSurface.cpp GEntity.cpp STensor3.cpp GVertex.cpp GEdge.cpp GFace.cpp GRegion.cpp - GEdgeLoop.cpp GEdgeCompound.cpp GFaceCompound.cpp - GRegionCompound.cpp GRbf.cpp + GEdgeLoop.cpp gmshVertex.cpp gmshEdge.cpp gmshFace.cpp gmshRegion.cpp - gmshSurface.cpp - OCCVertex.cpp OCCEdge.cpp OCCFace.cpp OCCRegion.cpp - GenericVertex.cpp GenericEdge.cpp GenericFace.cpp GenericRegion.cpp + gmshSurface.cpp + OCCVertex.cpp OCCEdge.cpp OCCFace.cpp OCCRegion.cpp + GenericVertex.cpp GenericEdge.cpp GenericFace.cpp GenericRegion.cpp discreteEdge.cpp discreteFace.cpp discreteDiskFace.cpp discreteRegion.cpp fourierEdge.cpp fourierFace.cpp fourierProjectionFace.cpp - ACISVertex.cpp - ACISEdge.cpp - ACISFace.cpp + ACISVertex.cpp ACISEdge.cpp ACISFace.cpp GModel.cpp GModelCreateTopologyFromMesh.cpp GModelVertexArrays.cpp @@ -46,7 +43,6 @@ set(SRC MHexahedron.cpp MPrism.cpp MPyramid.cpp MTrihedron.cpp MElementCut.cpp MSubElement.cpp MZone.cpp MZoneBoundary.cpp Cell.cpp CellComplex.cpp ChainComplex.cpp Homology.cpp Chain.cpp - Curvature.cpp MVertexBoundaryLayerData.cpp ) diff --git a/Geo/Curvature.cpp b/Geo/Curvature.cpp deleted file mode 100644 index 3607cf1416908824f3cb14af3243358791a55a6a..0000000000000000000000000000000000000000 --- a/Geo/Curvature.cpp +++ /dev/null @@ -1,1987 +0,0 @@ -// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle -// -// See the LICENSE.txt file for license information. Please report all -// bugs and problems to the public mailing list <gmsh@onelab.info>. - -#include "Curvature.h" -#include "MElement.h" -#include "MTriangle.h" -#include "GEntity.h" -#include "GFaceCompound.h" -#include "MLine.h" -#include "GRbf.h" -#include "OS.h" -#include "SBoundingBox3d.h" -#include "discreteEdge.h" - -#include<iostream> -#include<fstream> -#include<cmath> - -#define NEXT(i) ((i)<2 ? (i)+1 : (i)-2) -#define PREV(i) ((i)>0 ? (i)-1 : (i)+2) -//======================================================================================================== - -//Initialization of the static variables: -Curvature* Curvature::_instance = 0; -bool Curvature::_destroyed = false; -bool Curvature::_alreadyComputedCurvature = false; - -//======================================================================================================== - -//CONSTRUCTOR -Curvature::Curvature() : _isMapInitialized(false) -{ -} - -// Curvature::Curvature(std::list<GFace*> &myFaces){ - -// std::list<GFace*>::const_iterator it = myFaces.begin(); -// for( ; it != myFaces.end() ; ++it){ -// _ptFinalEntityList.push_back(*it); -// } - -// } - -//======================================================================================================== - -Curvature::~Curvature() -{ - _instance = 0; - _destroyed = true; - -} -//======================================================================================================== -void Curvature::onDeadReference() -{ - std::cout << "Dead reference of Curvature detected" << std::endl; -} -//======================================================================================================== - -Curvature& Curvature::getInstance() -{ - if (!_instance) { - if(_destroyed){ - onDeadReference(); - } - else{ - create(); - } - } - return *_instance; -} -//======================================================================================================== - bool Curvature::valueAlreadyComputed() - { - return _alreadyComputedCurvature; - } - -//======================================================================================================== - - void Curvature::create() - { - static Curvature instance; - _instance = & instance; - } - - //======================================================================================================== - void Curvature::retrieveCompounds() { -#if defined(HAVE_SOLVER) - - /// ------------------------------------------------------------------------------------------- - // Loop over all faces. Check if the face is a compound. If it is, store all of its discrete - // faces in _EntityArray - - std::list<GFace*> global_face_list; - - for(GModel::fiter face_iter = _model->firstFace(); face_iter != _model->lastFace(); ++face_iter) - { - if ( (*face_iter)->geomType() != GEntity::CompoundSurface ){ - if (!(*face_iter)->getCompound()){ - global_face_list.push_back(*face_iter); - } - } - else if ( (*face_iter)->geomType() == GEntity::CompoundSurface ) - { - GFaceCompound* compound = dynamic_cast<GFaceCompound*>(*face_iter); - std::list<GFace*> tempcompounds = compound->getCompounds(); - std::list<GFace*>::iterator surfIterator; - - for(surfIterator = tempcompounds.begin(); surfIterator != tempcompounds.end(); ++surfIterator) - { - if ((*surfIterator)->geomType() == GEntity::DiscreteSurface) - { - global_face_list.push_back(*surfIterator); - } - } - } - - } // Loop over faces of the model - - global_face_list.sort(); - global_face_list.unique(); - _EntityArray.resize(global_face_list.size()); - std::copy(global_face_list.begin(),global_face_list.end(),_EntityArray.begin()); -#endif - } - - //======================================================================================================== - - // Method to detect boundary edges of the mesh. We want to find which edges are on the boundary in order - // to correct the curvature field close to boundaries - - void Curvature::correctOnEdges() - { -#if defined(HAVE_SOLVER) - - if (! _alreadyComputedCurvature ) - { - Msg::Error("Cannot correct the curvature values at the edges because the curvatures weren't computed yet"); - return; - } - // Remark: this can only be used after the call to initializeMap() ! - - buildEdgeList(); - - std::list<MeshEdgeInfo>::iterator VertToEdgeListIter; - - _isOnBoundary.resize(_VertexToInt.size()); - for (unsigned int i = 0; i < _VertexToInt.size(); ++i) - { - _isOnBoundary[i] = 0; - } - - // To detect the nodes on the egdes of a geometry, we create a list of all edges on the mesh. The - // edges which are shared by only one mesh element are boundary edges. Their nodes are tagged by 1 - for (unsigned int i = 0; i < _VertexToInt.size(); ++i) - { - for (VertToEdgeListIter = _VertexToEdgeList[i].begin(); VertToEdgeListIter != _VertexToEdgeList[i].end(); - ++VertToEdgeListIter) - { - if ((*VertToEdgeListIter).NbElemNeighbour == 1) - { - _isOnBoundary[(*VertToEdgeListIter).StartV] = 1; - _isOnBoundary[(*VertToEdgeListIter).EndV] = 1; - } - } - - } - - // We want to find the nodes that are the immediate neighbours of the boundary nodes. Those nodes are - // considered nodes with 'level 2'. The neighbours of neighbours have 'level 3' etc. - // We want to construct levels 1,2,3. Nodes with level 0 are internal nodes of the mesh - //Loop over the vector of edgelist - for (int level = 1; level < 3; ++level) - { - for (unsigned int i = 0; i < _VertexToEdgeList.size(); ++i) - { - for (VertToEdgeListIter = _VertexToEdgeList[i].begin(); VertToEdgeListIter != _VertexToEdgeList[i].end(); - ++VertToEdgeListIter) - { - if (_isOnBoundary[(*VertToEdgeListIter).StartV] == level && _isOnBoundary[(*VertToEdgeListIter).EndV] == 0) - { - _isOnBoundary[(*VertToEdgeListIter).EndV] = level+1; - } - if (_isOnBoundary[(*VertToEdgeListIter).EndV] == level && _isOnBoundary[(*VertToEdgeListIter).StartV] == 0) - { - _isOnBoundary[(*VertToEdgeListIter).StartV] = level+1; - } - } - } - }//Loop over the level of the ring - - - // Check test to see the tag of the nodes on the boundary: -// for (int i = 0; i< _EntityArray.size(); ++i) -// { -// GFace* face = _EntityArray[i]; //List of all the discrete face on which we compute the curvature - -// for (int iElem = 0; iElem < face->getNumMeshElements(); iElem++) -// { -// MElement *e = face->getMeshElement(iElem); - -// // The NEW tag of the corresponding element -// const int E = _ElementToInt[e->getNum()]; - -// // Pointers to vertices of triangle -// MVertex* A = e->getVertex(0); -// MVertex* B = e->getVertex(1); -// MVertex* C = e->getVertex(2); - -// V[0] = _VertexToInt[A->getNum()]; //The new number of the vertex -// V[1] = _VertexToInt[B->getNum()]; -// V[2] = _VertexToInt[C->getNum()]; - -// if (_isOnBoundary[V[0]] == 3) -// { -// std::cout << "Vertex: " << A->getNum() << " -- " << A->x() << "; " << A->y() << "; " << A->z() << std::endl; -// } -// if (_isOnBoundary[V[1]] == 3) -// { -// std::cout << "Vertex: " << B->getNum() << " -- " << B->x() << "; " << B->y() << "; " << B->z() << std::endl; -// } -// if (_isOnBoundary[V[2]] == 3) -// { -// std::cout << "Vertex: " << C->getNum() << " -- " << C->x() << "; " << C->y() << "; " << C->z() << std::endl; -// } -// } -// } - - - // Now we'll propagate the cuvature values from inside nodes with level = 3 close to the boundary - first - // to nodes with level 2, then from nodes with level 2 to nodes with level 1 (on the boundary) - _NbNeighbour.resize(_VertexToInt.size()); - for(unsigned int i = 0; i < _NbNeighbour.size(); ++i) - { - _NbNeighbour[i] = 0; - } - - for (int level = 2; level > 0 ; --level) - { - - for (unsigned int i = 0; i< _NbNeighbour.size(); ++i) - { - _NbNeighbour[i] = 0; - if (_isOnBoundary[i] == level) - { - _VertexCurve[i] = 0.0; - } - } - - - for (unsigned int i = 0; i < _VertexToEdgeList.size(); ++i) - { - for (VertToEdgeListIter = _VertexToEdgeList[i].begin(); VertToEdgeListIter != _VertexToEdgeList[i].end(); - ++VertToEdgeListIter) - { - - if (_isOnBoundary[(*VertToEdgeListIter).StartV] == level && _isOnBoundary[(*VertToEdgeListIter).EndV] == level+1) - { - _VertexCurve[(*VertToEdgeListIter).StartV] += _VertexCurve[(*VertToEdgeListIter).EndV]; - _NbNeighbour[(*VertToEdgeListIter).StartV] ++; - - } - if (_isOnBoundary[(*VertToEdgeListIter).EndV] == level && _isOnBoundary[(*VertToEdgeListIter).StartV] == level+1) - { - _VertexCurve[(*VertToEdgeListIter).EndV] += _VertexCurve[(*VertToEdgeListIter).StartV]; - _NbNeighbour[(*VertToEdgeListIter).EndV] ++; - } - - } - } - - // Correction for a degenerate case when a node has neighbours with the same or lower level, but zero - // neighbours with level+1 - - for (unsigned int i = 0; i < _VertexToEdgeList.size(); ++i) - { - for (VertToEdgeListIter = _VertexToEdgeList[i].begin(); VertToEdgeListIter != _VertexToEdgeList[i].end(); - ++VertToEdgeListIter) - { - - if (_isOnBoundary[(*VertToEdgeListIter).StartV] == level - && _isOnBoundary[(*VertToEdgeListIter).EndV] == level - && _NbNeighbour[(*VertToEdgeListIter).StartV] == 0) - { - _VertexCurve[(*VertToEdgeListIter).StartV] += _VertexCurve[(*VertToEdgeListIter).EndV]; - _NbNeighbour[(*VertToEdgeListIter).StartV] = _NbNeighbour[(*VertToEdgeListIter).EndV]; - } - if (_isOnBoundary[(*VertToEdgeListIter).EndV] == level - && _isOnBoundary[(*VertToEdgeListIter).StartV] == level - && _NbNeighbour[(*VertToEdgeListIter).EndV] == 0) - { - _VertexCurve[(*VertToEdgeListIter).EndV] += _VertexCurve[(*VertToEdgeListIter).StartV]; - _NbNeighbour[(*VertToEdgeListIter).EndV] = _NbNeighbour[(*VertToEdgeListIter).StartV]; - } - } - } - - for (unsigned int i = 0; i < _isOnBoundary.size(); ++i) - { - if (_isOnBoundary[i] == level) - { - if (_NbNeighbour[i] == 0) - { - std::cout << "ERROR: VERTEX " << i << " WITH LEVEL " << level << " HAS 0 NEIGHBOURS" << std::endl; - } - _VertexCurve[i] = _VertexCurve[i]/_NbNeighbour[i]; - } - } - - }//Loop over the levels of the ring - -// for (int i = 0; i < _isOnBoundary.size(); ++i) -// { -// _VertexCurve[i] = _isOnBoundary[i]; -// } - -#endif - } - -//======================================================================================================== - -//INITIALIZATION OF THE MAP AND RENUMBERING OF THE SELECTED ENTITIES: - -void Curvature::initializeMap() -{ - if (! _isMapInitialized) - { - for (unsigned int i = 0; i< _EntityArray.size(); ++i) - { - GFace* face = _EntityArray[i]; - - for (unsigned int iElem = 0; iElem < face->getNumMeshElements(); iElem++) - { - MElement *e = face->getMeshElement(iElem); - const int E = e->getNum(); - _ElementToInt[E] = 1; - - const int A = e->getVertex(0)->getNum(); //Pointer to 1st vertex of the triangle - const int B = e->getVertex(1)->getNum(); - const int C = e->getVertex(2)->getNum(); - - _VertexToInt[A] = 1; - _VertexToInt[B] = 1; - _VertexToInt[C] = 1; - } - } - - /// Set up a new numbering of chosen vertices and triangles - int idx = 0; - - // map between the pointer to vertex and the new numbering of the vertex - std::map<int,int>::iterator vertex_iterator; - // map between the pointer to element and the new numbering of the element - std::map<int,int>::iterator element_iterator; - - for (vertex_iterator = _VertexToInt.begin() ; vertex_iterator !=_VertexToInt.end() ; ++ vertex_iterator, ++idx) - (*vertex_iterator).second = idx; - - idx = 0; - - for (element_iterator = _ElementToInt.begin() ; element_iterator !=_ElementToInt.end() ; ++ element_iterator, ++idx) - (*element_iterator).second = idx; - - _isMapInitialized = true; - - } - -} - -//======================================================================================================== - -//COMPUTE THE NORMAL AT THE VERTEX AND THE AREA AROUND - -void Curvature::computeVertexNormals() -{ - SVector3 vector_AB; - SVector3 vector_AC; - - _TriangleArea.resize(_ElementToInt.size() ); - _VertexArea.resize(_ElementToInt.size() ); - _VertexNormal.resize(_VertexToInt.size()); - - for (unsigned int i = 0; i< _EntityArray.size(); ++i) - { - // face is a pointer to one surface of the group "FinalEntityList" - GFace* face = _EntityArray[i]; - - //Loop over the element all the element of the "myTag"-surface - for (unsigned int iElem = 0; iElem < face->getNumMeshElements(); iElem++) - { - // Pointer to one element - MElement *e = face->getMeshElement(iElem); - // The NEW tag of the corresponding element - const int E = _ElementToInt[e->getNum()]; - // std::cout << "We are now looking at element Nr: " << E << std::endl; - - // Pointers to vertices of triangle - MVertex* A = e->getVertex(0); - MVertex* B = e->getVertex(1); - MVertex* C = e->getVertex(2); - - const int V0 = _VertexToInt[A->getNum()]; //The new number of the vertex - const int V1 = _VertexToInt[B->getNum()]; - const int V2 = _VertexToInt[C->getNum()]; - - vector_AB = SVector3(B->x() - A->x(), B->y() - A->y(), B->z() - A->z() ); - vector_AC = SVector3(C->x() - A->x(), C->y() - A->y(), C->z() - A->z() ); - - const SVector3 cross = crossprod(vector_AB, vector_AC); - - // Area of the triangles: - _TriangleArea[E] = 0.5*cross.norm(); - // std::cout << "The area of the triangle nr: " << e->getNum() << " is: "<< TriangleArea[E] << std::endl; - - _VertexArea[V0] += _TriangleArea[E]; - _VertexArea[V1] += _TriangleArea[E]; - _VertexArea[V2] += _TriangleArea[E]; - - _VertexNormal[V0] += cross; //here we are actually computing the unit normal vector per vertex - _VertexNormal[V1] += cross; - _VertexNormal[V2] += cross; - - } // end of loop over elements of one face - - } //Loop over _ptFinalEntityList - - ///////Normalize the vertex-normals. - for (unsigned int n = 0; n < _VertexToInt.size(); ++ n) - { - _VertexNormal[n].normalize(); - } -} - -//======================================================================================================== - -SVector3 Curvature::vertexNormal (MVertex* A) -{ - const int V0 = _VertexToInt[A->getNum()]; //The new number of the vertex - return _VertexNormal[V0]; -} - -//======================================================================================================== - -void Curvature::curvatureTensor() -{ - - STensor3 TempTensor; - STensor3 TijABTensorProduct; - SVector3 TijAB; - SVector3 vector_AB; - - _CurveTensor.resize(_VertexToInt.size()); - - for (unsigned int i = 0; i< _EntityArray.size(); ++i) - { - GFace* face = _EntityArray[i]; //face is a pointer to one surface of the group "FinalEntityList" - - for (unsigned int iElem = 0; iElem < face->getNumMeshElements(); iElem++) //Loop over the element all the element of the "myTag"-surface - { - MElement *e = face->getMeshElement(iElem); //Pointer to one element - const int E = _ElementToInt[e->getNum()]; //The NEW tag of the corresponding element - - for (unsigned int i = 0; i<3; ++i) // Loop over the 3 edges of each element - { - - MVertex* A = e->getVertex(i); //Pointer to 1st vertex of the edge A-to-B - MVertex* B = e->getVertex((i+1)%3); //Pointer to 2nd vertex of the edge A-to-B - - const int V0 = _VertexToInt[A->getNum()]; //Tag of the 1st vertex of the edge A-to-B - const int V1 = _VertexToInt[B->getNum()]; //Tag of the 2nd vertex of the edge A-to-B - - //Weight for triangle-i-th's contribution to the shape tensor: - const double Wij0 = _TriangleArea[E] / (2 * _VertexArea[V0]); - const double Wij1 = _TriangleArea[E] / (2 * _VertexArea[V1]); - - //Approximate Curvature "kappa" along some tangential vector T: - vector_AB = SVector3(B->x() - A->x(), B->y() - A->y(), B->z() - A->z() ); - const double k_nominator0 = dot(_VertexNormal[V0], vector_AB); //Dot-product of the 2 vectors - const double k_nominator1 = -dot(_VertexNormal[V1], vector_AB); - - const double coeff = 2.0/vector_AB.normSq(); //normSq is the norm to the power 2 - const double KijAB_0 = coeff*k_nominator0; - const double KijAB_1 = coeff*k_nominator1; - - //Projection of the edge vector AB on the tangential plane: - //** For Vertex 0 - tensprod(_VertexNormal[V0], _VertexNormal[V0], TempTensor); - TempTensor *= -1.0; //-N*Nt - TempTensor(0,0) += 1.0; //I-N*Nt - TempTensor(1,1) += 1.0; - TempTensor(2,2) += 1.0; - - for (int m = 0; m<3; ++m) - { - TijAB(m) = 0.0; - for (int n = 0; n<3; ++n) - { - TijAB(m) += TempTensor(m,n) * vector_AB(n); - } - } - - TijAB.normalize(); - tensprod(TijAB, TijAB, TijABTensorProduct); - _CurveTensor[V0] += Wij0*KijAB_0*TijABTensorProduct; - - //** For Vertex 1 - tensprod(_VertexNormal[V1], _VertexNormal[V1], TempTensor); - TempTensor *= -1.0; //-N*Nt - TempTensor(0,0) += 1.0; //I-N*Nt - TempTensor(1,1) += 1.0; - TempTensor(2,2) += 1.0; - - for (int m = 0; m<3; ++m) - { - TijAB(m) = 0.0; - for (int n = 0; n<3; ++n) - { - TijAB(m) += TempTensor(m,n) * vector_AB(n); - } - } - - TijAB.normalize(); - tensprod(TijAB, TijAB, TijABTensorProduct); - _CurveTensor[V1] += Wij1*KijAB_1*TijABTensorProduct; - - }//end of loop over the edges - - }//end of loop over all elements of one GFace - - }//End of loop over ptFinalEntityList - -}//End of method - -//======================================================================================================== - -void Curvature::computeCurvature_Simple() -{ - SVector3 vector_E; - SVector3 vector_A; - SVector3 vector_B; - SVector3 vector_Wvi; - STensor3 Qvi; - STensor3 QviT; - STensor3 Holder; - - initializeMap(); - computeVertexNormals(); - curvatureTensor(); - - _VertexCurve.resize(_VertexToInt.size()); - - for (unsigned int n = 0; n < _VertexToInt.size(); ++ n) //Loop over the vertex - { - vector_E = SVector3(1,0,0); - vector_A = vector_E + _VertexNormal[n]; - vector_B = vector_E - _VertexNormal[n]; - - const double MagA = vector_A.norm(); - const double MagB = vector_B.norm(); - - if (MagB > MagA) - { - vector_Wvi = vector_B; - } - else - { - vector_Wvi = vector_A; - } - - vector_Wvi.normalize(); - //to obtain the Qvi = Id -2*Wvi*Wvi^t - tensprod(vector_Wvi, vector_Wvi, Qvi); //Qvi = Wvi*Wvi^t - Qvi *= -2.0; //-2*Wvi*Wvi^t - Qvi(0,0) += 1.0; //I - 2*Wvi*Wvi^t ==> Householder transformation - Qvi(1,1) += 1.0; - Qvi(2,2) += 1.0; - - //Transpose the matrix: - for (int i = 0; i<3; ++i) - { - for (int j = 0; j<3; ++j) - { - QviT(i,j) = Qvi(j,i); - } - } - - QviT *= _CurveTensor[n]; - QviT *=Qvi; - Holder = QviT; - - //Eigenvalues of the 2*2 minor from the Householder matrix - const double A = 1.0; - const double B = -(Holder(1,1) + Holder(2,2)); - const double C = Holder(1,1)*Holder(2,2) - Holder(1,2)*Holder(2,1); - const double Delta = std::sqrt(B*B-4*A*C); - - if((B*B-4.*A*C) < 0.0) - { - std::cout << "WARNING: negative discriminant: " << B*B-4.*A*C << std::endl; - } - - const double m11 = (-B + Delta)/(2*A); //Eigenvalue of Householder submatrix - const double m22 = (-B - Delta)/(2*A); - - //_VertexCurve[n] = (3*m11-m22)*(3*m22-m11); //Gaussian Curvature - _VertexCurve[n] = ((3*m11-m22) + (3*m22-m11))*0.5; //Mean Curvature - - } -} - -//======================================================================================================== - -//COMPUTE THE NORMAL AT THE VERTEX AND THE AREA AROUND - -void Curvature::computeRusinkiewiczNormals() -{ - SVector3 vector_AB; - SVector3 vector_AC; - SVector3 vector_BC; - - _TriangleArea.resize(_ElementToInt.size() ); - _VertexNormal.resize(_VertexToInt.size()); - - for (unsigned int i = 0; i< _EntityArray.size(); ++i) - { - // face is a pointer to one surface of the group "FinalEntityList" - GFace* face = _EntityArray[i]; - - //Loop over the element all the element of the "myTag"-surface - for (unsigned int iElem = 0; iElem < face->getNumMeshElements(); iElem++) - { - // Pointer to one element - MElement *e = face->getMeshElement(iElem); - const int E = _ElementToInt[e->getNum()]; - - // Pointers to vertices of triangle - MVertex* A = e->getVertex(0); - MVertex* B = e->getVertex(1); - MVertex* C = e->getVertex(2); - - const int V0 = _VertexToInt[A->getNum()]; //The new number of the vertex - const int V1 = _VertexToInt[B->getNum()]; - const int V2 = _VertexToInt[C->getNum()]; - - vector_AB = SVector3(B->x() - A->x(), B->y() - A->y(), B->z() - A->z() ); - vector_AC = SVector3(C->x() - A->x(), C->y() - A->y(), C->z() - A->z() ); - vector_BC = SVector3(C->x() - B->x(), C->y() - B->y(), C->z() - B->z() ); - - const SVector3 cross = crossprod(vector_AB, vector_AC); - - // Area of the triangles: - _TriangleArea[E] = 0.5*cross.norm(); - - const double l_AB = vector_AB.normSq(); - const double l_AC = vector_AC.normSq(); - const double l_BC = vector_BC.normSq(); - - _VertexNormal[V0] += cross * (1.0/ (l_AB*l_AC)); - _VertexNormal[V1] += cross * (1.0/ (l_AB*l_BC)); - _VertexNormal[V2] += cross * (1.0/ (l_AC*l_BC)); - - } // end of loop over elements of one face - - } //Loop over _ptFinalEntityList - - ///////Normalize the vertex-normals. - for (unsigned int n = 0; n < _VertexToInt.size(); ++ n) - { - _VertexNormal[n].normalize(); - } -} - -//======================================================================================================== -// Compute per-vertex point areas -void Curvature::computePointareas(){ - - SVector3 e[3]; - SVector3 l2; - SVector3 ew; - double factor[3]; - - _pointareas.resize(_VertexToInt.size()); - _cornerareas.resize(_ElementToInt.size()); - - for (unsigned int i = 0; i< _EntityArray.size(); ++i) - { - GFace* face = _EntityArray[i]; //face is a pointer to one surface of the group "FinalEntityList" - - for (unsigned int iElem = 0; iElem < face->getNumMeshElements(); iElem++) //Loop over the element all the element of the "myTag"-surface - { - MElement *E = face->getMeshElement(iElem); //Pointer to one element - // The NEW tag of the corresponding element - const int EIdx = _ElementToInt[E->getNum()]; - - MVertex* A = E->getVertex(0); //Pointers to vertices of triangle - MVertex* B = E->getVertex(1); - MVertex* C = E->getVertex(2); - - const int V0 = _VertexToInt[A->getNum()]; - const int V1 = _VertexToInt[B->getNum()]; - const int V2 = _VertexToInt[C->getNum()]; - - factor[0] = 1.0; - factor[1] = 1.0; - factor[2] = 1.0; - // if (_isOnBoundary[V0]) - // { - // factor[0] = 1.0; - // } - // else {factor[0] = 1.0;} - // if (_isOnBoundary[V1]) - // { - // factor[1] = 1.0; - // } - // else {factor[1] = 1.0;} - // if (_isOnBoundary[V2]) - // { - // factor[2] = 1.0; - // } - // else {factor[2] = 1.0;} - -//Edges - e[0] = SVector3(C->x() - B->x(), C->y() - B->y(), C->z() - B->z()); //vector side of a triangular element - e[1] = SVector3(A->x() - C->x(), A->y() - C->y(), A->z() - C->z()); - e[2] = SVector3(B->x() - A->x(), B->y() - A->y(), B->z() - A->z()); - - // Compute corner weights - //SVector3 len = crossprod(e[0], e[1]); - //len = norm - //len2 = normSq - double area = 0.5 * norm(crossprod(e[0], e[1])); //area of a triangle - l2 = SVector3( normSq(e[0]), normSq(e[1]), normSq(e[2]) ); - ew = SVector3( l2[0] * (l2[1] + l2[2] - l2[0]), - l2[1] * (l2[2] + l2[0] - l2[1]), - l2[2] * (l2[0] + l2[1] - l2[2]) ); - - if (ew[0] <= 0.0) - { - _cornerareas[EIdx][1] = -0.25 * l2[2] * area / dot(e[0], e[2]); - _cornerareas[EIdx][2] = -0.25 * l2[1] * area / dot(e[0], e[1]); - _cornerareas[EIdx][0] = area - _cornerareas[EIdx][1] - _cornerareas[EIdx][2]; - } - else if (ew[1] <= 0.0) - { - _cornerareas[EIdx][2] = -0.25 * l2[0] * area / dot(e[1], e[0]); - _cornerareas[EIdx][0] = -0.25 * l2[2] * area / dot(e[1], e[2]); - _cornerareas[EIdx][1] = area - _cornerareas[EIdx][2] - _cornerareas[EIdx][0]; - } - else if (ew[2] <= 0.0) - { - _cornerareas[EIdx][0] = -0.25 * l2[1] * area / dot(e[2], e[1]); - _cornerareas[EIdx][1] = -0.25 * l2[0] * area / dot(e[2], e[0]); - _cornerareas[EIdx][2] = area - _cornerareas[EIdx][0] - _cornerareas[EIdx][1]; - } - else - { - float ewscale = 0.5 * area / (ew[0] + ew[1] + ew[2]); - for (int j = 0; j < 3; j++) - _cornerareas[EIdx][j] = ewscale * (ew[(j+1)%3] + ew[(j+2)%3]); - } - - _pointareas[V0] += _cornerareas[EIdx][0]; - - _pointareas[V1] += _cornerareas[EIdx][1]; - - _pointareas[V2] += _cornerareas[EIdx][2]; - - for (int j = 0; j < 3; j++) - { - _cornerareas[EIdx][j] = factor[j]*_cornerareas[EIdx][j]; - } - - - } //End of loop over iElem - -// std::cout << "_pointareas.size = " << _pointareas.size() << std::endl; -// std::cout << "_cornerareas.size = " << _cornerareas.size() << std::endl; - - } //End of loop over _ptFinalEntityList - -} //End of the method "computePointareas" - - -//======================================================================================================== -//Rotate a coordinate system to be perpendicular to the given normal -void Curvature::rot_coord_sys(const SVector3 &old_u, const SVector3 &old_v, const SVector3 &new_norm, SVector3 &new_u, SVector3 &new_v){ - - new_u = old_u; - new_v = old_v; - SVector3 old_norm = crossprod(old_u, old_v); - double ndot = dot(old_norm, new_norm); -// if (unlikely(ndot <= -1.0f)) - if (ndot <= -1.0f) - { - new_u = -1.0*new_u; - new_v = -1.0*new_v; - return; - } - - SVector3 perp_old = new_norm - ndot*old_norm; - SVector3 dperp = 1.0f/(1 + ndot) * (old_norm + new_norm); - new_u -= dperp*dot(new_u, perp_old); - new_v -= dperp*dot(new_v, perp_old); -} - -//======================================================================================================== - -//Project a curvature tensor from the basis spanned by old_u and old_v -//(which are assumed to be unit-length and perpendicular) to the new_u -//and new_v basis - -void Curvature::proj_curv( const SVector3 &old_u, const SVector3 &old_v, - double old_ku, double old_kuv, double old_kv, - const SVector3 &new_u, const SVector3 &new_v, - double &new_ku, double &new_kuv, double &new_kv){ - SVector3 r_new_u; - SVector3 r_new_v; - rot_coord_sys(new_u, new_v, crossprod(old_u,old_v), r_new_u, r_new_v); - - const double u1 = dot(r_new_u, old_u); - const double v1 = dot(r_new_u, old_v); - const double u2 = dot(r_new_v, old_u); - const double v2 = dot(r_new_v, old_v); - - new_ku = old_ku*u1*u1 + old_kuv*(2.0f * u1*v1) + old_kv*v1*v1; - new_kuv = old_ku*u1*u2 + old_kuv*(u1*v2 * u2*v1) + old_kv*v1*v2; - new_kv = old_ku*u2*u2 + old_kuv*(2.0f * u2*v2) + old_kv*v2*v2; -} - - -//======================================================================================================== - -//Given a curvature tensor, find principal directions and curvatures -//Makes sure that pdir1 and pdir2 are perpendicular to normal - -void Curvature::diagonalize_curv(const SVector3 &old_u, const SVector3 &old_v, - double ku, double kuv, double kv, - const SVector3 &new_norm, - SVector3 &pdir1, SVector3 &pdir2, double &k1, double &k2){ - SVector3 r_old_u; - SVector3 r_old_v; - - double c = 1.0; - double s = 0.0; - double tt = 0.0; - - rot_coord_sys(old_u, old_v, new_norm, r_old_u, r_old_v); - -// if(unlikely(kuv !=0.0f)) - if(kuv !=0.0) { - //Jacobi rotation to diagonalize - double h= 0.5*(kv -ku)/ kuv; - tt = (h<0.0) ? - 1.0 / (h - std::sqrt(1.0 + h*h)): - 1.0 / (h + std::sqrt(1.0 + h*h)); - c = 1.0 / std::sqrt(1.0 + tt*tt); - s = tt*c; - } - - k1 = ku - tt *kuv; - k2 = kv + tt *kuv; - - if(std::abs(k1) >= std::abs(k2)) { - pdir1 = c*r_old_u - s*r_old_v; - } - else { - std::swap(k1,k2); - pdir1 = s*r_old_u + c*r_old_v; - } - pdir2 = crossprod(new_norm, pdir1); -} - -//======================================================================================================== -void Curvature::computeCurvature(GModel* model, typeOfCurvature typ) -{ - - _model = model; - - double t0 = Cpu(); - Msg::StatusBar(true, "(C) Computing Curvature"); - if (typ == RUSIN) - computeCurvature_Rusinkiewicz(0); - else if (typ == RBF) - computeCurvature_RBF(); - else if (typ == SIMPLE) - computeCurvature_Simple(); - - double t1 = Cpu(); - Msg::StatusBar(true, "(C) Done Computing Curvature (%g s)", t1-t0); - - //writeToMshFile("curvature.msh"); - //writeToPosFile("curvature.pos"); - //writeToVtkFile("curvature.vtk"); - -} - -//======================================================================================================== - -void Curvature::buildEdgeList() -{ - - int V[3]; - bool edgefound; - - _VertexToEdgeList.clear(); - - std::list<MeshEdgeInfo>::iterator VertToEdgeListIter; - MeshEdgeInfo TempEdge; - - _VertexToEdgeList.resize(_VertexToInt.size()); - - for (unsigned int i = 0; i< _EntityArray.size(); ++i) - { - GFace* face = _EntityArray[i]; //List of all the discrete face on which we compute the curvature - - for (unsigned int iElem = 0; iElem < face->getNumMeshElements(); iElem++) - { - MElement *e = face->getMeshElement(iElem); - - // Pointers to vertices of triangle - MVertex* A = e->getVertex(0); - MVertex* B = e->getVertex(1); - MVertex* C = e->getVertex(2); - - V[0] = _VertexToInt[A->getNum()]; //The new number of the vertex - V[1] = _VertexToInt[B->getNum()]; - V[2] = _VertexToInt[C->getNum()]; - - // Try to add edge [V0,V1] to the global list - for (int j = 0; j < 3; ++j) - { - const int StartV = std::min(V[j], V[(j+1)%3]); - const int EndV = std::max(V[j], V[(j+1)%3]); - - edgefound = false; - for (VertToEdgeListIter = _VertexToEdgeList[StartV].begin(); VertToEdgeListIter != _VertexToEdgeList[StartV].end(); - ++VertToEdgeListIter) - { - if(StartV == (*VertToEdgeListIter).StartV && EndV == (*VertToEdgeListIter).EndV) - { - (*VertToEdgeListIter).NbElemNeighbour ++; - edgefound = true; - } - - } - if (false == edgefound) - { - TempEdge.StartV = StartV; - TempEdge.EndV = EndV; - TempEdge.NbElemNeighbour = 1; - _VertexToEdgeList[StartV].push_back(TempEdge); - } - - - } // Loop over j - - - } // Loop over the elements (triangles) of the face - } - - int NbEdges = 0; - for(unsigned int i = 0; i < _VertexToEdgeList.size(); ++i) - { - NbEdges += _VertexToEdgeList[i].size(); - } - - //std::cout << "Euler formula:" << std::endl; - //std::cout << "Edges + 2 = " << NbEdges + 2 << std::endl; - //std::cout << "Elements + Nodes = " << _VertexToInt.size() + _ElementToInt.size() << std::endl; - -} - -//======================================================================================================== - - -void Curvature::smoothCurvatureField(const int NbIter) -{ - if ( _VertexToEdgeList.size() == 0 ) { buildEdgeList(); } - - std::vector<double> smoothedCurvature; - smoothedCurvature.resize( _VertexToInt.size() ); - - - // Smoothed curvature directions - std::vector<SVector3> smoothedDir1; - std::vector<SVector3> smoothedDir2; - smoothedDir1.resize(_VertexToInt.size()); - smoothedDir2.resize(_VertexToInt.size()); - - _NbNeighbour.resize(_VertexToInt.size()); - for(unsigned int i = 0; i < _VertexToInt.size(); ++i) - { - _NbNeighbour[i] = 0; - } - - - // Smoothing iterations - for(int iter = 0; iter < NbIter; ++iter) - { - - for(unsigned int i = 0; i < smoothedCurvature.size(); ++i) - { - smoothedCurvature[i] = 0.0; - smoothedDir1[i] = SVector3(); - smoothedDir2[i] = SVector3(); - } - - std::list<MeshEdgeInfo>::const_iterator edgeIterator; - - - for(unsigned int i = 0; i < _VertexToEdgeList.size(); ++i) - { - for(edgeIterator = _VertexToEdgeList[i].begin(); edgeIterator != _VertexToEdgeList[i].end(); ++edgeIterator) - { - - const int V0 = (*edgeIterator).StartV; - const int V1 = (*edgeIterator).EndV; - - smoothedCurvature[V0] += _VertexCurve[V1]; - smoothedCurvature[V1] += _VertexCurve[V0]; - - smoothedDir1[V0] += _pdir1[V1]; - smoothedDir1[V1] += _pdir1[V0]; - - smoothedDir2[V0] += _pdir2[V1]; - smoothedDir2[V1] += _pdir2[V0]; - - _NbNeighbour[V0]++; - _NbNeighbour[V1]++; - } - } - - - - const double Lambda = 0.3; - for(unsigned int i = 0; i < _VertexCurve.size(); ++i) - { - _VertexCurve[i] = Lambda*_VertexCurve[i] + (1-Lambda)*smoothedCurvature[i] / _NbNeighbour[i]; - _pdir1[i] = Lambda * _pdir1[i] + (1.-Lambda)/_NbNeighbour[i] * smoothedDir1[i]; - _pdir2[i] = Lambda * _pdir2[i] + (1.-Lambda)/_NbNeighbour[i] * smoothedDir2[i]; - } - } - -} - - -//======================================================================================================== - - - -void Curvature::computeCurvature_Rusinkiewicz(int isMax) -{ - - retrieveCompounds(); - initializeMap(); - - computeRusinkiewiczNormals(); - computePointareas(); - - SVector3 e[3]; - STensor3 w; - SVector3 t; - SVector3 n; - SVector3 b; - SVector3 m; - SVector3 dn; - - double u; - double v; - double dnu; - double dnv; - double c1; - double c2; - double c12; - double wt; - - _pdir1.resize(_VertexToInt.size()); - _pdir2.resize(_VertexToInt.size()); - - _curv1.resize(_VertexToInt.size()); - _curv2.resize(_VertexToInt.size()); - _curv12.resize(_VertexToInt.size()); - - for (unsigned int i = 0; i< _EntityArray.size(); ++i) - { - GFace* face = _EntityArray[i]; //face is a pointer to one surface of the group "FinalEntityList" - - for (unsigned int iElem = 0; iElem < face->getNumMeshElements(); iElem++) //Loop over the element all the element of the "myTag"-surface - { - MElement *E = face->getMeshElement(iElem); //Pointer to one element - - MVertex* A = E->getVertex(0); //Pointers to vertices of triangle - MVertex* B = E->getVertex(1); - MVertex* C = E->getVertex(2); - - const int V0 = _VertexToInt[A->getNum()]; //Tag of the 1st vertex of the triangle - const int V1 = _VertexToInt[B->getNum()]; - const int V2 = _VertexToInt[C->getNum()]; - - ///Set up an initial coordinate system per vertex: - _pdir1[V0] = SVector3(B->x() - A->x(), B->y() - A->y(), B->z() - A->z()); - _pdir1[V1] = SVector3(C->x() - B->x(), C->y() - B->y(), C->z() - B->z()); - _pdir1[V2] = SVector3(A->x() - C->x(), A->y() - C->y(), A->z() - C->z()); - } - } - - for (unsigned int ivertex = 0; ivertex < _VertexToInt.size(); ++ivertex) - { - _pdir1[ivertex] = crossprod(_pdir1[ivertex], _VertexNormal[ivertex]); - _pdir1[ivertex].normalize(); - _pdir2[ivertex] = crossprod(_VertexNormal[ivertex], _pdir1[ivertex]); - } - - // Compute curvature per face: - for (unsigned int i = 0; i< _EntityArray.size(); ++i) - { - //face is a pointer to one surface of the group "FinalEntityList" - GFace* face = _EntityArray[i]; - - //Loop over all elements of this face: - for (unsigned int iElem = 0; iElem < face->getNumMeshElements(); iElem++) - { - MElement *E = face->getMeshElement(iElem); //Pointer to one element - // The NEW tag of the corresponding element - const int EIdx = _ElementToInt[E->getNum()]; - - MVertex* A = E->getVertex(0); //Pointers to vertices of triangle - MVertex* B = E->getVertex(1); - MVertex* C = E->getVertex(2); - - e[0] = SVector3(C->x() - B->x(), C->y() - B->y(), C->z() - B->z()); - e[1] = SVector3(A->x() - C->x(), A->y() - C->y(), A->z() - C->z()); - e[2] = SVector3(B->x() - A->x(), B->y() - A->y(), B->z() - A->z()); - - //N-T-B coordinate system per face - t = e[0]; - t.normalize(); - n = crossprod( e[0], e[1]); - b = crossprod(n, t); - b.normalize(); - - //Estimate curvature based on variations of normals along edges: - //intialization: - m = SVector3(0.0, 0.0, 0.0); - for (int i = 0; i< 3; ++i) - for (int j = 0; j< 3; ++j) - w(i,j) = 0.0; - - //filling: - for (int j = 0; j< 3; ++j) - { - u = dot(e[j], t); - v = dot(e[j], b); - - w(0,0) += u*u; - w(0,1) += u*v; - w(2,2) += v*v; - - MVertex* U = E->getVertex(PREV(j)); - MVertex* V = E->getVertex(NEXT(j)); - - const int UIdx = _VertexToInt[U->getNum()]; - const int VIdx = _VertexToInt[V->getNum()]; - - dn = _VertexNormal[UIdx] - _VertexNormal[VIdx]; - - dnu = dot(dn, t); - dnv = dot(dn, b); - - m[0] += dnu*u; - m[1] += dnu*v + dnv*u; - m[2] += dnv*v; - } - - w(1,1) = w(0,0) + w(2,2); - w(1,2) = w(0,1); - - //Least Squares Solution - double diag[3]; - if (!ldltdc(w, diag)) - { - std::cout << "ldltdc failed" << std::endl; - continue; - } - ldltsl(w, diag, m, m); - - //Push it back out to the vertices - for (int j = 0; j< 3; ++j) - { - const int old_vj = E->getVertex(j)->getNum(); - const int vj = _VertexToInt[old_vj]; - proj_curv(t, b, m[0], m[1], m[2], _pdir1[vj], _pdir2[vj], c1, c12, c2); - wt = _cornerareas[EIdx][j]/_pointareas[vj]; - - _curv1[vj] += wt*c1; - _curv12[vj] += wt*c12; - _curv2[vj] += wt*c2; - } - - } //End of loop over the element (iElem) - - } //End of loop over "_EntityArray" - - - //Compute principal directions and curvatures at each vertex - for (unsigned int ivertex = 0; ivertex < _VertexToInt.size(); ++ivertex) { - diagonalize_curv(_pdir1[ivertex], _pdir2[ivertex], _curv1[ivertex], _curv12[ivertex], _curv2[ivertex], - _VertexNormal[ivertex], _pdir1[ivertex], _pdir2[ivertex], _curv1[ivertex], _curv2[ivertex]); - } - - - _VertexCurve.resize( _VertexToInt.size() ); - - for (unsigned int ivertex = 0; ivertex < _VertexToInt.size(); ++ivertex){ - - if (isMax){ - _VertexCurve[ivertex] = std::max(fabs(_curv1[ivertex]), fabs(_curv2[ivertex])); - } - else{ - //_VertexCurve[ivertex] = (_curv1[ivertex]+_curv2[ivertex])*0.5; //Mean curvature - //_VertexCurve[ivertex] = _curv1[ivertex]*_curv2[ivertex]; //Gaussian - _VertexCurve[ivertex] = _curv1[ivertex]; //Maximal Curvature - } - - } - -// smoothCurvatureField(1); - _alreadyComputedCurvature = true; - -// Propagate the value of curvature from nodes close the edges of the geometry onto the edges - correctOnEdges(); - // throw; - -} //End of the "computeCurvature_Rusinkiewicz" method - - //======================================================================================================== - -void Curvature::computeCurvature_RBF() -{ - retrieveCompounds(); - initializeMap(); - - //fill set of MVertex - std::set<MVertex*> allNodes; - for (unsigned int i = 0; i< _EntityArray.size(); ++i) { - GFaceCompound* face = (GFaceCompound*)_EntityArray[i]; - for (unsigned iElem = 0; iElem < face->getNumMeshElements(); iElem++) { - MElement *e = face->getMeshElement(iElem); - for(int j = 0; j < e->getNumVertices(); j++){ - allNodes.insert(e->getVertex(j)); - } - } - } - - //bounding box - SBoundingBox3d bb; - std::vector<SPoint3> vertices; - for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ - SPoint3 pt((*itv)->x(),(*itv)->y(), (*itv)->z()); - vertices.push_back(pt); - bb +=pt; - } - double sizeBox = norm(SVector3(bb.max(), bb.min())); - - //compure curvature RBF - std::map<MVertex*, SVector3> _normals; - std::vector<MVertex*> _ordered; - std::map<MVertex*, double> curvRBF; - //GLOBAL - //GRbf *_rbf = new GRbf(sizeBox, 0, 1, _normals, allNodes, _ordered); - //_rbf->computeCurvature(_rbf->getXYZ(),curvRBF); - //LOCAL FD - GRbf *_rbf = new GRbf(sizeBox, 0, 1, _normals, allNodes, _ordered, true); - _rbf->computeLocalCurvature(_rbf->getXYZ(),curvRBF); - - //fill vertex curve - _VertexCurve.resize( _VertexToInt.size() ); - for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ - MVertex *v = *itv; - std::map<int,int>::iterator vertexIterator; - int V0 = 0; - vertexIterator = _VertexToInt.find( v->getNum() ); - if ( vertexIterator != _VertexToInt.end() ) V0 = (*vertexIterator).second; - _VertexCurve[V0] = curvRBF[v]; - } - - _alreadyComputedCurvature = true; - -} //End of the "computeCurvature_RBF" method - - - //======================================================================================================== - -void Curvature::triangleNodalValues(MTriangle* triangle, double& c0, double& c1, double& c2, int isAbs) - { - MVertex* A = triangle->getVertex(0); - MVertex* B = triangle->getVertex(1); - MVertex* C = triangle->getVertex(2); - - int V0 = 0; - int V1 = 0; - int V2 = 0; - - std::map<int,int>::iterator vertexIterator; - vertexIterator = _VertexToInt.find( A->getNum() ); - if ( vertexIterator != _VertexToInt.end() ) V0 = (*vertexIterator).second; - else - std::cout << "Didn't find vertex with number " << A->getNum() << " in _VertextToInt !" << std::endl; - - vertexIterator = _VertexToInt.find( B->getNum() ); - if ( vertexIterator != _VertexToInt.end() ) V1 = (*vertexIterator).second; - else - std::cout << "Didn't find vertex with number " << B->getNum() << " in _VertextToInt !" << std::endl; - - vertexIterator = _VertexToInt.find( C->getNum() ); - if ( vertexIterator != _VertexToInt.end() ) V2 = (*vertexIterator).second; - else - std::cout << "Didn't find vertex with number " << C->getNum() << " in _VertextToInt !" << std::endl; - - if (isAbs){ - c0 = std::abs(_VertexCurve[V0]); //Mean curvature in vertex 0 - c1 = std::abs(_VertexCurve[V1]); //Mean curvature in vertex 1 - c2 = std::abs(_VertexCurve[V2]); //Mean curvature in vertex 2 - } - else{ - c0 = _VertexCurve[V0]; //Mean curvature in vertex 0 - c1 = _VertexCurve[V1]; //Mean curvature in vertex 1 - c2 = _VertexCurve[V2]; //Mean curvature in vertex 2 - } - - } - -//======================================================================================================== - -void Curvature::triangleNodalValuesAndDirections(MTriangle* triangle, SVector3* dMax, SVector3* dMin, double* cMax, double* cMin, int isAbs) -{ - MVertex* A = triangle->getVertex(0); - MVertex* B = triangle->getVertex(1); - MVertex* C = triangle->getVertex(2); - - int V0 = 0; - int V1 = 0; - int V2 = 0; - - std::map<int,int>::iterator vertexIterator; - vertexIterator = _VertexToInt.find( A->getNum() ); - if ( vertexIterator != _VertexToInt.end() ) V0 = (*vertexIterator).second; - else - std::cout << "Didn't find vertex with number " << A->getNum() << " in _VertextToInt !" << std::endl; - - vertexIterator = _VertexToInt.find( B->getNum() ); - if ( vertexIterator != _VertexToInt.end() ) V1 = (*vertexIterator).second; - else - std::cout << "Didn't find vertex with number " << B->getNum() << " in _VertextToInt !" << std::endl; - - vertexIterator = _VertexToInt.find( C->getNum() ); - if ( vertexIterator != _VertexToInt.end() ) V2 = (*vertexIterator).second; - else - std::cout << "Didn't find vertex with number " << C->getNum() << " in _VertextToInt !" << std::endl; - - if (isAbs){ - dMax[0] = _pdir1[V0]; - dMax[1] = _pdir1[V1]; - dMax[2] = _pdir1[V2]; - - dMin[0] = _pdir2[V0]; - dMin[1] = _pdir2[V1]; - dMin[2] = _pdir2[V2]; - - cMax[0] = std::abs(_curv1[V0]); - cMax[1] = std::abs(_curv1[V1]); - cMax[2] = std::abs(_curv1[V2]); - - cMin[0] = std::abs(_curv2[V0]); - cMin[1] = std::abs(_curv2[V1]); - cMin[2] = std::abs(_curv2[V2]); - - } - else{ - - dMax[0] = _pdir1[V0]; - dMax[1] = _pdir1[V1]; - dMax[2] = _pdir1[V2]; - - dMin[0] = _pdir2[V0]; - dMin[1] = _pdir2[V1]; - dMin[2] = _pdir2[V2]; - - cMax[0] = _curv1[V0]; - cMax[1] = _curv1[V1]; - cMax[2] = _curv1[V2]; - - cMin[0] = _curv2[V0]; - cMin[1] = _curv2[V1]; - cMin[2] = _curv2[V2]; - } -} - - //======================================================================================================== - -void Curvature::edgeNodalValues(MLine* edge, double& c0, double& c1, int isAbs) - { - MVertex* A = edge->getVertex(0); - MVertex* B = edge->getVertex(1); - - int V0 = 0; - int V1 = 0; - - std::map<int,int>::iterator vertexIterator; - - vertexIterator = _VertexToInt.find( A->getNum() ); - if ( vertexIterator != _VertexToInt.end() ) V0 = (*vertexIterator).second; - else std::cout << "Didn't find vertex with number " << A->getNum() << " in _VertextToInt !" << std::endl; - - vertexIterator = _VertexToInt.find( B->getNum() ); - if ( vertexIterator != _VertexToInt.end() ) V1 = (*vertexIterator).second; - else std::cout << "Didn't find vertex with number " << B->getNum() << " in _VertextToInt !" << std::endl; - - if (isAbs){ - c0 = std::abs(_VertexCurve[V0]); //Mean curvature in vertex 0 - c1 = std::abs(_VertexCurve[V1]); //Mean curvature in vertex 1 - } - else{ - c0 = _VertexCurve[V0]; //Mean curvature in vertex 0 - c1 = _VertexCurve[V1]; //Mean curvature in vertex 1 - } - - } - -//======================================================================================================== - -void Curvature::edgeNodalValuesAndDirections(MLine* edge, SVector3* dMax, SVector3* dMin, double* cMax, double* cMin, int isAbs) -{ - std::vector<MVertex*> LineVertices; - //LineVertices.resize(2); - edge->getEdgeVertices(0,LineVertices);//triangle->getVertex(0); - - int V0 = 0; - int V1 = 0; - - std::map<int,int>::iterator vertexIterator; - vertexIterator = _VertexToInt.find( LineVertices[0]->getNum() ); - if ( vertexIterator != _VertexToInt.end() ) V0 = (*vertexIterator).second; - else - std::cout << "Didn't find vertex with number " << LineVertices[0]->getNum() << " in _VertextToInt !" << std::endl; - - vertexIterator = _VertexToInt.find( LineVertices[1]->getNum() ); - if ( vertexIterator != _VertexToInt.end() ) V1 = (*vertexIterator).second; - else - std::cout << "Didn't find vertex with number " << LineVertices[1]->getNum() << " in _VertextToInt !" << std::endl; - - - if (isAbs){ - dMax[0] = _pdir1[V0]; - dMax[1] = _pdir1[V1]; - - dMin[0] = _pdir2[V0]; - dMin[1] = _pdir2[V1]; - - cMax[0] = std::abs(_curv1[V0]); - cMax[1] = std::abs(_curv1[V1]); - - cMin[0] = std::abs(_curv2[V0]); - cMin[1] = std::abs(_curv2[V1]); - - } - else{ - - dMax[0] = _pdir1[V0]; - dMax[1] = _pdir1[V1]; - - dMin[0] = _pdir2[V0]; - dMin[1] = _pdir2[V1]; - - cMax[0] = _curv1[V0]; - cMax[1] = _curv1[V1]; - - cMin[0] = _curv2[V0]; - cMin[1] = _curv2[V1]; - } -} - //======================================================================================================== - -void Curvature::vertexNodalValues(MVertex* A, double& c0, int isAbs) - { - int V0 = 0; - - std::map<int,int>::iterator vertexIterator; - - vertexIterator = _VertexToInt.find( A->getNum() ); - if ( vertexIterator != _VertexToInt.end() ) V0 = (*vertexIterator).second; - else std::cout << "Didn't find vertex with number " << A->getNum() << " in _VertextToInt !" << std::endl; - - - if (isAbs){ - c0 = std::abs(_VertexCurve[V0]); //Mean curvature in vertex 0 - } - else{ - c0 = _VertexCurve[V0]; //Mean curvature in vertex 0 - } - - } - -void Curvature::vertexNodalValuesAndDirections(MVertex *A, SVector3* dMax, SVector3* dMin, double* cMax, double* cMin, int isAbs) -{ - - int V0 = 0; - - std::map<int,int>::iterator vertexIterator; - vertexIterator = _VertexToInt.find( A->getNum() ); - if ( vertexIterator != _VertexToInt.end() ) V0 = (*vertexIterator).second; - else - std::cout << "Didn't find vertex with number " << A->getNum() << " in _VertextToInt !" << std::endl; - - if (isAbs){ - dMax[0] = _pdir1[V0]; - dMin[0] = _pdir2[V0]; - cMax[0] = std::abs(_curv1[V0]); - cMin[0] = std::abs(_curv2[V0]); - } - else{ - dMax[0] = _pdir1[V0]; - dMin[0] = _pdir2[V0]; - cMax[0] = _curv1[V0]; - cMin[0] = _curv2[V0]; - } -} - - -//======================================================================================================== - -double Curvature::getAtVertex(const MVertex *v) const { - std::map<int,int>::const_iterator it = _VertexToInt.find(v->getNum()); - if (it == _VertexToInt.end()) { - Msg::Error("curvature has not been computed for vertex %i (%i)", v->getNum(), _VertexToInt.size()); - return 1; - } - return _VertexCurve[it->second]; -} - -//======================================================================================================== - -void Curvature::writeToMshFile(const std::string &filename) -{ - std::ofstream outfile; - outfile.precision(18); - outfile.open(filename.c_str()); - - /// Write the values of curvature 1 (max) - outfile << "$MeshFormat" << std::endl; - outfile << "2.1 0 8" << std::endl; - outfile << "$EndMeshFormat" << std::endl; - outfile << "$NodeData" << std::endl; - outfile << "1" << std::endl; // One string tag - outfile << "\"Curvature 1 (max)\"" << std::endl; // The name of the view - outfile << "1" << std::endl; // One real tag - outfile << "0.0" << std::endl; // The time value - outfile << "3" << std::endl; // Three integer tags - outfile << "0" << std::endl; // The time step (time steps always start at 0) - outfile << "1" << std::endl; // 1-component (scalar) field - outfile << _VertexToInt.size() << std::endl; // How many associated nodal values - - std::map<int,int>::const_iterator vertex_iterator; - for(vertex_iterator = _VertexToInt.begin(); vertex_iterator != _VertexToInt.end(); ++vertex_iterator) - { - outfile << vertex_iterator->first << " " << _curv1[vertex_iterator->second] << std::endl; - } - - outfile << "$EndNodeData" << std::endl; - - - /// Write the values of curvature 2 (min) - outfile << "$MeshFormat" << std::endl; - outfile << "2.1 0 8" << std::endl; - outfile << "$EndMeshFormat" << std::endl; - outfile << "$NodeData" << std::endl; - outfile << "1" << std::endl; // One string tag - outfile << "\"Curvature 2 (min)\"" << std::endl; // The name of the view - outfile << "1" << std::endl; // One real tag - outfile << "0.0" << std::endl; // The time value - outfile << "3" << std::endl; // Three integer tags - outfile << "0" << std::endl; // The time step (time steps always start at 0) - outfile << "1" << std::endl; // 1-component (scalar) field - outfile << _VertexToInt.size() << std::endl; // How many associated nodal values - - - for(vertex_iterator = _VertexToInt.begin(); vertex_iterator != _VertexToInt.end(); ++vertex_iterator) - { - outfile << vertex_iterator->first << " " << _curv2[vertex_iterator->second] << std::endl; - } - - outfile << "$EndNodeData" << std::endl; - - - /// Write the values of characteristic length - - double lc; - - outfile << "$MeshFormat" << std::endl; - outfile << "2.1 0 8" << std::endl; - outfile << "$EndMeshFormat" << std::endl; - outfile << "$NodeData" << std::endl; - outfile << "1" << std::endl; // One string tag - outfile << "\"Characteristic mesh length\"" << std::endl; // The name of the view - outfile << "1" << std::endl; // One real tag - outfile << "0.0" << std::endl; // The time value - outfile << "3" << std::endl; // Three integer tags - outfile << "0" << std::endl; // The time step (time steps always start at 0) - outfile << "1" << std::endl; // 1-component (scalar) field - outfile << _VertexToInt.size() << std::endl; // How many associated nodal values - - for(vertex_iterator = _VertexToInt.begin(); vertex_iterator != _VertexToInt.end(); ++vertex_iterator) - { - lc = 2.0*M_PI/( fabs(_VertexCurve[vertex_iterator->second]) * CTX::instance()->mesh.minCircPoints ); - lc = std::max(lc, CTX::instance()->mesh.lcMin); - lc = std::min(lc, CTX::instance()->mesh.lcMax); - //outfile << vertex_iterator->first << " " << 1.0/(lc*lc) << std::endl; - outfile << vertex_iterator->first << " " << lc << std::endl; - } - - outfile << "$EndNodeData" << std::endl; - - /// Write the values of curvature direction - principal direction 1 - outfile << "$NodeData" << std::endl; - outfile << "1" << std::endl; // One string tag - outfile << "\"Principal curvature direction 1\"" << std::endl; // The name of the view - outfile << "1" << std::endl; // One real tag - outfile << "0.0" << std::endl; // The time value - outfile << "3" << std::endl; // Three integer tags - outfile << "0" << std::endl; // The time step (time steps always start at 0) - outfile << "3" << std::endl; // 3-component (vector) field - outfile << _VertexToInt.size() << std::endl; // How many associated nodal values - - for(vertex_iterator = _VertexToInt.begin(); vertex_iterator != _VertexToInt.end(); ++vertex_iterator) - { - outfile << vertex_iterator->first << " " << _pdir1[vertex_iterator->second].x() << " " - << _pdir1[vertex_iterator->second].y() << " " - << _pdir1[vertex_iterator->second].z() << std::endl; - } - - outfile << "$EndNodeData" << std::endl; - - - /// Write the values of curvature direction - principal direction 2 - outfile << "$NodeData" << std::endl; - outfile << "1" << std::endl; // One string tag - outfile << "\"Principal curvature direction 2\"" << std::endl; // The name of the view - outfile << "1" << std::endl; // One real tag - outfile << "0.0" << std::endl; // The time value - outfile << "3" << std::endl; // Three integer tags - outfile << "0" << std::endl; // The time step (time steps always start at 0) - outfile << "3" << std::endl; // 3-component (vector) field - outfile << _VertexToInt.size() << std::endl; // How many associated nodal values - - for(vertex_iterator = _VertexToInt.begin(); vertex_iterator != _VertexToInt.end(); ++vertex_iterator) - { - outfile << vertex_iterator->first << " " << _pdir2[vertex_iterator->second].x() << " " - << _pdir2[vertex_iterator->second].y() << " " - << _pdir2[vertex_iterator->second].z() << std::endl; - } - - outfile << "$EndNodeData" << std::endl; - - outfile.close(); - - -} - -//======================================================================================================== - -void Curvature::writeToPosFile( const std::string & filename) -{ - std::ofstream outfile; - outfile.precision(18); - outfile.open(filename.c_str()); - outfile << "View \"Curvature \"{" << std::endl; - - int idxelem = 0; - - for (unsigned int i = 0; i< _EntityArray.size(); ++i) { - GFace* face = _EntityArray[i]; - - for (unsigned iElem = 0; iElem < face->getNumMeshElements(); iElem++){ - MElement *e = face->getMeshElement(iElem); - //const int E = _ElementToInt[e->getNum()]; - //std::cout << "We are now looking at element Nr: " << E << std::endl; - - MVertex* A = e->getVertex(0); //Pointers to vertices of triangle - MVertex* B = e->getVertex(1); - MVertex* C = e->getVertex(2); - - const int V1 = _VertexToInt[A->getNum()]; //Tag of the 1st vertex of the triangle - const int V2 = _VertexToInt[B->getNum()]; //Tag of the 2nd vertex of the triangle - const int V3 = _VertexToInt[C->getNum()]; //Tag of the 3rd vertex of the triangle - - //Here is printing the triplet X-Y-Z of each vertex: - //************************************************* - - outfile << "ST("; //VT = vector triangles //ST = scalar triangle - outfile << A->x() << ","<< A->y() << "," << A->z()<< ","; - outfile << B->x() << ","<< B->y() << "," << B->z()<< ","; - outfile << C->x() << ","<< C->y() << "," << C->z(); - - outfile << ")"; - outfile <<"{"; - - //Here is printing the 3 components of the normal vector for each vertex: - //********************************************************************** - -// outfile << _VertexNormal[V1].x() << ","<< _VertexNormal[V1].y() << ","<< _VertexNormal[V1].z() << ","; -// outfile << _VertexNormal[V2].x() << ","<< _VertexNormal[V2].y() << ","<< _VertexNormal[V2].z() << ","; -// outfile << _VertexNormal[V3].x() << ","<< _VertexNormal[V3].y() << ","<< _VertexNormal[V3].z(); - - outfile << _VertexCurve[V1] << "," << _VertexCurve[V2] << "," << _VertexCurve[V3]; - - outfile << "};" << std::endl; - - idxelem++; - - } //Loop over elements - -} // Loop over ptFinalEntityList - -outfile << "};" << std::endl; - -outfile.close(); -} - -//======================================================================================================== - -void Curvature::writeToVtkFile( const std::string & filename) -{ - - std::ofstream outfile; - outfile.precision(18); - outfile.open(filename.c_str()); - outfile << "# vtk DataFile Version 2.0" << std::endl; - outfile << "Surface curvature computed by Gmsh" << std::endl; - outfile << "ASCII" << std::endl; - outfile << "DATASET UNSTRUCTURED_GRID" << std::endl; - - const int npoints = _VertexToInt.size(); - - outfile << "POINTS " << npoints << " double" << std::endl; - - /// Build a table of coordinates - /// Loop over all elements and look at the 'old' (not necessarily continuous) numbers of vertices - /// Get the 'new' index of each vertex through _VertexToInt and the [x,y,z] coordinates of this vertex - /// Store them in coordx,coordy and coordz - - - std::vector<VtkPoint> coord; - - coord.resize(npoints); - - for (unsigned int i = 0; i< _EntityArray.size(); ++i) - { - GFace* face = _EntityArray[i]; - - for (unsigned int iElem = 0; iElem < face->getNumMeshElements(); iElem++) - { - MElement *e = face->getMeshElement(iElem); - - MVertex* A = e->getVertex(0); //Pointers to vertices of triangle - MVertex* B = e->getVertex(1); - MVertex* C = e->getVertex(2); - - const int oldIdxA = A->getNum(); - const int oldIdxB = B->getNum(); - const int oldIdxC = C->getNum(); - - const int newIdxA = _VertexToInt[oldIdxA]; - const int newIdxB = _VertexToInt[oldIdxB]; - const int newIdxC = _VertexToInt[oldIdxC]; - - coord[newIdxA].x = A->x(); - coord[newIdxA].y = A->y(); - coord[newIdxA].z = A->z(); - - coord[newIdxB].x = B->x(); - coord[newIdxB].y = B->y(); - coord[newIdxB].z = B->z(); - - coord[newIdxC].x = C->x(); - coord[newIdxC].y = C->y(); - coord[newIdxC].z = C->z(); - } - } - - for (int v = 0; v < npoints; ++v) - { - outfile << coord[v].x << " " << coord[v].y << " " << coord[v].z << std::endl; - } - - /// Empty the array 'coord' to free the memory - /// Point coordinates will not be needed anymore - coord.clear(); - - /// Write the cell connectivity - - outfile << std::endl << "CELLS " << _ElementToInt.size() << " " << 4*_ElementToInt.size() << std::endl; - - for (unsigned int i = 0; i< _EntityArray.size(); ++i) - { - GFace* face = _EntityArray[i]; - - for (unsigned int iElem = 0; iElem < face->getNumMeshElements(); iElem++) - { - MElement *e = face->getMeshElement(iElem); - - MVertex* A = e->getVertex(0); //Pointers to vertices of triangle - MVertex* B = e->getVertex(1); - MVertex* C = e->getVertex(2); - - const int oldIdxA = A->getNum(); - const int oldIdxB = B->getNum(); - const int oldIdxC = C->getNum(); - - const int newIdxA = _VertexToInt[oldIdxA]; - const int newIdxB = _VertexToInt[oldIdxB]; - const int newIdxC = _VertexToInt[oldIdxC]; - - outfile << "3 " << newIdxA << " " << newIdxB << " " << newIdxC << std::endl; - } - } - - outfile << std::endl << "CELL_TYPES " << _ElementToInt.size() << std::endl; - for(unsigned int ie = 0; ie < _ElementToInt.size(); ++ie) - { - outfile << "5" << std::endl; //Triangle is element type 5 in vtk - - } - - /// Write the curvature values as vtk 'point data' - - outfile << std::endl << "POINT_DATA " << npoints << std::endl; - outfile << "SCALARS Curvature float 1" << std::endl; - outfile << "LOOKUP_TABLE default" << std::endl; - - for (int iv = 0; iv < npoints; ++iv) - { - outfile << _VertexCurve[iv] << std::endl; - } - - outfile << "SCALARS CharacteristicMeshLength float 1" << std::endl; - outfile << "LOOKUP_TABLE default" << std::endl; - - double lc; - - for (int iv = 0; iv < npoints; ++iv) - { - lc = 2.0*M_PI / ( fabs(_VertexCurve[iv]) * CTX::instance()->mesh.minCircPoints ); - lc = std::max(lc, CTX::instance()->mesh.lcMin); - lc = std::min(lc, CTX::instance()->mesh.lcMax); - //outfile << 1.0/(lc*lc) << std::endl; - outfile << lc << std::endl; - } - - outfile << "VECTORS CurvatureDir1 float" << std::endl; - for (int iv = 0; iv < npoints; ++iv) - { - outfile << _pdir1[iv].x() << " " << _pdir1[iv].y() << " " << _pdir1[iv].z() << std::endl; - } - - outfile << "VECTORS CurvatureDir2 float" << std::endl; - for (int iv = 0; iv < npoints; ++iv) - { - outfile << _pdir2[iv].x() << " " << _pdir2[iv].y() << " " << _pdir2[iv].z() << std::endl; - } - - outfile.close(); - -} - -//======================================================================================================== - -void Curvature::writeDirectionsToPosFile( const std::string & filename) -{ - std::ofstream outfile; - outfile.precision(18); - outfile.open(filename.c_str()); - outfile << "View \"Curvature_DirMax \"{" << std::endl; - - for (unsigned int i = 0; i< _EntityArray.size(); ++i) - { - GFace* face = _EntityArray[i]; //face is a pointer to one surface of the group "FinalEntityList" - - for (unsigned int iElem = 0; iElem < face->getNumMeshElements(); iElem++) //Loop over the element all the element of the "myTag"-surface - { - MElement *e = face->getMeshElement(iElem); //Pointer to one element - - //const int E = _ElementToInt[e->getNum()]; //The NEW tag of the corresponding element - //std::cout << "We are now looking at element Nr: " << E << std::endl; - - MVertex* A = e->getVertex(0); //Pointers to vertices of triangle - MVertex* B = e->getVertex(1); - MVertex* C = e->getVertex(2); - - const int V1 = _VertexToInt[A->getNum()]; //Tag of the 1st vertex of the triangle - const int V2 = _VertexToInt[B->getNum()]; //Tag of the 2nd vertex of the triangle - const int V3 = _VertexToInt[C->getNum()]; //Tag of the 3rd vertex of the triangle - - //Here is printing the triplet X-Y-Z of each vertex: - //************************************************* - - outfile << "VT("; //VT = vector triangles //ST = scalar triangle - outfile << A->x() << ","<< A->y() << "," << A->z()<< ","; - outfile << B->x() << ","<< B->y() << "," << B->z()<< ","; - outfile << C->x() << ","<< C->y() << "," << C->z(); - - outfile << ")"; - outfile <<"{"; - - //Here is printing the 3 components of the curvature max direction for each vertex: - //********************************************************************************* - - outfile << _pdir1[V1].x() << ","<< _pdir1[V1].y() << ","<< _pdir1[V1].z() << ","; - outfile << _pdir1[V2].x() << ","<< _pdir1[V2].y() << ","<< _pdir1[V2].z() << ","; - outfile << _pdir1[V3].x() << ","<< _pdir1[V3].y() << ","<< _pdir1[V3].z(); - - - outfile << "};" << std::endl; - - } //Loop over elements - -} // Loop over ptFinalEntityList - -outfile << "};" << std::endl; - - -//---------------------------------------------------------------------------------------------- - -outfile << "View \"Curvature_DirMin \"{" << std::endl; - -for (unsigned int i = 0; i< _EntityArray.size(); ++i) -{ - GFace* face = _EntityArray[i]; //face is a pointer to one surface of the group "FinalEntityList" - - for (unsigned int iElem = 0; iElem < face->getNumMeshElements(); iElem++) //Loop over the element all the element of the "myTag"-surface - { - MElement *e = face->getMeshElement(iElem); //Pointer to one element - - //const int E = _ElementToInt[e->getNum()]; //The NEW tag of the corresponding element - //std::cout << "We are now looking at element Nr: " << E << std::endl; - - MVertex* A = e->getVertex(0); //Pointers to vertices of triangle - MVertex* B = e->getVertex(1); - MVertex* C = e->getVertex(2); - - const int V1 = _VertexToInt[A->getNum()]; //Tag of the 1st vertex of the triangle - const int V2 = _VertexToInt[B->getNum()]; //Tag of the 2nd vertex of the triangle - const int V3 = _VertexToInt[C->getNum()]; //Tag of the 3rd vertex of the triangle - - //Here is printing the triplet X-Y-Z of each vertex: - //************************************************* - - outfile << "VT("; //VT = vector triangles //ST = scalar triangle - outfile << A->x() << ","<< A->y() << "," << A->z()<< ","; - outfile << B->x() << ","<< B->y() << "," << B->z()<< ","; - outfile << C->x() << ","<< C->y() << "," << C->z(); - - outfile << ")"; - outfile <<"{"; - - //Here is printing the 3 components of the curvature min direction for each vertex: - //********************************************************************************* - - outfile << _pdir2[V1].x() << ","<< _pdir2[V1].y() << ","<< _pdir2[V1].z() << ","; - outfile << _pdir2[V2].x() << ","<< _pdir2[V2].y() << ","<< _pdir2[V2].z() << ","; - outfile << _pdir2[V3].x() << ","<< _pdir2[V3].y() << ","<< _pdir2[V3].z(); - - - outfile << "};" << std::endl; - -} //Loop over elements - -} // Loop over ptFinalEntityList - -outfile << "};" << std::endl; - -outfile.close(); -} -//======================================================================================================== - - - diff --git a/Geo/Curvature.h b/Geo/Curvature.h deleted file mode 100644 index 133a9090f9d93ce828f37db68a1564783d350b65..0000000000000000000000000000000000000000 --- a/Geo/Curvature.h +++ /dev/null @@ -1,230 +0,0 @@ -// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle -// -// See the LICENSE.txt file for license information. Please report all -// bugs and problems to the public mailing list <gmsh@onelab.info>. - -#ifndef _CURVATURE_H_ -#define _CURVATURE_H_ - -#include "GModel.h" -#include "STensor3.h" - -#include<map> -#include<vector> -#include<list> - -class Curvature { - -private: - //---------------------------------------- - //TYPEDEFS: - - typedef std::vector<GFace*> GFaceList; - //typedef std::map<int, GEntityList >::iterator GEntityIter; - typedef std::map<int, GFaceList >::iterator GFaceIter; - - //----------------------------------------- - // HELPER TYPE FOR WRITING TO VTK FILES - struct VtkPoint - { - double x; - double y; - double z; - }; - - //----------------------------------------- - // HELPER TYPE FOR DETECTING BOUNDARY NODES - struct MeshEdgeInfo - { - int StartV; - int EndV; - int NbElemNeighbour; - }; - - //----------------------------------------- - // MEMBER VARIABLES - - //Static member variable to implement the class curvature as a Singleton - static Curvature *_instance; - static bool _destroyed; - - //Boolean to check if the curvature has already been computed - static bool _alreadyComputedCurvature; - - //Map definition - std::map<int, int> _VertexToInt; - std::map<int, int> _ElementToInt; - - bool _isMapInitialized; - - //Model and list of selected entities with give physical tag: - GModel* _model; - GFaceList _EntityArray; - - //Averaged vertex normals - std::vector<SVector3> _VertexNormal; - - // Vector of principal directions - std::vector<SVector3> _pdir1; - std::vector<SVector3> _pdir2; - - // Vector of principal curvature - std::vector<double> _curv1; - std::vector<double> _curv2; - std::vector<double> _curv12; - - // Area around point - std::vector<double> _pointareas; - std::vector<SVector3> _cornerareas; - - //Curvature Tensor per mesh vertex - std::vector<STensor3> _CurveTensor; - - //Area of a triangle element: - std::vector<double> _TriangleArea; - - //Area around a mesh vertex: - std::vector<double> _VertexArea; - std::vector<double> _VertexCurve; - - - //Number of neighbour for each vertices in the mesh: - std::vector<int> _NbNeighbour; - - //Vector of 0/1 to check which nodes are on the boundary: - std::vector<int> _isOnBoundary; - - std::vector<std::list<MeshEdgeInfo> > _VertexToEdgeList; - //----------------------------------------- - // PRIVATE METHODS - - //Constructor and destructor - Curvature(); - ~Curvature(); - - static void create(); - static void onDeadReference(); - - void initializeMap(); - void computeVertexNormals(); - void curvatureTensor(); - static void rot_coord_sys(const SVector3 &old_u, const SVector3 &old_v, - const SVector3 &new_norm, SVector3 &new_u, SVector3 &new_v); - void proj_curv( const SVector3 &old_u, const SVector3 &old_v, double old_ku, double old_kuv, - double old_kv, const SVector3 &new_u, const SVector3 &new_v, - double &new_ku, double &new_kuv, double &new_kv); - void diagonalize_curv(const SVector3 &old_u, const SVector3 &old_v, - double ku, double kuv, double kv, - const SVector3 &new_norm, - SVector3 &pdir1, SVector3 &pdir2, double &k1, double &k2); - void computePointareas(); - void computeRusinkiewiczNormals(); - - // Perform LDL^T decomposition of a symmetric positive definite matrix. - // Like Cholesky, but no square roots. Overwrites lower triangle of matrix. - static inline bool ldltdc(STensor3& A, double rdiag[3]) - { - double v[2]; - for (int i = 0; i < 3; i++) - { - for (int k = 0; k < i; k++) - v[k] = A(i,k) * rdiag[k]; - for (int j = i; j < 3; j++) - { - double sum = A(i,j); - for (int k = 0; k < i; k++) - sum -= v[k] * A(j,k); - if (i == j) - { - //if (unlikely(sum <= T(0))) - if (sum <= 0.0) - return false; - rdiag[i] = 1.0 / sum; - } - else - { - A(j,i) = sum; - } - } - } - - return true; - } - // Solve Ax=B after ldltdc - static inline void ldltsl(STensor3& A, double rdiag[3], double B[3], double x[3]) - { - int i; - for (i = 0; i < 3; i++) - { - double sum = B[i]; - for (int k = 0; k < i; k++) - sum -= A(i,k) * x[k]; - x[i] = sum * rdiag[i]; - } - for (i = 3 - 1; i >= 0; i--) - { - double sum = 0; - for (int k = i + 1; k < 3; k++) - sum += A(k,i) * x[k]; - x[i] -= sum * rdiag[i]; - } - } - - //Build the list of all edges: - void buildEdgeList(); - - //Smooth the computed curvature field via Laplacian smoothing method: - void smoothCurvatureField(const int NbIter); - -public: - - typedef enum {RUSIN=1,RBF=2, SIMPLE=3} typeOfCurvature; - static Curvature& getInstance(); - static bool valueAlreadyComputed(); - - inline void setGModel(GModel* model) - { - _model = model; - } - - void retrieveCompounds(); - void correctOnEdges(); - double getAtVertex(const MVertex *v) const; - //void retrievePhysicalSurfaces(const std::string & face_tag); - - void computeCurvature(GModel* model, typeOfCurvature typ); - - /// The following function implements algorithm from: - /// Implementation of an Algorithm for Approximating the Curvature Tensor - /// on a Triangular Surface Mesh in the Vish Environment - /// Edwin Matthews, Werner Benger, Marcel Ritter - void computeCurvature_Simple(); - - /// The following function implements algorithm from: - /// Estimating Curvatures and Their Derivatives on Triangle Meshes - /// Szymon Rusinkiewicz, Princeton University - /// Code taken from Rusinkiewicz' 'trimesh2' library - void computeCurvature_Rusinkiewicz(int isMax=0); - - void computeCurvature_RBF(); - - void triangleNodalValues(MTriangle* triangle, double& c0, double& c1, double& c2, int isAbs=0); - void triangleNodalValuesAndDirections(MTriangle* triangle, SVector3* dMax, SVector3* dMin, double* cMax, double* cMin, int isAbs=0); - - void edgeNodalValues(MLine* edge, double& c0, double& c1, int isAbs=0); - void edgeNodalValuesAndDirections(MLine* edge, SVector3* dMax, SVector3* dMin, double* cMax, double* cMin, int isAbs=0); - - void vertexNodalValues(MVertex* A, double& c0, int isAbs=0); - void vertexNodalValuesAndDirections(MVertex *A, SVector3* dMax, SVector3* dMin, double* cMax, double* cMin, int isAbs=0); - SVector3 vertexNormal (MVertex* A) ; - - void writeToMshFile( const std::string & filename); - - void writeToPosFile( const std::string & filename); - - void writeToVtkFile( const std::string & filename); - - void writeDirectionsToPosFile( const std::string & filename); -}; - -#endif diff --git a/Geo/GEdge.cpp b/Geo/GEdge.cpp index 13c8d5708b012f0b2778316db3b3028f497e83b2..66ca5b4660ae8dab3137a10e1528d52f4a1a221f 100644 --- a/Geo/GEdge.cpp +++ b/Geo/GEdge.cpp @@ -21,7 +21,7 @@ GEdge::GEdge(GModel *model, int tag, GVertex *_v0, GVertex *_v1) : GEntity(model, tag), _length(0.), _tooSmall(false), _cp(0), - v0(_v0), v1(_v1), compound(0), masterOrientation(0) + v0(_v0), v1(_v1), masterOrientation(0) { if(v0) v0->addEdge(this); if(v1 && v1 != v0) v1->addEdge(this); diff --git a/Geo/GEdge.h b/Geo/GEdge.h index 4538a95d80af0914523a647c87a428ddee9e7eec..b715ce0f89ec8309d00fa215884931175f017896 100644 --- a/Geo/GEdge.h +++ b/Geo/GEdge.h @@ -21,7 +21,6 @@ class MElement; class MLine; class ExtrudeParams; -class GEdgeCompound; class closestPointFinder; // A model edge. @@ -35,7 +34,6 @@ class GEdge : public GEntity { // FIXME: normals need to be mutable at the moment, because thay can // be created in const member functions mutable std::map<MVertex*, SVector3, std::less<MVertex*> > _normals; - GEdgeCompound *compound; // this model edge belongs to a compound std::list<GFace *> l_faces; // for specific solid modelers that need to re-do the internal curve // if a topological change ending points is done (glueing) @@ -191,10 +189,6 @@ class GEdge : public GEntity { virtual bool XYZToU(const double X, const double Y, const double Z, double &U, const double relax=1) const; - // compound - void setCompound(GEdgeCompound *gec) { compound = gec; } - GEdgeCompound *getCompound() const { return compound; } - // gluing void replaceEndingPoints(GVertex *, GVertex *); @@ -224,7 +218,7 @@ class GEdge : public GEntity { virtual void discretize(double tol, std::vector<SPoint3> &dpts, std::vector<double> &ts); SPoint3 closestPoint (SPoint3 &p, double tolerance); - virtual void mesh(bool) ; + virtual void mesh(bool verbose) ; }; #endif diff --git a/Geo/GEdgeCompound.cpp b/Geo/GEdgeCompound.cpp deleted file mode 100644 index 58f93ad36f677047b66c8088f4095767642fe74f..0000000000000000000000000000000000000000 --- a/Geo/GEdgeCompound.cpp +++ /dev/null @@ -1,359 +0,0 @@ -// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle -// -// See the LICENSE.txt file for license information. Please report all -// bugs and problems to the public mailing list <gmsh@onelab.info>. -// -// Contributor(s): -// Emilie Marchandise -// - -#include <stdlib.h> -#include "GmshConfig.h" -#include "GEdgeCompound.h" -#include "discreteEdge.h" -#include "Numeric.h" -#include "Curvature.h" - -static bool looksOk(int tag, std::vector<GEdge*> &compound) -{ - if(compound.empty()){ - Msg::Error("Empty edge compound %d", tag); - return false; - } - for(unsigned int i = 0; i < compound.size(); i++){ - if(!compound[i]->getBeginVertex() || !compound[i]->getEndVertex()){ - Msg::Error("Edge compound %d with missing begin/end vertex", tag); - return false; - } - if(compound.size() > 1 && compound[i]->getBeginVertex() == compound[i]->getEndVertex()){ - Msg::Warning("Edge compound %d with subloop", tag); - return true; - } - } - return true; -} - -GEdgeCompound::GEdgeCompound(GModel *m, int tag, std::vector<GEdge*> &compound, - std::vector<int> &orientation) - : GEdge(m, tag, 0, 0), _compound(compound), _orientation(orientation) -{ - if(!looksOk(tag, compound)) return; - - int N = _compound.size(); - if(N == (int)_orientation.size()){ - v0 = _orientation[0] ? _compound[0]->getBeginVertex() : _compound[0]->getEndVertex(); - v1 = _orientation[N-1] ? _compound[N-1]->getEndVertex() : _compound[N-1]->getBeginVertex(); - v0->addEdge(this); - v1->addEdge(this); - } - else{ - Msg::Error("Wrong input data for compound edge %d", tag); - return; - } - - for (unsigned int i = 0; i < _compound.size(); i++){ - _compound[i]->setCompound(this); - discreteEdge *de = dynamic_cast<discreteEdge*> (_compound[i]); - if(de) de->createGeometry(); - } - - for(std::vector<GEdge*>::iterator it = _compound.begin(); it != _compound.end(); ++it){ - if(!(*it)){ - Msg::Error("Incorrect edge in compound edge %d", tag); - return; - } - } - - parametrize(); -} - -GEdgeCompound::GEdgeCompound(GModel *m, int tag, std::vector<GEdge*> &compound) - : GEdge(m, tag, 0 , 0), _compound(compound) -{ - if(!looksOk(tag, compound)) return; - - orderEdges(); - int N = _compound.size(); - if(N == (int)_orientation.size()){ - v0 = _orientation[0] ? _compound[0]->getBeginVertex() : _compound[0]->getEndVertex(); - v1 = _orientation[N-1] ? _compound[N-1]->getEndVertex() : _compound[N-1]->getBeginVertex(); - v0->addEdge(this); - v1->addEdge(this); - } - else{ - Msg::Error("Wrong input data for compound edge %d", tag); - return; - } - - for (unsigned int i = 0; i < _compound.size(); i++){ - _compound[i]->setCompound(this); - discreteEdge *de = dynamic_cast<discreteEdge*> (_compound[i]); - if(de) de->createGeometry(); - } - parametrize(); -} - -void GEdgeCompound::orderEdges() -{ - std::vector<GEdge*> _c ; - std::list<GEdge*> edges ; - - for (unsigned int i = 0; i < _compound.size(); i++){ - edges.push_back(_compound[i]); - } - - // find a lonely edge - std::map<GVertex*, GEdge*> tempv; - for (std::list<GEdge*>::iterator it = edges.begin() ; it != edges.end() ; ++it){ - GVertex *v1 = (*it)->getBeginVertex(); - GVertex *v2 = (*it)->getEndVertex(); - if(!v1 || !v2){ - Msg::Error("Compounds don't support curves without two bounding vertices"); - return; - } - std::map<GVertex*, GEdge*>::iterator it1 = tempv.find(v1); - if (it1 == tempv.end()) { - tempv.insert(std::make_pair(v1, *it)); - } - else tempv.erase(it1); - std::map<GVertex*, GEdge*>::iterator it2 = tempv.find(v2); - if (it2 == tempv.end()){ - tempv.insert(std::make_pair(v2, *it)); - } - else tempv.erase(it2); - } - - // find the first GEdge and erase it from the list edges - GEdge *firstEdge; - if (tempv.size() == 2){ // non periodic - firstEdge = (tempv.begin())->second; - for (std::list<GEdge*>::iterator it = edges.begin() ; it != edges.end() ; ++it){ - if (*it == firstEdge){ - edges.erase(it); - break; - } - } - } - else if (tempv.size() == 0){ // periodic - firstEdge = *(edges.begin()); - edges.erase(edges.begin()); - } - else{ - Msg::Error("EdgeCompound %d is wrong (it has %d end points)", tag(), tempv.size()); - return; - } - - // loop over all segments to order segments and store it in the list _c - _c.push_back(firstEdge); - _orientation.push_back(1); - GVertex *first = _c[0]->getBeginVertex(); - GVertex *last = _c[0]->getEndVertex(); - - while (first != last){ - if (edges.empty())break; - bool found = false; - for (std::list<GEdge*>::iterator it = edges.begin() ; it != edges.end() ; ++it){ - GEdge *e = *it; - std::list<GEdge*>::iterator itp; - if (e->getBeginVertex() == last){ - _c.push_back(e); - itp = it; - it++; - edges.erase(itp); - _orientation.push_back(1); - last = e->getEndVertex(); - found = true; - break; - } - else if (e->getEndVertex() == last){ - _c.push_back(e); - itp = it; - it++; - edges.erase(itp); - _orientation.push_back(0); - last = e->getBeginVertex(); - found = true; - break; - } - } - if (!found){ - if (_c.size() == 1 && _orientation[0]){ - GVertex *temp = first; - first = last; - last = temp; - _orientation[0] = 0; - } - else { - Msg::Error("Compound Edge %d is wrong", tag()); - return; - } - } - } - - //edges is now a list of ordered GEdges - _compound = _c; - - // special case reverse orientation - if (_compound.size() < 2) return; - if (_orientation[0] && _compound[0]->getEndVertex() != _compound[1]->getEndVertex() - && _compound[0]->getEndVertex() != _compound[1]->getBeginVertex()){ - for (unsigned int i = 0; i < _compound.size(); i++){ - _orientation[i] = !_orientation[i] ; - } - } -} - -int GEdgeCompound::minimumMeshSegments() const -{ - // int N = 0; - // for (unsigned int i = 0; i < _compound.size(); i++) - // N += _compound[i]->minimumMeshSegments(); - return 3; -} - -int GEdgeCompound::minimumDrawSegments() const -{ - int N = 0; - for (unsigned int i = 0; i < _compound.size(); i++) - N += _compound[i]->minimumDrawSegments(); - return N; -} - -GEdgeCompound::~GEdgeCompound() -{ -} - -Range<double> GEdgeCompound::parBounds(int i) const -{ - if(_pars.empty()){ - Msg::Error("Edge compound has no parametrization"); - return Range<double>(0, 1); - } - return Range<double>(0, _pars[_compound.size()]); -} - -/* - +--------+-----------+----------- ... ----+ - 0 _pars[1] _pars[2] _pars[N-1] - -*/ - -bool GEdgeCompound::getLocalParameter(const double &t, - int &iEdge, - double &tLoc) const -{ - if(_pars.empty()){ - Msg::Error("Edge compound has no parametrization"); - return false; - } - for (iEdge = 0; iEdge < (int)_compound.size(); iEdge++){ - double tmin = _pars[iEdge]; - double tmax = _pars[iEdge+1]; - if (t >= tmin && t <= tmax){ - Range<double> b = _compound[iEdge]->parBounds(0); - tLoc = _orientation[iEdge] ? - b.low() + (t-tmin)/(tmax-tmin) * (b.high()-b.low()) : - b.high() - (t-tmin)/(tmax-tmin) * (b.high()-b.low()) ; - return true; - } - } - return false; -} - -void GEdgeCompound::parametrize() -{ - _pars.clear(); - _pars.push_back(0.0); - for (unsigned int i = 0; i < _compound.size(); i++){ - Range<double> b = _compound[i]->parBounds(0); - _pars.push_back(_pars[_pars.size()-1] + (b.high() - b.low())); - } -} - -double GEdgeCompound::curvature(double par) const -{ - double tLoc; - int iEdge; - if(!getLocalParameter(par, iEdge, tLoc)) - return 0.; - return _compound[iEdge]->curvature(tLoc); -} - -double GEdgeCompound::curvatures(const double par, SVector3 *dirMax, SVector3 *dirMin, - double *curvMax, double *curvMin) const -{ - double tLoc = -1.0; - int iEdge; - if(!getLocalParameter(par, iEdge, tLoc)) - return 0; - - if( _compound[iEdge]->geomType() == GEntity::DiscreteCurve){ - Curvature& curvature = Curvature::getInstance(); - if( !Curvature::valueAlreadyComputed() ){ - Msg::Info("Need to compute discrete curvature for anisotropic remesh (in GFace)"); - Curvature::typeOfCurvature type = Curvature::RUSIN; //RBF - curvature.computeCurvature(model(), type); - } - double tLocMLine; - int iMLine; - discreteEdge* ptrEdge = dynamic_cast<discreteEdge*>(_compound[iEdge]); - ptrEdge->getLocalParameter(tLoc, iMLine, tLocMLine); - - //vector of MLines - MLine* mline = ptrEdge->lines[iMLine]; - - double cMin[2]; - double cMax[2]; - SVector3 dMin[2]; - SVector3 dMax[2]; - curvature.edgeNodalValuesAndDirections(mline, dMax, dMin, cMax, cMin, 1); - - *dirMax = (1-tLocMLine)*dMax[0] + tLocMLine*dMax[1]; - *dirMin = (1-tLocMLine)*dMin[0] + tLocMLine*dMin[1]; - *curvMax = (1-tLocMLine)*cMax[0] + tLocMLine*cMax[1]; - *curvMin = (1-tLocMLine)*cMin[0] + tLocMLine*cMin[1]; - - return *curvMax; - } - else{ - Msg::Error("Case of CAD Geometry, don't know what to do here..."); - } - return 0.0; -} - -GPoint GEdgeCompound::point(double par) const -{ - double tLoc; - int iEdge; - if(!getLocalParameter(par, iEdge, tLoc)) - return GPoint(); - return _compound[iEdge]->point(tLoc); -} - -SVector3 GEdgeCompound::firstDer(double par) const -{ - double tLoc; - int iEdge; - if(!getLocalParameter(par, iEdge, tLoc)) - return SVector3(); - return _compound[iEdge]->firstDer(tLoc); -} - -void replaceMeshCompound(GFace *gf, std::list<GEdge*> &edges) -{ - std::list<GEdge*> e = gf->edges(); - // replace edges by their compounds - std::set<GEdge*> mySet; - std::list<GEdge*>::iterator it = e.begin(); - while(it != e.end()){ - if((*it)->getCompound()){ - mySet.insert((*it)->getCompound()); - } - else{ - mySet.insert(*it); - } - ++it; - } - edges.clear(); - edges.insert(edges.begin(), mySet.begin(), mySet.end()); -} diff --git a/Geo/GEdgeCompound.h b/Geo/GEdgeCompound.h deleted file mode 100644 index 036f021f20093233c119654ce01ef290df546714..0000000000000000000000000000000000000000 --- a/Geo/GEdgeCompound.h +++ /dev/null @@ -1,43 +0,0 @@ -// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle -// -// See the LICENSE.txt file for license information. Please report all -// bugs and problems to the public mailing list <gmsh@onelab.info>. - -#ifndef _GEDGE_COMPOUND_H_ -#define _GEDGE_COMPOUND_H_ - -#include "GFace.h" -#include "GEdge.h" - -// A GEdgeCompound is a model edge that is the compound of model edges. - -class GEdgeCompound : public GEdge { - protected: - std::vector<GEdge*> _compound; - std::vector<int> _orientation; - std::vector<double> _pars; - void orderEdges(); - public: - void parametrize(); - bool getLocalParameter(const double &t, int &iEdge, double & tLoc) const; - GEdgeCompound(GModel *m, int tag, std::vector<GEdge*> &compound); - GEdgeCompound(GModel *m, int tag, std::vector<GEdge*> &compound, - std::vector<int> &orientation); // confidence in the input - virtual ~GEdgeCompound(); - Range<double> parBounds(int i) const; - virtual GPoint point(double par) const; - virtual SVector3 firstDer(double par) const; - virtual GEntity::GeomType geomType() const { return CompoundCurve; } - ModelType getNativeType() const { return GmshModel; } - void * getNativePtr() const { return 0; } - virtual double curvature(double t) const; - virtual double curvatures(const double par, SVector3 *dirMax, SVector3 *dirMin, - double *curvMax, double *curvMin) const; - virtual int minimumMeshSegments() const; - virtual int minimumDrawSegments() const; - std::vector<GEdge*> getCompounds() const { return _compound; } -}; - -void replaceMeshCompound(GFace*, std::list<GEdge*>&); - -#endif diff --git a/Geo/GFace.cpp b/Geo/GFace.cpp index 34349160a57790910e28de77b14ab496c6e6c758..3420f7af1b706c0a775dd13d9b6bfec05f637b73 100644 --- a/Geo/GFace.cpp +++ b/Geo/GFace.cpp @@ -35,7 +35,7 @@ #define SQU(a) ((a)*(a)) GFace::GFace(GModel *model, int tag) - : GEntity(model, tag), r1(0), r2(0), compound(0), va_geom_triangles(0) + : GEntity(model, tag), r1(0), r2(0), va_geom_triangles(0) { meshStatistics.status = GFace::PENDING; resetMeshAttributes(); @@ -1101,7 +1101,7 @@ GPoint GFace::closestPoint(const SPoint3 &queryPoint, const double initialGuess[ #endif } -bool GFace::containsParam(const SPoint2 &pt) +bool GFace::containsParam(const SPoint2 &pt) { Range<double> uu = parBounds(0); Range<double> vv = parBounds(1); @@ -1344,13 +1344,13 @@ bool GFace::fillPointCloud(double maxDist, #if defined(HAVE_MESH) static void meshCompound(GFace* gf, bool verbose) { - discreteFace *df = new discreteFace (gf->model(), gf->tag() + 100000); - + discreteFace *df = new discreteFace(gf->model(), gf->tag() + 100000, true); std::set<int> ec; - for (unsigned int i=0;i<gf->_compound.size();i++){ + + for (unsigned int i = 0; i < gf->_compound.size(); i++){ GFace *c = (GFace*)gf->_compound[i]; std::list<GEdge*> edges = c->edges(); - for (std::list<GEdge*> :: iterator it = edges.begin() ; it != edges.end(); ++it){ + for (std::list<GEdge*>::iterator it = edges.begin() ; it != edges.end(); ++it){ std::set<int>::iterator found = ec.find((*it)->tag()); if (found == ec.end())ec.insert((*it)->tag()); else ec.erase(found); @@ -1359,10 +1359,12 @@ static void meshCompound(GFace* gf, bool verbose) c->triangles.end()); df->mesh_vertices.insert(df->mesh_vertices.end(), c->mesh_vertices.begin(), c->mesh_vertices.end()); - for (unsigned int j=0;j<c->triangles.size();j++)df->_CAD.push_back(c); + for (unsigned int j = 0; j < c->triangles.size(); j++) + df->_CAD.push_back(c); c->triangles.clear(); c->mesh_vertices.clear(); } + std::vector<int> cedges; cedges.insert(cedges.begin(), ec.begin(), ec.end()); df->setBoundEdges(cedges); @@ -1377,15 +1379,17 @@ void GFace::mesh(bool verbose) #if defined(HAVE_MESH) meshGFace mesher; mesher(this, verbose); - if (!_compound.empty()){ // Some faces are meshed together - if (_compound[0] == this){ // I'm the one that makes the compound job + if(_compound.size()){ // Some faces are meshed together + if(_compound[0] == this){ // I'm the one that makes the compound job bool ok = true; - for (unsigned int i = 0; i < _compound.size(); i++){ + for(unsigned int i = 0; i < _compound.size(); i++){ GFace *gf = (GFace*)_compound[i]; ok &= (gf->meshStatistics.status == GFace::DONE); } - if (!ok)meshStatistics.status = GFace::PENDING; - else { + if(!ok){ + meshStatistics.status = GFace::PENDING; + } + else{ meshCompound(this, verbose); return; } @@ -1399,8 +1403,8 @@ void GFace::lloyd(int nbiter, int infn) #if defined(HAVE_MESH) && defined(HAVE_BFGS) smoothing s = smoothing(nbiter,infn); s.optimize_face(this); - //lloydAlgorithm algo(nbiter, infn); - //algo(this); + // lloydAlgorithm algo(nbiter, infn); + // algo(this); #endif } diff --git a/Geo/GFace.h b/Geo/GFace.h index b55a4b71382452b1c63bb7ce005c25c21d69685c..5e3cd5d1a753b5e15b718d0564c5da16bb20a2a4 100644 --- a/Geo/GFace.h +++ b/Geo/GFace.h @@ -24,7 +24,6 @@ class MTriangle; class MQuadrangle; class MPolygon; class ExtrudeParams; -class GFaceCompound; class GRegion; @@ -39,7 +38,6 @@ class GFace : public GEntity { mean_plane meanPlane; std::list<GEdge *> embedded_edges; std::list<GVertex *> embedded_vertices; - GFaceCompound *compound; // this model face belongs to a compound BoundaryLayerColumns _columns; @@ -254,10 +252,6 @@ class GFace : public GEntity { void computeMeshSizeFieldAccuracy(double &avg,double &max_e, double &min_e, int &nE, int &GS); - // compound - void setCompound(GFaceCompound *gfc) { compound = gfc; } - GFaceCompound *getCompound() const { return compound; } - // add points (and optionally normals) in vectors so that two // points are at most maxDist apart bool fillPointCloud(double maxDist, diff --git a/Geo/GFaceCompound.cpp b/Geo/GFaceCompound.cpp deleted file mode 100644 index 46170ba73490387b30e98d6d97da57701dfdbae2..0000000000000000000000000000000000000000 --- a/Geo/GFaceCompound.cpp +++ /dev/null @@ -1,3083 +0,0 @@ -// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle -// -// See the LICENSE.txt file for license information. Please report all -// bugs and problems to the public mailing list <gmsh@onelab.info>. -// -// Contributor(s): -// Emilie Marchandise -// - -#include "GmshConfig.h" -#include "GmshDefines.h" -#include "GFaceCompound.h" -#include "GEdgeCompound.h" -#include "intersectCurveSurface.h" -#include "OS.h" - -#if defined(HAVE_SOLVER) && defined(HAVE_ANN) - -#include "Options.h" -#include "MLine.h" -#include "MTriangle.h" -#include "Numeric.h" -#include "Octree.h" -#include "SBoundingBox3d.h" -#include "SPoint3.h" -#include "polynomialBasis.h" -#include "robustPredicates.h" -#include "MElementCut.h" -#include "dofManager.h" -#include "laplaceTerm.h" -#include "crossConfTerm.h" -#include "convexCombinationTerm.h" -#include "diagBCTerm.h" -#include "linearSystemGMM.h" -#include "linearSystemCSR.h" -#include "linearSystemFull.h" -#include "linearSystemPETSc.h" -#include "CreateFile.h" -#include "Context.h" -#include "discreteFace.h" -#include "eigenSolver.h" -#include "multiscaleLaplace.h" -#include "GRbf.h" -#include "Curvature.h" -#include "MPoint.h" -#include "Numeric.h" -#include "meshGFace.h" -#include "ANN/ANN.h" - -static void fixEdgeToValue(GEdge *ed, double value, dofManager<double> &myAssembler) -{ - myAssembler.fixVertex(ed->getBeginVertex()->mesh_vertices[0], 0, 1, value); - myAssembler.fixVertex(ed->getEndVertex()->mesh_vertices[0], 0, 1, value); - for(unsigned int i = 0; i < ed->mesh_vertices.size(); i++){ - myAssembler.fixVertex(ed->mesh_vertices[i], 0, 1, value); - } -} - -static std::vector<MVertex*> getBlob(unsigned int minNbPt, v2t_cont::iterator it, - v2t_cont &adj) -{ - std::vector<MVertex*> vv(1,it->first), bvv = vv; - // Vector of vertices in blob and in boundary of blob - do { - std::set<MVertex*> nbvv; - // Set of vertices in new boundary - for (std::vector<MVertex*>::iterator itBV = bvv.begin(); itBV != bvv.end(); itBV++) { - // For each boundary vertex... - std::vector<MElement*> &adjBV = adj[*itBV]; - for (std::vector<MElement*>::iterator itBVEl = adjBV.begin(); itBVEl != adjBV.end(); - itBVEl++) { - for (int iV=0; iV<(*itBVEl)->getNumVertices(); iV++){ - // ... look for adjacent vertices... - MVertex *v = (*itBVEl)->getVertex(iV); - if (find(vv.begin(),vv.end(),v) == vv.end()) nbvv.insert(v); - // ... and add them in the new boundary if they are not already in the blob - } - } - } - if (nbvv.empty()) bvv.clear(); - else { - bvv.assign(nbvv.begin(),nbvv.end()); - vv.insert(vv.end(),nbvv.begin(),nbvv.end()); - } -// } while (!bvv.empty()); - } while (vv.size() < minNbPt); - // Repeat until min. number of points is reached - - return vv; -} - -static bool orderVertices(const std::list<GEdge*> &e, std::vector<MVertex*> &l, - std::vector<double> &coord) -{ - l.clear(); - coord.clear(); - - std::list<GEdge*>::const_iterator it = e.begin(); - std::list<MLine*> temp; - double tot_length = 0; - for( ; it != e.end(); ++it ){ - for(unsigned int i = 0; i < (*it)->lines.size(); i++ ){ - temp.push_back((*it)->lines[i]); - MVertex *v0 = (*it)->lines[i]->getVertex(0); - MVertex *v1 = (*it)->lines[i]->getVertex(1); - const double length = sqrt((v0->x() - v1->x()) * (v0->x() - v1->x()) + - (v0->y() - v1->y()) * (v0->y() - v1->y()) + - (v0->z() - v1->z()) * (v0->z() - v1->z())); - tot_length += length; - } - } - - MVertex *first_v = (*temp.begin())->getVertex(0); - MVertex *current_v = (*temp.begin())->getVertex(1); - - l.push_back(first_v); - coord.push_back(0.0); - temp.erase(temp.begin()); - - while(temp.size()){ - bool found = false; - for(std::list<MLine*>::iterator itl = temp.begin(); itl != temp.end(); ++itl){ - MLine *ll = *itl; - MVertex *v0 = ll->getVertex(0); - MVertex *v1 = ll->getVertex(1); - if(v0 == current_v){ - found = true; - l.push_back(current_v); - current_v = v1; - temp.erase(itl); - const double length = sqrt((v0->x() - v1->x()) * (v0->x() - v1->x()) + - (v0->y() - v1->y()) * (v0->y() - v1->y()) + - (v0->z() - v1->z()) * (v0->z() - v1->z())); - coord.push_back(coord[coord.size()-1] + length / tot_length); - break; - } - else if(v1 == current_v){ - found = true; - l.push_back(current_v); - current_v = v0; - temp.erase(itl); - const double length = sqrt((v0->x() - v1->x()) * (v0->x() - v1->x()) + - (v0->y() - v1->y()) * (v0->y() - v1->y()) + - (v0->z() - v1->z()) * (v0->z() - v1->z())); - coord.push_back(coord[coord.size()-1] + length / tot_length); - break; - } - } - if(!found) return false; - } - - return true; -} - -static bool computeCGKernelPolygon(std::map<MVertex*,SPoint3> &coordinates, - std::vector<MVertex*> &cavV, - double &ucg, double &vcg) -{ - ucg = 0.0; - vcg = 0.0; - - // place at CG KERNEL polygon - - int nbPts = cavV.size(); - fullMatrix<double> u(100,2); - int ipt = 0; - for(std::vector<MVertex*>::iterator it = cavV.begin(); it != cavV.end(); it++){ - SPoint3 vsp = coordinates[*it]; - u(ipt,0) = vsp[0]; - u(ipt,1) = vsp[1]; - ucg += u(ipt,0); - vcg += u(ipt,1); - ipt++; - } - ucg /= ipt; - vcg /= ipt; - - double eps = -5.e-7; - int N = nbPts; - - std::set<int> setP; - for(int k = 0; k < nbPts; k++) setP.insert(k); - - if(nbPts > 3){ - for(int i = 0; i < nbPts - 2; i++){ - int next = i + 1; - double x1, x2, y1, y2; - x1 = u(i, 0); y1 = u(i, 1); - x2 = u(next, 0); y2 = u(next, 1); - for(int j = i + 2; j < nbPts; j++){ - int jnext = j + 1; - if(j == nbPts - 1) jnext = 0; - double x3, x4, y3, y4, x,y; - double a, b, c, d; - x3 = u(j, 0); y3 = u(j, 1); - x4 = u(jnext, 0); y4 = u(jnext, 1); - a = (y2 - y1) / (x2 - x1); - c = (y4 - y3) / (x4 - x3); - b = y1 - a * x1; - d = y3 - c * x3; - if(fabs(a - c) > 1.e-5 && x2 !=x1 && x4 != x3 && jnext != i){ - x = (d - b) / (a - c); - y = a * x + b; - bool exist= false; - for(unsigned int k = 1; k < setP.size(); k++){ - if(x == u(k, 0) && y == u(k, 1)) exist = true; - } - if(!exist){ - u(N, 0) = x; u(N, 1) = y; - setP.insert(N); - N++; - } - } - } - } - - int nbAll = setP.size(); - for(int i = 0; i <nbPts; i++){ - int next = i + 1; - if(next == nbPts) next = 0; - double p1[2] = {u(next, 0) - u(i, 0), u(next, 1) - u(i, 1)}; - for(int k = 0; k < nbAll; k++){ - double p2[2] = {u(k, 0) - u(i, 0), u(k, 1) - u(i, 1)}; - double crossProd = p1[0] * p2[1] - p2[0] * p1[1]; - if(crossProd < eps){ - setP.erase(k); - } - } - } - } - - int nbFinal = setP.size(); - if(nbFinal > 0){ - ucg = 0.0; - vcg = 0.0; - for(std::set<int>::iterator it =setP.begin(); it != setP.end(); it++){ - ucg += u(*it,0); - vcg += u(*it,1); - } - ucg /= nbFinal; - vcg /= nbFinal; - return true; - } - else{ - return false; - } -} - -static void myPolygon(std::vector<MElement*> &vTri, std::vector<MVertex*> &vPoly) -{ - std::vector<MEdge> ePoly; - for(unsigned int i = 0; i < vTri.size() ; i++) { - MTriangle *t = (MTriangle*) vTri[i]; - for(int iEdge = 0; iEdge < 3; iEdge++) { - MEdge tmp_edge = t->getEdge(iEdge); - if(std::find(ePoly.begin(), ePoly.end(), tmp_edge) == ePoly.end()) - ePoly.push_back(tmp_edge); - else - ePoly.erase(std::find(ePoly.begin(), ePoly.end(),tmp_edge)); - } - } - - std::vector<MEdge>::iterator ite= ePoly.begin() ; - MVertex *vINIT = ite->getVertex(0); - vPoly.push_back(vINIT); - vPoly.push_back(ite->getVertex(1)); - ePoly.erase(ite); - - while(!ePoly.empty()){ - ite = ePoly.begin() ; - while(ite != ePoly.end()){ - MVertex *vB = ite->getVertex(0); - MVertex *vE = ite->getVertex(1); - if(vB == vPoly.back()){ - if(vE != vINIT) vPoly.push_back(vE); - ePoly.erase(ite); - } - else if(vE == vPoly.back()){ - if(vB != vINIT) vPoly.push_back(vB); - ePoly.erase(ite); - } - else ite++; - } - } -} - -static double normalUV(MTriangle *t, std::map<MVertex*, SPoint3> &vCoord) -{ - SPoint3 v0 = vCoord[t->getVertex(0)]; - SPoint3 v1 = vCoord[t->getVertex(1)]; - SPoint3 v2 = vCoord[t->getVertex(2)]; - double p0[2] = {v0[0], v0[1]}; - double p1[2] = {v1[0], v1[1]}; - double p2[2] = {v2[0], v2[1]}; - double normal = robustPredicates::orient2d(p0, p1, p2); - - // SVector3 P0 (v0.x(),v0.y(), 0.0); - // SVector3 P1 (v1.x(),v1.y(), 0.0); - // SVector3 P2 (v2.x(),v2.y(), 0.0); - // double normal2 = crossprod(P1-P0,P2-P1).z(); - // if (normal != 0.0) normal /= std::abs(normal); - - return normal; -} - -static bool checkCavity(std::vector<MElement*> &vTri, std::map<MVertex*, SPoint3> &vCoord) -{ - bool badCavity = false; - - unsigned int nbV = vTri.size(); - double a_old = 0.0, a_new; - for(unsigned int i = 0; i < nbV; ++i){ - a_new = normalUV((MTriangle*) vTri[i], vCoord); - if(i == 0) a_old=a_new; - if(a_new*a_old < 0.0) badCavity = true; - } - return badCavity; -} - -static bool closedCavity(MVertex *v, std::vector<MElement*> &vTri) -{ - std::set<MVertex *> vs; - for (unsigned int i = 0; i < vTri.size(); i++){ - MElement *t = vTri[i]; - for (int j = 0; j < t->getNumVertices(); j++){ - MVertex *vv = t->getVertex(j); - if (vv != v){ - if (vs.find(vv) == vs.end())vs.insert(vv); - else vs.erase(vv); - } - } - } - return vs.empty(); -} - -static MVertex* findVertexInTri(v2t_cont &adjv, MVertex *v0, MVertex *v1, - std::map<MVertex*, SPoint3> &vCoord, double nTot, - bool &inverted) -{ - MVertex *v2 = 0; - v2t_cont :: iterator it0 = adjv.find(v0); - std::vector<MElement*> vTri0 = it0->second; - MElement *myTri = 0; - for (unsigned int j = 0; j < vTri0.size(); j++){ - MVertex *vt0 = vTri0[j]->getVertex(0); - MVertex *vt1 = vTri0[j]->getVertex(1); - MVertex *vt2 = vTri0[j]->getVertex(2); - bool found0 = (vt0==v0 || vt1 ==v0 || vt2 ==v0) ? true: false; - bool found1 = (vt0==v1 || vt1 ==v1 || vt2 ==v1) ? true: false; - if (found0 && found1) { myTri = vTri0[j]; break; } - } - if(!myTri) return 0; - for (unsigned int j = 0; j < 3; j++){ - MVertex *vj = myTri->getVertex(j); - if (vj!=v0 && vj!=v1) { v2 = vj; break;} - } - double normTri = normalUV((MTriangle*)myTri, vCoord); - if (nTot*normTri < 0.0) inverted = true; - else inverted = false; - - return v2; -} - -static MTriangle* findInvertedTri(v2t_cont &adjv, MVertex*v0, MVertex*v1, MVertex*v2, - std::map<MVertex*, SPoint3> &vCoord, double nTot) -{ - v2t_cont::iterator it = adjv.find(v1); - std::vector<MElement*> vTri = it->second; - MTriangle *myTri=NULL; - for (unsigned int j = 0; j < vTri.size(); j++){ - double normTri = normalUV((MTriangle*)vTri[j], vCoord); - if (nTot * normTri < 0.0) { - MVertex *vt0 = vTri[j]->getVertex(0); - MVertex *vt1 = vTri[j]->getVertex(1); - MVertex *vt2 = vTri[j]->getVertex(2); - bool found0 = (vt0==v0 || vt1 ==v0 || vt2 ==v0) ? true: false; - bool found2 = (vt0==v2 || vt1 ==v2 || vt2 ==v2) ? true: false; - if (!found0 && !found2) { myTri = (MTriangle*)vTri[j]; break; } - } - } - - return myTri; -} - -void GFaceCompound::orientFillTris(std::list<MTriangle*> loopfillTris) const -{ - // check normal orientations of loopfillTris - bool invertTris = false; - std::map<MEdge, std::set<MTriangle*>, Less_Edge > edge2tris; - for(std::list<MTriangle*>::iterator t = loopfillTris.begin(); - t != loopfillTris.end(); t++){ - for (int j = 0; j < 3; j++){ - MEdge me = (*t)->getEdge(j); - std::map<MEdge, std::set<MTriangle*, std::less<MTriangle*> >, - Less_Edge >::iterator it = edge2tris.find(me); - if (it == edge2tris.end()) { - std::set<MTriangle*, std::less<MTriangle*> > mySet; - mySet.insert(*t); - edge2tris.insert(std::make_pair(me, mySet)); - } - else{ - std::set<MTriangle*, std::less<MTriangle*> > mySet = it->second; - mySet.insert(*t); - it->second = mySet; - } - } - } - - int iE, si, iE2, si2; - std::list<GFace*>::const_iterator itf = _compound.begin(); - for( ; itf != _compound.end(); ++itf){ - for(unsigned int i = 0; i < (*itf)->triangles.size(); ++i){ - MTriangle *t = (*itf)->triangles[i]; - for (int j = 0; j < 3; j++){ - MEdge me = t->getEdge(j); - std::map<MEdge, std::set<MTriangle*>, Less_Edge >::iterator it = - edge2tris.find(me); - if(it != edge2tris.end()){ - t->getEdgeInfo(me, iE,si); - MTriangle* t2 = *((it->second).begin()); - t2->getEdgeInfo(me,iE2,si2); - if(si == si2) { - invertTris = true; - break; - } - } - } - } - } - if (invertTris){ - for (std::list<MTriangle*>::iterator it = loopfillTris.begin(); - it != loopfillTris.end(); it++ ) - (*it)->reverse(); - } - - fillTris.insert(fillTris.begin(),loopfillTris.begin(),loopfillTris.end()); -} - -void GFaceCompound::printFillTris() const -{ - if(!CTX::instance()->mesh.saveAll) return; - - if (fillTris.size() > 0){ - char name[256]; - //std::list<GFace*>::const_iterator itf = _compound.begin(); - sprintf(name, "fillTris-%d.pos", tag()); - FILE * ftri = Fopen(name,"w"); - if(ftri){ - fprintf(ftri,"View \"\"{\n"); - for (std::list<MTriangle*>::iterator it2 = fillTris.begin(); - it2 !=fillTris.end(); it2++ ){ - MTriangle *t = (*it2); - fprintf(ftri,"ST(%g,%g,%g,%g,%g,%g,%g,%g,%g){%g,%g,%g};\n", - t->getVertex(0)->x(), t->getVertex(0)->y(), t->getVertex(0)->z(), - t->getVertex(1)->x(), t->getVertex(1)->y(), t->getVertex(1)->z(), - t->getVertex(2)->x(), t->getVertex(2)->y(), t->getVertex(2)->z(), - 1., 1., 1.); - } - fprintf(ftri,"};\n"); - fclose(ftri); - } - } -} - -void GFaceCompound::fillNeumannBCS_Plane() const -{ -#if 0 -//#if defined(HAVE_MESH) - - Msg::Debug("Meshing %d interior holes with planes ", _interior_loops.size()-1); - - fillTris.clear(); - fillNodes.clear(); - - if (_interior_loops.size()==1 && _type != SQUARE) return; - - GModel::current()->setFactory("Gmsh"); - //GModel::current()->setFactory("OpenCASCADE"); - std::vector<std::vector<GFace *> > myFaceLoops; - std::vector<GFace *> myFaces; - for(std::list<std::list<GEdge*> >::const_iterator iloop = _interior_loops.begin(); - iloop != _interior_loops.end(); iloop++){ - std::list<MTriangle*> loopfillTris; - std::list<GEdge*> loop = *iloop; - if (loop != _U0 ){ - std::vector<std::vector<GEdge *> > myEdgeLoops; - std::vector<GEdge*> myEdges; - myEdgeLoops.clear(); - myEdges.clear(); - for (std::list<GEdge*>::iterator itl = loop.begin(); itl != loop.end(); itl++){ - myEdges.push_back(*itl); - } - myEdgeLoops.push_back(myEdges); - GFace *newFace = GModel::current()->addPlanarFace(myEdgeLoops); - fillFaces.push_back(newFace); - int meshingAlgo = CTX::instance()->mesh.algo2d; - int recombine = CTX::instance()->mesh.recombineAll; - opt_mesh_algo2d(0, GMSH_SET, 1.0); //mesh adapt - opt_mesh_recombine_all(0, GMSH_SET, 0.0); //no recombination - meshGFace mgf; - mgf(newFace,false); - opt_mesh_algo2d(0, GMSH_SET, meshingAlgo); - opt_mesh_recombine_all(0, GMSH_SET, recombine); - for(unsigned int i = 0; i < newFace->triangles.size(); ++i){ - loopfillTris.push_back(newFace->triangles[i]); - fillNodes.insert(newFace->triangles[i]->getVertex(0)); - fillNodes.insert(newFace->triangles[i]->getVertex(1)); - fillNodes.insert(newFace->triangles[i]->getVertex(2)); - } - orientFillTris(loopfillTris); - } - } - - printFillTris(); -#endif -} - -void GFaceCompound::fillNeumannBCS() const -{ - fillTris.clear(); - fillNodes.clear(); - - // closed interior loops - for(std::list<std::list<GEdge*> >::const_iterator iloop = _interior_loops.begin(); - iloop != _interior_loops.end(); iloop++){ - std::list<MTriangle*> loopfillTris; - std::list<GEdge*> loop = *iloop; - if (loop != _U0 ){ - std::vector<MVertex*> orderedLoop; - std::vector<double> coordsLoop; - orderVertices(*iloop, orderedLoop, coordsLoop); - int nbLoop = orderedLoop.size(); - - //--- center of Neumann interior loop - int nb = 0; - double x=0.; - double y=0.; - double z=0.; - // EMI- TODO FIND KERNEL OF POLYGON AND PLACE AT CG KERNEL ! - // IF NO KERNEL -> DO NOT FILL TRIS - for(int i = 0; i < nbLoop; ++i){ - MVertex *v0 = orderedLoop[i]; - MVertex *v1 = (i==nbLoop-1) ? orderedLoop[0]: orderedLoop[i+1]; - x += .5*(v0->x() + v1->x()); - y += .5*(v0->y() + v1->y()); - z += .5*(v0->z() + v1->z()); - nb++; - } - x/=nb; y/=nb; z/=nb; - MVertex *c = new MVertex(x, y, z); - - //--- create new triangles - for(int i = 0; i < nbLoop; ++i){ - MVertex *v0 = orderedLoop[i]; - MVertex *v1 = (i==nbLoop-1) ? orderedLoop[0]: orderedLoop[i+1]; - - double k = 1. / 3.; double kk = 2. / 3.; - MVertex *v2 = new MVertex(kk * v0->x() + k * c->x(), - kk * v0->y() + k * c->y(), - kk * v0->z() + k * c->z()); - MVertex *v3 = new MVertex(kk * v1->x() + k * c->x(), - kk * v1->y() + k * c->y(), - kk * v1->z() + k * c->z()); - MVertex *v4 = new MVertex(k * v0->x() + kk * c->x(), - k * v0->y() + kk * c->y(), - k * v0->z() + kk * c->z()); - MVertex *v5 = new MVertex(k * v1->x() + kk * c->x(), - k * v1->y() + kk * c->y(), - k * v1->z() + kk * c->z()); - fillNodes.insert(c); fillNodes.insert(v2); fillNodes.insert(v3); - fillNodes.insert(v4); fillNodes.insert(v5); - loopfillTris.push_back(new MTriangle(v0, v2, v3)); - loopfillTris.push_back(new MTriangle(v2, v5, v3)); - loopfillTris.push_back(new MTriangle(v2, v4, v5)); - loopfillTris.push_back(new MTriangle(v4, c, v5)); - loopfillTris.push_back(new MTriangle(v0, v3, v1)); - } - } - orientFillTris(loopfillTris); - } - - printFillTris(); -} - -bool GFaceCompound::trivial() const -{ - return false; - if(_compound.size() == 1 && - (*(_compound.begin()))->getNativeType() == GEntity::OpenCascadeModel && - (*(_compound.begin()))->geomType() != GEntity::DiscreteSurface && - _mapping != CONFORMAL){ - if ((*(_compound.begin()))->periodic(0) || - (*(_compound.begin()))->periodic(1) ) return false; - return true; - } - return false; -} - -// For the conformal map the linear system cannot guarantee there is -// no overlapping of triangles -bool GFaceCompound::checkOverlap(std::vector<MVertex *> &vert) const -{ - - vert.clear(); - bool has_overlap = false; - double EPS = 1.e-2; - for(std::list<std::list<GEdge*> >::const_iterator iloop = _interior_loops.begin(); - iloop != _interior_loops.end(); iloop++){ - std::list<GEdge*> loop = *iloop; - std::vector<MVertex*> orderedLoop; - if (loop != _U0 ){ - std::vector<double> coordsLoop; - orderVertices(*iloop, orderedLoop, coordsLoop); - } - else orderedLoop = _ordered; - int nbLoop = orderedLoop.size(); - - for(int i = 0; i < nbLoop-1; ++i){ - SPoint3 p1 = coordinates[orderedLoop[i]]; - SPoint3 p2 = coordinates[orderedLoop[i+1]]; - int maxSize = (i==0) ? nbLoop-2: nbLoop-1; - for(int k = i+2; k < maxSize; ++k){ - SPoint3 q1 = coordinates[orderedLoop[k]]; - SPoint3 q2 = coordinates[orderedLoop[k+1]]; - double x[2]; - int inters = intersection_segments (p1,p2,q1,q2,x); - if (inters && x[1] > EPS && x[1] < 1.-EPS){ - has_overlap = true; - MVertex *v1 = orderedLoop[i]; - MVertex *v2 = orderedLoop[k]; - //std::set<MVertex *>::iterator it1 = ov.find(v1); - //std::set<MVertex *>::iterator it2 = ov.find(v2); - vert.push_back(v1); - vert.push_back(v2); - Msg::Info("=== Overlap"); - return has_overlap; - } - } - } - - } - - return has_overlap; -} - -// check if the discrete harmonic map is correct by checking that all -// the mapped triangles have the same normal orientation -bool GFaceCompound::checkOrientation(int iter, bool moveBoundaries) const -{ - std::list<GFace*>::const_iterator it = _compound.begin(); - double a_old = 0.0, a_new=0.0; - bool oriented = true; - int count = 0; - double nTot = 0.0; - for( ; it != _compound.end(); ++it){ - for(unsigned int i = 0; i < (*it)->triangles.size(); ++i){ - a_new = normalUV((*it)->triangles[i], coordinates); - if(count == 0) a_old=a_new; - nTot += a_new; - if(a_new*a_old < 0.0){ - oriented = false; - break; - } - count++; - } - } - - int iterMax = 15; - if(!oriented && iter < iterMax){ - if (moveBoundaries){ - if (iter ==0) Msg::Info("--- Flipping : moving boundaries."); - Msg::Debug("--- Moving Boundary - iter %d -",iter); - convexBoundary(nTot/fabs(nTot)); - printStuff(iter); - return checkOrientation(iter+1, moveBoundaries); - } - else if (!moveBoundaries){ - if (iter ==0) Msg::Info("--- Flipping : applying cavity checks."); - Msg::Debug("--- Cavity Check - iter %d -",iter); - oriented = one2OneMap(); - printStuff(iter); - iter++; - if (!oriented) return checkOrientation(iter); - } - } - - if (iter > 0 && iter < iterMax){ - Msg::Info("--- Flipping : no more flips (%d iter)", iter); - } - - return oriented; -} - -void GFaceCompound::convexBoundary(double nTot) const -{ -#if defined(HAVE_MESH) - if(adjv.size() == 0){ - std::vector<MTriangle*> allTri; - std::list<GFace*>::const_iterator it = _compound.begin(); - for( ; it != _compound.end(); ++it){ - allTri.insert(allTri.end(), (*it)->triangles.begin(), (*it)->triangles.end() ); - } - buildVertexToTriangle(allTri, adjv); - } - - for(std::list<std::list<GEdge*> >::const_iterator it = _interior_loops.begin(); - it != _interior_loops.end(); it++){ - - double s = 1.0; - std::vector<MVertex*> oVert; - std::vector<double> coords; - if (*it == _U0){ - oVert = _ordered; - } - else { - s = -1.0; - orderVertices(*it, oVert,coords); - } - - // find normal of ordered loop - MVertex *v0 = oVert[0]; - MVertex *v1 = oVert[1]; - bool inverted; - MVertex *v2 = findVertexInTri(adjv, v0,v1,coordinates, nTot, inverted); - if (inverted) s *= -1.0 ; - SPoint3 uv0 = coordinates[v0]; - SPoint3 uv1 = coordinates[v1]; - SPoint3 uv2 = coordinates[v2]; - SVector3 P0 (uv0.x(),uv0.y(), 0.0); - SVector3 P1 (uv1.x(),uv1.y(), 0.0); - SVector3 P2 (uv2.x(),uv2.y(), 0.0); - double myN = s*crossprod(P1-P0,P2-P1).z(); - SVector3 N (0,0,myN/fabs(myN)); - - // start the loop - int nbInv = 0; - int nbInvTri = 0; - for(unsigned int i = 0; i < oVert.size(); i++){ - - MVertex *v0 = oVert[i]; - MVertex *v1, *v2; - if (i == oVert.size()-2){ - v1 = oVert[i+1]; - v2 = oVert[0]; - } - else if (i == oVert.size()-1){ - v1= oVert[0]; - v2= oVert[1]; - } - else{ - v1 = oVert[i+1]; - v2 = oVert[i+2]; - } - - SPoint3 uv0 = coordinates[v0]; - SPoint3 uv1 = coordinates[v1]; - SPoint3 uv2 = coordinates[v2]; - SVector3 P0 (uv0.x(),uv0.y(), uv0.z()); - SVector3 P1 (uv1.x(),uv1.y(), uv1.z()); - SVector3 P2 (uv2.x(),uv2.y(), uv2.z()); - - SVector3 dir1 = P1-P0; - SVector3 dir2 = P2-P1; - SVector3 dir3 = crossprod(dir1,dir2); - double rot = dot(N, (1./norm(dir3))*dir3); - - bool inverted; - MVertex *v2t = findVertexInTri(adjv, v0,v1, coordinates, nTot, inverted); - - if (rot < 0.0 && inverted){ - SVector3 a = P1-P0; - SVector3 b = P2-P0; - double a_para = dot(a,b)/norm(b); - SVector3 P3,P1b; - P3= P0 + (a_para/norm(b))*b; - P1b = P1 + 1.2*(P3-P1); - SPoint3 uv1_new(P1b.x(),P1b.y(),P1b.z()); - coordinates[v1] = uv1_new; - } - else if (rot > 0.0 && inverted){ - nbInv++; - SPoint3 uv2t = coordinates[v2t]; - SVector3 P2t (uv2t.x(),uv2t.y(), uv2t.z()); - SVector3 a = P1-P0; - SVector3 b = P2t-P0; - double b_para = dot(a,b)/norm(a); - SVector3 P3,P2b; - P3= P0 + (b_para/norm(a))*a; - P2b = P2t + 1.3*(P3-P2t); - SPoint3 uv2_new(P2b.x(),P2b.y(),P2b.z()); - coordinates[v2t] = uv2_new; - } - - MTriangle *tinv = findInvertedTri(adjv, v0,v1,v2, coordinates, nTot); - if (tinv){ - nbInvTri++; - MVertex *i0 = NULL; - MVertex *i1 = NULL; - for (unsigned int j = 0; j < 3; j++){ - MVertex *vj = tinv->getVertex(j); - if (vj!=v1 && i0 == NULL) i0 = vj; - else if (vj!=v1 && i1 ==NULL ) i1 = vj; - } - MVertex *i2 = v1; - SPoint3 uv0 = coordinates[i0]; - SPoint3 uv1 = coordinates[i1]; - SPoint3 uv2 = coordinates[i2]; - SVector3 P0 (uv0.x(),uv0.y(), uv0.z()); - SVector3 P1 (uv1.x(),uv1.y(), uv1.z()); - SVector3 P2 (uv2.x(),uv2.y(), uv2.z()); - SVector3 a = P1-P0; - SVector3 b = P2-P0; - double b_para = dot(a,b)/norm(a); - SVector3 P3,P2b; - P3= P0 + (b_para/norm(a))*a; - P2b = P2 + 1.2*(P3-P2); - SPoint3 uv2_new(P2b.x(),P2b.y(),P2b.z()); - coordinates[i2] = uv2_new; - } - - } - } -#endif -} - -bool GFaceCompound::one2OneMap() const -{ -#if defined(HAVE_MESH) - if(adjv.size() == 0){ - std::vector<MTriangle*> allTri; - std::list<GFace*>::const_iterator it = _compound.begin(); - for( ; it != _compound.end(); ++it){ - allTri.insert(allTri.end(), (*it)->triangles.begin(), (*it)->triangles.end() ); - } - buildVertexToTriangle(allTri, adjv); - } - - int nbRepair = 0; - int nbCav = 0; - for(v2t_cont::iterator it = adjv.begin(); it!= adjv.end(); ++it){ - MVertex *v = it->first; - SPoint2 p = getCoordinates(v); - std::vector<MElement*> vTri = it->second; - std::map<MVertex*,SPoint3> vCoord; - for (unsigned int j = 0; j < vTri.size(); j++){ - for (int k = 0; k < vTri[j]->getNumVertices(); k++){ - MVertex *vk = vTri[j]->getVertex(k); - SPoint2 pt2 = getCoordinates(vk); - vCoord[vk] = SPoint3(pt2[0], pt2[1], 0.0); - } - } - bool badCavity = checkCavity(vTri, vCoord); - bool innerCavity = closedCavity(v,vTri); - - if( badCavity && innerCavity ){ - nbCav++; - double u_cg, v_cg; - std::vector<MVertex*> cavV; - myPolygon(vTri, cavV); - //bool success = - computeCGKernelPolygon(coordinates, cavV, u_cg, v_cg); - //if (success){ //if not succes compute with CG polygon - nbRepair++; - SPoint3 p_cg(u_cg,v_cg,0.0); - coordinates[v] = p_cg; - //} - } - } - if (nbRepair == 0) return false; - else return true; -#endif -} - -bool GFaceCompound::parametrize() const -{ - if (_compound.size() > 1) coherencePatches(); - - bool paramOK = true; - if(oct) return paramOK; - if(trivial()) return paramOK; - - if (_mapping != RBF) - coordinates.clear(); - - computeNormals(); - - if(allNodes.empty()) buildAllNodes(); - - if (_type != SQUARE){ - bool success = orderVertices(_U0, _ordered, _coords); - if(!success) { - Msg::Error("Could not order vertices on boundary"); - return false; - } - } - - //fillNeumannBCS_Plane(); - fillNeumannBCS(); - - // Convex parametrization - if (_mapping == CONVEX){ - Msg::Info("Parametrizing surface %d with 'convex map'", tag()); - parametrize(ITERU,CONVEX); - parametrize(ITERV,CONVEX); - if (_type==MEANPLANE){ - checkOrientation(0, true); - } - } - // Laplace parametrization - else if (_mapping == HARMONIC){ - Msg::Info("Parametrizing surface %d with 'harmonic map'", tag()); - parametrize(ITERU,HARMONIC); - parametrize(ITERV,HARMONIC); - if (_type == MEANPLANE) checkOrientation(0, true); - } - // Conformal map parametrization - else if (_mapping == CONFORMAL){ - std::vector<MVertex *> vert; - bool oriented, overlap; - if (_type == SPECTRAL){ - Msg::Info("Parametrizing surface %d with 'spectral conformal map'", tag()); - overlap = parametrize_conformal_spectral(); - } - else { - Msg::Info("Parametrizing surface %d with 'FE conformal map'", tag()); - overlap = parametrize_conformal(0, NULL, NULL); - } - //printStuff(55); - oriented = checkOrientation(0); - //printStuff(77); - if (_type==SPECTRAL && (!oriented || overlap) ){ - Msg::Warning("Parametrization switched to 'FE conformal' map"); - overlap = parametrize_conformal(0, NULL, NULL); - oriented = checkOrientation(0); - } - if (!oriented || overlap){ - Msg::Warning("Parametrization switched to 'convex' map"); - _type = UNITCIRCLE; - parametrize(ITERU,CONVEX); - parametrize(ITERV,CONVEX); - } - } - // Radial-Basis Function parametrization - else if (_mapping == RBF){ - Msg::Debug("Parametrizing surface %d with 'RBF' ", tag()); - int variableEps = 0; - int radFunInd = 1; // 1 MQ RBF , 0 GA - double sizeBox = getSizeH(); - /* - fullMatrix<double> Oper(3*allNodes.size(),3*allNodes.size()); - _rbf = new GRbf(sizeBox, variableEps, radFunInd, _normals, allNodes, _ordered); - _rbf->RbfLapSurface_local_CPM(false,_rbf->getXYZ(), _rbf->getN(), Oper); - _rbf->solveHarmonicMap(Oper, _ordered, _coords, coordinates); - */ - fullMatrix<double> Oper(3*allNodes.size(),3*allNodes.size()); - - _rbf = new GRbf(sizeBox, variableEps, radFunInd, _normals, allNodes, _ordered); - - linearSystemPETSc<double> sys; - - #if 1 - _rbf->RbfLapSurface_local_CPM_sparse(_ordered, false, _rbf->getXYZ(), _rbf->getN(), sys); - _rbf->solveHarmonicMap_sparse(sys, _rbf->getXYZ().size1()* 3,_ordered, _coords, coordinates); - #else - _rbf->RbfLapSurface_local_CPM(false, _rbf->getXYZ(), _rbf->getN(), Oper); - _rbf->solveHarmonicMap(Oper,_ordered, _coords, coordinates); - #endif - } - - buildOct(); - - if (_mapping != RBF){ - if (!checkOrientation(0)){ - printStuff(22); - Msg::Info("### parametrization switched to 'convex map' onto circle"); - printStuff(33); - _type = UNITCIRCLE; - coordinates.clear(); - Octree_Delete(oct); - parametrize(ITERU, CONVEX); - parametrize(ITERV, CONVEX); - checkOrientation(0); - buildOct(); - } - } - - for (unsigned int i= 0; i< fillFaces.size(); i++){ - GModel::current()->remove(fillFaces[i]); - } - - return paramOK; -} - -void GFaceCompound::getBoundingEdges() -{ - for(std::list<GFace*>::iterator it = _compound.begin(); it != _compound.end(); ++it){ - (*it)->setCompound(this); - } - - std::set<GEdge*> _unique; - getUniqueEdges(_unique); - - l_edges.clear(); - l_dirs.clear(); // added by Trevor Strickler - - - if(_U0.size()){ - // in case the bounding edges are explicitely given - std::list<GEdge*>::const_iterator it = _U0.begin(); - for( ; it != _U0.end() ; ++it){ - l_edges.push_back(*it); - (*it)->addFace(this); - } - if (_V0.size() && _U1.size() && _V1.size()){ - it = _V0.begin(); - for( ; it != _V0.end() ; ++it){ - l_edges.push_back(*it); - (*it)->addFace(this); - } - it = _U1.begin(); - for( ; it != _U1.end() ; ++it){ - l_edges.push_back(*it); - (*it)->addFace(this); - } - it = _V1.begin(); - for( ; it != _V1.end() ; ++it){ - l_edges.push_back(*it); - (*it)->addFace(this); - } - } - std::list<GEdge*> loop; - computeALoop(_unique, loop); - while(!_unique.empty()) computeALoop(_unique,loop); - } - else{ - // in case the bounding edges are NOT explicitely given - std::set<GEdge*>::iterator itf = _unique.begin(); - for( ; itf != _unique.end(); ++itf){ - l_edges.push_back(*itf); - (*itf)->addFace(this); - } - - std::list<GEdge*> loop; - computeALoop(_unique,loop); - while(!_unique.empty()) computeALoop(_unique, loop); - - // assign Derichlet BC (_U0) to boundary with largest size - double maxSize = 0.0; - for(std::list<std::list<GEdge*> >::iterator it = _interior_loops.begin(); - it != _interior_loops.end(); it++){ - double size = getSizeBB(*it); - if (size > maxSize) { - _U0 = *it; - maxSize = size; - } - } - } - - // Added by Trevor Strickler (fill in the l_dirs) - std::list<GEdge*>::iterator it_loop; - std::list<std::list<GEdge*> >::iterator it_interior; - l_edges.clear(); - - for( it_interior = _interior_loops.begin(); it_interior != _interior_loops.end(); it_interior++ ){ - for( it_loop = it_interior->begin(); it_loop != it_interior->end(); it_loop++ ){ - l_edges.push_back( (*it_loop) ); - std::list<GEdge*>::iterator it_loop_next = it_loop; - it_loop_next++; - if( it_loop_next == it_interior->end() ) - it_loop_next = it_interior->begin(); - GVertex *vB = (*it_loop)->getBeginVertex(); - GVertex *vE = (*it_loop)->getEndVertex(); - GVertex *vB_next = (*it_loop_next)->getBeginVertex(); - GVertex *vE_next = (*it_loop_next)->getEndVertex(); - if( vB == vB_next || vB == vE_next ) - l_dirs.push_back(-1); - else if( vE == vB_next || vE == vE_next ) - l_dirs.push_back(1); - else{ - l_dirs.push_back(0); - } - } - } - -} - - -double GFaceCompound::getSizeH() const -{ - SBoundingBox3d bb; - for(std::set<MVertex *>::iterator itv = allNodes.begin(); - itv != allNodes.end() ; ++itv){ - SPoint3 pt((*itv)->x(),(*itv)->y(), (*itv)->z()); - bb +=pt; - } - - double H = norm(SVector3(bb.max(), bb.min())); - - return H; -} - -double GFaceCompound::getSizeBB(const std::list<GEdge* > &elist) const -{ - SBoundingBox3d bboxD; - std::list<GEdge*>::const_iterator it = elist.begin(); - for(; it != elist.end(); it++){ - bboxD += (*it)->bounds(); - } - double D = norm(SVector3(bboxD.max(), bboxD.min())); - - return D; -} - -void GFaceCompound::getUniqueEdges(std::set<GEdge*> &_unique) -{ - _unique.clear(); - - // in case the bounding edges are not given Boundary { {} }; - std::multiset<GEdge*> _touched; - std::list<GFace*>::iterator it = _compound.begin(); - for( ; it != _compound.end(); ++it){ - std::list<GEdge*> ed = (*it)->edges(); - std::list<GEdge*>::iterator ite = ed.begin(); - for( ; ite != ed.end(); ++ite){ - _touched.insert(*ite); - } - } - it = _compound.begin(); - for( ; it != _compound.end(); ++it){ - std::list<GEdge*> ed = (*it)->edges(); - std::list<GEdge*>::iterator ite = ed.begin(); - for( ; ite != ed.end() ; ++ite){ - if(!(*ite)->degenerate(0) && _touched.count(*ite) == 1){ - _unique.insert(*ite); - } - } - } -} - -void GFaceCompound::computeALoop(std::set<GEdge*> &_unique, std::list<GEdge*> &loop) -{ - std::list<GEdge*> _loop; - - if (_unique.empty()) return; - - while(!_unique.empty()) { - std::set<GEdge*>::iterator it = _unique.begin(); - GVertex *vB = (*it)->getBeginVertex(); - GVertex *vE = (*it)->getEndVertex(); - _loop.push_back(*it); - _unique.erase(it); - - bool found = false; -/* Mod by Trevor Strickler: In the old implementation, the iterator - itx was incremented twice per loop and _loops was not set up correctly. - The While Loop below replaces the old for loop. -*/ - for(int i = 0; i < 2; i++) { - std::set<GEdge*>::iterator itx = _unique.begin(); - while (itx != _unique.end() ){ - GVertex *v1 = (*itx)->getBeginVertex(); - GVertex *v2 = (*itx)->getEndVertex(); - - std::set<GEdge*>::iterator itp = itx; - itx++; - - if(v1 == vE ){ - _loop.push_back(*itp); - vE = v2; - i = -1; - _unique.erase(itp); - } - else if(v2 == vE){ - _loop.push_back(*itp); - vE = v1; - i=-1; - _unique.erase(itp); - } - } - - if(vB == vE) { - found = true; - break; - } - - if(_unique.empty()) break; - - // Mod by Trevor Strickler: had to wrap this in an if - // or else it was executed when i == -1, which is not good. - if( i != -1 ){ - GVertex *temp = vB; - vB = vE; - vE = temp; - } - } - /* This is the old version of above nested loops before modified by Trevor Strickler - for(int i = 0; i < 2; i++) { - for(std::set<GEdge*>::iterator itx = _unique.begin(); - itx != _unique.end(); ++itx){ - GVertex *v1 = (*itx)->getBeginVertex(); - GVertex *v2 = (*itx)->getEndVertex(); - - std::set<GEdge*>::iterator itp; - if(v1 == vE){ - _loop.push_back(*itx); - itp = itx; - itx++; - _unique.erase(itp); - vE = v2; - i = -1; - } - else if(v2 == vE){ - _loop.push_back(*itx); - itp = itx; - itx++; - _unique.erase(itp); - vE = v1; - i=-1; - } - if(itx == _unique.end()) break; - } - - if(vB == vE) { - found = true; - break; - } - - if(_unique.empty()) break; - - GVertex *temp = vB; - vB = vE; - vE = temp; - }*/ - - if(found == true) break; - - it++; - } - - loop = _loop; - _interior_loops.push_back(loop); -} - -GFaceCompound::GFaceCompound(GModel *m, int tag, std::list<GFace*> &compound, - std::list<GEdge*> &U0, typeOfCompound toc, - int allowPartition) - : GFace(m, tag), _compound(compound), _U0(U0), oct(0), octNew(0), - _toc(toc), _allowPartition(allowPartition) -{ - ONE = new simpleFunction<double>(1.0); - MONE = new simpleFunction<double>(-1.0); - - for(std::list<GFace*>::iterator it = _compound.begin(); it != _compound.end(); ++it){ - if(!(*it)){ - Msg::Error("Incorrect face in compound surface %d\n", tag); - return; - } - } - - getBoundingEdges(); - - _mapping = HARMONIC; - _type = UNITCIRCLE; - if(toc == RADIAL_BASIS) _mapping = RBF; - else if (toc == HARMONIC_PLANE) _type = MEANPLANE; - else if (toc == CONVEX_CIRCLE) _mapping = CONVEX; - else if (toc == CONVEX_PLANE){ - _mapping = CONVEX; - _type = MEANPLANE; - } - else if(toc == CONFORMAL_SPECTRAL) { - _mapping = CONFORMAL; - _type = SPECTRAL; - } - else if(toc == CONFORMAL_FE) { - _mapping = CONFORMAL; - _type = FE; - } - - nbSplit = 0; - fillTris.clear(); - - kdtree = NULL; - uv_kdtree = NULL; -} - -GFaceCompound::GFaceCompound(GModel *m, int tag, std::list<GFace*> &compound, - std::list<GEdge*> &U0, std::list<GEdge*> &V0, - std::list<GEdge*> &U1, std::list<GEdge*> &V1, - typeOfCompound toc, - int allowPartition) - : GFace(m, tag), _compound(compound), _U0(U0), _V0(V0), _U1(U1), _V1(V1), - oct(0), octNew(0), _toc(toc), _allowPartition(allowPartition) -{ - ONE = new simpleFunction<double>(1.0); - MONE = new simpleFunction<double>(-1.0); - - for(std::list<GFace*>::iterator it = _compound.begin(); it != _compound.end(); ++it){ - if(!(*it)){ - Msg::Error("Incorrect face in compound surface %d\n", tag); - return; - } - } - - getBoundingEdges(); - - _mapping = HARMONIC; - _type = UNITCIRCLE; - if(toc == RADIAL_BASIS) _mapping = RBF; - else if (toc == HARMONIC_PLANE) _type = MEANPLANE; - else if (toc == CONVEX_CIRCLE) _mapping = CONVEX; - else if (toc == CONVEX_PLANE){ - _mapping = CONVEX; - _type = MEANPLANE; - } - if(toc == CONFORMAL_SPECTRAL) { - _mapping = CONFORMAL; - _type = SPECTRAL; - } - else if(toc == CONFORMAL_FE) { - _mapping = CONFORMAL; - _type = FE; - } - else if(toc == HARMONIC_SQUARE && _U0.size() && _V0.size() && _U1.size() && _V1.size()) { - _type = SQUARE; - } - - nbSplit = 0; - fillTris.clear(); - - uv_kdtree = NULL; - kdtree = NULL; -} - -GFaceCompound::~GFaceCompound() -{ - delete ONE; - delete MONE; - _deleteInternals(); -} - -void GFaceCompound::deleteInternals(){ - _deleteInternals(); -} - -void GFaceCompound::_deleteInternals() -{ - for (unsigned int i = 0; i < myParamVert.size(); i++) - delete myParamVert[i]; - myParamVert.clear(); - for (unsigned int i = 0; i < myParamElems.size(); i++) - delete myParamElems[i]; - myParamElems.clear(); - _3Dto2D.clear(); - _2Dto3D.clear(); - XYZoct.clear(); - allNodes.clear(); - adjv.clear(); - coordinates.clear(); - firstDerivatives.clear(); - xuu.clear(); - xvv.clear(); - xuv.clear(); - xu.clear(); - xv.clear(); - _coordPoints.clear(); - _normals.clear(); - fillTris.clear(); - fillNodes.clear(); - fillFaces.clear(); - _ordered.clear(); - _coords.clear(); - _mapV.clear(); - - if(oct){ - Octree_Delete(oct); - delete [] _gfct; - oct = 0; - } - if(octNew){ - delete octNew; - octNew = 0; - } - if(uv_kdtree) { - ANNpointArray uv_nodes = uv_kdtree->thePoints(); - if(uv_nodes) annDeallocPts(uv_nodes); - delete uv_kdtree; - uv_kdtree = 0; - } - if(kdtree){ - ANNpointArray nodes = kdtree->thePoints(); - if(nodes) annDeallocPts(nodes); - delete kdtree; - kdtree = 0; - } -} - - -void GFaceCompound::deleteMesh() -{ - _deleteInternals(); - GFace::deleteMesh(); -} - -SPoint2 GFaceCompound::getCoordinates(MVertex *v) const -{ - if(trivial()){ - SPoint2 param; - reparamMeshVertexOnFace(v, (*(_compound.begin())),param); - return param; - } - - std::map<MVertex*,SPoint3>::iterator it = coordinates.find(v); - - if(it != coordinates.end()){ - return SPoint2(it->second.x(),it->second.y()); - } - else{ - - //if(v->onWhat()->dim() == 1){ - double tGlob, tLoc; - double tL, tR; - int iEdge; - - // getParameter Point - v->getParameter(0, tGlob); - - //find compound Edge - GEdgeCompound *gec = dynamic_cast<GEdgeCompound*>(v->onWhat()); - - if(gec){ - // compute local parameter on Edge - gec->getLocalParameter(tGlob,iEdge,tLoc); - std::vector<GEdge*> gev = gec->getCompounds(); - GEdge *ge = gev[iEdge]; - std::map<MVertex*,SPoint3>::iterator itL; - std::map<MVertex*,SPoint3>::iterator itR; - - if(ge->geomType() == GEntity::DiscreteCurve){ - discreteEdge *de = dynamic_cast<discreteEdge*>(ge); - int i = (int)tLoc; - MLine *l = de->lines[i]; - MVertex *vL = l->getVertex(0); - MVertex *vR = l->getVertex(1); - itL = coordinates.find(vL); - if(itL == coordinates.end()){ - Msg::Error("Vertex %p (%g %g %g) not found", vL, vL->x(), vL->y(), vL->z()); - return SPoint2(0, 0); - } - itR = coordinates.find(vR); - if(itR == coordinates.end()){ - Msg::Error("Vertex %p (%g %g %g) not found", vR, vR->x(), vR->y(), vR->z()); - return SPoint2(0, 0); - } - double xi, uloc, vloc; - xi = tLoc - i; - uloc = (1 - xi) * itL->second.x() + xi * itR->second.x(); - vloc = (1 - xi) * itL->second.y() + xi * itR->second.y(); - return SPoint2(uloc,vloc); - } - else{ - // left and right vertex of the Edge - MVertex *v0 = ge->getBeginVertex()->mesh_vertices[0]; - MVertex *v1 = ge->getEndVertex()->mesh_vertices[0]; - itL = coordinates.find(v0); - itR = coordinates.find(v1); - // for the Edge, find the left and right vertices of the initial - // 1D mesh and interpolate to find (u,v) - //MVertex *vL = v0; - MVertex *vR = v1; - double tB = ge->parBounds(0).low(); - double tE = ge->parBounds(0).high(); - int j = 0; - tL=tB; - bool found = false; - while(j < (int)ge->mesh_vertices.size()){ - vR = ge->mesh_vertices[j]; - if(vR->getPolynomialOrder() > 1){ j++; continue; } - vR->getParameter(0, tR); - if(!vR->getParameter(0, tR)) { - Msg::Error("Vertex vr %p not an MEdgeVertex", vR); - return SPoint2(); - } - if(tLoc > tL && tLoc < tR){ - found = true; - itR = coordinates.find(vR); - if(itR == coordinates.end()){ - Msg::Error("Vertex %p (%g %g %g) not found", vR, vR->x(), vR->y(), vR->z()); - return SPoint2(0, 0); - } - break; - } - else{ - itL = coordinates.find(vR); - //vL = vR; - tL = tR; - } - j++; - } - if(!found) { - vR = v1; - tR = tE; - } - // linear interpolation between tL and tR - double uloc, vloc; - uloc = itL->second.x() + (tLoc-tL)/(tR-tL) * (itR->second.x()-itL->second.x()); - vloc = itL->second.y() + (tLoc-tL)/(tR-tL) * (itR->second.y()-itL->second.y()); - return SPoint2(uloc,vloc); - } - } - - } - - // never here - return SPoint2(0, 0); -} - -void GFaceCompound::parametrize(iterationStep step, typeOfMapping tom) const -{ - linearSystem<double> *lsys; - - if (tom==HARMONIC){ -#if defined(HAVE_TAUCS) - lsys = new linearSystemCSRTaucs<double>; -#elif defined(HAVE_PETSC) - lsys = new linearSystemPETSc<double>; -#elif defined(HAVE_GMM) - linearSystemGmm<double> *lsysb = new linearSystemGmm<double>; - lsysb->setGmres(1); - lsys = lsysb; -#else - lsys = new linearSystemFull<double>; -#endif - } - else{ -#if defined(HAVE_PETSC) - lsys = new linearSystemPETSc<double>; - lsys->setParameter("petscOptions", - "-pc_type ilu -ksp_rtol 1.e-12 -pc_factor_levels 10"); - - // lsys->setParameter("petscOptions", - // "-ksp_type preonly -pc_type lu -pc_factor_mat_solver_package umfpack"); -#elif defined(HAVE_GMM) - linearSystemGmm<double> *lsysb = new linearSystemGmm<double>; - lsysb->setGmres(1); - lsys = lsysb; -#else - lsys = new linearSystemFull<double>; -#endif - } - - dofManager<double> myAssembler(lsys); - - if(_type == UNITCIRCLE){ - for(unsigned int i = 0; i < _ordered.size(); i++){ - MVertex *v = _ordered[i]; - const double theta = 2 * M_PI * _coords[i]; - if(step == ITERU) myAssembler.fixVertex(v, 0, 1, cos(theta)); - else if(step == ITERV) myAssembler.fixVertex(v, 0, 1, sin(theta)); - } - } - else if(_type == SQUARE){ - if(step == ITERU){ - std::list<GEdge*>::const_iterator it = _U0.begin(); - for( ; it != _U0.end(); ++it){ - fixEdgeToValue(*it, 0.0, myAssembler); - } - it = _U1.begin(); - for( ; it != _U1.end(); ++it){ - fixEdgeToValue(*it, 1.0, myAssembler); - } - } - else if(step == ITERV){ - std::list<GEdge*>::const_iterator it = _V0.begin(); - for( ; it != _V0.end(); ++it){ - fixEdgeToValue(*it, 0.0, myAssembler); - } - it = _V1.begin(); - for( ; it != _V1.end(); ++it){ - fixEdgeToValue(*it, 1.0, myAssembler); - } - } - } - else if (_type == MEANPLANE){ - std::vector<SPoint3> points, pointsProj, pointsUV; - SPoint3 ptCG(0.0, 0.0, 0.0); - for(unsigned int i = 0; i < _ordered.size(); i++){ - MVertex *v = _ordered[i]; - points.push_back(SPoint3(v->x(), v->y(), v->z())); - ptCG[0] += v->x(); - ptCG[1] += v->y(); - ptCG[2] += v->z(); - } - - ptCG /= points.size(); - mean_plane meanPlane; - computeMeanPlaneSimple(points, meanPlane); - projectPointsToPlane(points, pointsProj, meanPlane); - transformPointsIntoOrthoBasis(pointsProj, pointsUV, ptCG, meanPlane); - - for(unsigned int i = 0; i < pointsUV.size(); i++){ - MVertex *v = _ordered[i]; - if(step == ITERU) myAssembler.fixVertex(v, 0, 1, pointsUV[i][0]); - else if(step == ITERV) myAssembler.fixVertex(v, 0, 1, pointsUV[i][1]); - } - } - else if (_type == ALREADYFIXED){ - for(unsigned int i = 0; i < _ordered.size(); i++){ - MVertex *v = _ordered[i]; - SPoint3 uv = coordinates[v]; - if(step == ITERU) myAssembler.fixVertex(v, 0, 1, uv[0]); - else if(step == ITERV) myAssembler.fixVertex(v, 0, 1, uv[1]); - } - } - else{ - Msg::Error("Unknown type of parametrization"); - return; - } - - std::list<GFace*>::const_iterator it = _compound.begin(); - for( ; it != _compound.end(); ++it){ - for(unsigned int i = 0; i < (*it)->triangles.size(); ++i){ - MTriangle *t = (*it)->triangles[i]; - myAssembler.numberVertex(t->getVertex(0), 0, 1); - myAssembler.numberVertex(t->getVertex(1), 0, 1); - myAssembler.numberVertex(t->getVertex(2), 0, 1); - } - } - - for (std::list<MTriangle*>::iterator it2 = fillTris.begin(); it2 !=fillTris.end(); it2++ ){ - MTriangle *t = (*it2); - myAssembler.numberVertex(t->getVertex(0), 0, 1); - myAssembler.numberVertex(t->getVertex(1), 0, 1); - myAssembler.numberVertex(t->getVertex(2), 0, 1); - } - - Msg::Debug("Creating term %d dofs numbered %d fixed", - myAssembler.sizeOfR(), myAssembler.sizeOfF()); - - double t1 = Cpu(); - - femTerm<double> *mapping; - if (tom == HARMONIC) - mapping = new laplaceTerm(0, 1, ONE); - else - mapping = new convexCombinationTerm(0, 1, ONE); - - it = _compound.begin(); - for( ; it != _compound.end() ; ++it){ - for(unsigned int i = 0; i < (*it)->triangles.size(); ++i){ - SElement se((*it)->triangles[i]); - mapping->addToMatrix(myAssembler, &se); - } - } - - for (std::list<MTriangle*>::iterator it2 = fillTris.begin(); it2 !=fillTris.end(); it2++ ){ - SElement se((*it2)); - mapping->addToMatrix(myAssembler, &se); - } - - double t2 = Cpu(); - Msg::Debug("Assembly done in %8.3f seconds", t2 - t1); - lsys->systemSolve(); - Msg::Debug("System solved"); - - for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ - MVertex *v = *itv; - double value; - myAssembler.getDofValue(v, 0, 1, value); - std::map<MVertex*,SPoint3>::iterator itf = coordinates.find(v); - if(itf == coordinates.end()){ - SPoint3 p(0, 0, 0); - p[step] = value; - coordinates[v] = p; - } - else{ - itf->second[step]= value; - } - } - - delete mapping; - delete lsys; -} - -bool GFaceCompound::parametrize_conformal_spectral() const -{ -#if !defined(HAVE_PETSC) && !defined(HAVE_SLEPC) - Msg::Warning("Slepc not installed: parametrization switched to 'FE conformal' map"); - return parametrize_conformal(0, NULL, NULL); -#else - - linearSystem <double> *lsysA = new linearSystemPETSc<double>; - linearSystem <double> *lsysB = new linearSystemPETSc<double>; - dofManager<double> myAssembler(lsysA, lsysB); - - myAssembler.setCurrentMatrix("A"); - for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ - MVertex *v = *itv; - myAssembler.numberVertex(v, 0, 1); - myAssembler.numberVertex(v, 0, 2); - } - - for(std::set<MVertex *>::iterator itv = fillNodes.begin(); itv !=fillNodes.end() ; ++itv){ - MVertex *v = *itv; - myAssembler.numberVertex(v, 0, 1); - myAssembler.numberVertex(v, 0, 2); - } - - laplaceTerm laplace1(model(), 1, ONE); - laplaceTerm laplace2(model(), 2, ONE); - crossConfTerm cross12(model(), 1, 2, ONE); - crossConfTerm cross21(model(), 2, 1, MONE); - std::list<GFace*>::const_iterator it = _compound.begin(); - for( ; it != _compound.end() ; ++it){ - for(unsigned int i = 0; i < (*it)->triangles.size(); ++i){ - SElement se((*it)->triangles[i]); - laplace1.addToMatrix(myAssembler, &se); - laplace2.addToMatrix(myAssembler, &se); - cross12.addToMatrix(myAssembler, &se); - cross21.addToMatrix(myAssembler, &se); - } - } - - for (std::list<MTriangle*>::iterator it2 = fillTris.begin(); it2 != fillTris.end(); it2++){ - SElement se((*it2)); - laplace1.addToMatrix(myAssembler, &se); - laplace2.addToMatrix(myAssembler, &se); - cross12.addToMatrix(myAssembler, &se); - cross21.addToMatrix(myAssembler, &se); - } - - double epsilon = 1.e-6; - for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ - MVertex *v = *itv; - if (std::find(_ordered.begin(), _ordered.end(), v) == _ordered.end() ){ - myAssembler.assemble(v, 0, 1, v, 0, 1, epsilon); - myAssembler.assemble(v, 0, 2, v, 0, 2, epsilon); - } - } - for(std::set<MVertex *>::iterator itv = fillNodes.begin(); itv !=fillNodes.end() ; ++itv){ - MVertex *v = *itv; - if (std::find(_ordered.begin(), _ordered.end(), v) == _ordered.end() ){ - myAssembler.assemble(v, 0, 1, v, 0, 1, epsilon); - myAssembler.assemble(v, 0, 2, v, 0, 2, epsilon); - } - } - - myAssembler.setCurrentMatrix("B"); - - // mettre max NC contraintes par bord - int NB = _ordered.size(); - int NC = std::min(30,NB); - int jump = (int) NB/NC; - int nbLoop = (int) NB/jump ; - for (int i = 0; i< nbLoop; i++){ - MVertex *v1 = _ordered[i*jump]; - myAssembler.assemble(v1, 0, 1, v1, 0, 1, 1.0); - myAssembler.assemble(v1, 0, 2, v1, 0, 2, 1.0); - for (int j = 0; j< nbLoop; j++){ - MVertex *v2 = _ordered[j*jump]; - myAssembler.assemble(v1, 0, 1, v2, 0, 1, -1./NC); - myAssembler.assemble(v1, 0, 2, v2, 0, 2, -1./NC); - } - } - - // FIXME: force non-hermitian. For some reason (roundoff errors?) - // on some machines and for some meshes slepc complains about bad IP - // norm otherwise - eigenSolver eig(&myAssembler, "B" , "A", false); - - bool converged = eig.solve(1, "largest"); - - if(converged) { - double Linfty = 0.0; - int k = 0; - std::vector<std::complex<double> > &ev = eig.getEigenVector(0); - for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ - double paramu = ev[k].real(); - double paramv = ev[k+1].real(); - Linfty=std::max(Linfty, sqrt(paramu*paramu+paramv*paramv)); - k = k+2; - } - k = 0; - for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ - MVertex *v = *itv; - double paramu = ev[k].real()/Linfty; - double paramv = ev[k+1].real()/Linfty; - coordinates[v] = SPoint3(paramu,paramv,0.0); - k = k+2; - } - delete lsysA; - delete lsysB; - } - else{ - Msg::Warning("Slepc not converged: parametrization switched to 'FE conformal' map"); - return parametrize_conformal(0,NULL,NULL); - } - - std::vector<MVertex *> vert; - return checkOverlap(vert); -#endif -} - -bool GFaceCompound::parametrize_conformal(int iter, MVertex *v1, MVertex *v2) const -{ - linearSystem<double> *lsys; -#if defined(HAVE_TAUCS) - lsys = new linearSystemCSRTaucs<double>; -#elif defined(HAVE_PETSC) - lsys = new linearSystemPETSc<double>; -#elif defined(HAVE_GMM) - linearSystemGmm<double> *lsysb = new linearSystemGmm<double>; - lsysb->setGmres(1); - lsys = lsysb; -#else - lsys = new linearSystemFull<double>; -#endif - - dofManager<double> myAssembler(lsys); - - if(!v1) v1 = _ordered[0]; - if(!v2) v2 = _ordered[(int)ceil((double)_ordered.size()/2.)]; - myAssembler.fixVertex(v1, 0, 1, 1.); - myAssembler.fixVertex(v1, 0, 2, 0.); - myAssembler.fixVertex(v2, 0, 1, -1.); - myAssembler.fixVertex(v2, 0, 2, 0.); - - std::list<GFace*>::const_iterator it = _compound.begin(); - for( ; it != _compound.end(); ++it){ - for(unsigned int i = 0; i < (*it)->triangles.size(); ++i){ - MTriangle *t = (*it)->triangles[i]; - myAssembler.numberVertex(t->getVertex(0), 0, 1); - myAssembler.numberVertex(t->getVertex(1), 0, 1); - myAssembler.numberVertex(t->getVertex(2), 0, 1); - myAssembler.numberVertex(t->getVertex(0), 0, 2); - myAssembler.numberVertex(t->getVertex(1), 0, 2); - myAssembler.numberVertex(t->getVertex(2), 0, 2); - } - } - for (std::list<MTriangle*>::iterator it2 = fillTris.begin(); - it2 !=fillTris.end(); it2++){ - MTriangle *t = (*it2); - myAssembler.numberVertex(t->getVertex(0), 0, 1); - myAssembler.numberVertex(t->getVertex(1), 0, 1); - myAssembler.numberVertex(t->getVertex(2), 0, 1); - myAssembler.numberVertex(t->getVertex(0), 0, 2); - myAssembler.numberVertex(t->getVertex(1), 0, 2); - myAssembler.numberVertex(t->getVertex(2), 0, 2); - } - - laplaceTerm laplace1(model(), 1, ONE); - laplaceTerm laplace2(model(), 2, ONE); - crossConfTerm cross12(model(), 1, 2, ONE); - crossConfTerm cross21(model(), 2, 1, MONE); - it = _compound.begin(); - for( ; it != _compound.end() ; ++it){ - for(unsigned int i = 0; i < (*it)->triangles.size(); ++i){ - SElement se((*it)->triangles[i]); - laplace1.addToMatrix(myAssembler, &se); - laplace2.addToMatrix(myAssembler, &se); - cross12.addToMatrix(myAssembler, &se); - cross21.addToMatrix(myAssembler, &se); - } - } - for (std::list<MTriangle*>::iterator it2 = fillTris.begin(); - it2 != fillTris.end(); it2++ ){ - SElement se((*it2)); - laplace1.addToMatrix(myAssembler, &se); - laplace2.addToMatrix(myAssembler, &se); - cross12.addToMatrix(myAssembler, &se); - cross21.addToMatrix(myAssembler, &se); - } - - Msg::Debug("Assembly done"); - lsys->systemSolve(); - Msg::Debug("System solved"); - - for(std::set<MVertex *>::iterator itv = allNodes.begin(); - itv != allNodes.end() ; ++itv){ - MVertex *v = *itv; - double value1, value2; - myAssembler.getDofValue(v, 0, 1, value1); - myAssembler.getDofValue(v, 0, 2, value2); - coordinates[v] = SPoint3(value1,value2,0.0); - } - - delete lsys; - - // check for overlap and compute new mapping with new pinned - // vertices - std::vector<MVertex *> vert; - bool hasOverlap = checkOverlap(vert); - return hasOverlap; - // if ( hasOverlap && iter < 3){ - // Msg::Info("Loop FE conformal iter (%d) v1=%d v2=%d", iter, - // vert[0]->getNum(), vert[1]->getNum()); - // printStuff(100+iter); - // return hasOverlap = parametrize_conformal(iter+1, vert[0],vert[1]); - // } - // else{ - // return hasOverlap; - // } -} - -void GFaceCompound::computeNormals(std::map<MVertex*,SVector3> &normals) const -{ - computeNormals (); - normals = _normals; -} - -void GFaceCompound::computeNormals() const -{ - _normals.clear(); - std::list<GFace*>::const_iterator it = _compound.begin(); - double J[3][3]; - for( ; it != _compound.end() ; ++it){ - for(unsigned int i = 0; i < (*it)->triangles.size(); ++i){ - MTriangle *t = (*it)->triangles[i]; - t->getJacobian(0, 0, 0, J); - SVector3 n (J[2][0], J[2][1], J[2][2]); - n.normalize(); - for(int j = 0; j < 3; j++){ - std::map<MVertex*, SVector3>::iterator itn = _normals.find(t->getVertex(j)); - if(itn == _normals.end())_normals[t->getVertex(j)] = n; - else itn->second += n; - } - } - } - std::map<MVertex*,SVector3>::iterator itn = _normals.begin(); - for( ; itn != _normals.end() ; ++itn) itn->second.normalize(); -} - -double GFaceCompound::curvatureMax(const SPoint2 ¶m) const -{ - if(!oct) parametrize(); - if(trivial()) { - return (*(_compound.begin()))->curvatureMax(param); - } - - double U, V; - GFaceCompoundTriangle *lt; - getTriangle(param.x(), param.y(), <, U,V); - - if(!lt) return 0.0; - - if(lt->gf && lt->gf->geomType() != GEntity::DiscreteSurface) { - SPoint2 pv = lt->gfp1*(1.-U-V) + lt->gfp2*U + lt->gfp3*V; - return lt->gf->curvatureMax(pv); - } - else if (lt->gf->geomType() == GEntity::DiscreteSurface) { - Curvature& curvature = Curvature::getInstance(); - if( !Curvature::valueAlreadyComputed() ) { - Msg::Info("Need to compute discrete curvature for isotropic remesh (in GFace)"); - Curvature::typeOfCurvature type = Curvature::RUSIN; - curvature.computeCurvature(model(), type); - } - double c0,c1,c2; - curvature.triangleNodalValues(lt->tri,c0, c1, c2, 1); - double cv = (1-U-V)*c0 + U*c1 + V*c2; - return cv; - } - - return 0.; -} - -double GFaceCompound::curvatures(const SPoint2 ¶m, SVector3 *dirMax, SVector3 *dirMin, - double *curvMax, double *curvMin) const -{ - if(!oct) parametrize(); - if(trivial()) { - return (*(_compound.begin()))->curvatures(param, dirMax,dirMin, curvMax, curvMin); - } - - double U, V; - GFaceCompoundTriangle *lt; - getTriangle(param.x(), param.y(), <, U,V); - - if(!lt) return 0.0; - - if(lt->gf && lt->gf->geomType() != GEntity::DiscreteSurface){ - SPoint2 pv = lt->gfp1*(1.-U-V) + lt->gfp2*U + lt->gfp3*V; - return lt->gf->curvatures(pv, dirMax,dirMin, curvMax, curvMin); - } - else if (lt->gf->geomType() == GEntity::DiscreteSurface){ - Curvature& curvature = Curvature::getInstance(); - if( !Curvature::valueAlreadyComputed() ) { - Msg::Info("Need to compute discrete curvature for anisotropic remesh (in GFace)"); - Curvature::typeOfCurvature type = Curvature::RUSIN; //RBF - curvature.computeCurvature(model(), type); - } - - double cMin[3]; - double cMax[3]; - SVector3 dMin[3]; - SVector3 dMax[3]; - curvature.triangleNodalValuesAndDirections(lt->tri, dMax, dMin, cMax, cMin, 0); - //curvature.triangleNodalValuesAndDirections(lt->tri, dMax, dMin, cMax, cMin, 1); - - *dirMax = (1-U-V)*dMax[0] + U*dMax[1] + V*dMax[2]; - *dirMin = (1-U-V)*dMin[0] + U*dMin[1] + V*dMin[2]; - *curvMax = (1-U-V)*cMax[0] + U*cMax[1] + V*cMax[2]; - *curvMin = (1-U-V)*cMin[0] + U*cMin[1] + V*cMin[2]; - - return *curvMax; - } - return 0.; -} - -double GFaceCompound::locCurvature(MTriangle *t, double u, double v) const -{ - SVector3 n1 = _normals[t->getVertex(0)]; - SVector3 n2 = _normals[t->getVertex(1)]; - SVector3 n3 = _normals[t->getVertex(2)]; - double val[9] = {n1.x(), n2.x(), n3.x(), - n1.y(), n2.y(), n3.y(), - n1.z(), n2.z(), n3.z()}; - return fabs(t->interpolateDiv(val, u, v, 3)); -} - -SPoint2 GFaceCompound::parFromVertex(MVertex *v) const -{ - double U=0.0,V=0.0; - if(v->onWhat()->dim()==2){ - v->getParameter(0, U); - v->getParameter(1, V); - } - if (v->onWhat()->dim()==1 || - (v->onWhat()->dim()==2 && - U == -1 && V==-1)){ //if MFaceVertex created on edge in bunin - SPoint2 sp = getCoordinates(v); - U = sp.x(); - V = sp.y(); - } - if (v->onWhat()->dim()==0){ - SPoint2 sp = parFromPoint(SPoint3(v->x(), v->y(), v->z())); - U = sp.x(); - V = sp.y(); - } - return SPoint2(U,V); - -} -SPoint2 GFaceCompound::parFromPoint(const SPoint3 &p, bool onSurface) const -{ - if(!oct) parametrize(); - - std::map<SPoint3,SPoint3>::const_iterator it = _coordPoints.find(p); - SPoint3 sp = it->second; - - return SPoint2(sp.x(), sp.y()); -} - -GPoint GFaceCompound::pointInRemeshedOctree(double par1, double par2) const -{ - - //create new octree with new mesh elements - if(!octNew){ - std::vector<MElement *> myElems; - for (unsigned int i = 0; i < triangles.size(); i++) myElems.push_back(triangles[i]); - for (unsigned int i = 0; i < quadrangles.size(); i++) myElems.push_back(quadrangles[i]); - - std::set<SPoint2> myBCNodes; - for (unsigned int i = 0; i < myElems.size(); i++){ - MElement *e = myElems[i]; - MVertex *news[4]; - for (int j = 0; j < e->getNumVertices(); j++){ - MVertex *v = e->getVertex(j); - std::map<MVertex*,MVertex*>::iterator it = _3Dto2D.find(v); - MVertex *newv =0; - if (it == _3Dto2D.end()){ - SPoint2 p = parFromVertex(v); - newv = new MVertex (p.x(), p.y(), 0.0); - myParamVert.push_back(newv); - _3Dto2D[v] = newv; - _2Dto3D[newv] = v; - if(v->onWhat()->dim()<2) myBCNodes.insert(p); - } - else newv = it->second; - news[j] = newv; - } - - if(e->getType() == TYPE_TRI) - myParamElems.push_back(new MTriangle(news[0],news[1],news[2],e->getNum())); - else if (e->getType() == TYPE_QUA) { - myParamElems.push_back(new MQuadrangle(news[0],news[1],news[2],news[3],e->getNum())); - } - } - - octNew = new MElementOctree(myParamElems); - - //build kdtree boundary nodes in parametric space - int nbBCNodes = myBCNodes.size(); - ANNpointArray uv_nodes = annAllocPts(nbBCNodes, 3); - std::set<SPoint2>::iterator itp = myBCNodes.begin(); - int ind = 0; - while (itp != myBCNodes.end()){ - SPoint2 pt = *itp; - uv_nodes[ind][0] = pt.x(); - uv_nodes[ind][1] = pt.y(); - uv_nodes[ind][2] = 0.0; - itp++; ind++; - } - uv_kdtree = new ANNkd_tree(uv_nodes, nbBCNodes, 3); - } - - //now use new octree to find point - double uvw[3]={par1,par2, 0.0}; - double UV[3]; - MElement *e = octNew->find(par1,par2, 0.0,-1,false); - if (e){ - e->xyz2uvw(uvw,UV); - double valX[8], valY[8], valZ[8]; - for (int i=0;i<e->getNumPrimaryVertices();i++){ - MVertex *v = _2Dto3D[e->getVertex(i)]; - valX[i] = v->x(); - valY[i] = v->y(); - valZ[i] = v->z(); - } - GPoint gp; - gp.x() = e->interpolate(valX,UV[0],UV[1],UV[2]); - gp.y() = e->interpolate(valY,UV[0],UV[1],UV[2]); - gp.z() = e->interpolate(valZ,UV[0],UV[1],UV[2]); - return gp; - } - //if element not found in new octree find closest point - else{ - GPoint gp(50,50,50); - double pt[3] = {par1,par2,0.0}; - ANNidx index[2]; - ANNdist dist[2]; - uv_kdtree->annkSearch(pt, 2, index, dist); - ANNpointArray uv_nodes = uv_kdtree->thePoints(); - SPoint3 p1(uv_nodes[index[0]][0], uv_nodes[index[0]][1], uv_nodes[index[0]][2]); - SPoint3 p2(uv_nodes[index[1]][0], uv_nodes[index[1]][1], uv_nodes[index[1]][2]); - SPoint3 pnew; double d; - signedDistancePointLine(p1,p2, SPoint3(par1,par2,0.0), d, pnew); - - double uvw[3]={pnew.x(),pnew.y(), 0.0}; - double UV[3]; - MElement *e = octNew->find(pnew.x(), pnew.y(), 0.0,-1,true); - if(!e) e = octNew->find(p1.x(), p1.y(), 0.0,-1,true); - if( e){ - e->xyz2uvw(uvw,UV); - double valX[8], valY[8], valZ[8]; - for (int i=0;i<e->getNumPrimaryVertices();i++){ - MVertex *v = _2Dto3D[e->getVertex(i)]; - valX[i] = v->x(); - valY[i] = v->y(); - valZ[i] = v->z(); - } - gp.x() = e->interpolate(valX,UV[0],UV[1],UV[2]); - gp.y() = e->interpolate(valY,UV[0],UV[1],UV[2]); - gp.z() = e->interpolate(valZ,UV[0],UV[1],UV[2]); - } - else{ - gp.setNoSuccess(); - } - - if (gp.succeeded()) return gp; - else{ - Msg::Error("NOT found point with ANN %g %g", par1, par2); - GPoint gp (30,30,30,this); - gp.setNoSuccess(); - return gp; - } - } -} - -GPoint GFaceCompound::point(double par1, double par2) const -{ - if(trivial()){ - return (*(_compound.begin()))->point(par1,par2); - } - - if(!oct) parametrize(); - - double U,V; - double par[2] = {par1,par2}; - GFaceCompoundTriangle *lt; - getTriangle(par1, par2, <, U,V); - if(!lt){ - if (meshStatistics.status == GFace::DONE && triangles.size()+quadrangles.size() != 0) { - GPoint gp = pointInRemeshedOctree(par1,par2); - gp.setNoSuccess(); - return gp; - } - else{ - double pt[3] = {par1,par2, 0.0}; - ANNidx index[2]; - ANNdist dist[2]; - kdtree->annkSearch(pt, 1, index, dist); - lt = &(_gfct[index[0]]); - - SPoint3 pnew_a, pnew_b, pnew_c; double d_a, d_b, d_c; - signedDistancePointLine(lt->p1,lt->p2, SPoint3(par1,par2,0.0), d_a, pnew_a); - signedDistancePointLine(lt->p1,lt->p3, SPoint3(par1,par2,0.0), d_b, pnew_b); - signedDistancePointLine(lt->p2,lt->p3, SPoint3(par1,par2,0.0), d_c, pnew_c); - double u,v; - if (d_a <= d_b && d_a <= d_c) { u = pnew_a.x(); v= pnew_a.y();} - else if (d_b <= d_a && d_b <= d_c) { u = pnew_b.x(); v= pnew_b.y();} - else { u = pnew_c.x(); v= pnew_c.y();} - double M[2][2],X[2],R[2]; - const SPoint3 p0 = (lt)->p1; - const SPoint3 p1 = (lt)->p2; - const SPoint3 p2 = (lt)->p3; - M[0][0] = p1.x() - p0.x(); - M[0][1] = p2.x() - p0.x(); - M[1][0] = p1.y() - p0.y(); - M[1][1] = p2.y() - p0.y(); - R[0] = (u - p0.x()); - R[1] = (v - p0.y()); - sys2x2(M, R, X); - U = X[0]; - V = X[1]; - } - } - - if (lt->gf->geomType() != GEntity::DiscreteSurface){ - SPoint2 pParam = lt->gfp1*(1.-U-V) + lt->gfp2*U + lt->gfp3*V; - GPoint pp = lt->gf->point(pParam); - return GPoint(pp.x(),pp.y(),pp.z(),this,par); - } - - const bool LINEARMESH = true; //false - if(LINEARMESH){ - // linear Lagrange mesh - SPoint3 p = lt->v1*(1.-U-V) + lt->v2*U + lt->v3*V; - return GPoint(p.x(),p.y(),p.z(),this,par); - } - else{ - // curved PN triangle - const SVector3 n1 = _normals[lt->tri->getVertex(0)]; - const SVector3 n2 = _normals[lt->tri->getVertex(1)]; - const SVector3 n3 = _normals[lt->tri->getVertex(2)]; - - SVector3 b300, b030, b003; - SVector3 b210, b120, b021, b012, b102, b201, E, VV, b111; - b300 = lt->v1; - b030 = lt->v2; - b003 = lt->v3; - - // tagged PN triangles (sigma=1) - double theta = 0.0; - SVector3 d1 = lt->v1+.33*(1-theta)*(lt->v2-lt->v1); - SVector3 d2 = lt->v2+.33*(1-theta)*(lt->v1-lt->v2); - SVector3 X1 = 1/norm(n1)*n1; - SVector3 X2 = 1/norm(n2)*n2; - b210 = d1 - dot(X1,d1-lt->v1)*X1; - b120 = d2 - dot(X2,d2-lt->v2)*X2; - SVector3 d3 = lt->v2+.33*(1-theta)*(lt->v3-lt->v2); - SVector3 d4 = lt->v3+.33*(1-theta)*(lt->v2-lt->v3); - SVector3 X3 = 1/norm(n2)*n2; - SVector3 X4 = 1/norm(n3)*n3; - b021 = d3 - dot(X3,d3-lt->v2)*X3; - b012 = d4 - dot(X4,d4-lt->v3)*X4; - SVector3 d5 = lt->v3+.33*(1-theta)*(lt->v1-lt->v3); - SVector3 d6 = lt->v1+.33*(1-theta)*(lt->v3-lt->v1); - SVector3 X5 = 1/norm(n3)*n3; - SVector3 X6 = 1/norm(n1)*n1; - b102 = d5 - dot(X5,d5-lt->v3)*X5; - b201 = d6 - dot(X6,d6-lt->v1)*X6; - - E=(b210+b120+b021+b012+b102+b201)*0.16667; - VV=(lt->v1+lt->v2+lt->v3)*0.333; - b111=E+(E-VV)*0.5; - - double W = 1-U-V; - SVector3 point = b300*W*W*W+b030*U*U*U+b003*V*V*V+ - b210*3.*W*W*U+b120*3.*W*U*U+b201*3.*W*W*V+ - b021*3.*U*U*V+b102*3.*W*V*V+b012*3.*U*V*V+ - b111*6.*W*U*V; - - SPoint3 PP(point.x(), point.y(), point.z()); - return GPoint(PP.x(),PP.y(),PP.z(),this,par); - } -} - -Pair<SVector3,SVector3> GFaceCompound::firstDer(const SPoint2 ¶m) const -{ - - if(!oct) parametrize(); - - if(trivial()) - return (*(_compound.begin()))->firstDer(param); - - double U,V; - GFaceCompoundTriangle *lt; - getTriangle(param.x(), param.y(), <, U,V); - MTriangle *tri=NULL; - if (lt) tri = lt->tri; - else { - double pt[3] = {param.x(), param.y(), 0.0}; - ANNidx index[2]; - ANNdist dist[2]; - kdtree->annkSearch(pt, 1, index, dist); - tri = (&_gfct[index[0]])->tri; - } - - SVector3 dXdu1 = firstDerivatives[tri->getVertex(0)].first(); - SVector3 dXdu2 = firstDerivatives[tri->getVertex(1)].first(); - SVector3 dXdu3 = firstDerivatives[tri->getVertex(2)].first(); - SVector3 dXdv1 = firstDerivatives[tri->getVertex(0)].second(); - SVector3 dXdv2 = firstDerivatives[tri->getVertex(1)].second(); - SVector3 dXdv3 = firstDerivatives[tri->getVertex(2)].second(); - SVector3 dXdu = dXdu1*(1.-U-V) + dXdu2*U + dXdu3*V; - SVector3 dXdv = dXdv1*(1.-U-V) + dXdv2*U + dXdv3*V; - return Pair<SVector3, SVector3>(dXdu,dXdv); -} - -void GFaceCompound::secondDer(const SPoint2 ¶m, - SVector3 *dudu, SVector3 *dvdv, SVector3 *dudv) const -{ -#if defined(HAVE_MESH) - - if(!oct) parametrize(); - - if(adjv.size() == 0){ - std::vector<MTriangle*> allTri; - std::list<GFace*>::const_iterator it = _compound.begin(); - for( ; it != _compound.end(); ++it){ - allTri.insert(allTri.end(), (*it)->triangles.begin(), (*it)->triangles.end() ); - } - buildVertexToTriangle(allTri, adjv); - } - - if (xuu.size() == 0) computeHessianMapping(); - - double U, V; - GFaceCompoundTriangle *lt; - getTriangle(param.x(), param.y(), <, U,V); - if(!lt) return; - - MVertex* v0 = lt->tri->getVertex(0); - MVertex* v1 = lt->tri->getVertex(1); - MVertex* v2 = lt->tri->getVertex(2); - - *dudu = (1-U-V)*xuu[v0] + U*xuu[v1] + V*xuu[v2]; - *dvdv = (1-U-V)*xvv[v0] + U*xvv[v1] + V*xvv[v2]; - *dudv = (1-U-V)*xuv[v0] + U*xuv[v1] + V*xuv[v2]; - -#endif - //Msg::Debug("Computation of the second derivatives is not implemented for compound faces"); -} - -void GFaceCompound::computeHessianMapping() const -{ -#if defined(HAVE_MESH) - unsigned int sysDim = 6; //for 2D - unsigned int minNbPtBlob = 3*sysDim; - for (v2t_cont::iterator it = adjv.begin(); it != adjv.end(); it++) { - MVertex *ver = it->first; - std::vector<MVertex*> vv = getBlob(minNbPtBlob, it, adjv); - fullMatrix<double> A(vv.size(),sysDim), ATAx(sysDim,sysDim); - fullMatrix<double> ATAy(sysDim,sysDim), ATAz(sysDim,sysDim); - fullVector<double> bx(vv.size()), ATbx(sysDim), coeffsx(sysDim); - fullVector<double> by(vv.size()), ATby(sysDim), coeffsy(sysDim); - fullVector<double> bz(vv.size()), ATbz(sysDim), coeffsz(sysDim); - for(unsigned int i=0; i<vv.size(); i++) { - SPoint3 uv = coordinates[vv[i]]; - A(i,0) = uv.x()*uv.x(); A(i,1) = uv.x()*uv.y(); A(i,2) = uv.y()*uv.y(); - A(i,3) = uv.x(); A(i,4) = uv.y(); A(i,5) = 1.; - bx(i) = vv[i]->x(); - by(i) = vv[i]->y(); - bz(i) = vv[i]->z(); - } - ATAx.gemm(A,A,1.,0., true, false); - ATAy = ATAx; ATAz = ATAx; - A.multWithATranspose(bx,1.,0.,ATbx); - A.multWithATranspose(by,1.,0.,ATby); - A.multWithATranspose(bz,1.,0.,ATbz); - ATAx.luSolve(ATbx,coeffsx); - ATAy.luSolve(ATby,coeffsy); - ATAz.luSolve(ATbz,coeffsz); - SPoint3 uv = coordinates[ver]; - xuu[ver] = SVector3(2.*coeffsx(0),2.*coeffsy(0),2.*coeffsz(0)) ; - xvv[ver] = SVector3(2.*coeffsx(2),2.*coeffsy(2),2.*coeffsz(2)) ; - xuv[ver] = SVector3(coeffsx(1), coeffsy(1),coeffsz(1)); - xu[ver] = SVector3(2.*coeffsx(0)*uv.x()+coeffsx(1)*uv.y()+coeffsx(3), - 2.*coeffsy(0)*uv.x()+coeffsy(1)*uv.y()+coeffsy(3), - 2.*coeffsz(0)*uv.x()+coeffsz(1)*uv.y()+coeffsz(3)); - xv[ver] = SVector3(coeffsx(1)*uv.x()+2.*coeffsx(2)*uv.y()+coeffsx(4), - coeffsy(1)*uv.x()+2.*coeffsy(2)*uv.y()+coeffsy(4), - coeffsz(1)*uv.x()+2.*coeffsz(2)*uv.y()+coeffsz(4)); - } - -#endif -} - -static void GFaceCompoundBB(void *a, double*mmin, double*mmax) -{ - GFaceCompoundTriangle *t = (GFaceCompoundTriangle *)a; - mmin[0] = std::min(std::min(t->p1.x(), t->p2.x()), t->p3.x()); - mmin[1] = std::min(std::min(t->p1.y(), t->p2.y()), t->p3.y()); - mmax[0] = std::max(std::max(t->p1.x(), t->p2.x()), t->p3.x()); - mmax[1] = std::max(std::max(t->p1.y(), t->p2.y()), t->p3.y()); - mmin[2] = -1; - mmax[2] = 1; - - const double dx = mmax[0] - mmin[0]; - const double dy = mmax[1] - mmin[1]; - const double eps = 0.0;//1.e-12; - mmin[0] -= eps*dx; - mmin[1] -= eps*dy; - mmax[0] += eps*dx; - mmax[1] += eps*dy; -} - -static void GFaceCompoundCentroid(void *a, double*c) -{ - GFaceCompoundTriangle *t = (GFaceCompoundTriangle *)a; - c[0] = (t->p1.x() + t->p2.x() + t->p3.x()) / 3.0; - c[1] = (t->p1.y() + t->p2.y() + t->p3.y()) / 3.0; - c[2] = 0.0; -} - -static int GFaceCompoundInEle(void *a, double*c) -{ - GFaceCompoundTriangle *t = (GFaceCompoundTriangle *)a; - double M[2][2], R[2], X[2]; - const double eps = 1.e-8; - const SPoint3 p0 = t->p1; - const SPoint3 p1 = t->p2; - const SPoint3 p2 = t->p3; - M[0][0] = p1.x() - p0.x(); - M[0][1] = p2.x() - p0.x(); - M[1][0] = p1.y() - p0.y(); - M[1][1] = p2.y() - p0.y(); - R[0] = (c[0] - p0.x()); - R[1] = (c[1] - p0.y()); - sys2x2(M, R, X); - if(X[0] > -eps && X[1] > -eps && 1. - X[0] - X[1] > -eps){ - return 1; - } - return 0; -} - -void GFaceCompound::getTriangle(double u, double v, - GFaceCompoundTriangle **lt, - double &_u, double &_v) const -{ - double uv[3] = {u, v, 0}; - *lt = (GFaceCompoundTriangle*)Octree_Search(uv, oct); - - if(!(*lt)){ - _u = 0.0; _v = 0.0; - return; - } - - double M[2][2],X[2],R[2]; - const SPoint3 p0 = (*lt)->p1; - const SPoint3 p1 = (*lt)->p2; - const SPoint3 p2 = (*lt)->p3; - M[0][0] = p1.x() - p0.x(); - M[0][1] = p2.x() - p0.x(); - M[1][0] = p1.y() - p0.y(); - M[1][1] = p2.y() - p0.y(); - R[0] = (u - p0.x()); - R[1] = (v - p0.y()); - sys2x2(M, R, X); - _u = X[0]; - _v = X[1]; -} - -void GFaceCompound::buildOct() const -{ -#if defined(HAVE_MESH) - SBoundingBox3d bb; - int count = 0; - std::list<GFace*>::const_iterator it = _compound.begin(); - - for( ; it != _compound.end() ; ++it){ - for(unsigned int i = 0; i < (*it)->triangles.size(); ++i){ - MTriangle *t = (*it)->triangles[i]; - //create bounding box - for(int j = 0; j < 3; j++){ - std::map<MVertex*,SPoint3>::const_iterator itj = coordinates.find(t->getVertex(j)); - _coordPoints.insert(std::make_pair(t->getVertex(j)->point(), itj->second)); - bb += SPoint3(itj->second.x(),itj->second.y(),0.0); - } - count++; - } - } - - //ANN octree - std::set<MVertex*> allVS; - ANNpointArray nodes = annAllocPts(count, 3); - - // make bounding box - SPoint3 bbmin = bb.min(), bbmax = bb.max(); - double origin[3] = {bbmin.x(), bbmin.y(), bbmin.z()}; - double ssize[3] = {bbmax.x() - bbmin.x(), - bbmax.y() - bbmin.y(), - bbmax.z() - bbmin.z()}; - - _gfct = new GFaceCompoundTriangle[count]; - const int maxElePerBucket = 15; - oct = Octree_Create(maxElePerBucket, origin, ssize, GFaceCompoundBB, - GFaceCompoundCentroid, GFaceCompoundInEle); - std::map<MElement*, Pair<SVector3,SVector3> > firstElemDerivatives; - - it = _compound.begin(); - count = 0; - - for( ; it != _compound.end() ; ++it){ - for(unsigned int i = 0; i < (*it)->triangles.size(); ++i){ - MTriangle *t = (*it)->triangles[i]; - std::map<MVertex*,SPoint3>::const_iterator it0 = - coordinates.find(t->getVertex(0)); - std::map<MVertex*,SPoint3>::const_iterator it1 = - coordinates.find(t->getVertex(1)); - std::map<MVertex*,SPoint3>::const_iterator it2 = - coordinates.find(t->getVertex(2)); - _gfct[count].p1 = it0->second; - _gfct[count].p2 = it1->second; - _gfct[count].p3 = it2->second; - if((*it)->geomType() != GEntity::DiscreteSurface){ - // take care of the seam !!!! - if (t->getVertex(0)->onWhat()->dim() == 2){ - reparamMeshEdgeOnFace(t->getVertex(0), t->getVertex(1), *it, - _gfct[count].gfp1, _gfct[count].gfp2); - reparamMeshEdgeOnFace(t->getVertex(0), t->getVertex(2), *it, - _gfct[count].gfp1, _gfct[count].gfp3); - } - else if (t->getVertex(1)->onWhat()->dim() == 2){ - reparamMeshEdgeOnFace(t->getVertex(1), t->getVertex(0), *it, - _gfct[count].gfp2, _gfct[count].gfp1); - reparamMeshEdgeOnFace(t->getVertex(1), t->getVertex(2), *it, - _gfct[count].gfp2, _gfct[count].gfp3); - } - else if (t->getVertex(2)->onWhat()->dim() == 2){ - reparamMeshEdgeOnFace(t->getVertex(2), t->getVertex(0), *it, - _gfct[count].gfp3, _gfct[count].gfp1); - reparamMeshEdgeOnFace(t->getVertex(2), t->getVertex(1), *it, - _gfct[count].gfp3, _gfct[count].gfp2); - } - else { - reparamMeshVertexOnFace(t->getVertex(0), *it, _gfct[count].gfp1); - reparamMeshVertexOnFace(t->getVertex(1), *it, _gfct[count].gfp2); - reparamMeshVertexOnFace(t->getVertex(2), *it, _gfct[count].gfp3); - } - } - _gfct[count].v1 = SPoint3(t->getVertex(0)->x(), t->getVertex(0)->y(), - t->getVertex(0)->z()); - _gfct[count].v2 = SPoint3(t->getVertex(1)->x(), t->getVertex(1)->y(), - t->getVertex(1)->z()); - _gfct[count].v3 = SPoint3(t->getVertex(2)->x(), t->getVertex(2)->y(), - t->getVertex(2)->z()); - _gfct[count].gf = *it; - _gfct[count].tri = t; - - //compute first derivatives for every triangle - double mat[2][2] = {{_gfct[count].p2.x() - _gfct[count].p1.x(), - _gfct[count].p3.x() - _gfct[count].p1.x()}, - {_gfct[count].p2.y() - _gfct[count].p1.y(), - _gfct[count].p3.y() - _gfct[count].p1.y()}}; - double inv[2][2]; - inv2x2(mat, inv); - SVector3 dXdxi (_gfct[count].v2 - _gfct[count].v1); - SVector3 dXdeta(_gfct[count].v3 - _gfct[count].v1); - SVector3 dXdu(dXdxi * inv[0][0] + dXdeta * inv[1][0]); - SVector3 dXdv(dXdxi * inv[0][1] + dXdeta * inv[1][1]); - firstElemDerivatives[(MElement*)t] = Pair<SVector3,SVector3>(dXdu,dXdv); - - // build ANN kdtree - nodes[count][0] = (it0->second.x() + it1->second.x() + it2->second.x())/3.0 ; - nodes[count][1] = (it0->second.y() + it1->second.y() + it2->second.y())/3.0 ; - nodes[count][2] = 0.0; - - Octree_Insert(&_gfct[count], oct); - count++; - } - } - nbT = count; - Octree_Arrange(oct); - - //smooth first derivatives at vertices - if(adjv.size() == 0){ - std::vector<MTriangle*> allTri; - std::list<GFace*>::const_iterator it = _compound.begin(); - for( ; it != _compound.end(); ++it){ - allTri.insert(allTri.end(), (*it)->triangles.begin(), (*it)->triangles.end() ); - } - buildVertexToTriangle(allTri, adjv); - } - for(v2t_cont::iterator it = adjv.begin(); it!= adjv.end(); ++it){ - MVertex *v = it->first; - std::vector<MElement*> vTri = it->second; - SVector3 dXdu(0.0), dXdv(0.0); - int nbTri = vTri.size(); - for (int j = 0; j < nbTri; j++){ - dXdu += firstElemDerivatives[vTri[j]].first(); - dXdv += firstElemDerivatives[vTri[j]].second(); - } - dXdu*= 1./nbTri; - dXdv*= 1./nbTri; - firstDerivatives[v] = Pair<SVector3, SVector3>(dXdu, dXdv); - } - - //build ANN kdtree - kdtree = new ANNkd_tree(nodes, count, 3); - - printStuff(); -#endif -} - -bool GFaceCompound::checkTopology() const -{ - if (_mapping == RBF) return true; - - bool correctTopo = true; - if(allNodes.empty()) buildAllNodes(); - - int Nb = _interior_loops.size(); - int G = genusGeom() ; - - double H = getSizeH(); - double D = H; - if (_interior_loops.size() > 0) D = getSizeBB(_U0); - int AR1 = (int) checkAspectRatio(); - int AR2 = (int) floor(H/D+0.5); - int AR = std::max(AR1, AR2); - - if (G != 0 || Nb < 1){ - correctTopo = false; - nbSplit = std::max(G+2, 2); - Msg::Info("Wrong topology: Genus=%d, Nb boundaries=%d, AR=%g", G, Nb, H/D); - if (_allowPartition){ - Msg::Info("-----------------------------------------------------------"); - Msg::Info("--- Split surface %d in %d parts with Multilevel Mesh partitioner", - tag(), nbSplit); - } - else{ - Msg::Fatal("For remeshing your geometry, you should enable the automatic " - "remeshing algorithm. Add 'Mesh.RemeshAlgorithm=1;' in your " - "geo file or through the Fltk window (Options > Mesh > General)"); - } - } - else if (G == 0 && AR > AR_MAX){ - correctTopo = false; - Msg::Info("Wrong topology: Aspect ratio is too high AR=%d (AR1=%d AR2=%d)", - AR, AR1, AR2); - if (_allowPartition == 1){ - nbSplit = -2; - Msg::Info("-----------------------------------------------------------"); - Msg::Info("--- Split surface %d in 2 parts with Laplacian Mesh partitioner", - tag()); - } - else if (_allowPartition == 2){ - nbSplit = 2; - Msg::Info("-----------------------------------------------------------"); - Msg::Info("--- Split surface %d in %d parts with Multilevel Mesh partitioner", - tag(), nbSplit); - } - else if (_allowPartition == 0){ - Msg::Debug("The geometrical aspect ratio of your geometry is quite high.\n " - "You should enable partitioning of the mesh by activating the\n" - "automatic remeshing algorithm. Add 'Mesh.RemeshAlgorithm=1;'\n " - "in your geo file or through the Fltk window (Options > Mesh >\n " - "General)"); - } - } - else{ - Msg::Debug("Correct topology: Genus=%d and Nb boundaries=%d, AR=%g", G, Nb, H/D); - } - - return correctTopo; -} - -double GFaceCompound::checkAspectRatio() const -{ - if(allNodes.empty()) buildAllNodes(); - - double limit = 1.e-20; - double areaMin = 1.e20; - double area3D = 0.0; - int nb = 0; - std::list<GFace*>::const_iterator it = _compound.begin(); - for( ; it != _compound.end() ; ++it){ - for(unsigned int i = 0; i < (*it)->triangles.size(); ++i){ - MTriangle *t = (*it)->triangles[i]; - std::vector<MVertex *> v(3); - for(int k = 0; k < 3; k++){ - v[k] = t->getVertex(k); - } - double p0[3] = {v[0]->x(), v[0]->y(), v[0]->z()}; - double p1[3] = {v[1]->x(), v[1]->y(), v[1]->z()}; - double p2[3] = {v[2]->x(), v[2]->y(), v[2]->z()}; - double a_3D = fabs(triangle_area(p0, p1, p2)); - area3D += a_3D; - std::map<MVertex*,SPoint3>::const_iterator it0 = coordinates.find(v[0]); - std::map<MVertex*,SPoint3>::const_iterator it1 = coordinates.find(v[1]); - std::map<MVertex*,SPoint3>::const_iterator it2 = coordinates.find(v[2]); - if(it0 != coordinates.end() && - it1 != coordinates.end() && - it2 != coordinates.end()){ - double q0[3] = {it0->second.x(), it0->second.y(), 0.0}; - double q1[3] = {it1->second.x(), it1->second.y(), 0.0}; - double q2[3] = {it2->second.x(), it2->second.y(), 0.0}; - double a_2D = fabs(triangle_area(q0, q1, q2)); - if (a_2D > limit) nb++; - areaMin = std::min(areaMin, a_2D); - } - } - } - - std::list<GEdge*>::const_iterator it0 = _U0.begin(); - double tot_length = 0.0; - for( ; it0 != _U0.end(); ++it0 ) - for(unsigned int i = 0; i < (*it0)->lines.size(); i++ ) - tot_length += (*it0)->lines[i]->getLength(); - - double AR = M_PI*area3D/(tot_length*tot_length); - - if (nb > 3 && areaMin > 0 && areaMin < limit) { - Msg::Warning("Too small triangles in mapping (a_2D=%g)", areaMin); - } - else { - Msg::Debug("Geometrical aspect ratio is OK :-)"); - } - - return AR; -} - -void GFaceCompound::coherencePatches() const -{ - if (_mapping == RBF) return; - Msg::Info("Re-orient all %d compound patches normals coherently", - _compound.size()); - - std::map<MEdge, std::set<MElement*>, Less_Edge > edge2elems; - std::vector<MElement*> allElems; - std::list<GFace*>::const_iterator it = _compound.begin(); - for( ; it != _compound.end() ; ++it){ - for(unsigned int i = 0; i < (*it)->getNumMeshElements(); ++i){ - MElement *t = (*it)->getMeshElement(i); - allElems.push_back(t); - for (int j = 0; j < t->getNumEdges(); j++){ - MEdge me = t->getEdge(j); - std::map<MEdge, std::set<MElement*, std::less<MElement*> >, - Less_Edge >::iterator it = edge2elems.find(me); - if (it == edge2elems.end()) { - std::set<MElement*, std::less<MElement*> > mySet; - mySet.insert(t); - edge2elems.insert(std::make_pair(me, mySet)); - } - else{ - std::set<MElement*, std::less<MElement*> > mySet = it->second; - mySet.insert(t); - it->second = mySet; - } - } - } - } - - std::set<MElement* , std::less<MElement*> > touched; - int iE, si, iE2, si2; - touched.insert(allElems[0]); - while(touched.size() != allElems.size()){ - for(unsigned int i = 0; i < allElems.size(); i++){ - MElement *t = allElems[i]; - std::set<MElement*, std::less<MElement*> >::iterator it2 = touched.find(t); - if(it2 != touched.end()){ - for (int j = 0; j < t->getNumEdges(); j++){ - MEdge me = t->getEdge(j); - t->getEdgeInfo(me, iE,si); - std::map<MEdge, std::set<MElement*>, Less_Edge >::iterator it = - edge2elems.find(me); - std::set<MElement*, std::less<MElement*> > mySet = it->second; - for(std::set<MElement*, std::less<MElement*> >::iterator itt = mySet.begin(); - itt != mySet.end(); itt++){ - if (*itt != t){ - (*itt)->getEdgeInfo(me,iE2,si2); - if(si == si2) { (*itt)->reverse();} - touched.insert(*itt); - } - } - } - } - } - } -} - -void GFaceCompound::coherenceNormals() -{ - if(!getNumMeshElements()) return; - Msg::Info("Re-orient all %d face normals coherently", getNumMeshElements()); - - std::map<MEdge, std::set<MElement*>, Less_Edge > edge2elems; - for(unsigned int i = 0; i < getNumMeshElements(); i++){ - MElement *t = getMeshElement(i); - for (int j = 0; j < t->getNumEdges(); j++){ - MEdge me = t->getEdge(j); - std::map<MEdge, std::set<MElement*, std::less<MElement*> >, - Less_Edge >::iterator it = edge2elems.find(me); - if (it == edge2elems.end()) { - std::set<MElement*, std::less<MElement*> > mySet; - mySet.insert(t); - edge2elems.insert(std::make_pair(me, mySet)); - } - else{ - std::set<MElement*, std::less<MElement*> > mySet = it->second; - mySet.insert(t); - it->second = mySet; - } - } - } - - std::set<MElement* , std::less<MElement*> > touched; - int iE, si, iE2, si2; - touched.insert(getMeshElement(0)); - while(touched.size() != getNumMeshElements()){ - for(unsigned int i = 0; i < getNumMeshElements(); i++){ - MElement *t = getMeshElement(i); - std::set<MElement*, std::less<MElement*> >::iterator it2 = touched.find(t); - if(it2 != touched.end()){ - for (int j = 0; j < t->getNumEdges(); j++){ - MEdge me = t->getEdge(j); - t->getEdgeInfo(me, iE,si); - std::map<MEdge, std::set<MElement*>, Less_Edge >::iterator it = - edge2elems.find(me); - std::set<MElement*, std::less<MElement*> > mySet = it->second; - for(std::set<MElement*, std::less<MElement*> >::iterator itt = mySet.begin(); - itt != mySet.end(); itt++){ - if (*itt != t){ - (*itt)->getEdgeInfo(me,iE2,si2); - if(si == si2) (*itt)->reverse(); - touched.insert(*itt); - } - } - } - } - } - } -} - -void GFaceCompound::buildAllNodes() const -{ - std::list<GFace*>::const_iterator it = _compound.begin(); - for( ; it != _compound.end() ; ++it){ - for(unsigned int i = 0; i < (*it)->triangles.size(); ++i){ - MTriangle *t = (*it)->triangles[i]; - for(int j = 0; j < 3; j++){ - allNodes.insert(t->getVertex(j)); - } - } - } -} - -int GFaceCompound::genusGeom() const -{ - std::list<GFace*>::const_iterator it = _compound.begin(); - std::set<MEdge, Less_Edge> es; - std::set<MVertex*> vs; - int N = 0; - for( ; it != _compound.end() ; ++it){ - for(unsigned int i = 0; i < (*it)->triangles.size(); ++i){ - N++; - MTriangle *e = (*it)->triangles[i]; - for(int j = 0; j < e->getNumVertices(); j++){ - vs.insert(e->getVertex(j)); - } - for(int j = 0; j < e->getNumEdges(); j++){ - es.insert(e->getEdge(j)); - } - } - } - int poincare = vs.size() - es.size() + N; - - return (int)(-poincare + 2 - _interior_loops.size())/2; -} - -void GFaceCompound::printStuff(int iNewton) const -{ - if(!CTX::instance()->mesh.saveAll) return; - - std::list<GFace*>::const_iterator it = _compound.begin(); - - char name0[256], name1[256], name2[256], name3[256]; - char name4[256], name5[256], name6[256]; - char name7[256]; - sprintf(name0, "UVAREA-%d.pos", tag()); //(*it)->tag() - sprintf(name1, "UVX-%d_%d.pos", tag(), iNewton); - sprintf(name2, "UVY-%d_%d.pos", tag(), iNewton); - sprintf(name3, "UVZ-%d_%d.pos", tag(), iNewton); - sprintf(name4, "XYZU-%d_%d.pos", tag(), iNewton); - sprintf(name5, "XYZV-%d_%d.pos", tag(), iNewton); - sprintf(name6, "XYZC-%d.pos", tag()); - - sprintf(name7, "UVM-%d.pos", (*it)->tag()); - - FILE * uvx = Fopen(name1,"w"); - if(!uvx){ - Msg::Error("Could not open file '%s'", name1); - return; - } - FILE * uvy = Fopen(name2,"w"); - if(!uvy){ - fclose(uvx); - Msg::Error("Could not open file '%s'", name2); - return; - } - FILE * uvz = Fopen(name3,"w"); - if(!uvz){ - fclose(uvx); - fclose(uvy); - Msg::Error("Could not open file '%s'", name3); - return; - } - FILE * xyzu = Fopen(name4,"w"); - if(!xyzu){ - fclose(uvx); - fclose(uvy); - fclose(uvz); - Msg::Error("Could not open file '%s'", name4); - return; - } - FILE * xyzv = Fopen(name5,"w"); - if(!xyzv){ - fclose(uvx); - fclose(uvy); - fclose(uvz); - fclose(xyzu); - Msg::Error("Could not open file '%s'", name5); - return; - } - - fprintf(uvx, "View \"\"{\n"); - fprintf(uvy, "View \"\"{\n"); - fprintf(uvz, "View \"\"{\n"); - fprintf(xyzu, "View \"\"{\n"); - fprintf(xyzv, "View \"\"{\n"); - - for( ; it != _compound.end() ; ++it){ - for(unsigned int i = 0; i < (*it)->triangles.size(); ++i){ - MTriangle *t = (*it)->triangles[i]; - std::map<MVertex*,SPoint3>::const_iterator it0 = - coordinates.find(t->getVertex(0)); - std::map<MVertex*,SPoint3>::const_iterator it1 = - coordinates.find(t->getVertex(1)); - std::map<MVertex*,SPoint3>::const_iterator it2 = - coordinates.find(t->getVertex(2)); - fprintf(xyzv, "ST(%g,%g,%g,%g,%g,%g,%g,%g,%g){%g,%g,%g};\n", - t->getVertex(0)->x(), t->getVertex(0)->y(), t->getVertex(0)->z(), - t->getVertex(1)->x(), t->getVertex(1)->y(), t->getVertex(1)->z(), - t->getVertex(2)->x(), t->getVertex(2)->y(), t->getVertex(2)->z(), - it0->second.y(),it1->second.y(),it2->second.y()); - fprintf(xyzu, "ST(%22.15E,%22.15E,%22.15E,%22.15E,%22.15E,%22.15E,%22.15E," - "%22.15E,%22.15E){%22.15E,%22.15E,%22.15E};\n", - t->getVertex(0)->x(), t->getVertex(0)->y(), t->getVertex(0)->z(), - t->getVertex(1)->x(), t->getVertex(1)->y(), t->getVertex(1)->z(), - t->getVertex(2)->x(), t->getVertex(2)->y(), t->getVertex(2)->z(), - it0->second.x(),it1->second.x(),it2->second.x()); - fprintf(uvx, "ST(%22.15E,%22.15E,%22.15E,%22.15E,%22.15E,%22.15E,%22.15E," - "%22.15E,%22.15E){%22.15E,%22.15E,%22.15E};\n", - it0->second.x(), it0->second.y(), 0.0, - it1->second.x(), it1->second.y(), 0.0, - it2->second.x(), it2->second.y(), 0.0, - t->getVertex(0)->x(), t->getVertex(1)->x(), t->getVertex(2)->x()); - fprintf(uvy, "ST(%g,%g,%g,%g,%g,%g,%g,%g,%g){%g,%g,%g};\n", - it0->second.x(), it0->second.y(), 0.0, - it1->second.x(), it1->second.y(), 0.0, - it2->second.x(), it2->second.y(), 0.0, - t->getVertex(0)->y(), t->getVertex(1)->y(), t->getVertex(2)->y()); - fprintf(uvz, "ST(%g,%g,%g,%g,%g,%g,%g,%g,%g){%g,%g,%g};\n", - it0->second.x(), it0->second.y(), 0.0, - it1->second.x(), it1->second.y(), 0.0, - it2->second.x(), it2->second.y(), 0.0, - t->getVertex(0)->z(), t->getVertex(1)->z(), t->getVertex(2)->z()); - } - } - fprintf(uvx,"};\n"); - fclose(uvx); - fprintf(uvy,"};\n"); - fclose(uvy); - fprintf(uvz,"};\n"); - fclose(uvz); - fprintf(xyzu,"};\n"); - fclose(xyzu); - fprintf(xyzv,"};\n"); - fclose(xyzv); -} - -// useful for mesh generators ---------------------------------------- -// Intersection of a circle and a plane -GPoint GFaceCompound::intersectionWithCircle(const SVector3 &n1, const SVector3 &n2, - const SVector3 &p, const double &d, - double uv[2]) const -{ - SVector3 n = crossprod(n1,n2); - n.normalize(); - for (int i=-1;i<nbT;i++){ - GFaceCompoundTriangle *ct; - double U,V; - if (i == -1) getTriangle(uv[0],uv[1], &ct, U,V); - else ct = &_gfct[i]; - if (!ct) continue; - // we have two planes, defined with n1,n2 and t1,t2 - // we have then a direction m = (n1 x n2) x (t1 x t2) - // and a point p that defines a straight line - // the point is situated in the half plane defined - // by direction n1 and point p (exclude the one on the - // other side) - - SVector3 t1 = ct->v2 - ct->v1; - SVector3 t2 = ct->v3 - ct->v1; - - // let us first compute point q to be the intersection - // of the plane of the triangle with the line L = p + t n1 - // Compute w = t1 x t2 = (a,b,c) and write a point of the plabe as - // X(x,y,z) = ax + by + cz - (v1_x a + v1_y b + v1_z * c) = 0 - // Then - // a (p_x + t n1_x) + a (p_y + t n1_y) + c (p_z + t n1_z) - - // (v1_x a + v1_y b + v1_z * c) = 0 - // gives t - - SVector3 w = crossprod(t1,t2); - double t = dot(ct->v1-p,w)/dot(n1,w); - SVector3 q = p + n1*t; - - // consider the line that intersects both planes in its - // parametric form - // X(x,y,z) = q + t m - // We have now to intersect that line with the sphere - // (x-p_x)^2 + (y-p_y)^2 + (z-p_z)^2 = d^2 - // Inserting the parametric form of the line into the sphere gives - // (t m_x + q_x - p_x)^2 + (t m_y + q_y - p_y)^2 + (t m_z + q_z - p_z)^2 = d^2 - // t^2 (m_x^2 + m_y^2 + m_z^2) + 2 t (m_x (q_x - p_x) + m_y (q_y - p_z) + - // m_z (q_z - p_z)) + ((q_x - p_x)^2 + (q_y - p_y)^2 + (q_z - p_z)^2 - d^2) = 0 - // t^2 m^2 + 2 t (m . (q-p)) + ((q-p)^2 - d^2) = 0 - // Let us call ta and tb the two roots - // they correspond to two points s_1 = q + ta m and s_2 = q + tb m - // we choose the one that corresponds to (s_i - p) . n1 > 0 - SVector3 m = crossprod(w,n); - const double a = dot(m,m); - const double b = 2*dot(m,q-p); - const double c = dot(q-p,q-p) - d*d; - const double delta = b*b-4*a*c; - - if (delta >= 0){ - const double ta = (-b + sqrt(delta)) / (2.*a); - const double tb = (-b - sqrt(delta)) / (2.*a); - SVector3 s1 = q + m * ta; - SVector3 s2 = q + m * tb; - SVector3 s; - if (dot(s1-p,n1) > 0){ - s = s1; - } - else if (dot(s2-p,n1) > 0){ - s = s2; - } - else continue; - - // we have now to look if the point is inside the triangle - // s = v1 + u t1 + v t2 - // we know the system has a solution because s is in the plane - // defined by v1 and v2 we solve then - // (s - v1) . t1 = u t1^2 + v t2 . t1 - // (s - v1) . t2 = u t1 . t2 + v t2^2 - - double mat[2][2], b[2],uv[2]; - mat[0][0] = dot(t1,t1); - mat[1][1] = dot(t2,t2); - mat[0][1] = mat[1][0] = dot(t1,t2); - b[0] = dot(s-ct->v1,t1) ; - b[1] = dot(s-ct->v1,t2) ; - sys2x2(mat,b,uv); - // check now if the point is inside the triangle - if (uv[0] >= -1.e-6 && uv[1] >= -1.e-6 && - 1.-uv[0]-uv[1] >= -1.e-6 ) { - SVector3 pp = - ct->p1 * ( 1.-uv[0]-uv[1] ) + - ct->p2 *uv[0] + - ct->p3 *uv[1] ; - return GPoint(s.x(),s.y(),s.z(),this,pp); - } - } - } - GPoint pp(0); - pp.setNoSuccess(); - Msg::Debug("ARGG no success intersection circle"); - return pp; -} - -#endif diff --git a/Geo/GFaceCompound.h b/Geo/GFaceCompound.h deleted file mode 100644 index 38f61dbd24735f660a34a61970a570b5dbeac392..0000000000000000000000000000000000000000 --- a/Geo/GFaceCompound.h +++ /dev/null @@ -1,240 +0,0 @@ -// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle -// -// See the LICENSE.txt file for license information. Please report all -// bugs and problems to the public mailing list <gmsh@onelab.info>. - -#ifndef _GFACE_COMPOUND_H_ -#define _GFACE_COMPOUND_H_ - -#include <list> -#include <map> -#include "GmshConfig.h" -#include "GmshMessage.h" -#include "GFace.h" -template <class scalar> class simpleFunction; - -#if defined(HAVE_SOLVER) && defined(HAVE_ANN) - -#include "GEdge.h" -#include "GEdgeCompound.h" -#include "meshGFaceOptimize.h" -#include "linearSystem.h" -#include "GRbf.h" -#include "MElementOctree.h" -class ANNkd_tree; - -#define AR_MAX 5 //maximal geometrical aspect ratio - -/* - A GFaceCompound is a model face that is the compound of model faces. - - It is assumed that all the faces of the compound have been meshed - first. We use this discretization to solve elliptic problems on the - compound. Those problems enable to compute the parametric - coordinates of the mesh points. The parametrization of the compound - consist in a triangulation in the (u,v) space with parameter values at - nodes. - - The compound can therefore be (re)-meshed using any surface mesh - generator of gmsh! -*/ - -class GFaceCompoundTriangle { - public: - SPoint3 p1, p2, p3; - SPoint2 gfp1, gfp2, gfp3; - SPoint3 v1, v2, v3; - GFace *gf; - MTriangle *tri; - GFaceCompoundTriangle() : gf(0), tri(0) {} -}; - -class Octree; -class GRbf; - -class GFaceCompound : public GFace { - public: - typedef enum {ITERU=0,ITERV=1,ITERD=2} iterationStep; - typedef enum {HARMONIC_CIRCLE=0, CONFORMAL_SPECTRAL=1, RADIAL_BASIS=2, HARMONIC_PLANE=3, - CONVEX_CIRCLE=4,CONVEX_PLANE=5, HARMONIC_SQUARE=6, CONFORMAL_FE=7} typeOfCompound; - typedef enum {HARMONIC=0,CONFORMAL=1, RBF=2, CONVEX=3} typeOfMapping; - typedef enum {UNITCIRCLE, MEANPLANE, SQUARE, ALREADYFIXED,SPECTRAL, FE} typeOfIsomorphism; - mutable int nbSplit; - - protected: - mutable std::set<MVertex *> ov; - mutable GRbf *_rbf; - simpleFunction<double> *ONE; - simpleFunction<double> *MONE; - std::list<GFace*> _compound; - std::list<GEdge*> _U0, _V0, _U1, _V1; - std::list<std::list<GEdge*> > _interior_loops; - mutable int nbT; - mutable GFaceCompoundTriangle *_gfct; - mutable Octree *oct; - mutable MElementOctree *octNew; - mutable std::vector<MVertex*> myParamVert; - mutable std::vector<MElement*> myParamElems; - mutable std::map<MVertex*,MVertex*> _3Dto2D; - mutable std::map<MVertex*,MVertex*> _2Dto3D; - mutable std::map<int,SPoint3> XYZoct; - mutable std::set<MVertex*> allNodes; - mutable v2t_cont adjv; - mutable std::map<MVertex*, SPoint3> coordinates; - mutable std::map<MVertex*, Pair<SVector3,SVector3> > firstDerivatives; - mutable std::map<MVertex*, SVector3> xuu; - mutable std::map<MVertex*, SVector3> xvv; - mutable std::map<MVertex*, SVector3> xuv; - mutable std::map<MVertex*, SVector3> xu; - mutable std::map<MVertex*, SVector3> xv; - mutable std::map<SPoint3,SPoint3 > _coordPoints; - mutable std::map<MVertex*, SVector3> _normals; - mutable std::list<MTriangle*> fillTris; - mutable std::set<MVertex*> fillNodes; - mutable std::vector<GFace*> fillFaces; - mutable std::vector<MVertex*> _ordered; - mutable std::vector<double> _coords; - mutable std::map<MVertex*, int> _mapV; - mutable ANNkd_tree *uv_kdtree; - mutable ANNkd_tree *kdtree; - void buildOct() const ; - void buildAllNodes() const; - - //different type of parametrizations - void parametrize(iterationStep, typeOfMapping) const; - bool parametrize_conformal(int iter, MVertex *v1, MVertex *v2) const; - bool parametrize_conformal_spectral() const; - - //check for parametrizations - bool checkOrientation(int iter, bool moveBoundaries=false) const; - bool checkOverlap(std::vector<MVertex *> &vert) const; - bool one2OneMap() const; - void convexBoundary(double nTot) const; - double checkAspectRatio() const; - - //tools for filling interior holes of surfaces - void fillNeumannBCS() const; - void fillNeumannBCS_Plane() const; - void orientFillTris(std::list<MTriangle*> loopfillTris)const; - void printFillTris()const; - - void computeNormals () const; - void getBoundingEdges(); - void getUniqueEdges(std::set<GEdge*> &_unique); - void computeALoop(std::set<GEdge*> &_unique, std::list<GEdge*> &); - - virtual double locCurvature(MTriangle *t, double u, double v) const; - - double getSizeH() const; - double getSizeBB(const std::list<GEdge* > &elist) const; - bool trivial() const; - void printStuff(int iNewton=0) const; - void computeHessianMapping() const; - - public: - GFaceCompound(GModel *m, int tag, std::list<GFace*> &compound, - std::list<GEdge*> &U0, typeOfCompound typ = HARMONIC_CIRCLE, - int allowPartition=1); - GFaceCompound(GModel *m, int tag, std::list<GFace*> &compound, - std::list<GEdge*> &U0, std::list<GEdge*> &V0, - std::list<GEdge*> &U1, std::list<GEdge*> &V1, - typeOfCompound typ = HARMONIC_CIRCLE, - int allowPartition=1); - ~GFaceCompound(); - virtual void deleteMesh(); - - Range<double> parBounds(int i) const - { return trivial() ? (*(_compound.begin()))->parBounds(i) : Range<double>(-1, 1); } - - using GFace::point; - GPoint point(double par1, double par2) const; - GPoint pointInRemeshedOctree(double par1, double par2) const; - SPoint2 parFromPoint(const SPoint3 &p, bool onSurface=true) const; - SPoint2 parFromVertex(MVertex *v) const; - virtual Pair<SVector3,SVector3> firstDer(const SPoint2 ¶m) const; - virtual void secondDer(const SPoint2 &, SVector3 *, SVector3 *, SVector3 *) const; - virtual GEntity::GeomType geomType() const { return CompoundSurface; } - ModelType getNativeType() const { return GmshModel; } - void * getNativePtr() const { return 0; } - void getTriangle(double u, double v, GFaceCompoundTriangle **lt, - double &_u, double &_v) const; - virtual SPoint2 getCoordinates(MVertex *v) const; - virtual double curvatureMax(const SPoint2 ¶m) const; - virtual double curvatures(const SPoint2 ¶m, SVector3 *dirMax, SVector3 *dirMin, - double *curvMax, double *curvMin) const; - bool parametrize() const; - void computeNormals(std::map<MVertex*, SVector3> &normals) const; - void coherenceNormals(); - void coherencePatches() const; - virtual int genusGeom () const; - virtual bool checkTopology() const; - - virtual std::list<GFace*> getCompounds() const { return _compound; } - typeOfCompound getTypeOfCompound() { return _toc;} - int getNbSplit() const { return nbSplit; } - int allowPartition() const{ return _allowPartition; } - void setType(typeOfIsomorphism type){ _type=type;} - - // useful for mesh generators - GPoint intersectionWithCircle (const SVector3 &n1, const SVector3 &n2, const SVector3 &p, - const double &d, double uv[2]) const; - - void deleteInternals(); - - private: - void _deleteInternals(); - mutable typeOfCompound _toc; - mutable typeOfMapping _mapping; - mutable typeOfIsomorphism _type; - int _allowPartition; -}; - -#else - -template<class scalar> class linearSystem; -class GFaceCompound : public GFace { - public: - typedef enum {ITERU=0,ITERV=1,ITERD=2} iterationStep; - typedef enum {HARMONIC_CIRCLE=0, CONFORMAL_SPECTRAL=1, RADIAL_BASIS=2, HARMONIC_PLANE=3, - CONVEX_CIRCLE=4,CONVEX_PLANE=5, HARMONIC_SQUARE=6, CONFORMAL_FE=7} typeOfCompound; - typedef enum {HARMONIC=0,CONFORMAL=1, RBF=2, CONVEX=3} typeOfMapping; - typedef enum {UNITCIRCLE, MEANPLANE, SQUARE, ALREADYFIXED,SPECTRAL, FE} typeOfIsomorphism; - GFaceCompound(GModel *m, int tag, std::list<GFace*> &compound, - std::list<GEdge*> &U0, typeOfCompound typ = HARMONIC_CIRCLE, - int allowPartition=1) - : GFace(m, tag) - { - Msg::Error("Gmsh has to be compiled with Solver and ANN support to use GFaceCompounds"); - } - GFaceCompound(GModel *m, int tag, std::list<GFace*> &compound, - std::list<GEdge*> &U0, std::list<GEdge*> &V0, - std::list<GEdge*> &U1, std::list<GEdge*> &V1, - typeOfCompound typ = HARMONIC_CIRCLE, - int allowPartition=1) - : GFace(m, tag) - { - Msg::Error("Gmsh has to be compiled with Solver and ANN support to use GFaceCompounds"); - } - virtual ~GFaceCompound() {} - virtual void deleteMesh() {} - using GFace::point; - GPoint point(double par1, double par2) const { return GPoint(); } - Pair<SVector3, SVector3> firstDer(const SPoint2 ¶m) const - { - return Pair<SVector3, SVector3>(SVector3(0, 0, 0), SVector3(0, 0, 0)); - } - SPoint2 parFromVertex(MVertex *v) const { return SPoint2(); } - void secondDer(const SPoint2 ¶m, - SVector3 *dudu, SVector3 *dvdv, SVector3 *dudv) const{} - virtual SPoint2 getCoordinates(MVertex *v) const { return SPoint2(); } - bool parametrize() const {return false;} - virtual std::list<GFace*> getCompounds() const { return std::list<GFace*>(); } - GPoint intersectionWithCircle (const SVector3 &n1, const SVector3 &n2, const SVector3 &p, - const double &d, double uv[2]) const { return GPoint(); } - int allowPartition() const{ return 1; } - void deleteInternals(){} -}; - -#endif - -#endif diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp index eaf83e780824c6d8935ff8f99897e3fcfb398cab..e898cfe9c936740602b96705a09c0a0e32de892d 100644 --- a/Geo/GModel.cpp +++ b/Geo/GModel.cpp @@ -12,8 +12,6 @@ #include "GModel.h" #include "GModelIO_GEO.h" #include "GModelIO_OCC.h" -#include "GFaceCompound.h" -#include "GEdgeCompound.h" #include "MPoint.h" #include "MLine.h" #include "MTriangle.h" @@ -1552,8 +1550,8 @@ static void _associateEntityWithElementVertices(GEntity *ge, std::vector<T*> &el void GModel::_createGeometryOfDiscreteEntities(bool force) { - if (CTX::instance()->meshDiscrete){ - createTopologyFromMeshNew (); + if(CTX::instance()->meshDiscrete){ + createTopologyFromMeshNew(); exportDiscreteGEOInternals(); } if (force || CTX::instance()->meshDiscrete){ @@ -2052,7 +2050,6 @@ int GModel::removeDuplicateMeshVertices(double tolerance) return num; } - static void recurConnectMElementsByMFace(const MFace &f, std::multimap<MFace, MElement*, Less_Face> &e2f, std::set<MElement*> &group, @@ -2077,29 +2074,8 @@ static void recurConnectMElementsByMFace(const MFace &f, } } } - //printf("group pf %d elements found\n",(int)group.size()); } -/* -static void recurConnectMElementsByMFaceOld(const MFace &f, - std::multimap<MFace, MElement*, Less_Face> &e2f, - std::set<MElement*> &group, - std::set<MFace, Less_Face> &touched, - int recur_level) -{ - if (touched.find(f) != touched.end()) return; - touched.insert(f); - for (std::multimap<MFace, MElement*, Less_Face>::iterator it = e2f.lower_bound(f); - it != e2f.upper_bound(f); ++it){ - group.insert(it->second); - for (int i = 0; i < it->second->getNumFaces(); ++i){ - recurConnectMElementsByMFace(it->second->getFace(i), e2f, group, touched, - recur_level+1); - } - } -} -*/ - static int connectedVolumes(std::vector<MElement*> &elements, std::vector<std::vector<MElement*> > ®s) { @@ -2152,7 +2128,6 @@ static int connectedSurfaces(std::vector<MElement*> &elements, std::set<MElement*> group; std::set<MEdge, Less_Edge> touched; recurConnectMElementsByMEdge(e2e.begin()->first, e2e, group, touched); - //printf("group pe %d elements found\n",(int)group.size()); std::vector<MElement*> temp; temp.insert(temp.begin(), group.begin(), group.end()); faces.push_back(temp); @@ -2500,495 +2475,19 @@ void GModel::makeDiscreteFacesSimplyConnected() Msg::Debug("Done making discrete faces simply connected"); } -void GModel::createTopologyFromMesh(int ignoreHoles) +void GModel::createTopologyFromMesh() { Msg::StatusBar(true, "Creating topology from mesh..."); double t1 = Cpu(); removeDuplicateMeshVertices(CTX::instance()->geom.tolerance); makeDiscreteRegionsSimplyConnected(); makeDiscreteFacesSimplyConnected(); - - // TEST !!!!!!!! - if (CTX::instance()->meshDiscrete){ - createTopologyFromMeshNew (); - exportDiscreteGEOInternals(); - double t2 = Cpu(); - Msg::StatusBar(true, "Done creating topology from mesh (%g s)", t2 - t1); - return; - } - - // create topology for all discrete regions - std::vector<discreteRegion*> discRegions; - for(riter it = firstRegion(); it != lastRegion(); it++) - if((*it)->geomType() == GEntity::DiscreteVolume) - discRegions.push_back((discreteRegion*) *it); - createTopologyFromRegions(discRegions); - - // create topology for all discrete faces - std::vector<discreteFace*> discFaces; - for(fiter it = firstFace(); it != lastFace(); it++) - if((*it)->geomType() == GEntity::DiscreteSurface) - discFaces.push_back((discreteFace*) *it); - createTopologyFromFaces(discFaces, ignoreHoles); - - //create old format (necessary e.g. for old-style extruded boundary layers) + createTopologyFromMeshNew(); exportDiscreteGEOInternals(); - - // FIXME: this whole thing will disappear, but for now we need this to make - // old compounds work: - if(!CTX::instance()->meshDiscrete) - _createGeometryOfDiscreteEntities(true); - double t2 = Cpu(); - Msg::StatusBar(true, "Done creating topology from mesh (%g s)", t2 - t1); } -void GModel::createTopologyFromRegions(std::vector<discreteRegion*> &discRegions) -{ - Msg::Debug("Creating topology from regions..."); - - // find boundary mesh faces of each discrete region and put them in - // map_faces, which associates each MFace with the tags of the - // adjacent regions - std::map<MFace, std::vector<int>, Less_Face > map_faces; - for (std::vector<discreteRegion*>::iterator it = discRegions.begin(); - it != discRegions.end(); it++) - (*it)->findFaces(map_faces); - - // get currently defined discrete faces - std::vector<discreteFace*> discFaces; - for(fiter it = firstFace(); it != lastFace(); it++) - if((*it)->geomType() == GEntity::DiscreteSurface) - discFaces.push_back((discreteFace*) *it); - - // create reverse map storing for each discrete region the list of - // discrete faces on its boundary - std::map<int, std::set<int> > region2Faces; - std::set<MVertex*> touched; - - while (!map_faces.empty()){ - - Msg::Debug("... %d mesh faces left to process", map_faces.size()); - - // get mesh faces with identical region connections (i.e., a part - // of region boundaries that can be later defined as a discrete - // face) - std::set<MFace, Less_Face> myFaces; - std::vector<int> tagRegions = map_faces.begin()->second; - myFaces.insert(map_faces.begin()->first); - map_faces.erase(map_faces.begin()); - std::map<MFace, std::vector<int>, Less_Face>::iterator itmap = map_faces.begin(); - while (itmap != map_faces.end()){ - std::vector<int> tagRegions2 = itmap->second; - if (tagRegions2 == tagRegions){ - myFaces.insert(itmap->first); - map_faces.erase(itmap++); - } - else - itmap++; - } - - // if the mesh already contains discrete faces, check if the - // candidate discrete face does contain any of those; if not, - // create a new discreteFace. Then create populate the - // region2Faces map that associates for each region the (old or - // new) boundary discrete faces - for (std::vector<discreteFace*>::iterator itF = discFaces.begin(); - itF != discFaces.end(); itF++){ - - bool candidate = true; - for (unsigned int i = 0; i < (*itF)->getNumMeshElements(); i++){ - MFace mf = (*itF)->getMeshElement(i)->getFace(0); - std::set<MFace, Less_Face>::iterator itset = myFaces.find(mf); - if (itset == myFaces.end()){ - candidate = false; - break; - } - } - - if(candidate){ - std::set<int> tagFaces; - tagFaces.insert((*itF)->tag()); - for (unsigned int i = 0; i < (*itF)->getNumMeshElements(); i++){ - MFace mf = (*itF)->getMeshElement(i)->getFace(0); - std::set<MFace, Less_Face>::iterator itset = myFaces.find(mf); - myFaces.erase(itset); - } - for(std::vector<int>::iterator itReg = tagRegions.begin(); - itReg != tagRegions.end(); itReg++) { - std::map<int, std::set<int> >::iterator it = region2Faces.find(*itReg); - if (it == region2Faces.end()) - region2Faces.insert(std::make_pair(*itReg, tagFaces)); - else{ - std::set<int> allFaces = it->second; - allFaces.insert(tagFaces.begin(), tagFaces.end()); - it->second = allFaces; - } - } - } - } - - // create new discrete face - if(myFaces.size()){ - int numF = getMaxElementaryNumber(2) + 1; - discreteFace *f = new discreteFace(this, numF); - add(f); - discFaces.push_back(f); - std::set<MVertex*> myVertices; - for(std::set<MFace, Less_Face>::iterator it = myFaces.begin(); - it != myFaces.end(); it++){ - std::vector<MVertex*> verts(it->getNumVertices()); - for(int i = 0; i < it->getNumVertices(); i++){ - verts[i] = it->getVertex(i); - if(verts[i]->onWhat() && verts[i]->onWhat()->dim() == 3){ - if(touched.find(verts[i]) != touched.end()){ - myVertices.insert(verts[i]); - verts[i]->setEntity(f); - touched.insert(verts[i]); - } - } - } - if(verts.size() == 4) - f->quadrangles.push_back(new MQuadrangle(verts)); - else - f->triangles.push_back(new MTriangle(verts)); - } - f->mesh_vertices.insert(f->mesh_vertices.begin(), - myVertices.begin(), myVertices.end()); - - for (std::vector<int>::iterator itReg = tagRegions.begin(); - itReg != tagRegions.end(); itReg++) { - - // delete mesh vertices of new edge from adjacent regions - GRegion *dReg = getRegionByTag(*itReg); - for (std::set<MVertex*>::iterator itv = myVertices.begin(); - itv != myVertices.end(); itv++) { - std::vector<MVertex*>::iterator itve = - std::find(dReg->mesh_vertices.begin(), dReg->mesh_vertices.end(), *itv); - if (itve != dReg->mesh_vertices.end()) dReg->mesh_vertices.erase(itve); - } - - // fill region2Faces with the new face - std::map<int, std::set<int> >::iterator r2f = region2Faces.find(*itReg); - if (r2f == region2Faces.end()){ - std::set<int> tagFaces; - tagFaces.insert(numF); - region2Faces.insert(std::make_pair(*itReg, tagFaces)); - } - else{ - std::set<int> tagFaces = r2f->second; - tagFaces.insert(numF); - r2f->second = tagFaces; - } - } - } - } - - // set boundary faces for each region - for (std::vector<discreteRegion*>::iterator it = discRegions.begin(); - it != discRegions.end(); it++){ - std::map<int, std::set<int> >::iterator itr = region2Faces.find((*it)->tag()); - if (itr != region2Faces.end()){ - std::set<int> bcFaces = itr->second; - (*it)->setBoundFaces(bcFaces); - } - } - - Msg::Debug("Done creating topology from regions"); -} - -void GModel::createTopologyFromFaces(std::vector<discreteFace*> &discFaces, int ignoreHoles) -{ - Msg::Debug("Creating topology from faces..."); - - // find boundary mesh edges of each discrete face and put them in - // map_edges, which associates each MEdge with the tags of the - // adjacent faces - std::map<MEdge, std::vector<int>, Less_Edge > map_edges; - for (std::vector<discreteFace*>::iterator it = discFaces.begin(); - it != discFaces.end(); it++) - (*it)->findEdges(map_edges); - - // return if no boundary edges (torus, sphere, ...) - if (map_edges.empty()) return; - - // get currently defined discrete edges - std::vector<discreteEdge*> discEdges; - for(eiter it = firstEdge(); it != lastEdge(); it++){ - if((*it)->geomType() == GEntity::DiscreteCurve) - discEdges.push_back((discreteEdge*) *it); - } - - // create reverse map storing for each discrete face the list of - // discrete edges on its boundary - std::map<int, std::vector<int> > face2Edges; - - while (!map_edges.empty()){ - - Msg::Debug("... %d mesh edges left to process", map_edges.size()); - - // get mesh edges with identical face connections (i.e., a part of - // face boundaries that can be later defined as a discrete edge) - std::set<MEdge, Less_Edge> myEdges; - std::vector<int> tagFaces = map_edges.begin()->second; - myEdges.insert(map_edges.begin()->first); - map_edges.erase(map_edges.begin()); - std::map<MEdge, std::vector<int>, Less_Edge>::iterator itmap = map_edges.begin(); - while (itmap != map_edges.end()){ - std::vector<int> tagFaces2 = itmap->second; - if (tagFaces2 == tagFaces){ - myEdges.insert(itmap->first); - map_edges.erase(itmap++); - } - else - itmap++; - } - - // if the mesh already contains discrete edges, check if the - // candidate discrete edge does contain any of those; if not, - // create a discreteEdge. Then populate the face2Edges map that - // associates for each face its boundary discrete edges - for (std::vector<discreteEdge*>::iterator itE = discEdges.begin(); - itE != discEdges.end(); itE++){ - - bool candidate = true; - for (unsigned int i = 0; i < (*itE)->getNumMeshElements(); i++){ - MEdge me = (*itE)->getMeshElement(i)->getEdge(0); - std::set<MEdge, Less_Edge >::iterator itset = myEdges.find(me); - if (itset == myEdges.end()){ - candidate = false; - break; - } - } - - if (candidate){ - std::vector<int> tagEdges; - tagEdges.push_back((*itE)->tag()); - for (unsigned int i = 0; i < (*itE)->getNumMeshElements(); i++){ - MEdge me = (*itE)->getMeshElement(i)->getEdge(0); - std::set<MEdge, Less_Edge >::iterator itset = myEdges.find(me); - if (itset != myEdges.end()) myEdges.erase(itset); - } - for (std::vector<int>::iterator itFace = tagFaces.begin(); - itFace != tagFaces.end(); itFace++) { - std::map<int, std::vector<int> >::iterator it = face2Edges.find(*itFace); - if (it == face2Edges.end()) - face2Edges.insert(std::make_pair(*itFace, tagEdges)); - else{ - std::vector<int> allEdges = it->second; - allEdges.insert(allEdges.begin(), tagEdges.begin(), tagEdges.end()); - it->second = allEdges; - } - } - } - } - - std::vector<std::vector<MEdge> > boundaries; - int nbBounds = connectedSurfaceBoundaries(myEdges, boundaries); - - //EMI RBF fix - if (ignoreHoles && nbBounds > 0){ - int index = 0; - unsigned boundSize = 0; - for (int ib = 0; ib < nbBounds; ib++){ - if (boundaries[ib].size() > boundSize){ - boundSize = boundaries[ib].size() ; - index = ib; - } - } - std::vector<std::vector<MEdge> > new_boundaries; - new_boundaries.push_back(boundaries[index]); - boundaries = new_boundaries; - } - - // create new discrete edges - for (unsigned ib = 0; ib < boundaries.size(); ib++){ - int numE = getMaxElementaryNumber(1) + 1; - discreteEdge *e = new discreteEdge(this, numE, 0, 0); - add(e); - discEdges.push_back(e); - std::set<MVertex*> allV; - for(unsigned int i = 0; i < boundaries[ib].size(); i++) { - MVertex *v0 = boundaries[ib][i].getVertex(0); - MVertex *v1 = boundaries[ib][i].getVertex(1); - e->lines.push_back(new MLine(v0, v1)); - allV.insert(v0); - allV.insert(v1); - v0->setEntity(e); - v1->setEntity(e); - } - e->mesh_vertices.insert(e->mesh_vertices.begin(), allV.begin(), allV.end()); - for (std::vector<int>::iterator itFace = tagFaces.begin(); - itFace != tagFaces.end(); itFace++) { - // delete mesh vertices of new edge from adjacent faces - GFace *dFace = getFaceByTag(*itFace); - for (std::set<MVertex*>::iterator itv = allV.begin(); itv != allV.end(); itv++) { - std::vector<MVertex*>::iterator itve = - std::find(dFace->mesh_vertices.begin(), dFace->mesh_vertices.end(), *itv); - if (itve != dFace->mesh_vertices.end()) dFace->mesh_vertices.erase(itve); - } - // fill face2Edges with the new edge - std::map<int, std::vector<int> >::iterator f2e = face2Edges.find(*itFace); - if (f2e == face2Edges.end()){ - std::vector<int> tagEdges; - tagEdges.push_back(numE); - face2Edges.insert(std::make_pair(*itFace, tagEdges)); - } - else{ - std::vector<int> tagEdges = f2e->second; - tagEdges.push_back(numE); - f2e->second = tagEdges; - } - } - } - - } - - // set boundary edges for each face - for (std::vector<discreteFace*>::iterator it = discFaces.begin(); - it != discFaces.end(); it++){ - std::map<int, std::vector<int> >::iterator ite = face2Edges.find((*it)->tag()); - if (ite != face2Edges.end()){ - std::vector<int> bcEdges = ite->second; - (*it)->setBoundEdges(bcEdges); - } - } - - Msg::Debug("Done creating topology from faces"); - - Msg::Debug("Creating topology for %d edges...", discEdges.size()); - - // for each discreteEdge, create topology - //KH std::map<GFace*, std::map<MVertex*, MVertex*, std::less<MVertex*> > > face2Vert; - //KH std::map<GRegion*, std::map<MVertex*, MVertex*, std::less<MVertex*> > > region2Vert; - //KH face2Vert.clear(); - //KH region2Vert.clear(); - - std::map<MVertex*,MVertex*> old2new; - for (std::vector<discreteEdge*>::iterator it = discEdges.begin(); - it != discEdges.end(); it++){ - (*it)->createTopo(); - //KH (*it)->parametrize(face2Vert, region2Vert,old2new); - (*it)->parametrize(old2new); - } - - // fill edgeLoops of Faces or correct sign of l_edges - // for (std::vector<discreteFace*>::iterator itF = discFaces.begin(); - // itF != discFaces.end(); itF++){ - // //EMI, TODO - // std::list<GEdgeLoop> edgeLoops = (*itF)->edgeLoops; - // edgeLoops.clear(); - // GEdgeLoop el((*itF)->edges()); - // edgeLoops.push_back(el); - // } - - // we need to recreate all mesh elements because some mesh vertices - // might have been changed during the parametrization process - // (MVertices became MEdgeVertices) - - //KH for (std::map<GFace*, std::map<MVertex*, MVertex*, std::less<MVertex*> > >::iterator - //KH iFace = face2Vert.begin(); iFace != face2Vert.end(); iFace++){ - //KH std::map<MVertex*, MVertex*, std::less<MVertex*> > old2new = iFace->second; - //KH GFace *gf = iFace->first; - - std::set<GFace*,GEntityLessThan>::iterator fIter = faces.begin(); - for (;fIter!=faces.end();++fIter) { - - GFace* gf = *fIter; - - std::vector<MTriangle*> newTriangles; - std::vector<MQuadrangle*> newQuadrangles; - for (unsigned int i = 0; i < gf->getNumMeshElements(); ++i){ - MElement *e = gf->getMeshElement(i); - std::vector<MVertex *> v; - e->getVertices(v); - for (unsigned int j = 0; j < v.size(); j++){ - // std::map<MVertex*, MVertex*, std::less<MVertex*> >::iterator - // itmap = old2new.find(v[j]); - std::map<MVertex*,MVertex*>::iterator itmap = old2new.find(v[j]); - if (itmap != old2new.end()) v[j] = itmap->second; - } - MElementFactory factory; - MElement *e2 = factory.create(e->getTypeForMSH(), v, e->getNum(), - e->getPartition()); - switch(e2->getType()){ - case TYPE_TRI: newTriangles.push_back((MTriangle*)e2); break; - case TYPE_QUA: newQuadrangles.push_back((MQuadrangle*)e2); break; - } - } - gf->deleteVertexArrays(); - for(unsigned int i = 0; i < gf->triangles.size(); i++) delete gf->triangles[i]; - for(unsigned int i = 0; i < gf->quadrangles.size(); i++) delete gf->quadrangles[i]; - gf->triangles = newTriangles; - gf->quadrangles = newQuadrangles; - } - - // for (std::map<GRegion*, std::map<MVertex*, MVertex*, std::less<MVertex*> > >::iterator - // iRegion = region2Vert.begin(); iRegion != region2Vert.end(); iRegion++){ - // std::map<MVertex*, MVertex*, std::less<MVertex*> > old2new = iRegion->second; - // GRegion *gr = iRegion->first; - for (std::set<GRegion*,GEntityLessThan>::iterator rIter = regions.begin(); - rIter!=regions.end();++rIter) { - - GRegion* gr = *rIter; - - std::vector<MTetrahedron*> newTetrahedra; - std::vector<MHexahedron*> newHexahedra; - std::vector<MPrism*> newPrisms; - std::vector<MPyramid*> newPyramids; - std::vector<MTrihedron*> newTrihedra; - for (unsigned int i = 0; i < gr->getNumMeshElements(); ++i){ - MElement *e = gr->getMeshElement(i); - std::vector<MVertex *> v; - e->getVertices(v); - for (unsigned int j = 0; j < v.size(); j++){ - // std::map<MVertex*, MVertex*, std::less<MVertex*> >::iterator - // itmap = old2new.find(v[j]); - // if (itmap != old2new.end()) - // v[j] = itmap->second; - std::map<MVertex*,MVertex*>::iterator itmap = old2new.find(v[j]); - if (itmap != old2new.end()) v[j] = itmap->second; - - } - MElementFactory factory; - MElement *e2 = factory.create(e->getTypeForMSH(), v, e->getNum(), - e->getPartition()); - switch(e2->getType()){ - case TYPE_TET: newTetrahedra.push_back((MTetrahedron*)e2); break; - case TYPE_HEX: newHexahedra.push_back((MHexahedron*)e2); break; - case TYPE_PRI: newPrisms.push_back((MPrism*)e2); break; - case TYPE_PYR: newPyramids.push_back((MPyramid*)e2); break; - case TYPE_TRIH: newTrihedra.push_back((MTrihedron*)e2); break; - } - } - gr->deleteVertexArrays(); - for(unsigned int i = 0; i < gr->tetrahedra.size(); i++) delete gr->tetrahedra[i]; - for(unsigned int i = 0; i < gr->hexahedra.size(); i++) delete gr->hexahedra[i]; - for(unsigned int i = 0; i < gr->prisms.size(); i++) delete gr->prisms[i]; - for(unsigned int i = 0; i < gr->pyramids.size(); i++) delete gr->pyramids[i]; - for(unsigned int i = 0; i < gr->trihedra.size(); i++) delete gr->trihedra[i]; - gr->tetrahedra = newTetrahedra; - gr->hexahedra = newHexahedra; - gr->prisms = newPrisms; - gr->pyramids = newPyramids; - gr->trihedra = newTrihedra; - } - - // -- now correct periodicity information - - std::set<GFace*,GEntityLessThan>::iterator gfIter = faces.begin(); - for (;gfIter!=faces.end();++gfIter) (*gfIter)->updateVertices(old2new); - - std::set<GEdge*,GEntityLessThan>::iterator geIter = edges.begin(); - for (;geIter!=edges.end();++geIter) (*geIter)->updateVertices(old2new); - - std::set<GVertex*,GEntityLessThan>::iterator gvIter = vertices.begin(); - for (;gvIter!=vertices.end();++gvIter) (*gvIter)->updateVertices(old2new); - - Msg::Debug("Done creating topology for edges"); -} - void makeSimplyConnected(std::map<int, std::vector<MElement*> > elements[11]) { //only for tetras and triangles @@ -3152,7 +2651,6 @@ void makeSimplyConnected(std::map<int, std::vector<MElement*> > elements[11]) GModel *GModel::buildCutGModel(gLevelset *ls, bool cutElem, bool saveTri) { - if (saveTri) CTX::instance()->mesh.saveTri = 1; else @@ -3222,36 +2720,6 @@ int GModel::readGEO(const std::string &name) return true; } -GEdge* GModel::addCompoundEdge(std::vector<GEdge*> edges, int num) -{ - if (num < 0) num = getMaxElementaryNumber(1) + 1; - GEdgeCompound *gec = new GEdgeCompound(this, num, edges); - add(gec); - return gec; -} - -GFace* GModel::addCompoundFace(std::vector<GFace*> faces, int param, int split, int num) -{ -#if defined(HAVE_SOLVER) - if (num < 0) num = getMaxElementaryNumber(2) + 1; - std::list<GFace*> faces_comp(faces.begin(), faces.end()); - std::list<GEdge*> U0; - GFaceCompound::typeOfCompound typ = GFaceCompound::HARMONIC_CIRCLE; - if (param == 1) typ = GFaceCompound::CONFORMAL_SPECTRAL; - if (param == 2) typ = GFaceCompound::RADIAL_BASIS; - if (param == 3) typ = GFaceCompound::HARMONIC_PLANE; - if (param == 4) typ = GFaceCompound::CONVEX_CIRCLE; - if (param == 5) typ = GFaceCompound::CONVEX_PLANE; - if (param == 6) typ = GFaceCompound::HARMONIC_SQUARE; - if (param == 7) typ = GFaceCompound::CONFORMAL_FE; - GFaceCompound *gfc = new GFaceCompound(this, num, faces_comp, U0, typ, split); - add(gfc); - return gfc; -#else - return 0; -#endif -} - void GModel::setPhysicalNumToEntitiesInBox(int EntityDimension, int PhysicalNumber, SBoundingBox3d box) { @@ -3701,47 +3169,3 @@ void GModel::computeHomology() #endif } -void GModel::setCompoundVisibility() -{ - // force visibility status of compound entities - - for(eiter eit = firstEdge(); eit != lastEdge(); eit++){ - GEdge *ge = *eit; - if (ge->getCompound()){ - if(CTX::instance()->geom.hideCompounds) { - // use visibility info of compound edge if this edge belongs to it - ge->setVisibility(0, true); - bool val2 = ge->getCompound()->getVisibility(); - if(ge->getCompound()->getBeginVertex()) - ge->getCompound()->getBeginVertex()->setVisibility(val2); - if(ge->getCompound()->getEndVertex()) - ge->getCompound()->getEndVertex()->setVisibility(val2); - } - else { - ge->setVisibility(1, true); - } - } - } - - for(fiter fit = firstFace(); fit != lastFace(); fit++){ - GFace *gf = *fit; - if (gf->getCompound()){ - if(CTX::instance()->geom.hideCompounds) { - gf->setVisibility(0, true); - std::list<GEdge*> edgesComp = gf->getCompound()->edges(); - bool val2 = gf->getCompound()->getVisibility(); - // show edges of the compound surface - for (std::list<GEdge*>::iterator it = edgesComp.begin(); it != edgesComp.end(); ++it) { - if((*it)->getCompound()) - (*it)->getCompound()->setVisibility(val2, true); - else - (*it)->setVisibility(val2, true); - } - } - else { - gf->setVisibility(1, true); - } - } - } - -} diff --git a/Geo/GModel.h b/Geo/GModel.h index d14b5ea8fab51a9afd6aa67f8925bece978fc693..45a7b0077986d3cd3c0a6735bdeb7db2f7784821 100644 --- a/Geo/GModel.h +++ b/Geo/GModel.h @@ -231,9 +231,6 @@ class GModel { char getVisibility(){ return _visible; } void setVisibility(char val){ _visible = val; } - // set the visibility of compound entities - void setCompoundVisibility(); - // get the number of entities in this model int getNumRegions() const { return regions.size(); } int getNumFaces() const { return faces.size(); } @@ -279,9 +276,6 @@ class GModel { void remove(int dim, int tag, bool recursive=false); void remove(const std::vector<std::pair<int, int> > &dimTags, bool recursive=false); - GEdge *addCompoundEdge(std::vector<GEdge*> edges, int num=-1); - GFace *addCompoundFace(std::vector<GFace*> faces, int type, int split, int num=-1); - // snap vertices on model edges by using geometry tolerance void snapVertices(); @@ -446,9 +440,7 @@ class GModel { // create topology from mesh void createTopologyFromMeshNew(); - void createTopologyFromMesh(int ignoreHoles=0); - void createTopologyFromRegions(std::vector<discreteRegion*> &discRegions); - void createTopologyFromFaces(std::vector<discreteFace*> &pFaces, int ignoreHoles=0); + void createTopologyFromMesh(); void makeDiscreteRegionsSimplyConnected(); void makeDiscreteFacesSimplyConnected(); diff --git a/Geo/GModelIO_GEO.cpp b/Geo/GModelIO_GEO.cpp index 003a2ef796a4356954087a70844ab1c38935af2c..be3e5cc6a3b698c19cc978aef5e6a6e2a3317053 100644 --- a/Geo/GModelIO_GEO.cpp +++ b/Geo/GModelIO_GEO.cpp @@ -16,9 +16,6 @@ #include "ListUtils.h" #include "gmshVertex.h" #include "gmshFace.h" -#include "GFaceCompound.h" -#include "GEdgeCompound.h" -#include "GRegionCompound.h" #include "gmshEdge.h" #include "gmshRegion.h" #include "Field.h" @@ -308,22 +305,6 @@ bool GEO_Internals::addNurbs(int &tag, const std::vector<int> &vertexTags, return true; } -bool GEO_Internals::addCompoundLine(int &tag, const std::vector<int> &edgeTags) -{ - if(tag >= 0 && FindCurve(tag)){ - Msg::Error("GEO edge with tag %d already exists", tag); - return false; - } - if(tag < 0) tag = getMaxTag(1) + 1; - Curve *c = CreateCurve(tag, MSH_SEGM_COMPOUND, 1, NULL, NULL, -1, -1, 0., 1.); - c->compound = edgeTags; - EndCurve(c); - Tree_Add(Curves, &c); - CreateReversedCurve(c); - _changed = true; - return true; -} - bool GEO_Internals::addLineLoop(int &tag, const std::vector<int> &edgeTags) { if(tag >= 0 && FindEdgeLoop(tag)){ @@ -430,27 +411,6 @@ bool GEO_Internals::addSurfaceFilling(int &tag, const std::vector<int> &wireTags return true; } -bool GEO_Internals::addCompoundSurface(int &tag, const std::vector<int> &faceTags, - std::vector<int> edgeTags[4]) -{ - if(tag >= 0 && FindSurface(tag)){ - Msg::Error("GEO face with tag %d already exists", tag); - return false; - } - if(tag < 0) tag = getMaxTag(2) + 1; - - Surface *s = CreateSurface(tag, MSH_SURF_COMPOUND); - s->compound = faceTags; - if(edgeTags){ - for(int i = 0; i < 4; i++) - s->compoundBoundary[i] = edgeTags[i]; - } - SetSurfaceGeneratrices(s, 0); - Tree_Add(Surfaces, &s); - _changed = true; - return true; -} - bool GEO_Internals::addSurfaceLoop(int &tag, const std::vector<int> &faceTags) { if(tag >= 0 && FindSurfaceLoop(tag)){ @@ -492,21 +452,6 @@ bool GEO_Internals::addVolume(int &tag, const std::vector<int> &shellTags) return true; } -bool GEO_Internals::addCompoundVolume(int &tag, const std::vector<int> ®ionTags) -{ - if(tag >= 0 && FindVolume(tag)){ - Msg::Error("GEO region with tag %d already exists", tag); - return false; - } - if(tag < 0) tag = getMaxTag(3) + 1; - - Volume *v = CreateVolume(tag, MSH_VOLUME_COMPOUND); - v->compound = regionTags; - Tree_Add(Volumes, &v); - _changed = true; - return true; -} - bool GEO_Internals::_extrude(int mode, const std::vector<std::pair<int, int> > &inDimTags, double x, double y, double z, @@ -1168,11 +1113,7 @@ void GEO_Internals::synchronize(GModel *model) List_Read(curves, i, &c); if(c->Num >= 0){ GEdge *e = model->getEdgeByTag(c->Num); - if(!e && c->Typ == MSH_SEGM_COMPOUND){ - Msg::Debug("Postpone creation of compound edge %d until all others " - "have been created", c->Num); - } - else if(!e && c->beg && c->end){ + if(!e && c->beg && c->end){ e = new gmshEdge(model, c, model->getVertexByTag(c->beg->Num), model->getVertexByTag(c->end->Num)); model->add(e); @@ -1182,8 +1123,7 @@ void GEO_Internals::synchronize(GModel *model) model->add(e); } else{ - if(e->getNativeType() == GEntity::GmshModel && - c->Typ != MSH_SEGM_COMPOUND){ + if(e->getNativeType() == GEntity::GmshModel){ if(c->beg && c->end) ((gmshEdge*)e)->resetNativePtr(c, model->getVertexByTag(c->beg->Num), model->getVertexByTag(c->end->Num)); @@ -1195,30 +1135,6 @@ void GEO_Internals::synchronize(GModel *model) if(c->degenerated) e->setTooSmall(true); } } - // now generate the compound curves - for(int i = 0; i < List_Nbr(curves); i++){ - Curve *c; - List_Read(curves, i, &c); - if(c->Num >= 0){ - GEdge *e = model->getEdgeByTag(c->Num); - if(!e && c->Typ == MSH_SEGM_COMPOUND){ - std::vector<GEdge*> comp; - for(unsigned int j = 0; j < c->compound.size(); j++){ - GEdge *ge = model->getEdgeByTag(c->compound[j]); - if(ge) comp.push_back(ge); - } - e = new GEdgeCompound(model, c->Num, comp); - e->meshAttributes.method = c->Method; - e->meshAttributes.nbPointsTransfinite = c->nbPointsTransfinite; - e->meshAttributes.typeTransfinite = c->typeTransfinite; - e->meshAttributes.coeffTransfinite = c->coeffTransfinite; - e->meshAttributes.extrude = c->Extrude; - e->meshAttributes.reverseMesh = c->ReverseMesh; - model->add(e); - if(c->degenerated) e->setTooSmall(true); - } - } - } List_Delete(curves); } @@ -1228,55 +1144,12 @@ void GEO_Internals::synchronize(GModel *model) Surface *s; List_Read(surfaces, i, &s); GFace *f = model->getFaceByTag(s->Num); - if(!f && s->Typ == MSH_SURF_COMPOUND){ - std::list<GFace*> comp; - for(unsigned int j = 0; j < s->compound.size(); j++){ - GFace *gf = model->getFaceByTag(s->compound[j]); - if(gf) - comp.push_back(gf); - } - std::list<GEdge*> b[4]; - for(int j = 0; j < 4; j++){ - for(unsigned int k = 0; k < s->compoundBoundary[j].size(); k++){ - GEdge *ge = model->getEdgeByTag(s->compoundBoundary[j][k]); - if(ge) b[j].push_back(ge); - } - } - int param = CTX::instance()->mesh.remeshParam; - GFaceCompound::typeOfCompound typ = GFaceCompound::HARMONIC_CIRCLE; - if (param == 1) typ = GFaceCompound::CONFORMAL_SPECTRAL; - if (param == 2) typ = GFaceCompound::RADIAL_BASIS; - if (param == 3) typ = GFaceCompound::HARMONIC_PLANE; - if (param == 4) typ = GFaceCompound::CONVEX_CIRCLE; - if (param == 5) typ = GFaceCompound::CONVEX_PLANE; - if (param == 6) typ = GFaceCompound::HARMONIC_SQUARE; - if (param == 7) typ = GFaceCompound::CONFORMAL_FE; - int algo = CTX::instance()->mesh.remeshAlgo; - f = new GFaceCompound(model, s->Num, comp, b[0], b[1], b[2], b[3], typ, algo); - f->meshAttributes.recombine = s->Recombine; - f->meshAttributes.recombineAngle = s->RecombineAngle; - f->meshAttributes.method = s->Method; - f->meshAttributes.extrude = s->Extrude; - f->meshAttributes.transfiniteArrangement = s->Recombine_Dir; - f->meshAttributes.corners.clear(); - for(int j = 0; j < List_Nbr(s->TrsfPoints); j++){ - Vertex *corn; - List_Read(s->TrsfPoints, j, &corn); - GVertex *gv = f->model()->getVertexByTag(corn->Num); - if(gv) - f->meshAttributes.corners.push_back(gv); - else - Msg::Error("Unknown vertex %d in transfinite attributes", corn->Num); - } - model->add(f); - } - else if(!f){ + if(!f){ f = new gmshFace(model, s); model->add(f); } else{ - if(f->getNativeType() == GEntity::GmshModel && - s->Typ != MSH_SURF_COMPOUND) + if(f->getNativeType() == GEntity::GmshModel) ((gmshFace*)f)->resetNativePtr(s); f->resetMeshAttributes(); } @@ -1290,22 +1163,12 @@ void GEO_Internals::synchronize(GModel *model) Volume *v; List_Read(volumes, i, &v); GRegion *r = model->getRegionByTag(v->Num); - if(!r && v->Typ == MSH_VOLUME_COMPOUND){ - std::vector<GRegion*> comp; - for(unsigned int j = 0; j < v->compound.size(); j++){ - GRegion *gr = model->getRegionByTag(v->compound[j]); - if(gr) comp.push_back(gr); - } - r = new GRegionCompound(model, v->Num, comp); - model->add(r); - } - else if(!r){ + if(!r){ r = new gmshRegion(model, v); model->add(r); } else{ - if(r->getNativeType() == GEntity::GmshModel && - v->Typ != MSH_VOLUME_COMPOUND) + if(r->getNativeType() == GEntity::GmshModel) ((gmshRegion*)r)->resetNativePtr(v); r->resetMeshAttributes(); } diff --git a/Geo/GModelIO_MSH2.cpp b/Geo/GModelIO_MSH2.cpp index 55d08004615c88cfb7b9889d5c7a9a18045dc90d..8b51e51e68e20d0bc1057537888dced4d0be9307 100644 --- a/Geo/GModelIO_MSH2.cpp +++ b/Geo/GModelIO_MSH2.cpp @@ -693,7 +693,6 @@ int GModel::_readMSH2(const std::string &name) _createGeometryOfDiscreteEntities() ; - // copying periodic information from the mesh rewind(fp); diff --git a/Geo/GRbf.cpp b/Geo/GRbf.cpp deleted file mode 100644 index 7e8dea77fc5e3ee99edd544db9ec1cae4d609cce..0000000000000000000000000000000000000000 --- a/Geo/GRbf.cpp +++ /dev/null @@ -1,1269 +0,0 @@ -// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle -// -// See the LICENSE.txt file for license information. Please report all -// bugs and problems to the public mailing list <gmsh@onelab.info>. -// -// Contributed by Cecile Piret - -#include <math.h> -#include <vector> -#include "GmshConfig.h" -#include "GRbf.h" -#include "OS.h" -#include "fullMatrix.h" -#include "Octree.h" -#include "SPoint3.h" -#include "SVector3.h" -#include "SBoundingBox3d.h" -#include "OS.h" -#include "MVertex.h" -#include "MVertexRTree.h" - -#if defined(HAVE_SOLVER) -#include "linearSystem.h" -#endif - -#if defined(HAVE_ANN) -#include "ANN/ANN.h" -#endif - -static void SphereBB(void *a, double*mmin, double*mmax) -{ - Sphere *t = (Sphere *)a; - mmin[0] = t->center.x()-t->radius; - mmin[1] = t->center.y()-t->radius; - mmin[2] = t->center.z()-t->radius; - mmax[0] = t->center.x()+t->radius; - mmax[1] = t->center.y()+t->radius; - mmax[2] = t->center.z()+t->radius; -} - -static void SphereCentroid(void *a, double*c) -{ - Sphere *t = (Sphere *)a; - c[0] = t->center.x(); - c[1] = t->center.y(); - c[2] = t->center.z(); -} - -static int SphereInEle(void *a, double*c) -{ - Sphere *t = (Sphere *)a; - double dist = sqrt((c[0]-t->center.x())*(c[0]-t->center.x())+ - (c[1]-t->center.y())*(c[1]-t->center.y())+ - (c[2]-t->center.z())*(c[2]-t->center.z()) ); - if(dist < t->radius){ - return 1; - } - return 0; -} - -static void printNodes(std::set<MVertex *> myNodes) -{ - FILE * xyz = Fopen("myNodes.pos","w"); - if(xyz){ - fprintf(xyz,"View \"\"{\n"); - for(std::set<MVertex *>::iterator itv = myNodes.begin(); itv !=myNodes.end(); ++itv){ - MVertex *v = *itv; - fprintf(xyz,"SP(%g,%g,%g){%d};\n", v->x(), v->y(), v->z(), v->getNum()); - } - fprintf(xyz,"};\n"); - fclose(xyz); - } -} - -static void exportParametrizedMesh(fullMatrix<double> &UV, int nbNodes) -{ - FILE *f = Fopen("UV.pos", "w"); - if(f){ - fprintf(f,"View \" uv \" {\n"); - Msg::Info("*** RBF exporting 'UV.pos' "); - for(int id = 0; id < nbNodes; id++){ - fprintf(f,"SP(%g,%g,%g){%d};\n", UV(id,0), UV(id,1), 0.0, id); - } - fprintf(f,"};\n"); - fclose(f); - } -} - -GRbf::GRbf(double sizeBox, int variableEps, int rbfFun, - std::map<MVertex*, SVector3> _normals, - std::set<MVertex *> allNodes, std::vector<MVertex*> bcNodes, bool _isLocal) - : isLocal(_isLocal), _inUV(0), sBox(sizeBox), - radialFunctionIndex (rbfFun) - -{ -#if defined (HAVE_ANN) - XYZkdtree = 0; -#endif - - allCenters.resize(allNodes.size(),3); - double tol = 4.e-2*sBox; - if (isLocal) tol = 1.e-15; - - // remove duplicate vertices - // add bc nodes - for(unsigned int i = 0; i < bcNodes.size(); i++){ - myNodes.insert(bcNodes[i]); - //if (bcNodes.size() > 20) i+=2; - } - - // then create Mvertex position - std::vector<MVertex*> vertices(allNodes.begin(), allNodes.end()); - MVertexRTree pos(tol); - pos.insert(vertices); - for(unsigned int i = 0; i < vertices.size(); i++){ - MVertex *v = vertices[i]; - if(!pos.find(v->x(), v->y(), v->z())) - myNodes.insert(v); // keep only no duplicate vertices - allCenters(i,0) = v->x()/sBox; - allCenters(i,1) = v->y()/sBox; - allCenters(i,2) = v->z()/sBox; - _mapAllV.insert(std::make_pair(v, i)); - } - - // initialize with points - nbNodes = myNodes.size(); - centers.resize(nbNodes,3); - normals.resize(nbNodes,3); - int index = 0; - double dist_min = 1.e6; - for(std::set<MVertex *>::iterator itv = myNodes.begin(); itv !=myNodes.end(); ++itv){ - MVertex *v1 = *itv; - centers(index,0) = v1->x()/sBox; - centers(index,1) = v1->y()/sBox; - centers(index,2) = v1->z()/sBox; - std::map<MVertex*, SVector3>::iterator itn = _normals.find(v1); - if (itn != _normals.end()){ - normals(index,0) = itn->second.x(); - normals(index,1) = itn->second.y(); - normals(index,2) = itn->second.z(); - } - _mapV.insert(std::make_pair(v1, index)); - for(std::set<MVertex *>::iterator itv2 = myNodes.begin(); itv2 !=myNodes.end(); itv2++){ - MVertex *v2 = *itv2; - double dist = sqrt((v1->x()-v2->x())*(v1->x()-v2->x())+ - (v1->y()-v2->y())*(v1->y()-v2->y())+ - (v1->z()-v2->z())*(v1->z()-v2->z()))/sBox; - if (dist < dist_min && *itv != *itv2 && dist > 1.e-5) dist_min = dist; - } - index++; - } - - delta = dist_min/10.0;//0.33 - - //radius = 1.0/15.0 //curvature setting - radius= 1.0/6.0; //size 1 is non dim size - - Msg::Info("*****************************************"); - Msg::Info("*** RBF nbNodes=%d (all=%d) ", myNodes.size(), allNodes.size()); - Msg::Info("*** RBF rad=%g dist_min =%g", radius, dist_min); - Msg::Info("*****************************************"); - - printNodes(myNodes); - - if (!isLocal){ - matAInv.resize(nbNodes, nbNodes); - matAInv = generateRbfMat(0,centers,centers); - matAInv.invertInPlace(); - } - - extendedX.resize(3*nbNodes,3); -} - -GRbf::~GRbf() -{ -#if defined (HAVE_ANN) - ANNpointArray XYZNodes = XYZkdtree->thePoints(); - ANNpointArray UVNodes = UVkdtree->thePoints(); - annDeallocPts(XYZNodes); - annDeallocPts(UVNodes); - delete XYZkdtree; - delete UVkdtree; -#endif -} - -void GRbf::buildXYZkdtree() -{ -#if defined (HAVE_ANN) - ANNpointArray XYZnodes = annAllocPts(nbNodes, 3); - for(int i = 0; i < nbNodes; i++){ - XYZnodes[i][0] = centers(i,0); - XYZnodes[i][1] = centers(i,1); - XYZnodes[i][2] = centers(i,2); - } - XYZkdtree = new ANNkd_tree(XYZnodes, nbNodes, 3); -#endif -} - -void GRbf::buildOctree(double radius) -{ - //printf("building octree radius = %g \n", radius); - SBoundingBox3d bb; - for (int i = 0; i < nbNodes; i++) - bb += SPoint3(centers(i,0),centers(i,1), centers(i,2)); - double origin[3] = {bb.min().x(), bb.min().y(), bb.min().z()}; - double ssize[3] = {bb.max().x() - bb.min().x(), - bb.max().y() - bb.min().y(), - bb.max().z() - bb.min().z()}; - const int maxElePerBucket = 10; - Octree *oct = Octree_Create(maxElePerBucket, origin, ssize, SphereBB, - SphereCentroid, SphereInEle); - - Sphere *_sph = new Sphere[nbNodes]; - for (int i = 0; i < nbNodes; i++){ - _sph[i].index = i; - _sph[i].radius = radius; - _sph[i].center = SPoint3(centers(i,0),centers(i,1), centers(i,2)); - Octree_Insert(&_sph[i], oct); - } - Octree_Arrange(oct); - - for (int i = 0; i < nbNodes; i++){ - std::vector<void*> l; - double P[3] = {centers(i,0),centers(i,1), centers(i,2)}; - Octree_SearchAll(P, oct, &l); - nodesInSphere[i].push_back(i); - if (l.size() == 1) printf("*** WARNING: Found only %d sphere ! \n", (int)l.size()); - for (std::vector<void*>::iterator it = l.begin(); it != l.end(); it++) { - Sphere *sph = (Sphere*) *it; - if (sph->index != i) nodesInSphere[i].push_back(sph->index); - } - //printf("size node i =%d = %d \n", i , nodesInSphere[i].size()); - } - - Octree_Delete(oct); - delete [] _sph; - - buildXYZkdtree(); -} - -// compute curvature from level set -void GRbf::curvatureRBF(const fullMatrix<double> &cntrs, - fullMatrix<double> &curvature) -{ - - - fullMatrix<double> extX, surf, sx,sy,sz, sxx,syy,szz, sxy,sxz,syz,sLap; - setup_level_set(cntrs,normals,extX, surf); - - evalRbfDer(1,extX,cntrs,surf,sx); - evalRbfDer(2,extX,cntrs,surf,sy); - evalRbfDer(3,extX,cntrs,surf,sz); - evalRbfDer(222,extX,cntrs,surf,sLap); - - for (int i = 0; i < cntrs.size1(); i++) { - double norm_grad_s = sqrt(sx(i,0)*sx(i,0)+sy(i,0)*sy(i,0)+sz(i,0)*sz(i,0)); - double curv = -sLap(i,0)/norm_grad_s; - curvature(i,0) = 0.5*fabs(curv)/sBox; - } - - - -} - -void GRbf::computeCurvature(const fullMatrix<double> &cntrs, - std::map<MVertex*, double> &rbf_curv) -{ - fullMatrix<double> extX, surf, sx,sy,sz, allsx,allsy,allsz; - setup_level_set(cntrs,normals,extX, surf); - // Find derivatives of the surface interpolant - evalRbfDer(1,extX,extX,surf,sx); - evalRbfDer(2,extX,extX,surf,sy); - evalRbfDer(3,extX,extX,surf,sz); - - for (int i = 0; i < extX.size1(); i++) { - double norm_grad_s = sqrt(sx(i,0)*sx(i,0)+sy(i,0)*sy(i,0)+sz(i,0)*sz(i,0)); - sx(i,0) = sx(i,0)/norm_grad_s; - sy(i,0) = sy(i,0)/norm_grad_s; - sz(i,0) = sz(i,0)/norm_grad_s; - } - - fullMatrix<double> curvatureAll(allCenters.size1(), 1); - evalRbfDer(1,extX,allCenters,sx,allsx); - evalRbfDer(2,extX,allCenters,sy,allsy); - evalRbfDer(3,extX,allCenters,sz,allsz); - - for (int i = 0; i < allCenters.size1(); i++) { - curvatureAll(i,0) = 0.5*(allsx(i,0)+allsy(i,0)+allsz(i,0))/sBox; - } - - //fill rbf_curv - std::map<MVertex*, int>::iterator itm = _mapAllV.begin(); - for (; itm != _mapAllV.end(); itm++){ - int index = itm->second; - rbf_curv.insert(std::make_pair(itm->first,curvatureAll(index,0))); - } - -} - -void GRbf::computeLocalCurvature(const fullMatrix<double> &cntrs, - std::map<MVertex*, double> &rbf_curv) -{ - fullMatrix<double> extX, surf; - int numNodes = cntrs.size1(); - int numExtNodes = 3*numNodes; - setup_level_set(cntrs,normals,extX, surf); - - if(nodesInSphere.size() == 0) buildOctree(radius); - fullMatrix<double> curvature(cntrs.size1(), 1); - fullMatrix<double> Dx(numExtNodes,numExtNodes),Dy(numExtNodes,numExtNodes),Dz(numExtNodes,numExtNodes),tempX,tempY,tempZ,sx(numExtNodes,1),sy(numExtNodes,1),sz(numExtNodes,1); - fullMatrix<double> cluster_center(3,3); - for (int i = 0; i < numNodes; ++i) { - std::vector<int> &pts = nodesInSphere[i]; - int cluster_size = pts.size(); - fullMatrix<double> nodes_in_sph(3*cluster_size,3); - - cluster_center(0,0) = extX(i,0); - cluster_center(0,1) = extX(i,1); - cluster_center(0,2) = extX(i,2); - - cluster_center(1,0) = extX(i+numNodes,0); - cluster_center(1,1) = extX(i+numNodes,1); - cluster_center(1,2) = extX(i+numNodes,2); - - cluster_center(2,0) = extX(i+2*numNodes,0); - cluster_center(2,1) = extX(i+2*numNodes,1); - cluster_center(2,2) = extX(i+2*numNodes,2); - - for (int k=0; k< cluster_size; k++){ - nodes_in_sph(k,0) = extX(pts[k],0); - nodes_in_sph(k,1) = extX(pts[k],1); - nodes_in_sph(k,2) = extX(pts[k],2); - - nodes_in_sph(k+cluster_size,0) = extX(pts[k]+numNodes,0); - nodes_in_sph(k+cluster_size,1) = extX(pts[k]+numNodes,1); - nodes_in_sph(k+cluster_size,2) = extX(pts[k]+numNodes,2); - - nodes_in_sph(k+2*cluster_size,0) = extX(pts[k]+2*numNodes,0); - nodes_in_sph(k+2*cluster_size,1) = extX(pts[k]+2*numNodes,1); - nodes_in_sph(k+2*cluster_size,2) = extX(pts[k]+2*numNodes,2); - } - - RbfOp(1,nodes_in_sph,cluster_center,tempX); - RbfOp(2,nodes_in_sph,cluster_center,tempY); - RbfOp(3,nodes_in_sph,cluster_center,tempZ); - - for (int k=0; k< cluster_size; k++){ - for (int j=0; j< 3; j++){ - Dx(i+j*numNodes,pts[k]) = tempX(j,k); - Dy(i+j*numNodes,pts[k]) = tempY(j,k); - Dz(i+j*numNodes,pts[k]) = tempZ(j,k); - - Dx(i+j*numNodes,pts[k]+numNodes) = tempX(j,k+cluster_size); - Dy(i+j*numNodes,pts[k]+numNodes) = tempY(j,k+cluster_size); - Dz(i+j*numNodes,pts[k]+numNodes) = tempZ(j,k+cluster_size); - - Dx(i+j*numNodes,pts[k]+2*numNodes) = tempX(j,k+2*cluster_size); - Dy(i+j*numNodes,pts[k]+2*numNodes) = tempY(j,k+2*cluster_size); - Dz(i+j*numNodes,pts[k]+2*numNodes) = tempZ(j,k+2*cluster_size); - } - } - } - - sx.gemm(Dx,surf, 1.0, 0.0); - sy.gemm(Dy,surf, 1.0, 0.0); - sz.gemm(Dz,surf, 1.0, 0.0); - - for (int i = 0; i < numExtNodes; i++) { - double norm_grad_s = sqrt(sx(i,0)*sx(i,0)+sy(i,0)*sy(i,0)+sz(i,0)*sz(i,0)); - sx(i,0) = sx(i,0)/norm_grad_s; - sy(i,0) = sy(i,0)/norm_grad_s; - sz(i,0) = sz(i,0)/norm_grad_s; - } - sx.gemm(Dx,sx, 1.0, 0.0); - sy.gemm(Dy,sy, 1.0, 0.0); - sz.gemm(Dz,sz, 1.0, 0.0); - - printf("sBox = %g ",sBox); - for (int i = 0; i < numNodes; i++) { - curvature(i,0) = 0.5*(sx(i,0)+sy(i,0)+sz(i,0))/sBox; - } - std::map<MVertex*, int>::iterator itm = _mapAllV.begin(); - for (; itm != _mapAllV.end(); itm++) { - int index = itm->second; - rbf_curv.insert(std::make_pair(itm->first, curvature(index,0))); - } -} - -double GRbf::evalRadialFnDer (int p, double dx, double dy, double dz, double ep) -{ - double r2 = dx*dx+dy*dy+dz*dz; //r^2 - switch (radialFunctionIndex) { - case 0 : // GA - switch (p) { - case 0: return exp(-ep*ep*r2); - case 1: return -2.0*ep*ep*dx*exp(-ep*ep*r2); // _x - case 2: return -2.0*ep*ep*dy*exp(-ep*ep*r2); // _y - case 3: return -2.0*ep*ep*dz*exp(-ep*ep*r2); // _z - case 11: return -2.0*ep*ep*(1.0-2.0*ep*ep*dx*dx)*exp(-ep*ep*r2); // _xx - case 12: return 4.0*ep*ep*ep*ep*dx*dy*exp(-ep*ep*r2); // _xy - case 13: return 4.0*ep*ep*ep*ep*dx*dz*exp(-ep*ep*r2); // ... - case 22: return -2.0*ep*ep*(1.0-2.0*ep*ep*dy*dy)*exp(-ep*ep*r2); - case 23: return 4.0*ep*ep*ep*ep*dy*dz*exp(-ep*ep*r2); - case 33: return -2.0*ep*ep*(1.0-2.0*ep*ep*dz*dz)*exp(-ep*ep*r2); - case 222: return -2.0*ep*ep*(3.0-2.0*ep*ep*r2)*exp(-ep*ep*r2); //Laplacian - } - case 1 : //MQ - switch (p) { - case 0: return sqrt(1.0+ep*ep*r2); - case 1: return ep*ep*dx/sqrt(1.0+ep*ep*r2); - case 2: return ep*ep*dy/sqrt(1.0+ep*ep*r2); - case 3: return ep*ep*dz/sqrt(1.0+ep*ep*r2); - case 11: return ep*ep*(1.0+ep*ep*dy*dy+ep*ep*dz*dz)/sqrt((1.0+ep*ep*r2)*(1.0+ep*ep*r2)*(1.0+ep*ep*r2)); // _xx - case 12: return -ep*ep*ep*ep*dx*dy/sqrt((1.0+ep*ep*r2)*(1.0+ep*ep*r2)*(1.0+ep*ep*r2)); // _xy - case 13: return -ep*ep*ep*ep*dx*dz/sqrt((1.0+ep*ep*r2)*(1.0+ep*ep*r2)*(1.0+ep*ep*r2)); // ... - case 22: return ep*ep*(1.0+ep*ep*dx*dx+ep*ep*dz*dz)/sqrt((1.0+ep*ep*r2)*(1.0+ep*ep*r2)*(1.0+ep*ep*r2)); - case 23: return -ep*ep*ep*ep*dy*dz/sqrt((1.0+ep*ep*r2)*(1.0+ep*ep*r2)*(1.0+ep*ep*r2)); - case 33: return ep*ep*(1.0+ep*ep*dx*dx+ep*ep*dy*dy)/sqrt((1.0+ep*ep*r2)*(1.0+ep*ep*r2)*(1.0+ep*ep*r2)); - case 222: return ep*ep*(3.0+ep*ep*2.0*r2)/sqrt((1.0+ep*ep*r2)*(1.0+ep*ep*r2)*(1.0+ep*ep*r2)); - } - } - return 0.; -} - -fullMatrix<double> GRbf::generateRbfMat(int p, - const fullMatrix<double> &nodes1, - const fullMatrix<double> &nodes2) -{ - int m = nodes2.size1(); - int n = nodes1.size1(); - fullMatrix<double> rbfMat(m,n); - - //curvature setting double eps = 0.1/delta; - double eps = 1.0/(delta*10);//2*sqrt(n/radius);////0.5/delta; //0.0677*(nbNodes^0.28)/min_dist; //0.5 - //printf("Shape parameter = %g ", eps); - //printf("delta = %g ", delta); - - if (_inUV) eps = 0.4/deltaUV; - for (int i = 0; i < m; i++) { - for (int j = 0; j < n; j++) { - double dx = nodes2(i,0)-nodes1(j,0); - double dy = nodes2(i,1)-nodes1(j,1); - double dz = nodes2(i,2)-nodes1(j,2); - rbfMat(i,j) = evalRadialFnDer(p,dx,dy,dz,eps); - } - } - - return rbfMat; -} - -//DL matrix (B*inv A) -void GRbf::RbfOp(int p, - const fullMatrix<double> &cntrs, - const fullMatrix<double> &nodes, - fullMatrix<double> &D) -{ - fullMatrix<double> rbfInvA, rbfMatB; - - D.resize(nodes.size1(), cntrs.size1()); - - if (isLocal){ - rbfInvA = generateRbfMat(0,cntrs,cntrs); - rbfInvA.invertInPlace(); - } - else{ - if (cntrs.size1() == nbNodes ) - rbfInvA = matAInv; - else if (cntrs.size1() == 3*nbNodes ) - rbfInvA = matAInv_nn; - else{ - rbfInvA = generateRbfMat(0,cntrs,cntrs); - rbfInvA.invertInPlace(); - } - } - rbfMatB = generateRbfMat(p,cntrs,nodes); - D.gemm(rbfMatB, rbfInvA, 1.0, 0.0); -} - -//U = DL * U -void GRbf::evalRbfDer(int p, - const fullMatrix<double> &cntrs, - const fullMatrix<double> &nodes, - const fullMatrix<double> &fValues, - fullMatrix<double> &fApprox) -{ - fApprox.resize(nodes.size1(),fValues.size2()); - fullMatrix<double> D; - RbfOp(p,cntrs,nodes,D); - fApprox.gemm(D,fValues, 1.0, 0.0); -} - -void GRbf::setup_level_set(const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - fullMatrix<double> &level_set_nodes, - fullMatrix<double> &level_set_funvals) -{ - int numNodes = cntrs.size1(); - int nTot = 3*numNodes; - double normFactor; - level_set_nodes.resize(nTot,3); - level_set_funvals.resize(nTot,1); - fullMatrix<double> ONES(numNodes+1,1), sx(numNodes,1), sy(numNodes,1); - fullMatrix<double> sz(numNodes,1),norms(numNodes,3), cntrsPlus(numNodes+1,3); - - //Computes the normal vectors to the surface at each node - //Specifies the function values on the level set : 0 at all nodes (but add - //a node to make the problem non sigular) - for (int i=0;i<numNodes ; ++i){ - ONES(i,0) = 0.0; - cntrsPlus(i,0) = cntrs(i,0); - cntrsPlus(i,1) = cntrs(i,1); - cntrsPlus(i,2) = cntrs(i,2); - } - //Specifies the additional node position and its function value - ONES(numNodes,0) = 1.0; - cntrsPlus(numNodes,0) = cntrs(0,0)+10.*sBox; - cntrsPlus(numNodes,1) = cntrs(0,1)+10.*sBox; - cntrsPlus(numNodes,2) = cntrs(0,2)+10.*sBox; - - //printf("%g,%g,%g,%g;\n",sBox, cntrs(0,0), cntrs(0,1), cntrs(0,2)); - - evalRbfDer(1,cntrsPlus,cntrs,ONES,sx); - evalRbfDer(2,cntrsPlus,cntrs,ONES,sy); - evalRbfDer(3,cntrsPlus,cntrs,ONES,sz); - - for (int i=0;i<numNodes ; ++i){ - - normFactor = sqrt(sx(i,0)*sx(i,0)+sy(i,0)*sy(i,0)+sz(i,0)*sz(i,0)); - sx(i,0) = sx(i,0)/normFactor; - sy(i,0) = sy(i,0)/normFactor; - sz(i,0) = sz(i,0)/normFactor; - norms(i,0) = sx(i,0);norms(i,1) = sy(i,0);norms(i,2) = sz(i,0); - - //GMSH NORMALS - // norms(i,0) = normals(i,0); - // norms(i,1) = normals(i,1); - // norms(i,2) = normals(i,2); - //END GMSH NORMALS - } - - for (int i = 0; i < numNodes; ++i){ - for (int j = 0; j < 3; ++j){ - level_set_nodes(i,j) = cntrs(i,j); - level_set_nodes(i+numNodes,j) = cntrs(i,j)-delta*norms(i,j); - level_set_nodes(i+2*numNodes,j) = cntrs(i,j)+delta*norms(i,j); - } - level_set_funvals(i,0) = 0.0; - level_set_funvals(i+numNodes,0) = -1; - level_set_funvals(i+2*numNodes,0) = 1; - } - - if (!isLocal) - { - matAInv_nn.resize(nTot, nTot); - matAInv_nn = generateRbfMat(0,level_set_nodes,level_set_nodes); - matAInv_nn.invertInPlace(); - } -} - -void GRbf::RbfLapSurface_local_projection(const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - fullMatrix<double> &Oper) -{ - isLocal = true; - int numNodes = cntrs.size1(); - Oper.resize(numNodes,numNodes); - - if(nodesInSphere.size() == 0) buildOctree(radius); - - for (int i = 0; i < numNodes; ++i){ - std::vector<int> &pts = nodesInSphere[i]; - - fullMatrix<double> nodes_in_sph(pts.size(),3), local_normals(pts.size(),3); - fullMatrix<double> LocalOper; - - LocalOper.setAll(0.0); - - for (unsigned int k = 0; k < pts.size(); k++){ - nodes_in_sph(k, 0) = cntrs(pts[k], 0); - nodes_in_sph(k, 1) = cntrs(pts[k], 1); - nodes_in_sph(k, 2) = cntrs(pts[k], 2); - local_normals(k, 0) = normals(pts[k], 0); - local_normals(k, 1) = normals(pts[k], 1); - local_normals(k, 2) = normals(pts[k], 2); - } - - RbfLapSurface_global_projection(nodes_in_sph,local_normals, LocalOper); - - for (unsigned int j = 0; j < pts.size(); j++) - Oper(i, pts[j]) = LocalOper(0, j); - } -} - -void GRbf::RbfLapSurface_global_projection2(const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - fullMatrix<double> &Oper) { - - int numNodes = cntrs.size1(); - int nnTot = 3*numNodes; - Oper.resize(numNodes,numNodes); - - fullMatrix<double> Dx(numNodes,numNodes),Dy(numNodes,numNodes),Dz(numNodes,numNodes), - PDx(numNodes,numNodes),PDy(numNodes,numNodes),PDz(numNodes,numNodes), - PDxx(numNodes,numNodes),PDyy(numNodes,numNodes),PDzz(numNodes,numNodes); - - fullMatrix<double> sx(nnTot,1),sy(nnTot,1),sz(nnTot,1); - fullMatrix<double> extX(nnTot,3), surf(nnTot,1); - - //Stage 1 : The Arbitrary surface - setup_level_set(cntrs,normals,extX,surf); - if (!isLocal) extendedX = extX; - if (!isLocal) surfInterp = surf; - - //Computes the normal vectors to the surface at each node - evalRbfDer(1,extX,extX,surf,sx); - evalRbfDer(2,extX,extX,surf,sy); - evalRbfDer(3,extX,extX,surf,sz); - for (int i=0;i<nnTot ; ++i){ - double normFactor = sqrt(sx(i,0)*sx(i,0)+sy(i,0)*sy(i,0)+sz(i,0)*sz(i,0)); - sx(i,0) = sx(i,0)/normFactor; - sy(i,0) = sy(i,0)/normFactor; - sz(i,0) = sz(i,0)/normFactor; - } - // Finds differentiation matrices - RbfOp(1,cntrs,cntrs,Dx); - RbfOp(2,cntrs,cntrs,Dy); - RbfOp(3,cntrs,cntrs,Dz); - - // Fills up the operator matrix - for (int i=0;i<numNodes ; ++i){ - for (int j=0;j<numNodes ; ++j){ - PDx(i,j) = (1-sx(i,0)*sx(i,0))*Dx(i,j)-sx(i,0)*sy(i,0)*Dy(i,j)-sx(i,0)*sz(i,0)*Dz(i,j); - PDy(i,j) = -sx(i,0)*sy(i,0)*Dx(i,j)+(1-sy(i,0)*sy(i,0))*Dy(i,j)-sy(i,0)*sz(i,0)*Dz(i,j); - PDz(i,j) = -sx(i,0)*sz(i,0)*Dx(i,j)-sy(i,0)*sz(i,0)*Dy(i,j)+(1-sz(i,0)*sz(i,0))*Dz(i,j); - } - } - PDx.mult(PDx,PDxx); - PDy.mult(PDy,PDyy); - PDz.mult(PDz,PDzz); - for (int i=0;i<numNodes ; ++i){ - for (int j=0;j<numNodes ; ++j){ - Oper(i,j) = PDxx(i,j)+PDyy(i,j)+PDzz(i,j); - } - } - - -} - - -void GRbf::RbfLapSurface_global_projection( const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - fullMatrix<double> &Oper) -{ - int numNodes = cntrs.size1(); - Oper.resize(numNodes,numNodes); - - fullMatrix<double> sx(numNodes,1),sy(numNodes,1),sz(numNodes,1), - Dx(numNodes,numNodes),Dy(numNodes,numNodes),Dz(numNodes,numNodes), - PDx(numNodes,numNodes),PDy(numNodes,numNodes),PDz(numNodes,numNodes), - PDxx(numNodes,numNodes),PDyy(numNodes,numNodes),PDzz(numNodes,numNodes); - - surfInterp.resize(numNodes,1); - surfInterp.setAll(1.0); - evalRbfDer(1,cntrs,cntrs,surfInterp,sx); - evalRbfDer(2,cntrs,cntrs,surfInterp,sy); - evalRbfDer(3,cntrs,cntrs,surfInterp,sz); - - // Normalizes - double norm; - for (int i = 0; i < numNodes;i++){ - norm = sqrt(sx(i,0)*sx(i,0)+sy(i,0)*sy(i,0)+sz(i,0)*sz(i,0)); - sx(i,0) /= norm; - sy(i,0) /= norm; - sz(i,0) /= norm; - } - - // Finds differentiation matrices - RbfOp(1,cntrs,cntrs,Dx); - RbfOp(2,cntrs,cntrs,Dy); - RbfOp(3,cntrs,cntrs,Dz); - - // Fills up the operator matrix - for (int i = 0; i < numNodes; ++i){ - for (int j = 0; j < numNodes; ++j){ - PDx(i,j) = (1-sx(i,0)*sx(i,0))*Dx(i,j)-sx(i,0)*sy(i,0)*Dy(i,j)-sx(i,0)*sz(i,0)*Dz(i,j); - PDy(i,j) = -sx(i,0)*sy(i,0)*Dx(i,j)+(1-sy(i,0)*sy(i,0))*Dy(i,j)-sy(i,0)*sz(i,0)*Dz(i,j); - PDz(i,j) = -sx(i,0)*sz(i,0)*Dx(i,j)-sy(i,0)*sz(i,0)*Dy(i,j)+(1-sz(i,0)*sz(i,0))*Dz(i,j); - } - } - PDx.mult(PDx,PDxx); - PDy.mult(PDy,PDyy); - PDz.mult(PDz,PDzz); - for (int i = 0; i < numNodes; ++i){ - for (int j = 0; j < numNodes; ++j){ - Oper(i,j) = PDxx(i,j)+PDyy(i,j)+PDzz(i,j); - } - } -} - -void GRbf::RbfLapSurface_local_CPM(bool isLow, - const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - fullMatrix<double> &Oper) -{ - isLocal = true; - int numNodes = cntrs.size1(); - Oper.resize(3*numNodes,3*numNodes); - - buildOctree(radius); - setup_level_set(cntrs,normals,extendedX,surfInterp); - - for (int i = 0; i < numNodes; ++i){ - std::vector<int> &pts = nodesInSphere[i]; - int nbp = pts.size(); - fullMatrix<double> nodes_in_sph(nbp,3), local_normals(nbp,3); - fullMatrix<double> LocalOper; - - for (int k=0; k< nbp; k++){ - nodes_in_sph(k,0) = cntrs(pts[k],0); - nodes_in_sph(k,1) = cntrs(pts[k],1); - nodes_in_sph(k,2) = cntrs(pts[k],2); - local_normals(k,0)=normals(pts[k],0); - local_normals(k,1)=normals(pts[k],1); - local_normals(k,2)=normals(pts[k],2); - } - - LocalOper.setAll(0.0); - if (isLow) RbfLapSurface_global_CPM_low(nodes_in_sph,local_normals,LocalOper); - else RbfLapSurface_global_CPM_high_2(nodes_in_sph,local_normals,LocalOper); - - for (int j = 0; j < nbp; j++){ - Oper(i,pts[j])=LocalOper(0,j); - Oper(i,pts[j]+numNodes)=LocalOper(0,j+nbp); - Oper(i,pts[j]+2*numNodes)=LocalOper(0,j+2*nbp); - - Oper(i+numNodes,pts[j])=LocalOper(nbp,j); - Oper(i+numNodes,pts[j]+numNodes)=LocalOper(nbp,j+nbp); - Oper(i+numNodes,pts[j]+2*numNodes)=LocalOper(nbp,j+2*nbp); - - Oper(i+2*numNodes,pts[j])=LocalOper(2*nbp,j); - Oper(i+2*numNodes,pts[j]+numNodes)=LocalOper(2*nbp,j+nbp); - Oper(i+2*numNodes,pts[j]+2*numNodes)=LocalOper(2*nbp,j+2*nbp); - } - - } -} - -void GRbf::RbfLapSurface_local_CPM_sparse(std::vector<MVertex*> &bndVertices, bool isLow, - const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - linearSystem<double> &sys) -{ -#if defined(HAVE_SOLVER) - std::set<int> bndIndices; - for (size_t i = 0; i < bndVertices.size(); ++i) { - bndIndices.insert(_mapV[bndVertices[i]]); - } - isLocal = true; - int numNodes = cntrs.size1(); - - sys.setParameter("matrix_reuse", "same_matrix"); - sys.allocate(3 * numNodes); - - buildOctree(radius); - //setup_level_set(cntrs,normals,extendedX,surfInterp); - - for (int i = 0; i < numNodes; ++i) { - std::vector<int> &pts = nodesInSphere[i]; - if (bndIndices.count(i) > 0) { - sys.insertInSparsityPattern(i, i); - for (unsigned int j = 0; j < pts.size(); ++j) { - sys.insertInSparsityPattern(i + numNodes, pts[j]); - sys.insertInSparsityPattern(i + 2 * numNodes, pts[j]); - } - } - else { - for (unsigned int j = 0; j < pts.size(); ++j) { - sys.insertInSparsityPattern(i, pts[j]); - sys.insertInSparsityPattern(i + numNodes, pts[j]); - sys.insertInSparsityPattern(i + 2 * numNodes, pts[j]); - } - } - } - for (int i = 0; i < numNodes; ++i){ - std::vector<int> &pts = nodesInSphere[i]; - int nbp = pts.size(); - fullMatrix<double> nodes_in_sph(nbp,3), local_normals(nbp,3); - fullMatrix<double> LocalOper; - - for (int k = 0; k < nbp; k++){ - nodes_in_sph(k,0) = cntrs(pts[k],0); - nodes_in_sph(k,1) = cntrs(pts[k],1); - nodes_in_sph(k,2) = cntrs(pts[k],2); - local_normals(k,0)=normals(pts[k],0); - local_normals(k,1)=normals(pts[k],1); - local_normals(k,2)=normals(pts[k],2); - } - - LocalOper.setAll(0.0); - - if (isLow) RbfLapSurface_global_CPM_low(nodes_in_sph,local_normals,LocalOper); - else RbfLapSurface_global_CPM_high_2(nodes_in_sph,local_normals,LocalOper); - - bool isBnd = (bndIndices.count(i) > 0); - if (isBnd) { - sys.addToMatrix(i, i, 1.); - } - for (int j = 0; j < nbp; j++){ - if (!isBnd) { - sys.addToMatrix(i, pts[j], LocalOper(0,j)); - sys.addToMatrix(i, pts[j] + numNodes, LocalOper(0,j + nbp)); - sys.addToMatrix(i, pts[j] + 2 * numNodes, LocalOper(0,j + 2 * nbp)); - } - - sys.addToMatrix(i + numNodes, pts[j], LocalOper(nbp,j)); - sys.addToMatrix(i + numNodes, pts[j] + numNodes, LocalOper(nbp,j + nbp)); - sys.addToMatrix(i + numNodes, pts[j] + 2 * numNodes, LocalOper(nbp,j + 2 * nbp)); - - sys.addToMatrix(i + 2 * numNodes, pts[j], LocalOper(2 * nbp,j)); - sys.addToMatrix(i + 2 * numNodes, pts[j] + numNodes, LocalOper(2 * nbp,j + nbp)); - sys.addToMatrix(i + 2 * numNodes, pts[j] + 2 * numNodes, LocalOper(2 * nbp,j + 2 * nbp)); - } - } -#endif -} - -// NEW METHOD #1 CPM GLOBAL HIGH -void GRbf::RbfLapSurface_global_CPM_high_2(const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - fullMatrix<double> &Oper) -{ - Msg::Info("***Building Laplacian operator"); - int numNodes = cntrs.size1(); - int nnTot = 3*numNodes; - Oper.resize(nnTot,nnTot); - - fullMatrix<double> sx, sy, sz, sxx, sxy, sxz,syy, syz, szz; - fullMatrix<double> A, Ax, Ay, Az, Axx, Axy, Axz, Ayy, Ayz, Azz, Alap, AOper, extX, surf; - - setup_level_set(cntrs,normals,extX,surf); - if (!isLocal) extendedX = extX; - if (!isLocal) surfInterp = surf; - - // Find derivatives of the surface interpolant - evalRbfDer(1,extX,cntrs,surf,sx); - evalRbfDer(2,extX,cntrs,surf,sy); - evalRbfDer(3,extX,cntrs,surf,sz); - evalRbfDer(11,extX,cntrs,surf,sxx); - evalRbfDer(12,extX,cntrs,surf,sxy); - evalRbfDer(13,extX,cntrs,surf,sxz); - evalRbfDer(22,extX,cntrs,surf,syy); - evalRbfDer(23,extX,cntrs,surf,syz); - evalRbfDer(33,extX,cntrs,surf,szz); - - // Finds differentiation matrices - A=generateRbfMat(0,extX,extX); - Ax=generateRbfMat(1,extX,cntrs); - Ay=generateRbfMat(2,extX,cntrs); - Az=generateRbfMat(3,extX,cntrs); - Axx=generateRbfMat(11,extX,cntrs); - Axy=generateRbfMat(12,extX,cntrs); - Axz=generateRbfMat(13,extX,cntrs); - Ayy=generateRbfMat(22,extX,cntrs); - Ayz=generateRbfMat(23,extX,cntrs); - Azz=generateRbfMat(33,extX,cntrs); - Alap=generateRbfMat(222,extX,cntrs); - - // Fills up the operator matrix - AOper.resize(nnTot, nnTot); - for (int i = 0; i < numNodes; ++i){ - for (int j = 0; j < nnTot; ++j){ - AOper(i,j) = Alap(i,j); - AOper(i+numNodes,j)=sx(i,0)*Ax(i,j)+sy(i,0)*Ay(i,j)+sz(i,0)*Az(i,j); - AOper(i+2*numNodes,j)=sx(i,0)*sx(i,0)*Axx(i,j)+sy(i,0)*sy(i,0)*Ayy(i,j)+sz(i,0)*sz(i,0)*Azz(i,j)+2*sx(i,0)*sy(i,0)*Axy(i,j)+2*sx(i,0)*sz(i,0)*Axz(i,j)+2*sy(i,0)*sz(i,0)*Ayz(i,j)+(sx(i,0)*sxx(i,0)+sy(i,0)*sxy(i,0)+sz(i,0)*sxz(i,0))*Ax(i,j)+(sx(i,0)*sxy(i,0)+sy(i,0)*syy(i,0)+sz(i,0)*syz(i,0))*Ay(i,j)+(sx(i,0)*sxz(i,0)+sy(i,0)*syz(i,0)+sz(i,0)*szz(i,0))*Az(i,j); - } - } - A.invertInPlace(); - Oper.gemm(AOper, A, 1.0, 0.0); - - Msg::Info("*** RBF built Laplacian operator"); -} - -//NEW METHOD #2 CPM GLOBAL HIGH -//Produces a nxn differentiation matrix (like the projection method) -//So the local method for this is the local projection method -void GRbf::RbfLapSurface_global_CPM_high(const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - fullMatrix<double> &Oper) -{ - Msg::Debug("*** RBF ... building Laplacian operator"); - int numNodes = cntrs.size1(); - int nnTot = 3*numNodes; - Oper.resize(numNodes,numNodes); - - fullMatrix<double> sx(numNodes,1), sy(numNodes,1), sz(numNodes,1), sxx(numNodes,1), sxy(numNodes,1), sxz(numNodes,1),syy(numNodes,1), syz(numNodes,1), szz(numNodes,1); - fullMatrix<double> A(nnTot,nnTot), Ax(numNodes,nnTot), Ay(numNodes,nnTot), Az(numNodes,nnTot), Axx(numNodes,nnTot), Axy(numNodes,nnTot), Axz(numNodes,nnTot), Ayy(numNodes,nnTot), Ayz(numNodes,nnTot), Azz(numNodes,nnTot), Alap(numNodes,nnTot), AOper(nnTot,nnTot), Temp(numNodes,nnTot), extX(nnTot,3), surf(nnTot,1); - - setup_level_set(cntrs,normals,extX,surf); - if (!isLocal) extendedX = extX; - if (!isLocal) surfInterp = surf; - - // Find derivatives of the surface interpolant - evalRbfDer(1,extX,cntrs,surf,sx); - evalRbfDer(2,extX,cntrs,surf,sy); - evalRbfDer(3,extX,cntrs,surf,sz); - evalRbfDer(11,extX,cntrs,surf,sxx); - evalRbfDer(12,extX,cntrs,surf,sxy); - evalRbfDer(13,extX,cntrs,surf,sxz); - evalRbfDer(22,extX,cntrs,surf,syy); - evalRbfDer(23,extX,cntrs,surf,syz); - evalRbfDer(33,extX,cntrs,surf,szz); - - // Finds differentiation matrices - A=generateRbfMat(0,extX,extX); - Ax=generateRbfMat(1,extX,cntrs); - Ay=generateRbfMat(2,extX,cntrs); - Az=generateRbfMat(3,extX,cntrs); - Axx=generateRbfMat(11,extX,cntrs); - Axy=generateRbfMat(12,extX,cntrs); - Axz=generateRbfMat(13,extX,cntrs); - Ayy=generateRbfMat(22,extX,cntrs); - Ayz=generateRbfMat(23,extX,cntrs); - Azz=generateRbfMat(33,extX,cntrs); - Alap=generateRbfMat(222,extX,cntrs); - - // Fills up the operator matrix - for (int i = 0; i < numNodes; ++i){ - for (int j = 0; j < nnTot; ++j){ - AOper(i,j) = A(i,j); - AOper(i+numNodes,j)=sx(i,0)*Ax(i,j)+sy(i,0)*Ay(i,j)+sz(i,0)*Az(i,j); - AOper(i+2*numNodes,j)=sx(i,0)*sx(i,0)*Axx(i,j)+sy(i,0)*sy(i,0)*Ayy(i,j)+sz(i,0)*sz(i,0)*Azz(i,j)+2*sx(i,0)*sy(i,0)*Axy(i,j)+2*sx(i,0)*sz(i,0)*Axz(i,j)+2*sy(i,0)*sz(i,0)*Ayz(i,j)+(sx(i,0)*sxx(i,0)+sy(i,0)*sxy(i,0)+sz(i,0)*sxz(i,0))*Ax(i,j)+(sx(i,0)*sxy(i,0)+sy(i,0)*syy(i,0)+sz(i,0)*syz(i,0))*Ay(i,j)+(sx(i,0)*sxz(i,0)+sy(i,0)*syz(i,0)+sz(i,0)*szz(i,0))*Az(i,j); - } - } - AOper.invertInPlace(); - Alap.mult(AOper,Temp); - for (int i = 0; i < numNodes; ++i){ - for (int j = 0; j < numNodes; ++j){ - Oper(i,j) = Temp(i,j); - } - } - Msg::Info("*** RBF built Laplacian operator"); -} - -void GRbf::RbfLapSurface_global_CPM_low(const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - fullMatrix<double> &Oper) -{ - int numNodes = cntrs.size1(); - int nnTot = 3*numNodes; - Oper.resize(nnTot,nnTot); - - fullMatrix<double> sx(nnTot,1),sy(nnTot,1),sz(nnTot,1); - fullMatrix<double> PLap(numNodes,nnTot), extX(nnTot,3), surf(nnTot,1); - fullMatrix<double> norm(nnTot,3), extRBFX(2*numNodes,3), Ix2extX(2*numNodes,nnTot); - - //Stage 1 : The Arbitrary surface - setup_level_set(cntrs,normals,extX,surf); - if (!isLocal) extendedX = extX; - if (!isLocal) surfInterp = surf; - - //Computes the normal vectors to the surface at each node - evalRbfDer(1,extX,extX,surf,sx); - evalRbfDer(2,extX,extX,surf,sy); - evalRbfDer(3,extX,extX,surf,sz); - for (int i = 0; i < nnTot; ++i){ - double normFactor = sqrt(sx(i,0)*sx(i,0)+sy(i,0)*sy(i,0)+sz(i,0)*sz(i,0)); - sx(i,0) = sx(i,0)/normFactor; - sy(i,0) = sy(i,0)/normFactor; - sz(i,0) = sz(i,0)/normFactor; - norm(i,0) = sx(i,0);norm(i,1) = sy(i,0);norm(i,2) = sz(i,0); - } - - //Computes the inside and outside layers nodes of the surface - for (int i = 0; i < numNodes; ++i){ - for (int j = 0; j < 3; ++j){ - extRBFX(i,j) = cntrs(i,j)-delta*norm(i,j); - extRBFX(i+numNodes,j) = cntrs(i,j)+delta*norm(i,j); - } - } - - //Computes the gradient operators - RbfOp(0,extX,extRBFX,Ix2extX); //'0' for interpolation - RbfOp(222,extX,cntrs,PLap); //'222' for the Laplacian - - // Fills up the operator matrix - for (int i = 0; i < numNodes; i++){ - for (int j = 0; j < nnTot; ++j){ - Oper(i,j) = PLap(i,j); - double del = (i == j) ? -1.0: 0.0; - //double pos1 = (i+numNodes == j) ? 1.0: 0.0; - //double pos2 = (i+2*numNodes == j) ? 1.0: 0.0; - Oper(i+numNodes,j) = del +Ix2extX(i,j);//+ pos1; // - Oper(i+2*numNodes,j) = del + Ix2extX(i+numNodes,j); //+ pos2; // - } - } - -} - -void GRbf::solveHarmonicMap_sparse(linearSystem<double> &sys, int numNodes, - const std::vector<MVertex*> &bcNodes, - const std::vector<double> &coords, - std::map<MVertex*, SPoint3> &rbf_param) -{ -#if defined(HAVE_SOLVER) - Msg::Info("*** RBF ... solving map"); - printf("system = %p\n", &sys); - int nb = numNodes * 3; - UV.resize(nb,2); - for (int j = 0; j < 2; ++j) { - sys.zeroRightHandSide(); - //UNIT CIRCLE - for (unsigned int i = 0; i < bcNodes.size(); i++) { - std::set<MVertex *>::iterator itN = myNodes.find(bcNodes[i]); - if (itN != myNodes.end()){ - std::map<MVertex*, int>::iterator itm = _mapV.find(bcNodes[i]); - double theta = 2 * M_PI * coords[i]; - int iFix = itm->second; - sys.addToRightHandSide(iFix, ((j == 0) ? cos(theta) : sin(theta))); - } - } - sys.systemSolve(); - for (int i = 0; i < nbNodes; ++i) { - sys.getFromSolution(i, UV(i, j)); - } - } - - //SQUARE - // for(std::set<MVertex *>::iterator itv = myNodes.begin(); itv !=myNodes.end(); ++itv){ - // MVertex *v = *itv; - // if (v->getNum() == 1){ //2900){ - // std::map<MVertex*, int>::iterator itm = _mapV.find(v); - // int iFix = itm->second; - // for (int j = 0; j < nb; ++j) Oper(iFix,j) = 0.0; - // Oper(iFix,iFix) = 1.0; - // F(iFix,0) = 0.0; - // F(iFix,1) = 0.0; - // } - // if (v->getNum() == 2){//1911){ - // std::map<MVertex*, int>::iterator itm = _mapV.find(v); - // int iFix = itm->second; - // for (int j = 0; j < nb; ++j) Oper(iFix,j) = 0.0; - // Oper(iFix,iFix) = 1.0; - // F(iFix,0) = 1.0; - // F(iFix,1) = 0.0; - // } - // if (v->getNum() == 3){//4844){ - // std::map<MVertex*, int>::iterator itm = _mapV.find(v); - // int iFix = itm->second; - // for (int j = 0; j < nb; ++j) Oper(iFix,j) = 0.0; - // Oper(iFix,iFix) = 1.0; - // F(iFix,0) = 1.0; - // F(iFix,1) = 1.0; - // } - // if (v->getNum() == 4){//3187){ - // std::map<MVertex*, int>::iterator itm = _mapV.find(v); - // int iFix = itm->second; - // for (int j = 0; j < nb; ++j) Oper(iFix,j) = 0.0; - // Oper(iFix,iFix) = 1.0; - // F(iFix,0) = 0.0; - // F(iFix,1) = 1.0; - // } - // } - - //ANN UVtree -#if defined (HAVE_ANN) - double dist_min = 1.e6; - ANNpointArray UVnodes = annAllocPts(nbNodes, 3); - for(int i = 0; i < nbNodes; i++){ - UVnodes[i][0] = UV(i,0); - UVnodes[i][1] = UV(i,1); - UVnodes[i][2] = 0.0; - for(int j = i+1; j < nbNodes; j++){ - double dist = sqrt((UV(i,0)-UV(j,0))*(UV(i,0)-UV(j,0))+ - (UV(i,1)-UV(j,1))*(UV(i,1)-UV(j,1))); - if (dist<dist_min) dist_min = dist; - } - } - deltaUV = 0.6*dist_min; - UVkdtree = new ANNkd_tree(UVnodes, nbNodes, 3); -#endif - - //interpolate - fullMatrix<double> UVall(allCenters.size1(), 3); - evalRbfDer(0,centers,allCenters,UV,UVall); - - //fill rbf_param - std::map<MVertex*, int>::iterator itm = _mapAllV.begin(); - for (; itm != _mapAllV.end(); itm++){ - int index = itm->second; - SPoint3 coords(UVall(index,0), UVall(index,1), 0.0); - rbf_param.insert(std::make_pair(itm->first,coords)); - } - - Msg::Info("*** RBF solved map"); - exportParametrizedMesh(UV, nbNodes); -#endif -} - -void GRbf::solveHarmonicMap(fullMatrix<double> Oper, - std::vector<MVertex*> bcNodes, - std::vector<double> coords, - std::map<MVertex*, SPoint3> &rbf_param) -{ - Msg::Info("*** RBF ... solving map"); - int nb = Oper.size2(); - UV.resize(nb,2); - - fullMatrix<double> F(nb,2); - F.scale(0.0); - - //UNIT CIRCLE - for (unsigned int i = 0; i < bcNodes.size(); i++){ - std::set<MVertex *>::iterator itN = myNodes.find(bcNodes[i]); - if (itN != myNodes.end()){ - std::map<MVertex*, int>::iterator itm = _mapV.find(bcNodes[i]); - double theta = 2 * M_PI * coords[i]; - int iFix = itm->second; - for (int j = 0; j < nb; ++j) Oper(iFix,j) = 0.0; - Oper(iFix,iFix) = 1.0; - F(iFix,0) = cos(theta); - F(iFix,1) = sin(theta); - } - } - - //SQUARE - // for(std::set<MVertex *>::iterator itv = myNodes.begin(); itv !=myNodes.end(); ++itv){ - // MVertex *v = *itv; - // if (v->getNum() == 1){ //2900){ - // std::map<MVertex*, int>::iterator itm = _mapV.find(v); - // int iFix = itm->second; - // for (int j = 0; j < nb; ++j) Oper(iFix,j) = 0.0; - // Oper(iFix,iFix) = 1.0; - // F(iFix,0) = 0.0; - // F(iFix,1) = 0.0; - // } - // if (v->getNum() == 2){//1911){ - // std::map<MVertex*, int>::iterator itm = _mapV.find(v); - // int iFix = itm->second; - // for (int j = 0; j < nb; ++j) Oper(iFix,j) = 0.0; - // Oper(iFix,iFix) = 1.0; - // F(iFix,0) = 1.0; - // F(iFix,1) = 0.0; - // } - // if (v->getNum() == 3){//4844){ - // std::map<MVertex*, int>::iterator itm = _mapV.find(v); - // int iFix = itm->second; - // for (int j = 0; j < nb; ++j) Oper(iFix,j) = 0.0; - // Oper(iFix,iFix) = 1.0; - // F(iFix,0) = 1.0; - // F(iFix,1) = 1.0; - // } - // if (v->getNum() == 4){//3187){ - // std::map<MVertex*, int>::iterator itm = _mapV.find(v); - // int iFix = itm->second; - // for (int j = 0; j < nb; ++j) Oper(iFix,j) = 0.0; - // Oper(iFix,iFix) = 1.0; - // F(iFix,0) = 0.0; - // F(iFix,1) = 1.0; - // } - // } - - Oper.invertInPlace(); - Oper.mult(F, UV); - - //ANN UVtree -#if defined (HAVE_ANN) - double dist_min = 1.e6; - ANNpointArray UVnodes = annAllocPts(nbNodes, 3); - for(int i = 0; i < nbNodes; i++){ - UVnodes[i][0] = UV(i,0); - UVnodes[i][1] = UV(i,1); - UVnodes[i][2] = 0.0; - for(int j = i+1; j < nbNodes; j++){ - double dist = sqrt((UV(i,0)-UV(j,0))*(UV(i,0)-UV(j,0))+ - (UV(i,1)-UV(j,1))*(UV(i,1)-UV(j,1))); - if (dist<dist_min) dist_min = dist; - } - } - deltaUV = 0.6*dist_min; - UVkdtree = new ANNkd_tree(UVnodes, nbNodes, 3); -#endif - - //interpolate - fullMatrix<double> UVall(allCenters.size1(), 3); - evalRbfDer(0,centers,allCenters,UV,UVall); - - //fill rbf_param - std::map<MVertex*, int>::iterator itm = _mapAllV.begin(); - for (; itm != _mapAllV.end(); itm++){ - int index = itm->second; - SPoint3 coords(UVall(index,0), UVall(index,1), 0.0); - rbf_param.insert(std::make_pair(itm->first,coords)); - } - - Msg::Info("*** RBF solved map"); - exportParametrizedMesh(UV, nbNodes); -} - -bool GRbf::UVStoXYZ(const double u_eval, const double v_eval, - double &XX, double &YY, double &ZZ, - SVector3 &dXdu, SVector3& dXdv, int num_neighbours) -{ - if (u_eval == lastU && v_eval == lastV){ - XX = lastX; - YY = lastY; - ZZ = lastZ; - dXdu = lastDXDU; - dXdv = lastDXDV; - return true; - } - - num_neighbours = std::min(num_neighbours, nbNodes); - fullMatrix<double> u_vec(num_neighbours,3), xyz_local(num_neighbours,3); - fullMatrix<double> u_vec_eval(1, 3), nodes_eval(1,3), xu(1,3), xv(1,3); - u_vec_eval(0,0) = u_eval; - u_vec_eval(0,1) = v_eval; - u_vec_eval(0,2) = 0.0; - - double dist_min = 1.e6; - -#if defined (HAVE_ANN) - double uvw[3] = { u_eval, v_eval, 0.0 }; - ANNidxArray index = new ANNidx[num_neighbours]; - ANNdistArray dist = new ANNdist[num_neighbours]; - UVkdtree->annkSearch(uvw, num_neighbours, index, dist); - - for (int i = 0; i < num_neighbours; i++){ - - u_vec(i,0) = UV(index[i],0); - u_vec(i,1) = UV(index[i],1); - u_vec(i,2) = 0.0; - - xyz_local(i,0) = extendedX(index[i],0); - xyz_local(i,1) = extendedX(index[i],1); - xyz_local(i,2) = extendedX(index[i],2); - - for (int j = i+1; j < num_neighbours; j++){ - double dist = sqrt((UV(index[i],0)-UV(index[j],0))*(UV(index[i],0)-UV(index[j],0))+ - (UV(index[i],1)-UV(index[j],1))*(UV(index[i],1)-UV(index[j],1))); - if (dist<dist_min && dist > 1.e-5) dist_min = dist; - } - } - delete [] index; - delete [] dist; -#endif - - _inUV = 1; - deltaUV = 0.3*dist_min; - evalRbfDer(0, u_vec, u_vec_eval,xyz_local, nodes_eval); - evalRbfDer(1, u_vec, u_vec_eval,xyz_local, xu); - evalRbfDer(2, u_vec, u_vec_eval,xyz_local, xv); - _inUV= 0; - - XX = nodes_eval(0,0)*sBox; - YY = nodes_eval(0,1)*sBox; - ZZ = nodes_eval(0,2)*sBox; - dXdu = SVector3(xu(0,0)*sBox, xu(0,1)*sBox, xu(0,2)*sBox); - dXdv = SVector3(xv(0,0)*sBox, xv(0,1)*sBox, xv(0,2)*sBox); - - //store last computation - lastU = u_eval; - lastV = v_eval; - lastX = XX; - lastY = YY; - lastZ = ZZ; - lastDXDU = dXdu; - lastDXDV = dXdv; - return true; -} diff --git a/Geo/GRbf.h b/Geo/GRbf.h deleted file mode 100644 index de1db4e5397f230caa456336d6c779f94b67c81e..0000000000000000000000000000000000000000 --- a/Geo/GRbf.h +++ /dev/null @@ -1,183 +0,0 @@ -// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle -// -// See the LICENSE.txt file for license information. Please report all -// bugs and problems to the public mailing list <gmsh@onelab.info>. -// -// Contributed by FIXME - -#ifndef _RBF_H_ -#define _RBF_H_ - -#include <math.h> -#include <vector> -#include "fullMatrix.h" -#include "SPoint3.h" -#include "SVector3.h" -#include "MVertex.h" -#include "Context.h" - -template <class t> class linearSystem; - -#if defined(HAVE_ANN) -class ANNkd_tree; -#endif - -class Sphere{ - public: - int index; - SPoint3 center; - double radius; -}; - -class GRbf { - std::map<MVertex*, int> _mapV; - std::map<MVertex*, int> _mapAllV; - std::map<int, std::vector<int> > nodesInSphere; - - fullMatrix<double> matA, matAInv; - fullMatrix<double> matA_nn, matAInv_nn; - - int nbNodes; //initial nodes - bool isLocal; - - int _inUV; - double delta; //offset level set - double deltaUV; //offset level set - double radius; - double sBox; - - SVector3 lastDXDU, lastDXDV; - double lastX, lastY, lastZ, lastU, lastV; - - int radialFunctionIndex; // Index for the radial function used (0 - GA,1 - MQ, ... ) - - std::set<MVertex *> myNodes; //Used mesh vertices for light rbf - fullMatrix<double> centers; // Data centers (without duplicates) - fullMatrix<double> allCenters; // Data centers - fullMatrix<double> normals; // Data normals(without Duplicates) - fullMatrix<double> surfInterp;//level set - fullMatrix<double> extendedX;//X values extend in and out - fullMatrix<double> UV;//solution harmonic map laplu=0 and laplV=0 - -#if defined (HAVE_ANN) - ANNkd_tree *XYZkdtree; - ANNkd_tree *UVkdtree; -#endif - - public: - - GRbf (double sizeBox, int variableEps, int rbfFun, - std::map<MVertex*, SVector3> normals, - std::set<MVertex *> allNodes, std::vector<MVertex*> bcNodes, bool isLocal = false); - ~GRbf(); - - //build octree - void buildOctree(double radius); - void buildXYZkdtree(); - - // Sets up the surface generation problem as suggested by Beatson et - // al. Introduction of 2 extra points per node. The function values - // at the nodes on the surface are set to 0 while the function - // values inside are set to -1 and outside to 1. - void setup_level_set(const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - fullMatrix<double> &level_set_nodes, - fullMatrix<double> &level_set_funvals); - - // Evaluates the (p)th derivative of the radial function w.r.t. r^2 (not w.r.t. r) - // This is to avoid the introduction of removable singularities at r=0. - double evalRadialFnDer (int p, double dx, double dy, double dz, double ep); - - // Generates the RBF collocation matrix for data in d-dimensions, associated with the - //(p)th derivative of the radial function w.r.t. the (q)th variable - fullMatrix<double> generateRbfMat(int p, - const fullMatrix<double> &nodes1, - const fullMatrix<double> &nodes2); - - // Computes the interpolation(p==0) or the derivative (p!=0) - // operator(mxn) (n:number of centers, m: number of evaluation - // nodes) - void RbfOp(int p, // (p)th derivatives - const fullMatrix<double> &cntrs, - const fullMatrix<double> &nodes, - fullMatrix<double> &D); - - // Computes the interpolant(p==0) or the derivative (p!=0) of the - // function values entered and evaluates it at the new nodes - void evalRbfDer(int p, // (p)th derivatives - const fullMatrix<double> &cntrs, - const fullMatrix<double> &nodes, - const fullMatrix<double> &fValues, - fullMatrix<double> &fApprox); - - // Finds surface differentiation matrix using the LOCAL projection method - void RbfLapSurface_local_projection(const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - fullMatrix<double> &Oper); - - // Finds global surface differentiation matrix using the projection method - void RbfLapSurface_global_projection2(const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - fullMatrix<double> &Oper); - - // Finds global surface differentiation matrix using the projection method - void RbfLapSurface_global_projection(const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - fullMatrix<double> &Oper); - - // Finds surface differentiation matrix (method CPML LOCAL) - void RbfLapSurface_local_CPM(bool isLow, - const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - fullMatrix<double> &Oper); - - void RbfLapSurface_local_CPM_sparse(std::vector<MVertex*> &bndVertices, bool isLow, - const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - linearSystem<double> &sys); - - // Finds global surface differentiation matrix (method CPML) - void RbfLapSurface_global_CPM_low(const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - fullMatrix<double> &D); - - // Finds global surface differentiation matrix (method CPMH) - void RbfLapSurface_global_CPM_high(const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - fullMatrix<double> &D); - - // Second method that Finds global surface differentiation matrix (method CPMH) - void RbfLapSurface_global_CPM_high_2(const fullMatrix<double> &cntrs, - const fullMatrix<double> &normals, - fullMatrix<double> &D); - - // Calculates the curvature of a surface at centers - void curvatureRBF(const fullMatrix<double> &cntrs, - fullMatrix<double> &curvature); - void computeCurvature(const fullMatrix<double> &cntrs, - std::map<MVertex*, double>&rbf_curv); - void computeLocalCurvature(const fullMatrix<double> &cntrs, - std::map<MVertex*, double>&rbf_curv); - - //Finds the U,V,S (in the 0-level set) that are the 'num_neighbours' - //closest to u_eval and v_eval. Thus in total, we're working with - //'3*num_neighbours' nodes Say that the vector 'index' gives us the - //indices of the closest points - bool UVStoXYZ(const double u_eval, const double v_eval, - double &XX, double &YY, double &ZZ, - SVector3 &dXdu, SVector3& dxdv, int num_neighbours=100); - - void solveHarmonicMap(fullMatrix<double> Oper, std::vector<MVertex*> ordered, - std::vector<double> coords, std::map<MVertex*, SPoint3> &rbf_param); - void solveHarmonicMap_sparse(linearSystem<double> &sys, int numNodes, - const std::vector<MVertex*> &ordered, - const std::vector<double> &coords, - std::map<MVertex*, SPoint3> &rbf_param); - - inline const fullMatrix<double> getUV() {return UV;}; - inline const fullMatrix<double> getXYZ() {return centers;}; - inline const fullMatrix<double> getN() {return normals;}; - -}; - -#endif diff --git a/Geo/GRegion.cpp b/Geo/GRegion.cpp index bca79da37c3d5c455e800b8e7f92b6af8d15784b..e6cd748a64e74e6ca419e7e6dc2b9b8be0420bfb 100644 --- a/Geo/GRegion.cpp +++ b/Geo/GRegion.cpp @@ -19,7 +19,7 @@ #include "GmshDefines.h" GRegion::GRegion(GModel *model, int tag) - : GEntity (model, tag), compound(0) + : GEntity (model, tag) { resetMeshAttributes(); } @@ -309,13 +309,6 @@ std::list<GEdge*> GRegion::edges() const std::list<GEdge*>::const_iterator it2 = e2.begin(); while (it2 != e2.end()){ GEdge *edge = *it2; - - // FIXME: we need to fix the compound design and decide what to do; same - // thing for faces() (either store or compute the entities, either use - // original or compound entities, etc.) - if(edge->getCompound()) - edge = (GEdge*)edge->getCompound(); - if(std::find(e.begin(), e.end(), edge) == e.end()) e.push_back(edge); ++it2; diff --git a/Geo/GRegion.h b/Geo/GRegion.h index b9810d558720652f4476d80fc1a2e6894f505cf3..4679ab1b521e92d7f632c8375bf1e0603c350c97 100644 --- a/Geo/GRegion.h +++ b/Geo/GRegion.h @@ -21,7 +21,6 @@ class MPyramid; class MPolyhedron; class MTrihedron; class ExtrudeParams; -class GRegionCompound; class BoundaryLayerColumns; // A model region. @@ -32,7 +31,6 @@ class GRegion : public GEntity { std::list<GFace *> embedded_faces; std::list<GEdge *> embedded_edges; std::list<int> l_dirs; - GRegionCompound *compound; // this model ede belongs to a compound // replace faces (for gluing) for specific modelers, we have to // re-create internal data ... @@ -118,10 +116,6 @@ class GRegion : public GEntity { // reset the mesh attributes to default values virtual void resetMeshAttributes(); - // compound - void setCompound(GRegionCompound *grc) { compound = grc; } - GRegionCompound *getCompound() const { return compound; } - struct { // do we recombine the tetrahedra of the mesh into hex? int recombine3D; diff --git a/Geo/GRegionCompound.cpp b/Geo/GRegionCompound.cpp deleted file mode 100644 index 0a7d8dcd46578ad756d4719380b6a68410fd12f6..0000000000000000000000000000000000000000 --- a/Geo/GRegionCompound.cpp +++ /dev/null @@ -1,88 +0,0 @@ -// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle -// -// See the LICENSE.txt file for license information. Please report all -// bugs and problems to the public mailing list <gmsh@onelab.info>. -// -// Contributor(s): -// Emilie Marchandise -// - -#include <stdlib.h> -#include "GmshConfig.h" -#include "GRegionCompound.h" -#include "Numeric.h" - -GRegionCompound::GRegionCompound(GModel *m, int tag, std::vector<GRegion*> &compound) - : GRegion(m, tag), _compound(compound) -{ - - for (unsigned int i = 0; i < _compound.size(); i++){ - if(!_compound[i]){ - Msg::Error("Incorrect region in compound region %d", tag); - return; - } - } - for (unsigned int i = 0; i < _compound.size(); i++) - _compound[i]->setCompound(this); - getBoundingFaces(); -} - -GRegionCompound::~GRegionCompound() -{ -} - -void GRegionCompound::getBoundingFaces() -{ - std::set<GFace*> _unique; - std::multiset<GFace*> _touched; - std::vector<GRegion*>::iterator it = _compound.begin(); - for ( ; it != _compound.end(); ++it){ - std::list<GFace*> ed = (*it)->faces(); - std::list<GFace*> :: iterator ite = ed.begin(); - for ( ; ite != ed.end(); ++ite){ - _touched.insert(*ite); - } - } - it = _compound.begin(); - for ( ; it != _compound.end(); ++it){ - std::list<GFace*> ed = (*it)->faces(); - std::list<GFace*> :: iterator ite = ed.begin(); - for ( ; ite != ed.end() ; ++ite){ - if (!(*ite)->degenerate(0) && _touched.count(*ite) == 1) { - _unique.insert(*ite); - } - } - } - - std::set<GFace*>::iterator itf = _unique.begin(); - for ( ; itf != _unique.end(); ++itf){ - printf("Compound Volume %d face %d \n", tag(), (*itf)->tag()); - l_faces.push_back(*itf); - (*itf)->addRegion(this); - } -} - -SBoundingBox3d GRegionCompound::bounds() const -{ - Msg::Error("Cannot evaluate bounds on GRegion Compound"); - return SBoundingBox3d(SPoint3()); -} - -double GRegionCompound::curvature(double par) const -{ - double k = 0.0; - Msg::Error("Cannot evaluate curvature on GRegionCompound"); - return k; -} - -GPoint GRegionCompound::point(double par) const -{ - Msg::Error("Cannot evaluate point on GRegionCompound"); - return GPoint(); -} - -SVector3 GRegionCompound::firstDer(double par) const -{ - Msg::Error("Cannot evaluate firstDeriv on GRegionCompound"); - return SVector3(); -} diff --git a/Geo/GRegionCompound.h b/Geo/GRegionCompound.h deleted file mode 100644 index bd7578c9f28e9367a159759431b89e6f69074db4..0000000000000000000000000000000000000000 --- a/Geo/GRegionCompound.h +++ /dev/null @@ -1,43 +0,0 @@ -// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle -// -// See the LICENSE.txt file for license information. Please report all -// bugs and problems to the public mailing list <gmsh@onelab.info>. - -#ifndef _GREGION_COMPOUND_H_ -#define _GREGION_COMPOUND_H_ - -#include <list> -#include <map> -#include "GRegion.h" -#include "GFace.h" -#include "GFaceCompound.h" - -/* -A GRegionCompound is a model region that is the compound of model regions. - -It is assumed that all the regions of the compound have been meshed -first and that all the faces of the compound region are compound surfaces. - -The compound can therefore be re-meshed using any volume mesh -generator of gmsh! -*/ - -class GRegionCompound : public GRegion { - public: - GRegionCompound(GModel *m, int tag, std::vector<GRegion*> &compound); - virtual ~GRegionCompound(); - virtual SBoundingBox3d bounds() const; - virtual double curvature(double t) const; - virtual GPoint point(double par) const; - virtual SVector3 firstDer(double par) const; - virtual GEntity::GeomType geomType() const { return CompoundVolume; } - ModelType getNativeType() const { return GmshModel; } - void * getNativePtr() const { return 0; } - - protected: - std::vector<GRegion*> _compound; - void getBoundingFaces(); -}; - -#endif - diff --git a/Geo/MVertex.cpp b/Geo/MVertex.cpp index cd1535f1d86152f204593e1963c6472f9c11bcb9..b7588f2bb0375d1aa0d3f53f279ffe12e88bd430 100644 --- a/Geo/MVertex.cpp +++ b/Geo/MVertex.cpp @@ -10,7 +10,6 @@ #include "GVertex.h" #include "GEdge.h" #include "GFace.h" -#include "GFaceCompound.h" #include "discreteDiskFace.h" #include "GmshMessage.h" #include "StringUtils.h" @@ -399,12 +398,6 @@ static void getAllParameters(MVertex *v, GFace *gf, std::vector<SPoint2> ¶ms { params.clear(); - if (gf->geomType() == GEntity::CompoundSurface ){ - GFaceCompound *gfc = (GFaceCompound*) gf; - params.push_back(gfc->parFromVertex(v)); - return; - } - #if defined(HAVE_ANN) && defined(HAVE_SOLVER) if (gf->geomType() == GEntity::DiscreteDiskSurface ){ discreteDiskFace *gfc = (discreteDiskFace*) gf; @@ -510,12 +503,6 @@ bool reparamMeshEdgeOnFace(MVertex *v1, MVertex *v2, GFace *gf, bool reparamMeshVertexOnFace(MVertex *v, const GFace *gf, SPoint2 ¶m, bool onSurface) { - if(gf->geomType() == GEntity::CompoundSurface){ - GFaceCompound *gfc = (GFaceCompound*) gf; - param = gfc->parFromVertex(v); - return true; - } - #if defined(HAVE_ANN) && defined(HAVE_SOLVER) if (gf->geomType() == GEntity::DiscreteDiskSurface ){ discreteDiskFace *gfc = (discreteDiskFace*) gf; diff --git a/Geo/discreteDiskFace.cpp b/Geo/discreteDiskFace.cpp index e1a196f52132d363e9921d652e562df16521bc84..eff590d77ee18f76474cff015e5057ce9fab9308 100644 --- a/Geo/discreteDiskFace.cpp +++ b/Geo/discreteDiskFace.cpp @@ -180,7 +180,7 @@ static void discreteDiskFaceCentroid(void *a, double*c) c[2] = 0.0; } -static int discreteDiskFaceInEle(void *a, double*c)// # mark +static int discreteDiskFaceInEle(void *a, double*c) { discreteDiskFaceTriangle *t = (discreteDiskFaceTriangle *)a; double Xi[2]; @@ -196,55 +196,48 @@ static int discreteDiskFaceInEle(void *a, double*c)// # mark static bool orderVertices(const double &tot_length, const std::vector<MVertex*> &l, std::vector<double> &coord) -{ // called once by constructor ; organize the vertices for the linear system +{ + // called once by constructor ; organize the vertices for the linear system // expressing the mapping coord.clear(); coord.push_back(0.); - MVertex* first = l[0]; - for(unsigned int i=1; i < l.size(); i++){ - MVertex* next = l[i]; - const double length = sqrt( (next->x() - first->x()) * (next->x() - first->x()) + (next->y() - first->y()) * (next->y() - first->y()) + (next->z() - first->z()) * (next->z() - first->z()) ); - coord.push_back(coord[coord.size()-1] + length / tot_length); - first = next; - } return true; } -/*BUILDER*/ discreteDiskFace::discreteDiskFace(GFace *gf, triangulation* diskTriangulation, - int p, std::vector<GFace*> *CAD) : - GFace(gf->model(),diskTriangulation->idNum), _parent (gf), _ddft(NULL), oct(NULL) + int p, std::vector<GFace*> *CAD) + : GFace(gf->model(), diskTriangulation->idNum), _parent (gf), _ddft(NULL), oct(NULL) { initialTriangulation = diskTriangulation; std::vector<MElement*> mesh = diskTriangulation->tri; _order = p; _n = (p+1)*(p+2)/2; discrete_triangles.resize(mesh.size()); - std::map<MVertex*,MVertex*> v2v;// mesh vertex |-> face vertex + std::map<MVertex*,MVertex*> v2v; // mesh vertex |-> face vertex std::map<MEdge,MVertex*,Less_Edge> ed2nodes; // edge to interior node(s) for (unsigned int i=0;i<mesh.size();i++){ // triangle by triangle std::vector<MVertex*> vs; // MTriangle vertices - for (unsigned int j=0; j<3; j++){ // loop over vertices AND edges of the current triangle - MVertex *v = mesh[i]->getVertex(j);// firstly, edge vertices + // loop over vertices AND edges of the current triangle + for (unsigned int j = 0; j < 3; j++){ + MVertex *v = mesh[i]->getVertex(j); // firstly, edge vertices if (v->onWhat()->dim() == 2) { - std::map<MVertex*,MVertex*> :: iterator it = v2v.find(v); + std::map<MVertex*,MVertex*>::iterator it = v2v.find(v); if (it == v2v.end()){ MFaceVertex *vv; - if (!CAD) vv = new MFaceVertex ( v->x(), v->y(), v->z(), v->onWhat(), 0, 0); + if(!CAD || (*CAD)[i] != v->onWhat()){ + vv = new MFaceVertex(v->x(), v->y(), v->z(), v->onWhat(), 0, 0); + } else{ - GFace *cad = (*CAD)[i]; - if(cad != v->onWhat()) - Msg::Fatal("Line %d FILE %s : erroneous cad list",__LINE__,__FILE__); - double pu,pv; v->getParameter(0,pu);v->getParameter(1,pv); + double pu, pv; v->getParameter(0, pu); v->getParameter(1, pv); vv = new MFaceVertex ( v->x(), v->y(), v->z(), v->onWhat(), pu, pv); } v2v[v] = vv; @@ -293,7 +286,6 @@ discreteDiskFace::discreteDiskFace(GFace *gf, triangulation* diskTriangulation, //putOnView(gf->tag(),diskTriangulation->idNum,true,true); //printParamMesh(); } -/*end BUILDER*/ discreteDiskFace::~discreteDiskFace() { @@ -338,7 +330,6 @@ bool discreteDiskFace::parametrize() const linearSystem<double> * lsys_u, *lsys_v; - #ifdef HAVE_MUMPS lsys_u = new linearSystemMUMPS<double>; lsys_v = new linearSystemMUMPS<double>; @@ -389,7 +380,8 @@ bool discreteDiskFace::parametrize() const lsys_u->systemSolve(); lsys_v->systemSolve(); Msg::Debug("Systems solved"); - for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ + for(std::set<MVertex *>::iterator itv = allNodes.begin(); + itv !=allNodes.end() ; ++itv){ MVertex *v = *itv; double value_U, value_V; myAssemblerU.getDofValue(v, 0, 1, value_U); @@ -415,15 +407,15 @@ bool discreteDiskFace::parametrize() const return true; } - - void discreteDiskFace::getTriangleUV(const double u,const double v, discreteDiskFaceTriangle **mt, - double &_xi, double &_eta)const{ + double &_xi, double &_eta)const +{ double uv[3] = {u,v,0.}; *mt = (discreteDiskFaceTriangle*) Octree_Search(uv,oct); if (!(*mt)) { - for (unsigned int i=0; i<discrete_triangles.size()-geoTriangulation->fillingHoles.size(); i++){ + for (unsigned int i = 0; i < discrete_triangles.size() - + geoTriangulation->fillingHoles.size(); i++){ discreteDiskFaceTriangle *ct = &_ddft[i]; double Xi[2]; int xxx = discreteDiskFaceInEle(ct, Xi); @@ -434,7 +426,9 @@ void discreteDiskFace::getTriangleUV(const double u,const double v, return; } } - Msg::Debug("discreteDiskFace::getTriangleUV(), didn't find the reference coordinate (xi;eta) for (u;v)=(%f;%f) among %d triangles",u,v,discrete_triangles.size()-geoTriangulation->fillingHoles.size()); + Msg::Debug("discreteDiskFace::getTriangleUV(), didn't find the reference " + "coordinate (xi;eta) for (u;v)=(%f;%f) among %d triangles", + u,v,discrete_triangles.size()-geoTriangulation->fillingHoles.size()); return; } @@ -442,7 +436,8 @@ void discreteDiskFace::getTriangleUV(const double u,const double v, double U[2] = {u,v}; bool pass = uv2xi(*mt,U,Xi); if (!pass){ - Msg::Error("discreteDiskFace::getTriangleUV(), didn't find the reference coordinate (xi;eta) for (u;v)=(%f;%f)",u,v); + Msg::Error("discreteDiskFace::getTriangleUV(), didn't find the reference " + "coordinate (xi;eta) for (u;v)=(%f;%f)", u, v); return; } _xi = Xi[0]; @@ -453,7 +448,7 @@ bool discreteDiskFace::checkOrientationUV() { discreteDiskFaceTriangle *ct; - if(_order==1){ + if(_order == 1){ double current; // initial and current orientation ct = &_ddft[0]; double p1[2] = {ct->p[0].x(), ct->p[0].y()}; @@ -471,7 +466,8 @@ bool discreteDiskFace::checkOrientationUV() else nbP++; } if (nbP*nbM){ - Msg::Info("Map %d of the atlas : Triangles have different orientations (%d + / %d -)",tag(),nbP,nbM); + Msg::Info("Map %d of the atlas: triangles have different orientations (%d + / %d -)", + tag(), nbP, nbM); return false; } return true; @@ -481,7 +477,8 @@ bool discreteDiskFace::checkOrientationUV() double min, max; std::vector<MVertex*> localVertices; localVertices.resize(_n); - for(unsigned int i=0; i<discrete_triangles.size()-geoTriangulation->fillingHoles.size(); i++){ + for(unsigned int i=0; i<discrete_triangles.size() - + geoTriangulation->fillingHoles.size(); i++){ ct = &_ddft[i]; for(int j=0; j<_n; j++) localVertices[j] = new MVertex(ct->p[j].x(),ct->p[j].y(),0.); @@ -524,11 +521,14 @@ void discreteDiskFace::optimize() // -- generation of parametric nodes std::map<SPoint3,MVertex*> sp2mv; std::vector<MElement*> paramTriangles; - for(std::map<MVertex*,SPoint3>::iterator it=coordinates.begin(); it!= coordinates.end(); ++it) + for(std::map<MVertex*,SPoint3>::iterator it=coordinates.begin(); + it != coordinates.end(); ++it) sp2mv[it->second] = new MVertex(it->second.x(),it->second.y(),0.); // -- generation of parametric triangles - paramTriangles.resize(discrete_triangles.size() - geoTriangulation->fillingHoles.size()); - for(unsigned int i=0; i<discrete_triangles.size() -geoTriangulation->fillingHoles.size(); i++){ + paramTriangles.resize(discrete_triangles.size() - + geoTriangulation->fillingHoles.size()); + for(unsigned int i = 0; i < discrete_triangles.size() - + geoTriangulation->fillingHoles.size(); i++){ discreteDiskFaceTriangle* ct = &_ddft[i]; std::vector<MVertex*> mv; mv.resize(ct->tri->getNumVertices()); @@ -551,36 +551,35 @@ void discreteDiskFace::optimize() // ---- discrete vertex std::set<GFace*, GEntityLessThan>::iterator it = paramDisk->firstFace(); GFace *dgf = *it; - discreteVertex *dv = new discreteVertex(paramDisk,paramDisk->getMaxElementaryNumber(0)+1); + discreteVertex *dv = new discreteVertex(paramDisk, + paramDisk->getMaxElementaryNumber(0) + 1); sp2mv[coordinates[_U0[0]]]->setEntity(dv); dv->mesh_vertices.push_back(sp2mv[coordinates[_U0[0]]]); todelete.insert(sp2mv[coordinates[_U0[0]]]); paramDisk->add(dv); // ---- discrete edge - discreteEdge *de = new discreteEdge(paramDisk,paramDisk->getMaxElementaryNumber(1)+1,dv,dv); + discreteEdge *de = new discreteEdge(paramDisk, + paramDisk->getMaxElementaryNumber(1)+1, dv, dv); paramDisk->add(de); std::vector<MLine*> lines; for(unsigned int i=1; i<_U0.size(); i++){ sp2mv[coordinates[_U0[i]]]->setEntity(de); de->mesh_vertices.push_back(sp2mv[coordinates[_U0[i]]]); todelete.insert(sp2mv[coordinates[_U0[i]]]); - lines.push_back(new MLine(sp2mv[coordinates[_U0[i-1]]],sp2mv[coordinates[_U0[i]]])); + lines.push_back(new MLine(sp2mv[coordinates[_U0[i-1]]], + sp2mv[coordinates[_U0[i]]])); } - lines.push_back(new MLine(sp2mv[coordinates[_U0[_U0.size()-1]]],sp2mv[coordinates[_U0[0]]])); + lines.push_back(new MLine(sp2mv[coordinates[_U0[_U0.size()-1]]], + sp2mv[coordinates[_U0[0]]])); de->setTopo(lines); de->createGeometry();// !!!! setTopo ... MLine's - - // optimization if(_order >1) HighOrderMeshOptimizer(paramDisk, optParams); else MeshQualityOptimizer(paramDisk,opt); - - - // update the parametrization paramTriangles = e2e[0]; for(unsigned int i=0; i< paramTriangles.size(); i++){ @@ -606,7 +605,6 @@ void discreteDiskFace::optimize() // cleaning delete paramDisk; - #endif } @@ -647,27 +645,24 @@ SPoint2 discreteDiskFace::parFromVertex(MVertex *v) const std::map<MVertex*,SPoint3>::iterator it = coordinates.find(v); if(it != coordinates.end()) return SPoint2(it->second.x(),it->second.y()); // The 1D mesh has been re-done - if (v->onWhat()->dim()==1){ + if (v->onWhat()->dim() == 1){ if (v->onWhat()->geomType() == DiscreteCurve){ discreteEdge *de = dynamic_cast<discreteEdge*> (v->onWhat()); - if (de){ + if(de){ MVertex *v1,*v2; double xi; de->interpolateInGeometry (v,&v1,&v2,xi); // modify std::map<MVertex*,SPoint3>::iterator it1 = coordinates.find(v1); std::map<MVertex*,SPoint3>::iterator it2 = coordinates.find(v2); - if(it1 == coordinates.end()) Msg::Fatal("FIXME TO DO %d %s",__LINE__,__FILE__); - if(it2 == coordinates.end()) Msg::Fatal("FIXME TO DO %d %s",__LINE__,__FILE__); - return SPoint2(it1->second.x(),it1->second.y()) * (1.-xi) + - SPoint2(it2->second.x(),it2->second.y()) * xi; // modify + if(it1 != coordinates.end() && it2 != coordinates.end()){ + return SPoint2(it1->second.x(),it1->second.y()) * (1.-xi) + + SPoint2(it2->second.x(),it2->second.y()) * xi; // modify + } } } - Msg::Fatal("FIXME TO DO %d %s",__LINE__,__FILE__); } - else if (v->onWhat()->dim()==0) - Msg::Fatal("discreteDiskFace::parFromVertex vertex classified on a model " - "vertex that is not part of the face"); + Msg::Error("discreteDiskFace::parFromVertex failed"); return SPoint2(0,0); } @@ -678,15 +673,13 @@ SVector3 discreteDiskFace::normal(const SPoint2 ¶m) const double discreteDiskFace::curvatureMax(const SPoint2 ¶m) const { - throw; - return false; + return 0; } double discreteDiskFace::curvatures(const SPoint2 ¶m, SVector3 *dirMax, SVector3 *dirMin, double *curvMax, double *curvMin) const { - throw; - return false; + return 0; } Pair<SVector3, SVector3> discreteDiskFace::firstDer(const SPoint2 ¶m) const @@ -709,8 +702,7 @@ Pair<SVector3, SVector3> discreteDiskFace::firstDer(const SPoint2 ¶m) const double dudxi[2][2] = {{0.,0.},{0.,0.}}; - for (int io=0; io<_n; io++){ - + for (int io = 0; io < _n; io++){ double X = tri->getVertex(io)->x(); double Y = tri->getVertex(io)->y(); double Z = tri->getVertex(io)->z(); @@ -732,7 +724,6 @@ Pair<SVector3, SVector3> discreteDiskFace::firstDer(const SPoint2 ¶m) const dudxi[1][0] += V*df[io][0]; dudxi[1][1] += V*df[io][1]; - } double dxidu[2][2]; @@ -755,19 +746,18 @@ Pair<SVector3, SVector3> discreteDiskFace::firstDer(const SPoint2 ¶m) const void discreteDiskFace::secondDer(const SPoint2 ¶m, SVector3 *dudu, SVector3 *dvdv, SVector3 *dudv) const -{ // cf Sauvage's thesis - return; +{ + // cf Sauvage's thesis } void discreteDiskFace::putOnView(int iFace, int iMap, bool Xu, bool Ux) -{// #improveme using built-in methods +{ + // FIXME using built-in methods char mybuffer [64]; FILE *view_u=NULL, *view_v=NULL, *UVx=NULL, *UVy=NULL, *UVz=NULL; - - if(Xu){ sprintf(mybuffer, "param_u_gface%d_part%d_order%d.pos", iFace, iMap,_order); @@ -803,7 +793,8 @@ void discreteDiskFace::putOnView(int iFace, int iMap, bool Xu, bool Ux) fprintf(UVy,"View \"y(U)\"{\n"); fprintf(UVz,"View \"z(U)\"{\n"); } - for (unsigned int i=0; i<discrete_triangles.size()-geoTriangulation->fillingHoles.size(); i++){ + for (unsigned int i = 0; i < discrete_triangles.size() - + geoTriangulation->fillingHoles.size(); i++){ discreteDiskFaceTriangle* my_ddft = &_ddft[i]; if (_order == 1){ if(Xu){ @@ -893,26 +884,13 @@ void discreteDiskFace::putOnView(int iFace, int iMap, bool Xu, bool Ux) } } -// useful for mesh generators -// Intersection of a circle and a plane -//FILE *allProblems = NULL; -//void openProblemsON(void){ -// allProblems = fopen ("op.pos","w"); -//} -//void openProblemsOFF(void){ -// fclose(allProblems); -// allProblems = NULL; -//} - GPoint discreteDiskFace::intersectionWithCircle(const SVector3 &n1, const SVector3 &n2, const SVector3 &p, const double &R, double uv[2]) const { - - SVector3 n = crossprod(n1,n2); n.normalize(); - // printf("n %g %g %g\n",n.x(), n.y(), n.z()); + const int N = (int)(discrete_triangles.size()-geoTriangulation->fillingHoles.size()); for (int i=-1;i<N;i++){ discreteDiskFaceTriangle *ct = NULL; @@ -1001,32 +979,18 @@ GPoint discreteDiskFace::intersectionWithCircle(const SVector3 &n1, const SVecto GPoint pp(0); pp.setNoSuccess(); Msg::Debug("ARGG no success intersection circle"); - // Msg::Info("ARGG no success intersection circle"); - // printf("Point(1) = {%g,%g,%g};\n",p.x(),p.y(),p.z()); - // printf("Point(2) = {%g,%g,%g};\n",p.x()+d*n1.x(),p.y()+d*n1.y(),p.z()+d*n1.z()); - // printf("Point(3) = {%g,%g,%g};\n",p.x()+d*n2.x(),p.y()+d*n2.y(),p.z()+d*n2.z()); - - // // printf("Circle(4) = {2,1,3};\n"); - // printf("{%g,%g,%g};\n",n1.x(),n1.y(),n1.z()); - // printf("{%g,%g,%g};\n",n2.x(),n2.y(),n2.z()); - // printf("coucou --> \n"); - // if (allProblems){ - // fprintf(allProblems,"VP(%g,%g,%g){%g,%g,%g};\n",p.x(),p.y(),p.z(),R*n2.x(),R*n2.y(),R*n2.z()); - // } - // getchar(); return pp; } - GPoint discreteDiskFace::intersectionWithCircle2(const SVector3 &n1, const SVector3 &n2, const SVector3 &p, const double &d, double uv[2]) const { - // n2 is exterior SVector3 n = crossprod(n1,n2); n.normalize(); - for (int i=-1;i<(int)(discrete_triangles.size()-geoTriangulation->fillingHoles.size());i++){ + for (int i = -1; i < (int)(discrete_triangles.size() - + geoTriangulation->fillingHoles.size()); i++){ discreteDiskFaceTriangle *ct = NULL; double U,V; if (i == -1) getTriangleUV(uv[0],uv[1], &ct, U,V); @@ -1118,7 +1082,8 @@ GPoint discreteDiskFace::intersectionWithCircle2(const SVector3 &n1, const SVect // printf("{%g,%g,%g};\n",n2.x(),n2.y(),n2.z()); // printf("coucou --> \n"); // if (allProblems){ - // fprintf(allProblems,"VP(%g,%g,%g){%g,%g,%g};\n",p.x(),p.y(),p.z(),d*n2.x(),d*n2.y(),d*n2.z()); + // fprintf(allProblems,"VP(%g,%g,%g){%g,%g,%g};\n", + // p.x(),p.y(),p.z(),d*n2.x(),d*n2.y(),d*n2.z()); // } // getchar(); return pp; @@ -1126,7 +1091,8 @@ GPoint discreteDiskFace::intersectionWithCircle2(const SVector3 &n1, const SVect // computes some kind of maximal distance in a mesh -static void addTo (std::map<MVertex*, std::vector<MElement*> > &v2t, MVertex *v, MElement *t) +static void addTo(std::map<MVertex*, std::vector<MElement*> > &v2t, + MVertex *v, MElement *t) { std::map<MVertex*, std::vector<MElement*> > :: iterator it = v2t.find(v); if (it == v2t.end()){ @@ -1145,26 +1111,16 @@ static void update(std::map<MVertex*,double> &Close, MVertex *v2, double d) } -static MEdge getEdge (MElement *t, MVertex *v) +static MEdge getEdge(MElement *t, MVertex *v) { for (int i=0;i<3;i++) if (t->getVertex(i) == v) return t->getEdge((i+1)%3); return MEdge(); } -/* #warning -static double computeDistanceLinePoint (MVertex *v1, MVertex *v2, MVertex *v){ - - SVector3 U = v2->point() - v1->point(); - SVector3 BA = v2->point() - v->point(); - - SVector3 xx = crossprod(U,BA); - return xx.norm() / U.norm(); - -} -*/ -inline double computeDistance (MVertex *v1, double d1, MVertex *v2, double d2, MVertex *v){ - +inline double computeDistance(MVertex *v1, double d1, MVertex *v2, double d2, + MVertex *v) +{ // o------------a // // @@ -1179,9 +1135,6 @@ inline double computeDistance (MVertex *v1, double d1, MVertex *v2, double d2, M return std::min(d2+v2->distance(v),d1+v1->distance(v)); - - - double a = v2->distance(v1); // center (seed) to compute the distance (put it down) @@ -1276,12 +1229,14 @@ double triangulation::geodesicDistance () std::map<MVertex*,double>::iterator it1 = Fixed.find(ed.getVertex(1)); // printf("coucou %p %p\n",ed.getVertex(0),ed.getVertex(1)); if (it0 != Fixed.end() && it1 == Fixed.end()){ - double d = computeDistance (it->first,it->second,it0->first,it0->second,ed.getVertex(1)); + double d = computeDistance (it->first,it->second,it0->first,it0->second, + ed.getVertex(1)); // printf("neigh %d fixed 0 --> d = %g\n",i,d); update(Close, ed.getVertex(1), d); } else if (it1 != Fixed.end() && it0 == Fixed.end()){ - double d = computeDistance (it->first,it->second,it1->first,it1->second,ed.getVertex(0)); + double d = computeDistance(it->first,it->second,it1->first,it1->second, + ed.getVertex(0)); // printf("neigh %d fixed 1 --> d = %g\n",i,d); update(Close, ed.getVertex(0), d); } @@ -1290,7 +1245,7 @@ double triangulation::geodesicDistance () if (Fixed.size() == v2t.size())break; } - + /* char name[256]; sprintf(name,"geodesicDistance%d.pos",iter); FILE *f = fopen(name,"w"); @@ -1302,13 +1257,12 @@ double triangulation::geodesicDistance () fprintf(f,"ST(%g,%g,%g,%g,%g,%g,%g,%g,%g){%g,%g,%g};\n", tri[i]->getVertex(0)->x(),tri[i]->getVertex(0)->y(),tri[i]->getVertex(0)->z(), tri[i]->getVertex(1)->x(),tri[i]->getVertex(1)->y(),tri[i]->getVertex(1)->z(), - tri[i]->getVertex(2)->x(),tri[i]->getVertex(2)->y(),tri[i]->getVertex(2)->z(),d0,d1,d2); - + tri[i]->getVertex(2)->x(),tri[i]->getVertex(2)->y(),tri[i]->getVertex(2)->z(), + d0,d1,d2); } fprintf(f,"};\n"); fclose(f); - - + */ return CLOSEST; } @@ -1367,7 +1321,8 @@ void discreteDiskFace::printParamMesh() sprintf(buffer,"param_mesh%d.msh",tag()); FILE* pmesh = fopen(buffer,"w"); int count = 1; - fprintf(pmesh,"$MeshFormat\n2.2 0 8\n$EndMeshFormat\n$Nodes\n%u\n",(unsigned int)allNodes.size()); + fprintf(pmesh,"$MeshFormat\n2.2 0 8\n$EndMeshFormat\n$Nodes\n%u\n", + (unsigned int)allNodes.size()); for(std::set<MVertex*>::iterator it = allNodes.begin(); it!=allNodes.end(); ++it){ fprintf(pmesh,"%d %f %f 0\n",count,(coordinates[(*it)]).x(),(coordinates[(*it)]).y()); mv2int[*it] = count; diff --git a/Geo/discreteEdge.cpp b/Geo/discreteEdge.cpp index 29b53f1bab4ae0226e7bf5b6a91fb6b825f2ae90..81863528f0332d95650c443069aab2fc4c962e4b 100644 --- a/Geo/discreteEdge.cpp +++ b/Geo/discreteEdge.cpp @@ -20,8 +20,6 @@ #include "GModelIO_GEO.h" #include "Geo.h" #include "OS.h" -#include "Curvature.h" -#include "GEdgeCompound.h" #if defined(HAVE_MESH) #include "meshGEdge.h" @@ -489,34 +487,15 @@ SVector3 discreteEdge::firstDer(double par) const double discreteEdge::curvature(double par) const { - double tLoc; - int iEdge; - if(!getLocalParameter(par, iEdge, tLoc)) return MAX_LC; - - double c0, c1; - Curvature& curvature = Curvature::getInstance(); - if( !Curvature::valueAlreadyComputed() ) { - Msg::Warning("Need to compute discrete curvature (in discreteEdge)"); - Curvature::typeOfCurvature type = Curvature::RUSIN; //RUSIN; //RBF - curvature.computeCurvature(model(), type); - } - - curvature.edgeNodalValues(lines[iEdge],c0, c1, 1); - double cv = (1-tLoc)*c0 + tLoc*c1; - - return cv; + Msg::Error("Curvature for discrete edge not implemented yet"); + return 0.; } double discreteEdge::curvatures(const double par, SVector3 *dirMax, SVector3 *dirMin, double *curvMax, double *curvMin) const { - if (getCompound()){ - return getCompound()->curvatures(par, dirMax, dirMin, curvMax, curvMin); - } - else{ - Msg::Error("Cannot evaluate curvatures and curvature directions on discrete edge"); - return false; - } + Msg::Error("Cannot evaluate curvatures and curvature directions on discrete edge"); + return false; } Range<double> discreteEdge::parBounds(int i) const diff --git a/Geo/discreteEdge.h b/Geo/discreteEdge.h index 179ed6204016b165e2d0babca96782bd13f5c84e..f76789d5a4ad804629a59ec0796ca57153d702ed 100644 --- a/Geo/discreteEdge.h +++ b/Geo/discreteEdge.h @@ -32,20 +32,20 @@ class discreteEdge : public GEdge { virtual Range<double> parBounds(int) const; bool getLocalParameter(const double &t, int &iEdge, double &tLoc) const; - void interpolateInGeometry (MVertex *v, MVertex **v1, MVertex **v2, double &xi) const; + void interpolateInGeometry (MVertex *v, MVertex **v1, MVertex **v2, double &xi) const; void parametrize(std::map<GFace*, std::map<MVertex*, MVertex*, std::less<MVertex*> > > &face2Verts, std::map<GRegion*, std::map<MVertex*, MVertex*, std::less<MVertex*> > > ®ion2Vert); void parametrize(std::map<MVertex*,MVertex*>& old2New); - + void orderMLines(); void setBoundVertices(); void setTopo(std::vector<MLine*>); void createTopo(); void createGeometry(); void computeNormals () const; - virtual void mesh(bool) ; + virtual void mesh(bool verbose) ; void writeGEO(FILE *fp); int minimumDrawSegments() const {return 2*_pars.size();} MVertex * getGeometricalVertex (MVertex *v); diff --git a/Geo/discreteFace.cpp b/Geo/discreteFace.cpp index dc82256177f5b1b1f8c4536945d5b7004176c0d3..adfe66b9b2d62c6f159a289eeb84a11f4adb4bf5 100644 --- a/Geo/discreteFace.cpp +++ b/Geo/discreteFace.cpp @@ -13,7 +13,6 @@ #include "discreteDiskFace.h" #include "GModelIO_GEO.h" #include "Geo.h" -#include "GFaceCompound.h" #include "Context.h" #include "OS.h" #include "meshPartitionObjects.h" @@ -75,7 +74,8 @@ static inline void crouzeixRaviart(const std::vector<double> &U,std::vector<doub F[i] = U[0] * (1.-2.*eta[i]) + U[1] * (2.*(xsi[i]+eta[i])-1.) + U[2] * (1-2.*xsi[i]); } -discreteFace::discreteFace(GModel *model, int num) : GFace(model, num) +discreteFace::discreteFace(GModel *model, int num, bool meshable) + : GFace(model, num), _meshable(meshable) { Surface *s = CreateSurface(num, MSH_SURF_DISCRETE); Tree_Add(model->getGEOInternals()->Surfaces, &s); @@ -189,18 +189,13 @@ void discreteFace::secondDer(const SPoint2 ¶m, void discreteFace::createGeometry() { - checkAndFixOrientation(); - #if defined(HAVE_SOLVER) && defined(HAVE_ANN) - - - int order = 1; int nPart = 2; double eta = .5*5/(2.*3.14); - if (!_atlas.empty())return; + if (!_atlas.empty()) return; double dtSplit = 0.0; @@ -213,12 +208,12 @@ void discreteFace::createGeometry() init->iter = iter++; allEdg2Tri = init->ed2tri; toSplit.push(init); - // printf("%12.5E\n",(toSplit.top())->aspectRatio() ); + if((toSplit.top())->genus()!=0 || (toSplit.top())->aspectRatio() > eta || (toSplit.top())->seamPoint){ - while( !toSplit.empty()){ + while(!toSplit.empty()){ std::vector<triangulation*> part; triangulation* tosplit = toSplit.top(); toSplit.pop(); @@ -237,33 +232,26 @@ void discreteFace::createGeometry() toParam.push_back(part[i]); part[i]->idNum=id++; } - }// end for i - }// !.empty() - }// end if it is not disk-like + } + } + } else{ toParam.push_back(toSplit.top()); toSplit.top()->idNum=id++; } updateTopology(toParam); - /* FILE* debug = Fopen("tralala-init.pos","w"); fprintf(debug,"View \"discreteEdges\"{\n"); for(unsigned int j=0; j<toParam.size(); j++){ - std::list<GEdge*> ge = toParam[j]->my_GEdges; for(std::list<GEdge*>::iterator it = ge.begin(); it!=ge.end(); ++it){ if((*it)->tag()==112 ){ - std::vector<MLine*> ml = (*it)->lines; - printf("___(init) map %d, ge %d___ (%p)\n",j+1,(*it)->tag(),(*it)); for(unsigned int i=0; i<ml.size(); i++){ ml[i]->writePOS(debug,true,false,false,false,false,false,1.,(*it)->tag()); - printf("%d[%d;%d]--",ml[i]->getNum(),ml[i]->getVertex(0)->getNum(),ml[i]->getVertex(1)->getNum()); } - printf("\n"); - } } @@ -273,22 +261,21 @@ void discreteFace::createGeometry() */ for(unsigned int i=0; i<toParam.size(); i++){ - fillHoles(toParam[i]); - //sprintf(name,"mapFilled%d.pos",i); + //sprintf(name, "mapFilled%d.pos",i); //toParam[i]->print(name, toParam[i]->idNum); } - for(unsigned int i=0; i<toParam.size(); i++){ - discreteDiskFace *df = new discreteDiskFace (this,toParam[i], order,(_CAD.empty() ? NULL : &_CAD)); - df->printAtlasMesh(); - df->printParamMesh(); + discreteDiskFace *df = new discreteDiskFace + (this, toParam[i], order, (_CAD.empty() ? NULL : &_CAD)); + //df->printAtlasMesh(); + //df->printParamMesh(); //df->putOnView(tag(), i, true,true); df->replaceEdges(toParam[i]->my_GEdges); _atlas.push_back(df); } - complex_crossField(); + //complex_crossField(); #endif } @@ -315,7 +302,9 @@ void discreteFace::gatherMeshes() else { if (_CAD.empty())triangles.push_back(t); else - Msg::Warning ("FILE %s LINE %d Triangle from atlas part %u has no classification for (u;v)=(%f;%f)",__FILE__,__LINE__,i+1,pc.x(),pc.y()); + Msg::Warning("FILE %s LINE %d Triangle from atlas part %u has no " + "classification for (u;v)=(%f;%f)",__FILE__, + __LINE__, i+1, pc.x(), pc.y()); } } _atlas[i]->triangles.clear(); @@ -331,7 +320,9 @@ void discreteFace::gatherMeshes() // here we should recompute on the CAD if necessary mt->gf->mesh_vertices.push_back(v); } - else Msg::Warning ("FILE %s LINE %d Vertex has no classification",__FILE__,__LINE__); + else + Msg::Warning("FILE %s LINE %d Vertex has no classification", + __FILE__, __LINE__); } _atlas[i]->mesh_vertices.clear(); } @@ -341,59 +332,36 @@ void discreteFace::gatherMeshes() void discreteFace::mesh(bool verbose) { #if defined(HAVE_ANN) && defined(HAVE_SOLVER) && defined(HAVE_MESH) + /* for(unsigned int j=0; j<_atlas.size(); j++){ - std::list<GEdge*> ge = _atlas[j]->edges(); for(std::list<GEdge*>::iterator it = ge.begin(); it!=ge.end(); ++it){ - char myname[256]; sprintf(myname,"tralala%d_%d.pos",(*it)->tag(),j+1); FILE* debug = Fopen(myname,"w"); fprintf(debug,"View \"discreteEdges\"{\n"); std::vector<MLine*> ml = (*it)->lines; - - //printf("___map %d (%d), ge %d___ (%p)\n",j+1,_atlas[j]->tag(),(*it)->tag(),(*it)); for(unsigned int i=0; i<ml.size(); i++){ ml[i]->writePOS(debug,false,true,false,false,false,false,1.,(*it)->tag()); - //printf("%d[%d;%d]--",ml[i]->getNum(),ml[i]->getVertex(0)->getNum(),ml[i]->getVertex(1)->getNum()); } - //printf("\n"); - fprintf(debug,"};"); fclose(debug); } } + */ - if (!CTX::instance()->meshDiscrete) return; + if(!_meshable && !CTX::instance()->meshDiscrete) return; - //Msg::Info("Discrete Face %d is going to be meshed",tag()); for (unsigned int i=0;i<_atlas.size();i++){ - // { - // void openProblemsON(void); - // if (tag() == 3) openProblemsON(); - // } _atlas[i]->mesh(verbose); - // { - // void openProblemsOFF(void); - // if (tag()==3) openProblemsOFF(); - // } - /* - const char *name = "atlas%d"; - char filename[256]; - sprintf(filename,name,i);t0 - _atlas[i]->printPhysicalMesh(filename);*/ } - gatherMeshes(); meshStatistics.status = GFace::DONE; #endif } - - void discreteFace::checkAndFixOrientation() { - // first of all, all the triangles have to be oriented in the same way std::map<MEdge,std::vector<MElement*>,Less_Edge> ed2tri; // edge to 1 or 2 triangle(s) @@ -409,7 +377,8 @@ void discreteFace::checkAndFixOrientation() std::map<MElement*,std::vector<MElement*> > neighbors; for (unsigned int i=0; i<triangles.size(); ++i){ MElement* e = triangles[i]; - for(int j=0; j<e->getNumEdges(); j++){ // #improveme: efficiency could be improved by setting neighbors mutually + for(int j = 0; j < e->getNumEdges(); j++){ + // #improveme: efficiency could be improved by setting neighbors mutually std::vector<MElement*> my_mt = ed2tri[e->getEdge(j)]; if (my_mt.size() > 1){// my_mt.size() = {1;2} MElement* neighTri = my_mt[0] == e ? my_mt[1] : my_mt[0]; @@ -418,11 +387,14 @@ void discreteFace::checkAndFixOrientation() } } - // queue: first in, first out - std::queue<MElement*> checkList; // element for reference orientation - std::queue< std::vector<MElement*> > checkLists; // corresponding neighbor element to be checked for its orientation - std::queue<MElement*> my_todo; // todo list - std::map<MElement*,bool> check_todo; // help to complete todo list + // element for reference orientation + std::queue<MElement*> checkList; + // corresponding neighbor element to be checked for its orientation + std::queue< std::vector<MElement*> > checkLists; + // todo list + std::queue<MElement*> my_todo; + // help to complete todo list + std::map<MElement*,bool> check_todo; my_todo.push(triangles[0]); @@ -458,10 +430,13 @@ void discreteFace::checkAndFixOrientation() for (unsigned int j=0; j<3; j++){ if (current->getVertex(k) == neigs[i]->getVertex(j)){ myCond = true; - if (!(current->getVertex(k!=2 ?k+1 : 0 ) == neigs[i]->getVertex(j!=0 ? j-1 : 2) || - current->getVertex(k!=0 ?k-1 : 2 ) == neigs[i]->getVertex(j!=2 ? j+1 : 0))){ + if (!(current->getVertex(k!=2 ?k+1 : 0 ) == + neigs[i]->getVertex(j!=0 ? j-1 : 2) || + current->getVertex(k!=0 ?k-1 : 2 ) == + neigs[i]->getVertex(j!=2 ? j+1 : 0))){ neigs[i]->reverse(); - //Msg::Info("discreteFace: triangle %d has been reoriented.",neigs[i]->getNum()); + //Msg::Info("discreteFace: triangle %d has been reoriented.", + // neigs[i]->getNum()); } break; } @@ -469,12 +444,13 @@ void discreteFace::checkAndFixOrientation() if (myCond) break; } - } // end for unsigned int i - } // end while + } + } } - -void discreteFace::setupDiscreteVertex(GVertex*dv,MVertex*mv,std::set<MVertex*>*trash){ +void discreteFace::setupDiscreteVertex(GVertex*dv, MVertex*mv, + std::set<MVertex*>*trash) +{ mv->setEntity(dv); dv->mesh_vertices.push_back(mv); this->model()->add(dv); @@ -487,7 +463,8 @@ void discreteFace::setupDiscreteEdge(discreteEdge*de,std::vector<MLine*>mlines, { this->model()->add(de);// new GEdge de->setTopo(mlines);// associated MLine's - for(unsigned int i=1; i<mlines.size(); i++){//not the first vertex of the GEdge (neither the last one) + for(unsigned int i=1; i<mlines.size(); i++){ + //not the first vertex of the GEdge (neither the last one) mlines[i]->getVertex(0)->setEntity(de); de->mesh_vertices.push_back(mlines[i]->getVertex(0)); if(trash) trash->insert(mlines[i]->getVertex(0)); @@ -495,13 +472,11 @@ void discreteFace::setupDiscreteEdge(discreteEdge*de,std::vector<MLine*>mlines, de->createGeometry(); de->getBeginVertex()->addEdge(de); de->getEndVertex()->addEdge(de); - } // split old GEdge's void discreteFace::splitDiscreteEdge(GEdge *de , GVertex *gv, discreteEdge* newE[2]) { - MVertex *vend = de->getEndVertex()->mesh_vertices[0]; int mytag = this->model()->getMaxElementaryNumber(1) + 1; @@ -561,7 +536,8 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti #if defined(HAVE_SOLVER) && defined(HAVE_ANN) && defined(HAVE_METIS) int nVertex = trian->tri.size(); // number of elements - int nEdge = trian->ed2tri.size() - trian->borderEdg.size();// number of edges, (without the boundary ones) + // number of edges, (without the boundary ones) + int nEdge = trian->ed2tri.size() - trian->borderEdg.size(); std::vector<int> idx; idx.resize(nVertex+1); @@ -592,7 +568,8 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti std::vector<int> part; part.resize(nVertex); int zero = 0; - METIS_PartGraphRecursive(&nVertex,&(idx[0]),&(nbh[0]),NULL,NULL,&zero,&zero,&nPartitions,&zero,&edgeCut,&(part[0])); + METIS_PartGraphRecursive(&nVertex, &(idx[0]), &(nbh[0]), NULL, NULL, + &zero, &zero, &nPartitions, &zero, &edgeCut, &(part[0])); std::map<MElement*,int> el2part; std::vector<std::vector<MElement*> > elem; @@ -604,14 +581,18 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti //check connectivity for(int p=0; p<nPartitions; p++){// part by part - std::set<MElement*> celem(elem[p].begin(),elem[p].end());// current elements of the p-th part - std::queue<MElement*> my_todo; // todo list, for adjacency check - in order to check the connectivity of the part - std::map<MElement*,bool> check_todo; // help to complete todo list + // current elements of the p-th part + std::set<MElement*> celem(elem[p].begin(),elem[p].end()); + // todo list, for adjacency check - in order to check the connectivity of the part + std::queue<MElement*> my_todo; + // help to complete todo list + std::map<MElement*,bool> check_todo; std::vector<MElement*> temp = elem[p]; MElement* starter = temp[0]; my_todo.push(starter); check_todo[starter] = true; - celem.erase(starter);// if the element is connected to the previous ones, it is removed from the set + // if the element is connected to the previous ones, it is removed from the set + celem.erase(starter); while(!my_todo.empty()){ MElement* current = my_todo.front(); my_todo.pop(); @@ -620,32 +601,35 @@ void discreteFace::split(triangulation* trian,std::vector<triangulation*> &parti if(trian->ed2tri[ed].size()>1){ const std::vector<int> &oldnums = trian->ed2tri[ed]; int on = trian->tri[oldnums[0]] == current ? oldnums[1] : oldnums[0]; - if(check_todo.find(trian->tri[on])==check_todo.end() && el2part[trian->tri[on]]==p){ + if(check_todo.find(trian->tri[on])==check_todo.end() && + el2part[trian->tri[on]]==p){ my_todo.push(trian->tri[on]); check_todo[trian->tri[on]] = true; celem.erase(trian->tri[on]); } } - }// end for j - }// end while - if(!celem.empty()){// if the set is empty, it means that the part was connected - //Msg::Info("discreteFace::split(), a partition (%d) is not connected: it is going to be fixed.",p); + } + } + // if the set is empty, it means that the part was connected + if(!celem.empty()){ std::vector<MElement*> relem(celem.begin(),celem.end());// new part - for(unsigned int ie=0; ie<relem.size(); ie++)// updating the id part of the element belonging to the new part + // updating the id part of the element belonging to the new part + for(unsigned int ie=0; ie<relem.size(); ie++) el2part[relem[ie]] = nPartitions; nPartitions++; elem.push_back(relem); - std::set<MElement*> _elem(elem[p].begin(),elem[p].end());// updating the elements of the current part - for(std::set<MElement*>::iterator its=celem.begin(); its!=celem.end(); ++its) + // updating the elements of the current part + std::set<MElement*> _elem(elem[p].begin(),elem[p].end()); + for(std::set<MElement*>::iterator its = celem.begin(); its != celem.end(); ++its) _elem.erase(*its); elem[p].clear(); std::vector<MElement*> upe(_elem.begin(),_elem.end()); elem[p] = upe; } - }// end for p - for(int i=0; i<nPartitions; i++)// new triangulation of the connected parts + } + // new triangulation of the connected parts + for(int i=0; i<nPartitions; i++) partition.push_back(new triangulation(i, elem[i],this)); - #endif } @@ -656,19 +640,30 @@ void discreteFace::updateTopology(std::vector<triangulation*>&partition) //---- setting topology, i.e. GEdge's and GVertex's ----// //------------------------------------------------------// int nPartitions = partition.size(); - std::set<MVertex*> todelete; // vertices that do not belong to the GFace anymore - std::set<GEdge*> gGEdges(l_edges.begin(),l_edges.end());// initial GEdges of the GFace (to be updated) - - for(int i=0; i<nPartitions; i++){// each part is going to be compared with the other ones - const std::set<MEdge,Less_Edge> &bordi = partition[i]->borderEdg;// edges defining the border(s) of the i-th new triangulation - for(int ii=i+1; ii<nPartitions; ii++){// compare to the ii-th partitions, with ii > i since ii < i have already been compared - std::map<MVertex*,MLine*> v02edg;//first vertex of the MLine + // vertices that do not belong to the GFace anymore + std::set<MVertex*> todelete; + // initial GEdges of the GFace (to be updated) + std::set<GEdge*> gGEdges(l_edges.begin(),l_edges.end()); + + // each part is going to be compared with the other ones + for(int i = 0; i < nPartitions; i++){ + // edges defining the border(s) of the i-th new triangulation + const std::set<MEdge,Less_Edge> &bordi = partition[i]->borderEdg; + // compare to the ii-th partitions, with ii > i since ii < i have already + // been compared + for(int ii=i+1; ii<nPartitions; ii++){ + std::map<MVertex*,MLine*> v02edg; //first vertex of the MLine std::set<MVertex*> first, last; - const std::set<MEdge,Less_Edge> &bii = partition[ii]->borderEdg;// edges defining the border(s) of the ii-th new triangulation - for(std::set<MEdge,Less_Edge>::iterator ie = bordi.begin(); ie != bordi.end(); ++ie){// MEdge by MEdge of the i-th triangulation border(s) - if(bii.find(*ie)!=bii.end()){// if the border edge is common to both triangulations, then it is a future GEdge - composed of MLine's - v02edg[ie->getVertex(0)] = new MLine(ie->getVertex(0),ie->getVertex(1));// a new MLine is created - + // edges defining the border(s) of the ii-th new triangulation + const std::set<MEdge,Less_Edge> &bii = partition[ii]->borderEdg; + // MEdge by MEdge of the i-th triangulation border(s) + for(std::set<MEdge,Less_Edge>::iterator ie = bordi.begin(); + ie != bordi.end(); ++ie){ + // if the border edge is common to both triangulations, then it is a + // future GEdge - composed of MLine's + if(bii.find(*ie)!=bii.end()){ + v02edg[ie->getVertex(0)] = new MLine(ie->getVertex(0), + ie->getVertex(1)); // identifying first and last vertices of the future GEdge's, if any if( first.find(ie->getVertex(1)) != first.end() ) first.erase(ie->getVertex(1)); @@ -678,19 +673,19 @@ void discreteFace::updateTopology(std::vector<triangulation*>&partition) last.erase(ie->getVertex(0)); else first.insert(ie->getVertex(0)); - }// end bii.find - }//end for ie + } + } - //---- creation of the GEdge's from new MLine's ----// + // creation of the GEdge's from new MLine's while(!first.empty()){// starting with nonloop GEdge's - GVertex *v[2];// a GEdge is defined by two GVertex - std::vector<MLine*> myLines;// MLine's of the current nonloop GEdge + GVertex *v[2]; // a GEdge is defined by two GVertex + std::vector<MLine*> myLines; // MLine's of the current nonloop GEdge std::set<MVertex*>::iterator itf = first.begin(); - MVertex* cv0 = *itf;// starting with a first vertex - while(last.find(cv0) == last.end()){// until reaching the corresponding last vertex - myLines.push_back(v02edg[cv0]);// push the correspong MLine - v02edg.erase(cv0);// and erasing it from the map - cv0 = myLines.back()->getVertex(1);// next vertex + MVertex* cv0 = *itf; // starting with a first vertex + while(last.find(cv0) == last.end()){ // until reaching the corresponding last vertex + myLines.push_back(v02edg[cv0]); // push the correspong MLine + v02edg.erase(cv0); // and erasing it from the map + cv0 = myLines.back()->getVertex(1); // next vertex }// end last std::vector<MVertex*> mvt; mvt.resize(2); @@ -698,39 +693,47 @@ void discreteFace::updateTopology(std::vector<triangulation*>&partition) mvt[1] = cv0; // creation of the GVertex, for new nonloop GEdge's for(int imvt=0; imvt<2; imvt++){ - std::set<GEdge*>::iterator oe=gGEdges.begin();// find the old GEdge that has the current new GVertex - while(oe !=gGEdges.end() && mvt[imvt]->onWhat() != *oe && mvt[imvt]->onWhat() != (*oe)->getBeginVertex() && mvt[imvt]->onWhat() != (*oe)->getEndVertex()) + // find the old GEdge that has the current new GVertex + std::set<GEdge*>::iterator oe = gGEdges.begin(); + while(oe !=gGEdges.end() && mvt[imvt]->onWhat() != *oe && + mvt[imvt]->onWhat() != (*oe)->getBeginVertex() && + mvt[imvt]->onWhat() != (*oe)->getEndVertex()) ++oe; - - if (oe == gGEdges.end()){// not on an existing GEdge: new internal GVertex - v[imvt] = new discreteVertex (this->model(),model()->getMaxElementaryNumber(0) + 1); + // not on an existing GEdge: new internal GVertex + if (oe == gGEdges.end()){ + v[imvt] = new discreteVertex (this->model(), + model()->getMaxElementaryNumber(0) + 1); setupDiscreteVertex(v[imvt],mvt[imvt],&todelete); } else{// on an existing GEdge - GEdge* onit = *oe;// the new GVertex can already exist; if it is the case, there is no need to create a new one + // the new GVertex can already exist; if it is the case, there is no + // need to create a new one + GEdge* onit = *oe; if(mvt[imvt] == onit->getBeginVertex()->mesh_vertices[0]) v[imvt] = onit->getBeginVertex(); else if (mvt[imvt] == onit->getEndVertex()->mesh_vertices[0]) v[imvt] = onit->getEndVertex(); else{ - v[imvt] = new discreteVertex (this->model(),model()->getMaxElementaryNumber(0) + 1); + v[imvt] = new discreteVertex (this->model(), + model()->getMaxElementaryNumber(0) + 1); setupDiscreteVertex(v[imvt],mvt[imvt],NULL); discreteEdge* de[2]; splitDiscreteEdge(onit,v[imvt],de); gGEdges.erase(onit); gGEdges.insert(de[0]); gGEdges.insert(de[1]); - }// end if-elseif-else - }// end else oe==end() - }// end imvt + } + } + } // the new GEdge can be created with its GVertex - discreteEdge* internalE = new discreteEdge (this->model(),this->model()->getMaxElementaryNumber(1) + 1,v[0],v[1]); + discreteEdge* internalE = new discreteEdge + (this->model(), this->model()->getMaxElementaryNumber(1) + 1,v[0],v[1]); setupDiscreteEdge(internalE,myLines,&todelete); gGEdges.insert(internalE); first.erase(itf);// next first vertex of a nonloop GEdge - }//end while first.empty() + } // remaining MLines for 'loop'GEdge's while(!v02edg.empty()){ @@ -744,13 +747,13 @@ void discreteFace::updateTopology(std::vector<triangulation*>&partition) } v = new discreteVertex (this->model(),model()->getMaxElementaryNumber(0) + 1); setupDiscreteVertex(v,cv0,&todelete); - discreteEdge* gloop = new discreteEdge (this->model(),this->model()->getMaxElementaryNumber(1) + 1,v,v); + discreteEdge* gloop = new discreteEdge + (this->model(),this->model()->getMaxElementaryNumber(1) + 1,v,v); setupDiscreteEdge(gloop,my_MLines,&todelete); gGEdges.insert(gloop); - }// end while v02edg.empty() - }//end for ii - }// end for i - + } + } + } // adding old-updated bounding GEdge's to the corresponding partitions for(std::set<GEdge*>::iterator le=gGEdges.begin(); le!=gGEdges.end(); ++le){ @@ -778,7 +781,8 @@ void discreteFace::updateTopology(std::vector<triangulation*>&partition) } void discreteFace::fillHoles(triangulation* trian) -{// #improveme moving the center +{ + // #improveme moving the center #if defined(HAVE_SOLVER) && defined(HAVE_ANN) std::map<double,std::vector<MVertex*> > bords = trian->bord; std::map<double,std::vector<MVertex*> >::reverse_iterator it = bords.rbegin(); @@ -818,18 +822,28 @@ void discreteFace::fillHoles(triangulation* trian) SVector3 nmean(0.,0.,0.); for(unsigned int j=1; j<mv.size(); j++){ addTriangle(trian,new MTriangle(mv[j],mv[j-1],center)); - SVector3 temp0(center->x()-mv[j]->x(),center->y()-mv[j]->y(),center->z()-mv[j]->z()); - SVector3 temp1(center->x()-mv[j-1]->x(),center->y()-mv[j-1]->y(),center->z()-mv[j-1]->z()); + SVector3 temp0(center->x()-mv[j]->x(), + center->y()-mv[j]->y(), + center->z()-mv[j]->z()); + SVector3 temp1(center->x()-mv[j-1]->x(), + center->y()-mv[j-1]->y(), + center->z()-mv[j-1]->z()); SVector3 temp(crossprod(temp0,temp1)); nmean += temp; } addTriangle(trian,new MTriangle(mv[0],mv[mv.size()-1],center)); - SVector3 temp0(center->x()-mv[0]->x(),center->y()-mv[0]->y(),center->z()-mv[0]->z()); - SVector3 temp1(center->x()-mv[mv.size()-1]->x(),center->y()-mv[mv.size()-1]->y(),center->z()-mv[mv.size()-1]->z()); + SVector3 temp0(center->x()-mv[0]->x(), + center->y()-mv[0]->y(), + center->z()-mv[0]->z()); + SVector3 temp1(center->x()-mv[mv.size()-1]->x(), + center->y()-mv[mv.size()-1]->y(), + center->z()-mv[mv.size()-1]->z()); SVector3 temp(crossprod(temp0,temp1)); nmean += temp; nmean *= 1./(norm(nmean)*mv.size()); - MVertex update(center->x()+nmean.x(),center->y()+nmean.y(),center->z()+nmean.z()); + MVertex update(center->x()+nmean.x(), + center->y()+nmean.y(), + center->z()+nmean.z()); *center = update; center->setEntity(this); } @@ -849,19 +863,18 @@ void discreteFace::addTriangle(triangulation* trian, MTriangle* t) #endif } - - void discreteFace::complex_crossField() { #if defined(HAVE_SOLVER) && defined(HAVE_ANN) - // COMPLEX linear system + // complex linear system linearSystem<std::complex<double> > * lsys; #ifdef HAVE_PETSC #ifdef PETSC_USE_COMPLEX lsys = new linearSystemPETSc<std::complex<double> >; #else - Msg::Error("Petsc complex is required (we do need complex in discreteFace::complex_crossField())"); + Msg::Error("Petsc complex is required (we do need complex in " + "discreteFace::complex_crossField())"); return; #endif #else @@ -890,9 +903,8 @@ void discreteFace::complex_crossField() triangles[mini]->getEdgeInfo(ed,num,s); myAssembler.numberDof(3*mini+num,0); ed2key[ed] = 3*mini+num; - }// end for j - }// end for unsigned int i - + } + } double grad[3][3] = {{0.,-2.,0.},{2.,2.,0.},{-2.,0.,0.}}; for (unsigned int i=0; i<triangles.size(); i++){ @@ -924,14 +936,12 @@ void discreteFace::complex_crossField() Dof C(ed2key[tri->getEdge(k)],0); myAssembler.assemble(R,C,K_jk); - }// end for k - - }// end for j - - }// end for unsigned int - + } + } + } lsys->systemSolve(); + FILE* myfile = Fopen("crossField.pos","w"); fprintf(myfile,"View \"cross\"{\n"); for(unsigned int i=0; i<triangles.size(); i++){ @@ -958,7 +968,8 @@ void discreteFace::complex_crossField() std::vector<double> U; U.resize(3); std::vector<double> V; V.resize(3); for(int j=0; j<3; j++){ - fprintf(myfile,"%f,%f,%f",tri->getVertex(j)->x(),tri->getVertex(j)->y(),tri->getVertex(j)->z()); + fprintf(myfile,"%f,%f,%f",tri->getVertex(j)->x(), + tri->getVertex(j)->y(),tri->getVertex(j)->z()); if (j<2) fprintf(myfile,","); MEdge ed = tri->getEdge(j); std::complex<double> fstar; // edge basis @@ -976,7 +987,9 @@ void discreteFace::complex_crossField() fprintf(myfile,"{"); for(int j=0; j<3; j++){ double u = Fu[j], v = Fv[j]; double theta = std::atan2(v,u)/4.; - SVector3 cf(cos(theta)*e.x()+sin(theta)*d.x(),cos(theta)*e.y()+sin(theta)*d.y(),cos(theta)*e.z()+sin(theta)*d.z()); + SVector3 cf(cos(theta)*e.x()+sin(theta)*d.x(), + cos(theta)*e.y()+sin(theta)*d.y(), + cos(theta)*e.z()+sin(theta)*d.z()); cf = cf*sqrt(u*u+v*v); fprintf(myfile,"%f,%f,%f",cf.x(),cf.y(),cf.z()); if (j<2) fprintf(myfile,","); @@ -985,12 +998,10 @@ void discreteFace::complex_crossField() } fprintf(myfile,"};"); fclose(myfile); + #endif } - - - void discreteFace::crossField() { #if defined(HAVE_SOLVER) && defined(HAVE_ANN) @@ -1027,8 +1038,8 @@ void discreteFace::crossField() myAssembler.numberDof(3*mini+num,0); // u, not U myAssembler.numberDof(3*mini+num,1); // v, not V ed2key[ed] = 3*mini+num; - }// end for j - }// end for unsigned int i + } + } double grad[3][3] = {{0.,-2.,0.},{2.,2.,0.},{-2.,0.,0.}}; for (unsigned int i=0; i<triangles.size(); i++){ @@ -1059,23 +1070,16 @@ void discreteFace::crossField() for(int kk=0; kk<3; kk++) K_jk += grad[j][jj] * invjac[l][jj] * invjac[l][kk] * grad[k][kk]; K_jk *= dJac/2.; - //printf("%f\t",K_jk); - //printf("%f \t %f \n %f \t %f \n",cos(4.*(alpha_j-alpha_k))*K_jk,sin(4.*(alpha_j-alpha_k))*K_jk,sin(4.*(alpha_k-alpha_j))*K_jk,cos(4.*(alpha_j-alpha_k))*K_jk); - - myAssembler.assemble(Ru,Cu,cos(4.*(alpha_j-alpha_k))*K_jk); myAssembler.assemble(Ru,Cv,sin(4.*(alpha_j-alpha_k))*K_jk); myAssembler.assemble(Rv,Cu,sin(4.*(alpha_k-alpha_j))*K_jk); myAssembler.assemble(Rv,Cv,cos(4.*(alpha_j-alpha_k))*K_jk); - }// end for k - //printf("\n"); - - }// end for j - //printf("\n"); - }// end for unsigned int - + } + } + } lsys->systemSolve(); + FILE* myfile = Fopen("crossField.pos","w"); fprintf(myfile,"View \"cross\"{\n"); for(unsigned int i=0; i<triangles.size(); i++){ @@ -1101,11 +1105,11 @@ void discreteFace::crossField() SVector3 d = crossprod(n,e); d.normalize(); //printf("d=(%f %f)\n",d.x(),d.y()); - std::vector<double> U; U.resize(3); std::vector<double> V; V.resize(3); for(int j=0; j<3; j++){ - fprintf(myfile,"%f,%f,%f",tri->getVertex(j)->x(),tri->getVertex(j)->y(),tri->getVertex(j)->z()); + fprintf(myfile,"%f,%f,%f",tri->getVertex(j)->x(),tri->getVertex(j)->y(), + tri->getVertex(j)->z()); if (j<2) fprintf(myfile,","); MEdge ed = tri->getEdge(j); double u, v;// edge basis @@ -1116,7 +1120,6 @@ void discreteFace::crossField() double alpha = getAlpha(tri,j);// triangle basis U[j] = cos(4.*alpha)*u - sin(4.*alpha)*v;// U, not u V[j] = sin(4.*alpha)*u + cos(4.*alpha)*v;// V, not v - //printf("sol: ed%d[%f,%f]--[%f,%f] \t Theta = %f (tri) ~ theta = %f (ed) ~ alpha = %f ~u=%f, v=%f VS U=%f, V=%f \n",j,ed.getSortedVertex(0)->x(),ed.getSortedVertex(0)->y(),ed.getSortedVertex(1)->x(),ed.getSortedVertex(1)->y(),std::atan2(V[j],U[j])*180./(4.*M_PI),std::atan2(v,u)*180./(4.*M_PI),alpha*180./M_PI,u,v,U[j],V[j]); } fprintf(myfile,")"); std::vector<double> Fu, Fv; @@ -1125,11 +1128,10 @@ void discreteFace::crossField() fprintf(myfile,"{"); for(int j=0; j<3; j++){ double u = Fu[j], v = Fv[j]; double theta = std::atan2(v,u)/4.; - //printf("theta_%d = %f\n",j,theta*180./M_PI); - SVector3 cf(cos(theta)*e.x()+sin(theta)*d.x(),cos(theta)*e.y()+sin(theta)*d.y(),cos(theta)*e.z()+sin(theta)*d.z()); - //cf = cf*sqrt(u*u+v*v); - fprintf(myfile,"%f,%f,%f",cf.x(),cf.y(),cf.z());//cos(theta)*e.x()-sin(theta)*e.y(),sin(theta)*e.x()+cos(theta)*e.y(),e.z()); - + SVector3 cf(cos(theta)*e.x()+sin(theta)*d.x(), + cos(theta)*e.y()+sin(theta)*d.y(), + cos(theta)*e.z()+sin(theta)*d.z()); + fprintf(myfile,"%f,%f,%f",cf.x(),cf.y(),cf.z()); if( std::abs(dot(cf,n)) > 1e-12) printf("/!\\ ---> warning orthogonality \t %f \n",dot(cf,n)); if (j<2) fprintf(myfile,","); @@ -1141,7 +1143,6 @@ void discreteFace::crossField() #endif } - void discreteFace::writeGEO(FILE *fp) { fprintf(fp, "Discrete Face(%d) = {",tag()); diff --git a/Geo/discreteFace.h b/Geo/discreteFace.h index 71a83fec6a15b8317e9f07325f230065fa2e8039..d8427947948983fef0c4f2ea60e64b5f93c1bebb 100644 --- a/Geo/discreteFace.h +++ b/Geo/discreteFace.h @@ -18,10 +18,10 @@ class discreteDiskFace; class triangulation; class discreteFace : public GFace { - // FIXME we should at the end use a mesh() function that is specific to - // discreteFace; we should also SAVE those data's + private: + bool _meshable; public: - discreteFace(GModel *model, int num); + discreteFace(GModel *model, int num, bool meshable=false); virtual ~discreteFace() {} void checkAndFixOrientation(); void setupDiscreteVertex(GVertex*,MVertex*,std::set<MVertex*>*); @@ -40,7 +40,6 @@ class discreteFace : public GFace { double curvatureMax(const SPoint2 ¶m) const; double curvatures(const SPoint2 ¶m, SVector3 *dirMax, SVector3 *dirMin, double *curvMax, double *curvMin) const; - virtual bool haveParametrization() { return getCompound(); } GEntity::GeomType geomType() const { return DiscreteSurface; } virtual Pair<SVector3, SVector3> firstDer(const SPoint2 ¶m) const; virtual void secondDer(const SPoint2 ¶m, @@ -52,7 +51,7 @@ class discreteFace : public GFace { void writeGEO(FILE *fp); void createGeometry(); void gatherMeshes(); - virtual void mesh (bool verbose); + virtual void mesh(bool verbose); std::vector<discreteDiskFace*> _atlas; std::vector<GFace*> _CAD; std::map<MEdge,std::vector<int>,Less_Edge> allEdg2Tri; diff --git a/Geo/gmshEdge.cpp b/Geo/gmshEdge.cpp index 1283ce10c341a60cc4f96354103fe22d3722e265..0065e954a4bedcd0cccfe299ec070d844f348a51 100644 --- a/Geo/gmshEdge.cpp +++ b/Geo/gmshEdge.cpp @@ -6,7 +6,6 @@ #include <sstream> #include "GModel.h" #include "GFace.h" -#include "GFaceCompound.h" #include "gmshEdge.h" #include "Geo.h" #include "GeoInterpolation.h" diff --git a/Geo/gmshLevelset.cpp b/Geo/gmshLevelset.cpp index 24d6b01fa9629f2cc44827b04e1d643c6924eeea..f71f2d88364441047271f97ec4d20047a443f189 100644 --- a/Geo/gmshLevelset.cpp +++ b/Geo/gmshLevelset.cpp @@ -436,7 +436,6 @@ fullMatrix<double> gLevelsetPoints::generateRbfMat(int p, int index, } } return rbfMat; - } void gLevelsetPoints::RbfOp(int p, int index, diff --git a/Graphics/drawGeom.cpp b/Graphics/drawGeom.cpp index 67cf4f25f125e2a3497678e4a77c0637c466e453..59b1eef9c0ee4f8814ce4cbc0f28779ef3772d38 100644 --- a/Graphics/drawGeom.cpp +++ b/Graphics/drawGeom.cpp @@ -11,8 +11,6 @@ #include "GModel.h" #include "SBoundingBox3d.h" #include "GmshMessage.h" -#include "GEdgeCompound.h" -#include "GFaceCompound.h" static void drawEntityLabel(drawContext *ctx, GEntity *e, double x, double y, double z, double offset) @@ -124,7 +122,6 @@ class drawGEdge { if(e->geomType() == GEntity::DiscreteCurve) return; if(e->geomType() == GEntity::PartitionCurve) return; if(e->geomType() == GEntity::BoundaryLayerCurve) return; - // if(e->geomType() == GEntity::CompoundCurve) return; bool select = (_ctx->render_mode == drawContext::GMSH_SELECT && e->model() == GModel::current()); @@ -286,7 +283,7 @@ class drawGFace { if(CTX::instance()->geom.surfaces){ if(CTX::instance()->geom.surfaceType > 0 && f->va_geom_triangles){ bool selected = false; - if (f->getSelection() || (f->getCompound() && f->getCompound()->getSelection())) + if (f->getSelection()) selected = true; _drawVertexArray (f->va_geom_triangles, CTX::instance()->geom.light, @@ -365,8 +362,6 @@ class drawGFace { if(CTX::instance()->geom.surfaces) { //bool selected = false; - //if (f->getSelection() || (f->getCompound() && f->getCompound()->getSelection())) - //selected = true; if(CTX::instance()->geom.surfaceType > 0 && f->va_geom_triangles){ _drawVertexArray(f->va_geom_triangles, CTX::instance()->geom.light, f->getSelection(), CTX::instance()->color.geom.selection); @@ -415,24 +410,6 @@ class drawGFace { } } - void _drawCompoundGFace(GFace *f, bool visible = false, bool selected = false) - { - GFaceCompound *fc = (GFaceCompound*) f; - std::list<GFace*> faces = fc->getCompounds(); - for (std::list<GFace*>::iterator it = faces.begin(); it!=faces.end(); it++) { - if ((*it)->geomType() == GEntity::DiscreteSurface) continue; - if ((*it)->geomType() == GEntity::PartitionSurface) continue; - if ((*it)->geomType() == GEntity::BoundaryLayerSurface) continue; - - if((*it)->geomType() == GEntity::CompoundSurface) - _drawCompoundGFace((*it)); - else if ((*it)->geomType() == GEntity::Plane) - _drawPlaneGFace((*it)); - else - _drawParametricGFace((*it)); - } - } - public : drawGFace(drawContext *ctx) : _ctx(ctx) {} void operator () (GFace *f) @@ -467,9 +444,7 @@ class drawGFace { else glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); - if(f->geomType() == GEntity::CompoundSurface) - _drawCompoundGFace(f); - else if(f->geomType() == GEntity::Plane) + if(f->geomType() == GEntity::Plane) _drawPlaneGFace(f); else _drawParametricGFace(f); diff --git a/Graphics/drawMesh.cpp b/Graphics/drawMesh.cpp index 1240f3117024343a61d6782aa4d4b91833ca0369..41d34f3dd3a2263e9c3c70936c1a61277d63ae58 100644 --- a/Graphics/drawMesh.cpp +++ b/Graphics/drawMesh.cpp @@ -8,8 +8,6 @@ #include "GmshMessage.h" #include "GmshDefines.h" #include "GModel.h" -#include "GFaceCompound.h" -#include "GEdgeCompound.h" #include "MLine.h" #include "MTriangle.h" #include "MQuadrangle.h" @@ -147,12 +145,6 @@ static void drawVertexLabel(drawContext *ctx, GEntity *e, MVertex *v, static void drawVerticesPerEntity(drawContext *ctx, GEntity *e) { - //if(e->dim() == 2) { - // if(e->cast2Edge()->getCompound()) { - // if(e->cast2Edge()->getCompound() - // - // } - //} if(CTX::instance()->mesh.points) { if(CTX::instance()->mesh.pointType) { for(unsigned int i = 0; i < e->mesh_vertices.size(); i++){ @@ -442,11 +434,7 @@ class drawMeshGEdge { void operator () (GEdge *e) { if(!e->getVisibility()) { - if(e->getCompound()) { - if(!e->getCompound()->getVisibility()) return; - } - else - return; + return; } bool select = (_ctx->render_mode == drawContext::GMSH_SELECT && @@ -491,11 +479,7 @@ class drawMeshGFace { void operator () (GFace *f) { if(!f->getVisibility()) { - if(f->getCompound()) { - if(!f->getCompound()->getVisibility()) return; - } - else - return; + return; } bool select = (_ctx->render_mode == drawContext::GMSH_SELECT && diff --git a/Mesh/BackgroundMesh.cpp b/Mesh/BackgroundMesh.cpp index b2cc9aa681a2e7274d63093523278bcac37e0d06..02f197233c45691a33a6996dce85547cf1d7bf22 100644 --- a/Mesh/BackgroundMesh.cpp +++ b/Mesh/BackgroundMesh.cpp @@ -9,9 +9,7 @@ #include "Context.h" #include "GVertex.h" #include "GEdge.h" -#include "GEdgeCompound.h" #include "GFace.h" -#include "GFaceCompound.h" #include "GModel.h" #include "OS.h" #include "Field.h" @@ -226,8 +224,7 @@ static void propagateValuesOnFace(GFace *_gf, void backgroundMesh::propagate1dMesh(GFace *_gf) { - std::list<GEdge*> e;// = _gf->edges(); - replaceMeshCompound(_gf, e); + std::list<GEdge*> e = _gf->edges(); std::list<GEdge*>::const_iterator it = e.begin(); std::map<MVertex*,double> sizes; @@ -281,9 +278,7 @@ crossField2d::crossField2d(MVertex* v, GEdge* ge) void backgroundMesh::propagateCrossFieldByDistance(GFace *_gf) { - std::list<GEdge*> e; - replaceMeshCompound(_gf, e); - + std::list<GEdge*> e = _gf->edges(); std::list<GEdge*>::const_iterator it = e.begin(); std::map<MVertex*,double> _cosines4,_sines4; std::map<MVertex*,SPoint2> _param; @@ -441,12 +436,8 @@ void backgroundMesh::propagateCrossFieldHJ(GFace *_gf) void backgroundMesh::propagateCrossField(GFace *_gf, simpleFunction<double> *ONE) { std::map<MVertex*,double> _cosines4,_sines4; - - std::list<GEdge*> e; - replaceMeshCompound(_gf, e); - + std::list<GEdge*> e = _gf->edges(); std::list<GEdge*>::const_iterator it = e.begin(); - for( ; it != e.end(); ++it ){ if (!(*it)->isSeam(_gf)){ for(unsigned int i = 0; i < (*it)->lines.size(); i++ ){ @@ -486,7 +477,7 @@ void backgroundMesh::propagateCrossField(GFace *_gf, simpleFunction<double> *ONE // print("cos4.pos",0,_cosines4,0); // print("sin4.pos",0,_sines4,0); - + std::map<MVertex*,MVertex*>::iterator itv2 = _2Dto3D.begin(); for ( ; itv2 != _2Dto3D.end(); ++itv2){ MVertex *v_2D = itv2->first; diff --git a/Mesh/BackgroundMesh2D.cpp b/Mesh/BackgroundMesh2D.cpp index f3ff9e3c775fe0baeb79dc4ddd89564c4a8a57d2..fbf195fff73eacfea607349e898bef0496bc6934 100644 --- a/Mesh/BackgroundMesh2D.cpp +++ b/Mesh/BackgroundMesh2D.cpp @@ -10,9 +10,7 @@ #include "GModel.h" #include "GVertex.h" #include "GEdge.h" -#include "GEdgeCompound.h" #include "GFace.h" -#include "GFaceCompound.h" #include "MElement.h" #include "MElementOctree.h" #include "MTriangle.h" @@ -290,8 +288,7 @@ void backgroundMesh2D::computeSizeField() return; } - list<GEdge*> e; - replaceMeshCompound(face, e); + list<GEdge*> e = face->edges(); list<GEdge*>::const_iterator it = e.begin(); DoubleStorageType sizes; @@ -394,7 +391,8 @@ void backgroundMesh2D::updateSizes() -frameFieldBackgroundMesh2D::frameFieldBackgroundMesh2D(GFace *_gf):backgroundMesh2D(_gf,false) +frameFieldBackgroundMesh2D::frameFieldBackgroundMesh2D(GFace *_gf) + : backgroundMesh2D(_gf, false) { reset(); @@ -476,15 +474,12 @@ void frameFieldBackgroundMesh2D::computeCrossField(simpleFunction<double> &eval_ DoubleStorageType _cosines4,_sines4; - list<GEdge*> e; GFace *face = dynamic_cast<GFace*>(gf); if(!face){ Msg::Error("Entity is not a face in background mesh"); return; } - - replaceMeshCompound(face, e); - + list<GEdge*> e = face->edges(); list<GEdge*>::const_iterator it = e.begin(); for( ; it != e.end(); ++it ){ diff --git a/Mesh/BackgroundMeshTools.cpp b/Mesh/BackgroundMeshTools.cpp index 85dc609596df67087f840ec513a90996e3c39a46..e882aa3fd9933e766c7cd86f6818147b8eb9e24a 100644 --- a/Mesh/BackgroundMeshTools.cpp +++ b/Mesh/BackgroundMeshTools.cpp @@ -7,7 +7,6 @@ #include "GFace.h" #include "GVertex.h" #include "GEdge.h" -#include "GEdgeCompound.h" #include "GEntity.h" #include "Context.h" #include "Field.h" @@ -19,12 +18,9 @@ static double max_surf_curvature(const GEdge *ge, double u) std::list<GFace *> faces = ge->faces(); std::list<GFace *>::iterator it = faces.begin(); while(it != faces.end()){ - if ((*it)->geomType() != GEntity::CompoundSurface && - (*it)->geomType() != GEntity::DiscreteSurface){ - SPoint2 par = ge->reparamOnFace((*it), u, 1); - double cc = (*it)->curvature(par); - val = std::max(cc, val); - } + SPoint2 par = ge->reparamOnFace((*it), u, 1); + double cc = (*it)->curvature(par); + val = std::max(cc, val); ++it; } return val; @@ -93,71 +89,24 @@ SMetric3 max_edge_curvature_metric(const GEdge *ge, double u) static SMetric3 metric_based_on_surface_curvature(const GEdge *ge, double u, bool iso_surf) { - const GEdgeCompound* ptrCompoundEdge = dynamic_cast<const GEdgeCompound*>(ge); - if (ptrCompoundEdge){ - double cmax, cmin; - SVector3 dirMax,dirMin; - cmax = ptrCompoundEdge->curvatures(u,&dirMax, &dirMin, &cmax,&cmin); - if (cmin == 0)cmin =1.e-12; - if (cmax == 0)cmax =1.e-12; - double lambda2 = ((2 * M_PI) /( fabs(cmax) * CTX::instance()->mesh.minCircPoints ) ); - double lambda1 = ((2 * M_PI) /( fabs(cmin) * CTX::instance()->mesh.minCircPoints ) ); - SVector3 Z = crossprod(dirMax,dirMin); - - lambda1 = std::max(lambda1, CTX::instance()->mesh.lcMin); - lambda2 = std::max(lambda2, CTX::instance()->mesh.lcMin); - lambda1 = std::min(lambda1, CTX::instance()->mesh.lcMax); - lambda2 = std::min(lambda2, CTX::instance()->mesh.lcMax); - - SMetric3 curvMetric (1. / (lambda1 * lambda1), 1. / (lambda2 * lambda2), - 1.e-12, dirMin, dirMax, Z); - return curvMetric; - } - else{ - SMetric3 mesh_size(1.e-12); - std::list<GFace *> faces = ge->faces(); - std::list<GFace *>::iterator it = faces.begin(); - // we choose the metric eigenvectors to be the ones - // related to the edge ... - SMetric3 curvMetric = max_edge_curvature_metric(ge, u); - while(it != faces.end()){ - if (((*it)->geomType() != GEntity::CompoundSurface) && - ((*it)->geomType() != GEntity::DiscreteSurface)){ - SPoint2 par = ge->reparamOnFace((*it), u, 1); - SMetric3 m = metric_based_on_surface_curvature (*it, par.x(), par.y(), iso_surf); - curvMetric = intersection_conserveM1(curvMetric,m); - } - ++it; - } - - return curvMetric; + SMetric3 mesh_size(1.e-12); + std::list<GFace *> faces = ge->faces(); + std::list<GFace *>::iterator it = faces.begin(); + // we choose the metric eigenvectors to be the ones + // related to the edge ... + SMetric3 curvMetric = max_edge_curvature_metric(ge, u); + while(it != faces.end()){ + SPoint2 par = ge->reparamOnFace((*it), u, 1); + SMetric3 m = metric_based_on_surface_curvature (*it, par.x(), par.y(), iso_surf); + curvMetric = intersection_conserveM1(curvMetric,m); + ++it; } + return curvMetric; } static SMetric3 metric_based_on_surface_curvature(const GVertex *gv, bool iso_surf) { SMetric3 mesh_size(1.e-15); - std::list<GEdge*> l_edges = gv->edges(); - for (std::list<GEdge*>::const_iterator ite = l_edges.begin(); - ite != l_edges.end(); ++ite){ - GEdge *_myGEdge = *ite; - Range<double> bounds = _myGEdge->parBounds(0); - - // ES: Added extra if condition to use the code below only with compund curves - // This is because we want to call the function - // metric_based_on_surface_curvature(const GEdge *ge, double u) for the case when - // ge is a compound edge - if (_myGEdge->geomType() == GEntity::CompoundCurve){ - if (gv == _myGEdge->getBeginVertex()) - mesh_size = intersection - (mesh_size, - metric_based_on_surface_curvature(_myGEdge, bounds.low(), iso_surf)); - else - mesh_size = intersection - (mesh_size, - metric_based_on_surface_curvature(_myGEdge, bounds.high(), iso_surf)); - } - } return mesh_size; } diff --git a/Mesh/BoundaryLayers.cpp b/Mesh/BoundaryLayers.cpp index 41dc3860770106faafc73698b461743b27fed968..635e367440628e7a068413c8935503f892e5fef2 100644 --- a/Mesh/BoundaryLayers.cpp +++ b/Mesh/BoundaryLayers.cpp @@ -13,7 +13,6 @@ #include "meshGFace.h" #include "GmshMessage.h" #include "Field.h" -#include "GFaceCompound.h" #if defined(HAVE_POST) #include "PView.h" @@ -250,20 +249,6 @@ static void checkDepends(GModel *m, GFace *f, std::set<GFace*> &dep) dep.insert(from); checkDepends(m, from, dep); } - - if(f->geomType() == GEntity::CompoundSurface){ - std::list<GFace*> compounds = ((GFaceCompound*)(f))->getCompounds(); - std::list<GFace*>::iterator itgf = compounds.begin(); - for( ; itgf != compounds.end(); itgf++ ){ - if(!(*itgf)){ - Msg::Error("Unknown compound face in boundary layer source face %d", - f->tag()); - return; - } - dep.insert(*itgf); - checkDepends(m, *itgf, dep); - } - } } static unsigned int FixErasedExtrScaleFlags(GModel *m, diff --git a/Mesh/CMakeLists.txt b/Mesh/CMakeLists.txt index a25131ee307a5c4e87540b3a8831a75180fddf36..2f5d07785a59ab0046a06ba1d994b2b8ff2576c8 100644 --- a/Mesh/CMakeLists.txt +++ b/Mesh/CMakeLists.txt @@ -35,7 +35,6 @@ set(SRC HighOrder.cpp meshPartition.cpp meshRefine.cpp - multiscalePartition.cpp QuadTriUtils.cpp QuadTriExtruded2D.cpp QuadTriExtruded3D.cpp QuadTriTransfinite3D.cpp simple3D.cpp ThinLayer.cpp diff --git a/Mesh/DivideAndConquer.cpp b/Mesh/DivideAndConquer.cpp index 81c9d2874133e3ecf472413a5fdae4b421d0eb3a..274e643e436271affbf3233b00ad6c575d320f6a 100644 --- a/Mesh/DivideAndConquer.cpp +++ b/Mesh/DivideAndConquer.cpp @@ -23,7 +23,6 @@ #include "OS.h" #include "GPoint.h" #include "GFace.h" -#include "GEdgeCompound.h" #include "MLine.h" #define Pred(x) ((x)->prev) @@ -1008,7 +1007,7 @@ void DocRecord::concave(double x,double y,GFace* gf) std::set<int>::iterator it2; list = gf->edges(); - replaceMeshCompound(gf,list); + for(it1 = list.begin(); it1 != list.end(); it1++){ edge = *it1; for(unsigned int i = 0; i < edge->getNumMeshElements(); i++){ @@ -1142,7 +1141,7 @@ void DocRecord::clear_edges() bool DocRecord::delaunay_conformity(GFace* gf) { std::list<GEdge*> list = gf->edges(); - replaceMeshCompound(gf,list); + for(std::list<GEdge*>::iterator it = list.begin(); it!= list.end(); it++){ GEdge *edge = *it; for(unsigned int i = 0; i < edge->getNumMeshElements(); i++){ diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp index 5a774d171d72cba44dbb6ffb2574838688296492..4155f72d25c06c8107d44fad19a2d2ca669e79cd 100644 --- a/Mesh/Generator.cpp +++ b/Mesh/Generator.cpp @@ -29,7 +29,6 @@ #include "HighOrder.h" #include "Generator.h" #include "meshGFaceLloyd.h" -#include "GFaceCompound.h" #include "Field.h" #include "Options.h" #include "simple3D.h" @@ -447,12 +446,9 @@ static void Mesh2D(GModel *m) // meshes) is global as it depends on a smooth normal field generated from the // surface mesh of the source surfaces if(!Mesh2DWithBoundaryLayers(m)){ - std::set<GFace*, GEntityLessThan> cf, f; + std::set<GFace*, GEntityLessThan> f; for(GModel::fiter it = m->firstFace(); it != m->lastFace(); ++it) - if ((*it)->geomType() == GEntity::CompoundSurface) - cf.insert(*it); - else - f.insert(*it); + f.insert(*it); Msg::ResetProgressMeter(); @@ -467,28 +463,7 @@ static void Mesh2D(GModel *m) for(size_t K = 0 ; K < temp.size() ; K++){ if (temp[K]->meshStatistics.status == GFace::PENDING){ backgroundMesh::current()->unset(); - // meshGFace mesher(true); temp[K]->mesh(true); -#if defined(HAVE_BFGS) - if(CTX::instance()->mesh.optimizeLloyd){ - if (temp[K]->geomType()==GEntity::CompoundSurface || - temp[K]->geomType()==GEntity::Plane || - temp[K]->geomType()==GEntity::RuledSurface) { - if (temp[K]->meshAttributes.method != MESH_TRANSFINITE && - !temp[K]->meshAttributes.extrude) { - smoothing smm(CTX::instance()->mesh.optimizeLloyd, 6); - //m->writeMSH("beforeLLoyd.msh"); - smm.optimize_face(temp[K]); - int rec = ((CTX::instance()->mesh.recombineAll || - temp[K]->meshAttributes.recombine) && - !CTX::instance()->mesh.recombine3DAll); - //m->writeMSH("afterLLoyd.msh"); - if (rec) recombineIntoQuads(temp[K]); - //m->writeMSH("afterRecombine.msh"); - } - } - } -#endif #if defined(_OPENMP) #pragma omp critical #endif @@ -501,36 +476,6 @@ static void Mesh2D(GModel *m) #if defined(_OPENMP) #pragma omp master #endif - for(std::set<GFace*, GEntityLessThan>::iterator it = cf.begin(); - it != cf.end(); ++it){ - if ((*it)->meshStatistics.status == GFace::PENDING){ - backgroundMesh::current()->unset(); - // meshGFace mesher(true); - (*it)->mesh(true); -#if defined(HAVE_BFGS) - if(CTX::instance()->mesh.optimizeLloyd){ - if ((*it)->geomType()==GEntity::CompoundSurface || - (*it)->geomType()==GEntity::Plane || - (*it)->geomType()==GEntity::RuledSurface) { - if ((*it)->meshAttributes.method != MESH_TRANSFINITE && - !(*it)->meshAttributes.extrude) { - smoothing smm(CTX::instance()->mesh.optimizeLloyd, 6); - //m->writeMSH("beforeLLoyd.msh"); - smm.optimize_face(*it); - int rec = ((CTX::instance()->mesh.recombineAll || - (*it)->meshAttributes.recombine) && - !CTX::instance()->mesh.recombine3DAll); - //m->writeMSH("afterLLoyd.msh"); - if (rec) recombineIntoQuads(*it); - //m->writeMSH("afterRecombine.msh"); - } - } - } -#endif - nPending++; - } - if(!nIter) Msg::ProgressMeter(nPending, nTot, false, "Meshing 2D..."); - } if(!nPending) break; if(nIter++ > 10) break; } diff --git a/Mesh/directions3D.cpp b/Mesh/directions3D.cpp index 7145f30e509971b5a7a4f78162f06eca2f1fef2d..5c17379fa9679e5490a58dd671bfac18967690bd 100644 --- a/Mesh/directions3D.cpp +++ b/Mesh/directions3D.cpp @@ -13,7 +13,6 @@ #include "MTetrahedron.h" #include "directions3D.h" #include "OS.h" -#include "GFaceCompound.h" #include "cross3D.h" #if defined(HAVE_SOLVER) @@ -509,21 +508,6 @@ void Frame_field::initFace(GFace* gf) // compute cumulative cross-data "vertices x elements" for the whole contour of gf std::list<GEdge*> edges = gf->edges(); vertex_to_elements.clear(); - //Replace edges by their compounds - std::set<GEdge*> mySet; - std::list<GEdge*>::iterator it = edges.begin(); - while(it != edges.end()){ - if((*it)->getCompound()){ - GEdge *gec = (GEdge*)(*it)->getCompound(); - mySet.insert(gec); - } - else{ - mySet.insert(*it); - } - ++it; - } - edges.clear(); - edges.insert(edges.begin(), mySet.begin(), mySet.end()); for( std::list<GEdge*>::const_iterator it=edges.begin(); it!=edges.end(); it++){ build_vertex_to_elements(*it,false); } diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp index 6508a69dea59f6bc99ff8e86ddc14ca47b230a0f..e1ea164d64f394e3d207d14c937aea30c77751d5 100644 --- a/Mesh/meshGFace.cpp +++ b/Mesh/meshGFace.cpp @@ -16,7 +16,6 @@ #include "BackgroundMesh.h" #include "GVertex.h" #include "GEdge.h" -#include "GEdgeCompound.h" #include "robustPredicates.h" #include "discreteFace.h" #include "GFace.h" @@ -41,7 +40,6 @@ #include "meshPartition.h" #include "CreateFile.h" #include "Context.h" -#include "multiscalePartition.h" #include "meshGFaceLloyd.h" #include "boundaryLayersData.h" #include "filterElements.h" @@ -958,16 +956,7 @@ static void directions_storage(GFace* gf) gf->storage4.clear(); for(it=vertices.begin();it!=vertices.end();it++){ - ok = 0; - - if(!gf->getCompound()){ - if(gf->geomType()==GEntity::CompoundSurface){ - ok = translate(gf,octree,*it,SPoint2(0.0,0.0),v1,v2); - } - else{ - ok = improved_translate(gf,*it,v1,v2); - } - } + ok = improved_translate(gf,*it,v1,v2); if(ok){ gf->storage1.push_back(SPoint3((*it)->x(),(*it)->y(),(*it)->z())); @@ -998,16 +987,6 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, std::list<int> dir = gf->edgeOrientations(); std::vector<MEdge> medgesToRecover; - // replace edges by their compounds - // if necessary split compound and remesh parts - bool isMeshed = false; - if(gf->geomType() == GEntity::CompoundSurface && !onlyInitialMesh){ - isMeshed = checkMeshCompound((GFaceCompound*) gf, edges); - if (isMeshed) return true; - } - - // if (gf->degenerate(0))return 0; - // build a set with all points of the boundaries std::set<MVertex*, MVertexLessThanNum> all_vertices, boundary; std::list<GEdge*>::iterator ite = edges.begin(); @@ -1507,9 +1486,7 @@ bool meshGenerator(GFace *gf, int RECUR_ITER, //gf->triangles.clear(); //gf->quadrangles.clear(); - // only delete the mesh data stored in the base GFace class (calling - // gf->deleteMesh() would also destroy e.g. the data in a compound face, which - // we should not do) + // only delete the mesh data stored in the base GFace class gf->GFace::deleteMesh(); Msg::Debug("Starting to add internal points"); @@ -2523,247 +2500,6 @@ void meshGFace::operator() (GFace *gf, bool print) } } -bool checkMeshCompound(GFaceCompound *gf, std::list<GEdge*> &edges) -{ - bool isMeshed = false; -#if defined(HAVE_SOLVER) - bool correctTopo = gf->checkTopology(); - if (!correctTopo && gf->allowPartition()){ - partitionAndRemesh((GFaceCompound*) gf); - isMeshed = true; - return isMeshed; - } - - bool correctParam = gf->parametrize(); - - if (!correctParam && gf->allowPartition()){ - partitionAndRemesh((GFaceCompound*) gf); - isMeshed = true; - return isMeshed; - } - - //Replace edges by their compounds - std::set<GEdge*> mySet; - std::list<GEdge*>::iterator it = edges.begin(); - while(it != edges.end()){ - if((*it)->getCompound()){ - mySet.insert((*it)->getCompound()); - } - else{ - mySet.insert(*it); - } - ++it; - } - edges.clear(); - edges.insert(edges.begin(), mySet.begin(), mySet.end()); -#endif - return isMeshed; -} - -void partitionAndRemesh(GFaceCompound *gf) -{ -#if defined(HAVE_SOLVER) && defined(HAVE_ANN) && (defined(HAVE_CHACO) || defined(HAVE_METIS)) - - // Partition the mesh and createTopology for new faces - double tbegin = Cpu(); - std::list<GFace*> cFaces = gf->getCompounds(); - std::vector<MElement *> elements; - for (std::list<GFace*>::iterator it = cFaces.begin(); it != cFaces.end(); it++) - for(unsigned int j = 0; j < (*it)->getNumMeshElements(); j++) - elements.push_back((*it)->getMeshElement(j)); - - typeOfPartition method; - if(gf->nbSplit > 0) method = MULTILEVEL; - else method = LAPLACIAN; - - int allowType = gf->allowPartition(); - multiscalePartition *msp = new multiscalePartition(elements, abs(gf->nbSplit), - method, allowType); - - int NF = msp->getNumberOfParts(); - int numv = gf->model()->getMaxElementaryNumber(0) + 1; - int nume = gf->model()->getMaxElementaryNumber(1) + 1; - int numf = gf->model()->getMaxElementaryNumber(2) + 1; - std::vector<discreteFace*> pFaces; - createPartitionFaces(gf->model(), elements, NF, pFaces); - - gf->model()->createTopologyFromFaces(pFaces); - - double tmult = Cpu(); - Msg::Info("Multiscale Partition SUCCESSFULLY PERFORMED : %d parts (%g s)", - NF, tmult - tbegin); - gf->model()->writeMSH("multiscalePARTS.msh", 2.2, false, true); - - // Remesh new faces (Compound Lines and Compound Surfaces) - Msg::Info("*** Starting parametrize compounds:"); - double t0 = Cpu(); - - //Parametrize Compound Lines - int NE = gf->model()->getMaxElementaryNumber(1) - nume + 1; - for (int i=0; i < NE; i++){ - std::vector<GEdge*>e_compound; - GEdge *pe = gf->model()->getEdgeByTag(nume+i);//partition edge - e_compound.push_back(pe); - int num_gec = nume + NE + i ; - Msg::Info("Parametrize Compound Line (%d) = %d discrete edge", - num_gec, pe->tag()); - GEdgeCompound *gec = new GEdgeCompound(gf->model(), num_gec, e_compound); - gf->model()->add(gec); - } - - // Parametrize Compound surfaces - std::set<MVertex*> allNod; - std::list<GEdge*> U0; - for (int i=0; i < NF; i++){ - std::list<GFace*> f_compound; - GFace *pf = gf->model()->getFaceByTag(numf+i);//partition face - int num_gfc = numf + NF + i ; - f_compound.push_back(pf); - Msg::Info("Parametrize Compound Surface (%d) = %d discrete face", - num_gfc, pf->tag()); - - GFaceCompound *gfc = new GFaceCompound(gf->model(), num_gfc, f_compound, U0, - gf->getTypeOfCompound()); - - gfc->meshAttributes.recombine = gf->meshAttributes.recombine; - gf->model()->add(gfc); - - gfc->parametrize(); - } - - double t1 = Cpu(); - Msg::Info("*** Parametrize compounds done (%g s)", t1-t0); - Msg::Info("*** Starting meshing 1D edges ...:"); - for (int i = 0; i < NE; i++){ - GEdge *gec = gf->model()->getEdgeByTag(nume + NE + i); - meshGEdge mge; - mge(gec); - } - double t2 = Cpu(); - Msg::Info("*** Meshing 1D edges done (%gs)", t2-t1); - - Msg::Info("*** Starting Mesh of surface %d ...", gf->tag()); - - for (int i=0; i < NF; i++){ - GFace *gfc = gf->model()->getFaceByTag(numf + NF + i ); - meshGFace mgf; - mgf(gfc); - - for(unsigned int j = 0; j < gfc->triangles.size(); ++j){ - MTriangle *t = gfc->triangles[j]; - std::vector<MVertex *> v(3); - for(int k = 0; k < 3; k++){ - v[k] = t->getVertex(k); - allNod.insert(v[k]); - } - gf->triangles.push_back(new MTriangle(v[0], v[1], v[2])); - } - for(unsigned int j = 0; j < gfc->quadrangles.size(); ++j){ - MQuadrangle *q = gfc->quadrangles[j]; - std::vector<MVertex *> v(4); - for(int k = 0; k < 4; k++){ - v[k] = q->getVertex(k); - allNod.insert(v[k]); - } - gf->quadrangles.push_back(new MQuadrangle(v[0], v[1], v[2], v[3])); - } - - //update mesh statistics - gf->meshStatistics.efficiency_index += gfc->meshStatistics.efficiency_index; - gf->meshStatistics.longest_edge_length = std::max(gf->meshStatistics.longest_edge_length, - gfc->meshStatistics.longest_edge_length); - gf->meshStatistics.smallest_edge_length= std::min(gf->meshStatistics.smallest_edge_length, - gfc->meshStatistics.smallest_edge_length); - gf->meshStatistics.nbGoodLength += gfc->meshStatistics.nbGoodLength; - gf->meshStatistics.nbGoodQuality += gfc->meshStatistics.nbGoodQuality; - gf->meshStatistics.nbEdge += gfc->meshStatistics.nbEdge; - - } - - // Removing discrete Vertices - Edges - Faces - int NV = gf->model()->getMaxElementaryNumber(0) - numv + 1; - for (int i=0; i < NV; i++){ - GVertex *pv = gf->model()->getVertexByTag(numv+i); - gf->model()->remove(pv); - } - for (int i=0; i < NE; i++){ - GEdge *gec = gf->model()->getEdgeByTag(nume+NE+i); - GEdge *pe = gf->model()->getEdgeByTag(nume+i); - gf->model()->remove(pe); - gf->model()->remove(gec); - } - for (int i=0; i < NF; i++){ - GFace *gfc = gf->model()->getFaceByTag(numf+NF+i); - GFace *pf = gf->model()->getFaceByTag(numf+i); - gf->model()->remove(pf); - gf->model()->remove(gfc); - } - - // Put new mesh in a new discreteFace - for(std::set<MVertex*>::iterator it = allNod.begin(); it != allNod.end(); ++it){ - gf->mesh_vertices.push_back(*it); - } - - // FIXME: This horrible hack is necessary to remove vertices that might belong - // to a GVertex. The true fix is rewrite this part of the code: it's far too - // complex and error prone. - for(GModel::viter it = gf->model()->firstVertex(); it != gf->model()->lastVertex(); it++){ - std::vector<MVertex*>::iterator itve = std::find - (gf->mesh_vertices.begin(), gf->mesh_vertices.end(), (*it)->mesh_vertices[0]); - if(itve != gf->mesh_vertices.end()) - gf->mesh_vertices.erase(itve); - } - - // Remove mesh_vertices that belong to l_edges - std::list<GEdge*> l_edges = gf->edges(); - for(std::list<GEdge*>::iterator it = l_edges.begin(); it != l_edges.end(); it++){ - std::vector<MVertex*> edge_vertices = (*it)->mesh_vertices; - std::vector<MVertex*>::const_iterator itv = edge_vertices.begin(); - for(; itv != edge_vertices.end(); itv++){ - std::vector<MVertex*>::iterator itve = std::find - (gf->mesh_vertices.begin(), gf->mesh_vertices.end(), *itv); - if (itve != gf->mesh_vertices.end()) gf->mesh_vertices.erase(itve); - } - MVertex *vB = (*it)->getBeginVertex()->mesh_vertices[0]; - std::vector<MVertex*>::iterator itvB = std::find - (gf->mesh_vertices.begin(), gf->mesh_vertices.end(), vB); - if (itvB != gf->mesh_vertices.end()) gf->mesh_vertices.erase(itvB); - MVertex *vE = (*it)->getEndVertex()->mesh_vertices[0]; - std::vector<MVertex*>::iterator itvE = std::find - (gf->mesh_vertices.begin(), gf->mesh_vertices.end(), vE); - if (itvE != gf->mesh_vertices.end()) gf->mesh_vertices.erase(itvE); - - //if l_edge is a compond - if((*it)->getCompound()){ - GEdgeCompound *gec = (*it)->getCompound(); - std::vector<MVertex*> edge_vertices = gec->mesh_vertices; - std::vector<MVertex*>::const_iterator itv = edge_vertices.begin(); - for(; itv != edge_vertices.end(); itv++){ - std::vector<MVertex*>::iterator itve = std::find - (gf->mesh_vertices.begin(), gf->mesh_vertices.end(), *itv); - if (itve != gf->mesh_vertices.end()) gf->mesh_vertices.erase(itve); - } - MVertex *vB = (*it)->getBeginVertex()->mesh_vertices[0]; - std::vector<MVertex*>::iterator itvB = std::find - (gf->mesh_vertices.begin(), gf->mesh_vertices.end(), vB); - if (itvB != gf->mesh_vertices.end()) gf->mesh_vertices.erase(itvB); - MVertex *vE = (*it)->getEndVertex()->mesh_vertices[0]; - std::vector<MVertex*>::iterator itvE = std::find - (gf->mesh_vertices.begin(), gf->mesh_vertices.end(), vE); - if (itvE != gf->mesh_vertices.end()) gf->mesh_vertices.erase(itvE); - } - } - - double t3 = Cpu(); - Msg::Info("*** Mesh of surface %d done by assembly %d remeshed faces (%g s)", - gf->tag(), NF, t3-t2); - Msg::Info("-----------------------------------------------------------"); - - gf->coherenceNormals(); - gf->meshStatistics.status = GFace::DONE; -#endif -} - static bool getGFaceNormalFromVert(GFace *gf, MElement *el, SVector3 &nf) { bool found = false; @@ -2832,8 +2568,7 @@ void orientMeshGFace::operator()(GFace *gf) gf->model()->setCurrentMeshEntity(gf); if(gf->geomType() == GEntity::DiscreteSurface || - gf->geomType() == GEntity::BoundaryLayerSurface || - gf->geomType() == GEntity::CompoundSurface){ + gf->geomType() == GEntity::BoundaryLayerSurface){ // don't do anything } else { diff --git a/Mesh/meshGFaceBamg.cpp b/Mesh/meshGFaceBamg.cpp index 7cf9ae6b0778ca3f3696f5b5ff086f2182aacf03..9803db2da32546864c56af4e9f65c1a09c23e427 100644 --- a/Mesh/meshGFaceBamg.cpp +++ b/Mesh/meshGFaceBamg.cpp @@ -20,7 +20,6 @@ #include "meshGFaceDelaunayInsertion.h" #include "Options.h" #include "meshGFace.h" -#include "GFaceCompound.h" #include "MElementOctree.h" #if defined(HAVE_BAMG) @@ -71,29 +70,11 @@ static void computeMeshMetricsForBamg(GFace *gf, int numV, } -void meshGFaceBamg(GFace *gf){ - - std::list<GEdge*> edges = gf->edges(); - bool hasCompounds = false; - - //Replace edges by their compounds - std::set<GEdge*> mySet; - std::list<GEdge*>::iterator it = edges.begin(); - while(it != edges.end()){ - if((*it)->getCompound()){ - hasCompounds = true; - GEdge *gec = (GEdge*)(*it)->getCompound(); - mySet.insert(gec); - } - else{ - mySet.insert(*it); - } - ++it; - } - edges.clear(); - edges.insert(edges.begin(), mySet.begin(), mySet.end()); - std::set<MVertex*> bcVertex; - for (std::list<GEdge*>::iterator it = edges.begin(); it != edges.end(); it++){ +void meshGFaceBamg(GFace *gf) +{ + std::list<GEdge*> edges = gf->edges(); + std::set<MVertex*> bcVertex; + for (std::list<GEdge*>::iterator it = edges.begin(); it != edges.end(); it++){ for (unsigned int i = 0; i < (*it)->lines.size(); i++){ bcVertex.insert((*it)->lines[i]->getVertex(0)); bcVertex.insert((*it)->lines[i]->getVertex(1)); @@ -149,16 +130,6 @@ void meshGFaceBamg(GFace *gf){ double v1(bamgVertices[nodes[0]][1]); double v2(bamgVertices[nodes[1]][1]); double v3(bamgVertices[nodes[2]][1]); - if (hasCompounds){ - MVertex *vv1 = new MVertex(u1,v1,0.0); - MVertex *vv2 = new MVertex(u2,v2,0.0); - MVertex *vv3 = new MVertex(u3,v3,0.0); - newVert.push_back(vv1); - newVert.push_back(vv2); - newVert.push_back(vv3); - MTriangle *tri = new MTriangle(vv1,vv2,vv3, i); - myParamElems.push_back(tri); - } double sign = (u2-u1)*(v3-v1) - (u3-u1)*(v2-v1); if (sign < 0){ int temp = nodes[0]; @@ -189,9 +160,6 @@ void meshGFaceBamg(GFace *gf){ bamgVertices, bamgTriangles, bamgBoundary); MElementOctree *_octree = NULL; - if (hasCompounds){ - _octree = new MElementOctree(myParamElems); - } Mesh2 *refinedBamgMesh = 0; int iterMax = 41; @@ -239,27 +207,6 @@ void meshGFaceBamg(GFace *gf){ // } //If point not found because compound edges have been remeshed and boundary triangles have changed //then we call our new octree - if ( !gp.succeeded() && hasCompounds){ - double uvw[3] = {v[0],v[1], 0.0}; - double UV[3]; - double initialTol = MElement::getTolerance(); - MElement::setTolerance(1.e-2); - MElement *e = _octree->find(v[0],v[1], 0.0, -1); - MElement::setTolerance(initialTol); - if (e){ - e->xyz2uvw(uvw,UV); - double valX[8], valY[8], valZ[8]; - for (int i=0;i<e->getNumPrimaryVertices();i++){ - int numTri = e->getNum(); - valX[i] = gf->triangles[numTri]->getVertex(i)->x(); - valY[i] = gf->triangles[numTri]->getVertex(i)->y(); - valZ[i] = gf->triangles[numTri]->getVertex(i)->z(); - } - gp.x() = e->interpolate(valX,UV[0],UV[1],UV[2]); - gp.y() = e->interpolate(valY,UV[0],UV[1],UV[2]); - gp.z() = e->interpolate(valZ,UV[0],UV[1],UV[2]); - } - } MFaceVertex *x = new MFaceVertex(gp.x(), gp.y(), gp.z(), gf, v[0], v[1]); yetAnother[i] = x; gf->mesh_vertices.push_back(x); diff --git a/Mesh/meshGFaceDelaunayInsertion.cpp b/Mesh/meshGFaceDelaunayInsertion.cpp index 37b7e568916088dadc7dd90b9ee8ef052cac24ec..5e5afb43d6993079fa072ae18313ba19718333ac 100644 --- a/Mesh/meshGFaceDelaunayInsertion.cpp +++ b/Mesh/meshGFaceDelaunayInsertion.cpp @@ -23,7 +23,6 @@ #include "MQuadrangle.h" #include "Field.h" #include "GModel.h" -#include "GFaceCompound.h" #include "discreteDiskFace.h" #include "intersectCurveSurface.h" #include "HilbertCurve.h" @@ -1327,18 +1326,6 @@ bool optimalPointFrontalB (GFace *gf, } #endif - if (gf->geomType() == GEntity::CompoundSurface){ - GFaceCompound *gfc = dynamic_cast<GFaceCompound*> (gf); - if (gfc){ - GPoint gp = gfc->intersectionWithCircle(n2,n1,middle,d,newPoint); - if (gp.succeeded()){ - newPoint[0] = gp.u(); - newPoint[1] = gp.v(); - return true; - } - } - } - double uvt[3] = {newPoint[0],newPoint[1],0.0}; curveFunctorCircle cc (n2,n1,middle,d); surfaceFunctorGFace ss (gf); diff --git a/Mesh/meshGFaceLloyd.cpp b/Mesh/meshGFaceLloyd.cpp index eb265729fddc3a2ad3844996c922ea3c9c4d4fef..a29c83aa6f293993537d6696e0af0087778273f0 100644 --- a/Mesh/meshGFaceLloyd.cpp +++ b/Mesh/meshGFaceLloyd.cpp @@ -413,8 +413,9 @@ smoothing::smoothing(int param1,int param2){ NORM = param2; } -void smoothing::optimize_face(GFace* gf){ - if(gf->getNumMeshElements()==0 || gf->getCompound()) return; +void smoothing::optimize_face(GFace* gf) +{ + if(gf->getNumMeshElements()==0) return; std::set<MVertex*> all; @@ -600,10 +601,10 @@ void smoothing::optimize_model(){ for(it=model->firstFace();it!=model->lastFace();it++) { gf = *it; - if(gf->getNumMeshElements()>0 && !gf->getCompound() /*&& gf->geomType()==GEntity::CompoundSurface*/){ - optimize_face(gf); - //recombineIntoQuads(gf,1,1); - } + if(gf->getNumMeshElements()>0){ + optimize_face(gf); + //recombineIntoQuads(gf,1,1); + } } } diff --git a/Mesh/meshGFaceOptimize.cpp b/Mesh/meshGFaceOptimize.cpp index bb9715703edcb45713c594e240fdb8a681d588ea..5a9b0dadc032c65e731fdac442a9d74be33f2a0c 100644 --- a/Mesh/meshGFaceOptimize.cpp +++ b/Mesh/meshGFaceOptimize.cpp @@ -1173,7 +1173,6 @@ int edgeSwapPass2(GFace *gf, std::set<MTri3*, compareTri3Ptr> &allTris, static int _recombineIntoQuads(GFace *gf, double minqual, bool cubicGraph = 1) { // never recombine a face that is part of a compound! - if(gf->getCompound()) return 0; if(gf->triangles.size() == 0) return 1; int success = 1; @@ -1444,7 +1443,7 @@ void recombineIntoQuads(GFace *gf, bool haveParam = true; bool saveAll = CTX::instance()->mesh.saveAll; - if(gf->geomType() == GEntity::DiscreteSurface && !gf->getCompound()) + if(gf->geomType() == GEntity::DiscreteSurface) haveParam = false; if (saveAll) gf->model()->writeMSH("before.msh"); diff --git a/Mesh/meshGRegion.cpp b/Mesh/meshGRegion.cpp index 7f2864c378d9de09b329a61794d50846f6b8acb1..c30c609351679ac0443ff173b00ed9deeb6a6dae 100644 --- a/Mesh/meshGRegion.cpp +++ b/Mesh/meshGRegion.cpp @@ -30,7 +30,6 @@ #include "BDS.h" #include "OS.h" #include "Context.h" -#include "GFaceCompound.h" #include "meshGRegionMMG3D.h" #include "simple3D.h" #include "directions3D.h" @@ -1076,22 +1075,6 @@ void meshGRegion::operator() (GRegion *gr) } } - // replace discreteFaces by their compounds - { - std::set<GFace*, GEntityLessThan> mySet; - std::list<GFace*>::iterator it = faces.begin(); - while(it != faces.end()){ - if((*it)->getCompound()) - mySet.insert((*it)->getCompound()); - else - mySet.insert(*it); - ++it; - } - faces.clear(); - faces.insert(faces.begin(), mySet.begin(), mySet.end()); - gr->set(faces); - } - if(CTX::instance()->mesh.algo3d != ALGO_3D_FRONTAL){ delaunay.push_back(gr); } diff --git a/Mesh/meshPartition.cpp b/Mesh/meshPartition.cpp index 62ed7f260bdf6e6b53d37bc1ef0acca251f6e7bf..951852d94496783527285c90cc3897043d05878e 100644 --- a/Mesh/meshPartition.cpp +++ b/Mesh/meshPartition.cpp @@ -28,7 +28,6 @@ #include "discreteEdge.h" #include "discreteFace.h" #include "discreteRegion.h" -#include "GFaceCompound.h" //--Prototype for Chaco interface diff --git a/Mesh/meshPartition.h b/Mesh/meshPartition.h index fcc593b492b16e4c7a991fd9211dfce8aa89f25e..6da2a9a9b1ee567e452719e7b303b0bb4333c4df 100644 --- a/Mesh/meshPartition.h +++ b/Mesh/meshPartition.h @@ -8,7 +8,6 @@ #include <vector> #include "partitionEdge.h" -#include "GFaceCompound.h" #include "GFace.h" class GModel; @@ -27,7 +26,7 @@ int RenumberGraph(Graph &graph, meshPartitionOptions &options); int PartitionMesh(GModel *const model, meshPartitionOptions &options); int RenumberMesh(GModel *const model, meshPartitionOptions &options); int PartitionMeshFace(std::list<GFace*> &cFaces, meshPartitionOptions &options); -int PartitionMeshElements(std::vector<MElement*> &elements, +int PartitionMeshElements(std::vector<MElement*> &elements, meshPartitionOptions &options); int CreatePartitionBoundaries(GModel *model, bool createGhostCells, bool createAllDims = false); diff --git a/Mesh/multiscalePartition.cpp b/Mesh/multiscalePartition.cpp deleted file mode 100644 index 0bd30710b28ccda54ecf74fe47defb4ba4202be6..0000000000000000000000000000000000000000 --- a/Mesh/multiscalePartition.cpp +++ /dev/null @@ -1,428 +0,0 @@ -// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle -// -// See the LICENSE.txt file for license information. Please report all -// bugs and problems to the public mailing list <gmsh@onelab.info>. -// -// Contributor(s): -// Emilie Marchandise - -#include "multiscalePartition.h" -#include "GmshConfig.h" -#include "GmshDefines.h" -#include "meshPartition.h" -#include "MEdge.h" -#include "MElement.h" -#include "multiscaleLaplace.h" -#include "GFaceCompound.h" -#include "Numeric.h" -#include "Context.h" -#include "OS.h" - -static void recur_connect(MVertex *v, - std::multimap<MVertex*,MEdge> &v2e, - std::set<MEdge,Less_Edge> &group, - std::set<MVertex*> &touched) -{ - if (touched.find(v) != touched.end())return; - - touched.insert(v); - for (std::multimap <MVertex*,MEdge>::iterator it = v2e.lower_bound(v); - it != v2e.upper_bound(v) ; ++it){ - group.insert(it->second); - for (int i=0;i<it->second.getNumVertices();++i){ - recur_connect (it->second.getVertex(i),v2e,group,touched); - } - } - -} - - -// starting form a list of elements, returns -// lists of lists that are all simply connected -static void recur_connect_e (const MEdge &e, - std::multimap<MEdge,MElement*,Less_Edge> &e2e, - std::set<MElement*> &group, - std::set<MEdge,Less_Edge> &touched){ - if (touched.find(e) != touched.end())return; - touched.insert(e); - for (std::multimap <MEdge,MElement*,Less_Edge>::iterator it = e2e.lower_bound(e); - it != e2e.upper_bound(e) ; ++it){ - group.insert(it->second); - for (int i=0;i<it->second->getNumEdges();++i){ - recur_connect_e (it->second->getEdge(i),e2e,group,touched); - } - } -} - - -static int connected_bounds (std::vector<MEdge> &edges, std::vector<std::vector<MEdge> > &boundaries) -{ - std::multimap<MVertex*,MEdge> v2e; - for (unsigned i = 0; i < edges.size(); ++i){ - for (int j=0;j<edges[i].getNumVertices();j++){ - v2e.insert(std::make_pair(edges[i].getVertex(j),edges[i])); - } - } - while (!v2e.empty()){ - std::set<MEdge, Less_Edge> group; - std::set<MVertex*> touched; - recur_connect (v2e.begin()->first,v2e,group,touched); - std::vector<MEdge> temp; - temp.insert(temp.begin(), group.begin(), group.end()); - boundaries.push_back(temp); - for (std::set<MVertex*>::iterator it = touched.begin() ; it != touched.end();++it) - v2e.erase(*it); - } - - return boundaries.size(); -} - -//-------------------------------------------------------------- -static void connectedRegions (std::vector<MElement*> &elements, - std::vector<std::vector<MElement*> > ®ions) -{ - std::multimap<MEdge,MElement*,Less_Edge> e2e; - for (unsigned int i = 0; i < elements.size(); ++i){ - for (int j = 0; j < elements[i]->getNumEdges(); j++){ - e2e.insert(std::make_pair(elements[i]->getEdge(j),elements[i])); - } - } - while (!e2e.empty()){ - std::set<MElement*> group; - std::set<MEdge,Less_Edge> touched; - recur_connect_e (e2e.begin()->first,e2e,group,touched); - std::vector<MElement*> temp; - temp.insert(temp.begin(), group.begin(), group.end()); - regions.push_back(temp); - for ( std::set<MEdge,Less_Edge>::iterator it = touched.begin() ; it != touched.end();++it) - e2e.erase(*it); - } -} - -static int getGenus (std::vector<MElement *> &elements, - std::vector<std::vector<MEdge> > &boundaries) -{ - - //We suppose MElements are simply connected - - std::set<MEdge, Less_Edge> es; - std::set<MVertex*> vs; - int N = 0; - for(unsigned int i = 0; i < elements.size(); i++){ - N++; - MElement *e = elements[i]; - for(int j = 0; j < e->getNumVertices(); j++){ - vs.insert(e->getVertex(j)); - } - for(int j = 0; j < e->getNumEdges(); j++){ - es.insert(e->getEdge(j)); - } - } - - int poincare = vs.size() - es.size() + N; - - //compute connected boundaries - int nbBounds = 0; - std::vector<MEdge> bEdges; - for(unsigned int i = 0; i < elements.size(); i++){ - for(int j = 0; j < elements[i]->getNumEdges(); j++){ - MEdge me = elements[i]->getEdge(j); - if(std::find(bEdges.begin(), bEdges.end(), me) == bEdges.end()) - bEdges.push_back(me); - else - bEdges.erase(std::find(bEdges.begin(), bEdges.end(),me)); - } - } - nbBounds = connected_bounds(bEdges, boundaries); - int genus = (int)(-poincare + 2 - nbBounds)/2; - - //printf("************** partition has %d boundaries and genus =%d \n", nbBounds, genus); - - return genus; - -} - -static int getAspectRatio(std::vector<MElement *> &elements, - std::vector<std::vector<MEdge> > &boundaries) -{ - - double area3D = 0.0; - for(unsigned int i = 0; i <elements.size(); ++i){ - MElement *t = elements[i]; - std::vector<MVertex *> v(3); - for(int k = 0; k < 3; k++) v[k] = t->getVertex(k); - double p0[3] = {v[0]->x(), v[0]->y(), v[0]->z()}; - double p1[3] = {v[1]->x(), v[1]->y(), v[1]->z()}; - double p2[3] = {v[2]->x(), v[2]->y(), v[2]->z()}; - double a_3D = fabs(triangle_area(p0, p1, p2)); - area3D += a_3D; - } - - double tot_length = 0.0; - for(unsigned int i = 0; i <boundaries.size(); ++i){ - std::vector<MEdge> iBound = boundaries[i]; - double iLength = 0.0; - for( unsigned int j = 0; j <iBound.size(); ++j){ - MVertex *v0 = iBound[j].getVertex(0); - MVertex *v1 = iBound[j].getVertex(1); - const double length = sqrt((v0->x() - v1->x()) * (v0->x() - v1->x()) + - (v0->y() - v1->y()) * (v0->y() - v1->y()) + - (v0->z() - v1->z()) * (v0->z() - v1->z())); - iLength += length; - } - tot_length += iLength; - } - int AR = 1; - if (boundaries.size() > 0){ - tot_length /= boundaries.size(); - AR = (int) ceil(2*3.14*area3D/(tot_length*tot_length)); - } - - //compute AR also with Bounding box - std::set<MVertex*> vs; - for(unsigned int i = 0; i < elements.size(); i++){ - MElement *e = elements[i]; - for(int j = 0; j < e->getNumVertices(); j++){ - vs.insert(e->getVertex(j)); - } - } - SBoundingBox3d bb; - std::vector<SPoint3> vertices; - for (std::set<MVertex* >::iterator it = vs.begin(); it != vs.end(); it++){ - SPoint3 pt((*it)->x(),(*it)->y(), (*it)->z()); - vertices.push_back(pt); - bb += pt; - } - double H = norm(SVector3(bb.max(), bb.min())); - - //SOrientedBoundingBox obbox = SOrientedBoundingBox::buildOBB(vertices); - //double H = obbox.getMaxSize(); - - double D = H; - if (boundaries.size() > 0 ) D = 10e4; - for (unsigned int i = 0; i < boundaries.size(); i++){ - std::set<MVertex*> vb; - std::vector<MEdge> iBound = boundaries[i]; - for (unsigned int j = 0; j < iBound.size(); j++){ - MEdge e = iBound[j]; - vb.insert(e.getVertex(0)); - vb.insert(e.getVertex(1)); - } - std::vector<SPoint3> vBounds; - SBoundingBox3d bb; - for (std::set<MVertex* >::iterator it = vb.begin(); it != vb.end(); it++){ - SPoint3 pt((*it)->x(),(*it)->y(), (*it)->z()); - vBounds.push_back(pt); - bb +=pt; - } - double iD = norm(SVector3(bb.max(), bb.min())); - D = std::min(D, iD); - - //SOrientedBoundingBox obboxD = SOrientedBoundingBox::buildOBB(vBounds); - //D = std::max(D, obboxD.getMaxSize()); - } - int AR2 = (int)ceil(H/D); - - return std::max(AR, AR2); -} - -static void getGenusAndRatio(std::vector<MElement *> &elements, int & genus, int &AR, int &NB) -{ - std::vector<std::vector<MEdge> > boundaries; - boundaries.clear(); - genus = getGenus(elements, boundaries); - NB = boundaries.size(); - AR = getAspectRatio(elements, boundaries); - -} -static void partitionRegions(std::vector<MElement*> &elements, - std::vector<std::vector<MElement*> > ®ions) -{ - - for (unsigned int i = 0; i < elements.size(); ++i){ - MElement *e = elements[i]; - int part = e->getPartition(); - regions[part-1].push_back(e); - } - - std::vector<std::vector<MElement*> > allRegions; - for (unsigned int k = 0; k < regions.size(); ++k){ - std::vector<std::vector<MElement*> > conRegions; - conRegions.clear(); - connectedRegions (regions[k], conRegions); - for (unsigned int j = 0; j < conRegions.size(); j++) - allRegions.push_back(conRegions[j]); - } - regions.clear(); - regions.resize(allRegions.size()); - regions = allRegions; - -} - -/* -static void printLevel(std::vector<MElement *> &elements, int recur, int region) -{ - char fn[256]; - sprintf(fn, "part_%d_%d.msh", recur, region); - double version = 2.2; - - std::set<MVertex*> vs; - for (unsigned int i = 0; i < elements.size(); i++){ - for (int j = 0; j < elements[i]->getNumVertices(); j++){ - vs.insert(elements[i]->getVertex(j)); - } - } - - bool binary = false; - FILE *fp = Fopen (fn, "w"); - if(fp){ - fprintf(fp, "$MeshFormat\n"); - fprintf(fp, "%g %d %d\n", version, binary ? 1 : 0, (int)sizeof(double)); - fprintf(fp, "$EndMeshFormat\n"); - - fprintf(fp,"$Nodes\n%d\n", (int)vs.size()); - std::set<MVertex*> :: iterator it = vs.begin(); - int index = 1; - for (; it != vs.end() ; ++it){ - (*it)->setIndex(index++); - fprintf(fp,"%d %g %g %g\n",(*it)->getIndex(), - (*it)->x(),(*it)->y(),(*it)->z()); - } - fprintf(fp,"$EndNodes\n"); - - fprintf(fp,"$Elements\n%d\n", (int)elements.size()); - for (unsigned int i = 0; i < elements.size(); i++){ - elements[i]->writeMSH(fp, version); - } - fprintf(fp,"$EndElements\n%d\n", (int)elements.size()); - - fclose(fp); - } -} -*/ - -multiscalePartition::multiscalePartition(std::vector<MElement *> &elements, - int nbParts, typeOfPartition method, - int allowPartition) -{ - options = CTX::instance()->partitionOptions; - options.num_partitions = nbParts; - options.partitioner = 1; //1 CHACO, 2 METIS - if (options.partitioner == 1){ - options.global_method = 1;// 1 Multilevel-KL, 2 Spectral - options.mesh_dims[0] = nbParts; - } - else if (options.partitioner == 2){ - options.algorithm = 2;//1 recursive, 2=kway, 3=nodal weights - options.refine_algorithm=2; - options.edge_matching = 3; - } - - partitionLevel *level = new partitionLevel; - level->elements.insert(level->elements.begin(),elements.begin(),elements.end()); - level->recur = 0; - level->region = 0; - - levels.push_back(level); - onlyMultilevel = false; - if (allowPartition == 2) onlyMultilevel = true; - - partition(*level, nbParts, method); - - totalParts = assembleAllPartitions(elements); - -} - -void multiscalePartition::setNumberOfPartitions(int &nbParts) -{ - options.num_partitions = nbParts; - if (options.partitioner == 1){ - options.mesh_dims[0] = nbParts; - } -} - -void multiscalePartition::partition(partitionLevel & level, int nbParts, - typeOfPartition method) -{ -#if defined(HAVE_SOLVER) && defined(HAVE_ANN) && (defined(HAVE_METIS) || defined(HAVE_CHACO)) - - if (method == LAPLACIAN){ - std::map<MVertex*, SPoint3> coordinates; - multiscaleLaplace multiLaplace(level.elements, coordinates); - } - else if (method == MULTILEVEL){ - setNumberOfPartitions(nbParts); - PartitionMeshElements(level.elements, options); - } - - std::vector<std::vector<MElement*> > regions(nbParts); - partitionRegions(level.elements, regions); - level.elements.clear(); - - for (unsigned i=0;i< regions.size() ; i++){ - - partitionLevel *nextLevel = new partitionLevel; - nextLevel->elements = regions[i]; - nextLevel->recur = level.recur+1; - nextLevel->region = i; - - levels.push_back(nextLevel); - int genus, AR, NB; - getGenusAndRatio(regions[i], genus, AR, NB); - - if (genus < 0) { - Msg::Error("Genus partition is negative G=%d!", genus); - return; - } - - if (genus != 0 ){ - int nbParts = std::max(genus+2,2); - Msg::Info("Mesh partition: level (%d-%d) is %d-GENUS (AR=%d) " - "---> MULTILEVEL partition %d parts", - nextLevel->recur,nextLevel->region, genus, AR, nbParts); - partition(*nextLevel, nbParts, MULTILEVEL); - } - else if ((genus == 0 && AR > AR_MAX) || (genus == 0 && NB > 1)){ - int nbParts = 2; - if(!onlyMultilevel){ - Msg::Info("Mesh partition: level (%d-%d) is ZERO-GENUS (AR=%d NB=%d) " - "---> LAPLACIAN partition %d parts", - nextLevel->recur,nextLevel->region, AR, NB, nbParts); - partition(*nextLevel, nbParts, LAPLACIAN); - } - else { - Msg::Info("Mesh partition: level (%d-%d) is ZERO-GENUS (AR=%d NB=%d) " - "---> MULTILEVEL partition %d parts", - nextLevel->recur,nextLevel->region, AR, NB, nbParts); - partition(*nextLevel, nbParts, MULTILEVEL); - } - } - else { - Msg::Info("*** Mesh partition: level (%d-%d) is ZERO-GENUS (AR=%d, NB=%d)", - nextLevel->recur,nextLevel->region, AR, NB); - } - - } - -#endif -} - -int multiscalePartition::assembleAllPartitions(std::vector<MElement*> & elements) -{ - int iPart = 1; - - elements.clear(); - for (unsigned i = 0; i< levels.size(); i++){ - partitionLevel *iLevel = levels[i]; - if(iLevel->elements.size() > 0){ - for (unsigned j = 0; j < iLevel->elements.size(); j++){ - MElement *e = iLevel->elements[j]; - elements.push_back(e); - e->setPartition(iPart); - } - iPart++; - } - } - - return iPart - 1; -} diff --git a/Mesh/multiscalePartition.h b/Mesh/multiscalePartition.h deleted file mode 100644 index 3f44ad525db693e8a6ea3e7b0d35c03f5f7f54cb..0000000000000000000000000000000000000000 --- a/Mesh/multiscalePartition.h +++ /dev/null @@ -1,46 +0,0 @@ -// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle -// -// See the LICENSE.txt file for license information. Please report all -// bugs and problems to the public mailing list <gmsh@onelab.info>. -// -// Contributor(s): -// Emilie Marchandise - -#ifndef _MULTI_PARTITION_H_ -#define _MULTI_PARTITION_H_ - -#include <vector> -#include <map> -#include "linearSystemGMM.h" -#include "meshPartitionOptions.h" -#include "meshPartition.h" - -class MElement; -class meshPartitionOptions; - -struct partitionLevel { - int recur; - int region; - std::vector<MElement *> elements; -}; - -typedef enum {LAPLACIAN= 0, MULTILEVEL=1} typeOfPartition; - -class multiscalePartition{ - - private: - std::vector<partitionLevel*> levels; - void partition(partitionLevel &level, int nbParts, typeOfPartition method); - int totalParts; - bool onlyMultilevel; - meshPartitionOptions options; - - public: - multiscalePartition(std::vector<MElement *> &elements, int nbParts, - typeOfPartition method, int allowPartition); - int assembleAllPartitions(std::vector<MElement*> & elements); - void setNumberOfPartitions(int &nbParts); - int getNumberOfParts(){return totalParts;} -}; - -#endif diff --git a/Parser/Gmsh.l b/Parser/Gmsh.l index 4db69a4d3aa81a6605610b58a51a779e3c9e7ec3..d5bb0f8d09733d568181d06532a67bd51f56b75b 100644 --- a/Parser/Gmsh.l +++ b/Parser/Gmsh.l @@ -166,7 +166,6 @@ Cos return tCos; Cosh return tCosh; Cpu return tCpu; CreateTopology return tCreateTopology; -CreateTopologyNoHoles return tCreateTopologyNoHoles; CurrentDir return tCurrentDirectory; CurrentDirectory return tCurrentDirectory; Cylinder return tCylinder; diff --git a/Parser/Gmsh.tab.cpp b/Parser/Gmsh.tab.cpp index 833158f6e5a05d59d49f6bafe7b32ef60515875a..9c8c0c4d7cf06c334c0e6548da776b0d01b68f82 100644 --- a/Parser/Gmsh.tab.cpp +++ b/Parser/Gmsh.tab.cpp @@ -150,154 +150,153 @@ tMemory = 331, tTotalMemory = 332, tCreateTopology = 333, - tCreateTopologyNoHoles = 334, - tDistanceFunction = 335, - tDefineConstant = 336, - tUndefineConstant = 337, - tDefineNumber = 338, - tDefineStruct = 339, - tNameStruct = 340, - tDimNameSpace = 341, - tAppend = 342, - tDefineString = 343, - tSetNumber = 344, - tSetString = 345, - tPoint = 346, - tCircle = 347, - tEllipse = 348, - tLine = 349, - tSphere = 350, - tPolarSphere = 351, - tSurface = 352, - tSpline = 353, - tVolume = 354, - tBox = 355, - tCylinder = 356, - tCone = 357, - tTorus = 358, - tEllipsoid = 359, - tQuadric = 360, - tShapeFromFile = 361, - tRectangle = 362, - tDisk = 363, - tWire = 364, - tGeoEntity = 365, - tCharacteristic = 366, - tLength = 367, - tParametric = 368, - tElliptic = 369, - tRefineMesh = 370, - tAdaptMesh = 371, - tRelocateMesh = 372, - tSetFactory = 373, - tThruSections = 374, - tWedge = 375, - tFillet = 376, - tChamfer = 377, - tPlane = 378, - tRuled = 379, - tTransfinite = 380, - tPhysical = 381, - tCompound = 382, - tPeriodic = 383, - tUsing = 384, - tPlugin = 385, - tDegenerated = 386, - tRecursive = 387, - tRotate = 388, - tTranslate = 389, - tSymmetry = 390, - tDilate = 391, - tExtrude = 392, - tLevelset = 393, - tAffine = 394, - tBooleanUnion = 395, - tBooleanIntersection = 396, - tBooleanDifference = 397, - tBooleanSection = 398, - tBooleanFragments = 399, - tThickSolid = 400, - tRecombine = 401, - tSmoother = 402, - tSplit = 403, - tDelete = 404, - tCoherence = 405, - tIntersect = 406, - tMeshAlgorithm = 407, - tReverse = 408, - tLayers = 409, - tScaleLast = 410, - tHole = 411, - tAlias = 412, - tAliasWithOptions = 413, - tCopyOptions = 414, - tQuadTriAddVerts = 415, - tQuadTriNoNewVerts = 416, - tRecombLaterals = 417, - tTransfQuadTri = 418, - tText2D = 419, - tText3D = 420, - tInterpolationScheme = 421, - tTime = 422, - tCombine = 423, - tBSpline = 424, - tBezier = 425, - tNurbs = 426, - tNurbsOrder = 427, - tNurbsKnots = 428, - tColor = 429, - tColorTable = 430, - tFor = 431, - tIn = 432, - tEndFor = 433, - tIf = 434, - tElseIf = 435, - tElse = 436, - tEndIf = 437, - tExit = 438, - tAbort = 439, - tField = 440, - tReturn = 441, - tCall = 442, - tSlide = 443, - tMacro = 444, - tShow = 445, - tHide = 446, - tGetValue = 447, - tGetStringValue = 448, - tGetEnv = 449, - tGetString = 450, - tGetNumber = 451, - tUnique = 452, - tHomology = 453, - tCohomology = 454, - tBetti = 455, - tExists = 456, - tFileExists = 457, - tGetForced = 458, - tGetForcedStr = 459, - tGMSH_MAJOR_VERSION = 460, - tGMSH_MINOR_VERSION = 461, - tGMSH_PATCH_VERSION = 462, - tGmshExecutableName = 463, - tSetPartition = 464, - tNameToString = 465, - tStringToName = 466, - tAFFECTDIVIDE = 467, - tAFFECTTIMES = 468, - tAFFECTMINUS = 469, - tAFFECTPLUS = 470, - tOR = 471, - tAND = 472, - tNOTEQUAL = 473, - tEQUAL = 474, - tGREATERGREATER = 475, - tLESSLESS = 476, - tGREATEROREQUAL = 477, - tLESSOREQUAL = 478, - UNARYPREC = 479, - tMINUSMINUS = 480, - tPLUSPLUS = 481 + tDistanceFunction = 334, + tDefineConstant = 335, + tUndefineConstant = 336, + tDefineNumber = 337, + tDefineStruct = 338, + tNameStruct = 339, + tDimNameSpace = 340, + tAppend = 341, + tDefineString = 342, + tSetNumber = 343, + tSetString = 344, + tPoint = 345, + tCircle = 346, + tEllipse = 347, + tLine = 348, + tSphere = 349, + tPolarSphere = 350, + tSurface = 351, + tSpline = 352, + tVolume = 353, + tBox = 354, + tCylinder = 355, + tCone = 356, + tTorus = 357, + tEllipsoid = 358, + tQuadric = 359, + tShapeFromFile = 360, + tRectangle = 361, + tDisk = 362, + tWire = 363, + tGeoEntity = 364, + tCharacteristic = 365, + tLength = 366, + tParametric = 367, + tElliptic = 368, + tRefineMesh = 369, + tAdaptMesh = 370, + tRelocateMesh = 371, + tSetFactory = 372, + tThruSections = 373, + tWedge = 374, + tFillet = 375, + tChamfer = 376, + tPlane = 377, + tRuled = 378, + tTransfinite = 379, + tPhysical = 380, + tCompound = 381, + tPeriodic = 382, + tUsing = 383, + tPlugin = 384, + tDegenerated = 385, + tRecursive = 386, + tRotate = 387, + tTranslate = 388, + tSymmetry = 389, + tDilate = 390, + tExtrude = 391, + tLevelset = 392, + tAffine = 393, + tBooleanUnion = 394, + tBooleanIntersection = 395, + tBooleanDifference = 396, + tBooleanSection = 397, + tBooleanFragments = 398, + tThickSolid = 399, + tRecombine = 400, + tSmoother = 401, + tSplit = 402, + tDelete = 403, + tCoherence = 404, + tIntersect = 405, + tMeshAlgorithm = 406, + tReverse = 407, + tLayers = 408, + tScaleLast = 409, + tHole = 410, + tAlias = 411, + tAliasWithOptions = 412, + tCopyOptions = 413, + tQuadTriAddVerts = 414, + tQuadTriNoNewVerts = 415, + tRecombLaterals = 416, + tTransfQuadTri = 417, + tText2D = 418, + tText3D = 419, + tInterpolationScheme = 420, + tTime = 421, + tCombine = 422, + tBSpline = 423, + tBezier = 424, + tNurbs = 425, + tNurbsOrder = 426, + tNurbsKnots = 427, + tColor = 428, + tColorTable = 429, + tFor = 430, + tIn = 431, + tEndFor = 432, + tIf = 433, + tElseIf = 434, + tElse = 435, + tEndIf = 436, + tExit = 437, + tAbort = 438, + tField = 439, + tReturn = 440, + tCall = 441, + tSlide = 442, + tMacro = 443, + tShow = 444, + tHide = 445, + tGetValue = 446, + tGetStringValue = 447, + tGetEnv = 448, + tGetString = 449, + tGetNumber = 450, + tUnique = 451, + tHomology = 452, + tCohomology = 453, + tBetti = 454, + tExists = 455, + tFileExists = 456, + tGetForced = 457, + tGetForcedStr = 458, + tGMSH_MAJOR_VERSION = 459, + tGMSH_MINOR_VERSION = 460, + tGMSH_PATCH_VERSION = 461, + tGmshExecutableName = 462, + tSetPartition = 463, + tNameToString = 464, + tStringToName = 465, + tAFFECTDIVIDE = 466, + tAFFECTTIMES = 467, + tAFFECTMINUS = 468, + tAFFECTPLUS = 469, + tOR = 470, + tAND = 471, + tNOTEQUAL = 472, + tEQUAL = 473, + tGREATERGREATER = 474, + tLESSLESS = 475, + tGREATEROREQUAL = 476, + tLESSOREQUAL = 477, + UNARYPREC = 478, + tMINUSMINUS = 479, + tPLUSPLUS = 480 }; #endif /* Tokens. */ @@ -377,154 +376,153 @@ #define tMemory 331 #define tTotalMemory 332 #define tCreateTopology 333 -#define tCreateTopologyNoHoles 334 -#define tDistanceFunction 335 -#define tDefineConstant 336 -#define tUndefineConstant 337 -#define tDefineNumber 338 -#define tDefineStruct 339 -#define tNameStruct 340 -#define tDimNameSpace 341 -#define tAppend 342 -#define tDefineString 343 -#define tSetNumber 344 -#define tSetString 345 -#define tPoint 346 -#define tCircle 347 -#define tEllipse 348 -#define tLine 349 -#define tSphere 350 -#define tPolarSphere 351 -#define tSurface 352 -#define tSpline 353 -#define tVolume 354 -#define tBox 355 -#define tCylinder 356 -#define tCone 357 -#define tTorus 358 -#define tEllipsoid 359 -#define tQuadric 360 -#define tShapeFromFile 361 -#define tRectangle 362 -#define tDisk 363 -#define tWire 364 -#define tGeoEntity 365 -#define tCharacteristic 366 -#define tLength 367 -#define tParametric 368 -#define tElliptic 369 -#define tRefineMesh 370 -#define tAdaptMesh 371 -#define tRelocateMesh 372 -#define tSetFactory 373 -#define tThruSections 374 -#define tWedge 375 -#define tFillet 376 -#define tChamfer 377 -#define tPlane 378 -#define tRuled 379 -#define tTransfinite 380 -#define tPhysical 381 -#define tCompound 382 -#define tPeriodic 383 -#define tUsing 384 -#define tPlugin 385 -#define tDegenerated 386 -#define tRecursive 387 -#define tRotate 388 -#define tTranslate 389 -#define tSymmetry 390 -#define tDilate 391 -#define tExtrude 392 -#define tLevelset 393 -#define tAffine 394 -#define tBooleanUnion 395 -#define tBooleanIntersection 396 -#define tBooleanDifference 397 -#define tBooleanSection 398 -#define tBooleanFragments 399 -#define tThickSolid 400 -#define tRecombine 401 -#define tSmoother 402 -#define tSplit 403 -#define tDelete 404 -#define tCoherence 405 -#define tIntersect 406 -#define tMeshAlgorithm 407 -#define tReverse 408 -#define tLayers 409 -#define tScaleLast 410 -#define tHole 411 -#define tAlias 412 -#define tAliasWithOptions 413 -#define tCopyOptions 414 -#define tQuadTriAddVerts 415 -#define tQuadTriNoNewVerts 416 -#define tRecombLaterals 417 -#define tTransfQuadTri 418 -#define tText2D 419 -#define tText3D 420 -#define tInterpolationScheme 421 -#define tTime 422 -#define tCombine 423 -#define tBSpline 424 -#define tBezier 425 -#define tNurbs 426 -#define tNurbsOrder 427 -#define tNurbsKnots 428 -#define tColor 429 -#define tColorTable 430 -#define tFor 431 -#define tIn 432 -#define tEndFor 433 -#define tIf 434 -#define tElseIf 435 -#define tElse 436 -#define tEndIf 437 -#define tExit 438 -#define tAbort 439 -#define tField 440 -#define tReturn 441 -#define tCall 442 -#define tSlide 443 -#define tMacro 444 -#define tShow 445 -#define tHide 446 -#define tGetValue 447 -#define tGetStringValue 448 -#define tGetEnv 449 -#define tGetString 450 -#define tGetNumber 451 -#define tUnique 452 -#define tHomology 453 -#define tCohomology 454 -#define tBetti 455 -#define tExists 456 -#define tFileExists 457 -#define tGetForced 458 -#define tGetForcedStr 459 -#define tGMSH_MAJOR_VERSION 460 -#define tGMSH_MINOR_VERSION 461 -#define tGMSH_PATCH_VERSION 462 -#define tGmshExecutableName 463 -#define tSetPartition 464 -#define tNameToString 465 -#define tStringToName 466 -#define tAFFECTDIVIDE 467 -#define tAFFECTTIMES 468 -#define tAFFECTMINUS 469 -#define tAFFECTPLUS 470 -#define tOR 471 -#define tAND 472 -#define tNOTEQUAL 473 -#define tEQUAL 474 -#define tGREATERGREATER 475 -#define tLESSLESS 476 -#define tGREATEROREQUAL 477 -#define tLESSOREQUAL 478 -#define UNARYPREC 479 -#define tMINUSMINUS 480 -#define tPLUSPLUS 481 +#define tDistanceFunction 334 +#define tDefineConstant 335 +#define tUndefineConstant 336 +#define tDefineNumber 337 +#define tDefineStruct 338 +#define tNameStruct 339 +#define tDimNameSpace 340 +#define tAppend 341 +#define tDefineString 342 +#define tSetNumber 343 +#define tSetString 344 +#define tPoint 345 +#define tCircle 346 +#define tEllipse 347 +#define tLine 348 +#define tSphere 349 +#define tPolarSphere 350 +#define tSurface 351 +#define tSpline 352 +#define tVolume 353 +#define tBox 354 +#define tCylinder 355 +#define tCone 356 +#define tTorus 357 +#define tEllipsoid 358 +#define tQuadric 359 +#define tShapeFromFile 360 +#define tRectangle 361 +#define tDisk 362 +#define tWire 363 +#define tGeoEntity 364 +#define tCharacteristic 365 +#define tLength 366 +#define tParametric 367 +#define tElliptic 368 +#define tRefineMesh 369 +#define tAdaptMesh 370 +#define tRelocateMesh 371 +#define tSetFactory 372 +#define tThruSections 373 +#define tWedge 374 +#define tFillet 375 +#define tChamfer 376 +#define tPlane 377 +#define tRuled 378 +#define tTransfinite 379 +#define tPhysical 380 +#define tCompound 381 +#define tPeriodic 382 +#define tUsing 383 +#define tPlugin 384 +#define tDegenerated 385 +#define tRecursive 386 +#define tRotate 387 +#define tTranslate 388 +#define tSymmetry 389 +#define tDilate 390 +#define tExtrude 391 +#define tLevelset 392 +#define tAffine 393 +#define tBooleanUnion 394 +#define tBooleanIntersection 395 +#define tBooleanDifference 396 +#define tBooleanSection 397 +#define tBooleanFragments 398 +#define tThickSolid 399 +#define tRecombine 400 +#define tSmoother 401 +#define tSplit 402 +#define tDelete 403 +#define tCoherence 404 +#define tIntersect 405 +#define tMeshAlgorithm 406 +#define tReverse 407 +#define tLayers 408 +#define tScaleLast 409 +#define tHole 410 +#define tAlias 411 +#define tAliasWithOptions 412 +#define tCopyOptions 413 +#define tQuadTriAddVerts 414 +#define tQuadTriNoNewVerts 415 +#define tRecombLaterals 416 +#define tTransfQuadTri 417 +#define tText2D 418 +#define tText3D 419 +#define tInterpolationScheme 420 +#define tTime 421 +#define tCombine 422 +#define tBSpline 423 +#define tBezier 424 +#define tNurbs 425 +#define tNurbsOrder 426 +#define tNurbsKnots 427 +#define tColor 428 +#define tColorTable 429 +#define tFor 430 +#define tIn 431 +#define tEndFor 432 +#define tIf 433 +#define tElseIf 434 +#define tElse 435 +#define tEndIf 436 +#define tExit 437 +#define tAbort 438 +#define tField 439 +#define tReturn 440 +#define tCall 441 +#define tSlide 442 +#define tMacro 443 +#define tShow 444 +#define tHide 445 +#define tGetValue 446 +#define tGetStringValue 447 +#define tGetEnv 448 +#define tGetString 449 +#define tGetNumber 450 +#define tUnique 451 +#define tHomology 452 +#define tCohomology 453 +#define tBetti 454 +#define tExists 455 +#define tFileExists 456 +#define tGetForced 457 +#define tGetForcedStr 458 +#define tGMSH_MAJOR_VERSION 459 +#define tGMSH_MINOR_VERSION 460 +#define tGMSH_PATCH_VERSION 461 +#define tGmshExecutableName 462 +#define tSetPartition 463 +#define tNameToString 464 +#define tStringToName 465 +#define tAFFECTDIVIDE 466 +#define tAFFECTTIMES 467 +#define tAFFECTMINUS 468 +#define tAFFECTPLUS 469 +#define tOR 470 +#define tAND 471 +#define tNOTEQUAL 472 +#define tEQUAL 473 +#define tGREATERGREATER 474 +#define tLESSLESS 475 +#define tGREATEROREQUAL 476 +#define tLESSOREQUAL 477 +#define UNARYPREC 478 +#define tMINUSMINUS 479 +#define tPLUSPLUS 480 @@ -727,7 +725,7 @@ typedef union YYSTYPE struct TwoChar c2; } /* Line 193 of yacc.c. */ -#line 731 "Gmsh.tab.cpp" +#line 729 "Gmsh.tab.cpp" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 @@ -740,7 +738,7 @@ typedef union YYSTYPE /* Line 216 of yacc.c. */ -#line 744 "Gmsh.tab.cpp" +#line 742 "Gmsh.tab.cpp" #ifdef short # undef short @@ -955,20 +953,20 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 5 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 15714 +#define YYLAST 15603 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 249 +#define YYNTOKENS 248 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 113 /* YYNRULES -- Number of rules. */ -#define YYNRULES 599 +#define YYNRULES 598 /* YYNRULES -- Number of states. */ -#define YYNSTATES 2110 +#define YYNSTATES 2108 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 481 +#define YYMAXUTOK 480 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -979,16 +977,16 @@ static const yytype_uint8 yytranslate[] = 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 234, 2, 246, 2, 231, 233, 2, - 239, 240, 229, 227, 248, 228, 245, 230, 2, 2, + 2, 2, 2, 233, 2, 245, 2, 230, 232, 2, + 238, 239, 228, 226, 247, 227, 244, 229, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 221, 2, 222, 216, 2, 2, 2, 2, 2, 2, + 220, 2, 221, 215, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 241, 2, 242, 238, 2, 2, 2, 2, 2, + 2, 240, 2, 241, 237, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 243, 232, 244, 247, 2, 2, 2, + 2, 2, 2, 242, 231, 243, 246, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -1023,8 +1021,8 @@ static const yytype_uint8 yytranslate[] = 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 217, 218, 219, 220, 223, 224, 225, 226, 235, - 236, 237 + 216, 217, 218, 219, 222, 223, 224, 225, 234, 235, + 236 }; #if YYDEBUG @@ -1058,365 +1056,364 @@ static const yytype_uint16 yyprhs[] = 1280, 1289, 1298, 1305, 1310, 1316, 1323, 1330, 1334, 1339, 1343, 1349, 1356, 1362, 1367, 1371, 1376, 1380, 1385, 1391, 1396, 1402, 1406, 1412, 1420, 1428, 1432, 1440, 1444, 1447, - 1450, 1453, 1456, 1459, 1475, 1478, 1481, 1484, 1487, 1490, - 1507, 1519, 1526, 1535, 1544, 1555, 1557, 1560, 1563, 1565, - 1569, 1573, 1578, 1583, 1585, 1587, 1593, 1605, 1619, 1620, - 1628, 1629, 1643, 1644, 1660, 1661, 1668, 1678, 1681, 1685, - 1696, 1698, 1701, 1707, 1715, 1718, 1721, 1725, 1728, 1732, - 1735, 1739, 1749, 1756, 1758, 1760, 1762, 1764, 1766, 1767, - 1770, 1774, 1778, 1783, 1793, 1798, 1813, 1814, 1818, 1819, - 1821, 1822, 1825, 1826, 1829, 1830, 1833, 1840, 1848, 1855, - 1861, 1865, 1874, 1880, 1885, 1892, 1904, 1916, 1935, 1954, - 1967, 1980, 1993, 2004, 2009, 2014, 2019, 2024, 2027, 2031, - 2038, 2040, 2042, 2044, 2047, 2053, 2061, 2072, 2074, 2078, - 2081, 2084, 2087, 2091, 2095, 2099, 2103, 2107, 2111, 2115, - 2119, 2123, 2127, 2131, 2135, 2139, 2143, 2147, 2151, 2155, - 2159, 2165, 2170, 2175, 2180, 2185, 2190, 2195, 2200, 2205, - 2210, 2215, 2222, 2227, 2232, 2237, 2242, 2247, 2252, 2257, - 2262, 2269, 2276, 2283, 2288, 2290, 2292, 2294, 2296, 2298, - 2300, 2302, 2304, 2306, 2308, 2310, 2311, 2318, 2320, 2325, - 2332, 2334, 2339, 2344, 2349, 2356, 2362, 2370, 2379, 2390, - 2395, 2400, 2407, 2412, 2416, 2419, 2425, 2431, 2435, 2441, - 2448, 2457, 2464, 2473, 2480, 2485, 2493, 2500, 2507, 2514, - 2519, 2526, 2531, 2532, 2535, 2536, 2539, 2540, 2548, 2550, - 2554, 2556, 2558, 2561, 2562, 2566, 2568, 2571, 2574, 2578, - 2582, 2594, 2604, 2612, 2620, 2622, 2626, 2628, 2630, 2633, - 2637, 2642, 2648, 2650, 2654, 2656, 2659, 2663, 2667, 2673, - 2678, 2683, 2686, 2691, 2694, 2698, 2715, 2721, 2723, 2725, - 2727, 2731, 2737, 2745, 2750, 2755, 2760, 2767, 2774, 2783, - 2792, 2797, 2812, 2817, 2822, 2824, 2826, 2830, 2834, 2844, - 2852, 2854, 2860, 2864, 2871, 2873, 2877, 2879, 2881, 2886, - 2891, 2895, 2901, 2908, 2917, 2924, 2930, 2936, 2942, 2948, - 2950, 2955, 2957, 2959, 2961, 2963, 2968, 2975, 2980, 2987, - 2993, 3001, 3006, 3011, 3016, 3025, 3030, 3035, 3040, 3045, - 3054, 3063, 3070, 3075, 3082, 3087, 3089, 3094, 3099, 3100, - 3107, 3112, 3115, 3120, 3125, 3127, 3129, 3133, 3135, 3137, - 3141, 3145, 3149, 3155, 3163, 3169, 3175, 3184, 3186, 3188 + 1450, 1453, 1456, 1459, 1475, 1478, 1481, 1484, 1487, 1504, + 1516, 1523, 1532, 1541, 1552, 1554, 1557, 1560, 1562, 1566, + 1570, 1575, 1580, 1582, 1584, 1590, 1602, 1616, 1617, 1625, + 1626, 1640, 1641, 1657, 1658, 1665, 1675, 1678, 1682, 1693, + 1695, 1698, 1704, 1712, 1715, 1718, 1722, 1725, 1729, 1732, + 1736, 1746, 1753, 1755, 1757, 1759, 1761, 1763, 1764, 1767, + 1771, 1775, 1780, 1790, 1795, 1810, 1811, 1815, 1816, 1818, + 1819, 1822, 1823, 1826, 1827, 1830, 1837, 1845, 1852, 1858, + 1862, 1871, 1877, 1882, 1889, 1901, 1913, 1932, 1951, 1964, + 1977, 1990, 2001, 2006, 2011, 2016, 2021, 2024, 2028, 2035, + 2037, 2039, 2041, 2044, 2050, 2058, 2069, 2071, 2075, 2078, + 2081, 2084, 2088, 2092, 2096, 2100, 2104, 2108, 2112, 2116, + 2120, 2124, 2128, 2132, 2136, 2140, 2144, 2148, 2152, 2156, + 2162, 2167, 2172, 2177, 2182, 2187, 2192, 2197, 2202, 2207, + 2212, 2219, 2224, 2229, 2234, 2239, 2244, 2249, 2254, 2259, + 2266, 2273, 2280, 2285, 2287, 2289, 2291, 2293, 2295, 2297, + 2299, 2301, 2303, 2305, 2307, 2308, 2315, 2317, 2322, 2329, + 2331, 2336, 2341, 2346, 2353, 2359, 2367, 2376, 2387, 2392, + 2397, 2404, 2409, 2413, 2416, 2422, 2428, 2432, 2438, 2445, + 2454, 2461, 2470, 2477, 2482, 2490, 2497, 2504, 2511, 2516, + 2523, 2528, 2529, 2532, 2533, 2536, 2537, 2545, 2547, 2551, + 2553, 2555, 2558, 2559, 2563, 2565, 2568, 2571, 2575, 2579, + 2591, 2601, 2609, 2617, 2619, 2623, 2625, 2627, 2630, 2634, + 2639, 2645, 2647, 2651, 2653, 2656, 2660, 2664, 2670, 2675, + 2680, 2683, 2688, 2691, 2695, 2712, 2718, 2720, 2722, 2724, + 2728, 2734, 2742, 2747, 2752, 2757, 2764, 2771, 2780, 2789, + 2794, 2809, 2814, 2819, 2821, 2823, 2827, 2831, 2841, 2849, + 2851, 2857, 2861, 2868, 2870, 2874, 2876, 2878, 2883, 2888, + 2892, 2898, 2905, 2914, 2921, 2927, 2933, 2939, 2945, 2947, + 2952, 2954, 2956, 2958, 2960, 2965, 2972, 2977, 2984, 2990, + 2998, 3003, 3008, 3013, 3022, 3027, 3032, 3037, 3042, 3051, + 3060, 3067, 3072, 3079, 3084, 3086, 3091, 3096, 3097, 3104, + 3109, 3112, 3117, 3122, 3124, 3126, 3130, 3132, 3134, 3138, + 3142, 3146, 3152, 3160, 3166, 3172, 3181, 3183, 3185 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { - 250, 0, -1, 251, -1, 1, 6, -1, -1, 251, - 252, -1, 254, -1, 255, -1, 275, -1, 118, 239, - 351, 240, 6, -1, 293, -1, 299, -1, 303, -1, - 304, -1, 305, -1, 306, -1, 310, -1, 319, -1, - 320, -1, 326, -1, 327, -1, 309, -1, 308, -1, - 307, -1, 302, -1, 329, -1, 222, -1, 223, -1, - 44, 239, 351, 240, 6, -1, 45, 239, 351, 240, - 6, -1, 44, 239, 351, 240, 253, 351, 6, -1, - 44, 239, 351, 248, 347, 240, 6, -1, 45, 239, - 351, 248, 347, 240, 6, -1, 44, 239, 351, 248, - 347, 240, 253, 351, 6, -1, 361, 351, 243, 256, - 244, 6, -1, 157, 4, 241, 330, 242, 6, -1, - 158, 4, 241, 330, 242, 6, -1, 159, 4, 241, - 330, 248, 330, 242, 6, -1, -1, 256, 259, -1, - 256, 263, -1, 256, 266, -1, 256, 268, -1, 256, - 269, -1, 330, -1, 257, 248, 330, -1, 330, -1, - 258, 248, 330, -1, -1, -1, 4, 260, 239, 257, - 240, 261, 243, 258, 244, 6, -1, 351, -1, 262, - 248, 351, -1, -1, 164, 239, 330, 248, 330, 248, - 330, 240, 264, 243, 262, 244, 6, -1, 351, -1, - 265, 248, 351, -1, -1, 165, 239, 330, 248, 330, - 248, 330, 248, 330, 240, 267, 243, 265, 244, 6, - -1, 166, 243, 343, 244, 243, 343, 244, 6, -1, - 166, 243, 343, 244, 243, 343, 244, 243, 343, 244, - 243, 343, 244, 6, -1, -1, 167, 270, 243, 258, - 244, 6, -1, 7, -1, 215, -1, 214, -1, 213, - -1, 212, -1, 237, -1, 236, -1, 239, -1, 241, - -1, 240, -1, 242, -1, 81, 241, 277, 242, 6, - -1, 82, 241, 281, 242, 6, -1, 335, 6, -1, - 89, 273, 352, 248, 330, 274, 6, -1, 90, 273, - 361, 248, 352, 274, 6, -1, 361, 271, 344, 6, - -1, 361, 272, 6, -1, 361, 273, 274, 271, 344, - 6, -1, 361, 273, 243, 347, 244, 274, 271, 344, - 6, -1, 361, 241, 330, 242, 271, 330, 6, -1, - 361, 241, 330, 242, 272, 6, -1, 361, 239, 330, - 240, 271, 330, 6, -1, 361, 239, 330, 240, 272, - 6, -1, 361, 7, 352, 6, -1, 361, 273, 274, - 7, 46, 273, 274, 6, -1, 361, 273, 274, 7, - 46, 273, 356, 274, 6, -1, 361, 273, 274, 215, - 46, 273, 356, 274, 6, -1, 361, 245, 4, 7, - 352, 6, -1, 361, 241, 330, 242, 245, 4, 7, - 352, 6, -1, 361, 245, 4, 271, 330, 6, -1, - 361, 241, 330, 242, 245, 4, 271, 330, 6, -1, - 361, 245, 4, 272, 6, -1, 361, 241, 330, 242, - 245, 4, 272, 6, -1, 361, 245, 174, 245, 4, - 7, 348, 6, -1, 361, 241, 330, 242, 245, 174, - 245, 4, 7, 348, 6, -1, 361, 245, 175, 7, - 349, 6, -1, 361, 241, 330, 242, 245, 175, 7, - 349, 6, -1, 361, 185, 7, 330, 6, -1, 185, - 241, 330, 242, 7, 4, 6, -1, 185, 241, 330, - 242, 7, 100, 6, -1, 185, 241, 330, 242, 7, - 101, 6, -1, 185, 241, 330, 242, 245, 4, 7, - 330, 6, -1, 185, 241, 330, 242, 245, 4, 7, - 352, 6, -1, 185, 241, 330, 242, 245, 4, 7, - 243, 347, 244, 6, -1, 185, 241, 330, 242, 245, - 4, 6, -1, 130, 239, 4, 240, 245, 4, 7, - 330, 6, -1, 130, 239, 4, 240, 245, 4, 7, - 352, 6, -1, -1, 248, -1, -1, 277, 276, 361, - -1, 277, 276, 361, 7, 330, -1, -1, 277, 276, - 361, 7, 243, 344, 278, 283, 244, -1, -1, 277, - 276, 361, 273, 274, 7, 243, 344, 279, 283, 244, - -1, 277, 276, 361, 7, 352, -1, -1, 277, 276, - 361, 7, 243, 352, 280, 287, 244, -1, -1, 281, - 276, 351, -1, 330, 7, 352, -1, 282, 248, 330, - 7, 352, -1, 346, 7, 361, 239, 240, -1, -1, - 248, 285, -1, -1, 285, -1, 286, -1, 285, 248, - 286, -1, 4, 344, -1, 4, -1, 4, 243, 282, - 244, -1, 4, 352, -1, 4, 355, -1, -1, 248, - 288, -1, 289, -1, 288, 248, 289, -1, 4, 330, - -1, 4, 352, -1, 189, 352, -1, 4, 357, -1, - 4, 355, -1, 330, -1, 352, -1, 352, 248, 330, - -1, -1, 177, 95, 243, 330, 244, -1, -1, 123, - 341, -1, 91, 239, 330, 240, 7, 341, 6, -1, - 94, 239, 330, 240, 7, 344, 6, -1, 98, 239, - 330, 240, 7, 344, 6, -1, 92, 239, 330, 240, - 7, 344, 292, 6, -1, 93, 239, 330, 240, 7, - 344, 292, 6, -1, 169, 239, 330, 240, 7, 344, - 6, -1, 170, 239, 330, 240, 7, 344, 6, -1, - 171, 239, 330, 240, 7, 344, 173, 344, 172, 330, - 6, -1, 109, 239, 330, 240, 7, 344, 6, -1, - 94, 4, 239, 330, 240, 7, 344, 6, -1, 123, - 97, 239, 330, 240, 7, 344, 6, -1, 97, 239, - 330, 240, 7, 344, 291, 6, -1, 124, 97, 239, - 330, 240, 7, 344, 291, 6, -1, 13, 14, 6, - -1, 14, 97, 330, 6, -1, 113, 97, 239, 330, - 240, 7, 5, 5, 5, 6, -1, 95, 239, 330, - 240, 7, 344, 6, -1, 96, 239, 330, 240, 7, - 344, 6, -1, 100, 239, 330, 240, 7, 344, 6, - -1, 103, 239, 330, 240, 7, 344, 6, -1, 107, - 239, 330, 240, 7, 344, 6, -1, 108, 239, 330, - 240, 7, 344, 6, -1, 101, 239, 330, 240, 7, - 344, 6, -1, 102, 239, 330, 240, 7, 344, 6, - -1, 120, 239, 330, 240, 7, 344, 6, -1, 145, - 239, 330, 240, 7, 344, 6, -1, 97, 4, 239, - 330, 240, 7, 344, 6, -1, 99, 239, 330, 240, - 7, 344, 6, -1, 119, 239, 330, 240, 7, 344, - 6, -1, 124, 119, 239, 330, 240, 7, 344, 6, - -1, 127, 296, 239, 330, 240, 7, 344, 6, -1, - 127, 296, 239, 330, 240, 7, 344, 4, 243, 343, - 244, 6, -1, -1, 126, 295, 294, 239, 290, 240, - 271, 344, 6, -1, 91, -1, 94, -1, 97, -1, - 99, -1, 110, 243, 330, 244, -1, 94, -1, 97, - -1, 99, -1, 110, 243, 330, 244, -1, 94, -1, - 97, -1, 110, 243, 330, 244, -1, 91, -1, 94, - -1, 97, -1, 110, 243, 330, 244, -1, 134, 341, - 243, 300, 244, -1, 133, 243, 341, 248, 341, 248, - 330, 244, 243, 300, 244, -1, 135, 341, 243, 300, - 244, -1, 136, 243, 341, 248, 330, 244, 243, 300, - 244, -1, 136, 243, 341, 248, 341, 244, 243, 300, - 244, -1, 4, 243, 300, 244, -1, 151, 94, 243, - 347, 244, 97, 243, 330, 244, -1, 148, 94, 239, - 330, 240, 243, 347, 244, 6, -1, 301, -1, 299, - -1, -1, 301, 293, -1, 301, 295, 243, 347, 244, - 6, -1, 301, 126, 295, 243, 347, 244, 6, -1, - 301, 295, 243, 8, 244, 6, -1, 301, 126, 295, - 243, 8, 244, 6, -1, 138, 123, 239, 330, 240, - 7, 344, 6, -1, 138, 91, 239, 330, 240, 7, - 243, 343, 244, 6, -1, 138, 123, 239, 330, 240, - 7, 243, 341, 248, 341, 248, 347, 244, 6, -1, - 138, 123, 239, 330, 240, 7, 243, 341, 248, 341, - 248, 341, 248, 347, 244, 6, -1, 138, 95, 239, - 330, 240, 7, 243, 341, 248, 347, 244, 6, -1, - 138, 101, 239, 330, 240, 7, 243, 341, 248, 341, - 248, 347, 244, 6, -1, 138, 102, 239, 330, 240, - 7, 243, 341, 248, 341, 248, 347, 244, 6, -1, - 138, 104, 239, 330, 240, 7, 243, 341, 248, 341, - 248, 347, 244, 6, -1, 138, 105, 239, 330, 240, - 7, 243, 341, 248, 341, 248, 347, 244, 6, -1, - 138, 4, 239, 330, 240, 7, 344, 6, -1, 138, - 4, 239, 330, 240, 7, 5, 6, -1, 138, 4, - 243, 330, 244, 6, -1, 149, 243, 301, 244, -1, - 132, 149, 243, 301, 244, -1, 149, 185, 241, 330, - 242, 6, -1, 149, 4, 241, 330, 242, 6, -1, - 149, 361, 6, -1, 149, 4, 4, 6, -1, 149, - 84, 6, -1, 174, 348, 243, 301, 244, -1, 132, - 174, 348, 243, 301, 244, -1, 209, 330, 243, 301, - 244, -1, 190, 243, 8, 244, -1, 190, 5, 6, - -1, 191, 243, 8, 244, -1, 191, 5, 6, -1, - 190, 243, 301, 244, -1, 132, 190, 243, 301, 244, - -1, 191, 243, 301, 244, -1, 132, 191, 243, 301, - 244, -1, 361, 352, 6, -1, 73, 239, 358, 240, - 6, -1, 361, 361, 241, 330, 242, 351, 6, -1, - 361, 361, 361, 241, 330, 242, 6, -1, 361, 330, - 6, -1, 130, 239, 4, 240, 245, 4, 6, -1, - 168, 4, 6, -1, 183, 6, -1, 184, 6, -1, + 249, 0, -1, 250, -1, 1, 6, -1, -1, 250, + 251, -1, 253, -1, 254, -1, 274, -1, 117, 238, + 350, 239, 6, -1, 292, -1, 298, -1, 302, -1, + 303, -1, 304, -1, 305, -1, 309, -1, 318, -1, + 319, -1, 325, -1, 326, -1, 308, -1, 307, -1, + 306, -1, 301, -1, 328, -1, 221, -1, 222, -1, + 44, 238, 350, 239, 6, -1, 45, 238, 350, 239, + 6, -1, 44, 238, 350, 239, 252, 350, 6, -1, + 44, 238, 350, 247, 346, 239, 6, -1, 45, 238, + 350, 247, 346, 239, 6, -1, 44, 238, 350, 247, + 346, 239, 252, 350, 6, -1, 360, 350, 242, 255, + 243, 6, -1, 156, 4, 240, 329, 241, 6, -1, + 157, 4, 240, 329, 241, 6, -1, 158, 4, 240, + 329, 247, 329, 241, 6, -1, -1, 255, 258, -1, + 255, 262, -1, 255, 265, -1, 255, 267, -1, 255, + 268, -1, 329, -1, 256, 247, 329, -1, 329, -1, + 257, 247, 329, -1, -1, -1, 4, 259, 238, 256, + 239, 260, 242, 257, 243, 6, -1, 350, -1, 261, + 247, 350, -1, -1, 163, 238, 329, 247, 329, 247, + 329, 239, 263, 242, 261, 243, 6, -1, 350, -1, + 264, 247, 350, -1, -1, 164, 238, 329, 247, 329, + 247, 329, 247, 329, 239, 266, 242, 264, 243, 6, + -1, 165, 242, 342, 243, 242, 342, 243, 6, -1, + 165, 242, 342, 243, 242, 342, 243, 242, 342, 243, + 242, 342, 243, 6, -1, -1, 166, 269, 242, 257, + 243, 6, -1, 7, -1, 214, -1, 213, -1, 212, + -1, 211, -1, 236, -1, 235, -1, 238, -1, 240, + -1, 239, -1, 241, -1, 80, 240, 276, 241, 6, + -1, 81, 240, 280, 241, 6, -1, 334, 6, -1, + 88, 272, 351, 247, 329, 273, 6, -1, 89, 272, + 360, 247, 351, 273, 6, -1, 360, 270, 343, 6, + -1, 360, 271, 6, -1, 360, 272, 273, 270, 343, + 6, -1, 360, 272, 242, 346, 243, 273, 270, 343, + 6, -1, 360, 240, 329, 241, 270, 329, 6, -1, + 360, 240, 329, 241, 271, 6, -1, 360, 238, 329, + 239, 270, 329, 6, -1, 360, 238, 329, 239, 271, + 6, -1, 360, 7, 351, 6, -1, 360, 272, 273, + 7, 46, 272, 273, 6, -1, 360, 272, 273, 7, + 46, 272, 355, 273, 6, -1, 360, 272, 273, 214, + 46, 272, 355, 273, 6, -1, 360, 244, 4, 7, + 351, 6, -1, 360, 240, 329, 241, 244, 4, 7, + 351, 6, -1, 360, 244, 4, 270, 329, 6, -1, + 360, 240, 329, 241, 244, 4, 270, 329, 6, -1, + 360, 244, 4, 271, 6, -1, 360, 240, 329, 241, + 244, 4, 271, 6, -1, 360, 244, 173, 244, 4, + 7, 347, 6, -1, 360, 240, 329, 241, 244, 173, + 244, 4, 7, 347, 6, -1, 360, 244, 174, 7, + 348, 6, -1, 360, 240, 329, 241, 244, 174, 7, + 348, 6, -1, 360, 184, 7, 329, 6, -1, 184, + 240, 329, 241, 7, 4, 6, -1, 184, 240, 329, + 241, 7, 99, 6, -1, 184, 240, 329, 241, 7, + 100, 6, -1, 184, 240, 329, 241, 244, 4, 7, + 329, 6, -1, 184, 240, 329, 241, 244, 4, 7, + 351, 6, -1, 184, 240, 329, 241, 244, 4, 7, + 242, 346, 243, 6, -1, 184, 240, 329, 241, 244, + 4, 6, -1, 129, 238, 4, 239, 244, 4, 7, + 329, 6, -1, 129, 238, 4, 239, 244, 4, 7, + 351, 6, -1, -1, 247, -1, -1, 276, 275, 360, + -1, 276, 275, 360, 7, 329, -1, -1, 276, 275, + 360, 7, 242, 343, 277, 282, 243, -1, -1, 276, + 275, 360, 272, 273, 7, 242, 343, 278, 282, 243, + -1, 276, 275, 360, 7, 351, -1, -1, 276, 275, + 360, 7, 242, 351, 279, 286, 243, -1, -1, 280, + 275, 350, -1, 329, 7, 351, -1, 281, 247, 329, + 7, 351, -1, 345, 7, 360, 238, 239, -1, -1, + 247, 284, -1, -1, 284, -1, 285, -1, 284, 247, + 285, -1, 4, 343, -1, 4, -1, 4, 242, 281, + 243, -1, 4, 351, -1, 4, 354, -1, -1, 247, + 287, -1, 288, -1, 287, 247, 288, -1, 4, 329, + -1, 4, 351, -1, 188, 351, -1, 4, 356, -1, + 4, 354, -1, 329, -1, 351, -1, 351, 247, 329, + -1, -1, 176, 94, 242, 329, 243, -1, -1, 122, + 340, -1, 90, 238, 329, 239, 7, 340, 6, -1, + 93, 238, 329, 239, 7, 343, 6, -1, 97, 238, + 329, 239, 7, 343, 6, -1, 91, 238, 329, 239, + 7, 343, 291, 6, -1, 92, 238, 329, 239, 7, + 343, 291, 6, -1, 168, 238, 329, 239, 7, 343, + 6, -1, 169, 238, 329, 239, 7, 343, 6, -1, + 170, 238, 329, 239, 7, 343, 172, 343, 171, 329, + 6, -1, 108, 238, 329, 239, 7, 343, 6, -1, + 93, 4, 238, 329, 239, 7, 343, 6, -1, 122, + 96, 238, 329, 239, 7, 343, 6, -1, 96, 238, + 329, 239, 7, 343, 290, 6, -1, 123, 96, 238, + 329, 239, 7, 343, 290, 6, -1, 13, 14, 6, + -1, 14, 96, 329, 6, -1, 112, 96, 238, 329, + 239, 7, 5, 5, 5, 6, -1, 94, 238, 329, + 239, 7, 343, 6, -1, 95, 238, 329, 239, 7, + 343, 6, -1, 99, 238, 329, 239, 7, 343, 6, + -1, 102, 238, 329, 239, 7, 343, 6, -1, 106, + 238, 329, 239, 7, 343, 6, -1, 107, 238, 329, + 239, 7, 343, 6, -1, 100, 238, 329, 239, 7, + 343, 6, -1, 101, 238, 329, 239, 7, 343, 6, + -1, 119, 238, 329, 239, 7, 343, 6, -1, 144, + 238, 329, 239, 7, 343, 6, -1, 96, 4, 238, + 329, 239, 7, 343, 6, -1, 98, 238, 329, 239, + 7, 343, 6, -1, 118, 238, 329, 239, 7, 343, + 6, -1, 123, 118, 238, 329, 239, 7, 343, 6, + -1, 126, 295, 238, 329, 239, 7, 343, 6, -1, + 126, 295, 238, 329, 239, 7, 343, 4, 242, 342, + 243, 6, -1, -1, 125, 294, 293, 238, 289, 239, + 270, 343, 6, -1, 90, -1, 93, -1, 96, -1, + 98, -1, 109, 242, 329, 243, -1, 93, -1, 96, + -1, 98, -1, 109, 242, 329, 243, -1, 93, -1, + 96, -1, 109, 242, 329, 243, -1, 90, -1, 93, + -1, 96, -1, 109, 242, 329, 243, -1, 133, 340, + 242, 299, 243, -1, 132, 242, 340, 247, 340, 247, + 329, 243, 242, 299, 243, -1, 134, 340, 242, 299, + 243, -1, 135, 242, 340, 247, 329, 243, 242, 299, + 243, -1, 135, 242, 340, 247, 340, 243, 242, 299, + 243, -1, 4, 242, 299, 243, -1, 150, 93, 242, + 346, 243, 96, 242, 329, 243, -1, 147, 93, 238, + 329, 239, 242, 346, 243, 6, -1, 300, -1, 298, + -1, -1, 300, 292, -1, 300, 294, 242, 346, 243, + 6, -1, 300, 125, 294, 242, 346, 243, 6, -1, + 300, 294, 242, 8, 243, 6, -1, 300, 125, 294, + 242, 8, 243, 6, -1, 137, 122, 238, 329, 239, + 7, 343, 6, -1, 137, 90, 238, 329, 239, 7, + 242, 342, 243, 6, -1, 137, 122, 238, 329, 239, + 7, 242, 340, 247, 340, 247, 346, 243, 6, -1, + 137, 122, 238, 329, 239, 7, 242, 340, 247, 340, + 247, 340, 247, 346, 243, 6, -1, 137, 94, 238, + 329, 239, 7, 242, 340, 247, 346, 243, 6, -1, + 137, 100, 238, 329, 239, 7, 242, 340, 247, 340, + 247, 346, 243, 6, -1, 137, 101, 238, 329, 239, + 7, 242, 340, 247, 340, 247, 346, 243, 6, -1, + 137, 103, 238, 329, 239, 7, 242, 340, 247, 340, + 247, 346, 243, 6, -1, 137, 104, 238, 329, 239, + 7, 242, 340, 247, 340, 247, 346, 243, 6, -1, + 137, 4, 238, 329, 239, 7, 343, 6, -1, 137, + 4, 238, 329, 239, 7, 5, 6, -1, 137, 4, + 242, 329, 243, 6, -1, 148, 242, 300, 243, -1, + 131, 148, 242, 300, 243, -1, 148, 184, 240, 329, + 241, 6, -1, 148, 4, 240, 329, 241, 6, -1, + 148, 360, 6, -1, 148, 4, 4, 6, -1, 148, + 83, 6, -1, 173, 347, 242, 300, 243, -1, 131, + 173, 347, 242, 300, 243, -1, 208, 329, 242, 300, + 243, -1, 189, 242, 8, 243, -1, 189, 5, 6, + -1, 190, 242, 8, 243, -1, 190, 5, 6, -1, + 189, 242, 300, 243, -1, 131, 189, 242, 300, 243, + -1, 190, 242, 300, 243, -1, 131, 190, 242, 300, + 243, -1, 360, 351, 6, -1, 73, 238, 357, 239, + 6, -1, 360, 360, 240, 329, 241, 350, 6, -1, + 360, 360, 360, 240, 329, 241, 6, -1, 360, 329, + 6, -1, 129, 238, 4, 239, 244, 4, 6, -1, + 167, 4, 6, -1, 182, 6, -1, 183, 6, -1, 70, 6, -1, 71, 6, -1, 64, 6, -1, 64, - 243, 330, 248, 330, 248, 330, 248, 330, 248, 330, - 248, 330, 244, 6, -1, 65, 6, -1, 66, 6, - -1, 78, 6, -1, 79, 6, -1, 115, 6, -1, - 116, 243, 347, 244, 243, 347, 244, 243, 343, 244, - 243, 330, 248, 330, 244, 6, -1, 188, 239, 243, - 347, 244, 248, 352, 248, 352, 240, 6, -1, 176, - 239, 330, 8, 330, 240, -1, 176, 239, 330, 8, - 330, 8, 330, 240, -1, 176, 4, 177, 243, 330, - 8, 330, 244, -1, 176, 4, 177, 243, 330, 8, - 330, 8, 330, 244, -1, 178, -1, 189, 4, -1, - 189, 352, -1, 186, -1, 187, 361, 6, -1, 187, - 352, 6, -1, 179, 239, 330, 240, -1, 180, 239, - 330, 240, -1, 181, -1, 182, -1, 137, 341, 243, - 301, 244, -1, 137, 243, 341, 248, 341, 248, 330, - 244, 243, 301, 244, -1, 137, 243, 341, 248, 341, - 248, 341, 248, 330, 244, 243, 301, 244, -1, -1, - 137, 341, 243, 301, 311, 315, 244, -1, -1, 137, - 243, 341, 248, 341, 248, 330, 244, 243, 301, 312, - 315, 244, -1, -1, 137, 243, 341, 248, 341, 248, - 341, 248, 330, 244, 243, 301, 313, 315, 244, -1, - -1, 137, 243, 301, 314, 315, 244, -1, 137, 243, - 301, 244, 129, 109, 243, 330, 244, -1, 119, 344, - -1, 124, 119, 344, -1, 121, 243, 347, 244, 243, - 347, 244, 243, 330, 244, -1, 316, -1, 315, 316, - -1, 154, 243, 330, 244, 6, -1, 154, 243, 344, - 248, 344, 244, 6, -1, 155, 6, -1, 146, 6, - -1, 146, 330, 6, -1, 160, 6, -1, 160, 162, - 6, -1, 161, 6, -1, 161, 162, 6, -1, 156, - 239, 330, 240, 7, 344, 129, 330, 6, -1, 129, - 4, 241, 330, 242, 6, -1, 140, -1, 141, -1, - 142, -1, 143, -1, 144, -1, -1, 149, 6, -1, - 132, 149, 6, -1, 149, 330, 6, -1, 132, 149, - 330, 6, -1, 317, 243, 301, 318, 244, 243, 301, - 318, 244, -1, 106, 239, 351, 240, -1, 317, 239, - 330, 240, 7, 243, 301, 318, 244, 243, 301, 318, - 244, 6, -1, -1, 129, 4, 330, -1, -1, 4, - -1, -1, 7, 344, -1, -1, 7, 330, -1, -1, - 139, 344, -1, 111, 112, 345, 7, 330, 6, -1, - 125, 94, 345, 7, 330, 321, 6, -1, 125, 97, - 345, 323, 322, 6, -1, 125, 99, 345, 323, 6, - -1, 163, 345, 6, -1, 152, 97, 243, 347, 244, - 7, 330, 6, -1, 146, 97, 345, 324, 6, -1, - 146, 99, 345, 6, -1, 147, 97, 345, 7, 330, - 6, -1, 128, 94, 243, 347, 244, 7, 243, 347, - 244, 325, 6, -1, 128, 97, 243, 347, 244, 7, - 243, 347, 244, 325, 6, -1, 128, 94, 243, 347, - 244, 7, 243, 347, 244, 133, 243, 341, 248, 341, - 248, 330, 244, 6, -1, 128, 97, 243, 347, 244, - 7, 243, 347, 244, 133, 243, 341, 248, 341, 248, - 330, 244, 6, -1, 128, 94, 243, 347, 244, 7, - 243, 347, 244, 134, 341, 6, -1, 128, 97, 243, - 347, 244, 7, 243, 347, 244, 134, 341, 6, -1, - 128, 97, 330, 243, 347, 244, 7, 330, 243, 347, - 244, 6, -1, 295, 243, 347, 244, 177, 295, 243, - 330, 244, 6, -1, 153, 297, 345, 6, -1, 117, - 298, 345, 6, -1, 131, 94, 344, 6, -1, 127, - 296, 344, 6, -1, 150, 6, -1, 150, 4, 6, - -1, 150, 91, 243, 347, 244, 6, -1, 198, -1, - 199, -1, 200, -1, 328, 6, -1, 328, 243, 344, - 244, 6, -1, 328, 243, 344, 248, 344, 244, 6, - -1, 328, 239, 344, 240, 243, 344, 248, 344, 244, - 6, -1, 331, -1, 239, 330, 240, -1, 228, 330, - -1, 227, 330, -1, 234, 330, -1, 330, 228, 330, - -1, 330, 227, 330, -1, 330, 229, 330, -1, 330, - 230, 330, -1, 330, 232, 330, -1, 330, 233, 330, - -1, 330, 231, 330, -1, 330, 238, 330, -1, 330, - 221, 330, -1, 330, 222, 330, -1, 330, 226, 330, - -1, 330, 225, 330, -1, 330, 220, 330, -1, 330, - 219, 330, -1, 330, 218, 330, -1, 330, 217, 330, - -1, 330, 223, 330, -1, 330, 224, 330, -1, 330, - 216, 330, 8, 330, -1, 16, 273, 330, 274, -1, - 17, 273, 330, 274, -1, 18, 273, 330, 274, -1, - 19, 273, 330, 274, -1, 20, 273, 330, 274, -1, - 21, 273, 330, 274, -1, 22, 273, 330, 274, -1, - 23, 273, 330, 274, -1, 24, 273, 330, 274, -1, - 26, 273, 330, 274, -1, 27, 273, 330, 248, 330, - 274, -1, 28, 273, 330, 274, -1, 29, 273, 330, - 274, -1, 30, 273, 330, 274, -1, 31, 273, 330, - 274, -1, 32, 273, 330, 274, -1, 33, 273, 330, - 274, -1, 34, 273, 330, 274, -1, 35, 273, 330, - 274, -1, 36, 273, 330, 248, 330, 274, -1, 37, - 273, 330, 248, 330, 274, -1, 38, 273, 330, 248, - 330, 274, -1, 25, 273, 330, 274, -1, 3, -1, - 10, -1, 15, -1, 11, -1, 12, -1, 205, -1, - 206, -1, 207, -1, 75, -1, 76, -1, 77, -1, - -1, 83, 273, 330, 332, 283, 274, -1, 335, -1, - 196, 273, 351, 274, -1, 196, 273, 351, 248, 330, - 274, -1, 337, -1, 361, 241, 330, 242, -1, 361, - 239, 330, 240, -1, 201, 239, 337, 240, -1, 201, - 239, 337, 245, 338, 240, -1, 203, 239, 337, 333, - 240, -1, 203, 239, 337, 245, 338, 333, 240, -1, - 203, 239, 337, 273, 330, 274, 333, 240, -1, 203, - 239, 337, 245, 338, 273, 330, 274, 333, 240, -1, - 202, 239, 352, 240, -1, 246, 361, 273, 274, -1, - 246, 337, 245, 338, 273, 274, -1, 86, 273, 361, - 274, -1, 86, 273, 274, -1, 361, 272, -1, 361, - 241, 330, 242, 272, -1, 361, 239, 330, 240, 272, - -1, 361, 245, 338, -1, 361, 9, 361, 245, 338, - -1, 361, 245, 338, 239, 330, 240, -1, 361, 9, - 361, 245, 338, 239, 330, 240, -1, 361, 245, 338, - 241, 330, 242, -1, 361, 9, 361, 245, 338, 241, - 330, 242, -1, 361, 241, 330, 242, 245, 4, -1, - 361, 245, 4, 272, -1, 361, 241, 330, 242, 245, - 4, 272, -1, 192, 239, 351, 248, 330, 240, -1, - 56, 239, 344, 248, 344, 240, -1, 57, 273, 351, - 248, 351, 274, -1, 55, 273, 351, 274, -1, 58, - 273, 351, 248, 351, 274, -1, 63, 239, 358, 240, - -1, -1, 248, 330, -1, -1, 248, 351, -1, -1, - 84, 337, 340, 336, 241, 284, 242, -1, 361, -1, - 361, 9, 361, -1, 4, -1, 87, -1, 87, 330, - -1, -1, 239, 339, 240, -1, 342, -1, 228, 341, - -1, 227, 341, -1, 341, 228, 341, -1, 341, 227, - 341, -1, 243, 330, 248, 330, 248, 330, 248, 330, - 248, 330, 244, -1, 243, 330, 248, 330, 248, 330, - 248, 330, 244, -1, 243, 330, 248, 330, 248, 330, - 244, -1, 239, 330, 248, 330, 248, 330, 240, -1, - 344, -1, 343, 248, 344, -1, 330, -1, 346, -1, - 243, 244, -1, 243, 347, 244, -1, 228, 243, 347, - 244, -1, 330, 229, 243, 347, 244, -1, 344, -1, - 243, 8, 244, -1, 5, -1, 228, 346, -1, 330, - 229, 346, -1, 330, 8, 330, -1, 330, 8, 330, - 8, 330, -1, 91, 243, 330, 244, -1, 91, 243, - 8, 244, -1, 91, 5, -1, 296, 243, 8, 244, - -1, 296, 5, -1, 126, 295, 345, -1, 295, 177, - 64, 243, 330, 248, 330, 248, 330, 248, 330, 248, - 330, 248, 330, 244, -1, 64, 295, 243, 330, 244, - -1, 299, -1, 310, -1, 319, -1, 361, 273, 274, - -1, 361, 245, 338, 273, 274, -1, 361, 9, 361, - 245, 338, 273, 274, -1, 39, 241, 361, 242, -1, - 39, 241, 346, 242, -1, 39, 239, 346, 240, -1, - 39, 273, 243, 347, 244, 274, -1, 361, 273, 243, - 347, 244, 274, -1, 40, 273, 330, 248, 330, 248, - 330, 274, -1, 41, 273, 330, 248, 330, 248, 330, - 274, -1, 42, 273, 351, 274, -1, 43, 273, 330, - 248, 330, 248, 330, 248, 330, 248, 330, 248, 330, - 274, -1, 197, 273, 346, 274, -1, 32, 273, 346, - 274, -1, 330, -1, 346, -1, 347, 248, 330, -1, - 347, 248, 346, -1, 243, 330, 248, 330, 248, 330, - 248, 330, 244, -1, 243, 330, 248, 330, 248, 330, - 244, -1, 361, -1, 4, 245, 174, 245, 4, -1, - 243, 350, 244, -1, 361, 241, 330, 242, 245, 175, - -1, 348, -1, 350, 248, 348, -1, 352, -1, 361, - -1, 361, 241, 330, 242, -1, 361, 239, 330, 240, - -1, 361, 245, 338, -1, 361, 9, 361, 245, 338, - -1, 361, 245, 338, 239, 330, 240, -1, 361, 9, - 361, 245, 338, 239, 330, 240, -1, 361, 241, 330, - 242, 245, 4, -1, 126, 91, 243, 330, 244, -1, - 126, 94, 243, 330, 244, -1, 126, 97, 243, 330, - 244, -1, 126, 99, 243, 330, 244, -1, 5, -1, - 210, 241, 361, 242, -1, 67, -1, 208, -1, 72, - -1, 74, -1, 194, 239, 351, 240, -1, 193, 239, - 351, 248, 351, 240, -1, 195, 273, 351, 274, -1, - 195, 273, 351, 248, 351, 274, -1, 204, 239, 337, - 334, 240, -1, 204, 239, 337, 245, 338, 334, 240, - -1, 48, 273, 358, 274, -1, 49, 239, 351, 240, - -1, 50, 239, 351, 240, -1, 51, 239, 351, 248, - 351, 248, 351, 240, -1, 46, 273, 358, 274, -1, - 60, 273, 351, 274, -1, 61, 273, 351, 274, -1, - 62, 273, 351, 274, -1, 59, 273, 330, 248, 351, - 248, 351, 274, -1, 54, 273, 351, 248, 330, 248, - 330, 274, -1, 54, 273, 351, 248, 330, 274, -1, - 47, 273, 351, 274, -1, 47, 273, 351, 248, 347, - 274, -1, 68, 273, 351, 274, -1, 69, -1, 53, - 273, 351, 274, -1, 52, 273, 351, 274, -1, -1, - 88, 273, 352, 353, 287, 274, -1, 85, 273, 354, - 274, -1, 246, 330, -1, 361, 9, 246, 330, -1, - 46, 273, 357, 274, -1, 358, -1, 357, -1, 243, - 358, 244, -1, 351, -1, 359, -1, 358, 248, 351, - -1, 358, 248, 359, -1, 361, 239, 240, -1, 361, - 245, 338, 239, 240, -1, 361, 9, 361, 245, 338, - 239, 240, -1, 4, 247, 243, 330, 244, -1, 360, - 247, 243, 330, 244, -1, 211, 241, 351, 242, 247, - 243, 330, 244, -1, 4, -1, 360, -1, 211, 241, - 351, 242, -1 + 242, 329, 247, 329, 247, 329, 247, 329, 247, 329, + 247, 329, 243, 6, -1, 65, 6, -1, 66, 6, + -1, 78, 6, -1, 114, 6, -1, 115, 242, 346, + 243, 242, 346, 243, 242, 342, 243, 242, 329, 247, + 329, 243, 6, -1, 187, 238, 242, 346, 243, 247, + 351, 247, 351, 239, 6, -1, 175, 238, 329, 8, + 329, 239, -1, 175, 238, 329, 8, 329, 8, 329, + 239, -1, 175, 4, 176, 242, 329, 8, 329, 243, + -1, 175, 4, 176, 242, 329, 8, 329, 8, 329, + 243, -1, 177, -1, 188, 4, -1, 188, 351, -1, + 185, -1, 186, 360, 6, -1, 186, 351, 6, -1, + 178, 238, 329, 239, -1, 179, 238, 329, 239, -1, + 180, -1, 181, -1, 136, 340, 242, 300, 243, -1, + 136, 242, 340, 247, 340, 247, 329, 243, 242, 300, + 243, -1, 136, 242, 340, 247, 340, 247, 340, 247, + 329, 243, 242, 300, 243, -1, -1, 136, 340, 242, + 300, 310, 314, 243, -1, -1, 136, 242, 340, 247, + 340, 247, 329, 243, 242, 300, 311, 314, 243, -1, + -1, 136, 242, 340, 247, 340, 247, 340, 247, 329, + 243, 242, 300, 312, 314, 243, -1, -1, 136, 242, + 300, 313, 314, 243, -1, 136, 242, 300, 243, 128, + 108, 242, 329, 243, -1, 118, 343, -1, 123, 118, + 343, -1, 120, 242, 346, 243, 242, 346, 243, 242, + 329, 243, -1, 315, -1, 314, 315, -1, 153, 242, + 329, 243, 6, -1, 153, 242, 343, 247, 343, 243, + 6, -1, 154, 6, -1, 145, 6, -1, 145, 329, + 6, -1, 159, 6, -1, 159, 161, 6, -1, 160, + 6, -1, 160, 161, 6, -1, 155, 238, 329, 239, + 7, 343, 128, 329, 6, -1, 128, 4, 240, 329, + 241, 6, -1, 139, -1, 140, -1, 141, -1, 142, + -1, 143, -1, -1, 148, 6, -1, 131, 148, 6, + -1, 148, 329, 6, -1, 131, 148, 329, 6, -1, + 316, 242, 300, 317, 243, 242, 300, 317, 243, -1, + 105, 238, 350, 239, -1, 316, 238, 329, 239, 7, + 242, 300, 317, 243, 242, 300, 317, 243, 6, -1, + -1, 128, 4, 329, -1, -1, 4, -1, -1, 7, + 343, -1, -1, 7, 329, -1, -1, 138, 343, -1, + 110, 111, 344, 7, 329, 6, -1, 124, 93, 344, + 7, 329, 320, 6, -1, 124, 96, 344, 322, 321, + 6, -1, 124, 98, 344, 322, 6, -1, 162, 344, + 6, -1, 151, 96, 242, 346, 243, 7, 329, 6, + -1, 145, 96, 344, 323, 6, -1, 145, 98, 344, + 6, -1, 146, 96, 344, 7, 329, 6, -1, 127, + 93, 242, 346, 243, 7, 242, 346, 243, 324, 6, + -1, 127, 96, 242, 346, 243, 7, 242, 346, 243, + 324, 6, -1, 127, 93, 242, 346, 243, 7, 242, + 346, 243, 132, 242, 340, 247, 340, 247, 329, 243, + 6, -1, 127, 96, 242, 346, 243, 7, 242, 346, + 243, 132, 242, 340, 247, 340, 247, 329, 243, 6, + -1, 127, 93, 242, 346, 243, 7, 242, 346, 243, + 133, 340, 6, -1, 127, 96, 242, 346, 243, 7, + 242, 346, 243, 133, 340, 6, -1, 127, 96, 329, + 242, 346, 243, 7, 329, 242, 346, 243, 6, -1, + 294, 242, 346, 243, 176, 294, 242, 329, 243, 6, + -1, 152, 296, 344, 6, -1, 116, 297, 344, 6, + -1, 130, 93, 343, 6, -1, 126, 295, 343, 6, + -1, 149, 6, -1, 149, 4, 6, -1, 149, 90, + 242, 346, 243, 6, -1, 197, -1, 198, -1, 199, + -1, 327, 6, -1, 327, 242, 343, 243, 6, -1, + 327, 242, 343, 247, 343, 243, 6, -1, 327, 238, + 343, 239, 242, 343, 247, 343, 243, 6, -1, 330, + -1, 238, 329, 239, -1, 227, 329, -1, 226, 329, + -1, 233, 329, -1, 329, 227, 329, -1, 329, 226, + 329, -1, 329, 228, 329, -1, 329, 229, 329, -1, + 329, 231, 329, -1, 329, 232, 329, -1, 329, 230, + 329, -1, 329, 237, 329, -1, 329, 220, 329, -1, + 329, 221, 329, -1, 329, 225, 329, -1, 329, 224, + 329, -1, 329, 219, 329, -1, 329, 218, 329, -1, + 329, 217, 329, -1, 329, 216, 329, -1, 329, 222, + 329, -1, 329, 223, 329, -1, 329, 215, 329, 8, + 329, -1, 16, 272, 329, 273, -1, 17, 272, 329, + 273, -1, 18, 272, 329, 273, -1, 19, 272, 329, + 273, -1, 20, 272, 329, 273, -1, 21, 272, 329, + 273, -1, 22, 272, 329, 273, -1, 23, 272, 329, + 273, -1, 24, 272, 329, 273, -1, 26, 272, 329, + 273, -1, 27, 272, 329, 247, 329, 273, -1, 28, + 272, 329, 273, -1, 29, 272, 329, 273, -1, 30, + 272, 329, 273, -1, 31, 272, 329, 273, -1, 32, + 272, 329, 273, -1, 33, 272, 329, 273, -1, 34, + 272, 329, 273, -1, 35, 272, 329, 273, -1, 36, + 272, 329, 247, 329, 273, -1, 37, 272, 329, 247, + 329, 273, -1, 38, 272, 329, 247, 329, 273, -1, + 25, 272, 329, 273, -1, 3, -1, 10, -1, 15, + -1, 11, -1, 12, -1, 204, -1, 205, -1, 206, + -1, 75, -1, 76, -1, 77, -1, -1, 82, 272, + 329, 331, 282, 273, -1, 334, -1, 195, 272, 350, + 273, -1, 195, 272, 350, 247, 329, 273, -1, 336, + -1, 360, 240, 329, 241, -1, 360, 238, 329, 239, + -1, 200, 238, 336, 239, -1, 200, 238, 336, 244, + 337, 239, -1, 202, 238, 336, 332, 239, -1, 202, + 238, 336, 244, 337, 332, 239, -1, 202, 238, 336, + 272, 329, 273, 332, 239, -1, 202, 238, 336, 244, + 337, 272, 329, 273, 332, 239, -1, 201, 238, 351, + 239, -1, 245, 360, 272, 273, -1, 245, 336, 244, + 337, 272, 273, -1, 85, 272, 360, 273, -1, 85, + 272, 273, -1, 360, 271, -1, 360, 240, 329, 241, + 271, -1, 360, 238, 329, 239, 271, -1, 360, 244, + 337, -1, 360, 9, 360, 244, 337, -1, 360, 244, + 337, 238, 329, 239, -1, 360, 9, 360, 244, 337, + 238, 329, 239, -1, 360, 244, 337, 240, 329, 241, + -1, 360, 9, 360, 244, 337, 240, 329, 241, -1, + 360, 240, 329, 241, 244, 4, -1, 360, 244, 4, + 271, -1, 360, 240, 329, 241, 244, 4, 271, -1, + 191, 238, 350, 247, 329, 239, -1, 56, 238, 343, + 247, 343, 239, -1, 57, 272, 350, 247, 350, 273, + -1, 55, 272, 350, 273, -1, 58, 272, 350, 247, + 350, 273, -1, 63, 238, 357, 239, -1, -1, 247, + 329, -1, -1, 247, 350, -1, -1, 83, 336, 339, + 335, 240, 283, 241, -1, 360, -1, 360, 9, 360, + -1, 4, -1, 86, -1, 86, 329, -1, -1, 238, + 338, 239, -1, 341, -1, 227, 340, -1, 226, 340, + -1, 340, 227, 340, -1, 340, 226, 340, -1, 242, + 329, 247, 329, 247, 329, 247, 329, 247, 329, 243, + -1, 242, 329, 247, 329, 247, 329, 247, 329, 243, + -1, 242, 329, 247, 329, 247, 329, 243, -1, 238, + 329, 247, 329, 247, 329, 239, -1, 343, -1, 342, + 247, 343, -1, 329, -1, 345, -1, 242, 243, -1, + 242, 346, 243, -1, 227, 242, 346, 243, -1, 329, + 228, 242, 346, 243, -1, 343, -1, 242, 8, 243, + -1, 5, -1, 227, 345, -1, 329, 228, 345, -1, + 329, 8, 329, -1, 329, 8, 329, 8, 329, -1, + 90, 242, 329, 243, -1, 90, 242, 8, 243, -1, + 90, 5, -1, 295, 242, 8, 243, -1, 295, 5, + -1, 125, 294, 344, -1, 294, 176, 64, 242, 329, + 247, 329, 247, 329, 247, 329, 247, 329, 247, 329, + 243, -1, 64, 294, 242, 329, 243, -1, 298, -1, + 309, -1, 318, -1, 360, 272, 273, -1, 360, 244, + 337, 272, 273, -1, 360, 9, 360, 244, 337, 272, + 273, -1, 39, 240, 360, 241, -1, 39, 240, 345, + 241, -1, 39, 238, 345, 239, -1, 39, 272, 242, + 346, 243, 273, -1, 360, 272, 242, 346, 243, 273, + -1, 40, 272, 329, 247, 329, 247, 329, 273, -1, + 41, 272, 329, 247, 329, 247, 329, 273, -1, 42, + 272, 350, 273, -1, 43, 272, 329, 247, 329, 247, + 329, 247, 329, 247, 329, 247, 329, 273, -1, 196, + 272, 345, 273, -1, 32, 272, 345, 273, -1, 329, + -1, 345, -1, 346, 247, 329, -1, 346, 247, 345, + -1, 242, 329, 247, 329, 247, 329, 247, 329, 243, + -1, 242, 329, 247, 329, 247, 329, 243, -1, 360, + -1, 4, 244, 173, 244, 4, -1, 242, 349, 243, + -1, 360, 240, 329, 241, 244, 174, -1, 347, -1, + 349, 247, 347, -1, 351, -1, 360, -1, 360, 240, + 329, 241, -1, 360, 238, 329, 239, -1, 360, 244, + 337, -1, 360, 9, 360, 244, 337, -1, 360, 244, + 337, 238, 329, 239, -1, 360, 9, 360, 244, 337, + 238, 329, 239, -1, 360, 240, 329, 241, 244, 4, + -1, 125, 90, 242, 329, 243, -1, 125, 93, 242, + 329, 243, -1, 125, 96, 242, 329, 243, -1, 125, + 98, 242, 329, 243, -1, 5, -1, 209, 240, 360, + 241, -1, 67, -1, 207, -1, 72, -1, 74, -1, + 193, 238, 350, 239, -1, 192, 238, 350, 247, 350, + 239, -1, 194, 272, 350, 273, -1, 194, 272, 350, + 247, 350, 273, -1, 203, 238, 336, 333, 239, -1, + 203, 238, 336, 244, 337, 333, 239, -1, 48, 272, + 357, 273, -1, 49, 238, 350, 239, -1, 50, 238, + 350, 239, -1, 51, 238, 350, 247, 350, 247, 350, + 239, -1, 46, 272, 357, 273, -1, 60, 272, 350, + 273, -1, 61, 272, 350, 273, -1, 62, 272, 350, + 273, -1, 59, 272, 329, 247, 350, 247, 350, 273, + -1, 54, 272, 350, 247, 329, 247, 329, 273, -1, + 54, 272, 350, 247, 329, 273, -1, 47, 272, 350, + 273, -1, 47, 272, 350, 247, 346, 273, -1, 68, + 272, 350, 273, -1, 69, -1, 53, 272, 350, 273, + -1, 52, 272, 350, 273, -1, -1, 87, 272, 351, + 352, 286, 273, -1, 84, 272, 353, 273, -1, 245, + 329, -1, 360, 9, 245, 329, -1, 46, 272, 356, + 273, -1, 357, -1, 356, -1, 242, 357, 243, -1, + 350, -1, 358, -1, 357, 247, 350, -1, 357, 247, + 358, -1, 360, 238, 239, -1, 360, 244, 337, 238, + 239, -1, 360, 9, 360, 244, 337, 238, 239, -1, + 4, 246, 242, 329, 243, -1, 359, 246, 242, 329, + 243, -1, 210, 240, 350, 241, 246, 242, 329, 243, + -1, 4, -1, 359, -1, 210, 240, 350, 241, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ @@ -1440,48 +1437,48 @@ static const yytype_uint16 yyrline[] = 1540, 1549, 1552, 1559, 1562, 1569, 1593, 1609, 1625, 1662, 1702, 1718, 1734, 1756, 1772, 1791, 1807, 1828, 1839, 1845, 1851, 1858, 1889, 1904, 1926, 1949, 1972, 1995, 2019, 2043, - 2067, 2093, 2110, 2126, 2144, 2162, 2192, 2222, 2221, 2251, - 2253, 2255, 2257, 2259, 2267, 2269, 2271, 2273, 2281, 2283, - 2285, 2293, 2295, 2297, 2299, 2309, 2325, 2341, 2357, 2373, - 2389, 2426, 2448, 2472, 2473, 2478, 2481, 2485, 2501, 2519, - 2537, 2562, 2581, 2602, 2617, 2633, 2651, 2702, 2723, 2745, - 2768, 2873, 2889, 2924, 2946, 2968, 2974, 2989, 3017, 3029, - 3038, 3045, 3057, 3076, 3080, 3085, 3089, 3094, 3101, 3108, - 3115, 3127, 3200, 3218, 3235, 3250, 3283, 3295, 3319, 3323, - 3328, 3335, 3340, 3350, 3355, 3361, 3369, 3373, 3377, 3386, - 3450, 3466, 3483, 3500, 3522, 3544, 3579, 3587, 3595, 3601, - 3608, 3615, 3635, 3661, 3673, 3684, 3702, 3720, 3739, 3738, - 3763, 3762, 3789, 3788, 3813, 3812, 3835, 3851, 3868, 3885, - 3908, 3911, 3917, 3929, 3949, 3953, 3957, 3961, 3965, 3969, - 3973, 3977, 3986, 3999, 4000, 4001, 4002, 4003, 4007, 4008, - 4009, 4010, 4011, 4014, 4038, 4057, 4080, 4083, 4099, 4102, - 4119, 4122, 4128, 4131, 4138, 4141, 4148, 4170, 4211, 4255, - 4294, 4319, 4328, 4358, 4384, 4410, 4442, 4469, 4495, 4521, - 4547, 4573, 4595, 4606, 4654, 4703, 4715, 4726, 4733, 4748, - 4762, 4763, 4764, 4768, 4774, 4786, 4804, 4832, 4833, 4834, - 4835, 4836, 4837, 4838, 4839, 4840, 4847, 4848, 4849, 4850, - 4851, 4852, 4853, 4854, 4855, 4856, 4857, 4858, 4859, 4860, - 4861, 4862, 4863, 4864, 4865, 4866, 4867, 4868, 4869, 4870, - 4871, 4872, 4873, 4874, 4875, 4876, 4877, 4878, 4879, 4880, - 4881, 4882, 4883, 4884, 4893, 4894, 4895, 4896, 4897, 4898, - 4899, 4900, 4901, 4902, 4903, 4908, 4907, 4915, 4917, 4922, - 4927, 4931, 4936, 4941, 4945, 4949, 4953, 4957, 4961, 4965, - 4971, 4987, 4992, 4998, 5004, 5023, 5044, 5077, 5081, 5086, - 5090, 5094, 5098, 5103, 5108, 5118, 5128, 5133, 5144, 5153, - 5158, 5163, 5191, 5192, 5198, 5199, 5205, 5204, 5227, 5229, - 5234, 5243, 5245, 5251, 5252, 5257, 5261, 5265, 5269, 5273, - 5280, 5284, 5288, 5292, 5299, 5304, 5311, 5316, 5320, 5325, - 5329, 5337, 5348, 5352, 5356, 5370, 5378, 5386, 5393, 5403, - 5426, 5431, 5437, 5442, 5448, 5459, 5465, 5470, 5480, 5490, - 5500, 5512, 5516, 5521, 5533, 5537, 5541, 5545, 5563, 5571, - 5579, 5608, 5618, 5634, 5645, 5650, 5654, 5658, 5670, 5674, - 5686, 5703, 5713, 5717, 5732, 5737, 5744, 5748, 5753, 5767, - 5783, 5787, 5791, 5795, 5799, 5807, 5813, 5819, 5825, 5834, - 5838, 5842, 5850, 5856, 5862, 5866, 5874, 5882, 5889, 5898, - 5902, 5906, 5921, 5935, 5949, 5961, 5977, 5986, 5995, 6005, - 6016, 6024, 6032, 6036, 6055, 6062, 6068, 6075, 6083, 6082, - 6092, 6116, 6118, 6124, 6129, 6131, 6136, 6141, 6146, 6148, - 6152, 6164, 6178, 6182, 6189, 6197, 6205, 6216, 6218, 6221 + 2067, 2093, 2110, 2126, 2144, 2162, 2168, 2176, 2175, 2205, + 2207, 2209, 2211, 2213, 2221, 2223, 2225, 2227, 2235, 2237, + 2239, 2247, 2249, 2251, 2253, 2263, 2279, 2295, 2311, 2327, + 2343, 2380, 2402, 2426, 2427, 2432, 2435, 2439, 2455, 2473, + 2491, 2516, 2535, 2556, 2571, 2587, 2605, 2656, 2677, 2699, + 2722, 2827, 2843, 2878, 2900, 2922, 2928, 2943, 2971, 2983, + 2992, 2999, 3011, 3030, 3034, 3039, 3043, 3048, 3055, 3062, + 3069, 3081, 3154, 3172, 3189, 3204, 3237, 3249, 3273, 3277, + 3282, 3289, 3294, 3304, 3309, 3315, 3323, 3327, 3336, 3400, + 3416, 3433, 3450, 3472, 3494, 3529, 3537, 3545, 3551, 3558, + 3565, 3585, 3611, 3623, 3634, 3652, 3670, 3689, 3688, 3713, + 3712, 3739, 3738, 3763, 3762, 3785, 3801, 3818, 3835, 3858, + 3861, 3867, 3879, 3899, 3903, 3907, 3911, 3915, 3919, 3923, + 3927, 3936, 3949, 3950, 3951, 3952, 3953, 3957, 3958, 3959, + 3960, 3961, 3964, 3988, 4007, 4030, 4033, 4049, 4052, 4069, + 4072, 4078, 4081, 4088, 4091, 4098, 4120, 4161, 4205, 4244, + 4269, 4278, 4308, 4334, 4360, 4392, 4419, 4445, 4471, 4497, + 4523, 4545, 4556, 4604, 4653, 4665, 4676, 4683, 4698, 4712, + 4713, 4714, 4718, 4724, 4736, 4754, 4782, 4783, 4784, 4785, + 4786, 4787, 4788, 4789, 4790, 4797, 4798, 4799, 4800, 4801, + 4802, 4803, 4804, 4805, 4806, 4807, 4808, 4809, 4810, 4811, + 4812, 4813, 4814, 4815, 4816, 4817, 4818, 4819, 4820, 4821, + 4822, 4823, 4824, 4825, 4826, 4827, 4828, 4829, 4830, 4831, + 4832, 4833, 4834, 4843, 4844, 4845, 4846, 4847, 4848, 4849, + 4850, 4851, 4852, 4853, 4858, 4857, 4865, 4867, 4872, 4877, + 4881, 4886, 4891, 4895, 4899, 4903, 4907, 4911, 4915, 4921, + 4937, 4942, 4948, 4954, 4973, 4994, 5027, 5031, 5036, 5040, + 5044, 5048, 5053, 5058, 5068, 5078, 5083, 5094, 5103, 5108, + 5113, 5141, 5142, 5148, 5149, 5155, 5154, 5177, 5179, 5184, + 5193, 5195, 5201, 5202, 5207, 5211, 5215, 5219, 5223, 5230, + 5234, 5238, 5242, 5249, 5254, 5261, 5266, 5270, 5275, 5279, + 5287, 5298, 5302, 5306, 5320, 5328, 5336, 5343, 5353, 5376, + 5381, 5387, 5392, 5398, 5409, 5415, 5420, 5430, 5440, 5450, + 5462, 5466, 5471, 5483, 5487, 5491, 5495, 5513, 5521, 5529, + 5558, 5568, 5584, 5595, 5600, 5604, 5608, 5620, 5624, 5636, + 5653, 5663, 5667, 5682, 5687, 5694, 5698, 5703, 5717, 5733, + 5737, 5741, 5745, 5749, 5757, 5763, 5769, 5775, 5784, 5788, + 5792, 5800, 5806, 5812, 5816, 5824, 5832, 5839, 5848, 5852, + 5856, 5871, 5885, 5899, 5911, 5927, 5936, 5945, 5955, 5966, + 5974, 5982, 5986, 6005, 6012, 6018, 6025, 6033, 6032, 6042, + 6066, 6068, 6074, 6079, 6081, 6086, 6091, 6096, 6098, 6102, + 6114, 6128, 6132, 6139, 6147, 6155, 6166, 6168, 6171 }; #endif @@ -1503,20 +1500,19 @@ static const char *const yytname[] = "tTextAttributes", "tBoundingBox", "tDraw", "tSetChanged", "tToday", "tFixRelativePath", "tCurrentDirectory", "tSyncModel", "tNewModel", "tOnelabAction", "tOnelabRun", "tCodeName", "tCpu", "tMemory", - "tTotalMemory", "tCreateTopology", "tCreateTopologyNoHoles", - "tDistanceFunction", "tDefineConstant", "tUndefineConstant", - "tDefineNumber", "tDefineStruct", "tNameStruct", "tDimNameSpace", - "tAppend", "tDefineString", "tSetNumber", "tSetString", "tPoint", - "tCircle", "tEllipse", "tLine", "tSphere", "tPolarSphere", "tSurface", - "tSpline", "tVolume", "tBox", "tCylinder", "tCone", "tTorus", - "tEllipsoid", "tQuadric", "tShapeFromFile", "tRectangle", "tDisk", - "tWire", "tGeoEntity", "tCharacteristic", "tLength", "tParametric", - "tElliptic", "tRefineMesh", "tAdaptMesh", "tRelocateMesh", "tSetFactory", - "tThruSections", "tWedge", "tFillet", "tChamfer", "tPlane", "tRuled", - "tTransfinite", "tPhysical", "tCompound", "tPeriodic", "tUsing", - "tPlugin", "tDegenerated", "tRecursive", "tRotate", "tTranslate", - "tSymmetry", "tDilate", "tExtrude", "tLevelset", "tAffine", - "tBooleanUnion", "tBooleanIntersection", "tBooleanDifference", + "tTotalMemory", "tCreateTopology", "tDistanceFunction", + "tDefineConstant", "tUndefineConstant", "tDefineNumber", "tDefineStruct", + "tNameStruct", "tDimNameSpace", "tAppend", "tDefineString", "tSetNumber", + "tSetString", "tPoint", "tCircle", "tEllipse", "tLine", "tSphere", + "tPolarSphere", "tSurface", "tSpline", "tVolume", "tBox", "tCylinder", + "tCone", "tTorus", "tEllipsoid", "tQuadric", "tShapeFromFile", + "tRectangle", "tDisk", "tWire", "tGeoEntity", "tCharacteristic", + "tLength", "tParametric", "tElliptic", "tRefineMesh", "tAdaptMesh", + "tRelocateMesh", "tSetFactory", "tThruSections", "tWedge", "tFillet", + "tChamfer", "tPlane", "tRuled", "tTransfinite", "tPhysical", "tCompound", + "tPeriodic", "tUsing", "tPlugin", "tDegenerated", "tRecursive", + "tRotate", "tTranslate", "tSymmetry", "tDilate", "tExtrude", "tLevelset", + "tAffine", "tBooleanUnion", "tBooleanIntersection", "tBooleanDifference", "tBooleanSection", "tBooleanFragments", "tThickSolid", "tRecombine", "tSmoother", "tSplit", "tDelete", "tCoherence", "tIntersect", "tMeshAlgorithm", "tReverse", "tLayers", "tScaleLast", "tHole", "tAlias", @@ -1594,76 +1590,76 @@ static const yytype_uint16 yytoknum[] = 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 63, 471, 472, 473, - 474, 60, 62, 475, 476, 477, 478, 43, 45, 42, - 47, 37, 124, 38, 33, 479, 480, 481, 94, 40, - 41, 91, 93, 123, 125, 46, 35, 126, 44 + 465, 466, 467, 468, 469, 63, 470, 471, 472, 473, + 60, 62, 474, 475, 476, 477, 43, 45, 42, 47, + 37, 124, 38, 33, 478, 479, 480, 94, 40, 41, + 91, 93, 123, 125, 46, 35, 126, 44 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint16 yyr1[] = { - 0, 249, 250, 250, 251, 251, 252, 252, 252, 252, - 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, - 252, 252, 252, 252, 252, 252, 253, 253, 254, 254, - 254, 254, 254, 254, 255, 255, 255, 255, 256, 256, - 256, 256, 256, 256, 257, 257, 258, 258, 260, 261, - 259, 262, 262, 264, 263, 265, 265, 267, 266, 268, - 268, 270, 269, 271, 271, 271, 271, 271, 272, 272, - 273, 273, 274, 274, 275, 275, 275, 275, 275, 275, - 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, - 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, - 275, 275, 275, 275, 275, 275, 275, 275, 275, 275, - 275, 276, 276, 277, 277, 277, 278, 277, 279, 277, - 277, 280, 277, 281, 281, 282, 282, 282, 283, 283, - 284, 284, 285, 285, 286, 286, 286, 286, 286, 287, - 287, 288, 288, 289, 289, 289, 289, 289, 290, 290, - 290, 291, 291, 292, 292, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 294, 293, 295, - 295, 295, 295, 295, 296, 296, 296, 296, 297, 297, - 297, 298, 298, 298, 298, 299, 299, 299, 299, 299, - 299, 299, 299, 300, 300, 301, 301, 301, 301, 301, - 301, 302, 302, 302, 302, 302, 302, 302, 302, 302, - 302, 302, 302, 303, 303, 303, 303, 303, 303, 303, - 304, 304, 305, 306, 306, 306, 306, 306, 306, 306, - 306, 307, 307, 307, 307, 307, 307, 307, 307, 307, - 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, - 308, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 310, 310, 310, 311, 310, - 312, 310, 313, 310, 314, 310, 310, 310, 310, 310, - 315, 315, 316, 316, 316, 316, 316, 316, 316, 316, - 316, 316, 316, 317, 317, 317, 317, 317, 318, 318, - 318, 318, 318, 319, 319, 320, 321, 321, 322, 322, - 323, 323, 324, 324, 325, 325, 326, 326, 326, 326, - 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, - 326, 326, 326, 326, 326, 326, 326, 327, 327, 327, - 328, 328, 328, 329, 329, 329, 329, 330, 330, 330, + 0, 248, 249, 249, 250, 250, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, + 251, 251, 251, 251, 251, 251, 252, 252, 253, 253, + 253, 253, 253, 253, 254, 254, 254, 254, 255, 255, + 255, 255, 255, 255, 256, 256, 257, 257, 259, 260, + 258, 261, 261, 263, 262, 264, 264, 266, 265, 267, + 267, 269, 268, 270, 270, 270, 270, 270, 271, 271, + 272, 272, 273, 273, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 275, 275, 276, 276, 276, 277, 276, 278, 276, + 276, 279, 276, 280, 280, 281, 281, 281, 282, 282, + 283, 283, 284, 284, 285, 285, 285, 285, 285, 286, + 286, 287, 287, 288, 288, 288, 288, 288, 289, 289, + 289, 290, 290, 291, 291, 292, 292, 292, 292, 292, + 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, + 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, + 292, 292, 292, 292, 292, 292, 292, 293, 292, 294, + 294, 294, 294, 294, 295, 295, 295, 295, 296, 296, + 296, 297, 297, 297, 297, 298, 298, 298, 298, 298, + 298, 298, 298, 299, 299, 300, 300, 300, 300, 300, + 300, 301, 301, 301, 301, 301, 301, 301, 301, 301, + 301, 301, 301, 302, 302, 302, 302, 302, 302, 302, + 303, 303, 304, 305, 305, 305, 305, 305, 305, 305, + 305, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 307, + 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, + 308, 308, 308, 308, 309, 309, 309, 310, 309, 311, + 309, 312, 309, 313, 309, 309, 309, 309, 309, 314, + 314, 315, 315, 315, 315, 315, 315, 315, 315, 315, + 315, 315, 316, 316, 316, 316, 316, 317, 317, 317, + 317, 317, 318, 318, 319, 320, 320, 321, 321, 322, + 322, 323, 323, 324, 324, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 325, 325, 325, 325, 326, 326, 326, 327, + 327, 327, 328, 328, 328, 328, 329, 329, 329, 329, + 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, + 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, + 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, + 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, + 329, 329, 329, 330, 330, 330, 330, 330, 330, 330, + 330, 330, 330, 330, 331, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 330, 330, 330, 330, 331, 331, 331, 331, 331, 331, - 331, 331, 331, 331, 331, 332, 331, 331, 331, 331, - 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, - 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, - 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, - 331, 331, 333, 333, 334, 334, 336, 335, 337, 337, - 338, 339, 339, 340, 340, 341, 341, 341, 341, 341, - 342, 342, 342, 342, 343, 343, 344, 344, 344, 344, - 344, 344, 345, 345, 345, 346, 346, 346, 346, 346, - 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, - 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, - 346, 346, 346, 346, 347, 347, 347, 347, 348, 348, - 348, 348, 349, 349, 350, 350, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 351, 352, - 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, - 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, - 352, 352, 352, 352, 352, 352, 352, 352, 353, 352, - 352, 354, 354, 355, 356, 356, 357, 358, 358, 358, - 358, 359, 359, 359, 360, 360, 360, 361, 361, 361 + 330, 332, 332, 333, 333, 335, 334, 336, 336, 337, + 338, 338, 339, 339, 340, 340, 340, 340, 340, 341, + 341, 341, 341, 342, 342, 343, 343, 343, 343, 343, + 343, 344, 344, 344, 345, 345, 345, 345, 345, 345, + 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, + 345, 345, 345, 346, 346, 346, 346, 347, 347, 347, + 347, 348, 348, 349, 349, 350, 350, 350, 350, 350, + 350, 350, 350, 350, 350, 350, 350, 350, 351, 351, + 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, + 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, + 351, 351, 351, 351, 351, 351, 351, 352, 351, 351, + 353, 353, 354, 355, 355, 356, 357, 357, 357, 357, + 358, 358, 358, 359, 359, 359, 360, 360, 360 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -1695,40 +1691,40 @@ static const yytype_uint8 yyr2[] = 8, 8, 6, 4, 5, 6, 6, 3, 4, 3, 5, 6, 5, 4, 3, 4, 3, 4, 5, 4, 5, 3, 5, 7, 7, 3, 7, 3, 2, 2, - 2, 2, 2, 15, 2, 2, 2, 2, 2, 16, - 11, 6, 8, 8, 10, 1, 2, 2, 1, 3, - 3, 4, 4, 1, 1, 5, 11, 13, 0, 7, - 0, 13, 0, 15, 0, 6, 9, 2, 3, 10, - 1, 2, 5, 7, 2, 2, 3, 2, 3, 2, - 3, 9, 6, 1, 1, 1, 1, 1, 0, 2, - 3, 3, 4, 9, 4, 14, 0, 3, 0, 1, - 0, 2, 0, 2, 0, 2, 6, 7, 6, 5, - 3, 8, 5, 4, 6, 11, 11, 18, 18, 12, - 12, 12, 10, 4, 4, 4, 4, 2, 3, 6, - 1, 1, 1, 2, 5, 7, 10, 1, 3, 2, - 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 6, 4, 4, 4, 4, 4, 4, 4, 4, - 6, 6, 6, 4, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 6, 1, 4, 6, - 1, 4, 4, 4, 6, 5, 7, 8, 10, 4, - 4, 6, 4, 3, 2, 5, 5, 3, 5, 6, - 8, 6, 8, 6, 4, 7, 6, 6, 6, 4, - 6, 4, 0, 2, 0, 2, 0, 7, 1, 3, - 1, 1, 2, 0, 3, 1, 2, 2, 3, 3, - 11, 9, 7, 7, 1, 3, 1, 1, 2, 3, - 4, 5, 1, 3, 1, 2, 3, 3, 5, 4, - 4, 2, 4, 2, 3, 16, 5, 1, 1, 1, - 3, 5, 7, 4, 4, 4, 6, 6, 8, 8, - 4, 14, 4, 4, 1, 1, 3, 3, 9, 7, - 1, 5, 3, 6, 1, 3, 1, 1, 4, 4, - 3, 5, 6, 8, 6, 5, 5, 5, 5, 1, - 4, 1, 1, 1, 1, 4, 6, 4, 6, 5, - 7, 4, 4, 4, 8, 4, 4, 4, 4, 8, - 8, 6, 4, 6, 4, 1, 4, 4, 0, 6, - 4, 2, 4, 4, 1, 1, 3, 1, 1, 3, - 3, 3, 5, 7, 5, 5, 8, 1, 1, 4 + 2, 2, 2, 15, 2, 2, 2, 2, 16, 11, + 6, 8, 8, 10, 1, 2, 2, 1, 3, 3, + 4, 4, 1, 1, 5, 11, 13, 0, 7, 0, + 13, 0, 15, 0, 6, 9, 2, 3, 10, 1, + 2, 5, 7, 2, 2, 3, 2, 3, 2, 3, + 9, 6, 1, 1, 1, 1, 1, 0, 2, 3, + 3, 4, 9, 4, 14, 0, 3, 0, 1, 0, + 2, 0, 2, 0, 2, 6, 7, 6, 5, 3, + 8, 5, 4, 6, 11, 11, 18, 18, 12, 12, + 12, 10, 4, 4, 4, 4, 2, 3, 6, 1, + 1, 1, 2, 5, 7, 10, 1, 3, 2, 2, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 6, 4, 4, 4, 4, 4, 4, 4, 4, 6, + 6, 6, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 6, 1, 4, 6, 1, + 4, 4, 4, 6, 5, 7, 8, 10, 4, 4, + 6, 4, 3, 2, 5, 5, 3, 5, 6, 8, + 6, 8, 6, 4, 7, 6, 6, 6, 4, 6, + 4, 0, 2, 0, 2, 0, 7, 1, 3, 1, + 1, 2, 0, 3, 1, 2, 2, 3, 3, 11, + 9, 7, 7, 1, 3, 1, 1, 2, 3, 4, + 5, 1, 3, 1, 2, 3, 3, 5, 4, 4, + 2, 4, 2, 3, 16, 5, 1, 1, 1, 3, + 5, 7, 4, 4, 4, 6, 6, 8, 8, 4, + 14, 4, 4, 1, 1, 3, 3, 9, 7, 1, + 5, 3, 6, 1, 3, 1, 1, 4, 4, 3, + 5, 6, 8, 6, 5, 5, 5, 5, 1, 4, + 1, 1, 1, 1, 4, 6, 4, 6, 5, 7, + 4, 4, 4, 8, 4, 4, 4, 4, 8, 8, + 6, 4, 6, 4, 1, 4, 4, 0, 6, 4, + 2, 4, 4, 1, 1, 3, 1, 1, 3, 3, + 3, 5, 7, 5, 5, 8, 1, 1, 4 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -1736,1572 +1732,1564 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint16 yydefact[] = { - 0, 0, 0, 2, 3, 1, 597, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 189, 0, 0, 190, 0, 0, - 191, 0, 192, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 3, 1, 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 189, 0, 0, 190, 0, 0, 191, + 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 313, 314, 315, 316, - 317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 275, 0, 0, 283, 284, 0, 0, 0, 278, 0, - 0, 0, 0, 0, 360, 361, 362, 0, 0, 5, - 6, 7, 8, 10, 0, 11, 24, 12, 13, 14, - 15, 23, 22, 21, 16, 0, 17, 18, 19, 20, - 0, 25, 0, 598, 0, 215, 0, 0, 0, 0, - 0, 262, 0, 264, 265, 260, 261, 0, 266, 267, - 113, 123, 597, 473, 468, 70, 71, 0, 0, 0, + 0, 0, 0, 0, 0, 312, 313, 314, 315, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, + 0, 0, 282, 283, 0, 0, 0, 277, 0, 0, + 0, 0, 0, 359, 360, 361, 0, 0, 5, 6, + 7, 8, 10, 0, 11, 24, 12, 13, 14, 15, + 23, 22, 21, 16, 0, 17, 18, 19, 20, 0, + 25, 0, 597, 0, 215, 0, 0, 0, 0, 0, + 262, 0, 264, 265, 260, 261, 0, 266, 113, 123, + 596, 472, 467, 70, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 268, 0, 201, 202, 203, 0, 0, 0, 414, - 415, 417, 418, 416, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 267, + 0, 201, 202, 203, 0, 0, 0, 413, 414, 416, + 417, 415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 422, 423, - 424, 0, 0, 189, 194, 195, 196, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 419, 420, 421, - 0, 0, 0, 0, 0, 0, 0, 0, 507, 508, - 0, 509, 486, 367, 427, 430, 297, 487, 468, 0, - 0, 0, 0, 0, 0, 0, 0, 189, 190, 191, - 192, 187, 194, 195, 196, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 421, 422, 423, 0, + 0, 189, 194, 195, 196, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 418, 419, 420, 0, 0, + 0, 0, 0, 0, 0, 0, 506, 507, 0, 508, + 485, 366, 426, 429, 296, 486, 467, 0, 0, 0, + 0, 0, 0, 0, 0, 189, 190, 191, 192, 187, + 194, 195, 196, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 474, + 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, + 215, 0, 0, 356, 0, 0, 0, 198, 199, 0, + 0, 0, 0, 0, 493, 0, 0, 491, 0, 0, + 0, 0, 0, 596, 0, 0, 529, 0, 0, 0, + 0, 258, 259, 0, 548, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 550, 0, + 574, 552, 553, 0, 0, 0, 0, 0, 0, 551, + 0, 0, 0, 0, 275, 276, 0, 215, 0, 215, + 0, 0, 0, 467, 0, 0, 0, 215, 362, 0, + 0, 76, 0, 63, 0, 0, 67, 66, 65, 64, + 69, 68, 70, 71, 0, 0, 0, 0, 0, 0, + 535, 467, 0, 214, 0, 213, 0, 168, 0, 0, + 535, 536, 0, 0, 586, 0, 587, 536, 111, 111, + 0, 465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 475, 0, 0, 215, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 597, - 0, 0, 215, 0, 0, 357, 0, 0, 0, 198, - 199, 0, 0, 0, 0, 0, 494, 0, 0, 492, - 0, 0, 0, 0, 0, 597, 0, 0, 530, 0, - 0, 0, 0, 258, 259, 0, 549, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 523, 524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 551, 0, 575, 553, 554, 0, 0, 0, 0, 0, - 0, 552, 0, 0, 0, 0, 276, 277, 0, 215, - 0, 215, 0, 0, 0, 468, 0, 0, 0, 215, - 363, 0, 0, 76, 0, 63, 0, 0, 67, 66, - 65, 64, 69, 68, 70, 71, 0, 0, 0, 0, - 0, 0, 536, 468, 0, 214, 0, 213, 0, 168, - 0, 0, 536, 537, 0, 0, 587, 0, 588, 537, - 111, 111, 0, 466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 70, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 524, 525, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 500, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 369, 0, 368, 494, 370, 0, 487, + 0, 0, 467, 0, 502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, - 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 501, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 370, 0, 369, 495, 371, - 0, 488, 0, 0, 468, 0, 503, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 70, 71, 0, + 443, 0, 0, 0, 0, 0, 0, 297, 0, 329, + 329, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 215, 0, 215, 215, 0, 476, 475, 0, 0, 0, + 0, 215, 215, 0, 0, 0, 0, 293, 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, - 71, 0, 444, 0, 0, 0, 0, 0, 0, 298, - 0, 330, 330, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 215, 0, 215, 215, 0, 477, 476, 0, - 0, 0, 0, 215, 215, 0, 0, 0, 0, 294, - 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 332, 0, 0, 0, 0, 0, 239, 0, - 0, 237, 358, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 340, 257, 0, 0, 0, 0, 0, - 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 331, 0, 0, 0, 0, 0, 239, 0, 0, 237, + 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 339, 257, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 280, 279, 0, - 244, 0, 0, 246, 0, 0, 0, 369, 0, 215, - 0, 0, 0, 0, 0, 0, 0, 318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 80, 72, 73, 0, 0, 255, 38, - 251, 0, 0, 0, 0, 0, 210, 0, 0, 0, - 0, 216, 0, 0, 169, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 279, 278, 0, 244, 0, + 0, 246, 0, 0, 0, 368, 0, 215, 0, 0, + 0, 0, 0, 0, 0, 317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 112, 0, 0, 0, 471, 0, 0, 469, 0, 0, + 0, 80, 72, 73, 0, 0, 255, 38, 251, 0, + 0, 0, 0, 0, 210, 0, 0, 0, 0, 216, + 0, 0, 169, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, + 0, 0, 470, 0, 0, 468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 324, 0, 0, 0, 193, - 0, 0, 0, 0, 0, 0, 354, 0, 0, 0, + 0, 0, 0, 323, 0, 0, 0, 193, 0, 0, + 0, 0, 0, 0, 353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 468, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 425, 443, 0, - 0, 0, 0, 504, 0, 0, 0, 0, 0, 462, - 0, 368, 489, 0, 0, 0, 0, 497, 0, 387, - 386, 385, 384, 380, 381, 388, 389, 383, 382, 373, - 372, 0, 374, 496, 375, 378, 376, 377, 379, 469, - 0, 0, 470, 447, 0, 510, 0, 0, 0, 0, - 0, 0, 0, 328, 0, 0, 0, 0, 356, 0, - 0, 0, 0, 355, 0, 215, 0, 0, 0, 0, - 0, 479, 478, 0, 0, 0, 0, 0, 0, 0, - 288, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 343, 0, 0, 238, 0, 0, 233, - 0, 0, 0, 0, 353, 0, 0, 0, 368, 493, - 0, 0, 0, 0, 0, 0, 0, 0, 281, 282, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 578, 0, - 0, 0, 464, 0, 0, 243, 247, 245, 249, 0, - 374, 0, 469, 447, 599, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, - 368, 0, 63, 0, 0, 0, 0, 79, 0, 63, - 64, 0, 0, 469, 0, 0, 447, 0, 0, 0, - 187, 0, 0, 594, 28, 26, 27, 0, 0, 0, - 0, 0, 470, 540, 29, 0, 0, 252, 589, 590, - 0, 591, 540, 74, 114, 75, 124, 472, 474, 130, + 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 424, 442, 0, 0, 0, + 0, 503, 0, 0, 0, 0, 0, 461, 0, 367, + 488, 0, 0, 0, 0, 496, 0, 386, 385, 384, + 383, 379, 380, 387, 388, 382, 381, 372, 371, 0, + 373, 495, 374, 377, 375, 376, 378, 468, 0, 0, + 469, 446, 0, 509, 0, 0, 0, 0, 0, 0, + 0, 327, 0, 0, 0, 0, 355, 0, 0, 0, + 0, 354, 0, 215, 0, 0, 0, 0, 0, 478, + 477, 0, 0, 0, 0, 0, 0, 0, 287, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 342, 0, 0, 238, 0, 0, 233, 0, 0, + 0, 0, 352, 0, 0, 0, 367, 492, 0, 0, + 0, 0, 0, 0, 0, 0, 280, 281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 526, 527, 204, 9, 391, 392, 393, - 394, 395, 396, 397, 398, 399, 413, 400, 0, 402, - 403, 404, 405, 406, 523, 407, 408, 409, 0, 0, - 0, 515, 514, 513, 0, 0, 0, 520, 0, 459, - 0, 0, 0, 461, 0, 128, 442, 500, 499, 197, - 0, 0, 428, 522, 433, 0, 439, 0, 0, 0, - 0, 490, 0, 0, 440, 0, 502, 0, 0, 0, - 0, 432, 431, 454, 70, 71, 0, 0, 0, 0, - 0, 0, 368, 326, 331, 329, 0, 339, 0, 148, - 149, 197, 368, 0, 0, 0, 0, 234, 0, 248, - 250, 0, 0, 0, 205, 207, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 300, 0, 285, + 0, 0, 0, 0, 0, 0, 577, 0, 0, 0, + 463, 0, 0, 243, 247, 245, 249, 0, 373, 0, + 468, 446, 598, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 87, 0, 0, 0, 0, 0, 367, 0, + 63, 0, 0, 0, 0, 79, 0, 63, 64, 0, + 0, 468, 0, 0, 446, 0, 0, 0, 187, 0, + 0, 593, 28, 26, 27, 0, 0, 0, 0, 0, + 469, 539, 29, 0, 0, 252, 588, 589, 0, 590, + 539, 74, 114, 75, 124, 471, 473, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 333, 342, 0, 0, 0, 0, 0, 0, 0, - 200, 0, 0, 0, 0, 0, 0, 0, 0, 240, - 0, 0, 0, 0, 565, 0, 572, 561, 562, 563, - 0, 577, 576, 0, 0, 566, 567, 568, 574, 581, - 580, 0, 139, 0, 555, 0, 557, 0, 0, 0, - 550, 0, 242, 0, 0, 0, 0, 0, 0, 0, - 319, 0, 0, 0, 364, 0, 595, 0, 0, 0, - 0, 101, 63, 0, 0, 0, 0, 0, 0, 0, - 95, 0, 0, 0, 0, 0, 0, 0, 0, 48, - 0, 0, 0, 61, 0, 39, 40, 41, 42, 43, - 0, 432, 431, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 539, 538, 0, 0, 0, 0, - 0, 0, 0, 135, 0, 131, 132, 0, 0, 0, - 153, 153, 0, 0, 0, 0, 0, 151, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 336, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 506, 0, 0, 0, 0, 0, 462, 463, 0, - 435, 0, 0, 0, 498, 390, 491, 448, 446, 0, - 445, 0, 0, 511, 0, 0, 0, 0, 0, 0, - 0, 0, 338, 0, 0, 0, 0, 0, 0, 0, - 241, 0, 0, 0, 0, 0, 0, 0, 305, 0, - 0, 304, 0, 307, 0, 309, 0, 295, 301, 0, - 0, 0, 232, 0, 0, 0, 0, 0, 0, 0, - 0, 344, 0, 236, 235, 359, 0, 0, 35, 36, - 0, 0, 0, 0, 531, 0, 0, 0, 271, 0, + 0, 525, 526, 204, 9, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 412, 399, 0, 401, 402, 403, + 404, 405, 522, 406, 407, 408, 0, 0, 0, 514, + 513, 512, 0, 0, 0, 519, 0, 458, 0, 0, + 0, 460, 0, 128, 441, 499, 498, 197, 0, 0, + 427, 521, 432, 0, 438, 0, 0, 0, 0, 489, + 0, 0, 439, 0, 501, 0, 0, 0, 0, 431, + 430, 453, 70, 71, 0, 0, 0, 0, 0, 0, + 367, 325, 330, 328, 0, 338, 0, 148, 149, 197, + 367, 0, 0, 0, 0, 234, 0, 248, 250, 0, + 0, 0, 205, 207, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 299, 0, 284, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 332, + 341, 0, 0, 0, 0, 0, 0, 0, 200, 0, + 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, + 0, 0, 564, 0, 571, 560, 561, 562, 0, 576, + 575, 0, 0, 565, 566, 567, 573, 580, 579, 0, + 139, 0, 554, 0, 556, 0, 0, 0, 549, 0, + 242, 0, 0, 0, 0, 0, 0, 0, 318, 0, + 0, 0, 363, 0, 594, 0, 0, 0, 0, 101, + 63, 0, 0, 0, 0, 0, 0, 0, 95, 0, + 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, + 0, 61, 0, 39, 40, 41, 42, 43, 0, 431, + 430, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 538, 537, 0, 0, 0, 0, 0, 0, + 0, 135, 0, 131, 132, 0, 0, 0, 153, 153, + 0, 0, 0, 0, 0, 151, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 335, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 505, + 0, 0, 0, 0, 0, 461, 462, 0, 434, 0, + 0, 0, 497, 389, 490, 447, 445, 0, 444, 0, + 0, 510, 0, 0, 0, 0, 0, 0, 0, 0, + 337, 0, 0, 0, 0, 0, 0, 0, 241, 0, + 0, 0, 0, 0, 0, 0, 304, 0, 0, 303, + 0, 306, 0, 308, 0, 294, 300, 0, 0, 0, + 232, 0, 0, 0, 0, 0, 0, 0, 0, 343, + 0, 236, 235, 358, 0, 0, 35, 36, 0, 0, + 0, 0, 530, 0, 0, 0, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 464, 465, 559, 0, 448, 0, 0, 215, - 320, 0, 321, 215, 0, 0, 545, 546, 547, 548, - 0, 86, 0, 0, 0, 0, 84, 91, 93, 0, - 534, 0, 99, 0, 0, 0, 0, 81, 0, 0, - 0, 0, 0, 34, 448, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 30, 31, 0, 541, - 0, 0, 32, 0, 541, 592, 0, 115, 120, 0, - 0, 0, 134, 137, 138, 467, 0, 77, 78, 155, - 0, 0, 0, 0, 156, 171, 172, 0, 0, 0, - 157, 182, 173, 177, 178, 174, 175, 176, 163, 0, - 0, 401, 410, 411, 412, 516, 0, 0, 0, 457, - 458, 460, 129, 426, 456, 429, 434, 0, 0, 462, - 183, 441, 0, 70, 71, 0, 453, 449, 451, 517, - 179, 0, 0, 151, 0, 0, 337, 0, 150, 0, - 0, 0, 0, 256, 0, 0, 0, 0, 215, 215, - 0, 0, 306, 486, 0, 0, 308, 310, 0, 0, - 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 180, 0, 0, 0, 0, 160, 161, 0, 0, - 0, 0, 102, 103, 104, 108, 0, 573, 0, 0, - 571, 0, 582, 0, 0, 140, 141, 579, 556, 558, - 0, 0, 0, 0, 0, 0, 318, 322, 318, 0, - 365, 85, 63, 0, 0, 0, 0, 83, 0, 532, - 0, 0, 0, 0, 0, 0, 585, 584, 0, 0, - 0, 0, 0, 484, 0, 0, 453, 253, 449, 254, - 0, 0, 0, 0, 219, 217, 0, 0, 544, 542, - 0, 0, 116, 121, 0, 0, 0, 524, 525, 133, - 154, 158, 159, 164, 181, 0, 166, 0, 0, 0, - 0, 0, 0, 436, 0, 0, 0, 0, 512, 455, - 0, 165, 0, 184, 327, 0, 0, 185, 0, 0, - 0, 0, 0, 0, 483, 482, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 231, 230, 0, 0, - 0, 0, 0, 0, 0, 0, 221, 0, 0, 341, - 37, 0, 529, 0, 0, 273, 272, 0, 0, 0, - 0, 0, 0, 143, 144, 147, 146, 145, 0, 560, - 0, 596, 0, 0, 0, 0, 0, 0, 96, 0, - 0, 97, 535, 0, 0, 0, 88, 0, 0, 0, - 44, 0, 0, 0, 0, 0, 46, 0, 220, 218, - 33, 0, 0, 593, 128, 139, 0, 0, 136, 0, - 0, 0, 0, 0, 0, 518, 519, 0, 462, 437, - 0, 450, 452, 0, 167, 188, 0, 334, 334, 0, - 109, 110, 215, 0, 208, 209, 296, 0, 302, 0, - 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, - 212, 211, 0, 0, 0, 0, 105, 106, 564, 570, - 569, 142, 0, 0, 0, 323, 0, 92, 94, 0, - 100, 0, 82, 586, 89, 90, 49, 0, 0, 0, - 0, 485, 0, 0, 450, 543, 0, 0, 0, 118, - 583, 0, 125, 0, 0, 170, 0, 0, 0, 0, - 299, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 481, 0, 312, 0, 0, 290, 0, 222, 0, - 0, 0, 0, 0, 0, 0, 528, 274, 0, 0, - 352, 215, 366, 0, 533, 0, 45, 0, 0, 0, - 62, 47, 0, 117, 122, 128, 0, 0, 152, 0, - 0, 438, 0, 0, 0, 0, 335, 345, 0, 0, - 346, 0, 206, 0, 303, 0, 286, 0, 215, 0, - 0, 0, 0, 0, 0, 162, 107, 270, 318, 98, - 0, 0, 0, 0, 0, 0, 126, 127, 0, 0, - 0, 186, 0, 349, 0, 350, 351, 480, 0, 0, - 292, 225, 0, 0, 0, 0, 0, 0, 0, 0, - 53, 0, 59, 0, 0, 119, 0, 0, 0, 0, - 0, 311, 291, 287, 0, 0, 0, 0, 0, 0, + 463, 464, 558, 0, 447, 0, 0, 215, 319, 0, + 320, 215, 0, 0, 544, 545, 546, 547, 0, 86, + 0, 0, 0, 0, 84, 91, 93, 0, 533, 0, + 99, 0, 0, 0, 0, 81, 0, 0, 0, 0, + 0, 34, 447, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 30, 31, 0, 540, 0, 0, + 32, 0, 540, 591, 0, 115, 120, 0, 0, 0, + 134, 137, 138, 466, 0, 77, 78, 155, 0, 0, + 0, 0, 156, 171, 172, 0, 0, 0, 157, 182, + 173, 177, 178, 174, 175, 176, 163, 0, 0, 400, + 409, 410, 411, 515, 0, 0, 0, 456, 457, 459, + 129, 425, 455, 428, 433, 0, 0, 461, 183, 440, + 0, 70, 71, 0, 452, 448, 450, 516, 179, 0, + 0, 151, 0, 0, 336, 0, 150, 0, 0, 0, + 0, 256, 0, 0, 0, 0, 215, 215, 0, 0, + 305, 485, 0, 0, 307, 309, 0, 0, 288, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, + 0, 0, 0, 0, 160, 161, 0, 0, 0, 0, + 102, 103, 104, 108, 0, 572, 0, 0, 570, 0, + 581, 0, 0, 140, 141, 578, 555, 557, 0, 0, + 0, 0, 0, 0, 317, 321, 317, 0, 364, 85, + 63, 0, 0, 0, 0, 83, 0, 531, 0, 0, + 0, 0, 0, 0, 584, 583, 0, 0, 0, 0, + 0, 483, 0, 0, 452, 253, 448, 254, 0, 0, + 0, 0, 219, 217, 0, 0, 543, 541, 0, 0, + 116, 121, 0, 0, 0, 523, 524, 133, 154, 158, + 159, 164, 181, 0, 166, 0, 0, 0, 0, 0, + 0, 435, 0, 0, 0, 0, 511, 454, 0, 165, + 0, 184, 326, 0, 0, 185, 0, 0, 0, 0, + 0, 0, 482, 481, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 231, 230, 0, 0, 0, 0, + 0, 0, 0, 0, 221, 0, 0, 340, 37, 0, + 528, 0, 0, 272, 271, 0, 0, 0, 0, 0, + 0, 143, 144, 147, 146, 145, 0, 559, 0, 595, + 0, 0, 0, 0, 0, 0, 96, 0, 0, 97, + 534, 0, 0, 0, 88, 0, 0, 0, 44, 0, + 0, 0, 0, 0, 46, 0, 220, 218, 33, 0, + 0, 592, 128, 139, 0, 0, 136, 0, 0, 0, + 0, 0, 0, 517, 518, 0, 461, 436, 0, 449, + 451, 0, 167, 188, 0, 333, 333, 0, 109, 110, + 215, 0, 208, 209, 295, 0, 301, 0, 0, 215, + 0, 0, 0, 0, 0, 0, 0, 0, 212, 211, + 0, 0, 0, 0, 105, 106, 563, 569, 568, 142, + 0, 0, 0, 322, 0, 92, 94, 0, 100, 0, + 82, 585, 89, 90, 49, 0, 0, 0, 0, 484, + 0, 0, 449, 542, 0, 0, 0, 118, 582, 0, + 125, 0, 0, 170, 0, 0, 0, 0, 298, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 480, + 0, 311, 0, 0, 289, 0, 222, 0, 0, 0, + 0, 0, 0, 0, 527, 273, 0, 0, 351, 215, + 365, 0, 532, 0, 45, 0, 0, 0, 62, 47, + 0, 117, 122, 128, 0, 0, 152, 0, 0, 437, + 0, 0, 0, 0, 334, 344, 0, 0, 345, 0, + 206, 0, 302, 0, 285, 0, 215, 0, 0, 0, + 0, 0, 0, 162, 107, 269, 317, 98, 0, 0, + 0, 0, 0, 0, 126, 127, 0, 0, 0, 186, + 0, 348, 0, 349, 350, 479, 0, 0, 291, 225, + 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, + 59, 0, 0, 119, 0, 0, 0, 0, 0, 310, + 290, 286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 226, 227, 228, 229, 0, 223, 325, - 50, 0, 57, 0, 263, 0, 521, 0, 0, 0, - 293, 0, 0, 51, 0, 0, 269, 0, 0, 0, - 224, 0, 0, 0, 0, 505, 0, 0, 54, 52, - 0, 55, 0, 347, 348, 0, 0, 60, 58, 56 + 0, 226, 227, 228, 229, 0, 223, 324, 50, 0, + 57, 0, 263, 0, 520, 0, 0, 0, 292, 0, + 0, 51, 0, 0, 268, 0, 0, 0, 224, 0, + 0, 0, 0, 504, 0, 0, 54, 52, 0, 55, + 0, 346, 347, 0, 0, 60, 58, 56 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 2, 3, 109, 1017, 110, 111, 1002, 1809, 1815, - 1285, 1488, 1955, 2082, 1286, 2053, 2100, 1287, 2084, 1288, - 1289, 1492, 417, 562, 563, 1083, 112, 741, 440, 1824, - 1965, 1825, 441, 1706, 1353, 1314, 1315, 1316, 1449, 1645, - 1646, 1148, 1539, 1531, 721, 573, 256, 257, 332, 187, - 258, 426, 427, 116, 117, 118, 119, 120, 121, 122, - 123, 259, 1180, 1987, 2044, 898, 1176, 1177, 260, 979, - 261, 127, 1381, 1146, 873, 912, 1925, 128, 129, 130, - 131, 262, 263, 1105, 1120, 1239, 264, 746, 265, 863, - 745, 443, 588, 301, 1682, 339, 340, 267, 532, 347, - 1273, 1481, 436, 432, 1232, 956, 1524, 1675, 1676, 941, - 438, 133, 395 + -1, 2, 3, 108, 1015, 109, 110, 1000, 1807, 1813, + 1283, 1486, 1953, 2080, 1284, 2051, 2098, 1285, 2082, 1286, + 1287, 1490, 415, 560, 561, 1081, 111, 739, 438, 1822, + 1963, 1823, 439, 1704, 1351, 1312, 1313, 1314, 1447, 1643, + 1644, 1146, 1537, 1529, 719, 571, 254, 255, 330, 185, + 256, 424, 425, 115, 116, 117, 118, 119, 120, 121, + 122, 257, 1178, 1985, 2042, 896, 1174, 1175, 258, 977, + 259, 126, 1379, 1144, 871, 910, 1923, 127, 128, 129, + 130, 260, 261, 1103, 1118, 1237, 262, 744, 263, 861, + 743, 441, 586, 299, 1680, 337, 338, 265, 530, 345, + 1271, 1479, 434, 430, 1230, 954, 1522, 1673, 1674, 939, + 436, 132, 393 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -1792 +#define YYPACT_NINF -1769 static const yytype_int16 yypact[] = { - 10854, 62, 54, 11005, -1792, -1792, -74, 61, 41, -82, - -52, 20, 95, 202, 241, 252, -9, 271, 284, 64, - 97, 25, -26, -26, 112, 118, 143, 36, 167, 176, - 46, 195, 218, 230, 236, 255, 260, 270, 321, 334, - 344, 100, 368, 512, 361, 349, 388, 378, 6202, 393, - 398, 561, -55, 102, 371, 311, 81, 443, 624, -2, - 485, 320, 320, 496, 437, 44, -1792, -1792, -1792, -1792, - -1792, 492, 350, 649, 658, 18, 77, 665, 667, 542, - 768, 789, 828, 5254, 839, 618, 627, 657, 23, 65, - -1792, 685, 693, -1792, -1792, 883, 898, 708, -1792, 11203, - 733, 11233, 31, 33, -1792, -1792, -1792, 10683, 732, -1792, - -1792, -1792, -1792, -1792, 746, -1792, -1792, -1792, -1792, -1792, - -1792, -1792, -1792, -1792, -1792, 83, -1792, -1792, -1792, -1792, - 55, -1792, 988, 763, 4060, 58, 775, 1005, 10683, 11173, - 11173, -1792, 10683, -1792, -1792, -1792, -1792, 11173, -1792, -1792, - -1792, -1792, 790, 800, 1037, -1792, -1792, 11263, 25, 10683, - 10683, 10683, 821, 10683, 10683, 10683, 826, 10683, 10683, 10683, - 10683, 10683, 10683, 10683, 11173, 10683, 10683, 10683, 10683, 5254, - 827, -1792, 8799, -1792, -1792, -1792, 824, 5254, 11173, -1792, - -1792, -1792, -1792, -1792, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, -26, -26, -26, - -26, -26, -26, -26, -26, -26, -26, 281, -26, -26, - -26, -26, -26, 829, -26, -26, 831, 371, -1792, -1792, - -1792, -26, -26, 38, 894, 895, 896, 832, 6439, 955, - 371, 837, -26, -26, 838, 840, 841, -1792, -1792, -1792, - 10683, 6676, 10683, 10683, 6913, 25, 901, 48, -1792, -1792, - 842, -1792, 2905, -1792, -1792, -1792, -1792, -1792, 70, 10683, - 8799, 844, 845, 7150, 5254, 5254, 5254, -1792, -1792, -1792, - -1792, -1792, -1792, -1792, -1792, 843, 7387, 846, 4299, 1077, - 6439, 847, 23, 849, 850, 320, 320, 320, 10683, 10683, - -4, -1792, 224, 320, 4387, 549, 217, 848, 855, 856, - 857, 861, 862, 863, 10683, 5254, 5254, 5254, 864, 21, - 1082, 865, -1792, 1098, 1099, -1792, 866, 867, 868, -1792, - -1792, 869, 5254, 872, 873, 874, -1792, 10683, 5491, -1792, - 1102, 1110, 10683, 10683, 10683, 280, 10683, 875, -1792, 940, - 10683, 10683, 10683, -1792, -1792, 10683, -1792, -26, -26, -26, - 881, 884, 885, -26, -26, -26, -26, -26, -26, -26, - -1792, -26, -1792, -1792, -1792, -26, -26, 886, 887, -26, - 889, -1792, 888, 1116, 1124, 890, -1792, -1792, 1125, 1129, - 1126, 1130, -26, 10683, 13435, 82, 11173, 8799, 10683, -1792, - -1792, 6439, 6439, -1792, 915, 11263, 536, 1132, -1792, -1792, - -1792, -1792, -1792, -1792, 10683, 10683, 30, 6439, 1154, 567, - 1687, 919, 1157, 43, 922, -1792, 924, 11451, 10683, -1792, - 1746, -189, -1792, 113, -175, 10330, -1792, -143, -1792, 121, - -119, -115, 1079, -1792, 25, 921, 928, 13951, 13976, 14001, - 10683, 14026, 14051, 14076, 10683, 14101, 14126, 14151, 14176, 14201, - 14226, 14251, 927, 14276, 14301, 14326, 5023, 1163, 10683, 8799, - 3423, -1792, 239, 10683, 1165, 932, 10683, 10683, 10683, 10683, - 10683, 10683, 10683, 10683, 10683, 10683, 10683, 10683, 10683, 10683, - 10683, 10683, 8799, 10683, 10683, 10683, 10683, 10683, 10683, 8799, - 8799, 934, 10683, 10683, 11173, 10683, 11173, 6439, 11173, 11173, - 11173, 935, 10683, 53, -1792, 9672, 10683, 6439, 5254, 11173, - 11173, 8799, 25, 11263, 25, 941, 8799, 941, -1792, 941, - 14351, -1792, 247, 936, 89, 1118, -1792, 1172, 10683, 10683, - 10683, 10683, 10683, 10683, 10683, 10683, 10683, 10683, 10683, 10683, - 10683, 10683, 7624, 10683, 10683, 10683, 10683, 10683, 25, 10683, - 10683, 1179, -1792, 625, 14376, 351, 10683, 10683, 10683, -1792, - 1177, 1178, 1178, 947, 10683, 10683, 1182, 8799, 8799, 13463, - 949, 1185, -1792, 950, -1792, -1792, -138, -1792, -1792, 10555, - 11381, 320, 320, 58, 58, -124, 4387, 4387, 10683, 5321, - -62, -1792, 10683, 10683, 10683, 10683, 10683, 10683, 10683, 10683, - 10683, 14401, 1187, 1186, 1188, 10683, 1190, 10683, -1792, 10683, - 5558, -1792, -1792, 8799, 8799, 8799, 10683, 1191, 10683, 10683, - 10683, 14426, 954, -1792, -1792, 14451, 14476, 14501, 1025, 11414, - -1792, 957, 7797, 14526, 14551, 13546, 11173, 11173, 11173, 11173, - 11173, 11173, 11173, 11173, 11173, 10683, 11173, 11173, 11173, 11173, - 10, 11263, 11173, 11173, 11173, 25, 25, -1792, -1792, 8799, - -1792, 960, 5795, -1792, 963, 6032, 10683, 941, 10683, -1792, - 25, 10683, 10683, 1179, 966, 359, 14576, 11386, 969, 381, - 10683, 1204, 970, 971, 973, 975, 10683, 14601, 13573, 352, - 974, 1213, 1219, -1792, -1792, -1792, 8799, 163, -1792, -1792, - -1792, 25, 10683, 10683, 1179, 985, -1792, 989, -48, 371, - 311, -1792, 984, 12536, -1792, 94, 8799, 25, 10683, 10683, - 1225, 1227, 8799, 10683, 1228, 11173, 25, 9749, 1225, 1230, - -1792, 25, 1231, 11173, 10683, 991, 997, -1792, 10683, 11263, - 1232, 1233, 1234, 14626, 1235, 1236, 1237, 14651, 1238, 1239, - 1241, 1244, 1245, 1247, 1248, -1792, 1249, 1250, 1251, -1792, - 10683, 14676, 8799, 1016, 8799, 12565, -1792, 1255, 13519, 13519, - 13519, 13519, 13519, 13519, 13519, 13519, 13519, 13519, 13519, 11447, - 13519, 13519, 13519, 13519, 736, 428, 13519, 13519, 13519, 11480, - 11513, 11546, 3423, 1022, 1021, 103, 8799, 11579, 11612, 428, - 11645, 428, 1017, 1018, 1019, -122, 10683, 15476, -1792, 428, - 1020, 12594, 12623, -1792, 1023, -156, 428, -129, 1028, 168, - 431, 1263, -1792, 1225, 428, 1029, 1030, 8029, 8735, 923, - 688, 1075, 1075, 644, 644, 644, 644, 644, 644, 566, - 566, 8799, 179, -1792, 179, 179, 941, 941, 941, 1031, - 14701, 13600, -149, 463, 8799, -1792, 1266, 1032, 14726, 14751, - 14776, 10683, 6439, 1273, 1272, 9440, 12652, 14801, -1792, 446, - 497, 8799, 1034, -1792, 6269, -1792, 6506, 6743, 320, 10683, - 10683, -1792, -1792, 1036, 1039, 4387, 10012, 1152, 71, 320, - 6980, 14826, 12681, 14851, 14876, 14901, 14926, 14951, 14976, 15001, - 1277, 10683, 1279, -1792, 10683, 15026, -1792, 13627, 13654, -1792, - 564, 590, 596, 12710, -1792, 13681, 13708, 11678, -1792, -1792, - 1280, 1283, 1285, 1041, 10683, 7217, 10683, 10683, -1792, -1792, - 8, -20, 337, -20, 1053, 1069, 1063, 428, 428, 1064, - 11711, 428, 428, 428, 428, 10683, 428, 1305, -1792, 1067, - 1076, 356, 263, 1078, 601, -1792, -1792, -1792, -1792, 13519, - 179, 7454, 1072, 647, 1071, 1144, 1315, 1176, 9981, 1083, - 1086, 1320, 6439, 12739, -1792, 10683, 10683, 10683, 10683, 1925, - 483, 88, 11263, 10683, 1325, 1328, 26, -1792, 602, 1287, - 1288, 6439, 16, 1090, 15051, 13735, 399, 10683, 10683, 1097, - 1100, 1101, 7861, -1792, -1792, -1792, -1792, 11173, -108, 1096, - 15076, 13762, -1792, 1105, -1792, -50, 11744, -1792, -1792, -1792, - 1106, -1792, 1113, -1792, 69, -1792, -1792, 15476, -1792, 1341, - 13519, 428, 320, 6439, 6439, 1346, 6439, 6439, 6439, 1348, - 6439, 6439, 6439, 6439, 6439, 6439, 6439, 6439, 6439, 6439, - 2077, 1349, 8799, 3423, -1792, -1792, -1792, -1792, -1792, -1792, - -1792, -1792, -1792, -1792, -1792, -1792, -1792, -1792, 10683, -1792, - -1792, -1792, -1792, -1792, -1792, -1792, -1792, -1792, 10683, 10683, - 10683, -1792, -1792, -1792, 607, 10683, 10683, -1792, 10683, -1792, - 6439, 11173, 11173, -1792, 12768, 1109, -1792, -1792, -1792, 1181, - 10683, 10683, -1792, -1792, -1792, 1225, -1792, 1225, 10683, 10683, - 1119, -1792, 6439, -26, -1792, 10683, -1792, 10683, 10683, 608, - 1225, -149, 4, -1792, 10683, 10683, 428, 614, 6439, 8799, - 1353, 1354, 1355, 9389, -1792, -1792, 1357, -1792, 1127, 15476, - 1117, -1792, 1359, 1361, 1363, 616, 1360, -1792, 7691, -1792, - -1792, 137, 11777, 11810, -1792, -1792, 12797, -150, 1262, 1368, - 10065, 1134, 1367, 1139, 40, 52, -47, -1792, 141, -1792, - 71, 1372, 1377, 1380, 1382, 1383, 1385, 1386, 1387, 1388, - 6439, 15476, -1792, 2678, 1141, 1392, 1393, 1394, 1304, 1395, - -1792, 1397, 1399, 10683, 6439, 6439, 6439, 1402, 11843, -1792, - 9062, 1322, 63, 1403, -1792, 8799, -1792, -1792, -1792, -1792, - 11173, -1792, -1792, 10683, 11173, -1792, -1792, -1792, -1792, 15476, - -1792, 1164, 1161, 11173, -1792, 11173, -1792, 1225, 11173, 1171, - -1792, 1166, -1792, 1225, 10683, 10683, 1169, 371, 1170, 10297, - -1792, 2754, 1174, 6439, -1792, 1180, -1792, 12826, 12855, 12884, - 12913, -1792, -1792, 10683, 1412, 37, 10683, 1414, 1415, 3179, - -1792, 1416, 23, 1419, 1195, 428, -26, -26, 1420, -1792, - 1183, 1198, 1196, -1792, 1432, -1792, -1792, -1792, -1792, -1792, - 1225, 136, 2522, 10683, 13789, 15101, 10683, 8093, 10683, 1200, - 635, 1439, 109, 1225, -1792, 1201, 10683, 1441, 10683, 1225, - 10374, 9031, 428, 4706, 1209, 1206, -1792, 1450, 1451, 119, - 1335, 1335, 6439, 1453, 1455, 1456, 6439, 1286, 1458, 1459, - 1461, 1462, 1464, 1465, 1466, 1467, 1468, -1792, 1470, 636, - 13519, 13519, 13519, 13519, 428, 11876, 11909, 11942, 1240, 428, - 428, -1792, 1341, 428, 15126, 13519, 1246, -89, 15476, 13519, - -1792, 1471, 428, 11975, 15476, 15476, -1792, 656, -1792, 1474, - -1792, 15151, 13816, -1792, 428, 1473, 637, 6439, 6439, 6439, - 1477, 1478, -1792, 188, 10683, 6439, 1252, 1253, 1480, 547, - -1792, 10683, 10683, 10683, 1254, 1256, 1257, 1261, -1792, 3248, - 6439, -1792, 10683, -1792, 1483, -1792, 1484, -1792, -1792, 4387, - 317, 5728, -1792, 1260, 1267, 1268, 1269, 1271, 1274, 8325, - 1486, -1792, 8799, -1792, -1792, -1792, 1276, 10683, -1792, -1792, - 13843, 1487, 1488, 1331, -1792, 10683, 10683, 10683, -1792, 1492, - 1500, 1503, 781, 495, 1275, 9621, 1278, 10683, 27, 428, - 1281, 428, 1284, -1792, -1792, 11263, 664, 10683, 1282, -1792, - -1792, 3595, -1792, -1792, 1309, 1509, -1792, -1792, -1792, -1792, - 3629, -1792, 569, 1289, 1513, 3654, -1792, -1792, -1792, 23, - -1792, 643, -1792, 10683, 188, 376, 1381, -1792, 1290, 10683, - 10683, 6439, 1292, -1792, 594, 1512, 1516, 15176, 1518, 1263, - 15201, 1314, 650, 15226, 1521, 1522, -1792, -1792, 11173, 1294, - 1527, 15251, -1792, 12008, 1297, -1792, 4992, 15476, -1792, 1552, - -26, 6913, -1792, -1792, -1792, -1792, 1341, -1792, -1792, -1792, - 320, 1555, 1557, 1558, -1792, -1792, -1792, 1559, 1472, 1560, - -1792, -1792, -1792, -1792, -1792, -1792, -1792, -1792, -1792, 1563, - 1326, -1792, -1792, -1792, -1792, -1792, 10683, 10683, 10683, -1792, - -1792, -1792, 1206, -1792, -1792, -1792, -1792, 10683, 1330, 1323, - -1792, -1792, 10683, 10683, 10683, 428, -149, -1792, -1792, -1792, - -1792, 1334, 1572, 1286, 1575, 10683, -1792, 6439, 15476, 999, - 8799, 8799, 10683, -1792, 9440, 12942, 15276, 9705, 58, 58, - 10683, 10683, -1792, 312, 1338, 15301, -1792, -1792, 12971, 156, - -1792, 1577, 1584, 6439, 320, 320, 320, 320, 320, 5965, - 1587, -1792, 681, 10683, 3727, 1588, -1792, -1792, 6439, 9937, - 598, 15326, -1792, -1792, -1792, -1792, 9117, -1792, 11173, 10683, - -1792, 11173, 15476, 9354, 11263, 1347, -1792, -1792, -1792, -1792, - 1356, 1351, 10683, 10683, 13000, 10683, 11386, -1792, 11386, 6439, - -1792, -1792, 11263, 10683, 1595, 1598, 26, -1792, 1597, -1792, - 23, 13870, 6439, 11173, 1601, 428, -1792, 1366, 428, 10683, - 12041, 12074, 683, -1792, 10683, 10683, 154, -1792, 1365, -1792, - 1355, 1603, 1605, 1359, -1792, -1792, 1609, 10683, -1792, -1792, - 10683, 10606, -1792, -1792, 1374, 1381, 686, 2152, 1612, -1792, - 573, -1792, -1792, -1792, -1792, 1378, -1792, 1599, 6439, 13519, - 13519, 12107, 13519, -1792, 1389, 12140, 15351, 13897, -1792, -1792, - 10683, -1792, 1614, -1792, 15476, 1617, 1384, -1792, 689, 691, - 13491, 4005, 1620, 1390, -1792, -1792, 10683, 1396, 1398, 13029, - 13924, 1624, 6439, 1625, 1391, 10683, -1792, -1792, 692, 191, - 226, 265, 324, 330, 8562, 354, -1792, 1630, 13058, -1792, - -1792, 1475, -1792, 10683, 10683, -1792, -1792, 8799, 4446, 1631, - 1404, 13519, 428, 15476, -1792, -1792, -1792, -1792, 27, -1792, - 11263, -1792, 13087, 1401, 1405, 1406, 1633, 4642, -1792, 1636, - 1640, -1792, -1792, 1407, 1642, 694, -1792, 1645, 1647, -30, - 15476, 10683, 10683, 1411, 6439, 699, 15476, 15376, -1792, -1792, - -1792, 15401, 12173, -1792, 1109, 1161, 6439, 428, -1792, 10683, - 11263, 25, 10683, 1649, 700, -1792, -1792, 10683, 1323, -1792, - 10683, -1792, -1792, 13116, -1792, -1792, 6439, 578, 652, 8799, - -1792, -1792, 58, 10246, -1792, -1792, -1792, 1651, -1792, 1417, - 6439, -1792, 13145, 1652, 8799, 320, 320, 320, 320, 320, - -1792, -1792, 10683, 13174, 13203, 702, -1792, -1792, -1792, -1792, - -1792, -1792, 1425, 1653, 1423, -1792, 1654, -1792, -1792, 23, - -1792, 1493, -1792, -1792, -1792, -1792, -1792, 10683, 12206, 12239, - 6439, -1792, 1665, 10683, 1429, -1792, 10683, 1430, 1431, -1792, - -1792, 2637, -1792, 1434, 13232, -1792, 1433, 12272, 1437, 12305, - -1792, 727, 1435, 320, 6439, 1673, 1438, 320, 1674, 737, - 1440, -1792, 10683, -1792, 1676, 1502, 8392, 1442, -1792, 740, - 363, 366, 444, 459, 482, 4744, -1792, -1792, 1677, 1680, - -1792, -1792, -1792, 1682, -1792, 1446, 15476, 10683, 10683, 742, - -1792, 15476, 12338, -1792, -1792, 1109, 11263, 1452, -1792, 10683, - 10683, -1792, 10683, 1684, 320, 122, -1792, -1792, 320, 128, - -1792, 1685, -1792, 13261, -1792, 10683, -1792, 71, -1792, 1688, - 8799, 8799, 8799, 8799, 8562, -1792, -1792, -1792, 11386, -1792, - 10683, 15426, 12371, 22, 10683, 1457, -1792, -1792, 12404, 12437, - 12470, -1792, 486, -1792, 488, -1792, -1792, -1792, 4929, 545, - 8629, -1792, 748, 751, 753, 756, 494, 785, 1460, 786, - -1792, 10683, -1792, 6439, 13290, -1792, 10683, 10683, 10683, 320, - 320, -1792, -1792, -1792, 71, 1689, 1690, 1691, 1693, 8799, - 1694, 1699, 1706, 1476, 15451, 787, 1707, 13319, 13519, 12503, - 499, 522, 619, -1792, -1792, -1792, -1792, 788, -1792, -1792, - -1792, 11173, -1792, 1479, -1792, 1708, -1792, 10683, 10683, 10683, - -1792, 1710, 794, -1792, 1481, 6439, -1792, 13348, 13377, 13406, - -1792, 1711, 11173, 11173, 813, -1792, 1712, 1714, -1792, -1792, - 814, -1792, 1717, -1792, -1792, 1719, 11173, -1792, -1792, -1792 + 10775, 39, 83, 10925, -1769, -1769, 74, 118, -40, -173, + -59, 22, 96, 178, 202, 232, 20, 286, 90, 113, + 46, -166, -166, 59, 127, 136, 45, 175, 218, 53, + 240, 245, 251, 292, 298, 303, 310, 332, 391, 399, + 224, 487, 554, 684, 438, 503, 460, 6147, 476, 484, + 623, -30, 639, 576, 7, 632, 516, 706, -75, 523, + 451, 451, 558, 470, 103, -1769, -1769, -1769, -1769, -1769, + 571, 411, 709, 722, 25, 58, 749, 752, 17, 858, + 859, 868, 5203, 889, 662, 663, 695, 31, 65, -1769, + 696, 702, -1769, -1769, 912, 935, 724, -1769, 11121, 733, + 11173, 9, 33, -1769, -1769, -1769, 10605, 732, -1769, -1769, + -1769, -1769, -1769, 731, -1769, -1769, -1769, -1769, -1769, -1769, + -1769, -1769, -1769, -1769, 1, -1769, -1769, -1769, -1769, 34, + -1769, 968, 730, 4010, 325, 736, 973, 10605, 11092, 11092, + -1769, 10605, -1769, -1769, -1769, -1769, 11092, -1769, -1769, -1769, + 734, 744, 974, -1769, -1769, 11286, 46, 10605, 10605, 10605, + 746, 10605, 10605, 10605, 747, 10605, 10605, 10605, 10605, 10605, + 10605, 10605, 11092, 10605, 10605, 10605, 10605, 5203, 748, -1769, + 8733, -1769, -1769, -1769, 745, 5203, 11092, -1769, -1769, -1769, + -1769, -1769, -166, -166, -166, -166, -166, -166, -166, -166, + -166, -166, -166, -166, -166, -166, -166, -166, -166, -166, + -166, -166, -166, -166, -166, 160, -166, -166, -166, -166, + -166, 750, -166, -166, 751, 576, -1769, -1769, -1769, -166, + -166, 47, 814, 816, 817, 753, 6383, 879, 576, 756, + -166, -166, 762, 764, 765, -1769, -1769, -1769, 10605, 6619, + 10605, 10605, 6855, 46, 828, 48, -1769, -1769, 763, -1769, + 4877, -1769, -1769, -1769, -1769, -1769, 142, 10605, 8733, 768, + 778, 7091, 5203, 5203, 5203, -1769, -1769, -1769, -1769, -1769, + -1769, -1769, -1769, 785, 7327, 786, 4248, 1025, 6383, 788, + 31, 789, 791, 451, 451, 451, 10605, 10605, 163, -1769, + 211, 451, 4337, 319, 329, 796, 797, 798, 799, 802, + 806, 818, 10605, 5203, 5203, 5203, 820, 14, 1049, 819, + -1769, 1054, 1055, -1769, 821, 822, 823, -1769, -1769, 824, + 5203, 831, 832, 833, -1769, 10605, 5439, -1769, 1056, 1069, + 10605, 10605, 10605, 274, 10605, 834, -1769, 902, 10605, 10605, + 10605, -1769, -1769, 10605, -1769, -166, -166, -166, 842, 843, + 844, -166, -166, -166, -166, -166, -166, -166, -1769, -166, + -1769, -1769, -1769, -166, -166, 846, 849, -166, 850, -1769, + 851, 1086, 1087, 852, -1769, -1769, 1092, 1091, 1094, 1093, + -166, 10605, 13325, 166, 11092, 8733, 10605, -1769, -1769, 6383, + 6383, -1769, 860, 11286, 540, 1096, -1769, -1769, -1769, -1769, + -1769, -1769, 10605, 10605, 56, 6383, 1098, 645, 360, 864, + 1102, 42, 867, -1769, 870, 11407, 10605, -1769, 1732, -92, + -1769, 88, -71, 10254, -1769, -45, -1769, 114, -95, 222, + 1024, -1769, 46, 869, 874, 13841, 13866, 13891, 10605, 13916, + 13941, 13966, 10605, 13991, 14016, 14041, 14066, 14091, 14116, 14141, + 875, 14166, 14191, 14216, 4973, 1108, 10605, 8733, 7735, -1769, + 198, 10605, 1116, 884, 10605, 10605, 10605, 10605, 10605, 10605, + 10605, 10605, 10605, 10605, 10605, 10605, 10605, 10605, 10605, 10605, + 8733, 10605, 10605, 10605, 10605, 10605, 10605, 8733, 8733, 882, + 10605, 10605, 11092, 10605, 11092, 6383, 11092, 11092, 11092, 883, + 10605, 78, -1769, 9601, 10605, 6383, 5203, 11092, 11092, 8733, + 46, 11286, 46, 890, 8733, 890, -1769, 890, 14241, -1769, + 392, 885, 69, 1064, -1769, 1123, 10605, 10605, 10605, 10605, + 10605, 10605, 10605, 10605, 10605, 10605, 10605, 10605, 10605, 10605, + 7563, 10605, 10605, 10605, 10605, 10605, 46, 10605, 10605, 1128, + -1769, 728, 14266, 420, 10605, 10605, 10605, -1769, 1129, 1130, + 1130, 897, 10605, 10605, 1132, 8733, 8733, 13353, 921, 1157, + -1769, 922, -1769, -1769, -146, -1769, -1769, 10476, 11046, 451, + 451, 325, 325, -141, 4337, 4337, 10605, 1370, -135, -1769, + 10605, 10605, 10605, 10605, 10605, 10605, 10605, 10605, 10605, 14291, + 1158, 1160, 1161, 10605, 1163, 10605, -1769, 10605, 5270, -1769, + -1769, 8733, 8733, 8733, 10605, 1164, 10605, 10605, 10605, 14316, + 931, -1769, -1769, 14341, 14366, 14391, 994, 11227, -1769, 933, + 7966, 14416, 14441, 13436, 11092, 11092, 11092, 11092, 11092, 11092, + 11092, 11092, 11092, 10605, 11092, 11092, 11092, 11092, 16, 11286, + 11092, 11092, 11092, 46, 46, -1769, -1769, 8733, -1769, 934, + 5506, -1769, 937, 5742, 10605, 890, 10605, -1769, 46, 10605, + 10605, 1128, 940, 456, 14466, 11293, 939, 462, 10605, 1170, + 947, 948, 949, 951, 10605, 14491, 13463, 208, 952, 1185, + 1188, -1769, -1769, -1769, 8733, 203, -1769, -1769, -1769, 46, + 10605, 10605, 1128, 955, -1769, 964, -28, 576, 7, -1769, + 961, 12426, -1769, 26, 8733, 46, 10605, 10605, 1200, 1199, + 8733, 10605, 1201, 11092, 46, 9677, 1200, 1202, -1769, 46, + 1203, 11092, 10605, 967, 971, -1769, 10605, 11286, 1205, 1206, + 1207, 14516, 1209, 1210, 1211, 14541, 1214, 1215, 1216, 1218, + 1220, 1222, 1224, -1769, 1225, 1227, 1228, -1769, 10605, 14566, + 8733, 995, 8733, 12455, -1769, 1230, 13409, 13409, 13409, 13409, + 13409, 13409, 13409, 13409, 13409, 13409, 13409, 11337, 13409, 13409, + 13409, 13409, 1505, 365, 13409, 13409, 13409, 11370, 11403, 11436, + 7735, 1000, 999, 135, 8733, 11469, 11502, 365, 11535, 365, + 996, 997, 998, 120, 10605, 15366, -1769, 365, 1003, 12484, + 12513, -1769, 1002, -49, 365, -80, 1008, 473, 550, 1234, + -1769, 1200, 365, 1010, 1007, 8433, 8669, 1341, 1786, 519, + 519, 531, 531, 531, 531, 531, 531, 379, 379, 8733, + -10, -1769, -10, -10, 890, 890, 890, 1009, 14591, 13490, + -19, 430, 8733, -1769, 1235, 1012, 14616, 14641, 14666, 10605, + 6383, 1251, 1250, 9370, 12542, 14691, -1769, 559, 564, 8733, + 1013, -1769, 5978, -1769, 6214, 6450, 451, 10605, 10605, -1769, + -1769, 1015, 1016, 4337, 9940, 1133, 528, 451, 6686, 14716, + 12571, 14741, 14766, 14791, 14816, 14841, 14866, 14891, 1253, 10605, + 1257, -1769, 10605, 14916, -1769, 13517, 13544, -1769, 567, 573, + 574, 12600, -1769, 13571, 13598, 11568, -1769, -1769, 1258, 1259, + 1261, 1020, 10605, 6922, 10605, 10605, -1769, -1769, 51, 116, + 445, 116, 1030, 1031, 1027, 365, 365, 1028, 11601, 365, + 365, 365, 365, 10605, 365, 1262, -1769, 1029, 1033, 463, + 547, 1036, 581, -1769, -1769, -1769, -1769, 13409, -10, 7158, + 1034, 515, 1035, 1103, 1275, 1135, 9908, 1041, 1043, 1280, + 6383, 12629, -1769, 10605, 10605, 10605, 10605, 1887, 212, 87, + 11286, 10605, 1284, 1287, 32, -1769, 582, 1248, 1249, 6383, + 23, 1052, 14941, 13625, 143, 10605, 10605, 1059, 1057, 1060, + 7799, -1769, -1769, -1769, -1769, 11092, 156, 1058, 14966, 13652, + -1769, 1062, -1769, 226, 11634, -1769, -1769, -1769, 1061, -1769, + 1063, -1769, 68, -1769, -1769, 15366, -1769, 1299, 13409, 365, + 451, 6383, 6383, 1297, 6383, 6383, 6383, 1300, 6383, 6383, + 6383, 6383, 6383, 6383, 6383, 6383, 6383, 6383, 2027, 1302, + 8733, 7735, -1769, -1769, -1769, -1769, -1769, -1769, -1769, -1769, + -1769, -1769, -1769, -1769, -1769, -1769, 10605, -1769, -1769, -1769, + -1769, -1769, -1769, -1769, -1769, -1769, 10605, 10605, 10605, -1769, + -1769, -1769, 583, 10605, 10605, -1769, 10605, -1769, 6383, 11092, + 11092, -1769, 12658, 1065, -1769, -1769, -1769, 1134, 10605, 10605, + -1769, -1769, -1769, 1200, -1769, 1200, 10605, 10605, 1067, -1769, + 6383, -166, -1769, 10605, -1769, 10605, 10605, 588, 1200, -19, + -94, -1769, 10605, 10605, 365, 589, 6383, 8733, 1304, 1306, + 1307, 9320, -1769, -1769, 1309, -1769, 1077, 15366, 1071, -1769, + 1312, 1313, 1315, 590, 1319, -1769, 7394, -1769, -1769, -109, + 11667, 11700, -1769, -1769, 12687, -150, 1241, 1320, 9991, 1084, + 1327, 1100, 24, 35, 326, -1769, -102, -1769, 528, 1336, + 1344, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 6383, 15366, + -1769, 2587, 1109, 1354, 1355, 1356, 1267, 1357, -1769, 1360, + 1363, 10605, 6383, 6383, 6383, 1366, 11733, -1769, 8995, 1707, + 57, 1367, -1769, 8733, -1769, -1769, -1769, -1769, 11092, -1769, + -1769, 10605, 11092, -1769, -1769, -1769, -1769, 15366, -1769, 1131, + 1138, 11092, -1769, 11092, -1769, 1200, 11092, 1136, -1769, 1140, + -1769, 1200, 10605, 10605, 1139, 576, 1146, 10222, -1769, 2704, + 1147, 6383, -1769, 1148, -1769, 12716, 12745, 12774, 12803, -1769, + -1769, 10605, 1371, 63, 10605, 1376, 1384, 2847, -1769, 1385, + 31, 1387, 1154, 365, -166, -166, 1390, -1769, 1159, 1162, + 1156, -1769, 1393, -1769, -1769, -1769, -1769, -1769, 1200, -70, + 876, 10605, 13679, 14991, 10605, 8030, 10605, 1165, 591, 1395, + 41, 1200, -1769, 1166, 10605, 1396, 10605, 1200, 10298, 8964, + 365, 4656, 1168, 1169, -1769, 1397, 1398, 98, 1283, 1283, + 6383, 1401, 1405, 1406, 6383, 1239, 1412, 1413, 1414, 1416, + 1417, 1418, 1419, 1420, 1421, -1769, 1423, 597, 13409, 13409, + 13409, 13409, 365, 11766, 11799, 11832, 1191, 365, 365, -1769, + 1299, 365, 15016, 13409, 1192, -151, 15366, 13409, -1769, 1426, + 365, 11865, 15366, 15366, -1769, 526, -1769, 1429, -1769, 15041, + 13706, -1769, 365, 1428, 598, 6383, 6383, 6383, 1431, 1430, + -1769, 221, 10605, 6383, 1195, 1196, 1432, 548, -1769, 10605, + 10605, 10605, 1198, 1204, 1208, 1212, -1769, 3130, 6383, -1769, + 10605, -1769, 1436, -1769, 1438, -1769, -1769, 4337, 378, 5675, + -1769, 1213, 1217, 1231, 1233, 1242, 1243, 8261, 1439, -1769, + 8733, -1769, -1769, -1769, 1245, 10605, -1769, -1769, 13733, 1441, + 1442, 1277, -1769, 10605, 10605, 10605, -1769, 1445, 1447, 1448, + 607, 477, 1244, 9548, 1247, 10605, 30, 365, 1260, 365, + 1254, -1769, -1769, 11286, 615, 10605, 1255, -1769, -1769, 3198, + -1769, -1769, 1263, 1450, -1769, -1769, -1769, -1769, 3374, -1769, + 216, 1246, 1491, 3544, -1769, -1769, -1769, 31, -1769, 600, + -1769, 10605, 221, 1630, 2476, -1769, 1219, 10605, 10605, 6383, + 1264, -1769, 169, 1496, 1498, 15066, 1499, 1234, 15091, 1265, + 613, 15116, 1503, 1506, -1769, -1769, 11092, 1279, 1511, 15141, + -1769, 11898, 1281, -1769, 4941, 15366, -1769, 1495, -166, 6855, + -1769, -1769, -1769, -1769, 1299, -1769, -1769, -1769, 451, 1512, + 1514, 1515, -1769, -1769, -1769, 1516, 1433, 1518, -1769, -1769, + -1769, -1769, -1769, -1769, -1769, -1769, -1769, 1520, 1286, -1769, + -1769, -1769, -1769, -1769, 10605, 10605, 10605, -1769, -1769, -1769, + 1169, -1769, -1769, -1769, -1769, 10605, 1290, 1285, -1769, -1769, + 10605, 10605, 10605, 365, -19, -1769, -1769, -1769, -1769, 1288, + 1525, 1239, 1527, 10605, -1769, 6383, 15366, 950, 8733, 8733, + 10605, -1769, 9370, 12832, 15166, 9633, 325, 325, 10605, 10605, + -1769, 119, 1289, 15191, -1769, -1769, 12861, -98, -1769, 1528, + 1531, 6383, 451, 451, 451, 451, 451, 5911, 1535, -1769, + 618, 10605, 3578, 1536, -1769, -1769, 6383, 9864, 555, 15216, + -1769, -1769, -1769, -1769, 9049, -1769, 11092, 10605, -1769, 11092, + 15366, 9285, 11286, 1296, -1769, -1769, -1769, -1769, 1305, 1298, + 10605, 10605, 12890, 10605, 11293, -1769, 11293, 6383, -1769, -1769, + 11286, 10605, 1540, 1522, 32, -1769, 1541, -1769, 31, 13760, + 6383, 11092, 1542, 365, -1769, 1303, 365, 10605, 11931, 11964, + 621, -1769, 10605, 10605, 323, -1769, 1310, -1769, 1307, 1545, + 1549, 1312, -1769, -1769, 1568, 10605, -1769, -1769, 10605, 10529, + -1769, -1769, 1334, 2476, 627, 4693, 1570, -1769, 507, -1769, + -1769, -1769, -1769, 1337, -1769, 1578, 6383, 13409, 13409, 11997, + 13409, -1769, 1345, 12030, 15241, 13787, -1769, -1769, 10605, -1769, + 1581, -1769, 15366, 1582, 1359, -1769, 628, 630, 13381, 3604, + 1583, 1361, -1769, -1769, 10605, 1353, 1362, 12919, 13814, 1584, + 6383, 1585, 1364, 10605, -1769, -1769, 635, -93, -87, -56, + -46, -27, 8497, -15, -1769, 1587, 12948, -1769, -1769, 1440, + -1769, 10605, 10605, -1769, -1769, 8733, 3677, 1588, 1358, 13409, + 365, 15366, -1769, -1769, -1769, -1769, 30, -1769, 11286, -1769, + 12977, 1369, 1372, 1373, 1596, 3955, -1769, 1597, 1601, -1769, + -1769, 1365, 1604, 636, -1769, 1611, 1612, 253, 15366, 10605, + 10605, 1377, 6383, 642, 15366, 15266, -1769, -1769, -1769, 15291, + 12063, -1769, 1065, 1138, 6383, 365, -1769, 10605, 11286, 46, + 10605, 1614, 649, -1769, -1769, 10605, 1285, -1769, 10605, -1769, + -1769, 13006, -1769, -1769, 6383, 562, 657, 8733, -1769, -1769, + 325, 10169, -1769, -1769, -1769, 1615, -1769, 1379, 6383, -1769, + 13035, 1618, 8733, 451, 451, 451, 451, 451, -1769, -1769, + 10605, 13064, 13093, 651, -1769, -1769, -1769, -1769, -1769, -1769, + 1386, 1621, 1388, -1769, 1622, -1769, -1769, 31, -1769, 1455, + -1769, -1769, -1769, -1769, -1769, 10605, 12096, 12129, 6383, -1769, + 1625, 10605, 1399, -1769, 10605, 1389, 1394, -1769, -1769, 924, + -1769, 1400, 13122, -1769, 1402, 12162, 1403, 12195, -1769, 656, + 1404, 451, 6383, 1637, 1407, 451, 1639, 659, 1408, -1769, + 10605, -1769, 1641, 1463, 7630, 1410, -1769, 664, -13, 223, + 235, 241, 250, 4396, -1769, -1769, 1644, 1647, -1769, -1769, + -1769, 1649, -1769, 1415, 15366, 10605, 10605, 665, -1769, 15366, + 12228, -1769, -1769, 1065, 11286, 1424, -1769, 10605, 10605, -1769, + 10605, 1650, 451, 161, -1769, -1769, 451, 167, -1769, 1652, + -1769, 13151, -1769, 10605, -1769, 528, -1769, 1653, 8733, 8733, + 8733, 8733, 8497, -1769, -1769, -1769, 11293, -1769, 10605, 15316, + 12261, 37, 10605, 1427, -1769, -1769, 12294, 12327, 12360, -1769, + 264, -1769, 302, -1769, -1769, -1769, 4592, 397, 8328, -1769, + 666, 667, 672, 673, 313, 674, 1443, 699, -1769, 10605, + -1769, 6383, 13180, -1769, 10605, 10605, 10605, 451, 451, -1769, + -1769, -1769, 528, 1658, 1660, 1663, 1666, 8733, 1667, 1668, + 1669, 1446, 15341, 704, 1681, 13209, 13409, 12393, 317, 375, + 472, -1769, -1769, -1769, -1769, 710, -1769, -1769, -1769, 11092, + -1769, 1451, -1769, 1688, -1769, 10605, 10605, 10605, -1769, 1690, + 712, -1769, 1459, 6383, -1769, 13238, 13267, 13296, -1769, 1699, + 11092, 11092, 718, -1769, 1700, 1701, -1769, -1769, 719, -1769, + 1703, -1769, -1769, 1704, 11092, -1769, -1769, -1769 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -1792, -1792, -1792, -1792, 425, -1792, -1792, -1792, -1792, -272, - -1792, -1792, -1792, -1792, -1792, -1792, -1792, -1792, -1792, -1792, - -1792, -1792, -694, -68, 3071, 3210, -1792, 1291, -1792, -1792, - -1792, -1792, -1792, -1792, -1791, -1792, 377, 204, -94, -1792, - -54, -1792, 150, 414, 1733, -1792, 6, -51, -1792, -1792, - 7, -592, -248, -1792, -1792, -1792, -1792, -1792, -1792, -1792, - -1792, 1734, -1792, -1792, -1792, -1792, -1174, -1160, 1735, -1637, - 1736, -1792, -1792, -1792, 1175, -1792, -107, -1792, -1792, -1792, - -1792, 1937, -1792, -1792, -1350, 291, 1741, -1792, 2, -675, - -1792, -1792, 92, -1792, -1601, -31, -155, 2443, 276, -289, - 80, -1792, 104, -64, -1792, -1792, 105, 264, -1599, -136, - 1024, -1792, -3 + -1769, -1769, -1769, -1769, 412, -1769, -1769, -1769, -1769, -287, + -1769, -1769, -1769, -1769, -1769, -1769, -1769, -1769, -1769, -1769, + -1769, -1769, -674, -131, 3022, 3161, -1769, 1301, -1769, -1769, + -1769, -1769, -1769, -1769, -1768, -1769, 366, 194, -84, -1769, + -41, -1769, 168, 422, 1745, -1769, 6, -47, -1769, -1769, + 3, -588, -278, -1769, -1769, -1769, -1769, -1769, -1769, -1769, + -1769, 1747, -1769, -1769, -1769, -1769, -1173, -1163, 1748, -1635, + 1749, -1769, -1769, -1769, 1183, -1769, -90, -1769, -1769, -1769, + -1769, 1888, -1769, -1769, -1343, 304, 1754, -1769, 2, -673, + -1769, -1769, 233, -1769, -1585, -31, -152, 2394, 228, -289, + 94, -1769, 680, -85, -1769, -1769, 121, 276, -1604, -136, + 1032, -1769, -3 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -545 +#define YYTABLE_NINF -544 static const yytype_int16 yytable[] = { - 134, 893, 894, 583, 286, 993, 1410, 1568, 973, 114, - 115, 437, 1758, 1001, 152, 1212, 1408, 266, 154, 1793, - 1279, 1794, 319, 153, 467, 616, 141, 345, 2032, 152, - 152, 1643, 474, 1907, 699, 383, 388, 387, 390, 1006, - 162, 1472, 272, 514, 1786, 268, 1403, 152, 306, 272, - 166, 725, 711, 536, 5, 1023, 599, 152, 1405, 726, - 281, 400, 424, 1032, 273, 731, 418, 1439, 4, 349, - 422, 1009, 323, 732, 620, 137, 1311, 591, 592, 558, - 268, 324, 1169, 325, 704, 348, 705, 412, 413, 591, - 592, 680, 1111, 445, 1395, 1262, 384, 734, 444, 1170, - 1014, 143, 320, 591, 592, 735, 1827, 1171, 1172, 1173, - 888, 1114, 558, 1174, 1175, 1507, 1115, 1834, 1103, 570, - 571, 572, 727, 739, 895, 1529, 735, 742, 2013, 740, - 736, 423, 1302, 740, 2015, 307, 433, 433, 138, 308, - 774, 672, 425, 675, 439, 309, 310, 291, 311, 312, - 155, 687, 156, 300, 302, 446, 305, 139, 1123, 1118, - 612, 613, 614, 1440, 1441, 591, 592, 313, 326, 135, - 999, 433, 292, 136, 2005, 287, 268, 627, 288, 268, - 1280, 1281, 1282, 1283, 268, 433, 899, 140, 293, 294, - 1307, 60, 61, 62, 63, 1262, 274, 1407, 774, 275, - 1169, 276, 1404, 321, 700, 701, 74, 266, 144, 77, - 1896, 1473, 1474, 155, 1406, 156, 1644, 1170, 1897, 1724, - 704, 108, 705, 591, 592, 1171, 1172, 1173, 735, 108, - 147, 1174, 1175, 511, 108, 268, 108, 108, 421, 593, - 412, 413, 569, 431, 434, 1921, 518, 145, 268, 1369, - 1408, 268, 534, 1213, 108, 576, 955, 533, 146, 581, - 1284, 322, 617, 142, 108, 2033, 346, 268, 136, 1272, - 268, 268, 268, 268, 389, 163, 391, 148, 462, 412, - 413, 515, 712, 268, 713, 167, -537, 268, 714, 348, - 149, 537, 475, 704, 401, 705, 1263, 1266, 402, 1959, - 408, 409, 410, 411, 350, 150, 412, 413, 155, 559, - 156, 560, 268, 268, 268, 561, 1015, 1016, 412, 413, - 538, 681, 398, 682, 412, 413, 399, 683, 155, 268, - 156, 1015, 1016, 1265, 884, 268, 886, 887, 151, 412, - 413, 691, 559, 178, 560, 1093, 591, 592, 561, 591, - 592, 159, 728, 900, 729, 591, 592, 160, 730, 992, - 737, 2028, 729, 823, 591, 592, 738, 181, 591, 592, - 688, 689, 412, 413, 815, 408, 409, 410, 1000, -539, - 152, 356, 161, 591, 592, 1391, 702, 586, 587, 1409, - 412, 413, 935, 433, 268, 595, 600, -544, 268, 268, - 408, 409, 410, 411, 1755, 282, 164, 155, 283, 156, - 284, 555, 556, 1117, 268, 165, 1118, 557, 591, 592, - 715, 285, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 971, 2055, 722, 168, 366, 367, 368, 369, 1864, - 1356, 747, 1357, 370, 371, 372, 1169, 315, 373, 316, - 374, 591, 592, 591, 592, 1367, 602, 169, 472, 828, - 603, 375, 277, 1170, 376, 278, 268, 594, 279, 170, - 280, 1171, 1172, 1173, 1865, 171, 812, 1174, 1175, 183, - 179, 41, 184, 773, 2094, 185, 569, 774, 1918, 268, - 1262, 832, 591, 592, 172, 774, 268, 805, 186, 173, - 684, 433, 406, 433, 268, 433, 433, 439, 1237, 174, - 819, 1238, 943, 1866, 268, 268, 433, 433, 268, 154, - 499, 154, 500, 268, 827, 638, 829, 136, 539, 540, - 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, - 551, 552, 553, 554, 555, 556, 565, 296, 297, 268, - 557, 591, 592, 1593, 1594, 859, 1751, 591, 592, 298, - 175, 1610, 1452, 299, 408, 409, 410, 411, 1456, 377, - 378, 379, 1867, 176, 268, 268, 1662, 704, 1868, 705, - 380, 591, 592, 177, 381, 1215, 382, 108, 412, 413, - 591, 592, 182, 591, 592, 867, 704, 958, 705, 774, - 425, 425, 1869, 975, 1235, 722, 1774, 774, 809, 180, - 811, 1990, 813, 814, 1991, 1494, 704, 188, 705, 1673, - 268, 268, 268, 824, 825, 981, 722, 692, 1509, 982, - 693, 994, 269, 694, 1514, 695, 329, 1158, 1293, 330, - 1245, 270, -540, 439, 433, 439, 433, 433, 433, 433, - 433, 433, 331, 433, 433, 433, 433, 957, 271, 433, - 433, 433, 154, 963, 296, 297, 268, 962, 704, 1011, - 705, 591, 592, 685, 1169, 1121, 298, 972, 722, 774, - 304, 722, 289, 891, 892, 1041, 591, 592, 587, 1587, - 1153, 1170, 1992, 722, 774, 408, 409, 410, 411, 1171, - 1172, 1173, 1134, 268, 1135, 1174, 1175, 1993, 1003, 591, - 592, 1922, 1923, 591, 592, 591, 592, 1924, 290, 412, - 413, 591, 592, 268, 1019, 1010, 591, 592, 295, 268, - 1994, 314, 439, 1030, 2039, 704, 2040, 705, 1034, 303, - 433, 1154, 2049, 774, 538, 774, 317, 2078, 1169, 591, - 592, 942, 318, 944, 945, 946, 947, 948, 949, 327, - 951, 952, 953, 954, 328, 1170, 959, 960, 961, 268, - 2079, 268, 333, 1171, 1172, 1173, 591, 592, 1663, 1174, - 1175, 408, 409, 410, 411, 1926, 1927, 1635, 1636, 2042, - 1672, 1924, 601, 334, 1133, 678, 553, 554, 555, 556, - 591, 592, 830, 268, 557, 412, 413, 704, 1197, 705, - 706, 1150, 774, 2019, 539, 540, 541, 542, 543, 544, - 545, 546, 547, 548, 549, 550, 551, 678, 553, 554, - 555, 556, 335, 1685, 1198, 1653, 557, -541, 774, 1028, - 1199, 1144, 1775, 341, 774, 1241, 1275, 1036, 268, 774, - 774, 1344, 1366, 879, 880, 774, 774, 342, 1374, 1408, - 1388, 268, 774, 2080, 774, 704, 343, 705, 864, 268, - 2062, 550, 551, 678, 553, 554, 555, 556, 268, 1505, - 1550, 1581, 557, 774, 774, 774, 1244, 1669, 1245, 353, - 722, 1670, 722, 722, 1692, 1573, 344, 1574, 774, 920, - 921, 922, 1408, 1652, 354, 1653, 722, 542, 543, 544, - 545, 546, 547, 548, 549, 550, 551, 678, 553, 554, - 555, 556, 1264, 1267, 351, 1767, 557, 1813, 1268, 774, - 1828, 1814, 352, 1847, 1829, 1848, 1863, 774, 1893, 774, - 1814, 722, 735, 1902, 1916, 964, 1948, 1903, 1814, 355, - 774, 1255, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 772, 553, 554, 555, 556, - 1278, 1973, 385, 396, 557, 1814, 704, 722, 705, 268, - 1161, 1981, 998, 1480, 1989, 774, 2003, 1167, 774, 397, - 1814, 1178, 2045, 1274, 403, 2046, 774, 2047, 268, 774, - 2048, 774, 1018, 1736, 774, 1737, 1747, 1748, 1025, 268, - 404, 429, 1320, 1321, 433, 1323, 1324, 1325, 428, 1327, - 1328, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 2050, - 2052, 2073, 2081, 774, 1903, 1814, 774, 136, 2091, 442, - 268, 268, 2092, 268, 268, 268, 444, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 2102, 2105, 268, - 450, 1814, 2106, 1368, 1370, 454, 468, 473, 507, 1348, - 510, -190, -191, -192, 517, 516, 519, 522, 535, 523, - 524, 580, 1094, 566, 567, 399, 574, 604, 618, 577, - 582, 1361, 584, 585, 605, 606, 607, 268, 433, 433, - 608, 609, 610, 615, 621, 622, 619, 1375, 633, 623, - 624, 625, 626, 628, 629, 630, 634, 641, 640, 268, - 649, 1301, 667, 650, 651, 662, 663, 1129, 665, 666, - 668, 670, 673, 669, 1319, 268, 268, 671, 674, 696, - 1137, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 678, 553, 554, 555, 556, 1155, 690, 1420, - 703, 557, 709, 710, 722, 135, 744, 765, 716, 748, - 770, 776, 777, 1431, 1432, 1433, 749, 806, 816, 557, - 836, 833, 835, 862, 871, 872, 875, 268, 878, 882, - 1668, 883, 913, 885, 911, 914, 916, 924, 929, 933, - 936, 268, 268, 268, 965, 1349, 1350, 967, 974, 980, - 984, 1656, 268, 985, 986, 1658, 987, 433, 988, 995, - 996, 433, 1464, 1368, 1370, 997, 1007, 1012, 1008, 1022, - 433, 1038, 433, 1024, 1027, 433, 1033, 1035, 1039, 1042, - 1043, 1044, 1046, 1047, 1048, 1050, 1051, 1518, 1052, 1523, - 268, 1053, 1054, 1458, 1055, 1056, 1057, 1058, 1059, 1062, - 1930, 1066, 1091, 1092, 1107, 1100, 1101, 1102, 1116, 348, - 1122, 1110, 1125, 1138, 1126, 1139, 1130, 1145, 1147, 1156, - 1164, 1168, 1522, 1165, 1190, 1192, 1207, 1204, 1300, 433, - 1205, 1533, 1206, 1218, 268, 1537, 544, 545, 546, 547, - 548, 549, 550, 551, 678, 553, 554, 555, 556, 1219, - 268, 1220, 1223, 557, 1231, 1233, 1234, 1243, 1246, 268, - 1240, 1247, 1248, 268, 1444, 1249, 1254, 1252, 1446, 1253, - 1437, 1270, 1271, 1276, 1277, 1290, 1296, 1450, 1339, 1451, - 1298, 1303, 1453, 1297, 1306, 1313, 1582, 1583, 1584, 1677, - 1677, 1309, 1310, 1322, 1589, 1326, 1338, 1352, -193, 1360, - 1377, 1378, 1379, 1382, 1389, 1384, 1385, 1383, 1386, 1604, - 1387, 1396, 1397, 1401, 268, 268, 268, 1400, 1402, 1411, - 1612, 1802, 268, 1412, 1422, 152, 356, 1413, 1620, 1414, - 1415, 1651, 1416, 1417, 1418, 1419, 1496, 268, 1423, 1424, - 1425, 1426, 1427, 1428, 1664, 1429, 1434, 1442, 268, 1448, - 1447, 1454, 1457, 1459, 1455, 1376, 268, 1463, 1471, 268, - 1476, 1477, 1489, 1479, 1465, 1482, 1487, 357, 358, 359, - 360, 361, 362, 363, 364, 365, 1483, 1490, 1493, 1491, - 366, 367, 368, 369, 1504, 1506, 1510, 1512, 370, 371, - 372, 1525, 1703, 373, 1526, 374, 1527, 1528, 1530, 1534, - 1683, 1535, 1536, 1538, 1540, 1541, 375, 1542, 1543, 376, - 1544, 1545, 1546, 1547, 1548, 1549, 348, 1570, 1576, 1580, - 1559, 1585, 439, 439, 1586, 1702, 1566, 1592, 268, 1606, - 1607, 1443, 1621, 1626, 1627, 1590, 1591, 1598, 1632, 1599, - 1600, 1609, 1601, 1613, 1628, 433, 1633, 406, 1729, 1634, - 1614, 1615, 1616, 268, 1617, 1660, 1686, 1618, 268, 1623, - 1666, 1648, 1687, 1638, 1689, 1655, 1641, 1694, 1695, 1679, - 1742, 1698, 1238, 1697, 1665, 1684, 1701, 1805, 539, 540, - 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, - 551, 678, 553, 554, 555, 556, 1735, 1659, 1691, 1704, - 557, 1711, 1438, 1712, 1713, 1714, 1716, 1715, 1717, 1718, - 1723, 1118, 1779, 1502, 377, 378, 379, 1730, 1731, 1784, - 1787, 1733, 1683, 1756, 268, 380, 1752, 268, 268, 381, - 1757, 382, 108, 1766, 1770, 1788, 1789, 1771, 1796, 1790, - 1953, 1798, 1799, 1801, 1833, 425, 425, 1806, -542, 1818, - 268, 1819, 1696, 1936, 735, 1820, 268, 1826, 1729, 1831, - 1844, 1832, 1710, 1845, 1673, 268, 1851, 1846, 1795, 1839, - 1858, 1985, 1860, 1852, 1861, 433, 1870, 1877, 433, 1887, - 1854, 1804, 1855, 1889, 1878, 1884, 1890, 1872, 1892, 1885, - 1886, 1894, 1891, 1895, 1900, 1915, 268, 1933, 1938, 1950, - 1952, 1934, 722, 1274, 722, 1949, 1951, 348, 1954, 268, - 439, 1960, -543, 1967, 1963, 1964, 1969, 1971, 1974, 1977, - 1980, 1978, 1984, 1996, 1982, 1988, 1997, 1683, 1999, 2000, - 2011, 2016, 2007, 708, 2021, 2063, 2064, 2065, 1622, 2066, - 2068, 2035, 439, 1998, 2051, 2069, 1759, 1760, 1761, 1762, - 1763, 1765, 2070, 2074, 2086, 268, 2090, 2098, 2103, 2071, - 2104, 1859, 2085, 2107, 2093, 2108, 1882, 1508, 2029, 1562, - 1709, 1908, 743, 1732, 1881, 1532, 113, 124, 125, 126, - 2020, 1928, 1780, 1650, 132, 1782, 1800, 874, 1785, 268, - 1678, 0, 724, 0, 0, 0, 0, 0, 0, 1029, - 0, 268, 0, 0, 0, 0, 1912, 0, 0, 0, - 0, 0, 0, 0, 268, 0, 0, 0, 0, 0, - 0, 0, 0, 1901, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1909, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 268, 0, 0, 0, 1683, 0, 0, 0, 0, - 0, 0, 0, 268, 0, 0, 0, 0, 1913, 1935, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 268, 0, 0, 268, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 268, 0, 425, - 0, 268, 0, 0, 0, 0, 1738, 1739, 0, 1683, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 348, 0, 0, 0, - 0, 0, 0, 1976, 0, 0, 0, 268, 0, 0, - 0, 0, 2006, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 678, 553, 554, 555, - 556, 268, 0, 0, 0, 557, 0, 0, 0, 0, - 0, 1261, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 722, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1940, 1941, 1942, - 1943, 1944, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 0, 268, 268, 268, - 268, 268, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1683, 0, 722, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1975, 0, 0, 0, 1979, - 0, 0, 0, 0, 0, 0, 722, 0, 0, 0, - 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 394, 0, 268, 0, 0, 0, - 0, 0, 0, 1875, 1683, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2012, 0, 433, 0, - 2014, 420, 0, 0, 0, 430, 0, 0, 0, 435, - 0, 0, 268, 1337, 0, 0, 2026, 0, 0, 433, - 433, 0, 0, 0, 0, 0, 447, 448, 449, 0, - 451, 452, 453, 433, 455, 456, 457, 458, 459, 460, - 461, 0, 463, 464, 465, 466, 0, 0, 0, 470, - 0, 0, 0, 0, 0, 1929, 0, 0, 0, 0, - 0, 2060, 2061, 0, 0, 0, 0, 0, 0, 0, - 1939, 539, 540, 541, 542, 543, 544, 545, 546, 547, - 548, 549, 550, 551, 678, 553, 554, 555, 556, 1830, - 538, 0, 0, 557, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2083, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 525, 527, 529, - 530, 470, 0, 0, 0, 0, 2099, 2101, 0, 0, - 0, 0, 0, 0, 0, 0, 564, 470, 0, 0, - 2109, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 579, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 589, 590, 0, 0, 0, - 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 611, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2022, 2023, 2024, 2025, - 2027, 0, 0, 0, 631, 470, 0, 0, 0, 635, - 636, 637, 0, 639, 0, 0, 0, 642, 643, 644, - 0, 0, 645, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 678, 553, 554, 555, - 556, 0, 0, 0, 0, 557, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2067, 0, 0, 0, 0, - 677, 0, 0, 0, 470, 686, 0, 0, 0, 0, + 133, 581, 416, 891, 892, 1408, 114, 284, 971, 113, + 435, 1406, 1566, 381, 386, 385, 264, 152, 614, 1791, + 150, 1792, 151, 991, 597, 465, 1756, 1277, 140, 317, + 1401, 999, 1012, 472, 1641, 343, 150, 1784, 388, 1004, + 398, 1403, 618, 2030, 266, 4, 150, 1505, 420, 160, + 150, 709, 512, 534, 1905, 1021, 137, 164, 1210, 279, + 697, 1437, 322, 1030, 323, 138, 270, 1470, 270, 347, + 443, 321, 153, 289, 154, 1309, 589, 590, 442, 266, + 589, 590, 150, 5, 346, 589, 590, 153, 271, 154, + 1007, 589, 590, 1393, 1260, 382, 1116, 725, 290, 1825, + 280, 886, 142, 281, 1527, 282, 893, 304, 318, 670, + 327, 673, 897, 328, 291, 292, 283, 589, 590, 685, + 568, 569, 570, 734, 589, 590, 329, 536, 589, 590, + 421, 1832, 136, 589, 590, 431, 431, 423, 1389, 589, + 590, 410, 411, 437, 556, 1407, 737, 723, 324, 1753, + 1367, 556, 738, 444, 1862, 724, 1438, 1439, 1121, 1112, + 1863, 610, 611, 612, 1113, 410, 411, 2011, 729, 431, + 589, 590, -538, 2013, 266, 678, 730, 266, 625, 139, + 589, 590, 266, 431, 143, 1402, 1278, 1279, 1280, 1281, + 702, 1864, 703, 305, 732, 2003, 1404, 306, 1109, 589, + 590, 1865, 733, 307, 308, 264, 309, 310, 144, 319, + 997, 589, 590, 589, 590, 990, 410, 411, 1642, 1260, + 1866, 553, 554, 1660, 1722, 311, 107, 555, 1260, 698, + 699, 509, 1867, 266, 1988, 107, 1471, 1472, 145, 396, + 567, 107, 107, 397, 516, 1406, 266, 1013, 1014, 266, + 532, 387, 107, 574, 615, 531, 107, 579, 146, 1919, + 135, 953, 1013, 1014, 141, 266, 1282, 320, 266, 266, + 266, 266, 399, 344, 1270, 389, 400, 410, 411, 2031, + 710, 266, 711, 161, -536, 266, 712, 346, 107, 513, + 535, 165, 147, 298, 300, 1211, 303, 157, 406, 407, + 408, 409, 882, 348, 884, 885, 153, 153, 154, 154, + 266, 266, 266, 1957, 1261, 1264, 134, 702, 689, 703, + 135, 898, 410, 411, 589, 590, 726, 266, 727, 422, + 148, 1263, 728, 266, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 735, 149, 727, 702, 555, 703, 736, 1101, + 933, 2026, 1749, 733, 821, 158, 706, 733, 686, 687, + 410, 411, 813, 557, 159, 558, 1091, 410, 411, 559, + 557, 1291, 558, 1243, 700, -539, 559, 589, 590, 589, + 590, 431, 266, 589, 590, 1300, 266, 266, 497, 969, + 498, 410, 411, 772, 679, 591, 680, 1683, 470, 1651, + 681, -540, 266, 162, 406, 407, 408, 998, 713, 406, + 407, 408, 409, 406, 407, 408, 409, 406, 407, 408, + 409, 720, 406, 407, 408, 409, 826, 589, 590, 745, + 1354, 771, 1355, 410, 411, 772, 2053, 410, 411, 589, + 590, 410, 411, 592, 1167, 1365, 163, 59, 60, 61, + 62, 589, 590, 740, 266, 1305, 176, 589, 590, 738, + 1989, 1168, 73, 772, 810, 76, 589, 590, 166, 1169, + 1170, 1171, 1990, 167, 567, 1172, 1173, 266, 1991, 168, + 589, 590, 1894, 1916, 266, 803, 563, 1992, 2092, 431, + 1895, 431, 266, 431, 431, 437, 1167, 313, 817, 314, + 941, 2037, 266, 266, 431, 431, 266, 152, 636, 152, + 135, 266, 825, 1168, 827, 1167, 584, 585, 589, 590, + 169, 1169, 1170, 1171, 593, 598, 170, 1172, 1173, 589, + 590, 171, 1168, 589, 590, 589, 590, 266, 172, 2038, + 1169, 1170, 1171, 857, 1591, 1592, 1172, 1173, 410, 411, + 2047, 599, 1450, 1772, 2076, -543, 992, 600, 1454, 1405, + 173, 601, 266, 266, 956, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 676, 551, + 552, 553, 554, 181, 423, 423, 182, 555, 177, 183, + 1167, 589, 590, 720, 702, 1156, 703, 676, 551, 552, + 553, 554, 184, 1633, 1634, 1492, 555, 1168, 266, 266, + 266, 1608, 2077, 683, 720, 1169, 1170, 1171, 1507, 174, + 690, 1172, 1173, 691, 1512, 830, 692, 175, 693, 772, + 2040, 437, 431, 437, 431, 431, 431, 431, 431, 431, + 178, 431, 431, 431, 431, 955, 1167, 431, 431, 431, + 152, 961, 1039, 865, 266, 960, 275, 772, 1132, 276, + 1133, 1009, 277, 1168, 278, 970, 720, 294, 295, 720, + 180, 1169, 1170, 1171, 702, 40, 703, 1172, 1173, 296, + 179, 720, 1213, 297, 1920, 1921, 294, 295, 186, 973, + 1922, 266, 702, 772, 703, 979, 1001, 1585, 296, 980, + 1233, 153, 302, 154, 267, 2078, 702, 1115, 703, 269, + 1116, 266, 1017, 1008, 772, 285, 268, 266, 286, 1131, + 437, 1028, 272, 589, 590, 273, 1032, 274, 431, 542, + 543, 544, 545, 546, 547, 548, 549, 676, 551, 552, + 553, 554, 828, 1242, 287, 1243, 555, 548, 549, 676, + 551, 552, 553, 554, 1571, 293, 1572, 266, 555, 266, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 676, 551, 552, 553, 554, 1148, 1924, + 1925, 1235, 555, 1119, 1236, 1922, 1661, 772, 1773, 288, + 301, 266, 1151, 877, 878, 315, 772, 1152, 1670, 312, + 1195, 772, 2017, 419, 772, 316, 1196, 1197, 429, 432, + 772, 772, 889, 890, 1239, 1273, 1342, 585, 772, 772, + 772, 1364, 1372, 1386, 1503, 772, 772, 772, 772, 1142, + 1548, 1579, 325, 1667, 772, 772, 266, 1668, 326, 918, + 919, 920, 460, 1650, 1406, 1651, 1690, 1262, 1265, 266, + 772, 1765, 331, 332, 1811, 772, 473, 266, 1812, 2060, + 1826, 1845, 333, 1846, 1827, 772, 266, 772, 1861, 1891, + 150, 354, 1812, 733, 702, 1900, 703, 704, 720, 1901, + 720, 720, 1914, 339, 1946, 962, 1812, 1406, 772, 1971, + 340, 341, 1979, 1812, 720, 1266, 772, 1987, 2001, 2043, + 2044, 772, 1812, 772, 772, 2045, 2046, 2048, 351, 772, + 772, 772, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 1964, 996, 342, 349, 364, 365, 366, 367, 720, + 350, 352, 2050, 368, 369, 370, 1901, 2071, 371, 1253, + 372, 1812, 1016, 2079, 1734, 2089, 1735, 772, 1023, 2090, + 373, 2100, 2103, 374, 353, 1812, 2104, 702, 1276, 703, + 862, 383, 394, 395, 401, 720, 402, 266, 426, 427, + 135, 1478, 440, 442, 448, 452, 466, 471, 505, 508, + -190, 1272, -191, -192, 517, 514, 266, 515, 1366, 1368, + 520, 404, 521, 522, 533, 397, 564, 266, 1745, 1746, + 1318, 1319, 431, 1321, 1322, 1323, 565, 1325, 1326, 1327, + 1328, 1329, 1330, 1331, 1332, 1333, 1334, 572, 575, 578, + 580, 582, 1092, 583, 602, 603, 604, 605, 266, 266, + 606, 266, 266, 266, 607, 266, 266, 266, 266, 266, + 266, 266, 266, 266, 266, 616, 608, 266, 613, 617, + 619, 620, 631, 621, 622, 623, 624, 1346, 375, 376, + 377, 626, 627, 628, 682, 632, 638, 1127, 639, 378, + 647, 648, 649, 379, 660, 380, 107, 661, 663, 1359, + 1135, 664, 665, 666, 667, 266, 431, 431, 668, 669, + 671, 672, 688, 694, 701, 1373, 707, 1153, 708, 134, + 742, 410, 411, 714, 763, 768, 746, 266, -537, 1159, + 1493, 747, 774, 775, 804, 814, 1165, 555, 833, 831, + 1176, 834, 860, 266, 266, 873, 869, 870, 876, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 676, 551, 552, 553, 554, 1418, 1366, 1368, + 880, 555, 720, 881, 883, 909, 911, 931, 912, 914, + 922, 1429, 1430, 1431, 927, 934, 982, 963, 978, 1654, + 965, 972, 807, 1656, 809, 266, 811, 812, 1666, 983, + 984, 985, 994, 986, 995, 1005, 993, 822, 823, 266, + 266, 266, 1006, 1010, 1020, 1022, 1036, 1025, 1031, 1033, + 266, 1037, 1040, 1041, 1042, 431, 1044, 1045, 1046, 431, + 1462, 1048, 1049, 1050, 1516, 1051, 1521, 1052, 431, 1053, + 431, 1054, 1055, 431, 1056, 1057, 1064, 1060, 1298, 1089, + 1090, 1120, 1136, 1098, 1099, 1100, 1105, 1114, 266, 1108, + 1124, 1456, 1123, 1128, 1137, 1143, 1145, 1154, 1162, 1163, + 1188, 1166, 1928, 1190, 1205, 1202, 1203, 346, 1204, 1216, + 1217, 1229, 1232, 1317, 1218, 1221, 1231, 1238, 1241, 1245, + 1520, 1244, 1246, 1247, 1250, 1251, 1252, 431, 1337, 1531, + 1268, 1269, 266, 1535, 1274, 1275, 1288, 1294, 1296, 1295, + 1304, 1308, 1301, 1311, 1320, 1307, 1358, 1324, 266, 1336, + -193, 1375, 1350, 1376, 1377, 1380, 1381, 266, 1382, 1383, + 1384, 266, 1385, 1387, 1395, 940, 1398, 942, 943, 944, + 945, 946, 947, 1399, 949, 950, 951, 952, 1400, 1662, + 957, 958, 959, 1409, 1580, 1581, 1582, 1675, 1675, 1394, + 1410, 1420, 1587, 1411, 1412, 1413, 1414, 1415, 1416, 1417, + 1421, 1422, 1423, 1424, 1425, 1374, 1426, 1602, 1649, 1427, + 1432, 1440, 266, 266, 266, 1452, 1445, 1469, 1610, 1800, + 266, 1455, 1474, 7, 8, 1446, 1618, 1453, 1457, 1461, + 1475, 1463, 1477, 1480, 1481, 266, 1485, 1487, 1489, 1491, + 1488, 1504, 1510, 1525, 1526, 1528, 266, 1532, 1502, 1523, + 1508, 1533, 1534, 1026, 266, 1536, 1524, 266, 1538, 1539, + 1540, 1034, 1541, 1542, 1543, 1544, 1545, 1546, 1547, 1701, + 1557, 1564, 1568, 1574, 1578, 1583, 1584, 1588, 1589, 1590, + 1596, 1441, 1604, 1727, 1605, 1619, 1597, 1624, 1625, 1626, + 1598, 1630, 1599, 1631, 1632, 1611, 1658, 1677, 1681, 1612, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 1613, 346, 1614, 37, 38, 39, 40, + 437, 437, 42, 1700, 1615, 1616, 266, 1621, 715, 48, + 1663, 1636, 50, 716, 1639, 717, 718, 1653, 1664, 1646, + 1684, 1236, 1702, 431, 1685, 1687, 1682, 1740, 1689, 1692, + 1657, 266, 1693, 536, 70, 1696, 266, 1695, 1709, 1699, + 1710, 1711, 1712, 1500, 1714, 1715, 1797, 1713, 1716, 1721, + 1728, 1729, 1116, 1731, 1754, 1803, 1750, 1755, 84, 85, + 86, 1764, 1768, 1786, 1787, 1788, 1796, 1799, 1804, 1777, + 733, 1816, -541, 1727, 1733, 1817, 1782, 1785, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 1818, 1794, 1824, 1829, 555, 1830, + 1681, 1934, 266, 1831, 1837, 266, 266, 1842, 1843, 1849, + 1856, 1983, 1858, 1868, 1875, 1769, 1852, 1876, 1951, 423, + 423, 1844, 1885, 1850, 1887, 1853, 1859, 1888, 266, 1889, + 1890, 1870, 1882, 895, 266, 1883, 1884, 1892, 1893, 1898, + 1913, 1931, 1932, 266, 1936, 1947, 1793, 1948, 1950, 1952, + 1949, 1958, 1961, 431, 150, 354, 431, 1962, 1965, 1802, + 1607, -542, 1969, 1975, 1967, 1978, 1972, 1982, 1620, 1976, + 1994, 1980, 1986, 1995, 266, 1997, 2009, 1998, 2014, 2019, + 720, 1272, 720, 2005, 2061, 346, 2062, 266, 437, 2063, + 2033, 1996, 2064, 2066, 2067, 2068, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 1681, 2049, 2072, 2069, 364, + 365, 366, 367, 2083, 2084, 1299, 2088, 368, 369, 370, + 437, 2091, 371, 1880, 372, 2096, 2101, 2102, 2018, 2105, + 2106, 2027, 1506, 266, 373, 1435, 1560, 374, 1707, 1857, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 770, 551, 552, 553, 554, 722, 1906, + 741, 1530, 555, 1910, 702, 1879, 703, 266, 112, 1730, + 123, 124, 125, 872, 1648, 404, 1926, 131, 1798, 266, + 1676, 1708, 1783, 0, 0, 1027, 0, 0, 0, 0, + 0, 0, 266, 0, 0, 0, 0, 0, 0, 1347, + 1348, 1899, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1907, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 266, + 0, 0, 0, 1681, 0, 0, 1736, 1737, 0, 0, + 0, 266, 375, 376, 377, 0, 1911, 1933, 0, 0, + 0, 0, 0, 378, 0, 0, 0, 379, 0, 380, + 107, 266, 0, 0, 266, 1757, 1758, 1759, 1760, 1761, + 1763, 0, 0, 423, 0, 266, 0, 0, 0, 266, + 0, 0, 0, 0, 0, 0, 0, 1681, 0, 702, + 0, 703, 1671, 0, 0, 0, 0, 0, 0, 2004, + 0, 0, 0, 0, 346, 0, 0, 0, 0, 0, + 0, 1974, 0, 1259, 0, 266, 0, 0, 1442, 0, + 0, 0, 1444, 0, 0, 0, 0, 0, 0, 0, + 0, 1448, 0, 1449, 0, 0, 1451, 0, 0, 266, + 0, 0, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 676, 551, 552, 553, 554, + 720, 0, 0, 0, 555, 0, 1436, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 676, 551, 552, 553, 554, 0, 0, 0, 0, 555, + 1494, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 266, 266, 266, 266, 266, + 0, 0, 0, 0, 392, 0, 0, 0, 0, 0, + 1681, 0, 720, 1873, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 418, 0, 555, 720, 428, 0, 0, 266, 433, + 0, 0, 0, 1335, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 266, 445, 446, 447, 0, 449, + 450, 451, 1681, 453, 454, 455, 456, 457, 458, 459, + 0, 461, 462, 463, 464, 0, 431, 0, 468, 0, + 0, 0, 0, 0, 0, 1927, 0, 0, 0, 0, + 266, 0, 0, 0, 0, 0, 0, 431, 431, 0, + 1937, 0, 0, 0, 0, 0, 1938, 1939, 1940, 1941, + 1942, 431, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 676, 551, 552, 553, 554, + 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 523, 525, 527, 528, + 468, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1973, 562, 468, 0, 1977, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 697, 698, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 723, 0, 0, 539, 540, - 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, - 551, 772, 553, 554, 555, 556, 0, 753, 0, 0, - 557, 757, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 771, 527, 0, 0, 0, - 775, 0, 0, 778, 779, 780, 781, 782, 783, 784, - 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, - 796, 797, 798, 799, 800, 801, 802, 802, 0, 807, - 808, 0, 810, 0, 0, 0, 0, 0, 0, 817, - 0, 0, 821, 822, 0, 0, 0, 0, 802, 0, - 0, 0, 0, 470, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 837, 838, 839, 840, 841, - 842, 843, 844, 845, 846, 847, 848, 849, 850, 852, - 854, 855, 856, 857, 858, 0, 860, 861, 0, 0, - 0, 0, 0, 868, 869, 870, 0, 0, 0, 0, - 0, 876, 877, 0, 470, 470, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 152, 356, 0, 0, - 0, 0, 0, 525, 677, 896, 0, 0, 0, 901, - 902, 903, 904, 905, 906, 907, 908, 909, 0, 0, - 0, 0, 915, 0, 917, 0, 918, 0, 0, 0, - 470, 470, 470, 923, 0, 925, 926, 927, 357, 358, - 359, 360, 361, 362, 363, 364, 365, 0, 0, 0, - 0, 366, 367, 368, 369, 0, 0, 0, 0, 370, - 371, 372, 950, 0, 373, 0, 374, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 470, 375, 0, 0, - 376, 0, 0, 969, 0, 970, 0, 0, 860, 861, - 0, 0, 0, 0, 0, 471, 0, 983, 0, 0, - 0, 0, 0, 989, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 470, 1966, 0, 0, 0, 406, 1004, - 1005, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 470, 0, 1020, 1021, 0, 0, 470, - 1026, 0, 0, 0, 1020, 0, 0, 0, 0, 0, - 0, 1037, 0, 0, 1421, 1040, 0, 0, 0, 0, - 0, 0, 0, 0, 528, 0, 0, 471, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1060, 0, 852, - 0, 1063, 0, 471, 0, 377, 378, 379, 0, 0, - 0, 0, 0, 0, 0, 0, 380, 0, 0, 0, - 381, 0, 382, 108, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 470, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1104, 0, 0, 0, 0, 412, 413, - 1462, 0, 0, 0, 0, -538, 0, 1495, 0, 0, + 0, 0, 0, 0, 577, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 587, 588, 1694, 0, 0, 0, + 588, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 609, 0, 0, 0, 0, 2010, 0, 0, 0, 2012, + 0, 0, 0, 0, 0, 0, 2020, 2021, 2022, 2023, + 2025, 0, 0, 629, 468, 2024, 0, 0, 633, 634, + 635, 0, 637, 0, 0, 0, 640, 641, 642, 0, + 0, 643, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 676, 551, 552, 553, 554, + 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, + 2058, 2059, 0, 0, 0, 2065, 0, 0, 0, 675, + 0, 0, 0, 468, 684, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 471, 0, 0, 0, 0, 0, 0, 470, 0, + 695, 696, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 721, 0, 1778, 0, 0, 1780, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 470, 0, 0, 0, 0, 0, 0, 1143, 0, - 0, 0, 1149, 0, 0, 0, 0, 0, 470, 0, - 0, 0, 0, 0, 0, 0, 1162, 1163, 0, 0, - 0, 0, 1166, 0, 0, 0, 0, 0, 0, 0, - 471, 0, 0, 0, 0, 0, 0, 0, 1191, 0, - 0, 1193, 0, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 678, 553, 554, 555, - 556, 1208, 0, 1210, 1211, 557, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 751, 0, 0, 0, + 755, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 769, 525, 0, 0, 0, 773, + 0, 0, 776, 777, 778, 779, 780, 781, 782, 783, + 784, 785, 786, 787, 788, 789, 790, 791, 792, 794, + 795, 796, 797, 798, 799, 800, 800, 0, 805, 806, + 0, 808, 0, 0, 0, 0, 0, 0, 815, 0, + 0, 819, 820, 0, 0, 0, 0, 800, 0, 0, + 0, 0, 468, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 835, 836, 837, 838, 839, 840, + 841, 842, 843, 844, 845, 846, 847, 848, 850, 852, + 853, 854, 855, 856, 0, 858, 859, 0, 0, 0, + 0, 0, 866, 867, 868, 0, 0, 0, 0, 0, + 874, 875, 0, 468, 468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1229, 0, 539, 540, 541, 542, 543, 544, - 545, 546, 547, 548, 549, 550, 551, 678, 553, 554, - 555, 556, 528, 538, 0, 1251, 557, 0, 0, 0, - 0, 0, 1257, 1258, 1259, 1260, 0, 0, 0, 0, - 1269, 0, 0, 0, 0, 795, 0, 0, 0, 0, - 0, 0, 803, 804, 1294, 1295, 0, 0, 0, 470, + 150, 354, 523, 675, 894, 0, 0, 0, 899, 900, + 901, 902, 903, 904, 905, 906, 907, 0, 0, 0, + 0, 913, 0, 915, 0, 916, 0, 0, 0, 468, + 468, 468, 921, 0, 923, 924, 925, 0, 0, 0, + 0, 0, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 0, 0, 0, 0, 364, 365, 366, 367, 0, + 0, 948, 0, 368, 369, 370, 0, 0, 371, 0, + 372, 0, 0, 0, 0, 468, 0, 0, 0, 0, + 373, 0, 967, 374, 968, 0, 0, 858, 859, 0, + 0, 0, 0, 0, 469, 0, 981, 0, 0, 0, + 0, 0, 987, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 468, 1419, 0, 0, 0, 0, 1002, 1003, + 0, 404, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 468, 0, 1018, 1019, 0, 0, 468, 1024, + 0, 0, 0, 1018, 0, 0, 0, 0, 0, 0, + 1035, 0, 0, 0, 1038, 0, 0, 0, 0, 0, + 0, 0, 0, 526, 0, 0, 469, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1058, 0, 850, 0, + 1061, 0, 469, 0, 0, 0, 0, 0, 375, 376, + 377, 0, 0, 0, 0, 0, 0, 0, 0, 378, + 0, 0, 0, 379, 0, 380, 107, 0, 0, 0, + 0, 0, 468, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1102, 0, 0, 0, 0, 0, 0, 0, + 1460, 0, 0, 0, 0, 0, 0, 0, 1671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 826, 0, 0, 0, 0, 471, - 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 678, 553, 554, 555, 556, 0, 0, - 0, 0, 557, 0, 0, 853, 0, 0, 0, 470, + 469, 0, 0, 0, 0, 0, 0, 468, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2081, + 468, 0, 0, 0, 0, 0, 0, 1141, 0, 0, + 0, 1147, 0, 0, 0, 0, 0, 468, 0, 0, + 2097, 2099, 0, 0, 0, 1160, 1161, 0, 0, 0, + 0, 1164, 0, 0, 2107, 0, 0, 0, 0, 469, + 0, 0, 0, 0, 0, 0, 0, 1189, 0, 0, + 1191, 0, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 676, 551, 552, 553, 554, + 1206, 0, 1208, 1209, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1340, 0, 0, 0, 0, - 471, 471, 0, 0, 0, 1341, 1342, 1343, 0, 0, - 0, 0, 1345, 1346, 0, 1347, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1354, 1355, 0, - 0, 0, 0, 0, 0, 1358, 1359, 0, 0, 0, - 0, 0, 1363, 0, 1364, 1365, 471, 471, 471, 0, - 0, 1371, 1372, 0, 0, 0, 470, 0, 0, 0, + 0, 1227, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1476, 0, 0, 0, 0, 0, 0, + 0, 526, 0, 0, 1249, 0, 0, 0, 0, 0, + 0, 1255, 1256, 1257, 1258, 0, 0, 0, 0, 1267, + 0, 0, 0, 0, 793, 0, 0, 0, 0, 0, + 0, 801, 802, 1292, 1293, 0, 0, 0, 468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 157, 158, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1399, 0, 0, - 0, 0, 471, 0, 0, 0, 0, 0, 0, 0, - 0, 539, 540, 541, 542, 543, 544, 545, 546, 547, - 548, 549, 550, 551, 552, 553, 554, 555, 556, 0, - 1430, 0, 0, 557, 0, 0, 0, 0, 0, 471, - 0, 0, 470, 0, 0, 0, 0, 0, 0, 0, - 1445, 0, 0, 0, 0, 0, 0, 0, 0, 471, - 0, 0, 0, 0, 0, 471, 0, 0, 0, 0, - 0, 1371, 1372, 0, 0, 1478, 1461, 0, 0, 0, + 0, 0, 0, 824, 0, 0, 0, 0, 469, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 676, 551, 552, 553, 554, 0, 0, 0, + 0, 555, 0, 0, 851, 0, 0, 0, 468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1470, 0, 0, 1475, 0, 419, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 853, 0, 1064, 0, 0, + 0, 0, 0, 0, 1338, 0, 0, 0, 0, 469, + 469, 0, 0, 0, 1339, 1340, 1341, 0, 0, 0, + 0, 1343, 1344, 0, 1345, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1352, 1353, 0, 0, + 0, 0, 0, 0, 1356, 1357, 0, 0, 0, 0, + 0, 1361, 0, 1362, 1363, 469, 469, 469, 0, 0, + 1369, 1370, 0, 0, 0, 468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1497, 0, 0, 1500, 470, 1503, 0, 0, 0, 0, - 0, 0, 0, 1511, 0, 1513, 0, 1511, 1517, 471, - 0, 0, 0, 0, 1602, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 476, 477, 478, 479, 480, - 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 494, 495, 496, 497, 498, 501, 502, - 503, 504, 505, 506, 471, 508, 509, 0, 0, 0, - 0, 0, 512, 513, 0, 0, 0, 471, 0, 0, - 0, 0, 0, 520, 521, 0, 0, 0, 0, 0, - 0, 1588, 0, 0, 471, 0, 0, 0, 1595, 1596, - 1597, 0, 0, 0, 0, 0, 0, 1603, 0, 1605, - 0, 0, 0, 0, 0, 0, 1608, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 470, - 0, 0, 0, 0, 1624, 0, 0, 0, 0, 0, - 0, 0, 1629, 1630, 1631, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1642, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1654, 539, 540, 541, 542, 543, - 544, 545, 546, 547, 548, 549, 550, 551, 678, 553, - 554, 555, 556, 0, 0, 0, 0, 557, 0, 0, - 1671, 0, 0, 0, 0, 0, 1680, 1681, 646, 647, - 648, 538, 0, 0, 652, 653, 654, 655, 656, 657, - 658, 0, 659, 0, 0, 0, 660, 661, 0, 0, - 664, 0, 0, 0, 0, 471, 0, 0, 1707, 0, - 0, 0, 0, 676, 539, 540, 541, 542, 543, 544, - 545, 546, 547, 548, 549, 550, 551, 678, 553, 554, - 555, 556, 0, 0, 0, 0, 557, 0, 0, 0, - 0, 0, 0, 1719, 1720, 1721, 0, 0, 0, 0, - 0, 0, 0, 0, 1722, 471, 0, 0, 0, 1725, - 1726, 1727, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1734, 0, 0, 0, 0, 470, 470, 1740, - 0, 1741, 0, 0, 0, 0, 0, 1749, 1750, 0, + 0, 0, 0, 155, 156, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1397, 0, 0, 0, + 0, 469, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 676, 551, 552, 553, 554, + 0, 0, 0, 0, 555, 0, 0, 0, 0, 1428, + 0, 0, 0, 0, 0, 0, 0, 0, 469, 0, + 0, 468, 0, 0, 0, 0, 0, 0, 0, 1443, + 0, 0, 0, 0, 0, 0, 0, 0, 469, 0, + 0, 0, 0, 0, 469, 0, 0, 0, 0, 0, + 1369, 1370, 0, 0, 0, 1459, 1600, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1468, + 0, 0, 1473, 0, 0, 417, 0, 0, 0, 0, + 0, 0, 0, 0, 851, 0, 1062, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1495, + 0, 0, 1498, 468, 1501, 0, 0, 0, 0, 0, + 0, 0, 1509, 0, 1511, 0, 1509, 1515, 469, 0, + 0, 0, 0, 0, 1655, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 499, 500, 501, + 502, 503, 504, 469, 506, 507, 0, 0, 0, 0, + 0, 510, 511, 0, 0, 0, 469, 0, 0, 0, + 0, 0, 518, 519, 0, 0, 0, 0, 0, 0, + 1586, 0, 0, 469, 0, 0, 0, 1593, 1594, 1595, + 0, 0, 0, 0, 0, 0, 1601, 0, 1603, 0, + 0, 0, 0, 0, 0, 1606, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 468, 0, + 0, 0, 0, 1622, 0, 0, 0, 0, 0, 0, + 0, 1627, 1628, 1629, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1640, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1652, 0, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 676, 551, + 552, 553, 554, 0, 0, 0, 0, 555, 0, 1669, + 0, 0, 0, 0, 0, 1678, 1679, 644, 645, 646, + 1659, 0, 0, 650, 651, 652, 653, 654, 655, 656, + 0, 657, 0, 0, 0, 658, 659, 0, 0, 662, + 0, 0, 0, 0, 469, 0, 0, 1705, 0, 0, + 0, 0, 674, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 676, 551, 552, 553, + 554, 0, 0, 0, 0, 555, 0, 0, 0, 0, + 0, 0, 1717, 1718, 1719, 0, 0, 0, 0, 0, + 0, 0, 0, 1720, 469, 0, 0, 0, 1723, 1724, + 1725, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1732, 0, 0, 0, 0, 468, 468, 1738, 0, + 1739, 0, 0, 0, 0, 0, 1747, 1748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 470, 0, 0, 0, - 1768, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1778, 0, 0, 1781, 0, 0, 0, - 1783, 0, 471, 0, 0, 0, 0, 0, 0, 1726, - 1727, 0, 1792, 0, 0, 0, 0, 0, 0, 0, - 1797, 1657, 0, 0, 0, 834, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1810, 0, 0, 0, - 0, 1816, 1817, 0, 0, 0, 0, 0, 0, 707, - 0, 0, 0, 0, 1821, 1661, 0, 1822, 1821, 539, - 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 772, 553, 554, 555, 556, 0, 471, 0, - 1667, 557, 0, 0, 0, 0, 0, 1843, 0, 0, + 0, 0, 0, 0, 0, 468, 0, 0, 0, 1766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1853, 0, 0, 0, 0, 0, 0, - 0, 0, 1862, 0, 0, 0, 0, 0, 0, 0, - 0, 527, 0, 0, 0, 0, 0, 0, 0, 0, - 1873, 1874, 0, 0, 470, 0, 0, 0, 0, 0, - 0, 0, 0, 818, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1769, 0, 0, 0, 0, 0, 0, - 471, 0, 0, 0, 0, 0, 0, 0, 1898, 1899, + 0, 0, 1776, 0, 0, 1779, 0, 0, 0, 1781, + 0, 469, 0, 0, 0, 0, 0, 0, 1724, 1725, + 0, 1790, 0, 0, 0, 0, 0, 0, 0, 1795, + 1665, 0, 0, 0, 832, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1808, 0, 0, 0, 0, + 1814, 1815, 0, 0, 0, 0, 0, 0, 705, 0, + 0, 0, 0, 1819, 1767, 0, 1820, 1819, 0, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 676, 551, 552, 553, 554, 469, 0, 0, + 1848, 555, 0, 0, 0, 0, 1841, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1911, 0, 0, 1914, - 0, 0, 0, 865, 1917, 0, 0, 1919, 0, 0, - 0, 0, 0, 0, 0, 0, 470, 0, 0, 0, + 0, 0, 1851, 0, 0, 0, 0, 0, 0, 0, + 0, 1860, 0, 0, 0, 0, 0, 0, 0, 0, + 525, 0, 0, 0, 0, 0, 0, 0, 0, 1871, + 1872, 0, 0, 468, 0, 0, 0, 0, 0, 0, + 0, 0, 816, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1874, 0, 0, 0, 0, 0, 469, + 0, 0, 0, 0, 0, 0, 0, 1896, 1897, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 470, 0, 0, 0, 0, 0, 0, 0, 1945, - 0, 539, 540, 541, 542, 543, 544, 545, 546, 547, - 548, 549, 550, 551, 678, 553, 554, 555, 556, 0, - 0, 0, 0, 557, 1956, 0, 0, 0, 0, 0, - 1961, 0, 0, 1962, 0, 539, 540, 541, 542, 543, - 544, 545, 546, 547, 548, 549, 550, 551, 678, 553, - 554, 555, 556, 0, 0, 471, 0, 557, 0, 1983, - 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 678, 553, 554, 555, 556, 0, 0, - 0, 0, 557, 0, 2001, 2002, 0, 0, 0, 0, - 1119, 0, 0, 0, 0, 0, 2008, 2009, 0, 2010, + 0, 0, 0, 0, 0, 1909, 0, 0, 1912, 0, + 0, 0, 863, 1915, 0, 0, 1917, 0, 0, 0, + 0, 0, 0, 0, 0, 468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2018, 0, 0, 0, 0, 470, 470, 470, - 470, 470, 0, 0, 1136, 0, 0, 1816, 0, 0, - 0, 2034, 0, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 678, 553, 554, 555, - 556, 0, 0, 0, 1708, 557, 0, 0, 2054, 0, - 0, 0, 0, 2057, 2058, 2059, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 470, 0, 1067, 1068, - 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 0, - 1079, 1080, 1081, 1082, 0, 1084, 1085, 1086, 1087, 0, - 0, 1850, 0, 0, 2087, 2088, 2089, 0, 0, 1097, - 0, 1099, 0, 0, 0, 0, 0, 0, 0, 1106, - 0, 0, 0, 471, 471, 1112, 1113, 0, 0, 0, - 0, 0, 0, 0, 1124, 0, 0, 0, 0, 0, + 468, 0, 0, 0, 0, 0, 0, 0, 1943, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 676, 551, 552, 553, 554, 0, 0, 0, + 0, 555, 0, 1954, 0, 0, 0, 0, 0, 1959, + 0, 0, 1960, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 676, 551, 552, 553, + 554, 0, 0, 0, 469, 555, 0, 0, 1981, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 676, 551, 552, 553, 554, 0, 0, 0, + 0, 555, 0, 1999, 2000, 0, 0, 0, 0, 1117, + 0, 0, 0, 0, 0, 2006, 2007, 0, 2008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 471, 189, 152, 356, 0, 405, 0, 0, - 190, 191, 192, 0, 0, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 392, 211, 212, 213, 214, 215, 216, 0, - 0, 0, 0, 0, 0, 1312, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 222, 223, 224, 225, 366, - 367, 368, 369, 226, 0, 0, 0, 370, 371, 372, - 0, 0, 373, 0, 374, 228, 229, 230, 0, 0, - 0, 0, 0, 231, 21, 375, 232, 0, 376, 0, - 0, 1214, 1216, 1217, 0, 0, 0, 1221, 1222, 0, - 0, 1225, 1226, 1227, 1228, 0, 1230, 0, 0, 0, - 0, 1236, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 406, 0, 0, 0, - 0, 0, 0, 0, 1362, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 528, 0, 0, + 0, 2016, 0, 0, 0, 0, 468, 468, 468, 468, + 468, 0, 0, 1134, 0, 0, 1814, 0, 0, 0, + 2032, 0, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 676, 551, 552, 553, 554, + 0, 0, 0, 1706, 555, 0, 0, 2052, 0, 0, + 0, 0, 2055, 2056, 2057, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 468, 0, 1065, 1066, 1067, + 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 0, 1077, + 1078, 1079, 1080, 0, 1082, 1083, 1084, 1085, 0, 0, + 0, 1886, 0, 2085, 2086, 2087, 0, 0, 1095, 0, + 1097, 0, 0, 0, 0, 0, 0, 0, 1104, 0, + 0, 0, 469, 469, 1110, 1111, 0, 0, 0, 0, + 0, 0, 0, 1122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 471, 539, 540, 541, 542, 543, 544, 545, 546, 547, - 548, 549, 550, 551, 678, 553, 554, 555, 556, 0, - 0, 0, 0, 557, 0, 407, 0, 0, 0, 0, - 1317, 1318, 241, 377, 378, 379, 242, 0, 0, 0, - 0, 244, 245, 246, 380, 247, 248, 249, 381, 0, - 382, 108, 408, 409, 410, 411, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 250, 393, 0, - 0, 0, 471, 0, 252, 0, 412, 413, 0, 414, - 0, 415, 189, 152, 0, 416, 255, 471, 0, 190, - 191, 192, 0, 0, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 392, 211, 212, 213, 214, 215, 216, 0, 0, - 0, 0, 0, 0, 0, 0, 1373, 1485, 1486, 0, - 0, 0, 0, 0, 222, 223, 224, 225, 0, 0, - 0, 0, 226, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 229, 230, 0, 0, 0, - 0, 0, 231, 21, 0, 232, 0, 0, 0, 0, - 189, 152, 0, 0, 0, 0, 0, 190, 191, 192, - 0, 0, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 392, - 211, 212, 213, 214, 215, 216, 0, 0, 1567, 0, - 0, 0, 0, 471, 471, 471, 471, 471, 1575, 0, - 0, 0, 222, 223, 224, 225, 0, 0, 0, 0, - 226, 0, 1876, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 228, 229, 230, 0, 0, 0, 0, 0, - 231, 21, 0, 232, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1484, 0, 0, 0, 0, - 0, 241, 471, 0, 0, 242, 0, 0, 0, 0, - 244, 245, 246, 0, 247, 248, 249, 0, 0, 0, - 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1519, 0, 0, 0, 250, 393, 0, 0, - 0, 0, 0, 252, 0, 0, 0, 0, 337, 0, - 0, 0, 578, 0, 0, 255, 0, 0, 0, 0, - 1551, 1552, 1553, 1554, 1555, 0, 0, 0, 0, 1560, - 1561, 0, 0, 1563, 0, 1565, 0, 0, 0, 1569, - 0, 0, 1571, 0, 0, 0, 0, 0, 0, 241, - 0, 0, 0, 242, 1579, 0, 0, 0, 244, 245, - 246, 1705, 247, 248, 249, 0, 0, 0, 108, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 596, 597, 0, 0, 0, 0, - 0, 252, 0, 0, 0, 0, 598, 0, 0, 0, - 299, 0, 0, 255, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1888, 0, - 0, 0, 0, 1637, 0, 1640, 0, 0, 0, 1647, - 0, 1649, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1674, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, - 6, 356, 0, 0, 0, 0, 190, 191, 192, 0, - 0, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, - 1995, 0, 1520, 358, 359, 360, 361, 362, 363, 364, - 365, 222, 223, 224, 225, 366, 367, 368, 369, 226, - 227, 0, 0, 370, 371, 372, 0, 0, 373, 0, - 374, 228, 229, 230, 0, 1728, 0, 0, 0, 231, - 21, 375, 232, 0, 376, 0, 0, 233, 0, 0, - 234, 0, 0, 235, 0, 236, 0, 0, 0, 0, - 0, 0, 37, 0, 0, 0, 237, 0, 0, 0, - 0, 0, 0, 0, 0, 238, 0, 50, 0, 0, - 239, 0, 240, 0, 0, 0, 0, 0, 0, 60, - 61, 62, 63, 64, 0, 0, 66, 67, 68, 69, - 70, 0, 0, 0, 74, 0, 0, 77, 539, 540, - 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, - 551, 678, 553, 554, 555, 556, 0, 0, 0, 0, - 557, 0, 0, 0, 0, 1807, 0, 0, 1808, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 241, 377, - 378, 379, 242, 243, 0, 0, 0, 244, 245, 246, - 380, 247, 248, 249, 381, 0, 382, 108, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1835, - 1836, 0, 1838, 250, 251, 2041, 0, 0, 0, 0, - 252, 0, 0, 0, 0, 337, 0, 0, 0, 1521, - 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, - 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 678, 553, 554, 555, 556, 0, 0, - 0, 0, 557, 0, 0, 0, 0, 0, 0, 0, - 0, 1879, 1880, 0, 0, 189, 6, 356, 0, 0, - 0, 0, 190, 191, 192, 0, 0, 193, 194, 195, + 0, 469, 0, 187, 150, 354, 0, 403, 0, 0, + 188, 189, 190, 0, 0, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 0, 1910, 357, 358, - 359, 360, 361, 362, 363, 364, 365, 222, 223, 224, - 225, 366, 367, 368, 369, 226, 227, 0, 0, 370, - 371, 372, 0, 0, 373, 0, 374, 228, 229, 230, - 0, 0, 0, 0, 0, 231, 21, 375, 232, 0, - 376, 0, 0, 233, 0, 0, 234, 0, 0, 235, - 0, 236, 0, 0, 0, 0, 0, 0, 37, 0, - 0, 0, 237, 0, 0, 0, 0, 0, 0, 0, - 0, 238, 0, 50, 0, 0, 239, 0, 240, 0, - 0, 0, 0, 0, 0, 60, 61, 62, 63, 64, - 0, 0, 66, 67, 68, 69, 70, 0, 0, 0, - 74, 0, 0, 77, 0, 539, 540, 541, 542, 543, - 544, 545, 546, 547, 548, 549, 550, 551, 678, 553, - 554, 555, 556, 0, 0, 0, 0, 557, 0, 0, + 206, 207, 390, 209, 210, 211, 212, 213, 214, 0, + 0, 0, 0, 0, 1310, 0, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 220, 221, 222, 223, 364, + 365, 366, 367, 224, 0, 0, 0, 368, 369, 370, + 0, 0, 371, 0, 372, 226, 227, 228, 0, 0, + 0, 0, 229, 20, 373, 230, 0, 374, 0, 0, + 1212, 1214, 1215, 0, 0, 0, 1219, 1220, 0, 0, + 1223, 1224, 1225, 1226, 0, 1228, 0, 0, 0, 0, + 1234, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 404, 0, 0, 0, 0, + 0, 0, 0, 1360, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 526, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 469, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 676, 551, 552, 553, 554, 0, 0, + 0, 0, 555, 0, 405, 0, 0, 0, 0, 1315, + 1316, 239, 375, 376, 377, 240, 0, 0, 0, 0, + 242, 243, 244, 378, 245, 246, 247, 379, 0, 380, + 107, 406, 407, 408, 409, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 248, 391, 0, 0, + 0, 469, 0, 250, 0, 410, 411, 0, 412, 0, + 413, 187, 150, 0, 414, 253, 469, 0, 188, 189, + 190, 0, 0, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 390, 209, 210, 211, 212, 213, 214, 0, 0, 0, + 0, 0, 0, 0, 0, 1371, 1483, 1484, 0, 0, + 0, 0, 0, 220, 221, 222, 223, 0, 0, 0, + 0, 224, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 226, 227, 228, 0, 0, 0, 0, + 229, 20, 0, 230, 0, 0, 0, 0, 0, 0, + 187, 150, 0, 0, 0, 0, 0, 188, 189, 190, + 0, 0, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 390, + 209, 210, 211, 212, 213, 214, 0, 1565, 0, 0, + 0, 0, 469, 469, 469, 469, 469, 1573, 0, 0, + 0, 0, 220, 221, 222, 223, 0, 0, 0, 0, + 224, 0, 1993, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 226, 227, 228, 0, 0, 0, 0, 229, + 20, 0, 230, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1482, 0, 0, 0, 0, 239, + 0, 469, 0, 240, 0, 0, 0, 0, 242, 243, + 244, 0, 245, 246, 247, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 241, 377, 378, 379, 242, 243, - 0, 0, 0, 244, 245, 246, 380, 247, 248, 249, - 381, 0, 382, 108, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, - 251, 0, 0, 0, 0, 0, 252, 0, 0, 0, - 0, 337, 0, 0, 0, 254, 0, 0, 255, 539, - 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 678, 553, 554, 555, 556, 189, 6, 336, - 0, 557, 0, 0, 190, 191, 192, 769, 2076, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220, 221, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, - 223, 224, 225, 0, 0, 0, 0, 226, 227, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, - 229, 230, 0, 0, 7, 8, 0, 231, 21, 0, - 232, 0, 0, 0, 0, 233, 0, 0, 234, 0, - 0, 235, 0, 236, 0, 0, 0, 0, 0, 0, - 37, 0, 0, 0, 237, 0, 0, 0, 0, 0, - 0, 0, 0, 238, 0, 50, 0, 0, 239, 0, - 240, 0, 0, 0, 0, 0, 0, 60, 61, 62, - 63, 64, 0, 0, 66, 67, 68, 69, 70, 0, - 0, 0, 74, 0, 0, 77, 0, 0, 0, 0, - 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 0, 0, 0, 38, 39, - 40, 41, 0, 0, 43, 0, 0, 0, 0, 0, - 717, 49, 0, 0, 51, 718, 241, 719, 720, 0, - 242, 243, 0, 0, 0, 244, 245, 246, 0, 247, - 248, 249, 0, 0, 0, 108, 71, 0, 0, 0, + 0, 1517, 0, 0, 248, 391, 0, 0, 0, 0, + 0, 250, 0, 0, 0, 0, 335, 0, 0, 0, + 576, 0, 0, 253, 0, 0, 0, 0, 0, 1549, + 1550, 1551, 1552, 1553, 0, 0, 0, 0, 1558, 1559, + 0, 0, 1561, 0, 1563, 0, 0, 0, 1567, 0, + 0, 1569, 0, 0, 0, 0, 0, 0, 239, 0, + 0, 0, 240, 1577, 0, 0, 0, 242, 243, 244, + 1703, 245, 246, 247, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 250, 251, 0, 0, 0, 0, 0, 252, 0, - 85, 86, 87, 337, 189, 6, 0, 338, 0, 632, - 255, 190, 191, 192, 0, 0, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 222, 223, 224, 225, - 0, 0, 0, 0, 226, 227, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 897, 228, 229, 230, 0, - 0, 7, 8, 0, 231, 21, 0, 232, 0, 0, - 0, 0, 233, 0, 0, 234, 0, 0, 235, 0, - 236, 0, 0, 0, 0, 0, 0, 37, 0, 0, - 0, 237, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 50, 0, 0, 239, 0, 240, 0, 0, - 0, 0, 0, 0, 60, 61, 62, 63, 64, 0, - 0, 66, 67, 68, 69, 70, 0, 0, 0, 74, - 0, 0, 77, 0, 0, 0, 0, 0, 0, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 0, 0, 0, 38, 39, 40, 41, 0, - 0, 43, 0, 0, 0, 0, 0, 717, 49, 0, - 0, 51, 718, 241, 719, 720, 0, 242, 243, 0, - 0, 0, 244, 245, 246, 0, 247, 248, 249, 0, - 0, 0, 108, 71, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 250, 469, - 0, 0, 0, 0, 0, 252, 0, 85, 86, 87, - 337, 189, 6, 1611, 0, 531, 0, 255, 190, 191, - 192, 0, 0, 193, 194, 195, 196, 197, 198, 199, + 0, 0, 0, 594, 595, 0, 0, 0, 0, 0, + 250, 0, 0, 0, 0, 596, 0, 0, 0, 297, + 0, 0, 253, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2039, 0, + 0, 0, 1635, 0, 1638, 0, 0, 0, 1645, 0, + 1647, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1672, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, + 6, 354, 0, 0, 0, 0, 188, 189, 190, 0, + 0, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - 220, 221, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 222, 223, 224, 225, 0, 0, 0, - 0, 226, 227, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 919, 228, 229, 230, 0, 0, 7, 8, - 0, 231, 21, 0, 232, 0, 0, 0, 0, 233, - 0, 0, 234, 0, 0, 235, 0, 236, 0, 0, - 0, 0, 0, 0, 37, 0, 0, 0, 237, 0, - 0, 0, 0, 0, 0, 0, 0, 238, 0, 50, - 0, 0, 239, 0, 240, 0, 0, 0, 0, 0, - 0, 60, 61, 62, 63, 64, 0, 0, 66, 67, - 68, 69, 70, 0, 0, 0, 74, 0, 0, 77, - 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 0, - 0, 0, 38, 39, 40, 41, 0, 0, 43, 0, - 0, 0, 0, 0, 717, 49, 0, 0, 51, 718, - 241, 719, 720, 0, 242, 243, 0, 0, 0, 244, - 245, 246, 0, 247, 248, 249, 0, 0, 0, 108, - 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 250, 251, 0, 0, 0, - 0, 0, 252, 0, 85, 86, 87, 337, 189, 6, - 0, 254, 0, 0, 255, 190, 191, 192, 0, 0, + 1828, 536, 1518, 356, 357, 358, 359, 360, 361, 362, + 363, 220, 221, 222, 223, 364, 365, 366, 367, 224, + 225, 0, 0, 368, 369, 370, 0, 0, 371, 0, + 372, 226, 227, 228, 1726, 0, 0, 0, 229, 20, + 373, 230, 0, 374, 0, 0, 231, 0, 0, 232, + 0, 0, 233, 0, 234, 0, 0, 0, 0, 0, + 0, 36, 0, 0, 0, 235, 0, 0, 0, 0, + 0, 0, 0, 0, 236, 0, 49, 0, 0, 237, + 0, 238, 0, 0, 0, 0, 0, 0, 59, 60, + 61, 62, 63, 0, 0, 65, 66, 67, 68, 69, + 0, 0, 0, 73, 0, 0, 76, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 676, 551, 552, 553, 554, 0, 0, 0, 0, 555, + 0, 0, 0, 0, 1805, 0, 0, 1806, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 239, 375, 376, + 377, 240, 241, 0, 0, 0, 242, 243, 244, 378, + 245, 246, 247, 379, 0, 380, 107, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1833, 1834, + 0, 1836, 248, 249, 0, 536, 0, 0, 0, 250, + 0, 0, 0, 0, 335, 0, 0, 0, 1519, 0, + 0, 253, 0, 0, 0, 0, 0, 0, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 770, 551, 552, 553, 554, 0, 0, 0, 0, + 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1877, 1878, 0, 0, 187, 6, 354, 0, 0, 0, + 0, 188, 189, 190, 0, 0, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 0, 1908, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 220, 221, 222, 223, + 364, 365, 366, 367, 224, 225, 0, 0, 368, 369, + 370, 0, 0, 371, 0, 372, 226, 227, 228, 0, + 0, 0, 0, 229, 20, 373, 230, 0, 374, 0, + 0, 231, 0, 0, 232, 0, 0, 233, 0, 234, + 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, + 235, 0, 0, 0, 0, 0, 0, 0, 0, 236, + 0, 49, 0, 0, 237, 0, 238, 0, 0, 0, + 0, 0, 0, 59, 60, 61, 62, 63, 0, 0, + 65, 66, 67, 68, 69, 0, 0, 0, 73, 0, + 0, 76, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 239, 375, 376, 377, 240, 241, 0, 0, + 0, 242, 243, 244, 378, 245, 246, 247, 379, 0, + 380, 107, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 248, 249, 0, + 0, 0, 0, 0, 250, 0, 0, 0, 0, 335, + 0, 0, 0, 252, 0, 0, 253, 0, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 676, 551, 552, 553, 554, 187, 6, 334, 0, + 555, 0, 0, 188, 189, 190, 767, 2074, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 222, 223, 224, 225, 0, 0, 0, 0, 226, 227, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 966, - 228, 229, 230, 0, 0, 7, 8, 0, 231, 21, - 0, 232, 0, 0, 0, 0, 233, 0, 0, 234, - 0, 0, 235, 0, 236, 0, 0, 0, 0, 0, - 0, 37, 0, 0, 0, 237, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 50, 0, 0, 239, - 0, 240, 0, 0, 0, 0, 0, 0, 60, 61, - 62, 63, 64, 0, 0, 66, 67, 68, 69, 70, - 0, 0, 0, 74, 0, 0, 77, 0, 0, 0, - 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 0, 0, 0, 38, - 39, 40, 41, 0, 0, 43, 0, 0, 0, 0, - 0, 717, 49, 0, 0, 51, 718, 241, 719, 720, - 0, 242, 243, 0, 0, 0, 244, 245, 246, 0, - 247, 248, 249, 0, 0, 0, 108, 71, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 596, 1764, 0, 0, 0, 0, 0, 252, - 0, 85, 86, 87, 598, 189, 6, 0, 299, 531, - 0, 255, 190, 191, 192, 0, 0, 193, 194, 195, - 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 222, 223, 224, - 225, 0, 0, 0, 0, 226, 227, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 968, 228, 229, 230, - 0, 0, 7, 8, 0, 231, 21, 0, 232, 0, - 0, 0, 0, 233, 0, 0, 234, 0, 0, 235, - 0, 236, 0, 0, 0, 0, 0, 0, 37, 0, - 0, 0, 237, 0, 0, 0, 0, 0, 0, 0, - 0, 238, 0, 50, 0, 0, 239, 0, 240, 0, - 0, 0, 0, 0, 0, 60, 61, 62, 63, 64, - 0, 0, 66, 67, 68, 69, 70, 0, 0, 0, - 74, 0, 0, 77, 0, 0, 0, 0, 0, 0, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 0, 0, 0, 38, 39, 40, 41, - 0, 0, 43, 0, 0, 0, 0, 0, 717, 49, - 0, 0, 51, 718, 241, 719, 720, 0, 242, 243, - 0, 0, 0, 244, 245, 246, 0, 247, 248, 249, - 0, 0, 0, 108, 71, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, - 251, 0, 0, 0, 0, 0, 252, 0, 85, 86, - 87, 253, 189, 6, 0, 254, 0, 0, 255, 190, - 191, 192, 0, 0, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 222, 223, 224, 225, 0, 0, - 0, 0, 226, 227, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1157, 228, 229, 230, 0, 0, 7, - 8, 0, 231, 21, 0, 232, 0, 0, 0, 0, - 233, 0, 0, 234, 0, 0, 235, 0, 236, 0, - 0, 0, 0, 0, 0, 37, 0, 0, 0, 237, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 50, 0, 0, 239, 0, 240, 0, 0, 0, 0, - 0, 0, 60, 61, 62, 63, 64, 0, 0, 66, - 67, 68, 69, 70, 0, 0, 0, 74, 0, 0, - 77, 0, 0, 0, 0, 0, 0, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 0, 0, 0, 38, 39, 40, 41, 0, 0, 43, - 0, 0, 0, 0, 0, 717, 49, 0, 0, 51, - 718, 241, 719, 720, 0, 242, 243, 0, 0, 0, - 244, 245, 246, 0, 247, 248, 249, 0, 0, 0, - 108, 71, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 250, 251, 0, 0, - 0, 0, 0, 252, 0, 85, 86, 87, 337, 189, - 6, 0, 254, 0, 0, 255, 190, 191, 192, 0, - 0, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 213, 214, 215, 216, 217, 218, 219, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 220, 221, + 222, 223, 0, 0, 0, 0, 224, 225, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 226, 227, + 228, 0, 0, 7, 8, 229, 20, 0, 230, 0, + 0, 0, 0, 231, 0, 0, 232, 0, 0, 233, + 0, 234, 0, 0, 0, 0, 0, 0, 36, 0, + 0, 0, 235, 0, 0, 0, 0, 0, 0, 0, + 0, 236, 0, 49, 0, 0, 237, 0, 238, 0, + 0, 0, 0, 0, 0, 59, 60, 61, 62, 63, + 0, 0, 65, 66, 67, 68, 69, 0, 0, 0, + 73, 0, 0, 76, 0, 0, 0, 0, 0, 0, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 0, 0, 0, 37, 38, 39, 40, + 0, 0, 42, 0, 0, 0, 0, 0, 715, 48, + 0, 0, 50, 716, 239, 717, 718, 0, 240, 241, + 0, 0, 0, 242, 243, 244, 0, 245, 246, 247, + 0, 0, 0, 107, 70, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, + 249, 0, 0, 0, 0, 0, 250, 0, 84, 85, + 86, 335, 187, 6, 0, 336, 0, 630, 253, 188, + 189, 190, 0, 0, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 220, 221, 222, 223, 0, 0, + 0, 0, 224, 225, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 917, 226, 227, 228, 0, 0, 7, + 8, 229, 20, 0, 230, 0, 0, 0, 0, 231, + 0, 0, 232, 0, 0, 233, 0, 234, 0, 0, + 0, 0, 0, 0, 36, 0, 0, 0, 235, 0, + 0, 0, 0, 0, 0, 0, 0, 236, 0, 49, + 0, 0, 237, 0, 238, 0, 0, 0, 0, 0, + 0, 59, 60, 61, 62, 63, 0, 0, 65, 66, + 67, 68, 69, 0, 0, 0, 73, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 0, + 0, 0, 37, 38, 39, 40, 0, 0, 42, 0, + 0, 0, 0, 0, 715, 48, 0, 0, 50, 716, + 239, 717, 718, 0, 240, 241, 0, 0, 0, 242, + 243, 244, 0, 245, 246, 247, 0, 0, 0, 107, + 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 248, 467, 0, 0, 0, + 0, 0, 250, 0, 84, 85, 86, 335, 187, 6, + 1609, 0, 529, 0, 253, 188, 189, 190, 0, 0, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 222, 223, 224, 225, 0, 0, 0, 0, 226, - 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1159, 228, 229, 230, 0, 0, 7, 8, 0, 231, - 21, 0, 232, 0, 0, 0, 0, 233, 0, 0, - 234, 0, 0, 235, 0, 236, 0, 0, 0, 0, - 0, 0, 37, 0, 0, 0, 237, 0, 0, 0, - 0, 0, 0, 0, 0, 238, 0, 50, 0, 0, - 239, 0, 240, 0, 0, 0, 0, 0, 0, 60, - 61, 62, 63, 64, 0, 0, 66, 67, 68, 69, - 70, 0, 0, 0, 74, 0, 0, 77, 0, 0, - 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 0, 0, 0, - 38, 39, 40, 41, 0, 0, 43, 0, 0, 0, - 0, 0, 717, 49, 0, 0, 51, 718, 241, 719, - 720, 0, 242, 243, 0, 0, 0, 244, 245, 246, - 0, 247, 248, 249, 0, 0, 0, 108, 71, 0, + 220, 221, 222, 223, 0, 0, 0, 0, 224, 225, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 964, + 226, 227, 228, 0, 0, 7, 8, 229, 20, 0, + 230, 0, 0, 0, 0, 231, 0, 0, 232, 0, + 0, 233, 0, 234, 0, 0, 0, 0, 0, 0, + 36, 0, 0, 0, 235, 0, 0, 0, 0, 0, + 0, 0, 0, 236, 0, 49, 0, 0, 237, 0, + 238, 0, 0, 0, 0, 0, 0, 59, 60, 61, + 62, 63, 0, 0, 65, 66, 67, 68, 69, 0, + 0, 0, 73, 0, 0, 76, 0, 0, 0, 0, + 0, 0, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 0, 0, 0, 37, 38, + 39, 40, 0, 0, 42, 0, 0, 0, 0, 0, + 715, 48, 0, 0, 50, 716, 239, 717, 718, 0, + 240, 241, 0, 0, 0, 242, 243, 244, 0, 245, + 246, 247, 0, 0, 0, 107, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 250, 469, 0, 0, 0, 0, 0, - 252, 0, 85, 86, 87, 337, 189, 6, 0, 526, - 0, 0, 255, 190, 191, 192, 0, 0, 193, 194, + 0, 248, 249, 0, 0, 0, 0, 0, 250, 0, + 84, 85, 86, 335, 187, 6, 0, 252, 0, 0, + 253, 188, 189, 190, 0, 0, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 222, 223, - 224, 225, 0, 0, 0, 0, 226, 227, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1160, 228, 229, - 230, 0, 0, 7, 8, 0, 231, 21, 0, 232, - 0, 0, 0, 0, 233, 0, 0, 234, 0, 0, - 235, 0, 236, 0, 0, 0, 0, 0, 0, 37, - 0, 0, 0, 237, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 50, 0, 0, 239, 0, 240, - 0, 0, 0, 0, 0, 0, 60, 61, 62, 63, - 64, 0, 0, 66, 67, 68, 69, 70, 0, 0, - 0, 74, 0, 0, 77, 0, 0, 0, 0, 0, - 0, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 0, 0, 0, 38, 39, 40, - 41, 0, 0, 43, 0, 0, 0, 0, 0, 717, - 49, 0, 0, 51, 718, 241, 719, 720, 0, 242, - 243, 0, 0, 0, 244, 245, 246, 0, 247, 248, - 249, 0, 0, 0, 108, 71, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 250, 469, 0, 0, 0, 0, 0, 252, 0, 85, - 86, 87, 337, 189, 6, 0, 0, 531, 0, 255, - 190, 191, 192, 0, 0, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 222, 223, 224, 225, 0, - 0, 0, 0, 226, 227, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1179, 228, 229, 230, 0, 0, - 7, 8, 0, 231, 21, 0, 232, 0, 0, 0, - 0, 233, 0, 0, 234, 0, 0, 235, 0, 236, - 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, - 237, 0, 0, 0, 0, 0, 0, 0, 0, 238, - 0, 50, 0, 0, 239, 0, 240, 0, 0, 0, - 0, 0, 0, 60, 61, 62, 63, 64, 0, 0, - 66, 67, 68, 69, 70, 0, 0, 0, 74, 0, - 0, 77, 0, 0, 0, 0, 0, 0, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 0, 0, 0, 38, 39, 40, 41, 0, 0, - 43, 0, 0, 0, 0, 0, 717, 49, 0, 0, - 51, 718, 241, 719, 720, 0, 242, 243, 0, 0, - 0, 244, 245, 246, 0, 247, 248, 249, 0, 0, - 0, 108, 71, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 250, 251, 0, - 0, 0, 0, 0, 252, 0, 85, 86, 87, 568, - 189, 6, 0, 254, 0, 0, 255, 190, 191, 192, - 0, 0, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, - 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 222, 223, 224, 225, 0, 0, 0, 0, - 226, 227, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1209, 228, 229, 230, 0, 0, 7, 8, 0, - 231, 21, 0, 232, 0, 0, 0, 0, 233, 0, - 0, 234, 0, 0, 235, 0, 236, 0, 0, 0, - 0, 0, 0, 37, 0, 0, 0, 237, 0, 0, - 0, 0, 0, 0, 0, 0, 238, 0, 50, 0, - 0, 239, 0, 240, 0, 0, 0, 0, 0, 0, - 60, 61, 62, 63, 64, 0, 0, 66, 67, 68, - 69, 70, 0, 0, 0, 74, 0, 0, 77, 0, - 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 0, 0, - 0, 38, 39, 40, 41, 0, 0, 43, 0, 0, - 0, 0, 0, 717, 49, 0, 0, 51, 718, 241, - 719, 720, 0, 242, 243, 0, 0, 0, 244, 245, - 246, 0, 247, 248, 249, 0, 0, 0, 108, 71, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 250, 251, 0, 0, 0, 0, - 0, 252, 0, 85, 86, 87, 575, 189, 6, 0, - 254, 0, 0, 255, 190, 191, 192, 0, 0, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, 220, 221, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, - 223, 224, 225, 0, 0, 0, 0, 226, 227, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1242, 228, - 229, 230, 0, 0, 7, 8, 0, 231, 21, 0, - 232, 0, 0, 0, 0, 233, 0, 0, 234, 0, - 0, 235, 0, 236, 0, 0, 0, 0, 0, 0, - 37, 0, 0, 0, 237, 0, 0, 0, 0, 0, - 0, 0, 0, 238, 0, 50, 0, 0, 239, 0, - 240, 0, 0, 0, 0, 0, 0, 60, 61, 62, - 63, 64, 0, 0, 66, 67, 68, 69, 70, 0, - 0, 0, 74, 0, 0, 77, 0, 0, 0, 0, - 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 0, 0, 0, 38, 39, - 40, 41, 0, 0, 43, 937, 0, 0, 0, 0, - 717, 49, 0, 0, 51, 718, 241, 719, 720, 0, - 242, 243, 0, 0, 0, 244, 245, 246, 0, 247, - 248, 249, 0, 0, 0, 108, 71, 0, 0, 0, + 215, 216, 217, 218, 219, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 220, 221, 222, 223, + 0, 0, 0, 0, 224, 225, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 966, 226, 227, 228, 0, + 0, 7, 8, 229, 20, 0, 230, 0, 0, 0, + 0, 231, 0, 0, 232, 0, 0, 233, 0, 234, + 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, + 235, 0, 0, 0, 0, 0, 0, 0, 0, 236, + 0, 49, 0, 0, 237, 0, 238, 0, 0, 0, + 0, 0, 0, 59, 60, 61, 62, 63, 0, 0, + 65, 66, 67, 68, 69, 0, 0, 0, 73, 0, + 0, 76, 0, 0, 0, 0, 0, 0, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 0, 0, 0, 37, 38, 39, 40, 0, 0, + 42, 0, 0, 0, 0, 0, 715, 48, 0, 0, + 50, 716, 239, 717, 718, 0, 240, 241, 0, 0, + 0, 242, 243, 244, 0, 245, 246, 247, 0, 0, + 0, 107, 70, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 594, 1762, 0, + 0, 0, 0, 0, 250, 0, 84, 85, 86, 596, + 187, 6, 0, 297, 529, 0, 253, 188, 189, 190, + 0, 0, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 220, 221, 222, 223, 0, 0, 0, 0, + 224, 225, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1155, 226, 227, 228, 0, 0, 7, 8, 229, + 20, 0, 230, 0, 0, 0, 0, 231, 0, 0, + 232, 0, 0, 233, 0, 234, 0, 0, 0, 0, + 0, 0, 36, 0, 0, 0, 235, 0, 0, 0, + 0, 0, 0, 0, 0, 236, 0, 49, 0, 0, + 237, 0, 238, 0, 0, 0, 0, 0, 0, 59, + 60, 61, 62, 63, 0, 0, 65, 66, 67, 68, + 69, 0, 0, 0, 73, 0, 0, 76, 0, 0, + 0, 0, 0, 0, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 0, 0, 0, + 37, 38, 39, 40, 0, 0, 42, 0, 0, 0, + 0, 0, 715, 48, 0, 0, 50, 716, 239, 717, + 718, 0, 240, 241, 0, 0, 0, 242, 243, 244, + 0, 245, 246, 247, 0, 0, 0, 107, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 250, 469, 0, 0, 0, 0, 0, 252, 0, - 85, 86, 87, 337, 189, 6, 0, 851, 0, 1299, - 255, 190, 191, 192, 0, 0, 193, 194, 195, 196, + 0, 0, 0, 248, 249, 0, 0, 0, 0, 0, + 250, 0, 84, 85, 86, 251, 187, 6, 0, 252, + 0, 0, 253, 188, 189, 190, 0, 0, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 220, 221, + 222, 223, 0, 0, 0, 0, 224, 225, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1157, 226, 227, + 228, 0, 0, 7, 8, 229, 20, 0, 230, 0, + 0, 0, 0, 231, 0, 0, 232, 0, 0, 233, + 0, 234, 0, 0, 0, 0, 0, 0, 36, 0, + 0, 0, 235, 0, 0, 0, 0, 0, 0, 0, + 0, 236, 0, 49, 0, 0, 237, 0, 238, 0, + 0, 0, 0, 0, 0, 59, 60, 61, 62, 63, + 0, 0, 65, 66, 67, 68, 69, 0, 0, 0, + 73, 0, 0, 76, 0, 0, 0, 0, 0, 0, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 0, 0, 0, 37, 38, 39, 40, + 0, 0, 42, 0, 0, 0, 0, 0, 715, 48, + 0, 0, 50, 716, 239, 717, 718, 0, 240, 241, + 0, 0, 0, 242, 243, 244, 0, 245, 246, 247, + 0, 0, 0, 107, 70, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, + 249, 0, 0, 0, 0, 0, 250, 0, 84, 85, + 86, 335, 187, 6, 0, 252, 0, 0, 253, 188, + 189, 190, 0, 0, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 222, 223, 224, 225, - 0, 0, 0, 0, 226, 227, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1390, 228, 229, 230, 0, - 0, 0, 0, 0, 231, 21, 0, 232, 0, 0, - 0, 0, 233, 0, 0, 234, 0, 0, 235, 0, - 236, 0, 0, 0, 0, 0, 0, 37, 0, 0, - 0, 237, 0, 0, 0, 0, 0, 0, 0, 0, - 238, 0, 50, 0, 0, 239, 0, 240, 0, 0, - 0, 0, 0, 0, 60, 61, 62, 63, 64, 0, - 0, 66, 67, 68, 69, 70, 0, 0, 0, 74, - 0, 0, 77, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 678, 553, 554, 555, - 556, 0, 0, 0, 0, 557, 0, 1127, 0, 0, + 217, 218, 219, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 220, 221, 222, 223, 0, 0, + 0, 0, 224, 225, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1158, 226, 227, 228, 0, 0, 7, + 8, 229, 20, 0, 230, 0, 0, 0, 0, 231, + 0, 0, 232, 0, 0, 233, 0, 234, 0, 0, + 0, 0, 0, 0, 36, 0, 0, 0, 235, 0, + 0, 0, 0, 0, 0, 0, 0, 236, 0, 49, + 0, 0, 237, 0, 238, 0, 0, 0, 0, 0, + 0, 59, 60, 61, 62, 63, 0, 0, 65, 66, + 67, 68, 69, 0, 0, 0, 73, 0, 0, 76, + 0, 0, 0, 0, 0, 0, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 0, + 0, 0, 37, 38, 39, 40, 0, 0, 42, 0, + 0, 0, 0, 0, 715, 48, 0, 0, 50, 716, + 239, 717, 718, 0, 240, 241, 0, 0, 0, 242, + 243, 244, 0, 245, 246, 247, 0, 0, 0, 107, + 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 248, 467, 0, 0, 0, + 0, 0, 250, 0, 84, 85, 86, 335, 187, 6, + 0, 524, 0, 0, 253, 188, 189, 190, 0, 0, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 241, 0, 0, 0, 242, 243, 0, - 0, 0, 244, 245, 246, 0, 247, 248, 249, 0, - 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 250, 469, - 0, 0, 0, 0, 0, 252, 189, 6, 0, 0, - 337, 1501, 0, 190, 191, 192, 0, 255, 193, 194, + 220, 221, 222, 223, 0, 0, 0, 0, 224, 225, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1177, + 226, 227, 228, 0, 0, 7, 8, 229, 20, 0, + 230, 0, 0, 0, 0, 231, 0, 0, 232, 0, + 0, 233, 0, 234, 0, 0, 0, 0, 0, 0, + 36, 0, 0, 0, 235, 0, 0, 0, 0, 0, + 0, 0, 0, 236, 0, 49, 0, 0, 237, 0, + 238, 0, 0, 0, 0, 0, 0, 59, 60, 61, + 62, 63, 0, 0, 65, 66, 67, 68, 69, 0, + 0, 0, 73, 0, 0, 76, 0, 0, 0, 0, + 0, 0, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 0, 0, 0, 37, 38, + 39, 40, 0, 0, 42, 0, 0, 0, 0, 0, + 715, 48, 0, 0, 50, 716, 239, 717, 718, 0, + 240, 241, 0, 0, 0, 242, 243, 244, 0, 245, + 246, 247, 0, 0, 0, 107, 70, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 248, 467, 0, 0, 0, 0, 0, 250, 0, + 84, 85, 86, 335, 187, 6, 0, 0, 529, 0, + 253, 188, 189, 190, 0, 0, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 220, 221, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 222, 223, - 224, 225, 0, 0, 0, 0, 226, 227, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 229, - 230, 0, 0, 0, 0, 0, 231, 21, 0, 232, - 0, 0, 0, 0, 233, 0, 0, 234, 0, 0, - 235, 0, 236, 0, 0, 0, 0, 0, 0, 37, - 0, 0, 0, 237, 0, 0, 0, 0, 0, 0, - 0, 0, 238, 0, 50, 0, 0, 239, 0, 240, - 0, 0, 0, 0, 0, 0, 60, 61, 62, 63, - 64, 0, 0, 66, 67, 68, 69, 70, 0, 0, - 0, 74, 0, 0, 77, 539, 540, 541, 542, 543, - 544, 545, 546, 547, 548, 549, 550, 551, 678, 553, - 554, 555, 556, 0, 0, 0, 0, 557, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 241, 0, 0, 0, 242, - 243, 0, 0, 0, 244, 245, 246, 0, 247, 248, - 249, 0, 0, 0, 108, 0, 0, 0, 0, 0, + 215, 216, 217, 218, 219, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 220, 221, 222, 223, + 0, 0, 0, 0, 224, 225, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1207, 226, 227, 228, 0, + 0, 7, 8, 229, 20, 0, 230, 0, 0, 0, + 0, 231, 0, 0, 232, 0, 0, 233, 0, 234, + 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, + 235, 0, 0, 0, 0, 0, 0, 0, 0, 236, + 0, 49, 0, 0, 237, 0, 238, 0, 0, 0, + 0, 0, 0, 59, 60, 61, 62, 63, 0, 0, + 65, 66, 67, 68, 69, 0, 0, 0, 73, 0, + 0, 76, 0, 0, 0, 0, 0, 0, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 0, 0, 0, 37, 38, 39, 40, 0, 0, + 42, 0, 0, 0, 0, 0, 715, 48, 0, 0, + 50, 716, 239, 717, 718, 0, 240, 241, 0, 0, + 0, 242, 243, 244, 0, 245, 246, 247, 0, 0, + 0, 107, 70, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 248, 249, 0, + 0, 0, 0, 0, 250, 0, 84, 85, 86, 566, + 187, 6, 0, 252, 0, 0, 253, 188, 189, 190, + 0, 0, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 220, 221, 222, 223, 0, 0, 0, 0, + 224, 225, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1240, 226, 227, 228, 0, 0, 7, 8, 229, + 20, 0, 230, 0, 0, 0, 0, 231, 0, 0, + 232, 0, 0, 233, 0, 234, 0, 0, 0, 0, + 0, 0, 36, 0, 0, 0, 235, 0, 0, 0, + 0, 0, 0, 0, 0, 236, 0, 49, 0, 0, + 237, 0, 238, 0, 0, 0, 0, 0, 0, 59, + 60, 61, 62, 63, 0, 0, 65, 66, 67, 68, + 69, 0, 0, 0, 73, 0, 0, 76, 0, 0, + 0, 0, 0, 0, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 0, 0, 0, + 37, 38, 39, 40, 0, 0, 42, 0, 0, 0, + 0, 0, 715, 48, 0, 0, 50, 716, 239, 717, + 718, 0, 240, 241, 0, 0, 0, 242, 243, 244, + 0, 245, 246, 247, 0, 0, 0, 107, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 250, 469, 0, 0, 0, 0, 0, 252, 189, 6, - 0, 0, 337, 0, 0, 190, 191, 192, 0, 255, + 0, 0, 0, 248, 249, 0, 0, 0, 0, 0, + 250, 0, 84, 85, 86, 573, 187, 6, 0, 252, + 0, 0, 253, 188, 189, 190, 0, 0, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, 220, 221, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 222, 223, 224, 225, 0, 0, 0, 0, 226, 227, + 213, 214, 215, 216, 217, 218, 219, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 220, 221, + 222, 223, 0, 0, 0, 0, 224, 225, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1388, 226, 227, + 228, 0, 0, 7, 8, 229, 20, 0, 230, 0, + 0, 0, 0, 231, 0, 0, 232, 0, 0, 233, + 0, 234, 0, 0, 0, 0, 0, 0, 36, 0, + 0, 0, 235, 0, 0, 0, 0, 0, 0, 0, + 0, 236, 0, 49, 0, 0, 237, 0, 238, 0, + 0, 0, 0, 0, 0, 59, 60, 61, 62, 63, + 0, 0, 65, 66, 67, 68, 69, 0, 0, 0, + 73, 0, 0, 76, 0, 0, 0, 0, 0, 0, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 0, 0, 0, 37, 38, 39, 40, + 0, 0, 42, 536, 0, 0, 0, 0, 715, 48, + 0, 0, 50, 716, 239, 717, 718, 0, 240, 241, + 0, 0, 0, 242, 243, 244, 0, 245, 246, 247, + 0, 0, 0, 107, 70, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, + 467, 0, 0, 0, 0, 0, 250, 0, 84, 85, + 86, 335, 187, 6, 0, 849, 0, 1297, 253, 188, + 189, 190, 0, 0, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 220, 221, 222, 223, 0, 0, + 0, 0, 224, 225, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1984, 226, 227, 228, 0, 0, 0, + 0, 229, 20, 0, 230, 0, 0, 0, 0, 231, + 0, 0, 232, 0, 0, 233, 0, 234, 0, 0, + 0, 0, 0, 0, 36, 0, 0, 0, 235, 0, + 0, 0, 0, 0, 0, 0, 0, 236, 0, 49, + 0, 0, 237, 0, 238, 0, 0, 0, 0, 0, + 0, 59, 60, 61, 62, 63, 0, 0, 65, 66, + 67, 68, 69, 0, 0, 0, 73, 0, 0, 76, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 770, 551, 552, 553, 554, 0, 0, + 0, 0, 555, 0, 935, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 228, 229, 230, 0, 0, 7, 8, 0, 231, 21, - 0, 232, 0, 0, 0, 0, 233, 0, 0, 234, - 0, 0, 235, 0, 236, 0, 0, 0, 0, 0, - 0, 37, 0, 0, 0, 237, 0, 0, 0, 0, - 0, 0, 0, 0, 238, 0, 50, 0, 0, 239, - 0, 240, 0, 0, 0, 0, 0, 0, 60, 61, - 62, 63, 64, 0, 0, 66, 67, 68, 69, 70, - 0, 0, 0, 74, 0, 0, 77, 0, 0, 0, - 0, 0, 0, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 0, 0, 0, 38, - 39, 40, 41, 0, 0, 43, 0, 0, 0, 0, - 0, 717, 49, 0, 0, 51, 718, 241, 719, 720, - 0, 242, 243, 0, 0, 0, 244, 245, 246, 0, - 247, 248, 249, 0, 0, 0, 108, 71, 0, 0, + 239, 0, 0, 0, 240, 241, 0, 0, 0, 242, + 243, 244, 0, 245, 246, 247, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 250, 251, 0, 0, 0, 0, 0, 252, - 0, 85, 86, 87, 337, 189, 6, 0, 1619, 0, - 0, 255, 190, 191, 192, 0, 0, 193, 194, 195, + 0, 0, 0, 0, 0, 248, 467, 0, 0, 0, + 0, 0, 250, 187, 6, 0, 0, 335, 1499, 0, + 188, 189, 190, 0, 253, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, 220, 221, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 222, 223, 224, - 225, 0, 0, 0, 0, 226, 227, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1986, 228, 229, 230, - 0, 0, 7, 8, 0, 231, 21, 0, 232, 0, - 0, 0, 0, 233, 0, 0, 234, 0, 0, 235, - 0, 236, 0, 0, 0, 0, 0, 0, 37, 0, - 0, 0, 237, 0, 0, 0, 0, 0, 0, 0, - 0, 238, 0, 50, 0, 0, 239, 0, 240, 0, - 0, 0, 0, 0, 0, 60, 61, 62, 63, 64, - 0, 0, 66, 67, 68, 69, 70, 0, 0, 0, - 74, 0, 0, 77, 0, 0, 0, 0, 0, 0, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 0, 0, 0, 38, 39, 40, 41, - 0, 0, 43, 1128, 0, 0, 0, 0, 717, 49, - 0, 0, 51, 718, 241, 719, 720, 0, 242, 243, - 0, 0, 0, 244, 245, 246, 0, 247, 248, 249, - 0, 0, 0, 108, 71, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, - 1764, 0, 0, 0, 0, 0, 252, 0, 85, 86, - 87, 598, 189, 6, 0, 299, 0, 0, 255, 190, - 191, 192, 0, 0, 193, 194, 195, 196, 197, 198, + 216, 217, 218, 219, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 220, 221, 222, 223, 0, + 0, 0, 0, 224, 225, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 226, 227, 228, 0, 0, + 0, 0, 229, 20, 0, 230, 0, 0, 0, 0, + 231, 0, 0, 232, 0, 0, 233, 0, 234, 0, + 0, 0, 0, 0, 0, 36, 0, 0, 0, 235, + 0, 0, 0, 0, 0, 0, 0, 0, 236, 0, + 49, 0, 0, 237, 0, 238, 0, 0, 0, 0, + 0, 0, 59, 60, 61, 62, 63, 0, 0, 65, + 66, 67, 68, 69, 0, 0, 0, 73, 0, 0, + 76, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 239, 0, 0, 0, 240, 241, 0, 0, 0, + 242, 243, 244, 0, 245, 246, 247, 0, 0, 0, + 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 248, 467, 0, 0, + 0, 0, 0, 250, 187, 6, 0, 0, 335, 0, + 0, 188, 189, 190, 0, 253, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 220, 221, 222, 223, + 0, 0, 0, 0, 224, 225, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 226, 227, 228, 0, + 0, 7, 8, 229, 20, 0, 230, 0, 0, 0, + 0, 231, 0, 0, 232, 0, 0, 233, 0, 234, + 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, + 235, 0, 0, 0, 0, 0, 0, 0, 0, 236, + 0, 49, 0, 0, 237, 0, 238, 0, 0, 0, + 0, 0, 0, 59, 60, 61, 62, 63, 0, 0, + 65, 66, 67, 68, 69, 0, 0, 0, 73, 0, + 0, 76, 0, 0, 0, 0, 0, 0, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 0, 0, 0, 37, 38, 39, 40, 0, 0, + 42, 1125, 0, 0, 0, 0, 715, 48, 0, 0, + 50, 716, 239, 717, 718, 0, 240, 241, 0, 0, + 0, 242, 243, 244, 0, 245, 246, 247, 0, 0, + 0, 107, 70, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 248, 249, 0, + 0, 0, 0, 0, 250, 0, 84, 85, 86, 335, + 187, 6, 0, 1617, 0, 0, 253, 188, 189, 190, + 0, 0, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 222, 223, 224, 225, 0, 0, - 0, 0, 226, 227, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2043, 228, 229, 230, 0, 0, 0, - 0, 0, 231, 21, 0, 232, 0, 0, 0, 0, - 233, 0, 0, 234, 0, 0, 235, 0, 236, 0, - 0, 0, 0, 0, 0, 37, 0, 0, 0, 237, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, - 50, 0, 0, 239, 0, 240, 0, 0, 0, 0, - 0, 0, 60, 61, 62, 63, 64, 0, 0, 66, - 67, 68, 69, 70, 0, 0, 0, 74, 0, 0, - 77, 539, 540, 541, 542, 543, 544, 545, 546, 547, - 548, 549, 550, 551, 678, 553, 554, 555, 556, 0, - 0, 0, 0, 557, 0, 0, 0, 0, 0, 0, + 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 220, 221, 222, 223, 0, 0, 0, 0, + 224, 225, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2041, 226, 227, 228, 0, 0, 0, 0, 229, + 20, 0, 230, 0, 0, 0, 0, 231, 0, 0, + 232, 0, 0, 233, 0, 234, 0, 0, 0, 0, + 0, 0, 36, 0, 0, 0, 235, 0, 0, 0, + 0, 0, 0, 0, 0, 236, 0, 49, 0, 0, + 237, 0, 238, 0, 0, 0, 0, 0, 0, 59, + 60, 61, 62, 63, 0, 0, 65, 66, 67, 68, + 69, 0, 0, 0, 73, 0, 0, 76, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 676, 551, 552, 553, 554, 0, 0, 0, 0, + 555, 0, 0, 0, 0, 0, 0, 1126, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 239, 0, + 0, 0, 240, 241, 0, 0, 0, 242, 243, 244, + 0, 245, 246, 247, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 241, 0, 0, 0, 242, 243, 0, 0, 0, - 244, 245, 246, 0, 247, 248, 249, 0, 0, 0, - 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 250, 469, 0, 0, - 0, 0, 0, 252, 189, 152, 356, 0, 337, 0, - 0, 190, 191, 192, 0, 255, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 392, 211, 212, 213, 214, 215, 216, - 1436, 0, 0, 0, 0, 0, 0, 357, 358, 359, - 360, 361, 362, 363, 364, 365, 222, 223, 224, 225, - 366, 367, 368, 369, 226, 0, 0, 0, 370, 371, - 372, 0, 0, 373, 0, 374, 228, 229, 230, 0, - 0, 0, 0, 0, 231, 21, 375, 232, 0, 376, - 189, 152, 356, 0, 0, 0, 0, 190, 191, 192, - 0, 0, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 392, - 211, 212, 213, 214, 215, 216, 0, 0, 0, 0, - 0, 0, 0, 357, 358, 359, 360, 361, 362, 363, - 364, 365, 222, 223, 224, 225, 366, 367, 368, 369, - 226, 0, 0, 0, 370, 371, 372, 0, 0, 373, - 0, 374, 228, 229, 230, 0, 0, 0, 0, 0, - 231, 21, 375, 232, 0, 376, 0, 0, 0, 0, + 0, 0, 0, 594, 1762, 0, 0, 0, 0, 0, + 250, 0, 0, 0, 0, 596, 187, 6, 0, 297, + 0, 0, 253, 188, 189, 190, 0, 0, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 220, 221, + 222, 223, 0, 0, 0, 0, 224, 225, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 226, 227, + 228, 0, 0, 0, 0, 229, 20, 0, 230, 0, + 0, 0, 0, 231, 0, 0, 232, 0, 0, 233, + 0, 234, 0, 0, 0, 0, 0, 0, 36, 0, + 0, 0, 235, 0, 0, 0, 0, 0, 0, 0, + 0, 236, 0, 49, 0, 0, 237, 0, 238, 0, + 0, 0, 0, 0, 0, 59, 60, 61, 62, 63, + 0, 0, 65, 66, 67, 68, 69, 0, 0, 0, + 73, 0, 0, 76, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 676, 551, 552, + 553, 554, 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 241, 377, 378, 379, 242, 0, 0, - 0, 0, 244, 245, 246, 380, 247, 248, 249, 381, - 0, 382, 108, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 250, 393, - 0, 0, 0, 0, 0, 252, 0, 0, 0, 0, - 337, 0, 0, 0, 1516, 0, 0, 255, 539, 540, - 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, - 551, 678, 553, 554, 555, 556, 0, 0, 0, 0, - 557, 0, 0, 0, 0, 0, 0, 0, 0, 241, - 377, 378, 379, 242, 0, 0, 0, 0, 244, 245, - 246, 380, 247, 248, 249, 381, 0, 382, 108, 0, + 0, 0, 0, 0, 239, 0, 0, 0, 240, 241, + 0, 0, 0, 242, 243, 244, 0, 245, 246, 247, + 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, + 467, 0, 0, 0, 0, 0, 250, 187, 150, 354, + 0, 335, 0, 0, 188, 189, 190, 0, 253, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 390, 209, 210, 211, + 212, 213, 214, 1434, 0, 0, 0, 0, 0, 0, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 220, + 221, 222, 223, 364, 365, 366, 367, 224, 0, 0, + 0, 368, 369, 370, 0, 0, 371, 0, 372, 226, + 227, 228, 0, 0, 0, 0, 229, 20, 373, 230, + 0, 374, 187, 150, 354, 0, 0, 0, 0, 188, + 189, 190, 0, 0, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 390, 209, 210, 211, 212, 213, 214, 0, 0, + 0, 0, 0, 0, 0, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 220, 221, 222, 223, 364, 365, + 366, 367, 224, 0, 0, 0, 368, 369, 370, 0, + 0, 371, 0, 372, 226, 227, 228, 0, 0, 0, + 0, 229, 20, 373, 230, 0, 374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 250, 393, 0, 0, 0, 0, - 0, 252, 0, 0, 0, 0, 337, 189, 152, 356, - 1777, 0, 0, 255, 190, 191, 192, 0, 0, 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 392, 211, 212, 213, - 214, 215, 216, 0, 0, 0, 0, 0, 0, 0, - 1520, 358, 359, 360, 361, 362, 363, 364, 365, 222, - 223, 224, 225, 366, 367, 368, 369, 226, 0, 0, - 0, 370, 371, 372, 0, 0, 373, 0, 374, 228, - 229, 230, 0, 0, 0, 0, 0, 231, 21, 375, - 232, 0, 376, 189, 152, 356, 0, 0, 0, 0, - 190, 191, 192, 0, 0, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, - 208, 209, 392, 211, 212, 213, 214, 215, 216, 0, - 0, 0, 0, 0, 0, 0, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 222, 223, 224, 225, 366, - 367, 368, 369, 226, 0, 0, 0, 370, 371, 372, - 0, 0, 373, 0, 374, 228, 229, 230, 1380, 0, - 0, 0, 0, 231, 21, 375, 232, 0, 376, 0, + 0, 0, 0, 0, 0, 239, 375, 376, 377, 240, + 0, 0, 0, 0, 242, 243, 244, 378, 245, 246, + 247, 379, 0, 380, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 241, 377, 378, 379, - 242, 0, 0, 0, 0, 244, 245, 246, 380, 247, - 248, 249, 381, 0, 382, 108, 0, 0, 0, 0, + 248, 391, 0, 0, 0, 0, 0, 250, 0, 0, + 0, 0, 335, 0, 0, 0, 1514, 0, 0, 253, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 676, 551, 552, 553, 554, 0, 0, + 0, 0, 555, 0, 0, 0, 0, 0, 0, 0, + 239, 375, 376, 377, 240, 0, 0, 0, 0, 242, + 243, 244, 378, 245, 246, 247, 379, 0, 380, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 250, 393, 0, 0, 0, 0, 0, 252, 0, - 0, 0, 0, 337, 0, 0, 0, 1673, 0, 0, - 255, 0, 0, 0, 0, 539, 540, 541, 542, 543, - 544, 545, 546, 547, 548, 549, 550, 551, 678, 553, - 554, 555, 556, 0, 0, 0, 0, 557, 0, 0, - 0, 0, 241, 377, 378, 379, 242, 0, 0, 0, - 0, 244, 245, 246, 380, 247, 248, 249, 381, 0, - 382, 108, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 250, 393, 0, - 0, 0, 0, 0, 252, 189, 152, 0, 0, 337, - 820, 0, 190, 191, 192, 0, 255, 193, 194, 195, + 0, 0, 0, 0, 0, 248, 391, 0, 0, 0, + 0, 0, 250, 0, 0, 0, 0, 335, 187, 150, + 354, 1775, 0, 0, 253, 188, 189, 190, 0, 0, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 390, 209, 210, + 211, 212, 213, 214, 0, 0, 0, 0, 0, 0, + 0, 1518, 356, 357, 358, 359, 360, 361, 362, 363, + 220, 221, 222, 223, 364, 365, 366, 367, 224, 0, + 0, 0, 368, 369, 370, 0, 0, 371, 0, 372, + 226, 227, 228, 0, 0, 0, 0, 229, 20, 373, + 230, 0, 374, 187, 150, 354, 0, 0, 0, 0, + 188, 189, 190, 0, 0, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, - 206, 207, 208, 209, 392, 211, 212, 213, 214, 215, - 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 222, 223, 224, - 225, 0, 0, 0, 0, 226, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 228, 229, 230, - 0, 0, 189, 152, 0, 231, 21, 0, 232, 190, - 191, 192, 0, 0, 193, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 392, 211, 212, 213, 214, 215, 216, 0, 0, + 206, 207, 390, 209, 210, 211, 212, 213, 214, 0, + 0, 0, 0, 0, 0, 0, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 220, 221, 222, 223, 364, + 365, 366, 367, 224, 0, 0, 0, 368, 369, 370, + 0, 0, 371, 0, 372, 226, 227, 228, 1378, 0, + 0, 0, 229, 20, 373, 230, 0, 374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 222, 223, 224, 225, 0, 0, - 0, 0, 226, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 229, 230, 0, 0, 0, - 0, 0, 231, 21, 0, 232, 0, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 704, 0, 705, 241, 0, 0, 0, 242, 1639, - 0, 0, 0, 244, 245, 246, 0, 247, 248, 249, - 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, - 393, 0, 0, 0, 0, 0, 252, 0, 0, 0, - 0, 337, 0, 0, 0, 0, 0, 0, 255, 0, - 0, 539, 540, 541, 542, 543, 544, 545, 546, 547, - 548, 549, 550, 551, 678, 553, 554, 555, 556, 0, - 0, 241, 0, 557, 0, 242, 0, 0, 0, 1745, - 244, 245, 246, 1746, 247, 248, 249, 0, 0, 0, - 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 250, 393, 0, 0, - 0, 0, 0, 252, 189, 152, 0, 1250, 337, 1031, - 0, 190, 191, 192, 0, 255, 193, 194, 195, 196, - 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, - 207, 208, 209, 392, 211, 212, 213, 214, 215, 216, + 0, 0, 0, 0, 0, 0, 239, 375, 376, 377, + 240, 0, 0, 0, 0, 242, 243, 244, 378, 245, + 246, 247, 379, 0, 380, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 222, 223, 224, 225, - 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 228, 229, 230, 0, - 0, 0, 0, 0, 231, 21, 0, 232, 189, 152, - 0, 1398, 0, 0, 0, 190, 191, 192, 0, 0, - 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, - 203, 204, 205, 206, 207, 208, 209, 392, 211, 212, - 213, 214, 215, 216, 0, 0, 0, 0, 0, 0, + 0, 248, 391, 0, 0, 0, 0, 0, 250, 0, + 0, 0, 0, 335, 0, 0, 0, 1671, 0, 0, + 253, 0, 0, 0, 0, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 676, 551, + 552, 553, 554, 0, 0, 0, 0, 555, 0, 0, + 0, 239, 375, 376, 377, 240, 0, 0, 0, 0, + 242, 243, 244, 378, 245, 246, 247, 379, 0, 380, + 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 248, 391, 0, 0, + 0, 0, 0, 250, 187, 150, 0, 0, 335, 818, + 0, 188, 189, 190, 0, 253, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 390, 209, 210, 211, 212, 213, 214, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 220, 221, 222, 223, + 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 226, 227, 228, 0, + 187, 150, 0, 229, 20, 0, 230, 188, 189, 190, + 0, 0, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 390, + 209, 210, 211, 212, 213, 214, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 220, 221, 222, 223, 0, 0, 0, 0, + 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 226, 227, 228, 0, 0, 0, 0, 229, + 20, 0, 230, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 676, 551, 552, 553, + 554, 0, 0, 0, 0, 555, 0, 702, 0, 703, + 0, 0, 239, 0, 0, 1637, 240, 0, 0, 0, + 0, 242, 243, 244, 0, 245, 246, 247, 0, 0, + 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 248, 391, 0, + 0, 0, 0, 0, 250, 0, 0, 0, 0, 335, + 0, 0, 0, 0, 0, 0, 253, 0, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 676, 551, 552, 553, 554, 0, 0, 239, 0, + 555, 0, 240, 0, 0, 0, 1743, 242, 243, 244, + 1744, 245, 246, 247, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 222, 223, 224, 225, 0, 0, 0, 0, 226, 0, + 0, 0, 0, 248, 391, 0, 0, 0, 0, 0, + 250, 187, 150, 0, 1248, 335, 1029, 0, 188, 189, + 190, 0, 253, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 390, 209, 210, 211, 212, 213, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 228, 229, 230, 0, 0, 0, 0, 0, 231, 21, - 0, 232, 0, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 678, 553, 554, 555, - 556, 0, 0, 241, 0, 557, 0, 242, 0, 0, - 0, 1772, 244, 245, 246, 1773, 247, 248, 249, 0, - 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 250, 393, - 0, 0, 0, 0, 0, 252, 0, 0, 0, 0, - 337, 0, 0, 0, 0, 0, 0, 255, 539, 540, - 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, - 551, 678, 553, 554, 555, 556, 0, 0, 0, 0, - 557, 0, 928, 0, 0, 0, 0, 241, 0, 0, - 889, 242, 0, 0, 0, 0, 244, 245, 246, 0, - 247, 248, 249, 0, 0, 0, 108, 0, 0, 0, + 0, 0, 0, 220, 221, 222, 223, 0, 0, 0, + 0, 224, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 226, 227, 228, 0, 0, 0, 0, + 229, 20, 0, 230, 187, 150, 0, 1396, 0, 0, + 0, 188, 189, 190, 0, 0, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 390, 209, 210, 211, 212, 213, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 250, 393, 0, 0, 0, 0, 0, 252, - 189, 152, 0, 1460, 337, 0, 0, 190, 191, 192, - 0, 255, 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, 209, 392, - 211, 212, 213, 214, 215, 216, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 220, 221, 222, 223, + 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 226, 227, 228, 0, + 0, 0, 0, 229, 20, 0, 230, 0, 0, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 676, 551, 552, 553, 554, 0, 0, 239, + 0, 555, 0, 240, 0, 0, 0, 1770, 242, 243, + 244, 1771, 245, 246, 247, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 222, 223, 224, 225, 0, 0, 0, 0, - 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 228, 229, 230, 0, 0, 189, 152, 0, - 231, 21, 0, 232, 190, 191, 192, 0, 0, 193, + 0, 0, 0, 0, 248, 391, 0, 0, 0, 0, + 0, 250, 0, 0, 0, 0, 335, 0, 0, 0, + 0, 0, 0, 253, 0, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 676, 551, + 552, 553, 554, 0, 0, 0, 0, 555, 0, 926, + 0, 0, 239, 0, 0, 0, 240, 887, 0, 0, + 0, 242, 243, 244, 0, 245, 246, 247, 0, 0, + 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 248, 391, 0, + 0, 0, 0, 0, 250, 187, 150, 0, 1458, 335, + 0, 0, 188, 189, 190, 0, 253, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 392, 211, 212, 213, - 214, 215, 216, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, - 223, 224, 225, 0, 0, 0, 0, 226, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 228, - 229, 230, 0, 0, 0, 0, 0, 231, 21, 0, - 232, 0, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 0, 0, 0, 241, - 1931, 0, 0, 242, 1932, 0, 0, 0, 244, 245, - 246, 0, 247, 248, 249, 0, 0, 0, 108, 0, + 204, 205, 206, 207, 390, 209, 210, 211, 212, 213, + 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 220, 221, 222, + 223, 0, 0, 0, 0, 224, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 226, 227, 228, + 0, 187, 150, 0, 229, 20, 0, 230, 188, 189, + 190, 0, 0, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 390, 209, 210, 211, 212, 213, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 250, 393, 0, 0, 0, 0, - 0, 252, 0, 0, 0, 0, 337, 0, 0, 0, - 0, 0, 0, 255, 0, 0, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 678, - 553, 554, 555, 556, 0, 0, 241, 0, 557, 0, - 242, 0, 0, 0, 0, 244, 245, 246, 733, 247, - 248, 249, 0, 0, 0, 108, 0, 0, 0, 0, + 0, 0, 0, 220, 221, 222, 223, 0, 0, 0, + 0, 224, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 226, 227, 228, 0, 0, 0, 0, + 229, 20, 0, 230, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 676, 551, 552, + 553, 554, 0, 0, 0, 0, 555, 0, 0, 0, + 0, 0, 1929, 239, 0, 0, 1930, 240, 0, 0, + 0, 0, 242, 243, 244, 0, 245, 246, 247, 0, + 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 248, 391, + 0, 0, 0, 0, 0, 250, 0, 0, 0, 0, + 335, 0, 0, 0, 0, 0, 0, 253, 0, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 676, 551, 552, 553, 554, 0, 0, 239, + 0, 555, 0, 240, 0, 0, 0, 0, 242, 243, + 244, 731, 245, 246, 247, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 250, 393, 0, 0, 0, 0, 0, 252, 189, - 152, 0, 0, 337, 1515, 0, 190, 191, 192, 0, - 255, 193, 194, 195, 196, 197, 198, 199, 200, 201, - 202, 203, 204, 205, 206, 207, 208, 209, 392, 211, - 212, 213, 214, 215, 216, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 248, 391, 0, 0, 0, 0, + 0, 250, 187, 150, 0, 0, 335, 1513, 0, 188, + 189, 190, 0, 253, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 390, 209, 210, 211, 212, 213, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 222, 223, 224, 225, 0, 0, 0, 0, 226, + 0, 0, 0, 0, 220, 221, 222, 223, 0, 0, + 0, 0, 224, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 226, 227, 228, 0, 187, 150, + 0, 229, 20, 0, 230, 188, 189, 190, 0, 0, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 390, 209, 210, + 211, 212, 213, 214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 229, 230, 0, 0, 189, 152, 0, 231, - 21, 0, 232, 190, 191, 192, 0, 0, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 392, 211, 212, 213, 214, - 215, 216, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 222, 223, - 224, 225, 0, 0, 0, 0, 226, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 229, - 230, 0, 0, 0, 0, 0, 231, 21, 0, 232, - 0, 539, 540, 541, 542, 543, 544, 545, 546, 547, - 548, 549, 550, 551, 678, 553, 554, 555, 556, 0, - 0, 0, 0, 557, 0, 0, 0, 0, 241, 0, - 0, 0, 242, 889, 0, 0, 0, 244, 245, 246, - 0, 247, 248, 249, 0, 0, 0, 108, 0, 0, + 220, 221, 222, 223, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 250, 393, 0, 0, 0, 0, 0, - 252, 0, 0, 0, 0, 337, 1823, 0, 0, 0, - 0, 0, 255, 0, -4, 1, 0, 0, -4, 0, - 0, 0, 0, 0, 0, 0, 0, -4, -4, 0, - 0, 0, 0, 0, 0, 241, 0, 0, 0, 242, - 0, 0, 0, 0, 244, 245, 246, 0, 247, 248, - 249, 0, 0, 0, 108, 0, 0, 0, -4, -4, + 226, 227, 228, 0, 0, 0, 0, 229, 20, 0, + 230, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 0, 0, 0, 0, 0, + 239, 0, 0, 887, 240, 0, 0, 0, 0, 242, + 243, 244, 0, 245, 246, 247, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 250, 393, 0, 0, 0, 0, 0, 252, -4, -4, - -4, 0, 337, 0, -4, -4, 0, -4, 0, 255, - 0, 0, -4, -4, 0, -4, -4, 0, -4, 0, + 0, 0, 0, 0, 0, 248, 391, 0, 0, 0, + 0, 0, 250, 0, 0, 0, 0, 335, 1821, 0, + 0, 0, 0, 0, 253, -4, 1, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, -4, -4, + 0, 0, 0, 0, 0, 0, 239, 0, 0, 0, + 240, 0, 0, 0, 0, 242, 243, 244, 0, 245, + 246, 247, 0, 0, 0, 107, 0, 0, 0, -4, + -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 248, 391, 0, 0, 0, 0, 0, 250, -4, + -4, -4, 0, 335, 0, -4, -4, 0, -4, 0, + 253, 0, 0, -4, 0, -4, -4, 0, -4, 0, 0, 0, 0, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, 0, 0, -4, -4, -4, -4, -4, -4, 0, -4, 0, -4, @@ -3316,2263 +3304,2249 @@ static const yytype_int16 yytable[] = 10, 0, -4, -4, -4, 0, 0, 0, 0, 0, 0, 0, 0, -4, 0, -4, 0, 0, 0, 11, 12, 13, 0, 0, 0, 14, 15, 0, 16, 0, - 0, 0, 0, 17, 18, 0, 19, 20, 0, 21, - 0, 0, 0, 0, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 0, - 0, 37, 38, 39, 40, 41, 42, 0, 43, 0, - 44, 45, 46, 47, 48, 49, 50, 0, 51, 52, - 53, 54, 55, 56, 0, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 0, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 0, - 0, 0, 80, 81, 82, 0, 0, 0, 83, 0, - 0, 0, 0, 84, 85, 86, 87, 152, 356, 88, - 0, 89, 0, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 0, 0, 0, - 0, 0, 0, 104, 105, 106, 0, 152, 356, 0, - 0, 0, 0, 0, 107, 0, 108, 0, 0, 357, - 358, 359, 360, 361, 362, 363, 364, 365, 0, 0, - 0, 0, 366, 367, 368, 369, 0, 386, 356, 0, - 370, 371, 372, 0, 0, 373, 0, 374, 0, 357, - 358, 359, 360, 361, 362, 363, 364, 365, 375, 0, - 0, 376, 366, 367, 368, 369, 0, 0, 356, 0, - 370, 371, 372, 0, 0, 373, 0, 374, 0, 357, - 358, 359, 360, 361, 362, 363, 364, 365, 375, 0, - 0, 376, 366, 367, 368, 369, 0, 0, 0, 406, - 370, 371, 372, 0, 0, 373, 0, 374, 0, 357, - 358, 359, 360, 361, 362, 363, 364, 365, 375, 0, - 0, 376, 366, 367, 368, 369, 0, 0, 0, 0, - 370, 371, 372, 0, 0, 373, 0, 374, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 375, 0, - 0, 376, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 377, 378, 379, 0, - 0, 0, 0, 0, 0, 0, 0, 380, 0, 0, - 0, 381, 0, 382, 108, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 377, 378, 379, 7, - 8, 0, 0, 0, 0, 0, 0, 380, 0, 0, - 0, 381, 0, 382, 108, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 377, 378, 379, 0, - 0, 0, 0, 0, 0, 0, 0, 380, 0, 0, - 0, 381, 0, 382, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 377, 378, 379, 0, - 0, 0, 0, 0, 7, 8, 0, 380, 0, 0, - 0, 381, 0, 382, 0, 0, 0, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 0, 0, 0, 38, 39, 40, 41, 0, 0, 43, - 0, 0, 0, 0, 0, 717, 49, 0, 0, 51, - 718, 0, 719, 720, 0, 0, 0, 0, 977, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 71, 0, 0, 0, 978, 0, 0, 0, 0, - 0, 0, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 85, 86, 87, 38, 39, - 40, 41, 0, 0, 43, 0, 0, 0, 0, 0, - 717, 49, 0, 0, 51, 718, 0, 719, 720, 0, + 0, 0, 0, 17, 0, 18, 19, 0, 20, 0, + 0, 0, 0, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 0, 0, + 36, 37, 38, 39, 40, 41, 0, 42, 0, 43, + 44, 45, 46, 47, 48, 49, 0, 50, 51, 52, + 53, 54, 55, 0, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 0, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 0, 0, + 0, 79, 80, 81, 0, 0, 0, 82, 0, 0, + 0, 0, 83, 84, 85, 86, 150, 354, 87, 0, + 88, 0, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 0, 0, 0, 0, + 0, 0, 103, 104, 105, 150, 354, 0, 0, 0, + 0, 0, 0, 106, 0, 107, 0, 0, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 0, 0, 0, + 0, 364, 365, 366, 367, 0, 0, 0, 0, 368, + 369, 370, 0, 0, 371, 0, 372, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 373, 384, 354, 374, + 364, 365, 366, 367, 0, 0, 0, 0, 368, 369, + 370, 0, 0, 371, 0, 372, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 373, 0, 0, 374, 0, + 0, 0, 0, 0, 0, 0, 0, 404, 0, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 0, 0, + 0, 0, 364, 365, 366, 367, 0, 0, 0, 0, + 368, 369, 370, 0, 0, 371, 0, 372, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 373, 0, 0, + 374, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 375, 376, 377, 0, 0, 0, + 0, 354, 0, 888, 0, 378, 0, 0, 0, 379, + 0, 380, 107, 0, 0, 0, 7, 8, 0, 0, + 0, 0, 0, 375, 376, 377, 0, 0, 0, 0, + 0, 0, 0, 0, 378, 0, 0, 0, 379, 0, + 380, 107, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 0, 0, 0, 0, 364, 365, 366, 367, 0, + 0, 0, 0, 368, 369, 370, 0, 0, 371, 0, + 372, 0, 0, 0, 0, 375, 376, 377, 0, 0, + 373, 0, 0, 374, 0, 0, 378, 0, 0, 0, + 379, 0, 380, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 0, 0, 0, 37, + 38, 39, 40, 0, 0, 42, 0, 0, 0, 0, + 0, 715, 48, 0, 0, 50, 716, 0, 717, 718, + 7, 8, 0, 0, 975, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, + 0, 976, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 676, 551, 552, 553, 554, + 0, 84, 85, 86, 555, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 932, 0, 0, 0, 375, 376, + 377, 0, 0, 0, 0, 0, 0, 0, 0, 378, + 0, 0, 0, 379, 0, 380, 0, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 0, 0, 0, 37, 38, 39, 40, 0, 0, 42, + 0, 0, 0, 0, 0, 715, 48, 0, 0, 50, + 716, 0, 717, 718, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 71, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 85, 86, 87, 0, 0, 0, 0, 0, 0, 890, + 0, 70, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 676, 551, 552, 553, 554, + 0, 0, 0, 0, 555, 84, 85, 86, 0, 0, + 0, 0, 0, 0, 1076, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 676, 551, + 552, 553, 554, 0, 0, 0, 0, 555, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1086, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 678, 553, 554, 555, 556, 0, 0, - 0, 0, 557, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 934, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 678, 553, 554, 555, - 556, 0, 0, 0, 0, 557, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1078, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 678, - 553, 554, 555, 556, 0, 0, 0, 0, 557, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1088, 539, + 549, 676, 551, 552, 553, 554, 0, 0, 0, 0, + 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1087, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1088, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 676, 551, 552, + 553, 554, 0, 0, 0, 0, 555, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1093, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 678, 553, 554, 555, 556, 0, 0, 0, - 0, 557, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1089, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1090, 539, 540, 541, 542, 543, - 544, 545, 546, 547, 548, 549, 550, 551, 678, 553, - 554, 555, 556, 0, 0, 0, 0, 557, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1095, 539, 540, - 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, - 551, 678, 553, 554, 555, 556, 0, 0, 0, 0, - 557, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1096, 539, 540, 541, 542, 543, 544, 545, 546, 547, - 548, 549, 550, 551, 678, 553, 554, 555, 556, 0, - 0, 0, 0, 557, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1098, 539, 540, 541, 542, 543, 544, - 545, 546, 547, 548, 549, 550, 551, 678, 553, 554, - 555, 556, 0, 0, 0, 0, 557, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1203, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1224, + 676, 551, 552, 553, 554, 0, 0, 0, 0, 555, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1094, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 676, 551, 552, 553, 554, 0, 0, + 0, 0, 555, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1096, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 676, 551, 552, 553, + 554, 0, 0, 0, 0, 555, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1201, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1222, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 676, 551, 552, 553, 554, 0, 0, 0, + 0, 555, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1306, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 676, 551, 552, 553, 554, + 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1390, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 676, 551, + 552, 553, 554, 0, 0, 0, 0, 555, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1391, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 678, 553, 554, 555, 556, 0, 0, - 0, 0, 557, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1308, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 678, 553, 554, 555, - 556, 0, 0, 0, 0, 557, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1392, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 678, - 553, 554, 555, 556, 0, 0, 0, 0, 557, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1393, 539, + 549, 676, 551, 552, 553, 554, 0, 0, 0, 0, + 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1433, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1554, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 676, 551, 552, + 553, 554, 0, 0, 0, 0, 555, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1555, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 678, 553, 554, 555, 556, 0, 0, 0, - 0, 557, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1435, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1556, 539, 540, 541, 542, 543, - 544, 545, 546, 547, 548, 549, 550, 551, 678, 553, - 554, 555, 556, 0, 0, 0, 0, 557, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1557, 539, 540, - 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, - 551, 678, 553, 554, 555, 556, 0, 0, 0, 0, - 557, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1558, 539, 540, 541, 542, 543, 544, 545, 546, 547, - 548, 549, 550, 551, 678, 553, 554, 555, 556, 0, - 0, 0, 0, 557, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1572, 539, 540, 541, 542, 543, 544, - 545, 546, 547, 548, 549, 550, 551, 678, 553, 554, - 555, 556, 0, 0, 0, 0, 557, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1700, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1811, + 676, 551, 552, 553, 554, 0, 0, 0, 0, 555, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1556, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 676, 551, 552, 553, 554, 0, 0, + 0, 0, 555, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1570, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 676, 551, 552, 553, + 554, 0, 0, 0, 0, 555, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1698, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1809, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 676, 551, 552, 553, 554, 0, 0, 0, + 0, 555, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1810, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 676, 551, 552, 553, 554, + 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1835, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 676, 551, + 552, 553, 554, 0, 0, 0, 0, 555, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1838, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 678, 553, 554, 555, 556, 0, 0, - 0, 0, 557, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1812, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 678, 553, 554, 555, - 556, 0, 0, 0, 0, 557, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1837, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 678, - 553, 554, 555, 556, 0, 0, 0, 0, 557, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1840, 539, + 549, 676, 551, 552, 553, 554, 0, 0, 0, 0, + 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1904, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1955, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 676, 551, 552, + 553, 554, 0, 0, 0, 0, 555, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1956, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 678, 553, 554, 555, 556, 0, 0, 0, - 0, 557, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1906, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1957, 539, 540, 541, 542, 543, - 544, 545, 546, 547, 548, 549, 550, 551, 678, 553, - 554, 555, 556, 0, 0, 0, 0, 557, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1958, 539, 540, - 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, - 551, 678, 553, 554, 555, 556, 0, 0, 0, 0, - 557, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1970, 539, 540, 541, 542, 543, 544, 545, 546, 547, - 548, 549, 550, 551, 678, 553, 554, 555, 556, 0, - 0, 0, 0, 557, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1972, 539, 540, 541, 542, 543, 544, - 545, 546, 547, 548, 549, 550, 551, 678, 553, 554, - 555, 556, 0, 0, 0, 0, 557, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2004, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2031, + 676, 551, 552, 553, 554, 0, 0, 0, 0, 555, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1968, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 676, 551, 552, 553, 554, 0, 0, + 0, 0, 555, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1970, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 676, 551, 552, 553, + 554, 0, 0, 0, 0, 555, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2002, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2029, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 676, 551, 552, 553, 554, 0, 0, 0, + 0, 555, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2034, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 676, 551, 552, 553, 554, + 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2035, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 676, 551, + 552, 553, 554, 0, 0, 0, 0, 555, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2036, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 678, 553, 554, 555, 556, 0, 0, - 0, 0, 557, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2036, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 678, 553, 554, 555, - 556, 0, 0, 0, 0, 557, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2037, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 678, - 553, 554, 555, 556, 0, 0, 0, 0, 557, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2038, 539, - 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 678, 553, 554, 555, 556, 0, 0, 0, - 0, 557, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2077, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, - 1013, 539, 540, 541, 542, 543, 544, 545, 546, 547, - 548, 549, 550, 551, 678, 553, 554, 555, 556, 0, - 0, 0, 0, 557, 0, 0, 0, 0, 0, 1065, + 549, 676, 551, 552, 553, 554, 0, 0, 0, 0, + 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2075, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 0, 0, 0, 0, 1011, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 676, 551, 552, 553, 554, 0, 0, + 0, 0, 555, 0, 0, 0, 0, 0, 1063, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 676, 551, 552, 553, 554, 0, 0, 0, + 0, 555, 0, 0, 0, 0, 0, 1106, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 678, 553, 554, 555, 556, 0, 0, - 0, 0, 557, 0, 0, 0, 0, 0, 1108, 539, + 549, 676, 551, 552, 553, 554, 0, 0, 0, 0, + 555, 0, 0, 0, 0, 0, 1107, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 678, 553, 554, 555, 556, 0, 0, 0, - 0, 557, 0, 0, 0, 0, 0, 1109, 539, 540, - 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, - 551, 678, 553, 554, 555, 556, 0, 0, 0, 0, - 557, 0, 0, 0, 0, 0, 1151, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 0, 0, 0, 0, 1182, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 678, - 553, 554, 555, 556, 0, 0, 0, 0, 557, 0, - 0, 0, 0, 0, 1200, 539, 540, 541, 542, 543, - 544, 545, 546, 547, 548, 549, 550, 551, 678, 553, - 554, 555, 556, 0, 0, 0, 0, 557, 0, 0, - 0, 0, 0, 1256, 539, 540, 541, 542, 543, 544, - 545, 546, 547, 548, 549, 550, 551, 678, 553, 554, - 555, 556, 0, 0, 0, 0, 557, 0, 0, 0, - 0, 0, 1351, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 678, 553, 554, 555, - 556, 0, 0, 0, 0, 557, 0, 0, 0, 0, - 0, 1394, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, - 1466, 539, 540, 541, 542, 543, 544, 545, 546, 547, - 548, 549, 550, 551, 678, 553, 554, 555, 556, 0, - 0, 0, 0, 557, 0, 0, 0, 0, 0, 1467, + 676, 551, 552, 553, 554, 0, 0, 0, 0, 555, + 0, 0, 0, 0, 0, 1149, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 0, 0, 0, 0, 1180, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 676, 551, + 552, 553, 554, 0, 0, 0, 0, 555, 0, 0, + 0, 0, 0, 1198, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 676, 551, 552, + 553, 554, 0, 0, 0, 0, 555, 0, 0, 0, + 0, 0, 1254, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 676, 551, 552, 553, + 554, 0, 0, 0, 0, 555, 0, 0, 0, 0, + 0, 1349, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 676, 551, 552, 553, 554, + 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, + 1392, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 0, 0, 0, 0, 1464, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 676, 551, 552, 553, 554, 0, 0, + 0, 0, 555, 0, 0, 0, 0, 0, 1465, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 676, 551, 552, 553, 554, 0, 0, 0, + 0, 555, 0, 0, 0, 0, 0, 1466, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 678, 553, 554, 555, 556, 0, 0, - 0, 0, 557, 0, 0, 0, 0, 0, 1468, 539, + 549, 676, 551, 552, 553, 554, 0, 0, 0, 0, + 555, 0, 0, 0, 0, 0, 1467, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 678, 553, 554, 555, 556, 0, 0, 0, - 0, 557, 0, 0, 0, 0, 0, 1469, 539, 540, - 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, - 551, 678, 553, 554, 555, 556, 0, 0, 0, 0, - 557, 0, 0, 0, 0, 0, 1743, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 0, 0, 0, 0, 1754, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 678, - 553, 554, 555, 556, 0, 0, 0, 0, 557, 0, - 0, 0, 0, 0, 1791, 539, 540, 541, 542, 543, - 544, 545, 546, 547, 548, 549, 550, 551, 678, 553, - 554, 555, 556, 0, 0, 0, 0, 557, 0, 0, - 0, 0, 0, 1856, 539, 540, 541, 542, 543, 544, - 545, 546, 547, 548, 549, 550, 551, 678, 553, 554, - 555, 556, 0, 0, 0, 0, 557, 0, 0, 0, - 0, 0, 1871, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 678, 553, 554, 555, - 556, 0, 0, 0, 0, 557, 0, 0, 0, 0, - 0, 1883, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, - 1920, 539, 540, 541, 542, 543, 544, 545, 546, 547, - 548, 549, 550, 551, 678, 553, 554, 555, 556, 0, - 0, 0, 0, 557, 0, 0, 0, 0, 0, 1937, + 676, 551, 552, 553, 554, 0, 0, 0, 0, 555, + 0, 0, 0, 0, 0, 1741, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 0, 0, 0, 0, 1752, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 676, 551, + 552, 553, 554, 0, 0, 0, 0, 555, 0, 0, + 0, 0, 0, 1789, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 676, 551, 552, + 553, 554, 0, 0, 0, 0, 555, 0, 0, 0, + 0, 0, 1854, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 676, 551, 552, 553, + 554, 0, 0, 0, 0, 555, 0, 0, 0, 0, + 0, 1869, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 676, 551, 552, 553, 554, + 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, + 1881, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 0, 0, 0, 0, 1918, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 676, 551, 552, 553, 554, 0, 0, + 0, 0, 555, 0, 0, 0, 0, 0, 1935, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 676, 551, 552, 553, 554, 0, 0, 0, + 0, 555, 0, 0, 0, 0, 0, 1944, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 678, 553, 554, 555, 556, 0, 0, - 0, 0, 557, 0, 0, 0, 0, 0, 1946, 539, - 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 678, 553, 554, 555, 556, 0, 0, 0, - 0, 557, 0, 0, 0, 0, 0, 1947, 539, 540, - 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, - 551, 678, 553, 554, 555, 556, 0, 0, 0, 0, - 557, 0, 0, 0, 0, 0, 1968, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 0, 0, 0, 0, 2017, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 678, - 553, 554, 555, 556, 0, 0, 0, 0, 557, 0, - 0, 0, 0, 0, 2056, 539, 540, 541, 542, 543, - 544, 545, 546, 547, 548, 549, 550, 551, 678, 553, - 554, 555, 556, 0, 0, 0, 0, 557, 0, 0, - 0, 0, 0, 2075, 539, 540, 541, 542, 543, 544, - 545, 546, 547, 548, 549, 550, 551, 678, 553, 554, - 555, 556, 0, 0, 0, 0, 557, 0, 0, 0, - 0, 0, 2095, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 678, 553, 554, 555, - 556, 0, 0, 0, 0, 557, 0, 0, 0, 0, - 0, 2096, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, - 2097, 539, 540, 541, 542, 543, 544, 545, 546, 547, - 548, 549, 550, 551, 678, 553, 554, 555, 556, 0, - 0, 0, 0, 557, 0, 0, 0, 0, 679, 539, + 549, 676, 551, 552, 553, 554, 0, 0, 0, 0, + 555, 0, 0, 0, 0, 0, 1945, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 678, 553, 554, 555, 556, 0, 0, 0, - 0, 557, 0, 0, 0, 0, 881, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 0, 0, 0, 1849, 539, 540, 541, 542, 543, - 544, 545, 546, 547, 548, 549, 550, 551, 678, 553, - 554, 555, 556, 0, 0, 0, 0, 557, 0, 704, - 0, 705, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 0, 0, 940, 539, - 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 678, 553, 554, 555, 556, 0, 0, 0, - 0, 557, 0, 0, 0, 991, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 678, - 553, 554, 555, 556, 0, 0, 0, 0, 557, 0, - 0, 0, 1132, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 678, 553, 554, 555, - 556, 0, 0, 0, 0, 557, 0, 0, 0, 1195, + 676, 551, 552, 553, 554, 0, 0, 0, 0, 555, + 0, 0, 0, 0, 0, 1966, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 0, 0, 0, 0, 2015, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 676, 551, + 552, 553, 554, 0, 0, 0, 0, 555, 0, 0, + 0, 0, 0, 2054, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 676, 551, 552, + 553, 554, 0, 0, 0, 0, 555, 0, 0, 0, + 0, 0, 2073, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 676, 551, 552, 553, + 554, 0, 0, 0, 0, 555, 0, 0, 0, 0, + 0, 2093, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 676, 551, 552, 553, 554, + 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, + 2094, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 0, 0, 0, 0, 2095, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 676, 551, 552, 553, 554, 0, 0, + 0, 0, 555, 0, 0, 0, 0, 677, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 678, 553, 554, 555, 556, 0, 0, - 0, 0, 557, 0, 0, 0, 1196, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 0, 0, 1201, 539, 540, 541, 542, 543, 544, - 545, 546, 547, 548, 549, 550, 551, 678, 553, 554, - 555, 556, 0, 0, 0, 0, 557, 0, 0, 0, - 1202, 539, 540, 541, 542, 543, 544, 545, 546, 547, - 548, 549, 550, 551, 678, 553, 554, 555, 556, 0, - 0, 0, 0, 557, 0, 0, 0, 1292, 539, 540, - 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, - 551, 678, 553, 554, 555, 556, 0, 0, 0, 0, - 557, 0, 0, 0, 1305, 539, 540, 541, 542, 543, - 544, 545, 546, 547, 548, 549, 550, 551, 678, 553, - 554, 555, 556, 0, 0, 0, 0, 557, 0, 0, - 0, 1498, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 0, 0, 1578, 539, + 549, 676, 551, 552, 553, 554, 0, 0, 0, 0, + 555, 0, 0, 0, 0, 879, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 0, 0, 0, 1847, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 676, 551, 552, + 553, 554, 0, 0, 0, 0, 555, 0, 702, 0, + 703, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 0, 0, 938, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 676, 551, 552, 553, 554, 0, 0, 0, 0, + 555, 0, 0, 0, 989, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 676, 551, + 552, 553, 554, 0, 0, 0, 0, 555, 0, 0, + 0, 1130, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 676, 551, 552, 553, 554, + 0, 0, 0, 0, 555, 0, 0, 0, 1193, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 676, 551, 552, 553, 554, 0, 0, 0, + 0, 555, 0, 0, 0, 1194, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 0, 0, 1199, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 676, 551, 552, 553, + 554, 0, 0, 0, 0, 555, 0, 0, 0, 1200, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 676, 551, 552, 553, 554, 0, 0, + 0, 0, 555, 0, 0, 0, 1290, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, - 550, 551, 678, 553, 554, 555, 556, 0, 0, 0, - 0, 557, 0, 0, 0, 1625, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 678, - 553, 554, 555, 556, 0, 0, 0, 0, 557, 0, - 0, 0, 1803, 539, 540, 541, 542, 543, 544, 545, - 546, 547, 548, 549, 550, 551, 678, 553, 554, 555, - 556, 0, 0, 0, 0, 557, 0, 0, 0, 1842, + 676, 551, 552, 553, 554, 0, 0, 0, 0, 555, + 0, 0, 0, 1303, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 676, 551, 552, + 553, 554, 0, 0, 0, 0, 555, 0, 0, 0, + 1496, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 0, 0, 1576, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 678, 553, 554, 555, 556, 0, 0, - 0, 0, 557, 0, 0, 0, 1857, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 750, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 751, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 752, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 754, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 755, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 756, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 758, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 759, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 760, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 761, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 762, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 763, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 764, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 766, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 767, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 768, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 831, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 866, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 910, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 928, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 930, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 931, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 932, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 938, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 939, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 976, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 990, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 1045, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 1049, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 1061, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 1131, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 1140, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 1141, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 1142, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 1152, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 1181, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 1183, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 1184, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 1185, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 1186, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 1187, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 1188, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 1189, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 1194, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 1291, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 1304, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 1499, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 1564, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 1577, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 1688, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 1690, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 1693, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 1699, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 1744, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 1753, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 1776, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 1841, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 1904, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 1905, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557, 0, 2030, 539, 540, 541, - 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, - 678, 553, 554, 555, 556, 0, 0, 0, 0, 557, - 0, 2072, 539, 540, 541, 542, 543, 544, 545, 546, - 547, 548, 549, 550, 551, 678, 553, 554, 555, 556, - 0, 0, 0, 0, 557 + 549, 676, 551, 552, 553, 554, 0, 0, 0, 0, + 555, 0, 0, 0, 1623, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 676, 551, + 552, 553, 554, 0, 0, 0, 0, 555, 0, 0, + 0, 1801, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 676, 551, 552, 553, 554, + 0, 0, 0, 0, 555, 0, 0, 0, 1840, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 676, 551, 552, 553, 554, 0, 0, 0, + 0, 555, 0, 0, 0, 1855, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 748, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 749, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 750, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 752, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 753, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 754, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 756, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 757, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 758, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 759, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 760, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 761, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 762, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 764, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 765, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 766, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 829, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 864, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 908, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 926, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 928, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 929, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 930, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 936, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 937, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 974, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 988, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 1043, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 1047, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 1059, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 1129, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 1138, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 1139, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 1140, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 1150, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 1179, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 1181, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 1182, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 1183, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 1184, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 1185, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 1186, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 1187, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 1192, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 1289, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 1302, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 1497, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 1562, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 1575, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 1686, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 1688, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 1691, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 1697, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 1742, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 1751, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 1774, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 1839, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 1902, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 1903, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555, 0, 2028, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 676, + 551, 552, 553, 554, 0, 0, 0, 0, 555, 0, + 2070, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 676, 551, 552, 553, 554, 0, + 0, 0, 0, 555 }; static const yytype_int16 yycheck[] = { - 3, 593, 594, 292, 55, 699, 1180, 1357, 683, 3, - 3, 147, 1613, 707, 4, 7, 1176, 48, 21, 1656, - 4, 1658, 4, 21, 179, 4, 6, 4, 6, 4, - 4, 4, 187, 1824, 4, 99, 5, 101, 5, 714, - 4, 4, 97, 5, 1643, 48, 6, 4, 4, 97, - 4, 240, 9, 5, 0, 730, 304, 4, 6, 248, - 54, 6, 4, 738, 119, 240, 134, 4, 6, 4, - 134, 119, 75, 248, 322, 14, 7, 227, 228, 9, - 83, 4, 129, 6, 240, 88, 242, 236, 237, 227, - 228, 9, 248, 157, 244, 7, 99, 240, 9, 146, - 6, 6, 84, 227, 228, 248, 1705, 154, 155, 156, - 248, 240, 9, 160, 161, 6, 245, 1718, 240, 274, - 275, 276, 9, 242, 248, 6, 248, 242, 6, 248, - 9, 134, 240, 248, 6, 91, 139, 140, 97, 95, - 248, 389, 135, 391, 147, 101, 102, 149, 104, 105, - 239, 399, 241, 61, 62, 158, 64, 239, 833, 248, - 315, 316, 317, 100, 101, 227, 228, 123, 91, 243, - 7, 174, 174, 247, 1965, 94, 179, 332, 97, 182, - 164, 165, 166, 167, 187, 188, 248, 239, 190, 191, - 240, 133, 134, 135, 136, 7, 94, 244, 248, 97, - 129, 99, 162, 185, 174, 175, 148, 238, 6, 151, - 240, 174, 175, 239, 162, 241, 189, 146, 248, 1569, - 240, 211, 242, 227, 228, 154, 155, 156, 248, 211, - 239, 160, 161, 227, 211, 238, 211, 211, 134, 243, - 236, 237, 273, 139, 140, 1846, 240, 6, 251, 245, - 1410, 254, 255, 245, 211, 286, 246, 255, 6, 290, - 244, 243, 241, 243, 211, 243, 243, 270, 247, 243, - 273, 274, 275, 276, 243, 239, 243, 6, 174, 236, - 237, 243, 239, 286, 241, 239, 243, 290, 245, 292, - 6, 243, 188, 240, 239, 242, 990, 991, 243, 1900, - 212, 213, 214, 215, 239, 241, 236, 237, 239, 239, - 241, 241, 315, 316, 317, 245, 222, 223, 236, 237, - 8, 239, 239, 241, 236, 237, 243, 245, 239, 332, - 241, 222, 223, 245, 582, 338, 584, 585, 241, 236, - 237, 405, 239, 243, 241, 242, 227, 228, 245, 227, - 228, 239, 239, 601, 241, 227, 228, 239, 245, 7, - 239, 1998, 241, 518, 227, 228, 245, 6, 227, 228, - 401, 402, 236, 237, 510, 212, 213, 214, 215, 243, - 4, 5, 239, 227, 228, 248, 417, 295, 296, 248, - 236, 237, 640, 396, 397, 303, 304, 243, 401, 402, - 212, 213, 214, 215, 248, 94, 239, 239, 97, 241, - 99, 232, 233, 245, 417, 239, 248, 238, 227, 228, - 423, 110, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 679, 2033, 427, 239, 59, 60, 61, 62, 248, - 1115, 444, 1117, 67, 68, 69, 129, 97, 72, 99, - 74, 227, 228, 227, 228, 1130, 239, 239, 182, 523, - 243, 85, 91, 146, 88, 94, 469, 243, 97, 239, - 99, 154, 155, 156, 248, 239, 507, 160, 161, 91, - 112, 110, 94, 244, 2085, 97, 517, 248, 1838, 492, - 7, 244, 227, 228, 239, 248, 499, 500, 110, 239, - 396, 504, 126, 506, 507, 508, 509, 510, 245, 239, - 513, 248, 648, 248, 517, 518, 519, 520, 521, 522, - 239, 524, 241, 526, 522, 245, 524, 247, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 270, 227, 228, 552, - 238, 227, 228, 6, 7, 558, 244, 227, 228, 239, - 239, 244, 1237, 243, 212, 213, 214, 215, 1243, 193, - 194, 195, 248, 239, 577, 578, 7, 240, 248, 242, - 204, 227, 228, 239, 208, 248, 210, 211, 236, 237, - 227, 228, 243, 227, 228, 244, 240, 661, 242, 248, - 593, 594, 248, 244, 248, 599, 8, 248, 504, 97, - 506, 248, 508, 509, 248, 1290, 240, 239, 242, 243, - 623, 624, 625, 519, 520, 244, 620, 91, 1303, 248, - 94, 699, 239, 97, 1309, 99, 94, 885, 239, 97, - 241, 243, 243, 646, 647, 648, 649, 650, 651, 652, - 653, 654, 110, 656, 657, 658, 659, 660, 97, 662, - 663, 664, 665, 666, 227, 228, 669, 665, 240, 720, - 242, 227, 228, 397, 129, 244, 239, 680, 672, 248, - 243, 675, 239, 591, 592, 749, 227, 228, 596, 1383, - 244, 146, 248, 687, 248, 212, 213, 214, 215, 154, - 155, 156, 239, 706, 241, 160, 161, 248, 711, 227, - 228, 133, 134, 227, 228, 227, 228, 139, 94, 236, - 237, 227, 228, 726, 727, 719, 227, 228, 243, 732, - 248, 239, 735, 736, 248, 240, 248, 242, 741, 243, - 743, 244, 248, 248, 8, 248, 97, 248, 129, 227, - 228, 647, 94, 649, 650, 651, 652, 653, 654, 94, - 656, 657, 658, 659, 97, 146, 662, 663, 664, 772, - 248, 774, 4, 154, 155, 156, 227, 228, 1472, 160, - 161, 212, 213, 214, 215, 133, 134, 6, 7, 244, - 1484, 139, 243, 4, 862, 229, 230, 231, 232, 233, - 227, 228, 526, 806, 238, 236, 237, 240, 244, 242, - 243, 875, 248, 1987, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 4, 239, 244, 241, 238, 243, 248, 735, - 244, 872, 244, 4, 248, 244, 244, 743, 851, 248, - 248, 244, 244, 577, 578, 248, 248, 239, 244, 2019, - 244, 864, 248, 244, 248, 240, 239, 242, 243, 872, - 2044, 227, 228, 229, 230, 231, 232, 233, 881, 244, - 244, 244, 238, 248, 248, 248, 239, 244, 241, 6, - 884, 248, 886, 887, 244, 239, 239, 241, 248, 623, - 624, 625, 2062, 239, 6, 241, 900, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 990, 991, 239, 244, 238, 244, 992, 248, - 244, 248, 239, 244, 248, 244, 244, 248, 244, 248, - 248, 935, 248, 244, 244, 669, 244, 248, 248, 241, - 248, 982, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 1001, 244, 239, 241, 238, 248, 240, 971, 242, 982, - 888, 244, 706, 1272, 244, 248, 244, 895, 248, 243, - 248, 899, 244, 996, 6, 244, 248, 244, 1001, 248, - 244, 248, 726, 4, 248, 6, 1598, 1599, 732, 1012, - 247, 6, 1043, 1044, 1017, 1046, 1047, 1048, 243, 1050, - 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 244, - 244, 244, 244, 248, 248, 248, 248, 247, 244, 239, - 1043, 1044, 248, 1046, 1047, 1048, 9, 1050, 1051, 1052, - 1053, 1054, 1055, 1056, 1057, 1058, 1059, 244, 244, 1062, - 239, 248, 248, 1131, 1132, 239, 239, 243, 239, 1100, - 239, 177, 177, 177, 119, 243, 239, 239, 177, 239, - 239, 4, 806, 239, 239, 243, 243, 239, 6, 243, - 243, 1122, 243, 243, 239, 239, 239, 1100, 1101, 1102, - 239, 239, 239, 239, 6, 6, 241, 1138, 6, 243, - 243, 243, 243, 241, 241, 241, 6, 177, 243, 1122, - 239, 1017, 6, 239, 239, 239, 239, 851, 239, 241, - 6, 6, 6, 243, 1042, 1138, 1139, 8, 8, 7, - 864, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 881, 243, 1190, - 6, 238, 243, 6, 1158, 243, 87, 240, 244, 248, - 7, 6, 240, 1204, 1205, 1206, 248, 243, 243, 238, - 8, 245, 64, 4, 7, 7, 239, 1190, 6, 240, - 1479, 6, 6, 243, 7, 7, 6, 6, 244, 174, - 243, 1204, 1205, 1206, 244, 1101, 1102, 244, 242, 240, - 6, 1459, 1215, 243, 243, 1463, 243, 1220, 243, 245, - 7, 1224, 1253, 1291, 1292, 6, 241, 243, 239, 4, - 1233, 240, 1235, 6, 6, 1238, 6, 6, 241, 7, - 7, 7, 7, 7, 7, 7, 7, 1311, 7, 1313, - 1253, 7, 7, 1247, 7, 7, 7, 7, 7, 243, - 1852, 6, 240, 242, 244, 248, 248, 248, 240, 1272, - 7, 248, 243, 7, 244, 243, 245, 4, 6, 245, - 244, 129, 1313, 244, 7, 6, 245, 7, 1012, 1292, - 7, 1322, 7, 240, 1297, 1326, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 240, - 1313, 248, 248, 238, 9, 248, 240, 245, 247, 1322, - 242, 177, 7, 1326, 1220, 149, 6, 244, 1224, 243, - 8, 6, 4, 46, 46, 245, 239, 1233, 1062, 1235, - 239, 245, 1238, 243, 239, 4, 1377, 1378, 1379, 1485, - 1486, 245, 239, 7, 1385, 7, 7, 248, 177, 240, - 7, 7, 7, 6, 4, 248, 7, 240, 7, 1400, - 7, 109, 4, 6, 1377, 1378, 1379, 243, 239, 7, - 1411, 1670, 1385, 6, 243, 4, 5, 7, 1419, 7, - 7, 1455, 7, 7, 7, 7, 1292, 1400, 6, 6, - 6, 97, 7, 6, 1472, 6, 4, 4, 1411, 248, - 246, 240, 243, 243, 248, 1139, 1419, 243, 6, 1422, - 6, 6, 239, 7, 244, 6, 6, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 241, 239, 6, 243, - 59, 60, 61, 62, 244, 6, 245, 6, 67, 68, - 69, 242, 1516, 72, 248, 74, 6, 6, 123, 6, - 1491, 6, 6, 177, 6, 6, 85, 6, 6, 88, - 6, 6, 6, 6, 6, 5, 1479, 6, 4, 6, - 240, 4, 1485, 1486, 6, 1516, 240, 7, 1491, 6, - 6, 1215, 6, 6, 6, 243, 243, 243, 6, 243, - 243, 1409, 241, 243, 173, 1508, 6, 126, 1576, 6, - 243, 243, 243, 1516, 243, 6, 4, 243, 1521, 243, - 7, 240, 6, 248, 6, 243, 248, 6, 6, 239, - 1594, 4, 248, 239, 245, 243, 239, 1673, 216, 217, + 3, 290, 133, 591, 592, 1178, 3, 54, 681, 3, + 146, 1174, 1355, 98, 5, 100, 47, 20, 4, 1654, + 4, 1656, 20, 697, 302, 177, 1611, 4, 6, 4, + 6, 705, 6, 185, 4, 4, 4, 1641, 5, 712, + 6, 6, 320, 6, 47, 6, 4, 6, 133, 4, + 4, 9, 5, 5, 1822, 728, 96, 4, 7, 53, + 4, 4, 4, 736, 6, 238, 96, 4, 96, 4, + 155, 74, 238, 148, 240, 7, 226, 227, 9, 82, + 226, 227, 4, 0, 87, 226, 227, 238, 118, 240, + 118, 226, 227, 243, 7, 98, 247, 9, 173, 1703, + 93, 247, 6, 96, 6, 98, 247, 4, 83, 387, + 93, 389, 247, 96, 189, 190, 109, 226, 227, 397, + 272, 273, 274, 9, 226, 227, 109, 8, 226, 227, + 133, 1716, 14, 226, 227, 138, 139, 134, 247, 226, + 227, 235, 236, 146, 9, 247, 241, 239, 90, 247, + 244, 9, 247, 156, 247, 247, 99, 100, 831, 239, + 247, 313, 314, 315, 244, 235, 236, 6, 239, 172, + 226, 227, 242, 6, 177, 9, 247, 180, 330, 238, + 226, 227, 185, 186, 6, 161, 163, 164, 165, 166, + 239, 247, 241, 90, 239, 1963, 161, 94, 247, 226, + 227, 247, 247, 100, 101, 236, 103, 104, 6, 184, + 7, 226, 227, 226, 227, 7, 235, 236, 188, 7, + 247, 231, 232, 7, 1567, 122, 210, 237, 7, 173, + 174, 225, 247, 236, 247, 210, 173, 174, 6, 238, + 271, 210, 210, 242, 238, 1408, 249, 221, 222, 252, + 253, 242, 210, 284, 240, 253, 210, 288, 238, 1844, + 246, 245, 221, 222, 242, 268, 243, 242, 271, 272, + 273, 274, 238, 242, 242, 242, 242, 235, 236, 242, + 238, 284, 240, 238, 242, 288, 244, 290, 210, 242, + 242, 238, 6, 60, 61, 244, 63, 238, 211, 212, + 213, 214, 580, 238, 582, 583, 238, 238, 240, 240, + 313, 314, 315, 1898, 988, 989, 242, 239, 403, 241, + 246, 599, 235, 236, 226, 227, 238, 330, 240, 4, + 240, 244, 244, 336, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 238, 240, 240, 239, 237, 241, 244, 239, + 638, 1996, 243, 247, 516, 238, 6, 247, 399, 400, + 235, 236, 508, 238, 238, 240, 241, 235, 236, 244, + 238, 238, 240, 240, 415, 242, 244, 226, 227, 226, + 227, 394, 395, 226, 227, 239, 399, 400, 238, 677, + 240, 235, 236, 247, 238, 242, 240, 238, 180, 240, + 244, 242, 415, 238, 211, 212, 213, 214, 421, 211, + 212, 213, 214, 211, 212, 213, 214, 211, 212, 213, + 214, 425, 211, 212, 213, 214, 521, 226, 227, 442, + 1113, 243, 1115, 235, 236, 247, 2031, 235, 236, 226, + 227, 235, 236, 242, 128, 1128, 238, 132, 133, 134, + 135, 226, 227, 241, 467, 239, 242, 226, 227, 247, + 247, 145, 147, 247, 505, 150, 226, 227, 238, 153, + 154, 155, 247, 238, 515, 159, 160, 490, 247, 238, + 226, 227, 239, 1836, 497, 498, 268, 247, 2083, 502, + 247, 504, 505, 506, 507, 508, 128, 96, 511, 98, + 646, 247, 515, 516, 517, 518, 519, 520, 244, 522, + 246, 524, 520, 145, 522, 128, 293, 294, 226, 227, + 238, 153, 154, 155, 301, 302, 238, 159, 160, 226, + 227, 238, 145, 226, 227, 226, 227, 550, 238, 247, + 153, 154, 155, 556, 6, 7, 159, 160, 235, 236, + 247, 242, 1235, 8, 247, 242, 697, 238, 1241, 243, + 238, 242, 575, 576, 659, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 90, 591, 592, 93, 237, 111, 96, + 128, 226, 227, 597, 239, 883, 241, 228, 229, 230, + 231, 232, 109, 6, 7, 1288, 237, 145, 621, 622, + 623, 243, 247, 395, 618, 153, 154, 155, 1301, 238, + 90, 159, 160, 93, 1307, 243, 96, 238, 98, 247, + 243, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 96, 654, 655, 656, 657, 658, 128, 660, 661, 662, + 663, 664, 747, 243, 667, 663, 90, 247, 238, 93, + 240, 718, 96, 145, 98, 678, 670, 226, 227, 673, + 242, 153, 154, 155, 239, 109, 241, 159, 160, 238, + 6, 685, 247, 242, 132, 133, 226, 227, 238, 243, + 138, 704, 239, 247, 241, 243, 709, 1381, 238, 247, + 247, 238, 242, 240, 238, 243, 239, 244, 241, 96, + 247, 724, 725, 717, 247, 93, 242, 730, 96, 860, + 733, 734, 93, 226, 227, 96, 739, 98, 741, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 524, 238, 238, 240, 237, 226, 227, 228, + 229, 230, 231, 232, 238, 242, 240, 770, 237, 772, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 873, 132, + 133, 244, 237, 243, 247, 138, 1470, 247, 243, 93, + 242, 804, 243, 575, 576, 96, 247, 243, 1482, 238, + 243, 247, 1985, 133, 247, 93, 243, 243, 138, 139, + 247, 247, 589, 590, 243, 243, 243, 594, 247, 247, + 247, 243, 243, 243, 243, 247, 247, 247, 247, 870, + 243, 243, 93, 243, 247, 247, 849, 247, 96, 621, + 622, 623, 172, 238, 2017, 240, 243, 988, 989, 862, + 247, 243, 4, 4, 243, 247, 186, 870, 247, 2042, + 243, 243, 4, 243, 247, 247, 879, 247, 243, 243, + 4, 5, 247, 247, 239, 243, 241, 242, 882, 247, + 884, 885, 243, 4, 243, 667, 247, 2060, 247, 243, + 238, 238, 243, 247, 898, 990, 247, 243, 243, 243, + 243, 247, 247, 247, 247, 243, 243, 243, 6, 247, + 247, 247, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 7, 704, 238, 238, 59, 60, 61, 62, 933, + 238, 6, 243, 67, 68, 69, 247, 243, 72, 980, + 74, 247, 724, 243, 4, 243, 6, 247, 730, 247, + 84, 243, 243, 87, 240, 247, 247, 239, 999, 241, + 242, 238, 240, 242, 6, 969, 246, 980, 242, 6, + 246, 1270, 238, 9, 238, 238, 238, 242, 238, 238, + 176, 994, 176, 176, 238, 242, 999, 118, 1129, 1130, + 238, 125, 238, 238, 176, 242, 238, 1010, 1596, 1597, + 1041, 1042, 1015, 1044, 1045, 1046, 238, 1048, 1049, 1050, + 1051, 1052, 1053, 1054, 1055, 1056, 1057, 242, 242, 4, + 242, 242, 804, 242, 238, 238, 238, 238, 1041, 1042, + 238, 1044, 1045, 1046, 238, 1048, 1049, 1050, 1051, 1052, + 1053, 1054, 1055, 1056, 1057, 6, 238, 1060, 238, 240, + 6, 6, 6, 242, 242, 242, 242, 1098, 192, 193, + 194, 240, 240, 240, 394, 6, 242, 849, 176, 203, + 238, 238, 238, 207, 238, 209, 210, 238, 238, 1120, + 862, 240, 6, 6, 242, 1098, 1099, 1100, 6, 8, + 6, 8, 242, 7, 6, 1136, 242, 879, 6, 242, + 86, 235, 236, 243, 239, 7, 247, 1120, 242, 886, + 244, 247, 6, 239, 242, 242, 893, 237, 64, 244, + 897, 8, 4, 1136, 1137, 238, 7, 7, 6, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 1188, 1289, 1290, + 239, 237, 1156, 6, 242, 7, 6, 173, 7, 6, + 6, 1202, 1203, 1204, 243, 242, 6, 243, 239, 1457, + 243, 241, 502, 1461, 504, 1188, 506, 507, 1477, 242, + 242, 242, 7, 242, 6, 240, 244, 517, 518, 1202, + 1203, 1204, 238, 242, 4, 6, 239, 6, 6, 6, + 1213, 240, 7, 7, 7, 1218, 7, 7, 7, 1222, + 1251, 7, 7, 7, 1309, 7, 1311, 7, 1231, 7, + 1233, 7, 7, 1236, 7, 7, 6, 242, 1010, 239, + 241, 7, 7, 247, 247, 247, 243, 239, 1251, 247, + 243, 1245, 242, 244, 242, 4, 6, 244, 243, 243, + 7, 128, 1850, 6, 244, 7, 7, 1270, 7, 239, + 239, 9, 239, 1040, 247, 247, 247, 241, 244, 176, + 1311, 246, 7, 148, 243, 242, 6, 1290, 1060, 1320, + 6, 4, 1295, 1324, 46, 46, 244, 238, 238, 242, + 238, 238, 244, 4, 7, 244, 239, 7, 1311, 7, + 176, 7, 247, 7, 7, 6, 239, 1320, 247, 7, + 7, 1324, 7, 4, 4, 645, 242, 647, 648, 649, + 650, 651, 652, 6, 654, 655, 656, 657, 238, 1470, + 660, 661, 662, 7, 1375, 1376, 1377, 1483, 1484, 108, + 6, 242, 1383, 7, 7, 7, 7, 7, 7, 7, + 6, 6, 6, 96, 7, 1137, 6, 1398, 1453, 6, + 4, 4, 1375, 1376, 1377, 239, 245, 6, 1409, 1668, + 1383, 242, 6, 13, 14, 247, 1417, 247, 242, 242, + 6, 243, 7, 6, 240, 1398, 6, 238, 242, 6, + 238, 6, 6, 6, 6, 122, 1409, 6, 243, 241, + 244, 6, 6, 733, 1417, 176, 247, 1420, 6, 6, + 6, 741, 6, 6, 6, 6, 6, 6, 5, 1514, + 239, 239, 6, 4, 6, 4, 6, 242, 242, 7, + 242, 1213, 6, 1574, 6, 6, 242, 6, 6, 172, + 242, 6, 240, 6, 6, 242, 6, 238, 1489, 242, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 242, 1477, 242, 106, 107, 108, 109, + 1483, 1484, 112, 1514, 242, 242, 1489, 242, 118, 119, + 244, 247, 122, 123, 247, 125, 126, 242, 7, 239, + 4, 247, 7, 1506, 6, 6, 242, 1592, 243, 6, + 247, 1514, 6, 8, 144, 4, 1519, 238, 6, 238, + 6, 6, 6, 1295, 6, 5, 4, 94, 242, 239, + 242, 6, 247, 6, 6, 1671, 247, 6, 168, 169, + 170, 6, 6, 247, 239, 247, 6, 6, 6, 1634, + 247, 6, 242, 1684, 1585, 6, 1641, 1642, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 6, 1660, 242, 7, 237, 242, + 1611, 1859, 1585, 5, 239, 1588, 1589, 6, 6, 6, + 6, 128, 7, 6, 6, 1626, 243, 239, 1887, 1596, + 1597, 242, 6, 242, 7, 243, 242, 6, 1611, 244, + 6, 171, 243, 243, 1617, 243, 243, 6, 6, 242, + 6, 6, 243, 1626, 6, 239, 1657, 6, 6, 174, + 242, 6, 243, 1636, 4, 5, 1639, 243, 238, 1670, + 1407, 242, 239, 6, 242, 6, 242, 6, 1420, 242, + 6, 243, 242, 6, 1657, 6, 6, 242, 6, 6, + 1654, 1664, 1656, 239, 6, 1668, 6, 1670, 1671, 6, + 243, 1949, 6, 6, 6, 6, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 1716, 243, 6, 242, 59, + 60, 61, 62, 242, 6, 1015, 6, 67, 68, 69, + 1703, 242, 72, 1788, 74, 6, 6, 6, 1986, 6, + 6, 1998, 1300, 1716, 84, 8, 1350, 87, 1524, 1750, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 6, 1823, + 439, 1319, 237, 1828, 239, 1786, 241, 1750, 3, 1581, + 3, 3, 3, 570, 1450, 125, 1846, 3, 1664, 1762, + 1484, 1528, 1641, -1, -1, 733, -1, -1, -1, -1, + -1, -1, 1775, -1, -1, -1, -1, -1, -1, 1099, + 1100, 1812, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1824, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1812, + -1, -1, -1, 1844, -1, -1, 1588, 1589, -1, -1, + -1, 1824, 192, 193, 194, -1, 1829, 1858, -1, -1, + -1, -1, -1, 203, -1, -1, -1, 207, -1, 209, + 210, 1844, -1, -1, 1847, 1612, 1613, 1614, 1615, 1616, + 1617, -1, -1, 1850, -1, 1858, -1, -1, -1, 1862, + -1, -1, -1, -1, -1, -1, -1, 1898, -1, 239, + -1, 241, 242, -1, -1, -1, -1, -1, -1, 1964, + -1, -1, -1, -1, 1887, -1, -1, -1, -1, -1, + -1, 1922, -1, 6, -1, 1898, -1, -1, 1218, -1, + -1, -1, 1222, -1, -1, -1, -1, -1, -1, -1, + -1, 1231, -1, 1233, -1, -1, 1236, -1, -1, 1922, + -1, -1, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 1934, -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 1587, 248, 244, 7, - 238, 6, 240, 6, 6, 6, 6, 95, 5, 243, - 240, 248, 1636, 1297, 193, 194, 195, 243, 6, 1643, - 1644, 6, 1613, 6, 1587, 204, 248, 1590, 1591, 208, - 6, 210, 211, 6, 6, 248, 240, 1628, 1662, 248, - 1889, 6, 4, 6, 5, 1598, 1599, 6, 243, 6, - 1613, 6, 1508, 1861, 248, 6, 1619, 243, 1686, 7, - 6, 243, 1530, 6, 243, 1628, 6, 243, 1659, 240, - 6, 129, 7, 243, 243, 1638, 6, 6, 1641, 6, - 244, 1672, 244, 7, 240, 244, 6, 172, 6, 244, - 244, 6, 245, 6, 243, 6, 1659, 6, 6, 6, - 6, 244, 1656, 1666, 1658, 240, 243, 1670, 175, 1672, - 1673, 6, 243, 239, 244, 244, 243, 240, 243, 6, - 6, 243, 6, 6, 244, 243, 6, 1718, 6, 243, - 6, 6, 240, 6, 6, 6, 6, 6, 1422, 6, - 6, 244, 1705, 1951, 244, 6, 1614, 1615, 1616, 1617, - 1618, 1619, 6, 6, 6, 1718, 6, 6, 6, 243, - 6, 1752, 243, 6, 243, 6, 1790, 1302, 2000, 1352, - 1526, 1825, 441, 1583, 1788, 1321, 3, 3, 3, 3, - 1988, 1848, 1638, 1452, 3, 1641, 1666, 572, 1643, 1752, - 1486, -1, 6, -1, -1, -1, -1, -1, -1, 735, - -1, 1764, -1, -1, -1, -1, 1830, -1, -1, -1, - -1, -1, -1, -1, 1777, -1, -1, -1, -1, -1, - -1, -1, -1, 1814, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1826, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1814, -1, -1, -1, 1846, -1, -1, -1, -1, - -1, -1, -1, 1826, -1, -1, -1, -1, 1831, 1860, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1846, -1, -1, 1849, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1860, -1, 1852, - -1, 1864, -1, -1, -1, -1, 1590, 1591, -1, 1900, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1889, -1, -1, -1, - -1, -1, -1, 1924, -1, -1, -1, 1900, -1, -1, - -1, -1, 1966, 216, 217, 218, 219, 220, 221, 222, + 228, 229, 230, 231, 232, -1, -1, -1, -1, 237, + 1290, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1988, 1989, 1990, 1991, 1992, + -1, -1, -1, -1, 106, -1, -1, -1, -1, -1, + 2031, -1, 1996, 1775, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, 133, -1, 237, 2018, 137, -1, -1, 2031, 141, + -1, -1, -1, 6, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2047, 157, 158, 159, -1, 161, + 162, 163, 2083, 165, 166, 167, 168, 169, 170, 171, + -1, 173, 174, 175, 176, -1, 2069, -1, 180, -1, + -1, -1, -1, -1, -1, 1847, -1, -1, -1, -1, + 2083, -1, -1, -1, -1, -1, -1, 2090, 2091, -1, + 1862, -1, -1, -1, -1, -1, 1863, 1864, 1865, 1866, + 1867, 2104, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 1924, -1, -1, -1, 238, -1, -1, -1, -1, - -1, 6, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1936, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1865, 1866, 1867, - 1868, 1869, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, -1, 1990, 1991, 1992, - 1993, 1994, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 2033, -1, 1998, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1923, -1, -1, -1, 1927, - -1, -1, -1, -1, -1, -1, 2020, -1, -1, -1, - 2033, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 107, -1, 2049, -1, -1, -1, - -1, -1, -1, 1777, 2085, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1974, -1, 2071, -1, - 1978, 134, -1, -1, -1, 138, -1, -1, -1, 142, - -1, -1, 2085, 6, -1, -1, 1994, -1, -1, 2092, - 2093, -1, -1, -1, -1, -1, 159, 160, 161, -1, - 163, 164, 165, 2106, 167, 168, 169, 170, 171, 172, - 173, -1, 175, 176, 177, 178, -1, -1, -1, 182, - -1, -1, -1, -1, -1, 1849, -1, -1, -1, -1, - -1, 2039, 2040, -1, -1, -1, -1, -1, -1, -1, - 1864, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, 7, - 8, -1, -1, 238, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 2071, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 250, 251, 252, - 253, 254, -1, -1, -1, -1, 2092, 2093, -1, -1, - -1, -1, -1, -1, -1, -1, 269, 270, -1, -1, - 2106, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 288, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 298, 299, -1, -1, -1, - -1, 304, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 314, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1990, 1991, 1992, 1993, - 1994, -1, -1, -1, 337, 338, -1, -1, -1, 342, - 343, 344, -1, 346, -1, -1, -1, 350, 351, 352, - -1, -1, 355, 216, 217, 218, 219, 220, 221, 222, + -1, -1, -1, -1, 237, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 248, 249, 250, 251, + 252, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1921, 267, 268, -1, 1925, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 286, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 296, 297, 1506, -1, -1, -1, + 302, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 312, -1, -1, -1, -1, 1972, -1, -1, -1, 1976, + -1, -1, -1, -1, -1, -1, 1988, 1989, 1990, 1991, + 1992, -1, -1, 335, 336, 1992, -1, -1, 340, 341, + 342, -1, 344, -1, -1, -1, 348, 349, 350, -1, + -1, 353, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, -1, -1, -1, -1, 238, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 2049, -1, -1, -1, -1, - 393, -1, -1, -1, 397, 398, -1, -1, -1, -1, + -1, -1, -1, -1, 237, -1, -1, -1, -1, -1, + 2037, 2038, -1, -1, -1, 2047, -1, -1, -1, 391, + -1, -1, -1, 395, 396, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 414, 415, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 428, -1, -1, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, -1, 450, -1, -1, - 238, 454, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 468, 469, -1, -1, -1, - 473, -1, -1, 476, 477, 478, 479, 480, 481, 482, - 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, - 493, 494, 495, 496, 497, 498, 499, 500, -1, 502, - 503, -1, 505, -1, -1, -1, -1, -1, -1, 512, - -1, -1, 515, 516, -1, -1, -1, -1, 521, -1, - -1, -1, -1, 526, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 538, 539, 540, 541, 542, - 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, - 553, 554, 555, 556, 557, -1, 559, 560, -1, -1, - -1, -1, -1, 566, 567, 568, -1, -1, -1, -1, - -1, 574, 575, -1, 577, 578, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 4, 5, -1, -1, - -1, -1, -1, 596, 597, 598, -1, -1, -1, 602, - 603, 604, 605, 606, 607, 608, 609, 610, -1, -1, - -1, -1, 615, -1, 617, -1, 619, -1, -1, -1, - 623, 624, 625, 626, -1, 628, 629, 630, 46, 47, - 48, 49, 50, 51, 52, 53, 54, -1, -1, -1, - -1, 59, 60, 61, 62, -1, -1, -1, -1, 67, - 68, 69, 655, -1, 72, -1, 74, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 669, 85, -1, -1, - 88, -1, -1, 676, -1, 678, -1, -1, 681, 682, - -1, -1, -1, -1, -1, 182, -1, 690, -1, -1, - -1, -1, -1, 696, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 706, 7, -1, -1, -1, 126, 712, - 713, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 726, -1, 728, 729, -1, -1, 732, - 733, -1, -1, -1, 737, -1, -1, -1, -1, -1, - -1, 744, -1, -1, 6, 748, -1, -1, -1, -1, - -1, -1, -1, -1, 251, -1, -1, 254, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 770, -1, 772, - -1, 774, -1, 270, -1, 193, 194, 195, -1, -1, - -1, -1, -1, -1, -1, -1, 204, -1, -1, -1, - 208, -1, 210, 211, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 806, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 816, -1, -1, -1, -1, 236, 237, - 6, -1, -1, -1, -1, 243, -1, 245, -1, -1, + 412, 413, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 426, -1, 1636, -1, -1, 1639, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 338, -1, -1, -1, -1, -1, -1, 851, -1, + -1, -1, -1, -1, -1, -1, 448, -1, -1, -1, + 452, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 466, 467, -1, -1, -1, 471, + -1, -1, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, -1, 500, 501, + -1, 503, -1, -1, -1, -1, -1, -1, 510, -1, + -1, 513, 514, -1, -1, -1, -1, 519, -1, -1, + -1, -1, 524, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, -1, 557, 558, -1, -1, -1, + -1, -1, 564, 565, 566, -1, -1, -1, -1, -1, + 572, 573, -1, 575, 576, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4, 5, 594, 595, 596, -1, -1, -1, 600, 601, + 602, 603, 604, 605, 606, 607, 608, -1, -1, -1, + -1, 613, -1, 615, -1, 617, -1, -1, -1, 621, + 622, 623, 624, -1, 626, 627, 628, -1, -1, -1, + -1, -1, 46, 47, 48, 49, 50, 51, 52, 53, + 54, -1, -1, -1, -1, 59, 60, 61, 62, -1, + -1, 653, -1, 67, 68, 69, -1, -1, 72, -1, + 74, -1, -1, -1, -1, 667, -1, -1, -1, -1, + 84, -1, 674, 87, 676, -1, -1, 679, 680, -1, + -1, -1, -1, -1, 180, -1, 688, -1, -1, -1, + -1, -1, 694, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 704, 6, -1, -1, -1, -1, 710, 711, + -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 724, -1, 726, 727, -1, -1, 730, 731, + -1, -1, -1, 735, -1, -1, -1, -1, -1, -1, + 742, -1, -1, -1, 746, -1, -1, -1, -1, -1, + -1, -1, -1, 249, -1, -1, 252, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 768, -1, 770, -1, + 772, -1, 268, -1, -1, -1, -1, -1, 192, 193, + 194, -1, -1, -1, -1, -1, -1, -1, -1, 203, + -1, -1, -1, 207, -1, 209, 210, -1, -1, -1, + -1, -1, 804, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 814, -1, -1, -1, -1, -1, -1, -1, + 6, -1, -1, -1, -1, -1, -1, -1, 242, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 864, -1, -1, -1, -1, -1, -1, 871, -1, - -1, -1, 875, -1, -1, -1, -1, -1, 881, -1, - -1, -1, -1, -1, -1, -1, 889, 890, -1, -1, - -1, -1, 895, -1, -1, -1, -1, -1, -1, -1, - 397, -1, -1, -1, -1, -1, -1, -1, 911, -1, - -1, 914, -1, 216, 217, 218, 219, 220, 221, 222, + 336, -1, -1, -1, -1, -1, -1, 849, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2069, + 862, -1, -1, -1, -1, -1, -1, 869, -1, -1, + -1, 873, -1, -1, -1, -1, -1, 879, -1, -1, + 2090, 2091, -1, -1, -1, 887, 888, -1, -1, -1, + -1, 893, -1, -1, 2104, -1, -1, -1, -1, 395, + -1, -1, -1, -1, -1, -1, -1, 909, -1, -1, + 912, -1, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, 934, -1, 936, 937, 238, -1, -1, -1, -1, + 932, -1, 934, 935, 237, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 955, -1, 216, 217, 218, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 469, 8, -1, 978, 238, -1, -1, -1, - -1, -1, 985, 986, 987, 988, -1, -1, -1, -1, - 993, -1, -1, -1, -1, 492, -1, -1, -1, -1, - -1, -1, 499, 500, 1007, 1008, -1, -1, -1, 1012, + -1, 953, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 6, -1, -1, -1, -1, -1, -1, + -1, 467, -1, -1, 976, -1, -1, -1, -1, -1, + -1, 983, 984, 985, 986, -1, -1, -1, -1, 991, + -1, -1, -1, -1, 490, -1, -1, -1, -1, -1, + -1, 497, 498, 1005, 1006, -1, -1, -1, 1010, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 521, -1, -1, -1, -1, 526, + -1, -1, -1, 519, -1, -1, -1, -1, 524, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, -1, -1, - -1, -1, 238, -1, -1, 552, -1, -1, -1, 1062, + 226, 227, 228, 229, 230, 231, 232, -1, -1, -1, + -1, 237, -1, -1, 550, -1, -1, -1, 1060, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1078, -1, -1, -1, -1, - 577, 578, -1, -1, -1, 1088, 1089, 1090, -1, -1, - -1, -1, 1095, 1096, -1, 1098, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1110, 1111, -1, - -1, -1, -1, -1, -1, 1118, 1119, -1, -1, -1, - -1, -1, 1125, -1, 1127, 1128, 623, 624, 625, -1, - -1, 1134, 1135, -1, -1, -1, 1139, -1, -1, -1, + -1, -1, -1, -1, 1076, -1, -1, -1, -1, 575, + 576, -1, -1, -1, 1086, 1087, 1088, -1, -1, -1, + -1, 1093, 1094, -1, 1096, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1108, 1109, -1, -1, + -1, -1, -1, -1, 1116, 1117, -1, -1, -1, -1, + -1, 1123, -1, 1125, 1126, 621, 622, 623, -1, -1, + 1132, 1133, -1, -1, -1, 1137, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 22, 23, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1170, -1, -1, - -1, -1, 669, -1, -1, -1, -1, -1, -1, -1, - -1, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, -1, - 1203, -1, -1, 238, -1, -1, -1, -1, -1, 706, - -1, -1, 1215, -1, -1, -1, -1, -1, -1, -1, - 1223, -1, -1, -1, -1, -1, -1, -1, -1, 726, - -1, -1, -1, -1, -1, 732, -1, -1, -1, -1, - -1, 1244, 1245, -1, -1, 6, 1249, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1263, -1, -1, 1266, -1, 134, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 772, -1, 774, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1293, -1, -1, 1296, 1297, 1298, -1, -1, -1, -1, - -1, -1, -1, 1306, -1, 1308, -1, 1310, 1311, 806, + -1, -1, -1, 21, 22, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1168, -1, -1, -1, + -1, 667, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + -1, -1, -1, -1, 237, -1, -1, -1, -1, 1201, + -1, -1, -1, -1, -1, -1, -1, -1, 704, -1, + -1, 1213, -1, -1, -1, -1, -1, -1, -1, 1221, + -1, -1, -1, -1, -1, -1, -1, -1, 724, -1, + -1, -1, -1, -1, 730, -1, -1, -1, -1, -1, + 1242, 1243, -1, -1, -1, 1247, 6, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1261, + -1, -1, 1264, -1, -1, 133, -1, -1, -1, -1, + -1, -1, -1, -1, 770, -1, 772, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1291, + -1, -1, 1294, 1295, 1296, -1, -1, -1, -1, -1, + -1, -1, 1304, -1, 1306, -1, 1308, 1309, 804, -1, -1, -1, -1, -1, 6, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 194, 195, 196, 197, 198, - 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, - 219, 220, 221, 222, 851, 224, 225, -1, -1, -1, - -1, -1, 231, 232, -1, -1, -1, 864, -1, -1, - -1, -1, -1, 242, 243, -1, -1, -1, -1, -1, - -1, 1384, -1, -1, 881, -1, -1, -1, 1391, 1392, - 1393, -1, -1, -1, -1, -1, -1, 1400, -1, 1402, - -1, -1, -1, -1, -1, -1, 1409, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1422, - -1, -1, -1, -1, 1427, -1, -1, -1, -1, -1, - -1, -1, 1435, 1436, 1437, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 1447, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 1457, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, -1, -1, -1, -1, 238, -1, -1, - 1483, -1, -1, -1, -1, -1, 1489, 1490, 357, 358, - 359, 8, -1, -1, 363, 364, 365, 366, 367, 368, - 369, -1, 371, -1, -1, -1, 375, 376, -1, -1, - 379, -1, -1, -1, -1, 1012, -1, -1, 1521, -1, - -1, -1, -1, 392, 216, 217, 218, 219, 220, 221, + -1, -1, -1, -1, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, 220, 849, 222, 223, -1, -1, -1, -1, + -1, 229, 230, -1, -1, -1, 862, -1, -1, -1, + -1, -1, 240, 241, -1, -1, -1, -1, -1, -1, + 1382, -1, -1, 879, -1, -1, -1, 1389, 1390, 1391, + -1, -1, -1, -1, -1, -1, 1398, -1, 1400, -1, + -1, -1, -1, -1, -1, 1407, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1420, -1, + -1, -1, -1, 1425, -1, -1, -1, -1, -1, -1, + -1, 1433, 1434, 1435, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1445, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1455, -1, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, -1, -1, -1, -1, 237, -1, 1481, + -1, -1, -1, -1, -1, 1487, 1488, 355, 356, 357, + 6, -1, -1, 361, 362, 363, 364, 365, 366, 367, + -1, 369, -1, -1, -1, 373, 374, -1, -1, 377, + -1, -1, -1, -1, 1010, -1, -1, 1519, -1, -1, + -1, -1, 390, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, -1, -1, -1, -1, 238, -1, -1, -1, - -1, -1, -1, 1556, 1557, 1558, -1, -1, -1, -1, - -1, -1, -1, -1, 1567, 1062, -1, -1, -1, 1572, - 1573, 1574, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1585, -1, -1, -1, -1, 1590, 1591, 1592, - -1, 1594, -1, -1, -1, -1, -1, 1600, 1601, -1, + 232, -1, -1, -1, -1, 237, -1, -1, -1, -1, + -1, -1, 1554, 1555, 1556, -1, -1, -1, -1, -1, + -1, -1, -1, 1565, 1060, -1, -1, -1, 1570, 1571, + 1572, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1583, -1, -1, -1, -1, 1588, 1589, 1590, -1, + 1592, -1, -1, -1, -1, -1, 1598, 1599, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1619, -1, -1, -1, - 1623, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1636, -1, -1, 1639, -1, -1, -1, - 1643, -1, 1139, -1, -1, -1, -1, -1, -1, 1652, - 1653, -1, 1655, -1, -1, -1, -1, -1, -1, -1, - 1663, 6, -1, -1, -1, 534, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1679, -1, -1, -1, - -1, 1684, 1685, -1, -1, -1, -1, -1, -1, 419, - -1, -1, -1, -1, 1697, 6, -1, 1700, 1701, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, -1, 1215, -1, - 6, 238, -1, -1, -1, -1, -1, 1730, -1, -1, + -1, -1, -1, -1, -1, 1617, -1, -1, -1, 1621, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 1746, -1, -1, -1, -1, -1, -1, - -1, -1, 1755, -1, -1, -1, -1, -1, -1, -1, - -1, 1764, -1, -1, -1, -1, -1, -1, -1, -1, - 1773, 1774, -1, -1, 1777, -1, -1, -1, -1, -1, - -1, -1, -1, 513, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 6, -1, -1, -1, -1, -1, -1, - 1297, -1, -1, -1, -1, -1, -1, -1, 1811, 1812, + -1, -1, 1634, -1, -1, 1637, -1, -1, -1, 1641, + -1, 1137, -1, -1, -1, -1, -1, -1, 1650, 1651, + -1, 1653, -1, -1, -1, -1, -1, -1, -1, 1661, + 6, -1, -1, -1, 532, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1677, -1, -1, -1, -1, + 1682, 1683, -1, -1, -1, -1, -1, -1, 417, -1, + -1, -1, -1, 1695, 6, -1, 1698, 1699, -1, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 1213, -1, -1, + 6, 237, -1, -1, -1, -1, 1728, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 1829, -1, -1, 1832, - -1, -1, -1, 563, 1837, -1, -1, 1840, -1, -1, - -1, -1, -1, -1, -1, -1, 1849, -1, -1, -1, + -1, -1, 1744, -1, -1, -1, -1, -1, -1, -1, + -1, 1753, -1, -1, -1, -1, -1, -1, -1, -1, + 1762, -1, -1, -1, -1, -1, -1, -1, -1, 1771, + 1772, -1, -1, 1775, -1, -1, -1, -1, -1, -1, + -1, -1, 511, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 6, -1, -1, -1, -1, -1, 1295, + -1, -1, -1, -1, -1, -1, -1, 1809, 1810, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 1864, -1, -1, -1, -1, -1, -1, -1, 1872, - -1, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, -1, - -1, -1, -1, 238, 1897, -1, -1, -1, -1, -1, - 1903, -1, -1, 1906, -1, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, -1, -1, 1422, -1, 238, -1, 1932, + -1, -1, -1, -1, -1, 1827, -1, -1, 1830, -1, + -1, -1, 561, 1835, -1, -1, 1838, -1, -1, -1, + -1, -1, -1, -1, -1, 1847, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1862, -1, -1, -1, -1, -1, -1, -1, 1870, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, -1, -1, -1, + -1, 237, -1, 1895, -1, -1, -1, -1, -1, 1901, + -1, -1, 1904, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, -1, -1, -1, 1420, 237, -1, -1, 1930, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, -1, -1, - -1, -1, 238, -1, 1957, 1958, -1, -1, -1, -1, - 829, -1, -1, -1, -1, -1, 1969, 1970, -1, 1972, + 226, 227, 228, 229, 230, 231, 232, -1, -1, -1, + -1, 237, -1, 1955, 1956, -1, -1, -1, -1, 827, + -1, -1, -1, -1, -1, 1967, 1968, -1, 1970, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1985, -1, -1, -1, -1, 1990, 1991, 1992, - 1993, 1994, -1, -1, 863, -1, -1, 2000, -1, -1, - -1, 2004, -1, 216, 217, 218, 219, 220, 221, 222, + -1, 1983, -1, -1, -1, -1, 1988, 1989, 1990, 1991, + 1992, -1, -1, 861, -1, -1, 1998, -1, -1, -1, + 2002, -1, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, -1, -1, -1, 1521, 238, -1, -1, 2031, -1, - -1, -1, -1, 2036, 2037, 2038, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 2049, -1, 778, 779, - 780, 781, 782, 783, 784, 785, 786, 787, 788, -1, - 790, 791, 792, 793, -1, 795, 796, 797, 798, -1, - -1, 6, -1, -1, 2077, 2078, 2079, -1, -1, 809, - -1, 811, -1, -1, -1, -1, -1, -1, -1, 819, - -1, -1, -1, 1590, 1591, 825, 826, -1, -1, -1, - -1, -1, -1, -1, 834, -1, -1, -1, -1, -1, + -1, -1, -1, 1519, 237, -1, -1, 2029, -1, -1, + -1, -1, 2034, 2035, 2036, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2047, -1, 776, 777, 778, + 779, 780, 781, 782, 783, 784, 785, 786, -1, 788, + 789, 790, 791, -1, 793, 794, 795, 796, -1, -1, + -1, 6, -1, 2075, 2076, 2077, -1, -1, 807, -1, + 809, -1, -1, -1, -1, -1, -1, -1, 817, -1, + -1, -1, 1588, 1589, 823, 824, -1, -1, -1, -1, + -1, -1, -1, 832, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1619, 3, 4, 5, -1, 7, -1, -1, + -1, 1617, -1, 3, 4, 5, -1, 7, -1, -1, 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, - -1, -1, -1, -1, -1, 1034, 46, 47, 48, 49, + -1, -1, -1, -1, 1032, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, -1, 67, 68, 69, -1, -1, 72, -1, 74, 75, 76, 77, -1, -1, - -1, -1, -1, 83, 84, 85, 86, -1, 88, -1, - -1, 941, 942, 943, -1, -1, -1, 947, 948, -1, - -1, 951, 952, 953, 954, -1, 956, -1, -1, -1, - -1, 961, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 126, -1, -1, -1, - -1, -1, -1, -1, 1123, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 1764, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 1777, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, -1, - -1, -1, -1, 238, -1, 185, -1, -1, -1, -1, - 1040, 1041, 192, 193, 194, 195, 196, -1, -1, -1, - -1, 201, 202, 203, 204, 205, 206, 207, 208, -1, - 210, 211, 212, 213, 214, 215, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 227, 228, -1, - -1, -1, 1849, -1, 234, -1, 236, 237, -1, 239, - -1, 241, 3, 4, -1, 245, 246, 1864, -1, 10, - 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, - -1, -1, -1, -1, -1, -1, 1136, 1276, 1277, -1, - -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, - -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 75, 76, 77, -1, -1, -1, - -1, -1, 83, 84, -1, 86, -1, -1, -1, -1, + -1, -1, 82, 83, 84, 85, -1, 87, -1, -1, + 939, 940, 941, -1, -1, -1, 945, 946, -1, -1, + 949, 950, 951, 952, -1, 954, -1, -1, -1, -1, + 959, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, + -1, -1, -1, 1121, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1762, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1775, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, -1, -1, + -1, -1, 237, -1, 184, -1, -1, -1, -1, 1038, + 1039, 191, 192, 193, 194, 195, -1, -1, -1, -1, + 200, 201, 202, 203, 204, 205, 206, 207, -1, 209, + 210, 211, 212, 213, 214, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 226, 227, -1, -1, + -1, 1847, -1, 233, -1, 235, 236, -1, 238, -1, + 240, 3, 4, -1, 244, 245, 1862, -1, 10, 11, + 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, + -1, -1, -1, -1, -1, 1134, 1274, 1275, -1, -1, + -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, + -1, 63, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 75, 76, 77, -1, -1, -1, -1, + 82, 83, -1, 85, -1, -1, -1, -1, -1, -1, 3, 4, -1, -1, -1, -1, -1, 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, -1, -1, 1357, -1, - -1, -1, -1, 1990, 1991, 1992, 1993, 1994, 1367, -1, + 33, 34, 35, 36, 37, 38, -1, 1355, -1, -1, + -1, -1, 1988, 1989, 1990, 1991, 1992, 1365, -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, -1, 6, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 75, 76, 77, -1, -1, -1, -1, -1, - 83, 84, -1, 86, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1275, -1, -1, -1, -1, - -1, 192, 2049, -1, -1, 196, -1, -1, -1, -1, - 201, 202, 203, -1, 205, 206, 207, -1, -1, -1, - 211, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1312, -1, -1, -1, 227, 228, -1, -1, - -1, -1, -1, 234, -1, -1, -1, -1, 239, -1, - -1, -1, 243, -1, -1, 246, -1, -1, -1, -1, - 1340, 1341, 1342, 1343, 1344, -1, -1, -1, -1, 1349, - 1350, -1, -1, 1353, -1, 1355, -1, -1, -1, 1359, - -1, -1, 1362, -1, -1, -1, -1, -1, -1, 192, - -1, -1, -1, 196, 1374, -1, -1, -1, 201, 202, - 203, 1520, 205, 206, 207, -1, -1, -1, 211, -1, + -1, -1, 75, 76, 77, -1, -1, -1, -1, 82, + 83, -1, 85, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1273, -1, -1, -1, -1, 191, + -1, 2047, -1, 195, -1, -1, -1, -1, 200, 201, + 202, -1, 204, 205, 206, -1, -1, -1, 210, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 227, 228, -1, -1, -1, -1, - -1, 234, -1, -1, -1, -1, 239, -1, -1, -1, - 243, -1, -1, 246, -1, -1, -1, -1, -1, -1, + -1, 1310, -1, -1, 226, 227, -1, -1, -1, -1, + -1, 233, -1, -1, -1, -1, 238, -1, -1, -1, + 242, -1, -1, 245, -1, -1, -1, -1, -1, 1338, + 1339, 1340, 1341, 1342, -1, -1, -1, -1, 1347, 1348, + -1, -1, 1351, -1, 1353, -1, -1, -1, 1357, -1, + -1, 1360, -1, -1, -1, -1, -1, -1, 191, -1, + -1, -1, 195, 1372, -1, -1, -1, 200, 201, 202, + 1518, 204, 205, 206, -1, -1, -1, 210, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 226, 227, -1, -1, -1, -1, -1, + 233, -1, -1, -1, -1, 238, -1, -1, -1, 242, + -1, -1, 245, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, -1, - -1, -1, -1, 1443, -1, 1445, -1, -1, -1, 1449, - -1, 1451, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1485, -1, -1, -1, -1, + -1, -1, 1441, -1, 1443, -1, -1, -1, 1447, -1, + 1449, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1483, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 4, 5, -1, -1, -1, -1, 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 6, -1, 46, 47, 48, 49, 50, 51, 52, 53, + 7, 8, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, 69, -1, -1, 72, -1, - 74, 75, 76, 77, -1, 1575, -1, -1, -1, 83, - 84, 85, 86, -1, 88, -1, -1, 91, -1, -1, - 94, -1, -1, 97, -1, 99, -1, -1, -1, -1, - -1, -1, 106, -1, -1, -1, 110, -1, -1, -1, - -1, -1, -1, -1, -1, 119, -1, 121, -1, -1, - 124, -1, 126, -1, -1, -1, -1, -1, -1, 133, - 134, 135, 136, 137, -1, -1, 140, 141, 142, 143, - 144, -1, -1, -1, 148, -1, -1, 151, 216, 217, + 74, 75, 76, 77, 1573, -1, -1, -1, 82, 83, + 84, 85, -1, 87, -1, -1, 90, -1, -1, 93, + -1, -1, 96, -1, 98, -1, -1, -1, -1, -1, + -1, 105, -1, -1, -1, 109, -1, -1, -1, -1, + -1, -1, -1, -1, 118, -1, 120, -1, -1, 123, + -1, 125, -1, -1, -1, -1, -1, -1, 132, 133, + 134, 135, 136, -1, -1, 139, 140, 141, 142, 143, + -1, -1, -1, 147, -1, -1, 150, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, -1, -1, -1, -1, - 238, -1, -1, -1, -1, 1675, -1, -1, 1678, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 192, 193, - 194, 195, 196, 197, -1, -1, -1, 201, 202, 203, - 204, 205, 206, 207, 208, -1, 210, 211, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1719, - 1720, -1, 1722, 227, 228, 6, -1, -1, -1, -1, - 234, -1, -1, -1, -1, 239, -1, -1, -1, 243, - -1, -1, 246, -1, -1, -1, -1, -1, -1, -1, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, -1, -1, - -1, -1, 238, -1, -1, -1, -1, -1, -1, -1, - -1, 1781, 1782, -1, -1, 3, 4, 5, -1, -1, - -1, -1, 10, 11, 12, -1, -1, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, -1, 1827, 46, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, -1, -1, 67, - 68, 69, -1, -1, 72, -1, 74, 75, 76, 77, - -1, -1, -1, -1, -1, 83, 84, 85, 86, -1, - 88, -1, -1, 91, -1, -1, 94, -1, -1, 97, - -1, 99, -1, -1, -1, -1, -1, -1, 106, -1, - -1, -1, 110, -1, -1, -1, -1, -1, -1, -1, - -1, 119, -1, 121, -1, -1, 124, -1, 126, -1, - -1, -1, -1, -1, -1, 133, 134, 135, 136, 137, - -1, -1, 140, 141, 142, 143, 144, -1, -1, -1, - 148, -1, -1, 151, -1, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, -1, -1, -1, -1, 238, -1, -1, + 228, 229, 230, 231, 232, -1, -1, -1, -1, 237, + -1, -1, -1, -1, 1673, -1, -1, 1676, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 191, 192, 193, + 194, 195, 196, -1, -1, -1, 200, 201, 202, 203, + 204, 205, 206, 207, -1, 209, 210, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1717, 1718, + -1, 1720, 226, 227, -1, 8, -1, -1, -1, 233, + -1, -1, -1, -1, 238, -1, -1, -1, 242, -1, + -1, 245, -1, -1, -1, -1, -1, -1, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, -1, -1, -1, -1, + 237, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1779, 1780, -1, -1, 3, 4, 5, -1, -1, -1, + -1, 10, 11, 12, -1, -1, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, -1, 1825, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, -1, -1, 67, 68, + 69, -1, -1, 72, -1, 74, 75, 76, 77, -1, + -1, -1, -1, 82, 83, 84, 85, -1, 87, -1, + -1, 90, -1, -1, 93, -1, -1, 96, -1, 98, + -1, -1, -1, -1, -1, -1, 105, -1, -1, -1, + 109, -1, -1, -1, -1, -1, -1, -1, -1, 118, + -1, 120, -1, -1, 123, -1, 125, -1, -1, -1, + -1, -1, -1, 132, 133, 134, 135, 136, -1, -1, + 139, 140, 141, 142, 143, -1, -1, -1, 147, -1, + -1, 150, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + -1, -1, -1, -1, 237, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 192, 193, 194, 195, 196, 197, - -1, -1, -1, 201, 202, 203, 204, 205, 206, 207, - 208, -1, 210, 211, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 227, - 228, -1, -1, -1, -1, -1, 234, -1, -1, -1, - -1, 239, -1, -1, -1, 243, -1, -1, 246, 216, + -1, -1, 191, 192, 193, 194, 195, 196, -1, -1, + -1, 200, 201, 202, 203, 204, 205, 206, 207, -1, + 209, 210, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 226, 227, -1, + -1, -1, -1, -1, 233, -1, -1, -1, -1, 238, + -1, -1, -1, 242, -1, -1, 245, -1, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 3, 4, 5, - -1, 238, -1, -1, 10, 11, 12, 244, 2058, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, - 56, 57, 58, -1, -1, -1, -1, 63, 64, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, - 76, 77, -1, -1, 13, 14, -1, 83, 84, -1, - 86, -1, -1, -1, -1, 91, -1, -1, 94, -1, - -1, 97, -1, 99, -1, -1, -1, -1, -1, -1, - 106, -1, -1, -1, 110, -1, -1, -1, -1, -1, - -1, -1, -1, 119, -1, 121, -1, -1, 124, -1, - 126, -1, -1, -1, -1, -1, -1, 133, 134, 135, - 136, 137, -1, -1, 140, 141, 142, 143, 144, -1, - -1, -1, 148, -1, -1, 151, -1, -1, -1, -1, - -1, -1, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, -1, -1, -1, 107, 108, - 109, 110, -1, -1, 113, -1, -1, -1, -1, -1, - 119, 120, -1, -1, 123, 124, 192, 126, 127, -1, - 196, 197, -1, -1, -1, 201, 202, 203, -1, 205, - 206, 207, -1, -1, -1, 211, 145, -1, -1, -1, + 227, 228, 229, 230, 231, 232, 3, 4, 5, -1, + 237, -1, -1, 10, 11, 12, 243, 2056, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, + 57, 58, -1, -1, -1, -1, 63, 64, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 75, 76, + 77, -1, -1, 13, 14, 82, 83, -1, 85, -1, + -1, -1, -1, 90, -1, -1, 93, -1, -1, 96, + -1, 98, -1, -1, -1, -1, -1, -1, 105, -1, + -1, -1, 109, -1, -1, -1, -1, -1, -1, -1, + -1, 118, -1, 120, -1, -1, 123, -1, 125, -1, + -1, -1, -1, -1, -1, 132, 133, 134, 135, 136, + -1, -1, 139, 140, 141, 142, 143, -1, -1, -1, + 147, -1, -1, 150, -1, -1, -1, -1, -1, -1, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, -1, -1, -1, 106, 107, 108, 109, + -1, -1, 112, -1, -1, -1, -1, -1, 118, 119, + -1, -1, 122, 123, 191, 125, 126, -1, 195, 196, + -1, -1, -1, 200, 201, 202, -1, 204, 205, 206, + -1, -1, -1, 210, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 226, + 227, -1, -1, -1, -1, -1, 233, -1, 168, 169, + 170, 238, 3, 4, -1, 242, -1, 8, 245, 10, + 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, + -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 243, 75, 76, 77, -1, -1, 13, + 14, 82, 83, -1, 85, -1, -1, -1, -1, 90, + -1, -1, 93, -1, -1, 96, -1, 98, -1, -1, + -1, -1, -1, -1, 105, -1, -1, -1, 109, -1, + -1, -1, -1, -1, -1, -1, -1, 118, -1, 120, + -1, -1, 123, -1, 125, -1, -1, -1, -1, -1, + -1, 132, 133, 134, 135, 136, -1, -1, 139, 140, + 141, 142, 143, -1, -1, -1, 147, -1, -1, 150, + -1, -1, -1, -1, -1, -1, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, -1, + -1, -1, 106, 107, 108, 109, -1, -1, 112, -1, + -1, -1, -1, -1, 118, 119, -1, -1, 122, 123, + 191, 125, 126, -1, 195, 196, -1, -1, -1, 200, + 201, 202, -1, 204, 205, 206, -1, -1, -1, 210, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 226, 227, -1, -1, -1, + -1, -1, 233, -1, 168, 169, 170, 238, 3, 4, + 5, -1, 243, -1, 245, 10, 11, 12, -1, -1, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 227, 228, -1, -1, -1, -1, -1, 234, -1, - 169, 170, 171, 239, 3, 4, -1, 243, -1, 8, - 246, 10, 11, 12, -1, -1, 15, 16, 17, 18, + 55, 56, 57, 58, -1, -1, -1, -1, 63, 64, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 243, + 75, 76, 77, -1, -1, 13, 14, 82, 83, -1, + 85, -1, -1, -1, -1, 90, -1, -1, 93, -1, + -1, 96, -1, 98, -1, -1, -1, -1, -1, -1, + 105, -1, -1, -1, 109, -1, -1, -1, -1, -1, + -1, -1, -1, 118, -1, 120, -1, -1, 123, -1, + 125, -1, -1, -1, -1, -1, -1, 132, 133, 134, + 135, 136, -1, -1, 139, 140, 141, 142, 143, -1, + -1, -1, 147, -1, -1, 150, -1, -1, -1, -1, + -1, -1, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, -1, -1, -1, 106, 107, + 108, 109, -1, -1, 112, -1, -1, -1, -1, -1, + 118, 119, -1, -1, 122, 123, 191, 125, 126, -1, + 195, 196, -1, -1, -1, 200, 201, 202, -1, 204, + 205, 206, -1, -1, -1, 210, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 226, 227, -1, -1, -1, -1, -1, 233, -1, + 168, 169, 170, 238, 3, 4, -1, 242, -1, -1, + 245, 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, 64, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 244, 75, 76, 77, -1, - -1, 13, 14, -1, 83, 84, -1, 86, -1, -1, - -1, -1, 91, -1, -1, 94, -1, -1, 97, -1, - 99, -1, -1, -1, -1, -1, -1, 106, -1, -1, - -1, 110, -1, -1, -1, -1, -1, -1, -1, -1, - 119, -1, 121, -1, -1, 124, -1, 126, -1, -1, - -1, -1, -1, -1, 133, 134, 135, 136, 137, -1, - -1, 140, 141, 142, 143, 144, -1, -1, -1, 148, - -1, -1, 151, -1, -1, -1, -1, -1, -1, 91, + -1, -1, -1, -1, -1, 243, 75, 76, 77, -1, + -1, 13, 14, 82, 83, -1, 85, -1, -1, -1, + -1, 90, -1, -1, 93, -1, -1, 96, -1, 98, + -1, -1, -1, -1, -1, -1, 105, -1, -1, -1, + 109, -1, -1, -1, -1, -1, -1, -1, -1, 118, + -1, 120, -1, -1, 123, -1, 125, -1, -1, -1, + -1, -1, -1, 132, 133, 134, 135, 136, -1, -1, + 139, 140, 141, 142, 143, -1, -1, -1, 147, -1, + -1, 150, -1, -1, -1, -1, -1, -1, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, -1, -1, -1, 107, 108, 109, 110, -1, - -1, 113, -1, -1, -1, -1, -1, 119, 120, -1, - -1, 123, 124, 192, 126, 127, -1, 196, 197, -1, - -1, -1, 201, 202, 203, -1, 205, 206, 207, -1, - -1, -1, 211, 145, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 227, 228, - -1, -1, -1, -1, -1, 234, -1, 169, 170, 171, - 239, 3, 4, 5, -1, 244, -1, 246, 10, 11, - 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, - -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 244, 75, 76, 77, -1, -1, 13, 14, - -1, 83, 84, -1, 86, -1, -1, -1, -1, 91, - -1, -1, 94, -1, -1, 97, -1, 99, -1, -1, - -1, -1, -1, -1, 106, -1, -1, -1, 110, -1, - -1, -1, -1, -1, -1, -1, -1, 119, -1, 121, - -1, -1, 124, -1, 126, -1, -1, -1, -1, -1, - -1, 133, 134, 135, 136, 137, -1, -1, 140, 141, - 142, 143, 144, -1, -1, -1, 148, -1, -1, 151, - -1, -1, -1, -1, -1, -1, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, -1, - -1, -1, 107, 108, 109, 110, -1, -1, 113, -1, - -1, -1, -1, -1, 119, 120, -1, -1, 123, 124, - 192, 126, 127, -1, 196, 197, -1, -1, -1, 201, - 202, 203, -1, 205, 206, 207, -1, -1, -1, 211, - 145, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 227, 228, -1, -1, -1, - -1, -1, 234, -1, 169, 170, 171, 239, 3, 4, - -1, 243, -1, -1, 246, 10, 11, 12, -1, -1, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 55, 56, 57, 58, -1, -1, -1, -1, 63, 64, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 244, - 75, 76, 77, -1, -1, 13, 14, -1, 83, 84, - -1, 86, -1, -1, -1, -1, 91, -1, -1, 94, - -1, -1, 97, -1, 99, -1, -1, -1, -1, -1, - -1, 106, -1, -1, -1, 110, -1, -1, -1, -1, - -1, -1, -1, -1, 119, -1, 121, -1, -1, 124, - -1, 126, -1, -1, -1, -1, -1, -1, 133, 134, - 135, 136, 137, -1, -1, 140, 141, 142, 143, 144, - -1, -1, -1, 148, -1, -1, 151, -1, -1, -1, - -1, -1, -1, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, -1, -1, -1, 107, - 108, 109, 110, -1, -1, 113, -1, -1, -1, -1, - -1, 119, 120, -1, -1, 123, 124, 192, 126, 127, - -1, 196, 197, -1, -1, -1, 201, 202, 203, -1, - 205, 206, 207, -1, -1, -1, 211, 145, -1, -1, + 102, -1, -1, -1, 106, 107, 108, 109, -1, -1, + 112, -1, -1, -1, -1, -1, 118, 119, -1, -1, + 122, 123, 191, 125, 126, -1, 195, 196, -1, -1, + -1, 200, 201, 202, -1, 204, 205, 206, -1, -1, + -1, 210, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 226, 227, -1, + -1, -1, -1, -1, 233, -1, 168, 169, 170, 238, + 3, 4, -1, 242, 243, -1, 245, 10, 11, 12, + -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, + 63, 64, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 243, 75, 76, 77, -1, -1, 13, 14, 82, + 83, -1, 85, -1, -1, -1, -1, 90, -1, -1, + 93, -1, -1, 96, -1, 98, -1, -1, -1, -1, + -1, -1, 105, -1, -1, -1, 109, -1, -1, -1, + -1, -1, -1, -1, -1, 118, -1, 120, -1, -1, + 123, -1, 125, -1, -1, -1, -1, -1, -1, 132, + 133, 134, 135, 136, -1, -1, 139, 140, 141, 142, + 143, -1, -1, -1, 147, -1, -1, 150, -1, -1, + -1, -1, -1, -1, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, -1, -1, -1, + 106, 107, 108, 109, -1, -1, 112, -1, -1, -1, + -1, -1, 118, 119, -1, -1, 122, 123, 191, 125, + 126, -1, 195, 196, -1, -1, -1, 200, 201, 202, + -1, 204, 205, 206, -1, -1, -1, 210, 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 227, 228, -1, -1, -1, -1, -1, 234, - -1, 169, 170, 171, 239, 3, 4, -1, 243, 244, - -1, 246, 10, 11, 12, -1, -1, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, - 58, -1, -1, -1, -1, 63, 64, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 244, 75, 76, 77, - -1, -1, 13, 14, -1, 83, 84, -1, 86, -1, - -1, -1, -1, 91, -1, -1, 94, -1, -1, 97, - -1, 99, -1, -1, -1, -1, -1, -1, 106, -1, - -1, -1, 110, -1, -1, -1, -1, -1, -1, -1, - -1, 119, -1, 121, -1, -1, 124, -1, 126, -1, - -1, -1, -1, -1, -1, 133, 134, 135, 136, 137, - -1, -1, 140, 141, 142, 143, 144, -1, -1, -1, - 148, -1, -1, 151, -1, -1, -1, -1, -1, -1, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, -1, -1, -1, 107, 108, 109, 110, - -1, -1, 113, -1, -1, -1, -1, -1, 119, 120, - -1, -1, 123, 124, 192, 126, 127, -1, 196, 197, - -1, -1, -1, 201, 202, 203, -1, 205, 206, 207, - -1, -1, -1, 211, 145, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 227, - 228, -1, -1, -1, -1, -1, 234, -1, 169, 170, - 171, 239, 3, 4, -1, 243, -1, -1, 246, 10, + -1, -1, -1, 226, 227, -1, -1, -1, -1, -1, + 233, -1, 168, 169, 170, 238, 3, 4, -1, 242, + -1, -1, 245, 10, 11, 12, -1, -1, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, + 57, 58, -1, -1, -1, -1, 63, 64, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 243, 75, 76, + 77, -1, -1, 13, 14, 82, 83, -1, 85, -1, + -1, -1, -1, 90, -1, -1, 93, -1, -1, 96, + -1, 98, -1, -1, -1, -1, -1, -1, 105, -1, + -1, -1, 109, -1, -1, -1, -1, -1, -1, -1, + -1, 118, -1, 120, -1, -1, 123, -1, 125, -1, + -1, -1, -1, -1, -1, 132, 133, 134, 135, 136, + -1, -1, 139, 140, 141, 142, 143, -1, -1, -1, + 147, -1, -1, 150, -1, -1, -1, -1, -1, -1, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, -1, -1, -1, 106, 107, 108, 109, + -1, -1, 112, -1, -1, -1, -1, -1, 118, 119, + -1, -1, 122, 123, 191, 125, 126, -1, 195, 196, + -1, -1, -1, 200, 201, 202, -1, 204, 205, 206, + -1, -1, -1, 210, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 226, + 227, -1, -1, -1, -1, -1, 233, -1, 168, 169, + 170, 238, 3, 4, -1, 242, -1, -1, 245, 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 244, 75, 76, 77, -1, -1, 13, - 14, -1, 83, 84, -1, 86, -1, -1, -1, -1, - 91, -1, -1, 94, -1, -1, 97, -1, 99, -1, - -1, -1, -1, -1, -1, 106, -1, -1, -1, 110, - -1, -1, -1, -1, -1, -1, -1, -1, 119, -1, - 121, -1, -1, 124, -1, 126, -1, -1, -1, -1, - -1, -1, 133, 134, 135, 136, 137, -1, -1, 140, - 141, 142, 143, 144, -1, -1, -1, 148, -1, -1, - 151, -1, -1, -1, -1, -1, -1, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - -1, -1, -1, 107, 108, 109, 110, -1, -1, 113, - -1, -1, -1, -1, -1, 119, 120, -1, -1, 123, - 124, 192, 126, 127, -1, 196, 197, -1, -1, -1, - 201, 202, 203, -1, 205, 206, 207, -1, -1, -1, - 211, 145, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 227, 228, -1, -1, - -1, -1, -1, 234, -1, 169, 170, 171, 239, 3, - 4, -1, 243, -1, -1, 246, 10, 11, 12, -1, - -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + -1, -1, -1, 243, 75, 76, 77, -1, -1, 13, + 14, 82, 83, -1, 85, -1, -1, -1, -1, 90, + -1, -1, 93, -1, -1, 96, -1, 98, -1, -1, + -1, -1, -1, -1, 105, -1, -1, -1, 109, -1, + -1, -1, -1, -1, -1, -1, -1, 118, -1, 120, + -1, -1, 123, -1, 125, -1, -1, -1, -1, -1, + -1, 132, 133, 134, 135, 136, -1, -1, 139, 140, + 141, 142, 143, -1, -1, -1, 147, -1, -1, 150, + -1, -1, -1, -1, -1, -1, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, -1, + -1, -1, 106, 107, 108, 109, -1, -1, 112, -1, + -1, -1, -1, -1, 118, 119, -1, -1, 122, 123, + 191, 125, 126, -1, 195, 196, -1, -1, -1, 200, + 201, 202, -1, 204, 205, 206, -1, -1, -1, 210, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 226, 227, -1, -1, -1, + -1, -1, 233, -1, 168, 169, 170, 238, 3, 4, + -1, 242, -1, -1, 245, 10, 11, 12, -1, -1, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, - 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 244, 75, 76, 77, -1, -1, 13, 14, -1, 83, - 84, -1, 86, -1, -1, -1, -1, 91, -1, -1, - 94, -1, -1, 97, -1, 99, -1, -1, -1, -1, - -1, -1, 106, -1, -1, -1, 110, -1, -1, -1, - -1, -1, -1, -1, -1, 119, -1, 121, -1, -1, - 124, -1, 126, -1, -1, -1, -1, -1, -1, 133, - 134, 135, 136, 137, -1, -1, 140, 141, 142, 143, - 144, -1, -1, -1, 148, -1, -1, 151, -1, -1, - -1, -1, -1, -1, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, -1, -1, -1, - 107, 108, 109, 110, -1, -1, 113, -1, -1, -1, - -1, -1, 119, 120, -1, -1, 123, 124, 192, 126, - 127, -1, 196, 197, -1, -1, -1, 201, 202, 203, - -1, 205, 206, 207, -1, -1, -1, 211, 145, -1, + 55, 56, 57, 58, -1, -1, -1, -1, 63, 64, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 243, + 75, 76, 77, -1, -1, 13, 14, 82, 83, -1, + 85, -1, -1, -1, -1, 90, -1, -1, 93, -1, + -1, 96, -1, 98, -1, -1, -1, -1, -1, -1, + 105, -1, -1, -1, 109, -1, -1, -1, -1, -1, + -1, -1, -1, 118, -1, 120, -1, -1, 123, -1, + 125, -1, -1, -1, -1, -1, -1, 132, 133, 134, + 135, 136, -1, -1, 139, 140, 141, 142, 143, -1, + -1, -1, 147, -1, -1, 150, -1, -1, -1, -1, + -1, -1, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, -1, -1, -1, 106, 107, + 108, 109, -1, -1, 112, -1, -1, -1, -1, -1, + 118, 119, -1, -1, 122, 123, 191, 125, 126, -1, + 195, 196, -1, -1, -1, 200, 201, 202, -1, 204, + 205, 206, -1, -1, -1, 210, 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 227, 228, -1, -1, -1, -1, -1, - 234, -1, 169, 170, 171, 239, 3, 4, -1, 243, - -1, -1, 246, 10, 11, 12, -1, -1, 15, 16, + -1, 226, 227, -1, -1, -1, -1, -1, 233, -1, + 168, 169, 170, 238, 3, 4, -1, -1, 243, -1, + 245, 10, 11, 12, -1, -1, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, + -1, -1, -1, -1, 63, 64, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 243, 75, 76, 77, -1, + -1, 13, 14, 82, 83, -1, 85, -1, -1, -1, + -1, 90, -1, -1, 93, -1, -1, 96, -1, 98, + -1, -1, -1, -1, -1, -1, 105, -1, -1, -1, + 109, -1, -1, -1, -1, -1, -1, -1, -1, 118, + -1, 120, -1, -1, 123, -1, 125, -1, -1, -1, + -1, -1, -1, 132, 133, 134, 135, 136, -1, -1, + 139, 140, 141, 142, 143, -1, -1, -1, 147, -1, + -1, 150, -1, -1, -1, -1, -1, -1, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, -1, -1, -1, 106, 107, 108, 109, -1, -1, + 112, -1, -1, -1, -1, -1, 118, 119, -1, -1, + 122, 123, 191, 125, 126, -1, 195, 196, -1, -1, + -1, 200, 201, 202, -1, 204, 205, 206, -1, -1, + -1, 210, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 226, 227, -1, + -1, -1, -1, -1, 233, -1, 168, 169, 170, 238, + 3, 4, -1, 242, -1, -1, 245, 10, 11, 12, + -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, + 63, 64, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 243, 75, 76, 77, -1, -1, 13, 14, 82, + 83, -1, 85, -1, -1, -1, -1, 90, -1, -1, + 93, -1, -1, 96, -1, 98, -1, -1, -1, -1, + -1, -1, 105, -1, -1, -1, 109, -1, -1, -1, + -1, -1, -1, -1, -1, 118, -1, 120, -1, -1, + 123, -1, 125, -1, -1, -1, -1, -1, -1, 132, + 133, 134, 135, 136, -1, -1, 139, 140, 141, 142, + 143, -1, -1, -1, 147, -1, -1, 150, -1, -1, + -1, -1, -1, -1, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, -1, -1, -1, + 106, 107, 108, 109, -1, -1, 112, -1, -1, -1, + -1, -1, 118, 119, -1, -1, 122, 123, 191, 125, + 126, -1, 195, 196, -1, -1, -1, 200, 201, 202, + -1, 204, 205, 206, -1, -1, -1, 210, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 226, 227, -1, -1, -1, -1, -1, + 233, -1, 168, 169, 170, 238, 3, 4, -1, 242, + -1, -1, 245, 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, 64, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 244, 75, 76, - 77, -1, -1, 13, 14, -1, 83, 84, -1, 86, - -1, -1, -1, -1, 91, -1, -1, 94, -1, -1, - 97, -1, 99, -1, -1, -1, -1, -1, -1, 106, - -1, -1, -1, 110, -1, -1, -1, -1, -1, -1, - -1, -1, 119, -1, 121, -1, -1, 124, -1, 126, - -1, -1, -1, -1, -1, -1, 133, 134, 135, 136, - 137, -1, -1, 140, 141, 142, 143, 144, -1, -1, - -1, 148, -1, -1, 151, -1, -1, -1, -1, -1, - -1, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, -1, -1, -1, 107, 108, 109, - 110, -1, -1, 113, -1, -1, -1, -1, -1, 119, - 120, -1, -1, 123, 124, 192, 126, 127, -1, 196, - 197, -1, -1, -1, 201, 202, 203, -1, 205, 206, - 207, -1, -1, -1, 211, 145, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 243, 75, 76, + 77, -1, -1, 13, 14, 82, 83, -1, 85, -1, + -1, -1, -1, 90, -1, -1, 93, -1, -1, 96, + -1, 98, -1, -1, -1, -1, -1, -1, 105, -1, + -1, -1, 109, -1, -1, -1, -1, -1, -1, -1, + -1, 118, -1, 120, -1, -1, 123, -1, 125, -1, + -1, -1, -1, -1, -1, 132, 133, 134, 135, 136, + -1, -1, 139, 140, 141, 142, 143, -1, -1, -1, + 147, -1, -1, 150, -1, -1, -1, -1, -1, -1, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, -1, -1, -1, 106, 107, 108, 109, + -1, -1, 112, 8, -1, -1, -1, -1, 118, 119, + -1, -1, 122, 123, 191, 125, 126, -1, 195, 196, + -1, -1, -1, 200, 201, 202, -1, 204, 205, 206, + -1, -1, -1, 210, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 226, + 227, -1, -1, -1, -1, -1, 233, -1, 168, 169, + 170, 238, 3, 4, -1, 242, -1, 8, 245, 10, + 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, + -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 243, 75, 76, 77, -1, -1, -1, + -1, 82, 83, -1, 85, -1, -1, -1, -1, 90, + -1, -1, 93, -1, -1, 96, -1, 98, -1, -1, + -1, -1, -1, -1, 105, -1, -1, -1, 109, -1, + -1, -1, -1, -1, -1, -1, -1, 118, -1, 120, + -1, -1, 123, -1, 125, -1, -1, -1, -1, -1, + -1, 132, 133, 134, 135, 136, -1, -1, 139, 140, + 141, 142, 143, -1, -1, -1, 147, -1, -1, 150, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, -1, -1, + -1, -1, 237, -1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 227, 228, -1, -1, -1, -1, -1, 234, -1, 169, - 170, 171, 239, 3, 4, -1, -1, 244, -1, 246, - 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, + 191, -1, -1, -1, 195, 196, -1, -1, -1, 200, + 201, 202, -1, 204, 205, 206, -1, -1, -1, 210, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 226, 227, -1, -1, -1, + -1, -1, 233, 3, 4, -1, -1, 238, 8, -1, + 10, 11, 12, -1, 245, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, 64, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 244, 75, 76, 77, -1, -1, - 13, 14, -1, 83, 84, -1, 86, -1, -1, -1, - -1, 91, -1, -1, 94, -1, -1, 97, -1, 99, - -1, -1, -1, -1, -1, -1, 106, -1, -1, -1, - 110, -1, -1, -1, -1, -1, -1, -1, -1, 119, - -1, 121, -1, -1, 124, -1, 126, -1, -1, -1, - -1, -1, -1, 133, 134, 135, 136, 137, -1, -1, - 140, 141, 142, 143, 144, -1, -1, -1, 148, -1, - -1, 151, -1, -1, -1, -1, -1, -1, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, - 103, -1, -1, -1, 107, 108, 109, 110, -1, -1, - 113, -1, -1, -1, -1, -1, 119, 120, -1, -1, - 123, 124, 192, 126, 127, -1, 196, 197, -1, -1, - -1, 201, 202, 203, -1, 205, 206, 207, -1, -1, - -1, 211, 145, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 227, 228, -1, - -1, -1, -1, -1, 234, -1, 169, 170, 171, 239, - 3, 4, -1, 243, -1, -1, 246, 10, 11, 12, - -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, - 63, 64, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 244, 75, 76, 77, -1, -1, 13, 14, -1, - 83, 84, -1, 86, -1, -1, -1, -1, 91, -1, - -1, 94, -1, -1, 97, -1, 99, -1, -1, -1, - -1, -1, -1, 106, -1, -1, -1, 110, -1, -1, - -1, -1, -1, -1, -1, -1, 119, -1, 121, -1, - -1, 124, -1, 126, -1, -1, -1, -1, -1, -1, - 133, 134, 135, 136, 137, -1, -1, 140, 141, 142, - 143, 144, -1, -1, -1, 148, -1, -1, 151, -1, - -1, -1, -1, -1, -1, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, -1, -1, - -1, 107, 108, 109, 110, -1, -1, 113, -1, -1, - -1, -1, -1, 119, 120, -1, -1, 123, 124, 192, - 126, 127, -1, 196, 197, -1, -1, -1, 201, 202, - 203, -1, 205, 206, 207, -1, -1, -1, 211, 145, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 227, 228, -1, -1, -1, -1, - -1, 234, -1, 169, 170, 171, 239, 3, 4, -1, - 243, -1, -1, 246, 10, 11, 12, -1, -1, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, - 56, 57, 58, -1, -1, -1, -1, 63, 64, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 244, 75, - 76, 77, -1, -1, 13, 14, -1, 83, 84, -1, - 86, -1, -1, -1, -1, 91, -1, -1, 94, -1, - -1, 97, -1, 99, -1, -1, -1, -1, -1, -1, - 106, -1, -1, -1, 110, -1, -1, -1, -1, -1, - -1, -1, -1, 119, -1, 121, -1, -1, 124, -1, - 126, -1, -1, -1, -1, -1, -1, 133, 134, 135, - 136, 137, -1, -1, 140, 141, 142, 143, 144, -1, - -1, -1, 148, -1, -1, 151, -1, -1, -1, -1, - -1, -1, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, -1, -1, -1, 107, 108, - 109, 110, -1, -1, 113, 8, -1, -1, -1, -1, - 119, 120, -1, -1, 123, 124, 192, 126, 127, -1, - 196, 197, -1, -1, -1, 201, 202, 203, -1, 205, - 206, 207, -1, -1, -1, 211, 145, -1, -1, -1, + -1, -1, -1, -1, -1, 75, 76, 77, -1, -1, + -1, -1, 82, 83, -1, 85, -1, -1, -1, -1, + 90, -1, -1, 93, -1, -1, 96, -1, 98, -1, + -1, -1, -1, -1, -1, 105, -1, -1, -1, 109, + -1, -1, -1, -1, -1, -1, -1, -1, 118, -1, + 120, -1, -1, 123, -1, 125, -1, -1, -1, -1, + -1, -1, 132, 133, 134, 135, 136, -1, -1, 139, + 140, 141, 142, 143, -1, -1, -1, 147, -1, -1, + 150, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 227, 228, -1, -1, -1, -1, -1, 234, -1, - 169, 170, 171, 239, 3, 4, -1, 243, -1, 8, - 246, 10, 11, 12, -1, -1, 15, 16, 17, 18, + -1, 191, -1, -1, -1, 195, 196, -1, -1, -1, + 200, 201, 202, -1, 204, 205, 206, -1, -1, -1, + 210, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 226, 227, -1, -1, + -1, -1, -1, 233, 3, 4, -1, -1, 238, -1, + -1, 10, 11, 12, -1, 245, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, 64, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 244, 75, 76, 77, -1, - -1, -1, -1, -1, 83, 84, -1, 86, -1, -1, - -1, -1, 91, -1, -1, 94, -1, -1, 97, -1, - 99, -1, -1, -1, -1, -1, -1, 106, -1, -1, - -1, 110, -1, -1, -1, -1, -1, -1, -1, -1, - 119, -1, 121, -1, -1, 124, -1, 126, -1, -1, - -1, -1, -1, -1, 133, 134, 135, 136, 137, -1, - -1, 140, 141, 142, 143, 144, -1, -1, -1, 148, - -1, -1, 151, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, -1, -1, -1, -1, 238, -1, 8, -1, -1, + -1, -1, -1, -1, -1, -1, 75, 76, 77, -1, + -1, 13, 14, 82, 83, -1, 85, -1, -1, -1, + -1, 90, -1, -1, 93, -1, -1, 96, -1, 98, + -1, -1, -1, -1, -1, -1, 105, -1, -1, -1, + 109, -1, -1, -1, -1, -1, -1, -1, -1, 118, + -1, 120, -1, -1, 123, -1, 125, -1, -1, -1, + -1, -1, -1, 132, 133, 134, 135, 136, -1, -1, + 139, 140, 141, 142, 143, -1, -1, -1, 147, -1, + -1, 150, -1, -1, -1, -1, -1, -1, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, -1, -1, -1, 106, 107, 108, 109, -1, -1, + 112, 8, -1, -1, -1, -1, 118, 119, -1, -1, + 122, 123, 191, 125, 126, -1, 195, 196, -1, -1, + -1, 200, 201, 202, -1, 204, 205, 206, -1, -1, + -1, 210, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 226, 227, -1, + -1, -1, -1, -1, 233, -1, 168, 169, 170, 238, + 3, 4, -1, 242, -1, -1, 245, 10, 11, 12, + -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, + 63, 64, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 243, 75, 76, 77, -1, -1, -1, -1, 82, + 83, -1, 85, -1, -1, -1, -1, 90, -1, -1, + 93, -1, -1, 96, -1, 98, -1, -1, -1, -1, + -1, -1, 105, -1, -1, -1, 109, -1, -1, -1, + -1, -1, -1, -1, -1, 118, -1, 120, -1, -1, + 123, -1, 125, -1, -1, -1, -1, -1, -1, 132, + 133, 134, 135, 136, -1, -1, 139, 140, 141, 142, + 143, -1, -1, -1, 147, -1, -1, 150, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, -1, -1, -1, -1, + 237, -1, -1, -1, -1, -1, -1, 8, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 191, -1, + -1, -1, 195, 196, -1, -1, -1, 200, 201, 202, + -1, 204, 205, 206, -1, -1, -1, 210, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 192, -1, -1, -1, 196, 197, -1, - -1, -1, 201, 202, 203, -1, 205, 206, 207, -1, - -1, -1, 211, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 227, 228, - -1, -1, -1, -1, -1, 234, 3, 4, -1, -1, - 239, 8, -1, 10, 11, 12, -1, 246, 15, 16, + -1, -1, -1, 226, 227, -1, -1, -1, -1, -1, + 233, -1, -1, -1, -1, 238, 3, 4, -1, 242, + -1, -1, 245, 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, 76, - 77, -1, -1, -1, -1, -1, 83, 84, -1, 86, - -1, -1, -1, -1, 91, -1, -1, 94, -1, -1, - 97, -1, 99, -1, -1, -1, -1, -1, -1, 106, - -1, -1, -1, 110, -1, -1, -1, -1, -1, -1, - -1, -1, 119, -1, 121, -1, -1, 124, -1, 126, - -1, -1, -1, -1, -1, -1, 133, 134, 135, 136, - 137, -1, -1, 140, 141, 142, 143, 144, -1, -1, - -1, 148, -1, -1, 151, 216, 217, 218, 219, 220, + 77, -1, -1, -1, -1, 82, 83, -1, 85, -1, + -1, -1, -1, 90, -1, -1, 93, -1, -1, 96, + -1, 98, -1, -1, -1, -1, -1, -1, 105, -1, + -1, -1, 109, -1, -1, -1, -1, -1, -1, -1, + -1, 118, -1, 120, -1, -1, 123, -1, 125, -1, + -1, -1, -1, -1, -1, 132, 133, 134, 135, 136, + -1, -1, 139, 140, 141, 142, 143, -1, -1, -1, + 147, -1, -1, 150, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, -1, -1, -1, -1, 238, -1, -1, + 231, 232, -1, -1, -1, -1, 237, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 192, -1, -1, -1, 196, - 197, -1, -1, -1, 201, 202, 203, -1, 205, 206, - 207, -1, -1, -1, 211, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 191, -1, -1, -1, 195, 196, + -1, -1, -1, 200, 201, 202, -1, 204, 205, 206, + -1, -1, -1, 210, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 226, + 227, -1, -1, -1, -1, -1, 233, 3, 4, 5, + -1, 238, -1, -1, 10, 11, 12, -1, 245, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 8, -1, -1, -1, -1, -1, -1, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, + -1, 67, 68, 69, -1, -1, 72, -1, 74, 75, + 76, 77, -1, -1, -1, -1, 82, 83, 84, 85, + -1, 87, 3, 4, 5, -1, -1, -1, -1, 10, + 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, + -1, -1, -1, -1, -1, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, -1, -1, -1, 67, 68, 69, -1, + -1, 72, -1, 74, 75, 76, 77, -1, -1, -1, + -1, 82, 83, 84, 85, -1, 87, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 227, 228, -1, -1, -1, -1, -1, 234, 3, 4, - -1, -1, 239, -1, -1, 10, 11, 12, -1, 246, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, -1, + -1, -1, -1, -1, -1, 191, 192, 193, 194, 195, + -1, -1, -1, -1, 200, 201, 202, 203, 204, 205, + 206, 207, -1, 209, 210, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 55, 56, 57, 58, -1, -1, -1, -1, 63, 64, + 226, 227, -1, -1, -1, -1, -1, 233, -1, -1, + -1, -1, 238, -1, -1, -1, 242, -1, -1, 245, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, -1, -1, + -1, -1, 237, -1, -1, -1, -1, -1, -1, -1, + 191, 192, 193, 194, 195, -1, -1, -1, -1, 200, + 201, 202, 203, 204, 205, 206, 207, -1, 209, 210, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 75, 76, 77, -1, -1, 13, 14, -1, 83, 84, - -1, 86, -1, -1, -1, -1, 91, -1, -1, 94, - -1, -1, 97, -1, 99, -1, -1, -1, -1, -1, - -1, 106, -1, -1, -1, 110, -1, -1, -1, -1, - -1, -1, -1, -1, 119, -1, 121, -1, -1, 124, - -1, 126, -1, -1, -1, -1, -1, -1, 133, 134, - 135, 136, 137, -1, -1, 140, 141, 142, 143, 144, - -1, -1, -1, 148, -1, -1, 151, -1, -1, -1, - -1, -1, -1, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 101, 102, 103, -1, -1, -1, 107, - 108, 109, 110, -1, -1, 113, -1, -1, -1, -1, - -1, 119, 120, -1, -1, 123, 124, 192, 126, 127, - -1, 196, 197, -1, -1, -1, 201, 202, 203, -1, - 205, 206, 207, -1, -1, -1, 211, 145, -1, -1, + -1, -1, -1, -1, -1, 226, 227, -1, -1, -1, + -1, -1, 233, -1, -1, -1, -1, 238, 3, 4, + 5, 242, -1, -1, 245, 10, 11, 12, -1, -1, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, -1, -1, -1, -1, -1, -1, + -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, -1, + -1, -1, 67, 68, 69, -1, -1, 72, -1, 74, + 75, 76, 77, -1, -1, -1, -1, 82, 83, 84, + 85, -1, 87, 3, 4, 5, -1, -1, -1, -1, + 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, + -1, -1, -1, -1, -1, -1, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, -1, -1, -1, 67, 68, 69, + -1, -1, 72, -1, 74, 75, 76, 77, 128, -1, + -1, -1, 82, 83, 84, 85, -1, 87, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 227, 228, -1, -1, -1, -1, -1, 234, - -1, 169, 170, 171, 239, 3, 4, -1, 243, -1, - -1, 246, 10, 11, 12, -1, -1, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 39, 40, 41, 42, 43, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, - 58, -1, -1, -1, -1, 63, 64, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 244, 75, 76, 77, - -1, -1, 13, 14, -1, 83, 84, -1, 86, -1, - -1, -1, -1, 91, -1, -1, 94, -1, -1, 97, - -1, 99, -1, -1, -1, -1, -1, -1, 106, -1, - -1, -1, 110, -1, -1, -1, -1, -1, -1, -1, - -1, 119, -1, 121, -1, -1, 124, -1, 126, -1, - -1, -1, -1, -1, -1, 133, 134, 135, 136, 137, - -1, -1, 140, 141, 142, 143, 144, -1, -1, -1, - 148, -1, -1, 151, -1, -1, -1, -1, -1, -1, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 101, 102, 103, -1, -1, -1, 107, 108, 109, 110, - -1, -1, 113, 8, -1, -1, -1, -1, 119, 120, - -1, -1, 123, 124, 192, 126, 127, -1, 196, 197, - -1, -1, -1, 201, 202, 203, -1, 205, 206, 207, - -1, -1, -1, 211, 145, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 227, - 228, -1, -1, -1, -1, -1, 234, -1, 169, 170, - 171, 239, 3, 4, -1, 243, -1, -1, 246, 10, - 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, - -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 244, 75, 76, 77, -1, -1, -1, - -1, -1, 83, 84, -1, 86, -1, -1, -1, -1, - 91, -1, -1, 94, -1, -1, 97, -1, 99, -1, - -1, -1, -1, -1, -1, 106, -1, -1, -1, 110, - -1, -1, -1, -1, -1, -1, -1, -1, 119, -1, - 121, -1, -1, 124, -1, 126, -1, -1, -1, -1, - -1, -1, 133, 134, 135, 136, 137, -1, -1, 140, - 141, 142, 143, 144, -1, -1, -1, 148, -1, -1, - 151, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, -1, - -1, -1, -1, 238, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 191, 192, 193, 194, + 195, -1, -1, -1, -1, 200, 201, 202, 203, 204, + 205, 206, 207, -1, 209, 210, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 192, -1, -1, -1, 196, 197, -1, -1, -1, - 201, 202, 203, -1, 205, 206, 207, -1, -1, -1, - 211, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 227, 228, -1, -1, - -1, -1, -1, 234, 3, 4, 5, -1, 239, -1, - -1, 10, 11, 12, -1, 246, 15, 16, 17, 18, + -1, 226, 227, -1, -1, -1, -1, -1, 233, -1, + -1, -1, -1, 238, -1, -1, -1, 242, -1, -1, + 245, -1, -1, -1, -1, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, -1, -1, -1, -1, 237, -1, -1, + -1, 191, 192, 193, 194, 195, -1, -1, -1, -1, + 200, 201, 202, 203, 204, 205, 206, 207, -1, 209, + 210, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 226, 227, -1, -1, + -1, -1, -1, 233, 3, 4, -1, -1, 238, 8, + -1, 10, 11, 12, -1, 245, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 8, -1, -1, -1, -1, -1, -1, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, -1, -1, -1, 67, 68, - 69, -1, -1, 72, -1, 74, 75, 76, 77, -1, - -1, -1, -1, -1, 83, 84, 85, 86, -1, 88, - 3, 4, 5, -1, -1, -1, -1, 10, 11, 12, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, + -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 75, 76, 77, -1, + 3, 4, -1, 82, 83, -1, 85, 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, -1, - -1, -1, -1, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, -1, -1, -1, 67, 68, 69, -1, -1, 72, - -1, 74, 75, 76, 77, -1, -1, -1, -1, -1, - 83, 84, 85, 86, -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 192, 193, 194, 195, 196, -1, -1, - -1, -1, 201, 202, 203, 204, 205, 206, 207, 208, - -1, 210, 211, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 227, 228, - -1, -1, -1, -1, -1, 234, -1, -1, -1, -1, - 239, -1, -1, -1, 243, -1, -1, 246, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, -1, -1, -1, -1, - 238, -1, -1, -1, -1, -1, -1, -1, -1, 192, - 193, 194, 195, 196, -1, -1, -1, -1, 201, 202, - 203, 204, 205, 206, 207, 208, -1, 210, 211, -1, + -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, + 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 75, 76, 77, -1, -1, -1, -1, 82, + 83, -1, 85, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, -1, -1, -1, -1, 237, -1, 239, -1, 241, + -1, -1, 191, -1, -1, 247, 195, -1, -1, -1, + -1, 200, 201, 202, -1, 204, 205, 206, -1, -1, + -1, 210, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 226, 227, -1, + -1, -1, -1, -1, 233, -1, -1, -1, -1, 238, + -1, -1, -1, -1, -1, -1, 245, -1, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, -1, -1, 191, -1, + 237, -1, 195, -1, -1, -1, 243, 200, 201, 202, + 247, 204, 205, 206, -1, -1, -1, 210, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 227, 228, -1, -1, -1, -1, - -1, 234, -1, -1, -1, -1, 239, 3, 4, 5, - 243, -1, -1, 246, 10, 11, 12, -1, -1, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, -1, -1, -1, -1, -1, -1, -1, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, - -1, 67, 68, 69, -1, -1, 72, -1, 74, 75, - 76, 77, -1, -1, -1, -1, -1, 83, 84, 85, - 86, -1, 88, 3, 4, 5, -1, -1, -1, -1, - 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, - -1, -1, -1, -1, -1, -1, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, -1, -1, -1, 67, 68, 69, - -1, -1, 72, -1, 74, 75, 76, 77, 129, -1, - -1, -1, -1, 83, 84, 85, 86, -1, 88, -1, + -1, -1, -1, 226, 227, -1, -1, -1, -1, -1, + 233, 3, 4, -1, 6, 238, 239, -1, 10, 11, + 12, -1, 245, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 192, 193, 194, 195, - 196, -1, -1, -1, -1, 201, 202, 203, 204, 205, - 206, 207, 208, -1, 210, 211, -1, -1, -1, -1, + -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, + -1, 63, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 75, 76, 77, -1, -1, -1, -1, + 82, 83, -1, 85, 3, 4, -1, 6, -1, -1, + -1, 10, 11, 12, -1, -1, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 227, 228, -1, -1, -1, -1, -1, 234, -1, - -1, -1, -1, 239, -1, -1, -1, 243, -1, -1, - 246, -1, -1, -1, -1, 216, 217, 218, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, -1, -1, -1, -1, 238, -1, -1, - -1, -1, 192, 193, 194, 195, 196, -1, -1, -1, - -1, 201, 202, 203, 204, 205, 206, 207, 208, -1, - 210, 211, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 227, 228, -1, - -1, -1, -1, -1, 234, 3, 4, -1, -1, 239, - 8, -1, 10, 11, 12, -1, 246, 15, 16, 17, + -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, + -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 75, 76, 77, -1, + -1, -1, -1, 82, 83, -1, 85, -1, -1, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, -1, -1, 191, + -1, 237, -1, 195, -1, -1, -1, 243, 200, 201, + 202, 247, 204, 205, 206, -1, -1, -1, 210, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 226, 227, -1, -1, -1, -1, + -1, 233, -1, -1, -1, -1, 238, -1, -1, -1, + -1, -1, -1, 245, -1, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, -1, -1, -1, -1, 237, -1, 239, + -1, -1, 191, -1, -1, -1, 195, 247, -1, -1, + -1, 200, 201, 202, -1, 204, 205, 206, -1, -1, + -1, 210, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 226, 227, -1, + -1, -1, -1, -1, 233, 3, 4, -1, 6, 238, + -1, -1, 10, 11, 12, -1, 245, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, 76, 77, - -1, -1, 3, 4, -1, 83, 84, -1, 86, 10, - 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, + -1, 3, 4, -1, 82, 83, -1, 85, 10, 11, + 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, + -1, 63, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 75, 76, 77, -1, -1, -1, -1, + 82, 83, -1, 85, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, -1, -1, -1, -1, 237, -1, -1, -1, + -1, -1, 243, 191, -1, -1, 247, 195, -1, -1, + -1, -1, 200, 201, 202, -1, 204, 205, 206, -1, + -1, -1, 210, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 226, 227, + -1, -1, -1, -1, -1, 233, -1, -1, -1, -1, + 238, -1, -1, -1, -1, -1, -1, 245, -1, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, -1, -1, 191, + -1, 237, -1, 195, -1, -1, -1, -1, 200, 201, + 202, 247, 204, 205, 206, -1, -1, -1, 210, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 226, 227, -1, -1, -1, -1, + -1, 233, 3, 4, -1, -1, 238, 239, -1, 10, + 11, 12, -1, 245, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 75, 76, 77, -1, -1, -1, - -1, -1, 83, 84, -1, 86, -1, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, -1, 242, 192, -1, -1, -1, 196, 248, - -1, -1, -1, 201, 202, 203, -1, 205, 206, 207, - -1, -1, -1, 211, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 227, - 228, -1, -1, -1, -1, -1, 234, -1, -1, -1, - -1, 239, -1, -1, -1, -1, -1, -1, 246, -1, - -1, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, -1, - -1, 192, -1, 238, -1, 196, -1, -1, -1, 244, - 201, 202, 203, 248, 205, 206, 207, -1, -1, -1, - 211, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 227, 228, -1, -1, - -1, -1, -1, 234, 3, 4, -1, 6, 239, 240, - -1, 10, 11, 12, -1, 246, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, - -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 75, 76, 77, -1, - -1, -1, -1, -1, 83, 84, -1, 86, 3, 4, - -1, 6, -1, -1, -1, 10, 11, 12, -1, -1, + -1, -1, -1, -1, 75, 76, 77, -1, 3, 4, + -1, 82, 83, -1, 85, 10, 11, 12, -1, -1, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 75, 76, 77, -1, -1, -1, -1, -1, 83, 84, - -1, 86, -1, 216, 217, 218, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, -1, -1, 192, -1, 238, -1, 196, -1, -1, - -1, 244, 201, 202, 203, 248, 205, 206, 207, -1, - -1, -1, 211, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 227, 228, - -1, -1, -1, -1, -1, 234, -1, -1, -1, -1, - 239, -1, -1, -1, -1, -1, -1, 246, 216, 217, - 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, -1, -1, -1, -1, - 238, -1, 240, -1, -1, -1, -1, 192, -1, -1, - 248, 196, -1, -1, -1, -1, 201, 202, 203, -1, - 205, 206, 207, -1, -1, -1, 211, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 227, 228, -1, -1, -1, -1, -1, 234, - 3, 4, -1, 6, 239, -1, -1, 10, 11, 12, - -1, 246, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 55, 56, 57, 58, -1, -1, -1, -1, - 63, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 75, 76, 77, -1, -1, 3, 4, -1, - 83, 84, -1, 86, 10, 11, 12, -1, -1, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, 38, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, - 56, 57, 58, -1, -1, -1, -1, 63, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 75, - 76, 77, -1, -1, -1, -1, -1, 83, 84, -1, - 86, -1, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, -1, -1, -1, 192, - 244, -1, -1, 196, 248, -1, -1, -1, 201, 202, - 203, -1, 205, 206, 207, -1, -1, -1, 211, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 227, 228, -1, -1, -1, -1, - -1, 234, -1, -1, -1, -1, 239, -1, -1, -1, - -1, -1, -1, 246, -1, -1, 216, 217, 218, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, -1, -1, 192, -1, 238, -1, - 196, -1, -1, -1, -1, 201, 202, 203, 248, 205, - 206, 207, -1, -1, -1, 211, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 227, 228, -1, -1, -1, -1, -1, 234, 3, - 4, -1, -1, 239, 240, -1, 10, 11, 12, -1, - 246, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, -1, -1, -1, -1, -1, + 75, 76, 77, -1, -1, -1, -1, 82, 83, -1, + 85, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, -1, -1, -1, -1, -1, + 191, -1, -1, 247, 195, -1, -1, -1, -1, 200, + 201, 202, -1, 204, 205, 206, -1, -1, -1, 210, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 55, 56, 57, 58, -1, -1, -1, -1, 63, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 75, 76, 77, -1, -1, 3, 4, -1, 83, - 84, -1, 86, 10, 11, 12, -1, -1, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 55, 56, - 57, 58, -1, -1, -1, -1, 63, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 75, 76, - 77, -1, -1, -1, -1, -1, 83, 84, -1, 86, - -1, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, -1, - -1, -1, -1, 238, -1, -1, -1, -1, 192, -1, - -1, -1, 196, 248, -1, -1, -1, 201, 202, 203, - -1, 205, 206, 207, -1, -1, -1, 211, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 227, 228, -1, -1, -1, -1, -1, - 234, -1, -1, -1, -1, 239, 240, -1, -1, -1, - -1, -1, 246, -1, 0, 1, -1, -1, 4, -1, - -1, -1, -1, -1, -1, -1, -1, 13, 14, -1, - -1, -1, -1, -1, -1, 192, -1, -1, -1, 196, - -1, -1, -1, -1, 201, 202, 203, -1, 205, 206, - 207, -1, -1, -1, 211, -1, -1, -1, 44, 45, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 227, 228, -1, -1, -1, -1, -1, 234, 64, 65, - 66, -1, 239, -1, 70, 71, -1, 73, -1, 246, - -1, -1, 78, 79, -1, 81, 82, -1, 84, -1, - -1, -1, -1, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 101, 102, 103, -1, -1, - 106, 107, 108, 109, 110, 111, -1, 113, -1, 115, - 116, 117, 118, 119, 120, 121, -1, 123, 124, 125, - 126, 127, 128, -1, 130, 131, 132, 133, 134, 135, - 136, 137, 138, -1, 140, 141, 142, 143, 144, 145, - 146, 147, 148, 149, 150, 151, 152, 153, -1, 4, - -1, 157, 158, 159, -1, -1, -1, 163, 13, 14, - -1, -1, 168, 169, 170, 171, -1, -1, 174, -1, - 176, -1, 178, 179, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, -1, -1, -1, 44, - 45, -1, 198, 199, 200, -1, -1, -1, -1, -1, - -1, -1, -1, 209, -1, 211, -1, -1, -1, 64, + -1, -1, -1, -1, -1, 226, 227, -1, -1, -1, + -1, -1, 233, -1, -1, -1, -1, 238, 239, -1, + -1, -1, -1, -1, 245, 0, 1, -1, -1, 4, + -1, -1, -1, -1, -1, -1, -1, -1, 13, 14, + -1, -1, -1, -1, -1, -1, 191, -1, -1, -1, + 195, -1, -1, -1, -1, 200, 201, 202, -1, 204, + 205, 206, -1, -1, -1, 210, -1, -1, -1, 44, + 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 226, 227, -1, -1, -1, -1, -1, 233, 64, + 65, 66, -1, 238, -1, 70, 71, -1, 73, -1, + 245, -1, -1, 78, -1, 80, 81, -1, 83, -1, + -1, -1, -1, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, -1, -1, + 105, 106, 107, 108, 109, 110, -1, 112, -1, 114, + 115, 116, 117, 118, 119, 120, -1, 122, 123, 124, + 125, 126, 127, -1, 129, 130, 131, 132, 133, 134, + 135, 136, 137, -1, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, -1, 4, + -1, 156, 157, 158, -1, -1, -1, 162, 13, 14, + -1, -1, 167, 168, 169, 170, -1, -1, 173, -1, + 175, -1, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, -1, -1, -1, 44, + 45, -1, 197, 198, 199, -1, -1, -1, -1, -1, + -1, -1, -1, 208, -1, 210, -1, -1, -1, 64, 65, 66, -1, -1, -1, 70, 71, -1, 73, -1, - -1, -1, -1, 78, 79, -1, 81, 82, -1, 84, - -1, -1, -1, -1, 89, 90, 91, 92, 93, 94, - 95, 96, 97, 98, 99, 100, 101, 102, 103, -1, - -1, 106, 107, 108, 109, 110, 111, -1, 113, -1, - 115, 116, 117, 118, 119, 120, 121, -1, 123, 124, - 125, 126, 127, 128, -1, 130, 131, 132, 133, 134, - 135, 136, 137, 138, -1, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, -1, - -1, -1, 157, 158, 159, -1, -1, -1, 163, -1, - -1, -1, -1, 168, 169, 170, 171, 4, 5, 174, - -1, 176, -1, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, -1, -1, -1, - -1, -1, -1, 198, 199, 200, -1, 4, 5, -1, - -1, -1, -1, -1, 209, -1, 211, -1, -1, 46, + -1, -1, -1, 78, -1, 80, 81, -1, 83, -1, + -1, -1, -1, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, -1, -1, + 105, 106, 107, 108, 109, 110, -1, 112, -1, 114, + 115, 116, 117, 118, 119, 120, -1, 122, 123, 124, + 125, 126, 127, -1, 129, 130, 131, 132, 133, 134, + 135, 136, 137, -1, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, -1, -1, + -1, 156, 157, 158, -1, -1, -1, 162, -1, -1, + -1, -1, 167, 168, 169, 170, 4, 5, 173, -1, + 175, -1, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, -1, -1, -1, -1, + -1, -1, 197, 198, 199, 4, 5, -1, -1, -1, + -1, -1, -1, 208, -1, 210, -1, -1, 46, 47, + 48, 49, 50, 51, 52, 53, 54, -1, -1, -1, + -1, 59, 60, 61, 62, -1, -1, -1, -1, 67, + 68, 69, -1, -1, 72, -1, 74, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 84, 4, 5, 87, + 59, 60, 61, 62, -1, -1, -1, -1, 67, 68, + 69, -1, -1, 72, -1, 74, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 84, -1, -1, 87, -1, + -1, -1, -1, -1, -1, -1, -1, 125, -1, 46, 47, 48, 49, 50, 51, 52, 53, 54, -1, -1, - -1, -1, 59, 60, 61, 62, -1, 4, 5, -1, - 67, 68, 69, -1, -1, 72, -1, 74, -1, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 85, -1, - -1, 88, 59, 60, 61, 62, -1, -1, 5, -1, - 67, 68, 69, -1, -1, 72, -1, 74, -1, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 85, -1, - -1, 88, 59, 60, 61, 62, -1, -1, -1, 126, - 67, 68, 69, -1, -1, 72, -1, 74, -1, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 85, -1, - -1, 88, 59, 60, 61, 62, -1, -1, -1, -1, + -1, -1, 59, 60, 61, 62, -1, -1, -1, -1, 67, 68, 69, -1, -1, 72, -1, 74, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 85, -1, - -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 193, 194, 195, -1, - -1, -1, -1, -1, -1, -1, -1, 204, -1, -1, - -1, 208, -1, 210, 211, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 193, 194, 195, 13, - 14, -1, -1, -1, -1, -1, -1, 204, -1, -1, - -1, 208, -1, 210, 211, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 193, 194, 195, -1, - -1, -1, -1, -1, -1, -1, -1, 204, -1, -1, - -1, 208, -1, 210, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 193, 194, 195, -1, - -1, -1, -1, -1, 13, 14, -1, 204, -1, -1, - -1, 208, -1, 210, -1, -1, -1, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, - -1, -1, -1, 107, 108, 109, 110, -1, -1, 113, - -1, -1, -1, -1, -1, 119, 120, -1, -1, 123, - 124, -1, 126, 127, -1, -1, -1, -1, 132, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 145, -1, -1, -1, 149, -1, -1, -1, -1, - -1, -1, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 101, 102, 103, 169, 170, 171, 107, 108, - 109, 110, -1, -1, 113, -1, -1, -1, -1, -1, - 119, 120, -1, -1, 123, 124, -1, 126, 127, -1, + -1, -1, -1, -1, -1, -1, -1, 84, -1, -1, + 87, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, 192, 193, 194, -1, -1, -1, + -1, 5, -1, 247, -1, 203, -1, -1, -1, 207, + -1, 209, 210, -1, -1, -1, 13, 14, -1, -1, + -1, -1, -1, 192, 193, 194, -1, -1, -1, -1, + -1, -1, -1, -1, 203, -1, -1, -1, 207, -1, + 209, 210, 46, 47, 48, 49, 50, 51, 52, 53, + 54, -1, -1, -1, -1, 59, 60, 61, 62, -1, + -1, -1, -1, 67, 68, 69, -1, -1, 72, -1, + 74, -1, -1, -1, -1, 192, 193, 194, -1, -1, + 84, -1, -1, 87, -1, -1, 203, -1, -1, -1, + 207, -1, 209, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, -1, -1, -1, 106, + 107, 108, 109, -1, -1, 112, -1, -1, -1, -1, + -1, 118, 119, -1, -1, 122, 123, -1, 125, 126, + 13, 14, -1, -1, 131, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, 148, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + -1, 168, 169, 170, 237, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 247, -1, -1, -1, 192, 193, + 194, -1, -1, -1, -1, -1, -1, -1, -1, 203, + -1, -1, -1, 207, -1, 209, -1, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + -1, -1, -1, 106, 107, 108, 109, -1, -1, 112, + -1, -1, -1, -1, -1, 118, 119, -1, -1, 122, + 123, -1, 125, 126, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 145, 216, 217, 218, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - 169, 170, 171, -1, -1, -1, -1, -1, -1, 248, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, -1, -1, - -1, -1, 238, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 248, 216, 217, 218, 219, 220, 221, 222, + -1, 144, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, -1, -1, -1, -1, 238, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 248, 216, 217, 218, 219, + -1, -1, -1, -1, 237, 168, 169, 170, -1, -1, + -1, -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, -1, -1, -1, -1, 238, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 248, 216, + 230, 231, 232, -1, -1, -1, -1, 237, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, -1, -1, -1, - -1, 238, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 248, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 248, 216, 217, 218, 219, 220, + 227, 228, 229, 230, 231, 232, -1, -1, -1, -1, + 237, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, -1, -1, -1, -1, 238, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 248, 216, 217, + 231, 232, -1, -1, -1, -1, 237, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, -1, -1, -1, -1, - 238, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 248, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, -1, - -1, -1, -1, 238, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 248, 216, 217, 218, 219, 220, 221, + 228, 229, 230, 231, 232, -1, -1, -1, -1, 237, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 247, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, -1, -1, + -1, -1, 237, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, -1, -1, -1, -1, 238, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 248, 216, 217, 218, + 232, -1, -1, -1, -1, 237, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 248, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, -1, -1, - -1, -1, 238, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 248, 216, 217, 218, 219, 220, 221, 222, + 226, 227, 228, 229, 230, 231, 232, -1, -1, -1, + -1, 237, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, -1, -1, -1, -1, 238, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 248, 216, 217, 218, 219, + -1, -1, -1, -1, 237, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, -1, -1, -1, -1, 238, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 248, 216, + 230, 231, 232, -1, -1, -1, -1, 237, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, -1, -1, -1, - -1, 238, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 248, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 248, 216, 217, 218, 219, 220, + 227, 228, 229, 230, 231, 232, -1, -1, -1, -1, + 237, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, -1, -1, -1, -1, 238, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 248, 216, 217, + 231, 232, -1, -1, -1, -1, 237, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, -1, -1, -1, -1, - 238, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 248, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, -1, - -1, -1, -1, 238, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 248, 216, 217, 218, 219, 220, 221, + 228, 229, 230, 231, 232, -1, -1, -1, -1, 237, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 247, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, -1, -1, + -1, -1, 237, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, -1, -1, -1, -1, 238, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 248, 216, 217, 218, + 232, -1, -1, -1, -1, 237, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 248, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, -1, -1, - -1, -1, 238, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 248, 216, 217, 218, 219, 220, 221, 222, + 226, 227, 228, 229, 230, 231, 232, -1, -1, -1, + -1, 237, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, -1, -1, -1, -1, 238, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 248, 216, 217, 218, 219, + -1, -1, -1, -1, 237, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, -1, -1, -1, -1, 238, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 248, 216, + 230, 231, 232, -1, -1, -1, -1, 237, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, -1, -1, -1, - -1, 238, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 248, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 248, 216, 217, 218, 219, 220, + 227, 228, 229, 230, 231, 232, -1, -1, -1, -1, + 237, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, -1, -1, -1, -1, 238, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 248, 216, 217, + 231, 232, -1, -1, -1, -1, 237, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, -1, -1, -1, -1, - 238, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 248, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, -1, - -1, -1, -1, 238, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 248, 216, 217, 218, 219, 220, 221, + 228, 229, 230, 231, 232, -1, -1, -1, -1, 237, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 247, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, -1, -1, + -1, -1, 237, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, -1, -1, -1, -1, 238, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 248, 216, 217, 218, + 232, -1, -1, -1, -1, 237, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 248, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, -1, -1, - -1, -1, 238, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 248, 216, 217, 218, 219, 220, 221, 222, + 226, 227, 228, 229, 230, 231, 232, -1, -1, -1, + -1, 237, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, -1, -1, -1, -1, 238, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 248, 216, 217, 218, 219, + -1, -1, -1, -1, 237, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, -1, -1, -1, -1, 238, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 248, 216, + 230, 231, 232, -1, -1, -1, -1, 237, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, -1, -1, -1, - -1, 238, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 248, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, -1, -1, -1, -1, - 244, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, -1, - -1, -1, -1, 238, -1, -1, -1, -1, -1, 244, + 227, 228, 229, 230, 231, 232, -1, -1, -1, -1, + 237, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 247, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, -1, -1, -1, -1, 243, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, -1, -1, + -1, -1, 237, -1, -1, -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, -1, -1, - -1, -1, 238, -1, -1, -1, -1, -1, 244, 216, + 226, 227, 228, 229, 230, 231, 232, -1, -1, -1, + -1, 237, -1, -1, -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, -1, -1, -1, - -1, 238, -1, -1, -1, -1, -1, 244, 216, 217, + 227, 228, 229, 230, 231, 232, -1, -1, -1, -1, + 237, -1, -1, -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, -1, -1, -1, -1, - 238, -1, -1, -1, -1, -1, 244, 216, 217, 218, + 228, 229, 230, 231, 232, -1, -1, -1, -1, 237, + -1, -1, -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, -1, -1, -1, -1, 244, 216, 217, 218, 219, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + -1, -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, -1, -1, -1, -1, 238, -1, - -1, -1, -1, -1, 244, 216, 217, 218, 219, 220, + 230, 231, 232, -1, -1, -1, -1, 237, -1, -1, + -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, -1, -1, -1, -1, 238, -1, -1, - -1, -1, -1, 244, 216, 217, 218, 219, 220, 221, + 231, 232, -1, -1, -1, -1, 237, -1, -1, -1, + -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, -1, -1, -1, -1, 238, -1, -1, -1, - -1, -1, 244, 216, 217, 218, 219, 220, 221, 222, + 232, -1, -1, -1, -1, 237, -1, -1, -1, -1, + -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, -1, -1, -1, -1, 238, -1, -1, -1, -1, - -1, 244, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, -1, -1, -1, -1, - 244, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, -1, - -1, -1, -1, 238, -1, -1, -1, -1, -1, 244, + -1, -1, -1, -1, 237, -1, -1, -1, -1, -1, + 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, -1, -1, -1, -1, 243, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, -1, -1, + -1, -1, 237, -1, -1, -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, -1, -1, - -1, -1, 238, -1, -1, -1, -1, -1, 244, 216, + 226, 227, 228, 229, 230, 231, 232, -1, -1, -1, + -1, 237, -1, -1, -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, -1, -1, -1, - -1, 238, -1, -1, -1, -1, -1, 244, 216, 217, + 227, 228, 229, 230, 231, 232, -1, -1, -1, -1, + 237, -1, -1, -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, -1, -1, -1, -1, - 238, -1, -1, -1, -1, -1, 244, 216, 217, 218, + 228, 229, 230, 231, 232, -1, -1, -1, -1, 237, + -1, -1, -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, -1, -1, -1, -1, 244, 216, 217, 218, 219, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + -1, -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, -1, -1, -1, -1, 238, -1, - -1, -1, -1, -1, 244, 216, 217, 218, 219, 220, + 230, 231, 232, -1, -1, -1, -1, 237, -1, -1, + -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, -1, -1, -1, -1, 238, -1, -1, - -1, -1, -1, 244, 216, 217, 218, 219, 220, 221, + 231, 232, -1, -1, -1, -1, 237, -1, -1, -1, + -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, -1, -1, -1, -1, 238, -1, -1, -1, - -1, -1, 244, 216, 217, 218, 219, 220, 221, 222, + 232, -1, -1, -1, -1, 237, -1, -1, -1, -1, + -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, -1, -1, -1, -1, 238, -1, -1, -1, -1, - -1, 244, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, -1, -1, -1, -1, - 244, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, -1, - -1, -1, -1, 238, -1, -1, -1, -1, -1, 244, + -1, -1, -1, -1, 237, -1, -1, -1, -1, -1, + 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, -1, -1, -1, -1, 243, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, -1, -1, + -1, -1, 237, -1, -1, -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, -1, -1, - -1, -1, 238, -1, -1, -1, -1, -1, 244, 216, + 226, 227, 228, 229, 230, 231, 232, -1, -1, -1, + -1, 237, -1, -1, -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, -1, -1, -1, - -1, 238, -1, -1, -1, -1, -1, 244, 216, 217, + 227, 228, 229, 230, 231, 232, -1, -1, -1, -1, + 237, -1, -1, -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, -1, -1, -1, -1, - 238, -1, -1, -1, -1, -1, 244, 216, 217, 218, + 228, 229, 230, 231, 232, -1, -1, -1, -1, 237, + -1, -1, -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, -1, -1, -1, -1, 244, 216, 217, 218, 219, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + -1, -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, -1, -1, -1, -1, 238, -1, - -1, -1, -1, -1, 244, 216, 217, 218, 219, 220, + 230, 231, 232, -1, -1, -1, -1, 237, -1, -1, + -1, -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, -1, -1, -1, -1, 238, -1, -1, - -1, -1, -1, 244, 216, 217, 218, 219, 220, 221, + 231, 232, -1, -1, -1, -1, 237, -1, -1, -1, + -1, -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, -1, -1, -1, -1, 238, -1, -1, -1, - -1, -1, 244, 216, 217, 218, 219, 220, 221, 222, + 232, -1, -1, -1, -1, 237, -1, -1, -1, -1, + -1, 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, -1, -1, -1, -1, 238, -1, -1, -1, -1, - -1, 244, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, -1, -1, -1, -1, - 244, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, -1, - -1, -1, -1, 238, -1, -1, -1, -1, 243, 216, + -1, -1, -1, -1, 237, -1, -1, -1, -1, -1, + 243, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, -1, -1, -1, -1, 243, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, -1, -1, + -1, -1, 237, -1, -1, -1, -1, 242, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, -1, -1, -1, - -1, 238, -1, -1, -1, -1, 243, 216, 217, 218, + 227, 228, 229, 230, 231, 232, -1, -1, -1, -1, + 237, -1, -1, -1, -1, 242, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, -1, -1, -1, 243, 216, 217, 218, 219, 220, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + -1, -1, -1, 242, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, -1, -1, -1, -1, 238, -1, 240, - -1, 242, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, -1, -1, 242, 216, + 231, 232, -1, -1, -1, -1, 237, -1, 239, -1, + 241, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, -1, -1, 241, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, -1, -1, -1, - -1, 238, -1, -1, -1, 242, 216, 217, 218, 219, + 227, 228, 229, 230, 231, 232, -1, -1, -1, -1, + 237, -1, -1, -1, 241, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, -1, -1, -1, -1, 238, -1, - -1, -1, 242, 216, 217, 218, 219, 220, 221, 222, + 230, 231, 232, -1, -1, -1, -1, 237, -1, -1, + -1, 241, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, -1, -1, -1, -1, 238, -1, -1, -1, 242, + -1, -1, -1, -1, 237, -1, -1, -1, 241, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, -1, -1, - -1, -1, 238, -1, -1, -1, 242, 216, 217, 218, + 226, 227, 228, 229, 230, 231, 232, -1, -1, -1, + -1, 237, -1, -1, -1, 241, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, -1, -1, 242, 216, 217, 218, 219, 220, 221, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + -1, -1, 241, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, -1, -1, -1, -1, 238, -1, -1, -1, - 242, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, 233, -1, - -1, -1, -1, 238, -1, -1, -1, 242, 216, 217, + 232, -1, -1, -1, -1, 237, -1, -1, -1, 241, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, -1, -1, + -1, -1, 237, -1, -1, -1, 241, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, -1, -1, -1, -1, - 238, -1, -1, -1, 242, 216, 217, 218, 219, 220, + 228, 229, 230, 231, 232, -1, -1, -1, -1, 237, + -1, -1, -1, 241, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 231, 232, 233, -1, -1, -1, -1, 238, -1, -1, - -1, 242, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, -1, -1, 242, 216, + 231, 232, -1, -1, -1, -1, 237, -1, -1, -1, + 241, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, -1, -1, 241, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, -1, -1, -1, - -1, 238, -1, -1, -1, 242, 216, 217, 218, 219, + 227, 228, 229, 230, 231, 232, -1, -1, -1, -1, + 237, -1, -1, -1, 241, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, -1, -1, -1, -1, 238, -1, - -1, -1, 242, 216, 217, 218, 219, 220, 221, 222, + 230, 231, 232, -1, -1, -1, -1, 237, -1, -1, + -1, 241, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, - 233, -1, -1, -1, -1, 238, -1, -1, -1, 242, + -1, -1, -1, -1, 237, -1, -1, -1, 241, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, -1, -1, - -1, -1, 238, -1, -1, -1, 242, 216, 217, 218, + 226, 227, 228, 229, 230, 231, 232, -1, -1, -1, + -1, 237, -1, -1, -1, 241, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238, -1, 240, 216, 217, 218, + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237, -1, 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 231, 232, 233, -1, -1, -1, -1, 238, - -1, 240, 216, 217, 218, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - -1, -1, -1, -1, 238 + 229, 230, 231, 232, -1, -1, -1, -1, 237, -1, + 239, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, -1, + -1, -1, -1, 237 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint16 yystos[] = { - 0, 1, 250, 251, 6, 0, 4, 13, 14, 44, - 45, 64, 65, 66, 70, 71, 73, 78, 79, 81, - 82, 84, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 106, 107, 108, - 109, 110, 111, 113, 115, 116, 117, 118, 119, 120, - 121, 123, 124, 125, 126, 127, 128, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 140, 141, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, - 157, 158, 159, 163, 168, 169, 170, 171, 174, 176, + 0, 1, 249, 250, 6, 0, 4, 13, 14, 44, + 45, 64, 65, 66, 70, 71, 73, 78, 80, 81, + 83, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 105, 106, 107, 108, + 109, 110, 112, 114, 115, 116, 117, 118, 119, 120, + 122, 123, 124, 125, 126, 127, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 156, + 157, 158, 162, 167, 168, 169, 170, 173, 175, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 198, 199, 200, 209, 211, 252, - 254, 255, 275, 293, 295, 299, 302, 303, 304, 305, - 306, 307, 308, 309, 310, 317, 319, 320, 326, 327, - 328, 329, 335, 360, 361, 243, 247, 14, 97, 239, - 239, 6, 243, 6, 6, 6, 6, 239, 6, 6, - 241, 241, 4, 337, 361, 239, 241, 273, 273, 239, - 239, 239, 4, 239, 239, 239, 4, 239, 239, 239, - 239, 239, 239, 239, 239, 239, 239, 239, 243, 112, - 97, 6, 243, 91, 94, 97, 110, 298, 239, 3, - 10, 11, 12, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 55, 56, 57, 58, 63, 64, 75, 76, - 77, 83, 86, 91, 94, 97, 99, 110, 119, 124, - 126, 192, 196, 197, 201, 202, 203, 205, 206, 207, - 227, 228, 234, 239, 243, 246, 295, 296, 299, 310, - 317, 319, 330, 331, 335, 337, 344, 346, 361, 239, - 243, 97, 97, 119, 94, 97, 99, 91, 94, 97, - 99, 295, 94, 97, 99, 110, 296, 94, 97, 239, - 94, 149, 174, 190, 191, 243, 227, 228, 239, 243, - 341, 342, 341, 243, 243, 341, 4, 91, 95, 101, - 102, 104, 105, 123, 239, 97, 99, 97, 94, 4, - 84, 185, 243, 361, 4, 6, 91, 94, 97, 94, - 97, 110, 297, 4, 4, 4, 5, 239, 243, 344, - 345, 4, 239, 239, 239, 4, 243, 348, 361, 4, - 239, 239, 239, 6, 6, 241, 5, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 59, 60, 61, 62, - 67, 68, 69, 72, 74, 85, 88, 193, 194, 195, - 204, 208, 210, 352, 361, 239, 4, 352, 5, 243, - 5, 243, 32, 228, 330, 361, 241, 243, 239, 243, - 6, 239, 243, 6, 247, 7, 126, 185, 212, 213, - 214, 215, 236, 237, 239, 241, 245, 271, 272, 273, - 330, 351, 352, 361, 4, 299, 300, 301, 243, 6, - 330, 351, 352, 361, 351, 330, 351, 358, 359, 361, - 277, 281, 239, 340, 9, 352, 361, 330, 330, 330, - 239, 330, 330, 330, 239, 330, 330, 330, 330, 330, - 330, 330, 351, 330, 330, 330, 330, 345, 239, 228, - 330, 346, 347, 243, 345, 351, 273, 273, 273, 273, - 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, - 273, 273, 273, 273, 273, 273, 273, 273, 273, 239, - 241, 273, 273, 273, 273, 273, 273, 239, 273, 273, - 239, 295, 273, 273, 5, 243, 243, 119, 295, 239, - 273, 273, 239, 239, 239, 330, 243, 330, 346, 330, - 330, 244, 347, 337, 361, 177, 5, 243, 8, 216, - 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 231, 232, 233, 238, 9, 239, - 241, 245, 272, 273, 330, 347, 239, 239, 239, 344, - 345, 345, 345, 294, 243, 239, 344, 243, 243, 330, - 4, 344, 243, 348, 243, 243, 341, 341, 341, 330, - 330, 227, 228, 243, 243, 341, 227, 228, 239, 301, - 341, 243, 239, 243, 239, 239, 239, 239, 239, 239, - 239, 330, 345, 345, 345, 239, 4, 241, 6, 241, - 301, 6, 6, 243, 243, 243, 243, 345, 241, 241, - 241, 330, 8, 6, 6, 330, 330, 330, 245, 330, - 243, 177, 330, 330, 330, 330, 273, 273, 273, 239, - 239, 239, 273, 273, 273, 273, 273, 273, 273, 273, - 273, 273, 239, 239, 273, 239, 241, 6, 6, 243, - 6, 8, 301, 6, 8, 301, 273, 330, 229, 243, - 9, 239, 241, 245, 351, 347, 330, 301, 344, 344, - 243, 352, 91, 94, 97, 99, 7, 330, 330, 4, - 174, 175, 344, 6, 240, 242, 243, 274, 6, 243, - 6, 9, 239, 241, 245, 361, 244, 119, 124, 126, - 127, 293, 295, 330, 6, 240, 248, 9, 239, 241, - 245, 240, 248, 248, 240, 248, 9, 239, 245, 242, - 248, 276, 242, 276, 87, 339, 336, 361, 248, 248, - 240, 240, 240, 330, 240, 240, 240, 330, 240, 240, - 240, 240, 240, 240, 240, 240, 240, 240, 240, 244, - 7, 330, 229, 244, 248, 330, 6, 240, 330, 330, - 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 330, 330, 330, 330, 330, 346, 330, 330, 330, 330, - 330, 330, 330, 346, 346, 361, 243, 330, 330, 351, - 330, 351, 344, 351, 351, 358, 243, 330, 274, 361, - 8, 330, 330, 345, 351, 351, 346, 337, 352, 337, - 347, 240, 244, 245, 273, 64, 8, 330, 330, 330, - 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 330, 243, 330, 346, 330, 330, 330, 330, 330, 361, - 330, 330, 4, 338, 243, 274, 240, 244, 330, 330, - 330, 7, 7, 323, 323, 239, 330, 330, 6, 347, - 347, 243, 240, 6, 301, 243, 301, 301, 248, 248, - 248, 341, 341, 300, 300, 248, 330, 244, 314, 248, - 301, 330, 330, 330, 330, 330, 330, 330, 330, 330, - 240, 7, 324, 6, 7, 330, 6, 330, 330, 244, - 347, 347, 347, 330, 6, 330, 330, 330, 240, 244, - 240, 240, 240, 174, 248, 301, 243, 8, 240, 240, - 242, 358, 351, 358, 351, 351, 351, 351, 351, 351, - 330, 351, 351, 351, 351, 246, 354, 361, 352, 351, - 351, 351, 337, 361, 347, 244, 244, 244, 244, 330, - 330, 301, 361, 338, 242, 244, 240, 132, 149, 318, - 240, 244, 248, 330, 6, 243, 243, 243, 243, 330, - 240, 242, 7, 271, 272, 245, 7, 6, 347, 7, - 215, 271, 256, 361, 330, 330, 338, 241, 239, 119, - 295, 296, 243, 244, 6, 222, 223, 253, 347, 361, - 330, 330, 4, 338, 6, 347, 330, 6, 351, 359, - 361, 240, 338, 6, 361, 6, 351, 330, 240, 241, - 330, 352, 7, 7, 7, 240, 7, 7, 7, 240, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 330, 240, 243, 330, 346, 244, 6, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 248, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 248, 248, - 248, 240, 242, 242, 347, 248, 248, 274, 248, 274, - 248, 248, 248, 240, 330, 332, 274, 244, 244, 244, - 248, 248, 274, 274, 240, 245, 240, 245, 248, 273, - 333, 244, 7, 338, 274, 243, 244, 8, 8, 347, - 245, 240, 242, 272, 239, 241, 273, 347, 7, 243, - 240, 240, 240, 330, 344, 4, 322, 6, 290, 330, - 352, 244, 240, 244, 244, 347, 245, 244, 301, 244, - 244, 341, 330, 330, 244, 244, 330, 341, 129, 129, - 146, 154, 155, 156, 160, 161, 315, 316, 341, 244, - 311, 240, 244, 240, 240, 240, 240, 240, 240, 240, - 7, 330, 6, 330, 240, 242, 242, 244, 244, 244, - 244, 242, 242, 248, 7, 7, 7, 245, 330, 244, - 330, 330, 7, 245, 274, 248, 274, 274, 240, 240, - 248, 274, 274, 248, 248, 274, 274, 274, 274, 330, - 274, 9, 353, 248, 240, 248, 274, 245, 248, 334, - 242, 244, 244, 245, 239, 241, 247, 177, 7, 149, - 6, 330, 244, 243, 6, 344, 244, 330, 330, 330, - 330, 6, 7, 271, 272, 245, 271, 272, 352, 330, - 6, 4, 243, 349, 361, 244, 46, 46, 344, 4, - 164, 165, 166, 167, 244, 259, 263, 266, 268, 269, - 245, 240, 242, 239, 330, 330, 239, 243, 239, 8, - 347, 351, 240, 245, 240, 242, 239, 240, 248, 245, - 239, 7, 273, 4, 284, 285, 286, 274, 274, 341, - 344, 344, 7, 344, 344, 344, 7, 344, 344, 344, - 344, 344, 344, 344, 344, 344, 344, 6, 7, 347, - 330, 330, 330, 330, 244, 330, 330, 330, 344, 351, - 351, 244, 248, 283, 330, 330, 338, 338, 330, 330, - 240, 344, 273, 330, 330, 330, 244, 338, 272, 245, - 272, 330, 330, 274, 244, 344, 347, 7, 7, 7, - 129, 321, 6, 240, 248, 7, 7, 7, 244, 4, - 244, 248, 248, 248, 244, 244, 109, 4, 6, 330, - 243, 6, 239, 6, 162, 6, 162, 244, 316, 248, - 315, 7, 6, 7, 7, 7, 7, 7, 7, 7, - 344, 6, 243, 6, 6, 6, 97, 7, 6, 6, - 330, 344, 344, 344, 4, 248, 8, 8, 240, 4, - 100, 101, 4, 347, 351, 330, 351, 246, 248, 287, - 351, 351, 338, 351, 240, 248, 338, 243, 295, 243, - 6, 330, 6, 243, 344, 244, 244, 244, 244, 244, - 330, 6, 4, 174, 175, 330, 6, 6, 6, 7, - 348, 350, 6, 241, 274, 273, 273, 6, 260, 239, - 239, 243, 270, 6, 338, 245, 351, 330, 242, 240, - 330, 8, 347, 330, 244, 244, 6, 6, 253, 338, - 245, 330, 6, 330, 338, 240, 243, 330, 352, 274, - 46, 243, 344, 352, 355, 242, 248, 6, 6, 6, - 123, 292, 292, 344, 6, 6, 6, 344, 177, 291, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, - 244, 274, 274, 274, 274, 274, 248, 248, 248, 240, - 274, 274, 285, 274, 240, 274, 240, 273, 333, 274, - 6, 274, 248, 239, 241, 273, 4, 240, 242, 274, - 6, 244, 344, 344, 344, 4, 6, 271, 330, 344, - 243, 243, 7, 6, 7, 330, 330, 330, 243, 243, - 243, 241, 6, 330, 344, 330, 6, 6, 330, 341, - 244, 5, 344, 243, 243, 243, 243, 243, 243, 243, - 344, 6, 347, 243, 330, 242, 6, 6, 173, 330, - 330, 330, 6, 6, 6, 6, 7, 274, 248, 248, - 274, 248, 330, 4, 189, 288, 289, 274, 240, 274, - 334, 352, 239, 241, 330, 243, 301, 6, 301, 248, - 6, 6, 7, 271, 272, 245, 7, 6, 348, 244, - 248, 330, 271, 243, 274, 356, 357, 358, 356, 239, - 330, 330, 343, 344, 243, 239, 4, 6, 240, 6, - 240, 244, 244, 240, 6, 6, 351, 239, 4, 240, - 248, 239, 344, 352, 7, 273, 282, 330, 346, 286, - 341, 6, 6, 6, 6, 95, 6, 5, 243, 330, - 330, 330, 330, 240, 333, 330, 330, 330, 274, 272, - 243, 6, 291, 6, 330, 344, 4, 6, 347, 347, - 330, 330, 352, 244, 240, 244, 248, 300, 300, 330, - 330, 244, 248, 240, 244, 248, 6, 6, 343, 341, - 341, 341, 341, 341, 228, 341, 6, 244, 330, 6, - 6, 344, 244, 248, 8, 244, 240, 243, 330, 352, - 351, 330, 351, 330, 352, 355, 357, 352, 248, 240, - 248, 244, 330, 318, 318, 344, 352, 330, 6, 4, - 349, 6, 348, 242, 344, 358, 6, 274, 274, 257, - 330, 248, 248, 244, 248, 258, 330, 330, 6, 6, - 6, 330, 330, 240, 278, 280, 243, 357, 244, 248, - 7, 7, 243, 5, 343, 274, 274, 248, 274, 240, - 248, 240, 242, 330, 6, 6, 243, 244, 244, 243, - 6, 6, 243, 330, 244, 244, 244, 242, 6, 344, - 7, 243, 330, 244, 248, 248, 248, 248, 248, 248, - 6, 244, 172, 330, 330, 347, 6, 6, 240, 274, - 274, 289, 352, 244, 244, 244, 244, 6, 6, 7, - 6, 245, 6, 244, 6, 6, 240, 248, 330, 330, - 243, 344, 244, 248, 240, 240, 248, 283, 287, 344, - 274, 330, 352, 361, 330, 6, 244, 330, 333, 330, - 244, 343, 133, 134, 139, 325, 133, 134, 325, 347, - 300, 244, 248, 6, 244, 344, 301, 244, 6, 347, - 341, 341, 341, 341, 341, 330, 244, 244, 244, 240, - 6, 243, 6, 348, 175, 261, 330, 248, 248, 343, - 6, 330, 330, 244, 244, 279, 7, 239, 244, 243, - 248, 240, 248, 244, 243, 341, 344, 6, 243, 341, - 6, 244, 244, 330, 6, 129, 244, 312, 243, 244, - 248, 248, 248, 248, 248, 6, 6, 6, 301, 6, - 243, 330, 330, 244, 248, 283, 352, 240, 330, 330, - 330, 6, 341, 6, 341, 6, 6, 244, 330, 315, - 301, 6, 347, 347, 347, 347, 341, 347, 318, 258, - 240, 248, 6, 243, 330, 244, 248, 248, 248, 248, - 248, 6, 244, 244, 313, 244, 244, 244, 244, 248, - 244, 244, 244, 264, 330, 343, 244, 330, 330, 330, - 341, 341, 315, 6, 6, 6, 6, 347, 6, 6, - 6, 243, 240, 244, 6, 244, 274, 248, 248, 248, - 244, 244, 262, 351, 267, 243, 6, 330, 330, 330, - 6, 244, 248, 243, 343, 244, 244, 244, 6, 351, - 265, 351, 244, 6, 6, 244, 248, 6, 6, 351 + 188, 189, 190, 197, 198, 199, 208, 210, 251, 253, + 254, 274, 292, 294, 298, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 316, 318, 319, 325, 326, 327, + 328, 334, 359, 360, 242, 246, 14, 96, 238, 238, + 6, 242, 6, 6, 6, 6, 238, 6, 240, 240, + 4, 336, 360, 238, 240, 272, 272, 238, 238, 238, + 4, 238, 238, 238, 4, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 242, 111, 96, 6, + 242, 90, 93, 96, 109, 297, 238, 3, 10, 11, + 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 55, 56, 57, 58, 63, 64, 75, 76, 77, 82, + 85, 90, 93, 96, 98, 109, 118, 123, 125, 191, + 195, 196, 200, 201, 202, 204, 205, 206, 226, 227, + 233, 238, 242, 245, 294, 295, 298, 309, 316, 318, + 329, 330, 334, 336, 343, 345, 360, 238, 242, 96, + 96, 118, 93, 96, 98, 90, 93, 96, 98, 294, + 93, 96, 98, 109, 295, 93, 96, 238, 93, 148, + 173, 189, 190, 242, 226, 227, 238, 242, 340, 341, + 340, 242, 242, 340, 4, 90, 94, 100, 101, 103, + 104, 122, 238, 96, 98, 96, 93, 4, 83, 184, + 242, 360, 4, 6, 90, 93, 96, 93, 96, 109, + 296, 4, 4, 4, 5, 238, 242, 343, 344, 4, + 238, 238, 238, 4, 242, 347, 360, 4, 238, 238, + 238, 6, 6, 240, 5, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 59, 60, 61, 62, 67, 68, + 69, 72, 74, 84, 87, 192, 193, 194, 203, 207, + 209, 351, 360, 238, 4, 351, 5, 242, 5, 242, + 32, 227, 329, 360, 240, 242, 238, 242, 6, 238, + 242, 6, 246, 7, 125, 184, 211, 212, 213, 214, + 235, 236, 238, 240, 244, 270, 271, 272, 329, 350, + 351, 360, 4, 298, 299, 300, 242, 6, 329, 350, + 351, 360, 350, 329, 350, 357, 358, 360, 276, 280, + 238, 339, 9, 351, 360, 329, 329, 329, 238, 329, + 329, 329, 238, 329, 329, 329, 329, 329, 329, 329, + 350, 329, 329, 329, 329, 344, 238, 227, 329, 345, + 346, 242, 344, 350, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 238, 240, 272, + 272, 272, 272, 272, 272, 238, 272, 272, 238, 294, + 272, 272, 5, 242, 242, 118, 294, 238, 272, 272, + 238, 238, 238, 329, 242, 329, 345, 329, 329, 243, + 346, 336, 360, 176, 5, 242, 8, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 237, 9, 238, 240, 244, + 271, 272, 329, 346, 238, 238, 238, 343, 344, 344, + 344, 293, 242, 238, 343, 242, 242, 329, 4, 343, + 242, 347, 242, 242, 340, 340, 340, 329, 329, 226, + 227, 242, 242, 340, 226, 227, 238, 300, 340, 242, + 238, 242, 238, 238, 238, 238, 238, 238, 238, 329, + 344, 344, 344, 238, 4, 240, 6, 240, 300, 6, + 6, 242, 242, 242, 242, 344, 240, 240, 240, 329, + 8, 6, 6, 329, 329, 329, 244, 329, 242, 176, + 329, 329, 329, 329, 272, 272, 272, 238, 238, 238, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 238, 238, 272, 238, 240, 6, 6, 242, 6, 8, + 300, 6, 8, 300, 272, 329, 228, 242, 9, 238, + 240, 244, 350, 346, 329, 300, 343, 343, 242, 351, + 90, 93, 96, 98, 7, 329, 329, 4, 173, 174, + 343, 6, 239, 241, 242, 273, 6, 242, 6, 9, + 238, 240, 244, 360, 243, 118, 123, 125, 126, 292, + 294, 329, 6, 239, 247, 9, 238, 240, 244, 239, + 247, 247, 239, 247, 9, 238, 244, 241, 247, 275, + 241, 275, 86, 338, 335, 360, 247, 247, 239, 239, + 239, 329, 239, 239, 239, 329, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 243, 7, 329, + 228, 243, 247, 329, 6, 239, 329, 329, 329, 329, + 329, 329, 329, 329, 329, 329, 329, 329, 329, 329, + 329, 329, 329, 345, 329, 329, 329, 329, 329, 329, + 329, 345, 345, 360, 242, 329, 329, 350, 329, 350, + 343, 350, 350, 357, 242, 329, 273, 360, 8, 329, + 329, 344, 350, 350, 345, 336, 351, 336, 346, 239, + 243, 244, 272, 64, 8, 329, 329, 329, 329, 329, + 329, 329, 329, 329, 329, 329, 329, 329, 329, 242, + 329, 345, 329, 329, 329, 329, 329, 360, 329, 329, + 4, 337, 242, 273, 239, 243, 329, 329, 329, 7, + 7, 322, 322, 238, 329, 329, 6, 346, 346, 242, + 239, 6, 300, 242, 300, 300, 247, 247, 247, 340, + 340, 299, 299, 247, 329, 243, 313, 247, 300, 329, + 329, 329, 329, 329, 329, 329, 329, 329, 239, 7, + 323, 6, 7, 329, 6, 329, 329, 243, 346, 346, + 346, 329, 6, 329, 329, 329, 239, 243, 239, 239, + 239, 173, 247, 300, 242, 8, 239, 239, 241, 357, + 350, 357, 350, 350, 350, 350, 350, 350, 329, 350, + 350, 350, 350, 245, 353, 360, 351, 350, 350, 350, + 336, 360, 346, 243, 243, 243, 243, 329, 329, 300, + 360, 337, 241, 243, 239, 131, 148, 317, 239, 243, + 247, 329, 6, 242, 242, 242, 242, 329, 239, 241, + 7, 270, 271, 244, 7, 6, 346, 7, 214, 270, + 255, 360, 329, 329, 337, 240, 238, 118, 294, 295, + 242, 243, 6, 221, 222, 252, 346, 360, 329, 329, + 4, 337, 6, 346, 329, 6, 350, 358, 360, 239, + 337, 6, 360, 6, 350, 329, 239, 240, 329, 351, + 7, 7, 7, 239, 7, 7, 7, 239, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 329, 239, + 242, 329, 345, 243, 6, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 247, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 247, 247, 247, 239, + 241, 241, 346, 247, 247, 273, 247, 273, 247, 247, + 247, 239, 329, 331, 273, 243, 243, 243, 247, 247, + 273, 273, 239, 244, 239, 244, 247, 272, 332, 243, + 7, 337, 273, 242, 243, 8, 8, 346, 244, 239, + 241, 271, 238, 240, 272, 346, 7, 242, 239, 239, + 239, 329, 343, 4, 321, 6, 289, 329, 351, 243, + 239, 243, 243, 346, 244, 243, 300, 243, 243, 340, + 329, 329, 243, 243, 329, 340, 128, 128, 145, 153, + 154, 155, 159, 160, 314, 315, 340, 243, 310, 239, + 243, 239, 239, 239, 239, 239, 239, 239, 7, 329, + 6, 329, 239, 241, 241, 243, 243, 243, 243, 241, + 241, 247, 7, 7, 7, 244, 329, 243, 329, 329, + 7, 244, 273, 247, 273, 273, 239, 239, 247, 273, + 273, 247, 247, 273, 273, 273, 273, 329, 273, 9, + 352, 247, 239, 247, 273, 244, 247, 333, 241, 243, + 243, 244, 238, 240, 246, 176, 7, 148, 6, 329, + 243, 242, 6, 343, 243, 329, 329, 329, 329, 6, + 7, 270, 271, 244, 270, 271, 351, 329, 6, 4, + 242, 348, 360, 243, 46, 46, 343, 4, 163, 164, + 165, 166, 243, 258, 262, 265, 267, 268, 244, 239, + 241, 238, 329, 329, 238, 242, 238, 8, 346, 350, + 239, 244, 239, 241, 238, 239, 247, 244, 238, 7, + 272, 4, 283, 284, 285, 273, 273, 340, 343, 343, + 7, 343, 343, 343, 7, 343, 343, 343, 343, 343, + 343, 343, 343, 343, 343, 6, 7, 346, 329, 329, + 329, 329, 243, 329, 329, 329, 343, 350, 350, 243, + 247, 282, 329, 329, 337, 337, 329, 329, 239, 343, + 272, 329, 329, 329, 243, 337, 271, 244, 271, 329, + 329, 273, 243, 343, 346, 7, 7, 7, 128, 320, + 6, 239, 247, 7, 7, 7, 243, 4, 243, 247, + 247, 247, 243, 243, 108, 4, 6, 329, 242, 6, + 238, 6, 161, 6, 161, 243, 315, 247, 314, 7, + 6, 7, 7, 7, 7, 7, 7, 7, 343, 6, + 242, 6, 6, 6, 96, 7, 6, 6, 329, 343, + 343, 343, 4, 247, 8, 8, 239, 4, 99, 100, + 4, 346, 350, 329, 350, 245, 247, 286, 350, 350, + 337, 350, 239, 247, 337, 242, 294, 242, 6, 329, + 6, 242, 343, 243, 243, 243, 243, 243, 329, 6, + 4, 173, 174, 329, 6, 6, 6, 7, 347, 349, + 6, 240, 273, 272, 272, 6, 259, 238, 238, 242, + 269, 6, 337, 244, 350, 329, 241, 239, 329, 8, + 346, 329, 243, 243, 6, 6, 252, 337, 244, 329, + 6, 329, 337, 239, 242, 329, 351, 273, 46, 242, + 343, 351, 354, 241, 247, 6, 6, 6, 122, 291, + 291, 343, 6, 6, 6, 343, 176, 290, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 5, 243, 273, + 273, 273, 273, 273, 247, 247, 247, 239, 273, 273, + 284, 273, 239, 273, 239, 272, 332, 273, 6, 273, + 247, 238, 240, 272, 4, 239, 241, 273, 6, 243, + 343, 343, 343, 4, 6, 270, 329, 343, 242, 242, + 7, 6, 7, 329, 329, 329, 242, 242, 242, 240, + 6, 329, 343, 329, 6, 6, 329, 340, 243, 5, + 343, 242, 242, 242, 242, 242, 242, 242, 343, 6, + 346, 242, 329, 241, 6, 6, 172, 329, 329, 329, + 6, 6, 6, 6, 7, 273, 247, 247, 273, 247, + 329, 4, 188, 287, 288, 273, 239, 273, 333, 351, + 238, 240, 329, 242, 300, 6, 300, 247, 6, 6, + 7, 270, 271, 244, 7, 6, 347, 243, 247, 329, + 270, 242, 273, 355, 356, 357, 355, 238, 329, 329, + 342, 343, 242, 238, 4, 6, 239, 6, 239, 243, + 243, 239, 6, 6, 350, 238, 4, 239, 247, 238, + 343, 351, 7, 272, 281, 329, 345, 285, 340, 6, + 6, 6, 6, 94, 6, 5, 242, 329, 329, 329, + 329, 239, 332, 329, 329, 329, 273, 271, 242, 6, + 290, 6, 329, 343, 4, 6, 346, 346, 329, 329, + 351, 243, 239, 243, 247, 299, 299, 329, 329, 243, + 247, 239, 243, 247, 6, 6, 342, 340, 340, 340, + 340, 340, 227, 340, 6, 243, 329, 6, 6, 343, + 243, 247, 8, 243, 239, 242, 329, 351, 350, 329, + 350, 329, 351, 354, 356, 351, 247, 239, 247, 243, + 329, 317, 317, 343, 351, 329, 6, 4, 348, 6, + 347, 241, 343, 357, 6, 273, 273, 256, 329, 247, + 247, 243, 247, 257, 329, 329, 6, 6, 6, 329, + 329, 239, 277, 279, 242, 356, 243, 247, 7, 7, + 242, 5, 342, 273, 273, 247, 273, 239, 247, 239, + 241, 329, 6, 6, 242, 243, 243, 242, 6, 6, + 242, 329, 243, 243, 243, 241, 6, 343, 7, 242, + 329, 243, 247, 247, 247, 247, 247, 247, 6, 243, + 171, 329, 329, 346, 6, 6, 239, 273, 273, 288, + 351, 243, 243, 243, 243, 6, 6, 7, 6, 244, + 6, 243, 6, 6, 239, 247, 329, 329, 242, 343, + 243, 247, 239, 239, 247, 282, 286, 343, 273, 329, + 351, 360, 329, 6, 243, 329, 332, 329, 243, 342, + 132, 133, 138, 324, 132, 133, 324, 346, 299, 243, + 247, 6, 243, 343, 300, 243, 6, 346, 340, 340, + 340, 340, 340, 329, 243, 243, 243, 239, 6, 242, + 6, 347, 174, 260, 329, 247, 247, 342, 6, 329, + 329, 243, 243, 278, 7, 238, 243, 242, 247, 239, + 247, 243, 242, 340, 343, 6, 242, 340, 6, 243, + 243, 329, 6, 128, 243, 311, 242, 243, 247, 247, + 247, 247, 247, 6, 6, 6, 300, 6, 242, 329, + 329, 243, 247, 282, 351, 239, 329, 329, 329, 6, + 340, 6, 340, 6, 6, 243, 329, 314, 300, 6, + 346, 346, 346, 346, 340, 346, 317, 257, 239, 247, + 6, 242, 329, 243, 247, 247, 247, 247, 247, 6, + 243, 243, 312, 243, 243, 243, 243, 247, 243, 243, + 243, 263, 329, 342, 243, 329, 329, 329, 340, 340, + 314, 6, 6, 6, 6, 346, 6, 6, 6, 242, + 239, 243, 6, 243, 273, 247, 247, 247, 243, 243, + 261, 350, 266, 242, 6, 329, 329, 329, 6, 243, + 247, 242, 342, 243, 243, 243, 6, 350, 264, 350, + 243, 6, 6, 243, 247, 6, 6, 350 }; #define yyerrok (yyerrstatus = 0) @@ -8615,76 +8589,30 @@ yyreduce: case 185: #line 2163 "Gmsh.y" { - int num = (int)(yyvsp[(4) - (8)].d); - std::vector<int> tags; ListOfDouble2Vector((yyvsp[(7) - (8)].l), tags); - switch ((yyvsp[(2) - (8)].i)) { - case 1: - { - bool r = GModel::current()->getGEOInternals()->addCompoundLine(num, tags); - if(!r) yymsg(0, "Could not add compound line"); - } - (yyval.s).Type = MSH_SEGM_COMPOUND; - break; - case 2: - { - bool r = GModel::current()->getGEOInternals()->addCompoundSurface(num, tags); - if(!r) yymsg(0, "Could not add compound surface"); - } - (yyval.s).Type = MSH_SURF_COMPOUND; - break; - case 3: - { - bool r = GModel::current()->getGEOInternals()->addCompoundVolume(num, tags); - if(!r) yymsg(0, "Could not add compound volume"); - } - (yyval.s).Type = MSH_VOLUME_COMPOUND; - break; - } - List_Delete((yyvsp[(7) - (8)].l)); - (yyval.s).Num = num; + yymsg(0, "Compounds entities are deprecated: use Compound meshing constraints instead"); + (yyval.s).Type = 0; + (yyval.s).Num = 0; ;} break; case 186: -#line 2194 "Gmsh.y" - { - // Particular case only for dim 2 (Surface) - if ((yyvsp[(2) - (12)].i) == 2) { - int num = (int)(yyvsp[(4) - (12)].d); - std::vector<int> tags; ListOfDouble2Vector((yyvsp[(7) - (12)].l), tags); - std::vector<int> bndTags[4]; - for(int i = 0; i < List_Nbr((yyvsp[(10) - (12)].l)); i++){ - if(i < 4) - ListOfDouble2Vector(*(List_T**)List_Pointer((yyvsp[(10) - (12)].l), i), bndTags[i]); - else - break; - } - bool r = GModel::current()->getGEOInternals()->addCompoundSurface - (num, tags, bndTags); - if(!r) yymsg(0, "Could not add compound surface"); - List_Delete((yyvsp[(7) - (12)].l)); - Free((yyvsp[(8) - (12)].c)); - for (int i = 0; i < List_Nbr((yyvsp[(10) - (12)].l)); i++) - List_Delete(*(List_T**)List_Pointer((yyvsp[(10) - (12)].l), i)); - List_Delete((yyvsp[(10) - (12)].l)); - (yyval.s).Type = MSH_SURF_COMPOUND; - (yyval.s).Num = num; - } - else { - yymsg(0, "GeoEntity dim out of range [2,2]"); - } +#line 2170 "Gmsh.y" + { + yymsg(0, "Compounds entities are deprecated: use Compound meshing constraints instead"); + (yyval.s).Type = 0; + (yyval.s).Num = 0; ;} break; case 187: -#line 2222 "Gmsh.y" +#line 2176 "Gmsh.y" { dim_entity = (yyvsp[(2) - (2)].i); ;} break; case 188: -#line 2226 "Gmsh.y" +#line 2180 "Gmsh.y" { int num = (int)(yyvsp[(5) - (9)].i); int op = (yyvsp[(7) - (9)].i); @@ -8710,27 +8638,27 @@ yyreduce: break; case 189: -#line 2252 "Gmsh.y" +#line 2206 "Gmsh.y" { (yyval.i) = 0; ;} break; case 190: -#line 2254 "Gmsh.y" +#line 2208 "Gmsh.y" { (yyval.i) = 1; ;} break; case 191: -#line 2256 "Gmsh.y" +#line 2210 "Gmsh.y" { (yyval.i) = 2; ;} break; case 192: -#line 2258 "Gmsh.y" +#line 2212 "Gmsh.y" { (yyval.i) = 3; ;} break; case 193: -#line 2260 "Gmsh.y" +#line 2214 "Gmsh.y" { (yyval.i) = (int)(yyvsp[(3) - (4)].d); if ((yyval.i)<0 || (yyval.i)>3) yymsg(0, "GeoEntity dim out of range [0,3]"); @@ -8738,22 +8666,22 @@ yyreduce: break; case 194: -#line 2268 "Gmsh.y" +#line 2222 "Gmsh.y" { (yyval.i) = 1; ;} break; case 195: -#line 2270 "Gmsh.y" +#line 2224 "Gmsh.y" { (yyval.i) = 2; ;} break; case 196: -#line 2272 "Gmsh.y" +#line 2226 "Gmsh.y" { (yyval.i) = 3; ;} break; case 197: -#line 2274 "Gmsh.y" +#line 2228 "Gmsh.y" { (yyval.i) = (int)(yyvsp[(3) - (4)].d); if ((yyval.i)<1 || (yyval.i)>3) yymsg(0, "GeoEntity dim out of range [1,3]"); @@ -8761,17 +8689,17 @@ yyreduce: break; case 198: -#line 2282 "Gmsh.y" +#line 2236 "Gmsh.y" { (yyval.i) = 1; ;} break; case 199: -#line 2284 "Gmsh.y" +#line 2238 "Gmsh.y" { (yyval.i) = 2; ;} break; case 200: -#line 2286 "Gmsh.y" +#line 2240 "Gmsh.y" { (yyval.i) = (int)(yyvsp[(3) - (4)].d); if ((yyval.i)<1 || (yyval.i)>2) yymsg(0, "GeoEntity dim out of range [1,2]"); @@ -8779,22 +8707,22 @@ yyreduce: break; case 201: -#line 2294 "Gmsh.y" +#line 2248 "Gmsh.y" { (yyval.i) = 0; ;} break; case 202: -#line 2296 "Gmsh.y" +#line 2250 "Gmsh.y" { (yyval.i) = 1; ;} break; case 203: -#line 2298 "Gmsh.y" +#line 2252 "Gmsh.y" { (yyval.i) = 2; ;} break; case 204: -#line 2300 "Gmsh.y" +#line 2254 "Gmsh.y" { (yyval.i) = (int)(yyvsp[(3) - (4)].d); if ((yyval.i)<0 || (yyval.i)>2) yymsg(0, "GeoEntity dim out of range [0,2]"); @@ -8802,7 +8730,7 @@ yyreduce: break; case 205: -#line 2310 "Gmsh.y" +#line 2264 "Gmsh.y" { std::vector<std::pair<int, int> > dimTags; ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags); @@ -8821,7 +8749,7 @@ yyreduce: break; case 206: -#line 2326 "Gmsh.y" +#line 2280 "Gmsh.y" { std::vector<std::pair<int, int> > dimTags; ListOfShapes2VectorOfPairs((yyvsp[(10) - (11)].l), dimTags); @@ -8840,7 +8768,7 @@ yyreduce: break; case 207: -#line 2342 "Gmsh.y" +#line 2296 "Gmsh.y" { std::vector<std::pair<int, int> > dimTags; ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags); @@ -8859,7 +8787,7 @@ yyreduce: break; case 208: -#line 2358 "Gmsh.y" +#line 2312 "Gmsh.y" { std::vector<std::pair<int, int> > dimTags; ListOfShapes2VectorOfPairs((yyvsp[(8) - (9)].l), dimTags); @@ -8878,7 +8806,7 @@ yyreduce: break; case 209: -#line 2374 "Gmsh.y" +#line 2328 "Gmsh.y" { std::vector<std::pair<int, int> > dimTags; ListOfShapes2VectorOfPairs((yyvsp[(8) - (9)].l), dimTags); @@ -8897,7 +8825,7 @@ yyreduce: break; case 210: -#line 2390 "Gmsh.y" +#line 2344 "Gmsh.y" { std::vector<std::pair<int, int> > inDimTags, outDimTags; ListOfShapes2VectorOfPairs((yyvsp[(3) - (4)].l), inDimTags); @@ -8937,7 +8865,7 @@ yyreduce: break; case 211: -#line 2427 "Gmsh.y" +#line 2381 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); bool r = true; @@ -8961,7 +8889,7 @@ yyreduce: break; case 212: -#line 2449 "Gmsh.y" +#line 2403 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); bool r = true; @@ -8985,31 +8913,31 @@ yyreduce: break; case 213: -#line 2472 "Gmsh.y" +#line 2426 "Gmsh.y" { (yyval.l) = (yyvsp[(1) - (1)].l); ;} break; case 214: -#line 2473 "Gmsh.y" +#line 2427 "Gmsh.y" { (yyval.l) = (yyvsp[(1) - (1)].l); ;} break; case 215: -#line 2478 "Gmsh.y" +#line 2432 "Gmsh.y" { (yyval.l) = List_Create(3, 3, sizeof(Shape)); ;} break; case 216: -#line 2482 "Gmsh.y" +#line 2436 "Gmsh.y" { List_Add((yyval.l), &(yyvsp[(2) - (2)].s)); ;} break; case 217: -#line 2486 "Gmsh.y" +#line 2440 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(4) - (6)].l)); i++){ double d; @@ -9028,7 +8956,7 @@ yyreduce: break; case 218: -#line 2502 "Gmsh.y" +#line 2456 "Gmsh.y" { List_T *tmp = List_Create(10, 10, sizeof(double)); getElementaryTagsForPhysicalGroups((yyvsp[(3) - (7)].i), (yyvsp[(5) - (7)].l), tmp); @@ -9049,7 +8977,7 @@ yyreduce: break; case 219: -#line 2520 "Gmsh.y" +#line 2474 "Gmsh.y" { List_T *tmp = List_Create(10, 10, sizeof(double)); getAllElementaryTags((yyvsp[(2) - (6)].i), tmp); @@ -9070,7 +8998,7 @@ yyreduce: break; case 220: -#line 2538 "Gmsh.y" +#line 2492 "Gmsh.y" { List_T *tmp = List_Create(10, 10, sizeof(double)); List_T *tmp2 = List_Create(10, 10, sizeof(double)); @@ -9093,7 +9021,7 @@ yyreduce: break; case 221: -#line 2563 "Gmsh.y" +#line 2517 "Gmsh.y" { if(List_Nbr((yyvsp[(7) - (8)].l)) == 4){ int t = (int)(yyvsp[(4) - (8)].d); @@ -9115,7 +9043,7 @@ yyreduce: break; case 222: -#line 2582 "Gmsh.y" +#line 2536 "Gmsh.y" { int t = (int)(yyvsp[(4) - (10)].d); if(gLevelset::find(t)){ @@ -9139,7 +9067,7 @@ yyreduce: break; case 223: -#line 2604 "Gmsh.y" +#line 2558 "Gmsh.y" { int t = (int)(yyvsp[(4) - (14)].d); if(gLevelset::find(t)){ @@ -9156,7 +9084,7 @@ yyreduce: break; case 224: -#line 2619 "Gmsh.y" +#line 2573 "Gmsh.y" { int t = (int)(yyvsp[(4) - (16)].d); if(gLevelset::find(t)){ @@ -9174,7 +9102,7 @@ yyreduce: break; case 225: -#line 2634 "Gmsh.y" +#line 2588 "Gmsh.y" { if(List_Nbr((yyvsp[(10) - (12)].l)) == 1){ int t = (int)(yyvsp[(4) - (12)].d); @@ -9195,7 +9123,7 @@ yyreduce: break; case 226: -#line 2653 "Gmsh.y" +#line 2607 "Gmsh.y" { if(List_Nbr((yyvsp[(12) - (14)].l)) == 1){ int t = (int)(yyvsp[(4) - (14)].d); @@ -9248,7 +9176,7 @@ yyreduce: break; case 227: -#line 2704 "Gmsh.y" +#line 2658 "Gmsh.y" { if(List_Nbr((yyvsp[(12) - (14)].l)) == 1){ int t = (int)(yyvsp[(4) - (14)].d); @@ -9271,7 +9199,7 @@ yyreduce: break; case 228: -#line 2725 "Gmsh.y" +#line 2679 "Gmsh.y" { if(List_Nbr((yyvsp[(12) - (14)].l)) == 3){ int t = (int)(yyvsp[(4) - (14)].d); @@ -9295,7 +9223,7 @@ yyreduce: break; case 229: -#line 2747 "Gmsh.y" +#line 2701 "Gmsh.y" { if(List_Nbr((yyvsp[(12) - (14)].l)) == 5){ int t = (int)(yyvsp[(4) - (14)].d); @@ -9320,7 +9248,7 @@ yyreduce: break; case 230: -#line 2769 "Gmsh.y" +#line 2723 "Gmsh.y" { if(!strcmp((yyvsp[(2) - (8)].c), "Union")){ int t = (int)(yyvsp[(4) - (8)].d); @@ -9428,7 +9356,7 @@ yyreduce: break; case 231: -#line 2874 "Gmsh.y" +#line 2828 "Gmsh.y" { if(!strcmp((yyvsp[(2) - (8)].c), "MathEval")){ int t = (int)(yyvsp[(4) - (8)].d); @@ -9447,7 +9375,7 @@ yyreduce: break; case 232: -#line 2890 "Gmsh.y" +#line 2844 "Gmsh.y" { if(!strcmp((yyvsp[(2) - (6)].c), "CutMesh")){ int t = (int)(yyvsp[(4) - (6)].d); @@ -9480,7 +9408,7 @@ yyreduce: break; case 233: -#line 2925 "Gmsh.y" +#line 2879 "Gmsh.y" { std::vector<std::pair<int, int> > dimTags; ListOfShapes2VectorOfPairs((yyvsp[(3) - (4)].l), dimTags); @@ -9505,7 +9433,7 @@ yyreduce: break; case 234: -#line 2947 "Gmsh.y" +#line 2901 "Gmsh.y" { std::vector<std::pair<int, int> > dimTags; ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags); @@ -9530,7 +9458,7 @@ yyreduce: break; case 235: -#line 2969 "Gmsh.y" +#line 2923 "Gmsh.y" { #if defined(HAVE_MESH) GModel::current()->getFields()->deleteField((int)(yyvsp[(4) - (6)].d)); @@ -9539,7 +9467,7 @@ yyreduce: break; case 236: -#line 2975 "Gmsh.y" +#line 2929 "Gmsh.y" { #if defined(HAVE_POST) if(!strcmp((yyvsp[(2) - (6)].c), "View")){ @@ -9557,7 +9485,7 @@ yyreduce: break; case 237: -#line 2990 "Gmsh.y" +#line 2944 "Gmsh.y" { if(!strcmp((yyvsp[(2) - (3)].c), "Meshes") || !strcmp((yyvsp[(2) - (3)].c), "All")){ ClearProject(); @@ -9588,7 +9516,7 @@ yyreduce: break; case 238: -#line 3018 "Gmsh.y" +#line 2972 "Gmsh.y" { #if defined(HAVE_POST) if(!strcmp((yyvsp[(2) - (4)].c), "Empty") && !strcmp((yyvsp[(3) - (4)].c), "Views")){ @@ -9603,14 +9531,14 @@ yyreduce: break; case 239: -#line 3030 "Gmsh.y" +#line 2984 "Gmsh.y" { gmsh_yynamespaces.clear(); ;} break; case 240: -#line 3039 "Gmsh.y" +#line 2993 "Gmsh.y" { std::vector<std::pair<int, int> > dimTags; ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags); @@ -9620,7 +9548,7 @@ yyreduce: break; case 241: -#line 3046 "Gmsh.y" +#line 3000 "Gmsh.y" { std::vector<std::pair<int, int> > dimTags; ListOfShapes2VectorOfPairs((yyvsp[(5) - (6)].l), dimTags); @@ -9630,7 +9558,7 @@ yyreduce: break; case 242: -#line 3058 "Gmsh.y" +#line 3012 "Gmsh.y" { std::vector<std::pair<int, int> > dimTags; ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags); @@ -9647,14 +9575,14 @@ yyreduce: break; case 243: -#line 3077 "Gmsh.y" +#line 3031 "Gmsh.y" { setVisibility(-1, 1, false); ;} break; case 244: -#line 3081 "Gmsh.y" +#line 3035 "Gmsh.y" { setVisibility(-1, 1, false); Free((yyvsp[(2) - (3)].c)); @@ -9662,14 +9590,14 @@ yyreduce: break; case 245: -#line 3086 "Gmsh.y" +#line 3040 "Gmsh.y" { setVisibility(-1, 0, false); ;} break; case 246: -#line 3090 "Gmsh.y" +#line 3044 "Gmsh.y" { setVisibility(-1, 0, false); Free((yyvsp[(2) - (3)].c)); @@ -9677,7 +9605,7 @@ yyreduce: break; case 247: -#line 3095 "Gmsh.y" +#line 3049 "Gmsh.y" { std::vector<std::pair<int, int> > dimTags; ListOfShapes2VectorOfPairs((yyvsp[(3) - (4)].l), dimTags); @@ -9687,7 +9615,7 @@ yyreduce: break; case 248: -#line 3102 "Gmsh.y" +#line 3056 "Gmsh.y" { std::vector<std::pair<int, int> > dimTags; ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags); @@ -9697,7 +9625,7 @@ yyreduce: break; case 249: -#line 3109 "Gmsh.y" +#line 3063 "Gmsh.y" { std::vector<std::pair<int, int> > dimTags; ListOfShapes2VectorOfPairs((yyvsp[(3) - (4)].l), dimTags); @@ -9707,7 +9635,7 @@ yyreduce: break; case 250: -#line 3116 "Gmsh.y" +#line 3070 "Gmsh.y" { std::vector<std::pair<int, int> > dimTags; ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), dimTags); @@ -9717,7 +9645,7 @@ yyreduce: break; case 251: -#line 3128 "Gmsh.y" +#line 3082 "Gmsh.y" { if(!strcmp((yyvsp[(1) - (3)].c), "Include")){ std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(2) - (3)].c)); @@ -9793,7 +9721,7 @@ yyreduce: break; case 252: -#line 3201 "Gmsh.y" +#line 3155 "Gmsh.y" { int n = List_Nbr((yyvsp[(3) - (5)].l)); if(n == 1){ @@ -9814,7 +9742,7 @@ yyreduce: break; case 253: -#line 3219 "Gmsh.y" +#line 3173 "Gmsh.y" { #if defined(HAVE_POST) if(!strcmp((yyvsp[(1) - (7)].c), "Save") && !strcmp((yyvsp[(2) - (7)].c), "View")){ @@ -9834,7 +9762,7 @@ yyreduce: break; case 254: -#line 3236 "Gmsh.y" +#line 3190 "Gmsh.y" { #if defined(HAVE_POST) && defined(HAVE_MESH) if(!strcmp((yyvsp[(1) - (7)].c), "Background") && !strcmp((yyvsp[(2) - (7)].c), "Mesh") && !strcmp((yyvsp[(3) - (7)].c), "View")){ @@ -9852,7 +9780,7 @@ yyreduce: break; case 255: -#line 3251 "Gmsh.y" +#line 3205 "Gmsh.y" { if(!strcmp((yyvsp[(1) - (3)].c), "Sleep")){ SleepInSeconds((yyvsp[(2) - (3)].d)); @@ -9888,7 +9816,7 @@ yyreduce: break; case 256: -#line 3284 "Gmsh.y" +#line 3238 "Gmsh.y" { #if defined(HAVE_PLUGINS) try { @@ -9903,7 +9831,7 @@ yyreduce: break; case 257: -#line 3296 "Gmsh.y" +#line 3250 "Gmsh.y" { #if defined(HAVE_POST) if(!strcmp((yyvsp[(2) - (3)].c), "ElementsFromAllViews")) @@ -9930,14 +9858,14 @@ yyreduce: break; case 258: -#line 3320 "Gmsh.y" +#line 3274 "Gmsh.y" { Msg::Exit(0); ;} break; case 259: -#line 3324 "Gmsh.y" +#line 3278 "Gmsh.y" { gmsh_yyerrorstate = 999; // this will be checked when yyparse returns YYABORT; @@ -9945,7 +9873,7 @@ yyreduce: break; case 260: -#line 3329 "Gmsh.y" +#line 3283 "Gmsh.y" { // force sync if(GModel::current()->getOCCInternals()) @@ -9955,7 +9883,7 @@ yyreduce: break; case 261: -#line 3336 "Gmsh.y" +#line 3290 "Gmsh.y" { new GModel(); GModel::current(GModel::list.size() - 1); @@ -9963,7 +9891,7 @@ yyreduce: break; case 262: -#line 3341 "Gmsh.y" +#line 3295 "Gmsh.y" { CTX::instance()->forcedBBox = 0; if(GModel::current()->getOCCInternals() && @@ -9976,7 +9904,7 @@ yyreduce: break; case 263: -#line 3351 "Gmsh.y" +#line 3305 "Gmsh.y" { CTX::instance()->forcedBBox = 1; SetBoundingBox((yyvsp[(3) - (15)].d), (yyvsp[(5) - (15)].d), (yyvsp[(7) - (15)].d), (yyvsp[(9) - (15)].d), (yyvsp[(11) - (15)].d), (yyvsp[(13) - (15)].d)); @@ -9984,7 +9912,7 @@ yyreduce: break; case 264: -#line 3356 "Gmsh.y" +#line 3310 "Gmsh.y" { #if defined(HAVE_OPENGL) drawContext::global()->draw(); @@ -9993,7 +9921,7 @@ yyreduce: break; case 265: -#line 3362 "Gmsh.y" +#line 3316 "Gmsh.y" { #if defined(HAVE_OPENGL) CTX::instance()->mesh.changed = ENT_ALL; @@ -10004,21 +9932,14 @@ yyreduce: break; case 266: -#line 3370 "Gmsh.y" +#line 3324 "Gmsh.y" { GModel::current()->createTopologyFromMesh(); ;} break; case 267: -#line 3374 "Gmsh.y" - { - GModel::current()->createTopologyFromMesh(1); - ;} - break; - - case 268: -#line 3378 "Gmsh.y" +#line 3328 "Gmsh.y" { if(GModel::current()->getOCCInternals() && GModel::current()->getOCCInternals()->getChanged()) @@ -10029,8 +9950,8 @@ yyreduce: ;} break; - case 269: -#line 3388 "Gmsh.y" + case 268: +#line 3338 "Gmsh.y" { int lock = CTX::instance()->lock; CTX::instance()->lock = 0; @@ -10090,8 +10011,8 @@ yyreduce: ;} break; - case 270: -#line 3451 "Gmsh.y" + case 269: +#line 3401 "Gmsh.y" { #if defined(HAVE_POPPLER) std::vector<int> is; @@ -10105,8 +10026,8 @@ yyreduce: ;} break; - case 271: -#line 3467 "Gmsh.y" + case 270: +#line 3417 "Gmsh.y" { LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(3) - (6)].d); LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(5) - (6)].d); @@ -10125,8 +10046,8 @@ yyreduce: ;} break; - case 272: -#line 3484 "Gmsh.y" + case 271: +#line 3434 "Gmsh.y" { LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(3) - (8)].d); LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(5) - (8)].d); @@ -10145,8 +10066,8 @@ yyreduce: ;} break; - case 273: -#line 3501 "Gmsh.y" + case 272: +#line 3451 "Gmsh.y" { LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(5) - (8)].d); LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(7) - (8)].d); @@ -10170,8 +10091,8 @@ yyreduce: ;} break; - case 274: -#line 3523 "Gmsh.y" + case 273: +#line 3473 "Gmsh.y" { LoopControlVariablesTab[ImbricatedLoop][0] = (yyvsp[(5) - (10)].d); LoopControlVariablesTab[ImbricatedLoop][1] = (yyvsp[(7) - (10)].d); @@ -10195,8 +10116,8 @@ yyreduce: ;} break; - case 275: -#line 3545 "Gmsh.y" + case 274: +#line 3495 "Gmsh.y" { if(ImbricatedLoop <= 0){ yymsg(0, "Invalid For/EndFor loop"); @@ -10233,8 +10154,8 @@ yyreduce: ;} break; - case 276: -#line 3580 "Gmsh.y" + case 275: +#line 3530 "Gmsh.y" { if(!FunctionManager::Instance()->createFunction (std::string((yyvsp[(2) - (2)].c)), gmsh_yyin, gmsh_yyname, gmsh_yylineno)) @@ -10244,8 +10165,8 @@ yyreduce: ;} break; - case 277: -#line 3588 "Gmsh.y" + case 276: +#line 3538 "Gmsh.y" { if(!FunctionManager::Instance()->createFunction (std::string((yyvsp[(2) - (2)].c)), gmsh_yyin, gmsh_yyname, gmsh_yylineno)) @@ -10255,8 +10176,8 @@ yyreduce: ;} break; - case 278: -#line 3596 "Gmsh.y" + case 277: +#line 3546 "Gmsh.y" { if(!FunctionManager::Instance()->leaveFunction (&gmsh_yyin, gmsh_yyname, gmsh_yylineno)) @@ -10264,8 +10185,8 @@ yyreduce: ;} break; - case 279: -#line 3602 "Gmsh.y" + case 278: +#line 3552 "Gmsh.y" { if(!FunctionManager::Instance()->enterFunction (std::string((yyvsp[(2) - (3)].c)), &gmsh_yyin, gmsh_yyname, gmsh_yylineno)) @@ -10274,8 +10195,8 @@ yyreduce: ;} break; - case 280: -#line 3609 "Gmsh.y" + case 279: +#line 3559 "Gmsh.y" { if(!FunctionManager::Instance()->enterFunction (std::string((yyvsp[(2) - (3)].c)), &gmsh_yyin, gmsh_yyname, gmsh_yylineno)) @@ -10284,8 +10205,8 @@ yyreduce: ;} break; - case 281: -#line 3616 "Gmsh.y" + case 280: +#line 3566 "Gmsh.y" { ImbricatedTest++; if(ImbricatedTest > MAX_RECUR_TESTS-1){ @@ -10307,8 +10228,8 @@ yyreduce: ;} break; - case 282: -#line 3636 "Gmsh.y" + case 281: +#line 3586 "Gmsh.y" { if(ImbricatedTest > 0){ if (statusImbricatedTests[ImbricatedTest]){ @@ -10336,8 +10257,8 @@ yyreduce: ;} break; - case 283: -#line 3662 "Gmsh.y" + case 282: +#line 3612 "Gmsh.y" { if(ImbricatedTest > 0){ if(statusImbricatedTests[ImbricatedTest]){ @@ -10351,8 +10272,8 @@ yyreduce: ;} break; - case 284: -#line 3674 "Gmsh.y" + case 283: +#line 3624 "Gmsh.y" { ImbricatedTest--; if(ImbricatedTest < 0) @@ -10360,8 +10281,8 @@ yyreduce: ;} break; - case 285: -#line 3685 "Gmsh.y" + case 284: +#line 3635 "Gmsh.y" { std::vector<std::pair<int, int> > inDimTags, outDimTags; ListOfShapes2VectorOfPairs((yyvsp[(4) - (5)].l), inDimTags); @@ -10381,8 +10302,8 @@ yyreduce: ;} break; - case 286: -#line 3703 "Gmsh.y" + case 285: +#line 3653 "Gmsh.y" { std::vector<std::pair<int, int> > inDimTags, outDimTags; ListOfShapes2VectorOfPairs((yyvsp[(10) - (11)].l), inDimTags); @@ -10402,8 +10323,8 @@ yyreduce: ;} break; - case 287: -#line 3721 "Gmsh.y" + case 286: +#line 3671 "Gmsh.y" { std::vector<std::pair<int, int> > inDimTags, outDimTags; ListOfShapes2VectorOfPairs((yyvsp[(12) - (13)].l), inDimTags); @@ -10423,8 +10344,8 @@ yyreduce: ;} break; - case 288: -#line 3739 "Gmsh.y" + case 287: +#line 3689 "Gmsh.y" { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; @@ -10432,8 +10353,8 @@ yyreduce: ;} break; - case 289: -#line 3745 "Gmsh.y" + case 288: +#line 3695 "Gmsh.y" { std::vector<std::pair<int, int> > inDimTags, outDimTags; ListOfShapes2VectorOfPairs((yyvsp[(4) - (7)].l), inDimTags); @@ -10453,8 +10374,8 @@ yyreduce: ;} break; - case 290: -#line 3763 "Gmsh.y" + case 289: +#line 3713 "Gmsh.y" { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; @@ -10462,8 +10383,8 @@ yyreduce: ;} break; - case 291: -#line 3769 "Gmsh.y" + case 290: +#line 3719 "Gmsh.y" { std::vector<std::pair<int, int> > inDimTags, outDimTags; ListOfShapes2VectorOfPairs((yyvsp[(10) - (13)].l), inDimTags); @@ -10485,8 +10406,8 @@ yyreduce: ;} break; - case 292: -#line 3789 "Gmsh.y" + case 291: +#line 3739 "Gmsh.y" { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; @@ -10494,8 +10415,8 @@ yyreduce: ;} break; - case 293: -#line 3795 "Gmsh.y" + case 292: +#line 3745 "Gmsh.y" { std::vector<std::pair<int, int> > inDimTags, outDimTags; ListOfShapes2VectorOfPairs((yyvsp[(12) - (15)].l), inDimTags); @@ -10515,8 +10436,8 @@ yyreduce: ;} break; - case 294: -#line 3813 "Gmsh.y" + case 293: +#line 3763 "Gmsh.y" { extr.mesh.ExtrudeMesh = extr.mesh.Recombine = false; extr.mesh.QuadToTri = NO_QUADTRI; @@ -10524,8 +10445,8 @@ yyreduce: ;} break; - case 295: -#line 3819 "Gmsh.y" + case 294: +#line 3769 "Gmsh.y" { std::vector<std::pair<int, int> > inDimTags, outDimTags; ListOfShapes2VectorOfPairs((yyvsp[(3) - (6)].l), inDimTags); @@ -10544,8 +10465,8 @@ yyreduce: ;} break; - case 296: -#line 3836 "Gmsh.y" + case 295: +#line 3786 "Gmsh.y" { std::vector<std::pair<int, int> > inDimTags, outDimTags; ListOfShapes2VectorOfPairs((yyvsp[(3) - (9)].l), inDimTags); @@ -10563,8 +10484,8 @@ yyreduce: ;} break; - case 297: -#line 3852 "Gmsh.y" + case 296: +#line 3802 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); bool r = true; @@ -10583,8 +10504,8 @@ yyreduce: ;} break; - case 298: -#line 3869 "Gmsh.y" + case 297: +#line 3819 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); bool r = true; @@ -10603,8 +10524,8 @@ yyreduce: ;} break; - case 299: -#line 3886 "Gmsh.y" + case 298: +#line 3836 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); bool r = true; @@ -10626,20 +10547,20 @@ yyreduce: ;} break; - case 300: -#line 3909 "Gmsh.y" + case 299: +#line 3859 "Gmsh.y" { ;} break; - case 301: -#line 3912 "Gmsh.y" + case 300: +#line 3862 "Gmsh.y" { ;} break; - case 302: -#line 3918 "Gmsh.y" + case 301: +#line 3868 "Gmsh.y" { int n = (int)fabs((yyvsp[(3) - (5)].d)); if(n){ // we accept n==0 to easily disable layers @@ -10653,8 +10574,8 @@ yyreduce: ;} break; - case 303: -#line 3930 "Gmsh.y" + case 302: +#line 3880 "Gmsh.y" { extr.mesh.ExtrudeMesh = true; extr.mesh.NbLayer = List_Nbr((yyvsp[(3) - (7)].l)); @@ -10676,57 +10597,57 @@ yyreduce: ;} break; - case 304: -#line 3950 "Gmsh.y" + case 303: +#line 3900 "Gmsh.y" { extr.mesh.ScaleLast = true; ;} break; - case 305: -#line 3954 "Gmsh.y" + case 304: +#line 3904 "Gmsh.y" { extr.mesh.Recombine = true; ;} break; - case 306: -#line 3958 "Gmsh.y" + case 305: +#line 3908 "Gmsh.y" { extr.mesh.Recombine = (yyvsp[(2) - (3)].d) ? true : false; ;} break; - case 307: -#line 3962 "Gmsh.y" + case 306: +#line 3912 "Gmsh.y" { extr.mesh.QuadToTri = QUADTRI_ADDVERTS_1; ;} break; - case 308: -#line 3966 "Gmsh.y" + case 307: +#line 3916 "Gmsh.y" { extr.mesh.QuadToTri = QUADTRI_ADDVERTS_1_RECOMB; ;} break; - case 309: -#line 3970 "Gmsh.y" + case 308: +#line 3920 "Gmsh.y" { extr.mesh.QuadToTri = QUADTRI_NOVERTS_1; ;} break; - case 310: -#line 3974 "Gmsh.y" + case 309: +#line 3924 "Gmsh.y" { extr.mesh.QuadToTri = QUADTRI_NOVERTS_1_RECOMB; ;} break; - case 311: -#line 3978 "Gmsh.y" + case 310: +#line 3928 "Gmsh.y" { std::vector<int> tags; ListOfDouble2Vector((yyvsp[(6) - (9)].l), tags); int num = (int)(yyvsp[(3) - (9)].d); @@ -10737,8 +10658,8 @@ yyreduce: ;} break; - case 312: -#line 3987 "Gmsh.y" + case 311: +#line 3937 "Gmsh.y" { if(!strcmp((yyvsp[(2) - (6)].c), "Index")) extr.mesh.BoundaryLayerIndex = (yyvsp[(4) - (6)].d); @@ -10748,58 +10669,58 @@ yyreduce: ;} break; - case 313: -#line 3999 "Gmsh.y" + case 312: +#line 3949 "Gmsh.y" { (yyval.i) = OCC_Internals::Union; ;} break; - case 314: -#line 4000 "Gmsh.y" + case 313: +#line 3950 "Gmsh.y" { (yyval.i) = OCC_Internals::Intersection; ;} break; - case 315: -#line 4001 "Gmsh.y" + case 314: +#line 3951 "Gmsh.y" { (yyval.i) = OCC_Internals::Difference; ;} break; - case 316: -#line 4002 "Gmsh.y" + case 315: +#line 3952 "Gmsh.y" { (yyval.i) = OCC_Internals::Section; ;} break; - case 317: -#line 4003 "Gmsh.y" + case 316: +#line 3953 "Gmsh.y" { (yyval.i) = OCC_Internals::Fragments; ;} break; - case 318: -#line 4007 "Gmsh.y" + case 317: +#line 3957 "Gmsh.y" { (yyval.i) = 0; ;} break; - case 319: -#line 4008 "Gmsh.y" + case 318: +#line 3958 "Gmsh.y" { (yyval.i) = 1; ;} break; - case 320: -#line 4009 "Gmsh.y" + case 319: +#line 3959 "Gmsh.y" { (yyval.i) = 2; ;} break; - case 321: -#line 4010 "Gmsh.y" + case 320: +#line 3960 "Gmsh.y" { (yyval.i) = (yyvsp[(2) - (3)].d) ? 1 : 0; ;} break; - case 322: -#line 4011 "Gmsh.y" + case 321: +#line 3961 "Gmsh.y" { (yyval.i) = (yyvsp[(3) - (4)].d) ? 2 : 0; ;} break; - case 323: -#line 4016 "Gmsh.y" + case 322: +#line 3966 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); bool r = true; @@ -10824,8 +10745,8 @@ yyreduce: ;} break; - case 324: -#line 4039 "Gmsh.y" + case 323: +#line 3989 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(Shape)); bool r = true; @@ -10843,8 +10764,8 @@ yyreduce: ;} break; - case 325: -#line 4059 "Gmsh.y" + case 324: +#line 4009 "Gmsh.y" { bool r = true; if(gmsh_yyfactory == "OpenCASCADE" && GModel::current()->getOCCInternals()){ @@ -10864,15 +10785,15 @@ yyreduce: ;} break; - case 326: -#line 4080 "Gmsh.y" + case 325: +#line 4030 "Gmsh.y" { (yyval.v)[0] = (yyval.v)[1] = 1.; ;} break; - case 327: -#line 4084 "Gmsh.y" + case 326: +#line 4034 "Gmsh.y" { if(!strcmp((yyvsp[(2) - (3)].c), "Progression") || !strcmp((yyvsp[(2) - (3)].c), "Power")) (yyval.v)[0] = 1.; @@ -10887,15 +10808,15 @@ yyreduce: ;} break; - case 328: -#line 4099 "Gmsh.y" + case 327: +#line 4049 "Gmsh.y" { (yyval.i) = -1; // left ;} break; - case 329: -#line 4103 "Gmsh.y" + case 328: +#line 4053 "Gmsh.y" { if(!strcmp((yyvsp[(1) - (1)].c), "Right")) (yyval.i) = 1; @@ -10911,50 +10832,50 @@ yyreduce: ;} break; - case 330: -#line 4119 "Gmsh.y" + case 329: +#line 4069 "Gmsh.y" { (yyval.l) = List_Create(1, 1, sizeof(double)); ;} break; - case 331: -#line 4123 "Gmsh.y" + case 330: +#line 4073 "Gmsh.y" { (yyval.l) = (yyvsp[(2) - (2)].l); ;} break; - case 332: -#line 4128 "Gmsh.y" + case 331: +#line 4078 "Gmsh.y" { (yyval.i) = 45; ;} break; - case 333: -#line 4132 "Gmsh.y" + case 332: +#line 4082 "Gmsh.y" { (yyval.i) = (int)(yyvsp[(2) - (2)].d); ;} break; - case 334: -#line 4138 "Gmsh.y" + case 333: +#line 4088 "Gmsh.y" { (yyval.l) = List_Create(1, 1, sizeof(double)); ;} break; - case 335: -#line 4142 "Gmsh.y" + case 334: +#line 4092 "Gmsh.y" { (yyval.l) = (yyvsp[(2) - (2)].l); ;} break; - case 336: -#line 4149 "Gmsh.y" + case 335: +#line 4099 "Gmsh.y" { // mesh sizes at vertices are stored in internal CAD data, as they can be // specified during vertex creation and copied around during CAD @@ -10978,8 +10899,8 @@ yyreduce: ;} break; - case 337: -#line 4171 "Gmsh.y" + case 336: +#line 4121 "Gmsh.y" { // transfinite constraints are stored in GEO internals in addition to // GModel, as they can be copied around during GEO operations @@ -11022,8 +10943,8 @@ yyreduce: ;} break; - case 338: -#line 4212 "Gmsh.y" + case 337: +#line 4162 "Gmsh.y" { // transfinite constraints are stored in GEO internals in addition to // GModel, as they can be copied around during GEO operations @@ -11069,8 +10990,8 @@ yyreduce: ;} break; - case 339: -#line 4256 "Gmsh.y" + case 338: +#line 4206 "Gmsh.y" { // transfinite constraints are stored in GEO internals in addition to // GModel, as they can be copied around during GEO operations @@ -11111,8 +11032,8 @@ yyreduce: ;} break; - case 340: -#line 4295 "Gmsh.y" + case 339: +#line 4245 "Gmsh.y" { // transfinite constraints are stored in GEO internals in addition to // GModel, as they can be copied around during GEO operations @@ -11139,8 +11060,8 @@ yyreduce: ;} break; - case 341: -#line 4320 "Gmsh.y" + case 340: +#line 4270 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(4) - (8)].l)); i++){ double d; @@ -11151,8 +11072,8 @@ yyreduce: ;} break; - case 342: -#line 4329 "Gmsh.y" + case 341: +#line 4279 "Gmsh.y" { // recombine constraints are stored in GEO internals in addition to // GModel, as they can be copied around during GEO operations @@ -11184,8 +11105,8 @@ yyreduce: ;} break; - case 343: -#line 4359 "Gmsh.y" + case 342: +#line 4309 "Gmsh.y" { // recombine constraints are stored in GEO internals in addition to // GModel, as they can be copied around during GEO operations @@ -11213,8 +11134,8 @@ yyreduce: ;} break; - case 344: -#line 4385 "Gmsh.y" + case 343: +#line 4335 "Gmsh.y" { // smoothing constraints are stored in GEO internals in addition to // GModel, as they can be copied around during GEO operations @@ -11242,8 +11163,8 @@ yyreduce: ;} break; - case 345: -#line 4412 "Gmsh.y" + case 344: +#line 4362 "Gmsh.y" { if (List_Nbr((yyvsp[(4) - (11)].l)) != List_Nbr((yyvsp[(8) - (11)].l))){ yymsg(0, "Number of master lines (%d) different from number of " @@ -11276,8 +11197,8 @@ yyreduce: ;} break; - case 346: -#line 4444 "Gmsh.y" + case 345: +#line 4394 "Gmsh.y" { if (List_Nbr((yyvsp[(4) - (11)].l)) != List_Nbr((yyvsp[(8) - (11)].l))){ yymsg(0, "Number of master faces (%d) different from number of " @@ -11305,8 +11226,8 @@ yyreduce: ;} break; - case 347: -#line 4471 "Gmsh.y" + case 346: +#line 4421 "Gmsh.y" { if (List_Nbr((yyvsp[(4) - (18)].l)) != List_Nbr((yyvsp[(8) - (18)].l))){ yymsg(0, "Number of master edges (%d) different from number of " @@ -11333,8 +11254,8 @@ yyreduce: ;} break; - case 348: -#line 4497 "Gmsh.y" + case 347: +#line 4447 "Gmsh.y" { if (List_Nbr((yyvsp[(4) - (18)].l)) != List_Nbr((yyvsp[(8) - (18)].l))){ yymsg(0, "Number of master faces (%d) different from number of " @@ -11361,8 +11282,8 @@ yyreduce: ;} break; - case 349: -#line 4523 "Gmsh.y" + case 348: +#line 4473 "Gmsh.y" { if (List_Nbr((yyvsp[(4) - (12)].l)) != List_Nbr((yyvsp[(8) - (12)].l))){ yymsg(0, "Number of master edges (%d) different from number of " @@ -11389,8 +11310,8 @@ yyreduce: ;} break; - case 350: -#line 4549 "Gmsh.y" + case 349: +#line 4499 "Gmsh.y" { if (List_Nbr((yyvsp[(4) - (12)].l)) != List_Nbr((yyvsp[(8) - (12)].l))){ yymsg(0, "Number of master faces (%d) different from number of " @@ -11417,8 +11338,8 @@ yyreduce: ;} break; - case 351: -#line 4575 "Gmsh.y" + case 350: +#line 4525 "Gmsh.y" { if (List_Nbr((yyvsp[(5) - (12)].l)) != List_Nbr((yyvsp[(10) - (12)].l))){ yymsg(0, "Number of master surface edges (%d) different from number of " @@ -11441,8 +11362,8 @@ yyreduce: ;} break; - case 352: -#line 4596 "Gmsh.y" + case 351: +#line 4546 "Gmsh.y" { if (((yyvsp[(6) - (10)].i)==2 || (yyvsp[(6) - (10)].i)==3) && (yyvsp[(1) - (10)].i)<(yyvsp[(6) - (10)].i) ) { std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (10)].l), tags); @@ -11455,8 +11376,8 @@ yyreduce: ;} break; - case 353: -#line 4607 "Gmsh.y" + case 352: +#line 4557 "Gmsh.y" { // reverse mesh constraints are stored in GEO internals in addition to // GModel, as they can be copied around during GEO operations @@ -11506,8 +11427,8 @@ yyreduce: ;} break; - case 354: -#line 4655 "Gmsh.y" + case 353: +#line 4605 "Gmsh.y" { if(!(yyvsp[(3) - (4)].l)){ switch ((yyvsp[(2) - (4)].i)) { @@ -11558,8 +11479,8 @@ yyreduce: ;} break; - case 355: -#line 4704 "Gmsh.y" + case 354: +#line 4654 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){ double dnum; @@ -11573,8 +11494,8 @@ yyreduce: ;} break; - case 356: -#line 4716 "Gmsh.y" + case 355: +#line 4666 "Gmsh.y" { std::vector<int> tags; ListOfDouble2Vector((yyvsp[(3) - (4)].l), tags); GModel::current()->getGEOInternals()->setCompoundMesh((yyvsp[(2) - (4)].i), tags); @@ -11582,8 +11503,8 @@ yyreduce: ;} break; - case 357: -#line 4727 "Gmsh.y" + case 356: +#line 4677 "Gmsh.y" { if(gmsh_yyfactory == "OpenCASCADE" && GModel::current()->getOCCInternals()) GModel::current()->getOCCInternals()->removeAllDuplicates(); @@ -11592,8 +11513,8 @@ yyreduce: ;} break; - case 358: -#line 4734 "Gmsh.y" + case 357: +#line 4684 "Gmsh.y" { if(!strcmp((yyvsp[(2) - (3)].c), "Geometry")){ if(gmsh_yyfactory == "OpenCASCADE" && GModel::current()->getOCCInternals()) @@ -11610,8 +11531,8 @@ yyreduce: ;} break; - case 359: -#line 4749 "Gmsh.y" + case 358: +#line 4699 "Gmsh.y" { std::vector<int> tags; ListOfDouble2Vector((yyvsp[(4) - (6)].l), tags); if(gmsh_yyfactory == "OpenCASCADE" && GModel::current()->getOCCInternals()) @@ -11622,23 +11543,23 @@ yyreduce: ;} break; - case 360: -#line 4762 "Gmsh.y" + case 359: +#line 4712 "Gmsh.y" { (yyval.c) = (char*)"Homology"; ;} break; - case 361: -#line 4763 "Gmsh.y" + case 360: +#line 4713 "Gmsh.y" { (yyval.c) = (char*)"Cohomology"; ;} break; - case 362: -#line 4764 "Gmsh.y" + case 361: +#line 4714 "Gmsh.y" { (yyval.c) = (char*)"Betti"; ;} break; - case 363: -#line 4769 "Gmsh.y" + case 362: +#line 4719 "Gmsh.y" { std::vector<int> domain, subdomain, dim; for(int i = 0; i < 4; i++) dim.push_back(i); @@ -11646,8 +11567,8 @@ yyreduce: ;} break; - case 364: -#line 4775 "Gmsh.y" + case 363: +#line 4725 "Gmsh.y" { std::vector<int> domain, subdomain, dim; for(int i = 0; i < List_Nbr((yyvsp[(3) - (5)].l)); i++){ @@ -11661,8 +11582,8 @@ yyreduce: ;} break; - case 365: -#line 4787 "Gmsh.y" + case 364: +#line 4737 "Gmsh.y" { std::vector<int> domain, subdomain, dim; for(int i = 0; i < List_Nbr((yyvsp[(3) - (7)].l)); i++){ @@ -11682,8 +11603,8 @@ yyreduce: ;} break; - case 366: -#line 4805 "Gmsh.y" + case 365: +#line 4755 "Gmsh.y" { std::vector<int> domain, subdomain, dim; for(int i = 0; i < List_Nbr((yyvsp[(6) - (10)].l)); i++){ @@ -11708,48 +11629,48 @@ yyreduce: ;} break; - case 367: -#line 4832 "Gmsh.y" + case 366: +#line 4782 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (1)].d); ;} break; - case 368: -#line 4833 "Gmsh.y" + case 367: +#line 4783 "Gmsh.y" { (yyval.d) = (yyvsp[(2) - (3)].d); ;} break; - case 369: -#line 4834 "Gmsh.y" + case 368: +#line 4784 "Gmsh.y" { (yyval.d) = -(yyvsp[(2) - (2)].d); ;} break; - case 370: -#line 4835 "Gmsh.y" + case 369: +#line 4785 "Gmsh.y" { (yyval.d) = (yyvsp[(2) - (2)].d); ;} break; - case 371: -#line 4836 "Gmsh.y" + case 370: +#line 4786 "Gmsh.y" { (yyval.d) = !(yyvsp[(2) - (2)].d); ;} break; - case 372: -#line 4837 "Gmsh.y" + case 371: +#line 4787 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (3)].d) - (yyvsp[(3) - (3)].d); ;} break; - case 373: -#line 4838 "Gmsh.y" + case 372: +#line 4788 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (3)].d) + (yyvsp[(3) - (3)].d); ;} break; - case 374: -#line 4839 "Gmsh.y" + case 373: +#line 4789 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (3)].d) * (yyvsp[(3) - (3)].d); ;} break; - case 375: -#line 4841 "Gmsh.y" + case 374: +#line 4791 "Gmsh.y" { if(!(yyvsp[(3) - (3)].d)) yymsg(0, "Division by zero in '%g / %g'", (yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d)); @@ -11758,258 +11679,258 @@ yyreduce: ;} break; - case 376: -#line 4847 "Gmsh.y" + case 375: +#line 4797 "Gmsh.y" { (yyval.d) = (int)(yyvsp[(1) - (3)].d) | (int)(yyvsp[(3) - (3)].d); ;} break; - case 377: -#line 4848 "Gmsh.y" + case 376: +#line 4798 "Gmsh.y" { (yyval.d) = (int)(yyvsp[(1) - (3)].d) & (int)(yyvsp[(3) - (3)].d); ;} break; - case 378: -#line 4849 "Gmsh.y" + case 377: +#line 4799 "Gmsh.y" { (yyval.d) = (int)(yyvsp[(1) - (3)].d) % (int)(yyvsp[(3) - (3)].d); ;} break; - case 379: -#line 4850 "Gmsh.y" + case 378: +#line 4800 "Gmsh.y" { (yyval.d) = pow((yyvsp[(1) - (3)].d), (yyvsp[(3) - (3)].d)); ;} break; + case 379: +#line 4801 "Gmsh.y" + { (yyval.d) = (yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d); ;} + break; + case 380: -#line 4851 "Gmsh.y" - { (yyval.d) = (yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d); ;} +#line 4802 "Gmsh.y" + { (yyval.d) = (yyvsp[(1) - (3)].d) > (yyvsp[(3) - (3)].d); ;} break; case 381: -#line 4852 "Gmsh.y" - { (yyval.d) = (yyvsp[(1) - (3)].d) > (yyvsp[(3) - (3)].d); ;} +#line 4803 "Gmsh.y" + { (yyval.d) = (yyvsp[(1) - (3)].d) <= (yyvsp[(3) - (3)].d); ;} break; case 382: -#line 4853 "Gmsh.y" - { (yyval.d) = (yyvsp[(1) - (3)].d) <= (yyvsp[(3) - (3)].d); ;} +#line 4804 "Gmsh.y" + { (yyval.d) = (yyvsp[(1) - (3)].d) >= (yyvsp[(3) - (3)].d); ;} break; case 383: -#line 4854 "Gmsh.y" - { (yyval.d) = (yyvsp[(1) - (3)].d) >= (yyvsp[(3) - (3)].d); ;} +#line 4805 "Gmsh.y" + { (yyval.d) = (yyvsp[(1) - (3)].d) == (yyvsp[(3) - (3)].d); ;} break; case 384: -#line 4855 "Gmsh.y" - { (yyval.d) = (yyvsp[(1) - (3)].d) == (yyvsp[(3) - (3)].d); ;} +#line 4806 "Gmsh.y" + { (yyval.d) = (yyvsp[(1) - (3)].d) != (yyvsp[(3) - (3)].d); ;} break; case 385: -#line 4856 "Gmsh.y" - { (yyval.d) = (yyvsp[(1) - (3)].d) != (yyvsp[(3) - (3)].d); ;} +#line 4807 "Gmsh.y" + { (yyval.d) = (yyvsp[(1) - (3)].d) && (yyvsp[(3) - (3)].d); ;} break; case 386: -#line 4857 "Gmsh.y" - { (yyval.d) = (yyvsp[(1) - (3)].d) && (yyvsp[(3) - (3)].d); ;} +#line 4808 "Gmsh.y" + { (yyval.d) = (yyvsp[(1) - (3)].d) || (yyvsp[(3) - (3)].d); ;} break; case 387: -#line 4858 "Gmsh.y" - { (yyval.d) = (yyvsp[(1) - (3)].d) || (yyvsp[(3) - (3)].d); ;} +#line 4809 "Gmsh.y" + { (yyval.d) = ((int)(yyvsp[(1) - (3)].d) >> (int)(yyvsp[(3) - (3)].d)); ;} break; case 388: -#line 4859 "Gmsh.y" - { (yyval.d) = ((int)(yyvsp[(1) - (3)].d) >> (int)(yyvsp[(3) - (3)].d)); ;} +#line 4810 "Gmsh.y" + { (yyval.d) = ((int)(yyvsp[(1) - (3)].d) << (int)(yyvsp[(3) - (3)].d)); ;} break; case 389: -#line 4860 "Gmsh.y" - { (yyval.d) = ((int)(yyvsp[(1) - (3)].d) << (int)(yyvsp[(3) - (3)].d)); ;} +#line 4811 "Gmsh.y" + { (yyval.d) = (yyvsp[(1) - (5)].d) ? (yyvsp[(3) - (5)].d) : (yyvsp[(5) - (5)].d); ;} break; case 390: -#line 4861 "Gmsh.y" - { (yyval.d) = (yyvsp[(1) - (5)].d) ? (yyvsp[(3) - (5)].d) : (yyvsp[(5) - (5)].d); ;} +#line 4812 "Gmsh.y" + { (yyval.d) = exp((yyvsp[(3) - (4)].d)); ;} break; case 391: -#line 4862 "Gmsh.y" - { (yyval.d) = exp((yyvsp[(3) - (4)].d)); ;} +#line 4813 "Gmsh.y" + { (yyval.d) = log((yyvsp[(3) - (4)].d)); ;} break; case 392: -#line 4863 "Gmsh.y" - { (yyval.d) = log((yyvsp[(3) - (4)].d)); ;} +#line 4814 "Gmsh.y" + { (yyval.d) = log10((yyvsp[(3) - (4)].d)); ;} break; case 393: -#line 4864 "Gmsh.y" - { (yyval.d) = log10((yyvsp[(3) - (4)].d)); ;} +#line 4815 "Gmsh.y" + { (yyval.d) = sqrt((yyvsp[(3) - (4)].d)); ;} break; case 394: -#line 4865 "Gmsh.y" - { (yyval.d) = sqrt((yyvsp[(3) - (4)].d)); ;} +#line 4816 "Gmsh.y" + { (yyval.d) = sin((yyvsp[(3) - (4)].d)); ;} break; case 395: -#line 4866 "Gmsh.y" - { (yyval.d) = sin((yyvsp[(3) - (4)].d)); ;} +#line 4817 "Gmsh.y" + { (yyval.d) = asin((yyvsp[(3) - (4)].d)); ;} break; case 396: -#line 4867 "Gmsh.y" - { (yyval.d) = asin((yyvsp[(3) - (4)].d)); ;} +#line 4818 "Gmsh.y" + { (yyval.d) = cos((yyvsp[(3) - (4)].d)); ;} break; case 397: -#line 4868 "Gmsh.y" - { (yyval.d) = cos((yyvsp[(3) - (4)].d)); ;} +#line 4819 "Gmsh.y" + { (yyval.d) = acos((yyvsp[(3) - (4)].d)); ;} break; case 398: -#line 4869 "Gmsh.y" - { (yyval.d) = acos((yyvsp[(3) - (4)].d)); ;} +#line 4820 "Gmsh.y" + { (yyval.d) = tan((yyvsp[(3) - (4)].d)); ;} break; case 399: -#line 4870 "Gmsh.y" - { (yyval.d) = tan((yyvsp[(3) - (4)].d)); ;} +#line 4821 "Gmsh.y" + { (yyval.d) = atan((yyvsp[(3) - (4)].d)); ;} break; case 400: -#line 4871 "Gmsh.y" - { (yyval.d) = atan((yyvsp[(3) - (4)].d)); ;} +#line 4822 "Gmsh.y" + { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;} break; case 401: -#line 4872 "Gmsh.y" - { (yyval.d) = atan2((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d));;} +#line 4823 "Gmsh.y" + { (yyval.d) = sinh((yyvsp[(3) - (4)].d)); ;} break; case 402: -#line 4873 "Gmsh.y" - { (yyval.d) = sinh((yyvsp[(3) - (4)].d)); ;} +#line 4824 "Gmsh.y" + { (yyval.d) = cosh((yyvsp[(3) - (4)].d)); ;} break; case 403: -#line 4874 "Gmsh.y" - { (yyval.d) = cosh((yyvsp[(3) - (4)].d)); ;} +#line 4825 "Gmsh.y" + { (yyval.d) = tanh((yyvsp[(3) - (4)].d)); ;} break; case 404: -#line 4875 "Gmsh.y" - { (yyval.d) = tanh((yyvsp[(3) - (4)].d)); ;} +#line 4826 "Gmsh.y" + { (yyval.d) = fabs((yyvsp[(3) - (4)].d)); ;} break; case 405: -#line 4876 "Gmsh.y" - { (yyval.d) = fabs((yyvsp[(3) - (4)].d)); ;} +#line 4827 "Gmsh.y" + { (yyval.d) = std::abs((yyvsp[(3) - (4)].d)); ;} break; case 406: -#line 4877 "Gmsh.y" - { (yyval.d) = std::abs((yyvsp[(3) - (4)].d)); ;} +#line 4828 "Gmsh.y" + { (yyval.d) = floor((yyvsp[(3) - (4)].d)); ;} break; case 407: -#line 4878 "Gmsh.y" - { (yyval.d) = floor((yyvsp[(3) - (4)].d)); ;} +#line 4829 "Gmsh.y" + { (yyval.d) = ceil((yyvsp[(3) - (4)].d)); ;} break; case 408: -#line 4879 "Gmsh.y" - { (yyval.d) = ceil((yyvsp[(3) - (4)].d)); ;} +#line 4830 "Gmsh.y" + { (yyval.d) = floor((yyvsp[(3) - (4)].d) + 0.5); ;} break; case 409: -#line 4880 "Gmsh.y" - { (yyval.d) = floor((yyvsp[(3) - (4)].d) + 0.5); ;} +#line 4831 "Gmsh.y" + { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;} break; case 410: -#line 4881 "Gmsh.y" +#line 4832 "Gmsh.y" { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;} break; case 411: -#line 4882 "Gmsh.y" - { (yyval.d) = fmod((yyvsp[(3) - (6)].d), (yyvsp[(5) - (6)].d)); ;} - break; - - case 412: -#line 4883 "Gmsh.y" +#line 4833 "Gmsh.y" { (yyval.d) = sqrt((yyvsp[(3) - (6)].d) * (yyvsp[(3) - (6)].d) + (yyvsp[(5) - (6)].d) * (yyvsp[(5) - (6)].d)); ;} break; - case 413: -#line 4884 "Gmsh.y" + case 412: +#line 4834 "Gmsh.y" { (yyval.d) = (yyvsp[(3) - (4)].d) * (double)rand() / (double)RAND_MAX; ;} break; - case 414: -#line 4893 "Gmsh.y" + case 413: +#line 4843 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (1)].d); ;} break; - case 415: -#line 4894 "Gmsh.y" + case 414: +#line 4844 "Gmsh.y" { (yyval.d) = 3.141592653589793; ;} break; - case 416: -#line 4895 "Gmsh.y" + case 415: +#line 4845 "Gmsh.y" { (yyval.d) = (double)ImbricatedTest; ;} break; - case 417: -#line 4896 "Gmsh.y" + case 416: +#line 4846 "Gmsh.y" { (yyval.d) = Msg::GetCommRank(); ;} break; - case 418: -#line 4897 "Gmsh.y" + case 417: +#line 4847 "Gmsh.y" { (yyval.d) = Msg::GetCommSize(); ;} break; - case 419: -#line 4898 "Gmsh.y" + case 418: +#line 4848 "Gmsh.y" { (yyval.d) = GetGmshMajorVersion(); ;} break; - case 420: -#line 4899 "Gmsh.y" + case 419: +#line 4849 "Gmsh.y" { (yyval.d) = GetGmshMinorVersion(); ;} break; - case 421: -#line 4900 "Gmsh.y" + case 420: +#line 4850 "Gmsh.y" { (yyval.d) = GetGmshPatchVersion(); ;} break; - case 422: -#line 4901 "Gmsh.y" + case 421: +#line 4851 "Gmsh.y" { (yyval.d) = Cpu(); ;} break; - case 423: -#line 4902 "Gmsh.y" + case 422: +#line 4852 "Gmsh.y" { (yyval.d) = GetMemoryUsage()/1024./1024.; ;} break; - case 424: -#line 4903 "Gmsh.y" + case 423: +#line 4853 "Gmsh.y" { (yyval.d) = TotalRam(); ;} break; - case 425: -#line 4908 "Gmsh.y" + case 424: +#line 4858 "Gmsh.y" { init_options(); ;} break; - case 426: -#line 4910 "Gmsh.y" + case 425: +#line 4860 "Gmsh.y" { std::vector<double> val(1, (yyvsp[(3) - (6)].d)); Msg::ExchangeOnelabParameter("", val, floatOptions, charOptions); @@ -12017,92 +11938,92 @@ yyreduce: ;} break; - case 427: -#line 4916 "Gmsh.y" + case 426: +#line 4866 "Gmsh.y" { (yyval.d) = (yyvsp[(1) - (1)].d); ;} break; - case 428: -#line 4918 "Gmsh.y" + case 427: +#line 4868 "Gmsh.y" { (yyval.d) = Msg::GetOnelabNumber((yyvsp[(3) - (4)].c)); Free((yyvsp[(3) - (4)].c)); ;} break; - case 429: -#line 4923 "Gmsh.y" + case 428: +#line 4873 "Gmsh.y" { (yyval.d) = Msg::GetOnelabNumber((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].d)); Free((yyvsp[(3) - (6)].c)); ;} break; - case 430: -#line 4928 "Gmsh.y" + case 429: +#line 4878 "Gmsh.y" { (yyval.d) = treat_Struct_FullName_Float((yyvsp[(1) - (1)].c2).char1, (yyvsp[(1) - (1)].c2).char2); ;} break; - case 431: -#line 4933 "Gmsh.y" + case 430: +#line 4883 "Gmsh.y" { (yyval.d) = treat_Struct_FullName_Float(NULL, (yyvsp[(1) - (4)].c), 2, (int)(yyvsp[(3) - (4)].d)); ;} break; - case 432: -#line 4938 "Gmsh.y" + case 431: +#line 4888 "Gmsh.y" { (yyval.d) = treat_Struct_FullName_Float(NULL, (yyvsp[(1) - (4)].c), 2, (int)(yyvsp[(3) - (4)].d)); ;} break; - case 433: -#line 4942 "Gmsh.y" + case 432: +#line 4892 "Gmsh.y" { (yyval.d) = treat_Struct_FullName_Float((yyvsp[(3) - (4)].c2).char1, (yyvsp[(3) - (4)].c2).char2, 1, 0, 0., 1); ;} break; - case 434: -#line 4946 "Gmsh.y" + case 433: +#line 4896 "Gmsh.y" { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[(3) - (6)].c2).char1, (yyvsp[(3) - (6)].c2).char2, (yyvsp[(5) - (6)].c), 0, 0., 1); ;} break; - case 435: -#line 4950 "Gmsh.y" + case 434: +#line 4900 "Gmsh.y" { (yyval.d) = treat_Struct_FullName_Float((yyvsp[(3) - (5)].c2).char1, (yyvsp[(3) - (5)].c2).char2, 1, 0, (yyvsp[(4) - (5)].d), 2); ;} break; - case 436: -#line 4954 "Gmsh.y" + case 435: +#line 4904 "Gmsh.y" { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[(3) - (7)].c2).char1, (yyvsp[(3) - (7)].c2).char2, (yyvsp[(5) - (7)].c), 0, (yyvsp[(6) - (7)].d), 2); ;} break; - case 437: -#line 4958 "Gmsh.y" + case 436: +#line 4908 "Gmsh.y" { (yyval.d) = treat_Struct_FullName_Float((yyvsp[(3) - (8)].c2).char1, (yyvsp[(3) - (8)].c2).char2, 2, (int)(yyvsp[(5) - (8)].d), (yyvsp[(7) - (8)].d), 2); ;} break; - case 438: -#line 4962 "Gmsh.y" + case 437: +#line 4912 "Gmsh.y" { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[(3) - (10)].c2).char1, (yyvsp[(3) - (10)].c2).char2, (yyvsp[(5) - (10)].c), (int)(yyvsp[(7) - (10)].d), (yyvsp[(9) - (10)].d), 2); ;} break; - case 439: -#line 4966 "Gmsh.y" + case 438: +#line 4916 "Gmsh.y" { std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(3) - (4)].c)); (yyval.d) = !StatFile(tmp); @@ -12110,8 +12031,8 @@ yyreduce: ;} break; - case 440: -#line 4972 "Gmsh.y" + case 439: +#line 4922 "Gmsh.y" { if(gmsh_yysymbols.count((yyvsp[(2) - (4)].c))){ gmsh_yysymbol &s(gmsh_yysymbols[(yyvsp[(2) - (4)].c)]); @@ -12128,15 +12049,15 @@ yyreduce: ;} break; - case 441: -#line 4988 "Gmsh.y" + case 440: +#line 4938 "Gmsh.y" { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float_getDim((yyvsp[(2) - (6)].c2).char1, (yyvsp[(2) - (6)].c2).char2, (yyvsp[(4) - (6)].c)); ;} break; - case 442: -#line 4993 "Gmsh.y" + case 441: +#line 4943 "Gmsh.y" { std::string struct_namespace((yyvsp[(3) - (4)].c)); (yyval.d) = (double)gmsh_yynamespaces[struct_namespace].size(); @@ -12144,16 +12065,16 @@ yyreduce: ;} break; - case 443: -#line 4999 "Gmsh.y" + case 442: +#line 4949 "Gmsh.y" { std::string struct_namespace(std::string("")); (yyval.d) = (double)gmsh_yynamespaces[struct_namespace].size(); ;} break; - case 444: -#line 5005 "Gmsh.y" + case 443: +#line 4955 "Gmsh.y" { if(!gmsh_yysymbols.count((yyvsp[(1) - (2)].c))){ yymsg(0, "Unknown variable '%s'", (yyvsp[(1) - (2)].c)); @@ -12174,8 +12095,8 @@ yyreduce: ;} break; - case 445: -#line 5024 "Gmsh.y" + case 444: +#line 4974 "Gmsh.y" { int index = (int)(yyvsp[(3) - (5)].d); if(!gmsh_yysymbols.count((yyvsp[(1) - (5)].c))){ @@ -12197,8 +12118,8 @@ yyreduce: ;} break; - case 446: -#line 5045 "Gmsh.y" + case 445: +#line 4995 "Gmsh.y" { int index = (int)(yyvsp[(3) - (5)].d); if(!gmsh_yysymbols.count((yyvsp[(1) - (5)].c))){ @@ -12220,58 +12141,58 @@ yyreduce: ;} break; - case 447: -#line 5078 "Gmsh.y" + case 446: +#line 5028 "Gmsh.y" { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float(NULL, (yyvsp[(1) - (3)].c), (yyvsp[(3) - (3)].c)); ;} break; - case 448: -#line 5082 "Gmsh.y" + case 447: +#line 5032 "Gmsh.y" { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[(1) - (5)].c), (yyvsp[(3) - (5)].c), (yyvsp[(5) - (5)].c)); ;} break; - case 449: -#line 5087 "Gmsh.y" + case 448: +#line 5037 "Gmsh.y" { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float(NULL, (yyvsp[(1) - (6)].c), (yyvsp[(3) - (6)].c), (int)(yyvsp[(5) - (6)].d)); ;} break; - case 450: -#line 5091 "Gmsh.y" + case 449: +#line 5041 "Gmsh.y" { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[(1) - (8)].c), (yyvsp[(3) - (8)].c), (yyvsp[(5) - (8)].c), (int)(yyvsp[(7) - (8)].d)); ;} break; - case 451: -#line 5095 "Gmsh.y" + case 450: +#line 5045 "Gmsh.y" { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float(NULL, (yyvsp[(1) - (6)].c), (yyvsp[(3) - (6)].c), (int)(yyvsp[(5) - (6)].d)); ;} break; - case 452: -#line 5099 "Gmsh.y" + case 451: +#line 5049 "Gmsh.y" { (yyval.d) = treat_Struct_FullName_dot_tSTRING_Float((yyvsp[(1) - (8)].c), (yyvsp[(3) - (8)].c), (yyvsp[(5) - (8)].c), (int)(yyvsp[(7) - (8)].d)); ;} break; - case 453: -#line 5104 "Gmsh.y" + case 452: +#line 5054 "Gmsh.y" { NumberOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), (yyval.d)); Free((yyvsp[(1) - (6)].c)); Free((yyvsp[(6) - (6)].c)); ;} break; - case 454: -#line 5109 "Gmsh.y" + case 453: +#line 5059 "Gmsh.y" { double d = 0.; if(NumberOption(GMSH_GET, (yyvsp[(1) - (4)].c), 0, (yyvsp[(3) - (4)].c), d)){ @@ -12283,8 +12204,8 @@ yyreduce: ;} break; - case 455: -#line 5119 "Gmsh.y" + case 454: +#line 5069 "Gmsh.y" { double d = 0.; if(NumberOption(GMSH_GET, (yyvsp[(1) - (7)].c), (int)(yyvsp[(3) - (7)].d), (yyvsp[(6) - (7)].c), d)){ @@ -12296,16 +12217,16 @@ yyreduce: ;} break; - case 456: -#line 5129 "Gmsh.y" + case 455: +#line 5079 "Gmsh.y" { (yyval.d) = Msg::GetValue((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].d)); Free((yyvsp[(3) - (6)].c)); ;} break; - case 457: -#line 5134 "Gmsh.y" + case 456: +#line 5084 "Gmsh.y" { int matches = 0; for(int i = 0; i < List_Nbr((yyvsp[(3) - (6)].l)); i++){ @@ -12318,8 +12239,8 @@ yyreduce: ;} break; - case 458: -#line 5145 "Gmsh.y" + case 457: +#line 5095 "Gmsh.y" { std::string s((yyvsp[(3) - (6)].c)), substr((yyvsp[(5) - (6)].c)); if(s.find(substr) != std::string::npos) @@ -12330,24 +12251,24 @@ yyreduce: ;} break; - case 459: -#line 5154 "Gmsh.y" + case 458: +#line 5104 "Gmsh.y" { (yyval.d) = strlen((yyvsp[(3) - (4)].c)); Free((yyvsp[(3) - (4)].c)); ;} break; - case 460: -#line 5159 "Gmsh.y" + case 459: +#line 5109 "Gmsh.y" { (yyval.d) = strcmp((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c)); Free((yyvsp[(3) - (6)].c)); Free((yyvsp[(5) - (6)].c)); ;} break; - case 461: -#line 5164 "Gmsh.y" + case 460: +#line 5114 "Gmsh.y" { int align = 0, font = 0, fontsize = CTX::instance()->glFontSize; if(List_Nbr((yyvsp[(3) - (4)].l)) % 2){ @@ -12373,28 +12294,28 @@ yyreduce: ;} break; - case 462: -#line 5191 "Gmsh.y" + case 461: +#line 5141 "Gmsh.y" { (yyval.d) = 0.; ;} break; - case 463: -#line 5193 "Gmsh.y" + case 462: +#line 5143 "Gmsh.y" { (yyval.d) = (yyvsp[(2) - (2)].d);;} break; - case 464: -#line 5198 "Gmsh.y" + case 463: +#line 5148 "Gmsh.y" { (yyval.c) = NULL; ;} break; - case 465: -#line 5200 "Gmsh.y" + case 464: +#line 5150 "Gmsh.y" { (yyval.c) = (yyvsp[(2) - (2)].c);;} break; - case 466: -#line 5205 "Gmsh.y" + case 465: +#line 5155 "Gmsh.y" { std::string struct_namespace((yyvsp[(2) - (3)].c2).char1? (yyvsp[(2) - (3)].c2).char1 : std::string("")), struct_name((yyvsp[(2) - (3)].c2).char2); @@ -12403,8 +12324,8 @@ yyreduce: ;} break; - case 467: -#line 5212 "Gmsh.y" + case 466: +#line 5162 "Gmsh.y" { std::string struct_namespace((yyvsp[(2) - (7)].c2).char1? (yyvsp[(2) - (7)].c2).char1 : std::string("")), struct_name((yyvsp[(2) - (7)].c2).char2); @@ -12419,151 +12340,151 @@ yyreduce: ;} break; - case 468: -#line 5228 "Gmsh.y" + case 467: +#line 5178 "Gmsh.y" { (yyval.c2).char1 = NULL; (yyval.c2).char2 = (yyvsp[(1) - (1)].c); ;} break; - case 469: -#line 5230 "Gmsh.y" + case 468: +#line 5180 "Gmsh.y" { (yyval.c2).char1 = (yyvsp[(1) - (3)].c); (yyval.c2).char2 = (yyvsp[(3) - (3)].c); ;} break; - case 470: -#line 5235 "Gmsh.y" + case 469: +#line 5185 "Gmsh.y" { (yyval.c) = (yyvsp[(1) - (1)].c); flag_tSTRING_alloc = 1; ;} break; - case 471: -#line 5244 "Gmsh.y" + case 470: +#line 5194 "Gmsh.y" { (yyval.i) = 99; ;} break; - case 472: -#line 5246 "Gmsh.y" + case 471: +#line 5196 "Gmsh.y" { (yyval.i) = (int)(yyvsp[(2) - (2)].d); ;} break; - case 473: -#line 5251 "Gmsh.y" + case 472: +#line 5201 "Gmsh.y" { (yyval.i) = 0; ;} break; - case 474: -#line 5253 "Gmsh.y" + case 473: +#line 5203 "Gmsh.y" { (yyval.i) = (yyvsp[(2) - (3)].i); ;} break; - case 475: -#line 5258 "Gmsh.y" + case 474: +#line 5208 "Gmsh.y" { memcpy((yyval.v), (yyvsp[(1) - (1)].v), 5*sizeof(double)); ;} break; - case 476: -#line 5262 "Gmsh.y" + case 475: +#line 5212 "Gmsh.y" { for(int i = 0; i < 5; i++) (yyval.v)[i] = -(yyvsp[(2) - (2)].v)[i]; ;} break; - case 477: -#line 5266 "Gmsh.y" + case 476: +#line 5216 "Gmsh.y" { for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(2) - (2)].v)[i]; ;} break; - case 478: -#line 5270 "Gmsh.y" + case 477: +#line 5220 "Gmsh.y" { for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] - (yyvsp[(3) - (3)].v)[i]; ;} break; - case 479: -#line 5274 "Gmsh.y" + case 478: +#line 5224 "Gmsh.y" { for(int i = 0; i < 5; i++) (yyval.v)[i] = (yyvsp[(1) - (3)].v)[i] + (yyvsp[(3) - (3)].v)[i]; ;} break; - case 480: -#line 5281 "Gmsh.y" + case 479: +#line 5231 "Gmsh.y" { (yyval.v)[0] = (yyvsp[(2) - (11)].d); (yyval.v)[1] = (yyvsp[(4) - (11)].d); (yyval.v)[2] = (yyvsp[(6) - (11)].d); (yyval.v)[3] = (yyvsp[(8) - (11)].d); (yyval.v)[4] = (yyvsp[(10) - (11)].d); ;} break; - case 481: -#line 5285 "Gmsh.y" + case 480: +#line 5235 "Gmsh.y" { (yyval.v)[0] = (yyvsp[(2) - (9)].d); (yyval.v)[1] = (yyvsp[(4) - (9)].d); (yyval.v)[2] = (yyvsp[(6) - (9)].d); (yyval.v)[3] = (yyvsp[(8) - (9)].d); (yyval.v)[4] = 1.0; ;} break; - case 482: -#line 5289 "Gmsh.y" + case 481: +#line 5239 "Gmsh.y" { (yyval.v)[0] = (yyvsp[(2) - (7)].d); (yyval.v)[1] = (yyvsp[(4) - (7)].d); (yyval.v)[2] = (yyvsp[(6) - (7)].d); (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0; ;} break; - case 483: -#line 5293 "Gmsh.y" + case 482: +#line 5243 "Gmsh.y" { (yyval.v)[0] = (yyvsp[(2) - (7)].d); (yyval.v)[1] = (yyvsp[(4) - (7)].d); (yyval.v)[2] = (yyvsp[(6) - (7)].d); (yyval.v)[3] = 0.0; (yyval.v)[4] = 1.0; ;} break; - case 484: -#line 5300 "Gmsh.y" + case 483: +#line 5250 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(List_T*)); List_Add((yyval.l), &((yyvsp[(1) - (1)].l))); ;} break; - case 485: -#line 5305 "Gmsh.y" + case 484: +#line 5255 "Gmsh.y" { List_Add((yyval.l), &((yyvsp[(3) - (3)].l))); ;} break; - case 486: -#line 5312 "Gmsh.y" + case 485: +#line 5262 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(double)); List_Add((yyval.l), &((yyvsp[(1) - (1)].d))); ;} break; - case 487: -#line 5317 "Gmsh.y" + case 486: +#line 5267 "Gmsh.y" { (yyval.l) = (yyvsp[(1) - (1)].l); ;} break; - case 488: -#line 5321 "Gmsh.y" + case 487: +#line 5271 "Gmsh.y" { // creates an empty list (yyval.l) = List_Create(2, 1, sizeof(double)); ;} break; - case 489: -#line 5326 "Gmsh.y" + case 488: +#line 5276 "Gmsh.y" { (yyval.l) = (yyvsp[(2) - (3)].l); ;} break; - case 490: -#line 5330 "Gmsh.y" + case 489: +#line 5280 "Gmsh.y" { (yyval.l) = (yyvsp[(3) - (4)].l); for(int i = 0; i < List_Nbr((yyval.l)); i++){ @@ -12573,8 +12494,8 @@ yyreduce: ;} break; - case 491: -#line 5338 "Gmsh.y" + case 490: +#line 5288 "Gmsh.y" { (yyval.l) = (yyvsp[(4) - (5)].l); for(int i = 0; i < List_Nbr((yyval.l)); i++){ @@ -12584,22 +12505,22 @@ yyreduce: ;} break; - case 492: -#line 5349 "Gmsh.y" + case 491: +#line 5299 "Gmsh.y" { (yyval.l) = (yyvsp[(1) - (1)].l); ;} break; - case 493: -#line 5353 "Gmsh.y" + case 492: +#line 5303 "Gmsh.y" { (yyval.l) = 0; ;} break; - case 494: -#line 5357 "Gmsh.y" + case 493: +#line 5307 "Gmsh.y" { if(!strcmp((yyvsp[(1) - (1)].c), "*") || !strcmp((yyvsp[(1) - (1)].c), "all")){ (yyval.l) = 0; @@ -12612,8 +12533,8 @@ yyreduce: ;} break; - case 495: -#line 5371 "Gmsh.y" + case 494: +#line 5321 "Gmsh.y" { (yyval.l) = (yyvsp[(2) - (2)].l); for(int i = 0; i < List_Nbr((yyval.l)); i++){ @@ -12623,8 +12544,8 @@ yyreduce: ;} break; - case 496: -#line 5379 "Gmsh.y" + case 495: +#line 5329 "Gmsh.y" { (yyval.l) = (yyvsp[(3) - (3)].l); for(int i = 0; i < List_Nbr((yyval.l)); i++){ @@ -12634,8 +12555,8 @@ yyreduce: ;} break; - case 497: -#line 5387 "Gmsh.y" + case 496: +#line 5337 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(double)); for(double d = (yyvsp[(1) - (3)].d); ((yyvsp[(1) - (3)].d) < (yyvsp[(3) - (3)].d)) ? (d <= (yyvsp[(3) - (3)].d)) : (d >= (yyvsp[(3) - (3)].d)); @@ -12644,8 +12565,8 @@ yyreduce: ;} break; - case 498: -#line 5394 "Gmsh.y" + case 497: +#line 5344 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(double)); if(!(yyvsp[(5) - (5)].d)){ //|| ($1 < $3 && $5 < 0) || ($1 > $3 && $5 > 0) @@ -12657,8 +12578,8 @@ yyreduce: ;} break; - case 499: -#line 5404 "Gmsh.y" + case 498: +#line 5354 "Gmsh.y" { (yyval.l) = List_Create(3, 1, sizeof(double)); int tag = (int)(yyvsp[(3) - (4)].d); @@ -12683,16 +12604,16 @@ yyreduce: ;} break; - case 500: -#line 5427 "Gmsh.y" + case 499: +#line 5377 "Gmsh.y" { (yyval.l) = List_Create(10, 10, sizeof(double)); getAllElementaryTags(0, (yyval.l)); ;} break; - case 501: -#line 5432 "Gmsh.y" + case 500: +#line 5382 "Gmsh.y" { (yyval.l) = List_Create(10, 10, sizeof(double)); getAllElementaryTags(0, (yyval.l)); @@ -12700,16 +12621,16 @@ yyreduce: ;} break; - case 502: -#line 5438 "Gmsh.y" + case 501: +#line 5388 "Gmsh.y" { (yyval.l) = List_Create(10, 10, sizeof(double)); getAllElementaryTags((yyvsp[(1) - (4)].i), (yyval.l)); ;} break; - case 503: -#line 5443 "Gmsh.y" + case 502: +#line 5393 "Gmsh.y" { (yyval.l) = List_Create(10, 10, sizeof(double)); getAllElementaryTags((yyvsp[(1) - (2)].i), (yyval.l)); @@ -12717,8 +12638,8 @@ yyreduce: ;} break; - case 504: -#line 5449 "Gmsh.y" + case 503: +#line 5399 "Gmsh.y" { (yyval.l) = List_Create(10, 10, sizeof(double)); if(!(yyvsp[(3) - (3)].l)){ @@ -12731,24 +12652,24 @@ yyreduce: ;} break; - case 505: -#line 5461 "Gmsh.y" + case 504: +#line 5411 "Gmsh.y" { (yyval.l) = List_Create(10, 10, sizeof(double)); getElementaryTagsInBoundingBox((yyvsp[(1) - (16)].i), (yyvsp[(5) - (16)].d), (yyvsp[(7) - (16)].d), (yyvsp[(9) - (16)].d), (yyvsp[(11) - (16)].d), (yyvsp[(13) - (16)].d), (yyvsp[(15) - (16)].d), (yyval.l)); ;} break; - case 506: -#line 5466 "Gmsh.y" + case 505: +#line 5416 "Gmsh.y" { (yyval.l) = List_Create(10, 10, sizeof(double)); getBoundingBox((yyvsp[(2) - (5)].i), (int)(yyvsp[(4) - (5)].d), (yyval.l)); ;} break; - case 507: -#line 5471 "Gmsh.y" + case 506: +#line 5421 "Gmsh.y" { (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double)); for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){ @@ -12760,8 +12681,8 @@ yyreduce: ;} break; - case 508: -#line 5481 "Gmsh.y" + case 507: +#line 5431 "Gmsh.y" { (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double)); for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){ @@ -12773,8 +12694,8 @@ yyreduce: ;} break; - case 509: -#line 5491 "Gmsh.y" + case 508: +#line 5441 "Gmsh.y" { (yyval.l) = List_Create(List_Nbr((yyvsp[(1) - (1)].l)), 1, sizeof(double)); for(int i = 0; i < List_Nbr((yyvsp[(1) - (1)].l)); i++){ @@ -12786,8 +12707,8 @@ yyreduce: ;} break; - case 510: -#line 5501 "Gmsh.y" + case 509: +#line 5451 "Gmsh.y" { (yyval.l) = List_Create(20, 20, sizeof(double)); if(!gmsh_yysymbols.count((yyvsp[(1) - (3)].c))) @@ -12801,22 +12722,22 @@ yyreduce: ;} break; - case 511: -#line 5513 "Gmsh.y" + case 510: +#line 5463 "Gmsh.y" { (yyval.l) = treat_Struct_FullName_dot_tSTRING_ListOfFloat(NULL, (yyvsp[(1) - (5)].c), (yyvsp[(3) - (5)].c)); ;} break; - case 512: -#line 5517 "Gmsh.y" + case 511: +#line 5467 "Gmsh.y" { (yyval.l) = treat_Struct_FullName_dot_tSTRING_ListOfFloat((yyvsp[(1) - (7)].c), (yyvsp[(3) - (7)].c), (yyvsp[(5) - (7)].c)); ;} break; - case 513: -#line 5522 "Gmsh.y" + case 512: +#line 5472 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(double)); if(!gmsh_yysymbols.count((yyvsp[(3) - (4)].c))) @@ -12830,29 +12751,29 @@ yyreduce: ;} break; - case 514: -#line 5534 "Gmsh.y" + case 513: +#line 5484 "Gmsh.y" { (yyval.l) = (yyvsp[(3) - (4)].l); ;} break; - case 515: -#line 5538 "Gmsh.y" + case 514: +#line 5488 "Gmsh.y" { (yyval.l) = (yyvsp[(3) - (4)].l); ;} break; - case 516: -#line 5542 "Gmsh.y" + case 515: +#line 5492 "Gmsh.y" { (yyval.l) = (yyvsp[(4) - (6)].l); ;} break; - case 517: -#line 5546 "Gmsh.y" + case 516: +#line 5496 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(double)); if(!gmsh_yysymbols.count((yyvsp[(1) - (6)].c))) @@ -12872,8 +12793,8 @@ yyreduce: ;} break; - case 518: -#line 5564 "Gmsh.y" + case 517: +#line 5514 "Gmsh.y" { (yyval.l) = List_Create(20,20,sizeof(double)); for(int i = 0; i < (int)(yyvsp[(7) - (8)].d); i++) { @@ -12883,8 +12804,8 @@ yyreduce: ;} break; - case 519: -#line 5572 "Gmsh.y" + case 518: +#line 5522 "Gmsh.y" { (yyval.l) = List_Create(20,20,sizeof(double)); for(int i = 0; i < (int)(yyvsp[(7) - (8)].d); i++) { @@ -12894,8 +12815,8 @@ yyreduce: ;} break; - case 520: -#line 5580 "Gmsh.y" + case 519: +#line 5530 "Gmsh.y" { Msg::Barrier(); FILE *File; @@ -12926,8 +12847,8 @@ yyreduce: ;} break; - case 521: -#line 5609 "Gmsh.y" + case 520: +#line 5559 "Gmsh.y" { double x0 = (yyvsp[(3) - (14)].d), x1 = (yyvsp[(5) - (14)].d), y0 = (yyvsp[(7) - (14)].d), y1 = (yyvsp[(9) - (14)].d), ys = (yyvsp[(11) - (14)].d); int N = (int)(yyvsp[(13) - (14)].d); @@ -12939,8 +12860,8 @@ yyreduce: ;} break; - case 522: -#line 5619 "Gmsh.y" + case 521: +#line 5569 "Gmsh.y" { std::vector<double> tmp; for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){ @@ -12958,8 +12879,8 @@ yyreduce: ;} break; - case 523: -#line 5635 "Gmsh.y" + case 522: +#line 5585 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++){ double *d = (double*)List_Pointer((yyvsp[(3) - (4)].l), i); @@ -12969,30 +12890,30 @@ yyreduce: ;} break; - case 524: -#line 5646 "Gmsh.y" + case 523: +#line 5596 "Gmsh.y" { (yyval.l) = List_Create(2, 1, sizeof(double)); List_Add((yyval.l), &((yyvsp[(1) - (1)].d))); ;} break; - case 525: -#line 5651 "Gmsh.y" + case 524: +#line 5601 "Gmsh.y" { (yyval.l) = (yyvsp[(1) - (1)].l); ;} break; - case 526: -#line 5655 "Gmsh.y" + case 525: +#line 5605 "Gmsh.y" { List_Add((yyval.l), &((yyvsp[(3) - (3)].d))); ;} break; - case 527: -#line 5659 "Gmsh.y" + case 526: +#line 5609 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(3) - (3)].l)); i++){ double d; @@ -13003,22 +12924,22 @@ yyreduce: ;} break; - case 528: -#line 5671 "Gmsh.y" + case 527: +#line 5621 "Gmsh.y" { (yyval.u) = CTX::instance()->packColor((int)(yyvsp[(2) - (9)].d), (int)(yyvsp[(4) - (9)].d), (int)(yyvsp[(6) - (9)].d), (int)(yyvsp[(8) - (9)].d)); ;} break; - case 529: -#line 5675 "Gmsh.y" + case 528: +#line 5625 "Gmsh.y" { (yyval.u) = CTX::instance()->packColor((int)(yyvsp[(2) - (7)].d), (int)(yyvsp[(4) - (7)].d), (int)(yyvsp[(6) - (7)].d), 255); ;} break; - case 530: -#line 5687 "Gmsh.y" + case 529: +#line 5637 "Gmsh.y" { int flag = 0; if(gmsh_yystringsymbols.count((yyvsp[(1) - (1)].c))){ @@ -13037,8 +12958,8 @@ yyreduce: ;} break; - case 531: -#line 5704 "Gmsh.y" + case 530: +#line 5654 "Gmsh.y" { unsigned int val = 0; ColorOption(GMSH_GET, (yyvsp[(1) - (5)].c), 0, (yyvsp[(5) - (5)].c), val); @@ -13047,15 +12968,15 @@ yyreduce: ;} break; - case 532: -#line 5714 "Gmsh.y" + case 531: +#line 5664 "Gmsh.y" { (yyval.l) = (yyvsp[(2) - (3)].l); ;} break; - case 533: -#line 5718 "Gmsh.y" + case 532: +#line 5668 "Gmsh.y" { (yyval.l) = List_Create(256, 10, sizeof(unsigned int)); GmshColorTable *ct = GetColorTable((int)(yyvsp[(3) - (6)].d)); @@ -13069,38 +12990,38 @@ yyreduce: ;} break; - case 534: -#line 5733 "Gmsh.y" + case 533: +#line 5683 "Gmsh.y" { (yyval.l) = List_Create(256, 10, sizeof(unsigned int)); List_Add((yyval.l), &((yyvsp[(1) - (1)].u))); ;} break; - case 535: -#line 5738 "Gmsh.y" + case 534: +#line 5688 "Gmsh.y" { List_Add((yyval.l), &((yyvsp[(3) - (3)].u))); ;} break; - case 536: -#line 5745 "Gmsh.y" + case 535: +#line 5695 "Gmsh.y" { (yyval.c) = (yyvsp[(1) - (1)].c); ;} break; - case 537: -#line 5749 "Gmsh.y" + case 536: +#line 5699 "Gmsh.y" { // No need to extend to Struct_FullName (a Tag is not a String) (yyval.c) = treat_Struct_FullName_String(NULL, (yyvsp[(1) - (1)].c)); ;} break; - case 538: -#line 5754 "Gmsh.y" + case 537: +#line 5704 "Gmsh.y" { std::string val; int j = (int)(yyvsp[(3) - (4)].d); @@ -13116,8 +13037,8 @@ yyreduce: ;} break; - case 539: -#line 5768 "Gmsh.y" + case 538: +#line 5718 "Gmsh.y" { std::string val; int j = (int)(yyvsp[(3) - (4)].d); @@ -13133,36 +13054,36 @@ yyreduce: ;} break; - case 540: -#line 5784 "Gmsh.y" + case 539: +#line 5734 "Gmsh.y" { (yyval.c) = treat_Struct_FullName_dot_tSTRING_String(NULL, (yyvsp[(1) - (3)].c), (yyvsp[(3) - (3)].c)); ;} break; - case 541: -#line 5788 "Gmsh.y" + case 540: +#line 5738 "Gmsh.y" { (yyval.c) = treat_Struct_FullName_dot_tSTRING_String((yyvsp[(1) - (5)].c), (yyvsp[(3) - (5)].c), (yyvsp[(5) - (5)].c)); ;} break; - case 542: -#line 5792 "Gmsh.y" + case 541: +#line 5742 "Gmsh.y" { (yyval.c) = treat_Struct_FullName_dot_tSTRING_String(NULL, (yyvsp[(1) - (6)].c), (yyvsp[(3) - (6)].c), (int)(yyvsp[(5) - (6)].d)); ;} break; - case 543: -#line 5796 "Gmsh.y" + case 542: +#line 5746 "Gmsh.y" { (yyval.c) = treat_Struct_FullName_dot_tSTRING_String((yyvsp[(1) - (8)].c), (yyvsp[(3) - (8)].c), (yyvsp[(5) - (8)].c), (int)(yyvsp[(7) - (8)].d)); ;} break; - case 544: -#line 5800 "Gmsh.y" + case 543: +#line 5750 "Gmsh.y" { std::string out; StringOption(GMSH_GET, (yyvsp[(1) - (6)].c), (int)(yyvsp[(3) - (6)].d), (yyvsp[(6) - (6)].c), out); @@ -13172,8 +13093,8 @@ yyreduce: ;} break; - case 545: -#line 5808 "Gmsh.y" + case 544: +#line 5758 "Gmsh.y" { std::string name = GModel::current()->getPhysicalName(0, (int)(yyvsp[(4) - (5)].d)); (yyval.c) = (char*)Malloc((name.size() + 1) * sizeof(char)); @@ -13181,8 +13102,8 @@ yyreduce: ;} break; - case 546: -#line 5814 "Gmsh.y" + case 545: +#line 5764 "Gmsh.y" { std::string name = GModel::current()->getPhysicalName(1, (int)(yyvsp[(4) - (5)].d)); (yyval.c) = (char*)Malloc((name.size() + 1) * sizeof(char)); @@ -13190,8 +13111,8 @@ yyreduce: ;} break; - case 547: -#line 5820 "Gmsh.y" + case 546: +#line 5770 "Gmsh.y" { std::string name = GModel::current()->getPhysicalName(2, (int)(yyvsp[(4) - (5)].d)); (yyval.c) = (char*)Malloc((name.size() + 1) * sizeof(char)); @@ -13199,8 +13120,8 @@ yyreduce: ;} break; - case 548: -#line 5826 "Gmsh.y" + case 547: +#line 5776 "Gmsh.y" { std::string name = GModel::current()->getPhysicalName(3, (int)(yyvsp[(4) - (5)].d)); (yyval.c) = (char*)Malloc((name.size() + 1) * sizeof(char)); @@ -13208,22 +13129,22 @@ yyreduce: ;} break; - case 549: -#line 5835 "Gmsh.y" + case 548: +#line 5785 "Gmsh.y" { (yyval.c) = (yyvsp[(1) - (1)].c); ;} break; - case 550: -#line 5839 "Gmsh.y" + case 549: +#line 5789 "Gmsh.y" { (yyval.c) = (yyvsp[(3) - (4)].c); ;} break; - case 551: -#line 5843 "Gmsh.y" + case 550: +#line 5793 "Gmsh.y" { (yyval.c) = (char *)Malloc(32 * sizeof(char)); time_t now; @@ -13233,8 +13154,8 @@ yyreduce: ;} break; - case 552: -#line 5851 "Gmsh.y" + case 551: +#line 5801 "Gmsh.y" { std::string exe = Msg::GetExecutableName(); (yyval.c) = (char *)Malloc(exe.size() + 1); @@ -13242,8 +13163,8 @@ yyreduce: ;} break; - case 553: -#line 5857 "Gmsh.y" + case 552: +#line 5807 "Gmsh.y" { std::string action = Msg::GetOnelabAction(); (yyval.c) = (char *)Malloc(action.size() + 1); @@ -13251,15 +13172,15 @@ yyreduce: ;} break; - case 554: -#line 5863 "Gmsh.y" + case 553: +#line 5813 "Gmsh.y" { (yyval.c) = strsave((char*)"Gmsh"); ;} break; - case 555: -#line 5867 "Gmsh.y" + case 554: +#line 5817 "Gmsh.y" { const char *env = GetEnvironmentVar((yyvsp[(3) - (4)].c)); if(!env) env = ""; @@ -13269,8 +13190,8 @@ yyreduce: ;} break; - case 556: -#line 5875 "Gmsh.y" + case 555: +#line 5825 "Gmsh.y" { std::string s = Msg::GetString((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c)); (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char)); @@ -13280,8 +13201,8 @@ yyreduce: ;} break; - case 557: -#line 5883 "Gmsh.y" + case 556: +#line 5833 "Gmsh.y" { std::string s = Msg::GetOnelabString((yyvsp[(3) - (4)].c)); (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char)); @@ -13290,8 +13211,8 @@ yyreduce: ;} break; - case 558: -#line 5890 "Gmsh.y" + case 557: +#line 5840 "Gmsh.y" { std::string s = Msg::GetOnelabString((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].c)); (yyval.c) = (char *)Malloc((s.size() + 1) * sizeof(char)); @@ -13301,22 +13222,22 @@ yyreduce: ;} break; - case 559: -#line 5899 "Gmsh.y" + case 558: +#line 5849 "Gmsh.y" { (yyval.c) = treat_Struct_FullName_String(NULL, (yyvsp[(3) - (5)].c2).char2, 1, 0, (yyvsp[(4) - (5)].c), 2); ;} break; - case 560: -#line 5903 "Gmsh.y" + case 559: +#line 5853 "Gmsh.y" { (yyval.c) = treat_Struct_FullName_dot_tSTRING_String((yyvsp[(3) - (7)].c2).char1, (yyvsp[(3) - (7)].c2).char2, (yyvsp[(5) - (7)].c), 0, (yyvsp[(6) - (7)].c), 2); ;} break; - case 561: -#line 5907 "Gmsh.y" + case 560: +#line 5857 "Gmsh.y" { int size = 1; for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++) @@ -13333,8 +13254,8 @@ yyreduce: ;} break; - case 562: -#line 5922 "Gmsh.y" + case 561: +#line 5872 "Gmsh.y" { (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char)); int i; @@ -13350,8 +13271,8 @@ yyreduce: ;} break; - case 563: -#line 5936 "Gmsh.y" + case 562: +#line 5886 "Gmsh.y" { (yyval.c) = (char *)Malloc((strlen((yyvsp[(3) - (4)].c)) + 1) * sizeof(char)); int i; @@ -13367,8 +13288,8 @@ yyreduce: ;} break; - case 564: -#line 5950 "Gmsh.y" + case 563: +#line 5900 "Gmsh.y" { std::string input = (yyvsp[(3) - (8)].c); std::string substr_old = (yyvsp[(5) - (8)].c); @@ -13382,8 +13303,8 @@ yyreduce: ;} break; - case 565: -#line 5962 "Gmsh.y" + case 564: +#line 5912 "Gmsh.y" { int size = 1; for(int i = 0; i < List_Nbr((yyvsp[(3) - (4)].l)); i++) @@ -13401,8 +13322,8 @@ yyreduce: ;} break; - case 566: -#line 5978 "Gmsh.y" + case 565: +#line 5928 "Gmsh.y" { int i = 0; while ((yyvsp[(3) - (4)].c)[i]) { @@ -13413,8 +13334,8 @@ yyreduce: ;} break; - case 567: -#line 5987 "Gmsh.y" + case 566: +#line 5937 "Gmsh.y" { int i = 0; while ((yyvsp[(3) - (4)].c)[i]) { @@ -13425,8 +13346,8 @@ yyreduce: ;} break; - case 568: -#line 5996 "Gmsh.y" + case 567: +#line 5946 "Gmsh.y" { int i = 0; while ((yyvsp[(3) - (4)].c)[i]) { @@ -13438,8 +13359,8 @@ yyreduce: ;} break; - case 569: -#line 6006 "Gmsh.y" + case 568: +#line 5956 "Gmsh.y" { if((yyvsp[(3) - (8)].d)){ (yyval.c) = (yyvsp[(5) - (8)].c); @@ -13452,8 +13373,8 @@ yyreduce: ;} break; - case 570: -#line 6017 "Gmsh.y" + case 569: +#line 5967 "Gmsh.y" { std::string in = (yyvsp[(3) - (8)].c); std::string out = in.substr((int)(yyvsp[(5) - (8)].d), (int)(yyvsp[(7) - (8)].d)); @@ -13463,8 +13384,8 @@ yyreduce: ;} break; - case 571: -#line 6025 "Gmsh.y" + case 570: +#line 5975 "Gmsh.y" { std::string in = (yyvsp[(3) - (6)].c); std::string out = in.substr((int)(yyvsp[(5) - (6)].d), std::string::npos); @@ -13474,15 +13395,15 @@ yyreduce: ;} break; - case 572: -#line 6033 "Gmsh.y" + case 571: +#line 5983 "Gmsh.y" { (yyval.c) = (yyvsp[(3) - (4)].c); ;} break; - case 573: -#line 6037 "Gmsh.y" + case 572: +#line 5987 "Gmsh.y" { char tmpstring[5000]; int i = printListOfDouble((yyvsp[(3) - (6)].c), (yyvsp[(5) - (6)].l), tmpstring); @@ -13503,8 +13424,8 @@ yyreduce: ;} break; - case 574: -#line 6056 "Gmsh.y" + case 573: +#line 6006 "Gmsh.y" { std::string tmp = FixRelativePath(gmsh_yyname, (yyvsp[(3) - (4)].c)); (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char)); @@ -13513,8 +13434,8 @@ yyreduce: ;} break; - case 575: -#line 6063 "Gmsh.y" + case 574: +#line 6013 "Gmsh.y" { std::string tmp = SplitFileName(GetAbsolutePath(gmsh_yyname))[0]; (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char)); @@ -13522,8 +13443,8 @@ yyreduce: ;} break; - case 576: -#line 6069 "Gmsh.y" + case 575: +#line 6019 "Gmsh.y" { std::string tmp = SplitFileName((yyvsp[(3) - (4)].c))[0]; (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char)); @@ -13532,8 +13453,8 @@ yyreduce: ;} break; - case 577: -#line 6076 "Gmsh.y" + case 576: +#line 6026 "Gmsh.y" { std::string tmp = GetAbsolutePath((yyvsp[(3) - (4)].c)); (yyval.c) = (char*)Malloc((tmp.size() + 1) * sizeof(char)); @@ -13542,13 +13463,13 @@ yyreduce: ;} break; - case 578: -#line 6083 "Gmsh.y" + case 577: +#line 6033 "Gmsh.y" { init_options(); ;} break; - case 579: -#line 6085 "Gmsh.y" + case 578: +#line 6035 "Gmsh.y" { std::string val((yyvsp[(3) - (6)].c)); Msg::ExchangeOnelabParameter("", val, floatOptions, charOptions); @@ -13558,8 +13479,8 @@ yyreduce: ;} break; - case 580: -#line 6093 "Gmsh.y" + case 579: +#line 6043 "Gmsh.y" { std::string out; const std::string * key_struct = NULL; @@ -13582,58 +13503,58 @@ yyreduce: ;} break; - case 581: -#line 6117 "Gmsh.y" + case 580: +#line 6067 "Gmsh.y" { struct_namespace = std::string(""); (yyval.d) = (yyvsp[(2) - (2)].d); ;} break; - case 582: -#line 6119 "Gmsh.y" + case 581: +#line 6069 "Gmsh.y" { struct_namespace = (yyvsp[(1) - (4)].c); Free((yyvsp[(1) - (4)].c)); (yyval.d) = (yyvsp[(4) - (4)].d); ;} break; - case 583: -#line 6125 "Gmsh.y" + case 582: +#line 6075 "Gmsh.y" { (yyval.l) = (yyvsp[(3) - (4)].l); ;} break; - case 584: -#line 6130 "Gmsh.y" + case 583: +#line 6080 "Gmsh.y" { (yyval.l) = (yyvsp[(1) - (1)].l); ;} break; - case 585: -#line 6132 "Gmsh.y" + case 584: +#line 6082 "Gmsh.y" { (yyval.l) = (yyvsp[(1) - (1)].l); ;} break; - case 586: -#line 6137 "Gmsh.y" + case 585: +#line 6087 "Gmsh.y" { (yyval.l) = (yyvsp[(2) - (3)].l); ;} break; - case 587: -#line 6142 "Gmsh.y" + case 586: +#line 6092 "Gmsh.y" { (yyval.l) = List_Create(20,20,sizeof(char*)); List_Add((yyval.l), &((yyvsp[(1) - (1)].c))); ;} break; - case 588: -#line 6147 "Gmsh.y" + case 587: +#line 6097 "Gmsh.y" { (yyval.l) = (yyvsp[(1) - (1)].l); ;} break; - case 589: -#line 6149 "Gmsh.y" + case 588: +#line 6099 "Gmsh.y" { List_Add((yyval.l), &((yyvsp[(3) - (3)].c))); ;} break; - case 590: -#line 6153 "Gmsh.y" + case 589: +#line 6103 "Gmsh.y" { for(int i = 0; i < List_Nbr((yyvsp[(3) - (3)].l)); i++){ char* c; @@ -13644,8 +13565,8 @@ yyreduce: ;} break; - case 591: -#line 6165 "Gmsh.y" + case 590: +#line 6115 "Gmsh.y" { (yyval.l) = List_Create(20, 20, sizeof(char *)); if(!gmsh_yystringsymbols.count((yyvsp[(1) - (3)].c))) @@ -13661,22 +13582,22 @@ yyreduce: ;} break; - case 592: -#line 6179 "Gmsh.y" + case 591: +#line 6129 "Gmsh.y" { (yyval.l) = treat_Struct_FullName_dot_tSTRING_ListOfString(NULL, (yyvsp[(1) - (5)].c), (yyvsp[(3) - (5)].c)); ;} break; - case 593: -#line 6183 "Gmsh.y" + case 592: +#line 6133 "Gmsh.y" { (yyval.l) = treat_Struct_FullName_dot_tSTRING_ListOfString((yyvsp[(1) - (7)].c), (yyvsp[(3) - (7)].c), (yyvsp[(5) - (7)].c)); ;} break; - case 594: -#line 6190 "Gmsh.y" + case 593: +#line 6140 "Gmsh.y" { char tmpstr[256]; sprintf(tmpstr, "_%d", (int)(yyvsp[(4) - (5)].d)); @@ -13686,8 +13607,8 @@ yyreduce: ;} break; - case 595: -#line 6198 "Gmsh.y" + case 594: +#line 6148 "Gmsh.y" { char tmpstr[256]; sprintf(tmpstr, "_%d", (int)(yyvsp[(4) - (5)].d)); @@ -13697,8 +13618,8 @@ yyreduce: ;} break; - case 596: -#line 6206 "Gmsh.y" + case 595: +#line 6156 "Gmsh.y" { char tmpstr[256]; sprintf(tmpstr, "_%d", (int)(yyvsp[(7) - (8)].d)); @@ -13708,24 +13629,24 @@ yyreduce: ;} break; - case 597: -#line 6217 "Gmsh.y" + case 596: +#line 6167 "Gmsh.y" { (yyval.c) = (yyvsp[(1) - (1)].c); ;} break; - case 598: -#line 6219 "Gmsh.y" + case 597: +#line 6169 "Gmsh.y" { (yyval.c) = (yyvsp[(1) - (1)].c); ;} break; - case 599: -#line 6222 "Gmsh.y" + case 598: +#line 6172 "Gmsh.y" { (yyval.c) = (yyvsp[(3) - (4)].c); ;} break; /* Line 1267 of yacc.c. */ -#line 13729 "Gmsh.tab.cpp" +#line 13650 "Gmsh.tab.cpp" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -13939,7 +13860,7 @@ yyreturn: } -#line 6225 "Gmsh.y" +#line 6175 "Gmsh.y" void assignVariable(const std::string &name, int index, int assignType, diff --git a/Parser/Gmsh.tab.hpp b/Parser/Gmsh.tab.hpp index 4f611a4132a601d5d99502fb56611dd548adab25..5973b437e15ac150e89f5eb995a06a2b50308e8a 100644 --- a/Parser/Gmsh.tab.hpp +++ b/Parser/Gmsh.tab.hpp @@ -115,154 +115,153 @@ tMemory = 331, tTotalMemory = 332, tCreateTopology = 333, - tCreateTopologyNoHoles = 334, - tDistanceFunction = 335, - tDefineConstant = 336, - tUndefineConstant = 337, - tDefineNumber = 338, - tDefineStruct = 339, - tNameStruct = 340, - tDimNameSpace = 341, - tAppend = 342, - tDefineString = 343, - tSetNumber = 344, - tSetString = 345, - tPoint = 346, - tCircle = 347, - tEllipse = 348, - tLine = 349, - tSphere = 350, - tPolarSphere = 351, - tSurface = 352, - tSpline = 353, - tVolume = 354, - tBox = 355, - tCylinder = 356, - tCone = 357, - tTorus = 358, - tEllipsoid = 359, - tQuadric = 360, - tShapeFromFile = 361, - tRectangle = 362, - tDisk = 363, - tWire = 364, - tGeoEntity = 365, - tCharacteristic = 366, - tLength = 367, - tParametric = 368, - tElliptic = 369, - tRefineMesh = 370, - tAdaptMesh = 371, - tRelocateMesh = 372, - tSetFactory = 373, - tThruSections = 374, - tWedge = 375, - tFillet = 376, - tChamfer = 377, - tPlane = 378, - tRuled = 379, - tTransfinite = 380, - tPhysical = 381, - tCompound = 382, - tPeriodic = 383, - tUsing = 384, - tPlugin = 385, - tDegenerated = 386, - tRecursive = 387, - tRotate = 388, - tTranslate = 389, - tSymmetry = 390, - tDilate = 391, - tExtrude = 392, - tLevelset = 393, - tAffine = 394, - tBooleanUnion = 395, - tBooleanIntersection = 396, - tBooleanDifference = 397, - tBooleanSection = 398, - tBooleanFragments = 399, - tThickSolid = 400, - tRecombine = 401, - tSmoother = 402, - tSplit = 403, - tDelete = 404, - tCoherence = 405, - tIntersect = 406, - tMeshAlgorithm = 407, - tReverse = 408, - tLayers = 409, - tScaleLast = 410, - tHole = 411, - tAlias = 412, - tAliasWithOptions = 413, - tCopyOptions = 414, - tQuadTriAddVerts = 415, - tQuadTriNoNewVerts = 416, - tRecombLaterals = 417, - tTransfQuadTri = 418, - tText2D = 419, - tText3D = 420, - tInterpolationScheme = 421, - tTime = 422, - tCombine = 423, - tBSpline = 424, - tBezier = 425, - tNurbs = 426, - tNurbsOrder = 427, - tNurbsKnots = 428, - tColor = 429, - tColorTable = 430, - tFor = 431, - tIn = 432, - tEndFor = 433, - tIf = 434, - tElseIf = 435, - tElse = 436, - tEndIf = 437, - tExit = 438, - tAbort = 439, - tField = 440, - tReturn = 441, - tCall = 442, - tSlide = 443, - tMacro = 444, - tShow = 445, - tHide = 446, - tGetValue = 447, - tGetStringValue = 448, - tGetEnv = 449, - tGetString = 450, - tGetNumber = 451, - tUnique = 452, - tHomology = 453, - tCohomology = 454, - tBetti = 455, - tExists = 456, - tFileExists = 457, - tGetForced = 458, - tGetForcedStr = 459, - tGMSH_MAJOR_VERSION = 460, - tGMSH_MINOR_VERSION = 461, - tGMSH_PATCH_VERSION = 462, - tGmshExecutableName = 463, - tSetPartition = 464, - tNameToString = 465, - tStringToName = 466, - tAFFECTDIVIDE = 467, - tAFFECTTIMES = 468, - tAFFECTMINUS = 469, - tAFFECTPLUS = 470, - tOR = 471, - tAND = 472, - tNOTEQUAL = 473, - tEQUAL = 474, - tGREATERGREATER = 475, - tLESSLESS = 476, - tGREATEROREQUAL = 477, - tLESSOREQUAL = 478, - UNARYPREC = 479, - tMINUSMINUS = 480, - tPLUSPLUS = 481 + tDistanceFunction = 334, + tDefineConstant = 335, + tUndefineConstant = 336, + tDefineNumber = 337, + tDefineStruct = 338, + tNameStruct = 339, + tDimNameSpace = 340, + tAppend = 341, + tDefineString = 342, + tSetNumber = 343, + tSetString = 344, + tPoint = 345, + tCircle = 346, + tEllipse = 347, + tLine = 348, + tSphere = 349, + tPolarSphere = 350, + tSurface = 351, + tSpline = 352, + tVolume = 353, + tBox = 354, + tCylinder = 355, + tCone = 356, + tTorus = 357, + tEllipsoid = 358, + tQuadric = 359, + tShapeFromFile = 360, + tRectangle = 361, + tDisk = 362, + tWire = 363, + tGeoEntity = 364, + tCharacteristic = 365, + tLength = 366, + tParametric = 367, + tElliptic = 368, + tRefineMesh = 369, + tAdaptMesh = 370, + tRelocateMesh = 371, + tSetFactory = 372, + tThruSections = 373, + tWedge = 374, + tFillet = 375, + tChamfer = 376, + tPlane = 377, + tRuled = 378, + tTransfinite = 379, + tPhysical = 380, + tCompound = 381, + tPeriodic = 382, + tUsing = 383, + tPlugin = 384, + tDegenerated = 385, + tRecursive = 386, + tRotate = 387, + tTranslate = 388, + tSymmetry = 389, + tDilate = 390, + tExtrude = 391, + tLevelset = 392, + tAffine = 393, + tBooleanUnion = 394, + tBooleanIntersection = 395, + tBooleanDifference = 396, + tBooleanSection = 397, + tBooleanFragments = 398, + tThickSolid = 399, + tRecombine = 400, + tSmoother = 401, + tSplit = 402, + tDelete = 403, + tCoherence = 404, + tIntersect = 405, + tMeshAlgorithm = 406, + tReverse = 407, + tLayers = 408, + tScaleLast = 409, + tHole = 410, + tAlias = 411, + tAliasWithOptions = 412, + tCopyOptions = 413, + tQuadTriAddVerts = 414, + tQuadTriNoNewVerts = 415, + tRecombLaterals = 416, + tTransfQuadTri = 417, + tText2D = 418, + tText3D = 419, + tInterpolationScheme = 420, + tTime = 421, + tCombine = 422, + tBSpline = 423, + tBezier = 424, + tNurbs = 425, + tNurbsOrder = 426, + tNurbsKnots = 427, + tColor = 428, + tColorTable = 429, + tFor = 430, + tIn = 431, + tEndFor = 432, + tIf = 433, + tElseIf = 434, + tElse = 435, + tEndIf = 436, + tExit = 437, + tAbort = 438, + tField = 439, + tReturn = 440, + tCall = 441, + tSlide = 442, + tMacro = 443, + tShow = 444, + tHide = 445, + tGetValue = 446, + tGetStringValue = 447, + tGetEnv = 448, + tGetString = 449, + tGetNumber = 450, + tUnique = 451, + tHomology = 452, + tCohomology = 453, + tBetti = 454, + tExists = 455, + tFileExists = 456, + tGetForced = 457, + tGetForcedStr = 458, + tGMSH_MAJOR_VERSION = 459, + tGMSH_MINOR_VERSION = 460, + tGMSH_PATCH_VERSION = 461, + tGmshExecutableName = 462, + tSetPartition = 463, + tNameToString = 464, + tStringToName = 465, + tAFFECTDIVIDE = 466, + tAFFECTTIMES = 467, + tAFFECTMINUS = 468, + tAFFECTPLUS = 469, + tOR = 470, + tAND = 471, + tNOTEQUAL = 472, + tEQUAL = 473, + tGREATERGREATER = 474, + tLESSLESS = 475, + tGREATEROREQUAL = 476, + tLESSOREQUAL = 477, + UNARYPREC = 478, + tMINUSMINUS = 479, + tPLUSPLUS = 480 }; #endif /* Tokens. */ @@ -342,154 +341,153 @@ #define tMemory 331 #define tTotalMemory 332 #define tCreateTopology 333 -#define tCreateTopologyNoHoles 334 -#define tDistanceFunction 335 -#define tDefineConstant 336 -#define tUndefineConstant 337 -#define tDefineNumber 338 -#define tDefineStruct 339 -#define tNameStruct 340 -#define tDimNameSpace 341 -#define tAppend 342 -#define tDefineString 343 -#define tSetNumber 344 -#define tSetString 345 -#define tPoint 346 -#define tCircle 347 -#define tEllipse 348 -#define tLine 349 -#define tSphere 350 -#define tPolarSphere 351 -#define tSurface 352 -#define tSpline 353 -#define tVolume 354 -#define tBox 355 -#define tCylinder 356 -#define tCone 357 -#define tTorus 358 -#define tEllipsoid 359 -#define tQuadric 360 -#define tShapeFromFile 361 -#define tRectangle 362 -#define tDisk 363 -#define tWire 364 -#define tGeoEntity 365 -#define tCharacteristic 366 -#define tLength 367 -#define tParametric 368 -#define tElliptic 369 -#define tRefineMesh 370 -#define tAdaptMesh 371 -#define tRelocateMesh 372 -#define tSetFactory 373 -#define tThruSections 374 -#define tWedge 375 -#define tFillet 376 -#define tChamfer 377 -#define tPlane 378 -#define tRuled 379 -#define tTransfinite 380 -#define tPhysical 381 -#define tCompound 382 -#define tPeriodic 383 -#define tUsing 384 -#define tPlugin 385 -#define tDegenerated 386 -#define tRecursive 387 -#define tRotate 388 -#define tTranslate 389 -#define tSymmetry 390 -#define tDilate 391 -#define tExtrude 392 -#define tLevelset 393 -#define tAffine 394 -#define tBooleanUnion 395 -#define tBooleanIntersection 396 -#define tBooleanDifference 397 -#define tBooleanSection 398 -#define tBooleanFragments 399 -#define tThickSolid 400 -#define tRecombine 401 -#define tSmoother 402 -#define tSplit 403 -#define tDelete 404 -#define tCoherence 405 -#define tIntersect 406 -#define tMeshAlgorithm 407 -#define tReverse 408 -#define tLayers 409 -#define tScaleLast 410 -#define tHole 411 -#define tAlias 412 -#define tAliasWithOptions 413 -#define tCopyOptions 414 -#define tQuadTriAddVerts 415 -#define tQuadTriNoNewVerts 416 -#define tRecombLaterals 417 -#define tTransfQuadTri 418 -#define tText2D 419 -#define tText3D 420 -#define tInterpolationScheme 421 -#define tTime 422 -#define tCombine 423 -#define tBSpline 424 -#define tBezier 425 -#define tNurbs 426 -#define tNurbsOrder 427 -#define tNurbsKnots 428 -#define tColor 429 -#define tColorTable 430 -#define tFor 431 -#define tIn 432 -#define tEndFor 433 -#define tIf 434 -#define tElseIf 435 -#define tElse 436 -#define tEndIf 437 -#define tExit 438 -#define tAbort 439 -#define tField 440 -#define tReturn 441 -#define tCall 442 -#define tSlide 443 -#define tMacro 444 -#define tShow 445 -#define tHide 446 -#define tGetValue 447 -#define tGetStringValue 448 -#define tGetEnv 449 -#define tGetString 450 -#define tGetNumber 451 -#define tUnique 452 -#define tHomology 453 -#define tCohomology 454 -#define tBetti 455 -#define tExists 456 -#define tFileExists 457 -#define tGetForced 458 -#define tGetForcedStr 459 -#define tGMSH_MAJOR_VERSION 460 -#define tGMSH_MINOR_VERSION 461 -#define tGMSH_PATCH_VERSION 462 -#define tGmshExecutableName 463 -#define tSetPartition 464 -#define tNameToString 465 -#define tStringToName 466 -#define tAFFECTDIVIDE 467 -#define tAFFECTTIMES 468 -#define tAFFECTMINUS 469 -#define tAFFECTPLUS 470 -#define tOR 471 -#define tAND 472 -#define tNOTEQUAL 473 -#define tEQUAL 474 -#define tGREATERGREATER 475 -#define tLESSLESS 476 -#define tGREATEROREQUAL 477 -#define tLESSOREQUAL 478 -#define UNARYPREC 479 -#define tMINUSMINUS 480 -#define tPLUSPLUS 481 +#define tDistanceFunction 334 +#define tDefineConstant 335 +#define tUndefineConstant 336 +#define tDefineNumber 337 +#define tDefineStruct 338 +#define tNameStruct 339 +#define tDimNameSpace 340 +#define tAppend 341 +#define tDefineString 342 +#define tSetNumber 343 +#define tSetString 344 +#define tPoint 345 +#define tCircle 346 +#define tEllipse 347 +#define tLine 348 +#define tSphere 349 +#define tPolarSphere 350 +#define tSurface 351 +#define tSpline 352 +#define tVolume 353 +#define tBox 354 +#define tCylinder 355 +#define tCone 356 +#define tTorus 357 +#define tEllipsoid 358 +#define tQuadric 359 +#define tShapeFromFile 360 +#define tRectangle 361 +#define tDisk 362 +#define tWire 363 +#define tGeoEntity 364 +#define tCharacteristic 365 +#define tLength 366 +#define tParametric 367 +#define tElliptic 368 +#define tRefineMesh 369 +#define tAdaptMesh 370 +#define tRelocateMesh 371 +#define tSetFactory 372 +#define tThruSections 373 +#define tWedge 374 +#define tFillet 375 +#define tChamfer 376 +#define tPlane 377 +#define tRuled 378 +#define tTransfinite 379 +#define tPhysical 380 +#define tCompound 381 +#define tPeriodic 382 +#define tUsing 383 +#define tPlugin 384 +#define tDegenerated 385 +#define tRecursive 386 +#define tRotate 387 +#define tTranslate 388 +#define tSymmetry 389 +#define tDilate 390 +#define tExtrude 391 +#define tLevelset 392 +#define tAffine 393 +#define tBooleanUnion 394 +#define tBooleanIntersection 395 +#define tBooleanDifference 396 +#define tBooleanSection 397 +#define tBooleanFragments 398 +#define tThickSolid 399 +#define tRecombine 400 +#define tSmoother 401 +#define tSplit 402 +#define tDelete 403 +#define tCoherence 404 +#define tIntersect 405 +#define tMeshAlgorithm 406 +#define tReverse 407 +#define tLayers 408 +#define tScaleLast 409 +#define tHole 410 +#define tAlias 411 +#define tAliasWithOptions 412 +#define tCopyOptions 413 +#define tQuadTriAddVerts 414 +#define tQuadTriNoNewVerts 415 +#define tRecombLaterals 416 +#define tTransfQuadTri 417 +#define tText2D 418 +#define tText3D 419 +#define tInterpolationScheme 420 +#define tTime 421 +#define tCombine 422 +#define tBSpline 423 +#define tBezier 424 +#define tNurbs 425 +#define tNurbsOrder 426 +#define tNurbsKnots 427 +#define tColor 428 +#define tColorTable 429 +#define tFor 430 +#define tIn 431 +#define tEndFor 432 +#define tIf 433 +#define tElseIf 434 +#define tElse 435 +#define tEndIf 436 +#define tExit 437 +#define tAbort 438 +#define tField 439 +#define tReturn 440 +#define tCall 441 +#define tSlide 442 +#define tMacro 443 +#define tShow 444 +#define tHide 445 +#define tGetValue 446 +#define tGetStringValue 447 +#define tGetEnv 448 +#define tGetString 449 +#define tGetNumber 450 +#define tUnique 451 +#define tHomology 452 +#define tCohomology 453 +#define tBetti 454 +#define tExists 455 +#define tFileExists 456 +#define tGetForced 457 +#define tGetForcedStr 458 +#define tGMSH_MAJOR_VERSION 459 +#define tGMSH_MINOR_VERSION 460 +#define tGMSH_PATCH_VERSION 461 +#define tGmshExecutableName 462 +#define tSetPartition 463 +#define tNameToString 464 +#define tStringToName 465 +#define tAFFECTDIVIDE 466 +#define tAFFECTTIMES 467 +#define tAFFECTMINUS 468 +#define tAFFECTPLUS 469 +#define tOR 470 +#define tAND 471 +#define tNOTEQUAL 472 +#define tEQUAL 473 +#define tGREATERGREATER 474 +#define tLESSLESS 475 +#define tGREATEROREQUAL 476 +#define tLESSOREQUAL 477 +#define UNARYPREC 478 +#define tMINUSMINUS 479 +#define tPLUSPLUS 480 @@ -508,7 +506,7 @@ typedef union YYSTYPE struct TwoChar c2; } /* Line 1529 of yacc.c. */ -#line 512 "Gmsh.tab.hpp" +#line 510 "Gmsh.tab.hpp" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y index 4200917b0193120c90fcc9c1764e3eadd99c437d..a8b25a4132b066a1033a730c6c7df3f67c8ae3f1 100644 --- a/Parser/Gmsh.y +++ b/Parser/Gmsh.y @@ -188,7 +188,7 @@ struct doubleXstring{ %token tSyncModel tNewModel %token tOnelabAction tOnelabRun tCodeName %token tCpu tMemory tTotalMemory -%token tCreateTopology tCreateTopologyNoHoles +%token tCreateTopology %token tDistanceFunction tDefineConstant tUndefineConstant %token tDefineNumber tDefineStruct tNameStruct tDimNameSpace tAppend %token tDefineString tSetNumber tSetString @@ -2161,62 +2161,16 @@ Shape : } | tCompound GeoEntity123 '(' FExpr ')' tAFFECT ListOfDouble tEND { - int num = (int)$4; - std::vector<int> tags; ListOfDouble2Vector($7, tags); - switch ($2) { - case 1: - { - bool r = GModel::current()->getGEOInternals()->addCompoundLine(num, tags); - if(!r) yymsg(0, "Could not add compound line"); - } - $$.Type = MSH_SEGM_COMPOUND; - break; - case 2: - { - bool r = GModel::current()->getGEOInternals()->addCompoundSurface(num, tags); - if(!r) yymsg(0, "Could not add compound surface"); - } - $$.Type = MSH_SURF_COMPOUND; - break; - case 3: - { - bool r = GModel::current()->getGEOInternals()->addCompoundVolume(num, tags); - if(!r) yymsg(0, "Could not add compound volume"); - } - $$.Type = MSH_VOLUME_COMPOUND; - break; - } - List_Delete($7); - $$.Num = num; + yymsg(0, "Compounds entities are deprecated: use Compound meshing constraints instead"); + $$.Type = 0; + $$.Num = 0; } | tCompound GeoEntity123 '(' FExpr ')' tAFFECT ListOfDouble tSTRING '{' RecursiveListOfListOfDouble '}' tEND { - // Particular case only for dim 2 (Surface) - if ($2 == 2) { - int num = (int)$4; - std::vector<int> tags; ListOfDouble2Vector($7, tags); - std::vector<int> bndTags[4]; - for(int i = 0; i < List_Nbr($10); i++){ - if(i < 4) - ListOfDouble2Vector(*(List_T**)List_Pointer($10, i), bndTags[i]); - else - break; - } - bool r = GModel::current()->getGEOInternals()->addCompoundSurface - (num, tags, bndTags); - if(!r) yymsg(0, "Could not add compound surface"); - List_Delete($7); - Free($8); - for (int i = 0; i < List_Nbr($10); i++) - List_Delete(*(List_T**)List_Pointer($10, i)); - List_Delete($10); - $$.Type = MSH_SURF_COMPOUND; - $$.Num = num; - } - else { - yymsg(0, "GeoEntity dim out of range [2,2]"); - } + yymsg(0, "Compounds entities are deprecated: use Compound meshing constraints instead"); + $$.Type = 0; + $$.Num = 0; } | tPhysical GeoEntity { @@ -3370,10 +3324,6 @@ Command : { GModel::current()->createTopologyFromMesh(); } - | tCreateTopologyNoHoles tEND - { - GModel::current()->createTopologyFromMesh(1); - } | tRefineMesh tEND { if(GModel::current()->getOCCInternals() && diff --git a/Parser/Gmsh.yy.cpp b/Parser/Gmsh.yy.cpp index 77982f41c5486caf1013eeac490273cda745ec2d..6e63ce75af4e5401cd6aa832661d85a6fcff6d0a 100644 --- a/Parser/Gmsh.yy.cpp +++ b/Parser/Gmsh.yy.cpp @@ -380,8 +380,8 @@ static void yy_fatal_error (yyconst char msg[] ); *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 256 -#define YY_END_OF_BUFFER 257 +#define YY_NUM_RULES 255 +#define YY_END_OF_BUFFER 256 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -389,150 +389,150 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[1299] = +static yyconst flex_int16_t yy_accept[1292] = { 0, - 0, 0, 257, 255, 1, 1, 255, 5, 255, 6, - 255, 255, 255, 255, 255, 250, 21, 2, 255, 16, - 255, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 255, 29, 25, 19, 26, - 17, 27, 18, 0, 252, 3, 4, 20, 251, 250, - 0, 23, 33, 30, 28, 31, 32, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 141, 142, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 174, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 228, 229, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 24, 22, 0, - 251, 0, 0, 253, 254, 35, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 53, 254, 254, 254, 254, 254, 254, 254, 254, 254, - - 254, 254, 254, 82, 84, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 112, 254, 254, 254, 254, 254, 254, 254, - 254, 122, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 152, - 254, 254, 254, 254, 254, 254, 163, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 195, 254, 254, 254, 254, 204, 254, 254, 254, 254, - 254, 254, 213, 254, 254, 254, 254, 231, 254, 254, - - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 0, 252, 0, 0, 251, 254, - 254, 37, 254, 254, 254, 254, 254, 254, 254, 47, - 48, 254, 254, 254, 254, 254, 254, 65, 254, 254, - 68, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 79, 254, 254, 83, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 98, 99, 254, 104, 254, 254, 254, - 254, 254, 111, 254, 114, 254, 254, 254, 118, 254, - 254, 121, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 136, 137, 254, 254, 254, 254, 254, 254, 254, - - 254, 254, 149, 150, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 183, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 203, 205, 254, 254, 254, 254, - 254, 212, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 230, 232, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 249, - 10, 15, 9, 8, 254, 12, 14, 0, 251, 34, - 254, 254, 254, 40, 254, 254, 254, 254, 49, 254, - - 51, 254, 54, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 75, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 107, 108, 254, 254, 254, 115, 254, 254, 254, 120, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 139, 254, 254, 144, 254, 254, 254, 254, 254, 153, - 254, 254, 254, 254, 159, 254, 254, 254, 254, 254, - 254, 167, 254, 170, 254, 254, 254, 175, 254, 177, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 193, 194, 254, 254, 254, 254, 254, 254, - - 254, 206, 254, 254, 254, 210, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 237, 238, 254, 254, 254, 254, - 254, 246, 254, 248, 11, 254, 13, 254, 254, 39, - 254, 43, 42, 44, 45, 254, 52, 254, 254, 254, - 254, 254, 254, 71, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 94, 95, 254, - 254, 254, 254, 105, 106, 254, 110, 254, 254, 117, - 254, 254, 254, 254, 254, 128, 254, 254, 254, 254, - 254, 254, 254, 254, 145, 146, 254, 254, 254, 254, - - 254, 254, 254, 160, 254, 162, 254, 254, 254, 254, - 254, 254, 254, 176, 254, 179, 254, 254, 254, 254, - 254, 254, 254, 190, 254, 192, 254, 254, 254, 254, - 254, 254, 254, 254, 208, 209, 254, 214, 254, 216, - 254, 218, 254, 254, 254, 222, 254, 224, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 244, - 254, 247, 7, 254, 254, 254, 46, 50, 254, 254, - 254, 254, 69, 254, 254, 254, 254, 254, 77, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 97, 100, 254, 254, 254, 254, 113, 254, 254, 254, - - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 180, 254, 254, 254, 254, 254, 254, 191, 254, 254, - 254, 254, 254, 254, 254, 254, 211, 254, 217, 254, - 254, 254, 254, 225, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 66, 254, 254, 72, - 254, 254, 254, 78, 254, 254, 254, 254, 89, 254, - 254, 254, 254, 254, 101, 254, 103, 254, 254, 254, - - 123, 254, 254, 254, 254, 254, 254, 254, 134, 254, - 138, 254, 254, 147, 148, 254, 154, 254, 157, 158, - 254, 254, 254, 166, 254, 254, 254, 172, 173, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 207, 254, 254, 254, 254, - 254, 226, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 38, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 73, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 102, - 109, 254, 254, 254, 254, 254, 127, 129, 131, 132, - - 254, 254, 143, 254, 155, 254, 254, 254, 254, 169, - 254, 254, 254, 254, 254, 185, 186, 187, 254, 254, - 254, 254, 254, 199, 254, 201, 254, 215, 219, 254, - 254, 254, 227, 233, 254, 254, 254, 254, 254, 254, - 242, 254, 245, 254, 254, 254, 254, 57, 254, 254, - 254, 254, 254, 254, 254, 67, 254, 74, 76, 254, - 254, 254, 87, 254, 254, 254, 254, 254, 116, 254, - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 164, 254, 254, 171, 254, 254, 254, 254, 188, 254, - 254, 197, 198, 254, 254, 254, 221, 254, 254, 235, - - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 60, 254, 254, 254, 64, 254, 80, 81, 254, - 254, 254, 254, 254, 93, 254, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 156, 254, 254, 254, 178, - 254, 254, 254, 254, 254, 254, 254, 220, 254, 254, - 254, 239, 254, 241, 254, 36, 254, 254, 254, 254, - 254, 254, 254, 63, 254, 254, 254, 254, 91, 92, - 96, 254, 254, 254, 254, 130, 254, 254, 254, 151, - 254, 165, 168, 254, 254, 254, 189, 254, 200, 254, - 223, 254, 236, 254, 254, 254, 254, 56, 254, 254, - - 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 254, 254, 161, 254, 254, 254, 254, 202, 254, - 240, 254, 254, 254, 254, 254, 254, 62, 70, 85, - 254, 90, 254, 254, 254, 254, 133, 254, 254, 254, - 254, 184, 196, 234, 254, 254, 254, 254, 254, 254, - 254, 254, 119, 254, 254, 254, 254, 254, 181, 254, - 254, 41, 55, 254, 59, 254, 254, 88, 254, 254, - 254, 254, 254, 254, 243, 58, 254, 254, 254, 254, - 254, 254, 254, 182, 254, 254, 124, 125, 126, 135, - 254, 61, 254, 254, 254, 140, 86, 0 + 0, 0, 256, 254, 1, 1, 254, 5, 254, 6, + 254, 254, 254, 254, 254, 249, 21, 2, 254, 16, + 254, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 254, 29, 25, 19, 26, + 17, 27, 18, 0, 251, 3, 4, 20, 250, 249, + 0, 23, 33, 30, 28, 31, 32, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 140, 141, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 173, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 227, 228, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 24, 22, 0, + 250, 0, 0, 252, 253, 35, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 53, 253, 253, 253, 253, 253, 253, 253, 253, 253, + + 253, 253, 253, 82, 84, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 111, 253, 253, 253, 253, 253, 253, 253, + 253, 121, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 151, + 253, 253, 253, 253, 253, 253, 162, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 194, 253, 253, 253, 253, 203, 253, 253, 253, 253, + 253, 253, 212, 253, 253, 253, 253, 230, 253, 253, + + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 0, 251, 0, 0, 250, 253, + 253, 37, 253, 253, 253, 253, 253, 253, 253, 47, + 48, 253, 253, 253, 253, 253, 253, 65, 253, 253, + 68, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 79, 253, 253, 83, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 97, 98, 253, 103, 253, 253, 253, + 253, 253, 110, 253, 113, 253, 253, 253, 117, 253, + 253, 120, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 135, 136, 253, 253, 253, 253, 253, 253, 253, + + 253, 253, 148, 149, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 182, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 202, 204, 253, 253, 253, 253, + 253, 211, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 229, 231, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 248, + 10, 15, 9, 8, 253, 12, 14, 0, 250, 34, + 253, 253, 253, 40, 253, 253, 253, 253, 49, 253, + + 51, 253, 54, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 75, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 106, 107, 253, 253, 253, 114, 253, 253, 253, 119, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 138, 253, 253, 143, 253, 253, 253, 253, 253, 152, + 253, 253, 253, 253, 158, 253, 253, 253, 253, 253, + 253, 166, 253, 169, 253, 253, 253, 174, 253, 176, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 192, 193, 253, 253, 253, 253, 253, 253, + + 253, 205, 253, 253, 253, 209, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 236, 237, 253, 253, 253, 253, + 253, 245, 253, 247, 11, 253, 13, 253, 253, 39, + 253, 43, 42, 44, 45, 253, 52, 253, 253, 253, + 253, 253, 253, 71, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 93, 94, 253, + 253, 253, 253, 104, 105, 253, 109, 253, 253, 116, + 253, 253, 253, 253, 253, 127, 253, 253, 253, 253, + 253, 253, 253, 253, 144, 145, 253, 253, 253, 253, + + 253, 253, 253, 159, 253, 161, 253, 253, 253, 253, + 253, 253, 253, 175, 253, 178, 253, 253, 253, 253, + 253, 253, 253, 189, 253, 191, 253, 253, 253, 253, + 253, 253, 253, 253, 207, 208, 253, 213, 253, 215, + 253, 217, 253, 253, 253, 221, 253, 223, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 243, + 253, 246, 7, 253, 253, 253, 46, 50, 253, 253, + 253, 253, 69, 253, 253, 253, 253, 253, 77, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 96, 99, 253, 253, 253, 253, 112, 253, 253, 253, + + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 179, 253, 253, 253, 253, 253, 253, 190, 253, 253, + 253, 253, 253, 253, 253, 253, 210, 253, 216, 253, + 253, 253, 253, 224, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 66, 253, 253, 72, + 253, 253, 253, 78, 253, 253, 253, 253, 88, 253, + 253, 253, 253, 253, 100, 253, 102, 253, 253, 253, + + 122, 253, 253, 253, 253, 253, 253, 253, 133, 253, + 137, 253, 253, 146, 147, 253, 153, 253, 156, 157, + 253, 253, 253, 165, 253, 253, 253, 171, 172, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 206, 253, 253, 253, 253, + 253, 225, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 38, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 73, 253, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 101, + 108, 253, 253, 253, 253, 253, 126, 128, 130, 131, + + 253, 253, 142, 253, 154, 253, 253, 253, 253, 168, + 253, 253, 253, 253, 253, 184, 185, 186, 253, 253, + 253, 253, 253, 198, 253, 200, 253, 214, 218, 253, + 253, 253, 226, 232, 253, 253, 253, 253, 253, 253, + 241, 253, 244, 253, 253, 253, 253, 57, 253, 253, + 253, 253, 253, 253, 253, 67, 253, 74, 76, 253, + 253, 253, 86, 253, 253, 253, 253, 253, 115, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 163, 253, 253, 170, 253, 253, 253, 253, 187, 253, + 253, 196, 197, 253, 253, 253, 220, 253, 253, 234, + + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 60, 253, 253, 253, 64, 253, 80, 81, 253, + 253, 253, 253, 253, 92, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 155, 253, 253, 253, 177, + 253, 253, 253, 253, 253, 253, 253, 219, 253, 253, + 253, 238, 253, 240, 253, 36, 253, 253, 253, 253, + 253, 253, 253, 63, 253, 253, 253, 253, 90, 91, + 95, 253, 253, 253, 253, 129, 253, 253, 253, 150, + 253, 164, 167, 253, 253, 253, 188, 253, 199, 253, + 222, 253, 235, 253, 253, 253, 253, 56, 253, 253, + + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 160, 253, 253, 253, 253, 201, 253, + 239, 253, 253, 253, 253, 253, 253, 62, 70, 85, + 253, 89, 253, 253, 253, 253, 132, 253, 253, 253, + 253, 183, 195, 233, 253, 253, 253, 253, 253, 253, + 253, 118, 253, 253, 253, 253, 253, 180, 253, 253, + 41, 55, 253, 59, 253, 87, 253, 253, 253, 253, + 253, 253, 242, 58, 253, 253, 253, 253, 253, 253, + 181, 253, 123, 124, 125, 134, 253, 61, 253, 139, + 0 } ; @@ -580,84 +580,84 @@ static yyconst flex_int32_t yy_meta[74] = 2, 2, 1 } ; -static yyconst flex_int16_t yy_base[1300] = +static yyconst flex_int16_t yy_base[1293] = { 0, - 0, 0, 1428, 1429, 1429, 1429, 1406, 1429, 1420, 1429, - 1404, 65, 66, 64, 76, 78, 1406, 1429, 62, 1402, + 0, 0, 1421, 1422, 1422, 1422, 1399, 1422, 1413, 1422, + 1397, 65, 66, 64, 76, 78, 1399, 1422, 62, 1395, 77, 51, 62, 70, 55, 69, 87, 103, 86, 108, - 0, 1362, 104, 111, 125, 46, 123, 1354, 122, 178, - 151, 126, 1359, 56, 1367, 1345, 1429, 1429, 1429, 1429, - 1429, 1429, 1429, 1406, 194, 1429, 1429, 1429, 237, 244, - 209, 1429, 1429, 1429, 1429, 1429, 1429, 0, 63, 1355, - 1367, 1361, 1357, 1350, 1361, 1354, 1361, 1346, 24, 1346, - 134, 92, 1350, 1357, 1340, 214, 1336, 1350, 1337, 1342, - 144, 219, 1351, 111, 1347, 1333, 1346, 134, 1346, 210, - - 1333, 1332, 1328, 1331, 1349, 119, 1324, 1337, 155, 1325, - 1344, 0, 1319, 1323, 1312, 167, 178, 151, 1351, 1331, - 183, 1329, 1338, 1319, 1308, 1312, 1323, 1323, 1309, 1308, - 1300, 0, 199, 95, 1314, 1321, 1308, 232, 150, 1309, - 1330, 1317, 1298, 233, 1303, 1306, 1300, 233, 1296, 1295, - 1294, 172, 0, 0, 1322, 1296, 222, 237, 244, 1307, - 248, 1292, 1297, 1294, 1300, 1286, 1280, 1429, 1429, 302, - 307, 316, 322, 327, 1284, 1286, 1281, 1283, 1288, 1295, - 1290, 261, 1281, 1280, 1281, 1272, 1281, 1286, 1277, 1274, - 0, 1275, 204, 1274, 250, 1281, 1278, 293, 1268, 298, - - 1276, 1263, 1255, 1270, 0, 1276, 1259, 1266, 1265, 1268, - 1267, 1270, 1281, 1280, 1258, 1245, 1257, 1260, 318, 1250, - 1252, 240, 0, 1245, 1243, 1249, 255, 1255, 1265, 1243, - 1252, 0, 1252, 1271, 1273, 325, 1244, 1246, 1245, 1235, - 1234, 1267, 1241, 1226, 1239, 1236, 1237, 310, 1222, 314, - 1235, 1239, 1221, 1223, 1228, 1215, 0, 1229, 1245, 1230, - 1220, 1225, 1228, 1219, 1209, 1213, 1218, 1211, 1222, 1209, - 1217, 1216, 297, 1210, 1204, 1197, 1211, 1214, 1201, 1208, - 0, 1201, 340, 1196, 1188, 1201, 1204, 1193, 1201, 1196, - 1195, 1184, 345, 1196, 1189, 1197, 1219, 1190, 1178, 1177, - - 1192, 1174, 1192, 1172, 1190, 1177, 1184, 1172, 1182, 1173, - 1165, 1177, 1178, 334, 390, 400, 409, 414, 419, 1163, - 1170, 0, 1161, 1166, 1160, 1164, 1162, 1166, 1173, 0, - 1205, 1163, 1162, 1165, 1159, 1163, 1163, 0, 1153, 1145, - 0, 1158, 1162, 1151, 1172, 1143, 1147, 1141, 1148, 1142, - 0, 1151, 1164, 0, 1134, 1147, 1138, 1137, 1136, 1129, - 1128, 1145, 1144, 0, 0, 1129, 1159, 1128, 1135, 1123, - 1130, 1119, 0, 1117, 0, 1132, 1155, 1129, 0, 1128, - 1115, 0, 1112, 1130, 1116, 1115, 1113, 1106, 1106, 1123, - 1143, 0, 0, 1111, 1102, 1127, 1102, 1100, 1100, 1097, - - 1104, 1099, 0, 1132, 1146, 1096, 1093, 316, 1095, 1091, - 1131, 1095, 330, 1091, 1086, 1102, 1085, 1089, 1086, 1090, - 1093, 1088, 1077, 1078, 1075, 325, 0, 1081, 1091, 1074, - 1077, 1086, 1071, 1070, 1067, 1081, 1080, 1078, 1074, 1080, - 1060, 1078, 1059, 1072, 0, 0, 1071, 1056, 1057, 314, - 1060, 0, 389, 1063, 1066, 1053, 1064, 1048, 1054, 1063, - 1064, 1059, 1075, 0, 0, 1075, 1085, 1050, 1065, 1034, - 1039, 1045, 1037, 1048, 1033, 1035, 1044, 1038, 1044, 0, - 0, 0, 1037, 0, 1042, 1035, 0, 425, 436, 0, - 1025, 1056, 1038, 1044, 1037, 1022, 1026, 1025, 0, 1024, - - 0, 1019, 0, 1034, 1025, 1032, 1021, 1026, 1027, 1024, - 1027, 1022, 1012, 1030, 1011, 1003, 1013, 1006, 1015, 1006, - 1014, 1012, 1011, 1010, 1009, 1001, 1000, 328, 1005, 993, - 0, 0, 1005, 990, 1003, 0, 983, 986, 993, 0, - 994, 362, 983, 980, 983, 987, 981, 986, 973, 981, - 0, 1003, 975, 0, 974, 983, 972, 988, 971, 0, - 986, 1008, 984, 975, 0, 959, 971, 967, 961, 965, - 974, 0, 975, 0, 971, 971, 971, 0, 960, 0, - 978, 965, 953, 960, 966, 954, 948, 960, 963, 950, - 944, 956, 0, 0, 973, 958, 955, 945, 939, 938, - - 973, 0, 945, 947, 946, 0, 931, 930, 934, 932, - 933, 932, 939, 385, 941, 935, 922, 937, 920, 924, - 932, 917, 941, 929, 0, 0, 945, 324, 923, 926, - 952, 0, 924, 0, 0, 921, 0, 908, 921, 0, - 916, 0, 0, 0, 956, 918, 0, 909, 908, 903, - 908, 901, 898, 0, 904, 902, 903, 912, 907, 898, - 897, 890, 913, 888, 901, 420, 888, 0, 0, 899, - 898, 402, 893, 0, 0, 892, 0, 895, 890, 0, - 897, 883, 434, 920, 886, 0, 891, 891, 883, 871, - 885, 882, 898, 882, 0, 0, 881, 882, 870, 880, + 0, 1355, 104, 111, 125, 46, 123, 1347, 122, 178, + 151, 126, 1352, 56, 1360, 1338, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1399, 194, 1422, 1422, 1422, 237, 244, + 209, 1422, 1422, 1422, 1422, 1422, 1422, 0, 63, 1348, + 1360, 1354, 1350, 1343, 1354, 1347, 1354, 1339, 24, 1339, + 134, 92, 1343, 1350, 1333, 214, 1329, 1343, 1330, 1335, + 144, 219, 1344, 111, 1340, 1326, 1339, 134, 1339, 210, + + 1326, 1325, 1321, 1324, 1342, 119, 1317, 1330, 155, 1318, + 1337, 0, 1312, 1316, 1305, 167, 178, 151, 1344, 1324, + 183, 1322, 1331, 1312, 1301, 1305, 1316, 1316, 1302, 1301, + 1293, 0, 199, 95, 1307, 1314, 1301, 232, 150, 1302, + 1323, 1310, 1291, 233, 1296, 1299, 1293, 233, 1289, 1288, + 1287, 172, 0, 0, 1315, 1289, 222, 237, 244, 1300, + 248, 1285, 1290, 1287, 1293, 1279, 1273, 1422, 1422, 302, + 307, 316, 322, 327, 1277, 1279, 1274, 1276, 1281, 1288, + 1283, 261, 1274, 1273, 1274, 1265, 1274, 1279, 1270, 1267, + 0, 1268, 204, 1267, 250, 1274, 1271, 293, 1261, 298, + + 1269, 1256, 1248, 1263, 0, 1269, 1252, 1259, 1258, 1261, + 1260, 1263, 1274, 1273, 1251, 1238, 1250, 1253, 318, 1243, + 1245, 240, 0, 1238, 1236, 1242, 255, 1248, 1258, 1236, + 1245, 0, 1245, 1264, 1266, 325, 1237, 1239, 1238, 1228, + 1227, 1260, 1234, 1219, 1232, 1229, 1230, 310, 1215, 314, + 1228, 1232, 1214, 1216, 1221, 1208, 0, 1222, 1238, 1223, + 1213, 1218, 1221, 1212, 1202, 1206, 1211, 1204, 1215, 1202, + 1210, 1209, 297, 1203, 1197, 1190, 1204, 1207, 1194, 1201, + 0, 1194, 340, 1189, 1181, 1194, 1197, 1186, 1194, 1189, + 1188, 1177, 345, 1189, 1182, 1190, 1212, 1183, 1171, 1170, + + 1185, 1167, 1185, 1165, 1183, 1170, 1177, 1165, 1175, 1166, + 1158, 1170, 1171, 334, 390, 400, 409, 414, 419, 1156, + 1163, 0, 1154, 1159, 1153, 1157, 1155, 1159, 1166, 0, + 1198, 1156, 1155, 1158, 1152, 1156, 1156, 0, 1146, 1138, + 0, 1151, 1155, 1144, 1165, 1136, 1140, 1134, 1141, 1135, + 0, 1144, 1157, 0, 1127, 1140, 1131, 1130, 1129, 1122, + 1121, 1138, 1137, 0, 0, 1122, 1152, 1121, 1128, 1116, + 1123, 1112, 0, 1110, 0, 1125, 1148, 1122, 0, 1121, + 1108, 0, 1105, 1123, 1109, 1108, 1106, 1099, 1099, 1116, + 1136, 0, 0, 1104, 1095, 1120, 1095, 1093, 1093, 1090, + + 1097, 1092, 0, 1125, 1139, 1089, 1086, 316, 1088, 1084, + 1124, 1088, 330, 1084, 1079, 1095, 1078, 1082, 1079, 1083, + 1086, 1081, 1070, 1071, 1068, 325, 0, 1074, 1084, 1067, + 1070, 1079, 1064, 1063, 1060, 1074, 1073, 1071, 1067, 1073, + 1053, 1071, 1052, 1065, 0, 0, 1064, 1049, 1050, 314, + 1053, 0, 389, 1056, 1059, 1046, 1057, 1041, 1047, 1056, + 1057, 1052, 1068, 0, 0, 1068, 1078, 1043, 1058, 1027, + 1032, 1038, 1030, 1041, 1026, 1028, 1037, 1031, 1037, 0, + 0, 0, 1030, 0, 1035, 1028, 0, 425, 436, 0, + 1018, 1049, 1031, 1037, 1030, 1015, 1019, 1018, 0, 1017, + + 0, 1012, 0, 1027, 1018, 1025, 1014, 1019, 1020, 1017, + 1020, 1015, 1005, 1023, 1004, 996, 1006, 999, 1008, 999, + 1007, 1005, 1004, 1003, 1002, 994, 993, 328, 998, 986, + 0, 0, 998, 983, 996, 0, 976, 979, 986, 0, + 987, 362, 976, 973, 976, 980, 974, 979, 966, 974, + 0, 996, 968, 0, 967, 976, 965, 981, 964, 0, + 979, 1001, 977, 968, 0, 952, 964, 960, 954, 958, + 967, 0, 968, 0, 964, 964, 964, 0, 953, 0, + 971, 958, 946, 953, 959, 947, 941, 953, 956, 943, + 937, 949, 0, 0, 966, 951, 948, 938, 932, 931, + + 966, 0, 938, 940, 939, 0, 924, 923, 927, 925, + 926, 925, 932, 385, 934, 928, 915, 930, 913, 917, + 925, 910, 934, 922, 0, 0, 938, 324, 916, 919, + 945, 0, 917, 0, 0, 914, 0, 901, 914, 0, + 909, 0, 0, 0, 949, 911, 0, 902, 901, 896, + 901, 894, 891, 0, 897, 895, 896, 905, 900, 891, + 890, 883, 906, 881, 894, 420, 881, 0, 0, 892, + 891, 402, 886, 0, 0, 885, 0, 888, 883, 0, + 890, 876, 434, 913, 879, 0, 884, 884, 876, 864, + 878, 875, 891, 875, 0, 0, 874, 875, 863, 873, 37, 61, 92, 0, 140, 0, 165, 198, 215, 432, 261, 292, 302, 0, 313, 0, 332, 340, 412, 341, @@ -716,165 +716,165 @@ static yyconst flex_int16_t yy_base[1300] = 805, 798, 809, 789, 800, 796, 797, 824, 825, 826, 815, 816, 822, 0, 805, 820, 808, 810, 0, 810, - 0, 828, 817, 828, 819, 814, 831, 0, 0, 846, - 819, 0, 829, 844, 845, 846, 0, 852, 848, 825, - 827, 0, 0, 0, 832, 828, 842, 845, 831, 831, - 837, 828, 0, 869, 870, 871, 855, 879, 0, 839, - 840, 0, 0, 855, 0, 852, 879, 0, 873, 874, - 875, 854, 884, 850, 0, 0, 855, 856, 882, 883, - 884, 869, 895, 0, 863, 866, 0, 0, 0, 0, - 890, 0, 874, 900, 863, 0, 0, 1429, 927 + 0, 828, 817, 828, 819, 814, 831, 0, 0, 0, + 818, 0, 828, 843, 844, 845, 0, 851, 847, 824, + 826, 0, 0, 0, 831, 827, 841, 844, 830, 830, + 826, 0, 867, 868, 869, 853, 877, 0, 837, 838, + 0, 0, 853, 0, 850, 0, 870, 871, 872, 851, + 881, 847, 0, 0, 852, 878, 879, 880, 865, 891, + 0, 859, 0, 0, 0, 0, 885, 0, 894, 0, + 1422, 920 } ; -static yyconst flex_int16_t yy_def[1300] = +static yyconst flex_int16_t yy_def[1293] = { 0, - 1298, 1, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, - 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, - 1298, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1298, 1298, 1298, 1298, 1298, - 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, - 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1298, 1298, 1298, - 1298, 1298, 1298, 1298, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1298, 1298, 1298, 1298, 1298, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1298, 1298, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, 1299, - 1299, 1299, 1299, 1299, 1299, 1299, 1299, 0, 1298 + 1291, 1, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1291, 1291, 1291, 1291, 1291, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1291, 1291, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, 1292, + 0, 1291 } ; -static yyconst flex_int16_t yy_nxt[1503] = +static yyconst flex_int16_t yy_nxt[1496] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 17, 18, 19, @@ -977,74 +977,73 @@ static yyconst flex_int16_t yy_nxt[1503] = 1270, 1271, 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, - 1290, 1291, 1292, 1293, 1294, 1295, 1296, 1297, 68, 816, - 815, 814, 813, 812, 811, 810, 809, 808, 807, 806, - 805, 804, 803, 800, 799, 798, 797, 796, 795, 791, - 790, 789, 785, 784, 783, 782, 781, 780, 779, 778, - 777, 776, 775, 774, 773, 772, 771, 770, 769, 768, - 767, 766, 765, 764, 763, 762, 761, 760, 759, 756, - 755, 754, 753, 752, 751, 750, 749, 748, 747, 746, - 743, 742, 741, 740, 739, 738, 737, 736, 735, 734, - - 733, 732, 731, 730, 729, 728, 727, 726, 725, 724, - 723, 722, 721, 720, 719, 718, 717, 716, 715, 714, - 713, 712, 711, 710, 709, 708, 707, 706, 705, 704, - 703, 702, 701, 700, 699, 698, 697, 696, 695, 694, - 693, 692, 691, 690, 689, 688, 687, 686, 685, 682, - 681, 680, 679, 678, 677, 676, 675, 674, 671, 670, - 669, 668, 667, 666, 665, 664, 663, 662, 661, 660, - 659, 658, 657, 656, 655, 654, 653, 652, 651, 650, - 649, 648, 647, 646, 645, 644, 643, 642, 641, 640, - 639, 638, 637, 636, 635, 634, 633, 632, 631, 630, - - 629, 628, 627, 626, 625, 624, 623, 622, 621, 620, - 619, 618, 617, 616, 615, 614, 613, 612, 611, 607, - 604, 603, 602, 601, 600, 599, 598, 597, 596, 595, - 594, 593, 592, 591, 590, 589, 588, 587, 586, 585, - 582, 581, 580, 579, 578, 577, 576, 575, 574, 573, - 572, 571, 568, 567, 566, 565, 562, 561, 560, 559, - 558, 557, 556, 555, 554, 553, 552, 551, 550, 549, - 548, 547, 546, 545, 544, 543, 542, 541, 540, 539, - 538, 537, 536, 535, 534, 533, 532, 531, 530, 529, - 528, 527, 526, 525, 524, 523, 522, 521, 520, 519, + 1290, 68, 816, 815, 814, 813, 812, 811, 810, 809, + 808, 807, 806, 805, 804, 803, 800, 799, 798, 797, + 796, 795, 791, 790, 789, 785, 784, 783, 782, 781, + 780, 779, 778, 777, 776, 775, 774, 773, 772, 771, + 770, 769, 768, 767, 766, 765, 764, 763, 762, 761, + 760, 759, 756, 755, 754, 753, 752, 751, 750, 749, + 748, 747, 746, 743, 742, 741, 740, 739, 738, 737, + 736, 735, 734, 733, 732, 731, 730, 729, 728, 727, + + 726, 725, 724, 723, 722, 721, 720, 719, 718, 717, + 716, 715, 714, 713, 712, 711, 710, 709, 708, 707, + 706, 705, 704, 703, 702, 701, 700, 699, 698, 697, + 696, 695, 694, 693, 692, 691, 690, 689, 688, 687, + 686, 685, 682, 681, 680, 679, 678, 677, 676, 675, + 674, 671, 670, 669, 668, 667, 666, 665, 664, 663, + 662, 661, 660, 659, 658, 657, 656, 655, 654, 653, + 652, 651, 650, 649, 648, 647, 646, 645, 644, 643, + 642, 641, 640, 639, 638, 637, 636, 635, 634, 633, + 632, 631, 630, 629, 628, 627, 626, 625, 624, 623, + + 622, 621, 620, 619, 618, 617, 616, 615, 614, 613, + 612, 611, 607, 604, 603, 602, 601, 600, 599, 598, + 597, 596, 595, 594, 593, 592, 591, 590, 589, 588, + 587, 586, 585, 582, 581, 580, 579, 578, 577, 576, + 575, 574, 573, 572, 571, 568, 567, 566, 565, 562, + 561, 560, 559, 558, 557, 556, 555, 554, 553, 552, + 551, 550, 549, 548, 547, 546, 545, 544, 543, 542, + 541, 540, 539, 538, 537, 536, 535, 534, 533, 532, + 531, 530, 529, 528, 527, 526, 525, 524, 523, 522, + 521, 520, 519, 518, 517, 516, 515, 514, 513, 512, + + 511, 510, 509, 508, 507, 506, 505, 504, 503, 502, + 501, 500, 499, 498, 497, 496, 495, 494, 493, 492, + 491, 490, 480, 479, 478, 477, 476, 475, 474, 473, + 472, 471, 470, 469, 468, 467, 466, 465, 464, 463, + 462, 461, 452, 451, 450, 449, 448, 447, 446, 445, + 444, 438, 437, 436, 435, 434, 433, 432, 431, 427, + 426, 425, 424, 423, 422, 421, 420, 419, 418, 417, + 416, 415, 414, 413, 412, 411, 410, 409, 408, 407, + 404, 401, 400, 399, 398, 397, 396, 395, 394, 393, + 392, 391, 385, 384, 383, 382, 381, 380, 379, 376, + + 375, 374, 371, 370, 367, 366, 365, 364, 363, 362, + 361, 360, 359, 358, 357, 356, 355, 354, 353, 352, + 351, 348, 345, 344, 341, 338, 337, 336, 335, 334, + 333, 332, 331, 330, 326, 325, 324, 323, 322, 321, + 320, 314, 313, 312, 311, 310, 309, 306, 298, 297, + 294, 293, 292, 288, 287, 286, 283, 282, 281, 280, + 272, 271, 270, 265, 264, 263, 262, 261, 260, 259, + 258, 257, 256, 253, 252, 245, 244, 243, 242, 241, + 238, 237, 234, 233, 232, 231, 230, 225, 221, 220, + 219, 216, 208, 207, 206, 205, 196, 195, 194, 188, + + 185, 184, 183, 182, 181, 180, 179, 178, 177, 169, + 168, 167, 164, 136, 114, 65, 62, 49, 48, 47, + 1291, 3, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291 - 518, 517, 516, 515, 514, 513, 512, 511, 510, 509, - 508, 507, 506, 505, 504, 503, 502, 501, 500, 499, - 498, 497, 496, 495, 494, 493, 492, 491, 490, 480, - 479, 478, 477, 476, 475, 474, 473, 472, 471, 470, - 469, 468, 467, 466, 465, 464, 463, 462, 461, 452, - 451, 450, 449, 448, 447, 446, 445, 444, 438, 437, - 436, 435, 434, 433, 432, 431, 427, 426, 425, 424, - 423, 422, 421, 420, 419, 418, 417, 416, 415, 414, - 413, 412, 411, 410, 409, 408, 407, 404, 401, 400, - 399, 398, 397, 396, 395, 394, 393, 392, 391, 385, - - 384, 383, 382, 381, 380, 379, 376, 375, 374, 371, - 370, 367, 366, 365, 364, 363, 362, 361, 360, 359, - 358, 357, 356, 355, 354, 353, 352, 351, 348, 345, - 344, 341, 338, 337, 336, 335, 334, 333, 332, 331, - 330, 326, 325, 324, 323, 322, 321, 320, 314, 313, - 312, 311, 310, 309, 306, 298, 297, 294, 293, 292, - 288, 287, 286, 283, 282, 281, 280, 272, 271, 270, - 265, 264, 263, 262, 261, 260, 259, 258, 257, 256, - 253, 252, 245, 244, 243, 242, 241, 238, 237, 234, - 233, 232, 231, 230, 225, 221, 220, 219, 216, 208, - - 207, 206, 205, 196, 195, 194, 188, 185, 184, 183, - 182, 181, 180, 179, 178, 177, 169, 168, 167, 164, - 136, 114, 65, 62, 49, 48, 47, 1298, 3, 1298, - 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, - 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, - 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, - 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, - 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, - 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, - 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, - - 1298, 1298 } ; -static yyconst flex_int16_t yy_chk[1503] = +static yyconst flex_int16_t yy_chk[1496] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -1142,76 +1141,75 @@ static yyconst flex_int16_t yy_chk[1503] = 1194, 1195, 1196, 1197, 1199, 1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1185, 1215, 1216, 1217, 1218, 1220, 1222, 1223, 1224, 1225, 1226, - 1227, 1230, 1231, 1233, 1234, 1235, 1236, 1238, 1239, 1240, - 1241, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1254, - - 1255, 1256, 1257, 1258, 1260, 1261, 1264, 1266, 1267, 1269, - 1270, 1271, 1272, 1273, 1274, 1277, 1278, 1279, 1280, 1281, - 1282, 1283, 1285, 1286, 1291, 1293, 1294, 1295, 1299, 700, - 699, 698, 697, 694, 693, 692, 691, 690, 689, 688, - 687, 685, 684, 682, 681, 679, 678, 676, 673, 671, - 670, 667, 665, 664, 663, 662, 661, 660, 659, 658, - 657, 656, 655, 653, 652, 651, 650, 649, 648, 646, - 645, 641, 639, 638, 636, 633, 631, 630, 629, 627, - 624, 623, 622, 621, 620, 619, 618, 617, 616, 615, - 613, 612, 611, 610, 609, 608, 607, 605, 604, 603, - - 601, 600, 599, 598, 597, 596, 595, 592, 591, 590, - 589, 588, 587, 586, 585, 584, 583, 582, 581, 579, - 577, 576, 575, 573, 571, 570, 569, 568, 567, 566, - 564, 563, 562, 561, 559, 558, 557, 556, 555, 553, - 552, 550, 549, 548, 547, 546, 545, 544, 543, 541, - 539, 538, 537, 535, 534, 533, 530, 529, 527, 526, - 525, 524, 523, 522, 521, 520, 519, 518, 517, 516, - 515, 514, 513, 512, 511, 510, 509, 508, 507, 506, - 505, 504, 502, 500, 498, 497, 496, 495, 494, 493, - 492, 491, 486, 485, 483, 479, 478, 477, 476, 475, - - 474, 473, 472, 471, 470, 469, 468, 467, 466, 463, - 462, 461, 460, 459, 458, 457, 456, 455, 454, 451, - 449, 448, 447, 444, 443, 442, 441, 440, 439, 438, - 437, 436, 435, 434, 433, 432, 431, 430, 429, 428, - 425, 424, 423, 422, 421, 420, 419, 418, 417, 416, - 415, 414, 412, 411, 410, 409, 407, 406, 405, 404, - 402, 401, 400, 399, 398, 397, 396, 395, 394, 391, - 390, 389, 388, 387, 386, 385, 384, 383, 381, 380, - 378, 377, 376, 374, 372, 371, 370, 369, 368, 367, - 366, 363, 362, 361, 360, 359, 358, 357, 356, 355, - - 353, 352, 350, 349, 348, 347, 346, 345, 344, 343, - 342, 340, 339, 337, 336, 335, 334, 333, 332, 331, - 329, 328, 327, 326, 325, 324, 323, 321, 320, 313, - 312, 311, 310, 309, 308, 307, 306, 305, 304, 303, - 302, 301, 300, 299, 298, 297, 296, 295, 294, 292, - 291, 290, 289, 288, 287, 286, 285, 284, 282, 280, - 279, 278, 277, 276, 275, 274, 272, 271, 270, 269, - 268, 267, 266, 265, 264, 263, 262, 261, 260, 259, - 258, 256, 255, 254, 253, 252, 251, 249, 247, 246, - 245, 244, 243, 242, 241, 240, 239, 238, 237, 235, - - 234, 233, 231, 230, 229, 228, 226, 225, 224, 221, - 220, 218, 217, 216, 215, 214, 213, 212, 211, 210, - 209, 208, 207, 206, 204, 203, 202, 201, 199, 197, - 196, 194, 192, 190, 189, 188, 187, 186, 185, 184, - 183, 181, 180, 179, 178, 177, 176, 175, 167, 166, - 165, 164, 163, 162, 160, 156, 155, 151, 150, 149, - 147, 146, 145, 143, 142, 141, 140, 137, 136, 135, - 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, - 120, 119, 115, 114, 113, 111, 110, 108, 107, 105, - 104, 103, 102, 101, 99, 97, 96, 95, 93, 90, - - 89, 88, 87, 85, 84, 83, 80, 78, 77, 76, - 75, 74, 73, 72, 71, 70, 54, 46, 45, 43, - 38, 32, 20, 17, 11, 9, 7, 3, 1298, 1298, - 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, - 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, - 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, - 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, - 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, - 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, - 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, 1298, - - 1298, 1298 + 1227, 1231, 1233, 1234, 1235, 1236, 1238, 1239, 1240, 1241, + 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1253, 1254, 1255, + + 1256, 1257, 1259, 1260, 1263, 1265, 1267, 1268, 1269, 1270, + 1271, 1272, 1275, 1276, 1277, 1278, 1279, 1280, 1282, 1287, + 1289, 1292, 700, 699, 698, 697, 694, 693, 692, 691, + 690, 689, 688, 687, 685, 684, 682, 681, 679, 678, + 676, 673, 671, 670, 667, 665, 664, 663, 662, 661, + 660, 659, 658, 657, 656, 655, 653, 652, 651, 650, + 649, 648, 646, 645, 641, 639, 638, 636, 633, 631, + 630, 629, 627, 624, 623, 622, 621, 620, 619, 618, + 617, 616, 615, 613, 612, 611, 610, 609, 608, 607, + 605, 604, 603, 601, 600, 599, 598, 597, 596, 595, + + 592, 591, 590, 589, 588, 587, 586, 585, 584, 583, + 582, 581, 579, 577, 576, 575, 573, 571, 570, 569, + 568, 567, 566, 564, 563, 562, 561, 559, 558, 557, + 556, 555, 553, 552, 550, 549, 548, 547, 546, 545, + 544, 543, 541, 539, 538, 537, 535, 534, 533, 530, + 529, 527, 526, 525, 524, 523, 522, 521, 520, 519, + 518, 517, 516, 515, 514, 513, 512, 511, 510, 509, + 508, 507, 506, 505, 504, 502, 500, 498, 497, 496, + 495, 494, 493, 492, 491, 486, 485, 483, 479, 478, + 477, 476, 475, 474, 473, 472, 471, 470, 469, 468, + + 467, 466, 463, 462, 461, 460, 459, 458, 457, 456, + 455, 454, 451, 449, 448, 447, 444, 443, 442, 441, + 440, 439, 438, 437, 436, 435, 434, 433, 432, 431, + 430, 429, 428, 425, 424, 423, 422, 421, 420, 419, + 418, 417, 416, 415, 414, 412, 411, 410, 409, 407, + 406, 405, 404, 402, 401, 400, 399, 398, 397, 396, + 395, 394, 391, 390, 389, 388, 387, 386, 385, 384, + 383, 381, 380, 378, 377, 376, 374, 372, 371, 370, + 369, 368, 367, 366, 363, 362, 361, 360, 359, 358, + 357, 356, 355, 353, 352, 350, 349, 348, 347, 346, + + 345, 344, 343, 342, 340, 339, 337, 336, 335, 334, + 333, 332, 331, 329, 328, 327, 326, 325, 324, 323, + 321, 320, 313, 312, 311, 310, 309, 308, 307, 306, + 305, 304, 303, 302, 301, 300, 299, 298, 297, 296, + 295, 294, 292, 291, 290, 289, 288, 287, 286, 285, + 284, 282, 280, 279, 278, 277, 276, 275, 274, 272, + 271, 270, 269, 268, 267, 266, 265, 264, 263, 262, + 261, 260, 259, 258, 256, 255, 254, 253, 252, 251, + 249, 247, 246, 245, 244, 243, 242, 241, 240, 239, + 238, 237, 235, 234, 233, 231, 230, 229, 228, 226, + + 225, 224, 221, 220, 218, 217, 216, 215, 214, 213, + 212, 211, 210, 209, 208, 207, 206, 204, 203, 202, + 201, 199, 197, 196, 194, 192, 190, 189, 188, 187, + 186, 185, 184, 183, 181, 180, 179, 178, 177, 176, + 175, 167, 166, 165, 164, 163, 162, 160, 156, 155, + 151, 150, 149, 147, 146, 145, 143, 142, 141, 140, + 137, 136, 135, 131, 130, 129, 128, 127, 126, 125, + 124, 123, 122, 120, 119, 115, 114, 113, 111, 110, + 108, 107, 105, 104, 103, 102, 101, 99, 97, 96, + 95, 93, 90, 89, 88, 87, 85, 84, 83, 80, + + 78, 77, 76, 75, 74, 73, 72, 71, 70, 54, + 46, 45, 43, 38, 32, 20, 17, 11, 9, 7, + 3, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, + 1291, 1291, 1291, 1291, 1291 + } ; static yy_state_type yy_last_accepting_state; @@ -1298,7 +1296,7 @@ void skipline(void); // versions of flex/bison #define register -#line 1302 "Gmsh.yy.cpp" +#line 1300 "Gmsh.yy.cpp" #define INITIAL 0 @@ -1483,7 +1481,7 @@ YY_DECL #line 79 "Gmsh.l" -#line 1487 "Gmsh.yy.cpp" +#line 1485 "Gmsh.yy.cpp" if ( !(yy_init) ) { @@ -1536,13 +1534,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1299 ) + if ( yy_current_state >= 1292 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 1429 ); + while ( yy_base[yy_current_state] != 1422 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -1995,7 +1993,7 @@ return tCreateTopology; case 86: YY_RULE_SETUP #line 169 "Gmsh.l" -return tCreateTopologyNoHoles; +return tCurrentDirectory; YY_BREAK case 87: YY_RULE_SETUP @@ -2005,62 +2003,62 @@ return tCurrentDirectory; case 88: YY_RULE_SETUP #line 171 "Gmsh.l" -return tCurrentDirectory; +return tCylinder; YY_BREAK case 89: YY_RULE_SETUP -#line 172 "Gmsh.l" -return tCylinder; +#line 173 "Gmsh.l" +return tDefineConstant; YY_BREAK case 90: YY_RULE_SETUP #line 174 "Gmsh.l" -return tDefineConstant; +return tDefineNumber; YY_BREAK case 91: YY_RULE_SETUP #line 175 "Gmsh.l" -return tDefineNumber; +return tDefineString; YY_BREAK case 92: YY_RULE_SETUP #line 176 "Gmsh.l" -return tDefineString; +return tDegenerated; YY_BREAK case 93: YY_RULE_SETUP #line 177 "Gmsh.l" -return tDegenerated; +return tDelete; YY_BREAK case 94: YY_RULE_SETUP #line 178 "Gmsh.l" -return tDelete; +return tDilate; YY_BREAK case 95: YY_RULE_SETUP #line 179 "Gmsh.l" -return tDilate; +return tDimNameSpace; YY_BREAK case 96: YY_RULE_SETUP #line 180 "Gmsh.l" -return tDimNameSpace; +return tDirName; YY_BREAK case 97: YY_RULE_SETUP #line 181 "Gmsh.l" -return tDirName; +return tDisk; YY_BREAK case 98: YY_RULE_SETUP #line 182 "Gmsh.l" -return tDisk; +return tDraw; YY_BREAK case 99: YY_RULE_SETUP -#line 183 "Gmsh.l" -return tDraw; +#line 184 "Gmsh.l" +return tEllipse; YY_BREAK case 100: YY_RULE_SETUP @@ -2070,775 +2068,770 @@ return tEllipse; case 101: YY_RULE_SETUP #line 186 "Gmsh.l" -return tEllipse; +return tEllipsoid; YY_BREAK case 102: YY_RULE_SETUP #line 187 "Gmsh.l" -return tEllipsoid; +return tElliptic; YY_BREAK case 103: YY_RULE_SETUP #line 188 "Gmsh.l" -return tElliptic; +return tElse; YY_BREAK case 104: YY_RULE_SETUP #line 189 "Gmsh.l" -return tElse; +return tElseIf; YY_BREAK case 105: YY_RULE_SETUP #line 190 "Gmsh.l" -return tElseIf; +return tEndFor; YY_BREAK case 106: YY_RULE_SETUP #line 191 "Gmsh.l" -return tEndFor; +return tEndIf; YY_BREAK case 107: YY_RULE_SETUP #line 192 "Gmsh.l" -return tEndIf; +return tError; YY_BREAK case 108: YY_RULE_SETUP #line 193 "Gmsh.l" -return tError; +return tEuclidian; YY_BREAK case 109: YY_RULE_SETUP #line 194 "Gmsh.l" -return tEuclidian; +return tExists; YY_BREAK case 110: YY_RULE_SETUP #line 195 "Gmsh.l" -return tExists; +return tExit; YY_BREAK case 111: YY_RULE_SETUP #line 196 "Gmsh.l" -return tExit; +return tExp; YY_BREAK case 112: YY_RULE_SETUP #line 197 "Gmsh.l" -return tExp; +return tExtrude; YY_BREAK case 113: YY_RULE_SETUP -#line 198 "Gmsh.l" -return tExtrude; +#line 199 "Gmsh.l" +return tFabs; YY_BREAK case 114: YY_RULE_SETUP #line 200 "Gmsh.l" -return tFabs; +return tField; YY_BREAK case 115: YY_RULE_SETUP #line 201 "Gmsh.l" -return tField; +return tFileExists; YY_BREAK case 116: YY_RULE_SETUP #line 202 "Gmsh.l" -return tFileExists; +return tFillet; YY_BREAK case 117: YY_RULE_SETUP #line 203 "Gmsh.l" -return tFillet; +return tFind; YY_BREAK case 118: YY_RULE_SETUP #line 204 "Gmsh.l" -return tFind; +return tFixRelativePath; YY_BREAK case 119: YY_RULE_SETUP #line 205 "Gmsh.l" -return tFixRelativePath; +return tFloor; YY_BREAK case 120: YY_RULE_SETUP #line 206 "Gmsh.l" -return tFloor; +return tFmod; YY_BREAK case 121: YY_RULE_SETUP #line 207 "Gmsh.l" -return tFmod; +return tFor; YY_BREAK case 122: YY_RULE_SETUP #line 208 "Gmsh.l" -return tFor; +return tMacro; YY_BREAK case 123: YY_RULE_SETUP -#line 209 "Gmsh.l" -return tMacro; +#line 210 "Gmsh.l" +return tGMSH_MAJOR_VERSION; YY_BREAK case 124: YY_RULE_SETUP #line 211 "Gmsh.l" -return tGMSH_MAJOR_VERSION; +return tGMSH_MINOR_VERSION; YY_BREAK case 125: YY_RULE_SETUP #line 212 "Gmsh.l" -return tGMSH_MINOR_VERSION; +return tGMSH_PATCH_VERSION; YY_BREAK case 126: YY_RULE_SETUP #line 213 "Gmsh.l" -return tGMSH_PATCH_VERSION; +return tGeoEntity; YY_BREAK case 127: YY_RULE_SETUP #line 214 "Gmsh.l" -return tGeoEntity; +return tGetEnv; YY_BREAK case 128: YY_RULE_SETUP #line 215 "Gmsh.l" -return tGetEnv; +return tGetForced; YY_BREAK case 129: YY_RULE_SETUP #line 216 "Gmsh.l" -return tGetForced; +return tGetForcedStr; YY_BREAK case 130: YY_RULE_SETUP #line 217 "Gmsh.l" -return tGetForcedStr; +return tGetNumber; YY_BREAK case 131: YY_RULE_SETUP #line 218 "Gmsh.l" -return tGetNumber; +return tGetString; YY_BREAK case 132: YY_RULE_SETUP #line 219 "Gmsh.l" -return tGetString; +return tGetStringValue; YY_BREAK case 133: YY_RULE_SETUP #line 220 "Gmsh.l" -return tGetStringValue; +return tGetValue; YY_BREAK case 134: YY_RULE_SETUP #line 221 "Gmsh.l" -return tGetValue; +return tGmshExecutableName; YY_BREAK case 135: YY_RULE_SETUP -#line 222 "Gmsh.l" -return tGmshExecutableName; +#line 223 "Gmsh.l" +return tHide; YY_BREAK case 136: YY_RULE_SETUP #line 224 "Gmsh.l" -return tHide; +return tHole; YY_BREAK case 137: YY_RULE_SETUP #line 225 "Gmsh.l" -return tHole; +return tHomology; YY_BREAK case 138: YY_RULE_SETUP #line 226 "Gmsh.l" -return tHomology; +return tHypot; YY_BREAK case 139: YY_RULE_SETUP -#line 227 "Gmsh.l" -return tHypot; +#line 228 "Gmsh.l" +return tInterpolationScheme; YY_BREAK case 140: YY_RULE_SETUP #line 229 "Gmsh.l" -return tInterpolationScheme; +return tIf; YY_BREAK case 141: YY_RULE_SETUP #line 230 "Gmsh.l" -return tIf; +return tIn; YY_BREAK case 142: YY_RULE_SETUP #line 231 "Gmsh.l" -return tIn; +return tIntersect; YY_BREAK case 143: YY_RULE_SETUP -#line 232 "Gmsh.l" -return tIntersect; +#line 233 "Gmsh.l" +return tNurbsKnots; YY_BREAK case 144: YY_RULE_SETUP -#line 234 "Gmsh.l" -return tNurbsKnots; +#line 235 "Gmsh.l" +return tLayers; YY_BREAK case 145: YY_RULE_SETUP #line 236 "Gmsh.l" -return tLayers; +return tLength; YY_BREAK case 146: YY_RULE_SETUP #line 237 "Gmsh.l" -return tLength; +return tLevelset; YY_BREAK case 147: YY_RULE_SETUP #line 238 "Gmsh.l" -return tLevelset; +return tLinSpace; YY_BREAK case 148: YY_RULE_SETUP #line 239 "Gmsh.l" -return tLinSpace; +return tLine; YY_BREAK case 149: YY_RULE_SETUP #line 240 "Gmsh.l" -return tLine; +return tList; YY_BREAK case 150: YY_RULE_SETUP #line 241 "Gmsh.l" -return tList; +return tListFromFile; YY_BREAK case 151: YY_RULE_SETUP #line 242 "Gmsh.l" -return tListFromFile; +return tLog; YY_BREAK case 152: YY_RULE_SETUP #line 243 "Gmsh.l" -return tLog; +return tLog10; YY_BREAK case 153: YY_RULE_SETUP #line 244 "Gmsh.l" -return tLog10; +return tLogSpace; YY_BREAK case 154: YY_RULE_SETUP #line 245 "Gmsh.l" -return tLogSpace; +return tLowerCase; YY_BREAK case 155: YY_RULE_SETUP #line 246 "Gmsh.l" -return tLowerCase; +return tLowerCaseIn; YY_BREAK case 156: YY_RULE_SETUP -#line 247 "Gmsh.l" -return tLowerCaseIn; +#line 248 "Gmsh.l" +return tMPI_Rank; YY_BREAK case 157: YY_RULE_SETUP #line 249 "Gmsh.l" -return tMPI_Rank; +return tMPI_Size; YY_BREAK case 158: YY_RULE_SETUP #line 250 "Gmsh.l" -return tMPI_Size; +return tMacro; YY_BREAK case 159: YY_RULE_SETUP #line 251 "Gmsh.l" -return tMacro; +return tMemory; YY_BREAK case 160: YY_RULE_SETUP #line 252 "Gmsh.l" -return tMemory; +return tMeshAlgorithm; YY_BREAK case 161: YY_RULE_SETUP #line 253 "Gmsh.l" -return tMeshAlgorithm; +return tModulo; YY_BREAK case 162: YY_RULE_SETUP -#line 254 "Gmsh.l" -return tModulo; +#line 255 "Gmsh.l" +return tNameToString; YY_BREAK case 163: YY_RULE_SETUP #line 256 "Gmsh.l" -return tNameToString; +return tNameStruct; YY_BREAK case 164: YY_RULE_SETUP #line 257 "Gmsh.l" -return tNameStruct; +return tNameToString; YY_BREAK case 165: YY_RULE_SETUP #line 258 "Gmsh.l" -return tNameToString; +return tNewModel; YY_BREAK case 166: YY_RULE_SETUP #line 259 "Gmsh.l" -return tNewModel; +return tNurbs; YY_BREAK case 167: YY_RULE_SETUP -#line 260 "Gmsh.l" -return tNurbs; +#line 261 "Gmsh.l" +return tOnelabAction; YY_BREAK case 168: YY_RULE_SETUP #line 262 "Gmsh.l" -return tOnelabAction; +return tOnelabRun; YY_BREAK case 169: YY_RULE_SETUP #line 263 "Gmsh.l" -return tOnelabRun; +return tNurbsOrder; YY_BREAK case 170: YY_RULE_SETUP -#line 264 "Gmsh.l" -return tNurbsOrder; +#line 265 "Gmsh.l" +return tParametric; YY_BREAK case 171: YY_RULE_SETUP #line 266 "Gmsh.l" -return tParametric; +return tPeriodic; YY_BREAK case 172: YY_RULE_SETUP #line 267 "Gmsh.l" -return tPeriodic; +return tPhysical; YY_BREAK case 173: YY_RULE_SETUP #line 268 "Gmsh.l" -return tPhysical; +return tPi; YY_BREAK case 174: YY_RULE_SETUP #line 269 "Gmsh.l" -return tPi; +return tPlane; YY_BREAK case 175: YY_RULE_SETUP #line 270 "Gmsh.l" -return tPlane; +return tPlugin; YY_BREAK case 176: YY_RULE_SETUP #line 271 "Gmsh.l" -return tPlugin; +return tPoint; YY_BREAK case 177: YY_RULE_SETUP #line 272 "Gmsh.l" -return tPoint; +return tPolarSphere; YY_BREAK case 178: YY_RULE_SETUP #line 273 "Gmsh.l" -return tPolarSphere; +return tPrintf; YY_BREAK case 179: YY_RULE_SETUP -#line 274 "Gmsh.l" -return tPrintf; +#line 275 "Gmsh.l" +return tQuadric; YY_BREAK case 180: YY_RULE_SETUP #line 276 "Gmsh.l" -return tQuadric; +return tQuadTriAddVerts; YY_BREAK case 181: YY_RULE_SETUP #line 277 "Gmsh.l" -return tQuadTriAddVerts; +return tQuadTriNoNewVerts; YY_BREAK case 182: YY_RULE_SETUP -#line 278 "Gmsh.l" -return tQuadTriNoNewVerts; +#line 279 "Gmsh.l" +return tRand; YY_BREAK case 183: YY_RULE_SETUP #line 280 "Gmsh.l" -return tRand; +return tRecombLaterals; YY_BREAK case 184: YY_RULE_SETUP #line 281 "Gmsh.l" -return tRecombLaterals; +return tRecombine; YY_BREAK case 185: YY_RULE_SETUP #line 282 "Gmsh.l" -return tRecombine; +return tRectangle; YY_BREAK case 186: YY_RULE_SETUP #line 283 "Gmsh.l" -return tRectangle; +return tRecursive; YY_BREAK case 187: YY_RULE_SETUP #line 284 "Gmsh.l" -return tRecursive; +return tRefineMesh; YY_BREAK case 188: YY_RULE_SETUP #line 285 "Gmsh.l" -return tRefineMesh; +return tRelocateMesh; YY_BREAK case 189: YY_RULE_SETUP #line 286 "Gmsh.l" -return tRelocateMesh; +return tReturn; YY_BREAK case 190: YY_RULE_SETUP #line 287 "Gmsh.l" -return tReturn; +return tReverse; YY_BREAK case 191: YY_RULE_SETUP #line 288 "Gmsh.l" -return tReverse; +return tRotate; YY_BREAK case 192: YY_RULE_SETUP #line 289 "Gmsh.l" -return tRotate; +return tRound; YY_BREAK case 193: YY_RULE_SETUP #line 290 "Gmsh.l" -return tRound; +return tRuled; YY_BREAK case 194: YY_RULE_SETUP -#line 291 "Gmsh.l" -return tRuled; +#line 292 "Gmsh.l" +return tStringToName; YY_BREAK case 195: YY_RULE_SETUP #line 293 "Gmsh.l" -return tStringToName; +return tScaleLast; YY_BREAK case 196: YY_RULE_SETUP #line 294 "Gmsh.l" -return tScaleLast; +return tSetChanged; YY_BREAK case 197: YY_RULE_SETUP #line 295 "Gmsh.l" -return tSetChanged; +return tSetFactory; YY_BREAK case 198: YY_RULE_SETUP #line 296 "Gmsh.l" -return tSetFactory; +return tSetNumber; YY_BREAK case 199: YY_RULE_SETUP #line 297 "Gmsh.l" -return tSetNumber; +return tSetPartition; YY_BREAK case 200: YY_RULE_SETUP #line 298 "Gmsh.l" -return tSetPartition; +return tSetString; YY_BREAK case 201: YY_RULE_SETUP #line 299 "Gmsh.l" -return tSetString; +return tShapeFromFile; YY_BREAK case 202: YY_RULE_SETUP #line 300 "Gmsh.l" -return tShapeFromFile; +return tShow; YY_BREAK case 203: YY_RULE_SETUP #line 301 "Gmsh.l" -return tShow; +return tSin; YY_BREAK case 204: YY_RULE_SETUP #line 302 "Gmsh.l" -return tSin; +return tSinh; YY_BREAK case 205: YY_RULE_SETUP #line 303 "Gmsh.l" -return tSinh; +return tSlide; YY_BREAK case 206: YY_RULE_SETUP #line 304 "Gmsh.l" -return tSlide; +return tSmoother; YY_BREAK case 207: YY_RULE_SETUP #line 305 "Gmsh.l" -return tSmoother; +return tSphere; YY_BREAK case 208: YY_RULE_SETUP #line 306 "Gmsh.l" -return tSphere; +return tSpline; YY_BREAK case 209: YY_RULE_SETUP #line 307 "Gmsh.l" -return tSpline; +return tSplit; YY_BREAK case 210: YY_RULE_SETUP #line 308 "Gmsh.l" -return tSplit; +return tSprintf; YY_BREAK case 211: YY_RULE_SETUP #line 309 "Gmsh.l" -return tSprintf; +return tSqrt; YY_BREAK case 212: YY_RULE_SETUP #line 310 "Gmsh.l" -return tSqrt; +return tStr; YY_BREAK case 213: YY_RULE_SETUP #line 311 "Gmsh.l" -return tStr; +return tStrCat; YY_BREAK case 214: YY_RULE_SETUP #line 312 "Gmsh.l" -return tStrCat; +return tStrChoice; YY_BREAK case 215: YY_RULE_SETUP #line 313 "Gmsh.l" -return tStrChoice; +return tStrCmp; YY_BREAK case 216: YY_RULE_SETUP #line 314 "Gmsh.l" -return tStrCmp; +return tStrFind; YY_BREAK case 217: YY_RULE_SETUP #line 315 "Gmsh.l" -return tStrFind; +return tStrLen; YY_BREAK case 218: YY_RULE_SETUP #line 316 "Gmsh.l" -return tStrLen; +return tStrPrefix; YY_BREAK case 219: YY_RULE_SETUP #line 317 "Gmsh.l" -return tStrPrefix; +return tStrRelative; YY_BREAK case 220: YY_RULE_SETUP #line 318 "Gmsh.l" -return tStrRelative; +return tStrReplace; YY_BREAK case 221: YY_RULE_SETUP #line 319 "Gmsh.l" -return tStrReplace; +return tStrSub; YY_BREAK case 222: YY_RULE_SETUP #line 320 "Gmsh.l" -return tStrSub; +return tStringToName; YY_BREAK case 223: YY_RULE_SETUP #line 321 "Gmsh.l" -return tStringToName; +return tDefineStruct; YY_BREAK case 224: YY_RULE_SETUP #line 322 "Gmsh.l" -return tDefineStruct; +return tSurface; YY_BREAK case 225: YY_RULE_SETUP #line 323 "Gmsh.l" -return tSurface; +return tSymmetry; YY_BREAK case 226: YY_RULE_SETUP #line 324 "Gmsh.l" -return tSymmetry; +return tSyncModel; YY_BREAK case 227: YY_RULE_SETUP -#line 325 "Gmsh.l" -return tSyncModel; +#line 326 "Gmsh.l" +return tText2D; YY_BREAK case 228: YY_RULE_SETUP #line 327 "Gmsh.l" -return tText2D; +return tText3D; YY_BREAK case 229: YY_RULE_SETUP #line 328 "Gmsh.l" -return tText3D; +return tTime; YY_BREAK case 230: YY_RULE_SETUP #line 329 "Gmsh.l" -return tTime; +return tTan; YY_BREAK case 231: YY_RULE_SETUP #line 330 "Gmsh.l" -return tTan; +return tTanh; YY_BREAK case 232: YY_RULE_SETUP #line 331 "Gmsh.l" -return tTanh; +return tTestLevel; YY_BREAK case 233: YY_RULE_SETUP #line 332 "Gmsh.l" -return tTestLevel; +return tTextAttributes; YY_BREAK case 234: YY_RULE_SETUP #line 333 "Gmsh.l" -return tTextAttributes; +return tThickSolid; YY_BREAK case 235: YY_RULE_SETUP #line 334 "Gmsh.l" -return tThickSolid; +return tThruSections; YY_BREAK case 236: YY_RULE_SETUP #line 335 "Gmsh.l" -return tThruSections; +return tToday; YY_BREAK case 237: YY_RULE_SETUP #line 336 "Gmsh.l" -return tToday; +return tTorus; YY_BREAK case 238: YY_RULE_SETUP #line 337 "Gmsh.l" -return tTorus; +return tTotalMemory; YY_BREAK case 239: YY_RULE_SETUP #line 338 "Gmsh.l" -return tTotalMemory; +return tTransfQuadTri; YY_BREAK case 240: YY_RULE_SETUP #line 339 "Gmsh.l" -return tTransfQuadTri; +return tTransfinite; YY_BREAK case 241: YY_RULE_SETUP #line 340 "Gmsh.l" -return tTransfinite; +return tTranslate; YY_BREAK case 242: YY_RULE_SETUP -#line 341 "Gmsh.l" -return tTranslate; +#line 342 "Gmsh.l" +return tUndefineConstant; YY_BREAK case 243: YY_RULE_SETUP #line 343 "Gmsh.l" -return tUndefineConstant; +return tUnique; YY_BREAK case 244: YY_RULE_SETUP #line 344 "Gmsh.l" -return tUnique; +return tUpperCase; YY_BREAK case 245: YY_RULE_SETUP #line 345 "Gmsh.l" -return tUpperCase; +return tUsing; YY_BREAK case 246: YY_RULE_SETUP -#line 346 "Gmsh.l" -return tUsing; +#line 347 "Gmsh.l" +return tVolume; YY_BREAK case 247: YY_RULE_SETUP -#line 348 "Gmsh.l" -return tVolume; +#line 349 "Gmsh.l" +return tWedge; YY_BREAK case 248: YY_RULE_SETUP #line 350 "Gmsh.l" -return tWedge; - YY_BREAK -case 249: -YY_RULE_SETUP -#line 351 "Gmsh.l" return tWire; YY_BREAK +case 249: +#line 353 "Gmsh.l" case 250: #line 354 "Gmsh.l" case 251: #line 355 "Gmsh.l" case 252: -#line 356 "Gmsh.l" -case 253: YY_RULE_SETUP -#line 356 "Gmsh.l" +#line 355 "Gmsh.l" { gmsh_yylval.d = atof((char *)gmsh_yytext); return tDOUBLE; } YY_BREAK -case 254: +case 253: YY_RULE_SETUP -#line 358 "Gmsh.l" +#line 357 "Gmsh.l" { gmsh_yylval.c = strsave((char*)gmsh_yytext); return tSTRING; } YY_BREAK -case 255: +case 254: YY_RULE_SETUP -#line 360 "Gmsh.l" +#line 359 "Gmsh.l" return gmsh_yytext[0]; YY_BREAK -case 256: +case 255: YY_RULE_SETUP -#line 362 "Gmsh.l" +#line 361 "Gmsh.l" ECHO; YY_BREAK -#line 2842 "Gmsh.yy.cpp" +#line 2835 "Gmsh.yy.cpp" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -3130,7 +3123,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1299 ) + if ( yy_current_state >= 1292 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -3158,11 +3151,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 1299 ) + if ( yy_current_state >= 1292 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 1298); + yy_is_jam = (yy_current_state == 1291); return yy_is_jam ? 0 : yy_current_state; } @@ -3835,7 +3828,7 @@ void gmsh_yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 362 "Gmsh.l" +#line 361 "Gmsh.l" diff --git a/Solver/CMakeLists.txt b/Solver/CMakeLists.txt index d9f5de36614eb4848556ccdc3dad4f09925f3a74..9254e2aa6d368096dcbb97c0dd5d80da9332ea8f 100644 --- a/Solver/CMakeLists.txt +++ b/Solver/CMakeLists.txt @@ -15,7 +15,6 @@ elasticitySolver.cpp thermicSolver.cpp SElement.cpp eigenSolver.cpp - multiscaleLaplace.cpp functionSpace.cpp filters.cpp frameSolver.cpp diff --git a/Solver/multiscaleLaplace.cpp b/Solver/multiscaleLaplace.cpp deleted file mode 100644 index ca2d11eaae226ec908d1dd3350f94e0498aeeb0d..0000000000000000000000000000000000000000 --- a/Solver/multiscaleLaplace.cpp +++ /dev/null @@ -1,1138 +0,0 @@ -// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle -// -// See the LICENSE.txt file for license information. Please report all -// bugs and problems to the public mailing list <gmsh@onelab.info>. -// -// Contributor(s): -// Emilie Marchandise -// - -#include "Context.h" -#include "multiscaleLaplace.h" -#include "GmshConfig.h" -#include "GmshDefines.h" -#include "Numeric.h" -#include "OS.h" -#include "SBoundingBox3d.h" -#include "SPoint3.h" -#include "dofManager.h" -#include "laplaceTerm.h" -#include "convexCombinationTerm.h" -#include "linearSystemCSR.h" -#include "linearSystemPETSc.h" -#include "robustPredicates.h" -#include "meshGFaceOptimize.h" -#include "GFaceCompound.h" - -#ifdef HAVE_GMM -#include "linearSystemGMM.h" -#endif - -#include "linearSystemFull.h" -#include "MTriangle.h" -#include "robustPredicates.h" - -struct compareRotatedPoints { - double angle; - const SPoint2 &left; - compareRotatedPoints (const SPoint2& l,const SPoint2& r) : left(l){ - angle = atan2(r.y()-l.y(),r.x()-l.x()); - } - bool operator ( ) (const SPoint2 &p1, const SPoint2 &p2) const { - //sort from left (x=-1) to right (sin=0), cos(=1) - double x1 = (p1.x()-left.x())*cos(angle) + (p1.y()-left.y())*sin(angle); - double x2 = (p2.x()-left.x())*cos(angle) + (p2.y()-left.y())*sin(angle); - if (x1<x2)return true; - if (x1>x2)return false; - double y1 =-(p1.x()-left.x())*sin(angle) + (p1.y()-left.y())*cos(angle); - double y2 =-(p2.x()-left.x())*sin(angle) + (p2.y()-left.y())*cos(angle); - if (y1<y2)return true; - return false; - } -}; - -struct sort_pred { - compareRotatedPoints comparator; - sort_pred (const SPoint2 &left, const SPoint2 &right) - : comparator(left,right) {} - bool operator()(const std::pair<SPoint2,multiscaleLaplaceLevel*> &left, - const std::pair<SPoint2,multiscaleLaplaceLevel*> &right) - { - return comparator(left.first,right.first); - } -}; - -static void recur_connect (MVertex *v, - std::multimap<MVertex*,MEdge> &v2e, - std::set<MEdge,Less_Edge> &group, - std::set<MVertex*> &touched) -{ - if (touched.find(v) != touched.end()) return; - - touched.insert(v); - for (std::multimap <MVertex*,MEdge>::iterator it = v2e.lower_bound(v); - it != v2e.upper_bound(v) ; ++it){ - group.insert(it->second); - for (int i=0;i<it->second.getNumVertices();++i){ - recur_connect (it->second.getVertex(i),v2e,group,touched); - } - } - -} - -static void connected_bounds (std::vector<MElement*> &elements, - std::vector<std::vector<MEdge> > &boundaries) -{ - std::vector<MEdge> bEdges; - for(unsigned int i = 0; i < elements.size(); i++){ - for(int j = 0; j < elements[i]->getNumEdges(); j++){ - MEdge me = elements[i]->getEdge(j); - if(std::find(bEdges.begin(), bEdges.end(), me) == bEdges.end()) - bEdges.push_back(me); - else - bEdges.erase(std::find(bEdges.begin(), bEdges.end(),me)); - } - } - - std::multimap<MVertex*,MEdge> v2e; - for (unsigned int i = 0; i < bEdges.size(); ++i){ - for (int j=0;j<bEdges[i].getNumVertices();j++){ - v2e.insert(std::make_pair(bEdges[i].getVertex(j),bEdges[i])); - } - } - while (!v2e.empty()){ - std::set<MEdge, Less_Edge> group; - std::set<MVertex*> touched; - recur_connect (v2e.begin()->first,v2e,group,touched); - std::vector<MEdge> temp; - temp.insert(temp.begin(), group.begin(), group.end()); - boundaries.push_back(temp); - for ( std::set<MVertex*>::iterator it = touched.begin() ; it != touched.end();++it) - v2e.erase(*it); - } - - return; -} - -static double getSizeBB(std::vector<MEdge> &me) -{ - SBoundingBox3d bb ; - SOrientedBoundingBox obbox ; - - std::vector<SPoint3> vertices; - for (unsigned int i=0; i< me.size(); i++){ - MVertex *v0 = me[i].getVertex(0); - MVertex *v1 = me[i].getVertex(1); - SPoint3 pt1(v0->x(),v0->y(), v0->z()); - vertices.push_back(pt1); - SPoint3 pt2(v1->x(),v1->y(), v1->z()); - vertices.push_back(pt2); - bb+=pt1; - bb+=pt2; - } - - //double H = norm(SVector3(bb.max(), bb.min())); - //printf("H=%g \n", H); - - obbox = SOrientedBoundingBox::buildOBB(vertices); - double H = obbox.getMaxSize(); - - return H; -} - -static void ordering_dirichlet(std::vector<MElement*> &elements, - std::vector<std::pair<MVertex*,double> > &dirichletNodes) -{ - //finding all boundaries - std::vector<std::vector<MEdge> > boundaries; - connected_bounds(elements,boundaries); - - //largest boundary is dirichlet boundary - std::vector<MEdge> dirichletEdges; - double maxSize = 0.0; - for(unsigned int i = 0; i < boundaries.size(); i++){ - std::vector<MEdge> iBound = boundaries[i]; - double size = getSizeBB(iBound); - if (size > maxSize) { - dirichletEdges = iBound; - maxSize = size; - } - } - - //ordering dirichletNodes - dirichletNodes.clear(); - std::list<MEdge> temp; - double tot_length = 0.0; - for(unsigned int i = 0; i < dirichletEdges.size(); i++ ){ - MVertex *v0 = dirichletEdges[i].getVertex(0); - MVertex *v1 = dirichletEdges[i].getVertex(1); - double len = sqrt((v0->x() - v1->x()) * (v0->x() - v1->x()) + - (v0->y() - v1->y()) * (v0->y() - v1->y()) + - (v0->z() - v1->z()) * (v0->z() - v1->z())) ; - tot_length += len; - temp.push_back(dirichletEdges[i]); - } - - dirichletNodes.push_back(std::make_pair(dirichletEdges[0].getVertex(0),0.0)); - MVertex *current_v = dirichletEdges[0].getVertex(1); - temp.erase(temp.begin()); - - while(temp.size()){ - bool found = false; - for(std::list<MEdge>::iterator itl = temp.begin(); itl != temp.end(); ++itl){ - MVertex *v0 = itl->getVertex(0); - MVertex *v1 = itl->getVertex(1); - if(v0 == current_v){ - found = true; - current_v = v1; - temp.erase(itl); - double length = sqrt((v0->x() - v1->x()) * (v0->x() - v1->x()) + - (v0->y() - v1->y()) * (v0->y() - v1->y()) + - (v0->z() - v1->z()) * (v0->z() - v1->z())); - double iLength = dirichletNodes[dirichletNodes.size()-1].second + - (length / tot_length); - dirichletNodes.push_back(std::make_pair(v0,iLength)); - break; - } - else if(v1 == current_v){ - found = true; - current_v = v0; - temp.erase(itl); - double length = sqrt((v0->x() - v1->x()) * (v0->x() - v1->x()) + - (v0->y() - v1->y()) * (v0->y() - v1->y()) + - (v0->z() - v1->z()) * (v0->z() - v1->z())); - double iLength = dirichletNodes[dirichletNodes.size()-1].second + - (length / tot_length); - dirichletNodes.push_back(std::make_pair(v1,iLength)); - break; - } - } - if(!found) return ; - } - - return; -} - -static int intersection_segments (SPoint2 &p1, SPoint2 &p2, - SPoint2 &q1, SPoint2 &q2, - double x[2]) -{ - double A[2][2]; - A[0][0] = p2.x()-p1.x(); - A[0][1] = q1.x()-q2.x(); - A[1][0] = p2.y()-p1.y(); - A[1][1] = q1.y()-q2.y(); - double b[2] = {q1.x()-p1.x(),q1.y()-p1.y()}; - sys2x2(A,b,x); - - return (x[0] >= 0.0 && x[0] <= 1. && - x[1] >= 0.0 && x[1] <= 1.); - -} - -static void recur_compute_centers_ (double R, double a1, double a2, - multiscaleLaplaceLevel * root, int &nbElems) -{ - nbElems += root->elements.size(); - - root->radius = R; - std::vector<std::pair<SPoint2,multiscaleLaplaceLevel*> > ¢ers = root->cut; - centers.clear(); - multiscaleLaplaceLevel* zero = 0; - - double fact = 2.5; - SPoint2 PL (fact*R*cos(a1),fact*R*sin(a1)); - SPoint2 PR (fact*R*cos(a2),fact*R*sin(a2)); - - std::vector<SPoint2> centersChild; - centersChild.clear(); - for (unsigned int i=0;i<root->children.size();i++){ - multiscaleLaplaceLevel* m = root->children[i]; - centers.push_back(std::make_pair(m->center,m)); - m->radius = 0.0; - for (std::map<MVertex*,SPoint2>::iterator it = m->coordinates.begin(); - it != m->coordinates.end() ; ++it){ - SPoint2 p = it->second; - m->radius = std::max(m->radius,sqrt ((m->center.x() - p.x())*(m->center.x() - p.x())+ - (m->center.y() - p.y())*(m->center.y() - p.y()))); - } - centersChild.push_back(m->center); - } - - //add the center of real holes ... - std::vector<std::vector<MEdge> > boundaries; - connected_bounds(root->elements, boundaries); - int added = 0; - int toadd = boundaries.size()-1 - root->children.size(); - if (root->children.size()==0 || (root->children.size()> 0 && toadd > 0) ){ - for (unsigned int i = 0; i < boundaries.size(); i++){ - std::vector<MEdge> me = boundaries[i]; - SPoint2 c(0.0,0.0); - double rad = 0.0; - for(unsigned int j= 0; j< me.size(); j++){ - MVertex *v = me[j].getVertex(0); - std::map<MVertex *, SPoint2>::iterator it0 = root->coordinates.find(v); - c += it0->second; - } - c *= 1./((double)me.size()); - for(unsigned int j= 0; j< me.size(); j++){ - SPoint2 p = root->coordinates[me[j].getVertex(0)]; - rad = std::max(rad,sqrt ((c.x() - p.x())*(c.x() - p.x())+ - (c.y() - p.y())*(c.y() - p.y()))); - } - - //check if the center has not been added - bool newCenter = true; - for (std::vector<SPoint2>::iterator it2 = centersChild.begin(); - it2 != centersChild.end(); it2++){ - SPoint2 p = *it2; - double dist = sqrt ((c.x() - p.x())*(c.x() - p.x())+ - (c.y() - p.y())*(c.y() - p.y())); - if (dist < 0.5*rad) newCenter = false;//0.6 - } - - if (std::abs(rad/root->radius) < 0.65 && std::abs(rad) < 0.95 && newCenter){//0.6 - added++; - centers.push_back(std::make_pair(c,zero)); - } - } - } - if (added != toadd && root->children.size()> 0) { - printf("!!!!!!!! ARG added = %d != %d (bounds=%d, child=%d)\n", added, - (int)(boundaries.size() - 1 - root->children.size()), (int)boundaries.size(), - (int)root->children.size()); - } - - //sort centers from left to right - std::sort(centers.begin(),centers.end(), sort_pred(PL,PR)); - - //sort from distances - //sort_centers_dist(centers, PL); - - centers.insert(centers.begin(), std::make_pair(PL,zero)); - centers.push_back(std::make_pair(PR,zero)); - - for (unsigned int i = 1; i < centers.size() - 1; i++){ - multiscaleLaplaceLevel* m2 = centers[i].second; - if (m2){ - a1 = myatan2 (centers[i-1].first.y()- m2->center.y(), - centers[i-1].first.x()-m2->center.x()); - a2 = myatan2 (centers[i+1].first.y()- m2->center.y(), - centers[i+1].first.x()-m2->center.x()); - recur_compute_centers_ (m2->radius, a1, a2, m2, nbElems); - } - } - -} - -static void recur_cut_edges_ (multiscaleLaplaceLevel *root, - std::map<MEdge,MVertex*,Less_Edge> &cutEdges, - std::set<MVertex*> &cutVertices) -{ - const double EPS = 0.001; - - std::multimap<MEdge,MElement*,Less_Edge> e2e; - std::set<MEdge,Less_Edge> allEdges; - for (unsigned int i = 0; i < root->elements.size(); ++i){ - for (int j = 0; j < root->elements[i]->getNumEdges(); j++){ - e2e.insert(std::make_pair(root->elements[i]->getEdge(j),root->elements[i])); - allEdges.insert(root->elements[i]->getEdge(j)); - } - } - - std::vector<std::pair<SPoint2,multiscaleLaplaceLevel*> > ¢ers = root->cut; - for (unsigned int i = 0; i < centers.size() - 1; i++){ - SPoint2 p1 = centers[i].first; - SPoint2 p2 = centers[i+1].first; - //printf("*************** line p1p2 (%g %g) -- (%g %g) \n",p1.x(),p1.y(),p2.x(),p2.y()); - for (std::set <MEdge,Less_Edge>::iterator it = allEdges.begin(); - it != allEdges.end() ; ++it){ - if(cutEdges.find(*it) == cutEdges.end()){//e2e.count(*it) == 2 && - std::map<MVertex *, SPoint2>::iterator it0 = root->coordinates.find(it->getVertex(0)); - std::map<MVertex *, SPoint2>::iterator it1 = root->coordinates.find(it->getVertex(1)); - if (it0 != root->coordinates.end() && it1 != root->coordinates.end()){ - SPoint2 q1 = root->coordinates[it->getVertex(0)]; - SPoint2 q2 = root->coordinates[it->getVertex(1)]; - double x[2]; - int inters = intersection_segments (p1,p2,q1,q2,x); - if (inters && x[1] > EPS && x[1] < 1.-EPS){ - MVertex *newv = new MVertex - ((1.-x[1])*it->getVertex(0)->x() + x[1]*it->getVertex(1)->x(), - (1.-x[1])*it->getVertex(0)->y() + x[1]*it->getVertex(1)->y(), - (1.-x[1])*it->getVertex(0)->z() + x[1]*it->getVertex(1)->z()); - cutEdges[*it] = newv; - root->coordinates[newv] = q1*(1.-x[1]) + q2*x[1] ; - } - else if (inters && x[1] <= EPS) cutVertices.insert(it->getVertex(0)); - else if (inters && x[1] >= 1.-EPS) cutVertices.insert(it->getVertex(1)); - } - } - } - } - for (unsigned int i = 0; i < centers.size(); i++){ - multiscaleLaplaceLevel* m2 = centers[i].second; - if (m2){ - recur_cut_edges_ (m2,cutEdges,cutVertices); - } - } -} - -static void recur_cut_elements_ (multiscaleLaplaceLevel * root, - std::map<MEdge,MVertex*,Less_Edge> &cutEdges, - std::set<MVertex*> &cutVertices, - std::set<MEdge,Less_Edge> &theCut, - std::vector<MElement*> &_all) -{ - std::vector<std::pair<SPoint2,multiscaleLaplaceLevel*> > ¢ers = root->cut; - std::vector<MElement*> newElements; - for (unsigned int i = 0; i < root->elements.size(); i++){ - MVertex *c[3] = {0,0,0}; - for (int j=0;j<3;j++){ - MEdge ed = root->elements[i]->getEdge(j); - std::map<MEdge,MVertex*,Less_Edge> :: iterator it = cutEdges.find(ed); - if (it != cutEdges.end()){ - c[j] = it->second; - } - } - if (c[0] && c[1]){ - newElements.push_back(new MTriangle (c[0],root->elements[i]->getVertex(1),c[1])); - newElements.push_back(new MTriangle (root->elements[i]->getVertex(0),c[0], - root->elements[i]->getVertex(2))); - newElements.push_back(new MTriangle (root->elements[i]->getVertex(2),c[0],c[1])); - theCut.insert(MEdge(c[0],c[1])); - } - else if (c[0] && c[2]){ - newElements.push_back(new MTriangle (root->elements[i]->getVertex(0),c[0],c[2])); - newElements.push_back(new MTriangle (c[0],root->elements[i]->getVertex(1), - root->elements[i]->getVertex(2))); - newElements.push_back(new MTriangle (root->elements[i]->getVertex(2),c[2],c[0])); - theCut.insert(MEdge(c[0],c[2])); - } - else if (c[1] && c[2]){ - newElements.push_back(new MTriangle (root->elements[i]->getVertex(2),c[2],c[1])); - newElements.push_back(new MTriangle (root->elements[i]->getVertex(0), - root->elements[i]->getVertex(1),c[2])); - newElements.push_back(new MTriangle (c[2],root->elements[i]->getVertex(1),c[1])); - theCut.insert(MEdge(c[1],c[2])); - } - else if (c[0]){ - newElements.push_back(new MTriangle (root->elements[i]->getVertex(0),c[0], - root->elements[i]->getVertex(2))); - newElements.push_back(new MTriangle (root->elements[i]->getVertex(2),c[0], - root->elements[i]->getVertex(1))); - if (cutVertices.find (root->elements[i]->getVertex(0)) != cutVertices.end()){ - theCut.insert(MEdge(c[0],root->elements[i]->getVertex(0))); - } - else if (cutVertices.find (root->elements[i]->getVertex(1)) != cutVertices.end()) { - theCut.insert(MEdge(c[0],root->elements[i]->getVertex(1))); - } - else{ - theCut.insert(MEdge(c[0],root->elements[i]->getVertex(2))); - } - } - else if (c[1]){ - newElements.push_back(new MTriangle (root->elements[i]->getVertex(1),c[1], - root->elements[i]->getVertex(0))); - newElements.push_back(new MTriangle (root->elements[i]->getVertex(0),c[1], - root->elements[i]->getVertex(2))); - if (cutVertices.find (root->elements[i]->getVertex(0)) != cutVertices.end()){ - theCut.insert(MEdge(c[1],root->elements[i]->getVertex(0))); - } - else if (cutVertices.find (root->elements[i]->getVertex(1)) != cutVertices.end()) { - theCut.insert(MEdge(c[1],root->elements[i]->getVertex(1))); - } - else{ - theCut.insert(MEdge(c[1],root->elements[i]->getVertex(2))); - } - } - else if (c[2]){ - newElements.push_back(new MTriangle (root->elements[i]->getVertex(0), - root->elements[i]->getVertex(1), c[2])); - newElements.push_back(new MTriangle (root->elements[i]->getVertex(1), - root->elements[i]->getVertex(2), c[2])); - if (cutVertices.find (root->elements[i]->getVertex(0)) != cutVertices.end()){ - theCut.insert(MEdge(c[2],root->elements[i]->getVertex(0))); - } - else if (cutVertices.find (root->elements[i]->getVertex(1)) != cutVertices.end()) { - theCut.insert(MEdge(c[2],root->elements[i]->getVertex(1))); - } - else{ - theCut.insert(MEdge(c[2],root->elements[i]->getVertex(2))); - } - } - else { - newElements.push_back(root->elements[i]); - if (cutVertices.find (root->elements[i]->getVertex(0)) != cutVertices.end() && - cutVertices.find (root->elements[i]->getVertex(1)) != cutVertices.end()) - theCut.insert(MEdge(root->elements[i]->getVertex(0),root->elements[i]->getVertex(1))); - if (cutVertices.find (root->elements[i]->getVertex(0)) != cutVertices.end() && - cutVertices.find (root->elements[i]->getVertex(2)) != cutVertices.end()) - theCut.insert(MEdge(root->elements[i]->getVertex(0),root->elements[i]->getVertex(2))); - if (cutVertices.find (root->elements[i]->getVertex(2)) != cutVertices.end() && - cutVertices.find (root->elements[i]->getVertex(1)) != cutVertices.end()) - theCut.insert(MEdge(root->elements[i]->getVertex(2),root->elements[i]->getVertex(1))); - } - } - - root->elements.clear(); - root->elements = newElements; - _all.insert(_all.end(),newElements.begin(),newElements.end()); - for (unsigned int i = 0; i < centers.size(); i++){ - multiscaleLaplaceLevel* m2 = centers[i].second; - if (m2){ - recur_cut_elements_ (m2,cutEdges,cutVertices,theCut,_all); - } - } -} - -static void recur_leftCut_ (MElement *e, - std::multimap<MEdge,MElement*,Less_Edge> &e2e, - std::set<MEdge,Less_Edge> &theCut, - std::set<MElement*> &leftSet) -{ - if (leftSet.find(e) != leftSet.end())return; - leftSet.insert(e); - //printf("insert in left %d \n", e->getNum()); - for (int i=0;i<e->getNumEdges();i++){ - MEdge ed = e->getEdge(i); - if (theCut.find(ed) == theCut.end()){ - for (std::multimap <MEdge,MElement*,Less_Edge>::iterator it = e2e.lower_bound(ed); - it != e2e.upper_bound(ed) ; ++it){ - if (it->second != e) recur_leftCut_ (it->second,e2e,theCut, leftSet); - } - } - } - -} - -// starting form a list of elements, returns -// lists of lists that are all simply connected -static void recur_connect (const MEdge &e, - std::multimap<MEdge,MElement*,Less_Edge> &e2e, - std::set<MElement*> &group, - std::set<MEdge,Less_Edge> &touched) -{ - if (touched.find(e) != touched.end())return; - touched.insert(e); - for (std::multimap <MEdge,MElement*,Less_Edge>::iterator it = e2e.lower_bound(e); - it != e2e.upper_bound(e) ; ++it){ - group.insert(it->second); - for (int i=0;i<it->second->getNumEdges();++i){ - recur_connect (it->second->getEdge(i),e2e,group,touched); - } - } -} - -static void connectedRegions (const std::vector<MElement*> &elements, - std::vector<std::vector<MElement*> > ®ions) -{ - std::multimap<MEdge,MElement*,Less_Edge> e2e; - for (unsigned int i = 0; i < elements.size(); ++i){ - for (int j = 0; j < elements[i]->getNumEdges(); j++){ - e2e.insert(std::make_pair(elements[i]->getEdge(j),elements[i])); - } - } - while (!e2e.empty()){ - std::set<MElement*> group; - std::set<MEdge,Less_Edge> touched; - recur_connect (e2e.begin()->first,e2e,group,touched); - std::vector<MElement*> temp; - temp.insert(temp.begin(), group.begin(), group.end()); - regions.push_back(temp); - for ( std::set<MEdge,Less_Edge>::iterator it = touched.begin() ; it != touched.end();++it) - e2e.erase(*it); - } -} - -static void keepConnected(std::vector<MElement*> &goodSize, std::vector<MElement*> &tooSmall) -{ - std::vector<std::vector<MElement*> > regGoodSize; - connectedRegions (goodSize,regGoodSize); - if (regGoodSize.size() > 0){ - int index=0; - int maxSize= regGoodSize[0].size(); - for (unsigned int i=1;i< regGoodSize.size() ; i++){ - int size = regGoodSize[i].size(); - if(size > maxSize){ - index = i; - maxSize = size; - } - } - goodSize.clear(); - for (unsigned int i = 0; i < regGoodSize.size(); i++){ - if ((int)i == index) - goodSize.insert(goodSize.begin(), regGoodSize[i].begin(), - regGoodSize[i].end()); - else - tooSmall.insert(tooSmall.begin(), regGoodSize[i].begin(), - regGoodSize[i].end()); - } - } -} - -static void recur_cut_ (double R, double a1, double a2, - multiscaleLaplaceLevel * root, - std::vector<MElement *> &left, - std::vector<MElement *> &right) -{ - SPoint2 PL (R*cos(a1),R*sin(a1)); - SPoint2 PR (R*cos(a2),R*sin(a2)); - std::vector<std::pair<SPoint2,multiscaleLaplaceLevel*> > centers = root->cut; - - double d = sqrt((PL.x()-PR.x())*(PL.x()-PR.x())+ - (PL.y()-PR.y())*(PL.y()-PR.y())); - SPoint2 farLeft (0.5*(PL.x()+PR.x()) - (PR.y()-PL.y())/d , - 0.5*(PL.y()+PR.y()) + (PR.x()-PL.x())/d ); - - for (unsigned int i = 0; i < root->elements.size(); i++){ - SPoint2 pp (0,0); - for (int j=0; j<root->elements[i]->getNumVertices(); j++){ - pp += root->coordinates[root->elements[i]->getVertex(j)]; - } - pp *= 1./(double)root->elements[i]->getNumVertices(); - int nbIntersect = 0; - for (unsigned int j = 0; j < centers.size() - 1; j++){ - double x[2]; - nbIntersect += intersection_segments (centers[j].first,centers[j+1].first,pp,farLeft,x); - } - if (nbIntersect %2 != 0) - left.push_back(root->elements[i]); - else - right.push_back(root->elements[i]); - } - - for (unsigned int i = 1; i < centers.size() - 1; i++){ - multiscaleLaplaceLevel* m2 = centers[i].second; - if (m2){ - a1 = myatan2 (centers[i-1].first.y() - m2->center.y(), - centers[i-1].first.x() - m2->center.x()); - a2 = myatan2 (centers[i+1].first.y() - m2->center.y(), - centers[i+1].first.x() - m2->center.x()); - recur_cut_ (m2->radius, a1, a2, m2, left, right); - } - } -} - -static void connected_left_right (std::vector<MElement *> &left, - std::vector<MElement *> &right) -{ - //connected left - keepConnected(left, right); - - //assign partitions - for (unsigned int i= 0; i< left.size(); i++) - left[i]->setPartition(1); - for (unsigned int i= 0; i< right.size(); i++) - right[i]->setPartition(2); -} - -static void printCut(std::map<MEdge,MVertex*,Less_Edge> &cutEdges, - std::set<MEdge,Less_Edge> &theCut, std::set<MVertex*> cutVertices) -{ - printf("Writing points.pos \n"); - std::map<MEdge,MVertex*,Less_Edge>::iterator ite = cutEdges.begin(); - FILE *f1 = Fopen("points.pos","w"); - if(f1){ - fprintf(f1,"View\"\"{\n"); - for ( ; ite != cutEdges.end();++ite){ - fprintf(f1,"SP(%g,%g,%g){1.0};\n",ite->second->x(),ite->second->y(),ite->second->z()); - } - std::set<MVertex*>::iterator itv = cutVertices.begin(); - for ( ; itv != cutVertices.end();++itv){ - fprintf(f1,"SP(%g,%g,%g){3.0};\n",(*itv)->x(),(*itv)->y(),(*itv)->z()); - } - fprintf(f1,"};\n"); - fclose(f1); - } - - printf("Writing edges.pos \n"); - std::set<MEdge,Less_Edge>::iterator itc = theCut.begin(); - FILE *f2 = Fopen("edges.pos","w"); - if(f2){ - fprintf(f2,"View\"\"{\n"); - for ( ; itc != theCut.end();++itc){ - fprintf(f2,"SL(%g,%g,%g,%g,%g,%g){1.0,1.0};\n",itc->getVertex(0)->x(), - itc->getVertex(0)->y(),itc->getVertex(0)->z(), - itc->getVertex(1)->x(),itc->getVertex(1)->y(),itc->getVertex(1)->z()); - } - fprintf(f2,"};\n"); - fclose(f2); - } -} - -static void printLevel(const char* fn, - std::vector<MElement *> &elements, - std::map<MVertex*,SPoint2> *coordinates, - double version, - double *dx = 0) -{ - if(!CTX::instance()->mesh.saveAll) return; - - std::set<MVertex*> vs; - for (unsigned int i = 0; i < elements.size(); i++) - for (int j = 0; j < elements[i]->getNumVertices(); j++) - vs.insert(elements[i]->getVertex(j)); - - bool binary = false; - FILE *fp = Fopen (fn, "w"); - if(!fp){ - Msg::Error("Could not open file '%s'", fn); - return; - } - fprintf(fp, "$MeshFormat\n"); - fprintf(fp, "%g %d %d\n", version, binary ? 1 : 0, (int)sizeof(double)); - fprintf(fp, "$EndMeshFormat\n"); - - fprintf(fp, "$Nodes\n%d\n", (int)vs.size()); - std::set<MVertex*> :: iterator it = vs.begin(); - int index = 1; - for (; it != vs.end() ; ++it){ - (*it)->setIndex(index++); - SPoint2 p = (coordinates) ? (*coordinates)[*it] : SPoint2(0,0); - if (coordinates) { - if (dx)fprintf(fp, "%d %22.15E %22.15E 0\n", (*it)->getIndex(), - dx[2]*(p.x()-dx[0]), dx[2]*(p.y()-dx[1])); - else fprintf(fp, "%d %22.15E %22.15E 0\n", (*it)->getIndex(), p.x(), p.y()); - } - else fprintf(fp, "%d %g %g %g\n", (*it)->getIndex(),(*it)->x(), (*it)->y(), (*it)->z()); - } - fprintf(fp, "$EndNodes\n"); - - fprintf(fp, "$Elements\n%d\n", (int)elements.size()); - for (unsigned int i = 0; i < elements.size(); i++){ - elements[i]->writeMSH(fp, version); - } - fprintf(fp, "$EndElements\n"); - - fclose(fp); -} - -static double localSize(MElement *e, std::map<MVertex*,SPoint2> &solution) -{ - SBoundingBox3d local; - for(int j = 0; j<e->getNumVertices(); ++j){ - SPoint2 p = solution[e->getVertex(j)]; - local += SPoint3(p.x(),p.y(),0.0); - } - return local.max().distance(local.min()); - -// MVertex* v0 = e->getVertex(0); -// MVertex* v1 = e->getVertex(1); -// MVertex* v2 = e->getVertex(2); -// double p0[3] = {v0->x(), v0->y(), v0->z()}; -// double p1[3] = {v1->x(), v1->y(), v1->z()}; -// double p2[3] = {v2->x(), v2->y(), v2->z()}; -// double a_3D = fabs(triangle_area(p0, p1, p2)); -// SPoint2 s1 = solution[v0]; -// SPoint2 s2 = solution[v1]; -// SPoint2 s3 = solution[v2]; -// double q0[3] = {s1.x(), s1.y(), 0.0}; -// double q1[3] = {s2.x(), s2.y(), 0.0}; -// double q2[3] = {s3.x(), s3.y(), 0.0}; -// double a_2D = fabs(triangle_area(q0, q1, q2)); - -// return a_2D; //a_2D / a_3D; -} - -static void printLevel_onlysmall(const char* fn, - std::vector<MElement *> &elements, - std::map<MVertex*,SPoint2> *coordinates, - double version, - double tolerance) -{ - std::vector<MElement *> small; - double dx[3] = {0,0,0}; - int COUNT = 0; - for (unsigned i=0;i<elements.size();i++){ - double local_size = localSize(elements[i],*coordinates); - if (local_size < tolerance){ - small.push_back(elements[i]); - for (int j=0;j<3;j++){ - SPoint2 p = (*coordinates)[elements[i]->getVertex(j)]; - dx[0] += p.x(); - dx[1] += p.y(); - COUNT++; - } - } - } - dx[0] /= COUNT; - dx[1] /= COUNT; - dx[2] = 1./tolerance; - printLevel(fn,small,coordinates,version,dx); -} - -multiscaleLaplace::multiscaleLaplace (std::vector<MElement *> &elements, - std::map<MVertex*, SPoint3> &allCoordinates) -{ - //Find the boundary loops - //The loop with the largest equivalent radius is the Dirichlet boundary - std::vector<std::pair<MVertex*,double> > boundaryNodes; - ordering_dirichlet(elements,boundaryNodes); - - //Assign Dirichlet BCs - // FIXME: this is never deleted - root = new multiscaleLaplaceLevel; - root->elements = elements; - for(unsigned int i = 0; i < boundaryNodes.size(); i++){ - MVertex *v = boundaryNodes[i].first; - const double theta = 2 * M_PI * boundaryNodes[i].second; - root->coordinates[v] = SPoint2(cos(theta),sin(theta)); - } - - //Recursively parametrize - root->recur = 0; - root->region = 0; - root->scale = 1.0; - root->_name = "Root"; - - parametrize(*root); - - //fill the coordinates - std::vector<double> iScale; - std::vector<SPoint2> iCenter; - fillCoordinates(*root, allCoordinates, iScale, iCenter); - - //Compute centers for the cut - int nbElems = 0; - recur_compute_centers_ (1.0, M_PI, 0.0, root, nbElems); - - //Split the mesh in left and right - //or Cut the mesh in left and right (of bamg) - if ( CTX::instance()->mesh.algo2d == ALGO_2D_BAMG){ - printf("-------------> EXACT CUTTING \n"); - cutElems(elements); - } - else { - splitElems(elements); - } - -} - -void multiscaleLaplace::fillCoordinates (multiscaleLaplaceLevel & level, - std::map<MVertex*, SPoint3> &allCoordinates, - std::vector<double> &iScale, - std::vector<SPoint2> &iCenter) -{ - iScale.push_back(level.scale); - iCenter.push_back(level.center); - - for(unsigned int i = 0; i < level.elements.size(); ++i){ - MElement *e = level.elements[i]; - for(int j = 0; j<e->getNumVertices(); ++j){ - MVertex *v = e->getVertex(j); - SPoint2 coord = level.coordinates[v]; - for (int k= iScale.size()-1; k > 0; k--){ - coord = coord*iScale[k] + iCenter[k]; - } - allCoordinates[v] = SPoint3(coord.x(), coord.y(), 0.0); - } - } - - for (unsigned int i=0;i<level.children.size();i++){ - multiscaleLaplaceLevel* m = level.children[i]; - fillCoordinates(*m, allCoordinates, iScale, iCenter); - } -} - -void multiscaleLaplace::parametrize(multiscaleLaplaceLevel & level) -{ - //Compute all nodes for the level - std::set<MVertex*> allNodes; - for(unsigned int i = 0; i < level.elements.size(); ++i){ - MElement *e = level.elements[i]; - for(int j = 0; j<e->getNumVertices(); ++j){ - allNodes.insert(e->getVertex(j)); - } - } - - //Parametrize level - std::map<MVertex*,SPoint2> solution; - parametrize_method(level, allNodes, solution); - - //Compute the bbox of the parametric space - SBoundingBox3d bbox; - for(std::set<MVertex *>::iterator itv = allNodes.begin(); itv !=allNodes.end() ; ++itv){ - MVertex *v = *itv; - SPoint2 p = solution[v]; - bbox += SPoint3(p.x(),p.y(),0.0); - } - double global_size = bbox.max().distance(bbox.min()); - - //Check elements that are too small - std::vector<MElement*> tooSmall, goodSize; - for(unsigned int i = 0; i < level.elements.size(); ++i){ - MElement *e = level.elements[i]; - std::vector<SPoint2> localCoord; - double local_size = localSize(e,solution); - if (local_size < 1.e-6*global_size) - tooSmall.push_back(e); - else goodSize.push_back(e); - } - - //Only keep the connected elements vectors goodSize (the rest goes into tooSmall) - keepConnected(goodSize, tooSmall); - - //Add the not too small regions to the level.elements - std::vector<std::vector<MElement*> > regions_, regions ; - regions.clear(); regions_.clear(); - connectedRegions (tooSmall,regions_); - for (unsigned int i=0;i< regions_.size() ; i++){ - bool really_small_elements = false; - for (unsigned int k=0; k<regions_[i].size() ; k++){ - MElement *e = regions_[i][k]; - double local_size = localSize(e,solution); - if (local_size < 1.e-8*global_size) //1.e-7 - really_small_elements = true; - } - if(really_small_elements ){ - regions.push_back(regions_[i]); - } - else - goodSize.insert(goodSize.begin(), regions_[i].begin(), regions_[i].end() ); - } - - //check for convex small regions patches - for (unsigned int i = 0; i < regions.size(); i++){ - std::vector<MElement*> &elemR = regions[i]; - v2t_cont adj; - buildVertexToElement (elemR,adj); - for (std::vector<MElement*>::iterator it = elemR.begin(); it != elemR.end(); ++it){ - int nbNeigh = 0; - MElement *e = *it; - v2t_cont::iterator it0 = adj.find(e->getVertex(0)); - if(it0 != adj.end()) nbNeigh += it0->second.size(); - v2t_cont::iterator it1 = adj.find(e->getVertex(1)); - if(it1 != adj.end()) nbNeigh += it1->second.size(); - v2t_cont::iterator it2 = adj.find(e->getVertex(2)); - if(it2 != adj.end()) nbNeigh += it2->second.size(); - std::vector<MElement*>::iterator itp; - if (nbNeigh < 12) { - goodSize.push_back(e); - itp = it; - it++; - elemR.erase(itp); - } - } - keepConnected(elemR, goodSize); - } - tooSmall.clear(); - for (unsigned int i = 0; i < regions.size(); i++) - tooSmall.insert(tooSmall.begin(), regions[i].begin(), regions[i].end()); - - keepConnected(goodSize, tooSmall); - regions.clear(); - connectedRegions (tooSmall,regions); - - level.elements.clear(); - level.elements = goodSize; - - //Fill level.coordinates - std::set<MVertex*> goodSizev; - for(unsigned int i = 0; i < level.elements.size(); ++i){ - MElement *e = level.elements[i]; - for(int j = 0; j<e->getNumVertices(); ++j){ - MVertex *v = e->getVertex(j); - goodSizev.insert(v); - level.coordinates[v] = solution[v]; - } - } - - //Save multiscale meshes - std::string name1(level._name+"real.msh"); - std::string name2(level._name+"param.msh"); - std::string name3(level._name+"param_small.msh"); - printLevel (name1.c_str(),level.elements,0,2.2); - printLevel (name2.c_str(),level.elements,&level.coordinates,2.2); - printLevel_onlysmall (name3.c_str(),level.elements,&level.coordinates,2.2,1.e-15); - - //For every small region compute a new parametrization - Msg::Info("Level (%d-%d): %d connected small regions", - level.recur, level.region, regions.size()); - for (unsigned int i = 0; i < regions.size(); i++){ - std::set<MVertex*> tooSmallv; - tooSmallv.clear(); - for (unsigned int k=0; k<regions[i].size() ; k++){ - MElement *e = regions[i][k]; - for(int j = 0; j<e->getNumVertices(); ++j){ - tooSmallv.insert(e->getVertex(j)); - } - } - - // FIXME: this is never deleted - multiscaleLaplaceLevel *nextLevel = new multiscaleLaplaceLevel; - nextLevel->elements = regions[i]; - nextLevel->recur = level.recur+1; - nextLevel->region = i; - std::stringstream s1 ; s1 << nextLevel->recur; - std::stringstream s2 ; s2 << nextLevel->region; - nextLevel->_name = level._name+"-"+s1.str()+"-"+s2.str(); - SBoundingBox3d smallB; - for(std::set<MVertex *>::iterator itv = tooSmallv.begin(); - itv !=tooSmallv.end(); ++itv){ - SPoint2 p = solution[*itv]; - nextLevel->center += p; - smallB += SPoint3(p.x(),p.y(),0.0); - } - nextLevel->center *= (1./(double)tooSmallv.size()); - nextLevel->scale = smallB.max().distance(smallB.min()); - - for(std::set<MVertex *>::iterator itv = tooSmallv.begin(); - itv !=tooSmallv.end() ; ++itv){ - MVertex *v = *itv; - if (goodSizev.find(v) != goodSizev.end()){ - nextLevel->coordinates[v] = (solution[v]-nextLevel->center) * - (1./nextLevel->scale); - } - } - // recursively continue if tooSmall is not empty - if (!tooSmallv.empty()){ - Msg::Info("Level (%d-%d) Multiscale Laplace (reg[%d] = %d too small)", - level.recur,level.region, i, tooSmallv.size()); - level.children.push_back(nextLevel); - parametrize(*nextLevel); - } - } -} - -void multiscaleLaplace::parametrize_method (multiscaleLaplaceLevel & level, - std::set<MVertex*> &allNodes, - std::map<MVertex*,SPoint2> &solution) -{ - linearSystem<double> *_lsys; -#if defined(HAVE_PETSC) - _lsys = new linearSystemPETSc<double>; -#elif defined(HAVE_GMM) - linearSystemGmm<double> *_lsysb = new linearSystemGmm<double>; - _lsysb->setGmres(1); - _lsys = _lsysb; -#else - _lsys = new linearSystemFull<double>; -#endif - - solution.clear(); - simpleFunction<double> ONE(1.0); - - for (int step =0 ; step<2 ; step++){ - - dofManager<double> myAssembler(_lsys); - for(std::map<MVertex*,SPoint2>::iterator it = level.coordinates.begin(); - it != level.coordinates.end(); ++it){ - MVertex *v = it->first; - myAssembler.fixVertex(v, 0, 1, it->second[step]); - } - - // do the numbering - for(std::set<MVertex *>::iterator itv = allNodes.begin(); - itv != allNodes.end(); ++itv){ - MVertex *v = *itv; - myAssembler.numberVertex(v, 0, 1); - } - - // assemble - femTerm<double> *mapping; - mapping = new convexCombinationTerm(0, 1, &ONE); - - for(unsigned int i = 0; i < level.elements.size(); ++i){ - MElement *e = level.elements[i]; - SElement se(e); - mapping->addToMatrix(myAssembler, &se); - } - - delete mapping; - - // solve - if (myAssembler.sizeOfR() != 0) _lsys->systemSolve(); - - // get the values - for(std::set<MVertex *>::iterator itv = allNodes.begin(); - itv != allNodes.end(); ++itv){ - MVertex *v = *itv; - double value; - myAssembler.getDofValue(v, 0, 1, value); - if (step == 0)solution[v] = SPoint2(value,0); - else solution[v] = SPoint2(solution[v][0],value); - } - _lsys->clear(); - - } - - delete _lsys; -} - -void multiscaleLaplace::cutElems(std::vector<MElement *> &elements) -{ - std::map<MEdge,MVertex*,Less_Edge> cutEdges; - std::set<MEdge,Less_Edge> theCut; - std::set<MVertex*> cutVertices; - elements.clear(); - - recur_cut_edges_ (root, cutEdges,cutVertices); - recur_cut_elements_ (root,cutEdges,cutVertices,theCut, elements); - printCut(cutEdges, theCut, cutVertices); - - std::multimap<MEdge,MElement*,Less_Edge> e2e; - for (unsigned int i = 0; i < elements.size(); ++i){ - for (int j = 0; j < elements[i]->getNumEdges(); j++){ - e2e.insert(std::make_pair(elements[i]->getEdge(j),elements[i])); - } - } - std::set<MElement*> leftS; - leftS.clear(); - std::vector<MElement*> left,right; - recur_leftCut_ (elements[0], e2e, theCut, leftS); - - for (unsigned int i = 0; i < elements.size(); i++){ - MElement *e = elements[i]; - if (leftS.find(e) != leftS.end()) left.push_back(e); - else right.push_back(e); - } - - connected_left_right(left, right); - if (left.size() == 0 || right.size() == 0) { - Msg::Error("KO size left=%d, right=%d not good (zero elems)", - (int) left.size(), (int) right.size() ); - return; - } - - elements.clear(); - elements.insert(elements.end(),left.begin(),left.end()); - elements.insert(elements.end(),right.begin(),right.end()); - - printLevel ("Rootcut-left.msh",left,0,2.2); - printLevel ("Rootcut-right.msh",right,0,2.2); - printLevel ("Rootcut-all.msh",elements, 0,2.2); -} - -void multiscaleLaplace::splitElems(std::vector<MElement *> &elements) -{ - std::vector<MElement*> left,right; - recur_cut_ (1.0, M_PI, 0.0, root,left,right); - connected_left_right(left, right); - - printLevel ("Rootsplit-left.msh",left,0,2.2); - printLevel ("Rootsplit-right.msh",right,0,2.2); - printLevel ("Rootsplit-all.msh",elements, 0,2.2); - - printLevel ("Rootsplit-left-param.msh",left,&root->coordinates,2.2); - // printLevel_onlysmall ("Rootsplit-left-param10.msh",left,&root->coordinates,2.2,1.e-10); - // printLevel_onlysmall ("Rootsplit-left-param12.msh",left,&root->coordinates,2.2,1.e-12); - // printLevel_onlysmall ("Rootsplit-left-param15.msh",left,&root->coordinates,2.2,1.e-15); - - printLevel ("Rootsplit-right-param.msh",right,&root->coordinates,2.2); - // printLevel_onlysmall ("Rootsplit-right-param10.msh",right,&root->coordinates,2.2,1.e-10); - // printLevel_onlysmall ("Rootsplit-right-param12.msh",right,&root->coordinates,2.2,1.e-12); - // printLevel_onlysmall ("Rootsplit-right-param15.msh",right,&root->coordinates,2.2,1.e-15); - - // printLevel_onlysmall ("Rootsplit-all-param12.msh",elements,&root->coordinates,2.2,1.e-12); - // printLevel_onlysmall ("Rootsplit-all-param15.msh",elements,&root->coordinates,2.2,1.e-15); - - if ( elements.size() != left.size()+right.size()) { - Msg::Error("Cutting laplace wrong nb elements (%d) != left + right (%d)", - elements.size(), left.size()+right.size()); - return; - } - - elements.clear(); - elements.insert(elements.end(),left.begin(),left.end()); - elements.insert(elements.end(),right.begin(),right.end()); -} diff --git a/Solver/multiscaleLaplace.h b/Solver/multiscaleLaplace.h deleted file mode 100644 index b5411284fb98a7168387c44d0f2575d72ee8f853..0000000000000000000000000000000000000000 --- a/Solver/multiscaleLaplace.h +++ /dev/null @@ -1,50 +0,0 @@ -// Gmsh - Copyright (C) 1997-2017 C. Geuzaine, J.-F. Remacle -// -// See the LICENSE.txt file for license information. Please report all -// bugs and problems to the public mailing list <gmsh@onelab.info>. - -#ifndef _MULTISCALE_LAPLACE_H_ -#define _MULTISCALE_LAPLACE_H_ - -#include <vector> -#include <map> -#include <set> -#include "SPoint2.h" -#include "SPoint3.h" -#include "linearSystem.h" - -class MElement; -class MVertex; - -struct multiscaleLaplaceLevel { - SPoint2 center; - double scale; - double radius; - int recur,region; - std::vector<multiscaleLaplaceLevel*> children; - std::vector<MElement *> elements; - std::map<MVertex*,SPoint2> coordinates; - std::vector<std::pair<SPoint2,multiscaleLaplaceLevel*> > cut; - std::string _name; -}; - -class multiscaleLaplace{ -public: - multiscaleLaplace (std::vector<MElement *> &elements, - std::map<MVertex*, SPoint3> &allCoordinates); - void cutElems (std::vector<MElement *> &elements); - void splitElems (std::vector<MElement *> &elements); - - multiscaleLaplaceLevel* root; - void fillCoordinates (multiscaleLaplaceLevel & level, - std::map<MVertex*, SPoint3> &allCoordinates, - std::vector<double> &iScale, - std::vector<SPoint2> &iCenter); - void parametrize (multiscaleLaplaceLevel &); - void parametrize_method (multiscaleLaplaceLevel & level, - std::set<MVertex*> &allNodes, - std::map<MVertex*,SPoint2> &solution); - - -}; -#endif diff --git a/benchmarks/2d/compound.geo b/benchmarks/2d/compound.geo index f1c388e193191aa8d6bbb7568f6b122a0355de80..e2849269ba89bea8bb0abcc2938a2d5497fc285b 100644 --- a/benchmarks/2d/compound.geo +++ b/benchmarks/2d/compound.geo @@ -23,4 +23,4 @@ Line(15) = {8, 7}; Line Loop(100) = {13, -14, 15}; Plane Surface(11) = {10,100}; -Compound Surface(12)={9,11}; +Compound Surface{9,11}; diff --git a/benchmarks/2d/hybrid_compound.geo b/benchmarks/2d/hybrid_compound.geo index cbacae45b00f61c38257e08929db010fa77e9d0a..8a69f1fc91343b98fa62cba8f1be06dc359161fd 100644 --- a/benchmarks/2d/hybrid_compound.geo +++ b/benchmarks/2d/hybrid_compound.geo @@ -1,8 +1,9 @@ +General.MeshDiscrete = 1; + Merge "hybrid_part.msh"; -CreateTopology; -Compound Line(100) = {14}; -Compound Surface(101) = {16}; +Compound Line{14}; +Compound Surface{16}; lc = 1e-2; Point(1) = {0, 0, 0, lc}; @@ -12,5 +13,6 @@ Line(1) = {1,11} ; Line(3) = {14,4} ; Line(4) = {4,1} ; -Line Loop(5) = {-4,-1,100,-3} ; +Line Loop(5) = {-4,-1,14,-3} ; Plane Surface(6) = {5} ; + diff --git a/benchmarks/3d/CubeAniso2.geo b/benchmarks/3d/CubeAniso2.geo index 337fbb3666b21c2c28151ec1360eb172ee38f3d7..fa93a1fef14048e0eaa42149a2d6357cfceb806b 100644 --- a/benchmarks/3d/CubeAniso2.geo +++ b/benchmarks/3d/CubeAniso2.geo @@ -1,19 +1,10 @@ lc = 0.1; -Mesh.RemeshParametrization=1; //(0) harmonic (1) conformal -Mesh.RemeshAlgorithm=1; //(0) nosplit (1) automatic (2) split only with metis ///Default: 1 +General.MeshDiscrete=1; Merge "CubeAniso2D.msh"; -CreateTopology; -Compound Surface(106) = {6}; //, 15}; -Compound Surface(115) = {15}; -Compound Surface(119) = {19}; -Compound Surface(123) = {23}; -Compound Surface(127) = {27}; -Compound Surface(128) = {28}; - -Surface Loop(100) = {106, 115, 119,123,127,128}; +Surface Loop(100) = {6, 15, 19, 23, 27, 28}; Volume(1) = {100}; Field[2] = MathEvalAniso; diff --git a/benchmarks/extrude/Cylinder.geo b/benchmarks/extrude/Cylinder.geo index 4e0e81bd4f9cb72f46846683aa11e4758c755db1..187f27e6de52765222408613c8fef138baa19404 100644 --- a/benchmarks/extrude/Cylinder.geo +++ b/benchmarks/extrude/Cylinder.geo @@ -1,5 +1,3 @@ -Mesh.RemeshParametrization=1; //(0) harmonic (1) conformal -Mesh.RemeshAlgorithm=1; //(0) nosplit (1) automatic (2) split metis Point(1) = {0, 0, 0}; Point(2) = {1, 0, 0}; @@ -13,7 +11,3 @@ Circle(4) = {5, 1, 3}; Extrude {0, 0, 13} { Line{4, 1, 2, 3}; } - - -Compound Surface(10000) = {20, 16, 12, 8}; - diff --git a/benchmarks/extrude/aorta.geo b/benchmarks/extrude/aorta.geo index 507e3b2e70ace6ef14c4453a2ee35e1bb39015f3..5dace658c1a092c2d042c7085a943b652b0d0a8c 100644 --- a/benchmarks/extrude/aorta.geo +++ b/benchmarks/extrude/aorta.geo @@ -1,15 +1,13 @@ +General.MeshDiscrete = 1; Merge "aorta2.stl"; -CreateTopology; -//Merge "aortaRADIUS2.bgm"; +//Line Loop(60) = {1}; Plane Surface(61) = {60}; +//Line Loop(62) = {2}; Plane Surface(63) = {62}; +//Line Loop(64) = {3}; Plane Surface(65) = {64}; +//Line Loop(66) = {4}; Plane Surface(67) = {66}; +//Line Loop(68) = {5}; Plane Surface(69) = {68}; -Line Loop(60) = {1}; Plane Surface(61) = {60}; -Line Loop(62) = {2}; Plane Surface(63) = {62}; -Line Loop(64) = {3}; Plane Surface(65) = {64}; -Line Loop(66) = {4}; Plane Surface(67) = {66}; -Line Loop(68) = {5}; Plane Surface(69) = {68}; +//Mesh.Algorithm3D = 4; -Mesh.Algorithm3D = 4; - -Surface Loop(100) = {1, 61:69:2}; -Volume(100) = 100; +//Surface Loop(100) = {1, 61:69:2}; +//Volume(100) = 100; diff --git a/benchmarks/extrude/aorta_extrude.geo b/benchmarks/extrude/aorta_extrude.geo index 74c91413820c34c96241a2a7e180d113c9d12e52..88283f74fd5c4a644efde6461883c364e575e4cb 100644 --- a/benchmarks/extrude/aorta_extrude.geo +++ b/benchmarks/extrude/aorta_extrude.geo @@ -1,14 +1,14 @@ +General.MeshDiscrete = 1; Merge "aorta2.stl"; -CreateTopology; Merge "aortaRADIUS2.bgm"; // create a boundary layer, whose tickness is given in View[0] -out1[] = Extrude{Surface{-1}; Layers{4, 0.5}; Using Index[0]; Using View[0]; }; +//out1[] = Extrude{Surface{-1}; Layers{4, 0.5}; Using Index[0]; Using View[0]; }; // we could create a second boundary layer inside... //out2[] = Extrude{Surface{1}; Layers{4, -0.5}; Using Index[1]; Using View[0]; }; - +/* Line Loop(60) = {1}; Plane Surface(61) = {60}; Line Loop(62) = {2}; Plane Surface(63) = {62}; Line Loop(64) = {3}; Plane Surface(65) = {64}; @@ -19,3 +19,4 @@ Mesh.Algorithm3D = 4; Surface Loop(100) = {1, 61:69:2}; Volume(100) = 100; +*/ diff --git a/benchmarks/extrude/sphere_discrete.geo b/benchmarks/extrude/sphere_discrete.geo index 5417d009c3d609f0b4bb6544ec77829d58466b2a..f3bcd425fc7b3f00607c3b0c6870f46569bb0efc 100644 --- a/benchmarks/extrude/sphere_discrete.geo +++ b/benchmarks/extrude/sphere_discrete.geo @@ -1,14 +1,12 @@ -//Merge "sphere_boundary_layer.msh"; -Merge "sphere.stl"; -CreateTopology; +General.MeshDiscrete=1 ; -out[] = Extrude{ - Surface{1}; Layers{5, 0.1}; Recombine; -}; +// FIXME: re-add this once we have a good reparam -//the volume of the boundary layer is created -//with the extrusion - -//here we create the volume of the inside of the sphere -Surface Loop(100)={1}; -Volume(101)={100}; \ No newline at end of file +//Merge "sphere.stl"; +//out[] = Extrude{ +// Surface{1}; Layers{5, 0.1}; Recombine; +//}; +// the volume of the boundary layer is created with the extrusion +// here we create the volume of the inside of the sphere +//Surface Loop(100)={1}; +//Volume(101)={100}; diff --git a/doc/texinfo/gmsh.texi b/doc/texinfo/gmsh.texi index 2378519e840ace89e832c4c59fbb6065ad6d4f8c..f645649b3bb3455828860c32ce8e6df91e2fa633 100644 --- a/doc/texinfo/gmsh.texi +++ b/doc/texinfo/gmsh.texi @@ -1963,16 +1963,6 @@ Creates a path made of lines. Wires are only available with the OpenCASCADE kernel. They are used to create @code{ThruSections} and extrusions along paths. -@item Compound Line ( @var{expression} ) = @{ @var{expression-list} @}; -Creates a compound line from several elementary lines. When meshed, a -compound line will be reparametrized as a single line, whose mesh can -thus cross internal boundaries. The @var{expression} inside the -parentheses is the compound line's identification number; the -@var{expression-list} on the right hand side contains the identification -number of the elementary lines that should be reparametrized as a single -line. See @code{Compound Surface} for additional information on compound -entities. - @item Physical Line ( @var{expression} | @var{char-expression} <, @var{expression}> ) <+|->= @{ @var{expression-list} @}; Creates a physical line. The @var{expression} inside the parentheses is the physical line's identification number; the @var{expression-list} on @@ -2043,19 +2033,6 @@ elementary surfaces should be oriented consistently (using negative identification numbers to specify reverse orientation). (Surface loops are used to create volumes: see @ref{Volumes}.) -@item Compound Surface ( @var{expression} ) = @{ @var{expression-list} @} < Boundary @{ @{ @var{expression-list} @}, @{ @var{expression-list} @}, @{ @var{expression-list} @}, @{ @var{expression-list} @} @} > ; -Creates a compound surface from several elementary surfaces. When -meshed, a compound surface will be reparametrized as a single surface, -whose mesh can thus cross internal boundaries. Compound surfaces are -mostly useful for remeshing discrete models; see ``J.-F. Remacle, -C. Geuzaine, G. Compere and E. Marchandise, @emph{High Quality Surface -Remeshing Using Harmonic Maps}, International Journal for Numerical -Methods in Engineering, 2009'' for details as well as the wiki for more -examples. The @var{expression} inside the parentheses is the compound -surface's identification number; the mandatory @var{expression-list} on -the right hand side contains the identification number of the elementary -surfaces that should be reparametrized as a single surface. - @item Physical Surface ( @var{expression} | @var{char-expression} <, @var{expression}> ) <+|->= @{ @var{expression-list} @}; Creates a physical surface. The @var{expression} inside the parentheses is the physical surface's identification number; the @@ -2143,16 +2120,6 @@ the OpenCASCADE kernel. @c @item ThickSolid ( @var{expression} ) = @{ @var{expression-list} @}; @c todo: @code{ThickSolid} is only available with the OpenCASCADE kernel. -@item Compound Volume ( @var{expression} ) = @{ @var{expression-list} @}; -Creates a compound volume from several elementary volumes. When meshed, -a compound volume will be reparametrized as a single volume, whose mesh -can thus cross internal boundaries. The @var{expression} inside the -parentheses is the compound volume's identification number; the -@var{expression-list} on the right hand side contains the identification -number of the elementary volumes that should be reparametrized as a -single volume. See @code{Compound Surface} for additional information on -compound entities. - @item Physical Volume ( @var{expression} | @var{char-expression} <, @var{expression}> ) <+|->= @{ @var{expression-list} @}; Creates a physical volume. The @var{expression} inside the parentheses is the physical volume's identification number; the diff --git a/tutorial/t12.geo b/tutorial/t12.geo index 2e1856f00aa7be4da158531a4cf40386232e02f1..dc161c0f95b54d96cd4768198ee67b7e299def23 100644 --- a/tutorial/t12.geo +++ b/tutorial/t12.geo @@ -23,36 +23,14 @@ Line(4) = {9, 3}; Line(5) = {3, 4}; Line(6) = {4, 7}; Line(7) = {7, 6}; Line(8) = {6, 1}; Spline(9) = {7, 5, 9}; Line(10) = {6, 8}; -Line Loop(11) = {5, 6, 9, 4}; Surface(12) = {11}; -Line Loop(13) = {9, -3, -10, -7}; Surface(14) = {13}; -Line Loop(15) = {10, -2, -1, -8}; Surface(16) = {15}; +Line Loop(11) = {5, 6, 9, 4}; Surface(1) = {11}; +Line Loop(13) = {9, -3, -10, -7}; Surface(5) = {13}; +Line Loop(15) = {10, -2, -1, -8}; Surface(10) = {15}; // Treat lines 2, 3 and 4 as a single line -Compound Line(100) = {2, 3, 4}; +Compound Line{2, 3, 4}; // FIXME: not (re)implemeted yet // Idem with lines 6, 7 and 8 -Compound Line(101) = {6, 7, 8}; +Compound Line{6, 7, 8}; // FIXME: not (re)implemeted yet // Treat surfaces 12, 14 and 16 as a single surface -Compound Surface(200) = {12, 14, 16}; - -// Add option to toggle visibility of sub-entities -DefineConstant[ hide = {Geometry.HideCompounds, Choices{0,1}, - Name "Hide compound sub-entities", GmshOption "Geometry.HideCompounds", - AutoCheck 0} ]; - -// More details about the reparametrization technique can be found in the -// following papers: -// -// * J.-F. Remacle, C. Geuzaine, G. Comp�re and E. Marchandise, "High-Quality -// Surface Remeshing Using Harmonic Maps", International Journal for Numerical -// Methods in Engineering, 83 (4), pp. 403-425, 2010. -// -// * E. Marchandise, G. Comp�re, M. Willemet, G. Bricteux, C. Geuzaine and J-F -// Remacle, "Quality meshing based on STL triangulations for biomedical -// simulations", International Journal for Numerical Methods in Biomedical -// Engineering", 26 (7), pp. 876-889, 2010. -// -// * E. Marchandise, C. Carton de Wiart, W. G. Vos, C. Geuzaine and -// J.-F. Remacle, "High Quality Surface Remeshing Using Harmonic Maps. Part -// II: Surfaces with High Genus and of Large Aspect Ratio", International -// Journal for Numerical Methods in Engineering, 86 (11), pp. 1303-1321, 2011. +Compound Surface{1, 5, 10}; diff --git a/tutorial/t13.geo b/tutorial/t13.geo index 14e5023587ea376fd444a1359044e714968ea705..7ab78936bbad37f60e518f3b06d87be39cfe62fe 100644 --- a/tutorial/t13.geo +++ b/tutorial/t13.geo @@ -10,54 +10,32 @@ // them to remesh STL files, even if in this case there's usually only a single // elementary geometrical entity per compound. +// FIXME: compute parametrization of discrete surfaces read from mesh file +General.MeshDiscrete = 1; + // Let's merge the mesh that we would like to remesh. This mesh was reclassified // ("colored") from an initial STL triangulation using the "Reclassify 2D" tool // in Gmsh, so that we could split it along sharp geometrical features. Merge "t13_data.msh"; -// Since the original mesh is a bit coarse, we refine it once -RefineMesh; - -// Create the topology of the discrete model -CreateTopology; - // We can now define a compound line (resp. surface) for each discrete line // (resp. surface) in the model -ll[] = Line {:}; -For j In {0 : #ll[]-1} - Compound Line(newl) = ll[j]; -EndFor ss[] = Surface {:}; -s = news; -For i In {0 : #ss[]-1} - Compound Surface(s+i) = ss[i]; -EndFor -// And we can create the volume based on the new compound entities -Surface Loop(1) = {s : s + #ss[]-1}; -Volume(1) = {1}; +// FIXME: does not do anything yet (because the underlying surfaces are +// discrete): +Compound Surface{ss[]}; -Physical Surface(1) = {s : s + #ss[]-1}; -Physical Volume(1) = 1; -Physical Line(1) = {26 ... 37}; +// FIXME: re-add this when we use a good parametrization +//Surface Loop(1) = {ss[]}; +//Volume(1) = {1}; // element size imposed by a size field Field[1] = MathEval; -Field[1].F = "2.0"; +Field[1].F = "1.5"; Background Field = 1; -DefineConstant[ - funny = {0, Choices{0,1}, - Name "Parameters/Apply funny mesh size field?"}, - hide = {Geometry.HideCompounds, Choices{0,1}, - AutoCheck 0, GmshOption "Geometry.HideCompounds", - Name "Parameters/Hide compound sub-entities"} -]; - +funny = DefineNumber[0, Choices{0,1}, Name "Parameters/Apply funny mesh size field?" ]; If(funny) Field[1].F = "2*Sin((x+y)/5) + 3"; EndIf - -Mesh.RemeshAlgorithm = 1; // automatic -Mesh.RemeshParametrization = 7; // conformal finite element -Mesh.Algorithm = 6; // Frontal