-<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">\r
-<html>\r
-<head>\r
- \r
- <meta http-equiv="Content-Type"\r
- content="text/html; charset=iso-8859-1">\r
- \r
- <meta name="GENERATOR"\r
- content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">\r
- <title>Main Page</title>\r
- \r
- <link href="doxygen.css" rel="stylesheet" type="text/css">\r
-</head>\r
- <body>\r
- \r
-<center> \r
-<table width="96%">\r
- <tbody>\r
- <tr>\r
- <td><a href="http://www.opencascade.com"><img src="sources/logocorp.gif"\r
- border="0" height="46" width="122">\r
- </a></td>\r
- <td> \r
- <div align="right"><a href="http://www.opencascade.org/SALOME/"><img\r
- src="sources/application.gif" border="0" height="46" width="108">\r
- </a></div>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- </center>\r
- \r
-<h1><a name="page2">Examples</a> </h1>\r
- <big><b><i> Interfaces:</i></b></big><br>\r
- <a class="el"\r
- href="examples_VISU.html#Base"><br>\r
- VISU::Base</a><br>\r
- <a class="el" href="#VISU_Gen">VISU::VISU_Gen</a><br>\r
- <a class="el"\r
- href="examples_VISU.html#PrsObject">VISU::PrsObject<br>\r
- </a><br>\r
- <a class="el"\r
- href="interfaceVISU_1_1Result.html">VISU::Result</a><a\r
- class="el"\r
- href="examples_VISU.html#Prs3d"><br>\r
- <br>\r
- VISU::Prs3d</a><br>\r
- <a class="el"\r
- href="examples_VISU.html#Mesh">VISU::Mesh</a><br>\r
- <a class="el"\r
- href="examples_VISU.html#ScalarMap">VISU::ScalarMap</a><br>\r
- <a class="el" href="#CutPlanes">VISU::CutPlanes</a><br>\r
- <a class="el" href="#CutLines">VISU::CutLines</a><br>\r
- <a class="el" href="#IsoSurfaces">VISU::IsoSurfaces</a><br>\r
- <a class="el"\r
- href="examples_VISU.html#DeformedShape">VISU::DeformedShape</a><br>\r
- <a class="el" href="#Vectors">VISU::Vectors</a><br>\r
- <a class="el"\r
- href="interfaceVISU_1_1StreamLines.html">VISU::StreamLines</a><br>\r
- <br>\r
- <a class="el" href="#Table">VISU::Table</a><br>\r
- <a class="el"\r
- href="interfaceVISU_1_1Curve.html">VISU::Curve</a><br>\r
- <a class="el"\r
- href="interfaceVISU_1_1Container.html">VISU::Container</a><br>\r
- <a class="el"\r
- href="interfaceVISU_1_1ViewManager.html"><br>\r
- VISU::ViewManager</a><br>\r
- <a class="el"\r
- href="interfaceVISU_1_1View.html">VISU::View</a><br>\r
- <a class="el"\r
- href="interfaceVISU_1_1View3D.html">VISU::View3D</a><br>\r
- <a class="el"\r
- href="interfaceVISU_1_1TableView.html">VISU::TableView</a><br>\r
- <a class="el"\r
- href="interfaceVISU_1_1XYPlot.html">VISU::XYPlot</a><br>\r
- \r
-<h3><a name="Base"></a>Base</h3>\r
- \r
-<table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"><a class="el"\r
- href="namespaceVISU.html#a0">IdType</a>\r
- VISU::Base::GetID </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="mdname1" valign="top" nowrap> \r
- </td>\r
- <td class="md" valign="top">) </td>\r
- <td class="md" nowrap><br>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- \r
-<p>#Returns ID of the object. That is IOR of CORBA representation a VISU\r
-object.<br>\r
- </p>\r
- \r
-<p>aSObject = myLocalStudy.FindObjectIOR(theResult.GetID()) <br>\r
- </p>\r
- \r
-<table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"><a class="el"\r
- href="namespaceVISU.html#a39">VISUType</a>\r
- VISU::Base::GetType </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="mdname1" valign="top" nowrap> \r
- </td>\r
- <td class="md" valign="top">) </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- \r
-<p>#Returns the type of the presentable object. It can be used for quick\r
-class definition of an VISU object<br>\r
- <br>\r
- if aVISUObject.GetType() == VISU.TSCALARMAP :<br>\r
- #do something ...<br>\r
- </p>\r
- \r
-<p><br>\r
-</p>\r
-<h3><a name="VISU_Gen"></a><big>VISU_Gen</big><br>\r
- </h3>\r
- \r
-<table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"> void VISU::VISU_Gen::SetCurrentStudy \r
- </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="md" nowrap valign="top">in <a class="el"\r
- href="interfaceSALOMEDS_1_1Study.html">SALOMEDS::Study</a> </td>\r
- <td class="mdname1" valign="top" nowrap> <em>theStudy</em> \r
- </td>\r
- <td class="md" valign="top">) </td>\r
- <td class="md" nowrap><br>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- <br>\r
- \r
-<p> \r
-<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md"> \r
- <table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"> <a class="el"\r
- href="interfaceSALOMEDS_1_1Study.html">SALOMEDS::Study</a> \r
-VISU::VISU_Gen::GetCurrentStudy </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="mdname1" valign="top" nowrap> \r
- </td>\r
- <td class="md" valign="top">) </td>\r
- <td class="md" nowrap><br>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- <br>\r
- #It is very important to set SALOMEDS::Study for VISU Engine before you\r
-start any work with them.<br>\r
- #Every object that you will create will be assigned to the study you set \r
-before.<br>\r
- #It can be done like this:<br>\r
- <p></p>\r
- \r
-<p>aStudy = myStudyManager.NewStudy("A foo Study")<br>\r
- if aStudy is None : raise RuntimeError, "Error"<br>\r
- else : print "OK"<br>\r
- theVisuGen.SetCurrentStudy(aStudy)<br>\r
- #to do every things you like<br>\r
- ...<br>\r
- </p>\r
- \r
-<p> \r
-<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md"> \r
- <table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"> <a class="el"\r
- href="interfaceVISU_1_1ViewManager.html">ViewManager</a> \r
-VISU::VISU_Gen::GetViewManager </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="mdname1" valign="top" nowrap> \r
- </td>\r
- <td class="md" valign="top">) </td>\r
- <td class="md" nowrap><br>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- \r
-<table cellspacing="5" cellpadding="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td> </td>\r
- <td> \r
- <p> Gets the ViewManager which is used for creation of post-processing \r
-presentations. </p>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- <br>\r
- #In order to display any VISU::PrsObject in propriate viewer you must take \r
-VISU::ViewManager interface<br>\r
- <p></p>\r
- \r
-<p>aViewManager = myVisuGen.GetViewManager()<br>\r
- #to do something for displaing some presentation<br>\r
- ...<br>\r
- </p>\r
- \r
-<p> \r
-<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md"> \r
- <table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"> <a class="el"\r
- href="interfaceSALOMEDS_1_1SObject.html">SALOMEDS::SObject</a> \r
-VISU::VISU_Gen::ImportTables </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="md" nowrap valign="top">in string </td>\r
- <td class="mdname1" valign="top" nowrap> <em>theFileName</em> \r
- </td>\r
- <td class="md" valign="top">) </td>\r
- <td class="md" nowrap><br>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- \r
-<table cellspacing="5" cellpadding="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td> </td>\r
- <td> \r
- <p> Imports tables from a file and create TableAttribute in Sudy \r
- </p>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- <br>\r
- #It is possible to import some ASCII files that include text table representation. \r
-One file can consist from more than one table.<br>\r
- <p></p>\r
- \r
-<p>aSObject = myVisuGen.ImportTables("/MyPresicousFileOfTables.txt")<br>\r
- </p>\r
- \r
-<p> \r
-<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md"> \r
- <table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"> <a class="el"\r
- href="interfaceVISU_1_1Result.html">Result</a> \r
-VISU::VISU_Gen::ImportFile </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="md" nowrap valign="top">in string </td>\r
- <td class="mdname1" valign="top" nowrap> <em>theFileName</em> \r
- </td>\r
- <td class="md" valign="top">) </td>\r
- <td class="md" nowrap><br>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- \r
-<table cellspacing="5" cellpadding="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td> </td>\r
- <td> \r
- <p> Imports data from a file. </p>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- <br>\r
- #It is possible import a med files to VISU<br>\r
- <p></p>\r
- \r
-<p>aResult = myVisuGen.ImportFile("/ItIsDreamOfMyLife.med")<br>\r
- </p>\r
- \r
-<p> \r
-<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md"> \r
- <table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"> <a class="el"\r
- href="interfaceVISU_1_1Result.html">Result</a> \r
-VISU::VISU_Gen::ImportMed </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="md" nowrap valign="top">in <a class="el"\r
- href="interfaceSALOMEDS_1_1SObject.html">SALOMEDS::SObject</a> </td>\r
- <td class="mdname1" valign="top" nowrap> <em>theMedSObject</em> \r
- </td>\r
- <td class="md" valign="top">) </td>\r
- <td class="md" nowrap><br>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- \r
-<table cellspacing="5" cellpadding="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td> </td>\r
- <td> \r
- <p> Imports data from a MED object. </p>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- <br>\r
- #<br>\r
- <p></p>\r
- \r
-<p> \r
-<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md"> \r
- <table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"> <a class="el"\r
- href="interfaceVISU_1_1Result.html">Result</a> \r
-VISU::VISU_Gen::ImportMedField </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="md" nowrap valign="top">in <a class="el"\r
- href="interfaceSALOME__MED_1_1FIELD.html">SALOME_MED::FIELD</a> </td>\r
- <td class="mdname1" valign="top" nowrap> <em>theField</em> \r
- </td>\r
- <td class="md" valign="top">) </td>\r
- <td class="md" nowrap><br>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- \r
-<table cellspacing="5" cellpadding="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td> </td>\r
- <td> \r
- <p> Imports data from a MED field. </p>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- <p></p>\r
- \r
-<p> \r
-<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md"> \r
- <table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"> <a class="el"\r
- href="interfaceVISU_1_1Mesh.html">Mesh</a> \r
-VISU::VISU_Gen::MeshOnEntity </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="md" nowrap valign="top">in <a class="el"\r
- href="interfaceVISU_1_1Result.html">Result</a> </td>\r
- <td class="mdname" nowrap> <em>theResult</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in string </td>\r
- <td class="mdname" nowrap> <em>theMeshName</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in <a class="el"\r
- href="namespaceVISU.html#a38">Entity</a> </td>\r
- <td class="mdname" nowrap> <em>theEntity</em></td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td class="md">) </td>\r
- <td class="md" colspan="2"><br>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- \r
-<table cellspacing="5" cellpadding="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td> </td>\r
- <td> \r
- <p> Creates a Mesh on the basis of the data generated in other sources \r
-(MED object or file). </p>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- <p></p>\r
- \r
-<p> \r
-<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md"> \r
- <table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"> <a class="el"\r
- href="interfaceVISU_1_1Mesh.html">Mesh</a> \r
-VISU::VISU_Gen::FamilyMeshOnEntity </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="md" nowrap valign="top">in <a class="el"\r
- href="interfaceVISU_1_1Result.html">Result</a> </td>\r
- <td class="mdname" nowrap> <em>theResult</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in string </td>\r
- <td class="mdname" nowrap> <em>theMeshName</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in <a class="el"\r
- href="namespaceVISU.html#a38">Entity</a> </td>\r
- <td class="mdname" nowrap> <em>theEntity</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in string </td>\r
- <td class="mdname" nowrap> <em>theFamilyName</em></td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td class="md">) </td>\r
- <td class="md" colspan="2"><br>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- <p></p>\r
- \r
-<p> \r
-<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md"> \r
- <table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"> <a class="el"\r
- href="interfaceVISU_1_1Mesh.html">Mesh</a> \r
-VISU::VISU_Gen::GroupMesh </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="md" nowrap valign="top">in <a class="el"\r
- href="interfaceVISU_1_1Result.html">Result</a> </td>\r
- <td class="mdname" nowrap> <em>theResult</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in string </td>\r
- <td class="mdname" nowrap> <em>theMeshName</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in string </td>\r
- <td class="mdname" nowrap> <em>theGroupName</em></td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td class="md">) </td>\r
- <td class="md" colspan="2"><br>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- <p></p>\r
- \r
-<p> \r
-<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md"> \r
- <table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"> <a class="el"\r
- href="interfaceVISU_1_1ScalarMap.html">ScalarMap</a> \r
-VISU::VISU_Gen::ScalarMapOnField </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="md" nowrap valign="top">in <a class="el"\r
- href="interfaceVISU_1_1Result.html">Result</a> </td>\r
- <td class="mdname" nowrap> <em>theResult</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in string </td>\r
- <td class="mdname" nowrap> <em>theMeshName</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in <a class="el"\r
- href="namespaceVISU.html#a38">Entity</a> </td>\r
- <td class="mdname" nowrap> <em>theEntity</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in string </td>\r
- <td class="mdname" nowrap> <em>theFieldName</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in double </td>\r
- <td class="mdname" nowrap> <em>theIteration</em></td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td class="md">) </td>\r
- <td class="md" colspan="2"><br>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- \r
-<table cellspacing="5" cellpadding="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td> </td>\r
- <td> \r
- <p> Creates a scalar bar presentation. </p>\r
- \r
- <dl compact>\r
- <dt><b> Parameters: </b></dt>\r
- <dd> \r
- <table border="0" cellspacing="2" cellpadding="0">\r
- <tbody>\r
- <tr>\r
- <td valign="top"><em>theResult</em> </td>\r
- <td> Data generated in other sources. (MED object or file) \r
- </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theMeshName</em> </td>\r
- <td> One of the meshes presented in MED file </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theEntity</em> </td>\r
- <td> Type of entity where the field is defined </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theFieldName</em> </td>\r
- <td> Group of data attributed to the MESH. The data can\r
-be scalar or vector. </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theIteration</em> </td>\r
- <td> Number of iteration on the field </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </dd>\r
- </dl>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- <p></p>\r
- \r
-<p> \r
-<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md"> \r
- <table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"> <a class="el"\r
- href="interfaceVISU_1_1DeformedShape.html">DeformedShape</a> \r
-VISU::VISU_Gen::DeformedShapeOnField </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="md" nowrap valign="top">in <a class="el"\r
- href="interfaceVISU_1_1Result.html">Result</a> </td>\r
- <td class="mdname" nowrap> <em>theResult</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in string </td>\r
- <td class="mdname" nowrap> <em>theMeshName</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in <a class="el"\r
- href="namespaceVISU.html#a38">Entity</a> </td>\r
- <td class="mdname" nowrap> <em>theEntity</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in string </td>\r
- <td class="mdname" nowrap> <em>theFieldName</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in double </td>\r
- <td class="mdname" nowrap> <em>theIteration</em></td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td class="md">) </td>\r
- <td class="md" colspan="2"><br>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- \r
-<table cellspacing="5" cellpadding="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td> </td>\r
- <td> \r
- <p> Creates a deformed shape presentation. </p>\r
- \r
- <dl compact>\r
- <dt><b> Parameters: </b></dt>\r
- <dd> \r
- <table border="0" cellspacing="2" cellpadding="0">\r
- <tbody>\r
- <tr>\r
- <td valign="top"><em>theResult</em> </td>\r
- <td> Data generated in other sources. (MED object or file) \r
- </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theMeshName</em> </td>\r
- <td> One of the meshes presented in MED file </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theEntity</em> </td>\r
- <td> Type of entity where the field is defined </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theFieldName</em> </td>\r
- <td> Group of data attributed to the MESH. The data can\r
-be scalar or vector. </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theIteration</em> </td>\r
- <td> Number of iteration on the field </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </dd>\r
- </dl>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- <p></p>\r
- \r
-<p> \r
-<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md"> \r
- <table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"> <a class="el"\r
- href="interfaceVISU_1_1Vectors.html">Vectors</a> \r
-VISU::VISU_Gen::VectorsOnField </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="md" nowrap valign="top">in <a class="el"\r
- href="interfaceVISU_1_1Result.html">Result</a> </td>\r
- <td class="mdname" nowrap> <em>theResult</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in string </td>\r
- <td class="mdname" nowrap> <em>theMeshName</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in <a class="el"\r
- href="namespaceVISU.html#a38">Entity</a> </td>\r
- <td class="mdname" nowrap> <em>theEntity</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in string </td>\r
- <td class="mdname" nowrap> <em>theFieldName</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in double </td>\r
- <td class="mdname" nowrap> <em>theIteration</em></td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td class="md">) </td>\r
- <td class="md" colspan="2"><br>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- \r
-<table cellspacing="5" cellpadding="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td> </td>\r
- <td> \r
- <p> Creates a vector presentation. </p>\r
- \r
- <dl compact>\r
- <dt><b> Parameters: </b></dt>\r
- <dd> \r
- <table border="0" cellspacing="2" cellpadding="0">\r
- <tbody>\r
- <tr>\r
- <td valign="top"><em>theResult</em> </td>\r
- <td> Data generated in other sources. (MED object or file) \r
- </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theMeshName</em> </td>\r
- <td> One of the meshes presented in MED file </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theEntity</em> </td>\r
- <td> Type of entity where the field is defined </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theFieldName</em> </td>\r
- <td> Group of data attributed to the MESH. The data can\r
-be scalar or vector. </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theIteration</em> </td>\r
- <td> Number of iteration on the field </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </dd>\r
- </dl>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- <p></p>\r
- \r
-<p> \r
-<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md"> \r
- <table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"> <a class="el"\r
- href="interfaceVISU_1_1IsoSurfaces.html">IsoSurfaces</a> \r
-VISU::VISU_Gen::IsoSurfacesOnField </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="md" nowrap valign="top">in <a class="el"\r
- href="interfaceVISU_1_1Result.html">Result</a> </td>\r
- <td class="mdname" nowrap> <em>theResult</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in string </td>\r
- <td class="mdname" nowrap> <em>theMeshName</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in <a class="el"\r
- href="namespaceVISU.html#a38">Entity</a> </td>\r
- <td class="mdname" nowrap> <em>theEntity</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in string </td>\r
- <td class="mdname" nowrap> <em>theFieldName</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in double </td>\r
- <td class="mdname" nowrap> <em>theIteration</em></td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td class="md">) </td>\r
- <td class="md" colspan="2"><br>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- \r
-<table cellspacing="5" cellpadding="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td> </td>\r
- <td> \r
- <p> Creates an iso surface presentation. </p>\r
- \r
- <dl compact>\r
- <dt><b> Parameters: </b></dt>\r
- <dd> \r
- <table border="0" cellspacing="2" cellpadding="0">\r
- <tbody>\r
- <tr>\r
- <td valign="top"><em>theResult</em> </td>\r
- <td> Data generated in other sources. (MED object or file) \r
- </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theMeshName</em> </td>\r
- <td> One of the meshes presented in MED file </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theEntity</em> </td>\r
- <td> Type of entity where the field is defined </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theFieldName</em> </td>\r
- <td> Group of data attributed to the MESH. The data can\r
-be scalar or vector. </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theIteration</em> </td>\r
- <td> Number of iteration on the field </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </dd>\r
- </dl>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- <p></p>\r
- \r
-<p> \r
-<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md"> \r
- <table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"> <a class="el"\r
- href="interfaceVISU_1_1StreamLines.html">StreamLines</a> \r
-VISU::VISU_Gen::StreamLinesOnField </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="md" nowrap valign="top">in <a class="el"\r
- href="interfaceVISU_1_1Result.html">Result</a> </td>\r
- <td class="mdname" nowrap> <em>theResult</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in string </td>\r
- <td class="mdname" nowrap> <em>theMeshName</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in <a class="el"\r
- href="namespaceVISU.html#a38">Entity</a> </td>\r
- <td class="mdname" nowrap> <em>theEntity</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in string </td>\r
- <td class="mdname" nowrap> <em>theFieldName</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in double </td>\r
- <td class="mdname" nowrap> <em>theIteration</em></td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td class="md">) </td>\r
- <td class="md" colspan="2"><br>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- \r
-<table cellspacing="5" cellpadding="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td> </td>\r
- <td> \r
- <p> Creates an stream lines presentation. </p>\r
- \r
- <dl compact>\r
- <dt><b> Parameters: </b></dt>\r
- <dd> \r
- <table border="0" cellspacing="2" cellpadding="0">\r
- <tbody>\r
- <tr>\r
- <td valign="top"><em>theResult</em> </td>\r
- <td> Data generated in other sources. (MED object or file) \r
- </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theMeshName</em> </td>\r
- <td> One of the meshes presented in MED file </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theEntity</em> </td>\r
- <td> Type of entity where the field is defined </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theFieldName</em> </td>\r
- <td> Group of data attributed to the MESH. The data can\r
-be scalar or vector. </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theIteration</em> </td>\r
- <td> Number of iteration on the field </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </dd>\r
- </dl>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- <p></p>\r
- \r
-<p> \r
-<table width="100%" cellpadding="2" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md"> \r
- <table cellpadding="0" cellspacing="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td class="md" nowrap valign="top"> <a class="el"\r
- href="interfaceVISU_1_1CutPlanes.html">CutPlanes</a> \r
-VISU::VISU_Gen::CutPlanesOnField </td>\r
- <td class="md" valign="top">( </td>\r
- <td class="md" nowrap valign="top">in <a class="el"\r
- href="interfaceVISU_1_1Result.html">Result</a> </td>\r
- <td class="mdname" nowrap> <em>theResult</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in string </td>\r
- <td class="mdname" nowrap> <em>theMeshName</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in <a class="el"\r
- href="namespaceVISU.html#a38">Entity</a> </td>\r
- <td class="mdname" nowrap> <em>theEntity</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in string </td>\r
- <td class="mdname" nowrap> <em>theFieldName</em>, \r
- </td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td><br>\r
- </td>\r
- <td class="md" nowrap>in double </td>\r
- <td class="mdname" nowrap> <em>theIteration</em></td>\r
- </tr>\r
- <tr>\r
- <td><br>\r
- </td>\r
- <td class="md">) </td>\r
- <td class="md" colspan="2"><br>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
- </table>\r
- </td>\r
- </tr>\r
- \r
- </tbody> \r
-</table>\r
- \r
-<table cellspacing="5" cellpadding="0" border="0">\r
- <tbody>\r
- <tr>\r
- <td> </td>\r
- <td> \r
- <p> Creates a presentation of cut planes. </p>\r
- \r
- <dl compact>\r
- <dt><b> Parameters: </b></dt>\r
- <dd> \r
- <table border="0" cellspacing="2" cellpadding="0">\r
- <tbody>\r
- <tr>\r
- <td valign="top"><em>theResult</em> </td>\r
- <td> Data generated in other sources. (MED object or file) \r
- </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theMeshName</em> </td>\r
- <td> One of the meshes presented in MED file </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theEntity</em> </td>\r
- <td> Type of entity where the field is defined </td>\r
- </tr>\r
- <tr>\r
- <td valign="top"><em>theFieldName</em> </td>\r
+<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+
+ <meta http-equiv="Content-Type"
+ content="text/html; charset=iso-8859-1">
+
+ <meta name="GENERATOR"
+ content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">
+ <title>Main Page</title>
+
+ <link href="doxygen.css" rel="stylesheet" type="text/css">
+</head>
+ <body>
+
+<center>
+<table width="96%">
+ <tbody>
+ <tr>
+ <td><a href="http://www.opencascade.com"><img src="sources/logocorp.gif"
+ border="0" height="46" width="122">
+ </a></td>
+ <td>
+ <div align="right"><a href="http://www.opencascade.org/SALOME/"><img
+ src="sources/application.gif" border="0" height="46" width="108">
+ </a></div>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+ </center>
+
+<h1><a name="page2">Examples</a> </h1>
+ <big><b><i> Interfaces:</i></b></big><br>
+ <a class="el"
+ href="examples_VISU.html#Base"><br>
+ VISU::Base</a><br>
+ <a class="el" href="#VISU_Gen">VISU::VISU_Gen</a><br>
+ <a class="el"
+ href="examples_VISU.html#PrsObject">VISU::PrsObject<br>
+ </a><br>
+ <a class="el"
+ href="interfaceVISU_1_1Result.html">VISU::Result</a><a
+ class="el"
+ href="examples_VISU.html#Prs3d"><br>
+ <br>
+ VISU::Prs3d</a><br>
+ <a class="el"
+ href="examples_VISU.html#Mesh">VISU::Mesh</a><br>
+ <a class="el"
+ href="examples_VISU.html#ScalarMap">VISU::ScalarMap</a><br>
+ <a class="el" href="#CutPlanes">VISU::CutPlanes</a><br>
+ <a class="el" href="#CutLines">VISU::CutLines</a><br>
+ <a class="el" href="#IsoSurfaces">VISU::IsoSurfaces</a><br>
+ <a class="el"
+ href="examples_VISU.html#DeformedShape">VISU::DeformedShape</a><br>
+ <a class="el" href="#Vectors">VISU::Vectors</a><br>
+ <a class="el"
+ href="interfaceVISU_1_1StreamLines.html">VISU::StreamLines</a><br>
+ <br>
+ <a class="el" href="#Table">VISU::Table</a><br>
+ <a class="el"
+ href="interfaceVISU_1_1Curve.html">VISU::Curve</a><br>
+ <a class="el"
+ href="interfaceVISU_1_1Container.html">VISU::Container</a><br>
+ <a class="el"
+ href="interfaceVISU_1_1ViewManager.html"><br>
+ VISU::ViewManager</a><br>
+ <a class="el"
+ href="interfaceVISU_1_1View.html">VISU::View</a><br>
+ <a class="el"
+ href="interfaceVISU_1_1View3D.html">VISU::View3D</a><br>
+ <a class="el"
+ href="interfaceVISU_1_1TableView.html">VISU::TableView</a><br>
+ <a class="el"
+ href="interfaceVISU_1_1XYPlot.html">VISU::XYPlot</a><br>
+
+<h3><a name="Base"></a>Base</h3>
+
+<table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el"
+ href="namespaceVISU.html#a0">IdType</a>
+ VISU::Base::GetID </td>
+ <td class="md" valign="top">( </td>
+ <td class="mdname1" valign="top" nowrap>
+ </td>
+ <td class="md" valign="top">) </td>
+ <td class="md" nowrap><br>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+
+<p>#Returns ID of the object. That is IOR of CORBA representation a VISU
+object.<br>
+ </p>
+
+<p>aSObject = myLocalStudy.FindObjectIOR(theResult.GetID()) <br>
+ </p>
+
+<table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"><a class="el"
+ href="namespaceVISU.html#a39">VISUType</a>
+ VISU::Base::GetType </td>
+ <td class="md" valign="top">( </td>
+ <td class="mdname1" valign="top" nowrap>
+ </td>
+ <td class="md" valign="top">) </td>
+ </tr>
+
+ </tbody>
+</table>
+
+<p>#Returns the type of the presentable object. It can be used for quick
+class definition of an VISU object<br>
+ <br>
+ if aVISUObject.GetType() == VISU.TSCALARMAP :<br>
+ #do something ...<br>
+ </p>
+
+<p><br>
+</p>
+<h3><a name="VISU_Gen"></a><big>VISU_Gen</big><br>
+ </h3>
+
+<table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"> void VISU::VISU_Gen::SetCurrentStudy
+ </td>
+ <td class="md" valign="top">( </td>
+ <td class="md" nowrap valign="top">in <a class="el"
+ href="interfaceSALOMEDS_1_1Study.html">SALOMEDS::Study</a> </td>
+ <td class="mdname1" valign="top" nowrap> <em>theStudy</em>
+ </td>
+ <td class="md" valign="top">) </td>
+ <td class="md" nowrap><br>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+ <br>
+
+<p>
+<table width="100%" cellpadding="2" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"> <a class="el"
+ href="interfaceSALOMEDS_1_1Study.html">SALOMEDS::Study</a>
+VISU::VISU_Gen::GetCurrentStudy </td>
+ <td class="md" valign="top">( </td>
+ <td class="mdname1" valign="top" nowrap>
+ </td>
+ <td class="md" valign="top">) </td>
+ <td class="md" nowrap><br>
+ </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+ <br>
+ #It is very important to set SALOMEDS::Study for VISU Engine before you
+start any work with them.<br>
+ #Every object that you will create will be assigned to the study you set
+before.<br>
+ #It can be done like this:<br>
+ <p></p>
+
+<p>aStudy = myStudyManager.NewStudy("A foo Study")<br>
+ if aStudy is None : raise RuntimeError, "Error"<br>
+ else : print "OK"<br>
+ theVisuGen.SetCurrentStudy(aStudy)<br>
+ #to do every things you like<br>
+ ...<br>
+ </p>
+
+<p>
+<table width="100%" cellpadding="2" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"> <a class="el"
+ href="interfaceVISU_1_1ViewManager.html">ViewManager</a>
+VISU::VISU_Gen::GetViewManager </td>
+ <td class="md" valign="top">( </td>
+ <td class="mdname1" valign="top" nowrap>
+ </td>
+ <td class="md" valign="top">) </td>
+ <td class="md" nowrap><br>
+ </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+
+<table cellspacing="5" cellpadding="0" border="0">
+ <tbody>
+ <tr>
+ <td> </td>
+ <td>
+ <p> Gets the ViewManager which is used for creation of post-processing
+presentations. </p>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+ <br>
+ #In order to display any VISU::PrsObject in propriate viewer you must take
+VISU::ViewManager interface<br>
+ <p></p>
+
+<p>aViewManager = myVisuGen.GetViewManager()<br>
+ #to do something for displaing some presentation<br>
+ ...<br>
+ </p>
+
+<p>
+<table width="100%" cellpadding="2" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"> <a class="el"
+ href="interfaceSALOMEDS_1_1SObject.html">SALOMEDS::SObject</a>
+VISU::VISU_Gen::ImportTables </td>
+ <td class="md" valign="top">( </td>
+ <td class="md" nowrap valign="top">in string </td>
+ <td class="mdname1" valign="top" nowrap> <em>theFileName</em>
+ </td>
+ <td class="md" valign="top">) </td>
+ <td class="md" nowrap><br>
+ </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+
+<table cellspacing="5" cellpadding="0" border="0">
+ <tbody>
+ <tr>
+ <td> </td>
+ <td>
+ <p> Imports tables from a file and create TableAttribute in Sudy
+ </p>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+ <br>
+ #It is possible to import some ASCII files that include text table representation.
+One file can consist from more than one table.<br>
+ <p></p>
+
+<p>aSObject = myVisuGen.ImportTables("/MyPresicousFileOfTables.txt")<br>
+ </p>
+
+<p>
+<table width="100%" cellpadding="2" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"> <a class="el"
+ href="interfaceVISU_1_1Result.html">Result</a>
+VISU::VISU_Gen::ImportFile </td>
+ <td class="md" valign="top">( </td>
+ <td class="md" nowrap valign="top">in string </td>
+ <td class="mdname1" valign="top" nowrap> <em>theFileName</em>
+ </td>
+ <td class="md" valign="top">) </td>
+ <td class="md" nowrap><br>
+ </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+
+<table cellspacing="5" cellpadding="0" border="0">
+ <tbody>
+ <tr>
+ <td> </td>
+ <td>
+ <p> Imports data from a file. </p>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+ <br>
+ #It is possible import a med files to VISU<br>
+ <p></p>
+
+<p>aResult = myVisuGen.ImportFile("/ItIsDreamOfMyLife.med")<br>
+ </p>
+
+<p>
+<table width="100%" cellpadding="2" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"> <a class="el"
+ href="interfaceVISU_1_1Result.html">Result</a>
+VISU::VISU_Gen::ImportMed </td>
+ <td class="md" valign="top">( </td>
+ <td class="md" nowrap valign="top">in <a class="el"
+ href="interfaceSALOMEDS_1_1SObject.html">SALOMEDS::SObject</a> </td>
+ <td class="mdname1" valign="top" nowrap> <em>theMedSObject</em>
+ </td>
+ <td class="md" valign="top">) </td>
+ <td class="md" nowrap><br>
+ </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+
+<table cellspacing="5" cellpadding="0" border="0">
+ <tbody>
+ <tr>
+ <td> </td>
+ <td>
+ <p> Imports data from a MED object. </p>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+ <br>
+ #<br>
+ <p></p>
+
+<p>
+<table width="100%" cellpadding="2" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"> <a class="el"
+ href="interfaceVISU_1_1Result.html">Result</a>
+VISU::VISU_Gen::ImportMedField </td>
+ <td class="md" valign="top">( </td>
+ <td class="md" nowrap valign="top">in <a class="el"
+ href="interfaceSALOME__MED_1_1FIELD.html">SALOME_MED::FIELD</a> </td>
+ <td class="mdname1" valign="top" nowrap> <em>theField</em>
+ </td>
+ <td class="md" valign="top">) </td>
+ <td class="md" nowrap><br>
+ </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+
+<table cellspacing="5" cellpadding="0" border="0">
+ <tbody>
+ <tr>
+ <td> </td>
+ <td>
+ <p> Imports data from a MED field. </p>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+ <p></p>
+
+<p>
+<table width="100%" cellpadding="2" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"> <a class="el"
+ href="interfaceVISU_1_1Mesh.html">Mesh</a>
+VISU::VISU_Gen::MeshOnEntity </td>
+ <td class="md" valign="top">( </td>
+ <td class="md" nowrap valign="top">in <a class="el"
+ href="interfaceVISU_1_1Result.html">Result</a> </td>
+ <td class="mdname" nowrap> <em>theResult</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in string </td>
+ <td class="mdname" nowrap> <em>theMeshName</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in <a class="el"
+ href="namespaceVISU.html#a38">Entity</a> </td>
+ <td class="mdname" nowrap> <em>theEntity</em></td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td class="md">) </td>
+ <td class="md" colspan="2"><br>
+ </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+
+<table cellspacing="5" cellpadding="0" border="0">
+ <tbody>
+ <tr>
+ <td> </td>
+ <td>
+ <p> Creates a Mesh on the basis of the data generated in other sources
+(MED object or file). </p>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+ <p></p>
+
+<p>
+<table width="100%" cellpadding="2" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"> <a class="el"
+ href="interfaceVISU_1_1Mesh.html">Mesh</a>
+VISU::VISU_Gen::FamilyMeshOnEntity </td>
+ <td class="md" valign="top">( </td>
+ <td class="md" nowrap valign="top">in <a class="el"
+ href="interfaceVISU_1_1Result.html">Result</a> </td>
+ <td class="mdname" nowrap> <em>theResult</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in string </td>
+ <td class="mdname" nowrap> <em>theMeshName</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in <a class="el"
+ href="namespaceVISU.html#a38">Entity</a> </td>
+ <td class="mdname" nowrap> <em>theEntity</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in string </td>
+ <td class="mdname" nowrap> <em>theFamilyName</em></td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td class="md">) </td>
+ <td class="md" colspan="2"><br>
+ </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+ <p></p>
+
+<p>
+<table width="100%" cellpadding="2" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"> <a class="el"
+ href="interfaceVISU_1_1Mesh.html">Mesh</a>
+VISU::VISU_Gen::GroupMesh </td>
+ <td class="md" valign="top">( </td>
+ <td class="md" nowrap valign="top">in <a class="el"
+ href="interfaceVISU_1_1Result.html">Result</a> </td>
+ <td class="mdname" nowrap> <em>theResult</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in string </td>
+ <td class="mdname" nowrap> <em>theMeshName</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in string </td>
+ <td class="mdname" nowrap> <em>theGroupName</em></td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td class="md">) </td>
+ <td class="md" colspan="2"><br>
+ </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+ <p></p>
+
+<p>
+<table width="100%" cellpadding="2" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"> <a class="el"
+ href="interfaceVISU_1_1ScalarMap.html">ScalarMap</a>
+VISU::VISU_Gen::ScalarMapOnField </td>
+ <td class="md" valign="top">( </td>
+ <td class="md" nowrap valign="top">in <a class="el"
+ href="interfaceVISU_1_1Result.html">Result</a> </td>
+ <td class="mdname" nowrap> <em>theResult</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in string </td>
+ <td class="mdname" nowrap> <em>theMeshName</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in <a class="el"
+ href="namespaceVISU.html#a38">Entity</a> </td>
+ <td class="mdname" nowrap> <em>theEntity</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in string </td>
+ <td class="mdname" nowrap> <em>theFieldName</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in double </td>
+ <td class="mdname" nowrap> <em>theIteration</em></td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td class="md">) </td>
+ <td class="md" colspan="2"><br>
+ </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+
+<table cellspacing="5" cellpadding="0" border="0">
+ <tbody>
+ <tr>
+ <td> </td>
+ <td>
+ <p> Creates a scalar bar presentation. </p>
+
+ <dl compact>
+ <dt><b> Parameters: </b></dt>
+ <dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tbody>
+ <tr>
+ <td valign="top"><em>theResult</em> </td>
+ <td> Data generated in other sources. (MED object or file)
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theMeshName</em> </td>
+ <td> One of the meshes presented in MED file </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theEntity</em> </td>
+ <td> Type of entity where the field is defined </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theFieldName</em> </td>
+ <td> Group of data attributed to the MESH. The data can
+be scalar or vector. </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theIteration</em> </td>
+ <td> Number of iteration on the field </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </dd>
+ </dl>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+ <p></p>
+
+<p>
+<table width="100%" cellpadding="2" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"> <a class="el"
+ href="interfaceVISU_1_1DeformedShape.html">DeformedShape</a>
+VISU::VISU_Gen::DeformedShapeOnField </td>
+ <td class="md" valign="top">( </td>
+ <td class="md" nowrap valign="top">in <a class="el"
+ href="interfaceVISU_1_1Result.html">Result</a> </td>
+ <td class="mdname" nowrap> <em>theResult</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in string </td>
+ <td class="mdname" nowrap> <em>theMeshName</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in <a class="el"
+ href="namespaceVISU.html#a38">Entity</a> </td>
+ <td class="mdname" nowrap> <em>theEntity</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in string </td>
+ <td class="mdname" nowrap> <em>theFieldName</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in double </td>
+ <td class="mdname" nowrap> <em>theIteration</em></td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td class="md">) </td>
+ <td class="md" colspan="2"><br>
+ </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+
+<table cellspacing="5" cellpadding="0" border="0">
+ <tbody>
+ <tr>
+ <td> </td>
+ <td>
+ <p> Creates a deformed shape presentation. </p>
+
+ <dl compact>
+ <dt><b> Parameters: </b></dt>
+ <dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tbody>
+ <tr>
+ <td valign="top"><em>theResult</em> </td>
+ <td> Data generated in other sources. (MED object or file)
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theMeshName</em> </td>
+ <td> One of the meshes presented in MED file </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theEntity</em> </td>
+ <td> Type of entity where the field is defined </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theFieldName</em> </td>
+ <td> Group of data attributed to the MESH. The data can
+be scalar or vector. </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theIteration</em> </td>
+ <td> Number of iteration on the field </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </dd>
+ </dl>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+ <p></p>
+
+<p>
+<table width="100%" cellpadding="2" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"> <a class="el"
+ href="interfaceVISU_1_1Vectors.html">Vectors</a>
+VISU::VISU_Gen::VectorsOnField </td>
+ <td class="md" valign="top">( </td>
+ <td class="md" nowrap valign="top">in <a class="el"
+ href="interfaceVISU_1_1Result.html">Result</a> </td>
+ <td class="mdname" nowrap> <em>theResult</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in string </td>
+ <td class="mdname" nowrap> <em>theMeshName</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in <a class="el"
+ href="namespaceVISU.html#a38">Entity</a> </td>
+ <td class="mdname" nowrap> <em>theEntity</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in string </td>
+ <td class="mdname" nowrap> <em>theFieldName</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in double </td>
+ <td class="mdname" nowrap> <em>theIteration</em></td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td class="md">) </td>
+ <td class="md" colspan="2"><br>
+ </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+
+<table cellspacing="5" cellpadding="0" border="0">
+ <tbody>
+ <tr>
+ <td> </td>
+ <td>
+ <p> Creates a vector presentation. </p>
+
+ <dl compact>
+ <dt><b> Parameters: </b></dt>
+ <dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tbody>
+ <tr>
+ <td valign="top"><em>theResult</em> </td>
+ <td> Data generated in other sources. (MED object or file)
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theMeshName</em> </td>
+ <td> One of the meshes presented in MED file </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theEntity</em> </td>
+ <td> Type of entity where the field is defined </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theFieldName</em> </td>
+ <td> Group of data attributed to the MESH. The data can
+be scalar or vector. </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theIteration</em> </td>
+ <td> Number of iteration on the field </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </dd>
+ </dl>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+ <p></p>
+
+<p>
+<table width="100%" cellpadding="2" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"> <a class="el"
+ href="interfaceVISU_1_1IsoSurfaces.html">IsoSurfaces</a>
+VISU::VISU_Gen::IsoSurfacesOnField </td>
+ <td class="md" valign="top">( </td>
+ <td class="md" nowrap valign="top">in <a class="el"
+ href="interfaceVISU_1_1Result.html">Result</a> </td>
+ <td class="mdname" nowrap> <em>theResult</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in string </td>
+ <td class="mdname" nowrap> <em>theMeshName</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in <a class="el"
+ href="namespaceVISU.html#a38">Entity</a> </td>
+ <td class="mdname" nowrap> <em>theEntity</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in string </td>
+ <td class="mdname" nowrap> <em>theFieldName</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in double </td>
+ <td class="mdname" nowrap> <em>theIteration</em></td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td class="md">) </td>
+ <td class="md" colspan="2"><br>
+ </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+
+<table cellspacing="5" cellpadding="0" border="0">
+ <tbody>
+ <tr>
+ <td> </td>
+ <td>
+ <p> Creates an iso surface presentation. </p>
+
+ <dl compact>
+ <dt><b> Parameters: </b></dt>
+ <dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tbody>
+ <tr>
+ <td valign="top"><em>theResult</em> </td>
+ <td> Data generated in other sources. (MED object or file)
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theMeshName</em> </td>
+ <td> One of the meshes presented in MED file </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theEntity</em> </td>
+ <td> Type of entity where the field is defined </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theFieldName</em> </td>
+ <td> Group of data attributed to the MESH. The data can
+be scalar or vector. </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theIteration</em> </td>
+ <td> Number of iteration on the field </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </dd>
+ </dl>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+ <p></p>
+
+<p>
+<table width="100%" cellpadding="2" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"> <a class="el"
+ href="interfaceVISU_1_1StreamLines.html">StreamLines</a>
+VISU::VISU_Gen::StreamLinesOnField </td>
+ <td class="md" valign="top">( </td>
+ <td class="md" nowrap valign="top">in <a class="el"
+ href="interfaceVISU_1_1Result.html">Result</a> </td>
+ <td class="mdname" nowrap> <em>theResult</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in string </td>
+ <td class="mdname" nowrap> <em>theMeshName</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in <a class="el"
+ href="namespaceVISU.html#a38">Entity</a> </td>
+ <td class="mdname" nowrap> <em>theEntity</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in string </td>
+ <td class="mdname" nowrap> <em>theFieldName</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in double </td>
+ <td class="mdname" nowrap> <em>theIteration</em></td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td class="md">) </td>
+ <td class="md" colspan="2"><br>
+ </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+
+<table cellspacing="5" cellpadding="0" border="0">
+ <tbody>
+ <tr>
+ <td> </td>
+ <td>
+ <p> Creates an stream lines presentation. </p>
+
+ <dl compact>
+ <dt><b> Parameters: </b></dt>
+ <dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tbody>
+ <tr>
+ <td valign="top"><em>theResult</em> </td>
+ <td> Data generated in other sources. (MED object or file)
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theMeshName</em> </td>
+ <td> One of the meshes presented in MED file </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theEntity</em> </td>
+ <td> Type of entity where the field is defined </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theFieldName</em> </td>
+ <td> Group of data attributed to the MESH. The data can
+be scalar or vector. </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theIteration</em> </td>
+ <td> Number of iteration on the field </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </dd>
+ </dl>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+ <p></p>
+
+<p>
+<table width="100%" cellpadding="2" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tbody>
+ <tr>
+ <td class="md" nowrap valign="top"> <a class="el"
+ href="interfaceVISU_1_1CutPlanes.html">CutPlanes</a>
+VISU::VISU_Gen::CutPlanesOnField </td>
+ <td class="md" valign="top">( </td>
+ <td class="md" nowrap valign="top">in <a class="el"
+ href="interfaceVISU_1_1Result.html">Result</a> </td>
+ <td class="mdname" nowrap> <em>theResult</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in string </td>
+ <td class="mdname" nowrap> <em>theMeshName</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in <a class="el"
+ href="namespaceVISU.html#a38">Entity</a> </td>
+ <td class="mdname" nowrap> <em>theEntity</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in string </td>
+ <td class="mdname" nowrap> <em>theFieldName</em>,
+ </td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td><br>
+ </td>
+ <td class="md" nowrap>in double </td>
+ <td class="mdname" nowrap> <em>theIteration</em></td>
+ </tr>
+ <tr>
+ <td><br>
+ </td>
+ <td class="md">) </td>
+ <td class="md" colspan="2"><br>
+ </td>
+ </tr>
+
+ </tbody>
+ </table>
+ </td>
+ </tr>
+
+ </tbody>
+</table>
+
+<table cellspacing="5" cellpadding="0" border="0">
+ <tbody>
+ <tr>
+ <td> </td>
+ <td>
+ <p> Creates a presentation of cut planes. </p>
+
+ <dl compact>
+ <dt><b> Parameters: </b></dt>
+ <dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tbody>
+ <tr>
+ <td valign="top"><em>theResult</em> </td>
+ <td> Data generated in other sources. (MED object or file)
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theMeshName</em> </td>
+ <td> One of the meshes presented in MED file </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theEntity</em> </td>
+ <td> Type of entity where the field is defined </td>
+ </tr>
+ <tr>
+ <td valign="top"><em>theFieldName</em> </td>
\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">\r
-<html>\r
-<head>\r
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">\r
- <meta name="GENERATOR" content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">\r
- <title>Main Page</title>\r
-<link href="doxygen.css" rel="stylesheet" type="text/css">\r
-</head>\r
-<body>\r
- \r
-<center><table WIDTH="96%" >\r
-<tr>\r
-<td><a href="http://www.opencascade.com"><img src="sources/logocorp.gif" BORDER=0 height=46 width=122></a></td>\r
-\r
-\r
-<td>\r
-<div align=right><a href="http://www.opencascade.org/SALOME/"><img src="sources/application.gif" BORDER=0 height=46 width=108></a></div>\r
-</td>\r
-</tr>\r
-</table></center>\r
-\r
-\r
-<h1><a name="page2">General overview</a>\r
-</h1>\r
-<a name="cont"></a><h2>Table of contents </h2>\r
-<b><i>\r
-<ul>\r
- <li><a href="#1">1. Introduction</a></li>\r
- <li><a href="#2">2. Definitions </a></li>\r
- \r
- <li><a href="#3">3. Forms of data visualization </a></li>\r
- <ul>\r
- <li><a href="#3_1">3.1 Data tables</a></li>\r
- <li><a href="#3_2">3.2 XY plots </a></li>\r
- <li><a href="#3_3">3.3 3D presentations </a></li>\r
- </ul>\r
- <li><a href="#4">4. Data structure</a></li>\r
- <li><a href="#5">5. VISU module features and services</a></li>\r
- <ul>\r
- <li><a href="#5_1">5.1 Base class</a></li>\r
- <li><a href="#5_2">5.2 ViewManager class </a></li>\r
- <li><a href="#5_3">5.3 View class </a></li>\r
- <ul>\r
- <li><a href="#5_3_1">5.3.1 3dView class </a></li>\r
- <li><a href="#5_3_2">5.3.2 TableView class </a></li>\r
- <li><a href="#5_3_3">5.3.3 XYPlotView class </a></li>\r
- </ul>\r
- <li><a href="#5_4">5.4 Result class </a></li>\r
- <li><a href="#5_5">5.5 PrsObject class </a></li>\r
- <ul>\r
- <li><a href="#5_5_1">5.5.1 Curve class </a></li>\r
- <li><a href="#5_5_2">5.5.2 Table class </a></li>\r
- <li><a href="#5_5_3">5.5.3 Container class </a></li>\r
- <li><a href="#5_5_4">5.5.4 Prs3d class </a></li>\r
- <li><a href="#5_5_5">5.5.5 Mesh class </a></li>\r
- <li><a href="#5_5_6">5.5.6 ScalarMap class </a></li>\r
- <li><a href="#5_5_7">5.5.7 CutLines class </a></li>\r
- <li><a href="#5_5_8">5.5.8 CutPlanes class </a></li>\r
- <li><a href="#5_5_9">5.5.9 IsoSurfaces class </a></li>\r
- <li><a href="#5_5_10">5.5.10 DeformedShape class </a></li>\r
- <li><a href="#5_5_11">5.5.11 Vectors class </a></li>\r
- <li><a href="#5_5_12">5.5.12 StreamLines class </a></li>\r
- \r
- </ul>\r
- <li><a href="#5_6">5.6 Animation class </a></li>\r
- <li><a href="#5_7">5.7 VISU_Gen class </a></li>\r
- \r
- </ul>\r
-</ul>\r
-</i> </b> <br>\r
-<a name="1"></a><h2>1. Introduction </h2>\r
-<p>Post-processing module VISU for SALOME is destined for visualization of data \r
- produced by other components. VISU provides various forms of data visualization \r
- including: </p>\r
- \r
-<ul>\r
- <li>Data tables, </li>\r
- <li>XY plots based on data from tables, </li>\r
- <li>3D presentations, </li> \r
- <ul>\r
- <li> Scalar Map,</li>\r
- <li> Deformed Shape, </li>\r
- <li> Vectors,</li>\r
- <li> Iso Surfaces,</li>\r
- <li> Cut Planes,</li>\r
- <li> Stream Lines,</li>\r
- <li> Cut Lines.</li>\r
- </ul>\r
-</ul>\r
-<i><a href="#cont">Back to the contents</a></i>\r
-<a name="2"></a><h2>2. Defintions </h2>\r
-<p>The following terms are used for presentation of the VISU module:</p>\r
-<dl>\r
-<dt><b>Study</b></dt> \r
-<dd>manages data produced by various component of SALOME platform. More detailed description of the SALOME Study can be found in the document named "Data Structure and Persistence Specifications".</dd>\r
-<dt><b>Component</b></dt> \r
-<dd>a SALOME software module that implements predefined interfaces. \r
-The component provides the data for the SALOME study in a form of links (stored in the Study) \r
-to the specific data stored in the component. All components are CORBA servers and it allows them \r
-to be running on different host stations.</dd>\r
-<dt><b>Geometry</b></dt> <dd>a coherent set of data produced by component GEOM or any other geometry tool \r
-and imported using geometry exchange interface (like BRep, IGES and so on).</dd>\r
-<dt><b>Mesh</b></dt> <dd>a collection of elements used as a support for numeric simulation.</dd>\r
-<dt><b>Field</b></dt> <dd>the set of results of the same type allocated to mesh elements. \r
-Fields can be one of next types: scalars, vectors, tensors, matrices, character strings.</dd>\r
-</dl>\r
-<i><a href="#cont">Back to the contents</a></i>\r
-<a name="3"></a><h2>3. Forms of data visualization </h2>\r
-<a name="3_1"></a><h3>3.1 Data tables </h3>\r
-<p>Table represents data in spreadsheet-like form. For these purposes the QTable \r
- widget will be provided. This widget can be reused in any module for any dialog \r
- box as a control. For post-processing data visualization needs this widget is \r
- used inside of Table window (based on non-modal window frame). Data represented \r
- in Table window of post-processing module is be editable. </p>\r
- <a name="3_2"></a> <h3>3.2 XY plots</h3>\r
-<p>XY plot represents calculation data in form of 2D (XY) plotting. \r
-XY plot view is shown in a separated view window (non-modal dialog box), which can be moved in any position of the screen for convenience. \r
-The QWT extension of QT toolkit is used for XY plotting. \r
-QWT provides unlimited number of displayed curves (data sets) and supports logarithmic scale, zooming, and selection.</p>\r
-<a name="3_3"></a>\r
-<h3>3.3 3D presentations </h3>\r
-<p>A 3D presentation shows geometry, mesh and fields in 3D space. \r
-Provides selection, rotation, zooming, scaling, and panning of 3d scene. \r
-Color bar for scalar data presentation is supplied. \r
-For 3D presentation window of the current implementation of VTK viewer in study window is used.</p>\r
-<i><a href="#cont">Back to the contents</a></i>\r
-<a name="4"></a><h2>4. Data structure </h2>\r
-<p>Source data for post-processing module can be imported from MED file or MED object in study data structure (CORBA object) can be used for this purposes. </p>\r
-<p>In case of import MED file the data from this file will be converted in form of VTK Data Source format and stored in VISU data structure. In case of using of MED object from study the label in VISU data structure will be created with reference to the corresponded MED object.</p>\r
-<p>Available result data is displayed under corresponded MED data label. For every result the number of presentations can be created dependently on result type. </p>\r
-<p>Presentation is represented in data structure in form of list of presentation creation parameters. This could be:</p>\r
-<ul>\r
-<li>Presentation type (table, XY plot, 3d view);</li>\r
-<li>Presentation subtype (for example for 3d: scalar map, iso-surfaces, combined view and so on);</li>\r
-<li>Parameters of the presentation dependently on its type (number of colors, type of scale, font parameters, grid parameters and so on).</li>\r
-</ul>\r
-<p>Parameters of presentation are persistent data, which will be stored in study file.</p>\r
-\r
-\r
-<div align="center"><img src="DataStruct.gif"> </div>\r
-<i><a href="#cont">Back to the contents</a></i>\r
-<a name="5"></a><h2>5. VISU module features and services </h2>\r
-<p>The functionality of the VISU module is provided by a set of classes which are combined into \r
-the <b>VISU</b> package.\r
-<p>The API reference of the VISU component can be found <a href="namespaceVISU.html">here</a>.</p>\r
-<a name="5_1"></a><h3>5.1 Base class</h3>\r
-<p>This is a root class for all objects of the VISU module.</p>\r
- <p>The API reference for this class can be found <a href="interfaceVISU_1_1Base.html">here</a>.</p>\r
-\r
-<a name="5_2"></a><h3>5.2 ViewManager class</h3>\r
-<p>This class is used for management of the view windows (creation and deletion).</p>\r
- <p>The API reference for this class can be found <a href="interfaceVISU_1_1ViewManager.html">here</a>.</p>\r
-\r
-<a name="5_3"></a><h3>5.3 View class</h3>\r
-<p>View class is a base for all other classes, necessary for creation of different views .</p>\r
- \r
-<div align="center"><img src="View.gif"> </div>\r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1View.html">here</a>.</p>\r
-\r
-<a name="5_3_1"></a><h4>5.3.1 3dView class</h4>\r
-<p>This class provides a set of methods for creation of a 3d view window.</p>\r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_13dView.html">here</a>.</p>\r
-\r
-<a name="5_3_2"></a><h4>5.3.2 TableView class</h4>\r
-<p>This class provides a set of methods for creation of a Table view window.</p>\r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1TableView.html">here</a>.</p>\r
-\r
-<a name="5_3_3"></a><h4>5.3.3 XYPlotView class</h4>\r
-<p>This class provides a set of methods for creation of a XYPlot view window.</p>\r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1XYPlotView.html">here</a>.</p>\r
-\r
-<a name="5_4"></a><h3>5.4 Result class</h3>\r
-<p>This class serves for inner representation of data generated in other sources. \r
-(MED object or file) This data is needed for further construction of graphical presentations.</p> \r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1Result.html">here</a>.</p>\r
-<a name="5_5"></a><h3>5.5 PrsObject class</h3>\r
-<p>It is the root class of all presentable objects. </p>\r
-<div align="center"><img src="PrsObj.gif"> </div>\r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1PrsObject.html">here</a>.</p>\r
-\r
-<a name="5_5_1"></a><h4>5.5.1 Curve class</h4>\r
-<p>Manages presentation parameters of one curve. \r
-This object can be used for presentation of set of curves using Container class. </p>\r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1Curve.html">here</a>.</p>\r
-\r
-<a name="5_5_2"></a><h4>5.5.2 Table class</h4>\r
-<p>Manages presentation parameters of a table. </p>\r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1Table.html">here</a>.</p>\r
-\r
-<a name="5_5_3"></a><h4>5.5.3 Container class</h4>\r
-<p>This class is provided in order to create one presentation using several presentable objects. This can provide combination of a set of curves to display them in XY plot view. \r
-</p>\r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1Container.html">here</a>.</p>\r
-\r
-<a name="5_5_4"></a><h4>5.5.4 Prs3d class</h4>\r
-<p>Root class for all 3D presentations. </p>\r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1Prs3d.html">here</a>.</p>\r
-\r
-<a name="5_5_5"></a><h4>5.5.5 Mesh class</h4>\r
-<p>Manages presentation parameters of a 3D presentattion of a mesh. \r
-This object can be used for presentation of set of curves using Container class. </p>\r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1Mesh.html">here</a>.</p>\r
-\r
-<a name="5_5_6"></a><h4>5.5.6 ScalarMap class</h4>\r
-<p>Manages presentation parameters of the scalar bar. </p>\r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1ScalarMap.html">here</a>.</p>\r
-\r
-<a name="5_5_7"></a><h4>5.5.7 CutLines class</h4>\r
-<p>Manages presentation parameters of the cut lines presentation. </p>\r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1CutLines.html">here</a>.</p>\r
-\r
-<a name="5_5_8"></a><h4>5.5.8 CutPlanes class</h4>\r
-<p>Manages presentation parameters of the cut planes presentation. </p>\r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1CutPlanes.html">here</a>.</p>\r
-\r
-<a name="5_5_9"></a><h4>5.5.9 IsoSurfaces class</h4>\r
-<p>Manages presentation parameters of the iso surfaces presentation. </p>\r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1IsoSurfaces.html">here</a>.</p>\r
-\r
-<a name="5_5_10"></a><h4>5.5.10 DeformedShape class</h4>\r
-<p>Manages presentation parameters of the deformed shape presentation. </p>\r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1DeformedShape.html">here</a>.</p>\r
-\r
-<a name="5_5_11"></a><h4>5.5.11 Vectors class</h4>\r
-<p>Manages presentation parameters of the vector presentation. </p>\r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1Vectors.html">here</a>.</p>\r
-\r
-<a name="5_5_12"></a><h4>5.5.12 StreamLines class</h4>\r
-<p>Manages presentation parameters of the streamlines presentation. </p>\r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1StreamLines.html">here</a>.</p>\r
-\r
-<a name="5_6"></a><h3>5.6 Animation class</h3>\r
-<p>This class provides a set of methods used for:</p>\r
-<ul>\r
- <li>generating different animations, </li>\r
- <li>setting the parameters of the animations,</li>\r
- <li>playing these animations in the VISU module.</li>\r
-</ul> \r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1Animation.html">here</a>.</p>\r
-\r
-<a name="5_7"></a><h3>5.7 VISU_Gen class</h3>\r
-<p>This is the main clas of the VISU component in SALOME application. It is used for , \r
-using the views provided by ViewManager. This class provides a set of methods used for:</p>\r
-<ul>\r
- <li>creation of all types of post-processing presentations from given Result and Table object reference </li>\r
- <li>creation of animations</li>\r
- \r
-</ul> \r
-<p>The API reference for this class can be found <a href="interfaceVISU_1_1VISU__Gen.html">here</a>.</p>\r
-<i><a href="#cont">Back to the contents</a></i>\r
-</body>\r
-</html>\r
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">
+ <title>Main Page</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+</head>
+<body>
+
+<center><table WIDTH="96%" >
+<tr>
+<td><a href="http://www.opencascade.com"><img src="sources/logocorp.gif" BORDER=0 height=46 width=122></a></td>
+
+
+<td>
+<div align=right><a href="http://www.opencascade.org/SALOME/"><img src="sources/application.gif" BORDER=0 height=46 width=108></a></div>
+</td>
+</tr>
+</table></center>
+
+
+<h1><a name="page2">General overview</a>
+</h1>
+<a name="cont"></a><h2>Table of contents </h2>
+<b><i>
+<ul>
+ <li><a href="#1">1. Introduction</a></li>
+ <li><a href="#2">2. Definitions </a></li>
+
+ <li><a href="#3">3. Forms of data visualization </a></li>
+ <ul>
+ <li><a href="#3_1">3.1 Data tables</a></li>
+ <li><a href="#3_2">3.2 XY plots </a></li>
+ <li><a href="#3_3">3.3 3D presentations </a></li>
+ </ul>
+ <li><a href="#4">4. Data structure</a></li>
+ <li><a href="#5">5. VISU module features and services</a></li>
+ <ul>
+ <li><a href="#5_1">5.1 Base class</a></li>
+ <li><a href="#5_2">5.2 ViewManager class </a></li>
+ <li><a href="#5_3">5.3 View class </a></li>
+ <ul>
+ <li><a href="#5_3_1">5.3.1 3dView class </a></li>
+ <li><a href="#5_3_2">5.3.2 TableView class </a></li>
+ <li><a href="#5_3_3">5.3.3 XYPlotView class </a></li>
+ </ul>
+ <li><a href="#5_4">5.4 Result class </a></li>
+ <li><a href="#5_5">5.5 PrsObject class </a></li>
+ <ul>
+ <li><a href="#5_5_1">5.5.1 Curve class </a></li>
+ <li><a href="#5_5_2">5.5.2 Table class </a></li>
+ <li><a href="#5_5_3">5.5.3 Container class </a></li>
+ <li><a href="#5_5_4">5.5.4 Prs3d class </a></li>
+ <li><a href="#5_5_5">5.5.5 Mesh class </a></li>
+ <li><a href="#5_5_6">5.5.6 ScalarMap class </a></li>
+ <li><a href="#5_5_7">5.5.7 CutLines class </a></li>
+ <li><a href="#5_5_8">5.5.8 CutPlanes class </a></li>
+ <li><a href="#5_5_9">5.5.9 IsoSurfaces class </a></li>
+ <li><a href="#5_5_10">5.5.10 DeformedShape class </a></li>
+ <li><a href="#5_5_11">5.5.11 Vectors class </a></li>
+ <li><a href="#5_5_12">5.5.12 StreamLines class </a></li>
+
+ </ul>
+ <li><a href="#5_6">5.6 Animation class </a></li>
+ <li><a href="#5_7">5.7 VISU_Gen class </a></li>
+
+ </ul>
+</ul>
+</i> </b> <br>
+<a name="1"></a><h2>1. Introduction </h2>
+<p>Post-processing module VISU for SALOME is destined for visualization of data
+ produced by other components. VISU provides various forms of data visualization
+ including: </p>
+
+<ul>
+ <li>Data tables, </li>
+ <li>XY plots based on data from tables, </li>
+ <li>3D presentations, </li>
+ <ul>
+ <li> Scalar Map,</li>
+ <li> Deformed Shape, </li>
+ <li> Vectors,</li>
+ <li> Iso Surfaces,</li>
+ <li> Cut Planes,</li>
+ <li> Stream Lines,</li>
+ <li> Cut Lines.</li>
+ </ul>
+</ul>
+<i><a href="#cont">Back to the contents</a></i>
+<a name="2"></a><h2>2. Defintions </h2>
+<p>The following terms are used for presentation of the VISU module:</p>
+<dl>
+<dt><b>Study</b></dt>
+<dd>manages data produced by various component of SALOME platform. More detailed description of the SALOME Study can be found in the document named "Data Structure and Persistence Specifications".</dd>
+<dt><b>Component</b></dt>
+<dd>a SALOME software module that implements predefined interfaces.
+The component provides the data for the SALOME study in a form of links (stored in the Study)
+to the specific data stored in the component. All components are CORBA servers and it allows them
+to be running on different host stations.</dd>
+<dt><b>Geometry</b></dt> <dd>a coherent set of data produced by component GEOM or any other geometry tool
+and imported using geometry exchange interface (like BRep, IGES and so on).</dd>
+<dt><b>Mesh</b></dt> <dd>a collection of elements used as a support for numeric simulation.</dd>
+<dt><b>Field</b></dt> <dd>the set of results of the same type allocated to mesh elements.
+Fields can be one of next types: scalars, vectors, tensors, matrices, character strings.</dd>
+</dl>
+<i><a href="#cont">Back to the contents</a></i>
+<a name="3"></a><h2>3. Forms of data visualization </h2>
+<a name="3_1"></a><h3>3.1 Data tables </h3>
+<p>Table represents data in spreadsheet-like form. For these purposes the QTable
+ widget will be provided. This widget can be reused in any module for any dialog
+ box as a control. For post-processing data visualization needs this widget is
+ used inside of Table window (based on non-modal window frame). Data represented
+ in Table window of post-processing module is be editable. </p>
+ <a name="3_2"></a> <h3>3.2 XY plots</h3>
+<p>XY plot represents calculation data in form of 2D (XY) plotting.
+XY plot view is shown in a separated view window (non-modal dialog box), which can be moved in any position of the screen for convenience.
+The QWT extension of QT toolkit is used for XY plotting.
+QWT provides unlimited number of displayed curves (data sets) and supports logarithmic scale, zooming, and selection.</p>
+<a name="3_3"></a>
+<h3>3.3 3D presentations </h3>
+<p>A 3D presentation shows geometry, mesh and fields in 3D space.
+Provides selection, rotation, zooming, scaling, and panning of 3d scene.
+Color bar for scalar data presentation is supplied.
+For 3D presentation window of the current implementation of VTK viewer in study window is used.</p>
+<i><a href="#cont">Back to the contents</a></i>
+<a name="4"></a><h2>4. Data structure </h2>
+<p>Source data for post-processing module can be imported from MED file or MED object in study data structure (CORBA object) can be used for this purposes. </p>
+<p>In case of import MED file the data from this file will be converted in form of VTK Data Source format and stored in VISU data structure. In case of using of MED object from study the label in VISU data structure will be created with reference to the corresponded MED object.</p>
+<p>Available result data is displayed under corresponded MED data label. For every result the number of presentations can be created dependently on result type. </p>
+<p>Presentation is represented in data structure in form of list of presentation creation parameters. This could be:</p>
+<ul>
+<li>Presentation type (table, XY plot, 3d view);</li>
+<li>Presentation subtype (for example for 3d: scalar map, iso-surfaces, combined view and so on);</li>
+<li>Parameters of the presentation dependently on its type (number of colors, type of scale, font parameters, grid parameters and so on).</li>
+</ul>
+<p>Parameters of presentation are persistent data, which will be stored in study file.</p>
+
+
+<div align="center"><img src="DataStruct.gif"> </div>
+<i><a href="#cont">Back to the contents</a></i>
+<a name="5"></a><h2>5. VISU module features and services </h2>
+<p>The functionality of the VISU module is provided by a set of classes which are combined into
+the <b>VISU</b> package.
+<p>The API reference of the VISU component can be found <a href="namespaceVISU.html">here</a>.</p>
+<a name="5_1"></a><h3>5.1 Base class</h3>
+<p>This is a root class for all objects of the VISU module.</p>
+ <p>The API reference for this class can be found <a href="interfaceVISU_1_1Base.html">here</a>.</p>
+
+<a name="5_2"></a><h3>5.2 ViewManager class</h3>
+<p>This class is used for management of the view windows (creation and deletion).</p>
+ <p>The API reference for this class can be found <a href="interfaceVISU_1_1ViewManager.html">here</a>.</p>
+
+<a name="5_3"></a><h3>5.3 View class</h3>
+<p>View class is a base for all other classes, necessary for creation of different views .</p>
+
+<div align="center"><img src="View.gif"> </div>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1View.html">here</a>.</p>
+
+<a name="5_3_1"></a><h4>5.3.1 3dView class</h4>
+<p>This class provides a set of methods for creation of a 3d view window.</p>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_13dView.html">here</a>.</p>
+
+<a name="5_3_2"></a><h4>5.3.2 TableView class</h4>
+<p>This class provides a set of methods for creation of a Table view window.</p>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1TableView.html">here</a>.</p>
+
+<a name="5_3_3"></a><h4>5.3.3 XYPlotView class</h4>
+<p>This class provides a set of methods for creation of a XYPlot view window.</p>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1XYPlotView.html">here</a>.</p>
+
+<a name="5_4"></a><h3>5.4 Result class</h3>
+<p>This class serves for inner representation of data generated in other sources.
+(MED object or file) This data is needed for further construction of graphical presentations.</p>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1Result.html">here</a>.</p>
+<a name="5_5"></a><h3>5.5 PrsObject class</h3>
+<p>It is the root class of all presentable objects. </p>
+<div align="center"><img src="PrsObj.gif"> </div>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1PrsObject.html">here</a>.</p>
+
+<a name="5_5_1"></a><h4>5.5.1 Curve class</h4>
+<p>Manages presentation parameters of one curve.
+This object can be used for presentation of set of curves using Container class. </p>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1Curve.html">here</a>.</p>
+
+<a name="5_5_2"></a><h4>5.5.2 Table class</h4>
+<p>Manages presentation parameters of a table. </p>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1Table.html">here</a>.</p>
+
+<a name="5_5_3"></a><h4>5.5.3 Container class</h4>
+<p>This class is provided in order to create one presentation using several presentable objects. This can provide combination of a set of curves to display them in XY plot view.
+</p>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1Container.html">here</a>.</p>
+
+<a name="5_5_4"></a><h4>5.5.4 Prs3d class</h4>
+<p>Root class for all 3D presentations. </p>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1Prs3d.html">here</a>.</p>
+
+<a name="5_5_5"></a><h4>5.5.5 Mesh class</h4>
+<p>Manages presentation parameters of a 3D presentattion of a mesh.
+This object can be used for presentation of set of curves using Container class. </p>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1Mesh.html">here</a>.</p>
+
+<a name="5_5_6"></a><h4>5.5.6 ScalarMap class</h4>
+<p>Manages presentation parameters of the scalar bar. </p>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1ScalarMap.html">here</a>.</p>
+
+<a name="5_5_7"></a><h4>5.5.7 CutLines class</h4>
+<p>Manages presentation parameters of the cut lines presentation. </p>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1CutLines.html">here</a>.</p>
+
+<a name="5_5_8"></a><h4>5.5.8 CutPlanes class</h4>
+<p>Manages presentation parameters of the cut planes presentation. </p>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1CutPlanes.html">here</a>.</p>
+
+<a name="5_5_9"></a><h4>5.5.9 IsoSurfaces class</h4>
+<p>Manages presentation parameters of the iso surfaces presentation. </p>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1IsoSurfaces.html">here</a>.</p>
+
+<a name="5_5_10"></a><h4>5.5.10 DeformedShape class</h4>
+<p>Manages presentation parameters of the deformed shape presentation. </p>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1DeformedShape.html">here</a>.</p>
+
+<a name="5_5_11"></a><h4>5.5.11 Vectors class</h4>
+<p>Manages presentation parameters of the vector presentation. </p>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1Vectors.html">here</a>.</p>
+
+<a name="5_5_12"></a><h4>5.5.12 StreamLines class</h4>
+<p>Manages presentation parameters of the streamlines presentation. </p>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1StreamLines.html">here</a>.</p>
+
+<a name="5_6"></a><h3>5.6 Animation class</h3>
+<p>This class provides a set of methods used for:</p>
+<ul>
+ <li>generating different animations, </li>
+ <li>setting the parameters of the animations,</li>
+ <li>playing these animations in the VISU module.</li>
+</ul>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1Animation.html">here</a>.</p>
+
+<a name="5_7"></a><h3>5.7 VISU_Gen class</h3>
+<p>This is the main clas of the VISU component in SALOME application. It is used for ,
+using the views provided by ViewManager. This class provides a set of methods used for:</p>
+<ul>
+ <li>creation of all types of post-processing presentations from given Result and Table object reference </li>
+ <li>creation of animations</li>
+
+</ul>
+<p>The API reference for this class can be found <a href="interfaceVISU_1_1VISU__Gen.html">here</a>.</p>
+<i><a href="#cont">Back to the contents</a></i>
+</body>
+</html>
//-------------------------------------------------------
typedef string IdType;
+ typedef sequence<string> string_array;
+
/*!
* This enumeration contains a set of elements defining the type
* of the scaling, which can be applied on different presentations.
TDEFORMEDSHAPE, /*!< Deformed shape 3D presentation object */
TSCALARMAPONDEFORMEDSHAPE, /*!< Scalar map on deformed shape 3D presentation object */
TGAUSSPOINTS, /*!< Gauss Points 3D presentation object */
+ TPRSMERGER, /*!< PRS merger 3D presentation object */
TPLOT3D, /*!< Plot3D 3D presentation object */
TCUTPLANES, /*!< Cut planes 3D presentation object */
TCUTLINES, /*!< Cut lines 3D presentation object */
* Gets the type of orientation of the scalar bar (to provide backward compatibility).
*/
Orientation GetBarOrientation();
+
+ /*!
+ * PrsMerger method:
+ * Set mesh on group as geometry of presentation.(clear all previously added groups).
+ * \param theMeshName - mesh name
+ * \param theGroupName - group name
+ */
+ void SetMeshOnGroup(in string theMeshName,
+ in string theGroupName);
+
+ /*!
+ * PrsMerger method:
+ * Add group as geometry of presentation.
+ * \param theMeshName - mesh name
+ * \param theGroupName - group name
+ */
+ long AddMeshOnGroup(in string theMeshName,
+ in string theGroupName);
+
+
+ /*!
+ * PrsMerger method:
+ * Set scalar map of presentation.
+ * \param theMeshName - mesh name
+ * \param theFieldName - the name of scalar field
+ * \param theStampsNum - the iteration number for scalar field
+ * \param theEntity - entity of scalar field
+ */
+ void SetScalarMap(in string theMeshName,
+ in Entity theEntity,
+ in string theFieldName,
+ in long theStampsNum);
+
+ /*!
+ * PrsMerger method:
+ * Remove all groups.(The scalar map will be placed on all mesh).
+ */
+ void RemoveAllGeom();
};
//-------------------------------------------------------
void SetColor(in SALOMEDS::Color theColor);
};
+
//-------------------------------------------------------
/*! \brief Scalar Map on Deformed shape presentation interface
*
void SetScalarField(in string theMeshName,in string theFieldName,
in long theIteration,in Entity theEntity);
+
+ /*!
+ * Get scalar iteration number
+ */
+ long GetScalarLIteration();
+
+ /*!
+ * Get scalar entity
+ */
+ Entity GetScalarEEntity();
+
+ /*!
+ * Get scalar field name
+ */
+ string GetScalarCFieldName();
+
+ /*!
+ * Get mesh name
+ */
+ string GetScalarCMeshName();
+
};
//-------------------------------------------------------
/*!
* Gets the number of cut lines.
*/
long GetNbLines();
+
+ /*! Invert all curves of corresponding table
+ * \param theInvert - Invert all curves, if value is TRUE, else not.
+ */
+ void SetAllCurvesInverted(in boolean theInvert);
+
+ /*! Checks the orientation of all curves
+ * \retval TRUE - if all curves are inverted, else FALSE
+ */
+ boolean IsAllCurvesInverted();
+
+ /*! Sets values which cutlines would be shown: aboslute or relative values
+ * \param theAbsLength - boolean value, TRUE or false.
+ */
+ void SetUseAbsoluteLength(in boolean theAbsLength);
+
+ /*! Checks values of cutlines: using aboslute or relative values
+ */
+ boolean IsUseAbsoluteLength();
};
/*! \brief Interface of the stream lines representation
* of calculations are taken in one definite moment.
*/
interface Animation : Base {
+ /*!
+ * This enumeration contains a set of available animation modes.
+ */
+ enum AnimationMode{ PARALLEL, /*!< parallel mode of animation. */
+ SUCCCESSIVE /*!< succcessive mode of animation. */
+ };
+
/*! Defines the field which will be used as a base for generation of the animation.
* \param theObject The %SObject corresponding to the field.
*/
- void addField(in SALOMEDS::SObject theObject);
+ boolean addField(in SALOMEDS::SObject theObject);
+
+ /*! Remove all fields from Animation object.
+ */
+ void clearFields();
/*! Generates presentations on the basis of the field.
* \param theFieldNum The number of the field, which will be used
*/
void setCycling(in boolean theCycle);
+ boolean isCleaningMemoryAtEachFrame();
+ void setCleaningMemoryAtEachFrame(in boolean theCycle);
+
SALOMEDS::SObject publishInStudy();
void saveAnimation();
void restoreFromStudy(in SALOMEDS::SObject theSObj);
boolean isSavedInStudy();
+
+ /*!
+ * Sets the animation mode.
+ * \param theMode The value of this parameter is taken from the <VAR>AnimationMode</VAR> enumeration.
+ */
+ void setAnimationMode(in AnimationMode theMode);
+
+ /*!
+ * Gets the animation mode.
+ */
+ AnimationMode getAnimationMode();
+
+ /*!
+ * Apply the presentation properties to all fields. The exception is raised in the following cases:
+ * 1) presentations for the given field is not yet created;
+ * 2) invalid dynamic cast of the given presentation to VISU::ColoredPrs3d_i;
+ * 3) the MED file is not the same;
+ * 4) the mesh name is not the same;
+ * 5) the field name is not the same;
+ * 6) the entity is not the same.
+ */
+ void ApplyProperties(in long theFieldNum, in ColoredPrs3d thePrs);
};
/*! \brief Interface %Result
<parameter name="name" value="Post-Pro"/>
<parameter name="icon" value="ModuleVisu.png"/>
<!-- Other module preferences -->
- <parameter name="use_build_progress" value="false"/>
- <parameter name="full_med_loading" value="false"/>
+ <parameter name="display_only" value="false"/>
+ <parameter name="show_preview" value="false"/>
+ <parameter name="invert_all_curves" value="false"/>
+ <parameter name="use_absolute_length" value="false"/>
+ <parameter name="generate_data_table" value="true"/>
+ <parameter name="generate_curves" value="true"/>
+ <parameter name="use_build_progress" value="false"/>
+ <parameter name="full_med_loading" value="false"/>
<parameter name="mesh_represent" value="2"/>
<parameter name="mesh_shrink" value="false"/>
<parameter name="scalar_map_represent" value="2"/>
<parameter name="sweeping_number_cycles" value="1" />
<parameter name="sweeping_number_steps" value="20" />
<parameter name="sweeping_time_step" value="0.2" />
+ <parameter name="speed" value="1"/>
+ <parameter name="cycled_animation" value="false"/>
+ <parameter name="use_proportional_timing" value="false"/>
+ <parameter name="clean_memory_at_each_frame" value="false"/>
<parameter name="mouse_behaviour" value="0" />
<parameter name="speed_increment" value="10" />
<parameter name="spacemouse_func1_btn" value="1" />
VISU_Convertor_impl.hxx \
VISU_ConvertorUtils.hxx \
VISU_MergeFilter.hxx \
- VISU_ExtractUnstructuredGrid.hxx
+ VISU_ExtractUnstructuredGrid.hxx \
+ VISUConvertor.hxx
# Libraries targets
try{
#endif
MSG(MYDEBUG,"'"<<theFileName<<"'...");
+ //theFileName = "Apointe.med";
auto_ptr<VISU_Convertor> aCon(CreateConvertor(theFileName));
//aCon->GetSize();
//return;
--- /dev/null
+// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
+//
+//
+//
+// File : VISUConvertor.hxx
+// Author : Oleg UVAROV
+// Module : VISU
+
+#ifndef _VISUConvertor_HXX_
+#define _VISUConvertor_HXX_
+
+#ifdef WNT
+ #if defined VISU_CONVERTOR_EXPORTS
+ #if defined WIN32
+ #define VISU_CONVERTOR_EXPORT __declspec( dllexport )
+ #else
+ #define VISU_CONVERTOR_EXPORT
+ #endif
+ #else
+ #if defined WIN32
+ #define VISU_CONVERTOR_EXPORT __declspec( dllimport )
+ #else
+ #define VISU_CONVERTOR_EXPORT
+ #endif
+ #endif
+#else
+ #define VISU_CONVERTOR_EXPORT
+#endif
+
+#endif
\ No newline at end of file
int iEnd = strlen(aName);
static int VtkHighLevelLength = 12; //25
if(iEnd > VtkHighLevelLength) iEnd = VtkHighLevelLength;
- char aNewName[iEnd+1];
+ char* aNewName = new char[iEnd+1];
aNewName[iEnd] = '\0';
strncpy(aNewName,aName,iEnd);
replace(aNewName,aNewName+iEnd,' ','_');
aName = aNewName;
else
aName.sprintf("%s_%d",aNewName,theTimeId);
+ delete[] aNewName;
return aName.latin1();
}
\brief The file contains definitions for basic classes of the VISU CONVERTER package
*/
+#include "VISUConvertor.hxx"
#include "VISU_IDMapper.hxx"
#include "VISU_ConvertorDef.hxx"
//---------------------------------------------------------------
+ VISU_CONVERTOR_EXPORT
bool
operator<(const PSubProfile& theLeft, const PSubProfile& theRight);
//---------------------------------------------------------------
+ VISU_CONVERTOR_EXPORT
bool
operator<(const PGaussSubMesh& theLeft, const PGaussSubMesh& theRight);
//---------------------------------------------------------------
//! The utility function allows to write vtkUnstructuredGrid to a file with defined name
+ VISU_CONVERTOR_EXPORT
void
WriteToFile(vtkUnstructuredGrid* theDataSet,
const std::string& theFileName);
Also, it can perform some additional work to calculate expected amount of memory to build defined VTK representation
*/
-class VISU_Convertor
+class VISU_CONVERTOR_EXPORT VISU_Convertor
{
protected:
std::string myName;
extern "C"
{
+VISU_CONVERTOR_EXPORT
//! Instatiate proper VISU_Convertor subclass
- VISU_Convertor*
+ VISU_Convertor*
CreateConvertor(const std::string& theFileName);
};
#include <vtkCellType.h>
+#include "VISUConvertor.hxx"
+
#include "MED_Utilities.hxx"
class vtkUnstructuredGrid;
void
WriteToFile(vtkUnstructuredGrid* theDataSet, const std::string& theFileName);
- class TTimerLog
+ class VISU_CONVERTOR_EXPORT TTimerLog
{
int myIsDebug;
double myCPUTime;
static int MYVTKDEBUG = 0;
#ifdef _DEBUG_
-static int MYDEBUG = 0;
+static int MYDEBUG = 1;
static int MYDEBUGWITHFILES = 0;
//#define _DEXCEPT_
#else
//---------------------------------------------------------------
- void
+ bool
GetMeshOnProfile(const PMeshImpl& theMesh,
const PMeshOnEntityImpl& theMeshOnEntity,
const PProfileImpl& theProfile)
{
INITMSG(MYDEBUG,"GetMeshOnProfile - anEntity = "<<theMeshOnEntity->myEntity<<endl);
+ if(theProfile->myMeshOnEntity && theProfile->myMeshOnEntity != theMeshOnEntity.get())
+ return false;
+
if(theProfile->myIsVTKDone)
- return;
-
- theProfile->myMeshOnEntity = theMeshOnEntity.get();
+ return true;
+
const TVTKAppendFilter& anAppendFilter = theProfile->GetFilter();
anAppendFilter->SetPoints(GetPoints(theMesh));
}
}
anAppendFilter->Update(); // Fix on VTK
+ theProfile->myMeshOnEntity = theMeshOnEntity.get();
theProfile->myNamedPointCoords = theMesh->myNamedPointCoords;
theProfile->myIsVTKDone = true;
+ return true;
}
}
}
}
+ //theSource->Update();
+
aFloatArray->Delete();
aDataArray->Delete();
}
EGeometry aEGeom = anIter->first;
vtkIdType aVGeom = VISUGeom2VTK(aEGeom);
PSubMeshImpl aSubMesh = anIter->second;
+ //ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ aSubMesh->myIsStructured = aMesh->myIsStructured;
+ aSubMesh->myType = aMesh->myType;
+ aSubMesh->myGrilleStructure = aMesh->myGrilleStructure;
+ aSubMesh->myObjID2StructureID = aMesh->myObjID2StructureID;
+ //ENK: 23.11.2006
const TVTKSource& aSource = aSubMesh->GetSource();
aSource->SetPoints(GetPoints(aMesh));
GetCellsOnSubMesh(aSource,aMeshOnEntity,aSubMesh,aVGeom);
aSubMeshArr[anID] = aSubMesh;
}
aMeshOnEntity->myNamedPointCoords = aMesh->myNamedPointCoords;
-
+ //ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ aMeshOnEntity->myIsStructured = aMesh->myIsStructured;
+ aMeshOnEntity->myType = aMesh->myType;
+ aMeshOnEntity->myGrilleStructure = aMesh->myGrilleStructure;
+ aMeshOnEntity->myObjID2StructureID = aMesh->myObjID2StructureID;
+ //ENK: 23.11.2006
aMeshOnEntity->myIsVTKDone = true;
if(MYDEBUGWITHFILES){
GetCellsOnFamily(aSource,aMeshOnEntity,aFamily);
aFamily->myNamedPointCoords = aMesh->myNamedPointCoords;
-
+ //ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ aFamily->myIsStructured = aMesh->myIsStructured;
+ aFamily->myType = aMesh->myType;
+ aFamily->myGrilleStructure = aMesh->myGrilleStructure;
+ aFamily->myObjID2StructureID = aMesh->myObjID2StructureID;
+ //ENK: 23.11.2006
aFamily->myIsVTKDone = true;
if(MYDEBUGWITHFILES){
aFamilyArr[anID] = aFamily;
}
aGroup->myNamedPointCoords = aMesh->myNamedPointCoords;
-
+ //ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ aGroup->myIsStructured = aMesh->myIsStructured;
+ aGroup->myType = aMesh->myType;
+ aGroup->myGrilleStructure = aMesh->myGrilleStructure;
+ aGroup->myObjID2StructureID = aMesh->myObjID2StructureID;
+ //ENK: 23.11.2006
aGroup->myIsVTKDone = true;
if(MYDEBUGWITHFILES){
const VISU::PProfileImpl& theProfile,
const VISU::TEntity& theEntity)
{
- LoadMeshOnEntity(theMesh,theMeshOnEntity);
- GetMeshOnEntity(theMeshOnEntity->myMeshName,theMeshOnEntity->myEntity);
- GetMeshOnProfile(theMesh,theMeshOnEntity,theProfile);
-
- theIDMapperFilter->myIDMapper = theProfile;
- TVTKOutput* anOutput = theIDMapperFilter->GetVTKOutput();
- const TVTKSource& aSource = theIDMapperFilter->mySource.GetSource();
- ::GetTimeStampOnProfile(aSource,theField,theValForTime,theEntity);
-
+ TVTKOutput* anOutput = NULL;
+ try{
+ LoadMeshOnEntity(theMesh,theMeshOnEntity);
+ GetMeshOnEntity(theMeshOnEntity->myMeshName,theMeshOnEntity->myEntity);
+ if(GetMeshOnProfile(theMesh,theMeshOnEntity,theProfile)){
+ theIDMapperFilter->myIDMapper = theProfile;
+ anOutput = theIDMapperFilter->GetVTKOutput();
+ const TVTKSource& aSource = theIDMapperFilter->mySource.GetSource();
+ ::GetTimeStampOnProfile(aSource,theField,theValForTime,theEntity);
+ }
+ }catch(std::exception& exc){
+ MSG(MYDEBUG,"Follow exception was occured :\n"<<exc.what());
+ return NULL;
+ }
return anOutput;
}
if(!anIDMapperFilter->myIsVTKDone){
LoadValForTimeOnMesh(aMesh,aMeshOnEntity,aField,aValForTime);
- TVTKOutput* anOutput;
- try{
- anOutput = GetTimeStampOnProfile(aMesh,
- aVTKMeshOnEntity,
- aField,
- aValForTime,
- anIDMapperFilter,
- aValForTime->myProfile,
- aMeshOnEntity->myEntity);
- }catch(std::exception& exc){
- MSG(MYDEBUG,"Follow exception was occured :\n"<<exc.what());
+ TVTKOutput* anOutput = GetTimeStampOnProfile(aMesh,
+ aVTKMeshOnEntity,
+ aField,
+ aValForTime,
+ anIDMapperFilter,
+ aValForTime->myProfile,
+ aMeshOnEntity->myEntity);
+ if(!anOutput)
anOutput = GetTimeStampOnProfile(aMesh,
aMeshOnEntity,
aField,
anIDMapperFilter,
aValForTime->myProfile,
aVTKMeshOnEntity->myEntity);
- }
+ //ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ anIDMapperFilter->myIsStructured = aMesh->myIsStructured;
+ anIDMapperFilter->myType = aMesh->myType;
+ anIDMapperFilter->myGrilleStructure = aMesh->myGrilleStructure;
+ anIDMapperFilter->myObjID2StructureID = aMesh->myObjID2StructureID;
+ //ENK: 23.11.2006
anIDMapperFilter->myIsVTKDone = true;
if(MYDEBUGWITHFILES){
aVTKMeshOnEntity = aMeshOnEntityMap[VISU::CELL_ENTITY];
else if(aMeshOnEntityMap.find(VISU::FACE_ENTITY) != aMeshOnEntityMap.end())
aVTKMeshOnEntity = aMeshOnEntityMap[VISU::FACE_ENTITY];
- else if(aMeshOnEntityMap.find(VISU::NODE_ENTITY) != aMeshOnEntityMap.end())
+ else if(aMeshOnEntityMap.find(VISU::EDGE_ENTITY) != aMeshOnEntityMap.end())
aVTKMeshOnEntity = aMeshOnEntityMap[VISU::EDGE_ENTITY];
+ else if(aMeshOnEntityMap.find(VISU::NODE_ENTITY) != aMeshOnEntityMap.end())
+ aVTKMeshOnEntity = aMeshOnEntityMap[VISU::NODE_ENTITY];
}else
aVTKMeshOnEntity = aMeshOnEntity;
class VTKViewer_AppendFilter;
class VISU_MergeFilter;
+#include "VISUConvertor.hxx"
#include "VISU_Convertor.hxx"
#include "MED_SliceArray.hxx"
ePOLYGONE=400, ePOLYEDRE=500, eNONE=-1};
//! Get number of nodes for defined geometrical type
- vtkIdType
+ VISU_CONVERTOR_EXPORT vtkIdType
VISUGeom2NbNodes(EGeometry theGeom);
//! Maps VISU geometrical type to VTK one
- vtkIdType
+ VISU_CONVERTOR_EXPORT vtkIdType
VISUGeom2VTK(EGeometry theGeom);
//---------------------------------------------------------------
//---------------------------------------------------------------
//! Define an utility base class which is repsonsible for preventing repetion
- struct TIsVTKDone: virtual TBaseStructure
+ struct VISU_CONVERTOR_EXPORT TIsVTKDone: virtual TBaseStructure
{
TIsVTKDone();
bool myIsDone; //!< Say, is the corresponding MED entity already loaded into intermediate data structure
//---------------------------------------------------------------
//! Define an utility base class which allow to keep calculated number of cells and their size
- struct TSizeCounter: virtual TIsVTKDone
+ struct VISU_CONVERTOR_EXPORT TSizeCounter: virtual TIsVTKDone
{
TSizeCounter();
vtkIdType myNbCells; //!< Number of cells contained into corresponding sublclass
//---------------------------------------------------------------
//! Define a container for VTK representation
- class TSource: public virtual TSizeCounter
+ class VISU_CONVERTOR_EXPORT TSource: public virtual TSizeCounter
{
protected:
mutable TVTKSource mySource;
/*!
This container allow to combine other VTK representation into single one.
*/
- class TAppendFilter: public virtual TIsVTKDone,
+ class VISU_CONVERTOR_EXPORT TAppendFilter: public virtual TIsVTKDone,
public virtual TIDMapper
{
protected:
TVTKOutput*
GetVTKOutput();
};
+ typedef SharedPtr<TAppendFilter> PAppendFilter;
//---------------------------------------------------------------
/*!
This container allow to assign data to mesh and represent them into single VTK representation
*/
- class TMergeFilter: public virtual TIsVTKDone,
+ class VISU_CONVERTOR_EXPORT TMergeFilter: public virtual TIsVTKDone,
public virtual TIDMapper
{
protected:
typedef TCSlice<TCoordArray> TCCoordSlice;
//! This class is responsible for representation of mesh nodes
- class TPointCoords: public virtual TBaseStructure
+ class VISU_CONVERTOR_EXPORT TPointCoords: public virtual TBaseStructure
{
protected:
vtkIdType myDim; //!< Dimension of the nodal coordinates
In additition to its base functionlity it support mapping of VTK to object numeration and
keeps names for each of nodes.
*/
- class TNamedPointCoords: public virtual TPointCoords
+ class VISU_CONVERTOR_EXPORT TNamedPointCoords: public virtual TPointCoords
{
protected:
typedef TVector<std::string> TPointsDim;
//---------------------------------------------------------------
//! Specialize TMesh to provide VTK mapping for nodes
- struct TMeshImpl: virtual TMesh,
+ struct VISU_CONVERTOR_EXPORT TMeshImpl: virtual TMesh,
virtual TIsVTKDone
{
PNamedPointCoords myNamedPointCoords; //!< Keeps intermediate representation of the nodes
typedef enum {eRemoveAll, eAddAll, eAddPart, eNone} ESubMeshStatus;
//! Specialize TSubProfile to provide VTK mapping
- struct TSubProfileImpl: virtual TSubProfile,
+ struct VISU_CONVERTOR_EXPORT TSubProfileImpl: virtual TSubProfile,
virtual TSource
{
TSubProfileImpl();
typedef std::map<EGeometry,PSubProfileImpl> TGeom2SubProfile;
//! Specialize TProfile to provide VTK mapping for MED TIMESTAMP mesh
- struct TProfileImpl: virtual TProfile,
+ struct VISU_CONVERTOR_EXPORT TProfileImpl: virtual TProfile,
virtual TAppendFilter
{
TProfileImpl();
//---------------------------------------------------------------
//! Specialize TIDMapper to provide VTK mapping for MED TIMESTAMP mesh
- struct TIDMapperFilter: virtual TMergeFilter
+ struct VISU_CONVERTOR_EXPORT TIDMapperFilter: virtual TMergeFilter
{
PAppendFilter myIDMapper; //!< Responsible for numbering
TSource mySource; //!< Keeps assigned data
typedef SharedPtr<TGaussImpl> PGaussImpl;
//! Specialize TGauss to provide more detail information of the MED GAUSS entity for VTK mapping
- struct TGaussImpl: virtual TGauss
+ struct VISU_CONVERTOR_EXPORT TGaussImpl: virtual TGauss
{
EGeometry myGeom; //!< Define, to which geometrical type the MED GAUSS entity belongs
std::string myName; //!< Keeps name of the MED GAUSS entity
//---------------------------------------------------------------
//! Specialize TGaussSubMesh to provide VTK mapping for the entity
- struct TGaussSubMeshImpl: virtual TGaussSubMesh,
+ struct VISU_CONVERTOR_EXPORT TGaussSubMeshImpl: virtual TGaussSubMesh,
virtual TSource
{
TGaussSubMeshImpl();
typedef std::map<EGeometry,PGaussSubMeshImpl> TGeom2GaussSubMesh;
//! Specialize TGaussMesh to provide VTK mapping for the entity
- struct TGaussMeshImpl: virtual TGaussMesh,
+ struct VISU_CONVERTOR_EXPORT TGaussMeshImpl: virtual TGaussMesh,
virtual TAppendFilter
{
TGaussMeshImpl();
//---------------------------------------------------------------
//! Specialize TGaussPtsIDMapper to provide VTK mapping for MED TIMESTAMP mesh
- struct TGaussPtsIDFilter: virtual TIDMapperFilter,
+ struct VISU_CONVERTOR_EXPORT TGaussPtsIDFilter: virtual TIDMapperFilter,
virtual TGaussPtsIDMapper
{
PGaussPtsIDMapper myGaussPtsIDMapper;
typedef TVector<TConnect> TCell2Connect;
//! The class is responsible for mapping of cells of defined geometrical type
- struct TSubMeshImpl: virtual TSource
+ struct VISU_CONVERTOR_EXPORT TSubMeshImpl: virtual TSource,
+ virtual TStructured // ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
{
//! To implement the TIDMapper::GetElemObjID
typedef TVector<PSubMeshImpl> TSubMeshArr;
//! Specialize TMeshOnEntity to provide VTK mapping for the entity
- struct TMeshOnEntityImpl: virtual TMeshOnEntity,
+ struct VISU_CONVERTOR_EXPORT TMeshOnEntityImpl: virtual TMeshOnEntity,
virtual TAppendFilter,
virtual TSizeCounter
{
typedef std::map<EGeometry,TSubMeshID> TGeom2SubMeshID;
//! Specialize TFamily to provide VTK mapping for the entity
- struct TFamilyImpl: virtual TFamily,
+ struct VISU_CONVERTOR_EXPORT TFamilyImpl: virtual TFamily,
virtual TSource
{
//! Reimplement the TIDMapper::GetNodeObjID
typedef TVector<PFamilyImpl> TFamilyArr;
//! Specialize TGroup to provide VTK mapping for the entity
- struct TGroupImpl: virtual TGroup,
+ struct VISU_CONVERTOR_EXPORT TGroupImpl: virtual TGroup,
virtual TAppendFilter
{
//! Calculate pair of values - number of cells and its size
typedef TVector<TMinMax> TMinMaxArr;
//! Specialize TField to provide VTK mapping for the entity
- struct TFieldImpl: virtual TField
+ struct VISU_CONVERTOR_EXPORT TFieldImpl: virtual TField
{
vtkIdType myDataSize; //!< Keeps size of the assigned data
typedef TVector<TValueSlice> TValueSliceArr;
//! Define a container to get access to data assigned to mesh
- struct TMeshValue
+ struct VISU_CONVERTOR_EXPORT TMeshValue
{
TValue myValue; //!< Keeps all values as one dimensional sequence
typedef std::map<EGeometry,vtkIdType> TGeom2NbGauss;
//! Specialize TValForTime to provide VTK mapping for the entity
- struct TValForTimeImpl: virtual TValForTime
+ struct VISU_CONVERTOR_EXPORT TValForTimeImpl: virtual TValForTime
{
PGaussPtsIDFilter myGaussPtsIDFilter; //!< Keep VTK representation for mesh and data on Gauss Points
PIDMapperFilter myIDMapperFilter; //!< Keep VTK representation for ordinary mesh and data
It implements VISU_Convertor public interface and declare new pure virtual functions
to fill its intermediate data structure from a MED source
*/
-class VISU_Convertor_impl: public VISU_Convertor
+class VISU_CONVERTOR_EXPORT VISU_Convertor_impl: public VISU_Convertor
{
public:
VISU_Convertor_impl();
namespace VISU
{
+ //---------------------------------------------------------------
+ //ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ bool
+ TStructured
+ ::IsStructured() const
+ {
+ return myIsStructured;
+ }
+
+ TIdTypeVector
+ TStructured
+ ::GetStructure()
+ {
+ return myGrilleStructure;
+ }
+
+ TIdTypeVector
+ TStructured
+ ::GetIndexesOfNode(vtkIdType theNodeId)
+ {
+ TIdTypeVector aNullVec;
+ if(!IsStructured())
+ return aNullVec;
+ TObj2IdTypeVector::const_iterator aIter = myObjID2StructureID.find(theNodeId);
+ if(aIter!=myObjID2StructureID.end())
+ return aIter->second;
+ else
+ return aNullVec;
+ }
+
+ vtkIdType
+ TStructured
+ ::GetObjectIDByIndexes(TIdTypeVector theVec)
+ {
+ TObj2IdTypeVector::const_iterator aIter = myObjID2StructureID.begin();
+ for(;aIter!=myObjID2StructureID.end();aIter++){
+ if(theVec == aIter->second)
+ return aIter->first;
+ }
+ return -1;
+ }
+ //ENK: 23.11.2006
+
//---------------------------------------------------------------
vtkFloatingPointType*
TIDMapper
\brief The file contains declarations for basic interfaces that defines mapping of mesh elements
*/
+#include "VISUConvertor.hxx"
+
#include "MED_SharedPtr.hxx"
+#include "MED_Vector.hxx"
#include "VTKViewer.h"
#include <string>
+#include <map>
class vtkUnstructuredGrid;
class vtkCell;
namespace VISU
{
using MED::SharedPtr;
+ using MED::TVector;
+
+ typedef TVector<vtkIdType> TIdTypeVector;
+ typedef std::map<vtkIdType,TIdTypeVector> TObj2IdTypeVector;
+
+ struct VISU_CONVERTOR_EXPORT TStructured
+ {
+ TStructured():
+ myIsStructured(false),
+ myType(true)
+ {}
+
+ virtual
+ bool
+ IsStructured() const;
+
+ /*!
+ * Get structure of grille
+ * see also MED::TGrilleInfo::GetGrilleStructure
+ * see also MED::TGrilleInfo::GetNbIndexes
+ */
+ virtual TIdTypeVector
+ GetStructure();
+
+ /*!
+ * Gets i,j,k by object id
+ * return -1, if not found
+ */
+ virtual TIdTypeVector
+ GetIndexesOfNode(vtkIdType theNodeId);
+
+ /*!
+ * Gets object id by i,j,k
+ * return -1, if not found
+ */
+ virtual vtkIdType
+ GetObjectIDByIndexes(TIdTypeVector theVec);
+
+ public:
+ bool myIsStructured; //!< To define mesh type (structured - true, non structured - false)
+ bool myType; //!< To define structured mesh is polair
+
+ /*!provides grille structure for structured grid.
+ * Example: {3,4,5}, 3 nodes in X axe, 4 nodes in Y axe, ...
+ */
+ TIdTypeVector myGrilleStructure;
+
+ TObj2IdTypeVector myObjID2StructureID;//!< map of object id to i,j,k ids of structured grid nodes
+
+ };
+
//---------------------------------------------------------------
//! Defines a basic class for intemediate data structures
- struct TBaseStructure
+ struct VISU_CONVERTOR_EXPORT TBaseStructure: virtual TStructured
{
//! Just to provide possibility of dynamic navigation through the class hierarchy
virtual ~TBaseStructure()
Where object ID means ID which attached to corresponding MED entity.
For example, each MED node can have its own ID as well as any other mesh cell
*/
- struct TIDMapper: virtual TBaseStructure
+ struct VISU_CONVERTOR_EXPORT TIDMapper: virtual TBaseStructure
{
//! Get node object ID for corresponding VTK ID
virtual
using MED::EBooleen;
#ifdef _DEBUG_
-static int MYDEBUG = 0;
-static int MYVALUEDEBUG = 0;
-static int MY_FAMILY_DEBUG = 0;
-static int MY_GROUP_DEBUG = 0;
+static int MYDEBUG = 1;
+static int MYVALUEDEBUG = 1;
+static int MY_FAMILY_DEBUG = 1;
+static int MY_GROUP_DEBUG = 1;
//#define _DEXCEPT_
#else
static int MYDEBUG = 0;
#define _LOAD_FAMILIES_
#define _EDF_NODE_IDS_
-namespace
-{
+//namespace
+//{
//---------------------------------------------------------------
vtkIdType
MEDGeom2NbNodes(MED::EGeometrieElement theMEDGeomType)
MEDEntityToVTK(MED::EEntiteMaillage theMEDEntity)
{
switch(theMEDEntity){
- case MED::eNOEUD: return NODE_ENTITY;
+ case MED::eNOEUD: return VISU::NODE_ENTITY;
case MED::eARETE: return EDGE_ENTITY;
case MED::eFACE: return FACE_ENTITY;
case MED::eMAILLE: return CELL_ENTITY;
VTKEntityToMED(TEntity theVTKEntity)
{
switch(theVTKEntity){
- case NODE_ENTITY: return MED::eNOEUD;
+ case VISU::NODE_ENTITY: return MED::eNOEUD;
case EDGE_ENTITY: return MED::eARETE;
case FACE_ENTITY: return MED::eFACE;
case CELL_ENTITY: return MED::eMAILLE;
TTimerLog aTimerLog(MYDEBUG,"InitGaussMesh");
INITMSG(MYDEBUG,"InitGaussMesh"<<endl);
- if(theMeshOnEntity.myEntity == NODE_ENTITY)
+ if(theMeshOnEntity.myEntity == VISU::NODE_ENTITY)
return;
TGaussMeshMap& aGaussMeshMap = theMeshOnEntity.myGaussMeshMap;
const std::string& aMeshName = theMesh->myName;
TMeshOnEntityMap& aMeshOnEntityMap = theMesh->myMeshOnEntityMap;
MED::TEntityInfo::const_iterator anEntityIter = theEntityInfo.begin();
+
+ //ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ int iMax,jMax,kMax;
+ iMax=jMax=kMax=0;
+
+ MED::TIntVector aIntVec;
+ if(theGrilleInfo->GetGrilleType()!=MED::eGRILLE_STANDARD)
+ for(int i=0;i<theMesh->myDim;i++)
+ aIntVec.push_back(theGrilleInfo->GetNbIndexes(i));
+ else
+ aIntVec = theGrilleInfo->GetGrilleStructure();
+
+ theMesh->myGrilleStructure = aIntVec;
+
+ switch((theMesh->GetStructure()).size()){
+ case 3: kMax=theMesh->GetStructure()[2];
+ case 2: jMax=theMesh->GetStructure()[1];
+ case 1: iMax=theMesh->GetStructure()[0];
+ }
+
+ int iii=0;
+ TVectorID aIndexes;
+ switch(theMesh->myDim){
+ case 1:
+ for(int i=1;i<=iMax;i++)
+ (theMesh->myObjID2StructureID[i-1]).push_back(i);
+ break;
+ case 2:
+ for(int j=1;j<=jMax;j++)
+ for(int i=1;i<=iMax;i++){
+ (theMesh->myObjID2StructureID[iii]).push_back(i);
+ (theMesh->myObjID2StructureID[iii]).push_back(j);
+ iii++;
+ }
+ break;
+ case 3:
+ for(int k=1;k<=kMax ;k++)
+ for(int j=1;j<=jMax;j++)
+ for(int i=1;i<=iMax;i++)
+ {
+ (theMesh->myObjID2StructureID[iii]).push_back(i);
+ (theMesh->myObjID2StructureID[iii]).push_back(j);
+ (theMesh->myObjID2StructureID[iii]).push_back(k);
+ iii++;
+ }
+ }
+ //ENK: 23.11.2006
+
for(; anEntityIter != theEntityInfo.end(); anEntityIter++){
const MED::EEntiteMaillage& aMEntity = anEntityIter->first;
const MED::TGeom2Size& aGeom2Size = anEntityIter->second;
const MED::TFamilyID2NbCells& aFam2NbCells = MED::GetFamilyID2NbCells(aGrilleInfo);
- MED::TFamilyInfoSet::iterator aFamInter = theFamilyInfoSet.begin();
+ MED::TFamilyInfoSet::const_iterator aFamInter = theFamilyInfoSet.begin();
for(;aFamInter != theFamilyInfoSet.end();aFamInter++){
TInt anId = (*aFamInter)->GetId();
}
};
-}
+//}
//---------------------------------------------------------------
CreateConvertor(const string& theFileName)
{
if(MED::PWrapper aMed = MED::CrWrapper(theFileName,true))
- return new VISU_MedConvertor(theFileName);
+ return new VISU_MedConvertor(theFileName, aMed);
return NULL;
}
VISU_MedConvertor
-::VISU_MedConvertor(const string& theFileName):
+::VISU_MedConvertor(const string& theFileName, MED::PWrapper theMed):
myIsEntitiesDone(false),
myIsFieldsDone(false),
myIsGroupsDone(false),
- myIsMinMaxDone(false)
+ myIsMinMaxDone(false),
+ myMed(theMed)
{
myFileInfo.setFile(QString(theFileName.c_str()));
myName = myFileInfo.baseName().latin1();
TSetIsDone aSetIsDone(myIsEntitiesDone);
TTimerLog aTimerLog(MYDEBUG,"BuildEntities");
- MED::PWrapper aMed = MED::CrWrapper(myFileInfo.absFilePath().latin1());
- TInt aNbMeshes = aMed->GetNbMeshes();
+ TInt aNbMeshes = myMed->GetNbMeshes();
TMeshMap& aMeshMap = myMeshMap;
INITMSG(MYDEBUG,"BuildEntities aNbMeshes = "<<aNbMeshes<<"\n");
#endif
TTimerLog aTimerLog(MYDEBUG,"GetPMeshInfo");
- MED::PMeshInfo aMeshInfo = aMed->GetPMeshInfo(iMesh);
+ MED::PMeshInfo aMeshInfo = myMed->GetPMeshInfo(iMesh);
std::string aMeshName = aMeshInfo->GetName();
TInt aDim = aMeshInfo->GetDim();
MED::EMaillage aType = aMeshInfo->GetType();
if(aType == MED::eNON_STRUCTURE){
- if(MED::PNodeInfo aNodeInfo = aMed->GetPNodeInfo(aMeshInfo)){
- MED::TEntityInfo anEntityInfo = aMed->GetEntityInfo(aMeshInfo);
+ if(MED::PNodeInfo aNodeInfo = myMed->GetPNodeInfo(aMeshInfo)){
+ MED::TEntityInfo anEntityInfo = myMed->GetEntityInfo(aMeshInfo);
aMesh->myNbPoints = aNodeInfo->GetNbElem();
aMesh->myEntityInfo = anEntityInfo;
BuildMeshOnEntityMap(aMesh,
anEntityInfo,
aNodeInfo,
- aMed);
+ myMed);
#ifndef _DEXCEPT_
}catch(std::exception& exc){
}
} // NON STRUCTURED MESH
else {
- MED::PGrilleInfo aGrilleInfo = aMed->GetPGrilleInfo(aMeshInfo);
+ MED::PGrilleInfo aGrilleInfo = myMed->GetPGrilleInfo(aMeshInfo);
MED::TEntityInfo anEntityInfo;
anEntityInfo[MED::eNOEUD][MED::ePOINT1] = aGrilleInfo->GetNbNodes();
aMesh->myNbPoints = aGrilleInfo->GetNbNodes();
aMesh->myEntityInfo = anEntityInfo;
-
+ //ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ aMesh->myIsStructured = true;
+ aMesh->myType = (MED::eGRILLE_POLAIRE == aGrilleInfo->GetGrilleType());
+ //ENK: 23.11.2006
#ifndef _DEXCEPT_
try{
#endif
BuildMeshGrilleOnEntityMap(aMesh,
anEntityInfo,
aGrilleInfo,
- aMed);
+ myMed);
#ifndef _DEXCEPT_
}catch(std::exception& exc){
TSetIsDone aSetIsDone(myIsFieldsDone);
TTimerLog aTimerLog(MYDEBUG,"BuildFields");
- MED::PWrapper aMed = MED::CrWrapper(myFileInfo.absFilePath().latin1());
- TInt aNbMeshes = aMed->GetNbMeshes();
+ TInt aNbMeshes = myMed->GetNbMeshes();
TMeshMap& aMeshMap = myMeshMap;
INITMSG(MYDEBUG,"BuildFields - aNbMeshes = "<<aNbMeshes<<"\n");
#endif
TTimerLog aTimerLog(MYDEBUG,"GetPMeshInfo");
- MED::PMeshInfo aMeshInfo = aMed->GetPMeshInfo(iMesh);
+ MED::PMeshInfo aMeshInfo = myMed->GetPMeshInfo(iMesh);
std::string aMeshName = aMeshInfo->GetName();
TMeshMap::const_iterator anIter = aMeshMap.find(aMeshName);
#ifndef _DEXCEPT_
try{
#endif
- MED::TEntityInfo anEntityInfo = aMed->GetEntityInfo(aMeshInfo);
+ MED::TEntityInfo anEntityInfo = myMed->GetEntityInfo(aMeshInfo);
BuildFieldMap(aMesh,
anEntityInfo,
- aMed);
+ myMed);
#ifndef _DEXCEPT_
}catch(std::exception& exc){
MSG(MYDEBUG,"Follow exception was occured in:\n"<<exc.what());
TSetIsDone aSetIsDone(myIsMinMaxDone);
TTimerLog aTimerLog(MYDEBUG,"BuildMinMax");
- MED::PWrapper aMed = MED::CrWrapper(myFileInfo.absFilePath().latin1());
- MED::TKey2Gauss aKey2Gauss = MED::GetKey2Gauss(aMed);
- MED::TMKey2Profile aMKey2Profile = MED::GetMKey2Profile(aMed);
+ MED::TKey2Gauss aKey2Gauss = MED::GetKey2Gauss(myMed);
+ MED::TMKey2Profile aMKey2Profile = MED::GetMKey2Profile(myMed);
- TInt aNbMeshes = aMed->GetNbMeshes();
+ TInt aNbMeshes = myMed->GetNbMeshes();
TMeshMap& aMeshMap = myMeshMap;
INITMSG(MYDEBUG,"BuildMinMax - aNbMeshes = "<<aNbMeshes<<"\n");
#endif
TTimerLog aTimerLog(MYDEBUG,"BuildMinMax - GetPMeshInfo");
- MED::PMeshInfo aMeshInfo = aMed->GetPMeshInfo(iMesh);
+ MED::PMeshInfo aMeshInfo = myMed->GetPMeshInfo(iMesh);
std::string aMeshName = aMeshInfo->GetName();
TMeshMap::const_iterator anIter = aMeshMap.find(aMeshName);
#ifndef _DEXCEPT_
try{
#endif
- TInt aNbFields = aMed->GetNbFields();
+ TInt aNbFields = myMed->GetNbFields();
INITMSG(MYDEBUG,
"- aMeshName = '"<<aMeshName<<"'"<<
"; aNbFields = "<<aNbFields<<"\n");
- MED::TEntityInfo anEntityInfo = aMed->GetEntityInfo(aMeshInfo);
+ MED::TEntityInfo anEntityInfo = myMed->GetEntityInfo(aMeshInfo);
for(TInt iField = 1; iField <= aNbFields; iField++){
TTimerLog aTimerLog(MYDEBUG,"BuildMinMax - GetPFieldInfo()");
- MED::PFieldInfo aFieldInfo = aMed->GetPFieldInfo(aMeshInfo,iField);
+ MED::PFieldInfo aFieldInfo = myMed->GetPFieldInfo(aMeshInfo,iField);
std::string aFieldName = aFieldInfo->GetName();
INITMSG(MYDEBUG,"- aFieldName = '"<<aFieldName<<"'\n");
MED::TGeom2Size aGeom2Size;
MED::EEntiteMaillage aMEntity;
- TInt aNbTimeStamps = aMed->GetNbTimeStamps(aFieldInfo,
+ TInt aNbTimeStamps = myMed->GetNbTimeStamps(aFieldInfo,
anEntityInfo,
aMEntity,
aGeom2Size);
try{
#endif
#endif
- MED::PTimeStampInfo aTimeStampInfo = aMed->GetPTimeStampInfo(aFieldInfo,
+ MED::PTimeStampInfo aTimeStampInfo = myMed->GetPTimeStampInfo(aFieldInfo,
aMEntity,
aGeom2Size,
iTimeStamp);
- MED::PTimeStampVal aTimeStampVal = aMed->GetPTimeStampVal(aTimeStampInfo,
+ MED::PTimeStampVal aTimeStampVal = myMed->GetPTimeStampVal(aTimeStampInfo,
aMKey2Profile,
aKey2Gauss);
TSetIsDone aSetIsDone(myIsGroupsDone);
TTimerLog aTimerLog(MYDEBUG,"BuildGroups");
- MED::PWrapper aMed = MED::CrWrapper(myFileInfo.absFilePath().latin1());
- TInt aNbMeshes = aMed->GetNbMeshes();
+ TInt aNbMeshes = myMed->GetNbMeshes();
TMeshMap& aMeshMap = myMeshMap;
INITMSG(MYDEBUG,"BuildGroups - aNbMeshes = "<<aNbMeshes<<"\n");
#endif
TTimerLog aTimerLog(MYDEBUG,"GetPMeshInfo");
- MED::PMeshInfo aMeshInfo = aMed->GetPMeshInfo(iMesh);
+ MED::PMeshInfo aMeshInfo = myMed->GetPMeshInfo(iMesh);
std::string aMeshName = aMeshInfo->GetName();
TMeshMap::const_iterator anIter = aMeshMap.find(aMeshName);
MED::EMaillage aType = aMeshInfo->GetType();
- MED::TEntityInfo anEntityInfo = aMed->GetEntityInfo(aMeshInfo);
+ MED::TEntityInfo anEntityInfo = myMed->GetEntityInfo(aMeshInfo);
MED::TEntity2TGeom2ElemInfo anEntity2TGeom2ElemInfo =
- MED::GetEntity2TGeom2ElemInfo(aMed,aMeshInfo,anEntityInfo);
+ MED::GetEntity2TGeom2ElemInfo(myMed,aMeshInfo,anEntityInfo);
#ifndef _DEXCEPT_
try{
#endif
- MED::TFamilyInfoSet aFamilyInfoSet = MED::GetFamilyInfoSet(aMed,aMeshInfo);
+ MED::TFamilyInfoSet aFamilyInfoSet = MED::GetFamilyInfoSet(myMed,aMeshInfo);
if(aType == MED::eNON_STRUCTURE)
BuildFamilyMap(aMesh,
anEntityInfo,
anEntity2TGeom2ElemInfo,
aFamilyInfoSet,
- aMed);
+ myMed);
else
BuildGrilleFamilyMap(aMesh,
anEntityInfo,
aFamilyInfoSet,
- aMed);
+ myMed);
BuildGroupMap(aMesh,
aFamilyInfoSet);
TTimerLog aTimerLog(MYDEBUG,"LoadMeshOnEntity");
INITMSG(MYDEBUG,"LoadMeshOnEntity"<<endl);
- MED::PWrapper aMed = MED::CrWrapper(myFileInfo.absFilePath().latin1());
const TEntity& anEntity = theMeshOnEntity->myEntity;
int isPointsUpdated = 0, isCellsOnEntityUpdated = 0;
- if(anEntity == NODE_ENTITY){
- isPointsUpdated += LoadPoints(aMed,theMesh);
+ if(anEntity == VISU::NODE_ENTITY){
+ isPointsUpdated += LoadPoints(myMed,theMesh);
}else{
- isPointsUpdated += LoadPoints(aMed,theMesh);
- isCellsOnEntityUpdated += LoadCellsOnEntity(aMed,theMesh,theMeshOnEntity);
+ isPointsUpdated += LoadPoints(myMed,theMesh);
+ isCellsOnEntityUpdated += LoadCellsOnEntity(myMed,theMesh,theMeshOnEntity);
}
return (isPointsUpdated || isCellsOnEntityUpdated);
TTimerLog aTimerLog(MYDEBUG,"LoadFamilyOnEntity");
INITMSG(MYDEBUG,"LoadFamilyOnEntity"<<endl);
- MED::PWrapper aMed = MED::CrWrapper(myFileInfo.absFilePath().latin1());
const TEntity& anEntity = theMeshOnEntity->myEntity;
int isPointsUpdated = 0, isCellsOnEntityUpdated = 0;
- if(anEntity == NODE_ENTITY){
- isPointsUpdated += LoadPointsOnFamily(aMed,theMesh,theFamily);
+ if(anEntity == VISU::NODE_ENTITY){
+ isPointsUpdated += LoadPointsOnFamily(myMed,theMesh,theFamily);
}else{
- isPointsUpdated += LoadPoints(aMed,theMesh);
- isCellsOnEntityUpdated += LoadCellsOnFamily(aMed,theMesh,theMeshOnEntity,theFamily);
+ isPointsUpdated += LoadPoints(myMed,theMesh);
+ isCellsOnEntityUpdated += LoadCellsOnFamily(myMed,theMesh,theMeshOnEntity,theFamily);
}
return (isPointsUpdated || isCellsOnEntityUpdated);
TTimerLog aTimerLog(MYDEBUG,"LoadMeshOnGroup");
INITMSG(MYDEBUG,"LoadMeshOnGroup"<<endl);
- MED::PWrapper aMed = MED::CrWrapper(myFileInfo.absFilePath().latin1());
int isPointsUpdated = 0, isCellsOnEntityUpdated = 0;
TFamilySet::const_iterator aFamilyIter = theFamilySet.begin();
for(; aFamilyIter != theFamilySet.end(); aFamilyIter++){
PMEDFamily aFamily = *aFamilyIter;
const TEntity& anEntity = aFamily->myEntity;
const PMEDMeshOnEntity aMeshOnEntity = theMesh->myMeshOnEntityMap[anEntity];
- isPointsUpdated += LoadPoints(aMed,theMesh);
- if(anEntity == NODE_ENTITY){
- isPointsUpdated += LoadPointsOnFamily(aMed,theMesh,aFamily);
+ isPointsUpdated += LoadPoints(myMed,theMesh);
+ if(anEntity == VISU::NODE_ENTITY){
+ isPointsUpdated += LoadPointsOnFamily(myMed,theMesh,aFamily);
}else{
- isCellsOnEntityUpdated += LoadCellsOnFamily(aMed,theMesh,aMeshOnEntity,aFamily);
+ isCellsOnEntityUpdated += LoadCellsOnFamily(myMed,theMesh,aMeshOnEntity,aFamily);
}
}
TTimerLog aTimerLog(MYDEBUG,"LoadValForTimeOnMesh");
INITMSG(MYDEBUG,"LoadValForTimeOnMesh"<<endl);
- MED::PWrapper aMed = MED::CrWrapper(myFileInfo.absFilePath().latin1());
-
const TEntity& anEntity = theMeshOnEntity->myEntity;
int isPointsUpdated = 0, isCellsOnEntityUpdated = 0;
- isPointsUpdated += LoadPoints(aMed,theMesh);
- if(anEntity != NODE_ENTITY)
- isCellsOnEntityUpdated += LoadCellsOnEntity(aMed,theMesh,theMeshOnEntity);
- int isFieldUpdated = LoadValForTimeOnMesh(aMed,theMesh,theMeshOnEntity,theField,theValForTime);
+ isPointsUpdated += LoadPoints(myMed,theMesh);
+ if(anEntity != VISU::NODE_ENTITY)
+ isCellsOnEntityUpdated += LoadCellsOnEntity(myMed,theMesh,theMeshOnEntity);
+ int isFieldUpdated = LoadValForTimeOnMesh(myMed,theMesh,theMeshOnEntity,theField,theValForTime);
return (isPointsUpdated || isCellsOnEntityUpdated || isFieldUpdated);
}
TTimerLog aTimerLog(MYDEBUG,"LoadValForTimeOnGaussPts");
INITMSG(MYDEBUG,"LoadValForTimeOnGaussPts"<<endl);
- MED::PWrapper aMed = MED::CrWrapper(myFileInfo.absFilePath().latin1());
-
const TEntity& anEntity = theMeshOnEntity->myEntity;
int isPointsUpdated = 0, isCellsOnEntityUpdated = 0;
- if(anEntity != NODE_ENTITY)
- isCellsOnEntityUpdated += LoadCellsOnEntity(aMed,theMesh,theMeshOnEntity);
- int isFieldUpdated = LoadValForTimeOnGaussPts(aMed,theMesh,theMeshOnEntity,theField,theValForTime);
+ if(anEntity != VISU::NODE_ENTITY)
+ isCellsOnEntityUpdated += LoadCellsOnEntity(myMed,theMesh,theMeshOnEntity);
+ int isFieldUpdated = LoadValForTimeOnGaussPts(myMed,theMesh,theMeshOnEntity,theField,theValForTime);
return (isPointsUpdated || isCellsOnEntityUpdated || isFieldUpdated);
}
//Check on existing family
PMEDMeshOnEntity aMeshOnEntity = theMesh->myMeshOnEntityMap[VISU::NODE_ENTITY];
aMeshOnEntity->myMeshName = theMesh->myName;
- aMeshOnEntity->myEntity = NODE_ENTITY;
+ aMeshOnEntity->myEntity = VISU::NODE_ENTITY;
INITMSG(MYDEBUG,"LoadPoints - theMesh->myIsDone = "<<theMesh->myIsDone<<"'\n");
#include "VISU_Convertor_impl.hxx"
+#include "MED_Wrapper.hxx"
#include "MED_Common.hxx"
#include "MED_Structures.hxx"
bool myIsMinMaxDone;
public:
- VISU_MedConvertor(const std::string& theFileName);
+ VISU_MedConvertor(const std::string& theFileName, MED::PWrapper theMed);
virtual
VISU_Convertor*
protected:
QFileInfo myFileInfo;
+ MED::PWrapper myMed; // mpv : bug 13568: one med per converter
virtual
int
#include "VISU_Engine_i.hh"
#include "utilities.h"
-#include CORBA_SERVER_HEADER(SALOME_Session)
#include CORBA_SERVER_HEADER(SALOME_ModuleCatalog)
#include "SALOME_NamingService.hxx"
static int MYDEBUG = 0;
#endif
+#ifdef WNT
+#ifdef VISU_ENGINE_EXPORTS
+#define VISU_ENGINE_EXPORT __declspec(dllexport)
+#else
+#define VISU_ENGINE_EXPORT __declspec(dllimport)
+#endif
+#else
+#define VISU_ENGINE_EXPORT
+#endif
+
UNEXPECT_CATCH(SalomeException, SALOME::SALOME_Exception);
extern "C" {
+VISU_ENGINE_EXPORT
PortableServer::ObjectId *
VISUEngine_factory(CORBA::ORB_ptr orb, PortableServer::POA_ptr poa, PortableServer::ObjectId * contId,
const char *instanceName, const char *interfaceName)
{
- if(MYDEBUG) MESSAGE("VisuEngine_factory : "<<interfaceName);
- VISU::VISU_Gen_i * pVISU_Gen = new VISU::VISU_Gen_i(orb, poa, contId, instanceName, interfaceName);
+ MESSAGE("VisuEngine_factory : "<<interfaceName);
+ // Check session: MZN: 24.11.2006 PAL 13948
+ SALOME_NamingService aNamingService(orb);
+ CORBA::Object_ptr anObject = aNamingService.Resolve("/Kernel/Session");
+ SALOME::Session_var aSession = SALOME::Session::_narrow(anObject);
+ if (CORBA::is_nil(aSession))
+ return NULL;
+
+ VISU::VISU_Gen_i * pVISU_Gen = new VISU::VISU_Gen_i(aSession, orb, poa, contId, instanceName, interfaceName);
return pVISU_Gen->getId() ;
}
}
namespace VISU{
//===========================================================================
- VISU_Gen_i::VISU_Gen_i(CORBA::ORB_ptr orb,
+ VISU_Gen_i::VISU_Gen_i(SALOME::Session_ptr session,
+ CORBA::ORB_ptr orb,
PortableServer::POA_ptr poa,
PortableServer::ObjectId * contId,
const char *instanceName,
{
_thisObj = this ;
_id = _poa->activate_object(_thisObj);
- SALOME_NamingService aNamingService(orb);
- CORBA::Object_ptr anObject = aNamingService.Resolve("/Kernel/Session");
- SALOME::Session_var aSession = SALOME::Session::_narrow(anObject);
- //aSession->GetInterface();
- Engines::Component_var aComponent = aSession->GetComponent("libVISUEngineImpl.so");
+#ifndef WIN32
+ Engines::Component_var aComponent = session->GetComponent("libVISUEngineImpl.so");
+#else
+ Engines::Component_var aComponent = session->GetComponent("VISUEngineImpl.dll");
+#endif
myVisuGen = VISU::VISU_Gen::_narrow(aComponent);
}
return myVisuGen->Plot3DOnField(theResult,theMeshName,theEntity,theFieldName,theIteration);
}
-
Table_ptr VISU_Gen_i::CreateTable(const char* theTableEntry){
return myVisuGen->CreateTable(theTableEntry);
}
#include "SALOMEconfig.h"
#include CORBA_SERVER_HEADER(VISU_Gen)
#include CORBA_SERVER_HEADER(MED)
+#include CORBA_SERVER_HEADER(SALOME_Session)
#include CORBA_SERVER_HEADER(SALOMEDS)
#include CORBA_SERVER_HEADER(SALOMEDS_Attributes)
VISU_Gen_i();
VISU_Gen_i(const VISU::VISU_Gen_i &);
public:
- VISU_Gen_i(CORBA::ORB_ptr orb,
+ VISU_Gen_i(SALOME::Session_ptr session,
+ CORBA::ORB_ptr orb,
PortableServer::POA_ptr poa,
PortableServer::ObjectId * contId,
const char *instanceName,
# header files
EXPORT_HEADERS= \
- VisuGUI_TableDlg.h
+ VisuGUI_TableDlg.h \
+ VisuGUITools.h
# .po files to transform in .qm
#PO_FILES = \
--- /dev/null
+// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
+//
+//
+//
+// File : VisuGUITools.h
+// Author : Oleg UVAROV
+// Module : VISU
+
+#ifndef _VisuGUITools_H_
+#define _VisuGUITools_H_
+
+#ifdef WNT
+ #if defined VISU_GUITOOLS_EXPORTS
+ #if defined WIN32
+ #define VISU_GUITOOLS_EXPORT __declspec( dllexport )
+ #else
+ #define VISU_GUITOOLS_EXPORT
+ #endif
+ #else
+ #if defined WIN32
+ #define VISU_GUITOOLS_EXPORT __declspec( dllimport )
+ #else
+ #define VISU_GUITOOLS_EXPORT
+ #endif
+ #endif
+#else
+ #define VISU_GUITOOLS_EXPORT
+#endif
+
+#endif
\ No newline at end of file
if (app)
app->onHelpContextModule(app->activeModule() ? app->moduleName(app->activeModule()->moduleName()) : QString(""), aHelpFileName);
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
#include <SALOMEDSClient_SObject.hxx>
-class VisuGUI_TableDlg : public QDialog
+#include "VisuGUITools.h"
+
+class VISU_GUITOOLS_EXPORT VisuGUI_TableDlg : public QDialog
{
Q_OBJECT
#include "SALOME_Actor.h"
#include "VISU_ActorFactory.h"
#include "VISU_BoostSignals.h"
+#include "SVTK_DeviceActor.h"
#include <string>
#include <vtkSmartPointer.h>
class VTKViewer_ShrinkFilter;
class VISU_PipeLine;
-#ifdef _WIN_32
+#ifdef _WIN32
#define VTKOCC_EXPORT __declspec (dllexport)
#else
#define VTKOCC_EXPORT VTK_EXPORT
#endif
+namespace SVTK
+{
+ namespace Representation
+ {
+ const Type Surfaceframe = Insideframe + 1;
+ }
+}
+
namespace VISU
{
class Prs3d_i;
{
if(MYDEBUG) MESSAGE("VISU_GaussPtsAct::RemoveFromRender - this = "<<this);
- Superclass::RemoveFromRender(theRenderer);
-
myDeviceActor->RemoveFromRender(theRenderer);
theRenderer->RemoveActor(myTextActor.GetPointer());
myCursorPyramid->RemoveFromRender(theRenderer);
myCursorPyramidSelected->RemoveFromRender(theRenderer);
myScalarBarCtrl->RemoveFromRender(theRenderer);
+
+ Superclass::RemoveFromRender(theRenderer);
}
void
VISU_GaussPtsAct1
::RemoveFromRender(vtkRenderer* theRenderer)
{
- Superclass::RemoveFromRender(theRenderer);
-
myInsideDeviceActor->RemoveFromRender(theRenderer);
myOutsideDeviceActor->RemoveFromRender(theRenderer);
+
+ Superclass::RemoveFromRender(theRenderer);
}
void
class vtkImageData;
+#include "VISU_Actor.h"
//============================================================================
namespace VISU
//! Base class of Gauss Points settings.
-class VISU_GaussPtsSettings : public vtkObject
+class VTKOCC_EXPORT VISU_GaussPtsSettings : public vtkObject
{
public:
vtkTypeMacro( VISU_GaussPtsSettings, vtkObject );
* Clamp, Texture, Alpha threshold, Const size and Color.
* Used by Gauss Points Actor.
*/
-class VISU_InsideCursorSettings : public VISU_GaussPtsSettings
+class VTKOCC_EXPORT VISU_InsideCursorSettings : public VISU_GaussPtsSettings
{
public:
vtkTypeMacro( VISU_InsideCursorSettings, vtkObject );
* Clamp, Texture, Alpha threshold, Const size and Color.
* Used by Gauss Points Actor.
*/
-class VISU_OutsideCursorSettings : public VISU_GaussPtsSettings
+class VTKOCC_EXPORT VISU_OutsideCursorSettings : public VISU_GaussPtsSettings
{
public:
vtkTypeMacro( VISU_OutsideCursorSettings, vtkObject );
* Camera movement steps number and Display parent mesh.
* Used by Gauss Points Actor.
*/
-class VISU_PickingSettings : public vtkObject
+class VTKOCC_EXPORT VISU_PickingSettings : public vtkObject
{
public:
enum { BelowPoint = 0, TopLeftCorner };
// $Header$
#include "VISU_MeshAct.h"
-#include "SVTK_DeviceActor.h"
#include <vtkObjectFactory.h>
#include <vtkRenderer.h>
#define VISU_MeshAct_HeaderFile
#include "VISU_Actor.h"
-#include "SVTK_DeviceActor.h"
-
-namespace SVTK
-{
- namespace Representation
- {
- const Type Surfaceframe = Insideframe + 1;
- }
-}
class VTKOCC_EXPORT VISU_MeshAct : public VISU_Actor
{
#include "VISU_ScalarMapAct.h"
#include "VISU_LookupTable.hxx"
#include "VISU_ScalarBarActor.hxx"
+#include "VISU_PipeLine.hxx"
#include <vtkObjectFactory.h>
#include <vtkRenderer.h>
#include <vtkProperty.h>
+#include <vtkMatrix4x4.h>
+#include <vtkMapper.h>
+#include <vtkDataSetMapper.h>
vtkStandardNewMacro(VISU_ScalarMapAct);
+static vtkFloatingPointType EPS = 1.0 / VTK_LARGE_FLOAT;
VISU_ScalarMapAct
::VISU_ScalarMapAct()
aProperty->SetSpecular(0.0);
myProperty->DeepCopy(aProperty);
+
+ vtkMatrix4x4 *m;
+ m = vtkMatrix4x4::New();
+
+ mySurfaceActor= SVTK_DeviceActor::New();
+ mySurfaceActor->SetRepresentation(SVTK::Representation::Surface);
+ mySurfaceActor->SetProperty(aProperty);
+ mySurfaceActor->SetUserMatrix(m);
+
+ myEdgeActor = SVTK_DeviceActor::New();
+ myEdgeActor->SetRepresentation(SVTK::Representation::Wireframe);
+ myEdgeActor->SetUserMatrix(m);
+ myEdgeActor->GetProperty()->SetColor(255.,255.,255.);
+
+ m->Delete();
}
VISU_ScalarMapAct
::~VISU_ScalarMapAct()
{
myScalarBar->Delete();
+ mySurfaceActor->Delete();
+ myEdgeActor->Delete();
+}
+
+void
+VISU_ScalarMapAct
+::ShallowCopyPL(VISU_PipeLine* thePipeLine)
+{
+ VISU_Actor::ShallowCopyPL(thePipeLine);
+
+ myEdgeActor->GetMapper()->ScalarVisibilityOff();
+
+ vtkDataSet* aDatsSet = mySurfaceActor->GetDataSetMapper()->GetInput();
+ mySurfaceActor->GetMapper()->ShallowCopy(thePipeLine->GetMapper());
+ // To restore mapper input from pipeline
+ mySurfaceActor->GetDataSetMapper()->SetInput(aDatsSet);
+}
+
+//----------------------------------------------------------------------------
+void
+VISU_ScalarMapAct
+::SetMapperInput(vtkDataSet* theDataSet)
+{
+ Superclass::SetMapperInput(theDataSet);
+
+ mySurfaceActor->SetInput(theDataSet);
+ myEdgeActor->SetInput(theDataSet);
+}
+
+//----------------------------------------------------------------------------
+void
+VISU_ScalarMapAct
+::SetTransform(VTKViewer_Transform* theTransform)
+{
+ Superclass::SetTransform(theTransform);
+
+ mySurfaceActor->SetTransform(theTransform);
+ myEdgeActor->SetTransform(theTransform);
+}
+
+//----------------------------------------------------------------------------
+void
+VISU_ScalarMapAct
+::SetShrinkable(bool theIsShrinkable)
+{
+ Superclass::SetShrinkable(theIsShrinkable);
+
+ mySurfaceActor->SetShrinkable(theIsShrinkable);
+}
+
+void
+VISU_ScalarMapAct
+::SetShrinkFactor(vtkFloatingPointType theValue)
+{
+ Superclass::SetShrinkFactor(theValue);
+
+ mySurfaceActor->SetShrinkFactor(theValue);
+}
+
+//----------------------------------------------------------------------------
+void
+VISU_ScalarMapAct
+::SetShrink()
+{
+ if(myRepresentation == VTK_POINTS)
+ return;
+
+ Superclass::SetShrink();
+
+ mySurfaceActor->SetShrink();
+}
+
+void
+VISU_ScalarMapAct
+::UnShrink()
+{
+ Superclass::UnShrink();
+
+ mySurfaceActor->UnShrink();
+}
+
+//----------------------------------------------------------------------------
+void
+VISU_ScalarMapAct
+::SetOpacity(vtkFloatingPointType theValue)
+{
+ mySurfaceActor->GetProperty()->SetOpacity(theValue);
+}
+
+vtkFloatingPointType
+VISU_ScalarMapAct
+::GetOpacity()
+{
+ return mySurfaceActor->GetProperty()->GetOpacity();
+}
+
+//----------------------------------------------------------------------------
+void
+VISU_ScalarMapAct
+::SetLineWidth(vtkFloatingPointType theLineWidth)
+{
+ mySurfaceActor->GetProperty()->SetLineWidth(theLineWidth);
+}
+
+vtkFloatingPointType
+VISU_ScalarMapAct::GetLineWidth()
+{
+ return mySurfaceActor->GetProperty()->GetLineWidth();
}
void
::SetRepresentation(int theMode)
{
bool anIsShanding = IsShading();
+
Superclass::SetRepresentation(theMode);
+ if(theMode == SVTK::Representation::Surfaceframe)
+ mySurfaceActor->SetRepresentation(SVTK::Representation::Surface);
+ else
+ mySurfaceActor->SetRepresentation(theMode);
+
SetShading(anIsShanding);
}
VISU_ScalarMapAct
::SetShading(bool theOn)
{
- vtkProperty* aProperty = GetProperty();
+ vtkProperty* aProperty = mySurfaceActor->GetProperty();
if (theOn)
{
{
aProperty->SetAmbient(1.0);
aProperty->SetDiffuse(0.0);
- }
+ }
}
bool
VISU_ScalarMapAct
::IsShading()
{
- vtkProperty* aProperty = GetProperty();
+ vtkProperty* aProperty = mySurfaceActor->GetProperty();
- return (aProperty->GetAmbient() == 0 && aProperty->GetDiffuse() == 1);
+ return (fabs(aProperty->GetAmbient()) < EPS && fabs(aProperty->GetDiffuse() - 1.) < EPS);
}
+
+int
+VISU_ScalarMapAct
+::RenderOpaqueGeometry(vtkViewport *ren)
+{
+ GetMatrix(myEdgeActor->GetUserMatrix());
+ GetMatrix(mySurfaceActor->GetUserMatrix());
+
+ using namespace SVTK::Representation;
+ if( GetRepresentation() == Surfaceframe ){
+ mySurfaceActor->SetAllocatedRenderTime(this->AllocatedRenderTime/2.0,ren);
+ mySurfaceActor->RenderOpaqueGeometry(ren);
+
+ myEdgeActor->SetAllocatedRenderTime(this->AllocatedRenderTime/2.0,ren);
+ myEdgeActor->RenderOpaqueGeometry(ren);
+ }
+ else{
+ mySurfaceActor->SetAllocatedRenderTime(this->AllocatedRenderTime,ren);
+ mySurfaceActor->RenderOpaqueGeometry(ren);
+ }
+ return 1;
+}
+
+int
+VISU_ScalarMapAct
+::RenderTranslucentGeometry(vtkViewport *ren)
+{
+ GetMatrix(myEdgeActor->GetUserMatrix());
+ GetMatrix(mySurfaceActor->GetUserMatrix());
+
+ using namespace SVTK::Representation;
+ if( GetRepresentation() == Surfaceframe ){
+ mySurfaceActor->SetAllocatedRenderTime(this->AllocatedRenderTime,ren);
+ mySurfaceActor->RenderTranslucentGeometry(ren);
+
+ myEdgeActor->SetAllocatedRenderTime(this->AllocatedRenderTime/2.0,ren);
+ myEdgeActor->RenderTranslucentGeometry(ren);
+ }
+ else{
+ mySurfaceActor->SetAllocatedRenderTime(this->AllocatedRenderTime,ren);
+ mySurfaceActor->RenderTranslucentGeometry(ren);
+ }
+ return 1;
+}
+
~VISU_ScalarMapAct();
+ virtual
+ void
+ ShallowCopyPL(VISU_PipeLine* thePipeLine);
+
+ //! Apply view transformation
+ virtual
+ void
+ SetTransform(VTKViewer_Transform* theTransform);
+
+ virtual
+ void
+ SetShrinkable(bool theIsShrinkable);
+
+ virtual
+ void
+ SetShrinkFactor(vtkFloatingPointType theFactor = 0.8);
+
+ virtual
+ void
+ SetShrink();
+
+ virtual
+ void
+ UnShrink();
+
+ virtual
+ void
+ SetOpacity(vtkFloatingPointType theValue);
+
+ virtual
+ vtkFloatingPointType
+ GetOpacity();
+
+ virtual
+ void
+ SetLineWidth(vtkFloatingPointType theLineWidth);
+
+ virtual
+ vtkFloatingPointType
+ GetLineWidth();
+
virtual
void
AddToRender(vtkRenderer* theRenderer);
+ virtual
+ int
+ RenderOpaqueGeometry(vtkViewport *ren);
+
+ virtual
+ int
+ RenderTranslucentGeometry(vtkViewport *ren);
+
virtual
void
RemoveFromRender(vtkRenderer* theRenderer);
protected:
VISU_ScalarMapAct();
+
+ virtual
+ void
+ SetMapperInput(vtkDataSet* theDataSet);
+
bool myBarVisibility;
VISU_ScalarBarActor* myScalarBar;
+ SVTK_DeviceActor* mySurfaceActor;
+ SVTK_DeviceActor* myEdgeActor;
};
#endif
VISU_PlanesWidget.hxx \
VISU_SphereWidget.hxx \
VISU_WidgetCtrl.hxx \
- VISU_ScalarMapOnDeformedShapePL.hxx
+ VISU_ScalarMapOnDeformedShapePL.hxx \
+ VISU_PrsMergerPL.hxx \
+ VISUPipeline.hxx
# Libraries targets
VISU_SphereWidget.cxx \
VISU_WidgetCtrl.cxx \
VISU_ScalarBarCtrl.cxx \
- VISU_ScalarMapOnDeformedShapePL.cxx
+ VISU_ScalarMapOnDeformedShapePL.cxx \
+ VISU_PrsMergerPL.cxx
# Executables targets
static int isOnlyMesh = false;
-int main(int argc, char** argv){
- try{
- if(argc > 1){
+int main(int argc, char** argv)
+{
+ try {
+ if(argc > 1)
+ {
vtkRenderWindow *renWin = vtkRenderWindow::New();
vtkRenderer *ren = vtkRenderer::New();
renWin->AddRenderer(ren);
const VISU::PMesh aMesh = aMeshMapIter->second;
const VISU::TMeshOnEntityMap& aMeshOnEntityMap = aMesh->myMeshOnEntityMap;
VISU::TMeshOnEntityMap::const_iterator aMeshOnEntityMapIter;
- if(isOnlyMesh){
- const VISU::TEntity& anEntity = VISU::CELL_ENTITY;
- aMeshOnEntityMapIter = aMeshOnEntityMap.find(anEntity);
+ if(isOnlyMesh)
+ {
+ const VISU::TEntity& anEntity = VISU::CELL_ENTITY;
+ aMeshOnEntityMapIter = aMeshOnEntityMap.find(anEntity);
- VISU::PIDMapper anIDMapper =
- aConvertor->GetMeshOnEntity(aMeshName,anEntity);
- VISU::TVTKOutput* aDataSet = anIDMapper->GetVTKOutput();
+ VISU::PIDMapper anIDMapper =
+ aConvertor->GetMeshOnEntity(aMeshName,anEntity);
+ VISU::TVTKOutput* aDataSet = anIDMapper->GetVTKOutput();
- VISU_MeshPL* aPresent = VISU_MeshPL::New();
- aPresent->SetInput(aDataSet);
- aPresent->Build();
+ VISU_MeshPL* aPresent = VISU_MeshPL::New();
+ aPresent->SetInput(aDataSet);
+ aPresent->Build();
- vtkActor* aActor = vtkActor::New();
- aActor->SetMapper(aPresent->GetMapper());
- aActor->GetProperty()->SetRepresentation(VTK_WIREFRAME);
- //ren->ResetCameraClippingRange();
+ vtkActor* aActor = vtkActor::New();
+ aActor->SetMapper(aPresent->GetMapper());
+ aActor->GetProperty()->SetRepresentation(VTK_WIREFRAME);
+ //ren->ResetCameraClippingRange();
- ren->AddActor(aActor);
+ ren->AddActor(aActor);
- renWin->Render();
- iren->Start();
- return 0;
+ renWin->Render();
+ iren->Start();
+ return 0;
}
//Import fields
aMeshOnEntityMapIter = aMeshOnEntityMap.begin();
}
}
}
- }catch(std::exception& exc){
+ }
+ catch(std::exception& exc){
MESSAGE("Follow exception was occured :\n"<<exc.what());
- }catch(...){
+ }
+ catch(...){
MESSAGE("Unknown exception was occured in VISU_Convertor_impl");
}
return 1;
--- /dev/null
+// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
+//
+//
+//
+// File : VISUPipeline.hxx
+// Author : Oleg UVAROV
+// Module : VISU
+
+#ifndef _VISUPipeline_HXX_
+#define _VISUPipeline_HXX_
+
+#ifdef WNT
+ #if defined VISU_PIPELINE_EXPORTS
+ #if defined WIN32
+ #define VISU_PIPELINE_EXPORT __declspec( dllexport )
+ #else
+ #define VISU_PIPELINE_EXPORT
+ #endif
+ #else
+ #if defined WIN32
+ #define VISU_PIPELINE_EXPORT __declspec( dllimport )
+ #else
+ #define VISU_PIPELINE_EXPORT
+ #endif
+ #endif
+#else
+ #define VISU_PIPELINE_EXPORT
+#endif
+
+#endif
\ No newline at end of file
VISU_CutLinesPL
::IsDefault()
{
-
return myCondition;
}
CorrectPnt(myBasePnt,aBaseBounds);
- VISU_ScalarMapPL::Update();
+ VISU_PrsMergerPL::Update();
}
#ifndef VISU_CutLinesPL_HeaderFile
#define VISU_CutLinesPL_HeaderFile
+#include "VISUPipeline.hxx"
#include "VISU_CutPlanesPL.hxx"
class vtkAppendPolyData;
-class VISU_CutLinesPL : public VISU_CutPlanesPL{
+class VISU_PIPELINE_EXPORT VISU_CutLinesPL : public VISU_CutPlanesPL{
protected:
VISU_CutLinesPL();
VISU_CutLinesPL(const VISU_CutLinesPL&);
for (int i = 0, iend = GetNbParts(); i < iend; i++)
if(!aPipeLine->IsPartDefault(i)) SetPartPosition(i, aPipeLine->GetPartPosition(i));
}
- VISU_ScalarMapPL::ShallowCopy(thePipeLine);
+ Superclass::ShallowCopy(thePipeLine);
}
void
VISU_CutPlanesPL
::Init()
{
- VISU_ScalarMapPL::Init();
+ Superclass::Init();
SetNbParts(10);
myBasePlane[0] = YZ;
CutWithPlanes(myAppendPolyData,aDataSet,myNbParts,aDir,aBounds,
myPartPosition,myPartCondition,myDisplacement[0]);
- VISU_ScalarMapPL::Update();
+ Superclass::Update();
}
void
#ifndef VISU_CutPlanesPL_HeaderFile
#define VISU_CutPlanesPL_HeaderFile
-#include "VISU_ScalarMapPL.hxx"
+#include "VISUPipeline.hxx"
+#include "VISU_PrsMergerPL.hxx"
#include <vector>
class vtkAppendPolyData;
-class VISU_CutPlanesPL : public VISU_ScalarMapPL{
+class VISU_PIPELINE_EXPORT VISU_CutPlanesPL : public VISU_PrsMergerPL{
protected:
VISU_CutPlanesPL();
VISU_CutPlanesPL(const VISU_CutPlanesPL&);
public:
- vtkTypeMacro(VISU_CutPlanesPL,VISU_ScalarMapPL);
+ vtkTypeMacro(VISU_CutPlanesPL,VISU_PrsMergerPL);
static VISU_CutPlanesPL* New();
virtual
if(VISU_DeformedShapePL *aPipeLine = dynamic_cast<VISU_DeformedShapePL*>(thePipeLine)){
SetScale(aPipeLine->GetScale());
}
- VISU_ScalarMapPL::ShallowCopy(thePipeLine);
+ TSupperClass::ShallowCopy(thePipeLine);
}
vtkFloatingPointType
VISU_DeformedShapePL
::Init()
{
- VISU_ScalarMapPL::Init();
+ TSupperClass::Init();
vtkFloatingPointType aScalarRange[2];
GetSourceRange(aScalarRange);
vtkDataSet* aDataSet = GetInput2();
+ //vtkDataSet* aDataSet = GetScalars()->GetInput();
vtkFloatingPointType aScaleFactor = VISU_DeformedShapePL::GetScaleFactor( aDataSet );
static double EPS = 1.0 / VTK_LARGE_FLOAT;
VISU_DeformedShapePL
::Update()
{
- VISU_ScalarMapPL::Update();
+ TSupperClass::Update();
}
void
VISU_DeformedShapePL
::SetMapScale(vtkFloatingPointType theMapScale)
{
- VISU_ScalarMapPL::SetMapScale(theMapScale);
+ TSupperClass::SetMapScale(theMapScale);
myWarpVector->SetScaleFactor(myScaleFactor*theMapScale);
Modified();
#ifndef VISU_DeformedShapePL_HeaderFile
#define VISU_DeformedShapePL_HeaderFile
-#include "VISU_ScalarMapPL.hxx"
+#include "VISUPipeline.hxx"
+#include "VISU_PrsMergerPL.hxx"
class vtkCellDataToPointData;
class SALOME_Transform;
class vtkWarpVector;
-class VISU_DeformedShapePL : public VISU_ScalarMapPL
+class VISU_PIPELINE_EXPORT VISU_DeformedShapePL : public VISU_PrsMergerPL
{
+ typedef VISU_PrsMergerPL TSupperClass;
+
protected:
VISU_DeformedShapePL();
VISU_DeformedShapePL(const VISU_DeformedShapePL&);
~VISU_DeformedShapePL();
public:
- vtkTypeMacro(VISU_DeformedShapePL,VISU_ScalarMapPL);
+ vtkTypeMacro(VISU_DeformedShapePL,TSupperClass);
static
VISU_DeformedShapePL*
output->GetPointData()->CopyVectorsOn();
int aNbElems = input->GetNumberOfPoints();
vtkPointData *inData = input->GetPointData(), *outData = output->GetPointData();
- if(inData->GetAttribute(vtkDataSetAttributes::VECTORS))
+ if(!inData->GetAttribute(vtkDataSetAttributes::SCALARS))
execute(aNbElems,myScalarMode,inData,outData);
else
output->GetPointData()->CopyScalarsOn();
#ifndef VISU_GaussPointsPL_HeaderFile
#define VISU_GaussPointsPL_HeaderFile
+#include "VISUPipeline.hxx"
#include "VISU_ScalarMapPL.hxx"
#include "VISU_Convertor.hxx"
* This class uses the special mapper (VISU_OpenGLPointSpriteMapper)
* for rendering the Gauss Points as Point Sprites.
*/
-class VISU_GaussPointsPL : public VISU_ScalarMapPL
+class VISU_PIPELINE_EXPORT VISU_GaussPointsPL : public VISU_ScalarMapPL
{
protected:
VISU_GaussPointsPL();
#include <vtkFollower.h>
+#include "VISUPipeline.hxx"
+
#include "VTKViewer.h"
class VISU_UnScaledActor: public vtkFollower
class vtkImplicitFunction;
-class VISU_ImplicitFunctionWidget : public vtk3DWidget
+class VISU_PIPELINE_EXPORT VISU_ImplicitFunctionWidget : public vtk3DWidget
{
public:
vtkTypeRevisionMacro(VISU_ImplicitFunctionWidget,vtk3DWidget);
vtkFloatingPointType aRange[2] = {aPipeLine->GetMin(), aPipeLine->GetMax()};
SetRange(aRange);
}
- VISU_ScalarMapPL::ShallowCopy(thePipeLine);
+ TSupperClass::ShallowCopy(thePipeLine);
}
int
VISU_IsoSurfacesPL
::SetScaling(int theScaling)
{
- VISU_ScalarMapPL::SetScaling(theScaling);
+ TSupperClass::SetScaling(theScaling);
SetRange(myRange);
}
void
VISU_IsoSurfacesPL
::Init()
{
- VISU_ScalarMapPL::Init();
+ TSupperClass::Init();
SetNbParts(10);
vtkFloatingPointType aScalarRange[2];
VISU_IsoSurfacesPL
::Update()
{
- VISU_ScalarMapPL::Update();
+ TSupperClass::Update();
}
void
VISU_IsoSurfacesPL
::SetMapScale(vtkFloatingPointType theMapScale)
{
- VISU_ScalarMapPL::SetMapScale(theMapScale);
+ TSupperClass::SetMapScale(theMapScale);
vtkFloatingPointType aRange[2] = {GetMax() - theMapScale*(GetMax()-GetMin()), GetMax()};
vtkFloatingPointType aNewRange[2] = {aRange[0], aRange[1]};
#ifndef VISU_IsoSurfacesPL_HeaderFile
#define VISU_IsoSurfacesPL_HeaderFile
-#include "VISU_ScalarMapPL.hxx"
+#include "VISUPipeline.hxx"
+#include "VISU_PrsMergerPL.hxx"
class vtkContourFilter;
class vtkCellDataToPointData;
-class VISU_IsoSurfacesPL : public VISU_ScalarMapPL
+class VISU_PIPELINE_EXPORT VISU_IsoSurfacesPL : public VISU_PrsMergerPL
{
+ typedef VISU_ScalarMapPL TSupperClass;
+
protected:
VISU_IsoSurfacesPL();
VISU_IsoSurfacesPL(const VISU_IsoSurfacesPL&);
~VISU_IsoSurfacesPL();
public:
- vtkTypeMacro(VISU_IsoSurfacesPL,VISU_ScalarMapPL);
+ vtkTypeMacro(VISU_IsoSurfacesPL,TSupperClass);
static
VISU_IsoSurfacesPL*
#ifndef VISU_MeshPL_HeaderFile
#define VISU_MeshPL_HeaderFile
+#include "VISUPipeline.hxx"
#include "VISU_PipeLine.hxx"
-class VISU_MeshPL : public VISU_PipeLine{
+class VISU_PIPELINE_EXPORT VISU_MeshPL : public VISU_PipeLine{
protected:
VISU_MeshPL();
VISU_MeshPL(const VISU_MeshPL&);
#include "VISU_OpenGLPointSpriteMapper.hxx"
+#include <SVTK_Extension.h>
+
#include <vtkCamera.h>
#include <vtkCellArray.h>
#include <vtkCellData.h>
#include <vtkTimerLog.h>
#include <vtkTriangle.h>
-#include <dlfcn.h>
-
#include <stdio.h>
#include <cmath>
#include <string>
-#ifndef GLX_GLXEXT_LEGACY
-#define GLX_GLXEXT_LEGACY
+#ifndef WNT
+# ifndef GLX_GLXEXT_LEGACY
+# define GLX_GLXEXT_LEGACY
+# endif
+# include <GL/glx.h>
+# include <dlfcn.h>
+#else
+# include <wingdi.h>
#endif
-#include <GL/glx.h>
#ifndef VTK_IMPLEMENT_MESA_CXX
vtkCxxRevisionMacro(VISU_OpenGLPointSpriteMapper, "Revision$");
static PFNGLBUFFERDATAARBPROC vglBufferDataARB = NULL;
static PFNGLDELETEBUFFERSARBPROC vglDeleteBuffersARB = NULL;
+#ifndef WNT
+#define GL_GetProcAddress( x ) glXGetProcAddressARB( (const GLubyte*)x )
+#else
+#define GL_GetProcAddress( x ) wglGetProcAddress( (const LPCSTR)x )
+#endif
+
bool InitializeARB()
{
- vglShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glXGetProcAddressARB( (const GLubyte*)"glShaderSourceARB" );
+ vglShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)GL_GetProcAddress( "glShaderSourceARB" );
if( !vglShaderSourceARB )
return false;
- vglCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glXGetProcAddressARB( (const GLubyte*)"glCreateShaderObjectARB" );
+ vglCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)GL_GetProcAddress( "glCreateShaderObjectARB" );
if( !vglCreateShaderObjectARB )
return false;
- vglCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glXGetProcAddressARB( (const GLubyte*)"glCompileShaderARB" );
+ vglCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)GL_GetProcAddress( "glCompileShaderARB" );
if( !vglCompileShaderARB )
return false;
- vglCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glXGetProcAddressARB( (const GLubyte*)"glCreateProgramObjectARB" );
+ vglCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)GL_GetProcAddress( "glCreateProgramObjectARB" );
if( !vglCreateProgramObjectARB )
return false;
- vglAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glXGetProcAddressARB( (const GLubyte*)"glAttachObjectARB" );
+ vglAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)GL_GetProcAddress( "glAttachObjectARB" );
if( !vglAttachObjectARB )
return false;
- vglLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glXGetProcAddressARB( (const GLubyte*)"glLinkProgramARB" );
+ vglLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)GL_GetProcAddress( "glLinkProgramARB" );
if( !vglLinkProgramARB )
return false;
- vglUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glXGetProcAddressARB( (const GLubyte*)"glUseProgramObjectARB" );
+ vglUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)GL_GetProcAddress( "glUseProgramObjectARB" );
if( !vglUseProgramObjectARB )
return false;
- vglGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)glXGetProcAddressARB( (const GLubyte*)"glGetObjectParameterivARB" );
+ vglGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)GL_GetProcAddress( "glGetObjectParameterivARB" );
if( !vglGetObjectParameterivARB )
return false;
- vglGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)glXGetProcAddressARB( (const GLubyte*)"glGetInfoLogARB" );
+ vglGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)GL_GetProcAddress( "glGetInfoLogARB" );
if( !vglGetInfoLogARB )
return false;
- vglGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)glXGetProcAddressARB( (const GLubyte*)"glGetAttribLocationARB" );
+ vglGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)GL_GetProcAddress( "glGetAttribLocationARB" );
if( !vglGetAttribLocationARB )
return false;
- vglVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glXGetProcAddressARB( (const GLubyte*)"glVertexAttrib1fARB" );
+ vglVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)GL_GetProcAddress( "glVertexAttrib1fARB" );
if( !vglVertexAttrib1fARB )
return false;
- vglGenBuffersARB = (PFNGLGENBUFFERSARBPROC)glXGetProcAddressARB( (const GLubyte*)"glGenBuffersARB" );
+ vglGenBuffersARB = (PFNGLGENBUFFERSARBPROC)GL_GetProcAddress( "glGenBuffersARB" );
if( !vglGenBuffersARB )
return false;
- vglBindBufferARB = (PFNGLBINDBUFFERARBPROC)glXGetProcAddressARB( (const GLubyte*)"glBindBufferARB" );
+ vglBindBufferARB = (PFNGLBINDBUFFERARBPROC)GL_GetProcAddress( "glBindBufferARB" );
if( !vglBindBufferARB )
return false;
- vglBufferDataARB = (PFNGLBUFFERDATAARBPROC)glXGetProcAddressARB( (const GLubyte*)"glBufferDataARB" );
+ vglBufferDataARB = (PFNGLBUFFERDATAARBPROC)GL_GetProcAddress( "glBufferDataARB" );
if( !vglBufferDataARB )
return false;
- vglDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)glXGetProcAddressARB( (const GLubyte*)"glDeleteBuffersARB" );
+ vglDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)GL_GetProcAddress( "glDeleteBuffersARB" );
if( !vglDeleteBuffersARB )
return false;
//-----------------------------------------------------------------------------
bool VISU_OpenGLPointSpriteMapper::InitExtensions()
{
+ if( this->ExtensionsInitialized )
+ return true;
+
+ InitializeARB();
+
char* ext = (char*)glGetString( GL_EXTENSIONS );
//cout << "OpenGL extensions : " << ext << endl;
strstr( ext, "GL_ARB_vertex_buffer_object" ) == NULL )
{
vtkWarningMacro(<<"Initializing ARB extensions failed");
-
this->UseOpenGLMapper = true;
return false;
theRenderer->ViewToDisplay();
theRenderer->GetDisplayPoint( p2 );
- vtkFloatingPointType coefficient = sqrt( pow( p2[0] - p1[0], 2 ) + pow( p2[1] - p1[1], 2 ) ) / sqrt( 2 );
+ vtkFloatingPointType coefficient = sqrt( pow( p2[0] - p1[0], 2 ) + pow( p2[1] - p1[1], 2 ) ) / sqrt( 2. );
//cout << p1[0] << " " << p1[1] << " " << p1[2] << endl;
//cout << p2[0] << " " << p2[1] << " " << p2[2] << endl;
//cout << "ZOOM : " << coefficient << endl;
bool isUseThisMapper = !( this->UseOpenGLMapper ||
this->PrimitiveType == VISU_OpenGLPointSpriteMapper::GeomSphere );
- if( !this->ExtensionsInitialized && isUseThisMapper )
- {
+ if( isUseThisMapper )
if( !this->InitExtensions() )
return;
- }
if( !isUseThisMapper )
{
aVertex.vy = aCoords[1];
aVertex.vz = aCoords[2];
- int aRed, aGreen, aBlue;
+ int aRed = 0, aGreen = 0, aBlue = 0;
if( theColors && this->PointSpriteMode != 1 )
{
unsigned char *col = theColors->GetPointer(pts[0] << 2);
# pragma warning ( disable : 4275 )
#endif
+#ifdef WIN32
+#include <windows.h>
+#endif
+
#include <GL/gl.h>
#include <vtkSmartPointer.h>
typedef GLuint GLhandleARB;
#endif
+#include "VISUPipeline.hxx"
+
//----------------------------------------------------------------------------
//! OpenGL Point Sprites PolyData Mapper.
/*!
* usage of the pipeline is larger than this limit, the mapper will divide
* the data into pieces and render each in a for loop.
*/
-class VISU_OpenGLPointSpriteMapper : public MAPPER_SUPERCLASS
+class VISU_PIPELINE_EXPORT VISU_OpenGLPointSpriteMapper : public MAPPER_SUPERCLASS
{
public:
//! The Point Sprites rendering mode.
{
if(MYDEBUG) MESSAGE("VISU_PipeLine::VISU_PipeLine - "<<this);
SetDebug(MYVTKDEBUG);
+ vtkObject::SetGlobalWarningDisplay(MYVTKDEBUG);
myMapper->Delete();
#include <vtkObject.h>
#include <vtkSmartPointer.h>
+#include "VISUPipeline.hxx"
#include "VISU_IDMapper.hxx"
class vtkCell;
typedef VISU::TVTKOutput TInput;
-class VISU_PipeLine : public vtkObject{
+class VISU_PIPELINE_EXPORT VISU_PipeLine : public vtkObject{
public:
vtkTypeMacro(VISU_PipeLine,vtkObject);
virtual
protected:
VISU_PipeLine();
- VISU_PipeLine(const VISU_PipeLine&);
virtual
TInput*
#ifndef VISU_PipeLineUtils_HeaderFile
#define VISU_PipeLineUtils_HeaderFile
+#include "VISUPipeline.hxx"
#include "VISU_FieldTransform.hxx"
#include "VISU_LookupTable.hxx"
#include "VISU_Extractor.hxx"
#ifndef __VISU_PlanesWidget_h
#define __VISU_PlanesWidget_h
+#include "VISUPipeline.hxx"
#include "VISU_ImplicitFunctionWidget.hxx"
class vtkActor;
class vtkPolyDataMapper;
class VISU_UnScaledActor;
class vtkDataSet;
-class VISU_PlanesWidget : public VISU_ImplicitFunctionWidget
+class VISU_PIPELINE_EXPORT VISU_PlanesWidget : public VISU_ImplicitFunctionWidget
{
public:
// Description:
SetContourPrs( aPipeLine->GetIsContourPrs() );
SetNumberOfContours( aPipeLine->GetNumberOfContours() );
}
- VISU_ScalarMapPL::ShallowCopy(thePipeLine);
+ TSupperClass::ShallowCopy(thePipeLine);
}
VISU_CutPlanesPL::PlaneOrientation
VISU_Plot3DPL::
Init()
{
- VISU_ScalarMapPL::Init();
+ TSupperClass::Init();
myOrientation = GetOrientation(GetInput2());
SetScaleFactor(GetScaleFactor(GetInput2()));
myWarpScalar->SetNormal(aPlaneNormal);
- VISU_ScalarMapPL::Update();
+ TSupperClass::Update();
}
void
void VISU_Plot3DPL::SetMapScale(vtkFloatingPointType theMapScale)
{
- VISU_ScalarMapPL::SetMapScale(theMapScale);
+ TSupperClass::SetMapScale(theMapScale);
if ( myIsContour ) {
vtkFloatingPointType aRange[2];
#ifndef VISU_Plot3DPL_HeaderFile
#define VISU_Plot3DPL_HeaderFile
-#include "VISU_ScalarMapPL.hxx"
+#include "VISUPipeline.hxx"
+#include "VISU_PrsMergerPL.hxx"
#include "VISU_CutPlanesPL.hxx"
class vtkWarpScalar;
class vtkGeometryFilter;
class vtkCellDataToPointData;
-class VISU_Plot3DPL : public VISU_ScalarMapPL{
+class VISU_PIPELINE_EXPORT VISU_Plot3DPL : public VISU_PrsMergerPL{
+ typedef VISU_ScalarMapPL TSupperClass;
protected:
VISU_Plot3DPL();
VISU_Plot3DPL(const VISU_Plot3DPL&);
public:
- vtkTypeMacro(VISU_Plot3DPL,VISU_ScalarMapPL);
+ vtkTypeMacro(VISU_Plot3DPL,TSupperClass);
static VISU_Plot3DPL* New();
virtual ~VISU_Plot3DPL();
--- /dev/null
+// VISU OBJECT : interactive object for VISU entities implementation
+//
+// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//
+// File: VISU_PrsMergerPL.cxx
+// Author: Eugeny Nikolaev
+// Module : VISU
+
+#include "VISU_PrsMergerPL.hxx"
+#include "VISU_MeshPL.hxx"
+#include "VISU_ScalarMapPL.hxx"
+#include "VISU_MergeFilter.hxx"
+#include "VISU_IDMapper.hxx"
+#include "VTKViewer_AppendFilter.h"
+
+#include "VISU_PipeLineUtils.hxx"
+
+#include <vtkMapper.h>
+#include <vtkDataSet.h>
+#include <vtkObjectFactory.h>
+#include <vtkMergeFilter.h>
+#include <vtkDataSetMapper.h>
+#include <vtkUnstructuredGrid.h>
+#include <vtkObject.h>
+#include <vtkFloatArray.h>
+#include <vtkPointData.h>
+#include <vtkCellData.h>
+#include <vtkCellType.h>
+#include <vtkCell.h>
+
+#include <vector>
+#include <set>
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
+
+using namespace std;
+
+vtkStandardNewMacro(VISU_PrsMergerPL);
+
+VISU_PrsMergerPL
+::VISU_PrsMergerPL()
+{
+ myScalars = NULL;
+
+ //myMergeFilter->Delete();
+ myMeshGeometryList.clear();
+}
+
+VISU_PrsMergerPL
+::~VISU_PrsMergerPL()
+{
+ myMeshGeometryList.clear();
+}
+
+void
+VISU_PrsMergerPL
+::RemoveAllGeom()
+{
+ myMeshGeometryList.clear();
+ this->Execute();
+}
+
+void
+VISU_PrsMergerPL
+::ShallowCopy(VISU_PipeLine *thePipeLine)
+{
+ if (MYDEBUG) MESSAGE("ShallowCopy");
+ VISU_PrsMergerPL* aPipeLine = dynamic_cast<VISU_PrsMergerPL*>(thePipeLine);
+ if(this == aPipeLine){
+ TSupperClass::ShallowCopy(thePipeLine);
+ return;
+ }
+ if(aPipeLine){
+ int aNbGeoms = aPipeLine->GetNbGeometry();
+ if (MYDEBUG) MESSAGE("aNbGeoms="<<aNbGeoms);
+ myMeshGeometryList.clear();
+ for(int i=0; i<aNbGeoms; i++){
+ AddBackGeometry(aPipeLine->GetGeometry(i),false);
+ }
+ SetScalars(aPipeLine->GetScalars(),true);
+ }
+ TSupperClass::ShallowCopy(thePipeLine);
+}
+
+bool
+VISU_PrsMergerPL
+::SetGeometry(VISU_PipeLine* theGeometry,bool theUpdate)
+{
+ myMeshGeometryList.clear();
+ if(this->checkGeometry(theGeometry)){
+ myMeshGeometryList.push_back(theGeometry);
+ if (MYDEBUG) MESSAGE("this->GetGeometry(0)->GetIDMapper()="<<this->GetGeometry(0)->GetIDMapper());
+
+ if(theUpdate)
+ this->Execute();
+
+ return true;
+ } else
+ return false;
+
+}
+
+int
+VISU_PrsMergerPL
+::AddBackGeometry(VISU_PipeLine* theGeometry,bool theUpdate)
+{
+ if(theGeometry == NULL) return -1;
+ int aGeomNum = this->GetGeometryNumber(theGeometry);
+ if(aGeomNum == -1){
+ bool aCheckGeom = this->checkGeometry(theGeometry);
+ if(aCheckGeom){
+ myMeshGeometryList.push_back(theGeometry);
+
+ if(theUpdate)
+ this->Execute();
+
+ return (myMeshGeometryList.size()-1);
+ } else {
+ return -1;
+ }
+ } else {
+ return aGeomNum;
+ }
+}
+
+int
+VISU_PrsMergerPL
+::GetGeometryNumber(VISU_PipeLine* theGeometry)
+{
+ TPipeLine aPipeLine = theGeometry;
+ TPipeLines::const_iterator aIter = myMeshGeometryList.begin();
+ for(int i=0;aIter != myMeshGeometryList.end();aIter++,i++){
+ if( theGeometry == (*aIter).GetPointer() )
+ return i;
+ }
+
+ return -1;
+}
+
+void
+VISU_PrsMergerPL
+::RemoveGeometryById(int theId)
+{
+ if(theId >=0 && theId < myMeshGeometryList.size()){
+ TPipeLines::iterator aIter = myMeshGeometryList.begin();
+ for(;aIter != myMeshGeometryList.end();aIter++){
+ if( myMeshGeometryList[theId] == (*aIter)){
+ myMeshGeometryList.erase(aIter);
+ this->Execute();
+ break;
+ }
+ }
+ }
+}
+
+VISU_PipeLine*
+VISU_PrsMergerPL
+::GetGeometry(int theId)
+{
+ if(theId >=0 && theId < myMeshGeometryList.size()){
+ return myMeshGeometryList[theId].GetPointer();
+ }
+ else
+ return NULL;
+}
+
+VISU_PipeLine*
+VISU_PrsMergerPL
+::GetScalars()
+{
+ return myScalars.GetPointer();
+}
+
+int
+VISU_PrsMergerPL
+::GetNbGeometry()
+{
+ return myMeshGeometryList.size();
+}
+
+bool
+VISU_PrsMergerPL
+::SetScalars(VISU_PipeLine* theInput,bool theUpdate)
+{
+ if(MYDEBUG) MESSAGE("VISU_PrsMergerPL::SetScalars()");
+ if ( this->checkScalars( theInput ) ){
+ myScalars = theInput;
+ VISU_ScalarMapPL* aScalarMap = dynamic_cast<VISU_ScalarMapPL*>(this->GetScalars());
+ myScalarRanges = aScalarMap->GetScalarRange();
+ if(theUpdate)
+ this->Execute();
+ return true;
+ } else
+ return false;
+}
+
+void
+VISU_PrsMergerPL
+::Init()
+{
+ Superclass::Init();
+ if(MYDEBUG) MESSAGE("VISU_PrsMergerPL::Init() this="<<this);
+ this->Execute();
+}
+
+void
+VISU_PrsMergerPL
+::Update()
+{
+ if(MYDEBUG) MESSAGE("VISU_PrsMergerPL::Update()");
+ Superclass::Update();
+ Execute();
+}
+
+void
+VISU_PrsMergerPL
+::Build()
+{
+ if(MYDEBUG) MESSAGE("VISU_PrsMergerPL::Build()");
+ TSupperClass::Build(); // call DoHook method
+}
+
+void
+VISU_PrsMergerPL
+::SetInitialRange()
+{
+ myMapper->UseLookupTableScalarRangeOff();
+}
+
+bool
+VISU_PrsMergerPL
+::checkGeometry(const VISU_PipeLine* thePipeLine)
+{
+ const VISU::PIDMapper& aMapper = thePipeLine->GetIDMapper();
+ int aNbPoints = aMapper->GetVTKOutput()->GetNumberOfPoints();
+ if (this->GetNbGeometry() > 0){
+ const VISU::PIDMapper& aMapper2 = this->GetGeometry(0)->GetIDMapper();
+ int aNbPoints2 = aMapper2->GetVTKOutput()->GetNumberOfPoints();
+ if(aNbPoints2 != aNbPoints)
+ return false;
+ } else if (this->GetScalars()) {
+ const VISU::PIDMapper& aMapper2 = this->GetScalars()->GetIDMapper();
+ int aNbPoints2 = aMapper2->GetVTKOutput()->GetNumberOfPoints();
+ if(aNbPoints2 != aNbPoints)
+ return false;
+ }
+ return true;
+}
+
+bool
+VISU_PrsMergerPL
+::checkScalars(const VISU_PipeLine* thePipeLine)
+{
+ const VISU::PIDMapper& aMapper = thePipeLine->GetIDMapper();
+ int aNbPoints = aMapper->GetVTKOutput()->GetNumberOfPoints();
+ if (this->GetNbGeometry() > 0){
+ const VISU::PIDMapper& aMapper2 = this->GetGeometry(0)->GetIDMapper();
+ int aNbPoints2 = aMapper2->GetVTKOutput()->GetNumberOfPoints();
+ if(aNbPoints2 != aNbPoints)
+ return false;
+ }
+ return true;
+}
+
+void
+VISU_PrsMergerPL
+::Execute(){
+ /* Where are next situations:
+ * 1. Timestamp on entity=NODE
+ * 1.1 Group Cell - OK
+ * 1.2 Group Cell + Point - ERR (remove points groups)
+ * 1.3 Group Node - ERR (remove points groups)
+ * 2. Timesatamp on entity=CELL
+ * 2.1 Group Cell - OK
+ * 2.2 Group Point - ERR (remove points groups)
+ */
+
+
+
+ if(MYDEBUG) MESSAGE("VISU_PrsMergerPL::Execute()");
+
+ if(myMeshGeometryList.size() != 0)
+ {
+
+ typedef std::vector<int> TVec;
+
+ vtkUnstructuredGrid* output = vtkUnstructuredGrid::New();
+ TVec aObjIds; // vector with object ids
+ vtkFloatArray* newArray = vtkFloatArray::New();
+
+ VISU_ScalarMapPL* aScalarMap = dynamic_cast<VISU_ScalarMapPL*>(this->GetScalars());
+ const VISU::PIDMapper& aScalarMapper = myScalars->GetIDMapper();
+
+ // copy points to output from input scalar map
+ output->SetPoints(aScalarMapper->GetVTKOutput()->GetPoints());
+
+ int newCellId;
+ int anbGeoms = this->GetNbGeometry();
+ for(int i=0; i < anbGeoms; i++) {
+ VISU_PipeLine* aCurrGeometry = this->GetGeometry(i);
+ const VISU::PIDMapper& aGM = aCurrGeometry->GetIDMapper();
+ int aNbCells = aGM->GetVTKOutput()->GetNumberOfCells();
+ if (aNbCells >0 )
+ if (aGM->GetVTKOutput()->GetCell(0)->GetCellType() == VTK_VERTEX )
+ continue;
+
+ vtkIdList* ptIds = vtkIdList::New();
+ ptIds->Allocate(VTK_CELL_SIZE);
+
+ for(int j=0; j < aNbCells; j++){
+
+ int anObjID = aGM->GetElemObjID(j);
+ aObjIds.push_back(anObjID);
+
+ // copy cells to output from input geoms
+ aGM->GetVTKOutput()->GetCellPoints(j, ptIds);
+ newCellId = output->InsertNextCell(aGM->GetVTKOutput()->GetCellType(j),ptIds);
+ }
+ ptIds->Delete();
+ }
+
+
+ //copy array values
+ vtkDataArray* da;
+ if((da = aScalarMapper->GetVTKOutput()->GetPointData()->GetArray("VISU_FIELD"))){
+ output->GetPointData()->AddArray(da);
+ vtkDataArray* vc = aScalarMapper->GetVTKOutput()->GetPointData()->GetVectors();
+ if(vc)
+ output->GetPointData()->SetVectors(vc);
+ }
+ if((da = aScalarMapper->GetVTKOutput()->GetCellData()->GetArray("VISU_FIELD"))){
+ if(MYDEBUG){
+ MESSAGE("aScalarMapper NumberOfComponents="<<da->GetNumberOfComponents());
+ MESSAGE("aScalarMapper NumberOfTuples ="<<da->GetNumberOfTuples());
+ }
+
+ newArray->SetNumberOfComponents(da->GetNumberOfComponents());
+ newArray->SetNumberOfTuples(aObjIds.size());
+ newArray->SetName("VISU_FIELD");
+
+ TVec::const_iterator aIdsIter = aObjIds.begin();
+ for(int i=0; aIdsIter != aObjIds.end(); aIdsIter++){
+ int anObjID = *aIdsIter;
+ int aVTKID = aScalarMapper->GetElemVTKID(anObjID);
+ newArray->SetTuple(i,da->GetTuple(aVTKID));
+ i++;
+ }
+ output->GetCellData()->AddArray(newArray);
+
+ // need in vectors array and scalars array
+ if(vtkDataArray* vc = aScalarMapper->GetVTKOutput()->GetCellData()->GetVectors()){
+ output->GetCellData()->SetVectors(newArray);
+ }
+ else if(vtkDataArray* sc = aScalarMapper->GetVTKOutput()->GetCellData()->GetScalars())
+ output->GetCellData()->SetScalars(newArray);
+ }
+
+ if(MYDEBUG){
+ MESSAGE("output:");
+ output->Print(cout);
+ }
+
+
+ SetInput(output);
+
+ output->Delete();
+ newArray->Delete();
+ }
+ else
+ {
+ if(myScalars != NULL)
+ {
+ VISU_ScalarMapPL* aScalarMap = dynamic_cast<VISU_ScalarMapPL*>(this->GetScalars());
+ VISU_PrsMergerPL* aPrsMerger = dynamic_cast<VISU_PrsMergerPL*>(this->GetScalars());
+ if(aScalarMap != NULL){
+ SetInput(aScalarMap->GetInput());
+ }
+ }
+ }
+}
--- /dev/null
+// VISU OBJECT : interactive object for VISU entities implementation
+//
+// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//
+// File: VISU_PrsMergerPL.hxx
+// Author: Eugeny Nikolaev
+// Module : VISU
+
+#ifndef VISU_PrsMergerPL_HeaderFile
+#define VISU_PrsMergerPL_HeaderFile
+
+#include "VISUPipeline.hxx"
+
+#include "VISU_ScalarMapPL.hxx"
+
+class VISU_PIPELINE_EXPORT VISU_PrsMergerPL : public VISU_ScalarMapPL
+{
+ typedef VISU_ScalarMapPL TSupperClass;
+
+protected:
+ VISU_PrsMergerPL();
+ VISU_PrsMergerPL(const VISU_PrsMergerPL&);
+
+ virtual
+ ~VISU_PrsMergerPL();
+
+public:
+
+ typedef TVTKSmartPtr<VISU_PipeLine> TPipeLine;
+ typedef std::vector<TPipeLine> TPipeLines;
+
+ vtkTypeMacro(VISU_PrsMergerPL,TSupperClass);
+
+ static
+ VISU_PrsMergerPL*
+ New();
+
+ virtual
+ void
+ ShallowCopy(VISU_PipeLine *thePipeLine);
+
+ /*!
+ * Add geometry of presentation to myMeshGeometryList.
+ * \params theGeometry - visu pipeline with geometry.
+ * \params theUpdate - update pipeline if true.
+ * \retval TRUE - if geometry and scalars on the common mesh, esle FALSE.
+ */
+ virtual
+ bool
+ SetGeometry(VISU_PipeLine* theGeometry,bool theUpdate=true);
+
+ /*!
+ * Add geometry to back of myMeshGeometryList.
+ * \params theInput - visu pipeline with geometry.
+ * \params theUpdate - update pipeline if true.
+ * \retval index of added geometry. (must be >= 0)
+ * \retval -1, if geometry not added.
+ */
+ virtual
+ int
+ AddBackGeometry(VISU_PipeLine* theGeometry,bool theUpdate=true);
+
+ /*!
+ * Get geometry id of myMeshGeometryList.
+ * \retval index of geometry. (must be >= 0)
+ * \retval -1 - if geometry not exists.
+ */
+ virtual
+ int
+ GetGeometryNumber(VISU_PipeLine* theGeometry);
+
+ /*!
+ * Remove geometry with id = theId from myMeshGeometryList.
+ * the id in [0,...]
+ */
+ virtual
+ void
+ RemoveGeometryById(int theId);
+
+ /*! Removes all geometries.
+ */
+ virtual
+ void
+ RemoveAllGeom();
+
+ /*!
+ * Gets geometry of presentation by id.
+ * \retval VISU_MeshPL - pointer
+ * the id in [0,...]
+ */
+ virtual
+ VISU_PipeLine*
+ GetGeometry(int theId=0);
+
+ /*!
+ * Gets number of geometrys
+ * \retval int - number
+ */
+ virtual
+ int
+ GetNbGeometry();
+
+ /*!
+ * Sets scalar values and ids by VISU_ScalarMapPL object.
+ * \params theInput - visu pipeline with scalar values
+ * \params theUpdate - update pipeline if true.
+ * \retval TRUE - if scalars and geometry on the common mesh, esle FALSE.
+ */
+ virtual
+ bool
+ SetScalars(VISU_PipeLine* theInput,bool theUpdate=false);
+
+ /*!
+ * Gets input VISU_ScalarMapPL, which contain scalar values and ids.
+ */
+ virtual
+ VISU_PipeLine*
+ GetScalars();
+
+ virtual
+ void
+ Init();
+
+ virtual
+ void
+ Build();
+
+ /*!
+ * Calculate presentation, by merging of Geometry and Scalar Values.
+ */
+ virtual
+ void
+ Update();
+
+ /*!
+ * Set ranges of scalar values by input myScalars ranges.
+ */
+ void SetInitialRange();
+
+protected:
+ TPipeLines myMeshGeometryList;
+
+ TPipeLine myScalars;
+
+ vtkFloatingPointType* myScalarRanges;
+
+private:
+
+ /*!
+ * Check if thePipeLine and "first element of list myMeshGeometryList" or
+ * "myScalars", has
+ * common DataPoints (simple check number of points).
+ * \retval TRUE - if has common points, esle FALSE.
+ */
+ bool
+ checkGeometry(const VISU_PipeLine* thePipeLine);
+
+
+ /*!
+ * Check if thePipeLine and first element of list myMeshGeometryList, has
+ * common DataPoints (simple check number of points).
+ * \retval TRUE - if has common points, esle FALSE.
+ */
+ bool
+ checkScalars(const VISU_PipeLine* thePipeLine);
+
+ void
+ Execute();
+
+};
+
+#endif
if(isLogTable && 0 < i && i < this->NumberOfLabels - 1){ // SALOME specific
vtkFloatingPointType lval = log10(range[0]) + (vtkFloatingPointType)i/(this->NumberOfLabels-1) *
(log10(range[1])-log10(range[0]));
- val = pow(10,lval);
+ val = pow((double)10,(double)lval);
}else{
val = range[0] + (vtkFloatingPointType)i/(this->NumberOfLabels-1) * (range[1]-range[0]);
}
#ifndef VISU_ScalarBarActor_HeaderFile
#define VISU_ScalarBarActor_HeaderFile
+#include "VISUPipeline.hxx"
#include "VISU_LookupTable.hxx"
#include <vtkActor2D.h>
#define VTK_ORIENT_VERTICAL 1
#endif
-class VISU_ScalarBarActor : public vtkActor2D
+class VISU_PIPELINE_EXPORT VISU_ScalarBarActor : public vtkActor2D
{
public:
vtkTypeRevisionMacro(VISU_ScalarBarActor,vtkActor2D);
#ifndef VISU_ScalarBarCtrl_HeaderFile
#define VISU_ScalarBarCtrl_HeaderFile
+#include "VISUPipeline.hxx"
+
#include <vtkObject.h>
#include "VTKViewer.h"
class vtkLookupTable;
class vtkScalarBarActor;
-class VISU_ScalarBarCtrl : public vtkObject
+class VISU_PIPELINE_EXPORT VISU_ScalarBarCtrl : public vtkObject
{
public:
vtkTypeMacro(VISU_ScalarBarCtrl, vtkObject);
VISU_ScalarMapOnDeformedShapePL
::Init()
{
- if (GetScalars() == NULL) SetScalars(GetInput2());
+ if (GetScalarsUnstructuredGrid() == NULL) SetScalars(GetInput2());
Superclass::Init();
{
this->UpdateScalars();
- vtkFloatingPointType aRange[2];
- GetSourceRange(aRange);
+ vtkFloatingPointType* aRange = GetScalarRange();
vtkFloatingPointType aScalarRange[2] = {aRange[0], aRange[1]};
if(myBarTable->GetScale() == VTK_SCALE_LOG10)
VISU_ScalarMapOnDeformedShapePL *aPipeLine = dynamic_cast<VISU_ScalarMapOnDeformedShapePL*>(thePipeLine);
if(aPipeLine){
SetScale(aPipeLine->GetScale());
- SetScalars(aPipeLine->GetScalars());
- vtkFloatingPointType aRange[2];
- aPipeLine->GetSourceRange(aRange);
- SetScalarRange(aRange);
+ SetScalars(aPipeLine->GetScalarsUnstructuredGrid());
}
Superclass::ShallowCopy(thePipeLine);
}
::SetScalars(vtkDataSet *theScalars)
{
myScalars = theScalars;
- vtkUnstructuredGrid* aScalars = GetScalars();
+ vtkUnstructuredGrid* aScalars = GetScalarsUnstructuredGrid();
vtkCellData *aInCellData = GetInput()->GetCellData();
if(aScalars->GetPointData()->GetScalars())
*/
vtkUnstructuredGrid*
VISU_ScalarMapOnDeformedShapePL
-::GetScalars()
+::GetScalarsUnstructuredGrid()
{
return myScalars.GetPointer();
}
VISU_ScalarMapOnDeformedShapePL
::GetScale()
{
- vtkFloatingPointType aScale=myDeformVectors->GetScaleFactor();
- return aScale;
+ return myScaleFactor;
}
/*!
VISU_ScalarMapOnDeformedShapePL
::SetMapScale(vtkFloatingPointType theMapScale)
{
+ TSupperClass::SetMapScale(theMapScale); // enk::added
myDeformVectors->SetScaleFactor(myScaleFactor*theMapScale);
Modified();
}
#ifndef VISU_ScalarMapOnDeformedShapePL_HeaderFile
#define VISU_ScalarMapOnDeformedShapePL_HeaderFile
-#include "VISU_ScalarMapPL.hxx"
+#include "VISUPipeline.hxx"
+#include "VISU_PrsMergerPL.hxx"
class vtkMergeFilter;
class vtkWarpVector;
class vtkCellDataToPointData;
class vtkPointDataToCellData;
-class VISU_ScalarMapOnDeformedShapePL : public VISU_ScalarMapPL
+class VISU_PIPELINE_EXPORT VISU_ScalarMapOnDeformedShapePL : public VISU_PrsMergerPL
{
+
+ typedef VISU_PrsMergerPL TSupperClass;
+
protected:
VISU_ScalarMapOnDeformedShapePL();
VISU_ScalarMapOnDeformedShapePL(const VISU_ScalarMapOnDeformedShapePL&);
public:
- vtkTypeMacro(VISU_ScalarMapOnDeformedShapePL,VISU_ScalarMapPL);
+ vtkTypeMacro(VISU_ScalarMapOnDeformedShapePL,VISU_PrsMergerPL);
static VISU_ScalarMapOnDeformedShapePL* New();
virtual void GetSourceRange(vtkFloatingPointType theRange[2]);
virtual void SetScalars(vtkDataSet *theScalars);
- virtual vtkUnstructuredGrid* GetScalars();
+ virtual vtkUnstructuredGrid* GetScalarsUnstructuredGrid();
public:
//! Redefined method for initialization of the pipeline.
#ifndef VISU_ScalrMapPL_HeaderFile
#define VISU_ScalrMapPL_HeaderFile
+#include "VISUPipeline.hxx"
#include "VISU_PipeLine.hxx"
#include "VISU_ScalarBarActor.hxx"
//============================================================================
-class VISU_ScalarMapPL : public VISU_PipeLine
+class VISU_PIPELINE_EXPORT VISU_ScalarMapPL : public VISU_PipeLine
{
protected:
VISU_ScalarMapPL();
- VISU_ScalarMapPL(const VISU_ScalarMapPL&);
virtual
~VISU_ScalarMapPL();
#ifndef __VISU_SphereWidget_h
#define __VISU_SphereWidget_h
+#include "VISUPipeline.hxx"
#include "VISU_ImplicitFunctionWidget.hxx"
class VISU_UnScaledActor;
class vtkImplicitSum;
class vtkImplicitFunction;
//
-class VISU_SphereWidget : public VISU_ImplicitFunctionWidget
+class VISU_PIPELINE_EXPORT VISU_SphereWidget : public VISU_ImplicitFunctionWidget
{
public:
// Description:
#include "VISU_UsedPointsFilter.hxx"
#include "VTKViewer_GeometryFilter.h"
-#include <algo.h>
+#include <algorithm>
#include <vtkCell.h>
#include <vtkPointSet.h>
VISU_StreamLinesPL
::Init()
{
- VISU_ScalarMapPL::Init();
+ VISU_PrsMergerPL::Init();
vtkPointSet* aDataSet = myExtractor->GetOutput();
vtkFloatingPointType anIntStep = GetBaseIntegrationStep(aDataSet);
vtkFloatingPointType aPropagationTime = GetBasePropagationTime(aDataSet);
VISU_StreamLinesPL
::Update()
{
- VISU_ScalarMapPL::Update();
+ VISU_PrsMergerPL::Update();
}
void
#ifndef VISU_StreamLinesPL_HeaderFile
#define VISU_StreamLinesPL_HeaderFile
+#include "VISUPipeline.hxx"
#include "VISU_DeformedShapePL.hxx"
#include <vtkStreamLine.h>
class VTKViewer_GeometryFilter;
class VISU_UsedPointsFilter;
-class VISU_StreamLinesPL : public VISU_DeformedShapePL
-{
+class VISU_PIPELINE_EXPORT VISU_StreamLinesPL : public VISU_DeformedShapePL{
protected:
VISU_StreamLinesPL();
VISU_StreamLinesPL(const VISU_StreamLinesPL&);
#ifndef VISU_VectorsPL_HeaderFile
#define VISU_VectorsPL_HeaderFile
+#include "VISUPipeline.hxx"
#include "VISU_DeformedShapePL.hxx"
class VTKViewer_TransformFilter;
class vtkGlyph3D;
-class VISU_VectorsPL : public VISU_DeformedShapePL
-{
+class VISU_PIPELINE_EXPORT VISU_VectorsPL : public VISU_DeformedShapePL{
protected:
VISU_VectorsPL();
VISU_VectorsPL(const VISU_VectorsPL&);
#ifndef __VISU_WidgetCtrl_hxx
#define __VISU_WidgetCtrl_hxx
+#include "VISUPipeline.hxx"
#include <vtkImplicitFunction.h>
#include "VTKViewer.h"
class VISU_SphereWidget;
class VISU_ImplicitFunctionWidget;
-class VISU_WidgetCtrl : public vtkImplicitFunction
+class VISU_PIPELINE_EXPORT VISU_WidgetCtrl : public vtkImplicitFunction
{
public:
static VISU_WidgetCtrl *New();
msgstr "Visu_isosurfaces.png"
msgid "ICON_CUT_PLANES"
-msgstr "Visu_cutplane.png"
+msgstr "Visu_cutplanes.png"
msgid "ICON_CUT_LINES"
msgstr "Visu_cutlines.png"
msgid "ICON_PLOT2D"
msgstr "Visu_plot2d.png"
+# Tree icons for presentations
+
+msgid "ICON_TREE_RESULT"
+msgstr "Visu_tree_result.png"
+
+msgid "ICON_TREE_TABLE"
+msgstr "Visu_tree_table.png"
+
+msgid "ICON_TREE_CURVE"
+msgstr "Visu_tree_curve.png"
+
+msgid "ICON_TREE_CONTAINER"
+msgstr "Visu_tree_container.png"
+
+msgid "ICON_TREE_MESH"
+msgstr "Visu_tree_mesh.png"
+
+msgid "ICON_TREE_SCALAR_MAP"
+msgstr "Visu_tree_scalars.png"
+
+msgid "ICON_TREE_SCALAR_MAP_GROUPS"
+msgstr "Visu_tree_scalars_gr.png"
+
+msgid "ICON_TREE_DEFORMED_SHAPE"
+msgstr "Visu_tree_deformed.png"
+
+msgid "ICON_TREE_DEFORMED_SHAPE_GROUPS"
+msgstr "Visu_tree_deformed_gr.png"
+
+msgid "ICON_TREE_SCALAR_MAP_ON_DEFORMED_SHAPE"
+msgstr "Visu_tree_scalarmapondeformedshape.png"
+
+msgid "ICON_TREE_SCALAR_MAP_ON_DEFORMED_SHAPE_GROUPS"
+msgstr "Visu_tree_scalarmapondeformedshape_gr.png"
+
+msgid "ICON_TREE_VECTORS"
+msgstr "Visu_tree_vectors.png"
+
+msgid "ICON_TREE_VECTORS_GROUPS"
+msgstr "Visu_tree_vectors_gr.png"
+
+msgid "ICON_TREE_ISO_SURFACES"
+msgstr "Visu_tree_isosurfaces.png"
+
+msgid "ICON_TREE_ISO_SURFACES_GROUPS"
+msgstr "Visu_tree_isosurfaces_gr.png"
+
+msgid "ICON_TREE_CUT_PLANES"
+msgstr "Visu_tree_cutplanes.png"
+
+msgid "ICON_TREE_CUT_PLANES_GROUPS"
+msgstr "Visu_tree_cutplanes_gr.png"
+
+msgid "ICON_TREE_CUT_LINES"
+msgstr "Visu_tree_cutlines.png"
+
+msgid "ICON_TREE_CUT_LINES_GROUPS"
+msgstr "Visu_tree_cutlines_gr.png"
+
+msgid "ICON_TREE_STREAM_LINES"
+msgstr "Visu_tree_streamlines.png"
+
+msgid "ICON_TREE_STREAM_LINES_GROUPS"
+msgstr "Visu_tree_streamlines_gr.png"
+
+msgid "ICON_TREE_PLOT_3D"
+msgstr "Visu_tree_plot3d.png"
+
+msgid "ICON_TREE_PLOT_3D_GROUPS"
+msgstr "Visu_tree_plot3d_gr.png"
+
+msgid "ICON_TREE_GAUSS_POINTS"
+msgstr "Visu_tree_gauss_points.png"
+
# Representation menu
msgid "ICON_POINTS"
msgid "ICON_LOAD_TEXTURE"
msgstr "Visu_load_texture.png"
+
+msgid "ICON_ADD"
+msgstr "Visu_add.png"
+
+msgid "ICON_REMOVE"
+msgstr "Visu_remove.png"
msgid "ERR_CANT_CREATE_ACTOR"
msgstr "Can't create actor for this presentation"
+msgid "ERR_CANT_CREATE_ANIMATION"
+msgstr "Can't create animation for these fields:\n number of time stamps or number of components is not the same!"
+
# Preferences for VISU module (VisuGUI.cxx)
msgid "VISU_SCALAR_BAR"
msgid "VISU_PREF_SECOND_TAB"
msgstr "Scalar range, Sweep, MED import, Shading"
+msgid "PRS_ON_GROUPS"
+msgstr "Build presentation on groups"
+
+msgid "NO_GROUPS"
+msgstr "No groups in the mesh"
+
msgid "VISU_SCALAR_RANGE"
msgstr "Scalar range"
msgid "VISU_SWEEPING_PREF"
msgstr "Sweeping preferences"
+msgid "VISU_LINEAR_SWEEP"
+msgstr "Linear"
+
+msgid "VISU_U_SWEEP"
+msgstr "Cosinusoidal"
+
+msgid "VISU_SWEEPING_MODES"
+msgstr "Mode of the sweeping "
+
+msgid "VISU_IS2PI"
+msgstr "Parameter varies:"
+
+msgid "PERIOD_2PI"
+msgstr "From -PI to PI"
+
+msgid "PERIOD_PI"
+msgstr "From 0 to PI"
+
msgid "VISU_TIME_STEP"
msgstr "Time step(second)"
msgid "VISU_NB_STEPS"
msgstr "Number of steps"
+msgid "VISU_CUTLINE_PREF"
+msgstr "CutLine preferences"
+
msgid "VISU_PREF_MED_IMPORT"
msgstr "MED files import"
msgid "VISU_USE_SHADING"
msgstr "Use Shading"
+msgid "VISU_DISP_ONLY"
+msgstr "Display only on creation"
+
msgid "VISU_SHRINK"
msgstr "Shrink"
msgid "VisuGUI::MEN_SHOW_ANIMATION"
msgstr "Show..."
-msgid "VisuGUI::MEN_ANIMATION"
-msgstr "Animation..."
+msgid "VisuGUI::MEN_PARALLEL_ANIMATION"
+msgstr "Parallel Animation..."
+
+msgid "VisuGUI::MEN_SUCCCESSIVE_ANIMATION"
+msgstr "Successive Animation..."
+
+msgid "PARALLEL_ANIMATION"
+msgstr "Parallel Animation"
+
+msgid "SUCCESSIVE_ANIMATION"
+msgstr "Successive Animation"
msgid "VisuGUI::MEN_CELL_COLOR"
msgstr "Cell color"
msgid "VisuGUI_CutLinesDlg::LBL_INVERT_CURVES"
msgstr "Invert all curves"
+msgid "VisuGUI_CutLinesDlg::LBL_ABSOLUTE_LENGTH"
+msgstr "Use absolute length"
+
msgid "VisuGUI_CutLinesDlg::LBL_GENERATE_CURVES"
msgstr "Generate Curves"
#include "VisuGUI_BuildProgressDlg.h"
#include "VisuGUI_TransparencyDlg.h"
-#include "VISU_ScalarMap_i.hh"
+#include "VISU_PrsMerger_i.hh"
#include "VisuGUI_ScalarBarDlg.h"
#include "VISU_DeformedShape_i.hh"
static int MYDEBUG = 0;
#endif
+#ifdef WIN32
+#define usleep(A) _sleep(A/1000)
+#endif
+
//////////////////////////////////////////////////
// Class: VisuGUI
//////////////////////////////////////////////////
VisuGUI::
OnCreateScalarMap()
{
- CreatePrs3d<VISU::ScalarMap_i,VisuGUI_ScalarBarDlg,1>(this);
+ CreatePrs3d<VISU::PrsMerger_i,VisuGUI_ScalarBarDlg,1>(this);
}
{
Handle(SALOME_InteractiveObject) anIO;
if (VISU::Prs3d_i* aPrs3d = GetPrsToModify(this, &anIO))
- EditPrs3d<VISU::ScalarMap_i, VisuGUI_ScalarBarDlg, 1>(this, anIO, aPrs3d);
+ EditPrs3d<VISU::PrsMerger_i, VisuGUI_ScalarBarDlg, 1>(this, anIO, aPrs3d);
}
void
int i = 0, nbSelected = aList.Extent();
if (nbSelected < 1) return;
- const char* entries [nbSelected];
+ const char** entries = new const char*[nbSelected];
Handle(SALOME_InteractiveObject) anIO;
for (SALOME_ListIteratorOfListIO it (aList); it.More(); it.Next()) {
anIO = it.Value();
}
}
+ delete [] entries;
+
// Finish transaction
aStudyBuilder->CommitCommand();
mgr->clearSelected();
int aCycles = aResourceMgr->integerValue("VISU", "sweeping_number_cycles", 1);
int aSteps = aResourceMgr->integerValue("VISU", "sweeping_number_steps", 40);
+ int aMode = aResourceMgr->integerValue("VISU", "sweeping_modes", 0);
+
+ int is2Pi = aResourceMgr->integerValue("VISU", "sweeping_is2PI", 0);
+
// Sweep
QApplication::setOverrideCursor(Qt::waitCursor);
+
for (int j = 0; j < aCycles; j++) {
for (int i = 0; i <= aSteps; i++) {
try {
- float aPercents = float(i)/aSteps;
+ float aPercents;
+ if( aMode == 1 ){ //if selected Periodic mode of sweeping
+ float aT = ( is2Pi == 1 ? -PI + 2. * PI * float(i)/aSteps : PI * float(i)/aSteps );
+ //This is necessary in order for animation to retrun to the initial picture
+ aPercents = (1.-cos( aT ))/2.;
+ }
+ else //if selected Linear mode of sweeping
+ aPercents = float(i)/aSteps;
aPrsObject->SetMapScale(aPercents);
aPrsObject->UpdateActor(aActor);
vw->getRenderWindow()->Render();
void
VisuGUI::
-OnTimeAnimation()
+OnTimeAnimation(int theMode)
{
if (!VISU::GetActiveViewWindow<SVTK_ViewWindow>(this))
return;
_PTR(Study) aCStudy = GetCStudy(GetAppStudy(this));
VisuGUI_TimeAnimationDlg* aAnimationDlg =
- new VisuGUI_TimeAnimationDlg (this, aCStudy);
+ new VisuGUI_TimeAnimationDlg (this, aCStudy, theMode);
LightApp_SelectionMgr* aSelectionMgr = GetSelectionMgr(this);
SALOME_ListIO aListIO;
aSelectionMgr->selectedObjects(aListIO);
- bool isDefined = false;
- long aNbTimes = 0;
SALOME_ListIteratorOfListIO It (aListIO);
for (; It.More(); It.Next()) {
_PTR(SObject) aSObject = aCStudy->FindObjectID(It.Value()->getEntry());
- if (!aSObject) continue;
- if (getValue(aSObject, "myComment") == QString("FIELD")) {
- long aNumber = getValue(aSObject, "myNbTimeStamps").toLong();
- if (aNumber > 1) {
- if (!isDefined) {
- aNbTimes = aNumber;
- aAnimationDlg->addField(aSObject);
- isDefined = true;
- } else if (aNbTimes == aNumber) {
- aAnimationDlg->addField(aSObject);
- }
- }
+ if ( !aAnimationDlg->addField(aSObject) ) {
+ SUIT_MessageBox::warn1(GetDesktop(this),
+ tr("WRN_VISU"),
+ tr("ERR_CANT_CREATE_ANIMATION"),
+ tr("BUT_OK"));
+ delete aAnimationDlg;
+ return;
}
}
- if (isDefined) aAnimationDlg->show();
- else delete aAnimationDlg;
+ aAnimationDlg->show();
+}
+
+void
+VisuGUI::
+OnParallelTimeAnimation()
+{
+ OnTimeAnimation(0);
+}
+
+void
+VisuGUI::
+OnSucccessiveTimeAnimation()
+{
+ OnTimeAnimation(1);
}
//************************************************************************
VISU::Storable::TRestoringMap aMap;
_PTR(GenericAttribute) anAttr;
- if (!aSObj->FindAttribute(anAttr, "AttributeComment")) return;
+ if (!aSObj->FindAttribute(anAttr, "AttributeString")) return;
- _PTR(AttributeComment) aComment (anAttr);
+ _PTR(AttributeString) aComment (anAttr);
string aComm = aComment->Value();
QString strIn (aComm.c_str());
VISU::Storable::StrToMap(strIn, aMap);
aSameMesh->SameAs(aMeshPrs);
}
break;
- case VISU::TSCALARMAP:
+ case VISU::TPRSMERGER:
{
- VISU::ScalarMap_i* aScalarPrs = dynamic_cast<VISU::ScalarMap_i*>(aPrsObject);
- VISU::ScalarMap_i* aSameScalar = new VISU::ScalarMap_i(aScalarPrs->GetResult(),true);
+ VISU::PrsMerger_i* aScalarPrs = dynamic_cast<VISU::PrsMerger_i*>(aPrsObject);
+ VISU::PrsMerger_i* aSameScalar = new VISU::PrsMerger_i(aScalarPrs->GetResult(),true);
aSameScalar->SameAs(aScalarPrs);
}
break;
this, SLOT(OnSelectionInfo()));
aPixmap = aResourceMgr->loadPixmap("VISU",tr("ICON_TIMEANIMATION"));
- createAction( VISU_ANIMATION, tr("MEN_ANIMATION"), QIconSet(aPixmap),
- tr("MEN_ANIMATION"), "", 0, aParent, false,
- this, SLOT(OnTimeAnimation()));
+ createAction( VISU_PARALLELANIMATION, tr("MEN_PARALLEL_ANIMATION"), QIconSet(aPixmap),
+ tr("MEN_PARALLEL_ANIMATION"), "", 0, aParent, false,
+ this, SLOT(OnParallelTimeAnimation()));
+
+ aPixmap = aResourceMgr->loadPixmap("VISU",tr("ICON_TIMEANIMATION"));
+ createAction( VISU_SUCCCESSIVEANIMATION, tr("MEN_SUCCCESSIVE_ANIMATION"), QIconSet(aPixmap),
+ tr("MEN_SUCCCESSIVE_ANIMATION"), "", 0, aParent, false,
+ this, SLOT(OnSucccessiveTimeAnimation()));
aPixmap = aResourceMgr->loadPixmap("VISU",tr("ICON_ERASE_ALL"));
createAction( VISU_ERASE_ALL, tr("MEN_ERASE_ALL"), QIconSet(aPixmap),
mgr->insert( action( VISU_FREE_SCALAR_BARS ), -1, -1, -1 );
mgr->insert( action( VISU_SWEEP ), -1, -1, -1 );
- mgr->insert( action( VISU_ANIMATION ), -1, -1, -1 );
+ mgr->insert( action( VISU_PARALLELANIMATION ), -1, -1, -1 );
+ mgr->insert( action( VISU_SUCCCESSIVEANIMATION ), -1, -1, -1 );
mgr->insert( separator(), -1, -1, -1 );
// Rules
- QString aPrsAll ("'VISU::TSCALARMAP' 'VISU::TISOSURFACE' 'VISU::TDEFORMEDSHAPE' 'VISU::TCUTPLANES' "
+ QString aPrsAll ("'VISU::TPRSMERGER' 'VISU::TISOSURFACE' 'VISU::TDEFORMEDSHAPE' 'VISU::TCUTPLANES' "
"'VISU::TCUTLINES' 'VISU::TVECTORS' 'VISU::TSTREAMLINES' 'VISU::TPLOT3D' 'VISU::TSCALARMAPONDEFORMEDSHAPE'");
// VISU root commands
// 3D presentations commands
QString aPrsType = " and $type in {'VISU::TMESH' " + aPrsAll + "}";
- QString aInsideType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP' 'VISU::TDEFORMEDSHAPE'}";
- QString aSurfFrameType = " and $type in {'VISU::TMESH'}";
- QString aSurfType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP' 'VISU::TISOSURFACE' 'VISU::TDEFORMEDSHAPE' 'VISU::TCUTPLANES' "
+ QString aInsideType = " and $type in {'VISU::TMESH' 'VISU::TPRSMERGER' 'VISU::TDEFORMEDSHAPE'}";
+ QString aSurfFrameType = " and $type in {'VISU::TMESH' 'VISU::TPRSMERGER''VISU::TDEFORMEDSHAPE' 'VISU::TSCALARMAPONDEFORMEDSHAPE'}";
+ QString aSurfType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP' 'VISU::TPRSMERGER' 'VISU::TISOSURFACE' 'VISU::TDEFORMEDSHAPE' 'VISU::TCUTPLANES' "
" 'VISU::TPLOT3D' 'VISU::TSCALARMAPONDEFORMEDSHAPE'}";
- QString aShrinkType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP' 'VISU::TISOSURFACE' "
+ QString aShrinkType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP' 'VISU::TPRSMERGER' 'VISU::TISOSURFACE' "
"'VISU::TDEFORMEDSHAPE' 'VISU::TCUTPLANES' 'VISU::TCUTLINES' 'VISU::TPLOT3D' 'VISU::TSCALARMAPONDEFORMEDSHAPE'}";
- QString aLineType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP' 'VISU::TISOSURFACE' 'VISU::TDEFORMEDSHAPE' "
+ QString aLineType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP' 'VISU::TPRSMERGER' 'VISU::TISOSURFACE' 'VISU::TDEFORMEDSHAPE' "
"'VISU::TCUTPLANES' 'VISU::TCUTLINES' 'VISU::TSTREAMLINES' 'VISU::TPLOT3D' 'VISU::TSCALARMAPONDEFORMEDSHAPE' }";
aRule = "selcount=1";
mgr->setRule( action( VISU_CLEAR_CONTAINER ), aRule, true );
mgr->setRule( action( VISU_EDIT_SCALARMAP ),
- "selcount=1 and type='VISU::TSCALARMAP'", true );
+ "selcount=1 and type='VISU::TPRSMERGER'", true );
mgr->setRule( action( VISU_EDIT_DEFORMEDSHAPE ),
"selcount=1 and type='VISU::TDEFORMEDSHAPE'", true );
mgr->setRule( action( VISU_EDIT_SCALARMAPONDEFORMEDSHAPE ),
aRule += " and $type in {'VISU::TFIELD'}";
aRule += " and nbTimeStamps>1";
aRule += " and activeView in {'VTKViewer' 'VVTK'}";
- mgr->setRule( action( VISU_ANIMATION ), aRule, true );
+ mgr->setRule( action( VISU_PARALLELANIMATION ), aRule, true );
+
+ aRule = "client='ObjectBrowser' and selcount>0";
+ aRule += " and $type in {'VISU::TFIELD'}";
+ aRule += " and nbTimeStamps>0";
+ aRule += " and activeView in {'VTKViewer' 'VVTK'}";
+ mgr->setRule( action( VISU_SUCCCESSIVEANIMATION ), aRule, true );
aRule = "client='ObjectBrowser' and $type in {'VISU::TENTITY' 'VISU::TFAMILY' 'VISU::TGROUP'}";
mgr->setRule( action( VISU_CREATE_PRS ), aRule + " and selcount=1", true );
mgr->setRule( action( VISU_CREATE_MANY_PRS ), aRule + " and selcount>1", true );
+ mgr->setRule( action( VISU_EDIT_PLOT3D ),
+ "selcount=1 and type='VISU::TPLOT3D'", true );
//aRule = "client='ObjectBrowser' and type='MEDFIELD'";
//mgr->setRule( action( VISU_IMPORT_MED ), aRule, true );
CORBA::Object_var aCORBAObject = VISU::ClientSObjectToObject(aSObject);
if (CORBA::is_nil(aCORBAObject)) {
_PTR(GenericAttribute) anAttr;
- if (aSObject->FindAttribute(anAttr, "AttributeComment")) {
- _PTR(AttributeComment) aComment (anAttr);
+ if (aSObject->FindAttribute(anAttr, "AttributeString")) {
+ _PTR(AttributeString) aComment (anAttr);
string aComm = aComment->Value();
QString strIn (aComm.c_str());
VISU::Storable::TRestoringMap pMap;
if ( !aSObject )
continue;
_PTR(GenericAttribute) anAttr;
- if (aSObject->FindAttribute(anAttr, "AttributeComment")) {
- _PTR(AttributeComment) aComment (anAttr);
+ if (aSObject->FindAttribute(anAttr, "AttributeString")) {
+ _PTR(AttributeString) aComment (anAttr);
string aComm = aComment->Value();
QString strIn (aComm.c_str());
VISU::Storable::TRestoringMap pMap;
void VisuGUI::createPreferences()
{
+ // TAB: "MED import"
+ int importTab = addPreference( tr( "MED import" ) );
+
+ // group: "MED files import"
+ int importGr = addPreference( tr( "MED files import" ), importTab );
+ setPreferenceProperty( importGr, "columns", 1 );
+ addPreference( tr( "Use build progress" ), importGr, LightApp_Preferences::Bool, "VISU", "use_build_progress" );
+ addPreference( tr( "Full MED loading" ), importGr, LightApp_Preferences::Bool, "VISU", "full_med_loading" );
+ addPreference( tr( "Build at once" ), importGr, LightApp_Preferences::Bool, "VISU", "build_at_once" );
+ addPreference( tr( "Build fields" ), importGr, LightApp_Preferences::Bool, "VISU", "build_fields" );
+ addPreference( tr( "Build min/max" ), importGr, LightApp_Preferences::Bool, "VISU", "build_min_max" );
+ addPreference( tr( "Build groups" ), importGr, LightApp_Preferences::Bool, "VISU", "build_groups" );
+ addPreference( tr( "Close dialog at finish" ), importGr, LightApp_Preferences::Bool, "VISU", "close_at_finish" );
+
// TAB: "Scalar Bar"
int sbarTab = addPreference( tr( "VISU_SCALAR_BAR" ) );
int scalarBarGr = addPreference( tr( "Scalar bars default position" ), sbarTab );
addPreference( tr( "Arrange Scalar Bars" ), scalarBarGr, LightApp_Preferences::Bool, "VISU", "scalar_bars_default_position" );
- int srangeTab = addPreference( tr( "Sweep, MED import" ) );
+ // TAB: "CutLines"
+ int cutLineTab = addPreference( tr( "CutLines" ) );
+ // group: "CutLines preferences"
+ int cutLineGr = addPreference( tr( "VISU_CUTLINE_PREF" ), cutLineTab );
+ setPreferenceProperty( cutLineGr, "columns", 1 );
+ addPreference( tr( "Show preview" ), cutLineGr, LightApp_Preferences::Bool, "VISU", "show_preview" );
+ addPreference( tr( "Invert all curves" ), cutLineGr, LightApp_Preferences::Bool, "VISU", "invert_all_curves" );
+ addPreference( tr( "Use absolute length" ), cutLineGr, LightApp_Preferences::Bool, "VISU", "use_absolute_length" );
+ addPreference( tr( "Generate data table" ), cutLineGr, LightApp_Preferences::Bool, "VISU", "generate_data_table" );
+ addPreference( tr( "Generate curves" ), cutLineGr, LightApp_Preferences::Bool, "VISU", "generate_curves" );
+
+ // TAB: "Sweep, Animation"
+ int srangeTab = addPreference( tr( "Sweep, Animation" ) );
+
// group: "Sweeping preferences"
int sweepGr = addPreference( tr( "VISU_SWEEPING_PREF" ), srangeTab );
setPreferenceProperty( sweepGr, "columns", 1 );
+
+ int modeSw = addPreference( tr( "VISU_SWEEPING_MODES" ), sweepGr, LightApp_Preferences::Selector, "VISU", "sweeping_modes" );
+ QStringList sweep_modes;
+ sweep_modes.append( tr( "VISU_LINEAR_SWEEP" ) );
+ sweep_modes.append( tr( "VISU_U_SWEEP" ) );
+ indices.clear();
+ indices.append( 0 );
+ indices.append( 1 );
+ setPreferenceProperty( modeSw, "strings", sweep_modes );
+ setPreferenceProperty( modeSw, "indexes", indices );
int timestep = addPreference( tr( "VISU_TIME_STEP" ), sweepGr,
LightApp_Preferences::DblSpin, "VISU", "sweeping_time_step" );
LightApp_Preferences::IntSpin, "VISU", "sweeping_number_cycles" );
int nbsteps = addPreference( tr( "VISU_NB_STEPS" ), sweepGr,
LightApp_Preferences::IntSpin, "VISU", "sweeping_number_steps" );
+ int rangeSw = addPreference( tr( "VISU_IS2PI" ), sweepGr, LightApp_Preferences::Selector, "VISU", "sweeping_is2PI" );
+ QStringList ranges;
+ ranges.append( tr( "PERIOD_PI" ) );
+ ranges.append( tr( "PERIOD_2PI" ) );
+ indices.clear();
+ indices.append( 0 );
+ indices.append( 1 );
+ setPreferenceProperty( rangeSw, "strings", ranges );
+ setPreferenceProperty( rangeSw, "indexes", indices );
+
setPreferenceProperty( timestep, "min", 0.1 );
setPreferenceProperty( timestep, "step", 0.1 );
setPreferenceProperty( timestep, "max", 1000 );
setPreferenceProperty( nbcycles, "max", 100 );
- setPreferenceProperty( nbsteps, "max", 200 );
+ setPreferenceProperty( nbsteps, "max", 200 );
- // group: "MED files import"
- int importGr = addPreference( tr( "MED files import" ), srangeTab );
- setPreferenceProperty( importGr, "columns", 1 );
- addPreference( tr( "Use build progress" ), importGr, LightApp_Preferences::Bool, "VISU", "use_build_progress" );
- addPreference( tr( "Full MED loading" ), importGr, LightApp_Preferences::Bool, "VISU", "full_med_loading" );
- addPreference( tr( "Build at once" ), importGr, LightApp_Preferences::Bool, "VISU", "build_at_once" );
- addPreference( tr( "Build fields" ), importGr, LightApp_Preferences::Bool, "VISU", "build_fields" );
- addPreference( tr( "Build min/max" ), importGr, LightApp_Preferences::Bool, "VISU", "build_min_max" );
- addPreference( tr( "Build groups" ), importGr, LightApp_Preferences::Bool, "VISU", "build_groups" );
- addPreference( tr( "Close dialog at finish" ), importGr, LightApp_Preferences::Bool, "VISU", "close_at_finish" );
+ // group: "Animation preferences"
+ int animationGr = addPreference( tr( "Animation preferences" ), srangeTab );
+ setPreferenceProperty( animationGr, "columns", 1 );
+
+ int speed = addPreference( tr( "Speed" ), animationGr, LightApp_Preferences::IntSpin, "VISU", "speed" );
+ addPreference( tr( "Cycled animation" ), animationGr, LightApp_Preferences::Bool, "VISU", "cycled_animation" );
+ addPreference( tr( "Use proportional timing" ), animationGr, LightApp_Preferences::Bool, "VISU", "use_proportional_timing" );
+ addPreference( tr( "Clean memory at each frame" ), animationGr, LightApp_Preferences::Bool, "VISU", "clean_memory_at_each_frame" );
+
+ setPreferenceProperty( speed, "min", 1 );
+ setPreferenceProperty( speed, "max", 99 );
// TAB: Representation ; group: "Representation properties"
int representationTab = addPreference( tr( "Representation" ) );
mesh_indices.append( 2 );
QStringList modes1 = mesh_modes;
- modes1.remove( "Surfaceframe" );
+ modes1.remove( "Insideframe" );
QValueList<QVariant> indices1 = mesh_indices;
- indices1.remove( 4 );
+ indices1.remove( 3 );
QStringList modes2 = modes1;
- modes2.remove( "Insideframe" );
+ modes2.remove( "Surfaceframe" );
QValueList<QVariant> indices2 = indices1;
- indices2.remove( 3 );
+ indices2.remove( 4 );
QStringList modes3 = modes2;
modes3.remove( "Surface" );
addPreference( tr( "VISU_SHRINK" ), representGr, LightApp_Preferences::Bool, "VISU", "mesh_shrink" );
int scalar_map_represent = addPreference( tr( "VISU_SCALAR_MAP" ), representGr, LightApp_Preferences::Selector, "VISU", "scalar_map_represent" );
- setPreferenceProperty( scalar_map_represent, "strings", modes1 );
- setPreferenceProperty( scalar_map_represent, "indexes", indices1 );
+ setPreferenceProperty( scalar_map_represent, "strings", mesh_modes );
+ setPreferenceProperty( scalar_map_represent, "indexes", mesh_indices );
addPreference( tr( "VISU_SHRINK" ), representGr, LightApp_Preferences::Bool, "VISU", "scalar_map_shrink" );
int iso_surfaces_represent = addPreference( tr( "VISU_ISO_SURFACES" ), representGr, LightApp_Preferences::Selector, "VISU", "iso_surfaces_represent" );
addPreference( "", representGr, LightApp_Preferences::Space );
int deformed_shape_represent = addPreference( tr( "VISU_DEFORMED_SHAPE" ), representGr, LightApp_Preferences::Selector, "VISU", "deformed_shape_represent" );
- setPreferenceProperty( deformed_shape_represent, "strings", modes1 );
- setPreferenceProperty( deformed_shape_represent, "indexes", indices1 );
+ setPreferenceProperty( deformed_shape_represent, "strings", mesh_modes );
+ setPreferenceProperty( deformed_shape_represent, "indexes", mesh_indices );
addPreference( tr( "VISU_SHRINK" ), representGr, LightApp_Preferences::Bool, "VISU", "deformed_shape_shrink" );
int vectors_represent = addPreference( tr( "VISU_VECTORS" ), representGr, LightApp_Preferences::Selector, "VISU", "vectors_represent" );
addPreference( "", representGr, LightApp_Preferences::Space );
int scalar_def_represent = addPreference( tr( "VISU_SCALAR_MAP_ON_DEFORMED_SHAPE" ), representGr, LightApp_Preferences::Selector, "VISU", "scalar_def_represent" );
- setPreferenceProperty( scalar_def_represent, "strings", modes2 );
- setPreferenceProperty( scalar_def_represent, "indexes", indices2 );
+ setPreferenceProperty( scalar_def_represent, "strings", modes1 );
+ setPreferenceProperty( scalar_def_represent, "indexes", indices1 );
addPreference( tr( "VISU_SHRINK" ), representGr, LightApp_Preferences::Bool, "VISU", "scalar_def_shrink" );
addPreference( tr( "VISU_USE_SHADING" ), representGr,
LightApp_Preferences::Bool, "VISU", "represent_shading" );
+ addPreference( "", representGr, LightApp_Preferences::Space );
+
+ addPreference( tr( "VISU_DISP_ONLY" ), representGr,
+ LightApp_Preferences::Bool, "VISU", "display_only" );
}
void VisuGUI::preferencesChanged( const QString& a, const QString& b)
return getApp()->getViewManager(theType,theIsCreate);
}
-TViewToPrs3d
-VisuGUI
-::getScalarBarsMap()
-{
- return myScalarBarsMap;
-}
LightApp_Displayer* VisuGUI::displayer()
{
if( !myDisplayer )
getViewManager(const QString& theType,
const bool theIsCreate);
- VISU::TViewToPrs3d getScalarBarsMap();
VISU::TViewToPrs3d myScalarBarsMap;
+ VISU::TViewToPrs3d getScalarBarsMap() { return myScalarBarsMap; }
public slots:
virtual bool deactivateModule( SUIT_Study* );
virtual bool activateModule( SUIT_Study* );
+ virtual void OnEraseAll();
protected slots:
void OnImportFromFile();
virtual void OnDisplayPrs();
virtual void OnDisplayOnlyPrs();
virtual void OnErasePrs();
- virtual void OnEraseAll();
+ // virtual void OnEraseAll();
void OnMakeSurfaceframe();
void OnMakeInsideframe();
void OnRename();
void OnClippingPlanes();
void OnSweep();
- void OnTimeAnimation();
+ void OnParallelTimeAnimation();
+ void OnSucccessiveTimeAnimation();
void OnShowAnimation();
void OnCopyPresentation();
protected:
virtual LightApp_Selection* createSelection() const;
+ void OnTimeAnimation(int theMode);
+
private:
void createActions();
void createMenus();
#define VISU_CREATE_TABLE 4063
#define VISU_SWEEP 4064
#define VISU_SELECTION_INFO 4065
-#define VISU_ANIMATION 4066
+#define VISU_PARALLELANIMATION 4066
+#define VISU_SUCCCESSIVEANIMATION 4067
#define VISU_ERASE_ALL 4070
#define VISU_GLOBAL_SELECTION 4071
app->onHelpContextModule(aVisuGUI ? app->moduleName(aVisuGUI->moduleName()) : QString(""), aHelpFileName);
}
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
VISU::RangeStepAndValidator(SpinBoxRot1, -180.0, 180.0, 1, 3);
VISU::RangeStepAndValidator(SpinBoxRot2, -180.0, 180.0, 1, 3);
- ComboBoxOrientation->insertItem(tr("PARALLEL_XOY_COMBO_ITEM"));
- ComboBoxOrientation->insertItem(tr("PARALLEL_YOZ_COMBO_ITEM"));
- ComboBoxOrientation->insertItem(tr("PARALLEL_ZOX_COMBO_ITEM"));
-
SpinBoxDistance->setValue(0.5);
myPrs3d = 0;
myIsSelectPlane = false;
onSelectionChanged();
+ ComboBoxOrientation->insertItem(tr("PARALLEL_XOY_COMBO_ITEM"));
+ ComboBoxOrientation->insertItem(tr("PARALLEL_YOZ_COMBO_ITEM"));
+ ComboBoxOrientation->insertItem(tr("PARALLEL_ZOX_COMBO_ITEM"));
+
+
// signals and slots connections :
connect(ComboBoxPlanes , SIGNAL(activated(int)) , this, SLOT(onSelectPlane(int)));
connect(buttonNew , SIGNAL(clicked()) , this, SLOT(ClickOnNew()));
VisuGUI_ClippingDlg::~VisuGUI_ClippingDlg()
{
// no need to delete child widgets, Qt does it all for us
+ SetPrs3d(NULL);
std::for_each(myPlanes.begin(),myPlanes.end(),TSetVisiblity(false));
VISU::RenderViewWindow(VISU::GetActiveViewWindow<SVTK_ViewWindow>(myVisuGUI));
}
PortableServer::ServantBase_var aServant = VISU::GetServant(anObject);
if (!aServant.in()) return;
- myPrs3d = dynamic_cast<VISU::Prs3d_i*>(aServant.in());
+ VISU::Prs3d_i* aPrs3d = dynamic_cast<VISU::Prs3d_i*>(aServant.in());
+ SetPrs3d(aPrs3d);
+
if (myPrs3d) {
std::for_each(myPlanes.begin(),myPlanes.end(),TSetVisiblity(false));
myPlanes.clear();
//=================================================================================
void VisuGUI_ClippingDlg::ClickOnNew()
{
- if(!AutoApplyCheckBox->isChecked())
- ClickOnApply();
+ Handle(SALOME_InteractiveObject) anIO;
+ CORBA::Object_var anObject = VISU::GetSelectedObj(myVisuGUI, &anIO);
+ if (CORBA::is_nil(anObject)) return;
+
+ SetCurrentPlaneParam();
if (!myPrs3d)
return;
ButtonGroupIJKAxis ->setEnabled(anIsControlsEnable);
SpinBoxIJKIndex ->setEnabled(anIsControlsEnable);
CheckBoxIJKPlaneReverse->setEnabled(anIsControlsEnable);
+ //ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ if(myPrs3d)
+ if(myPrs3d->GetPL()->GetIDMapper()->IsStructured()){
+ VISU::TIdTypeVector aVec = myPrs3d->GetPL()->GetIDMapper()->GetStructure();
+ switch(aVec.size()){
+ case 1:
+ ButtonGroupIJKAxis->find(0)->setEnabled(true);
+ ButtonGroupIJKAxis->find(1)->setEnabled(false);
+ ButtonGroupIJKAxis->find(2)->setEnabled(false);
+ break;
+ case 2:
+ ButtonGroupIJKAxis->find(0)->setEnabled(true);
+ ButtonGroupIJKAxis->find(1)->setEnabled(true);
+ ButtonGroupIJKAxis->find(2)->setEnabled(false);
+ break;
+ case 3:
+ ButtonGroupIJKAxis->find(0)->setEnabled(true);
+ ButtonGroupIJKAxis->find(1)->setEnabled(true);
+ ButtonGroupIJKAxis->find(2)->setEnabled(true);
+ break;
+ }
+ }
+ //ENK: 23.11.2006
}
//=================================================================================
double maxDot = 0;
const vector<vtkFloatingPointType> *curValues, *values = 0;
VISU::Result_i* result = myPrs3d->GetResult();
- for (i = 0; i < 3; ++i) {
+ int aNbAxes = 3;
+ if(myPrs3d->GetPL()->GetIDMapper()->IsStructured() &&
+ !myPrs3d->GetPL()->GetIDMapper()->myType)
+ aNbAxes = (myPrs3d->GetPL()->GetIDMapper()->GetStructure()).size();
+ for (i = 0; i < aNbAxes; ++i) {
VISU::Result_i::TAxis axis = (VISU::Result_i::TAxis) i;
curValues = result->GetAxisInfo(myPrs3d->GetMeshName(), axis, dir);
if (curValues) {
double dot = normal * dir;
- if (Abs(dot) > Abs(maxDot)) {
+ //ENK: 23.11.2006 - PAL13176
+ if(i==0){
+ maxDot = dot;
+ gridDir = dir;
+ values = curValues;
+ gridAxId = i;
+ } else if (Abs(dot) >= Abs(maxDot)) {
maxDot = dot;
gridDir = dir;
values = curValues;
gridAxId = i;
}
+ //ENK: 23.11.2006
}
if (Abs (planeNormal[ maxAx ]) < Abs (planeNormal[ i ]))
maxAx = i;
ClickOnHelp();
}
}
+
+void VisuGUI_ClippingDlg::SetPrs3d(VISU::Prs3d_i* thePrs)
+{
+ if(thePrs != myPrs3d){
+ if(myPrs3d)
+ myPrs3d->Destroy();
+ if(thePrs)
+ thePrs->Register();
+ myPrs3d = thePrs;
+ } else
+ return;
+}
private:
void keyPressEvent( QKeyEvent* e );
+
+ void SetPrs3d(VISU::Prs3d_i* thePrs);
+
private:
// Module : VISU
// $Header$
+#include <string>
using namespace std;
#include "VisuGUI.h"
app->onHelpContextModule(aVisuGUI ? app->moduleName(aVisuGUI->moduleName()) : QString(""), aHelpFileName);
}
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
using namespace std;
-bool VisuGUI_CutLinesDlg::MYGenerateTable = true;
-bool VisuGUI_CutLinesDlg::MYGenerateCurve = true;
-
VisuGUI_CutLinesDlg::VisuGUI_CutLinesDlg (SalomeApp_Module* theModule)
: QDialog(VISU::GetDesktop(theModule), "VisuGUI_CutLinesDlg", false,
WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu),
myAllCurvesInvertedCheck->setChecked(false);
aPlaneLayout->addWidget(myAllCurvesInvertedCheck);
+ myUseAbsoluteLengthCheck = new QCheckBox(tr("LBL_ABSOLUTE_LENGTH"), aPlanePane);
+ myUseAbsoluteLengthCheck->setChecked(false);
+ aPlaneLayout->addWidget(myUseAbsoluteLengthCheck);
+
myCreateTable = new QCheckBox (tr("LBL_GENERATE_TABLE"), aPlanePane);
- myCreateTable->setChecked(MYGenerateTable);
+ myCreateTable->setChecked(true);
aPlaneLayout->addWidget( myCreateTable );
QHBox* aCheckPane = new QHBox(aPlanePane);
aCheckPane->setStretchFactor(aLbl, 0);
myCurvesCheck = new QCheckBox(tr("LBL_GENERATE_CURVES"), aCheckPane);
aCheckPane->setStretchFactor(aCheckPane, 0);
- myCurvesCheck->setChecked(MYGenerateCurve);
- myCurvesCheck->setEnabled(MYGenerateTable);
+ myCurvesCheck->setChecked(true);
+ myCurvesCheck->setEnabled(true);
QLabel* aLbl2 = new QLabel(" ", aCheckPane);
aCheckPane->setStretchFactor(aLbl2, 1);
aPlaneLayout->addWidget( aCheckPane );
myPrs = thePrs;
myScalarPane->initFromPrsObject(thePrs);
+ SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr();
+ myPreviewCheck->setChecked( aResourceMgr->booleanValue("VISU", "show_preview", false) );
+ myCreateTable->setChecked( aResourceMgr->booleanValue("VISU", "generate_data_table", true) );
+ myCurvesCheck->setChecked( aResourceMgr->booleanValue("VISU", "generate_curves", true) );
+ myCurvesCheck->setEnabled( aResourceMgr->booleanValue("VISU", "generate_curves", true) );
+
myRotXSpn->setValue(thePrs->GetRotateX()*180./PI);
myRotYSpn->setValue(thePrs->GetRotateY()*180./PI);
myPosSpn->setValue(thePrs->GetDisplacement());
hasInit = true;
myCutLines = new VISU::CutLines_i(thePrs->GetResult(),false);
myCutLines->SameAs(thePrs);
- myCutLines->CopyCurvesInverted(thePrs->GetCurvesInverted());
- if (myCutLines->IsAllCurvesInverted()) myAllCurvesInvertedCheck->setChecked(true);
+ myAllCurvesInvertedCheck->setChecked(myCutLines->IsAllCurvesInverted());
+ myUseAbsoluteLengthCheck->setChecked(myCutLines->IsUseAbsoluteLength());
myBasePlanePos->setText( QString::number(myCutLines->GetBasePlanePosition()) );
myCBSetDef->setChecked(thePrs->IsDefault());
DrawTable();
}
if (myAllCurvesInvertedCheck->isChecked())
thePrs->SetAllCurvesInverted(true);
+ thePrs->SetUseAbsoluteLength(myUseAbsoluteLengthCheck->isChecked());
return 1;
}
void VisuGUI_CutLinesDlg::accept()
{
- //if ( !VisuGUI::CheckActiveStudyLock() ) {
- // reject();
- // return;
- //}
- MYGenerateTable = myCreateTable->isChecked();
- MYGenerateCurve = myCurvesCheck->isChecked();
- // if (myScalarPane->check()) {
- /*jfa tmp:((QWidget*)sender())->setDisabled(true);
- storeToPrsObject(myPrs);
- if (myIsCreation) {
- if (isGenerateTable()) {
- visuGUI->GetVisuGen()->CreateTable(myPrs->GetEntry());
- if (isGenerateCurves()) {
- SALOMEDSClient_Study* aStudy = study()->studyDS();
- SALOMEDSClient_SObject* aSObject = aStudy->FindObjectID(myPrs->GetEntry());
- if( aSObject ) {
- SALOMEDSClient_ChildIterator* aIter = aStudy->NewChildIterator( aSObject );
- SALOMEDSClient_StudyBuilder* aBuilder = aStudy->NewBuilder();
- for ( ;aIter->More(); aIter->Next()) {
- SALOMEDSClient_SObject* aTblObj = aIter->Value();
- if ( aTblObj ) {
- SALOMEDSClient_GenericAttribute* anAttr;
- if (aTblObj->FindAttribute(anAttr, "AttributeName")) {
- visuGUI->CreatePlot(aTblObj);
- }
- }
- }
- }
- }
- }
- if (GET_VTK_VIEWWINDOW(myMgr)) {
- try {
- visuGUI->CreateActor(myPrs);
- } catch (...) {
- reject();
- return;
- }
- GET_VTK_VIEWWINDOW(myMgr)->onFitAll();
- }
- } else {
- visuGUI->RecreateActor(myPrs);
- if (VTKViewer_ViewWindow* vf = GET_VTK_VIEWWINDOW(myMgr)) {
- if (vf->getRenderer()->GetActors()->GetNumberOfItems() > 0) {
- vf->getRenderer()->ResetCameraClippingRange();
- vf->Repaint();
- }
- }
- // Remove old Table
- SALOMEDSClient_Study* aStudy = study()->studyDS();
- SALOMEDSClient_SObject* aSObject = aStudy->FindObjectID(myPrs->GetEntry());
- if( aSObject ) {
- SALOMEDSClient_ChildIterator* aIter = aStudy->NewChildIterator( aSObject );
- SALOMEDSClient_StudyBuilder* aBuilder = aStudy->NewBuilder();
- for ( ;aIter->More(); aIter->Next()) {
- SALOMEDSClient_SObject* aTblObj = aIter->Value();
- if ( aTblObj ) {
- SALOMEDSClient_GenericAttribute* anAttr;
- if (aTblObj->FindAttribute(anAttr, "AttributeName")) {
- aBuilder->RemoveObjectWithChildren(aIter->Value()); // We should have only one child
- break;
- }
- }
- }
- if (isGenerateTable()) {
- visuGUI->GetVisuGen()->CreateTable(aSObject->GetID().c_str());
- if (isGenerateCurves()) {
- SALOMEDSClient_Study* aStudy = study()->studyDS();
- SALOMEDSClient_ChildIterator* aIter = aStudy->NewChildIterator( aSObject );
- SALOMEDSClient_StudyBuilder* aBuilder = aStudy->NewBuilder();
- for ( ;aIter->More(); aIter->Next()) {
- SALOMEDSClient_SObject* aTblObj = aIter->Value();
- if ( aTblObj ) {
- SALOMEDSClient_GenericAttribute* anAttr;
- if (aTblObj->FindAttribute(anAttr, "AttributeName")) {
- visuGUI->CreatePlot(aTblObj);
- }
- }
- }
- }
- }
- }
- }
- VisuGUI::application()->objectBrowser()->updateTree();*/
myScalarPane->deletePreview();
deletePlanes();
QDialog::accept();
- // }
}
void VisuGUI_CutLinesDlg::reject()
app->onHelpContextModule(aVisuGUI ? app->moduleName(aVisuGUI->moduleName()) : QString(""), aHelpFileName);
}
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
SALOME_Actor* myPreviewActorGlyphs;
QCheckBox* myPreviewCheck;
QCheckBox* myAllCurvesInvertedCheck;
+ QCheckBox* myUseAbsoluteLengthCheck;
VISU::CutLines_i* myPrs;
app->onHelpContextModule(aVisuGUI ? app->moduleName(aVisuGUI->moduleName()) : QString(""), aHelpFileName);
}
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
app->onHelpContextModule(aVisuGUI ? app->moduleName(aVisuGUI->moduleName()) : QString(""), aHelpFileName);
}
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
if (app)
app->onHelpContextModule(myVisuGUI ? app->moduleName(myVisuGUI->moduleName()) : QString(""), aHelpFileName);
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
#include "CAM_Module.h"
+#ifdef WNT
+#ifdef VISU_VISUGUI_EXPORTS
+#define VISU_VISUGUI_EXPORT __declspec(dllexport)
+#else
+#define VISU_VISUGUI_EXPORT __declspec(dllimport)
+#endif
+#else
+#define VISU_VISUGUI_EXPORT
+#endif
+
extern "C" {
+VISU_VISUGUI_EXPORT
CAM_Module*
createModule()
{
if (app)
app->onHelpContextModule(app->activeModule() ? app->moduleName(app->activeModule()->moduleName()) : QString(""), aHelpFileName);
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
app->onHelpContextModule(aVisuGUI ? app->moduleName(aVisuGUI->moduleName()) : QString(""), aHelpFileName);
}
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
Storable::DataToStream(aStream,"mySubId",theSelection.mySubId);
_PTR(GenericAttribute) anAttr;
- anAttr = theStudyBuilder->FindOrCreateAttribute(aNewObj,"AttributeComment");
- _PTR(AttributeComment) aComment(anAttr);
+ anAttr = theStudyBuilder->FindOrCreateAttribute(aNewObj,"AttributeString");
+ _PTR(AttributeString) aComment(anAttr);
aComment->SetValue(aStream.str());
}
// To update selection
_PTR(GenericAttribute) anAttr;
- if(aChildSObject->FindAttribute(anAttr,"AttributeComment")){
- _PTR(AttributeComment) aComment(anAttr);
+ if(aChildSObject->FindAttribute(anAttr,"AttributeString")){
+ _PTR(AttributeString) aComment(anAttr);
QString aStream(aComment->Value().c_str());
Storable::TRestoringMap aMap;
Handle(SALOME_InteractiveObject) anIO = aListIter.Value();
_PTR(SObject) aSObject = aCStudy->FindObjectID(anIO->getEntry());
_PTR(GenericAttribute) anAttr;
- if(aSObject->FindAttribute(anAttr,"AttributeComment")){
- _PTR(AttributeComment) aComment(anAttr);
+ if(aSObject->FindAttribute(anAttr,"AttributeString")){
+ _PTR(AttributeString) aComment(anAttr);
std::string aCommentValue(aComment->Value());
if(aCommentValue.compare("myComment=GAUSSVIEW") >= 0){
aComment->SetValue(aValue.c_str());
_PTR(Study) aCStudy = GetCStudy(GetAppStudy(theModule));
_PTR(GenericAttribute) anAttr;
- if(theSObject->FindAttribute(anAttr,"AttributeComment")){
- _PTR(AttributeComment) aComment(anAttr);
+ if(theSObject->FindAttribute(anAttr,"AttributeString")){
+ _PTR(AttributeString) aComment(anAttr);
QString aStream(aComment->Value().c_str());
Storable::TRestoringMap aMap;
Storable::StrToMap(aStream,aMap);
_PTR(SObject) aSObject = aCStudy->FindObjectID(anIO->getEntry());
myConfigSObject = aSObject;
_PTR(GenericAttribute) anAttr;
- if(aSObject->FindAttribute(anAttr,"AttributeComment")){
- _PTR(AttributeComment) aComment(anAttr);
+ if(aSObject->FindAttribute(anAttr,"AttributeString")){
+ _PTR(AttributeString) aComment(anAttr);
QString aStream(aComment->Value().c_str());
Storable::TRestoringMap aMap;
Storable::StrToMap(aStream,aMap);
app->onHelpContextModule(aVisuGUI ? app->moduleName(aVisuGUI->moduleName()) : QString(""), aHelpFileName);
}
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
if (app)
app->onHelpContextModule(myModule ? app->moduleName(myModule->moduleName()) : QString(""), aHelpFileName);
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
app->onHelpContextModule(aVisuGUI ? app->moduleName(aVisuGUI->moduleName()) : QString(""), aHelpFileName);
}
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
ENUM2STRING( aResStr, VISU::TCURVE );
ENUM2STRING( aResStr, VISU::TCONTAINER );
ENUM2STRING( aResStr, VISU::TMESH );
- ENUM2STRING( aResStr, VISU::TSCALARMAP );
+ ENUM2STRING( aResStr, VISU::TPRSMERGER );
ENUM2STRING( aResStr, VISU::TISOSURFACE );
ENUM2STRING( aResStr, VISU::TDEFORMEDSHAPE );
ENUM2STRING( aResStr, VISU::TSCALARMAPONDEFORMEDSHAPE );
#include "VisuGUI_ViewTools.h"
#include "VisuGUI_DialogRunner.h"
+#include <SPlot2d_ViewWindow.h>
+
#include <vtkRenderer.h>
namespace VISU
if (aPrs3d) {
SUIT_ResourceMgr* aResourceMgr = GetResourceMgr();
int aValue = aResourceMgr->integerValue("VISU","BuildDefaultPrs3d",0);
+ if(aResourceMgr->booleanValue("VISU","display_only",false)){
+ theModule->OnEraseAll();
+ }
+
if (!aValue) {
if (TDlg* aDlg = new TDlg(theModule)) { // dialog box in creation mode
aDlg->initFromPrsObject(aPrs3d);
if (runAndWait(aDlg,IsDlgModal) && (aDlg->storeToPrsObject(aPrs3d))) {
+ if(aResourceMgr->booleanValue("VISU","display_only",false)){
+ if(SPlot2d_Viewer* aPlot2d = GetPlot2dViewer(theModule, false)) aPlot2d->EraseAll();
+ }
// Optionally, create table and curves for cut lines
QApplication::setOverrideCursor(Qt::waitCursor);
CreateCurves( theModule,
#include "VISUConfig.hh"
#include "VISU_Convertor.hxx"
-#include "VISU_ScalarMapPL.hxx"
-#include "VISU_ScalarMap_i.hh"
#include "VISU_ScalarMapAct.h"
+#include "VISU_Result_i.hh"
#include "LightApp_Application.h"
#include <vtkTextProperty.h>
+using namespace VISU;
using namespace std;
setSpacing(6);
//setMargin(11);
+ // Presentation type ================================================
+ myMainGroupBox = new QGroupBox(tr(""), this, "myMainGroupBox");
+ myMainGroupBox->setColumnLayout(0, Qt::Vertical );
+ myMainGroupBox->layout()->setSpacing( 0 );
+ myMainGroupBox->layout()->setMargin( 0 );
+ QGridLayout* aMainGroupBoxLayout = new QGridLayout( myMainGroupBox->layout() );
+ myMainGroupBox->setAlignment( Qt::AlignTop );
+ aMainGroupBoxLayout->setSpacing( 6 );
+ aMainGroupBoxLayout->setMargin( 11 );
+
+ myOnGroupsCB = new QCheckBox (tr("PRS_ON_GROUPS"), myMainGroupBox);
+ myOnGroupsCB->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+ // Lists of groups and add/remove buttons
+ QPixmap addImage ( aResourceMgr->loadPixmap("VISU", tr("ICON_ADD")));
+ QPixmap removeImage ( aResourceMgr->loadPixmap("VISU", tr("ICON_REMOVE")));
+
+ myAllGroups = new VisuGUI_ListBox(myMainGroupBox, "myAllGroups");
+ myAllGroups->setSelectionMode(QListBox::Extended);
+
+ myAddButton = new QToolButton(myMainGroupBox);
+ myAddButton->setPixmap( addImage );
+
+ myRemoveButton = new QToolButton(myMainGroupBox);
+ myRemoveButton->setPixmap( removeImage );
+
+ mySelectedGroups = new VisuGUI_ListBox(myMainGroupBox, "mySelectedGroups");
+ mySelectedGroups->setSelectionMode(QListBox::Extended);
+
+ // Layouting
+ QVBoxLayout* buttonsLayout = new QVBoxLayout();
+ buttonsLayout->addWidget(myAddButton);
+ buttonsLayout->addSpacing(6);
+ buttonsLayout->addWidget(myRemoveButton);
+ buttonsLayout->addStretch();
+
+ aMainGroupBoxLayout->addMultiCellWidget( myOnGroupsCB, 0, 0, 0, 2);
+ aMainGroupBoxLayout->addWidget( myAllGroups, 1, 0 );
+ aMainGroupBoxLayout->addLayout( buttonsLayout, 1, 1 );
+ aMainGroupBoxLayout->addWidget( mySelectedGroups, 1, 2 );
+ aMainGroupBoxLayout->setRowStretch(1, 10);
+
+ mySelectedGroups->installEventFilter(this);
+
// Range ============================================================
RangeGroup = new QButtonGroup (tr("SCALAR_RANGE_GRP"), this, "RangeGroup");
RangeGroup->setColumnLayout(0, Qt::Vertical );
CheckGroupLayout->addWidget(myPreviewCheck , 0, 0 );
// signals and slots connections ===========================================
+ connect( myOnGroupsCB, SIGNAL( toggled( bool ) ), this, SLOT( onTypeChanged() ) );
+ connect( myAllGroups, SIGNAL( doubleClicked( QListBoxItem* ) ), this, SLOT( onListDoubleClicked( QListBoxItem* ) ) );
+ connect( mySelectedGroups, SIGNAL( doubleClicked( QListBoxItem* ) ), this, SLOT( onListDoubleClicked( QListBoxItem* ) ) );
+ connect( myAddButton, SIGNAL(clicked()), this, SLOT(onAdd()));
+ connect( myRemoveButton, SIGNAL(clicked()), this, SLOT(onRemove()));
connect( RangeGroup, SIGNAL( clicked( int ) ), this, SLOT( changeRange( int ) ) );
connect( myModeCombo, SIGNAL( activated( int ) ), this, SLOT( changeScalarMode( int ) ) );
connect( OrientGroup, SIGNAL( clicked( int ) ), this, SLOT( changeDefaults( int ) ) );
connect( WidthSpin, SIGNAL( valueChanged( double ) ), this, SLOT( updatePreview() ));
connect( HeightSpin, SIGNAL( valueChanged( double ) ), this, SLOT( updatePreview() ));
connect( CBLog, SIGNAL( toggled( bool ) ), this, SLOT( updatePreview() ));
+ onTypeChanged();
changeRange( 0 );
changeDefaults( 0 );
myIsStoreTextProp = false;
/**
* Initialise dialog box from presentation object
*/
-void VisuGUI_ScalarBarPane::initFromPrsObject(VISU::ScalarMap_i* thePrs) {
+void VisuGUI_ScalarBarPane::initFromPrsObject(VISU::PrsMerger_i* thePrs) {
initFromResources();
myScalarMap = thePrs;
+
+ // type of presentation and groups
+ VISU::Result_i* theResult = myScalarMap->GetResult();
+ VISU_Convertor* aInput = theResult->GetInput();
+
+ const VISU::TMeshMap& aMeshMap = aInput->GetMeshMap();
+
+ VISU::TMeshMap::const_iterator aMeshIter = aMeshMap.find(thePrs->GetMeshName());
+ if(aMeshIter!=aMeshMap.end()){
+ const PMesh& aMesh = aMeshIter->second;
+ const TGroupMap& aGroupMap = aMesh->myGroupMap;
+ TGroupMap::const_iterator aGroupIter = aGroupMap.begin();
+ for(;aGroupIter!=aGroupMap.end();aGroupIter++)
+ {
+ const string& aGroupName = aGroupIter->first;
+ if(thePrs->CheckGroup(&aGroupName[0]))
+ myAllGroups->insertItem( QString(aGroupName) );
+ }
+ }
+
+ if (myAllGroups->count() < 1)
+ {
+ myAllGroups->insertItem( tr("NO_GROUPS") );
+ myMainGroupBox->setEnabled(false);
+ }
+ else
+ {
+ // Get names of the groups
+ string_array_var aGroupNames = thePrs->getGroupNames();
+ for(int i=0; i<aGroupNames->length(); i++)
+ mySelectedGroups->insertItem( QString(aGroupNames[i]) );
+
+ if (mySelectedGroups->count() > 0)
+ myOnGroupsCB->setChecked(true);
+ }
+
+ //
myTitle = thePrs->GetTitle();
setPosAndSize( thePrs->GetPosX(),
thePrs->GetPosY(),
setLogarithmic(false);
}
vtkFloatingPointType aRange[2];
- thePrs->GetScalarMapPL()->GetSourceRange(aRange);
+ thePrs->GetPrsMergerPL()->GetSourceRange(aRange);
Rmin = aRange[0]; Rmax = aRange[1];
setRange( thePrs->GetMin(), thePrs->GetMax(),
/*0.0, 0.0,*/ thePrs->IsRangeFixed() );
if (myScalarMap == NULL) return;
if (!check()) return;
- myScalarMapPL = VISU_ScalarMapPL::New();
- if(myScalarMap->GetScalarMapPL())
- myScalarMapPL->ShallowCopy(myScalarMap->GetScalarMapPL());
+ myScalarMapPL = VISU_PrsMergerPL::New();
+ if(myScalarMap->GetPrsMergerPL())
+ myScalarMapPL->ShallowCopy(myScalarMap->GetPrsMergerPL());
if ( myBusy ) return;
if (SVTK_ViewWindow* vf = VISU::GetActiveViewWindow<SVTK_ViewWindow>())
vf->Repaint();
}
+
+/*!
+ Event filter
+*/
+bool VisuGUI_ScalarBarPane::eventFilter (QObject* object, QEvent* event)
+{
+ if (event->type() == QEvent::KeyPress) {
+ QKeyEvent* aKeyEvent = (QKeyEvent*)event;
+ if (object == mySelectedGroups && aKeyEvent->key() == Key_Delete)
+ onRemove();
+ }
+ return QObject::eventFilter(object, event);
+}
+
/**
* Store values to presentation object
*/
-int VisuGUI_ScalarBarPane::storeToPrsObject(VISU::ScalarMap_i* thePrs) {
+int VisuGUI_ScalarBarPane::storeToPrsObject(VISU::PrsMerger_i* thePrs) {
+ thePrs->RemoveAllGeom();
+
+ if (myOnGroupsCB->isChecked())
+ {
+ QString aMeshName = thePrs->GetMeshName();
+ for (int i = 0; i < mySelectedGroups->count(); i++)
+ thePrs->AddMeshOnGroup( aMeshName , mySelectedGroups->text(i) );
+ }
+
thePrs->SetScalarMode(myModeCombo->currentItem());
thePrs->SetPosition(XSpin->value(), YSpin->value());
thePrs->SetSize(WidthSpin->value(), HeightSpin->value());
return 1;
}
+/*!
+ Called when the checkbox is toggled
+*/
+void VisuGUI_ScalarBarPane::onTypeChanged( )
+{
+ bool toEnable = myOnGroupsCB->isChecked();
+ if (!toEnable)
+ {
+ myAllGroups->clearSelection();
+ mySelectedGroups->clearSelection();
+ }
+ myAllGroups->setEnabled( toEnable );
+ mySelectedGroups->setEnabled( toEnable );
+ myAddButton->setEnabled( toEnable );
+ myRemoveButton->setEnabled( toEnable );
+}
+
+/*!
+ Called when add button is clicked, adds item to choosen groups
+*/
+void VisuGUI_ScalarBarPane::onAdd()
+{
+ QStringList aList;
+
+ for (int i = 0; i < myAllGroups->count(); i++)
+ if (myAllGroups->isSelected(i))
+ aList.append(myAllGroups->text(i));
+
+ for (int i = 0; i < mySelectedGroups->count(); i++)
+ aList.remove(mySelectedGroups->text(i));
+
+ mySelectedGroups->insertStringList(aList);
+}
+
+/*!
+ Called when remove button is clicked, remove selected items from choosen
+*/
+void VisuGUI_ScalarBarPane::onRemove()
+{
+ QPtrList<QListBoxItem> aList;
+ aList.setAutoDelete(false);
+ for (int i = 0; i < mySelectedGroups->count(); i++)
+ if (mySelectedGroups->isSelected(i))
+ aList.append(mySelectedGroups->item(i));
+
+ for (int i = 0; i < aList.count(); i++)
+ delete aList.at(i);
+}
+
+/*!
+ Called when an item of listbox is double-clicked
+*/
+void VisuGUI_ScalarBarPane::onListDoubleClicked( QListBoxItem* theItem )
+{
+ QListBox* aListBox = theItem->listBox();
+
+ if (aListBox == myAllGroups)
+ {
+ if (!mySelectedGroups->findItem( theItem->text(), Qt::ExactMatch ))
+ mySelectedGroups->insertItem(theItem->text());
+ }
+ else if (aListBox == mySelectedGroups)
+ delete theItem;
+}
+
/*!
Called when orientation is changed
*/
vtkFloatingPointType aRange[2];
int aMode = myScalarMap->GetScalarMode();
myScalarMap->SetScalarMode(theMode);
- myScalarMap->GetScalarMapPL()->GetSourceRange(aRange);
+ myScalarMap->GetPrsMergerPL()->GetSourceRange(aRange);
MinEdit->setText( QString::number( aRange[0] ) );
MaxEdit->setText( QString::number( aRange[1] ) );
myScalarMap->SetScalarMode(aMode);
connect( buttonHelp, SIGNAL( clicked() ), this, SLOT( onHelp() ) );
}
+/*!
+ Set values in the dialog from the presentation
+*/
+void VisuGUI_ScalarBarDlg::initFromPrsObject(VISU::PrsMerger_i* thePrs)
+{
+ myScalarPane->initFromPrsObject(thePrs);
+}
+
+/*!
+ Set values to presentation from the dialog
+*/
+int VisuGUI_ScalarBarDlg::storeToPrsObject(VISU::PrsMerger_i* thePrs)
+{
+ return myScalarPane->storeToPrsObject(thePrs);
+}
+
/*!
Called when <OK> button is clicked, validates data and closes dialog
*/
app->onHelpContextModule(aVisuGUI ? app->moduleName(aVisuGUI->moduleName()) : QString(""), aHelpFileName);
}
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
onHelp();
}
}
+
+
#include <qtoolbutton.h>
#include "QtxDblSpinBox.h"
+#include "QtxListBox.h"
-#include "VISU_ScalarMap_i.hh"
+#include "VISU_PrsMerger_i.hh"
class QButtonGroup;
class QGroupBox;
class QVBox;
class QToolButton;
-class QtxDblSpinBox;
+class QListBoxItem;
class SalomeApp_Module;
class SVTK_FontWidget;
class VISU_ScalarMapAct;
};
+class VisuGUI_ListBox: public QtxListBox
+{
+ Q_OBJECT;
+
+ public:
+ VisuGUI_ListBox( QWidget * parent = 0, const char * name = 0, WFlags f = 0 )
+ : QtxListBox(parent, name, f) {};
+ ~VisuGUI_ListBox() {};
+
+ virtual QSize sizeHint() const { return minimumSizeHint(); };
+};
+
+
class VisuGUI_ScalarBarPane : public QVBox
{
Q_OBJECT;
void initFromResources();
void storeToResources();
- void initFromPrsObject(VISU::ScalarMap_i* thePrs);
- int storeToPrsObject(VISU::ScalarMap_i* thePrs);
+ void initFromPrsObject(VISU::PrsMerger_i* thePrs);
+ int storeToPrsObject(VISU::PrsMerger_i* thePrs);
bool check();
void deletePreview();
+ bool eventFilter (QObject* object, QEvent* event);
+
protected:
+ QGroupBox* myMainGroupBox;
+ QCheckBox* myOnGroupsCB;
+ VisuGUI_ListBox* myAllGroups;
+ VisuGUI_ListBox* mySelectedGroups;
+ QToolButton* myAddButton;
+ QToolButton* myRemoveButton;
+
QButtonGroup* RangeGroup;
QRadioButton* RBFrange;
QRadioButton* RBIrange;
bool myIsStoreTextProp;
private slots:
+ void onTypeChanged();
+ void onListDoubleClicked( QListBoxItem* theItem );
+ void onAdd();
+ void onRemove();
+
void changeDefaults( int );
void changeRange( int );
void XYChanged( double );
QCheckBox* myPreviewCheck;
VISU_ScalarMapAct* myPreviewActor;
- VISU::ScalarMap_i* myScalarMap;
- VISU_ScalarMapPL* myScalarMapPL;
+ VISU::PrsMerger_i* myScalarMap;
+ VISU_PrsMergerPL* myScalarMapPL;
std::string myTitle;
bool myBusy;
void initFromResources() {myScalarPane->initFromResources();}
void storeToResources() {myScalarPane->storeToResources();}
- void initFromPrsObject(VISU::ScalarMap_i* thePrs) {myScalarPane->initFromPrsObject(thePrs);}
- int storeToPrsObject(VISU::ScalarMap_i* thePrs) {return myScalarPane->storeToPrsObject(thePrs);}
+ void initFromPrsObject(VISU::PrsMerger_i* thePrs);
+ int storeToPrsObject(VISU::PrsMerger_i* thePrs);
private:
void keyPressEvent( QKeyEvent* e );
#include "SALOME_ListIO.hxx"
-#include "SALOMEDSClient_AttributeComment.hxx"
+#include "SALOMEDSClient_AttributeString.hxx"
#include "SALOMEDSClient_AttributeName.hxx"
#include <qlayout.h>
_PTR(SObject) aSObject = aActiveStudy->FindObjectID(aIO->getEntry());
_PTR(GenericAttribute) anTmpAttr;
- if (aSObject->FindAttribute(anTmpAttr, "AttributeComment")) {
- _PTR(AttributeComment) aTmpComment (anTmpAttr);
+ if (aSObject->FindAttribute(anTmpAttr, "AttributeString")) {
+ _PTR(AttributeString) aTmpComment (anTmpAttr);
string aTmpComm = aTmpComment->Value();
QString aTmpstrIn (aTmpComm.c_str());
VISU::Storable::TRestoringMap aTmpaMap;
CORBA::Object_var aChildObject = VISU::ClientSObjectToObject(aChildSObj);
_PTR(GenericAttribute) anAttr;
- if (aChildSObj->FindAttribute(anAttr, "AttributeComment")) {
- _PTR(AttributeComment) aComment (anAttr);
+ if (aChildSObj->FindAttribute(anAttr, "AttributeString")) {
+ _PTR(AttributeString) aComment (anAttr);
string aComm = aComment->Value();
QString strIn (aComm.c_str());
VISU::Storable::TRestoringMap aMap;
if (app)
app->onHelpContextModule(myVisuGUI ? app->moduleName(myVisuGUI->moduleName()) : QString(""), aHelpFileName);
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
myVectorValLbl = new QLabel ("", aDataGrp);
myVectorValLbl->setMinimumWidth(150);
- QGroupBox* aCoordGrp = new QGroupBox (2, Qt::Horizontal, "Coordinates", myPointsPane);
+ QGroupBox* aCoordGrp = new QGroupBox (4, Qt::Horizontal, "Coordinates", myPointsPane);
aCoordGrp->layout()->setSpacing(6);
new QLabel ("X:", aCoordGrp);
myXValLbl = new QLabel ("", aCoordGrp);
+ //ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ new QLabel ("I:", aCoordGrp);
+ myIValLbl = new QLabel ("-", aCoordGrp);
+ //ENK: 23.11.2006
new QLabel ("Y:", aCoordGrp);
myYValLbl = new QLabel ("", aCoordGrp);
+ //ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ new QLabel ("J:", aCoordGrp);
+ myJValLbl = new QLabel ("-", aCoordGrp);
+ //ENK: 23.11.2006
new QLabel ("Z:",aCoordGrp );
myZValLbl = new QLabel ("", aCoordGrp);
+ //ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ new QLabel ("K:", aCoordGrp);
+ myKValLbl = new QLabel ("-", aCoordGrp);
+ //ENK: 23.11.2006
myWidgetStack->addWidget(myPointsPane, 0);
myListPoints = new QTable (myCellsPane);
myListPoints->setReadOnly(true);
- myListPoints->setNumCols(6);
+ myListPoints->setNumCols(9);
myListPoints->setNumRows(0);
myListPoints->setColumnWidth(0, 40);
myListPoints->setColumnWidth(1, 40);
myListPoints->setColumnWidth(2, 40);
myListPoints->setColumnWidth(3, 40);
+ myListPoints->setColumnWidth(4, 40);//ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ myListPoints->setColumnWidth(5, 40);//ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ myListPoints->setColumnWidth(6, 40);//ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
myListPoints->setSelectionMode(QTable::NoSelection);
QHeader* aHeader = myListPoints->horizontalHeader();
aHeader->setLabel( 0, "ID" );
aHeader->setLabel( 1, "X" );
aHeader->setLabel( 2, "Y" );
aHeader->setLabel( 3, "Z" );
- aHeader->setLabel( 4, "Scalar" );
- aHeader->setLabel( 5, "Vector" );
+ aHeader->setLabel( 4, "I" );//ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ aHeader->setLabel( 5, "J" );//ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ aHeader->setLabel( 6, "K" );//ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ aHeader->setLabel( 7, "Scalar" );
+ aHeader->setLabel( 8, "Vector" );
aCellLayout->addWidget(myListPoints, 1, 0);
VISU::Storable::TRestoringMap aMap;
if (aSObject) {
_PTR(GenericAttribute) anAttr;
- if (aSObject->FindAttribute(anAttr, "AttributeComment")) {
- _PTR(AttributeComment) aComment (anAttr);
+ if (aSObject->FindAttribute(anAttr, "AttributeString")) {
+ _PTR(AttributeString) aComment (anAttr);
std::string aString = aComment->Value();
QString strIn( aString.c_str() );
VISU::Storable::StrToMap(strIn, aMap);
myIDValLbl->setText( QString::number(anID) );
myScalarValLbl->setText(getValue(aPntData, aVTKID));
myVectorValLbl->setText(getVector(aPntData, aVTKID));
+ //ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ const VISU::PIDMapper& aMapper = aPrs3d->GetPL()->GetIDMapper();
+ VISU::TIdTypeVector aVec = aMapper->GetIndexesOfNode(anID);
+ switch(aVec.size()){
+ case 3:
+ myKValLbl->setText(QString::number(aVec[2]));
+ case 2:
+ myJValLbl->setText(QString::number(aVec[1]));
+ case 1:
+ myIValLbl->setText(QString::number(aVec[0]));
+ break;
+ default:
+ myIValLbl->setText("-");
+ myJValLbl->setText("-");
+ myKValLbl->setText("-");
+ }
+ //ENK: 23.11.2006
}
break;
case 1:
myListPoints->setNumRows(aPointsMap.size());
PointsMap::const_iterator It = aPointsMap.begin();
+
+ const VISU::PIDMapper& aMapper = aPrs3d->GetPL()->GetIDMapper();
for (int i = 0; It != aPointsMap.end() && i < myListPoints->numRows(); It++, i++) {
myListPoints->verticalHeader()->setLabel(i, QString::number( i ));
int id = It->first;
+ //ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ VISU::TIdTypeVector aVec = aMapper->GetIndexesOfNode(id);
+ QString aI,aJ,aK;
+ aI = "-";
+ aJ = "-";
+ aK = "-";
+ switch(aVec.size()){
+ case 3:
+ aK = QString::number(aVec[2]);
+ case 2:
+ aJ = QString::number(aVec[1]);
+ case 1:
+ aI = QString::number(aVec[0]);
+ break;
+ }
+ //ENK: 23.11.2006
+
myListPoints->setText(i, 0, QString::number( id ));
vtkFloatingPointType* aCoord = It->second;
myListPoints->setText(i, 1, QString::number( aCoord[0] ));
myListPoints->setText(i, 2, QString::number( aCoord[1] ));
myListPoints->setText(i, 3, QString::number( aCoord[2] ));
- myListPoints->setText(i, 4, getValue(aPntData, id));
- myListPoints->setText(i, 5, getVector(aPntData, id));
+ myListPoints->setText(i, 4, aI);//ENK: 23.11.2006 - PAL13176
+ myListPoints->setText(i, 5, aJ);//ENK: 23.11.2006 - PAL13176
+ myListPoints->setText(i, 6, aK);//ENK: 23.11.2006 - PAL13176
+ myListPoints->setText(i, 7, getValue(aPntData, id));
+ myListPoints->setText(i, 8, getVector(aPntData, id));
}
}
} else {
myXValLbl->setText( "" );
myYValLbl->setText( "" );
myZValLbl->setText( "" );
+ myIValLbl->setText( "-" );//ENK: 23.11.2006 - PAL13176
+ myJValLbl->setText( "-" );//ENK: 23.11.2006 - PAL13176
+ myKValLbl->setText( "-" );//ENK: 23.11.2006 - PAL13176
myIDValLbl->setText( "" );
myScalarValLbl->setText("");
myVectorValLbl->setText("");
if (app)
app->onHelpContextModule(myModule ? app->moduleName(myModule->moduleName()) : QString(""), aHelpFileName);
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
QLabel* myXValLbl;
QLabel* myYValLbl;
QLabel* myZValLbl;
+ //ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ QLabel* myIValLbl; //!< used for structured mesh selection
+ QLabel* myJValLbl; //!< used for structured mesh selection
+ QLabel* myKValLbl; //!< used for structured mesh selection
+ //ENK: 23.11.2006
QLineEdit* myIDValLbl;
QLabel* myScalarValLbl;
app->onHelpContextModule(aVisuGUI ? app->moduleName(aVisuGUI->moduleName()) : QString(""), aHelpFileName);
}
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
_PTR(SObject) aSObject = aActiveStudy->FindObjectID(aIO->getEntry());
_PTR(GenericAttribute) anTmpAttr;
- if (aSObject->FindAttribute(anTmpAttr, "AttributeComment")) {
- _PTR(AttributeComment) aTmpComment (anTmpAttr);
+ if (aSObject->FindAttribute(anTmpAttr, "AttributeString")) {
+ _PTR(AttributeString) aTmpComment (anTmpAttr);
string aTmpComm = aTmpComment->Value();
QString aTmpstrIn (aTmpComm.c_str());
VISU::Storable::TRestoringMap aTmpaMap;
}
_PTR(GenericAttribute) anAttr;
- if (aChildSObj->FindAttribute(anAttr, "AttributeComment")) {
- _PTR(AttributeComment) aComment (anAttr);
+ if (aChildSObj->FindAttribute(anAttr, "AttributeString")) {
+ _PTR(AttributeString) aComment (anAttr);
string aComm = aComment->Value();
QString strIn (aComm.c_str());
VISU::Storable::TRestoringMap aMap;
for (aIter->InitEx(true); aIter->More(); aIter->Next() ) {
SALOMEDSClient_SObject* aChildSObj = aIter->Value();
SALOMEDSClient_GenericAttribute* anAttr;
- if (aChildSObj->FindAttribute(anAttr, "AttributeComment")) {
- SALOMEDSClient_AttributeComment* aComment = dynamic_cast<SALOMEDSClient_AttributeComment*>( anAttr );
+ if (aChildSObj->FindAttribute(anAttr, "AttributeString")) {
+ SALOMEDSClient_AttributeString* aComment = dynamic_cast<SALOMEDSClient_AttributeString*>( anAttr );
CORBA::String_var aComm = aComment->Value().c_str();
QString strIn(aComm.in());
aMap.clear();
if (app)
app->onHelpContextModule(myVisuGUI ? app->moduleName(myVisuGUI->moduleName()) : QString(""), aHelpFileName);
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
double aMaxTime = myAnimator->getMaxTime();
double aMinTime = myAnimator->getMinTime();
- double aStep = (aMaxTime - aMinTime) / (myAnimator->getFieldData(0).myNbTimes - 1);
+ double aStep;
+ if ( myAnimator->getAnimationMode() == 0 )
+ aStep = (aMaxTime - aMinTime) / (myAnimator->getFieldData(0).myNbTimes - 1);
+ else { // succcessive animation mode
+ std::pair<int,long> aLastFieldFrame(myAnimator->getNbFields() - 1,
+ myAnimator->getFieldData(myAnimator->getNbFields() - 1).myNbTimes - 1);
+ aStep = (aMaxTime - aMinTime) / myAnimator->getAbsoluteFrameNumber(aLastFieldFrame);
+ }
QLabel* aMinLbl = new QLabel("From", aRangeGrp);
aMinLbl->setEnabled(myUseRangeChk->isChecked());
// Find names of fields
for (int i = 0; i < myAnimator->getNbFields(); i++) {
_PTR(SObject) aSO = myAnimator->getFieldData(i).myField;
- aFieldNames.append(VISU::getValue(aSO, "myName"));
+ QString aFieldName(VISU::getValue(aSO, "myName"));
+ if ( myAnimator->getAnimationMode() == 0 )
+ aFieldNames.append(aFieldName);
+ else if ( myAnimator->getAnimationMode() == 1 ) {
+ QString aFileName(VISU::getValue(aSO->GetFather()->GetFather()->GetFather(),"myInitFileName"));
+ aFileName = aFileName.right(aFileName.length() - (aFileName.findRev("/") + 1));
+ aFieldNames.append(aFileName + QString(" : ") + aFieldName);
+ }
}
myFieldLst->insertStringList(aFieldNames);
- myFieldLst->setSelected(0, true);
- connect( myFieldLst, SIGNAL( highlighted(int) ),
- this, SLOT( onFieldChange(int) ) );
-
-
- QVBox* aSetupBox = new QVBox(aPropFrame);
+
+ if ( myAnimator->getAnimationMode() == 0 ) {
+ myFieldLst->setSelected(0, true);
+ connect( myFieldLst, SIGNAL( highlighted(int) ),
+ this, SLOT( onFieldChange(int) ) );
+ }
+ else if ( myAnimator->getAnimationMode() == 1 )
+ myFieldLst->setSelectionMode(QListBox::NoSelection);
+
+ QVBox* aSetupBox = new QVBox(aPropFrame);
aSetupBox->setSpacing(5);
QVGroupBox* aPropBox = new QVGroupBox("Properties", aSetupBox);
connect( myPropBtn, SIGNAL( clicked() ),
this, SLOT( onPreferencesDlg() ) );
- if (myAnimator->getNbFields() > 1) {
+ if (myAnimator->getNbFields() > 1 && myAnimator->getAnimationMode() == 0) {
myArrangeBtn = new QPushButton("Arrange...", aSetupBox);
connect( myArrangeBtn, SIGNAL( clicked() ), this, SLOT( onArrangeDlg() ) );
}
//------------------------------------------------------------------------
void SetupDlg::onFieldChange (int theIndex)
{
- FieldData& aData = myAnimator->getFieldData(theIndex);
myTypeCombo->clear();
myTypeId2ComboId.clear();
myComboId2TypeId.clear();
myTypeId2ComboId[TPLOT3D_ITEM] = myComboId2TypeId.size();
myComboId2TypeId.push_back(TPLOT3D_ITEM);;
- _PTR(SObject) aSObject = aData.myField;
- long aNumComp = VISU::getValue(aSObject, "myNumComponent").toLong();
- if (aNumComp > 1) {
+ bool anEnableItems = false;
+ bool anEnableGP = false;
+ VISU::VISUType aPrsType;
+ if ( myAnimator->getAnimationMode() == 0 ) { // parallel animation mode
+
+ FieldData& aData = myAnimator->getFieldData(theIndex);
+ _PTR(SObject) aSObject = aData.myField;
+ long aNumComp = VISU::getValue(aSObject, "myNumComponent").toLong();
+ anEnableItems = (aNumComp > 1);
+
+ long anEntityId = VISU::getValue(aSObject, "myEntityId").toLong();
+ anEnableGP = (anEntityId == VISU::CELL);
+
+ aPrsType = aData.myPrsType;
+
+ }
+ else if ( myAnimator->getAnimationMode() == 1 ) { // succcessive animation mode
+
+ for (int i = 0; i < myAnimator->getNbFields(); i++) {
+ _PTR(SObject) aSO = myAnimator->getFieldData(i).myField;
+ long aNumComp = VISU::getValue(aSO, "myNumComponent").toLong();
+ anEnableItems = (aNumComp > 1);
+
+ long anEntityId = VISU::getValue(aSO, "myEntityId").toLong();
+ anEnableGP = (anEntityId == VISU::CELL);
+
+ if ( !anEnableItems && !anEnableGP ) break;
+ }
+
+ aPrsType = myAnimator->getFieldData(0).myPrsType;
+
+ }
+
+ if (anEnableItems) {
myTypeCombo->insertItem("Deformed Shape"); // item 5
myTypeId2ComboId[TDEFORMEDSHAPE_ITEM] = myComboId2TypeId.size();
myComboId2TypeId.push_back(TDEFORMEDSHAPE_ITEM);;
myComboId2TypeId.push_back(TSCALARMAPONDEFORMEDSHAPE_ITEM);;
}
- long anEntityId = VISU::getValue(aSObject, "myEntityId").toLong();
- if(anEntityId == VISU::CELL){
+ if(anEnableGP){
myTypeCombo->insertItem("Gauss Points"); // item 8
myTypeId2ComboId[TGAUSSPOINTS_ITEM] = myComboId2TypeId.size();
myComboId2TypeId.push_back(TGAUSSPOINTS_ITEM);;
}
- switch (aData.myPrsType) {
- case VISU::TSCALARMAP: //Scalar Map
+ switch (aPrsType) {
+ case VISU::TPRSMERGER: //Scalar Map
myTypeCombo->setCurrentItem(myTypeId2ComboId[TSCALARMAP_ITEM]);
break;
case VISU::TISOSURFACE: //Iso Surfaces
//------------------------------------------------------------------------
void SetupDlg::onTypeChanged (int theIndex)
{
- FieldData& aData = myAnimator->getFieldData(myFieldLst->currentItem());
int aType = myComboId2TypeId[theIndex];
- switch (aType) {
- case TSCALARMAP_ITEM: //Scalar Map
- aData.myPrsType = VISU::TSCALARMAP;
- break;
- case TISOSURFACE_ITEM: //Iso Surfaces
- aData.myPrsType = VISU::TISOSURFACE;
- break;
- case TCUTPLANES_ITEM: //Cut Planes
- aData.myPrsType = VISU::TCUTPLANES;
- break;
- case TCUTLINES_ITEM: //Cut Lines
- aData.myPrsType = VISU::TCUTLINES;
- break;
- case TPLOT3D_ITEM: //Plot 3D
- aData.myPrsType = VISU::TPLOT3D;
- break;
- case TDEFORMEDSHAPE_ITEM: //Deformed Shape
- aData.myPrsType = VISU::TDEFORMEDSHAPE;
- break;
- case TSCALARMAPONDEFORMEDSHAPE_ITEM: //Scalar Map on Deformed Shape
- aData.myPrsType = VISU::TSCALARMAPONDEFORMEDSHAPE;
- break;
- case TVECTORS_ITEM: //Vectors
- aData.myPrsType = VISU::TVECTORS;
- break;
- case TSTREAMLINES_ITEM: //Stream Lines
- aData.myPrsType = VISU::TSTREAMLINES;
- break;
- case TGAUSSPOINTS_ITEM: //Gauss Points
- aData.myPrsType = VISU::TGAUSSPOINTS;
- break;
+
+ for (int i = 0; i < myAnimator->getNbFields(); i++) {
+ FieldData& aData = ( myAnimator->getAnimationMode() == 0 ) ?
+ myAnimator->getFieldData(myFieldLst->currentItem()) :
+ myAnimator->getFieldData(i);
+
+ switch (aType) {
+ case TSCALARMAP_ITEM: //Scalar Map
+ aData.myPrsType = VISU::TPRSMERGER;
+ break;
+ case TISOSURFACE_ITEM: //Iso Surfaces
+ aData.myPrsType = VISU::TISOSURFACE;
+ break;
+ case TCUTPLANES_ITEM: //Cut Planes
+ aData.myPrsType = VISU::TCUTPLANES;
+ break;
+ case TCUTLINES_ITEM: //Cut Lines
+ aData.myPrsType = VISU::TCUTLINES;
+ break;
+ case TPLOT3D_ITEM: //Plot 3D
+ aData.myPrsType = VISU::TPLOT3D;
+ break;
+ case TDEFORMEDSHAPE_ITEM: //Deformed Shape
+ aData.myPrsType = VISU::TDEFORMEDSHAPE;
+ break;
+ case TSCALARMAPONDEFORMEDSHAPE_ITEM: //Scalar Map on Deformed Shape
+ aData.myPrsType = VISU::TSCALARMAPONDEFORMEDSHAPE;
+ break;
+ case TVECTORS_ITEM: //Vectors
+ aData.myPrsType = VISU::TVECTORS;
+ break;
+ case TSTREAMLINES_ITEM: //Stream Lines
+ aData.myPrsType = VISU::TSTREAMLINES;
+ break;
+ case TGAUSSPOINTS_ITEM: //Gauss Points
+ aData.myPrsType = VISU::TGAUSSPOINTS;
+ break;
+ }
+ myAnimator->clearData(aData);
+
+ if ( myAnimator->getAnimationMode() == 0 ) // parallel animation mode
+ break;
}
- myAnimator->clearData(aData);
//myPropBtn->setEnabled(aData.myPrsType != VISU::TSCALARMAP);
//myAnimator->generatePresentations(myFieldLst->currentItem());
}
template<class TPrs3d, class TDialog>
void
EditPrs(VisuGUI* theModule,
- FieldData& theData)
+ FieldData& theData,
+ VISU_TimeAnimation* theAnimator)
{
TDialog* aDlg = new TDialog(theModule);
aDlg->initFromPrsObject(dynamic_cast<TPrs3d*>(theData.myPrs[0]));
- if (aDlg->exec())
+ if (aDlg->exec()) {
for (int i = 0; i < theData.myNbFrames; i++)
aDlg->storeToPrsObject(dynamic_cast<TPrs3d*>(theData.myPrs[i]));
+ if ( theAnimator->getAnimationMode() == 1 ) {
+ for (int i = 1; i < theAnimator->getNbFields(); i++) {
+ for (int j = 0; j < theAnimator->getFieldData(i).myNbFrames; j++)
+ aDlg->storeToPrsObject(dynamic_cast<TPrs3d*>(theAnimator->getFieldData(i).myPrs[j]));
+ }
+ }
+ }
delete aDlg;
}
}
void SetupDlg::onPreferencesDlg()
{
SUIT_OverrideCursor c;
- FieldData& aData = myAnimator->getFieldData(myFieldLst->currentItem());
+
+ int id = ( myAnimator->getAnimationMode() == 0 ) ? myFieldLst->currentItem() : 0;
+ FieldData& aData = myAnimator->getFieldData(id);
if (aData.myPrs.empty())
- myAnimator->generatePresentations(myFieldLst->currentItem());
+ myAnimator->generatePresentations(id);
+
+ if ( myAnimator->getAnimationMode() == 1 ) {
+ for (int i = 0; i < myAnimator->getNbFields(); i++) {
+ if ( i != id && myAnimator->getFieldData(i).myPrs.empty() ) myAnimator->generatePresentations(i);
+ }
+ }
+
+ if(!aData.myNbFrames || !aData.myPrs[0]){
+ QApplication::restoreOverrideCursor();
+ SUIT_MessageBox::warn1(this,
+ tr("ERROR"),
+ VisuGUI_TimeAnimationDlg::tr("MSG_NO_ANIMATIONDATA"),
+ tr("&OK"));
+ return;
+ }
if(!aData.myNbFrames || !aData.myPrs[0]){
QApplication::restoreOverrideCursor();
switch (aType) {
case TSCALARMAP_ITEM: //Scalar Map
c.suspend();
- EditPrs<VISU::ScalarMap_i,VisuGUI_ScalarBarDlg>(myModule,aData);
+ EditPrs<VISU::PrsMerger_i,VisuGUI_ScalarBarDlg>(myModule,aData,myAnimator);
break;
case TISOSURFACE_ITEM: //Iso Surfaces
c.suspend();
- EditPrs<VISU::IsoSurfaces_i,VisuGUI_IsoSurfacesDlg>(myModule,aData);
+ EditPrs<VISU::IsoSurfaces_i,VisuGUI_IsoSurfacesDlg>(myModule,aData,myAnimator);
break;
case TCUTPLANES_ITEM: //Cut Planes
c.suspend();
- EditPrs<VISU::CutPlanes_i,VisuGUI_CutPlanesDlg>(myModule,aData);
+ EditPrs<VISU::CutPlanes_i,VisuGUI_CutPlanesDlg>(myModule,aData,myAnimator);
break;
case TCUTLINES_ITEM: //Cut Lines
c.suspend();
- EditPrs<VISU::CutLines_i,VisuGUI_CutLinesDlg>(myModule,aData);
+ EditPrs<VISU::CutLines_i,VisuGUI_CutLinesDlg>(myModule,aData,myAnimator);
break;
case TPLOT3D_ITEM: //Plot 3D
c.suspend();
- EditPrs<VISU::Plot3D_i,VisuGUI_Plot3DDlg>(myModule,aData);
+ EditPrs<VISU::Plot3D_i,VisuGUI_Plot3DDlg>(myModule,aData,myAnimator);
break;
case TDEFORMEDSHAPE_ITEM: //Deformed Shape
c.suspend();
- EditPrs<VISU::DeformedShape_i,VisuGUI_DeformedShapeDlg>(myModule,aData);
+ EditPrs<VISU::DeformedShape_i,VisuGUI_DeformedShapeDlg>(myModule,aData,myAnimator);
break;
case TSCALARMAPONDEFORMEDSHAPE_ITEM: //Scalar Map on Deformed Shape
c.suspend();
break;
case TVECTORS_ITEM: //Vectors
c.suspend();
- EditPrs<VISU::Vectors_i,VisuGUI_VectorsDlg>(myModule,aData);
+ EditPrs<VISU::Vectors_i,VisuGUI_VectorsDlg>(myModule,aData,myAnimator);
break;
case TSTREAMLINES_ITEM: //Stream Lines
c.suspend();
- EditPrs<VISU::StreamLines_i,VisuGUI_StreamLinesDlg>(myModule,aData);
+ EditPrs<VISU::StreamLines_i,VisuGUI_StreamLinesDlg>(myModule,aData,myAnimator);
break;
case TGAUSSPOINTS_ITEM: //Gauss Points
c.suspend();
- EditPrs<VISU::GaussPoints_i,VisuGUI_GaussPointsDlg>(myModule,aData);
+ EditPrs<VISU::GaussPoints_i,VisuGUI_GaussPointsDlg>(myModule,aData,myAnimator);
break;
}
}
static QPixmap MYpausePixmap(pauseIco);
-VisuGUI_TimeAnimationDlg::VisuGUI_TimeAnimationDlg (VisuGUI* theModule, _PTR(Study) theStudy) :
+VisuGUI_TimeAnimationDlg::VisuGUI_TimeAnimationDlg (VisuGUI* theModule, _PTR(Study) theStudy, int theMode) :
QDialog(VISU::GetDesktop(theModule),
"VisuGUI_TimeAnimationDlg",
false,
myStudy(theStudy),
mySetupDlg(NULL)
{
- setCaption("Animation");
+ if ( theMode == 0 )
+ setCaption(tr("PARALLEL_ANIMATION"));
+ else if ( theMode == 1 )
+ setCaption(tr("SUCCESSIVE_ANIMATION"));
setSizeGripEnabled( TRUE );
isClosing = false;
+ myCloseBtnClicked = false;
myAnimator = new VISU_TimeAnimation (theStudy);
- myAnimator->setSpeed(1);
myAnimator->setViewer(VISU::GetActiveViewWindow<SVTK_ViewWindow>(theModule));
connect(myAnimator, SIGNAL(frameChanged(long, double)), this, SLOT(onExecution(long, double)));
connect(myAnimator, SIGNAL(stopped()), this, SLOT(onStop()));
+ myAnimator->setAnimationMode(theMode);
QVBoxLayout* aMainLayout = new QVBoxLayout(this, 7, 6);
aMainLayout->setSpacing(5);
QLCDNumber* aSpeedNum = new QLCDNumber( 2, myPlayFrame );
aSpeedNum->setSegmentStyle(QLCDNumber::Flat);
- aSpeedNum->display(1);
+ aSpeedNum->display((int)myAnimator->getSpeed());
TopLayout->addWidget(aSpeedNum, 4, 3);
QwtWheel* aWheel = new QwtWheel(myPlayFrame);
aWheel->setOrientation(Qt::Vertical);
aWheel->setRange(1, 99, 1);
+ aWheel->setValue((int)myAnimator->getSpeed());
connect( aWheel, SIGNAL(valueChanged(double)),
aSpeedNum, SLOT(display(double)) );
connect( aWheel, SIGNAL(valueChanged(double)),
TopLayout->addMultiCellWidget(aSaveBox, 7, 7, 0, 3);
+ QCheckBox* aCleanMemCheck = new QCheckBox("Clean memory at each frame",myPlayFrame);
+ aCleanMemCheck->setChecked(myAnimator->isCleaningMemoryAtEachFrame());
+ connect(aCleanMemCheck, SIGNAL(toggled(bool)), myAnimator, SLOT(setCleaningMemoryAtEachFrameSlot(bool)));
+ TopLayout->addMultiCellWidget(aCleanMemCheck, 8, 8, 0, 3);
+
aMainLayout->addWidget(myPlayFrame);
// Animation publishing in study
aBtnLayout->addStretch();
QPushButton* aCloseBtn = new QPushButton(tr("BUT_CLOSE"), aBtnBox);
- connect(aCloseBtn, SIGNAL(clicked()), this, SLOT(close()));
+ connect(aCloseBtn, SIGNAL(clicked()), this, SLOT(onClose()));
QPushButton* aHelpBtn = new QPushButton(tr("BUT_HELP"), aBtnBox);
connect(aHelpBtn, SIGNAL(clicked()), this, SLOT(onHelp()));
if(myAnimator != NULL){
delete myAnimator;
myAnimator = NULL;
- VISU::GetActiveViewWindow<SVTK_ViewWindow>(myModule)->Repaint();
+ if ( VISU::GetActiveViewWindow<SVTK_ViewWindow>(myModule) )
+ VISU::GetActiveViewWindow<SVTK_ViewWindow>(myModule)->Repaint();
}
}
}
//------------------------------------------------------------------------
-void VisuGUI_TimeAnimationDlg::addField (_PTR(SObject) theSObject)
+bool VisuGUI_TimeAnimationDlg::addField (_PTR(SObject) theSObject)
{
myPlayFrame->setEnabled(false);
- myAnimator->addField(theSObject);
+ return myAnimator->addField(theSObject);
}
//------------------------------------------------------------------------
QDialog::reject();
}
+void VisuGUI_TimeAnimationDlg::onClose()
+{
+ myCloseBtnClicked = true;
+ close();
+}
+
//------------------------------------------------------------------------
void VisuGUI_TimeAnimationDlg::closeEvent (QCloseEvent* theEvent)
{
// * Destroing data in myAnimator before study closed.
// * It needed for correcting destroing of myAnimator, which
// * depend from SVTK_RenderWindowInteractor() e.t.c.
- if(theEvent->type() == QEvent::Close){
- for (int i = 0; i < myAnimator->getNbFields(); i++)
+ if(theEvent->type() == QEvent::Close && !myCloseBtnClicked){
+ for (int i = 0; (myAnimator != NULL) && (i < myAnimator->getNbFields()); i++)
myAnimator->clearData(myAnimator->getFieldData(i));
myAnimator->clearFieldData();
}
if (app)
app->onHelpContextModule(myModule ? app->moduleName(myModule->moduleName()) : QString(""), aHelpFileName);
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
{
myAnimator->restoreFromStudy(theAnimation);
mySaveBtn->setEnabled(myAnimator->isSavedInStudy());
+ if ( myAnimator->getAnimationMode() == 1 )
+ setCaption(tr("SUCCESSIVE_ANIMATION"));
}
//------------------------------------------------------------------------
{
Q_OBJECT
public:
- VisuGUI_TimeAnimationDlg(VisuGUI* theModule, _PTR(Study) theStudy);
+ VisuGUI_TimeAnimationDlg(VisuGUI* theModule, _PTR(Study) theStudy, int theMode=0);
~VisuGUI_TimeAnimationDlg();
- void addField(_PTR(SObject) theField);
+ bool addField(_PTR(SObject) theField);
void clearView();
void restoreFromStudy(_PTR(SObject) theAnimation);
virtual void keyPressEvent(QKeyEvent* theEvent);
virtual void reject();
void stopAnimation();
-
+
private slots:
void onTypeChange(int index);
void onPlayPressed();
void onPicsFormatChanged();
/*!Sets path for myAnimator (dumpTo(...)), from myPathEdit.*/
void onPathChanged();
+ void onClose();
private:
QSlider* mySlider;
QComboBox* myPicsFormat;
QLineEdit* myPathEdit;
bool isClosing;
+ bool myCloseBtnClicked;
QCloseEvent* myEvent;
QCheckBox* mySaveAVICheck;
#include <vtkRenderer.h>
#include <vtkActorCollection.h>
+#include <qstring.h>
+
//=============================================================================
namespace VISU
Engines::Component_var aComponent = aLCC.FindOrLoad_Component("FactoryServer","VISU");
VISU_Gen_var aVISU = VISU_Gen::_narrow(aComponent);
if(!CORBA::is_nil(aVISU)){
- aGen = VISU_Gen_i::GetVisuGenImpl();
- aGen->SetCurrentStudy(GetDSStudy(GetCStudy(GetAppStudy(theModule))));
+ if( aGen = VISU_Gen_i::GetVisuGenImpl() )
+ aGen->SetCurrentStudy(GetDSStudy(GetCStudy(GetAppStudy(theModule))));
}
}
if(!aGen)
VISU::Storable::TRestoringMap aMap;
if (theSObject) {
_PTR(GenericAttribute) anAttr;
- if (theSObject->FindAttribute(anAttr, "AttributeComment")) {
- _PTR(AttributeComment) aComment (anAttr);
+ if (theSObject->FindAttribute(anAttr, "AttributeString")) {
+ _PTR(AttributeString) aComment (anAttr);
std::string aValue = aComment->Value();
QString aString (aValue.c_str());
VISU::Storable::StrToMap(aString, aMap);
_PTR(SObject) aSObject = aStudy->FindObjectID(theEntry.latin1());
if (aSObject) {
_PTR(GenericAttribute) anAttr;
- if (theMap && aSObject->FindAttribute(anAttr,"AttributeComment")) {
- _PTR(AttributeComment) aComment (anAttr);
+ if (theMap && aSObject->FindAttribute(anAttr,"AttributeString")) {
+ _PTR(AttributeString) aComment (anAttr);
std::string aValue = aComment->Value();
QString aString (aValue.c_str());
VISU::Storable::StrToMap(aString, *theMap);
// (first sub-level) or is a child of such an object
string aNAME, aVisuNAME = GetVisuGen(theModule)->ComponentDataType();
_PTR(GenericAttribute) anAttr;
- _PTR(AttributeComment) aComment;
+ _PTR(AttributeString) aComment;
bool isUnderVISU = false;
_PTR(SObject) aFatherSObject = aSObject->GetFather();
- if (aFatherSObject->FindAttribute(anAttr, "AttributeComment")) {
- _PTR(AttributeComment) aComment (anAttr);
+ if (aFatherSObject->FindAttribute(anAttr, "AttributeName")) {
+ // mkr : 24.11.2006 : use AttributeName and module title for correct "Delete"
+ // popup item displaying in object browser popup
+ _PTR(AttributeName) aComment (anAttr);
aNAME = aComment->Value();
- if (aNAME == aVisuNAME) {
+ QString aVisuTITLE = theModule->getApp()->moduleTitle(QString(aVisuNAME));
+ if (!aVisuTITLE.compare(QString(aNAME))) {
isUnderVISU = true;
}
}
isUnderVISU = false;
aFatherSObject = aFatherSObject->GetFather();
- if (aFatherSObject->FindAttribute(anAttr, "AttributeComment")) {
- _PTR(AttributeComment) aComment (anAttr);
+ if (aFatherSObject->FindAttribute(anAttr, "AttributeString")) {
+ _PTR(AttributeString) aComment (anAttr);
aNAME = aComment->Value();
if (aNAME == aVisuNAME) {
isUnderVISU = true;
}
if (!isUnderVISU) {
// Father is not directly under VISU component
- return false;
+ return false;
}
}
}
}
}
aPlot->Repaint();
+ aPlot->fitAll();
}
void
Utils_Timer timer;
timer.Start();
#endif
+ if(GetResourceMgr()->booleanValue("VISU","display_only",false)){
+ const VisuGUI* av = dynamic_cast<const VisuGUI*>(theModule);
+ if(av)(const_cast<VisuGUI*>(av))->OnEraseAll();
+ }
PublishMeshInView(theModule, pPresent, theViewWindow);
SetFitAll(theViewWindow);
#ifdef CHECKTIME
}
}
+ SalomeApp_Module* aModule = (SalomeApp_Module*)theModule;
+ UpdateObjBrowser(aModule, false, aResultSObj);
+
theModule->application()->putInfo(QObject::tr("INF_DONE"));
// Make "Save" button active
theModule->getApp()->updateActions();
if (!CORBA::is_nil(aVisuObj)) {
VISU::VISUType aType = aVisuObj->GetType();
switch (aType) {
- case VISU::TSCALARMAP:
+ case VISU::TPRSMERGER:
case VISU::TISOSURFACE:
case VISU::TDEFORMEDSHAPE:
case VISU::TCUTPLANES:
}
} else {
_PTR(GenericAttribute) anAttr;
- if (theObject->FindAttribute(anAttr, "AttributeComment")) {
- _PTR(AttributeComment) aComment (anAttr);
+ if (theObject->FindAttribute(anAttr, "AttributeString")) {
+ _PTR(AttributeString) aComment (anAttr);
string aComm = aComment->Value();
QString strIn (aComm.c_str());
VISU::Storable::TRestoringMap pMap;
app->onHelpContextModule(aVisuGUI ? app->moduleName(aVisuGUI->moduleName()) : QString(""), aHelpFileName);
}
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
app->onHelpContextModule(aVisuGUI ? app->moduleName(aVisuGUI->moduleName()) : QString(""), aHelpFileName);
}
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
VISU_TimeAnimation.cxx \
VISU_CorbaMedConvertor.cxx \
VISU_DumpPython.cc \
- VISU_ScalarMapOnDeformedShape_i.cc
+ VISU_ScalarMapOnDeformedShape_i.cc \
+ VISU_PrsMerger_i.cc
LIB_MOC = \
VISU_TimeAnimation.h
LIB_SERVER_IDL = \
+ MED_Gen.idl \
MED.idl \
VISU_Gen.idl \
SALOME_Component.idl \
SALOME_Exception.idl \
- SALOME_GenericObj.idl
+ SALOME_GenericObj.idl \
+ SALOME_ModuleCatalog.idl \
+ SALOME_Session.idl
LIB_CLIENT_IDL = \
SALOMEDS.idl \
VISU_ViewManager_i.hh \
VISU_View_i.hh \
VISU_TimeAnimation.h \
- VISU_ScalarMapOnDeformedShape_i.hh
+ VISU_ScalarMapOnDeformedShape_i.hh \
+ VISU_PrsMerger_i.hh \
+ VISU_I.hxx
# additionnal information to compil and link file
CPPFLAGS += \
SALOMEDS::SObject_var aFieldSO;
for(;anIter->More();anIter->Next()) {
SALOMEDS::GenericAttribute_var anAttr;
- if (anIter->Value()->FindAttribute(anAttr,"AttributeComment")) {
- SALOMEDS::AttributeComment_var aCmnt = SALOMEDS::AttributeComment::_narrow(anAttr);
+ if (anIter->Value()->FindAttribute(anAttr,"AttributeString")) {
+ SALOMEDS::AttributeString_var aCmnt = SALOMEDS::AttributeString::_narrow(anAttr);
CORBA::String_var aString = aCmnt->Value();
string aValue(aString);
if (aValue == theComment) {
aPRef->SetValue(thePersistentRef);
}
if(strcmp(theComment,"") != 0){
- anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeComment");
- SALOMEDS::AttributeComment_var aCmnt = SALOMEDS::AttributeComment::_narrow(anAttr);
+ anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeString");
+ SALOMEDS::AttributeString_var aCmnt = SALOMEDS::AttributeString::_narrow(anAttr);
aCmnt->SetValue(theComment);
if(MYDEBUG) INFOS("CreateAttributes - Comment = "<<theComment);
}
aPRef->SetValue(thePersistentRef);
}
if (strcmp(theComment, "") != 0) {
- anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeComment");
- _PTR(AttributeComment) aCmnt (anAttr);
+ anAttr = aStudyBuilder->FindOrCreateAttribute(newObj, "AttributeString");
+ _PTR(AttributeString) aCmnt (anAttr);
aCmnt->SetValue(theComment);
if (MYDEBUG) INFOS("CreateAttributes - Comment = " << theComment);
}
#ifndef __VISU_CONFIG_H__
#define __VISU_CONFIG_H__
+#include "VISU_I.hxx"
+
// IDL headers
#include "SALOMEconfig.h"
#include CORBA_SERVER_HEADER(VISU_Gen)
namespace VISU
{
- SUIT_Session *GetSession();
- SUIT_ResourceMgr *GetResourceMgr();
+ VISU_I_EXPORT SUIT_Session *GetSession();
+ VISU_I_EXPORT SUIT_ResourceMgr *GetResourceMgr();
//===========================================================================
class VISU_Gen_i;
- class Base_i : public virtual POA_VISU::Base,
+ class VISU_I_EXPORT Base_i : public virtual POA_VISU::Base,
public virtual PortableServer::RefCountServantBase
{
public:
//===========================================================================
- class Mutex{
+ class VISU_I_EXPORT Mutex{
QMutex* myMutex;
int isQAppLocked;
public:
//===========================================================================
- class Storable : public virtual Base_i {
+ class VISU_I_EXPORT Storable : public virtual Base_i {
protected:
virtual void ToStream(std::ostringstream& theStr) = 0;
public:
};
//===========================================================================
- class RemovableObject_i : public virtual POA_VISU::RemovableObject,
+ class VISU_I_EXPORT RemovableObject_i : public virtual POA_VISU::RemovableObject,
public virtual Storable
{
public:
};
//===========================================================================
- const CORBA::Boolean IsMultifile();
- QString GenerateName(const std::string& theFmt, int theId);
+ VISU_I_EXPORT const CORBA::Boolean IsMultifile();
+ VISU_I_EXPORT QString GenerateName(const std::string& theFmt, int theId);
- PortableServer::ServantBase_var GetServant(CORBA::Object_ptr theObject);
- CORBA::Object_var ClientSObjectToObject(_PTR(SObject) theSObject);
- CORBA::Object_var SObjectToObject(SALOMEDS::SObject_ptr);
+ VISU_I_EXPORT PortableServer::ServantBase_var GetServant(CORBA::Object_ptr theObject);
+ VISU_I_EXPORT CORBA::Object_var ClientSObjectToObject(_PTR(SObject) theSObject);
+ VISU_I_EXPORT CORBA::Object_var SObjectToObject(SALOMEDS::SObject_ptr);
- _PTR(SComponent) ClientFindOrCreateVisuComponent(_PTR(Study) theStudyDocument);
- SALOMEDS::SComponent_var FindOrCreateVisuComponent(SALOMEDS::Study_ptr theStudyDocument);
+ VISU_I_EXPORT _PTR(SComponent) ClientFindOrCreateVisuComponent(_PTR(Study) theStudyDocument);
+ VISU_I_EXPORT SALOMEDS::SComponent_var FindOrCreateVisuComponent(SALOMEDS::Study_ptr theStudyDocument);
- std::string CreateAttributes(SALOMEDS::Study_ptr theStudyDocument,
+ VISU_I_EXPORT std::string CreateAttributes(SALOMEDS::Study_ptr theStudyDocument,
const char* theFatherEntry, const char* theRefFatherEntry,
const char* theIOR, const char* theName,
const char* thePersistentRef, const char* theComment,
CORBA::Boolean theCreateNew = true);
- std::string CreateAttributes(_PTR(Study) theStudyDocument,
+ VISU_I_EXPORT std::string CreateAttributes(_PTR(Study) theStudyDocument,
const char* theFatherEntry, const char* theRefFatherEntry,
const char* theIOR, const char* theName,
const char* thePersistentRef, const char* theComment,
CORBA::Boolean theCreateNew = true);
- std::string FindEntryWithComment(SALOMEDS::Study_ptr theStudyDocument, const char* theStartEntry,
+ VISU_I_EXPORT std::string FindEntryWithComment(SALOMEDS::Study_ptr theStudyDocument, const char* theStartEntry,
const char* theComment, int IsAllLevels = true);
- SALOMEDS::SObject_var GetSObject(_PTR(SObject));
- _PTR(SObject) GetClientSObject(SALOMEDS::SObject_var, _PTR(Study));
+ VISU_I_EXPORT SALOMEDS::SObject_var GetSObject(_PTR(SObject));
+ VISU_I_EXPORT _PTR(SObject) GetClientSObject(SALOMEDS::SObject_var, _PTR(Study));
- SALOMEDS::Study_var GetDSStudy(_PTR(Study));
+ VISU_I_EXPORT SALOMEDS::Study_var GetDSStudy(_PTR(Study));
- void RemoveFromStudy(SALOMEDS::SObject_ptr theSObject,
+ VISU_I_EXPORT void RemoveFromStudy(SALOMEDS::SObject_ptr theSObject,
bool theIsAttrOnly = true,
bool theDestroySubObjects = false);
- void RemoveFromStudy(_PTR(SObject) theSObject,
+ VISU_I_EXPORT void RemoveFromStudy(_PTR(SObject) theSObject,
bool theIsAttrOnly = true,
bool theDestroySubObjects = false);
}
DoHook();
ColoredPrs3d_i* anOrigin = const_cast<ColoredPrs3d_i*>(aPrs3d);
-
- myField = anOrigin->GetField();
- myMeshName = myField->myMeshName;
- myEntity = VISU::TEntity(anOrigin->GetEntity());//myField->myEntity;
- myIteration = anOrigin->GetIteration();
- myFieldName = anOrigin->GetFieldName();
-
+ if(myMeshName == ""){
+ myField = anOrigin->GetField();
+ myMeshName = myField->myMeshName;
+ myEntity = VISU::TEntity(anOrigin->GetEntity());//myField->myEntity;
+ myIteration = anOrigin->GetIteration();
+ myFieldName = anOrigin->GetFieldName();
+ }
Build(-1);
TSuperClass::SameAs(theOrigin);
void
VISU::ColoredPrs3d_i
-::SameAsParams(const ColoredPrs3d_i* theOrigin)
+::SameAsParams(const ColoredPrs3d_i* theOrigin,
+ const std::string& theMeshName, const std::string& theFieldName,
+ VISU::Entity theEntity, int theIteration,
+ bool theIsFixedRange)
{
- int anIteration = GetIteration();
- SameAs(theOrigin);
- myIteration = anIteration;
+ myMeshName = theMeshName;
+ myFieldName = theFieldName;
+ myEntity = (VISU::TEntity)theEntity;
+ myIteration = theIteration;
+ int aScalarMode = (const_cast<ColoredPrs3d_i*>(theOrigin))->GetScalarMode();
+ SameAs(theOrigin);
+
+ myIsFixedRange = theIsFixedRange;
+
Build(-1);
+
+ SetScalarMode(aScalarMode); // mkr : IPAL14030
+
Update();
}
void
VISU::ColoredPrs3d_i
-::SetTitle(const char* theName)
-{
- myTitle = theName;
+::SetTitle(const char* theTitle)
+{
+ // mkr : IPAL14030
+ std::strstream aStream;
+ const VISU::TValField& aValField = myField->myValField;
+ const VISU::PValForTime aValForTime = aValField.find(myIteration)->second;
+ aStream<<theTitle<<" "<<VISU_Convertor::GenerateName(aValForTime->myTime)<<std::ends;
+ std::string aScalarBarTitle = aStream.str();
+ if(myTitle != theTitle || myScalarBarTitle != aScalarBarTitle){
+ myScalarBarTitle = aScalarBarTitle;
+ myTitle = theTitle;
+ }
}
char*
myLabelColor[2] = theB;
}
+//----------------------------------------------------------------------------
+std::string
+VISU::ColoredPrs3d_i
+::GetScalarBarTitle()
+{
+ return myScalarBarTitle;
+}
//----------------------------------------------------------------------------
/**
}
//----------------------------------------------------------------------------
+
+
VISU::Storable*
VISU::ColoredPrs3d_i
::Build(int theRestoring)
const VISU::TValField& aValField = myField->myValField;
const VISU::PValForTime aValForTime = aValField.find(myIteration)->second;
aComment.sprintf("%s %s",myFieldName.c_str(),VISU_Convertor::GenerateName(aValForTime->myTime).c_str());
- if (theRestoring == 0) myTitle = aComment.simplifyWhiteSpace().latin1();
+ if (theRestoring == 0) SetTitle(myFieldName.c_str());
}
if(myAddToStudy){
myName = GenerateName().latin1();
CORBA::String_var anIOR = GetID();
CreateAttributes(myStudy,anEntry.c_str(),aRefFatherEntry.c_str(),anIOR,myName.c_str(),"",aComment.latin1(),true);
mySObject = myStudy->FindObjectIOR(anIOR);
+
+ // Set icon
+ if (GetIconName() != 0)
+ {
+ SALOMEDS::GenericAttribute_var anAttr;
+ SALOMEDS::AttributePixMap_var aPixmap;
+
+ anAttr = aStudyBuilder->FindOrCreateAttribute( mySObject, "AttributePixMap" );
+ aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr );
+ aPixmap ->SetPixMap(GetIconName());
+ }
}
#ifndef _DEXCEPT_
}catch(std::exception& exc){
namespace VISU
{
//============================================================================
- class ColoredPrs3d_i : public virtual POA_VISU::ColoredPrs3d,
+ class VISU_I_EXPORT ColoredPrs3d_i : public virtual POA_VISU::ColoredPrs3d,
public virtual Prs3d_i
{
- ColoredPrs3d_i();
ColoredPrs3d_i(const ColoredPrs3d_i&);
+
public:
//----------------------------------------------------------------------------
typedef Prs3d_i TSuperClass;
virtual
void
- SetTitle(const char* theName);
+ SetTitle(const char* theTitle);
virtual
char*
protected:
VISU::ScalarMap::Orientation myOrientation;
std::string myTitle;
+ std::string myScalarBarTitle;
int myNumberOfLabels;
vtkFloatingPointType myPosition[2], myWidth, myHeight;
* Is used in VISU_TimeAnimation class implementation.
*/
void
- SameAsParams(const ColoredPrs3d_i* theOrigin);
+ SameAsParams(const ColoredPrs3d_i* theOrigin,
+ const std::string& theMeshName, const std::string& theFieldName,
+ VISU::Entity theEntity, int theIteration,
+ bool theIsFixedRange);
virtual const VISU::PField&
GetField() const;
vtkFloatingPointType theG,
vtkFloatingPointType theB);
+ std::string
+ GetScalarBarTitle();
+
//----------------------------------------------------------------------------
protected:
PField myField;
virtual
void
DoHook();
+
+ virtual
+ const char*
+ GetIconName() = 0;
};
}
return VISU::eNONE;
}
+ //---------------------------------------------------------------
+ medGeometryElement
+ VISUGeomToMED(int theGeom)
+ {
+ switch(theGeom){
+ case VISU::ePOINT1: return MED_POINT1;
+ case VISU::eSEG2: return MED_SEG2;
+ case VISU::eTRIA3: return MED_TRIA3;
+ case VISU::eQUAD4: return MED_QUAD4;
+ case VISU::eTETRA4: return MED_TETRA4;
+ case VISU::eHEXA8: return MED_HEXA8;
+ case VISU::ePENTA6: return MED_PENTA6;
+ case VISU::ePYRA5: return MED_PYRA5;
+
+ case VISU::eSEG3: return MED_SEG3;
+ case VISU::eTRIA6: return MED_TRIA6;
+ case VISU::eQUAD8: return MED_QUAD8;
+ case VISU::eTETRA10: return MED_TETRA10;
+ case VISU::eHEXA20: return MED_HEXA20;
+ case VISU::ePENTA15: return MED_PENTA15;
+ case VISU::ePYRA13: return MED_PYRA13;
+ }
+ return medGeometryElement(-1);
+ }
//---------------------------------------------------------------
medGeometryElement
return aMeshOnEntity;
}
-
+
+
+ PCSubProfile
+ CrSubProfile(const VISU::PCMesh theMesh,
+ const VISU::PCField theField,
+ const VISU::TCMeshOnEntity& theMeshOnEntity,
+ SALOME_MED::medGeometryElement theMGeom,
+ // SALOME_MED::long_array_var theGeom2Profile)
+ int nbElts)
+ {
+ if (MYDEBUG) MESSAGE("CrSubProfile");
+ VISU::EGeometry aEGeom = MEDGeom2VISU(theMGeom);
+ vtkIdType aVNbNodes = VISUGeom2NbNodes(aEGeom);
+
+ PCSubProfile aSubProfile(new TCSubProfile());
+ aSubProfile->myGeom = aEGeom;
+ aSubProfile->myMGeom = theMGeom;
+ aSubProfile->myStatus = eAddAll;
+ if(MYDEBUG) MESSAGE("theMGeom = "<<theMGeom);
+ TCellsFirstIndex::const_iterator aTimeStampIter = (theMeshOnEntity.myCellsFirstIndex).find(theMGeom);
+ if(aTimeStampIter == (theMeshOnEntity.myCellsFirstIndex).end() &&
+ theMGeom != SALOME_MED::MED_POINT1)
+ aSubProfile->myStatus = eRemoveAll;
+ else if( aTimeStampIter == (theMeshOnEntity.myCellsFirstIndex).end() &&
+ theMGeom == SALOME_MED::MED_POINT1)
+ {
+ if(nbElts>0){
+ aSubProfile->myName = "";
+ aSubProfile->myStatus = eAddPart;
+
+ aSubProfile->myNbCells = nbElts;
+ aSubProfile->myCellsSize = aSubProfile->myNbCells;
+ }
+ }
+ else
+ {
+ if(nbElts>0){
+ aSubProfile->myName = "";
+ aSubProfile->myStatus = eAddPart;
+
+ aSubProfile->myNbCells = nbElts;
+ aSubProfile->myCellsSize = aSubProfile->myNbCells*aVNbNodes;
+ }
+ }
+
+ if (MYDEBUG) MESSAGE("CrSubProfile done");
+ return aSubProfile;
+ }
+
+ TProfileKey
+ GetProfileKey(const VISU::PCMesh theMesh,
+ const VISU::PCField theField,
+ const VISU::PCValForTime theValForTime,
+ const VISU::TCMeshOnEntity& theMeshOnEntity)
+ {
+ if (MYDEBUG) MESSAGE("GetProfileKey");
+
+ TProfileKey aProfileKey;
+
+ const TCellsFirstIndex& aFirstIndex = theMeshOnEntity.myCellsFirstIndex;
+ TCellsFirstIndex::const_iterator anIter = aFirstIndex.begin();
+ int aNbElts = 0;
+ if(anIter==aFirstIndex.end() &&
+ (theValForTime->myField->getSupport()->getEntity() == SALOME_MED::MED_NODE))
+ {
+ SALOME_MED::medGeometryElement aMGeom = SALOME_MED::MED_POINT1;
+
+ try{
+ aNbElts = theValForTime->myField->getSupport()->getNumberOfElements(SALOME_MED::MED_NONE);
+ if(MYDEBUG)MESSAGE("aMGeom="<<aMGeom<<" aNbElts="<<aNbElts);
+ } catch(...){
+ MESSAGE("Error in theValForTime->myField->getSupport()->getNumberOfElements(aMGeom);");
+ }
+
+ PCSubProfile aSubProfile = CrSubProfile(theMesh,
+ theField,
+ theMeshOnEntity,
+ aMGeom,
+ aNbElts);
+ aProfileKey.insert(aSubProfile);
+ }
+
+ for(; anIter != aFirstIndex.end(); anIter++){
+ SALOME_MED::medGeometryElement aMGeom = anIter->first;
+ try{
+ aNbElts = theValForTime->myField->getSupport()->getNumberOfElements(aMGeom);
+ if(MYDEBUG)MESSAGE("aMGeom="<<aMGeom<<" aNbElts="<<aNbElts);
+ } catch(...){
+ MESSAGE("Error in theValForTime->myField->getSupport()->getNumberOfElements(aMGeom);");
+ continue;
+ }
+ PCSubProfile aSubProfile = CrSubProfile(theMesh,
+ theField,
+ theMeshOnEntity,
+ aMGeom,
+ aNbElts);
+ aProfileKey.insert(aSubProfile);
+ }
+
+ if (MYDEBUG) MESSAGE("GetProfileKey done");
+ return aProfileKey;
+ }
+
+ void
+ InitProfile(VISU::PCMesh theMesh,
+ VISU::PCField theField,
+ VISU::PCValForTime theValForTime,
+ VISU::TCMeshOnEntity& theMeshOnEntity)
+ {
+ if (MYDEBUG) MESSAGE("InitProfile");
+
+ TProfileMap& aProfileMap = theMeshOnEntity.myProfileMap;
+
+ TProfileKey aProfileKey = GetProfileKey(theMesh,
+ theField,
+ theValForTime,
+ theMeshOnEntity);
+
+ TProfileMap::const_iterator anIter = aProfileMap.find(aProfileKey);
+ if(anIter != aProfileMap.end()){
+ theValForTime->myProfile = anIter->second;
+ if(MYDEBUG) MESSAGE("aProfileMap.find(aProfileKey) aProfile->myGeom=");
+ }else{
+ PCProfile aProfile(new TCProfile());
+ TGeom2SubProfile& aGeom2SubProfile = aProfile->myGeom2SubProfile;
+
+ TProfileKey::const_iterator anIter = aProfileKey.begin();
+ for(; anIter != aProfileKey.end(); anIter++){
+ PCSubProfile aSubProfile(*anIter);
+
+ if(aProfile->myIsAll && aSubProfile->myStatus != eAddAll)
+ aProfile->myIsAll = false;
+
+ VISU::EGeometry aEGeom = aSubProfile->myGeom;
+ aGeom2SubProfile[aEGeom] = aSubProfile;
+ }
+
+ aProfileMap[aProfileKey] = aProfile;
+ theValForTime->myProfile = aProfile;
+ }
+ if (MYDEBUG) MESSAGE("InitProfile done");
+ }
+
+ void
+ LoadProfile(VISU::PCMesh theMesh,
+ VISU::PCField theField,
+ VISU::PCValForTime theValForTime,
+ VISU::PCMeshOnEntity theMeshOnEntity)
+ {
+ PCProfile aProfile = theValForTime->myProfile;
+ if (MYDEBUG) MESSAGE("LoadProfile aProfile->myIsDone="<<aProfile->myIsDone);
+ if(aProfile->myIsDone)
+ return;
+
+ const TGeom2SubProfile& aGeom2SubProfile = aProfile->myGeom2SubProfile;
+ TGeom2SubProfile::const_iterator aGeom2SubProfileIter = aGeom2SubProfile.begin();
+ if(aGeom2SubProfileIter==aGeom2SubProfile.end()){
+ MESSAGE("Warning! No geom 2 sub profile");
+ }
+ for(;aGeom2SubProfileIter!=aGeom2SubProfile.end();aGeom2SubProfileIter++){
+ VISU::EGeometry aEGeom = aGeom2SubProfileIter->first;
+ medGeometryElement aMGeom = VISUGeomToMED(aEGeom);
+ PCSubProfile aSubProfile = aGeom2SubProfileIter->second;
+ SALOME_MED::long_array_var aGeom2ProfileIds;
+ std::vector<int> aGeom2Profile;
+ if(!theValForTime->myField->getSupport()->isOnAllElements()){
+ try{
+ if(aMGeom == SALOME_MED::MED_POINT1)
+ aGeom2ProfileIds = theValForTime->myField->getSupport()->getNumberFromFile(SALOME_MED::MED_NONE);
+ else
+ aGeom2ProfileIds = theValForTime->myField->getSupport()->getNumberFromFile(aMGeom);
+ int aLen = aGeom2ProfileIds->length();
+ if(MYDEBUG) MESSAGE(" - aMGeom="<<aMGeom<<"; aNbCells="<<aLen);
+ for(int i=0;i<aLen;i++){
+ int anId = aGeom2ProfileIds[i];
+ aGeom2Profile.push_back(anId);
+ if(MYDEBUG) cout << "------------------------------->" << anId << endl;
+ }
+ if(MYDEBUG) cout << endl;
+ } catch(...) {
+ continue;
+ }
+ } else {
+ SALOME_MED::medEntityMesh aMEntity = theValForTime->myField->getSupport()->getEntity();
+ int aNbElts = theMesh->myMesh->getNumberOfElements(aMEntity,aMGeom);
+ for(int i=0;i<aNbElts;i++) aGeom2Profile.push_back(i+1);
+ }
+ if(aGeom2Profile.size()>0){
+ TSubMeshID& aSubMeshID = aSubProfile->mySubMeshID;
+ int aSize = aGeom2Profile.size();
+ aSubMeshID.resize(aSize);
+
+
+ for(int anId = 0; anId < aSize; anId++){
+ aSubMeshID[anId] = aGeom2Profile[anId]-1; // ENKENKENKENKENEKENKENKN
+ }
+ }
+
+ }
+
+
+ aProfile->myIsDone = true;
+ if (MYDEBUG) MESSAGE("LoadProfile done");
+ }
}
TCell2Connect& aCell2Connect = aSubMesh->myCell2Connect;
aCell2Connect.resize(aNbElem);
+ if(MYDEBUG) MESSAGE("LoadPoints - aNbElem="<<aNbElem);
for(int iElem = 0; iElem < aNbElem; iElem++)
aCell2Connect[iElem] = TConnect(1,iElem);
}
//Workaround for MED Component data structure
int aSize = aCell2Connect.size();
- if(MYDEBUG) MESSAGE("LoadCellsOnEntity - aCounter = "<<aCounter<<"; aSize = "<<aSize);
- theMeshOnEntity->myCellsFirstIndex[aMGeom] = TCMeshOnEntity::TIndexAndSize(aCounter,aSize);
+ if(MYDEBUG) MESSAGE("LoadCellsOnEntity - aCounter = "<<aCounter<<"; aSize = "<<aSize<<"; aMGeom = "<<aMGeom);
+ theMeshOnEntity->myCellsFirstIndex[aMGeom] = TIndexAndSize(aCounter,aSize);
aCounter += aSize;
}
}
VISU::PCValForTime theValForTime,
VISU::PCMeshOnEntity theMeshOnEntity)
{
+ if(MYDEBUG) MESSAGE("ImportField");
+
int aNbComp = theField->myNbComp;
- if(theField->myEntity == NODE_ENTITY){
- VISU::EGeometry aEGeom = VISU::ePOINT1;
- int aNbGauss = theValForTime->GetNbGauss(aEGeom);
- const TNamedPointCoords& aCoords = theMesh->myNamedPointCoords;
- int aNbElem = aCoords.GetNbPoints();
-
- if(MYDEBUG) MESSAGE("ImportField - aNbElem = "<<aNbElem);
-
- TMeshValue& aMeshValue = theValForTime->GetMeshValue(VISU::ePOINT1);
- aMeshValue.Init(aNbElem,aNbGauss,aNbComp);
- for(int iElem = 0, anId = 0; iElem < aNbElem; iElem++){
- TValueSliceArr aValueSliceArr = aMeshValue.GetGaussValueSliceArr(iElem);
- for(int iGauss = 0; iGauss < aNbGauss; iGauss++){
- TValueSlice& aValueSlice = aValueSliceArr[iGauss];
- for(int iComp = 0; iComp < aNbComp; iComp++){
- aValueSlice[iComp] = theArray[anId++];
+
+ if(MYDEBUG) MESSAGE("- aNbComp = "<<aNbComp);
+
+ CORBA::String_var aSupportName = theMeshOnEntity->mySupport->getName();
+
+ if(theMeshOnEntity->mySupport->isOnAllElements() &&
+ strcmp(aSupportName.in(),"SupportOnAll_MED_") > 0){
+
+ if(theField->myEntity == NODE_ENTITY){
+ VISU::EGeometry aEGeom = VISU::ePOINT1;
+ int aNbGauss = theValForTime->GetNbGauss(aEGeom);
+ const TNamedPointCoords& aCoords = theMesh->myNamedPointCoords;
+ int aNbElem = aCoords.GetNbPoints();
+
+ if(MYDEBUG) MESSAGE("ImportField - aNbElem = "<<aNbElem);
+
+ TMeshValue& aMeshValue = theValForTime->GetMeshValue(VISU::ePOINT1);
+ aMeshValue.Init(aNbElem,aNbGauss,aNbComp);
+ for(int iElem = 0, anId = 0; iElem < aNbElem; iElem++){
+ TValueSliceArr aValueSliceArr = aMeshValue.GetGaussValueSliceArr(iElem);
+ for(int iGauss = 0; iGauss < aNbGauss; iGauss++){
+ TValueSlice& aValueSlice = aValueSliceArr[iGauss];
+ for(int iComp = 0; iComp < aNbComp; iComp++){
+ aValueSlice[iComp] = theArray[anId++];
+ }
+ }
+ }
+ } else {
+ SALOME_MED::medGeometryElement* aGeomElems;
+ const TEntity& aVEntity = theField->myEntity;
+ int iGeomEnd = GetEntity2Geom(aVEntity,aGeomElems);
+ for(int iGeom = 0; iGeom < iGeomEnd; iGeom++){
+ SALOME_MED::medGeometryElement aMGeom = aGeomElems[iGeom];
+ VISU::EGeometry aEGeom = MEDGeom2VISU(aMGeom);
+ int aNbGauss = theValForTime->GetNbGauss(aEGeom);
+ const TCellsFirstIndex& aCellsFirstIndex = theMeshOnEntity->myCellsFirstIndex;
+ TCellsFirstIndex::const_iterator aCellsFirstIndexIter = aCellsFirstIndex.find(aMGeom);
+ if(aCellsFirstIndexIter != aCellsFirstIndex.end()){
+ const TIndexAndSize& aIndexAndSize = aCellsFirstIndexIter->second;
+ if(MYDEBUG)
+ MESSAGE("ImportField - aMGeom = "<<aMGeom<<
+ "; aIndexAndSize = {"<<aIndexAndSize.first<<
+ ","<<aIndexAndSize.second<<"}");
+
+ int aNbElem = aIndexAndSize.second;
+ int aStart = aIndexAndSize.first*aNbComp;
+ TMeshValue& aMeshValue = theValForTime->GetMeshValue(aEGeom);
+ aMeshValue.Init(aNbElem,aNbGauss,aNbComp);
+ for(int iElem = 0, anId = 0; iElem < aNbElem; iElem++, anId += aNbComp){
+ TValueSliceArr aValueSliceArr = aMeshValue.GetGaussValueSliceArr(iElem);
+ for(int iGauss = 0; iGauss < aNbGauss; iGauss++){
+ TValueSlice& aValueSlice = aValueSliceArr[iGauss];
+ for(int iComp = 0; iComp < aNbComp; iComp++)
+ aValueSlice[iComp] = theArray[aStart+anId+iComp];
+ }
+ }
}
}
}
- }else{
- SALOME_MED::medGeometryElement* aGeomElems;
- const TEntity& aVEntity = theField->myEntity;
- int iGeomEnd = GetEntity2Geom(aVEntity,aGeomElems);
- for(int iGeom = 0; iGeom < iGeomEnd; iGeom++){
- SALOME_MED::medGeometryElement aMGeom = aGeomElems[iGeom];
- VISU::EGeometry aEGeom = MEDGeom2VISU(aMGeom);
+ return 1;
+ }
+
+ if(MYDEBUG) MESSAGE("Loading profile");
+ theField->myDataSize = 0;
+
+ InitProfile(theMesh,theField,theValForTime,theMeshOnEntity);
+
+ LoadProfile(theMesh,theField,theValForTime,theMeshOnEntity);
+
+ PCProfile aProfile = theValForTime->myProfile;
+ TGeom2SubProfile& aGeom2SubProfile = aProfile->myGeom2SubProfile;
+
+ TGeom2SubProfile::const_iterator anIter = aGeom2SubProfile.begin();
+ for(; anIter != aGeom2SubProfile.end(); anIter++){
+ VISU::EGeometry aEGeom = anIter->first;
+ PCSubProfile aSubProfile(anIter->second);
+
+ int aNbElem = aSubProfile->myNbCells;
+ theField->myDataSize += aNbElem*aNbComp;
+
+ if(aSubProfile->myStatus != eRemoveAll){
int aNbGauss = theValForTime->GetNbGauss(aEGeom);
- const TCMeshOnEntity::TCellsFirstIndex& aCellsFirstIndex = theMeshOnEntity->myCellsFirstIndex;
- TCMeshOnEntity::TCellsFirstIndex::const_iterator aCellsFirstIndexIter = aCellsFirstIndex.find(aMGeom);
- if(aCellsFirstIndexIter != aCellsFirstIndex.end()){
- const TCMeshOnEntity::TIndexAndSize& aIndexAndSize = aCellsFirstIndexIter->second;
- if(MYDEBUG)
- MESSAGE("ImportField - aMGeom = "<<aMGeom<<
- "; aIndexAndSize = {"<<aIndexAndSize.first<<
- ","<<aIndexAndSize.second<<"}");
-
- int aNbElem = aIndexAndSize.second;
- int aStart = aIndexAndSize.first*aNbComp;
- TMeshValue& aMeshValue = theValForTime->GetMeshValue(aEGeom);
- aMeshValue.Init(aNbElem,aNbGauss,aNbComp);
- for(int iElem = 0, anId = 0; iElem < aNbElem; iElem++, anId += aNbComp){
- TValueSliceArr aValueSliceArr = aMeshValue.GetGaussValueSliceArr(iElem);
- for(int iGauss = 0; iGauss < aNbGauss; iGauss++){
- TValueSlice& aValueSlice = aValueSliceArr[iGauss];
- for(int iComp = 0; iComp < aNbComp; iComp++)
- aValueSlice[iComp] = theArray[aStart+anId+iComp];
+
+ if(MYDEBUG) MESSAGE("- aEGeom = "<<aEGeom<<
+ "; aNbElem = "<<aNbElem<<
+ "; aNbGauss = "<<aNbGauss);
+
+ TMeshValue& aVMeshValue = theValForTime->GetMeshValue(aEGeom);
+ aVMeshValue.Init(aNbElem,aNbGauss,aNbComp);
+
+ for(int iElem = 0, anId = 0; iElem < aNbElem; iElem++){
+ TValueSliceArr aVValueSliceArr = aVMeshValue.GetGaussValueSliceArr(iElem);
+ for(int iGauss = 0; iGauss < aNbGauss; iGauss++){
+ TValueSlice& aVValueSlice = aVValueSliceArr[iGauss];
+ for(int iComp = 0; iComp < aNbComp; iComp++){
+ aVValueSlice[iComp] = theArray[anId++];
}
}
}
VISU::PField theField,
VISU::PCValForTime theValForTime)
{
+ MESSAGE("VISU_MEDConvertor::LoadField");
//Check on loading already done
PIDMapperFilter anIDMapperFilter = theValForTime->myIDMapperFilter;
if(anIDMapperFilter->myIsVTKDone)
theValForTime->myProfile = aProfile;
SALOME_MED::FIELD_var aMEDField = theValForTime->myField;
+
+ SALOME_MED::SUPPORT_var aMEDSupport = aMEDField->getSupport();
+
+ if(aMEDSupport->isOnAllElements()) aProfile->myIsDone = true;
+
SALOME_MED::FIELDDOUBLE_ptr aFieldDouble = SALOME_MED::FIELDDOUBLE::_narrow(aMEDField);
if(!aFieldDouble->_is_nil()){
SALOME_MED::double_array_var anArray = aFieldDouble->getValue(SALOME_MED::MED_FULL_INTERLACE);
anIDMapperFilter->myIsVTKDone = true;
+ MESSAGE("VISU_MEDConvertor::LoadField done");
return 1;
}
namespace VISU
{
+ typedef std::pair<int,int> TIndexAndSize; //
+ typedef std::map<SALOME_MED::medGeometryElement,TIndexAndSize> TCellsFirstIndex; // key: SALOME_MED::medGeometryElement
//---------------------------------------------------------------
struct TCMesh: virtual TMeshImpl
{
};
typedef SharedPtr<TCMesh> PCMesh;
+ //---------------------------------------------------------------
+ struct TCSubProfile: virtual TSubProfileImpl
+ {
+ SALOME_MED::medGeometryElement myMGeom;
+ };
+ typedef SharedPtr<TCSubProfile> PCSubProfile;
//---------------------------------------------------------------
struct TCProfile: virtual TProfileImpl
{};
typedef SharedPtr<TCProfile> PCProfile;
+ //---------------------------------------------------------------
+ struct TCGauss: virtual TGaussImpl
+ {
+ };
+ typedef SharedPtr<TCGauss> PCGauss;
+
+ struct TCGaussSubMesh: virtual TGaussSubMeshImpl
+ {
+ };
+ typedef SharedPtr<TCGaussSubMesh> PCGaussSubMesh;
+
//---------------------------------------------------------------
- struct TCSubMesh: virtual TSubMeshImpl
+ struct TCGaussMesh: virtual TGaussMeshImpl
{};
+ typedef SharedPtr<TCGaussMesh> PCGaussMesh;
+
+
+ //---------------------------------------------------------------
+ struct TCSubMesh: virtual TSubMeshImpl
+ {
+ };
typedef SharedPtr<TCSubMesh> PCSubMesh;
struct TCMeshOnEntity: virtual TMeshOnEntityImpl
{
SALOME_MED::SUPPORT_var mySupport;
- typedef std::pair<int,int> TIndexAndSize;
- typedef std::map<int,TIndexAndSize> TCellsFirstIndex;
TCellsFirstIndex myCellsFirstIndex;
};
typedef SharedPtr<TCMeshOnEntity> PCMeshOnEntity;
int VISU::CutLines_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity,
const char* theFieldName, int theIteration, int isMemoryCheck)
{
- return VISU::ScalarMap_i::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration,isMemoryCheck);
+ return TSuperClass::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration,isMemoryCheck);
}
int VISU::CutLines_i::myNbPresent = 0;
Prs3d_i(theResult,theAddToStudy),
ColoredPrs3d_i(theResult,theAddToStudy),
ScalarMap_i(theResult,theAddToStudy),
- myCutLinesPL(NULL)
+ TSuperClass(theResult,theAddToStudy),
+ myCutLinesPL(NULL),
+ myUseAbsLength(false)
{}
Prs3d_i(theResult,theSObject),
ColoredPrs3d_i(theResult,theSObject),
ScalarMap_i(theResult,theSObject),
- myCutLinesPL(NULL)
+ TSuperClass(theResult,theSObject),
+ myCutLinesPL(NULL),
+ myUseAbsLength(false)
{
}
VISU::Storable* VISU::CutLines_i::Create(const char* theMeshName, VISU::Entity theEntity,
const char* theFieldName, int theIteration)
{
- return ScalarMap_i::Create(theMeshName,theEntity,theFieldName,theIteration);
+ TSuperClass::Create(theMeshName,theEntity,theFieldName,theIteration);
+ SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr();
+ SetAllCurvesInverted( aResourceMgr->booleanValue("VISU", "invert_all_curves", false) );
+ SetUseAbsoluteLength( aResourceMgr->booleanValue("VISU", "use_absolute_length", false) );
+
+ return this;
}
SetOrientation2(CutPlanes::Orientation(VISU::Storable::FindValue(theMap,"myBasePlane[1]").toInt()),
Storable::FindValue(theMap,"aRot[1][0]").toDouble(),
Storable::FindValue(theMap,"aRot[1][1]").toDouble());
+ SetUseAbsoluteLength(VISU::Storable::FindValue(theMap,"myUseAbsLength").toInt());
+
if (VISU::Storable::FindValue(theMap,"myBasePlaneCondition").toInt())
SetDefault();
else
void VISU::CutLines_i::ToStream(std::ostringstream& theStr){
- ScalarMap_i::ToStream(theStr);
+ TSuperClass::ToStream(theStr);
int aNbLines = GetNbLines();
aStrPos.append(QString::number(GetLinePosition(i)) + "|");
aStrCon.append(QString::number(IsDefaultPosition(i)) + "|");
}
+
Storable::DataToStream( theStr, "myLinePosition", aStrPos.latin1());
Storable::DataToStream( theStr, "myLineCondition", aStrCon.latin1());
+ Storable::DataToStream( theStr,"myUseAbsLength", IsUseAbsoluteLength());
// Storing the map - \a myMapCurvesInverted
QString aStrCurvesInverted;
myMapCurvesInverted[theCurveNumber] = theInvert;
}
+/*! It control the way the length of cutlines is shown: using aboslute or relative values
+* \param theAbsLength - boolean value, TRUE or false.
+*/
+void VISU::CutLines_i::SetUseAbsoluteLength(CORBA::Boolean theAbsLength){
+ myUseAbsLength = theAbsLength;
+}
+
/*! Checks orientation of curve.
* \param theCurveNumber - integer value, number of cut line.
* \retval TRUE - if line in the table is inverted, else FALSE.
if(!myPipeLine) myPipeLine = VISU_CutLinesPL::New();
myCutLinesPL = dynamic_cast<VISU_CutLinesPL*>(myPipeLine);
- ScalarMap_i::DoHook();
+ TSuperClass::DoHook();
+}
+
+const char*
+VISU::CutLines_i
+::GetIconName()
+{
+ if (!GetNumberOfGeom())
+ return "ICON_TREE_CUT_LINES";
+ else
+ return "ICON_TREE_CUT_LINES_GROUPS";
}
VISU_Actor*
VISU::CutLines_i
::CreateActor(const Handle(SALOME_InteractiveObject)& theIO)
{
- if(VISU_Actor* anActor = ScalarMap_i::CreateActor(theIO)){
+ if(VISU_Actor* anActor = TSuperClass::CreateActor(theIO)){
anActor->SetVTKMapping(true);
SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr();
int aDispMode = aResourceMgr->integerValue("VISU" , "cut_lines_represent", 2);
if(MYDEBUG) MESSAGE("CutPlanes_i::BuildTableOfReal iLine = "<<iLine<<"; aNbPoints = "<<aNbPoints);
aLineIdCont[iLine] = jLine++;
TXYMap& aXYMap = aXYMapCont[iLine];
- vtkFloatingPointType aPnt[3], aVect[3], aDist;
+ vtkFloatingPointType aPnt[3], aVect[3], aDist, aTopBnd, aDivide;
+ aTopBnd = aBoundPrjLn[2];
+ aDivide = aBoundPrjLn[2];
+ if( !IsUseAbsoluteLength() ){
+ aTopBnd = 1.0;
+ }
+ else aDivide = 1.0;
+
for(int i = 0; i < aNbPoints; i++){
aDataSet->GetPoint(i,aPnt);
- Sub(aPnt,aBasePnt,aVect);
+ for(int j = 0; j < 3; j++)
+ aVect[j] = aPnt[j] - aBasePnt[j];
+ //VISU::Sub(aPnt,aBasePnt,aVect);
if ( fabs(aBoundPrjLn[2]) < EPS_machine )
aDist = 0.5;
else
{
- aDist = vtkMath::Dot(aVect,aDirLn) / aBoundPrjLn[2];
+ aDist = vtkMath::Dot(aVect,aDirLn)/aDivide;
// the workaround
if(aDist < 0.0) aDist = 0.0;
- if(aDist > 1.0) aDist = 1.0;
+ if(aDist > aTopBnd) aDist = aTopBnd;
}
aXYMap[aDist] = aScalars->GetTuple1(i);
}
a_last_indx = tmp;
}
std::list<vtkFloatingPointType>::const_iterator aIter = XKeys.begin();
- for (int k=0;k<XKeys.size() and aIter != XKeys.end();k++,aIter++){
+ for (int k=0;k<XKeys.size() && aIter != XKeys.end();k++,aIter++){
// Warning: value '1.0' come from workaround:
// see also aDist = vtkMath::Dot(aVect,aDirLn) / aBoundPrjLn[2];
// aDist >= 0 and aDist<=1.0
- aNewXYMap[1.0 - *aIter] = aXYMap[*aIter];
+ vtkFloatingPointType aTopBnd = aBoundPrjLn[2];
+ if( !IsUseAbsoluteLength() ){
+ aTopBnd = 1.0;
+ }
+ aNewXYMap[aTopBnd - *aIter] = aXYMap[*aIter];
}
TXYMap::const_iterator aNewXYMapIter = aNewXYMap.begin();
aXYMap.clear();
INFOS("Unknown exception was occured !!!");
}
}
+
+void VISU::CutLines_i::SameAs(const Prs3d_i* theOrigin){
+ TSuperClass::SameAs(theOrigin);
+ if(const CutLines_i* aPrs3d = dynamic_cast<const CutLines_i*>(theOrigin)){
+ CutLines_i* anOrigin = const_cast<CutLines_i*>(aPrs3d);
+ myUseAbsLength = anOrigin->IsUseAbsoluteLength();
+ CopyCurvesInverted(anOrigin->GetCurvesInverted());
+ }
+}
+
#ifndef VISU_CutLines_i_HeaderFile
#define VISU_CutLines_i_HeaderFile
-#include "VISU_ScalarMap_i.hh"
+#include "VISU_PrsMerger_i.hh"
class VISU_CutLinesPL;
namespace VISU{
- class CutLines_i : public virtual POA_VISU::CutLines,
- public virtual ScalarMap_i
+ class VISU_I_EXPORT CutLines_i : public virtual POA_VISU::CutLines,
+ public virtual PrsMerger_i
{
static int myNbPresent;
- CutLines_i();
CutLines_i(const CutLines_i&);
public:
- typedef ScalarMap_i TSuperClass;
+ typedef PrsMerger_i TSuperClass;
explicit
CutLines_i(Result_i* theResult,
virtual void SetCurveInverted(CORBA::Long theCurveNumber,CORBA::Boolean theInvert);
virtual CORBA::Boolean IsCurveInverted(CORBA::Long theCurveNumber);
+ virtual void SetUseAbsoluteLength(CORBA::Boolean theAbsLength);
+ virtual CORBA::Boolean IsUseAbsoluteLength() {return myUseAbsLength;}
+
virtual void SetNbLines(CORBA::Long theNb);
virtual CORBA::Long GetNbLines();
typedef VISU::CutLines TInterface;
protected:
virtual void DoHook();
+ virtual const char* GetIconName();
+
VISU_CutLinesPL *myCutLinesPL;
TCurvesInv myMapCurvesInverted;
+ CORBA::Boolean myUseAbsLength;
public:
static int IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity,
virtual void ToStream(std::ostringstream& theStr);
virtual Storable* Restore(const Storable::TRestoringMap& theMap);
+ virtual void SameAs( const Prs3d_i* Origin );
virtual
VISU_Actor*
int VISU::CutPlanes_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity,
const char* theFieldName, int theIteration, int isMemoryCheck)
{
- return VISU::ScalarMap_i::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration,isMemoryCheck);
+ return TSuperClass::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration,isMemoryCheck);
}
Prs3d_i(theResult,theAddToStudy),
ColoredPrs3d_i(theResult,theAddToStudy),
ScalarMap_i(theResult,theAddToStudy),
+ TSuperClass(theResult,theAddToStudy),
myCutPlanesPL(NULL)
{}
Prs3d_i(theResult,theSObject),
ColoredPrs3d_i(theResult,theSObject),
ScalarMap_i(theResult,theSObject),
+ TSuperClass(theResult,theSObject),
myCutPlanesPL(NULL)
{
}
VISU::Storable* VISU::CutPlanes_i::Create(const char* theMeshName, VISU::Entity theEntity,
const char* theFieldName, int theIteration)
{
- return ScalarMap_i::Create(theMeshName,theEntity,theFieldName,theIteration);
+ return TSuperClass::Create(theMeshName,theEntity,theFieldName,theIteration);
}
void VISU::CutPlanes_i::ToStream(std::ostringstream& theStr){
- ScalarMap_i::ToStream(theStr);
+ TSuperClass::ToStream(theStr);
Storable::DataToStream( theStr, "myNbPlanes", int(GetNbPlanes()));
Storable::DataToStream( theStr, "myDisplacement", GetDisplacement());
if(!myPipeLine) myPipeLine = VISU_CutPlanesPL::New();
myCutPlanesPL = dynamic_cast<VISU_CutPlanesPL*>(myPipeLine);
- ScalarMap_i::DoHook();
+ TSuperClass::DoHook();
+}
+
+const char*
+VISU::CutPlanes_i
+::GetIconName()
+{
+ if (!GetNumberOfGeom())
+ return "ICON_TREE_CUT_PLANES";
+ else
+ return "ICON_TREE_CUT_PLANES_GROUPS";
}
VISU_Actor*
VISU::CutPlanes_i
::CreateActor(const Handle(SALOME_InteractiveObject)& theIO)
{
- if(VISU_Actor* anActor = ScalarMap_i::CreateActor(theIO)){
+ if(VISU_Actor* anActor = TSuperClass::CreateActor(theIO)){
anActor->SetVTKMapping(true);
SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr();
int aDispMode = aResourceMgr->integerValue("VISU" , "cut_planes_represent", 1);
#ifndef VISU_CutPlanes_i_HeaderFile
#define VISU_CutPlanes_i_HeaderFile
-#include "VISU_ScalarMap_i.hh"
+#include "VISU_PrsMerger_i.hh"
class VISU_CutPlanesPL;
namespace VISU{
- class CutPlanes_i : public virtual POA_VISU::CutPlanes,
- public virtual ScalarMap_i
+ class VISU_I_EXPORT CutPlanes_i : public virtual POA_VISU::CutPlanes,
+ public virtual PrsMerger_i
{
static int myNbPresent;
- CutPlanes_i();
CutPlanes_i(const CutPlanes_i&);
public:
- typedef ScalarMap_i TSuperClass;
+ typedef PrsMerger_i TSuperClass;
explicit
CutPlanes_i(Result_i* theResult,
protected:
virtual void DoHook();
+ virtual const char* GetIconName();
+
VISU_CutPlanesPL *myCutPlanesPL;
public:
const char* theFieldName, int theIteration, int isMemoryCheck)
{
try{
- if(!VISU::ScalarMap_i::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration,isMemoryCheck)) return 0;
+ if(!TSuperClass::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration,isMemoryCheck)) return 0;
const VISU::PField aField = theResult->GetInput()->GetField(theMeshName,(VISU::TEntity)theEntity,theFieldName);
return aField->myNbComp > 1;
}catch(std::exception& exc){
Prs3d_i(theResult,theAddToStudy),
ColoredPrs3d_i(theResult,theAddToStudy),
ScalarMap_i(theResult,theAddToStudy),
+ TSuperClass(theResult,theAddToStudy),
myDeformedShapePL(NULL)
{
if(MYDEBUG) MESSAGE("DeformedShape_i::DeformedShape_i");
Prs3d_i(theResult,theSObject),
ColoredPrs3d_i(theResult,theSObject),
ScalarMap_i(theResult,theSObject),
+ TSuperClass(theResult,theSObject),
myDeformedShapePL(NULL)
{
if(MYDEBUG) MESSAGE("DeformedShape_i::DeformedShape_i");
{
myIsColored = false;
myColor.R = myColor.G = myColor.B = 0.5;
- return ScalarMap_i::Create(theMeshName,theEntity,theFieldName,theIteration);
+ return TSuperClass::Create(theMeshName,theEntity,theFieldName,theIteration);
}
void VISU::DeformedShape_i::ToStream(std::ostringstream& theStr){
- ScalarMap_i::ToStream(theStr);
+ TSuperClass::ToStream(theStr);
Storable::DataToStream( theStr, "myFactor", GetScale() );
myDeformedShapePL = dynamic_cast<VISU_DeformedShapePL*>(myPipeLine);
myPipeLine->GetMapper()->SetScalarVisibility(IsColored());
- ScalarMap_i::DoHook();
+ TSuperClass::DoHook();
}
+const char*
+VISU::DeformedShape_i
+::GetIconName()
+{
+ if (!GetNumberOfGeom())
+ return "ICON_TREE_DEFORMED_SHAPE";
+ else
+ return "ICON_TREE_DEFORMED_SHAPE_GROUPS";
+}
+
+
void VISU::DeformedShape_i::SetMapScale(double theMapScale){
myDeformedShapePL->SetMapScale(theMapScale);
}
VISU::DeformedShape_i
::CreateActor(const Handle(SALOME_InteractiveObject)& theIO, bool toSupressShrinking)
{
- VISU_Actor* anActor = VISU::ScalarMap_i::CreateActor(theIO, true);
+ VISU_Actor* anActor = TSuperClass::CreateActor(theIO, true);
anActor->SetVTKMapping(false);
SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr();
int aDispMode = aResourceMgr->integerValue("VISU", "deformed_shape_represent", 1);
myPipeLine->GetMapper()->SetScalarVisibility(0);
anActor->GetProperty()->SetColor(myColor.R,myColor.G,myColor.B);
}
- VISU::ScalarMap_i::UpdateActor(theActor);
+ TSuperClass::UpdateActor(theActor);
}
}
#ifndef VISU_DeformedShape_i_HeaderFile
#define VISU_DeformedShape_i_HeaderFile
-#include "VISU_ScalarMap_i.hh"
+#include "VISU_PrsMerger_i.hh"
class VISU_DeformedShapePL;
namespace VISU{
- class DeformedShape_i : public virtual POA_VISU::DeformedShape,
- public virtual ScalarMap_i
+ class VISU_I_EXPORT DeformedShape_i : public virtual POA_VISU::DeformedShape,
+ public virtual PrsMerger_i
{
static int myNbPresent;
- DeformedShape_i();
DeformedShape_i(const DeformedShape_i&);
public:
- typedef ScalarMap_i TSuperClass;
+ typedef PrsMerger_i TSuperClass;
explicit
DeformedShape_i(Result_i* theResult,
protected:
virtual void DoHook();
+
+ virtual const char* GetIconName();
VISU_DeformedShapePL *myDeformedShapePL;
SALOMEDS::Color myColor;
#include "VISU_Prs3d_i.hh"
#include "VISU_Mesh_i.hh"
+#include "VISU_PrsMerger_i.hh"
#include "VISU_ScalarMap_i.hh"
#include "VISU_IsoSurfaces_i.hh"
#include "VISU_DeformedShape_i.hh"
return thePrefix;
}
-
+ //===========================================================================
+ std::string
+ PrsMergerToPython(SALOMEDS::SObject_ptr theSObject,
+ VISU::PrsMerger_i* theServant,
+ std::ostream& theStr,
+ std::string& theName,
+ const std::string& theConstructorName,
+ const std::string& theArgumentName,
+ std::string thePrefix)
+ {
+ thePrefix = ScalarMapToPython(theSObject,theServant,theStr,theName,theConstructorName,theArgumentName,thePrefix);
+ string_array_var aGroupNames = theServant->getGroupNames();
+ for(int i=0; i<aGroupNames->length(); i++)
+ {
+ theStr<<thePrefix<<theName<<".AddMeshOnGroup('"
+ <<theServant->GetMeshName()<<"','"
+ <<aGroupNames[i]<<"')"<<endl;
+ }
+ return thePrefix;
+ }
+
//===========================================================================
std::string
DeformedShapeToPython(SALOMEDS::SObject_ptr theSObject,
const std::string& theArgumentName,
std::string thePrefix)
{
- thePrefix = ScalarMapToPython(theSObject,theServant,theStr,theName,theConstructorName,theArgumentName,thePrefix);
+ thePrefix = PrsMergerToPython(theSObject,theServant,theStr,theName,theConstructorName,theArgumentName,thePrefix);
theStr<<thePrefix<<theName<<".SetScale("<<theServant->GetScale()<<")"<<endl;
theStr<<thePrefix<<theName<<".ShowColored("<<theServant->IsColored()<<")"<<endl;
SALOMEDS::Color aColor = theServant->GetColor();
{
SALOMEDS::GenericAttribute_var anAttr;
SALOMEDS::SObject_var aFatherSObject = theSObject->GetFather();
- if(aFatherSObject->FindAttribute(anAttr,"AttributeComment")){
- SALOMEDS::AttributeComment_var aComment =
- SALOMEDS::AttributeComment::_narrow(anAttr);
+ if(aFatherSObject->FindAttribute(anAttr,"AttributeString")){
+ SALOMEDS::AttributeString_var aComment =
+ SALOMEDS::AttributeString::_narrow(anAttr);
CORBA::String_var aValue = aComment->Value();
Storable::TRestoringMap aMap;
Storable::StrToMap(aValue.in(),aMap);
}
break;
case VISU::TSCALARMAP:
- if(ScalarMap_i* aServant = dynamic_cast<ScalarMap_i*>(GetServant(anObj).in())){
- thePrefix = ScalarMapToPython(theSObject,aServant,theStr,aName,"ScalarMapOnField",theArgumentName,thePrefix);
+ case VISU::TPRSMERGER:
+ if(PrsMerger_i* aServant = dynamic_cast<PrsMerger_i*>(GetServant(anObj).in())){
+ thePrefix = PrsMergerToPython(theSObject,aServant,theStr,aName,"ScalarMapOnField",theArgumentName,thePrefix);
theStr<<thePrefix<<"pass"<<endl<<endl;
}
return;
return;
case VISU::TSCALARMAPONDEFORMEDSHAPE:
if(ScalarMapOnDeformedShape_i* aServant = dynamic_cast<ScalarMapOnDeformedShape_i*>(GetServant(anObj).in())){
- thePrefix = ScalarMapToPython(theSObject,aServant,theStr,aName,"ScalarMapOnDeformedShapeOnField",theArgumentName,thePrefix);
+ thePrefix = PrsMergerToPython(theSObject,aServant,theStr,aName,"ScalarMapOnDeformedShapeOnField",theArgumentName,thePrefix);
theStr<<thePrefix<<aName<<".SetSourceRange("<<aServant->GetSourceRangeMin()<<","<<aServant->GetSourceRangeMax()<<")"<<endl;
theStr<<thePrefix<<aName<<".SetScale("<<aServant->GetScale()<<")"<<endl;
return;
case VISU::TISOSURFACE:
if(IsoSurfaces_i* aServant = dynamic_cast<IsoSurfaces_i*>(GetServant(anObj).in())){
- thePrefix = ScalarMapToPython(theSObject,aServant,theStr,aName,"IsoSurfacesOnField",theArgumentName,thePrefix);
+ thePrefix = PrsMergerToPython(theSObject,aServant,theStr,aName,"IsoSurfacesOnField",theArgumentName,thePrefix);
theStr<<thePrefix<<aName<<".SetNbSurfaces("<<aServant->GetNbSurfaces()<<")"<<endl;
theStr<<thePrefix<<"pass"<<endl<<endl;
}
return;
case VISU::TCUTPLANES:
if(CutPlanes_i* aServant = dynamic_cast<CutPlanes_i*>(GetServant(anObj).in())){
- thePrefix = ScalarMapToPython(theSObject,aServant,theStr,aName,"CutPlanesOnField",theArgumentName,thePrefix);
+ thePrefix = PrsMergerToPython(theSObject,aServant,theStr,aName,"CutPlanesOnField",theArgumentName,thePrefix);
std::string aParam;
switch(aServant->GetOrientationType()){
return;
case VISU::TCUTLINES:
if(CutLines_i* aServant = dynamic_cast<CutLines_i*>(GetServant(anObj).in())){
- thePrefix = ScalarMapToPython(theSObject,aServant,theStr,aName,"CutLinesOnField",theArgumentName,thePrefix);
+ thePrefix = PrsMergerToPython(theSObject,aServant,theStr,aName,"CutLinesOnField",theArgumentName,thePrefix);
std::string aParam;
switch(aServant->GetOrientationType()){
if(!aServant->IsDefault())
theStr<<thePrefix<<aName<<".SetBasePlanePosition("<<aServant->GetBasePlanePosition()<<")"<<endl;
+ CORBA::Boolean aUseAbsLength = aServant->IsUseAbsoluteLength();
+ theStr<<thePrefix<<aName<<".SetUseAbsoluteLength("<<aUseAbsLength<<")"<<endl;
+
CORBA::Long aNbLines = aServant->GetNbLines();
theStr<<thePrefix<<aName<<".SetNbLines("<<aNbLines<<")"<<endl;
for(CORBA::Long anId = 0; anId < aNbLines; anId++){
return;
case VISU::TPLOT3D:
if (Plot3D_i* aServant = dynamic_cast<Plot3D_i*>(GetServant(anObj).in())) {
- thePrefix = ScalarMapToPython(theSObject, aServant, theStr, aName,"Plot3DOnField", theArgumentName, thePrefix);
+ thePrefix = PrsMergerToPython(theSObject, aServant, theStr, aName,"Plot3DOnField", theArgumentName, thePrefix);
std::string aParam;
switch(aServant->GetOrientationType()){
case VISU::TTABLE:
if(dynamic_cast<Table_i*>(GetServant(anObj).in())){
SALOMEDS::GenericAttribute_var anAttr;
- if(theSObject->FindAttribute(anAttr,"AttributeComment")){
+ if(theSObject->FindAttribute(anAttr,"AttributeString")){
using namespace SALOMEDS;
- AttributeComment_var aComment = AttributeComment::_narrow(anAttr);
+ AttributeString_var aComment = AttributeString::_narrow(anAttr);
CORBA::String_var aValue = aComment->Value();
Storable::TRestoringMap aMap;
Storable::StrToMap(aValue.in(),aMap);
}
} else { /*if(!CORBA::is_nil(anObj))*/
SALOMEDS::GenericAttribute_var anAttr;
- if (theSObject->FindAttribute(anAttr,"AttributeComment")) {
- SALOMEDS::AttributeComment_var aComment =
- SALOMEDS::AttributeComment::_narrow(anAttr);
+ if (theSObject->FindAttribute(anAttr,"AttributeString")) {
+ SALOMEDS::AttributeString_var aComment =
+ SALOMEDS::AttributeString::_narrow(anAttr);
CORBA::String_var aValue = aComment->Value();
Storable::TRestoringMap aMap;
Storable::StrToMap(aValue.in(),aMap);
theStr<<thePrefix<<"anAttr = aBuilder.FindOrCreateAttribute("<<aName<<",'AttributeName')"<<endl;
theStr<<thePrefix<<"anAttr.SetValue('"<<aName<<"')"<<endl;
- theStr<<thePrefix<<"anAttr = aBuilder.FindOrCreateAttribute("<<aName<<",'AttributeComment')"<<endl;
+ theStr<<thePrefix<<"anAttr = aBuilder.FindOrCreateAttribute("<<aName<<",'AttributeString')"<<endl;
theStr<<thePrefix<<"anAttr.SetValue('"<<aValue.in()<<"')"<<endl;
theStr<<thePrefix<<"pass"<<endl<<endl;
CORBA::Boolean theIsPublished,
CORBA::Boolean& theIsValidScript)
{
+ theIsValidScript = false;
+
SALOMEDS::Study_var aStudy = SALOMEDS::Study::_narrow(theStudy);
if(CORBA::is_nil(aStudy))
return new Engines::TMPFile(0);
}
aStr<<aPrefix<<"pass"<<endl;
+ // theIsValidScript currently is not used by internal dump methods (DumpChildrenToPython(), etc.)
+ // If the situation changes, then the following line should be removed, and theIsValidScript
+ // should be set properly by those internal methods
+ theIsValidScript = true;
#ifndef COUT
std::string aResult = aStr.str();
::UpdateScalarBar(vtkScalarBarActor *theScalarBar,
vtkLookupTable* theLookupTable)
{
- theScalarBar->SetTitle(myTitle.c_str());
+ theScalarBar->SetTitle(GetScalarBarTitle().c_str());
theScalarBar->SetOrientation(myOrientation);
theScalarBar->SetNumberOfLabels(myNumberOfLabels);
namespace VISU
{
//! Class of the Gauss Points presentation.
- class GaussPoints_i : public virtual POA_VISU::GaussPoints,
+ class VISU_I_EXPORT GaussPoints_i : public virtual POA_VISU::GaussPoints,
public virtual VISU::TGaussPtsActorFactory,
public virtual MinMaxCunsomer,
public virtual ColoredPrs3d_i
{
static int myNbPresent;
- GaussPoints_i();
GaussPoints_i(const GaussPoints_i&);
public:
void
DoHook();
+ virtual
+ const char*
+ GetIconName() {return "ICON_TREE_GAUSS_POINTS";}
+
virtual
VISU_PipeLine*
GetPipeLine();
#include "VISU_Table_i.hh"
#include "VISU_TimeAnimation.h"
#include "VISU_ScalarMapOnDeformedShape_i.hh"
+#include "VISU_PrsMerger_i.hh"
#include "VISU_Actor.h"
#include <omnithread.h>
#include CORBA_SERVER_HEADER(SALOME_Session)
#include CORBA_SERVER_HEADER(SALOME_ModuleCatalog)
+#include CORBA_SERVER_HEADER(MED_Gen)
// QT Includes
-#include <qstring.h>
+#include <qdir.h>
#include <qfileinfo.h>
#include <qregexp.h>
UNEXPECT_CATCH(SalomeException, SALOME::SALOME_Exception);
-extern "C" VISU::VISU_Gen_ptr GetImpl(CORBA::ORB_ptr theORB,
+extern "C" VISU_I_EXPORT VISU::VISU_Gen_ptr GetImpl(CORBA::ORB_ptr theORB,
PortableServer::POA_ptr thePOA,
SALOME_NamingService* theNamingService,
QMutex* theMutex)
void RegistryStorable() {
Storable::Registry(Result_i::myComment.c_str(),&(Result_i::Restore));
Storable::Registry(Mesh_i::myComment.c_str(),&(Restore<Mesh_i>));
- Storable::Registry(ScalarMap_i::myComment.c_str(),&(Restore<ScalarMap_i>));
+ Storable::Registry(ScalarMap_i::myComment.c_str(),&(Restore<PrsMerger_i>));
Storable::Registry(GaussPoints_i::myComment.c_str(),&(Restore<GaussPoints_i>));
Storable::Registry(DeformedShape_i::myComment.c_str(),&(Restore<DeformedShape_i>));
Storable::Registry(CutPlanes_i::myComment.c_str(),&(Restore<CutPlanes_i>));
Storable::Registry(Curve_i::myComment.c_str(),&(Curve_i::Restore));
Storable::Registry(Container_i::myComment.c_str(),&(Container_i::Restore));
Storable::Registry(ScalarMapOnDeformedShape_i::myComment.c_str(),&(Restore<ScalarMapOnDeformedShape_i>));
+ Storable::Registry(PrsMerger_i::myComment.c_str(),&(Restore<PrsMerger_i>));
}
CORBA::Double theIteration)
{
#ifndef _DEXCEPT_
-#ifdef NO_CAS_CATCH
+# ifdef NO_CAS_CATCH
try{
OCC_CATCH_SIGNALS;
-#else
+# else
CASCatch_TRY{
try{
-#endif
+# endif
#endif
if(theColoredPrs3d->Create(theMeshName,theEntity,theFieldName,int(theIteration)))
return true;
#ifndef _DEXCEPT_
-#ifdef NO_CAS_CATCH
+# ifdef NO_CAS_CATCH
}catch(Standard_Failure) {
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
INFOS("Follow signal was occured :\n"<<aFail->GetMessageString());
}catch(...){
INFOS("Unknown exception was occured!");
}
-#else
+# else
}catch(std::exception& exc){
INFOS("Follow exception was occured :\n"<<exc.what());
}catch(...){
Handle(Standard_Failure) aFail = Standard_Failure::Caught();
INFOS("Follow signal was occured :\n"<<aFail->GetMessageString());
}
-#endif
+# endif
#endif
return false;
- }
+ }
VISU_Gen_i::~VISU_Gen_i(){
if(MYDEBUG) MESSAGE("VISU_Gen_i::~VISU_Gen_i");
}
- void CorrectSObjectType(SALOMEDS::SObject_ptr theSObject)
+ void CorrectSObjectType(SALOMEDS::SObject_ptr theSObject, SALOMEDS::StudyBuilder_ptr theBuilder)
{
SALOMEDS::GenericAttribute_var anAttr;
- if ( theSObject->FindAttribute(anAttr, "AttributeComment") ) {
- SALOMEDS::AttributeComment_var aAttComment = SALOMEDS::AttributeComment::_narrow(anAttr);
+ bool isAttrStringFound = false;
+
+ if( theSObject->FindAttribute(anAttr, "AttributeComment") ) {
+ //SRN: Replace an AttributeComment with AttributeString
+ SALOMEDS::AttributeComment_var aComment = SALOMEDS::AttributeComment::_narrow(anAttr);
+ string aValue = aComment->Value();
+ theBuilder->RemoveAttribute(theSObject, "AttributeComment");
+ anAttr = theBuilder->FindOrCreateAttribute(theSObject, "AttributeString");
+ SALOMEDS::AttributeString_var aStringAttr = SALOMEDS::AttributeString::_narrow(anAttr);
+ aStringAttr->SetValue(aValue.c_str());
+ isAttrStringFound = true;
+
+ }
+
+ if ( isAttrStringFound || theSObject->FindAttribute(anAttr, "AttributeString") ) {
+ SALOMEDS::AttributeString_var aAttComment = SALOMEDS::AttributeString::_narrow(anAttr);
if ( aAttComment ) {
string aValue = aAttComment->Value();
if ( aValue.compare("") ) {
else if ( !aComment.compare(QString("CONTAINER")) ) aVISUType = VISU::TCONTAINER;
else if ( !aComment.compare(QString("MESH")) ) aVISUType = VISU::TMESH;
else if ( !aComment.compare(QString("SCALARMAP")) ) aVISUType = VISU::TSCALARMAP;
+ else if ( !aComment.compare(QString("PRSMERGER")) ) aVISUType = VISU::TPRSMERGER;
else if ( !aComment.compare(QString("ISOSURFACE")) ) aVISUType = VISU::TISOSURFACE;
else if ( !aComment.compare(QString("DEFORMEDSHAPE")) ) aVISUType = VISU::TDEFORMEDSHAPE;
else if ( !aComment.compare(QString("SCALARMAPONDEFORMEDSHAPE")) ) aVISUType = VISU::TSCALARMAPONDEFORMEDSHAPE;
SALOMEDS::Study_var aStudy = theComponent->GetStudy();
SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator(theComponent);
+ SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
+
for (anIter->InitEx(true); anIter->More(); anIter->Next()) {
SALOMEDS::SObject_var aSObject = anIter->Value();
- CorrectSObjectType(aSObject);
+ CorrectSObjectType(aSObject, aStudyBuilder);
}
- SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder();
+
string aDir = isMultiFile ? theURL : SALOMEDS_Tool::GetTmpDir();
TCollection_AsciiString aTmpDir (const_cast<char*>(aDir.c_str()));
VisuTmpDir = aTmpDir.ToCString();
QString aPrefix("");
if (isMultiFile) aPrefix = SALOMEDS_Tool::GetNameFromPath(aStudy->URL()).c_str();
QString aFileName = aPrefix + "_" + (pResult->GetName()).c_str();
+ QString tmpDir = QDir::convertSeparators( QString(aTmpDir.ToCString()) );;
static QString aCommand;
- aCommand.sprintf("cp %s %s%s",aFileInfo.filePath().latin1(),aTmpDir.ToCString(),aFileName.latin1());
+ aCommand.sprintf(" %s %s%s",aFileInfo.filePath().latin1(),tmpDir.latin1(),aFileName.latin1());
+ aCommand = QDir::convertSeparators( aCommand );
+ aCommand.prepend( COPY_COMMAND );
- int aRes = system(aCommand);
- if(aRes){
+ if(system(aCommand.latin1())){
if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - Can't execute the command :"<<aCommand);
continue;
}else
if(MYDEBUG) MESSAGE("VISU_Gen_i::Save - "<<aCommand);
- TCollection_AsciiString aString(strdup(aFileName.latin1()));
+ QString studyPath = tmpDir.append(aFileName);
+ TCollection_AsciiString aString((char *)(aFileName.latin1()));
- HDFascii::ConvertFromHDFToASCII(strdup((aTmpDir + aString).ToCString()), true);
+ HDFascii::ConvertFromHDFToASCII(strdup(studyPath.latin1()), true);
aFileNames.Append(aString);
}}
myStudyDocument = SALOMEDS::Study::_duplicate(theStudy);
ProcessVoidEvent(new TEvent(aStudyName));
+
+ // Load MED component if necessary
+ if(!myStudyDocument->FindComponent("MED")->_is_nil())
+ {
+ SALOME_LifeCycleCORBA aLCC(SalomeApp_Application::namingService());
+ Engines::Component_var aComponent = aLCC.FindOrLoad_Component("FactoryServer","MED");
+ SALOME_MED::MED_Gen_var aMedEngine = SALOME_MED::MED_Gen::_narrow(aComponent);
+
+ if(!CORBA::is_nil(aMedEngine))
+ {
+ SALOMEDS::StudyBuilder_var aStudyBuilder = myStudyDocument->NewBuilder();
+ aStudyBuilder->LoadWith( myStudyDocument->FindComponent( "MED" ), aMedEngine );
+ }
+ }
} else {
INFOS("CORBA::is_nil(theStudy)");
}
const char* theFieldName,
CORBA::Double theIteration)
{
- return Prs3dOnField<VISU::ScalarMap_i>(theResult,theMeshName,theEntity,theFieldName,theIteration,true)._retn();
+ //return Prs3dOnField<VISU::ScalarMap_i>(theResult,theMeshName,theEntity,theFieldName,theIteration,true)._retn();
+ return Prs3dOnField<VISU::PrsMerger_i>(theResult,theMeshName,theEntity,theFieldName,theIteration)._retn();
}
GaussPoints_ptr VISU_Gen_i::GaussPointsOnField(Result_ptr theResult,
aFileName += aFileInfo.fileName().latin1();
static QString aCommand;
string aFullFileName = aTmpDir + aFileName;
- aCommand.sprintf("cp %s %s",
- aFileInfo.filePath().latin1(),
- aFullFileName.c_str());
- if(system(aCommand) == -1) {
+ aCommand.sprintf(" %s %s",aFileInfo.filePath().latin1(), aFullFileName.c_str() );
+ aCommand = QDir::convertSeparators( aCommand );
+ aCommand.prepend( COPY_COMMAND );
+
+ if(system(aCommand.latin1()) == -1) {
if(MYDEBUG) MESSAGE("VISU_Gen_i::Copy - Cann't execute the command :"<<aCommand);
return NULL;
}
stmIn.seekg(0, ios::beg);
char* aString = new char[aLength+1];
stmIn.read(aString, aLength);
+ stmIn.close();
aString[aLength] = 0;
myIsMultiFile = false;
aResultSO = SALOMEDS::SObject::_duplicate(theObject);
//Just for Result::Restore to find the Comment attribute :(
- SALOMEDS::GenericAttribute_var anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeComment");
+ SALOMEDS::GenericAttribute_var anAttr = aStudyBuilder->FindOrCreateAttribute(aResultSO, "AttributeString");
Storable* aStorable = Storable::Create(aResultSO,aFileName,aString);
class ColoredPrs3d_i;
bool
- CreatColoredPrs3d(ColoredPrs3d_i* theColoredPrs3d,
+ VISU_I_EXPORT CreatColoredPrs3d(ColoredPrs3d_i* theColoredPrs3d,
const char* theMeshName,
VISU::Entity theEntity,
const char* theFieldName,
public virtual Base_i
{
SALOMEDS::Study_var myStudyDocument;
- VISU_Gen_i();
VISU_Gen_i(const VISU::VISU_Gen_i &);
public:
VISU_Gen_i(CORBA::ORB_ptr theORB,
--- /dev/null
+// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
+//
+//
+//
+// File : VISU_I.hxx
+// Author : Oleg UVAROV
+// Module : VISU
+
+#ifndef _VISU_I_HXX_
+#define _VISU_I_HXX_
+
+#ifdef WNT
+# if defined VISU_I_EXPORTS
+# define VISU_I_EXPORT __declspec( dllexport )
+# else
+# define VISU_I_EXPORT __declspec( dllimport )
+# endif
+# define COPY_COMMAND "copy /Y"
+# define MOVE_COMMAND "move /Y"
+# define DELETE_COMMAND "del /F"
+#else
+# define VISU_I_EXPORT
+# define COPY_COMMAND "cp"
+# define MOVE_COMMAND "mv"
+# define DELETE_COMMAND "rm -f"
+#endif
+
+
+
+#endif
\ No newline at end of file
int VISU::IsoSurfaces_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity,
const char* theFieldName, int theIteration, int isMemoryCheck)
{
- return VISU::ScalarMap_i::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration,isMemoryCheck);
+ return TSuperClass::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration,isMemoryCheck);
}
int VISU::IsoSurfaces_i::myNbPresent = 0;
Prs3d_i(theResult,theAddToStudy),
ColoredPrs3d_i(theResult,theAddToStudy),
ScalarMap_i(theResult,theAddToStudy),
+ TSuperClass(theResult,theAddToStudy),
myIsoSurfacesPL(NULL)
{}
Prs3d_i(theResult,theSObject),
ColoredPrs3d_i(theResult,theSObject),
ScalarMap_i(theResult,theSObject),
+ TSuperClass(theResult,theSObject),
myIsoSurfacesPL(NULL)
{
}
VISU::Storable* VISU::IsoSurfaces_i::Create(const char* theMeshName, VISU::Entity theEntity,
const char* theFieldName, int theIteration)
{
- return ScalarMap_i::Create(theMeshName,theEntity,theFieldName,theIteration);
+ return TSuperClass::Create(theMeshName,theEntity,theFieldName,theIteration);
}
}
void VISU::IsoSurfaces_i::ToStream(std::ostringstream& theStr){
- ScalarMap_i::ToStream(theStr);
+ TSuperClass::ToStream(theStr);
Storable::DataToStream( theStr, "myNbSurface", int(GetNbSurfaces()) );
Storable::DataToStream( theStr, "myRange[0]", GetSubMin() );
if(!myPipeLine) myPipeLine = VISU_IsoSurfacesPL::New();
myIsoSurfacesPL = dynamic_cast<VISU_IsoSurfacesPL*>(myPipeLine);
- ScalarMap_i::DoHook();
+ TSuperClass::DoHook();
}
+const char*
+VISU::IsoSurfaces_i
+::GetIconName()
+{
+ if (!GetNumberOfGeom())
+ return "ICON_TREE_ISO_SURFACES";
+ else
+ return "ICON_TREE_ISO_SURFACES_GROUPS";
+}
VISU_Actor*
VISU::IsoSurfaces_i
::CreateActor(const Handle(SALOME_InteractiveObject)& theIO)
{
- if(VISU_Actor* anActor = ScalarMap_i::CreateActor(theIO)){
+ if(VISU_Actor* anActor = TSuperClass::CreateActor(theIO)){
anActor->SetVTKMapping(true);
SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr();
int aDispMode = aResourceMgr->integerValue("VISU" , "iso_surfaces_represent", 2);
#ifndef VISU_IsoSurfaces_i_HeaderFile
#define VISU_IsoSurfaces_i_HeaderFile
-#include "VISU_ScalarMap_i.hh"
+#include "VISU_PrsMerger_i.hh"
class VISU_IsoSurfacesPL;
namespace VISU{
- class IsoSurfaces_i : public virtual POA_VISU::IsoSurfaces,
- public virtual ScalarMap_i
+ class VISU_I_EXPORT IsoSurfaces_i : public virtual POA_VISU::IsoSurfaces,
+ public virtual PrsMerger_i
{
static int myNbPresent;
- IsoSurfaces_i();
IsoSurfaces_i(const IsoSurfaces_i&);
public:
- typedef ScalarMap_i TSuperClass;
+ typedef PrsMerger_i TSuperClass;
explicit
IsoSurfaces_i(Result_i* theResult,
protected:
virtual void DoHook();
+ virtual const char* GetIconName();
+
VISU_IsoSurfacesPL* myIsoSurfacesPL;
public:
}
};
+ // Unset icon
+ SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder();
+ aStudyBuilder->RemoveAttribute(GetSObject(), "AttributePixMap");
+
ProcessVoidEvent(new TRemoveFromStudy(this));
}
CORBA::String_var aString = GetID();
anIOR->SetValue(aString);
}
+
+ // Set icon
+ SALOMEDS::GenericAttribute_var anAttr;
+ SALOMEDS::AttributePixMap_var aPixmap;
+
+ anAttr = aStudyBuilder->FindOrCreateAttribute( mySObject, "AttributePixMap" );
+ aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr );
+ aPixmap->SetPixMap("ICON_TREE_MESH");
+
}catch(std::exception& exc){
INFOS("Follow exception was occured :\n"<<exc.what());
return NULL;
namespace VISU
{
- class Mesh_i : public virtual POA_VISU::Mesh,
+ class VISU_I_EXPORT Mesh_i : public virtual POA_VISU::Mesh,
public virtual Prs3d_i
{
static int myNbPresent;
- Mesh_i();
Mesh_i(const Mesh_i&);
public:
int VISU::Plot3D_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity,
const char* theFieldName, int theIteration, int isMemoryCheck)
{
- return VISU::ScalarMap_i::IsPossible
+ return TSuperClass::IsPossible
(theResult,theMeshName,theEntity,theFieldName,theIteration,isMemoryCheck);
}
Prs3d_i(theResult,theAddToStudy),
ColoredPrs3d_i(theResult,theAddToStudy),
ScalarMap_i(theResult,theAddToStudy),
+ TSuperClass(theResult,theAddToStudy),
myPlot3DPL(NULL)
{}
Prs3d_i(theResult,theSObject),
ColoredPrs3d_i(theResult,theSObject),
ScalarMap_i(theResult,theSObject),
+ TSuperClass(theResult,theSObject),
myPlot3DPL(NULL)
{}
VISU::Storable* VISU::Plot3D_i::Create (const char* theMeshName, VISU::Entity theEntity,
const char* theFieldName, int theIteration)
{
- return ScalarMap_i::Create(theMeshName,theEntity,theFieldName,theIteration);
+ return TSuperClass::Create(theMeshName,theEntity,theFieldName,theIteration);
}
VISU::Storable* VISU::Plot3D_i::Restore (const Storable::TRestoringMap& theMap)
void VISU::Plot3D_i::ToStream (std::ostringstream& theStr)
{
- ScalarMap_i::ToStream(theStr);
+ TSuperClass::ToStream(theStr);
Storable::DataToStream(theStr, "myBasePlane", int(GetOrientationType()));
Storable::DataToStream(theStr, "aRot[0]", GetRotateX());
if (!myPipeLine) myPipeLine = VISU_Plot3DPL::New();
myPlot3DPL = dynamic_cast<VISU_Plot3DPL*>(myPipeLine);
- ScalarMap_i::DoHook();
+ TSuperClass::DoHook();
+}
+
+const char*
+VISU::Plot3D_i
+::GetIconName()
+{
+ if (!GetNumberOfGeom())
+ return "ICON_TREE_PLOT_3D";
+ else
+ return "ICON_TREE_PLOT_3D_GROUPS";
}
VISU_Actor*
VISU::Plot3D_i
::CreateActor(const Handle(SALOME_InteractiveObject)& theIO)
{
- if(VISU_Actor* anActor = ScalarMap_i::CreateActor(theIO)){
+ if(VISU_Actor* anActor = TSuperClass::CreateActor(theIO)){
anActor->SetVTKMapping(true);
SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr();
int aDispMode = aResourceMgr->integerValue("VISU", "plot3d_represent", 2);
#ifndef VISU_Plot3D_i_HeaderFile
#define VISU_Plot3D_i_HeaderFile
-#include "VISU_ScalarMap_i.hh"
+#include "VISU_PrsMerger_i.hh"
class VISU_Plot3DPL;
namespace VISU {
- class Plot3D_i : public virtual POA_VISU::Plot3D,
- public virtual ScalarMap_i
+ class VISU_I_EXPORT Plot3D_i : public virtual POA_VISU::Plot3D,
+ public virtual PrsMerger_i
{
static int myNbPresent;
- Plot3D_i();
Plot3D_i(const Plot3D_i&);
public:
- typedef ScalarMap_i TSuperClass;
+ typedef PrsMerger_i TSuperClass;
explicit
Plot3D_i (Result_i* theResult, bool theAddToStudy = true);
protected:
virtual void DoHook();
+ virtual const char* GetIconName();
+
VISU_Plot3DPL *myPlot3DPL;
public:
}
}
+struct TRemoveActorsFromRendererEvent: public SALOME_Event
+{
+ typedef boost::signal0<void> TRemoveActorsFromRendererSignalType;
+ const TRemoveActorsFromRendererSignalType& myRemoveActorsFromRendererSignalVar;
+
+ TRemoveActorsFromRendererEvent
+ (const TRemoveActorsFromRendererSignalType& theRemoveActorsFromRendererSignalVar):
+ myRemoveActorsFromRendererSignalVar(theRemoveActorsFromRendererSignalVar)
+ {}
+
+ virtual
+ void
+ Execute()
+ {
+ myRemoveActorsFromRendererSignalVar();
+ }
+};
+
VISU::Prs3d_i
-::~Prs3d_i()
+::~Prs3d_i()
{
if(MYDEBUG) MESSAGE("Prs3d_i::~Prs3d_i - this = "<<this);
- myRemoveActorsFromRendererSignal();
+ ProcessVoidEvent(new TRemoveActorsFromRendererEvent(myRemoveActorsFromRendererSignal));
myPipeLine->Delete();
myResult->Destroy();
}
//----------------------------------------------------------------------------
-VISU::Storable*
+VISU::Storable*
VISU::Prs3d_i
::Restore(const Storable::TRestoringMap& theMap)
{
//----------------------------------------------------------------------------
-SALOMEDS::SObject_var
+SALOMEDS::SObject_var
VISU::Prs3d_i
::GetSObject()
{
return mySObject;
}
-Result_i*
+Result_i*
VISU::Prs3d_i
-::GetResult() const
-{
+::GetResult() const
+{
return myResult;
}
-const std::string&
+const std::string&
VISU::Prs3d_i
-::GetMeshName() const
-{
- return myMeshName;
+::GetMeshName() const
+{
+ return myMeshName;
}
//----------------------------------------------------------------------------
void
VISU::Prs3d_i
-::Update()
+::Update()
{
if(MYDEBUG) MESSAGE("Prs3d_i::Update - this = "<<this);
try{
//----------------------------------------------------------------------------
void
VISU::Prs3d_i
-::CheckDataSet()
+::CheckDataSet()
{
vtkMapper *aMapper = myPipeLine->GetMapper();
vtkDataSet *aDataSet = aMapper->GetInput();
void
VISU::Prs3d_i
-::RemoveFromStudy()
+::RemoveFromStudy()
{
struct TRemoveFromStudy: public SALOME_Event
{
myRemovable(theRemovable),
myRemoveFromStudySignal(theRemoveFromStudySignal)
{}
-
+
virtual
void
Execute()
//----------------------------------------------------------------------------
-VISU_PipeLine*
+VISU_PipeLine*
VISU::Prs3d_i
::GetPipeLine()
{
return GetPL();
}
-VISU_PipeLine*
+VISU_PipeLine*
VISU::Prs3d_i
::GetPL()
{
return myPipeLine;
}
-vtkUnstructuredGrid*
+vtkUnstructuredGrid*
VISU::Prs3d_i::
GetInput()
{
void
VISU::Prs3d_i
-::RemoveActor(VISU_Actor* theActor)
+::RemoveActor(VISU_Actor* theActor)
{
if(MYDEBUG) MESSAGE("Prs3d_i::RemoveActor - this = "<<this<<"; theActor = "<<theActor);
myActorCollection->RemoveItem(theActor);
::RemoveActors()
{
if(MYDEBUG) MESSAGE("Prs3d_i::RemoveActors - this = "<<this);
- myRemoveActorsFromRendererSignal();
+ ProcessVoidEvent(new TRemoveActorsFromRendererEvent(myRemoveActorsFromRendererSignal));
myActorCollection->RemoveAllItems();
}
void
VISU::Prs3d_i
-::UpdateActor(VISU_Actor* theActor)
+::UpdateActor(VISU_Actor* theActor)
{
if(MYDEBUG) MESSAGE("Prs3d_i::UpdateActor - this = "<<this<<"; theActor = "<<theActor);
theActor->ShallowCopyPL(myPipeLine);
VISU::Prs3d_i
::UpdateActors()
{
+ struct TUpdateActorsEvent: public SALOME_Event
+ {
+ typedef boost::signal0<void> TUpdateActorsSignalType;
+ const TUpdateActorsSignalType& myUpdateActorsSignalVar;
+
+ TUpdateActorsEvent(const TUpdateActorsSignalType& theUpdateActorsSignalVar):
+ myUpdateActorsSignalVar(theUpdateActorsSignalVar)
+ {}
+
+ virtual
+ void
+ Execute()
+ {
+ myUpdateActorsSignalVar();
+ }
+ };
+
if(MYDEBUG) MESSAGE("Prs3d_i::UpdateActors - this = "<<this);
Update();
CheckDataSet();
- myUpdateActorsSignal();
+ ProcessVoidEvent(new TUpdateActorsEvent(myUpdateActorsSignal));
}
return myPipeLine->GetNumberOfClippingPlanes();
}
-vtkPlane*
+vtkPlane*
VISU::Prs3d_i::
GetClippingPlane(vtkIdType theID) const
{
void
VISU::Prs3d_i
-::SetPlaneParam (vtkFloatingPointType theDir[3],
- vtkFloatingPointType theDist,
- vtkPlane* thePlane)
+::SetPlaneParam (vtkFloatingPointType theDir[3],
+ vtkFloatingPointType theDist,
+ vtkPlane* thePlane)
{
myPipeLine->SetPlaneParam(theDir, theDist, thePlane);
}
myPipeLine->GetMapper()->GetBounds(aBounds);
}
-void
+void
VISU::Prs3d_i
::SetOffset(const CORBA::Float* theOffsets)
{
void
VISU::Prs3d_i
-::SetOffset(CORBA::Float theDx,
- CORBA::Float theDy,
+::SetOffset(CORBA::Float theDx,
+ CORBA::Float theDy,
CORBA::Float theDz)
{
myOffset[0] = theDx;
theOffsets[2] = myOffset[2];
}
-void
+void
VISU::Prs3d_i
-::GetOffset(CORBA::Float& theDx,
- CORBA::Float& theDy,
+::GetOffset(CORBA::Float& theDx,
+ CORBA::Float& theDy,
CORBA::Float& theDz)
{
theDx = myOffset[0];
//----------------------------------------------------------------------------
-VISU::Result_i*
+VISU::Result_i*
VISU::GetResult(SALOMEDS::SObject_ptr theSObject)
{
VISU::Result_var aResult = FindResult(theSObject);
- implement basic actor management (CreateActor, UpdateActor, UpdateActors, RemoveActor and RemoveActors);
- implement common 3D functionality like "clipping planes" and offset.
*/
- class Prs3d_i :
+ class VISU_I_EXPORT Prs3d_i :
public virtual POA_VISU::Prs3d,
public virtual SALOME::GenericObj_i,
public virtual TActorFactory,
public virtual PrsObject_i
{
- Prs3d_i();
Prs3d_i(const Prs3d_i&);
public:
- //----------------------------------------------------------------------------
+ //----------------------------------------------------------------------------
//! A constructor to create a fresh instance of the class
explicit
Prs3d_i(Result_i* theResult,
--- /dev/null
+// VISU OBJECT : interactive object for VISU entities implementation
+//
+// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//
+// File : VISU_PrsMerger_i.cc
+// Author : Eugeny Nikolaev
+// Module : VISU
+
+#include "VISU_PrsMerger_i.hh"
+#include "VISU_PrsMergerPL.hxx"
+#include "VISU_MeshPL.hxx"
+#include "VISU_ScalarMapPL.hxx"
+#include "VISU_Convertor.hxx"
+
+#include "VISU_Result_i.hh"
+#include "VISU_ScalarMapAct.h"
+#include "VISU_ScalarMap_i.hh"
+#include "SUIT_ResourceMgr.h"
+
+#include "SUIT_Session.h"
+#include "SALOME_Event.hxx"
+#include "SalomeApp_Study.h"
+#include "SalomeApp_Application.h"
+
+#include <vtkUnstructuredGrid.h>
+#include <vtkCellType.h>
+#include <vtkProperty.h>
+#include <vtkMapper.h>
+
+using namespace VISU;
+using namespace std;
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
+static int INCMEMORY = 4;
+
+int VISU::PrsMerger_i::IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity,
+ const char* theFieldName, int theIteration, int isMemoryCheck)
+{
+ try{
+ float aSize = INCMEMORY*
+ theResult->GetInput()->GetTimeStampSize(theMeshName,(VISU::TEntity)theEntity,theFieldName,theIteration);
+ bool aResult = true;
+ if(isMemoryCheck){
+ aResult = VISU_PipeLine::CheckAvailableMemory(aSize);
+ MESSAGE("PrsMerger_i::IsPossible - CheckAvailableMemory = "<<float(aSize)<<"; aResult = "<<aResult);
+ }
+ return aResult;
+ }catch(std::exception& exc){
+ INFOS("Follow exception was occured :\n"<<exc.what());
+ }catch(...){
+ INFOS("Unknown exception was occured!");
+ }
+ return 0;
+}
+
+int VISU::PrsMerger_i::myNbPresent = 0;
+QString VISU::PrsMerger_i::GenerateName() { return VISU::GenerateName("ScalarMap",myNbPresent++);}
+
+const string VISU::PrsMerger_i::myComment = "PRSMERGER";
+const char* VISU::PrsMerger_i::GetComment() const { return myComment.c_str();}
+
+VISU::PrsMerger_i::
+PrsMerger_i(Result_i* theResult,
+ bool theAddToStudy) :
+ PrsObject_i(theResult->GetStudyDocument()),
+ Prs3d_i(theResult,theAddToStudy),
+ ColoredPrs3d_i(theResult,theAddToStudy),
+ ScalarMap_i(theResult,theAddToStudy),
+ myPrsMergerPL(NULL),
+ myScalarsPL(VISU_ScalarMapPL::New())
+{
+}
+
+VISU::PrsMerger_i::
+PrsMerger_i(Result_i* theResult,
+ SALOMEDS::SObject_ptr theSObject):
+ PrsObject_i(theResult->GetStudyDocument()),
+ Prs3d_i(theResult,theSObject),
+ ColoredPrs3d_i(theResult,theSObject),
+ ScalarMap_i(theResult,theSObject),
+ myPrsMergerPL(NULL),
+ myScalarsPL(VISU_ScalarMapPL::New())
+{
+}
+
+VISU::Storable* VISU::PrsMerger_i::Create(const char* theMeshName, VISU::Entity theEntity,
+ const char* theFieldName, int theIteration)
+{
+ if (MYDEBUG) MESSAGE("PrsMerger_i::Create");
+ myIsColored = true;
+ myColor.R = myColor.G = myColor.B = 0.5;
+ VISU::Storable* aRes = TSuperClass::Create(theMeshName,theEntity,theFieldName,theIteration);
+ this->SetScalarMap(theMeshName,theEntity,theFieldName,theIteration);
+
+ return aRes;
+}
+
+VISU::Storable* VISU::PrsMerger_i::Restore(const Storable::TRestoringMap& theMap)
+{
+ if (MYDEBUG) MESSAGE("VISU::PrsMerger_i::Restore");
+
+ TSuperClass::Restore(theMap);
+
+ SetScalarMap(myMeshName.c_str(),
+ VISU::Entity(myEntity),
+ myFieldName.c_str(),
+ myIteration);
+ // myMeshName = VISU::Storable::FindValue(theMap,"myMeshName").latin1();
+ QStringList aStrSubMeshName = QStringList::split("|",VISU::Storable::FindValue(theMap,"myGeomNameList") );
+ QStringList aStrEntity = QStringList::split("|",VISU::Storable::FindValue(theMap,"myGeomEntityList") );
+ int aC1 = aStrSubMeshName.count();
+ int aC2 = aStrEntity.count();
+ if(aC1 != aC2){
+ // warning situation
+ return this;
+ }
+ if(aC1 == 1)
+ if(aStrSubMeshName[0] == QString("NULL"))
+ return this;
+
+ for(int i=0;i < aC2;i++){
+ std::string aSubMeshName = aStrSubMeshName[i];
+ int aEntity = aStrEntity[i].toInt();
+ if(aEntity == -1){
+ // add group
+ AddMeshOnGroup(myMeshName.c_str(),
+ aSubMeshName.c_str());
+ } else if (aEntity >= 0){
+ // entity and family
+ if(aSubMeshName == ""){
+ // entity
+ SetMeshOnEntity(myMeshName.c_str(),
+ VISU::Entity(aEntity));
+ } else {
+ // family
+ SetFamilyOnEntity(myMeshName.c_str(),
+ VISU::Entity(aEntity),
+ aSubMeshName.c_str());
+ }
+
+ }
+ }
+
+ return this;
+}
+
+void
+VISU::PrsMerger_i
+::SetMapScale(double theMapScale)
+{
+ myPrsMergerPL->SetMapScale(theMapScale);
+}
+
+void VISU::PrsMerger_i::ToStream(std::ostringstream& theStr)
+{
+ if (MYDEBUG) MESSAGE("VISU::PrsMerger_i::ToStream:");
+ TSuperClass::ToStream(theStr);
+
+ QString aStrSubMeshName,aStrEntity;
+ TNameAndEntityList::iterator aIter = myGeomNameEntityList.begin();
+ for(;aIter!=myGeomNameEntityList.end();aIter++){
+ std::string aStr = aIter->first + "|";
+ aStrSubMeshName.append(aStr.c_str());
+ aStrEntity.append(QString::number(aIter->second) + "|");
+ }
+
+ Storable::DataToStream( theStr, "myMeshName", myMeshName.c_str() );
+ Storable::DataToStream( theStr, "myGeomNameList", aStrSubMeshName.latin1());
+ Storable::DataToStream( theStr, "myGeomEntityList", aStrEntity.latin1());
+
+}
+
+void VISU::PrsMerger_i::clearMeshList()
+{
+ VISU_PrsMergerPL::TPipeLines::const_iterator aIter = myMeshPLList.begin();
+ for(int i=0;aIter != myMeshPLList.end();aIter++,i++){
+ ((*aIter).GetPointer())->Delete();
+ }
+ myMeshPLList.clear();
+ myGeomNameEntityList.clear();
+}
+
+void VISU::PrsMerger_i::RemoveAllGeom()
+{
+ clearMeshList();
+ myPrsMergerPL->RemoveAllGeom();
+
+ UpdateIcon();
+}
+
+
+VISU::PrsMerger_i::~PrsMerger_i(){
+ if(MYDEBUG) if (MYDEBUG) MESSAGE("PrsMerger_i::~PrsMerger_i()");
+ this->clearMeshList();
+}
+
+void
+VISU::PrsMerger_i
+::SameAs(const Prs3d_i* theOrigin)
+{
+ if (MYDEBUG) MESSAGE("VISU::PrsMerger_i::SameAs: this="<<this);
+
+ TSuperClass::SameAs(theOrigin);
+
+ if(const PrsMerger_i* aPrs3d = dynamic_cast<const PrsMerger_i*>(theOrigin)){
+ PrsMerger_i* anOrigin = const_cast<PrsMerger_i*>(aPrs3d);
+ if (MYDEBUG) MESSAGE("VISU::PrsMerger_i::SameAs: theOrigin="<<anOrigin);
+ this->SetScalarMap(myMeshName.c_str(),VISU::Entity(myEntity),myFieldName.c_str(),myIteration);
+ string_array_var aGroupNames = anOrigin->getGroupNames();
+ RemoveAllGeom();
+ for(int i=0;i<aGroupNames->length();i++){
+ this->AddMeshOnGroup(myMeshName.c_str(),aGroupNames[i]);
+ }
+ Update();
+ }
+}
+
+VISU_Actor*
+VISU::PrsMerger_i
+::CreateActor(const Handle(SALOME_InteractiveObject)& theIO, bool toSupressShrinking)
+{
+ if (MYDEBUG) MESSAGE("VISU::PrsMerger_i::CreateActor this="<<this);
+ return VISU::ScalarMap_i::CreateActor(theIO, toSupressShrinking);
+}
+
+VISU_Actor* VISU::PrsMerger_i::CreateActor(const Handle(SALOME_InteractiveObject)& theIO)
+{
+ return CreateActor(theIO, false);
+}
+
+void VISU::PrsMerger_i::UpdateActor(VISU_Actor* theActor) {
+ if (MYDEBUG) MESSAGE("VISU::PrsMerger_i::UpdateActor this="<<this);
+
+ TSuperClass::UpdateActor(theActor);
+}
+
+void
+VISU::PrsMerger_i::
+SetMeshOnGroup(const char* theMeshName,
+ const char* theGroupName)
+{
+ if (MYDEBUG) MESSAGE("VISU::PrsMerger_i::SetMeshOnGroup:");
+ VISU::PIDMapper anIDMapper;
+ anIDMapper = myResult->GetInput()->GetMeshOnGroup(theMeshName,theGroupName);
+
+ VISU_MeshPL* aTmpMesh = VISU_MeshPL::New();
+ aTmpMesh->SetIDMapper(anIDMapper);
+
+ if(myPrsMergerPL->SetGeometry(aTmpMesh)){
+ this->clearMeshList();
+ myMeshPLList.push_back(aTmpMesh);
+ TPairStringAndInt aPair((std::string)theGroupName,-1);
+ myGeomNameEntityList.push_back(aPair);
+ }
+ else
+ aTmpMesh->Delete();
+
+ UpdateIcon();
+}
+
+CORBA::Long
+VISU::PrsMerger_i::
+AddMeshOnGroup(const char* theMeshName,
+ const char* theGroupName)
+{
+ if (MYDEBUG) MESSAGE("VISU::PrsMerger_i::AddMeshOnGroup |"<< theGroupName <<"| this="<<this);
+ CORBA::Long aRetVal = -1;
+ VISU::PIDMapper anIDMapper;
+ anIDMapper = myResult->GetInput()->GetMeshOnGroup(theMeshName,theGroupName);
+ if(!anIDMapper)
+ MESSAGE("Warning: There are no mesh with group=|"<<theGroupName<<"|");
+ if (MYDEBUG) MESSAGE("AddMeshOnGroup nbGeoms defore ="<<myPrsMergerPL->GetNbGeometry());
+
+ bool isGroupInList = false;
+ TNameAndEntityList::const_iterator aIter = myGeomNameEntityList.begin();
+ for(;aIter!=myGeomNameEntityList.end();aIter++){
+ if(aIter->first == std::string(theGroupName))
+ {
+ isGroupInList = true;
+ break;
+ }
+ }
+
+ if(!isGroupInList){
+ VISU_MeshPL* aTmpMesh = VISU_MeshPL::New();
+ aTmpMesh->SetIDMapper(anIDMapper);
+
+ aRetVal = myPrsMergerPL->AddBackGeometry(aTmpMesh);
+
+ if(aRetVal >-1 ){
+ myMeshPLList.push_back(aTmpMesh);
+ TPairStringAndInt aPair((std::string)theGroupName,-1);
+ myGeomNameEntityList.push_back(aPair);
+ }
+ else
+ aTmpMesh->Delete();
+
+ UpdateIcon();
+
+ }
+
+ if (MYDEBUG) MESSAGE("AddMeshOnGroup nbGeoms after ="<<myPrsMergerPL->GetNbGeometry());
+
+ return aRetVal;
+}
+
+void
+VISU::PrsMerger_i::
+SetFamilyOnEntity(const char* theMeshName,
+ const VISU::Entity theEntity,
+ const char* theFamilyName)
+{
+ VISU::PIDMapper anIDMapper;
+ anIDMapper = myResult->GetInput()->GetFamilyOnEntity(theMeshName,(VISU::TEntity)theEntity,theFamilyName);
+
+
+ VISU_MeshPL* aTmpMesh = VISU_MeshPL::New();
+ aTmpMesh->SetIDMapper(anIDMapper);
+
+ if(myPrsMergerPL->SetGeometry(aTmpMesh)){
+ myMeshPLList.push_back(aTmpMesh);
+ TPairStringAndInt aPair((std::string)theFamilyName,(int)theEntity);
+ myGeomNameEntityList.push_back(aPair);
+ }
+ else
+ aTmpMesh->Delete();
+}
+
+void
+VISU::PrsMerger_i::
+SetMeshOnEntity(const char* theMeshName,
+ const VISU::Entity theEntity)
+{
+ VISU::PIDMapper anIDMapper;
+ anIDMapper = myResult->GetInput()->GetMeshOnEntity(theMeshName,(VISU::TEntity)theEntity);
+ VISU_MeshPL* aTmpMesh = VISU_MeshPL::New();
+ aTmpMesh->SetIDMapper(anIDMapper);
+
+ if(myPrsMergerPL->SetGeometry(aTmpMesh)){
+ myMeshPLList.push_back(aTmpMesh);
+ TPairStringAndInt aPair("",(int)theEntity);
+ myGeomNameEntityList.push_back(aPair);
+ }
+ else
+ aTmpMesh->Delete();
+}
+
+void
+VISU::PrsMerger_i::
+SetScalarMap(const char* theMeshName,
+ const VISU::Entity theEntity,
+ const char* theFieldName,
+ CORBA::Long theStampsNum)
+{
+ if (MYDEBUG) MESSAGE("VISU::PrsMerger_i::SetScalarMap this="<<this);
+ VISU::PIDMapper anIDMapper;
+ anIDMapper = myResult->GetInput()->GetTimeStampOnMesh(theMeshName,(VISU::TEntity)theEntity,theFieldName,int(theStampsNum));
+
+ myEntity = (VISU::TEntity)theEntity;
+ myFieldName = theFieldName;
+ myIteration = theStampsNum;
+
+ myScalarsPL->SetIDMapper(anIDMapper);
+ myPrsMergerPL->SetScalars(myScalarsPL);
+}
+
+void
+VISU::PrsMerger_i::
+SetScalarMap(VISU_PipeLine* thePipeLine)
+{
+ if (MYDEBUG) MESSAGE("VISU::PrsMerger_i::SetScalarMap");
+ VISU_ScalarMapPL* aInputScalars = dynamic_cast<VISU_ScalarMapPL*>(thePipeLine);
+ VISU::PIDMapper anIDMapper = aInputScalars->GetIDMapper();
+ myScalarsPL->SetIDMapper(anIDMapper);
+ if(aInputScalars)
+ myPrsMergerPL->SetScalars(myScalarsPL);
+}
+
+void
+VISU::PrsMerger_i::
+RemoveGeometryByName(const char* theName)
+{
+ // not implemented yet.
+}
+
+void
+VISU::PrsMerger_i::
+RemoveGeometryById(CORBA::Long theId)
+{
+ if(myGeomNameEntityList.size() != myMeshPLList.size()){
+ // warning situation. Some information lost
+ // check myGeomNameEntityList and myMeshPLList
+ }
+
+ if(theId >=0 && (int)theId < myMeshPLList.size()){
+ VISU_PrsMergerPL::TPipeLines::iterator aIter = myMeshPLList.begin();
+ for(;aIter != myMeshPLList.end();aIter++){
+ if( myMeshPLList[theId] == (*aIter)){
+ myMeshPLList.erase(aIter);
+ break;
+ }
+ }
+ }
+ if(theId >=0 && (int)theId < myGeomNameEntityList.size()){
+ TNameAndEntityList::iterator aIter = myGeomNameEntityList.begin();
+ for(;aIter != myGeomNameEntityList.end();aIter++){
+ if( myGeomNameEntityList[theId] == (*aIter) ){
+ myGeomNameEntityList.erase(aIter);
+ break;
+ }
+ }
+ }
+ myPrsMergerPL->RemoveGeometryById((int)theId);
+}
+
+void
+VISU::PrsMerger_i
+::DoHook(){
+ if(!myPipeLine) myPipeLine = VISU_PrsMergerPL::New();
+ myPrsMergerPL = dynamic_cast<VISU_PrsMergerPL*>(myPipeLine);
+ myPipeLine->GetMapper()->SetScalarVisibility(IsColored());
+ TSuperClass::DoHook();
+}
+
+const char*
+VISU::PrsMerger_i
+::GetIconName()
+{
+ if (!GetNumberOfGeom())
+ return "ICON_TREE_SCALAR_MAP";
+ else
+ return "ICON_TREE_SCALAR_MAP_GROUPS";
+}
+
+void VISU::PrsMerger_i
+::UpdateIcon()
+{
+ if (mySObject->_is_nil())
+ return;
+
+ SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder();
+
+ // Check if the icon needs to be updated, update if necessary
+ SALOMEDS::GenericAttribute_var anAttr;
+ SALOMEDS::AttributePixMap_var aPixmap;
+
+ anAttr = aStudyBuilder->FindOrCreateAttribute( mySObject, "AttributePixMap" );
+ aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr );
+
+ if ( aPixmap->GetPixMap() != (std::string)GetIconName() )
+ aPixmap->SetPixMap(GetIconName());
+
+ // Update Object Browser
+ SUIT_Session* aSession = SUIT_Session::session();
+ QPtrList<SUIT_Application> anApplications = aSession->applications();
+ QPtrListIterator<SUIT_Application> anIter (anApplications);
+ while (SUIT_Application* aSApp = anIter.current()) {
+ SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>(aSApp);
+ if (!anApp) return;
+ SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>(anApp->activeStudy());
+ if (!aStudy) return;
+ if (_PTR(Study) aCStudy = aStudy->studyDS()) {
+ if (myStudy->StudyId() == aCStudy->StudyId()) {
+ anApp->updateObjectBrowser();
+ break;
+ }
+ }
+ ++anIter;
+ }
+}
+
+CORBA::Long
+VISU::PrsMerger_i
+::GetNumberOfGeom()
+{
+ if(myPrsMergerPL)
+ return myPrsMergerPL->GetNbGeometry();
+ else
+ return 0;
+}
+
+string_array*
+VISU::PrsMerger_i
+::getGroupNames()
+{
+ string_array_var myseq = new string_array;
+ if(myPrsMergerPL){
+ vector<string> aGroupNames;
+ TNameAndEntityList::const_iterator aIter = myGeomNameEntityList.begin();
+ for(;aIter!=myGeomNameEntityList.end();aIter++){
+ TPairStringAndInt aPair = (*aIter);
+ if(aPair.second == -1)
+ aGroupNames.push_back(aPair.first);
+ }
+ myseq->length(aGroupNames.size());
+ vector<string>::const_iterator aNamesIter = aGroupNames.begin();
+ for(int i=0;aNamesIter!=aGroupNames.end();i++,aNamesIter++){
+ myseq[i] = CORBA::string_dup((*aNamesIter).c_str());
+ }
+ }
+ return myseq._retn();
+}
+
+bool
+VISU::PrsMerger_i
+::CheckGroup(const char* theGroupName)
+{
+ if (MYDEBUG) MESSAGE("PrsMerger_i::CheckGroup :|"<<theGroupName<<"|");
+ string aMeshName = myMeshName;
+ string aGroupName = theGroupName;
+
+ VISU::PIDMapper anIDMapper;
+ anIDMapper = myResult->GetInput()->GetMeshOnGroup(aMeshName,theGroupName);
+ if (MYDEBUG) MESSAGE("anIDMapper="<<anIDMapper);
+ if(!anIDMapper) return false;
+
+ bool aAllPoints = true;
+ if(anIDMapper->GetVTKOutput()->GetNumberOfCells()>0){
+ int aVtkCellType = anIDMapper->GetVTKOutput()->GetCellType(0);
+ if (MYDEBUG) MESSAGE("CellType="<<aVtkCellType);
+ switch(myEntity){
+ case NODE_ENTITY:
+ case CELL_ENTITY:
+ if(aVtkCellType != VTK_LINE &&
+ aVtkCellType != VTK_POLY_LINE &&
+ aVtkCellType != VTK_VERTEX &&
+ aVtkCellType != VTK_PIXEL)
+ aAllPoints = false;
+ break;
+ case EDGE_ENTITY:
+ if(aVtkCellType == VTK_LINE ||
+ aVtkCellType == VTK_POLY_LINE)
+ aAllPoints = false;
+ break;
+ case FACE_ENTITY:
+ if(aVtkCellType == VTK_TRIANGLE ||
+ aVtkCellType == VTK_TRIANGLE_STRIP ||
+ aVtkCellType == VTK_POLYGON ||
+ aVtkCellType == VTK_QUAD)
+ aAllPoints = false;
+ break;
+ }
+ }
+
+ if (MYDEBUG) MESSAGE("return="<<!aAllPoints);
+ return (!aAllPoints);
+}
+
--- /dev/null
+// VISU OBJECT : interactive object for VISU entities implementation
+//
+// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//
+// File : VISU_PrsMerger_i.hh
+// Author : Eugeny Nikolaev
+// Module : VISU
+
+#ifndef VISU_PrsMerger_i_HeaderFile
+#define VISU_PrsMerger_i_HeaderFile
+
+#include "VISU_I.hxx"
+
+#include "VISU_ScalarMap_i.hh"
+#include "VISU_PrsMergerPL.hxx"
+
+#include "VISUConfig.hh"
+
+class VISU_MeshPL;
+
+namespace VISU{
+
+ class VISU_I_EXPORT PrsMerger_i : public virtual POA_VISU::ScalarMap,
+ public virtual ScalarMap_i
+ {
+
+ /*!
+ * eON_GROUP - mesh created on group
+ * eFAMILY_ON_ENTITY - mesh created on family on entity
+ * eON_ENTITY - mesh created on entity (default value)
+ */
+ enum EMeshGeomPlace {eON_GROUP=1,eFAMILY_ON_ENTITY=2,eON_ENTITY=3};
+
+ static int myNbPresent;
+
+ public:
+ PrsMerger_i();
+ PrsMerger_i(const PrsMerger_i&);
+
+ typedef ScalarMap_i TSuperClass;
+ typedef std::pair<std::string,int> TPairStringAndInt;
+ typedef std::vector<TPairStringAndInt> TNameAndEntityList;
+
+ explicit
+ PrsMerger_i(Result_i* theResult,
+ bool theAddToStudy);
+ explicit
+ PrsMerger_i(Result_i* theResult,
+ SALOMEDS::SObject_ptr theSObject);
+ virtual void SameAs(const Prs3d_i* theOrigin);
+ virtual ~PrsMerger_i();
+
+ virtual VISU::VISUType GetType() { return VISU::TPRSMERGER;};
+
+ virtual CORBA::Boolean IsColored() { return myIsColored; }
+ virtual void ShowColored(CORBA::Boolean theColored) { myIsColored = theColored; }
+
+ virtual SALOMEDS::Color GetColor() { return myColor;}
+ virtual void SetColor(const SALOMEDS::Color& theColor) { myColor = theColor;}
+
+ VISU_PrsMergerPL* GetPrsMergerPL(){ return myPrsMergerPL;}
+
+ protected:
+ virtual void DoHook();
+ virtual const char* GetIconName();
+ void UpdateIcon();
+ void clearMeshList();
+
+ VISU_PrsMergerPL* myPrsMergerPL;
+ VISU_PrsMergerPL::TPipeLines myMeshPLList;
+ VISU_ScalarMapPL* myScalarsPL;
+
+ SALOMEDS::Color myColor;
+ bool myIsColored;
+
+ /*! Warning! This variable must be maked as list, if
+ * you we will need in different mesh entities (ENTITY,FAMILY,GROUP) as geometries.
+ */
+ TNameAndEntityList myGeomNameEntityList;
+
+ public:
+ static int IsPossible(Result_i* theResult, const char* theMeshName, VISU::Entity theEntity,
+ const char* theFieldName, int theIteration, int isMemoryCheck = true);
+
+ virtual Storable* Create(const char* theMeshName, VISU::Entity theEntity,
+ const char* theFieldName, int theIteration);
+
+ virtual void ToStream(std::ostringstream& theStr);
+
+ virtual Storable* Restore(const Storable::TRestoringMap& theMap);
+
+ virtual
+ void
+ SetMapScale(double theMapScale = 1.0);
+
+ static const std::string myComment;
+ virtual const char* GetComment() const;
+ virtual QString GenerateName();
+
+ virtual
+ VISU_Actor*
+ CreateActor(const Handle(SALOME_InteractiveObject)& theIO = NULL);
+
+ virtual
+ VISU_Actor*
+ CreateActor(const Handle(SALOME_InteractiveObject)& theIO, bool toSupressShrinking);
+
+ virtual void UpdateActor(VISU_Actor* theActor) ;
+
+ /*!
+ * Sets geometry of mesh as group
+ */
+ virtual void SetMeshOnGroup(const char* theMeshName,
+ const char* theGroupName);
+
+ /*!
+ * Add geometry of mesh as group
+ * \retval the id of added group.
+ */
+ virtual CORBA::Long AddMeshOnGroup(const char* theMeshName,
+ const char* theGroupName);
+
+ /*!
+ * Remove geometry from list by Name
+ */
+ virtual void RemoveGeometryByName(const char* theName);
+
+ /*!
+ * Removes geometry from list by id
+ * Note: theId number in [0,...]
+ *
+ * Waring: if you delete not 0 element, others indexes will be increased.
+ * Example:
+ * 0,1,2,3,4 - indexes
+ * remove 2 index
+ * new sequence:
+ * 0,1,2,3,4 , where are 0 = 0, 1 = 1, 3 = 2, 4 = 3.
+ */
+ virtual void RemoveGeometryById(CORBA::Long theId);
+
+
+ /*!
+ * Sets geometry of mesh as family on entity
+ */
+ virtual void SetFamilyOnEntity(const char* theMeshName,
+ const VISU::Entity theEntity,
+ const char* theFamilyName);
+
+ /*!
+ * Sets geometry of mesh as mesh on entity
+ */
+ virtual void SetMeshOnEntity(const char* theMeshName,
+ const VISU::Entity theEntity);
+
+
+ /*!
+ * Sets scalars as scalar map
+ */
+ virtual void SetScalarMap(const char* theMeshName,
+ VISU::Entity theEntity,
+ const char* theFieldName,
+ CORBA::Long theStampsNum);
+
+ /*!
+ * Get number of geometries.
+ */
+ CORBA::Long GetNumberOfGeom();
+
+
+ /*!
+ * Get group names.
+ */
+ string_array* getGroupNames();
+
+ /*!
+ * Sets scalars as scalar map
+ */
+ void SetScalarMap(VISU_PipeLine* thePipeLine);
+
+ /*!
+ * Removes all geometries.
+ */
+ virtual void RemoveAllGeom();
+
+
+ /*! Warning!
+ * see \a myGeomNameEntityList
+ */
+ virtual CORBA::Long GetMeshGeometryPlace(CORBA::Long theId){return CORBA::Long(1);};// must bee filled
+
+ /*!
+ * Return true, if group is good, esle false.
+ * May be used, if SetScalarMap(...) olready .
+ */
+ bool CheckGroup(const char* theGroupName);
+
+ };
+
+}
+
+#endif
#include "VISUConfig.hh"
namespace VISU{
- class PrsObject_i : public virtual POA_VISU::PrsObject,
+ class VISU_I_EXPORT PrsObject_i : public virtual POA_VISU::PrsObject,
public virtual RemovableObject_i
{
PrsObject_i(const PrsObject_i&);
#include <qfileinfo.h>
#include <qsemaphore.h>
#include <qthread.h>
+#include <qdir.h>
// VTK Includes
#include <vtkCell.h>
aName->SetValue(theName);
}
if (theComment != "") {
- anAttr = aStudyBuilder->FindOrCreateAttribute(aNewObj, "AttributeComment");
- _PTR(AttributeComment) aCmnt (anAttr);
+ anAttr = aStudyBuilder->FindOrCreateAttribute(aNewObj, "AttributeString");
+ _PTR(AttributeString) aCmnt (anAttr);
aCmnt->SetValue(theComment);
}
return aNewObj->GetID();
aName->SetValue(theName);
}
if (theComment != "") {
- anAttr = aStudyBuilder->FindOrCreateAttribute(aSObject, "AttributeComment");
- _PTR(AttributeComment) aCmnt (anAttr);
+ anAttr = aStudyBuilder->FindOrCreateAttribute(aSObject, "AttributeString");
+ _PTR(AttributeString) aCmnt (anAttr);
aCmnt->SetValue(theComment);
}
}
theIsAtOnce = true;
if(Build(SALOMEDS::SObject::_nil(),theIsAtOnce)){
+
+ // Set icon
+ SALOMEDS::StudyBuilder_var aStudyBuilder = myStudyDocument->NewBuilder();
+
+ SALOMEDS::GenericAttribute_var anAttr;
+ SALOMEDS::AttributePixMap_var aPixmap;
+
+ anAttr = aStudyBuilder->FindOrCreateAttribute( mySObject, "AttributePixMap" );
+ aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr );
+ aPixmap ->SetPixMap("ICON_TREE_RESULT");
+
if(theIsBuildAll)
return BuildAll();
return true;
}
-
+
return false;
}
if(mySourceId == eRestoredFile){
std::string aTmpDir(SALOMEDS_Tool::GetTmpDir());
static QString aCommand;
- aCommand.sprintf("cp %s %s",myFileInfo.absFilePath().latin1(),aTmpDir.c_str());
- if(system(aCommand) == -1){
+ aCommand.sprintf(" %s %s", myFileInfo.absFilePath().latin1(), aTmpDir.c_str() );
+ aCommand = QDir::convertSeparators( aCommand );
+ aCommand.prepend( COPY_COMMAND );
+
+ if(system(aCommand.latin1()) == -1){
MESSAGE("Create - Can't execute the command :"<<aCommand);
return NULL;
}
if (IsMultifile()) { // set this file as new - temporary
static QString aCommand;
- aCommand.sprintf("mv %s %s%s",aHDFFileName, aResultPath, myFileInfo.baseName().latin1());
- if (system(aCommand) == -1) {
+ aCommand.sprintf(" %s %s%s",aHDFFileName, aResultPath, myFileInfo.baseName().latin1());
+ aCommand = QDir::convertSeparators( aCommand );
+ aCommand.prepend( MOVE_COMMAND );
+
+ if (system(aCommand.latin1()) == -1) {
if(MYDEBUG) MESSAGE("VISU::Result_i::Restore - Can't execute the command :" << aCommand);
return NULL;
} else {
myFileInfo.setFile(QString(aResultPath) + QString(myFileInfo.baseName().latin1()));
} else { // change current temporary file to the new: with hdf-format
static QString aCommand;
- aCommand.sprintf("mv %s %s\0",aHDFFileName, myFileInfo.filePath().latin1());
- if (system(aCommand.latin1()) == -1) {
+ aCommand.sprintf(" %s %s\0",aHDFFileName, myFileInfo.filePath().latin1());
+ aCommand = QDir::convertSeparators( aCommand );
+ aCommand.prepend( MOVE_COMMAND );
+
+ if (system(aCommand.latin1()) == -1) {
if(MYDEBUG) MESSAGE("VISU::Result_i::Restore - Can't execute the command :" << aCommand);
return NULL;
} else {
GetComment(), VISU::TRESULT, myFileInfo.filePath().latin1(),
myInitFileName.c_str()); // Restoring of Python dump
SALOMEDS::GenericAttribute_var anAttr;
- if (!theSObject->FindAttribute(anAttr, "AttributeComment"))
- throw std::runtime_error("Build - There is no AttributeComment for the SObject !!!");
- SALOMEDS::AttributeComment_var aCmnt = SALOMEDS::AttributeComment::_narrow(anAttr);
+ if (!theSObject->FindAttribute(anAttr, "AttributeString"))
+ throw std::runtime_error("Build - There is no AttributeString for the SObject !!!");
+ SALOMEDS::AttributeString_var aCmnt = SALOMEDS::AttributeString::_narrow(anAttr);
aCmnt->SetValue(aComment.latin1());
}
bool anIsBuildAll = VISU::GetResourceMgr()->booleanValue("VISU", "full_med_loading", false);
MESSAGE("Result_i::~Result_i() - this = "<<this);
if (mySourceId == eRestoredFile) {
static QString aCommand;
+#ifndef WNT
aCommand.sprintf("rm %s",myFileInfo.filePath().latin1());
+#else
+ aCommand.sprintf("del /F %s",myFileInfo.filePath().latin1());
+#endif
int res = system(aCommand);
MESSAGE("Result_i::~Result_i - system("<<aCommand<<") = "<<res);
+
+#ifndef WNT
aCommand.sprintf("rmdir --ignore-fail-on-non-empty %s",myFileInfo.dirPath().latin1());
+#else
+ aCommand.sprintf("del /F %s",myFileInfo.dirPath().latin1());
+#endif
+
res = system(aCommand);
MESSAGE("Result_i::~Result_i - system("<<aCommand<<") = "<<res);
}
{
// check presence of theMeshName
const VISU::TMeshMap& meshMap = myInput->GetMeshMap();
- if ( meshMap.find( theMeshName ) == meshMap.end() ) {
+ PMesh theMesh;
+ VISU::TMeshMap::const_iterator aIter = meshMap.find( theMeshName );
+ if ( aIter == meshMap.end() ) {
MESSAGE("No mesh named " << theMeshName );
return components;
- }
+ } else
+ theMesh = aIter->second;
- VISU::PIDMapper anIDMapper = myInput->GetMeshOnEntity(theMeshName,
- CELL_ENTITY);
- VISU::TVTKOutput* aMesh = anIDMapper->GetVTKOutput();
+ if(!theMesh->IsStructured() || theMesh->myType){
- if ( !aMesh || aMesh->GetNumberOfCells() == 0 ) {
- MESSAGE( "No cells in the mesh: " << theMeshName );
- return components;
- }
-
- // define axis directions and min cell size in each direction
- const int nbAxes = 3;
- int iAx;
- gp_Vec axDirs[ nbAxes ];
- float minSize[3] = { FLT_MAX, FLT_MAX, FLT_MAX };
- bool axesComputed = false;
- for ( vtkIdType iCell = 0; iCell < aMesh->GetNumberOfCells(); ++iCell )
- {
- vtkCell* cell = aMesh->GetCell( iCell );
- int nbPnt = cell->GetNumberOfPoints();
- if ( nbPnt != 8 )
- continue;
- vtkPoints * points = cell->GetPoints();
- vtkFloatingPointType* coords[ 4 ];
- coords[0] = points->GetPoint( 0 );
- coords[1] = points->GetPoint( 1 );
- coords[2] = points->GetPoint( 3 );
- coords[3] = points->GetPoint( 4 );
- gp_Pnt p0( coords[0][0], coords[0][1], coords[0][2] );
- for ( iAx = 0; iAx < nbAxes; ++iAx )
- {
- vtkFloatingPointType* coo = coords[ iAx + 1 ];
- gp_Pnt p( coo[0], coo[1], coo[2] );
- // min size
- vtkFloatingPointType size = p0.SquareDistance( p );
- if ( size > FLT_MIN && size < minSize[ iAx ] )
- minSize[ iAx ] = size;
- // axis direction
- if ( !axesComputed ) {
- gp_Vec dir( p0, p );
- if ( dir.SquareMagnitude() <= DBL_MIN )
- break;
- axDirs[ iAx ] = dir;
- }
+ VISU::PIDMapper anIDMapper = myInput->GetMeshOnEntity(theMeshName,
+ CELL_ENTITY);
+
+ VISU::TVTKOutput* aMesh = anIDMapper->GetVTKOutput();
+
+ if ( !aMesh || aMesh->GetNumberOfCells() == 0 ) {
+ MESSAGE( "No cells in the mesh: " << theMeshName );
+ return components;
}
- if ( iAx == nbAxes )
- axesComputed = true;
- }
- if ( !axesComputed ) {
- MESSAGE("No good hexahedrons in the mesh: " << theMeshName );
- return components;
- }
-
- // compute axes dirs
- gInfo = & myMeshName2GridInfoMap[ theMeshName ];
- for ( iAx = 0; iAx < nbAxes; ++iAx )
- {
- int iPrev = ( iAx == 0 ) ? 2 : iAx - 1;
- int iNext = ( iAx == 2 ) ? 0 : iAx + 1;
- gInfo->myAxis[ iAx ] = axDirs[ iPrev ] ^ axDirs[ iNext ];
- }
-
- // get and sort intermediate component values - projections of nodes
- // on axis direction; define bnd box
- set< vtkFloatingPointType > comps[ 3 ];
- Bnd_Box box;
- vtkPoints * points = aMesh->GetPoints();
- vtkIdType iP, nbP = aMesh->GetNumberOfPoints();
- for ( iP = 0; iP < nbP; ++iP )
- {
- vtkFloatingPointType* coo = points->GetPoint( iP );
- gp_Pnt p( coo[0], coo[1], coo[2] );
- box.Add( p );
+
+ // define axis directions and min cell size in each direction
+ const int nbAxes = 3;
+ int iAx;
+ gp_Vec axDirs[ nbAxes ];
+ float minSize[3] = { FLT_MAX, FLT_MAX, FLT_MAX };
+ bool axesComputed = false;
+ for ( vtkIdType iCell = 0; iCell < aMesh->GetNumberOfCells(); ++iCell )
+ {
+ vtkCell* cell = aMesh->GetCell( iCell );
+ int nbPnt = cell->GetNumberOfPoints();
+ if ( nbPnt != 8 )
+ continue;
+ vtkPoints * points = cell->GetPoints();
+ vtkFloatingPointType* coords[ 4 ];
+ coords[0] = points->GetPoint( 0 );
+ coords[1] = points->GetPoint( 1 );
+ coords[2] = points->GetPoint( 3 );
+ coords[3] = points->GetPoint( 4 );
+ gp_Pnt p0( coords[0][0], coords[0][1], coords[0][2] );
+ for ( iAx = 0; iAx < nbAxes; ++iAx )
+ {
+ vtkFloatingPointType* coo = coords[ iAx + 1 ];
+ gp_Pnt p( coo[0], coo[1], coo[2] );
+ // min size
+ vtkFloatingPointType size = p0.SquareDistance( p );
+ if ( size > FLT_MIN && size < minSize[ iAx ] )
+ minSize[ iAx ] = size;
+ // axis direction
+ if ( !axesComputed ) {
+ gp_Vec dir( p0, p );
+ if ( dir.SquareMagnitude() <= DBL_MIN )
+ break;
+ axDirs[ iAx ] = dir;
+ }
+ }
+ if ( iAx == nbAxes )
+ axesComputed = true;
+ }
+ if ( !axesComputed ) {
+ MESSAGE("No good hexahedrons in the mesh: " << theMeshName );
+ return components;
+ }
+
+ // compute axes dirs
+ gInfo = & myMeshName2GridInfoMap[ theMeshName ];
+ for ( iAx = 0; iAx < nbAxes; ++iAx )
+ {
+ int iPrev = ( iAx == 0 ) ? 2 : iAx - 1;
+ int iNext = ( iAx == 2 ) ? 0 : iAx + 1;
+ gInfo->myAxis[ iAx ] = axDirs[ iPrev ] ^ axDirs[ iNext ];
+ }
+
+ // get and sort intermediate component values - projections of nodes
+ // on axis direction; define bnd box
+ set< vtkFloatingPointType > comps[ 3 ];
+ Bnd_Box box;
+ vtkPoints * points = aMesh->GetPoints();
+ vtkIdType iP, nbP = aMesh->GetNumberOfPoints();
+ for ( iP = 0; iP < nbP; ++iP )
+ {
+ vtkFloatingPointType* coo = points->GetPoint( iP );
+ gp_Pnt p( coo[0], coo[1], coo[2] );
+ box.Add( p );
+ for ( iAx = 0; iAx < nbAxes; ++iAx ) {
+ const gp_Dir& dir = gInfo->myAxis[ iAx ];
+ vtkFloatingPointType dot = dir.XYZ() * p.XYZ();
+ comps[ iAx ].insert( dot );
+ }
+ }
+
+ // find a range of projections of bnd box corners on each axis
+ vtkFloatingPointType range[3], firstValue[3];
+ double x[2],y[2],z[2];
+ box.Get(x[0],y[0],z[0],x[1],y[1],z[1]);
for ( iAx = 0; iAx < nbAxes; ++iAx ) {
- const gp_Dir& dir = gInfo->myAxis[ iAx ];
- vtkFloatingPointType dot = dir.XYZ() * p.XYZ();
- comps[ iAx ].insert( dot );
+ set< vtkFloatingPointType > bndComps;
+ const gp_Dir& dir = gInfo->myAxis[ iAx ];
+ for ( int iX = 0; iX < 2; ++iX ) {
+ for ( int iY = 0; iY < 2; ++iY ) {
+ for ( int iZ = 0; iZ < 2; ++iZ ) {
+ gp_Pnt p( x[ iX ], y[ iY ], z[ iZ ] );
+ vtkFloatingPointType dot = dir.XYZ() * p.XYZ();
+ bndComps.insert( dot );
+ }
+ }
+ }
+ firstValue[ iAx ] = *bndComps.begin();
+ range[ iAx ] = *bndComps.rbegin() - *bndComps.begin();
}
+
+ // compute component values
+ for ( iAx = 0; iAx < nbAxes; ++iAx )
+ {
+ list< vtkFloatingPointType > values;
+ int nbVals = 0;
+ set< vtkFloatingPointType >& comp = comps[ iAx ];
+ set< vtkFloatingPointType >::iterator val = comp.begin();
+ vtkFloatingPointType bnd = -1., rng = range[ iAx ], first = firstValue[ iAx ];
+ vtkFloatingPointType tol = 0.1 * sqrt( minSize[ iAx ]) / rng;
+ for ( ; val != comp.end(); ++val ) {
+ vtkFloatingPointType value = ( *val - first ) / rng;
+ if ( value > bnd ) {
+ values.push_back( value );
+ bnd = value + tol;
+ nbVals++;
+ }
+ }
+ // store values in gInfo
+ vector< vtkFloatingPointType >& myComp = gInfo->myComponets[ iAx ];
+ myComp.resize( nbVals );
+ list< vtkFloatingPointType >::iterator v = values.begin();
+ for ( int i = 0; v != values.end(); ++v ){
+ myComp[ i++ ] = *v;
+ }
+ }
}
+ else {
+ //ENK: 23.11.2006 - PAL13176 - EDF228 VISU : Enhancement of structured datas processing
+ TVectorID aIndexes = theMesh->GetStructure();
- // find a range of projections of bnd box corners on each axis
- vtkFloatingPointType range[3], firstValue[3];
- double x[2],y[2],z[2];
- box.Get(x[0],y[0],z[0],x[1],y[1],z[1]);
- for ( iAx = 0; iAx < nbAxes; ++iAx ) {
- set< vtkFloatingPointType > bndComps;
- const gp_Dir& dir = gInfo->myAxis[ iAx ];
- for ( int iX = 0; iX < 2; ++iX ) {
- for ( int iY = 0; iY < 2; ++iY ) {
- for ( int iZ = 0; iZ < 2; ++iZ ) {
- gp_Pnt p( x[ iX ], y[ iY ], z[ iZ ] );
- vtkFloatingPointType dot = dir.XYZ() * p.XYZ();
- bndComps.insert( dot );
- }
- }
+ VISU::PIDMapper anIDMapper = myInput->GetMeshOnEntity(theMeshName,
+ CELL_ENTITY);
+ VISU::TVTKOutput* aMesh = anIDMapper->GetVTKOutput();
+
+ gInfo = & myMeshName2GridInfoMap[ theMeshName ];
+ switch(aIndexes.size()){
+ case 3:
+ {
+ gp_Dir aDir(0.0,0.0,1.0);
+ gInfo->myAxis[ 2 ] = aDir;
+ }
+ case 2:
+ {
+ gp_Dir aDir(0.0,1.0,0.0);
+ gInfo->myAxis[ 1 ] = aDir;
+ }
+ case 1:
+ {
+ gp_Dir aDir(1.0,0.0,0.0);
+ gInfo->myAxis[ 0 ] = aDir;
+ }
}
- firstValue[ iAx ] = *bndComps.begin();
- range[ iAx ] = *bndComps.rbegin() - *bndComps.begin();
- }
-
- // compute component values
- for ( iAx = 0; iAx < nbAxes; ++iAx )
- {
- list< vtkFloatingPointType > values;
- int nbVals = 0;
- set< vtkFloatingPointType >& comp = comps[ iAx ];
- set< vtkFloatingPointType >::iterator val = comp.begin();
- vtkFloatingPointType bnd = -1., rng = range[ iAx ], first = firstValue[ iAx ];
- vtkFloatingPointType tol = 0.1 * sqrt( minSize[ iAx ]) / rng;
- for ( ; val != comp.end(); ++val ) {
- vtkFloatingPointType value = ( *val - first ) / rng;
- if ( value > bnd ) {
- values.push_back( value );
- bnd = value + tol;
- nbVals++;
- }
+
+ int nbPoints = aMesh->GetNumberOfPoints();
+ vtkFloatingPointType* coords[ 2 ];
+ if(nbPoints>1){
+ coords[0] = aMesh->GetPoints()->GetPoint(0);
+ coords[1] = aMesh->GetPoints()->GetPoint(nbPoints-1);
+ }
+
+ vector<vtkFloatingPointType> PointsCoords[3];
+ TIdTypeVector aCoordIJK;
+ switch(aIndexes.size()){
+ case 3:
+ {
+ vtkIdType nbZ = aIndexes[2];
+ aCoordIJK.clear();
+ aCoordIJK.resize(aIndexes.size(),1);
+ for(int i=0;i<nbZ;i++){
+ aCoordIJK[2]=i+1;
+ vtkIdType aObjID = anIDMapper->GetObjectIDByIndexes(aCoordIJK);
+ vtkIdType aVTKID = anIDMapper->GetNodeVTKID(aObjID);
+ vtkFloatingPointType* aPCoord = aMesh->GetPoints()->GetPoint(aVTKID);
+ PointsCoords[2].push_back(aPCoord[2]);
+ }
+ }
+ case 2:
+ {
+ vtkIdType nbJ = aIndexes[1];
+ aCoordIJK.clear();
+ aCoordIJK.resize(aIndexes.size(),1);
+ for(int i=0;i<nbJ;i++){
+ aCoordIJK[1]=i+1;
+ vtkIdType aObjID = anIDMapper->GetObjectIDByIndexes(aCoordIJK);
+ vtkIdType aVTKID = anIDMapper->GetNodeVTKID(aObjID);
+ vtkFloatingPointType* aPCoord = aMesh->GetPoints()->GetPoint(aVTKID);
+ PointsCoords[1].push_back(aPCoord[1]);
+ }
+ }
+ case 1:
+ {
+ vtkIdType nbI = aIndexes[0];
+ aCoordIJK.clear();
+ aCoordIJK.resize(aIndexes.size(),1);
+ for(int i=0;i<nbI;i++){
+ aCoordIJK[0]=i+1;
+ vtkIdType aObjID = anIDMapper->GetObjectIDByIndexes(aCoordIJK);
+ vtkIdType aVTKID = anIDMapper->GetNodeVTKID(aObjID);
+ vtkFloatingPointType* aPCoord = aMesh->GetPoints()->GetPoint(aVTKID);
+ PointsCoords[0].push_back(aPCoord[0]);
+ }
+ }
}
- // store values in gInfo
- vector< vtkFloatingPointType >& myComp = gInfo->myComponets[ iAx ];
- myComp.resize( nbVals );
- list< vtkFloatingPointType >::iterator v = values.begin();
- for ( int i = 0; v != values.end(); ++v )
- myComp[ i++ ] = *v;
+ for(int i=0;i<aIndexes.size();i++){
+ vector< vtkFloatingPointType >& myComp = gInfo->myComponets[ i ];
+ int aSize = PointsCoords[i].size();
+ if(aSize>0){
+ vtkFloatingPointType aLen = PointsCoords[i][aSize-1] - PointsCoords[i][0];
+ myComp.resize(aSize);
+ myComp[0] = 0;
+ for(int k=1;k<aSize;k++){
+ myComp[k]=myComp[k-1] + (PointsCoords[i][k]-PointsCoords[i][k-1])/aLen;
+ }
+ }
+ }
+
+ //ENK: 23.11.2006
}
}
namespace VISU
{
//----------------------------------------------------------------------------
- class MinMaxCunsomer: public virtual boost::signalslib::trackable
+ class VISU_I_EXPORT MinMaxCunsomer: public virtual
+#ifdef WNT
+ boost::bsignals::trackable
+#else
+ boost::signalslib::trackable
+#endif
{
protected:
bool myMinMaxIsInitilized;
//----------------------------------------------------------------------------
- class Result_i : public virtual POA_VISU::Result,
+ class VISU_I_EXPORT Result_i : public virtual POA_VISU::Result,
public virtual RemovableObject_i,
public virtual SALOME::GenericObj_i
{
- Result_i();
Result_i(const Result_i &);
public:
#include "VISU_ScalarMapOnDeformedShapePL.hxx"
#include "VISU_Result_i.hh"
-#include "VISU_ScalarMap_i.hh"
#include "VISU_ScalarMapOnDeformedShape_i.hh"
#include "VISU_Convertor.hxx"
#include "VISU_ScalarMapAct.h"
{
bool aResult = false;
try{
- aResult = VISU::ScalarMap_i::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration,false);
+ aResult = TSuperClass::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration,false);
if(isMemoryCheck && aResult){
const VISU::PField aField = theResult->GetInput()->GetField(theMeshName,(VISU::TEntity)theEntity,theFieldName);
if(aField->myNbComp <= 1)
Prs3d_i(theResult,theAddToStudy),
ColoredPrs3d_i(theResult,theAddToStudy),
ScalarMap_i(theResult,theAddToStudy),
+ TSuperClass(theResult,theAddToStudy),
myScalarMapOnDeformedShapePL(NULL),
myScalarIteration(1)
{
Prs3d_i(theResult,theSObject),
ColoredPrs3d_i(theResult,theSObject),
ScalarMap_i(theResult,theSObject),
+ TSuperClass(theResult,theSObject),
myScalarMapOnDeformedShapePL(NULL),
myScalarIteration(1)
{
return myScalarMapOnDeformedShapePL->GetScale();
}
+void
+VISU::ScalarMapOnDeformedShape_i
+::SetRange(CORBA::Double theMin, CORBA::Double theMax)
+{
+ if(theMin > theMax)
+ return;
+ vtkFloatingPointType aScalarRange[2] = {theMin, theMax};
+ myScalarMapOnDeformedShapePL->SetScalarRange(aScalarRange);
+ myIsFixedRange = true;
+}
+
void VISU::ScalarMapOnDeformedShape_i::SetSourceRange(CORBA::Double theMinRange,CORBA::Double theMaxRange){
- vtkFloatingPointType aRange[2];
- aRange[0] = vtkFloatingPointType(theMinRange);
- aRange[1] = vtkFloatingPointType(theMaxRange);
- myScalarMapOnDeformedShapePL->SetScalarRange(aRange);
+ SetRange(theMinRange,theMaxRange);
+}
+
+void
+VISU::ScalarMapOnDeformedShape_i
+::SetSourceRange()
+{
+ myScalarMapOnDeformedShapePL->SetSourceRange();
+ myIsFixedRange = false;
}
CORBA::Double VISU::ScalarMapOnDeformedShape_i::GetSourceRangeMin(){
TSuperClass::DoHook();
}
+const char*
+VISU::ScalarMapOnDeformedShape_i
+::GetIconName()
+{
+ if (!GetNumberOfGeom())
+ return "ICON_TREE_SCALAR_MAP_ON_DEFORMED_SHAPE";
+ else
+ return "ICON_TREE_SCALAR_MAP_ON_DEFORMED_SHAPE_GROUPS";
+}
+
VISU_Actor* VISU::ScalarMapOnDeformedShape_i::CreateActor(const Handle(SALOME_InteractiveObject)& theIO)
{
if(MYDEBUG) cout << "VISU::ScalarMapOnDeformedShape_i::CreateActor:"<<__LINE__<<endl;
std::string VISU::ScalarMapOnDeformedShape_i::GetScalarMeshName(){
return myScalarMeshName;
}
+char* VISU::ScalarMapOnDeformedShape_i::GetScalarCMeshName(){
+ return &this->GetScalarMeshName()[0];
+}
void VISU::ScalarMapOnDeformedShape_i::SetScalarFieldName(const char* theName){
myScalarFieldName = theName;
}
+
std::string VISU::ScalarMapOnDeformedShape_i::GetScalarFieldName(){
return myScalarFieldName;
}
+char* VISU::ScalarMapOnDeformedShape_i::GetScalarCFieldName(){
+ return &this->GetScalarFieldName()[0];
+}
+
void VISU::ScalarMapOnDeformedShape_i::SetScalarIteration(const int theValue){
myScalarIteration = theValue;
}
return myScalarIteration;
}
+CORBA::Long VISU::ScalarMapOnDeformedShape_i::GetScalarLIteration(){
+ return CORBA::Long(this->GetScalarIteration());
+}
+
void VISU::ScalarMapOnDeformedShape_i::SetScalarEntity(const VISU::TEntity theValue){
myScalarEntity = theValue;
}
{
return myScalarField;
}
+
+void
+VISU::ScalarMapOnDeformedShape_i
+::SetMapScale(double theMapScale)
+{
+ myScalarMapOnDeformedShapePL->SetMapScale(theMapScale);
+}
+
+CORBA::Double
+VISU::ScalarMapOnDeformedShape_i
+::GetMin()
+{
+ return myScalarMapOnDeformedShapePL->GetScalarRange()[0];
+}
+
+CORBA::Double
+VISU::ScalarMapOnDeformedShape_i
+::GetMax()
+{
+ return myScalarMapOnDeformedShapePL->GetScalarRange()[1];
+}
#ifndef VISU_ScalarMapOnDeformedShape_i_HeaderFile
#define VISU_ScalarMapOnDeformedShape_i_HeaderFile
-#include "VISU_ScalarMap_i.hh"
+#include "VISU_PrsMerger_i.hh"
class VISU_ScalarMapOnDeformedShapePL;
namespace VISU{
//! Class of Scalar Map on Deformed Shape presentation.
- class ScalarMapOnDeformedShape_i : public virtual POA_VISU::ScalarMapOnDeformedShape,
- public virtual ScalarMap_i
+ class VISU_I_EXPORT ScalarMapOnDeformedShape_i : public virtual POA_VISU::ScalarMapOnDeformedShape,
+ public virtual PrsMerger_i
{
static int myNbPresent;
- ScalarMapOnDeformedShape_i();
ScalarMapOnDeformedShape_i(const ScalarMapOnDeformedShape_i&);
public:
- typedef ScalarMap_i TSuperClass;
+ typedef PrsMerger_i TSuperClass;
explicit
ScalarMapOnDeformedShape_i(Result_i* theResult,
virtual void SetScale(CORBA::Double theScale);
virtual CORBA::Double GetScale();
+ virtual
+ void
+ SetRange(CORBA::Double theMin, CORBA::Double theMax);
+
virtual CORBA::Boolean IsColored() { return myIsColored; }
virtual void ShowColored(CORBA::Boolean theColored) { myIsColored = theColored; }
virtual void SetColor(const SALOMEDS::Color& theColor) { myColor = theColor;}
virtual void SetSourceRange(CORBA::Double theMinRange,CORBA::Double theMaxRange);
+
+ virtual
+ CORBA::Double
+ GetMin();
+
+ virtual
+ CORBA::Double
+ GetMax();
+
+ virtual
+ void
+ SetSourceRange();
+
virtual CORBA::Double GetSourceRangeMin();
virtual CORBA::Double GetSourceRangeMax();
void
DoHook();
+ virtual
+ const char*
+ GetIconName();
+
VISU_ScalarMapOnDeformedShapePL *myScalarMapOnDeformedShapePL;
SALOMEDS::Color myColor;
bool myIsColored;
static Storable* Restore(SALOMEDS::SObject_ptr theSObject,
const std::string& thePrefix, const Storable::TRestoringMap& theMap);
+
+ virtual
+ void
+ SetMapScale(double theMapScale = 1.0);
+
static const std::string myComment;
virtual const char* GetComment() const;
virtual void SetScalarFieldName(const char* theName);
virtual std::string GetScalarFieldName();
+ virtual char* GetScalarCFieldName();
virtual void SetScalarIteration(const int theValue);
virtual int GetScalarIteration();
+ virtual CORBA::Long GetScalarLIteration();
virtual void SetScalarMeshName(const char* theName);
virtual std::string GetScalarMeshName();
+ virtual char* GetScalarCMeshName();
virtual void SetScalarEntity(const VISU::TEntity theValue);
virtual VISU::TEntity GetScalarEntity();
virtual void SetScalarEEntity(const VISU::Entity theValue);
myField = anInput->GetField(myMeshName,myEntity,myFieldName);
if(!myField)
throw std::runtime_error("There is no Field with the parameters !!!");
-
+
VISU::PIDMapper anIDMapper =
anInput->GetTimeStampOnMesh(myMeshName,myEntity,myFieldName,myIteration);
throw std::runtime_error("There is no TimeStamp with the parameters !!!");
myScalarMapPL->SetIDMapper(anIDMapper);
- myScalarMapPL->Init();
+ // mkr : 23.11.2006 - PAL13908 - save animation range if range is fixed -->
+ if ( myIsFixedRange )
+ myScalarMapPL->SetScalarMode(0);
+ else
+ myScalarMapPL->Init();
+ // mkr : 23.11.2006 <--
myScalarMapPL->Build();
}
if(VISU_ScalarMapAct* anActor = dynamic_cast<VISU_ScalarMapAct*>(theActor)){
VISU_ScalarBarActor *aScalarBar = anActor->GetScalarBar();
aScalarBar->SetLookupTable(myScalarMapPL->GetBarTable());
- aScalarBar->SetTitle(myTitle.c_str());
+ aScalarBar->SetTitle(GetScalarBarTitle().c_str()); // mkr : IPAL14030
aScalarBar->SetOrientation(myOrientation);
aScalarBar->GetPositionCoordinate()->SetCoordinateSystemToNormalizedViewport();
aScalarBar->GetPositionCoordinate()->SetValue(myPosition[0],myPosition[1]);
namespace VISU
{
//============================================================================
- class ScalarMap_i : public virtual POA_VISU::ScalarMap,
+ class VISU_I_EXPORT ScalarMap_i : public virtual POA_VISU::ScalarMap,
public virtual ColoredPrs3d_i
{
static int myNbPresent;
- ScalarMap_i();
ScalarMap_i(const ScalarMap_i&);
public:
- //----------------------------------------------------------------------------
+ //----------------------------------------------------------------------------
typedef ColoredPrs3d_i TSuperClass;
explicit
const char* theFieldName, int theIteration, int isMemoryCheck)
{
try{
- if(!VISU::ScalarMap_i::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration,false))
+ if(!TSuperClass::IsPossible(theResult,theMeshName,theEntity,theFieldName,theIteration,false))
return 0;
VISU::PIDMapper anIDMapper =
Prs3d_i(theResult,theAddToStudy),
ColoredPrs3d_i(theResult,theAddToStudy),
ScalarMap_i(theResult,theAddToStudy),
+ PrsMerger_i(theResult,theAddToStudy),
DeformedShape_i(theResult,theAddToStudy),
myStreamLinesPL(NULL),
myAppendFilter(vtkAppendFilter::New())
Prs3d_i(theResult,theSObject),
ColoredPrs3d_i(theResult,theSObject),
ScalarMap_i(theResult,theSObject),
+ PrsMerger_i(theResult,theSObject),
DeformedShape_i(theResult,theSObject),
myStreamLinesPL(NULL),
myAppendFilter(vtkAppendFilter::New())
DeformedShape_i::DoHook();
}
+const char*
+VISU::StreamLines_i
+::GetIconName()
+{
+ if (!GetNumberOfGeom())
+ return "ICON_TREE_STREAM_LINES";
+ else
+ return "ICON_TREE_STREAM_LINES_GROUPS";
+}
void VISU::StreamLines_i::Update() {
SetSource();
class vtkAppendFilter;
namespace VISU{
- class StreamLines_i : public virtual POA_VISU::StreamLines,
+ class VISU_I_EXPORT StreamLines_i : public virtual POA_VISU::StreamLines,
public virtual DeformedShape_i
{
static int myNbPresent;
- StreamLines_i();
StreamLines_i(const StreamLines_i&);
public:
protected:
virtual void DoHook();
+
+ virtual const char* GetIconName();
+
virtual void SetSource(VISU::Prs3d_ptr thePrs3d);
virtual void SetSource(VISU::Prs3d_i* thePrs3d);
virtual void SetSource();
else{
aComment.sprintf("myComment=%s;myType=%d;mySourceId=TableAttr",GetComment(),VISU::TTABLE);
SALOMEDS::SObject_var aFatherSObject = SO->GetFather();
- if(aFatherSObject->FindAttribute(anAttr,"AttributeComment")){
- SALOMEDS::AttributeComment_var aCommentAttr =
- SALOMEDS::AttributeComment::_narrow(anAttr);
+ if(aFatherSObject->FindAttribute(anAttr,"AttributeString")){
+ SALOMEDS::AttributeString_var aCommentAttr =
+ SALOMEDS::AttributeString::_narrow(anAttr);
CORBA::String_var aValue = aCommentAttr->Value();
Storable::TRestoringMap aMap;
Storable::StrToMap(aValue.in(),aMap);
// mpv (PAL5357): reference attributes are unnecessary now
//SALOMEDS::SObject_var refSO = Builder->NewObject( mySObj );
//Builder->Addreference( refSO, SO );
- }
+ }
+
+ // Set icon
+ SALOMEDS::AttributePixMap_var aPixmap;
+
+ anAttr = Builder->FindOrCreateAttribute( mySObj, "AttributePixMap" );
+ aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr );
+ aPixmap->SetPixMap("ICON_TREE_TABLE");
+
return this;
}
return NULL;
true );
// create SObject referenced to real table object
mySObj = SALOMEDS::SObject::_duplicate(myStudy->FindObjectID(anEntry.c_str()));
+
+ // Set icon
+ SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder();
+
+ SALOMEDS::GenericAttribute_var anAttr;
+ SALOMEDS::AttributePixMap_var aPixmap;
+
+ anAttr = aStudyBuilder->FindOrCreateAttribute( mySObj, "AttributePixMap" );
+ aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr );
+ aPixmap ->SetPixMap("ICON_TREE_CURVE");
}
return this;
}
aComment.latin1(),
true );
mySObj = SALOMEDS::SObject::_duplicate(myStudy->FindObjectID(anEntry.c_str()));
+
+ // Set icon
+ SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder();
+
+ SALOMEDS::GenericAttribute_var anAttr;
+ SALOMEDS::AttributePixMap_var aPixmap;
+
+ anAttr = aStudyBuilder->FindOrCreateAttribute( mySObj, "AttributePixMap" );
+ aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr );
+ aPixmap ->SetPixMap("ICON_TREE_CONTAINER");
}
return this;
}
SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr);
QFileInfo aFileInfo(theFileName);
aName->SetValue(aFileInfo.fileName().latin1());
- anAttr = aStudyBuilder->FindOrCreateAttribute(aFileObject, "AttributeComment");
- SALOMEDS::AttributeComment_var aComment = SALOMEDS::AttributeComment::_narrow(anAttr);
+ anAttr = aStudyBuilder->FindOrCreateAttribute(aFileObject, "AttributeString");
+ SALOMEDS::AttributeString_var aComment = SALOMEDS::AttributeString::_narrow(anAttr);
QString aString;
aString.sprintf("myComment=ImportTables;myFileName=%s",
aFileInfo.absFilePath().latin1());
namespace VISU{
//==============================================================================
- class Table_i : public virtual POA_VISU::Table,
+ class VISU_I_EXPORT Table_i : public virtual POA_VISU::Table,
public virtual PrsObject_i
{
static int myNbPresent;
- Table_i();
Table_i( const Table_i& );
public:
Table_i( SALOMEDS::Study_ptr theStudy, const char* theObject );
SALOMEDS::SObject_var ImportTables(const char* theFileName, SALOMEDS::Study_ptr theStudy);
bool ExportTableToFile(SALOMEDS::SObject_ptr theTable, const char* theFileName);
//==============================================================================
- class Curve_i : public virtual POA_VISU::Curve,
+ class VISU_I_EXPORT Curve_i : public virtual POA_VISU::Curve,
public virtual PrsObject_i
{
static int myNbPresent;
};
//==============================================================================
- class Container_i : public virtual POA_VISU::Container,
+ class VISU_I_EXPORT Container_i : public virtual POA_VISU::Container,
public virtual PrsObject_i
{
static int myNbPresent;
#include "VISU_TimeAnimation.h"
+#ifdef WNT
+#include <windows.h>
+#include <vfw.h>
+#include <qmessagebox.h>
+#endif
+
#include "VISUConfig.hh"
#include "VISU_Result_i.hh"
#include "VISU_Prs3d_i.hh"
#include "VISU_Mesh_i.hh"
-#include "VISU_ScalarMap_i.hh"
+#include "VISU_PrsMerger_i.hh"
#include "VISU_IsoSurfaces_i.hh"
#include "VISU_DeformedShape_i.hh"
#include "VISU_ScalarMapOnDeformedShape_i.hh"
#include "SUIT_Session.h"
#include "SUIT_Study.h"
-#include "SALOMEDSClient_AttributeComment.hxx"
+#include "SALOMEDSClient_AttributeString.hxx"
#include "SALOMEDSClient_AttributeName.hxx"
+#include "CASCatch.hxx"
#include <qpixmap.h>
#include <qimage.h>
myStudy = theStudy;
myIsActive = false;
myFrame = 0;
- mySpeed = 1;
- myProportional = false;
+ mySpeed = VISU::GetResourceMgr()->integerValue("VISU", "speed", 1);
+ myProportional = VISU::GetResourceMgr()->booleanValue("VISU", "use_proportional_timing", false);
myView = 0;
if (!CORBA::is_nil(theView3D)) {
connect( myView, SIGNAL( destroyed() ), this, SLOT( onViewDeleted() ) );
}
+ myAnimationMode = 0;
myTimeMinVal = 0;
myTimeMaxVal = 0;
myTimeMin = 0;
myTimeMax = 0;
myLastError = "";
- myCycling = false;
+ myCycling = VISU::GetResourceMgr()->booleanValue("VISU", "cycled_animation", false);
+ myCleaningMemoryAtEachFrame = VISU::GetResourceMgr()->booleanValue("VISU", "clean_memory_at_each_frame", false);
myAnimEntry = "";
for (int i = 0; i < getNbFields(); i++) {
clearData(myFieldsLst[i]);
}
-
+ clearFieldData();
/* Terminates the execution of the thread.
* The thread may or may not be terminated immediately,
* depending on the operating system's scheduling policies.
//------------------------------------------------------------------------
-void VISU_TimeAnimation::addField (_PTR(SObject) theField)
+bool VISU_TimeAnimation::addField (_PTR(SObject) theField)
{
+ if (!theField) return false;
+
FieldData aNewData;
aNewData.myField = theField;
aNewData.myNbFrames = 0;
- aNewData.myPrsType = VISU::TSCALARMAP;
+ aNewData.myPrsType = VISU::TPRSMERGER;
aNewData.myOffset[0] = aNewData.myOffset[1] = aNewData.myOffset[2] = 0;
VISU::Storable::TRestoringMap aMap = getMapOfValue(aNewData.myField);
+ if(VISU::Storable::FindValue(aMap,"myComment") != QString("FIELD"))
+ return false;
+
aNewData.myNbTimes = VISU::Storable::FindValue(aMap,"myNbTimeStamps").toLong();
- myFieldsLst.append(aNewData);
+ if ( myAnimationMode == 0 ) { // parallel animation mode
+ if ( aNewData.myNbTimes < 2 )
+ return false;
+ if ( !myFieldsLst.isEmpty() && myFieldsLst.first().myNbTimes != aNewData.myNbTimes )
+ return false;
+ if ( myFieldsLst.isEmpty() )
+ myFieldsAbsFrames.push_back(aNewData.myNbTimes);
+ }
+ else { // succcessive animation mode
+ if ( aNewData.myNbTimes < 1 )
+ return false;
+
+ long aNumCompCurr = VISU::Storable::FindValue(aMap, "myNumComponent").toLong();
+ if ( !myFieldsLst.isEmpty() ) {
+ VISU::Storable::TRestoringMap aFMap = getMapOfValue(myFieldsLst.first().myField);
+ long aNumComp = VISU::Storable::FindValue(aFMap, "myNumComponent").toLong();
+ if ( aNumCompCurr != aNumComp )
+ return false;
+ }
+
+ if ( !myFieldsLst.isEmpty() )
+ myFieldsAbsFrames.push_back(myFieldsAbsFrames.back() + aNewData.myNbTimes);
+ else
+ myFieldsAbsFrames.push_back(aNewData.myNbTimes);
+ }
+
+ myFieldsLst.append(aNewData);
+
//find Min/Max timestamps
- if ((myTimeMin == 0) && (myTimeMax == 0)) {
- _PTR(ChildIterator) anIter = myStudy->NewChildIterator(theField);
- anIter->Next(); // First is reference on support
+ _PTR(ChildIterator) anIter = myStudy->NewChildIterator(theField);
+ anIter->Next(); // First is reference on support
+ if ( myFieldsLst.size() == 1 ) { // the first field
myTimeMin = getTimeValue(anIter->Value());
- for(; anIter->More(); anIter->Next()) {
+ myTimeMax = getTimeValue(anIter->Value());
+ }
+ for(; anIter->More(); anIter->Next()) {
+ if ( myTimeMin > getTimeValue(anIter->Value()) )
+ myTimeMin = getTimeValue(anIter->Value());
+ if ( myTimeMax < getTimeValue(anIter->Value()) )
myTimeMax = getTimeValue(anIter->Value());
- }
}
+
+ return true;
}
//------------------------------------------------------------------------
-void VISU_TimeAnimation::addField (SALOMEDS::SObject_ptr theField)
+bool VISU_TimeAnimation::addField (SALOMEDS::SObject_ptr theField)
{
SALOMEDS::SObject_var theFieldDup = SALOMEDS::SObject::_duplicate(theField);
_PTR(SObject) aField = VISU::GetClientSObject(theFieldDup, myStudy);
- addField(aField);
+ return addField(aField);
}
//------------------------------------------------------------------------
-void VISU_TimeAnimation::clearData(FieldData& theData) {
+void VISU_TimeAnimation::_clearData(FieldData& theData) {
if (!myView) {
MESSAGE("Viewer is not defined for animation");
return;
myView->update();
}
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::clearData(FieldData& theData) {
+ ProcessVoidEvent(new TVoidMemFun1ArgEvent<VISU_TimeAnimation,FieldData&>
+ (this,&VISU_TimeAnimation::_clearData,theData));
+}
namespace
{
int aRangeType = VISU::GetResourceMgr()->integerValue("VISU" , "scalar_range_type", 0);
if( aRangeType != 1 ){
for(long aFrameId = 0; aFrameId < theData.myNbFrames; aFrameId++) {
- if (VISU::ScalarMap_i* aPrs = dynamic_cast<VISU::ScalarMap_i*>(theData.myPrs[aFrameId])){
+ if (VISU::PrsMerger_i* aPrs = dynamic_cast<VISU::PrsMerger_i*>(theData.myPrs[aFrameId])){
aPrs->SetRange(aMin, aMax);
aPrs->SetOffset(theData.myOffset);
}
}
}
}
-
+
+double getMinFieldsValue( QValueList<FieldData>& theFieldsLst )
+{
+ // for succcessive animation mode only
+ double aRes;
+ for (int i = 0; i < theFieldsLst.count(); i++) {
+ if ( theFieldsLst[i].myPrs[0] ) {
+ aRes = theFieldsLst[i].myPrs[0]->GetMin();
+ break;
+ }
+ }
+
+ for (int i = 1; i < theFieldsLst.count() && theFieldsLst[i].myPrs[0]; i++) {
+ if ( aRes > theFieldsLst[i].myPrs[0]->GetMin() )
+ aRes = theFieldsLst[i].myPrs[0]->GetMin();
+ }
+ return aRes;
+}
+
+double getMaxFieldsValue( QValueList<FieldData>& theFieldsLst )
+{
+ // for succcessive animation mode only
+ double aRes;
+ for (int i = 0; i < theFieldsLst.count(); i++) {
+ if ( theFieldsLst[i].myPrs[0] ) {
+ aRes = theFieldsLst[i].myPrs[0]->GetMax();
+ break;
+ }
+ }
+
+ for (int i = 1; i < theFieldsLst.count() && theFieldsLst[i].myPrs[0]; i++) {
+ if ( aRes < theFieldsLst[i].myPrs[0]->GetMax() )
+ aRes = theFieldsLst[i].myPrs[0]->GetMax();
+ }
+ return aRes;
+}
+
void VISU_TimeAnimation::generatePresentations(CORBA::Long theFieldNum) {
FieldData& aData = myFieldsLst[theFieldNum];
using namespace VISU;
switch (aData.myPrsType) {
- case VISU::TSCALARMAP: // ScalarMap
- GeneratePresentations<ScalarMap_i>(myStudy,
+ case VISU::TSCALARMAP:
+ case VISU::TPRSMERGER: // ScalarMap
+ GeneratePresentations<PrsMerger_i>(myStudy,
aData,
aResult,
isRangeDefined(),
MESSAGE("Not implemented for this presentation type: " << aData.myPrsType);
return;
}
+
+ if ( myAnimationMode == 1 ) { // succcessive animation mode
+ if ( isRangeDefined() ) {
+ if ( myFieldsAbsFrames.size() == getNbFields() )
+ myFieldsAbsFrames.clear();
+ if ( theFieldNum > 0 )
+ myFieldsAbsFrames.push_back(myFieldsAbsFrames.back() + aData.myNbFrames);
+ else
+ myFieldsAbsFrames.push_back(aData.myNbFrames);
+ }
+ if ((theFieldNum == getNbFields() - 1) && aData.myPrsType != VISU::TGAUSSPOINTS){
+ double aMin = getMinFieldsValue(myFieldsLst);
+ double aMax = getMaxFieldsValue(myFieldsLst);
+ for (int i = 0; i < getNbFields(); i++)
+ for(long aFrameId = 0; aFrameId < myFieldsLst[i].myNbFrames; aFrameId++)
+ if (aData.myPrsType == VISU::TISOSURFACE) {
+ if (VISU::IsoSurfaces_i* aPrs = dynamic_cast<VISU::IsoSurfaces_i*>(myFieldsLst[i].myPrs[aFrameId]))
+ aPrs->SetSubRange(aMin, aMax);
+ }
+ else
+ if (VISU::ScalarMap_i* aPrs = dynamic_cast<VISU::ScalarMap_i*>(myFieldsLst[i].myPrs[aFrameId]))
+ aPrs->SetRange(aMin, aMax);
+ }
+ }
}
//------------------------------------------------------------------------
-CORBA::Boolean VISU_TimeAnimation::generateFrames() {
+CORBA::Boolean VISU_TimeAnimation::_generateFrames() {
if (!myView) {
MESSAGE("Viewer is not defined for animation");
return false;
aData.myPrs[j]->SetOffset(aData.myOffset);
aActor = aData.myPrs[j]->CreateActor();
myView->AddActor(aActor);
- if(j == 0)
+ bool condition = ( myAnimationMode == 0 ) ? (j == 0) : (j == 0 && i == 0);
+ if(condition)
aActor->VisibilityOn();
else
aActor->VisibilityOff();
}
myFrame = 0;
myLastError += QString(" timestamp(s) cannot be created.");
- emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
+ ProcessVoidEvent(new TVoidMemFun2ArgEvent<VISU_TimeAnimation,long,double>(this, &VISU_TimeAnimation::_emitFrameChanged,
+ myFrame, myFieldsLst[0].myTiming[myFrame]));
myView->Repaint();
return aNoError;
}
//------------------------------------------------------------------------
-void VISU_TimeAnimation::clearView() {
+CORBA::Boolean VISU_TimeAnimation::generateFrames()
+{
+ return ProcessEvent(new TMemFunEvent<VISU_TimeAnimation,bool>
+ (this,&VISU_TimeAnimation::_generateFrames));
+}
+
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::_clearView() {
if (!myView) {
MESSAGE("Viewer is not defined for animation");
return;
}
//------------------------------------------------------------------------
-void VISU_TimeAnimation::stopAnimation() {
+void VISU_TimeAnimation::clearView()
+{
+ ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
+ (this,&VISU_TimeAnimation::_clearView));
+}
+
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::_visibilityOff(int num_field, int num_frame) {
+ if ( num_field < 0 || num_frame < 0 ) return;
+ FieldData& aData = myFieldsLst[num_field];
+ if ( aData.myActors.empty() ) return;
+ VISU_Actor* aActor = aData.myActors[num_frame];
+ if (! myCleaningMemoryAtEachFrame) {
+ //
+ // Usual behaviour : VisibilityOff()
+ // Problem : It don't clean the memory so if there is
+ // a lot of frames, the memory grows dramatically
+ //
+ aActor->VisibilityOff();
+ } else {
+ //
+ // myCleaningMemoryAtEachFrame behaviour:
+ // Delete the actor and re-creation it with VisibilityOff()
+ // since it takes memory only at VisibilityOn()
+ //
+ // Delete the actor
+ aActor->RemoveFromRender(myView->getRenderer());
+ // Re-create the actor
+ aActor = aData.myPrs[num_frame]->CreateActor();
+ myView->AddActor(aActor);
+ aActor->VisibilityOff();
+ aData.myActors[num_frame] = aActor;
+ }
+}
+
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::visibilityOff(int num_field, int num_frame)
+{
+ ProcessVoidEvent(new TVoidMemFun2ArgEvent<VISU_TimeAnimation,int,int>
+ (this,&VISU_TimeAnimation::_visibilityOff,num_field,num_frame));
+}
+
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::_stopAnimation() {
myIsActive = false;
}
//------------------------------------------------------------------------
-void VISU_TimeAnimation::startAnimation() {
+void VISU_TimeAnimation::stopAnimation()
+{
+ ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
+ (this,&VISU_TimeAnimation::_stopAnimation));
+}
+
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::_startAnimation() {
if (!myIsActive) {
myIsActive = true;
QThread::start();
}
//------------------------------------------------------------------------
-void VISU_TimeAnimation::nextFrame() {
+void VISU_TimeAnimation::startAnimation()
+{
+ ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
+ (this,&VISU_TimeAnimation::_startAnimation));
+}
+
+
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::_nextFrame() {
if (!myView) {
MESSAGE("Viewer is not defined for animation");
return;
}
stopAnimation();
- if (myFrame < (myFieldsLst[0].myNbFrames-1)) {
+ if (myFrame < getNbFrames() - 1 ) { //(myFieldsLst[0].myNbFrames-1)) {
int i;
- for (i = 0; i < getNbFields(); i++)
- if (myFieldsLst[i].myActors[myFrame] != 0)
- myFieldsLst[i].myActors[myFrame]->VisibilityOff();
+ std::pair<int,long> aPair;
+ int aFieldId;
+ long aFrameId;
+
+ if ( myAnimationMode == 0 ) { // parallel animation mode
+ for (i = 0; i < getNbFields(); i++)
+ if (myFieldsLst[i].myActors[myFrame] != 0)
+ visibilityOff(i, myFrame);
+ }
+ else { //succcessive animation mode
+ aPair = getRelativeFrameNumber(myFrame);
+ aFieldId = aPair.first;
+ aFrameId = aPair.second;
+ if (myFieldsLst[aFieldId].myActors[aFrameId] != 0)
+ visibilityOff(aFieldId, aFrameId);
+ }
myFrame++;
- for (i = 0; i < getNbFields(); i++)
- if (myFieldsLst[i].myActors[myFrame] != 0)
- myFieldsLst[i].myActors[myFrame]->VisibilityOn();
- emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
+ if ( myAnimationMode == 0 ) { // parallel animation mode
+ for (i = 0; i < getNbFields(); i++)
+ if (myFieldsLst[i].myActors[myFrame] != 0)
+ myFieldsLst[i].myActors[myFrame]->VisibilityOn();
+
+ ProcessVoidEvent(new TVoidMemFun2ArgEvent<VISU_TimeAnimation,long,double>(this, &VISU_TimeAnimation::_emitFrameChanged,
+ myFrame, myFieldsLst[0].myTiming[myFrame]));
+ }
+ else { //succcessive animation mode
+ aPair = getRelativeFrameNumber(myFrame);
+ aFieldId = aPair.first;
+ aFrameId = aPair.second;
+ if (myFieldsLst[aFieldId].myActors[aFrameId] != 0)
+ myFieldsLst[aFieldId].myActors[aFrameId]->VisibilityOn();
+
+ ProcessVoidEvent(new TVoidMemFun2ArgEvent<VISU_TimeAnimation,long,double>(this, &VISU_TimeAnimation::_emitFrameChanged,
+ myFrame, myFieldsLst[aFieldId].myTiming[aFrameId]));
+ }
myView->Repaint();
}
}
//------------------------------------------------------------------------
-void VISU_TimeAnimation::prevFrame() {
+void VISU_TimeAnimation::nextFrame()
+{
+ ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
+ (this,&VISU_TimeAnimation::_nextFrame));
+}
+
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::_prevFrame() {
if (!myView) {
MESSAGE("Viewer is not defined for animation");
return;
stopAnimation();
if (myFrame > 0) {
int i;
- for (i = 0; i < getNbFields(); i++)
- if (myFieldsLst[i].myActors[myFrame] != 0)
- myFieldsLst[i].myActors[myFrame]->VisibilityOff();
+ std::pair<int,long> aPair;
+ int aFieldId;
+ long aFrameId;
+
+ if ( myAnimationMode == 0 ) { // parallel animation mode
+ for (i = 0; i < getNbFields(); i++)
+ if (myFieldsLst[i].myActors[myFrame] != 0)
+ visibilityOff(i, myFrame);
+ }
+ else { //succcessive animation mode
+ aPair = getRelativeFrameNumber(myFrame);
+ aFieldId = aPair.first;
+ aFrameId = aPair.second;
+ if (myFieldsLst[aFieldId].myActors[aFrameId] != 0)
+ visibilityOff(aFieldId, aFrameId);
+ }
myFrame--;
- for (i = 0; i < getNbFields(); i++)
- if (myFieldsLst[i].myActors[myFrame] != 0)
- myFieldsLst[i].myActors[myFrame]->VisibilityOn();
- emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
+ if ( myAnimationMode == 0 ) { // parallel animation mode
+ for (i = 0; i < getNbFields(); i++)
+ if (myFieldsLst[i].myActors[myFrame] != 0)
+ myFieldsLst[i].myActors[myFrame]->VisibilityOn();
+
+ ProcessVoidEvent(new TVoidMemFun2ArgEvent<VISU_TimeAnimation,long,double>(this, &VISU_TimeAnimation::_emitFrameChanged,
+ myFrame, myFieldsLst[0].myTiming[myFrame]));
+ }
+ else { //succcessive animation mode
+ aPair = getRelativeFrameNumber(myFrame);
+ aFieldId = aPair.first;
+ aFrameId = aPair.second;
+ if (myFieldsLst[aFieldId].myActors[aFrameId] != 0)
+ myFieldsLst[aFieldId].myActors[aFrameId]->VisibilityOn();
+
+ ProcessVoidEvent(new TVoidMemFun2ArgEvent<VISU_TimeAnimation,long,double>(this, &VISU_TimeAnimation::_emitFrameChanged,
+ myFrame, myFieldsLst[aFieldId].myTiming[aFrameId]));
+ }
myView->Repaint();
}
}
//------------------------------------------------------------------------
-void VISU_TimeAnimation::firstFrame() {
+void VISU_TimeAnimation::prevFrame()
+{
+ ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
+ (this,&VISU_TimeAnimation::_prevFrame));
+}
+
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::_firstFrame() {
if (!myView) {
MESSAGE("Viewer is not defined for animation");
return;
}
stopAnimation();
int i;
- for (i = 0; i < getNbFields(); i++)
- if(!myFieldsLst[i].myActors.empty())
- if (myFieldsLst[i].myActors[myFrame] != 0)
- myFieldsLst[i].myActors[myFrame]->VisibilityOff();
+ if ( myAnimationMode == 0 ) { // parallel animation mode
+ for (i = 0; i < getNbFields(); i++)
+ if(!myFieldsLst[i].myActors.empty())
+ if (myFieldsLst[i].myActors[myFrame] != 0)
+ visibilityOff(i, myFrame);
+ }
+ else { //succcessive animation mode
+ std::pair<int,long> aPair = getRelativeFrameNumber(myFrame);
+ int aFieldId = aPair.first;
+ long aFrameId = aPair.second;
+ if(!myFieldsLst[aFieldId].myActors.empty())
+ if (myFieldsLst[aFieldId].myActors[aFrameId] != 0)
+ visibilityOff(aFieldId, aFrameId);
+ }
myFrame = 0;
- for (i = 0; i < getNbFields(); i++)
+
+ int imax;
+ if ( myAnimationMode == 0 ) // parallel animation mode
+ imax = getNbFields();
+ else //succcessive animation mode
+ imax = 1;
+
+ for (i = 0; i < imax; i++)
if(!myFieldsLst[i].myActors.empty())
if (myFieldsLst[i].myActors[myFrame] != 0)
myFieldsLst[i].myActors[myFrame]->VisibilityOn();
+
if(!myFieldsLst[0].myTiming.empty()){
- emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
+ ProcessVoidEvent(new TVoidMemFun2ArgEvent<VISU_TimeAnimation,long,double>(this, &VISU_TimeAnimation::_emitFrameChanged,
+ myFrame, myFieldsLst[0].myTiming[myFrame]));
myView->Repaint();
}
}
//------------------------------------------------------------------------
-void VISU_TimeAnimation::lastFrame() {
+void VISU_TimeAnimation::firstFrame()
+{
+ ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
+ (this,&VISU_TimeAnimation::_firstFrame));
+}
+
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::_lastFrame() {
if (!myView) {
MESSAGE("Viewer is not defined for animation");
return;
}
stopAnimation();
int i;
- for (i = 0; i < getNbFields(); i++)
- if (myFieldsLst[i].myActors[myFrame] != 0)
- myFieldsLst[i].myActors[myFrame]->VisibilityOff();
+ std::pair<int,long> aPair;
+ int aFieldId;
+ long aFrameId;
+
+ if ( myAnimationMode == 0 ) { // parallel animation mode
+ for (i = 0; i < getNbFields(); i++)
+ if (myFieldsLst[i].myActors[myFrame] != 0)
+ visibilityOff(i, myFrame);
+ }
+ else { //succcessive animation mode
+ aPair = getRelativeFrameNumber(myFrame);
+ aFieldId = aPair.first;
+ aFrameId = aPair.second;
+ if (myFieldsLst[aFieldId].myActors[aFrameId] != 0)
+ visibilityOff(aFieldId, aFrameId);
+ }
- myFrame = myFieldsLst[0].myNbFrames-1;
- for (i = 0; i < getNbFields(); i++)
- if (myFieldsLst[i].myActors[myFrame] != 0)
- myFieldsLst[i].myActors[myFrame]->VisibilityOn();
+ myFrame = getNbFrames() - 1; //myFieldsLst[0].myNbFrames-1;
+
+ if ( myAnimationMode == 0 ) { // parallel animation mode
+ for (i = 0; i < getNbFields(); i++)
+ if (myFieldsLst[i].myActors[myFrame] != 0)
+ myFieldsLst[i].myActors[myFrame]->VisibilityOn();
+
+ ProcessVoidEvent(new TVoidMemFun2ArgEvent<VISU_TimeAnimation,long,double>(this, &VISU_TimeAnimation::_emitFrameChanged,
+ myFrame, myFieldsLst[0].myTiming[myFrame]));
+ }
+ else { //succcessive animation mode
+ aPair = getRelativeFrameNumber(myFrame);
+ aFieldId = aPair.first;
+ aFrameId = aPair.second;
+ if (myFieldsLst[aFieldId].myActors[aFrameId] != 0)
+ myFieldsLst[aFieldId].myActors[aFrameId]->VisibilityOn();
+
+ ProcessVoidEvent(new TVoidMemFun2ArgEvent<VISU_TimeAnimation,long,double>(this, &VISU_TimeAnimation::_emitFrameChanged,
+ myFrame, myFieldsLst[aFieldId].myTiming[aFrameId]));
+ }
- emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
myView->Repaint();
}
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::lastFrame()
+{
+ ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
+ (this,&VISU_TimeAnimation::_lastFrame));
+}
+
//------------------------------------------------------------------------
// For Batchmode using
-void VISU_TimeAnimation::gotoFrame(CORBA::Long theFrame) {
+void VISU_TimeAnimation::_gotoFrame(CORBA::Long theFrame) {
if (!myView) {
MESSAGE("Viewer is not defined for animation");
return;
if ((theFrame < 0) || (theFrame > (getNbFrames()-1)))
return;
stopAnimation();
- qApp->lock();
- qApp->syncX();
int i;
- for (i = 0; i < getNbFields(); i++)
- if (myFieldsLst[i].myActors[myFrame] != 0)
- myFieldsLst[i].myActors[myFrame]->VisibilityOff();
+ std::pair<int,long> aPair;
+ int aFieldId;
+ long aFrameId;
+
+ if ( myAnimationMode == 0 ) { // parallel animation mode
+ for (i = 0; i < getNbFields(); i++)
+ if (myFieldsLst[i].myActors[myFrame] != 0)
+ visibilityOff(i, myFrame);
+ }
+ else { //succcessive animation mode
+ aPair = getRelativeFrameNumber(myFrame);
+ aFieldId = aPair.first;
+ aFrameId = aPair.second;
+ if (myFieldsLst[aFieldId].myActors[aFrameId] != 0)
+ visibilityOff(aFieldId, aFrameId);
+ }
myFrame = theFrame;
- for (i = 0; i < getNbFields(); i++)
- if (myFieldsLst[i].myActors[myFrame] != 0)
- myFieldsLst[i].myActors[myFrame]->VisibilityOn();
- emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
+ if ( myAnimationMode == 0 ) { // parallel animation mode
+ for (i = 0; i < getNbFields(); i++)
+ if (myFieldsLst[i].myActors[myFrame] != 0)
+ myFieldsLst[i].myActors[myFrame]->VisibilityOn();
+
+ ProcessVoidEvent(new TVoidMemFun2ArgEvent<VISU_TimeAnimation,long,double>(this, &VISU_TimeAnimation::_emitFrameChanged,
+ myFrame, myFieldsLst[0].myTiming[myFrame]));
+ }
+ else { //succcessive animation mode
+ aPair = getRelativeFrameNumber(myFrame);
+ aFieldId = aPair.first;
+ aFrameId = aPair.second;
+ if (myFieldsLst[aFieldId].myActors[aFrameId] != 0)
+ myFieldsLst[aFieldId].myActors[aFrameId]->VisibilityOn();
+
+ ProcessVoidEvent(new TVoidMemFun2ArgEvent<VISU_TimeAnimation,long,double>(this, &VISU_TimeAnimation::_emitFrameChanged,
+ myFrame, myFieldsLst[aFieldId].myTiming[aFrameId]));
+ }
+
myView->Repaint();
- qApp->flushX();
- qApp->processEvents(3);
- qApp->unlock();
}
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::gotoFrame(CORBA::Long theFrame)
+{
+ ProcessVoidEvent(new TVoidMemFun1ArgEvent<VISU_TimeAnimation,CORBA::Long>
+ (this,&VISU_TimeAnimation::_gotoFrame,theFrame));
+}
+
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::_emitFrameChanged(long theNewFrame, double theTime)
+{
+ emit frameChanged(theNewFrame, theTime);
+}
+
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::_emitStopped()
+{
+ emit stopped();
+}
//------------------------------------------------------------------------
VISU::ColoredPrs3d_ptr VISU_TimeAnimation::getPresentation(CORBA::Long theField, CORBA::Long theFrame) {
//------------------------------------------------------------------------
CORBA::Long VISU_TimeAnimation::getNbFrames() {
- return (getNbFields() > 0)? myFieldsLst[0].myNbFrames : 0;
+ if ( myAnimationMode == 0 ) // parallel animation mode
+ return (getNbFields() > 0)? myFieldsLst[0].myNbFrames : 0;
+ else //succcessive animation mode
+ return (getNbFields() > 0 && !myFieldsAbsFrames.empty()) ? myFieldsAbsFrames[myFieldsAbsFrames.size()-1] : 0;
}
+//------------------------------------------------------------------------
+long VISU_TimeAnimation::getAbsoluteFrameNumber(std::pair<int,long> theFieldTimeStamp)
+{
+ long aRes = -1;
+ if ( getNbFields() > 0 ) {
+ int aFieldId = theFieldTimeStamp.first;
+ long aFrameNum = theFieldTimeStamp.second + 1;
+ if ( myAnimationMode == 0 ) { // parallel animation mode
+ if ( aFrameNum <= myFieldsAbsFrames[0] )
+ aRes = aFrameNum;
+ }
+ else { //succcessive animation mode
+ if ( aFieldId == 0 && aFrameNum <= myFieldsAbsFrames[aFieldId] )
+ aRes = aFrameNum;
+ else if ( aFieldId && aFrameNum <= myFieldsAbsFrames[aFieldId] - myFieldsAbsFrames[aFieldId-1] )
+ aRes = myFieldsAbsFrames[aFieldId-1] + aFrameNum;
+ }
+ }
+ return aRes - 1;
+}
//------------------------------------------------------------------------
-void VISU_TimeAnimation::run()
+std::pair<int,long> VISU_TimeAnimation::getRelativeFrameNumber(long theFrame)
{
- if (!myView) {
- MESSAGE("Viewer is not defined for animation");
- return;
+ std::pair<int,long> aRes;
+ if ( getNbFields() > 0 && theFrame < getNbFrames() ) {
+ theFrame = theFrame + 1;
+ if ( myAnimationMode == 0 ) { // parallel animation mode
+ aRes.first = 0;
+ aRes.second = theFrame - 1;
+ }
+ else { //succcessive animation mode
+ for (int i = 0, iEnd = myFieldsAbsFrames.size(); i < iEnd; i++)
+ if ( myFieldsAbsFrames[i] >= theFrame ) {
+ aRes.first = i;
+ if ( i == 0 )
+ aRes.second = theFrame - 1;
+ else
+ aRes.second = theFrame-myFieldsAbsFrames[i-1] - 1;
+ break;
+ }
+ }
}
+ return aRes;
+}
+
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::parallelAnimation( bool& theIsDumping, QValueList<int>& theIndexList )
+{
double k = 1;
- bool isDumping = !myDumpPath.isEmpty();
double aOneVal = 1;
if (myFieldsLst[0].myNbFrames > 2)
- aOneVal = myFieldsLst[0].myTiming[1] - myFieldsLst[0].myTiming[0];
- myFileIndex = 0;
+ aOneVal = ( myTimeMax - myTimeMin ) / getNbFrames();
int aNbFiles = 0;
- QValueList<int> anIndexList;
-
- qApp->lock();
+
while (myIsActive) {
- emit frameChanged(myFrame, myFieldsLst[0].myTiming[myFrame]);
+ ProcessVoidEvent(new TVoidMemFun2ArgEvent<VISU_TimeAnimation,long,double>(this, &VISU_TimeAnimation::_emitFrameChanged,
+ myFrame, myFieldsLst[0].myTiming[myFrame]));
+ if (myIsActive) {
if(!(myFieldsLst[0].myField))
break;
for (int i = 0; i < getNbFields(); i++) {
FieldData& aData = myFieldsLst[i];
if (myFrame > 0) {
if (aData.myActors[myFrame-1] != 0)
- aData.myActors[myFrame-1]->VisibilityOff();
+ visibilityOff(i, myFrame-1);
} else {
if (aData.myActors[aData.myNbFrames-1] != 0)
- aData.myActors[aData.myNbFrames-1]->VisibilityOff();
+ visibilityOff(i, aData.myNbFrames-1);
}
if (aData.myActors[myFrame] != 0) {
- aData.myActors[myFrame]->VisibilityOn();
+ ProcessVoidEvent(new TVoidMemFunEvent<VISU_Actor>(aData.myActors[myFrame],
+ &VISU_Actor::VisibilityOn));
}
}
- myView->Repaint(false);
+ bool repainArg = false;
+ ProcessVoidEvent(new TVoidMemFun1ArgEvent<SVTK_ViewWindow,bool>(myView,
+ &SVTK_ViewWindow::Repaint,
+ repainArg));
+ }
k = 1;
if (myProportional) {
}
}
int delay = (int)(1000. * k / mySpeed);
- isDumping = !myDumpPath.isEmpty();
- if (delay < 1 && isDumping) {
+ theIsDumping = !myDumpPath.isEmpty();
+ if (delay < 1 && theIsDumping) {
// We must unlock mutex for some time before grabbing to allow view updating
delay = 1;
}
- qApp->unlock();
msleep(delay);
- qApp->lock();
+ if (!myIsActive) {
+ ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>(this,&VISU_TimeAnimation::_emitStopped));
+ return;
+ }
- if (isDumping) {
+ if (theIsDumping) {
// We must unlock mutex for some time before grabbing to allow view updating
- qApp->unlock();
msleep(delay);
- qApp->lock();
+ if (!myIsActive) { // this check was taken from WP_DEB branch
+ ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>(this,&VISU_TimeAnimation::_emitStopped));
+ return;
+ }
if(!(myFieldsLst[0].myField)) // break, if field was deleted.
break;
- if (myDumpFormat.compare("AVI") != 0) {
- QString aFile(myDumpPath);
- QString aName = QString("%1").arg(myFieldsLst[0].myTiming[myFrame]);
- int aPos = -1;
- while ((aPos = aName.find(".")) > -1 )
- aName.replace(aPos, 1, "_");
- aFile += aName;
- aFile += ".";
- aFile += myDumpFormat.lower();
- myView->dumpViewToFormat(aFile,myDumpFormat);
- } else {
- QFileInfo aFileInfo(myDumpPath);
- QString aDirPath = aFileInfo.dirPath(true);
- QString aBaseName = aFileInfo.fileName();
+ saveImages( 0, aOneVal, aNbFiles, theIndexList );
+ }
- switch (myFrame) {
- case 0:
- break;
- case 1:
- myFileIndex += 5;
- break;
- default:
- if (myProportional) {
- double p = (myFieldsLst[0].myTiming[myFrame] -
- myFieldsLst[0].myTiming[myFrame-1]) / aOneVal;
- myFileIndex += (long) (5*p);
- } else {
- myFileIndex += 5;
+ if (!myIsActive) break;
+
+ myFrame++;
+ if (myFrame == myFieldsLst[0].myNbFrames) {
+ if (!myCycling) {
+ myIsActive = false;
+ myFrame--;
+ break;
+ }
+ else
+ myFrame = 0;
+ }
+ }
+
+ // make AVI file if need
+ if (theIsDumping && myDumpFormat.compare("AVI") == 0) {
+ double aFPS = 17.3 * mySpeed;
+
+ QFileInfo aFileInfo(myDumpPath);
+ QString aDirPath = aFileInfo.dirPath(true);
+ QString aBaseName = aFileInfo.fileName();
+
+ // add missing files
+ if (theIndexList.count() > 1) {
+ QString aFFile = aDirPath + QDir::separator() + aBaseName;
+ aFFile += QString("_%1.jpeg");
+ int aStartIndex = theIndexList[0], anEndIndex;
+ for (int i = 1; i < theIndexList.count(); i++) {
+ anEndIndex = theIndexList[i];
+ QString aCurFile = aFFile.arg(QString::number(aStartIndex).rightJustify(8, '0'));
+ QStringList aCommands;
+ for (int j = aStartIndex+1; j < anEndIndex; j++) {
+ QString aFile = aFFile.arg(QString::number(j).rightJustify(8, '0'));
+ aCommands.append(QString("ln -s %1 %2").arg(aCurFile).arg(aFile));
+ }
+ system(aCommands.join(" ; \\\n").latin1());
+ aStartIndex = anEndIndex;
+ }
+ }
+
+ // make AVI file
+ QString aPattern = aDirPath + QDir::separator() + aBaseName;
+ aPattern += "_\%08d.jpeg";
+
+ QString aCmd = myAVIMaker;
+ aCmd += " -I p";
+ aCmd += " -v 0";
+ aCmd += QString(" -f %1").arg(aFPS);
+ // aCmd += QString(" -n %1").arg(aNbFiles);
+ aCmd += QString(" -n %1").arg(myFileIndex+1);
+ aCmd += QString(" -j %1").arg(aPattern);
+ aCmd += " | yuv2lav";
+ aCmd += QString(" -o %1").arg(myDumpPath);
+ system(aCmd.latin1());
+
+ // remove temporary jpeg files
+ aCmd = "( ";
+ aCmd += QString("cd %1").arg(aDirPath);
+ aCmd += "; ls";
+ aCmd += QString(" | egrep '%1_[0-9]*.jpeg'").arg(aBaseName);
+ aCmd += " | xargs rm";
+ aCmd += " )";
+ system(aCmd.latin1());
+ }
+}
+
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::succcessiveAnimation( bool& theIsDumping, QValueList<int>& theIndexList )
+{
+ if ( myFrame >= getNbFrames() - 1 )
+ {
+ myIsActive = false;
+ ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>(this,&VISU_TimeAnimation::_emitStopped));
+ return;
+ }
+
+ double k = 1;
+ double aOneVal = 1;
+ if (myFieldsLst[0].myNbFrames > 2)
+ aOneVal = ( myTimeMax - myTimeMin ) / getNbFrames();
+ int aNbFiles = 0;
+ long aFrame = myFrame;
+
+ while (myIsActive) {
+
+ for (int aFieldId = 0; (aFieldId < getNbFields()) && (myFieldsLst[aFieldId].myField); aFieldId++) {
+
+ FieldData& aData = myFieldsLst[aFieldId];
+ if ( !aData.myPrs[0] ) continue;
+ while (aFrame < aData.myNbFrames) {
+
+ ProcessVoidEvent(new TVoidMemFun2ArgEvent<VISU_TimeAnimation,long,double>(this, &VISU_TimeAnimation::_emitFrameChanged,
+ myFrame, myFieldsLst[aFieldId].myTiming[aFrame]));
+
+ if (myIsActive) {
+ if (aFrame > 0) {
+ if (aData.myActors[aFrame-1] != 0)
+ visibilityOff(aFieldId, aFrame-1);
+ } else if ( myFrame > 0) {
+ if (myFieldsLst[aFieldId-1].myActors[myFieldsLst[aFieldId-1].myNbFrames-1] != 0)
+ visibilityOff(aFieldId-1, myFieldsLst[aFieldId-1].myNbFrames-1);
+ } else if ( myCycling ) {
+ if (myFieldsLst[getNbFields()-1].myActors[myFieldsLst[getNbFields()-1].myNbFrames-1] != 0)
+ visibilityOff(getNbFields()-1, myFieldsLst[getNbFields()-1].myNbFrames-1);
+ } else {
+ if (aData.myActors[aData.myNbFrames-1] != 0)
+ visibilityOff(aFieldId, aData.myNbFrames-1);
+ }
+ if (aData.myActors[aFrame] != 0) {
+ ProcessVoidEvent(new TVoidMemFunEvent<VISU_Actor>(aData.myActors[aFrame],
+ &VISU_Actor::VisibilityOn));
+ }
+
+ bool repainArg = false;
+ ProcessVoidEvent(new TVoidMemFun1ArgEvent<SVTK_ViewWindow,bool>(myView,
+ &SVTK_ViewWindow::Repaint,
+ repainArg));
+ }
+
+ k = 1;
+ if (myProportional) {
+ switch (aFrame) {
+ case 0:
+ break;
+ case 1:
+ if (myFieldsLst[0].myNbFrames > 2)
+ k = (myFieldsLst[0].myTiming[aFrame+1] -
+ myFieldsLst[0].myTiming[aFrame]) / aOneVal;
+ break;
+ default:
+ if (aFrame < (myFieldsLst[0].myNbFrames - 1))
+ k = (myFieldsLst[0].myTiming[aFrame+1] -
+ myFieldsLst[0].myTiming[aFrame]) / aOneVal;
}
}
+ int delay = (int)(1000. * k / mySpeed);
+ theIsDumping = !myDumpPath.isEmpty();
+ if (delay < 1 && theIsDumping) {
+ // We must unlock mutex for some time before grabbing to allow view updating
+ delay = 1;
+ }
+ msleep(delay);
+ if (!myIsActive) {
+ ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>(this,&VISU_TimeAnimation::_emitStopped));
+ return;
+ }
- QString aFile = aDirPath + QDir::separator() + aBaseName;
- aFile += "_";
- aFile += QString("%1").arg(myFileIndex).rightJustify(8, '0');
- aFile += ".jpeg";
-
- /* check image size is divisable 16
- myView->dumpViewToFormat(aFile,"JPEG");
- */
- SUIT_ViewWindow* aView = myView;
- QImage img = aView->dumpView();
- if (!img.isNull()) {
- int width = img.width(); width = (width/16)*16;
- int height = img.height(); height = (height/16)*16;
- QImage copy = img.copy(0, 0, width, height);
- if (copy.save(aFile, "JPEG")) {
- anIndexList.append(myFileIndex);
- aNbFiles++;
+ if (theIsDumping) {
+ // We must unlock mutex for some time before grabbing to allow view updating
+ msleep(delay);
+ if (!myIsActive) { // this check was taken from WP_DEB branch
+ ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>(this,&VISU_TimeAnimation::_emitStopped));
+ return;
}
+
+ if(!(myFieldsLst[aFieldId].myField)) // break, if field was deleted.
+ break;
+
+ saveImages( aFieldId, aOneVal, aNbFiles, theIndexList );
}
+
+ if (!myIsActive) break;
+
+ aFrame++;
+ myFrame++;
}
+
+ aFrame = 0;
}
- if (!myIsActive) break;
+ if (!myCycling) {
+ myIsActive = false;
+ myFrame--;
+ break;
+ } else {
+ myFrame = 0;
+ aFrame = myFrame;
+ }
+ }
- myFrame++;
- if (myFrame == myFieldsLst[0].myNbFrames) {
- if (!myCycling) {
- myIsActive = false;
- myFrame--;
- break;
- } else
- myFrame = 0;
+}
+
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::saveImages( int theFieldId,
+ double& theOneVal, int& theNbFiles,
+ QValueList<int>& theIndexList )
+{
+ if (myDumpFormat.compare("AVI") != 0) {
+ QString aFile(myDumpPath);
+
+ QString aName;
+ if ( myAnimationMode == 0 ) // parallel animation mode
+ aName = QString("%1").arg(myFieldsLst[theFieldId].myTiming[myFrame]);
+ else // successive animation mode
+ aName = QString("%1").arg(myFieldsLst[theFieldId].myTiming[getRelativeFrameNumber(myFrame).second]);
+
+ int aPos = -1;
+ while ((aPos = aName.find(".")) > -1 )
+ aName.replace(aPos, 1, "_");
+ aFile += aName;
+ aFile += ".";
+ aFile += myDumpFormat.lower();
+ ProcessVoidEvent(new TVoidMemFunEvent<SVTK_ViewWindow>
+ (myView,&SVTK_ViewWindow::RefreshDumpImage)); // IPAL13602
+ ProcessEvent(new TMemFun2ArgEvent<SVTK_ViewWindow,bool,const QString&,const QString&>
+ (myView,&SVTK_ViewWindow::dumpViewToFormat,aFile,myDumpFormat));
+ } else {
+ QFileInfo aFileInfo(myDumpPath);
+ QString aDirPath = aFileInfo.dirPath(true);
+ QString aBaseName = aFileInfo.fileName();
+
+ switch (myFrame) {
+ case 0:
+ break;
+ case 1:
+ myFileIndex += 5;
+ break;
+ default:
+ if (myProportional) {
+ double p = (myFieldsLst[0].myTiming[myFrame] -
+ myFieldsLst[0].myTiming[myFrame-1]) / theOneVal;
+ myFileIndex += (long) (5*p);
+ } else {
+ myFileIndex += 5;
+ }
+ }
+
+ QString aFile = aDirPath + QDir::separator() + aBaseName;
+ aFile += "_";
+ aFile += QString("%1").arg(myFileIndex).rightJustify(8, '0');
+ aFile += ".jpeg";
+
+ /* check image size is divisable 16
+ myView->dumpViewToFormat(aFile,"JPEG");
+ */
+ SUIT_ViewWindow* aView = myView;
+ ProcessVoidEvent(new TVoidMemFunEvent<SVTK_ViewWindow>(myView,&SVTK_ViewWindow::RefreshDumpImage)); // IPAL13602
+ QImage img = ProcessEvent(new TMemFunEvent<SUIT_ViewWindow,QImage>(aView,&SUIT_ViewWindow::dumpView));
+ if (!img.isNull()) {
+ int width = img.width(); width = (width/16)*16;
+ int height = img.height(); height = (height/16)*16;
+ QImage copy = img.copy(0, 0, width, height);
+ if (copy.save(aFile, "JPEG")) {
+ theIndexList.append(myFileIndex);
+ theNbFiles++;
+ }
}
}
+}
+
+//------------------------------------------------------------------------
+void VISU_TimeAnimation::run()
+{
+ if (!myView) {
+ MESSAGE("Viewer is not defined for animation");
+ return;
+ }
+
+ bool isDumping = !myDumpPath.isEmpty();
+ myFileIndex = 0;
+ QValueList<int> anIndexList;
+
+ if ( myAnimationMode == 0 ) // parallel animation mode
+ parallelAnimation( isDumping, anIndexList );
+ else //succcessive animation mode
+ succcessiveAnimation( isDumping, anIndexList );
// make AVI file if need
if (isDumping && myDumpFormat.compare("AVI") == 0) {
system(aCmd.latin1());
}
- emit stopped();
- qApp->unlock();
+ ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>(this,&VISU_TimeAnimation::_emitStopped));
QThread::exit();
}
VISU::Storable::TRestoringMap aMap;
if (theSObject) {
_PTR(GenericAttribute) anAttr;
- if (theSObject->FindAttribute(anAttr, "AttributeComment")) {
- _PTR(AttributeComment) aComment (anAttr);
+ if (theSObject->FindAttribute(anAttr, "AttributeString")) {
+ _PTR(AttributeString) aComment (anAttr);
std::string aString = aComment->Value();
QString strIn (aString.c_str());
VISU::Storable::StrToMap(strIn, aMap);
std::string aPrsCmt;
switch (thePrsType) {
case VISU::TSCALARMAP:
- aPrsCmt = VISU::ScalarMap_i::myComment;
+ case VISU::TPRSMERGER:
+ aPrsCmt = VISU::PrsMerger_i::myComment;
break;
case VISU::TISOSURFACE:
aPrsCmt = VISU::IsoSurfaces_i::myComment;
std::string aSComponentEntry = aSComponent->GetID();
QString aComment;
- aComment.sprintf("myComment=ANIMATION;myType=%d;myTimeMinVal=%g;myTimeMaxVal=%g",
- VISU::TANIMATION,myTimeMinVal,myTimeMaxVal);
+ aComment.sprintf("myComment=ANIMATION;myType=%d;myTimeMinVal=%g;myTimeMaxVal=%g;myMode=%d",
+ VISU::TANIMATION,myTimeMinVal,myTimeMaxVal,myAnimationMode);
string anEntry = VISU::CreateAttributes(myStudy,aSComponentEntry.c_str(),"","",
GenerateName(),"",aComment,true);
for (int i = 0; i < getNbFields(); i++) {
FieldData& aData = myFieldsLst[i];
-
- _PTR(SObject) newObj = aStudyBuilder->NewObject(aAnimSObject);
- aStudyBuilder->Addreference(newObj, aData.myField);
-
- if (aData.myPrs.empty()) {
- generatePresentations(i);
+ if ( aData.myPrs.front() ) {
+ _PTR(SObject) newObj = aStudyBuilder->NewObject(aAnimSObject);
+ aStudyBuilder->Addreference(newObj, aData.myField);
+
+ if (aData.myPrs.empty()) {
+ generatePresentations(i);
+ }
+ ostringstream strOut;
+ aData.myPrs[0]->ToStream(strOut);
+ string aPrsComment = strOut.str();
+ string aPrsMyComment = aData.myPrs[0]->GetComment();
+ if(aPrsMyComment == "PRSMERGER")
+ aPrsMyComment = "SCALARMAP";
+ VISU::CreateAttributes(myStudy, newObj->GetID().c_str(),"","",
+ aPrsMyComment.c_str(),"",aPrsComment.c_str(),true);
}
- ostringstream strOut;
- aData.myPrs[0]->ToStream(strOut);
- string aPrsComment = strOut.str();
- VISU::CreateAttributes(myStudy, newObj->GetID().c_str(),"","",
- aData.myPrs[0]->GetComment(),"",aPrsComment.c_str(),true);
}
aStudyBuilder->CommitCommand();
std::string aSComponentEntry = aSComponent->GetID();
QString aComment;
- aComment.sprintf("myComment=ANIMATION;myType=%d;myTimeMinVal=%g;myTimeMaxVal=%g",
- VISU::TANIMATION,myTimeMinVal,myTimeMaxVal);
+ aComment.sprintf("myComment=ANIMATION;myType=%d;myTimeMinVal=%g;myTimeMaxVal=%g;myMode=%d",
+ VISU::TANIMATION,myTimeMinVal,myTimeMaxVal,myAnimationMode);
_PTR(GenericAttribute) anAttr;
- anAttr = aStudyBuilder->FindOrCreateAttribute(aAnimSObject, "AttributeComment");
- _PTR(AttributeComment) aCmnt (anAttr);
+ anAttr = aStudyBuilder->FindOrCreateAttribute(aAnimSObject, "AttributeString");
+ _PTR(AttributeString) aCmnt (anAttr);
aCmnt->SetValue(aComment.latin1());
_PTR(ChildIterator) anIter = myStudy->NewChildIterator(aAnimSObject);
aData.myPrs[0]->ToStream(strOut);
string aPrsComment = strOut.str();
string aPrsNameTxt = aData.myPrs[0]->GetComment();
-
+ if(aPrsNameTxt == "PRSMERGER")
+ aPrsNameTxt = "SCALARMAP";
// Save in study
_PTR(SObject) aRefObj = anIter->Value();
_PTR(ChildIterator) anPrsIter = myStudy->NewChildIterator(aRefObj);
if (anPrsIter->More()) {
_PTR(SObject) aPrsObj = anPrsIter->Value();
- anAttr = aStudyBuilder->FindOrCreateAttribute(aPrsObj, "AttributeComment");
- aCmnt = _PTR(AttributeComment)(anAttr);
+ anAttr = aStudyBuilder->FindOrCreateAttribute(aPrsObj, "AttributeString");
+ aCmnt = _PTR(AttributeString)(anAttr);
aCmnt->SetValue(aPrsComment.c_str());
anAttr = aStudyBuilder->FindOrCreateAttribute(aPrsObj, "AttributeName");
VISU::Storable::TRestoringMap aMap;
_PTR(GenericAttribute) anAttr;
- if (!aAnimSObject->FindAttribute(anAttr, "AttributeComment")) return;
+ if (!aAnimSObject->FindAttribute(anAttr, "AttributeString")) return;
- _PTR(AttributeComment) aComment (anAttr);
+ _PTR(AttributeString) aComment (anAttr);
string aComm = aComment->Value();
QString strIn (aComm.c_str());
VISU::Storable::StrToMap(strIn,aMap);
myTimeMinVal = VISU::Storable::FindValue(aMap,"myTimeMinVal",&isExist).toDouble();
myTimeMaxVal = VISU::Storable::FindValue(aMap,"myTimeMaxVal",&isExist).toDouble();
+ myAnimationMode = VISU::Storable::FindValue(aMap,"myMode",&isExist).toInt();
_PTR(ChildIterator) anIter = myStudy->NewChildIterator(aAnimSObject);
for (anIter->Init(); anIter->More(); anIter->Next()) {
_PTR(SObject) aRefObj = anIter->Value();
_PTR(SObject) aFieldObj;
if (!aRefObj->ReferencedObject(aFieldObj) ) continue;
+
addField(aFieldObj);
- FieldData& aData = getFieldData(getNbFields()-1);
+ if ( isRangeDefined() ) myFieldsAbsFrames.pop_back();
+ FieldData& aData = getFieldData(getNbFields()-1);
+
// Get Presentation object
_PTR(ChildIterator) anPrsIter = myStudy->NewChildIterator(aRefObj);
anPrsIter->Init();
string aStr = aName->Value();
QString strName (aStr.c_str());
- if (strName == VISU::ScalarMap_i::myComment.c_str())
- aData.myPrsType = VISU::TSCALARMAP;
+ if (strName == VISU::PrsMerger_i::myComment.c_str() ||
+ strName == VISU::ScalarMap_i::myComment.c_str())
+ aData.myPrsType = VISU::TPRSMERGER;
else if (strName == VISU::IsoSurfaces_i::myComment.c_str())
aData.myPrsType = VISU::TISOSURFACE;
else if (strName == VISU::CutPlanes_i::myComment.c_str())
continue;
generatePresentations(getNbFields()-1);
- if (!aPrsObj->FindAttribute(anAttr, "AttributeComment")) continue;
- _PTR(AttributeComment) aPrsComment (anAttr);
+ if (!aPrsObj->FindAttribute(anAttr, "AttributeString")) continue;
+ _PTR(AttributeString) aPrsComment (anAttr);
string aPrsComm = aPrsComment->Value();
if (aPrsComm.length() > 0) {
QString strPrsIn (aPrsComm.c_str());
}
aData.myPrs[0]->GetOffset(aData.myOffset);
for (int i = 1; i < aData.myNbFrames; i++) {
+ bool anIsFixedRange = false;
+ if (aData.myPrsType != VISU::TGAUSSPOINTS) {
+ if (VISU::ScalarMap_i* aPrs = dynamic_cast<VISU::ScalarMap_i*>(aData.myPrs[i]))
+ anIsFixedRange = aPrs->IsRangeFixed();
+ }
//jfa 03.08.2005:aData.myPrs[i]->SameAs(aData.myPrs[0]);
- aData.myPrs[i]->SameAsParams(aData.myPrs[0]);//jfa 03.08.2005
+ aData.myPrs[i]->SameAsParams(aData.myPrs[0],
+ aData.myPrs[i]->GetMeshName(),aData.myPrs[i]->GetFieldName(),
+ aData.myPrs[i]->GetEntity(), aData.myPrs[i]->GetIteration(),
+ anIsFixedRange);//jfa 03.08.2005
}
}
string aStr = aAnimSObject->GetID();
myView = 0;
}
+void VISU_TimeAnimation::ApplyProperties(CORBA::Long theFieldNum, VISU::ColoredPrs3d_ptr thePrs)
+ throw (SALOME::SALOME_Exception)
+{
+ VISU::ColoredPrs3d_i* aPrs_i = dynamic_cast<VISU::ColoredPrs3d_i*>(GetServant(thePrs).in());
+
+ if ( !aPrs_i )
+ throw SALOME_Exception(LOCALIZED("Error : invalid dynamic cast of the given presentation to VISU::ColoredPrs3d_i"));
+
+ if ( myAnimationMode == 0 ) { // parallel animation mode
+ FieldData& aData = myFieldsLst[theFieldNum];
+
+ if ( aData.myPrs.empty() )
+ throw SALOME_Exception(LOCALIZED("Error : presentations for the given field is not yet created!"));
+
+ if ( aPrs_i->GetResult() != aData.myPrs[0]->GetResult() )
+ throw SALOME_Exception(LOCALIZED("Error : the MED file is not the same!"));
+
+ for (int i = 0; i < aData.myNbFrames; i++) {
+ bool anIsFixedRange = false;
+ if (aData.myPrsType != VISU::TGAUSSPOINTS) {
+ if (VISU::ScalarMap_i* aPrs = dynamic_cast<VISU::ScalarMap_i*>(aData.myPrs[i]))
+ anIsFixedRange = aPrs->IsRangeFixed();
+ }
+ aData.myPrs[i]->SameAsParams(aPrs_i,
+ aData.myPrs[i]->GetMeshName(),aData.myPrs[i]->GetFieldName(),
+ aData.myPrs[i]->GetEntity(), aData.myPrs[i]->GetIteration(),
+ anIsFixedRange);
+ }
+ }
+ else if ( myAnimationMode == 1 ) { // successive animation mode
+ for (int f = 0; f < getNbFields(); f++) {
+ FieldData& aData = myFieldsLst[f];
+
+ if ( aData.myPrs.empty() )
+ throw SALOME_Exception(LOCALIZED("Error : presentations for the given field is not yet created!"));
+
+ for (int i = 0; i < aData.myNbFrames; i++) {
+ aData.myPrs[i]->SameAsParams(aPrs_i,
+ aData.myPrs[i]->GetMeshName(),aData.myPrs[i]->GetFieldName(),
+ aData.myPrs[i]->GetEntity(), aData.myPrs[i]->GetIteration(),
+ true);
+ }
+ }
+ }
+}
//========================================================================
//========================================================================
delete myAnim;
}
-void VISU_TimeAnimation_i::addField (SALOMEDS::SObject_ptr theField)
+bool VISU_TimeAnimation_i::addField (SALOMEDS::SObject_ptr theField)
{
- myAnim->addField(theField);
+ return myAnim->addField(theField);
+}
+
+void VISU_TimeAnimation_i::clearFields ()
+{
+ for (int i = 0; i < myAnim->getNbFields(); i++) {
+ myAnim->clearData(myAnim->getFieldData(i));
+ }
+ myAnim->clearFieldData();
}
CORBA::Boolean VISU_TimeAnimation_i::generateFrames()
{
- return ProcessEvent(new TMemFunEvent<VISU_TimeAnimation,bool>
- (myAnim,&VISU_TimeAnimation::generateFrames));
+ //return ProcessEvent(new TMemFunEvent<VISU_TimeAnimation,bool>
+ // (myAnim,&VISU_TimeAnimation::generateFrames));
+ return myAnim->generateFrames();
}
void VISU_TimeAnimation_i::generatePresentations (CORBA::Long theFieldNum)
void VISU_TimeAnimation_i::clearView()
{
- ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
- (myAnim,&VISU_TimeAnimation::clearView));
+ //ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
+ // (myAnim,&VISU_TimeAnimation::clearView));
+ myAnim->clearView();
}
void VISU_TimeAnimation_i::stopAnimation()
{
- ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
- (myAnim,&VISU_TimeAnimation::stopAnimation));
+ //ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
+ // (myAnim,&VISU_TimeAnimation::stopAnimation));
+ myAnim->stopAnimation();
}
void VISU_TimeAnimation_i::startAnimation()
{
- ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
- (myAnim,&VISU_TimeAnimation::startAnimation));
+ //ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
+ // (myAnim,&VISU_TimeAnimation::startAnimation));
+ myAnim->startAnimation();
}
void VISU_TimeAnimation_i::nextFrame()
{
- ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
- (myAnim,&VISU_TimeAnimation::nextFrame));
+ //ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
+ // (myAnim,&VISU_TimeAnimation::nextFrame));
+ myAnim->nextFrame();
}
void VISU_TimeAnimation_i::prevFrame()
{
- ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
- (myAnim,&VISU_TimeAnimation::prevFrame));
+ //ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
+ // (myAnim,&VISU_TimeAnimation::prevFrame));
+ myAnim->prevFrame();
}
void VISU_TimeAnimation_i::firstFrame()
{
- ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
- (myAnim,&VISU_TimeAnimation::firstFrame));
+ //ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
+ // (myAnim,&VISU_TimeAnimation::firstFrame));
+ myAnim->firstFrame();
}
void VISU_TimeAnimation_i::lastFrame()
{
- ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
- (myAnim,&VISU_TimeAnimation::lastFrame));
+ //ProcessVoidEvent(new TVoidMemFunEvent<VISU_TimeAnimation>
+ // (myAnim,&VISU_TimeAnimation::lastFrame));
+ myAnim->lastFrame();
}
void VISU_TimeAnimation_i::gotoFrame(CORBA::Long theFrame)
{
- ProcessVoidEvent(new TVoidMemFun1ArgEvent<VISU_TimeAnimation,CORBA::Long>
- (myAnim,&VISU_TimeAnimation::gotoFrame,theFrame));
+ //ProcessVoidEvent(new TVoidMemFun1ArgEvent<VISU_TimeAnimation,CORBA::Long>
+ // (myAnim,&VISU_TimeAnimation::gotoFrame,theFrame));
+ myAnim->gotoFrame(theFrame);
}
CORBA::Long VISU_TimeAnimation_i::getNbFields()
return myAnim->isCycling();
}
+CORBA::Boolean VISU_TimeAnimation_i::isCleaningMemoryAtEachFrame(){
+ return myAnim->isCleaningMemoryAtEachFrame();
+}
+
CORBA::Double VISU_TimeAnimation_i::getMinTime()
{
return myAnim->getMinTime();
myAnim->setCycling(theCycle);
}
+void VISU_TimeAnimation_i::setCleaningMemoryAtEachFrame(CORBA::Boolean theCycle){
+ myAnim->setCleaningMemoryAtEachFrame(theCycle);
+}
+
SALOMEDS::SObject_ptr VISU_TimeAnimation_i::publishInStudy()
{
return myAnim->publishInStudy();
{
myAnim->saveAnimation();
}
+
+void VISU_TimeAnimation_i::setAnimationMode(VISU::Animation::AnimationMode theMode)
+{
+ myAnim->setAnimationMode(theMode);
+}
+
+VISU::Animation::AnimationMode VISU_TimeAnimation_i::getAnimationMode()
+{
+ return VISU::Animation::AnimationMode(myAnim->getAnimationMode());
+}
+
+void VISU_TimeAnimation_i::ApplyProperties(CORBA::Long theFieldNum, VISU::ColoredPrs3d_ptr thePrs)
+ throw (SALOME::SALOME_Exception)
+{
+ myAnim->ApplyProperties(theFieldNum, thePrs);
+}
};
-class VISU_TimeAnimation: public QObject, public QThread
+class VISU_I_EXPORT VISU_TimeAnimation: public QObject, public QThread
{
Q_OBJECT;
+
+ protected:
+ CORBA::Boolean _generateFrames();
+ void _visibilityOff(int num_field, int num_frame);
+ void _clearView();
+ void _clearData(FieldData& theData);
+ void _stopAnimation();
+ void _startAnimation();
+ void _nextFrame();
+ void _prevFrame();
+ void _firstFrame();
+ void _lastFrame();
+ void _gotoFrame(CORBA::Long theFrame);
+
+ void _emitFrameChanged(long theNewFrame, double theTime);
+ void _emitStopped();
+
+ void parallelAnimation( bool& theIsDumping, QValueList<int>& theIndexList );
+ void succcessiveAnimation( bool& theIsDumping, QValueList<int>& theIndexList );
+ void saveImages( int theFieldId, double& theOneVal, int& theNbFiles, QValueList<int>& theIndexList );
+
public:
//static VISU::Result_i* createPresent (SALOMEDS::SObject_var theField);
//static VISU::Storable::TRestoringMap getMapOfValue (SALOMEDS::SObject_var theSObject);
virtual VISU::VISUType GetType() { return VISU::TNONE;};
- void addField (_PTR(SObject) theField);
- void addField (SALOMEDS::SObject_ptr theField);
+ bool addField (_PTR(SObject) theField);
+ bool addField (SALOMEDS::SObject_ptr theField);
FieldData& getFieldData (int theNum) { return myFieldsLst[theNum]; }
CORBA::Boolean generateFrames();
void clearData(FieldData& theData);
void clearFieldData() { myFieldsLst.clear();};
+ void visibilityOff(int num_field, int num_frame);
void stopAnimation();
void startAnimation();
void nextFrame();
CORBA::Boolean isRunning() { return myIsActive; }
CORBA::Long getCurrentFrame() { return myFrame; }
+ long getAbsoluteFrameNumber(std::pair<int,long> theFieldTimeStamp);
+ std::pair<int,long> getRelativeFrameNumber(long theFrame);
+
VISU::ColoredPrs3d_ptr getPresentation(CORBA::Long theField, CORBA::Long theFrame);
void setPresentationType(CORBA::Long theFieldNum, VISU::VISUType theType)
QString getLastErrorMsg() { return myLastError; }
CORBA::Boolean isCycling() { return myCycling; }
+ CORBA::Boolean isCleaningMemoryAtEachFrame() { return myCleaningMemoryAtEachFrame; }
CORBA::Double getMinTime() { return myTimeMin;}
CORBA::Double getMaxTime() { return myTimeMax;}
void setProportional(CORBA::Boolean theProp) { myProportional = theProp; }
void setCycling(CORBA::Boolean theCycle) { myCycling = theCycle; }
+ void setCleaningMemoryAtEachFrame(CORBA::Boolean theCycle) { myCleaningMemoryAtEachFrame = theCycle; }
SALOMEDS::SObject_ptr publishInStudy();
void restoreFromStudy(SALOMEDS::SObject_ptr theField);
void saveAnimation();
bool isSavedInStudy() const { return !myAnimEntry.isEmpty(); }
+ void setAnimationMode(int theMode) { myAnimationMode = theMode; }
+ int getAnimationMode() { return myAnimationMode; }
+
+ void ApplyProperties(CORBA::Long theFieldNum, VISU::ColoredPrs3d_ptr thePrs) throw (SALOME::SALOME_Exception);
+
public slots:
void setProportionalSlot(bool theProp) { myProportional = theProp; }
void setCyclingSlot(bool theCycle) { myCycling = theCycle; }
+ void setCleaningMemoryAtEachFrameSlot(bool theCycle) { myCleaningMemoryAtEachFrame = theCycle; }
signals:
void frameChanged(long theNewFrame, double theTime);
QValueList<FieldData> myFieldsLst;
bool myIsActive;
long myFrame;
+ std::vector<long> myFieldsAbsFrames;
int mySpeed;
bool myProportional;
bool myCycling;
+ bool myCleaningMemoryAtEachFrame;
_PTR(Study) myStudy;
+ int myAnimationMode;
double myTimeMinVal, myTimeMaxVal; //!< Range of time stams, set by user
double myTimeMin , myTimeMax ; //!< Range of time stams, available for animation
QString myDumpPath;
};
-class VISU_TimeAnimation_i: public virtual POA_VISU::Animation,
+class VISU_I_EXPORT VISU_TimeAnimation_i: public virtual POA_VISU::Animation,
public virtual VISU::Base_i
{
VISU_TimeAnimation* myAnim;
virtual VISU::VISUType GetType() { return VISU::TANIMATION; }
//virtual VISU::VISUType GetType() { return VISU::TNONE; }
- virtual void addField(SALOMEDS::SObject_ptr theField);
+ virtual bool addField(SALOMEDS::SObject_ptr theField);
+ virtual void clearFields();
virtual CORBA::Boolean generateFrames();
virtual void generatePresentations(CORBA::Long theFieldNum);
virtual char* setDumpFormat(const char* theFormat);
virtual CORBA::Boolean isCycling();
+ virtual CORBA::Boolean isCleaningMemoryAtEachFrame();
virtual CORBA::Double getMinTime();
virtual CORBA::Double getMaxTime();
virtual void setProportional(CORBA::Boolean theProp);
virtual void setCycling(CORBA::Boolean theCycle);
+ virtual void setCleaningMemoryAtEachFrame(CORBA::Boolean theCycle);
virtual SALOMEDS::SObject_ptr publishInStudy();
virtual void restoreFromStudy(SALOMEDS::SObject_ptr theField);
virtual CORBA::Boolean isSavedInStudy();
virtual void saveAnimation();
+
+ virtual void setAnimationMode(VISU::Animation::AnimationMode theMode);
+ virtual VISU::Animation::AnimationMode getAnimationMode();
+
+ virtual void ApplyProperties(CORBA::Long theFieldNum, VISU::ColoredPrs3d_ptr thePrs) throw (SALOME::SALOME_Exception);
};
#endif //VISU_TIMEANIMATION_H
Prs3d_i(theResult,theAddToStudy),
ColoredPrs3d_i(theResult,theAddToStudy),
ScalarMap_i(theResult,theAddToStudy),
+ PrsMerger_i(theResult,theAddToStudy),
DeformedShape_i(theResult,theAddToStudy),
myVectorsPL(NULL)
{
Prs3d_i(theResult,theSObject),
ColoredPrs3d_i(theResult,theSObject),
ScalarMap_i(theResult,theSObject),
+ PrsMerger_i(theResult,theSObject),
DeformedShape_i(theResult,theSObject),
myVectorsPL(NULL)
{
}
+const char*
+VISU::Vectors_i
+::GetIconName()
+{
+ if (!GetNumberOfGeom())
+ return "ICON_TREE_VECTORS";
+ else
+ return "ICON_TREE_VECTORS_GROUPS";
+}
+
+
VISU_PipeLine* VISU::Vectors_i::GetPipeLine(){
VISU_PipeLine* aPipeLine = VISU_VectorsPL::New();
aPipeLine->SetIDMapper(myPipeLine->GetIDMapper());
class VISU_VectorsPL;
namespace VISU{
- class Vectors_i : public virtual POA_VISU::Vectors,
+ class VISU_I_EXPORT Vectors_i : public virtual POA_VISU::Vectors,
public virtual DeformedShape_i
{
static int myNbPresent;
- Vectors_i();
Vectors_i(const Vectors_i&);
public:
protected:
virtual void DoHook();
+
+ virtual const char* GetIconName();
+
virtual VISU_PipeLine* GetPipeLine();
VISU_VectorsPL *myVectorsPL;
class Prs3d_i;
class Curve_i;
- class ViewManager_i : public virtual POA_VISU::ViewManager,
+ class VISU_I_EXPORT ViewManager_i : public virtual POA_VISU::ViewManager,
public virtual Base_i
{
public:
VISU_Actor* UpdateViewer (SUIT_ViewWindow* theViewWindow, int theDisplaing, Prs3d_i* thePrs = NULL);
void UpdatePlot2d (Plot2d_ViewFrame *theView, int theDisplaying, Curve_i* theCurve);
- VISU_Actor* GetActor (VISU::Prs3d_i* thePrs, SVTK_ViewWindow* theViewWindow);
+ VISU_I_EXPORT VISU_Actor* GetActor (VISU::Prs3d_i* thePrs, SVTK_ViewWindow* theViewWindow);
void DeleteActors (VISU::Prs3d_i* thePrs);
void DeleteActors (VISU::Curve_i* thePrs);
_PTR(SObject) anObj = aList[i];
string anEntry = anObj->GetID();
if(MYDEBUG) MESSAGE("View3D_i::SaveViewParams - anEntry = " << anEntry);
- if (anObj->FindAttribute(anAttr, "AttributeComment")) {
- _PTR(AttributeComment) aCmnt (anAttr);
+ if (anObj->FindAttribute(anAttr, "AttributeString")) {
+ _PTR(AttributeString) aCmnt (anAttr);
string aComm (aCmnt->Value());
if (MYDEBUG) MESSAGE("View3D_i::SaveViewPoint - aComm = " << aComm);
if (aComm.compare(View3D_i::myComment) >= 0) {
_PTR(SObject) anObj = aList[i];
string anEntry = anObj->GetID();
if (MYDEBUG) MESSAGE("View3D_i::RestoreViewPoint - anEntry = " << anEntry);
- if (anObj->FindAttribute(anAttr, "AttributeComment")) {
- _PTR(AttributeComment) aCmnt (anAttr);
+ if (anObj->FindAttribute(anAttr, "AttributeString")) {
+ _PTR(AttributeString) aCmnt (anAttr);
QString strIn(aCmnt->Value().c_str());
Storable::TRestoringMap aMap;
Storable::StrToMap(strIn, aMap);
if(MYDEBUG) MESSAGE("View3D_i::SetPointOfView");
SUIT_ViewWindow* aVW = GetViewWindow();
if (aVW)
- ProcessVoidEvent(new TSet3DViewParamEvent(&SetPointOfView,aVW,thePosition));
+ ProcessVoidEvent(new TSet3DViewParamEvent(&View3D_i::SetPointOfView,aVW,thePosition));
}
void View3D_i::GetPointOfView (SUIT_ViewWindow* theViewWindow,
if(MYDEBUG) MESSAGE("View3D_i::SetViewUp");
SUIT_ViewWindow* aVW = GetViewWindow();
if (aVW)
- ProcessVoidEvent(new TSet3DViewParamEvent(&SetViewUp,aVW,theViewUp));
+ ProcessVoidEvent(new TSet3DViewParamEvent(&View3D_i::SetViewUp,aVW,theViewUp));
}
void View3D_i::GetViewUp (SUIT_ViewWindow* theViewWindow,
if(MYDEBUG) MESSAGE("View3D_i::SetFocalPoint");
SUIT_ViewWindow* aVW = GetViewWindow();
if (aVW)
- ProcessVoidEvent(new TSet3DViewParamEvent(&SetFocalPoint,aVW,theCoord));
+ ProcessVoidEvent(new TSet3DViewParamEvent(&View3D_i::SetFocalPoint,aVW,theCoord));
}
if(MYDEBUG) MESSAGE("View3D_i::SetParallelScale");
SUIT_ViewWindow* aVW = GetViewWindow();
if (aVW)
- ProcessVoidEvent(new TSetViewParamEvent(&SetParallelScale,aVW,theScale));
+ ProcessVoidEvent(new TSetViewParamEvent(&View3D_i::SetParallelScale,aVW,theScale));
}
CORBA::Double View3D_i::GetParallelScale (SUIT_ViewWindow* theViewWindow)
{
VISU::VISUType aType = myPrs->GetType();
if (aType != VISU::TSCALARMAP &&
+ aType != VISU::TPRSMERGER &&
aType != VISU::TDEFORMEDSHAPE &&
aType != VISU::TSCALARMAPONDEFORMEDSHAPE) {
myResult = "Insideframe representation is not available for this type of presentations.";
class Prs3d_i;
class Curve_i;
- class View_i : public virtual POA_VISU::View,
+ class VISU_I_EXPORT View_i : public virtual POA_VISU::View,
public virtual Storable
{
public:
//===========================================================================
- class XYPlot_i : public virtual POA_VISU::XYPlot,
+ class VISU_I_EXPORT XYPlot_i : public virtual POA_VISU::XYPlot,
public virtual View_i
{
public:
virtual void Update();
virtual void FitAll();
- virtual void FitXRange(const CORBA::Double xMin,const CORBA::Double xMax);
- virtual void FitYRange(const CORBA::Double yMin,const CORBA::Double yMax);
- virtual void FitRange(const CORBA::Double xMin,const CORBA::Double xMax,
- const CORBA::Double yMin,const CORBA::Double yMax);
+ virtual void FitXRange(CORBA::Double xMin, CORBA::Double xMax);
+ virtual void FitYRange(CORBA::Double yMin, CORBA::Double yMax);
+ virtual void FitRange(CORBA::Double xMin, CORBA::Double xMax,
+ CORBA::Double yMin, CORBA::Double yMax);
virtual void GetFitRanges(double& xMin, double& xMax, double& yMin, double& yMax);
virtual void Close();
//===========================================================================
- class TableView_i : public virtual POA_VISU::TableView,
+ class VISU_I_EXPORT TableView_i : public virtual POA_VISU::TableView,
public virtual View_i
{
public:
//===========================================================================
- class View3D_i : public virtual POA_VISU::View3D,
+ class VISU_I_EXPORT View3D_i : public virtual POA_VISU::View3D,
public virtual View_i
{
public:
static void SetFocalPoint (SUIT_ViewWindow* theViewWindow, const CORBA::Double theFocalPnt[3]);
virtual void SetFocalPoint (const VISU::View3D::XYZ theCoord);
- static void View3D_i::GetFocalPoint (SUIT_ViewWindow* theViewWindow, CORBA::Double theFocalPnt[3]);
+ static void GetFocalPoint (SUIT_ViewWindow* theViewWindow, CORBA::Double theFocalPnt[3]);
virtual VISU::View3D::XYZ_slice* GetFocalPoint();
static void SetParallelScale (SUIT_ViewWindow* theViewWindow, CORBA::Double theScale);
visu_med.py visu_view3d.py visu.py visu_gui.py visu_prs_example.py \
visu_table.py visu_big_table.py visu_view.py visu_delete.py \
visu_swig_test.py visu_split_views.py \
+ visu_succcessive_animation.py visu_apply_properties.py visu_apply_properties_successive.py \
VISU_Example_01.py VISU_Example_02.py VISU_Example_03.py VISU_Example_04.py \
VISU_Example_05.py VISU_Example_06.py VISU_Example_07.py
EXPORT_SHAREDPYSCRIPTS = VISU_shared_modules.py
import SALOMEDS
import VISU
import os
+import sys
medFile = os.getenv("DATA_DIR") + "/MedFiles/fra.med"
print "OK"
file_new = str+'/VISU_005_new.hdf'
-command = "mv " + file + " " + file_new
+
+if not sys.platform == "win32":
+ command = "mv " + file + " " + file_new
+else:
+ command = "move /Y " + file + " " + file_new
+
os.system(command)
file = file_new
else : print "OK"
# Remove the study file
-command = "rm -r " + file
+if not sys.platform == "win32":
+ command = "rm -r " + file
+else:
+ command = "del /F " + file
os.system(command)
aFieldName = anAttr.Value()
print " ", aFieldName
- anAttr = aFieldSObj.FindAttribute("AttributeComment")[1]
- anAttr = anAttr._narrow(SALOMEDS.AttributeComment);
+ anAttr = aFieldSObj.FindAttribute("AttributeString")[1]
+ anAttr = anAttr._narrow(SALOMEDS.AttributeString);
aFieldComment = anAttr.Value()
aMap = StrToMap(aFieldComment)
aTimeStampName = anAttr.Value()
print " ", aTimeStampName
- anAttr = aTimeStampSObj.FindAttribute("AttributeComment")[1]
- anAttr = anAttr._narrow(SALOMEDS.AttributeComment);
+ anAttr = aTimeStampSObj.FindAttribute("AttributeString")[1]
+ anAttr = anAttr._narrow(SALOMEDS.AttributeString);
aTimeStampComment = anAttr.Value()
aMap = StrToMap(aTimeStampComment)
aMeshName = aMap["myMeshName"]
aPrsObj.RemoveFromStudy()
else :
aVISUObjList.append(aPrsObj)
+
+ if HasValue(thePrsTypeList,VISU.TGAUSSPOINTS) :
+ print " Creating GaussPointsOnField",
+ aPrsObj = theVisu.GaussPointsOnField(theResult,aMeshName,anEntity,aFieldName,aTimeStampId)
+ if aPrsObj is None : print "Error"
+ else :
+ print ",OK"
+ theView.DisplayOnly(aPrsObj)
+ theView.FitAll()
+ aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TGAUSSPOINTS." + thePictureExt
+ aPictureName = re.sub("\s+","_", aPictureName)
+ theView.SavePicture(aPictureName)
+ if theIsAutoDelete :
+ aPrsObj.RemoveFromStudy()
+ pass
+ else :
+ aVISUObjList.append(aPrsObj)
+ pass
+ pass
+ pass
return aVISUObjList
return anObj
-def dump_vetctors_parameters(theObject):
+def dump_vectors_parameters(theObject):
dump_deformedshape_parameters(theObject)
dump_scalarmap_parameters(theObject)
print "GetNbSurfaces() = "+ str(theObject.GetNbSurfaces())
+# ----------------------------
+# SCALAR MAP ON DEFORMED SHAPE
+# ----------------------------
+def dump_scalarmapondeformedshape_parameters(theObject):
+ dump_scalarmap_parameters(theObject)
+ print "GetScale() =", theObject.GetScale()
+ print "GetScalarCMeshName ()=|",theObject.GetScalarCMeshName(),"|"
+ print "GetScalarCFieldName()=|",theObject.GetScalarCFieldName(),"|"
+ print "GetScalarEEntity() =",theObject.GetScalarEEntity()
+ print "GetScalarLIteration()=",theObject.GetScalarLIteration()
+ pass
+
+def try_scalarmapondeformedshape_parameters(thePattern):
+
+ if thePattern is None : return None
+ import copy
+ import random
+
+ anObj = try_scalarmap_parameters(thePattern)
+
+ # --- SCALING ---
+ print
+ anObj.SetScale( anObj.GetScale()/random.random()*random.randint(1,10))
+
+ # --- Scalar Field ---
+ # not implemented yet.
+
+ return anObj
+# ----------------------
+# PLOT 3D
+# ----------------------
+def dump_plot3d_parameters(theObject):
+ dump_scalarmap_parameters(theObject)
+ print "GetOrientationType()=",str(theObject.GetOrientationType())
+ print "GetRotateX()=",theObject.GetRotateX()
+ print "GetRotateY()=",theObject.GetRotateY()
+ print "GetPlanePosition()=",theObject.GetPlanePosition()
+ print "IsPositionRelative()=",theObject.IsPositionRelative()
+ print "GetScaleFactor()=",theObject.GetScaleFactor()
+ print "GetIsContourPrs()=",theObject.GetIsContourPrs()
+ print "GetNbOfContours()=",theObject.GetNbOfContours()
+ pass
+
+def try_plot3d_parameters(thePattern):
+ if thePattern is None : return None
+ import random
+
+ anObj = try_scalarmap_parameters(thePattern)
+
+ ORIENT = [VISU.Plot3D.XY, VISU.Plot3D.YZ, VISU.Plot3D.ZX]
+
+ theXAngle = random.random()*random.randint(-180,180)
+ theYAngle = random.random()*random.randint(-180,180)
+
+ # ORIENTATION and ANGLES
+ anObj.SetOrientation(ORIENT[random.randint(0,2)],theXAngle,theYAngle)
+
+ # Plane position (revative)
+ anObj.SetPlanePosition(random.random(),1)
+
+ # SCALE FACTOR
+ anObj.SetScaleFactor(random.random()*random.randint(-10000,10000))
+
+ # CONTOUR PRS
+ anObj.SetContourPrs(random.randint(0,1))
+ if anObj.GetIsContourPrs():
+ anObj.SetNbOfContours(random.randint(1,999))
+ pass
+
+ pass
+
+# ----------------------
+# Gauss points
+# ----------------------
+def dump_gausspoints_parameters(theObject):
+
+ print "\tGetScalarMode() = " + str(anObj.GetScalarMode())
+ print "\tGetMin() = " + str(anObj.GetMin()) + " GetMax() = " + str (anObj.GetMax())
+ print "\tGetPosX() = ", str(anObj.GetPosX()) + " GetPosY() = ", str(anObj.GetPosY())
+ print "\tGetWidth() = ", str ( anObj.GetWidth()) + " GetHeight() = " + str(anObj.GetHeight())
+ print "\tGetNbColors() = " + str(anObj.GetNbColors())
+ print "\tGetLabels() = " + str(anObj.GetLabels())
+ print "\tGetTitle() = " + str(anObj.GetTitle())
+ pass
+
+def try_plot3d_parameters(thePattern):
+ if thePattern is None : return None
+ import random
+
+ pass
# ----------------------
# TABLES AND CURVES
--- /dev/null
+# VISU VISU_SWIG : binding of C++ implementation and Python
+#
+# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+# File : visu_apply_properties.py
+# Module : VISU
+
+import os
+import time
+import math
+import VISU
+import SALOMEDS
+from visu_gui import *
+
+aDelay = 0
+
+myViewManager = myVisu.GetViewManager();
+
+myView = myViewManager.Create3DView();
+myView.SetTitle("The viewer for Animation")
+print "myViewManager.Create3DView()"
+time.sleep(aDelay)
+
+medFile = "TimeStamps.med"
+myFieldName = "temperature"
+
+medFile = os.getenv('DATA_DIR') + '/MedFiles/' + medFile
+myResult = myVisu.ImportFile(medFile)
+
+anAnim = myVisu.CreateAnimation(myView);
+
+aSObj = myStudy.FindObjectIOR(myResult.GetID())
+aSObj = aSObj.FindSubObject(1)[1]
+aSObj = aSObj.FindSubObject(3)[1]
+aSObj = aSObj.FindSubObject(1)[1]
+print "addField 1 : ", anAnim.addField(aSObj)
+
+print "Generate presentations for ", anAnim.getNbFields(), " fields"
+for i in range(0,anAnim.getNbFields()):
+ anAnim.setPresentationType(i,VISU.TPLOT3D)
+ anAnim.generatePresentations(i)
+
+print "Generate frames"
+anAnim.generateFrames()
+
+print "Start Animation"
+anAnim.setSpeed(22)
+anAnim.startAnimation()
+myView.FitAll()
+
+while 1:
+ time.sleep(1+aDelay)
+ if not anAnim.isRunning():
+ anAnim.stopAnimation()
+ break
+
+anAnim.publishInStudy()
+anAnim.saveAnimation()
+
+for i in range(0,anAnim.getNbFields()):
+ aPrs = anAnim.getPresentation(i,0)
+ aPlot3D = aPrs._narrow(VISU.Plot3D)
+
+ if aPlot3D:
+ aNbLabels = aPlot3D.GetLabels()
+ aPlot3D.SetLabels(aNbLabels+3)
+
+ aWidth = aPlot3D.GetWidth()
+ aHeight = aPlot3D.GetHeight()
+ aPlot3D.SetSize(aWidth+0.07,aHeight+0.07)
+
+ print "Apply properties for all time stamps of ", i, " field."
+ try:
+ anAnim.ApplyProperties(i,aPlot3D)
+ except SALOME.SALOME_Exception, inst:
+ msg = "SALOME.SALOME_Exception caught, see details:"
+ msg+="\n******* text:\t" + inst.details.text
+ msg+="\n******* type:\t" + str(inst.details.type)
+ msg+="\n******* where:\t" + inst.details.sourceFile + ":" + \
+ str(inst.details.lineNumber)
+ print msg
+ raise RuntimeError, "There are some errors were occured... For more info see ERRORs above..."
+
+print "Generate frames"
+anAnim.generateFrames()
+
+print "Start Animation"
+anAnim.startAnimation()
+myView.FitAll()
+
+while 1:
+ time.sleep(1+aDelay)
+ if not anAnim.isRunning():
+ anAnim.stopAnimation()
+ break
+
+anAnim.publishInStudy()
+anAnim.saveAnimation()
+
+anAnim.clearFields()
+print "The number of fields in animation after clearFields method is", anAnim.getNbFields()
+
--- /dev/null
+# VISU VISU_SWIG : binding of C++ implementation and Python
+#
+# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+# File : visu_apply_properties_consecutive.py
+# Module : VISU
+
+import os
+import time
+import math
+import VISU
+import SALOMEDS
+from visu_gui import *
+
+aDelay = 0
+
+myViewManager = myVisu.GetViewManager();
+
+myView = myViewManager.Create3DView();
+myView.SetTitle("The viewer for Animation")
+print "myViewManager.Create3DView()"
+time.sleep(aDelay)
+
+medFile = "TimeStamps.med"
+myFieldName = "temperature"
+
+medFile = os.getenv('DATA_DIR') + '/MedFiles/' + medFile
+myResult = myVisu.ImportFile(medFile)
+
+anAnim = myVisu.CreateAnimation(myView);
+anAnim.setAnimationMode(VISU.Animation.SUCCCESSIVE)
+
+aSObj = myStudy.FindObjectIOR(myResult.GetID())
+aSObj = aSObj.FindSubObject(1)[1]
+aSObj = aSObj.FindSubObject(3)[1]
+aSObj = aSObj.FindSubObject(1)[1]
+print "addField 1 : ", anAnim.addField(aSObj)
+
+medFile1 = "TimeStamps_import22.med"
+myFieldName1 = "pression"
+
+medFile1 = os.getenv('DATA_DIR') + '/MedFiles/' + medFile1
+myResult1 = myVisu.ImportFile(medFile1)
+
+aSObj1 = myStudy.FindObjectIOR(myResult1.GetID())
+aSObj1 = aSObj1.FindSubObject(1)[1]
+aSObj1 = aSObj1.FindSubObject(3)[1]
+aSObj1 = aSObj1.FindSubObject(3)[1]
+print "addField 2 : ", anAnim.addField(aSObj1)
+
+print "Generate presentations for ", anAnim.getNbFields(), " fields"
+for i in range(0,anAnim.getNbFields()):
+ anAnim.setPresentationType(i,VISU.TPLOT3D)
+ anAnim.generatePresentations(i)
+
+print "Generate frames"
+anAnim.generateFrames()
+
+print "Start Animation"
+anAnim.setSpeed(22)
+anAnim.startAnimation()
+myView.FitAll()
+
+while 1:
+ time.sleep(1+aDelay)
+ if not anAnim.isRunning():
+ anAnim.stopAnimation()
+ break
+
+anAnim.publishInStudy()
+anAnim.saveAnimation()
+
+if anAnim.getAnimationMode() == VISU.Animation.SUCCCESSIVE:
+ print "End of succcessive animation for 2 fields with presentation type VISU.Animation.SUCCCESSIVE"
+
+#for i in range(0,anAnim.getNbFields()):
+aPrs = anAnim.getPresentation(0,0)
+aPlot3D = aPrs._narrow(VISU.Plot3D)
+
+if aPlot3D:
+ aNbLabels = aPlot3D.GetLabels()
+ aPlot3D.SetLabels(aNbLabels+3)
+
+ aWidth = aPlot3D.GetWidth()
+ aHeight = aPlot3D.GetHeight()
+ aPlot3D.SetSize(aWidth+0.07,aHeight+0.07)
+
+ print "Apply properties for all time stamps of all fields."
+ try:
+ anAnim.ApplyProperties(0,aPlot3D)
+ except SALOME.SALOME_Exception, inst:
+ msg = "SALOME.SALOME_Exception caught, see details:"
+ msg+="\n******* text:\t" + inst.details.text
+ msg+="\n******* type:\t" + str(inst.details.type)
+ msg+="\n******* where:\t" + inst.details.sourceFile + ":" + \
+ str(inst.details.lineNumber)
+ print msg
+ raise RuntimeError, "There are some errors were occured... For more info see ERRORs above..."
+
+print "Generate frames"
+anAnim.generateFrames()
+
+print "Start Animation"
+anAnim.startAnimation()
+myView.FitAll()
+
+while 1:
+ time.sleep(1+aDelay)
+ if not anAnim.isRunning():
+ anAnim.stopAnimation()
+ break
+
+anAnim.publishInStudy()
+anAnim.saveAnimation()
+
+anAnim.clearFields()
+print "The number of fields in animation after clearFields method is", anAnim.getNbFields()
+
--- /dev/null
+# VISU VISU_SWIG : binding of C++ implementation and Python
+#
+# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+# File : visu_view3d.py
+# Module : VISU
+
+import os
+import time
+import math
+import VISU
+import SALOMEDS
+from visu_gui import *
+
+aDelay = 0
+
+myViewManager = myVisu.GetViewManager();
+
+myView = myViewManager.Create3DView();
+myView.SetTitle("The viewer for Animation")
+print "myViewManager.Create3DView()"
+time.sleep(aDelay)
+
+medFile = "TimeStamps.med"
+myFieldName = "temperature"
+
+medFile = os.getenv('DATA_DIR') + '/MedFiles/' + medFile
+myResult = myVisu.ImportFile(medFile)
+
+anAnim = myVisu.CreateAnimation(myView);
+anAnim.setAnimationMode(VISU.Animation.SUCCCESSIVE);
+
+aSObj = myStudy.FindObjectIOR(myResult.GetID())
+aSObj = aSObj.FindSubObject(1)[1]
+aSObj = aSObj.FindSubObject(3)[1]
+aSObj = aSObj.FindSubObject(1)[1]
+print "addField 1 : ", anAnim.addField(aSObj)
+
+medFile1 = "TimeStamps_import22.med"
+myFieldName1 = "pression"
+
+medFile1 = os.getenv('DATA_DIR') + '/MedFiles/' + medFile1
+myResult1 = myVisu.ImportFile(medFile1)
+
+aSObj1 = myStudy.FindObjectIOR(myResult1.GetID())
+aSObj1 = aSObj1.FindSubObject(1)[1]
+aSObj1 = aSObj1.FindSubObject(3)[1]
+aSObj1 = aSObj1.FindSubObject(3)[1]
+print "addField 2 : ", anAnim.addField(aSObj1)
+
+print "Generate presentations for ", anAnim.getNbFields(), " fields"
+for i in range(0,anAnim.getNbFields()):
+ anAnim.setPresentationType(i,VISU.TPLOT3D)
+ anAnim.generatePresentations(i)
+
+print "Generate frames"
+anAnim.generateFrames()
+
+print "Start Animation"
+anAnim.setSpeed(22)
+anAnim.startAnimation()
+myView.FitAll()
+
+while 1:
+ time.sleep(1+aDelay)
+ if not anAnim.isRunning():
+ anAnim.stopAnimation()
+ break
+
+anAnim.publishInStudy()
+anAnim.saveAnimation()
+
+if anAnim.getAnimationMode() == VISU.Animation.SUCCCESSIVE:
+ print "End of succcessive animation for 2 fields with presentation type VISU.Animation.SUCCCESSIVE"
+
+anAnim.clearFields()
+print "The number of fields in animation after clearFields method is", anAnim.getNbFields()
+
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#ifdef WNT
-#ifdef SVTK_EXPORTS
+#ifdef VISU_VVTK_EXPORTS
#define VVTK_EXPORT __declspec(dllexport)
#else
#define VVTK_EXPORT __declspec(dllimport)
#include "VISU_GaussPtsAct.h"
#include "VISU_Event.h"
+#include "SVTK_ViewWindow.h"
#include "SVTK_RenderWindowInteractor.h"
#include "VVTK_Renderer.h"
#include "VVTK_PickingDlg.h"
}
//----------------------------------------------------------------------------
-int
-convertAction( const int accelAction );
-
void
VVTK_MainWindow
::action( const int accelAction )
if ( accelAction == SUIT_Accel::ZoomFit )
onFitAll();
else {
- int anEvent = convertAction( accelAction );
+ int anEvent = SVTK::convertAction( accelAction );
InvokeEvent( anEvent, 0 );
}
}
if (app)
app->onHelpContextModule(app->activeModule() ? app->moduleName(app->activeModule()->moduleName()) : QString(""), aHelpFileName);
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
#include <qpushbutton.h>
#include <qfiledialog.h>
-#include <iostream.h>
+#include <iostream>
using namespace std;
#ifndef VVTK_PRIMITIVEBOX_H
#define VVTK_PRIMITIVEBOX_H
+#include "VVTK.h"
+
#include <qgroupbox.h>
class QLabel;
class QtxDblSpinBox;
class QtxIntSpinBox;
-class VVTK_PrimitiveBox : public QGroupBox
+class VVTK_EXPORT VVTK_PrimitiveBox : public QGroupBox
{
Q_OBJECT
#include <iomanip>
#include <iostream>
+#ifndef WIN32
#include <unistd.h>
+#endif
+
#include <qapplication.h>
#include <qfileinfo.h>
int aLastFrameIndex = myFrameIndexes.back();
if(aLastFrameIndex < 0){
myFrameIndexes.back() = abs(myFrameIndexes.back());
- double aPauseTime = fabs(aFrameIndex - myFrameIndex - 1) / myNbFPS;
+ double aPauseTime = fabs((double)(aFrameIndex - myFrameIndex - 1)) / myNbFPS;
if(MYDEBUG)
cout<<"VVTK_Recorder::DoRecord - aFrameIndex = "<<aFrameIndex<<
"; aPauseTime = "<<aPauseTime<<endl;
if (app)
app->onHelpContextModule(app->activeModule() ? app->moduleName(app->activeModule()->moduleName()) : QString(""), aHelpFileName);
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
vtkProperty* aPlaneProperty = aPlanesWidget->GetPlaneProperty();
aPlaneProperty->SetOpacity(aSelectedPlaneProperty->GetOpacity()*1.5);
//
- myWidgetCtrl->Delete();
+ //myWidgetCtrl->Delete();
}
VVTK_Renderer1
VVTK_Renderer1
::GetWidgetCtrl()
{
- return myWidgetCtrl.GetPointer();
+ return myWidgetCtrl;//.GetPointer();
}
//----------------------------------------------------------------------------
void AdjustWidgetCtrl();
- vtkSmartPointer<VISU_WidgetCtrl> myWidgetCtrl;
+ VISU_WidgetCtrl* myWidgetCtrl;
+ //vtkSmartPointer<VISU_WidgetCtrl> myWidgetCtrl;
VISU_OutsideCursorSettings* myOutsideCursorSettings;
vtkSmartPointer<VISU_FPSActor> myTextActor;
};
{
QFileInfo aFileInfo(theImageFileName);
QString aFormat = aFileInfo.extension(FALSE);
- QString aVTIName = QString("/tmp/") + getenv("USER") + "-" + aFileInfo.baseName(TRUE) + ".vti";
+#ifdef WIN32
+ QString aTmpDir = getenv( "TEMP" );
+#else
+ QString aTmpDir = QString( "/tmp/" ) + getenv("USER");
+#endif
+ QString aVTIName = aTmpDir + "-" + aFileInfo.baseName(TRUE) + ".vti";
QString aCommand = QString( "VISU_img2vti " ) + aFormat + " " + theImageFileName + " " + aVTIName;
if(system( aCommand.latin1() ) == 0)
RemoveFile(const QString& theFileName)
{
if( !theFileName.isNull() ){
+#ifndef WNT
QString aCommand = QString( "rm -fr " ) + theFileName;
+#else:
+ QString aCommand = QString( "del /F " ) + theFileName;
+#endif
system( aCommand.latin1() );
}
}
if (app)
app->onHelpContextModule(app->activeModule() ? app->moduleName(app->activeModule()->moduleName()) : QString(""), aHelpFileName);
else {
+ QString platform;
+#ifdef WIN32
+ platform = "winapplication";
+#else
+ platform = "application";
+#endif
SUIT_MessageBox::warn1(0, QObject::tr("WRN_WARNING"),
QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser", "application")).arg(aHelpFileName),
+ arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName),
QObject::tr("BUT_OK"));
}
}
#ifndef VVTK_SEGMENTATIONCURSORDLG_H
#define VVTK_SEGMENTATIONCURSORDLG_H
+#include "VVTK.h"
+
#include <qdialog.h>
#include <vtkObject.h>
{
typedef vtkSmartPointer<vtkImageData> TTextureValue;
- TTextureValue
+ VVTK_EXPORT TTextureValue
GetTexture(const QString& theMainTexture,
const QString& theAlphaTexture);
}
#ifndef VVTK_SIZEBOX_H
#define VVTK_SIZEBOX_H
+#include "VVTK.h"
+
#include <qvbox.h>
class QLabel;
class QtxDblSpinBox;
class QtxIntSpinBox;
-class VVTK_SizeBox : public QVBox
+class VVTK_EXPORT VVTK_SizeBox : public QVBox
{
Q_OBJECT